vulkan-registry: Remove unused parts. am: 7754812f8e

Original change: https://android-review.googlesource.com/c/platform/external/gfxstream-protocols/+/1991154

Change-Id: I4afe9a086f4ec5c8696b3314e4f80d682dcf7735
diff --git a/registry/vulkan/appendices/VK_AMD_buffer_marker.txt b/registry/vulkan/appendices/VK_AMD_buffer_marker.txt
deleted file mode 100644
index bc7c272..0000000
--- a/registry/vulkan/appendices/VK_AMD_buffer_marker.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2018-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_buffer_marker.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-01-26
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Matthaeus G. Chajdas, AMD
-  - Jaakko Konttinen, AMD
-  - Daniel Rakos, AMD
-
-=== Description
-
-This extension adds a new operation to execute pipelined writes of small
-marker values into a sname:VkBuffer object.
-
-The primary purpose of these markers is to facilitate the development of
-debugging tools for tracking which pipelined command contributed to device
-loss.
-
-include::{generated}/interfaces/VK_AMD_buffer_marker.txt[]
-
-=== Examples
-
-None.
-
-=== Version History
-
-  * Revision 1, 2018-01-26 (Jaakko Konttinen)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_AMD_device_coherent_memory.txt b/registry/vulkan/appendices/VK_AMD_device_coherent_memory.txt
deleted file mode 100644
index d7a9588..0000000
--- a/registry/vulkan/appendices/VK_AMD_device_coherent_memory.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2019-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_device_coherent_memory.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-02-04
-*Contributors*::
-  - Ping Fu, AMD
-  - Timothy Lottes, AMD
-  - Tobias Hector, AMD
-
-=== Description
-
-This extension adds the device coherent and device uncached memory types.
-Any device accesses to device coherent memory are automatically made visible
-to any other device access.
-Device uncached memory indicates to applications that caches are disabled
-for a particular memory type, which guarantees device coherence.
-
-Device coherent and uncached memory are expected to have lower performance
-for general access than non-device coherent memory, but can be useful in
-certain scenarios; particularly so for debugging.
-
-include::{generated}/interfaces/VK_AMD_device_coherent_memory.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-02-04 (Tobias Hector)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_AMD_display_native_hdr.txt b/registry/vulkan/appendices/VK_AMD_display_native_hdr.txt
deleted file mode 100644
index 50912fe..0000000
--- a/registry/vulkan/appendices/VK_AMD_display_native_hdr.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2019-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_display_native_hdr.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-12-18
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Matthaeus G. Chajdas, AMD
-  - Aaron Hagan, AMD
-  - Aric Cyr, AMD
-  - Timothy Lottes, AMD
-  - Derrick Owens, AMD
-  - Daniel Rakos, AMD
-
-=== Description
-
-This extension introduces the following display native HDR features to
-Vulkan:
-
-  * A new elink:VkColorSpaceKHR enum for setting the native display
-    colorspace.
-    For example, this color space would be set by the swapchain to use the
-    native color space in Freesync2 displays.
-  * Local dimming control
-
-include::{generated}/interfaces/VK_AMD_display_native_hdr.txt[]
-
-=== Issues
-
-None.
-
-=== Examples
-
-None.
-
-=== Version History
-
-  * Revision 1, 2018-12-18 (Daniel Rakos)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_AMD_draw_indirect_count.txt b/registry/vulkan/appendices/VK_AMD_draw_indirect_count.txt
deleted file mode 100644
index 20761d1..0000000
--- a/registry/vulkan/appendices/VK_AMD_draw_indirect_count.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2016-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_draw_indirect_count.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-08-23
-*Interactions and External Dependencies*::
-  - Promoted to `apiext:VK_KHR_draw_indirect_count`
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Matthaeus G. Chajdas, AMD
-  - Derrick Owens, AMD
-  - Graham Sellers, AMD
-  - Daniel Rakos, AMD
-  - Dominik Witczak, AMD
-
-=== Description
-
-This extension allows an application to source the number of draws for
-indirect drawing commands from a buffer.
-This enables applications to generate an arbitrary number of drawing
-commands and execute them without host intervention.
-
-=== Promotion to `VK_KHR_draw_indirect_count`
-
-All functionality in this extension is included in
-`apiext:VK_KHR_draw_indirect_count`, with the suffix changed to KHR.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_AMD_draw_indirect_count.txt[]
-
-=== Version History
-
- * Revision 2, 2016-08-23 (Dominik Witczak)
-   - Minor fixes
- * Revision 1, 2016-07-21 (Matthaeus Chajdas)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_AMD_gcn_shader.txt b/registry/vulkan/appendices/VK_AMD_gcn_shader.txt
deleted file mode 100644
index 0fde98b..0000000
--- a/registry/vulkan/appendices/VK_AMD_gcn_shader.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2016-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_gcn_shader.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-05-30
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/AMD/SPV_AMD_gcn_shader.html[`SPV_AMD_gcn_shader`]
-*Contributors*::
-  - Dominik Witczak, AMD
-  - Daniel Rakos, AMD
-  - Rex Xu, AMD
-  - Graham Sellers, AMD
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * {spirv}/AMD/SPV_AMD_gcn_shader.html[`SPV_AMD_gcn_shader`]
-
-include::{generated}/interfaces/VK_AMD_gcn_shader.txt[]
-
-=== Version History
-
- * Revision 1, 2016-05-30 (Dominik Witczak)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_AMD_gpu_shader_half_float.txt b/registry/vulkan/appendices/VK_AMD_gpu_shader_half_float.txt
deleted file mode 100644
index ee8bab7..0000000
--- a/registry/vulkan/appendices/VK_AMD_gpu_shader_half_float.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2016-2019 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_gpu_shader_half_float.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-04-11
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/AMD/SPV_AMD_gpu_shader_half_float.html[`SPV_AMD_gpu_shader_half_float`]
-*Contributors*::
-  - Daniel Rakos, AMD
-  - Dominik Witczak, AMD
-  - Donglin Wei, AMD
-  - Graham Sellers, AMD
-  - Qun Lin, AMD
-  - Rex Xu, AMD
-
-=== Description
-
-This extension adds support for using half float variables in shaders.
-
-=== Deprecation by `VK_KHR_shader_float16_int8`
-
-Functionality in this extension was included in
-`apiext:VK_KHR_shader_float16_int8` extension, when
-slink:VkPhysicalDeviceShaderFloat16Int8FeaturesKHR::pname:shaderFloat16 is
-enabled.
-
-include::{generated}/interfaces/VK_AMD_gpu_shader_half_float.txt[]
-
-=== Version History
-
- * Revision 2, 2019-04-11 (Tobias Hector)
-   - Marked as deprecated
- * Revision 1, 2016-09-21 (Dominik Witczak)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_AMD_gpu_shader_int16.txt b/registry/vulkan/appendices/VK_AMD_gpu_shader_int16.txt
deleted file mode 100644
index 19230c3..0000000
--- a/registry/vulkan/appendices/VK_AMD_gpu_shader_int16.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_gpu_shader_int16.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-04-11
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/AMD/SPV_AMD_gpu_shader_int16.html[`SPV_AMD_gpu_shader_int16`]
-*Contributors*::
-  - Daniel Rakos, AMD
-  - Dominik Witczak, AMD
-  - Matthaeus G. Chajdas, AMD
-  - Rex Xu, AMD
-  - Timothy Lottes, AMD
-  - Zhi Cai, AMD
-*External Dependencies*::
-  - {spirv}/AMD/SPV_AMD_gpu_shader_int16.html[`SPV_AMD_gpu_shader_int16`]
-
-=== Description
-
-This extension adds support for using 16-bit integer variables in shaders.
-
-=== Deprecation by `VK_KHR_shader_float16_int8`
-
-Functionality in this extension was included in
-`apiext:VK_KHR_shader_float16_int8` extension, when
-slink:VkPhysicalDeviceFeatures::pname:shaderInt16 and
-slink:VkPhysicalDeviceShaderFloat16Int8FeaturesKHR::pname:shaderFloat16 are
-enabled.
-
-include::{generated}/interfaces/VK_AMD_gpu_shader_int16.txt[]
-
-=== Version History
-
- * Revision 2, 2019-04-11 (Tobias Hector)
-   - Marked as deprecated
- * Revision 1, 2017-06-18 (Dominik Witczak)
-   - First version
diff --git a/registry/vulkan/appendices/VK_AMD_memory_overallocation_behavior.txt b/registry/vulkan/appendices/VK_AMD_memory_overallocation_behavior.txt
deleted file mode 100644
index 412b221..0000000
--- a/registry/vulkan/appendices/VK_AMD_memory_overallocation_behavior.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2018-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_memory_overallocation_behavior.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-09-19
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Martin Dinkov, AMD
-  - Matthaeus Chajdas, AMD
-  - Daniel Rakos, AMD
-  - Jon Campbell, AMD
-
-=== Description
-
-This extension allows controlling whether explicit overallocation beyond the
-device memory heap sizes (reported by
-slink:VkPhysicalDeviceMemoryProperties) is allowed or not.
-Overallocation may lead to performance loss and is not supported for all
-platforms.
-
-include::{generated}/interfaces/VK_AMD_memory_overallocation_behavior.txt[]
-
-=== Version History
-
-  * Revision 1, 2018-09-19 (Martin Dinkov)
-    - Initial draft.
diff --git a/registry/vulkan/appendices/VK_AMD_mixed_attachment_samples.txt b/registry/vulkan/appendices/VK_AMD_mixed_attachment_samples.txt
deleted file mode 100644
index fe2ab3c..0000000
--- a/registry/vulkan/appendices/VK_AMD_mixed_attachment_samples.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_mixed_attachment_samples.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-07-24
-*Contributors*::
-  - Mais Alnasser, AMD
-  - Matthaeus G. Chajdas, AMD
-  - Maciej Jesionowski, AMD
-  - Daniel Rakos, AMD
-
-=== Description
-
-This extension enables applications to use multisampled rendering with a
-depth/stencil sample count that is larger than the color sample count.
-Having a depth/stencil sample count larger than the color sample count
-allows maintaining geometry and coverage information at a higher sample rate
-than color information.
-All samples are depth/stencil tested, but only the first color sample count
-number of samples get a corresponding color output.
-
-include::{generated}/interfaces/VK_AMD_mixed_attachment_samples.txt[]
-
-=== Issues
-
-None.
-
-=== Version History
-
- * Revision 1, 2017-07-24 (Daniel Rakos)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_AMD_negative_viewport_height.txt b/registry/vulkan/appendices/VK_AMD_negative_viewport_height.txt
deleted file mode 100755
index 419c4f9..0000000
--- a/registry/vulkan/appendices/VK_AMD_negative_viewport_height.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2016-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_negative_viewport_height.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-09-02
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Matthaeus G. Chajdas, AMD
-  - Graham Sellers, AMD
-  - Baldur Karlsson
-
-=== Description
-
-This extension allows an application to specify a negative viewport height.
-The result is that the viewport transformation will flip along the y-axis.
-
-  * Allow negative height to be specified in the
-    slink:VkViewport::pname:height field to perform y-inversion of the
-    clip-space to framebuffer-space transform.
-    This allows apps to avoid having to use `gl_Position.y = -gl_Position.y`
-    in shaders also targeting other APIs.
-
-=== Obsoletion by `VK_KHR_maintenance1` and Vulkan 1.1
-
-Functionality in this extension is included in `VK_KHR_maintenance1` and
-subsequently Vulkan 1.1.
-Due to some slight behavioral differences, this extension must: not be
-enabled alongside `VK_KHR_maintenance1`, or in an instance created with
-version 1.1 or later requested in slink:VkApplicationInfo::pname:apiVersion.
-
-include::{generated}/interfaces/VK_AMD_negative_viewport_height.txt[]
-
-=== Version History
-
- * Revision 1, 2016-09-02 (Matthaeus Chajdas)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_AMD_pipeline_compiler_control.txt b/registry/vulkan/appendices/VK_AMD_pipeline_compiler_control.txt
deleted file mode 100644
index 8e242db..0000000
--- a/registry/vulkan/appendices/VK_AMD_pipeline_compiler_control.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2019-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_pipeline_compiler_control.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-07-26
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Matthaeus G. Chajdas, AMD
-  - Daniel Rakos, AMD
-  - Maciej Jesionowski, AMD
-  - Tobias Hector, AMD
-
-=== Description
-
-This extension introduces slink:VkPipelineCompilerControlCreateInfoAMD
-structure that can be chained to a pipeline's creation information to
-specify additional flags that affect pipeline compilation.
-
-include::{generated}/interfaces/VK_AMD_pipeline_compiler_control.txt[]
-
-=== Issues
-
-None.
-
-=== Examples
-
-None.
-
-=== Version History
-
-  * Revision 1, 2019-07-26 (Tobias Hector)
-    - Initial revision.
diff --git a/registry/vulkan/appendices/VK_AMD_rasterization_order.txt b/registry/vulkan/appendices/VK_AMD_rasterization_order.txt
deleted file mode 100644
index 847c7a7..0000000
--- a/registry/vulkan/appendices/VK_AMD_rasterization_order.txt
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (c) 2016-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_rasterization_order.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-04-25
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Matthaeus G. Chajdas, AMD
-  - Jaakko Konttinen, AMD
-  - Daniel Rakos, AMD
-  - Graham Sellers, AMD
-  - Dominik Witczak, AMD
-
-=== Description
-
-This extension introduces the possibility for the application to control the
-order of primitive rasterization.
-In unextended Vulkan, the following stages are guaranteed to execute in _API
-order_:
-
-  * depth bounds test
-  * stencil test, stencil op, and stencil write
-  * depth test and depth write
-  * occlusion queries
-  * blending, logic op, and color write
-
-This extension enables applications to opt into a relaxed, implementation
-defined primitive rasterization order that may allow better parallel
-processing of primitives and thus enabling higher primitive throughput.
-It is applicable in cases where the primitive rasterization order is known
-to not affect the output of the rendering or any differences caused by a
-different rasterization order are not a concern from the point of view of
-the application's purpose.
-
-A few examples of cases when using the relaxed primitive rasterization order
-would not have an effect on the final rendering:
-
-  * If the primitives rendered are known to not overlap in framebuffer
-    space.
-  * If depth testing is used with a comparison operator of
-    ename:VK_COMPARE_OP_LESS, ename:VK_COMPARE_OP_LESS_OR_EQUAL,
-    ename:VK_COMPARE_OP_GREATER, or ename:VK_COMPARE_OP_GREATER_OR_EQUAL,
-    and the primitives rendered are known to not overlap in clip space.
-  * If depth testing is not used and blending is enabled for all attachments
-    with a commutative blend operator.
-
-include::{generated}/interfaces/VK_AMD_rasterization_order.txt[]
-
-=== Issues
-
-1) How is this extension useful to application developers?
-
-*RESOLVED*: Allows them to increase primitive throughput for cases when
-strict API order rasterization is not important due to the nature of the
-content, the configuration used, or the requirements towards the output of
-the rendering.
-
-2) How does this extension interact with content optimizations aiming to
-reduce overdraw by appropriately ordering the input primitives?
-
-*RESOLVED*: While the relaxed rasterization order might somewhat limit the
-effectiveness of such content optimizations, most of the benefits of it are
-expected to be retained even when the relaxed rasterization order is used,
-so applications should: still apply these optimizations even if they intend
-to use the extension.
-
-3) Are there any guarantees about the primitive rasterization order when
-using the new relaxed mode?
-
-*RESOLVED*: No.
-In this case the rasterization order is completely implementation-dependent,
-but in practice it is expected to partially still follow the order of
-incoming primitives.
-
-4) Does the new relaxed rasterization order have any adverse effect on
-repeatability and other invariance rules of the API?
-
-*RESOLVED*: Yes, in the sense that it extends the list of exceptions when
-the repeatability requirement does not apply.
-
-=== Examples
-
-None
-
-=== Issues
-
-None
-
-=== Version History
-
-  * Revision 1, 2016-04-25 (Daniel Rakos)
-    - Initial draft.
diff --git a/registry/vulkan/appendices/VK_AMD_shader_ballot.txt b/registry/vulkan/appendices/VK_AMD_shader_ballot.txt
deleted file mode 100644
index 008c1fb..0000000
--- a/registry/vulkan/appendices/VK_AMD_shader_ballot.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2016-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_shader_ballot.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-09-19
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/AMD/SPV_AMD_shader_ballot.html[`SPV_AMD_shader_ballot`]
-*Contributors*::
-  - Qun Lin, AMD
-  - Graham Sellers, AMD
-  - Daniel Rakos, AMD
-  - Rex Xu, AMD
-  - Dominik Witczak, AMD
-  - Matthäus G. Chajdas, AMD
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * {spirv}/AMD/SPV_AMD_shader_ballot.html[`SPV_AMD_shader_ballot`]
-
-include::{generated}/interfaces/VK_AMD_shader_ballot.txt[]
-
-=== Version History
-
- * Revision 1, 2016-09-19 (Dominik Witczak)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_AMD_shader_core_properties.txt b/registry/vulkan/appendices/VK_AMD_shader_core_properties.txt
deleted file mode 100644
index 702e24d..0000000
--- a/registry/vulkan/appendices/VK_AMD_shader_core_properties.txt
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright (c) 2018-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_shader_core_properties.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-06-25
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Martin Dinkov, AMD
-  - Matthaeus G. Chajdas, AMD
-
-=== Description
-
-This extension exposes shader core properties for a target physical device
-through the `apiext:VK_KHR_get_physical_device_properties2` extension.
-Please refer to the example below for proper usage.
-
-include::{generated}/interfaces/VK_AMD_shader_core_properties.txt[]
-
-=== Examples
-
-This example retrieves the shader core properties for a physical device.
-
-[source,c++]
-----------------------------------------
-extern VkInstance       instance;
-
-PFN_vkGetPhysicalDeviceProperties2 pfnVkGetPhysicalDeviceProperties2 =
-    reinterpret_cast<PFN_vkGetPhysicalDeviceProperties2>
-    (vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2") );
-
-VkPhysicalDeviceProperties2             general_props;
-VkPhysicalDeviceShaderCorePropertiesAMD shader_core_properties;
-
-shader_core_properties.pNext = nullptr;
-shader_core_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD;
-
-general_props.pNext = &shader_core_properties;
-general_props.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
-
-// After this call, shader_core_properties has been populated
-pfnVkGetPhysicalDeviceProperties2(device, &general_props);
-
-printf("Number of shader engines: %d\n",
-    m_shader_core_properties.shader_engine_count =
-    shader_core_properties.shaderEngineCount;
-printf("Number of shader arrays: %d\n",
-    m_shader_core_properties.shader_arrays_per_engine_count =
-    shader_core_properties.shaderArraysPerEngineCount;
-printf("Number of CUs per shader array: %d\n",
-    m_shader_core_properties.compute_units_per_shader_array =
-    shader_core_properties.computeUnitsPerShaderArray;
-printf("Number of SIMDs per compute unit: %d\n",
-    m_shader_core_properties.simd_per_compute_unit =
-    shader_core_properties.simdPerComputeUnit;
-printf("Number of wavefront slots in each SIMD: %d\n",
-    m_shader_core_properties.wavefronts_per_simd =
-    shader_core_properties.wavefrontsPerSimd;
-printf("Number of threads per wavefront: %d\n",
-    m_shader_core_properties.wavefront_size =
-    shader_core_properties.wavefrontSize;
-printf("Number of physical SGPRs per SIMD: %d\n",
-    m_shader_core_properties.sgprs_per_simd =
-    shader_core_properties.sgprsPerSimd;
-printf("Minimum number of SGPRs that can be allocated by a wave: %d\n",
-    m_shader_core_properties.min_sgpr_allocation =
-    shader_core_properties.minSgprAllocation;
-printf("Number of available SGPRs: %d\n",
-    m_shader_core_properties.max_sgpr_allocation =
-    shader_core_properties.maxSgprAllocation;
-printf("SGPRs are allocated in groups of this size: %d\n",
-    m_shader_core_properties.sgpr_allocation_granularity =
-    shader_core_properties.sgprAllocationGranularity;
-printf("Number of physical VGPRs per SIMD: %d\n",
-    m_shader_core_properties.vgprs_per_simd =
-    shader_core_properties.vgprsPerSimd;
-printf("Minimum number of VGPRs that can be allocated by a wave: %d\n",
-    m_shader_core_properties.min_vgpr_allocation =
-    shader_core_properties.minVgprAllocation;
-printf("Number of available VGPRs: %d\n",
-    m_shader_core_properties.max_vgpr_allocation =
-    shader_core_properties.maxVgprAllocation;
-printf("VGPRs are allocated in groups of this size: %d\n",
-    m_shader_core_properties.vgpr_allocation_granularity =
-    shader_core_properties.vgprAllocationGranularity;
-----------------------------------------
-
-
-=== Version History
-
-  * Revision 2, 2019-06-25 (Matthaeus G. Chajdas)
-    - Clarified the meaning of a few fields.
-  * Revision 1, 2018-02-15 (Martin Dinkov)
-    - Initial draft.
diff --git a/registry/vulkan/appendices/VK_AMD_shader_core_properties2.txt b/registry/vulkan/appendices/VK_AMD_shader_core_properties2.txt
deleted file mode 100644
index afaef08..0000000
--- a/registry/vulkan/appendices/VK_AMD_shader_core_properties2.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2019-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_shader_core_properties2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-07-26
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Matthaeus G. Chajdas, AMD
-  - Tobias Hector, AMD
-
-=== Description
-
-This extension exposes additional shader core properties for a target
-physical device through the `apiext:VK_KHR_get_physical_device_properties2`
-extension.
-
-include::{generated}/interfaces/VK_AMD_shader_core_properties2.txt[]
-
-=== Examples
-
-None.
-
-=== Version History
-
-  * Revision 1, 2019-07-26 (Matthaeus G. Chajdas)
-    - Initial draft.
diff --git a/registry/vulkan/appendices/VK_AMD_shader_explicit_vertex_parameter.txt b/registry/vulkan/appendices/VK_AMD_shader_explicit_vertex_parameter.txt
deleted file mode 100644
index e7bf6b1..0000000
--- a/registry/vulkan/appendices/VK_AMD_shader_explicit_vertex_parameter.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2016-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_shader_explicit_vertex_parameter.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-05-10
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/AMD/SPV_AMD_shader_explicit_vertex_parameter.html[`SPV_AMD_shader_explicit_vertex_parameter`]
-*Contributors*::
-  - Matthaeus G. Chajdas, AMD
-  - Qun Lin, AMD
-  - Daniel Rakos, AMD
-  - Graham Sellers, AMD
-  - Rex Xu, AMD
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * {spirv}/AMD/SPV_AMD_shader_explicit_vertex_parameter.html[`SPV_AMD_shader_explicit_vertex_parameter`]
-
-include::{generated}/interfaces/VK_AMD_shader_explicit_vertex_parameter.txt[]
-
-=== Version History
-
- * Revision 1, 2016-05-10 (Daniel Rakos)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_AMD_shader_fragment_mask.txt b/registry/vulkan/appendices/VK_AMD_shader_fragment_mask.txt
deleted file mode 100644
index b8cfcdf..0000000
--- a/registry/vulkan/appendices/VK_AMD_shader_fragment_mask.txt
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_shader_fragment_mask.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-08-16
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/AMD/SPV_AMD_shader_fragment_mask.html[`SPV_AMD_shader_fragment_mask`]
-*Contributors*::
-  - Aaron Hagan, AMD
-  - Daniel Rakos, AMD
-  - Timothy Lottes, AMD
-
-=== Description
-
-This extension provides efficient read access to the fragment mask in
-compressed multisampled color surfaces.
-The fragment mask is a lookup table that associates color samples with color
-fragment values.
-
-From a shader, the fragment mask can be fetched with a call to
-code:fragmentMaskFetchAMD, which returns a single code:uint where each
-subsequent four bits specify the color fragment index corresponding to the
-color sample, starting from the least significant bit.
-For example, when eight color samples are used, the color fragment index for
-color sample 0 will be in bits 0-3 of the fragment mask, for color sample 7
-the index will be in bits 28-31.
-
-The color fragment for a particular color sample may then be fetched with
-the corresponding fragment mask value using the code:fragmentFetchAMD shader
-function.
-
-include::{generated}/interfaces/VK_AMD_shader_fragment_mask.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-FragmentMaskAMD, code:FragmentMaskAMD>>
-
-=== Examples
-
-This example shows a shader that queries the fragment mask from a
-multisampled compressed surface and uses it to query fragment values.
-
-[source,c++]
-----------------------------------------
-#version 450 core
-
-#extension GL_AMD_shader_fragment_mask: enable
-
-layout(binding = 0) uniform sampler2DMS       s2DMS;
-layout(binding = 1) uniform isampler2DMSArray is2DMSArray;
-
-layout(binding = 2, input_attachment_index = 0) uniform usubpassInputMS usubpassMS;
-
-layout(location = 0) out vec4 fragColor;
-
-void main()
-{
-    vec4 fragOne = vec4(0.0);
-
-    uint fragMask = fragmentMaskFetchAMD(s2DMS, ivec2(2, 3));
-    uint fragIndex = (fragMask & 0xF0) >> 4;
-    fragOne += fragmentFetchAMD(s2DMS, ivec2(2, 3), 1);
-
-    fragMask = fragmentMaskFetchAMD(is2DMSArray, ivec3(2, 3, 1));
-    fragIndex = (fragMask & 0xF0) >> 4;
-    fragOne += fragmentFetchAMD(is2DMSArray, ivec3(2, 3, 1), fragIndex);
-
-    fragMask = fragmentMaskFetchAMD(usubpassMS);
-    fragIndex = (fragMask & 0xF0) >> 4;
-    fragOne += fragmentFetchAMD(usubpassMS, fragIndex);
-
-    fragColor = fragOne;
-}
-----------------------------------------
-
-=== Version History
-
-  * Revision 1, 2017-08-16 (Aaron Hagan)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_AMD_shader_image_load_store_lod.txt b/registry/vulkan/appendices/VK_AMD_shader_image_load_store_lod.txt
deleted file mode 100644
index 65f4de6..0000000
--- a/registry/vulkan/appendices/VK_AMD_shader_image_load_store_lod.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_shader_image_load_store_lod.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-08-21
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/AMD/SPV_AMD_shader_image_load_store_lod.html[`SPV_AMD_shader_image_load_store_lod`]
-  - This extension provides API support for
-    https://www.khronos.org/registry/OpenGL/extensions/AMD/AMD_shader_image_load_store_lod.txt[`GL_AMD_shader_image_load_store_lod`]
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Dominik Witczak, AMD
-  - Qun Lin, AMD
-  - Rex Xu, AMD
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * {spirv}/AMD/SPV_AMD_shader_image_load_store_lod.html[`SPV_AMD_shader_image_load_store_lod`]
-
-include::{generated}/interfaces/VK_AMD_shader_image_load_store_lod.txt[]
-
-=== Version History
-
-  * Revision 1, 2017-08-21 (Dominik Witczak)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_AMD_shader_info.txt b/registry/vulkan/appendices/VK_AMD_shader_info.txt
deleted file mode 100644
index 8a34077..0000000
--- a/registry/vulkan/appendices/VK_AMD_shader_info.txt
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_shader_info.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-10-09
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jaakko Konttinen, AMD
-
-=== Description
-
-This extension adds a way to query certain information about a compiled
-shader which is part of a pipeline.
-This information may include shader disassembly, shader binary and various
-statistics about a shader's resource usage.
-
-While this extension provides a mechanism for extracting this information,
-the details regarding the contents or format of this information are not
-specified by this extension and may be provided by the vendor externally.
-
-Furthermore, all information types are optionally supported, and users
-should not assume every implementation supports querying every type of
-information.
-
-include::{generated}/interfaces/VK_AMD_shader_info.txt[]
-
-=== Examples
-
-This example extracts the register usage of a fragment shader within a
-particular graphics pipeline:
-
-[source,c++]
-----------------------------------------
-extern VkDevice device;
-extern VkPipeline gfxPipeline;
-
-PFN_vkGetShaderInfoAMD pfnGetShaderInfoAMD = (PFN_vkGetShaderInfoAMD)vkGetDeviceProcAddr(
-    device, "vkGetShaderInfoAMD");
-
-VkShaderStatisticsInfoAMD statistics = {};
-
-size_t dataSize = sizeof(statistics);
-
-if (pfnGetShaderInfoAMD(device,
-    gfxPipeline,
-    VK_SHADER_STAGE_FRAGMENT_BIT,
-    VK_SHADER_INFO_TYPE_STATISTICS_AMD,
-    &dataSize,
-    &statistics) == VK_SUCCESS)
-{
-    printf("VGPR usage: %d\n", statistics.resourceUsage.numUsedVgprs);
-    printf("SGPR usage: %d\n", statistics.resourceUsage.numUsedSgprs);
-}
-----------------------------------------
-
-The following example continues the previous example by subsequently
-attempting to query and print shader disassembly about the fragment shader:
-
-[source,c++]
-----------------------------------------
-// Query disassembly size (if available)
-if (pfnGetShaderInfoAMD(device,
-    gfxPipeline,
-    VK_SHADER_STAGE_FRAGMENT_BIT,
-    VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD,
-    &dataSize,
-    nullptr) == VK_SUCCESS)
-{
-    printf("Fragment shader disassembly:\n");
-
-    void* disassembly = malloc(dataSize);
-
-    // Query disassembly and print
-    if (pfnGetShaderInfoAMD(device,
-        gfxPipeline,
-        VK_SHADER_STAGE_FRAGMENT_BIT,
-        VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD,
-        &dataSize,
-        disassembly) == VK_SUCCESS)
-    {
-        printf((char*)disassembly);
-    }
-
-    free(disassembly);
-}
-----------------------------------------
-
-
-=== Version History
-
-  * Revision 1, 2017-10-09 (Jaakko Konttinen)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_AMD_shader_trinary_minmax.txt b/registry/vulkan/appendices/VK_AMD_shader_trinary_minmax.txt
deleted file mode 100644
index a364b6f..0000000
--- a/registry/vulkan/appendices/VK_AMD_shader_trinary_minmax.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2016-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_shader_trinary_minmax.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-05-10
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/AMD/SPV_AMD_shader_trinary_minmax.html[`SPV_AMD_shader_trinary_minmax`]
-*Contributors*::
-  - Matthaeus G. Chajdas, AMD
-  - Qun Lin, AMD
-  - Daniel Rakos, AMD
-  - Graham Sellers, AMD
-  - Rex Xu, AMD
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * {spirv}/AMD/SPV_AMD_shader_trinary_minmax.html[`SPV_AMD_shader_trinary_minmax`]
-
-include::{generated}/interfaces/VK_AMD_shader_trinary_minmax.txt[]
-
-=== Version History
-
- * Revision 1, 2016-05-10 (Daniel Rakos)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_AMD_texture_gather_bias_lod.txt b/registry/vulkan/appendices/VK_AMD_texture_gather_bias_lod.txt
deleted file mode 100644
index c9c449e..0000000
--- a/registry/vulkan/appendices/VK_AMD_texture_gather_bias_lod.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (c) 2017-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_AMD_texture_gather_bias_lod.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-03-21
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/AMD/SPV_AMD_texture_gather_bias_lod.html[`SPV_AMD_texture_gather_bias_lod`]
-*Contributors*::
-  - Dominik Witczak, AMD
-  - Daniel Rakos, AMD
-  - Graham Sellers, AMD
-  - Matthaeus G. Chajdas, AMD
-  - Qun Lin, AMD
-  - Rex Xu, AMD
-  - Timothy Lottes, AMD
-
-=== Description
-
-This extension adds two related features.
-
-Firstly, support for the following SPIR-V extension in Vulkan is added:
-
-  * `SPV_AMD_texture_gather_bias_lod`
-
-Secondly, the extension allows the application to query which formats can be
-used together with the new function prototypes introduced by the SPIR-V
-extension.
-
-include::{generated}/interfaces/VK_AMD_texture_gather_bias_lod.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-ImageGatherBiasLodAMD,
-    code:ImageGatherBiasLodAMD>>
-
-=== Examples
-
-[source,c++]
---------------------------------------
-
-struct VkTextureLODGatherFormatPropertiesAMD
-{
-    VkStructureType sType;
-    const void*     pNext;
-    VkBool32        supportsTextureGatherLODBiasAMD;
-};
-
-// ----------------------------------------------------------------------------------------
-// How to detect if an image format can be used with the new function prototypes.
-VkPhysicalDeviceImageFormatInfo2   formatInfo;
-VkImageFormatProperties2           formatProps;
-VkTextureLODGatherFormatPropertiesAMD textureLODGatherSupport;
-
-textureLODGatherSupport.sType = VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD;
-textureLODGatherSupport.pNext = nullptr;
-
-formatInfo.sType  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2;
-formatInfo.pNext  = nullptr;
-formatInfo.format = ...;
-formatInfo.type   = ...;
-formatInfo.tiling = ...;
-formatInfo.usage  = ...;
-formatInfo.flags  = ...;
-
-formatProps.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
-formatProps.pNext = &textureLODGatherSupport;
-
-vkGetPhysicalDeviceImageFormatProperties2(physical_device, &formatInfo, &formatProps);
-
-if (textureLODGatherSupport.supportsTextureGatherLODBiasAMD == VK_TRUE)
-{
-    // physical device supports SPV_AMD_texture_gather_bias_lod for the specified
-    // format configuration.
-}
-else
-{
-    // physical device does not support SPV_AMD_texture_gather_bias_lod for the
-    // specified format configuration.
-}
---------------------------------------
-
-=== Version History
-
-  * Revision 1, 2017-03-21 (Dominik Witczak)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_ANDROID_external_memory_android_hardware_buffer.txt b/registry/vulkan/appendices/VK_ANDROID_external_memory_android_hardware_buffer.txt
deleted file mode 100644
index d704cc4..0000000
--- a/registry/vulkan/appendices/VK_ANDROID_external_memory_android_hardware_buffer.txt
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (c) 2018-2020 Google LLC
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_ANDROID_external_memory_android_hardware_buffer.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-09-30
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Ray Smith, ARM
-  - Chad Versace, Google
-  - Jesse Hall, Google
-  - Tobias Hector, Imagination
-  - James Jones, NVIDIA
-  - Tony Zlatinski, NVIDIA
-  - Matthew Netsch, Qualcomm
-  - Andrew Garrard, Samsung
-
-=== Description
-
-This extension enables an application to import Android
-basetype:AHardwareBuffer objects created outside of the Vulkan device into
-Vulkan memory objects, where they can: be bound to images and buffers.
-It also allows exporting an basetype:AHardwareBuffer from a Vulkan memory
-object for symmetry with other operating systems.
-But since not all basetype:AHardwareBuffer usages and formats have Vulkan
-equivalents, exporting from Vulkan provides strictly less functionality than
-creating the basetype:AHardwareBuffer externally and importing it.
-
-Some basetype:AHardwareBuffer images have implementation-defined _external
-formats_ that may: not correspond to Vulkan formats.
-Sampler {YCbCr} conversion can: be used to sample from these images and
-convert them to a known color space.
-
-include::{generated}/interfaces/VK_ANDROID_external_memory_android_hardware_buffer.txt[]
-
-=== Issues
-
-1) Other external memory objects are represented as weakly-typed handles
-(e.g. Win32 code:HANDLE or POSIX file descriptor), and require a handle type
-parameter along with handles.
-basetype:AHardwareBuffer is strongly typed, so naming the handle type is
-redundant.
-Does symmetry justify adding handle type parameters/fields anyway?
-
-*RESOLVED*: No.
-The handle type is already provided in places that treat external memory
-objects generically.
-In the places we would add it, the application code that would have to
-provide the handle type value is already dealing with
-basetype:AHardwareBuffer-specific commands/structures; the extra symmetry
-would not be enough to make that code generic.
-
-2) The internal layout and therefore size of a basetype:AHardwareBuffer
-image may depend on native usage flags that do not have corresponding Vulkan
-counterparts.
-Do we provide this information to flink:vkCreateImage somehow, or allow the
-allocation size reported by flink:vkGetImageMemoryRequirements to be
-approximate?
-
-*RESOLVED*: Allow the allocation size to be unspecified when allocating the
-memory.
-It has to work this way for exported image memory anyway, since
-basetype:AHardwareBuffer allocation happens in flink:vkAllocateMemory, and
-internally is performed by a separate HAL, not the Vulkan implementation
-itself.
-There is a similar issue with flink:vkGetImageSubresourceLayout: the layout
-is determined by the allocator HAL, so it is not known until the image is
-bound to memory.
-
-3) Should the result of sampling an external-format image with the suggested
-{YCbCr} conversion parameters yield the same results as using a
-code:samplerExternalOES in OpenGL ES?
-
-*RESOLVED*: This would be desirable, so that apps converting from OpenGL ES
-to Vulkan could get the same output given the same input.
-But since sampling and conversion from {YCbCr} images is so loosely defined
-in OpenGL ES, multiple implementations do it in a way that does not conform
-to Vulkan's requirements.
-Modifying the OpenGL ES implementation would be difficult, and would change
-the output of existing unmodified applications.
-Changing the output only for applications that are being modified gives
-developers the chance to notice and mitigate any problems.
-Implementations are encouraged to minimize differences as much as possible
-without causing compatibility problems for existing OpenGL ES applications
-or violating Vulkan requirements.
-
-4) Should an basetype:AHardwareBuffer with code:AHARDWAREBUFFER_USAGE_CPU_*
-usage be mappable in Vulkan? Should it be possible to export an
-code:AHardwareBuffers with such usage?
-
-*RESOLVED*: Optional, and mapping in Vulkan is not the same as
-code:AHardwareBuffer_lock.
-The semantics of these are different: mapping in memory is persistent, just
-gives a raw view of the memory contents, and does not involve ownership.
-code:AHardwareBuffer_lock gives the host exclusive access to the buffer, is
-temporary, and allows for reformatting copy-in/copy-out.
-Implementations are not required to support host-visible memory types for
-imported Android hardware buffers or resources backed by them.
-If a host-visible memory type is supported and used, the memory can be
-mapped in Vulkan, but doing so follows Vulkan semantics: it is just a raw
-view of the data and does not imply ownership (this means implementations
-must not internally call code:AHardwareBuffer_lock to implement
-flink:vkMapMemory, or assume the application has done so).
-Implementations are not required to support linear-tiled images backed by
-Android hardware buffers, even if the basetype:AHardwareBuffer has CPU
-usage.
-There is no reliable way to allocate memory in Vulkan that can be exported
-to a basetype:AHardwareBuffer with CPU usage.
-
-5) Android may add new basetype:AHardwareBuffer formats and usage flags over
-time.
-Can reference to them be added to this extension, or do they need a new
-extension?
-
-*RESOLVED*: This extension can document the interaction between the new AHB
-formats/usages and existing Vulkan features.
-No new Vulkan features or implementation requirements can be added.
-The extension version number will be incremented when this additional
-documentation is added, but the version number does not indicate that an
-implementaiton supports Vulkan memory or resources that map to the new
-basetype:AHardwareBuffer features: support for that must be queried with
-flink:vkGetPhysicalDeviceImageFormatProperties2 or is implied by
-successfully allocating a basetype:AHardwareBuffer outside of Vulkan that
-uses the new feature and has a GPU usage flag.
-
-In essence, these are new features added to a new Android API level, rather
-than new Vulkan features.
-The extension will only document how existing Vulkan features map to that
-new Android feature.
-
-=== Version History
-
-  * Revision 4, 2021-09-30 (Jon Leech)
-    - Add interaction with `apiext:VK_KHR_format_feature_flags2` to `vk.xml`
-  * Revision 3, 2019-08-27 (Jon Leech)
-    - Update revision history to correspond to XML version number
-  * Revision 2, 2018-04-09 (Petr Kraus)
-    - Markup fixes and remove incorrect Draft status
-  * Revision 1, 2018-03-04 (Jesse Hall)
-    - Initial version
diff --git a/registry/vulkan/appendices/VK_EXT_4444_formats.txt b/registry/vulkan/appendices/VK_EXT_4444_formats.txt
deleted file mode 100644
index 3a7734b..0000000
--- a/registry/vulkan/appendices/VK_EXT_4444_formats.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_4444_formats.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-07-28
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Joshua Ashton, Valve
-  - Jason Ekstrand, Intel
-
-=== Description
-
-This extension defines the ename:VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT and
-ename:VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT formats which are defined in other
-current graphics APIs.
-
-This extension may be useful for building translation layers for those APIs
-or for porting applications that use these formats without having to resort
-to swizzles.
-
-When VK_EXT_custom_border_color is used, these formats are not subject to
-the same restrictions for border color without format as with
-VK_FORMAT_B4G4R4A4_UNORM_PACK16.
-
-include::{generated}/interfaces/VK_EXT_4444_formats.txt[]
-
-=== Version History
-
- * Revision 1, 2020-07-04 (Joshua Ashton)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_acquire_drm_display.txt b/registry/vulkan/appendices/VK_EXT_acquire_drm_display.txt
deleted file mode 100644
index 77976f5..0000000
--- a/registry/vulkan/appendices/VK_EXT_acquire_drm_display.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_acquire_drm_display.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-06-09
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Simon Zeni, Status Holdings, Ltd.
-
-=== Description
-
-This extension allows an application to take exclusive control of a display
-using the Direct Rendering Manager (DRM) interface.
-When acquired, the display will be under full control of the application
-until the display is either released or the connector is unplugged.
-
-include::{generated}/interfaces/VK_EXT_acquire_drm_display.txt[]
-
-=== Issues
-
-None.
-
-=== Version History
-
-  * Revision 1, 2021-05-11 (Simon Zeni)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_acquire_xlib_display.txt b/registry/vulkan/appendices/VK_EXT_acquire_xlib_display.txt
deleted file mode 100644
index feddb5a..0000000
--- a/registry/vulkan/appendices/VK_EXT_acquire_xlib_display.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_acquire_xlib_display.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-12-13
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Dave Airlie, Red Hat
-  - Pierre Boudier, NVIDIA
-  - James Jones, NVIDIA
-  - Damien Leone, NVIDIA
-  - Pierre-Loup Griffais, Valve
-  - Liam Middlebrook, NVIDIA
-  - Daniel Vetter, Intel
-
-=== Description
-
-This extension allows an application to take exclusive control on a display
-currently associated with an X11 screen.
-When control is acquired, the display will be deassociated from the X11
-screen until control is released or the specified display connection is
-closed.
-Essentially, the X11 screen will behave as if the monitor has been unplugged
-until control is released.
-
-include::{generated}/interfaces/VK_EXT_acquire_xlib_display.txt[]
-
-=== Issues
-
-1) Should flink:vkAcquireXlibDisplayEXT take an RandR display ID, or a
-Vulkan display handle as input?
-
-*RESOLVED*: A Vulkan display handle.
-Otherwise there would be no way to specify handles to displays that had been
-prevented from being included in the X11 display list by some native
-platform or vendor-specific mechanism.
-
-2) How does an application figure out which RandR display corresponds to a
-Vulkan display?
-
-*RESOLVED*: A new function, flink:vkGetRandROutputDisplayEXT, is introduced
-for this purpose.
-
-3) Should flink:vkGetRandROutputDisplayEXT be part of this extension, or a
-general Vulkan / RandR or Vulkan / Xlib extension?
-
-*RESOLVED*: To avoid yet another extension, include it in this extension.
-
-=== Version History
-
- * Revision 1, 2016-12-13 (James Jones)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_astc_decode_mode.txt b/registry/vulkan/appendices/VK_EXT_astc_decode_mode.txt
deleted file mode 100644
index 3a77206..0000000
--- a/registry/vulkan/appendices/VK_EXT_astc_decode_mode.txt
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_astc_decode_mode.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-08-07
-*Contributors*::
-  - Jan-Harald Fredriksen, Arm
-
-=== Description
-
-The existing specification requires that low dynamic range (LDR) ASTC
-textures are decompressed to FP16 values per component.
-In many cases, decompressing LDR textures to a lower precision intermediate
-result gives acceptable image quality.
-Source material for LDR textures is typically authored as 8-bit UNORM
-values, so decoding to FP16 values adds little value.
-On the other hand, reducing precision of the decoded result reduces the size
-of the decompressed data, potentially improving texture cache performance
-and saving power.
-
-The goal of this extension is to enable this efficiency gain on existing
-ASTC texture data.
-This is achieved by giving the application the ability to select the
-intermediate decoding precision.
-
-Three decoding options are provided:
-
-  * Decode to ename:VK_FORMAT_R16G16B16A16_SFLOAT precision: This is the
-    default, and matches the required behavior in the core API.
-  * Decode to ename:VK_FORMAT_R8G8B8A8_UNORM precision: This is provided as
-    an option in LDR mode.
-  * Decode to ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 precision: This is
-    provided as an option in both LDR and HDR mode.
-    In this mode, negative values cannot be represented and are clamped to
-    zero.
-    The alpha component is ignored, and the results are as if alpha was 1.0.
-    This decode mode is optional and support can be queried via the physical
-    device properties.
-
-include::{generated}/interfaces/VK_EXT_astc_decode_mode.txt[]
-
-=== Issues
-
-1) Are implementations allowed to decode at a higher precision than what is
-requested?
-
-    RESOLUTION: No.
-    If we allow this, then this extension could be exposed on all
-    implementations that support ASTC.
-    But developers would have no way of knowing what precision was actually
-    used, and thus whether the image quality is sufficient at reduced
-    precision.
-
-2) Should the decode mode be image view state and/or sampler state?
-
-    RESOLUTION: Image view state only.
-    Some implementations treat the different decode modes as different
-    texture formats.
-
-=== Example
-
-Create an image view that decodes to ename:VK_FORMAT_R8G8B8A8_UNORM
-precision:
-
-[source,c++]
-----------------------------------------
-
-    VkImageViewASTCDecodeModeEXT decodeMode =
-    {
-        VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT, // sType
-        NULL, // pNext
-        VK_FORMAT_R8G8B8A8_UNORM // decode mode
-    };
-
-    VkImageViewCreateInfo createInfo =
-    {
-        VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, // sType
-        &decodeMode, // pNext
-        // flags, image, viewType set to application-desired values
-        VK_FORMAT_ASTC_8x8_UNORM_BLOCK, // format
-        // components, subresourceRange set to application-desired values
-    };
-
-    VkImageView imageView;
-    VkResult result = vkCreateImageView(
-        device,
-        &createInfo,
-        NULL,
-        &imageView);
-----------------------------------------
-
-=== Version History
-
- * Revision 1, 2018-08-07 (Jan-Harald Fredriksen)
-   - Initial revision
-
diff --git a/registry/vulkan/appendices/VK_EXT_blend_operation_advanced.txt b/registry/vulkan/appendices/VK_EXT_blend_operation_advanced.txt
deleted file mode 100644
index 33d88f3..0000000
--- a/registry/vulkan/appendices/VK_EXT_blend_operation_advanced.txt
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_blend_operation_advanced.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-06-12
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension adds a number of "`advanced`" blending operations that can:
-be used to perform new color blending operations, many of which are more
-complex than the standard blend modes provided by unextended Vulkan.
-This extension requires different styles of usage, depending on the level of
-hardware support and the enabled features:
-
-  - If
-    slink:VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT::pname:advancedBlendCoherentOperations
-    is ename:VK_FALSE, the new blending operations are supported, but a
-    memory dependency must: separate each advanced blend operation on a
-    given sample.
-    ename:VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT is used to
-    synchronize reads using advanced blend operations.
-
-  - If
-    slink:VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT::pname:advancedBlendCoherentOperations
-    is ename:VK_TRUE, advanced blend operations obey primitive order just
-    like basic blend operations.
-
-In unextended Vulkan, the set of blending operations is limited, and can: be
-expressed very simply.
-The ename:VK_BLEND_OP_MIN and ename:VK_BLEND_OP_MAX blend operations simply
-compute component-wise minimums or maximums of source and destination color
-components.
-The ename:VK_BLEND_OP_ADD, ename:VK_BLEND_OP_SUBTRACT, and
-ename:VK_BLEND_OP_REVERSE_SUBTRACT modes multiply the source and destination
-colors by source and destination factors and either add the two products
-together or subtract one from the other.
-This limited set of operations supports many common blending operations but
-precludes the use of more sophisticated transparency and blending operations
-commonly available in many dedicated imaging APIs.
-
-This extension provides a number of new "`advanced`" blending operations.
-Unlike traditional blending operations using ename:VK_BLEND_OP_ADD, these
-blending equations do not use source and destination factors specified by
-elink:VkBlendFactor.
-Instead, each blend operation specifies a complete equation based on the
-source and destination colors.
-These new blend operations are used for both RGB and alpha components; they
-must: not be used to perform separate RGB and alpha blending (via different
-values of color and alpha elink:VkBlendOp).
-
-These blending operations are performed using premultiplied colors, where
-RGB colors can: be considered premultiplied or non-premultiplied by alpha,
-according to the pname:srcPremultiplied and pname:dstPremultiplied members
-of slink:VkPipelineColorBlendAdvancedStateCreateInfoEXT.
-If a color is considered non-premultiplied, the (R,G,B) color components are
-multiplied by the alpha component prior to blending.
-For non-premultiplied color components in the range [eq]#[0,1]#, the
-corresponding premultiplied color component would have values in the range
-[eq]#[0 {times} A, 1 {times} A]#.
-
-Many of these advanced blending equations are formulated where the result of
-blending source and destination colors with partial coverage have three
-separate contributions: from the portions covered by both the source and the
-destination, from the portion covered only by the source, and from the
-portion covered only by the destination.
-The blend parameter
-slink:VkPipelineColorBlendAdvancedStateCreateInfoEXT::pname:blendOverlap
-can: be used to specify a correlation between source and destination pixel
-coverage.
-If set to ename:VK_BLEND_OVERLAP_CONJOINT_EXT, the source and destination
-are considered to have maximal overlap, as would be the case if drawing two
-objects on top of each other.
-If set to ename:VK_BLEND_OVERLAP_DISJOINT_EXT, the source and destination
-are considered to have minimal overlap, as would be the case when rendering
-a complex polygon tessellated into individual non-intersecting triangles.
-If set to ename:VK_BLEND_OVERLAP_UNCORRELATED_EXT, the source and
-destination coverage are assumed to have no spatial correlation within the
-pixel.
-
-In addition to the coherency issues on implementations not supporting
-pname:advancedBlendCoherentOperations, this extension has several
-limitations worth noting.
-First, the new blend operations have a limit on the number of color
-attachments they can: be used with, as indicated by
-slink:VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::pname:advancedBlendMaxColorAttachments.
-Additionally, blending precision may: be limited to 16-bit floating-point,
-which may: result in a loss of precision and dynamic range for framebuffer
-formats with 32-bit floating-point components, and in a loss of precision
-for formats with 12- and 16-bit signed or unsigned normalized integer
-components.
-
-include::{generated}/interfaces/VK_EXT_blend_operation_advanced.txt[]
-
-=== Issues
-
-None.
-
-=== Version History
-
-  * Revision 1, 2017-06-12 (Jeff Bolz)
-    - Internal revisions
-  * Revision 2, 2017-06-12 (Jeff Bolz)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_border_color_swizzle.txt b/registry/vulkan/appendices/VK_EXT_border_color_swizzle.txt
deleted file mode 100644
index 2aa1ac8..0000000
--- a/registry/vulkan/appendices/VK_EXT_border_color_swizzle.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_border_color_swizzle.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-10-12
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Graeme Leese, Broadcom
-  - Jan-Harald Fredriksen, Arm
-  - Ricardo Garcia, Igalia
-  - Shahbaz Youssefi, Google
-  - Stu Smith, AMD
-
-=== Description
-
-After the publication of VK_EXT_custom_border_color, it was discovered that
-some implementations had undefined behavior when combining a sampler that
-uses a custom border color with image views whose component mapping is not
-the identity mapping.
-
-Since VK_EXT_custom_border_color has already shipped, this new extension
-VK_EXT_border_color_swizzle was created to define the interaction between
-custom border colors and non-identity image view swizzles, and provide a
-work-around for implementations that must pre-swizzle the sampler border
-color to match the image view component mapping it is combined with.
-
-This extension also defines the behavior between samplers with an opaque
-black border color and image views with a non-identity component swizzle,
-which was previously left undefined.
-
-include::{generated}/interfaces/VK_EXT_border_color_swizzle.txt[]
-
-=== Issues
-
-None.
-
-=== Version History
-
-  * Revision 1, 2021-10-12 (Piers Daniell)
-    - Internal revisions.
diff --git a/registry/vulkan/appendices/VK_EXT_buffer_device_address.txt b/registry/vulkan/appendices/VK_EXT_buffer_device_address.txt
deleted file mode 100644
index 4020279..0000000
--- a/registry/vulkan/appendices/VK_EXT_buffer_device_address.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_buffer_device_address.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-01-06
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/EXT/SPV_EXT_physical_storage_buffer.html[`SPV_EXT_physical_storage_buffer`]
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Neil Henning, AMD
-  - Tobias Hector, AMD
-  - Jason Ekstrand, Intel
-  - Baldur Karlsson, Valve
-
-=== Description
-
-This extension allows the application to query a 64-bit buffer device
-address value for a buffer, which can be used to access the buffer memory
-via the code:PhysicalStorageBufferEXT storage class in the
-https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference.txt[`GL_EXT_buffer_reference`]
-GLSL extension and
-{spirv}/EXT/SPV_EXT_physical_storage_buffer.html[`SPV_EXT_physical_storage_buffer`]
-SPIR-V extension.
-
-It also allows buffer device addresses to be provided by a trace replay
-tool, so that it matches the address used when the trace was captured.
-
-include::{generated}/interfaces/VK_EXT_buffer_device_address.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-PhysicalStorageBufferAddresses,code:PhysicalStorageBufferAddressesEXT>>
-
-=== Issues
-
-1) Where is VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT
-and VkPhysicalDeviceBufferAddressFeaturesEXT?
-
-*RESOLVED*: They were renamed as
-ename:VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT
-and slink:VkPhysicalDeviceBufferDeviceAddressFeaturesEXT accordingly for
-consistency.
-Even though, the old names can still be found in the generated header files
-for compatibility.
-
-=== Version History
-
- * Revision 1, 2018-11-01 (Jeff Bolz)
-   - Internal revisions
- * Revision 2, 2019-01-06 (Jon Leech)
-   - Minor updates to appendix for publication
diff --git a/registry/vulkan/appendices/VK_EXT_calibrated_timestamps.txt b/registry/vulkan/appendices/VK_EXT_calibrated_timestamps.txt
deleted file mode 100644
index e6288c7..0000000
--- a/registry/vulkan/appendices/VK_EXT_calibrated_timestamps.txt
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_calibrated_timestamps.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-10-04
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Matthaeus G. Chajdas, AMD
-  - Alan Harrison, AMD
-  - Derrick Owens, AMD
-  - Daniel Rakos, AMD
-  - Jason Ekstrand, Intel
-  - Keith Packard, Valve
-
-=== Description
-
-This extension provides an interface to query calibrated timestamps obtained
-quasi simultaneously from two time domains.
-
-include::{generated}/interfaces/VK_EXT_calibrated_timestamps.txt[]
-
-=== Issues
-
-1) Is the device timestamp value returned in the same time domain as the
-timestamp values written by flink:vkCmdWriteTimestamp?
-
-*RESOLVED*: Yes.
-
-2) What time domain is the host timestamp returned in?
-
-*RESOLVED*: A query is provided to determine the calibrateable time domains.
-The expected host time domain used on Windows is that of
-QueryPerformanceCounter, and on Linux that of CLOCK_MONOTONIC.
-
-3) Should we support other time domain combinations than just one host and
-the device time domain?
-
-*RESOLVED*: Supporting that would need the application to query the set of
-supported time domains, while supporting only one host and the device time
-domain would only need a query for the host time domain type.
-The proposed API chooses the general approach for the sake of extensibility.
-
-4) Should we use CLOCK_MONOTONIC_RAW instead of CLOCK_MONOTONIC?
-
-*RESOLVED*: CLOCK_MONOTONIC is usable in a wider set of situations, however,
-it is subject to NTP adjustments so some use cases may prefer
-CLOCK_MONOTONIC_RAW.
-Thus this extension allows both to be exposed.
-
-5) How can the application extrapolate future device timestamp values from
-the calibrated timestamp value?
-
-*RESOLVED*: slink:VkPhysicalDeviceLimits::pname:timestampPeriod makes it
-possible to calculate future device timestamps as follows:
-
-6) In what queue are timestamp values in time domain
-ename:VK_TIME_DOMAIN_DEVICE_EXT captured by
-flink:vkGetCalibratedTimestampsEXT?
-
-*RESOLVED*: An implementation supporting this extension will have all its
-VkQueue share the same time domain.
-
-[source,c]
----------------------------------------------------
-futureTimestamp = calibratedTimestamp + deltaNanoseconds / timestampPeriod
----------------------------------------------------
-
-6) Can the host and device timestamp values drift apart over longer periods
-of time?
-
-*RESOLVED*: Yes, especially as some time domains by definition allow for
-that to happen (e.g. CLOCK_MONOTONIC is subject to NTP adjustments).
-Thus it is recommended that applications re-calibrate from time to time.
-
-7) Should we add a query for reporting the maximum deviation of the
-timestamp values returned by calibrated timestamp queries?
-
-*RESOLVED*: A global query seems inappropriate and difficult to enforce.
-However, it is possible to return the maximum deviation any single
-calibrated timestamp query can have by sampling one of the time domains
-twice as follows:
-
-[source,c]
----------------------------------------------------
-timestampX = timestampX_before = SampleTimeDomain(X)
-for each time domain Y != X
-    timestampY = SampleTimeDomain(Y)
-timestampX_after = SampleTimeDomain(X)
-maxDeviation = timestampX_after - timestampX_before
----------------------------------------------------
-
-8) Can the maximum deviation reported ever be zero?
-
-*RESOLVED*: Unless the tick of each clock corresponding to the set of time
-domains coincides and all clocks can literally be sampled simutaneously,
-there is not really a possibility for the maximum deviation to be zero, so
-by convention the maximum deviation is always at least the maximum of the
-length of the ticks of the set of time domains calibrated and thus can never
-be zero.
-
-=== Version History
-
-  * Revision 2, 2021-03-16 (Lionel Landwerlin)
-    - Specify requirement on device timestamps
-  * Revision 1, 2018-10-04 (Daniel Rakos)
-    - Internal revisions.
diff --git a/registry/vulkan/appendices/VK_EXT_color_write_enable.txt b/registry/vulkan/appendices/VK_EXT_color_write_enable.txt
deleted file mode 100644
index 4d6ee46..0000000
--- a/registry/vulkan/appendices/VK_EXT_color_write_enable.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2020 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_color_write_enable.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-02-25
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Sharif Elcott, Google
-  - Tobias Hector, AMD
-  - Piers Daniell, NVIDIA
-
-=== Description
-
-This extension allows for selectively enabling and disabling writes to
-output color attachments via a pipeline dynamic state.
-
-The intended use cases for this new state are mostly identical to those of
-colorWriteMask, such as selectively disabling writes to avoid feedback loops
-between subpasses or bandwidth savings for unused outputs.
-By making the state dynamic, one additional benefit is the ability to reduce
-pipeline counts and pipeline switching via shaders that write a superset of
-the desired data of which subsets are selected dynamically.
-The reason for a new state, colorWriteEnable, rather than making
-colorWriteMask dynamic is that, on many implementations, the more flexible
-per-component semantics of the colorWriteMask state cannot be made dynamic
-in a performant manner.
-
-include::{generated}/interfaces/VK_EXT_color_write_enable.txt[]
-
-=== Version History
-
- * Revision 1, 2020-01-25 (Sharif Elcott)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_conditional_rendering.txt b/registry/vulkan/appendices/VK_EXT_conditional_rendering.txt
deleted file mode 100644
index 83c55a7..0000000
--- a/registry/vulkan/appendices/VK_EXT_conditional_rendering.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_conditional_rendering.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-05-21
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Vikram Kushwaha, NVIDIA
-  - Daniel Rakos, AMD
-  - Jesse Hall, Google
-  - Jeff Bolz, NVIDIA
-  - Piers Daniell, NVIDIA
-  - Stuart Smith, Imagination Technologies
-
-=== Description
-
-This extension allows the execution of one or more rendering commands to be
-conditional on a value in buffer memory.
-This may help an application reduce the latency by conditionally discarding
-rendering commands without application intervention.
-The conditional rendering commands are limited to draws, compute dispatches
-and clearing attachments within a conditional rendering block.
-
-include::{generated}/interfaces/VK_EXT_conditional_rendering.txt[]
-
-=== Issues
-
-1) Should conditional rendering affect copy and blit commands?
-
-*RESOLVED*: Conditional rendering should not affect copies and blits.
-
-2) Should secondary command buffers be allowed to execute while conditional
-rendering is active in the primary command buffer?
-
-*RESOLVED*: The rendering commands in secondary command buffer will be
-affected by an active conditional rendering in primary command buffer if the
-pname:conditionalRenderingEnable is set to ename:VK_TRUE.
-Conditional rendering must: not be active in the primary command buffer if
-pname:conditionalRenderingEnable is ename:VK_FALSE.
-
-=== Examples
-
-None.
-
-=== Version History
-
-  * Revision 1, 2018-04-19 (Vikram Kushwaha)
-    - First Version
-
-  * Revision 2, 2018-05-21 (Vikram Kushwaha)
-    - Add new pipeline stage, access flags and limit conditional rendering
-      to a subpass or entire render pass.
diff --git a/registry/vulkan/appendices/VK_EXT_conservative_rasterization.txt b/registry/vulkan/appendices/VK_EXT_conservative_rasterization.txt
deleted file mode 100644
index 38f7486..0000000
--- a/registry/vulkan/appendices/VK_EXT_conservative_rasterization.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_conservative_rasterization.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-06-09
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/EXT/SPV_EXT_fragment_fully_covered.html[`SPV_EXT_fragment_fully_covered`]
-    if the
-    sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:fullyCoveredFragmentShaderInputVariable
-    feature is used.
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_post_depth_coverage.html[`SPV_KHR_post_depth_coverage`]if
-    the
-    sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:conservativeRasterizationPostDepthCoverage
-    feature is used.
-  - This extension provides API support for
-    https://www.khronos.org/registry/OpenGL/extensions/NV/NV_conservative_raster_underestimation.txt[`GL_NV_conservative_raster_underestimation`]
-    if the
-    sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:fullyCoveredFragmentShaderInputVariable
-    feature is used.
-*Contributors*::
-  - Daniel Koch, NVIDIA
-  - Daniel Rakos, AMD
-  - Jeff Bolz, NVIDIA
-  - Slawomir Grajewski, Intel
-  - Stu Smith, Imagination Technologies
-
-=== Description
-
-This extension adds a new rasterization mode called conservative
-rasterization.
-There are two modes of conservative rasterization; overestimation and
-underestimation.
-
-When overestimation is enabled, if any part of the primitive, including its
-edges, covers any part of the rectangular pixel area, including its sides,
-then a fragment is generated with all coverage samples turned on.
-This extension allows for some variation in implementations by accounting
-for differences in overestimation, where the generating primitive size is
-increased at each of its edges by some sub-pixel amount to further increase
-conservative pixel coverage.
-Implementations can allow the application to specify an extra overestimation
-beyond the base overestimation the implementation already does.
-It also allows implementations to either cull degenerate primitives or
-rasterize them.
-
-When underestimation is enabled, fragments are only generated if the
-rectangular pixel area is fully covered by the generating primitive.
-If supported by the implementation, when a pixel rectangle is fully covered
-the fragment shader input variable builtin called FullyCoveredEXT is set to
-true.
-The shader variable works in either overestimation or underestimation mode.
-
-Implementations can process degenerate triangles and lines by either
-discarding them or generating conservative fragments for them.
-Degenerate triangles are those that end up with zero area after the
-rasterizer quantizes them to the fixed-point pixel grid.
-Degenerate lines are those with zero length after quantization.
-
-include::{generated}/interfaces/VK_EXT_conservative_rasterization.txt[]
-
-=== Version History
-
-  * Revision 1.1, 2020-09-06 (Piers Daniell)
-    - Add missing SPIR-V and GLSL dependencies.
-
-  * Revision 1, 2017-08-28 (Piers Daniell)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_custom_border_color.txt b/registry/vulkan/appendices/VK_EXT_custom_border_color.txt
deleted file mode 100644
index bd9237e..0000000
--- a/registry/vulkan/appendices/VK_EXT_custom_border_color.txt
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_custom_border_color.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-04-16
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Joshua Ashton, Valve
-  - Hans-Kristian Arntzen, Valve
-  - Philip Rebohle, Valve
-  - Liam Middlebrook, NVIDIA
-  - Jeff Bolz, NVIDIA
-  - Tobias Hector, AMD
-  - Jason Ekstrand, Intel
-  - Spencer Fricke, Samsung Electronics
-  - Graeme Leese, Broadcom
-  - Jesse Hall, Google
-  - Jan-Harald Fredriksen, ARM
-  - Tom Olson, ARM
-  - Stuart Smith, Imagination Technologies
-  - Donald Scorgie, Imagination Technologies
-  - Alex Walters, Imagination Technologies
-  - Peter Quayle, Imagination Technologies
-
-=== Description
-
-This extension provides cross-vendor functionality to specify a custom
-border color for use when the sampler address mode
-ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER is used.
-
-To create a sampler which uses a custom border color set
-slink:VkSamplerCreateInfo::pname:borderColor to one of:
-
-  * ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT
-  * ename:VK_BORDER_COLOR_INT_CUSTOM_EXT
-
-When ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT or
-ename:VK_BORDER_COLOR_INT_CUSTOM_EXT is used, applications must provide a
-slink:VkSamplerCustomBorderColorCreateInfoEXT in the pname:pNext chain for
-slink:VkSamplerCreateInfo.
-
-include::{generated}/interfaces/VK_EXT_custom_border_color.txt[]
-
-=== Issues
-
-1) Should VkClearColorValue be used for the border color value, or should we
-have our own struct/union? Do we need to specify the type of the input
-values for the components? This is more of a concern if VkClearColorValue is
-used here because it provides a union of float,int,uint types.
-
-*RESOLVED*: Will reuse existing VkClearColorValue structure in order to
-easily take advantage of float,int,uint borderColor types.
-
-
-2) For hardware which supports a limited number of border colors what
-happens if that number is exceeded? Should this be handled by the driver
-unbeknownst to the application? In Revision 1 we had solved this issue using
-a new Object type, however that may have lead to additional system resource
-consumption which would otherwise not be required.
-
-*RESOLVED*: Added
-sname:VkPhysicalDeviceCustomBorderColorPropertiesEXT::pname:maxCustomBorderColorSamplers
-for tracking implementation-specific limit, and Valid Usage statement
-handling overflow.
-
-3) Should this be supported for immutable samplers at all, or by a feature
-bit? Some implementations may not be able to support custom border colors on
-immutable samplers -- is it worthwhile enabling this to work on them for
-implementations that can support it, or forbidding it entirely.
-
-*RESOLVED*: Samplers created with a custom border color are forbidden from
-being immutable.
-This resolves concerns for implementations where the custom border color is
-an index to a LUT instead of being directly embedded into sampler state.
-
-4) Should UINT and SINT (unsigned integer and signed integer) border color
-types be separated or should they be combined into one generic INT (integer)
-type?
-
-*RESOLVED*: Separating these does not make much sense as the existing fixed
-border color types do not have this distinction, and there is no reason in
-hardware to do so.
-This separation would also create unnecessary work and considerations for
-the application.
-
-=== Version History
-
-  * Revision 1, 2019-10-10 (Joshua Ashton)
-    - Internal revisions.
-
-  * Revision 2, 2019-10-11 (Liam Middlebrook)
-    - Remove VkCustomBorderColor object and associated functions
-    - Add issues concerning HW limitations for custom border color count
-
-  * Revision 3, 2019-10-12 (Joshua Ashton)
-    - Re-expose the limits for the maximum number of unique border colors
-    - Add extra details about border color tracking
-    - Fix typos
-
-  * Revision 4, 2019-10-12 (Joshua Ashton)
-    - Changed maxUniqueCustomBorderColors to a uint32_t from a VkDeviceSize
-
-  * Revision 5, 2019-10-14 (Liam Middlebrook)
-    - Added features bit
-
-  * Revision 6, 2019-10-15 (Joshua Ashton)
-    - Type-ize VK_BORDER_COLOR_CUSTOM
-    - Fix const-ness on pname:pNext of
-      VkSamplerCustomBorderColorCreateInfoEXT
-
-  * Revision 7, 2019-11-26 (Liam Middlebrook)
-    - Renamed maxUniqueCustomBorderColors to maxCustomBorderColors
-
-  * Revision 8, 2019-11-29 (Joshua Ashton)
-    - Renamed borderColor member of VkSamplerCustomBorderColorCreateInfoEXT
-      to customBorderColor
-
-  * Revision 9, 2020-02-19 (Joshua Ashton)
-    - Renamed maxCustomBorderColors to maxCustomBorderColorSamplers
-
-  * Revision 10, 2020-02-21 (Joshua Ashton)
-    - Added format to VkSamplerCustomBorderColorCreateInfoEXT and feature
-      bit
-
-  * Revision 11, 2020-04-07 (Joshua Ashton)
-    - Dropped UINT/SINT border color differences, consolidated types
-
-  * Revision 12, 2020-04-16 (Joshua Ashton)
-    - Renamed VK_BORDER_COLOR_CUSTOM_FLOAT_EXT to
-      VK_BORDER_COLOR_FLOAT_CUSTOM_EXT for consistency
diff --git a/registry/vulkan/appendices/VK_EXT_debug_marker.txt b/registry/vulkan/appendices/VK_EXT_debug_marker.txt
deleted file mode 100644
index 0e5cc9d..0000000
--- a/registry/vulkan/appendices/VK_EXT_debug_marker.txt
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright 2016-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_debug_marker.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-01-31
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Baldur Karlsson
-  - Dan Ginsburg, Valve
-  - Jon Ashburn, LunarG
-  - Kyle Spagnoli, NVIDIA
-
-=== Description
-
-The `VK_EXT_debug_marker` extension is a device extension.
-It introduces concepts of object naming and tagging, for better tracking of
-Vulkan objects, as well as additional commands for recording annotations of
-named sections of a workload to aid organization and offline analysis in
-external tools.
-
-include::{generated}/interfaces/VK_EXT_debug_marker.txt[]
-
-=== Examples
-
-*Example 1*
-
-Associate a name with an image, for easier debugging in external tools or
-with validation layers that can print a friendly name when referring to
-objects in error messages.
-
-[source,c++]
-----------------------------------------
-    extern VkDevice device;
-    extern VkImage image;
-
-    // Must call extension functions through a function pointer:
-    PFN_vkDebugMarkerSetObjectNameEXT pfnDebugMarkerSetObjectNameEXT = (PFN_vkDebugMarkerSetObjectNameEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectNameEXT");
-
-    // Set a name on the image
-    const VkDebugMarkerObjectNameInfoEXT imageNameInfo =
-    {
-        VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT, // sType
-        NULL,                                           // pNext
-        VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,          // objectType
-        (uint64_t)image,                                // object
-        "Brick Diffuse Texture",                        // pObjectName
-    };
-
-    pfnDebugMarkerSetObjectNameEXT(device, &imageNameInfo);
-
-    // A subsequent error might print:
-    //   Image 'Brick Diffuse Texture' (0xc0dec0dedeadbeef) is used in a
-    //   command buffer with no memory bound to it.
-----------------------------------------
-
-*Example 2*
-
-Annotating regions of a workload with naming information so that offline
-analysis tools can display a more usable visualisation of the commands
-submitted.
-
-[source,c++]
-----------------------------------------
-    extern VkDevice device;
-    extern VkCommandBuffer commandBuffer;
-
-    // Must call extension functions through a function pointer:
-    PFN_vkCmdDebugMarkerBeginEXT pfnCmdDebugMarkerBeginEXT = (PFN_vkCmdDebugMarkerBeginEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT");
-    PFN_vkCmdDebugMarkerEndEXT pfnCmdDebugMarkerEndEXT = (PFN_vkCmdDebugMarkerEndEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT");
-    PFN_vkCmdDebugMarkerInsertEXT pfnCmdDebugMarkerInsertEXT = (PFN_vkCmdDebugMarkerInsertEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerInsertEXT");
-
-    // Describe the area being rendered
-    const VkDebugMarkerMarkerInfoEXT houseMarker =
-    {
-        VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT, // sType
-        NULL,                                           // pNext
-        "Brick House",                                  // pMarkerName
-        { 1.0f, 0.0f, 0.0f, 1.0f },                     // color
-    };
-
-    // Start an annotated group of calls under the 'Brick House' name
-    pfnCmdDebugMarkerBeginEXT(commandBuffer, &houseMarker);
-    {
-        // A mutable structure for each part being rendered
-        VkDebugMarkerMarkerInfoEXT housePartMarker =
-        {
-            VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT, // sType
-            NULL,                                           // pNext
-            NULL,                                           // pMarkerName
-            { 0.0f, 0.0f, 0.0f, 0.0f },                     // color
-        };
-
-        // Set the name and insert the marker
-        housePartMarker.pMarkerName = "Walls";
-        pfnCmdDebugMarkerInsertEXT(commandBuffer, &housePartMarker);
-
-        // Insert the drawcall for the walls
-        vkCmdDrawIndexed(commandBuffer, 1000, 1, 0, 0, 0);
-
-        // Insert a recursive region for two sets of windows
-        housePartMarker.pMarkerName = "Windows";
-        pfnCmdDebugMarkerBeginEXT(commandBuffer, &housePartMarker);
-        {
-            vkCmdDrawIndexed(commandBuffer, 75, 6, 1000, 0, 0);
-            vkCmdDrawIndexed(commandBuffer, 100, 2, 1450, 0, 0);
-        }
-        pfnCmdDebugMarkerEndEXT(commandBuffer);
-
-        housePartMarker.pMarkerName = "Front Door";
-        pfnCmdDebugMarkerInsertEXT(commandBuffer, &housePartMarker);
-
-        vkCmdDrawIndexed(commandBuffer, 350, 1, 1650, 0, 0);
-
-        housePartMarker.pMarkerName = "Roof";
-        pfnCmdDebugMarkerInsertEXT(commandBuffer, &housePartMarker);
-
-        vkCmdDrawIndexed(commandBuffer, 500, 1, 2000, 0, 0);
-    }
-    // End the house annotation started above
-    pfnCmdDebugMarkerEndEXT(commandBuffer);
-----------------------------------------
-
-=== Issues
-
-1) Should the tag or name for an object be specified using the pname:pNext
-parameter in the object's stext:Vk*CreateInfo structure?
-
-*RESOLVED*: No.
-While this fits with other Vulkan patterns and would allow more type safety
-and future proofing against future objects, it has notable downsides.
-In particular passing the name at stext:Vk*CreateInfo time does not allow
-renaming, prevents late binding of naming information, and does not allow
-naming of implicitly created objects such as queues and swapchain images.
-
-2) Should the command annotation functions flink:vkCmdDebugMarkerBeginEXT
-and flink:vkCmdDebugMarkerEndEXT support the ability to specify a color?
-
-*RESOLVED*: Yes.
-The functions have been expanded to take an optional color which can be used
-at will by implementations consuming the command buffer annotations in their
-visualisation.
-
-3) Should the functions added in this extension accept an extensible
-structure as their parameter for a more flexible API, as opposed to direct
-function parameters? If so, which functions?
-
-*RESOLVED*: Yes.
-All functions have been modified to take a structure type with extensible
-pname:pNext pointer, to allow future extensions to add additional annotation
-information in the same commands.
-
-=== Version History
-
- * Revision 1, 2016-02-24 (Baldur Karlsson)
-   - Initial draft, based on LunarG marker spec
-
- * Revision 2, 2016-02-26 (Baldur Karlsson)
-   - Renamed Dbg to DebugMarker in function names
-   - Allow markers in secondary command buffers under certain circumstances
-   - Minor language tweaks and edits
-
- * Revision 3, 2016-04-23 (Baldur Karlsson)
-   - Reorganise spec layout to closer match desired organisation
-   - Added optional color to markers (both regions and inserted labels)
-   - Changed functions to take extensible structs instead of direct function
-     parameters
-
- * Revision 4, 2017-01-31 (Baldur Karlsson)
-   - Added explicit dependency on VK_EXT_debug_report
-   - Moved definition of elink:VkDebugReportObjectTypeEXT to debug report
-     chapter.
-   - Fixed typo in dates in revision history
diff --git a/registry/vulkan/appendices/VK_EXT_debug_report.txt b/registry/vulkan/appendices/VK_EXT_debug_report.txt
deleted file mode 100644
index 8a2e6fd..0000000
--- a/registry/vulkan/appendices/VK_EXT_debug_report.txt
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright 2015-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_debug_report.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-12-14
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Courtney Goeltzenleuchter, LunarG
-  - Dan Ginsburg, Valve
-  - Jon Ashburn, LunarG
-  - Mark Lobodzinski, LunarG
-
-=== Description
-
-Due to the nature of the Vulkan interface, there is very little error
-information available to the developer and application.
-By enabling optional validation layers and using the `VK_EXT_debug_report`
-extension, developers can: obtain much more detailed feedback on the
-application's use of Vulkan.
-This extension defines a way for layers and the implementation to call back
-to the application for events of interest to the application.
-
-include::{generated}/interfaces/VK_EXT_debug_report.txt[]
-
-=== Examples
-
-`VK_EXT_debug_report` allows an application to register multiple callbacks
-with the validation layers.
-Some callbacks may log the information to a file, others may cause a debug
-break point or other application defined behavior.
-An application can: register callbacks even when no validation layers are
-enabled, but they will only be called for loader and, if implemented, driver
-events.
-
-To capture events that occur while creating or destroying an instance an
-application can: link a slink:VkDebugReportCallbackCreateInfoEXT structure
-to the pname:pNext element of the slink:VkInstanceCreateInfo structure given
-to flink:vkCreateInstance.
-
-Example uses: Create three callback objects.
-One will log errors and warnings to the debug console using Windows
-code:OutputDebugString.
-The second will cause the debugger to break at that callback when an error
-happens and the third will log warnings to stdout.
-[source,c++]
-------------------------------------------------------------------------------
-    VkResult res;
-    VkDebugReportCallbackEXT cb1, cb2, cb3;
-
-    VkDebugReportCallbackCreateInfoEXT callback1 = {
-            VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,    // sType
-            NULL,                                                       // pNext
-            VK_DEBUG_REPORT_ERROR_BIT_EXT |                             // flags
-            VK_DEBUG_REPORT_WARNING_BIT_EXT,
-            myOutputDebugString,                                        // pfnCallback
-            NULL                                                        // pUserData
-    };
-    res = vkCreateDebugReportCallbackEXT(instance, &callback1, &cb1);
-    if (res != VK_SUCCESS)
-       /* Do error handling for VK_ERROR_OUT_OF_MEMORY */
-
-    callback.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT;
-    callback.pfnCallback = myDebugBreak;
-    callback.pUserData = NULL;
-    res = vkCreateDebugReportCallbackEXT(instance, &callback, &cb2);
-    if (res != VK_SUCCESS)
-       /* Do error handling for VK_ERROR_OUT_OF_MEMORY */
-
-    VkDebugReportCallbackCreateInfoEXT callback3 = {
-            VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,    // sType
-            NULL,                                                       // pNext
-            VK_DEBUG_REPORT_WARNING_BIT_EXT,                            // flags
-            mystdOutLogger,                                             // pfnCallback
-            NULL                                                        // pUserData
-    };
-    res = vkCreateDebugReportCallbackEXT(instance, &callback3, &cb3);
-    if (res != VK_SUCCESS)
-       /* Do error handling for VK_ERROR_OUT_OF_MEMORY */
-
-    ...
-
-    /* remove callbacks when cleaning up */
-    vkDestroyDebugReportCallbackEXT(instance, cb1);
-    vkDestroyDebugReportCallbackEXT(instance, cb2);
-    vkDestroyDebugReportCallbackEXT(instance, cb3);
-------------------------------------------------------------------------------
-
-[NOTE]
-.Note
-====
-In the initial release of the `VK_EXT_debug_report` extension, the token
-ename:VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT was used.
-Starting in version 2 of the extension branch,
-ename:VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT is used
-instead for consistency with Vulkan naming rules.
-The older enum is still available for backwards compatibility.
-====
-
-[NOTE]
-.Note
-====
-In the initial release of the `VK_EXT_debug_report` extension, the token
-ename:VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT was used.
-Starting in version 8 of the extension branch,
-ename:VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT is used
-instead for consistency with Vulkan naming rules.
-The older enum is still available for backwards compatibility.
-====
-
-
-=== Issues
-
-1) What is the hierarchy / seriousness of the message flags? E.g.
-etext:ERROR > etext:WARN > etext:PERF_WARN ...
-
-*RESOLVED*: There is no specific hierarchy.
-Each bit is independent and should be checked via bitwise AND.
-For example:
-
-[source,c++]
-----------------------------------------
-    if (localFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) {
-        process error message
-    }
-    if (localFlags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) {
-        process debug message
-    }
-----------------------------------------
-
-The validation layers do use them in a hierarchical way (etext:ERROR >
-etext:WARN > etext:PERF, etext:WARN > etext:DEBUG > etext:INFO) and they (at
-least at the time of this writing) only set one bit at a time.
-But it is not a requirement of this extension.
-
-It is possible that a layer may intercept and change, or augment the flags
-with extension values the application's debug report handler may not be
-familiar with, so it is important to treat each flag independently.
-
-2) Should there be a VU requiring
-slink:VkDebugReportCallbackCreateInfoEXT::pname:flags to be non-zero?
-
-*RESOLVED*: It may not be very useful, but we do not need VU statement
-requiring the sname:VkDebugReportCallbackCreateInfoEXT::pname:msgFlags at
-create-time to be non-zero.
-One can imagine that apps may prefer it as it allows them to set the mask as
-desired - including nothing - at runtime without having to check.
-
-3) What is the difference between ename:VK_DEBUG_REPORT_DEBUG_BIT_EXT and
-ename:VK_DEBUG_REPORT_INFORMATION_BIT_EXT?
-
-*RESOLVED*: ename:VK_DEBUG_REPORT_DEBUG_BIT_EXT specifies information that
-could be useful debugging the Vulkan implementation itself.
-
-4) How do you compare handles returned by the debug_report callback to the
-application's handles?
-
-*RESOLVED*: Due to the different nature of dispatchable and nondispatchable
-handles there is no generic way (that we know of) that works for common
-compilers with 32bit, 64bit, C and C++.
-We recommend applications use the same cast that the validation layers use:
-+
-[source,c++]
-----
-reinterpret_cast<uint64_t &>(dispatchableHandle)
-(uint64_t)(nondispatchableHandle)
-----
-+
-This does require that the app treat dispatchable and nondispatchable
-handles differently.
-
-=== Version History
-
- * Revision 1, 2015-05-20 (Courtney Goetzenleuchter)
-   - Initial draft, based on LunarG KHR spec, other KHR specs
-
- * Revision 2, 2016-02-16 (Courtney Goetzenleuchter)
-   - Update usage, documentation
-
- * Revision 3, 2016-06-14 (Courtney Goetzenleuchter)
-   - Update VK_EXT_DEBUG_REPORT_SPEC_VERSION to indicate added support for
-     vkCreateInstance and vkDestroyInstance
-
- * Revision 4, 2016-12-08 (Mark Lobodzinski)
-   - Added Display_KHR, DisplayModeKHR extension objects
-   - Added ObjectTable_NVX, IndirectCommandsLayout_NVX extension objects
-   - Bumped spec revision
-   - Retroactively added version history
-
- * Revision 5, 2017-01-31 (Baldur Karlsson)
-   - Moved definition of elink:VkDebugReportObjectTypeEXT from debug marker
-     chapter
-
- * Revision 6, 2017-01-31 (Baldur Karlsson)
-   - Added VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR_EXT
-
- * Revision 7, 2017-04-20 (Courtney Goeltzenleuchter)
-   - Clarify wording and address questions from developers.
-
- * Revision 8, 2017-04-21 (Courtney Goeltzenleuchter)
-   - Remove unused enum VkDebugReportErrorEXT
-
- * Revision 9, 2017-09-12 (Tobias Hector)
-   - Added interactions with Vulkan 1.1
-
- * Revision 10, 2020-12-14 (Courtney Goetzenleuchter)
-   - Add issue 4 discussing matching handles returned by the extension,
-     based on suggestion in public issue 368.
diff --git a/registry/vulkan/appendices/VK_EXT_debug_utils.txt b/registry/vulkan/appendices/VK_EXT_debug_utils.txt
deleted file mode 100644
index 7107167..0000000
--- a/registry/vulkan/appendices/VK_EXT_debug_utils.txt
+++ /dev/null
@@ -1,338 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_debug_utils.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-04-03
-*Revision*::
-    2
-*IP Status*::
-    No known IP claims.
-*Dependencies*::
-  - This extension is written against version 1.0 of the Vulkan API.
-  - Requires elink:VkObjectType
-*Contributors*::
-  - Mark Young, LunarG
-  - Baldur Karlsson
-  - Ian Elliott, Google
-  - Courtney Goeltzenleuchter, Google
-  - Karl Schultz, LunarG
-  - Mark Lobodzinski, LunarG
-  - Mike Schuchardt, LunarG
-  - Jaakko Konttinen, AMD
-  - Dan Ginsburg, Valve Software
-  - Rolando Olivares, Epic Games
-  - Dan Baker, Oxide Games
-  - Kyle Spagnoli, NVIDIA
-  - Jon Ashburn, LunarG
-  - Piers Daniell, NVIDIA
-
-=== Description
-
-Due to the nature of the Vulkan interface, there is very little error
-information available to the developer and application.
-By using the `VK_EXT_debug_utils` extension, developers can: obtain more
-information.
-When combined with validation layers, even more detailed feedback on the
-application's use of Vulkan will be provided.
-
-This extension provides the following capabilities:
-
-  - The ability to create a debug messenger which will pass along debug
-    messages to an application supplied callback.
-  - The ability to identify specific Vulkan objects using a name or tag to
-    improve tracking.
-  - The ability to identify specific sections within a sname:VkQueue or
-    sname:VkCommandBuffer using labels to aid organization and offline
-    analysis in external tools.
-
-The main difference between this extension and `apiext:VK_EXT_debug_report`
-and `apiext:VK_EXT_debug_marker` is that those extensions use
-elink:VkDebugReportObjectTypeEXT to identify objects.
-This extension uses the core elink:VkObjectType in place of
-elink:VkDebugReportObjectTypeEXT.
-The primary reason for this move is that no future object type handle
-enumeration values will be added to elink:VkDebugReportObjectTypeEXT since
-the creation of elink:VkObjectType.
-
-In addition, this extension combines the functionality of both
-`apiext:VK_EXT_debug_report` and `apiext:VK_EXT_debug_marker` by allowing
-object name and debug markers (now called labels) to be returned to the
-application's callback function.
-This should assist in clarifying the details of a debug message including:
-what objects are involved and potentially which location within a
-slink:VkQueue or slink:VkCommandBuffer the message occurred.
-
-include::{generated}/interfaces/VK_EXT_debug_utils.txt[]
-
-=== Examples
-
-*Example 1*
-
-`VK_EXT_debug_utils` allows an application to register multiple callbacks
-with any Vulkan component wishing to report debug information.
-Some callbacks may log the information to a file, others may cause a debug
-break point or other application defined behavior.
-An application can: register callbacks even when no validation layers are
-enabled, but they will only be called for loader and, if implemented, driver
-events.
-
-To capture events that occur while creating or destroying an instance an
-application can: link a slink:VkDebugUtilsMessengerCreateInfoEXT structure
-to the pname:pNext element of the slink:VkInstanceCreateInfo structure given
-to flink:vkCreateInstance.
-
-Example uses: Create three callback objects.
-One will log errors and warnings to the debug console using Windows
-code:OutputDebugString.
-The second will cause the debugger to break at that callback when an error
-happens and the third will log warnings to stdout.
-[source,c++]
-------------------------------------------------------------------------------
-    extern VkInstance instance;
-    VkResult res;
-    VkDebugUtilsMessengerEXT cb1, cb2, cb3;
-
-    // Must call extension functions through a function pointer:
-    PFN_vkCreateDebugUtilsMessengerEXT pfnCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT");
-    PFN_vkDestroyDebugUtilsMessengerEXT pfnDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT");
-
-    VkDebugUtilsMessengerCreateInfoEXT callback1 = {
-            VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,  // sType
-            NULL,                                                     // pNext
-            0,                                                        // flags
-            VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT |           // messageSeverity
-            VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT,
-            VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |             // messageType
-            VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT,
-            myOutputDebugString,                                      // pfnUserCallback
-            NULL                                                      // pUserData
-    };
-    res = pfnCreateDebugUtilsMessengerEXT(instance, &callback1, NULL, &cb1);
-    if (res != VK_SUCCESS) {
-       // Do error handling for VK_ERROR_OUT_OF_MEMORY
-    }
-
-    callback1.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
-    callback1.pfnUserCallback = myDebugBreak;
-    callback1.pUserData = NULL;
-    res = pfnCreateDebugUtilsMessengerEXT(instance, &callback1, NULL, &cb2);
-    if (res != VK_SUCCESS) {
-       // Do error handling for VK_ERROR_OUT_OF_MEMORY
-    }
-
-    VkDebugUtilsMessengerCreateInfoEXT callback3 = {
-            VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,  // sType
-            NULL,                                                     // pNext
-            0,                                                        // flags
-            VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT,          // messageSeverity
-            VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |             // messageType
-            VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT,
-            mystdOutLogger,                                           // pfnUserCallback
-            NULL                                                      // pUserData
-    };
-    res = pfnCreateDebugUtilsMessengerEXT(instance, &callback3, NULL, &cb3);
-    if (res != VK_SUCCESS) {
-       // Do error handling for VK_ERROR_OUT_OF_MEMORY
-    }
-
-    ...
-
-    // Remove callbacks when cleaning up
-    pfnDestroyDebugUtilsMessengerEXT(instance, cb1, NULL);
-    pfnDestroyDebugUtilsMessengerEXT(instance, cb2, NULL);
-    pfnDestroyDebugUtilsMessengerEXT(instance, cb3, NULL);
-------------------------------------------------------------------------------
-
-*Example 2*
-
-Associate a name with an image, for easier debugging in external tools or
-with validation layers that can print a friendly name when referring to
-objects in error messages.
-
-[source,c++]
-----------------------------------------
-    extern VkInstance instance;
-    extern VkDevice device;
-    extern VkImage image;
-
-    // Must call extension functions through a function pointer:
-    PFN_vkSetDebugUtilsObjectNameEXT pfnSetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT)vkGetInstanceProcAddr(instance, "vkSetDebugUtilsObjectNameEXT");
-
-    // Set a name on the image
-    const VkDebugUtilsObjectNameInfoEXT imageNameInfo =
-    {
-        VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, // sType
-        NULL,                                               // pNext
-        VK_OBJECT_TYPE_IMAGE,                               // objectType
-        (uint64_t)image,                                    // objectHandle
-        "Brick Diffuse Texture",                            // pObjectName
-    };
-
-    pfnSetDebugUtilsObjectNameEXT(device, &imageNameInfo);
-
-    // A subsequent error might print:
-    //   Image 'Brick Diffuse Texture' (0xc0dec0dedeadbeef) is used in a
-    //   command buffer with no memory bound to it.
-----------------------------------------
-
-*Example 3*
-
-Annotating regions of a workload with naming information so that offline
-analysis tools can display a more usable visualization of the commands
-submitted.
-
-[source,c++]
-----------------------------------------
-    extern VkInstance instance;
-    extern VkCommandBuffer commandBuffer;
-
-    // Must call extension functions through a function pointer:
-    PFN_vkQueueBeginDebugUtilsLabelEXT pfnQueueBeginDebugUtilsLabelEXT = (PFN_vkQueueBeginDebugUtilsLabelEXT)vkGetInstanceProcAddr(instance, "vkQueueBeginDebugUtilsLabelEXT");
-    PFN_vkQueueEndDebugUtilsLabelEXT pfnQueueEndDebugUtilsLabelEXT = (PFN_vkQueueEndDebugUtilsLabelEXT)vkGetInstanceProcAddr(instance, "vkQueueEndDebugUtilsLabelEXT");
-    PFN_vkCmdBeginDebugUtilsLabelEXT pfnCmdBeginDebugUtilsLabelEXT = (PFN_vkCmdBeginDebugUtilsLabelEXT)vkGetInstanceProcAddr(instance, "vkCmdBeginDebugUtilsLabelEXT");
-    PFN_vkCmdEndDebugUtilsLabelEXT pfnCmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT)vkGetInstanceProcAddr(instance, "vkCmdEndDebugUtilsLabelEXT");
-    PFN_vkCmdInsertDebugUtilsLabelEXT pfnCmdInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT)vkGetInstanceProcAddr(instance, "vkCmdInsertDebugUtilsLabelEXT");
-
-    // Describe the area being rendered
-    const VkDebugUtilsLabelEXT houseLabel =
-    {
-        VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, // sType
-        NULL,                                    // pNext
-        "Brick House",                           // pLabelName
-        { 1.0f, 0.0f, 0.0f, 1.0f },              // color
-    };
-
-    // Start an annotated group of calls under the 'Brick House' name
-    pfnCmdBeginDebugUtilsLabelEXT(commandBuffer, &houseLabel);
-    {
-        // A mutable structure for each part being rendered
-        VkDebugUtilsLabelEXT housePartLabel =
-        {
-            VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, // sType
-            NULL,                                    // pNext
-            NULL,                                    // pLabelName
-            { 0.0f, 0.0f, 0.0f, 0.0f },              // color
-        };
-
-        // Set the name and insert the marker
-        housePartLabel.pLabelName = "Walls";
-        pfnCmdInsertDebugUtilsLabelEXT(commandBuffer, &housePartLabel);
-
-        // Insert the drawcall for the walls
-        vkCmdDrawIndexed(commandBuffer, 1000, 1, 0, 0, 0);
-
-        // Insert a recursive region for two sets of windows
-        housePartLabel.pLabelName = "Windows";
-        pfnCmdBeginDebugUtilsLabelEXT(commandBuffer, &housePartLabel);
-        {
-            vkCmdDrawIndexed(commandBuffer, 75, 6, 1000, 0, 0);
-            vkCmdDrawIndexed(commandBuffer, 100, 2, 1450, 0, 0);
-        }
-        pfnCmdEndDebugUtilsLabelEXT(commandBuffer);
-
-        housePartLabel.pLabelName = "Front Door";
-        pfnCmdInsertDebugUtilsLabelEXT(commandBuffer, &housePartLabel);
-
-        vkCmdDrawIndexed(commandBuffer, 350, 1, 1650, 0, 0);
-
-        housePartLabel.pLabelName = "Roof";
-        pfnCmdInsertDebugUtilsLabelEXT(commandBuffer, &housePartLabel);
-
-        vkCmdDrawIndexed(commandBuffer, 500, 1, 2000, 0, 0);
-    }
-    // End the house annotation started above
-    pfnCmdEndDebugUtilsLabelEXT(commandBuffer);
-
-    // Do other work
-
-    vkEndCommandBuffer(commandBuffer);
-
-    // Describe the queue being used
-    const VkDebugUtilsLabelEXT queueLabel =
-    {
-        VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, // sType
-        NULL,                                    // pNext
-        "Main Render Work",                      // pLabelName
-        { 0.0f, 1.0f, 0.0f, 1.0f },              // color
-    };
-
-    // Identify the queue label region
-    pfnQueueBeginDebugUtilsLabelEXT(queue, &queueLabel);
-
-    // Submit the work for the main render thread
-    const VkCommandBuffer cmd_bufs[] = {commandBuffer};
-    VkSubmitInfo submit_info = {.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
-                                .pNext = NULL,
-                                .waitSemaphoreCount = 0,
-                                .pWaitSemaphores = NULL,
-                                .pWaitDstStageMask = NULL,
-                                .commandBufferCount = 1,
-                                .pCommandBuffers = cmd_bufs,
-                                .signalSemaphoreCount = 0,
-                                .pSignalSemaphores = NULL};
-    vkQueueSubmit(queue, 1, &submit_info, fence);
-
-    // End the queue label region
-    pfnQueueEndDebugUtilsLabelEXT(queue);
-
-----------------------------------------
-
-=== Issues
-
-1) Should we just name this extension `VK_EXT_debug_report2`
-
-*RESOLVED*: No.
-There is enough additional changes to the structures to break backwards
-compatibility.
-So, a new name was decided that would not indicate any interaction with the
-previous extension.
-
-2) Will validation layers immediately support all the new features.
-
-*RESOLVED*: Not immediately.
-As one can imagine, there is a lot of work involved with converting the
-validation layer logging over to the new functionality.
-Basic logging, as seen in the origin `apiext:VK_EXT_debug_report` extension
-will be made available immediately.
-However, adding the labels and object names will take time.
-Since the priority for Khronos at this time is to continue focusing on Valid
-Usage statements, it may take a while before the new functionality is fully
-exposed.
-
-3) If the validation layers will not expose the new functionality
-immediately, then what is the point of this extension?
-
-*RESOLVED*: We needed a replacement for `apiext:VK_EXT_debug_report` because
-the elink:VkDebugReportObjectTypeEXT enumeration will no longer be updated
-and any new objects will need to be debugged using the new functionality
-provided by this extension.
-
-4) Should this extension be split into two separate parts (1 extension that
-is an instance extension providing the callback functionality, and another
-device extension providing the general debug marker and annotation
-functionality)?
-
-*RESOLVED*: No, the functionality for this extension is too closely related.
-If we did split up the extension, where would the structures and enums live,
-and how would you define that the device behavior in the instance extension
-is really only valid if the device extension is enabled, and the
-functionality is passed in.
-It is cleaner to just define this all as an instance extension, plus it
-allows the application to enable all debug functionality provided with one
-enable string during flink:vkCreateInstance.
-
-=== Version History
-
- * Revision 1, 2017-09-14 (Mark Young and all listed Contributors)
- ** Initial draft, based on `apiext:VK_EXT_debug_report` and
-    `apiext:VK_EXT_debug_marker` in addition to previous feedback supplied
-    from various companies including Valve, Epic, and Oxide games.
- * Revision 2, 2020-04-03 (Mark Young and Piers Daniell)
- ** Updated to allow either `NULL` or an empty string to be passed in for
-    pname:pObjectName in sname:VkDebugUtilsObjectNameInfoEXT, because the
-    loader and various drivers support `NULL` already.
diff --git a/registry/vulkan/appendices/VK_EXT_depth_clip_enable.txt b/registry/vulkan/appendices/VK_EXT_depth_clip_enable.txt
deleted file mode 100644
index c1e9194..0000000
--- a/registry/vulkan/appendices/VK_EXT_depth_clip_enable.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_depth_clip_enable.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-12-20
-*Contributors*::
-  - Daniel Rakos, AMD
-  - Henri Verbeet, CodeWeavers
-  - Jeff Bolz, NVIDIA
-  - Philip Rebohle, DXVK
-  - Tobias Hector, AMD
-
-=== Description
-
-This extension allows the depth clipping operation, that is normally
-implicitly controlled by
-slink:VkPipelineRasterizationStateCreateInfo::pname:depthClampEnable, to
-instead be controlled explicitly by
-slink:VkPipelineRasterizationDepthClipStateCreateInfoEXT::pname:depthClipEnable.
-
-This is useful for translating DX content which assumes depth clamping is
-always enabled, but depth clip can be controlled by the DepthClipEnable
-rasterization state (D3D12_RASTERIZER_DESC).
-
-include::{generated}/interfaces/VK_EXT_depth_clip_enable.txt[]
-
-=== Version History
-
-  * Revision 1, 2018-12-20 (Piers Daniell)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_depth_range_unrestricted.txt b/registry/vulkan/appendices/VK_EXT_depth_range_unrestricted.txt
deleted file mode 100644
index eb2a929..0000000
--- a/registry/vulkan/appendices/VK_EXT_depth_range_unrestricted.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_depth_range_unrestricted.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-06-22
-*Contributors*::
-    - Daniel Koch, NVIDIA
-    - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension removes the slink:VkViewport pname:minDepth and
-pname:maxDepth restrictions that the values must be between `0.0` and `1.0`,
-inclusive.
-It also removes the same restriction on
-slink:VkPipelineDepthStencilStateCreateInfo pname:minDepthBounds and
-pname:maxDepthBounds.
-Finally it removes the restriction on the pname:depth value in
-slink:VkClearDepthStencilValue.
-
-include::{generated}/interfaces/VK_EXT_depth_range_unrestricted.txt[]
-
-=== Issues
-
-1) How do slink:VkViewport pname:minDepth and pname:maxDepth values outside
-of the `0.0` to `1.0` range interact with
-<<vertexpostproc-clipping,Primitive Clipping>>?
-
-*RESOLVED*: The behavior described in <<vertexpostproc-clipping,Primitive
-Clipping>> still applies.
-If depth clamping is disabled the depth values are still clipped to [eq]#0
-{leq} z~c~ {leq} w~c~# before the viewport transform.
-If depth clamping is enabled the above equation is ignored and the depth
-values are instead clamped to the slink:VkViewport pname:minDepth and
-pname:maxDepth values, which in the case of this extension can be outside of
-the `0.0` to `1.0` range.
-
-2) What happens if a resulting depth fragment is outside of the `0.0` to
-`1.0` range and the depth buffer is fixed-point rather than floating-point?
-
-*RESOLVED*: The supported range of a fixed-point depth buffer is `0.0` to
-`1.0` and depth fragments are clamped to this range.
-
-=== Version History
-
-  * Revision 1, 2017-06-22 (Piers Daniell)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_descriptor_indexing.txt b/registry/vulkan/appendices/VK_EXT_descriptor_indexing.txt
deleted file mode 100644
index 207ada3..0000000
--- a/registry/vulkan/appendices/VK_EXT_descriptor_indexing.txt
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_descriptor_indexing.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-10-02
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Daniel Rakos, AMD
-  - Slawomir Grajewski, Intel
-  - Tobias Hector, Imagination Technologies
-
-=== Description
-
-This extension adds several small features which together enable
-applications to create large descriptor sets containing substantially all of
-their resources, and selecting amongst those resources with dynamic
-(non-uniform) indexes in the shader.
-There are feature enables and SPIR-V capabilities for non-uniform descriptor
-indexing in the shader, and non-uniform indexing in the shader requires use
-of a new code:NonUniformEXT decoration defined in the
-`SPV_EXT_descriptor_indexing` SPIR-V extension.
-There are descriptor set layout binding creation flags enabling several
-features:
-
-  * Descriptors can be updated after they are bound to a command buffer,
-    such that the execution of the command buffer reflects the most recent
-    update to the descriptors.
-  * Descriptors that are not used by any pending command buffers can be
-    updated, which enables writing new descriptors for frame N+1 while frame
-    N is executing.
-  * Relax the requirement that all descriptors in a binding that is
-    "`statically used`" must be valid, such that descriptors that are not
-    accessed by a submission need not be valid and can be updated while that
-    submission is executing.
-  * The final binding in a descriptor set layout can have a variable size
-    (and unsized arrays of resources are allowed in the
-    `GL_EXT_nonuniform_qualifier` and `SPV_EXT_descriptor_indexing`
-    extensions).
-
-Note that it is valid for multiple descriptor arrays in a shader to use the
-same set and binding number, as long as they are all compatible with the
-descriptor type in the pipeline layout.
-This means a single array binding in the descriptor set can serve multiple
-texture dimensionalities, or an array of buffer descriptors can be used with
-multiple different block layouts.
-
-There are new descriptor set layout and descriptor pool creation flags that
-are required to opt in to the update-after-bind functionality, and there are
-separate pname:maxPerStage* and pname:maxDescriptorSet* limits that apply to
-these descriptor set layouts which may: be much higher than the pre-existing
-limits.
-The old limits only count descriptors in non-updateAfterBind descriptor set
-layouts, and the new limits count descriptors in all descriptor set layouts
-in the pipeline layout.
-
-include::{generated}/interfaces/VK_EXT_descriptor_indexing.txt[]
-
-=== Promotion to Vulkan 1.2
-
-Functionality in this extension is included in core Vulkan 1.2, with the EXT
-suffix omitted.
-However, if Vulkan 1.2 is supported and this extension is not, the
-code:descriptorIndexing capability is optional.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-=== Version History
-
-  * Revision 1, 2017-07-26 (Jeff Bolz)
-    - Internal revisions
-  * Revision 2, 2017-10-02 (Jeff Bolz)
-    - ???
diff --git a/registry/vulkan/appendices/VK_EXT_device_memory_report.txt b/registry/vulkan/appendices/VK_EXT_device_memory_report.txt
deleted file mode 100644
index 17cdebc..0000000
--- a/registry/vulkan/appendices/VK_EXT_device_memory_report.txt
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_device_memory_report.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-01-06
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Yiwei Zhang, Google
-  - Jesse Hall, Google
-
-=== Description
-
-This device extension allows registration of device memory event callbacks
-upon device creation, so that applications or middleware can obtain detailed
-information about memory usage and how memory is associated with Vulkan
-objects.
-This extension exposes the actual underlying device memory usage, including
-allocations that are not normally visible to the application, such as memory
-consumed by flink:vkCreateGraphicsPipelines.
-It is intended primarily for use by debug tooling rather than for production
-applications.
-
-include::{generated}/interfaces/VK_EXT_device_memory_report.txt[]
-
-=== Issues
-
-1) Should this be better expressed as an extension to VK_EXT_debug_utils and
-its general-purpose messenger construct?
-
-*RESOLVED*: No.
-The intended lifecycle is quite different.
-We want to make this extension tied to the device's lifecycle.
-Each ICD just handles its own implementation of this extension, and this
-extension will only be directly exposed from the ICD.
-So we can avoid the extra implementation complexity used to accommodate the
-flexibility of `apiext:VK_EXT_debug_utils` extension.
-
-2) Can we extend and use the existing internal allocation callbacks instead
-of adding the new callback structure in this extension?
-
-*RESOLVED*: No.
-Our memory reporting layer that combines this information with other memory
-information it collects directly (e.g. bindings of resources to
-slink:VkDeviceMemory) would have to intercept all entry points that take a
-slink:VkAllocationCallbacks parameter and inject its own
-pname:pfnInternalAllocation and pname:pfnInternalFree.
-That may be doable for the extensions we know about, but not for ones we do
-not.
-The proposal would work fine in the face of most unknown extensions.
-But even for ones we know about, since apps can provide a different set of
-callbacks and userdata and those can be retained by the driver and used
-later (esp.
-for pool object, but not just those), we would have to dynamically allocate
-the interception trampoline every time.
-That is getting to be an unreasonably large amount of complexity and
-(possibly) overhead.
-
-We are interested in both alloc/free and import/unimport.
-The latter is fairly important for tracking (and avoiding double-counting)
-of swapchain images (still true with "`native swapchains`" based on external
-memory) and media/camera interop.
-Though we might be able to handle this with additional
-elink:VkInternalAllocationType values, for import/export we do want to be
-able to tie this to the external resource, which is one thing that the
-pname:memoryObjectId is for.
-
-The internal alloc/free callbacks are not extensible except via new
-elink:VkInternalAllocationType values.
-The slink:VkDeviceMemoryReportCallbackDataEXT in this extension is
-extensible.
-That was deliberate: there is a real possibility we will want to get extra
-information in the future.
-As one example, currently this reports only physical allocations, but we
-believe there are interesting cases for tracking how populated that VA
-region is.
-
-The callbacks are clearly specified as only callable within the context of a
-call from the app into Vulkan.
-We believe there are some cases where drivers can allocate device memory
-asynchronously.
-This was one of the sticky issues that derailed the internal device memory
-allocation reporting design (which is essentially what this extension is
-trying to do) leading up to 1.0.
-
-slink:VkAllocationCallbacks is described in a section called "`Host memory`"
-and the intro to it is very explicitly about host memory.
-The other callbacks are all inherently about host memory.
-But this extension is very focused on device memory.
-
-3) Should the callback be reporting which heap is used?
-
-*RESOLVED*: Yes.
-It is important for non-UMA systems to have all the device memory
-allocations attributed to the corresponding device memory heaps.
-For internally-allocated device memory, pname:heapIndex will always
-correspond to an advertised heap, rather than having a magic value
-indicating a non-advertised heap.
-Drivers can advertise heaps that do not have any corresponding memory types
-if they need to.
-
-4) Should we use an array of callback for the layers to intercept instead of
-chaining multiple of the slink:VkDeviceDeviceMemoryReportCreateInfoEXT
-structures in the pname:pNext of slink:VkDeviceCreateInfo?
-
-*RESOLVED* No.
-The pointer to the slink:VkDeviceDeviceMemoryReportCreateInfoEXT structure
-itself is const and you cannot just cast it away.
-Thus we cannot update the callback array inside the structure.
-In addition, we cannot drop this pname:pNext chain either, so making a copy
-of this whole structure does not work either.
-
-5) Should we track bulk allocations shared among multiple objects?
-
-*RESOLVED* No.
-Take the shader heap as an example.
-Some implementations will let multiple slink:VkPipeline objects share the
-same shader heap.
-We are not asking the implementation to report ename:VK_OBJECT_TYPE_PIPELINE
-along with a dlink:VK_NULL_HANDLE for this bulk allocation.
-Instead, this bulk allocation is considered as a layer below what this
-extension is interested in.
-Later, when the actual slink:VkPipeline objects are created by suballocating
-from the bulk allocation, we ask the implementation to report the valid
-handles of the slink:VkPipeline objects along with the actual suballocated
-sizes and different pname:memoryObjectId.
-
-6) Can we require the callbacks to be always called in the same thread with
-the Vulkan commands?
-
-*RESOLVED* No.
-Some implementations might choose to multiplex work from multiple
-application threads into a single backend thread and perform JIT allocations
-as a part of that flow.
-Since this behavior is theoretically legit, we cannot require the callbacks
-to be always called in the same thread with the Vulkan commands, and the
-note is to remind the applications to handle this case properly.
-
-7) Should we add an additional "`allocation failed`" event type with things
-like size and heap index reported?
-
-*RESOLVED* Yes.
-This fits in well with the callback infrastructure added in this extension,
-and implementation touches the same code and has the same overheads as the
-rest of the extension.
-It could help debugging things like getting an
-ename:VK_ERROR_OUT_OF_HOST_MEMORY error when ending a command buffer.
-Right now the allocation failure could have happened anywhere during
-recording, and a callback would be really useful to understand where and
-why.
-
-=== Version History
-
- * Revision 1, 2020-08-26 (Yiwei Zhang)
-   - Initial version
- * Revision 2, 2021-01-06 (Yiwei Zhang)
-   - Minor description update
diff --git a/registry/vulkan/appendices/VK_EXT_direct_mode_display.txt b/registry/vulkan/appendices/VK_EXT_direct_mode_display.txt
deleted file mode 100644
index d91bd29..0000000
--- a/registry/vulkan/appendices/VK_EXT_direct_mode_display.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2016-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_direct_mode_display.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-12-13
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Pierre Boudier, NVIDIA
-  - James Jones, NVIDIA
-  - Damien Leone, NVIDIA
-  - Pierre-Loup Griffais, Valve
-  - Liam Middlebrook, NVIDIA
-
-=== Description
-
-This is extension, along with related platform extensions, allows
-applications to take exclusive control of displays associated with a native
-windowing system.
-This is especially useful for virtual reality applications that wish to hide
-HMDs (head mounted displays) from the native platform's display management
-system, desktop, and/or other applications.
-
-include::{generated}/interfaces/VK_EXT_direct_mode_display.txt[]
-
-=== Issues
-
-1) Should this extension and its related platform-specific extensions
-leverage `apiext:VK_KHR_display`, or provide separate equivalent interfaces.
-
-*RESOLVED*: Use `apiext:VK_KHR_display` concepts and objects.
-`apiext:VK_KHR_display` can be used to enumerate all displays on the system,
-including those attached to/in use by a window system or native platform,
-but `apiext:VK_KHR_display_swapchain` will fail to create a swapchain on
-in-use displays.
-This extension and its platform-specific children will allow applications to
-grab in-use displays away from window systems and/or native platforms,
-allowing them to be used with `apiext:VK_KHR_display_swapchain`.
-
-2) Are separate calls needed to acquire displays and enable direct mode?
-
-*RESOLVED*: No, these operations happen in one combined command.
-Acquiring a display puts it into direct mode.
-
-=== Version History
-
- * Revision 1, 2016-12-13 (James Jones)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_directfb_surface.txt b/registry/vulkan/appendices/VK_EXT_directfb_surface.txt
deleted file mode 100644
index 45fa147..0000000
--- a/registry/vulkan/appendices/VK_EXT_directfb_surface.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_directfb_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-06-16
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Nicolas Caramelli
-
-=== Description
-
-The `VK_EXT_directfb_surface` extension is an instance extension.
-It provides a mechanism to create a slink:VkSurfaceKHR object (defined by
-the `apiext:VK_KHR_surface` extension) that refers to a DirectFB
-code:IDirectFBSurface, as well as a query to determine support for rendering
-via DirectFB.
-
-include::{generated}/interfaces/VK_EXT_directfb_surface.txt[]
-
-=== Version History
-
- * Revision 1, 2020-06-16 (Nicolas Caramelli)
-   - Initial version
diff --git a/registry/vulkan/appendices/VK_EXT_discard_rectangles.txt b/registry/vulkan/appendices/VK_EXT_discard_rectangles.txt
deleted file mode 100644
index 3edbda5..0000000
--- a/registry/vulkan/appendices/VK_EXT_discard_rectangles.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2016-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_discard_rectangles.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-12-22
-*Interactions and External Dependencies*::
-  - Interacts with `apiext:VK_KHR_device_group`
-  - Interacts with Vulkan 1.1
-*Contributors*::
-  - Daniel Koch, NVIDIA
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension provides additional orthogonally aligned "`discard
-rectangles`" specified in framebuffer-space coordinates that restrict
-rasterization of all points, lines and triangles.
-
-From zero to an implementation-dependent limit (specified by
-pname:maxDiscardRectangles) number of discard rectangles can be operational
-at once.
-When one or more discard rectangles are active, rasterized fragments can
-either survive if the fragment is within any of the operational discard
-rectangles (ename:VK_DISCARD_RECTANGLE_MODE_INCLUSIVE_EXT mode) or be
-rejected if the fragment is within any of the operational discard rectangles
-(ename:VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT mode).
-
-These discard rectangles operate orthogonally to the existing scissor test
-functionality.
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-The discard rectangles can be different for each physical device in a device
-group by specifying the device mask and setting discard rectangle dynamic
-state.
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-include::{generated}/interfaces/VK_EXT_discard_rectangles.txt[]
-
-=== Version History
-
-  * Revision 1, 2016-12-22 (Piers Daniell)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_display_control.txt b/registry/vulkan/appendices/VK_EXT_display_control.txt
deleted file mode 100644
index 9b42d10..0000000
--- a/registry/vulkan/appendices/VK_EXT_display_control.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2016-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_display_control.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-12-13
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Pierre Boudier, NVIDIA
-  - James Jones, NVIDIA
-  - Damien Leone, NVIDIA
-  - Pierre-Loup Griffais, Valve
-  - Daniel Vetter, Intel
-
-=== Description
-
-This extension defines a set of utility functions for use with the
-`apiext:VK_KHR_display` and `apiext:VK_KHR_display_swapchain` extensions.
-
-include::{generated}/interfaces/VK_EXT_display_control.txt[]
-
-=== Issues
-
-1) Should this extension add an explicit "`WaitForVsync`" API or a fence
-signaled at vsync that the application can wait on?
-
-*RESOLVED*: A fence.
-A separate API could later be provided that allows exporting the fence to a
-native object that could be inserted into standard run loops on POSIX and
-Windows systems.
-
-2) Should callbacks be added for a vsync event, or in general to monitor
-events in Vulkan?
-
-*RESOLVED*: No, fences should be used.
-Some events are generated by interrupts which are managed in the kernel.
-In order to use a callback provided by the application, drivers would need
-to have the userspace driver spawn threads that would wait on the kernel
-event, and hence the callbacks could be difficult for the application to
-synchronize with its other work given they would arrive on a foreign thread.
-
-3) Should vblank or scanline events be exposed?
-
-*RESOLVED*: Vblank events.
-Scanline events could be added by a separate extension, but the latency of
-processing an interrupt and waking up a userspace event is high enough that
-the accuracy of a scanline event would be rather low.
-Further, per-scanline interrupts are not supported by all hardware.
-
-=== Version History
-
- * Revision 1, 2016-12-13 (James Jones)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_display_surface_counter.txt b/registry/vulkan/appendices/VK_EXT_display_surface_counter.txt
deleted file mode 100644
index 9840b81..0000000
--- a/registry/vulkan/appendices/VK_EXT_display_surface_counter.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_display_surface_counter.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-12-13
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Pierre Boudier, NVIDIA
-  - James Jones, NVIDIA
-  - Damien Leone, NVIDIA
-  - Pierre-Loup Griffais, Valve
-  - Daniel Vetter, Intel
-
-=== Description
-
-This extension defines a vertical blanking period counter associated with
-display surfaces.
-It provides a mechanism to query support for such a counter from a
-slink:VkSurfaceKHR object.
-
-include::{generated}/interfaces/VK_EXT_display_surface_counter.txt[]
-
-=== Version History
-
- * Revision 1, 2016-12-13 (James Jones)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_extended_dynamic_state.txt b/registry/vulkan/appendices/VK_EXT_extended_dynamic_state.txt
deleted file mode 100644
index f20d0e8..0000000
--- a/registry/vulkan/appendices/VK_EXT_extended_dynamic_state.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_extended_dynamic_state.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-12-09
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Dan Ginsburg, Valve Corporation
-  - Graeme Leese, Broadcom
-  - Hans-Kristian Arntzen, Valve Corporation
-  - Jan-Harald Fredriksen, Arm Limited
-  - Jason Ekstrand, Intel
-  - Jeff Bolz, NVIDIA
-  - Jesse Hall, Google
-  - Philip Rebohle, Valve Corporation
-  - Stuart Smith, Imagination Technologies
-  - Tobias Hector, AMD
-
-=== Description
-
-This extension adds some more dynamic state to support applications that
-need to reduce the number of pipeline state objects they compile and bind.
-
-include::{generated}/interfaces/VK_EXT_extended_dynamic_state.txt[]
-
-=== Version History
-
- * Revision 1, 2019-12-09 (Piers Daniell)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_extended_dynamic_state2.txt b/registry/vulkan/appendices/VK_EXT_extended_dynamic_state2.txt
deleted file mode 100755
index fbbfbbd..0000000
--- a/registry/vulkan/appendices/VK_EXT_extended_dynamic_state2.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_extended_dynamic_state2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-04-12
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Vikram Kushwaha, NVIDIA
-  - Piers Daniell, NVIDIA
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension adds some more dynamic state to support applications that
-need to reduce the number of pipeline state objects they compile and bind.
-
-include::{generated}/interfaces/VK_EXT_extended_dynamic_state2.txt[]
-
-=== Version History
-
- * Revision 1, 2021-04-12 (Vikram Kushwaha)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_external_memory_dma_buf.txt b/registry/vulkan/appendices/VK_EXT_external_memory_dma_buf.txt
deleted file mode 100644
index 440d057..0000000
--- a/registry/vulkan/appendices/VK_EXT_external_memory_dma_buf.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_external_memory_dma_buf.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-10-10
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Chad Versace, Google
-  - James Jones, NVIDIA
-  - Jason Ekstrand, Intel
-
-=== Description
-
-A code:dma_buf is a type of file descriptor, defined by the Linux kernel,
-that allows sharing memory across kernel device drivers and across
-processes.
-This extension enables applications to import a code:dma_buf as
-slink:VkDeviceMemory, to export slink:VkDeviceMemory as a code:dma_buf, and
-to create slink:VkBuffer objects that can: be bound to that memory.
-
-include::{generated}/interfaces/VK_EXT_external_memory_dma_buf.txt[]
-
-=== Issues
-
-1) How does the application, when creating a slink:VkImage that it intends
-to bind to code:dma_buf slink:VkDeviceMemory containing an externally
-produced image, specify the memory layout (such as row pitch and DRM format
-modifier) of the slink:VkImage? In other words, how does the application
-achieve behavior comparable to that provided by
-https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_image_dma_buf_import.txt[`EGL_EXT_image_dma_buf_import`]
-and
-https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_image_dma_buf_import_modifiers.txt[`EGL_EXT_image_dma_buf_import_modifiers`]
-?
-
-*RESOLVED*: Features comparable to those in
-https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_image_dma_buf_import.txt[`EGL_EXT_image_dma_buf_import`]
-and
-https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_image_dma_buf_import_modifiers.txt[`EGL_EXT_image_dma_buf_import_modifiers`]
-will be provided by an extension layered atop this one.
-
-2) Without the ability to specify the memory layout of external code:dma_buf
-images, how is this extension useful?
-
-*RESOLVED*: This extension provides exactly one new feature: the ability to
-import/export between code:dma_buf and slink:VkDeviceMemory.
-This feature, together with features provided by
-`apiext:VK_KHR_external_memory_fd`, is sufficient to bind a slink:VkBuffer
-to code:dma_buf.
-
-=== Version History
-
-  * Revision 1, 2017-10-10 (Chad Versace)
-    - Squashed internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_external_memory_host.txt b/registry/vulkan/appendices/VK_EXT_external_memory_host.txt
deleted file mode 100644
index 0c10b38..0000000
--- a/registry/vulkan/appendices/VK_EXT_external_memory_host.txt
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_external_memory_host.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-11-10
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jaakko Konttinen, AMD
-  - David Mao, AMD
-  - Daniel Rakos, AMD
-  - Tobias Hector, Imagination Technologies
-  - Jason Ekstrand, Intel
-  - James Jones, NVIDIA
-
-=== Description
-
-This extension enables an application to import host allocations and host
-mapped foreign device memory to Vulkan memory objects.
-
-include::{generated}/interfaces/VK_EXT_external_memory_host.txt[]
-
-=== Issues
-
-1) What memory type has to be used to import host pointers?
-
-*RESOLVED*: Depends on the implementation.
-Applications have to use the new flink:vkGetMemoryHostPointerPropertiesEXT
-command to query the supported memory types for a particular host pointer.
-The reported memory types may include memory types that come from a memory
-heap that is otherwise not usable for regular memory object allocation and
-thus such a heap's size may be zero.
-
-2) Can the application still access the contents of the host allocation
-after importing?
-
-*RESOLVED*: Yes.
-However, usual synchronization requirements apply.
-
-3) Can the application free the host allocation?
-
-*RESOLVED*: No, it violates valid usage conditions.
-Using the memory object imported from a host allocation that is already
-freed thus results in undefined: behavior.
-
-4) Is flink:vkMapMemory expected to return the same host address which was
-specified when importing it to the memory object?
-
-*RESOLVED*: No.
-Implementations are allowed to return the same address but it is not
-required.
-Some implementations might return a different virtual mapping of the
-allocation, although the same physical pages will be used.
-
-5) Is there any limitation on the alignment of the host pointer and/or size?
-
-*RESOLVED*: Yes.
-Both the address and the size have to be an integer multiple of
-pname:minImportedHostPointerAlignment.
-In addition, some platforms and foreign devices may have additional
-restrictions.
-
-6) Can the same host allocation be imported multiple times into a given
-physical device?
-
-*RESOLVED*: No, at least not guaranteed by this extension.
-Some platforms do not allow locking the same physical pages for device
-access multiple times, so attempting to do it may result in undefined:
-behavior.
-
-7) Does this extension support exporting the new handle type?
-
-*RESOLVED*: No.
-
-8) Should we include the possibility to import host mapped foreign device
-memory using this API?
-
-*RESOLVED*: Yes, through a separate handle type.
-Implementations are still allowed to support only one of the handle types
-introduced by this extension by not returning import support for a
-particular handle type as returned in slink:VkExternalMemoryPropertiesKHR.
-
-=== Version History
-
- * Revision 1, 2017-11-10 (Daniel Rakos)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_filter_cubic.txt b/registry/vulkan/appendices/VK_EXT_filter_cubic.txt
deleted file mode 100644
index 4fe1e1c..0000000
--- a/registry/vulkan/appendices/VK_EXT_filter_cubic.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_filter_cubic.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-12-13
-*Contributors*::
-  - Bill Licea-Kane, Qualcomm Technologies, Inc.
-  - Andrew Garrard, Samsung
-  - Daniel Koch, NVIDIA
-  - Donald Scorgie, Imagination Technologies
-  - Graeme Leese, Broadcom
-  - Jan-Herald Fredericksen, ARM
-  - Jeff Leger, Qualcomm Technologies, Inc.
-  - Tobias Hector, AMD
-  - Tom Olson, ARM
-  - Stuart Smith, Imagination Technologies
-
-=== Description
-
-`VK_EXT_filter_cubic` extends `VK_IMG_filter_cubic`.
-
-It documents cubic filtering of other image view types.
-It adds new structures that can: be added to the pname:pNext chain of
-slink:VkPhysicalDeviceImageFormatInfo2 and slink:VkImageFormatProperties2
-that can: be used to determine which image types and which image view types
-support cubic filtering.
-
-include::{generated}/interfaces/VK_EXT_filter_cubic.txt[]
-
-=== Version History
-
- * Revision 3, 2019-12-13 (wwlk)
-   - Delete requirement to cubic filter the formats USCALED_PACKED32,
-     SSCALED_PACKED32, UINT_PACK32, and SINT_PACK32 (cut/paste error)
- * Revision 2, 2019-06-05 (wwlk)
-   - Clarify 1D optional
- * Revision 1, 2019-01-24 (wwlk)
-   - Initial version
diff --git a/registry/vulkan/appendices/VK_EXT_fragment_density_map.txt b/registry/vulkan/appendices/VK_EXT_fragment_density_map.txt
deleted file mode 100644
index 3501470..0000000
--- a/registry/vulkan/appendices/VK_EXT_fragment_density_map.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_fragment_density_map.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-09-30
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/EXT/SPV_EXT_fragment_invocation_density.html[`SPV_EXT_fragment_invocation_density`]
-*Contributors*::
-  - Matthew Netsch, Qualcomm Technologies, Inc.
-  - Robert VanReenen, Qualcomm Technologies, Inc.
-  - Jonathan Wicks, Qualcomm Technologies, Inc.
-  - Tate Hornbeck, Qualcomm Technologies, Inc.
-  - Sam Holmes, Qualcomm Technologies, Inc.
-  - Jeff Leger, Qualcomm Technologies, Inc.
-  - Jan-Harald Fredriksen, ARM
-  - Jeff Bolz, NVIDIA
-  - Pat Brown, NVIDIA
-  - Daniel Rakos, AMD
-  - Piers Daniell, NVIDIA
-
-=== Description
-
-This extension allows an application to specify areas of the render target
-where the fragment shader may be invoked fewer times.
-These fragments are broadcasted out to multiple pixels to cover the render
-target.
-
-The primary use of this extension is to reduce workloads in areas where
-lower quality may not be perceived such as the distorted edges of a lens or
-the periphery of a user's gaze.
-
-include::{generated}/interfaces/VK_EXT_fragment_density_map.txt[]
-
-=== New or Modified Built-In Variables
-
-  * <<interfaces-builtin-variables-fraginvocationcount,code:FragInvocationCountEXT>>
-  * <<interfaces-builtin-variables-fragsize,code:FragSizeEXT>>
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-FragmentDensityEXT,FragmentDensityEXT>>
-
-=== Version History
-
-  * Revision 1, 2018-09-25 (Matthew Netsch)
-    - Initial version
-  * Revision 2, 2021-09-30 (Jon Leech)
-    - Add interaction with `apiext:VK_KHR_format_feature_flags2` to `vk.xml`
diff --git a/registry/vulkan/appendices/VK_EXT_fragment_density_map2.txt b/registry/vulkan/appendices/VK_EXT_fragment_density_map2.txt
deleted file mode 100644
index 03caa38..0000000
--- a/registry/vulkan/appendices/VK_EXT_fragment_density_map2.txt
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_fragment_density_map2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-06-16
-*Interactions and External Dependencies*::
-  - Interacts with Vulkan 1.1
-*Contributors*::
-  - Matthew Netsch, Qualcomm Technologies, Inc.
-  - Jonathan Tinkham, Qualcomm Technologies, Inc.
-  - Jonathan Wicks, Qualcomm Technologies, Inc.
-  - Jan-Harald Fredriksen, ARM
-
-=== Description
-
-This extension adds additional features and properties to
-`apiext:VK_EXT_fragment_density_map` in order to reduce fragment density map
-host latency as well as improved queries for subsampled sampler
-implementation-dependent behavior.
-
-include::{generated}/interfaces/VK_EXT_fragment_density_map.txt[]
-
-=== Version History
-
- * Revision 1, 2020-06-16 (Matthew Netsch)
-   - Initial version
-
-ifdef::isrefpage[]
-=== Examples
-
-==== Additional limits for subsampling
-
-Some implementations may not support subsampled samplers if certain
-implementation limits are not observed by the app.
-slink:VkPhysicalDeviceFragmentDensityMap2PropertiesEXT provides additional
-limits to require apps remain within these boundaries if they wish to use
-subsampling.
-
-==== Improved host latency
-
-By default, the fragment density map is locked by the host for reading
-between flink:vkCmdBeginRenderPass during recording and
-ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT during draw
-execution.
-
-This can introduce large latency for certain use cases between recording the
-frame and displaying the frame.
-Apps may wish to modify the fragment density map just before draw execution.
-
-ename:VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT is intended
-to help address this for implementations that do not support the
-<<features-fragmentdensitymapdynamic,fragmentDensityMapDynamic>> feature by
-deferring the start of the locked range to flink:vkEndCommandBuffer.
-
-
-[source,c++]
-----------------------------------------
-// Create view for fragment density map
-VkImageViewCreateInfo createInfo =
-{
-   ​VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
-   // ...
-   VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT,
-   fdmImage, // Created with VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT
-   // ...
-};
-
-// ...
-
-// Begin fragment density map render pass with deferred view.
-// By default, fdmImage must not be modified after this call
-// unless view is created with the FDM dynamic or deferred flags.
-vkCmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
-
-// ...
-
-vkCmdEndRenderPass(VkCommandBuffer commandBuffer);
-
-// Can keep making modifications to deferred fragment density maps
-// while recording commandBuffer ...
-
-result = vkEndCommandBuffer(commandBuffer);
-
-// Must now freeze modifying fdmImage until after the
-// VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT of
-// the last executing draw that uses the fdmImage in the
-// last submit of commandBuffer.
-
-----------------------------------------
-endif::isrefpage[]
diff --git a/registry/vulkan/appendices/VK_EXT_fragment_shader_interlock.txt b/registry/vulkan/appendices/VK_EXT_fragment_shader_interlock.txt
deleted file mode 100644
index b2adc6a..0000000
--- a/registry/vulkan/appendices/VK_EXT_fragment_shader_interlock.txt
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_fragment_shader_interlock.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-05-02
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/EXT/SPV_EXT_fragment_shader_interlock.html[`SPV_EXT_fragment_shader_interlock`]
-  - This extension provides API support for
-    https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_fragment_shader_interlock.txt[`GL_ARB_fragment_shader_interlock`]
-*Contributors*::
-  - Daniel Koch, NVIDIA
-  - Graeme Leese, Broadcom
-  - Jan-Harald Fredriksen, Arm
-  - Jason Ekstrand, Intel
-  - Jeff Bolz, NVIDIA
-  - Ruihao Zhang, Qualcomm
-  - Slawomir Grajewski, Intel
-  - Spencer Fricke, Samsung
-
-=== Description
-
-This extension adds support for the code:FragmentShaderPixelInterlockEXT,
-code:FragmentShaderSampleInterlockEXT, and
-code:FragmentShaderShadingRateInterlockEXT capabilities from the
-`SPV_EXT_fragment_shader_interlock` extension to Vulkan.
-
-Enabling these capabilities provides a critical section for fragment shaders
-to avoid overlapping pixels being processed at the same time, and certain
-guarantees about the ordering of fragment shader invocations of fragments of
-overlapping pixels.
-
-This extension can be useful for algorithms that need to access per-pixel
-data structures via shader loads and stores.
-Algorithms using this extension can access per-pixel data structures in
-critical sections without other invocations accessing the same per-pixel
-data.
-Additionally, the ordering guarantees are useful for cases where the API
-ordering of fragments is meaningful.
-For example, applications may be able to execute programmable blending
-operations in the fragment shader, where the destination buffer is read via
-image loads and the final value is written via image stores.
-
-include::{generated}/interfaces/VK_EXT_fragment_shader_interlock.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-FragmentShaderSampleInterlockEXT,FragmentShaderInterlockEXT>>
-  * <<spirvenv-capabilities-table-FragmentShaderPixelInterlockEXT,FragmentShaderPixelInterlockEXT>>
-  * <<spirvenv-capabilities-table-FragmentShaderShadingRateInterlockEXT,FragmentShaderShadingRateInterlockEXT>>
-
-=== Version History
-
-  * Revision 1, 2019-05-24 (Piers Daniell)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_full_screen_exclusive.txt b/registry/vulkan/appendices/VK_EXT_full_screen_exclusive.txt
deleted file mode 100644
index d0333f6..0000000
--- a/registry/vulkan/appendices/VK_EXT_full_screen_exclusive.txt
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_full_screen_exclusive.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-03-12
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Interacts with Vulkan 1.1
-  - Interacts with `apiext:VK_KHR_device_group`
-  - Interacts with `apiext:VK_KHR_win32_surface`
-*Contributors*::
-  - Hans-Kristian Arntzen, ARM
-  - Slawomir Grajewski, Intel
-  - Tobias Hector, AMD
-  - James Jones, NVIDIA
-  - Daniel Rakos, AMD
-  - Jeff Juliano, NVIDIA
-  - Joshua Schnarr, NVIDIA
-  - Aaron Hagan, AMD
-
-=== Description
-
-This extension allows applications to set the policy for swapchain creation
-and presentation mechanisms relating to full-screen access.
-Implementations may be able to acquire exclusive access to a particular
-display for an application window that covers the whole screen.
-This can increase performance on some systems by bypassing composition,
-however it can also result in disruptive or expensive transitions in the
-underlying windowing system when a change occurs.
-
-Applications can choose between explicitly disallowing or allowing this
-behavior, letting the implementation decide, or managing this mode of
-operation directly using the new flink:vkAcquireFullScreenExclusiveModeEXT
-and flink:vkReleaseFullScreenExclusiveModeEXT commands.
-
-include::{generated}/interfaces/VK_EXT_full_screen_exclusive.txt[]
-
-=== Issues
-
-1) What should the extension & flag be called?
-
-*RESOLVED*: VK_EXT_full_screen_exclusive.
-
-Other options considered (prior to the app-controlled mode) were:
-
-  * VK_EXT_smooth_fullscreen_transition
-  * VK_EXT_fullscreen_behavior
-  * VK_EXT_fullscreen_preference
-  * VK_EXT_fullscreen_hint
-  * VK_EXT_fast_fullscreen_transition
-  * VK_EXT_avoid_fullscreen_exclusive
-
-2) Do we need more than a boolean toggle?
-
-*RESOLVED*: Yes.
-
-Using an enum with default/allowed/disallowed/app-controlled enables
-applications to accept driver default behavior, specifically override it in
-either direction without implying the driver is ever required to use
-full-screen exclusive mechanisms, or manage this mode explicitly.
-
-3) Should this be a KHR or EXT extension?
-
-*RESOLVED*: EXT, in order to allow it to be shipped faster.
-
-4) Can the fullscreen hint affect the surface capabilities, and if so,
-should the hint also be specified as input when querying the surface
-capabilities?
-
-*RESOLVED*: Yes on both accounts.
-
-While the hint does not guarantee a particular fullscreen mode will be used
-when the swapchain is created, it can sometimes imply particular modes will
-NOT be used.
-If the driver determines that it will opt-out of using a particular mode
-based on the policy, and knows it can only support certain capabilities if
-that mode is used, it would be confusing at best to the application to
-report those capabilities in such cases.
-Not allowing implementations to report this state to applications could
-result in situations where applications are unable to determine why
-swapchain creation fails when they specify certain hint values, which could
-result in never- terminating surface creation loops.
-
-5) Should full-screen be one word or two?
-
-*RESOLVED*: Two words.
-
-"Fullscreen" is not in my dictionary, and web searches did not turn up
-definitive proof that it is a colloquially accepted compound word.
-Documentation for the corresponding Windows API mechanisms dithers.
-The text consistently uses a hyphen, but none-the-less, there is a
-SetFullscreenState method in the DXGI swapchain object.
-Given this inconclusive external guidance, it is best to adhere to the
-Vulkan style guidelines and avoid inventing new compound words.
-
-=== Version History
-
- * Revision 4, 2019-03-12 (Tobias Hector)
-   - Added application-controlled mode, and related functions
-   - Tidied up appendix
-
- * Revision 3, 2019-01-03 (James Jones)
-   - Renamed to VK_EXT_full_screen_exclusive
-   - Made related adjustments to the tri-state enumerant names.
-
- * Revision 2, 2018-11-27 (James Jones)
-   - Renamed to VK_KHR_fullscreen_behavior
-   - Switched from boolean flag to tri-state enum
-
- * Revision 1, 2018-11-06 (James Jones)
-   - Internal revision
diff --git a/registry/vulkan/appendices/VK_EXT_global_priority.txt b/registry/vulkan/appendices/VK_EXT_global_priority.txt
deleted file mode 100644
index 1a0feba..0000000
--- a/registry/vulkan/appendices/VK_EXT_global_priority.txt
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_global_priority.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-     2017-10-06
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Andres Rodriguez, Valve
-  - Pierre-Loup Griffais, Valve
-  - Dan Ginsburg, Valve
-  - Mitch Singer, AMD
-
-=== Description
-
-In Vulkan, users can specify device-scope queue priorities.
-In some cases it may be useful to extend this concept to a system-wide
-scope.
-This extension provides a mechanism for callers to set their system-wide
-priority.
-The default queue priority is ename:VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT.
-
-The driver implementation will attempt to skew hardware resource allocation
-in favour of the higher-priority task.
-Therefore, higher-priority work may retain similar latency and throughput
-characteristics even if the system is congested with lower priority work.
-
-The global priority level of a queue shall take precedence over the
-per-process queue priority
-(sname:VkDeviceQueueCreateInfo::pname:pQueuePriorities).
-
-Abuse of this feature may result in starving the rest of the system from
-hardware resources.
-Therefore, the driver implementation may deny requests to acquire a priority
-above the default priority (ename:VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT) if
-the caller does not have sufficient privileges.
-In this scenario ename:VK_ERROR_NOT_PERMITTED_EXT is returned.
-
-The driver implementation may fail the queue allocation request if resources
-required to complete the operation have been exhausted (either by the same
-process or a different process).
-In this scenario ename:VK_ERROR_INITIALIZATION_FAILED is returned.
-
-include::{generated}/interfaces/VK_EXT_global_priority.txt[]
-
-=== Version History
-
- * Revision 2, 2017-11-03 (Andres Rodriguez)
-   - Fixed VkQueueGlobalPriorityEXT missing _EXT suffix
-
- * Revision 1, 2017-10-06 (Andres Rodriguez)
-   - First version.
diff --git a/registry/vulkan/appendices/VK_EXT_global_priority_query.txt b/registry/vulkan/appendices/VK_EXT_global_priority_query.txt
deleted file mode 100644
index 8c0fc2e..0000000
--- a/registry/vulkan/appendices/VK_EXT_global_priority_query.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_global_priority_query.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-03-29
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Yiwei Zhang, Google
-
-=== Description
-
-This device extension allows applications to query the global queue
-priorities supported by a queue family.
-It allows implementations to report which global priority levels are treated
-differently by the implementation, instead of silently mapping multiple
-requested global priority levels to the same internal priority, or using
-device creation failure to signal that a requested priority is not
-supported.
-It is intended primarily for use by system integration along with certain
-platform-specific priority enforcement rules.
-
-include::{generated}/interfaces/VK_EXT_global_priority_query.txt[]
-
-=== Issues
-
-1) Can we additionally query whether a caller is permitted to acquire a
-specific global queue priority in this extension?
-
-*RESOLVED*: No.
-Whether a caller has enough privilege goes with the OS, and the Vulkan
-driver cannot really guarantee that the privilege will not change in between
-this query and the actual queue creation call.
-
-2) If more than 1 queue using global priority is requested, is there a good
-way to know which queue is failing the device creation?
-
-*RESOLVED*: No.
-There is not a good way at this moment, and it is also not quite actionable
-for the applications to know that because the information may not be
-accurate.
-Queue creation can fail because of runtime constraints like insufficient
-privilege or lack of resource, and the failure is not necessarily tied to
-that particular queue configuration requested.
-
-=== Version History
-
- * Revision 1, 2021-03-29 (Yiwei Zhang)
diff --git a/registry/vulkan/appendices/VK_EXT_hdr_metadata.txt b/registry/vulkan/appendices/VK_EXT_hdr_metadata.txt
deleted file mode 100644
index 60865bf..0000000
--- a/registry/vulkan/appendices/VK_EXT_hdr_metadata.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2016-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_hdr_metadata.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-12-19
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Courtney Goeltzenleuchter, Google
-
-=== Description
-
-This extension defines two new structures and a function to assign SMPTE
-(the Society of Motion Picture and Television Engineers) 2086 metadata and
-CTA (Consumer Technology Association) 861.3 metadata to a swapchain.
-The metadata includes the color primaries, white point, and luminance range
-of the reference monitor, which all together define the color volume that
-contains all the possible colors the reference monitor can produce.
-The reference monitor is the display where creative work is done and
-creative intent is established.
-To preserve such creative intent as much as possible and achieve consistent
-color reproduction on different viewing displays, it is useful for the
-display pipeline to know the color volume of the original reference monitor
-where content was created or tuned.
-This avoids performing unnecessary mapping of colors that are not
-displayable on the original reference monitor.
-The metadata also includes the pname:maxContentLightLevel and
-pname:maxFrameAverageLightLevel as defined by CTA 861.3.
-
-While the general purpose of the metadata is to assist in the transformation
-between different color volumes of different displays and help achieve
-better color reproduction, it is not in the scope of this extension to
-define how exactly the metadata should be used in such a process.
-It is up to the implementation to determine how to make use of the metadata.
-
-include::{generated}/interfaces/VK_EXT_hdr_metadata.txt[]
-
-=== Issues
-
-1) Do we need a query function?
-
-*PROPOSED*: No, Vulkan does not provide queries for state that the
-application can track on its own.
-
-2) Should we specify default if not specified by the application?
-
-*PROPOSED*: No, that leaves the default up to the display.
-
-=== Version History
-
-  * Revision 1, 2016-12-27 (Courtney Goeltzenleuchter)
-    - Initial version
-  * Revision 2, 2018-12-19 (Courtney Goeltzenleuchter)
-    - Correct implicit validity for VkHdrMetadataEXT structure
diff --git a/registry/vulkan/appendices/VK_EXT_headless_surface.txt b/registry/vulkan/appendices/VK_EXT_headless_surface.txt
deleted file mode 100644
index 05d57d8..0000000
--- a/registry/vulkan/appendices/VK_EXT_headless_surface.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_headless_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-03-21
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Ray Smith, Arm
-
-=== Description
-
-The `VK_EXT_headless_surface` extension is an instance extension.
-It provides a mechanism to create slink:VkSurfaceKHR objects independently
-of any window system or display device.
-The presentation operation for a swapchain created from a headless surface
-is by default a no-op, resulting in no externally-visible result.
-
-Because there is no real presentation target, future extensions can layer on
-top of the headless surface to introduce arbitrary or customisable sets of
-restrictions or features.
-These could include features like saving to a file or restrictions to
-emulate a particular presentation target.
-
-This functionality is expected to be useful for application and driver
-development because it allows any platform to expose an arbitrary or
-customisable set of restrictions and features of a presentation engine.
-This makes it a useful portable test target for applications targeting a
-wide range of presentation engines where the actual target presentation
-engines might be scarce, unavailable or otherwise undesirable or
-inconvenient to use for general Vulkan application development.
-
-include::{generated}/interfaces/VK_EXT_headless_surface.txt[]
-
-=== Version History
-
- * Revision 1, 2019-03-21 (Ray Smith)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_host_query_reset.txt b/registry/vulkan/appendices/VK_EXT_host_query_reset.txt
deleted file mode 100644
index 5a99a36..0000000
--- a/registry/vulkan/appendices/VK_EXT_host_query_reset.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_host_query_reset.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-03-06
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*Contributors*::
-  - Bas Nieuwenhuizen, Google
-  - Jason Ekstrand, Intel
-  - Jeff Bolz, NVIDIA
-  - Piers Daniell, NVIDIA
-
-=== Description
-
-This extension adds a new function to reset queries from the host.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-EXT suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_EXT_host_query_reset.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-03-12 (Bas Nieuwenhuizen)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_image_drm_format_modifier.txt b/registry/vulkan/appendices/VK_EXT_image_drm_format_modifier.txt
deleted file mode 100644
index b33195e..0000000
--- a/registry/vulkan/appendices/VK_EXT_image_drm_format_modifier.txt
+++ /dev/null
@@ -1,411 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_image_drm_format_modifier.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-09-30
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Antoine Labour, Google
-  - Bas Nieuwenhuizen, Google
-  - Chad Versace, Google
-  - James Jones, NVIDIA
-  - Jason Ekstrand, Intel
-  - Jőrg Wagner, ARM
-  - Kristian Høgsberg Kristensen, Google
-  - Ray Smith, ARM
-
-=== Description
-
-This extension provides the ability to use _DRM format modifiers_ with
-images, enabling Vulkan to better integrate with the Linux ecosystem of
-graphics, video, and display APIs.
-
-Its functionality closely overlaps with
-`EGL_EXT_image_dma_buf_import_modifiers`^<<VK_EXT_image_drm_format_modifier-fn2,2>>^
-and
-`EGL_MESA_image_dma_buf_export`^<<VK_EXT_image_drm_format_modifier-fn3,3>>^.
-Unlike the EGL extensions, this extension does not require the use of a
-specific handle type (such as a dma_buf) for external memory and provides
-more explicit control of image creation.
-
-=== Introduction to DRM Format Modifiers
-
-A _DRM format modifier_ is a 64-bit, vendor-prefixed, semi-opaque unsigned
-integer.
-Most _modifiers_ represent a concrete, vendor-specific tiling format for
-images.
-Some exceptions are etext:DRM_FORMAT_MOD_LINEAR (which is not
-vendor-specific); etext:DRM_FORMAT_MOD_NONE (which is an alias of
-etext:DRM_FORMAT_MOD_LINEAR due to historical accident); and
-etext:DRM_FORMAT_MOD_INVALID (which does not represent a tiling format).
-The _modifier's_ vendor prefix consists of the 8 most significant bits.
-The canonical list of _modifiers_ and vendor prefixes is found in
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/drm/drm_fourcc.h[`drm_fourcc.h`]
-in the Linux kernel source.
-The other dominant source of _modifiers_ are vendor kernel trees.
-
-One goal of _modifiers_ in the Linux ecosystem is to enumerate for each
-vendor a reasonably sized set of tiling formats that are appropriate for
-images shared across processes, APIs, and/or devices, where each
-participating component may possibly be from different vendors.
-A non-goal is to enumerate all tiling formats supported by all vendors.
-Some tiling formats used internally by vendors are inappropriate for
-sharing; no _modifiers_ should be assigned to such tiling formats.
-
-Modifier values typically do not _describe_ memory layouts.
-More precisely, a _modifier_'s lower 56 bits usually have no structure.
-Instead, modifiers _name_ memory layouts; they name a small set of
-vendor-preferred layouts for image sharing.
-As a consequence, in each vendor namespace the modifier values are often
-sequentially allocated starting at 1.
-
-Each _modifier_ is usually supported by a single vendor and its name matches
-the pattern `{VENDOR}_FORMAT_MOD_*` or `DRM_FORMAT_MOD_{VENDOR}_*`.
-Examples are etext:I915_FORMAT_MOD_X_TILED and
-etext:DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED.
-An exception is etext:DRM_FORMAT_MOD_LINEAR, which is supported by most
-vendors.
-
-Many APIs in Linux use _modifiers_ to negotiate and specify the memory
-layout of shared images.
-For example, a Wayland compositor and Wayland client may, by relaying
-_modifiers_ over the Wayland protocol `zwp_linux_dmabuf_v1`, negotiate a
-vendor-specific tiling format for a shared code:wl_buffer.
-The client may allocate the underlying memory for the code:wl_buffer with
-GBM, providing the chosen _modifier_ to code:gbm_bo_create_with_modifiers.
-The client may then import the code:wl_buffer into Vulkan for producing
-image content, providing the resource's dma_buf to
-slink:VkImportMemoryFdInfoKHR and its _modifier_ to
-slink:VkImageDrmFormatModifierExplicitCreateInfoEXT.
-The compositor may then import the code:wl_buffer into OpenGL for sampling,
-providing the resource's dma_buf and _modifier_ to code:eglCreateImage.
-The compositor may also bypass OpenGL and submit the code:wl_buffer directly
-to the kernel's display API, providing the dma_buf and _modifier_ through
-code:drm_mode_fb_cmd2.
-
-=== Format Translation
-
-_Modifier_-capable APIs often pair _modifiers_ with DRM formats, which are
-defined in
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/drm/drm_fourcc.h[`drm_fourcc.h`].
-However, `VK_EXT_image_drm_format_modifier` uses elink:VkFormat instead of
-DRM formats.
-The application must convert between elink:VkFormat and DRM format when it
-sends or receives a DRM format to or from an external API.
-
-The mapping from elink:VkFormat to DRM format is lossy.
-Therefore, when receiving a DRM format from an external API, often the
-application must use information from the external API to accurately map the
-DRM format to a elink:VkFormat.
-For example, DRM formats do not distinguish between RGB and sRGB (as of
-2018-03-28); external information is required to identify the image's
-colorspace.
-
-The mapping between elink:VkFormat and DRM format is also incomplete.
-For some DRM formats there exist no corresponding Vulkan format, and for
-some Vulkan formats there exist no corresponding DRM format.
-
-=== Usage Patterns
-
-Three primary usage patterns are intended for this extension:
-
-  * *Negotiation.* The application negotiates with _modifier_-aware,
-    external components to determine sets of image creation parameters
-    supported among all components.
-+
---
-In the Linux ecosystem, the negotiation usually assumes the image is a 2D,
-single-sampled, non-mipmapped, non-array image; this extension permits that
-assumption but does not require it.
-The result of the negotiation usually resembles a set of tuples such as
-_(drmFormat, drmFormatModifier)_, where each participating component
-supports all tuples in the set.
-
-Many details of this negotiation—such as the protocol used during
-negotiation, the set of image creation parameters expressable in the
-protocol, and how the protocol chooses which process and which API will
-create the image—are outside the scope of this specification.
-
-In this extension, flink:vkGetPhysicalDeviceFormatProperties2 with
-slink:VkDrmFormatModifierPropertiesListEXT serves a primary role during the
-negotiation, and flink:vkGetPhysicalDeviceImageFormatProperties2 with
-slink:VkPhysicalDeviceImageDrmFormatModifierInfoEXT serves a secondary role.
---
-
-  * *Import.* The application imports an image with a _modifier_.
-+
---
-In this pattern, the application receives from an external source the
-image's memory and its creation parameters, which are often the result of
-the negotiation described above.
-Some image creation parameters are implicitly defined by the external
-source; for example, ename:VK_IMAGE_TYPE_2D is often assumed.
-Some image creation parameters are usually explicit, such as the image's
-pname:format, pname:drmFormatModifier, and pname:extent; and each plane's
-pname:offset and pname:rowPitch.
-
-Before creating the image, the application first verifies that the physical
-device supports the received creation parameters by querying
-flink:vkGetPhysicalDeviceFormatProperties2 with
-slink:VkDrmFormatModifierPropertiesListEXT and
-flink:vkGetPhysicalDeviceImageFormatProperties2 with
-slink:VkPhysicalDeviceImageDrmFormatModifierInfoEXT.
-Then the application creates the image by chaining
-slink:VkImageDrmFormatModifierExplicitCreateInfoEXT and
-slink:VkExternalMemoryImageCreateInfo onto slink:VkImageCreateInfo.
---
-
-  * *Export.* The application creates an image and allocates its memory.
-    Then the application exports to _modifier_-aware consumers the image's
-    memory handles; its creation parameters; its _modifier_; and the
-    <<VkSubresourceLayout,pname:offset>>,
-    <<VkSubresourceLayout,pname:size>>, and
-    <<VkSubresourceLayout,pname:rowPitch>> of each _memory plane_.
-+
---
-In this pattern, the Vulkan device is the authority for the image; it is the
-allocator of the image's memory and the decider of the image's creation
-parameters.
-When choosing the image's creation parameters, the application usually
-chooses a tuple _(format, drmFormatModifier)_ from the result of the
-negotiation described above.
-The negotiation's result often contains multiple tuples that share the same
-format but differ in their _modifier_.
-In this case, the application should defer the choice of the image's
-_modifier_ to the Vulkan implementation by providing all such _modifiers_ to
-slink:VkImageDrmFormatModifierListCreateInfoEXT::pname:pDrmFormatModifiers;
-and the implementation should choose from pname:pDrmFormatModifiers the
-optimal _modifier_ in consideration with the other image parameters.
-
-The application creates the image by chaining
-slink:VkImageDrmFormatModifierListCreateInfoEXT and
-slink:VkExternalMemoryImageCreateInfo onto slink:VkImageCreateInfo.
-The protocol and APIs by which the application will share the image with
-external consumers will likely determine the value of
-slink:VkExternalMemoryImageCreateInfo::pname:handleTypes.
-The implementation chooses for the image an optimal _modifier_ from
-slink:VkImageDrmFormatModifierListCreateInfoEXT::pname:pDrmFormatModifiers.
-The application then queries the implementation-chosen _modifier_ with
-flink:vkGetImageDrmFormatModifierPropertiesEXT, and queries the memory
-layout of each plane with flink:vkGetImageSubresourceLayout.
-
-The application then allocates the image's memory with
-slink:VkMemoryAllocateInfo, adding chained extending structures for external
-memory; binds it to the image; and exports the memory, for example, with
-flink:vkGetMemoryFdKHR.
-
-Finally, the application sends the image's creation parameters, its
-_modifier_, its per-plane memory layout, and the exported memory handle to
-the external consumers.
-The details of how the application transmits this information to external
-consumers is outside the scope of this specification.
---
-
-=== Prior Art
-
-Extension
-`EGL_EXT_image_dma_buf_import`^<<VK_EXT_image_drm_format_modifier-fn1,1>>^
-introduced the ability to create an code:EGLImage by importing for each
-plane a dma_buf, offset, and row pitch.
-
-Later, extension
-`EGL_EXT_image_dma_buf_import_modifiers`^<<VK_EXT_image_drm_format_modifier-fn2,2>>^
-introduced the ability to query which combination of formats and _modifiers_
-the implementation supports and to specify _modifiers_ during creation of
-the code:EGLImage.
-
-Extension
-`EGL_MESA_image_dma_buf_export`^<<VK_EXT_image_drm_format_modifier-fn3,3>>^
-is the inverse of `EGL_EXT_image_dma_buf_import_modifiers`.
-
-The Linux kernel modesetting API (KMS), when configuring the display's
-framebuffer with `struct
-drm_mode_fb_cmd2`^<<VK_EXT_image_drm_format_modifier-fn4,4>>^, allows one to
-specify the frambuffer's _modifier_ as well as a per-plane memory handle,
-offset, and row pitch.
-
-GBM, a graphics buffer manager for Linux, allows creation of a `gbm_bo`
-(that is, a graphics _buffer object_) by importing data similar to that in
-`EGL_EXT_image_dma_buf_import_modifiers`^<<VK_EXT_image_drm_format_modifier-fn1,1>>^;
-and symmetrically allows exporting the same data from the `gbm_bo`.
-See the references to _modifier_ and _plane_ in
-`gbm.h`^<<VK_EXT_image_drm_format_modifier-fn5,5>>^.
-
-include::{generated}/interfaces/VK_EXT_image_drm_format_modifier.txt[]
-
-=== Issues
-
-1) Should this extension define a single DRM format modifier per
-sname:VkImage? Or define one per plane?
-+
---
-*RESOLVED*: There exists a single DRM format modifier per sname:VkImage.
-
-*DISCUSSION*: Prior art, such as
-`EGL_EXT_image_dma_buf_import_modifiers`^<<VK_EXT_image_drm_format_modifier-fn2,2>>^,
-`struct drm_mode_fb_cmd2`^<<VK_EXT_image_drm_format_modifier-fn4,4>>^, and
-`struct
-gbm_import_fd_modifier_data`^<<VK_EXT_image_drm_format_modifier-fn5,5>>^,
-allows defining one _modifier_ per plane.
-However, developers of the GBM and kernel APIs concede it was a mistake.
-Beginning in Linux 4.10, the kernel requires that the application provide
-the same DRM format _modifier_ for each plane.
-(See Linux commit
-https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bae781b259269590109e8a4a8227331362b88212[bae781b259269590109e8a4a8227331362b88212]).
-And GBM provides an entry point, code:gbm_bo_get_modifier, for querying the
-_modifier_ of the image but does not provide one to query the modifier of
-individual planes.
---
-
-2) When creating an image with
-slink:VkImageDrmFormatModifierExplicitCreateInfoEXT, which is typically used
-when _importing_ an image, should the application explicitly provide the
-size of each plane?
-+
---
-*RESOLVED*: No.
-The application must: not provide the size.
-To enforce this, the API requires that
-slink:VkImageDrmFormatModifierExplicitCreateInfoEXT::pname:pPlaneLayouts->size
-must: be 0.
-
-*DISCUSSION*: Prior art, such as
-`EGL_EXT_image_dma_buf_import_modifiers`^<<VK_EXT_image_drm_format_modifier-fn2,2>>^,
-`struct drm_mode_fb_cmd2`^<<VK_EXT_image_drm_format_modifier-fn4,4>>^, and
-`struct
-gbm_import_fd_modifier_data`^<<VK_EXT_image_drm_format_modifier-fn5,5>>^,
-omits from the API the size of each plane.
-Instead, the APIs infer each plane's size from the import parameters, which
-include the image's pixel format and a dma_buf, offset, and row pitch for
-each plane.
-
-However, Vulkan differs from EGL and GBM with regards to image creation in
-the following ways:
-
-.Differences in Image Creation
-
-  - *Undedicated allocation by default.* When importing or exporting a set
-    of dma_bufs as an code:EGLImage or code:gbm_bo, common practice mandates
-    that each dma_buf's memory be dedicated (in the sense of
-    `VK_KHR_dedicated_allocation`) to the image (though not necessarily
-    dedicated to a single plane).
-    In particular, neither the GBM documentation nor the EGL extension
-    specifications explicitly state this requirement, but in light of common
-    practice this is likely due to under-specification rather than
-    intentional omission.
-    In contrast, `VK_EXT_image_drm_format_modifier` permits, but does not
-    require, the implementation to require dedicated allocations for images
-    created with ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT.
-
-  - *Separation of image creation and memory allocation.* When importing a
-    set of dma_bufs as an code:EGLImage or code:gbm_bo, EGL and GBM create
-    the image resource and bind it to memory (the dma_bufs) simultaneously.
-    This allows EGL and GBM to query each dma_buf's size during image
-    creation.
-    In Vulkan, image creation and memory allocation are independent unless a
-    dedicated allocation is used (as in `VK_KHR_dedicated_allocation`).
-    Therefore, without requiring dedicated allocation, Vulkan cannot query
-    the size of each dma_buf (or other external handle) when calculating the
-    image's memory layout.
-    Even if dedication allocation were required, Vulkan cannot calculate the
-    image's memory layout until after the image is bound to its dma_ufs.
-
-The above differences complicate the potential inference of plane size in
-Vulkan.
-Consider the following problematic cases:
-
-.Problematic Plane Size Calculations
-
-  - *Padding.* Some plane of the image may require implementation-dependent
-    padding.
-
-  - *Metadata.* For some _modifiers_, the image may have a metadata plane
-    which requires a non-trivial calculation to determine its size.
-
-  - *Mipmapped, array, and 3D images.* The implementation may support
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT for images whose
-    pname:mipLevels, pname:arrayLayers, or pname:depth is greater than 1.
-    For such images with certain _modifiers_, the calculation of each
-    plane's size may be non-trivial.
-
-However, an application-provided plane size solves none of the above
-problems.
-
-For simplicity, consider an external image with a single memory plane.
-The implementation is obviously capable calculating the image's size when
-its tiling is ename:VK_IMAGE_TILING_OPTIMAL.
-Likewise, any reasonable implementation is capable of calculating the
-image's size when its tiling uses a supported _modifier_.
-
-Suppose that the external image's size is smaller than the
-implementation-calculated size.
-If the application provided the external image's size to
-flink:vkCreateImage, the implementation would observe the mismatched size
-and recognize its inability to comprehend the external image's layout
-(unless the implementation used the application-provided size to select a
-refinement of the tiling layout indicated by the _modifier_, which is
-strongly discouraged).
-The implementation would observe the conflict, and reject image creation
-with ename:VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT.
-On the other hand, if the application did not provide the external image's
-size to flink:vkCreateImage, then the application would observe after
-calling flink:vkGetImageMemoryRequirements that the external image's size is
-less than the size required by the implementation.
-The application would observe the conflict and refuse to bind the
-sname:VkImage to the external memory.
-In both cases, the result is explicit failure.
-
-Suppose that the external image's size is larger than the
-implementation-calculated size.
-If the application provided the external image's size to
-flink:vkCreateImage, for reasons similar to above the implementation would
-observe the mismatched size and recognize its inability to comprehend the
-image data residing in the extra size.
-The implementation, however, must assume that image data resides in the
-entire size provided by the application.
-The implementation would observe the conflict and reject image creation with
-ename:VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT.
-On the other hand, if the application did not provide the external image's
-size to flink:vkCreateImage, then the application would observe after
-calling flink:vkGetImageMemoryRequirements that the external image's size is
-larger than the implementation-usable size.
-The application would observe the conflict and refuse to bind the
-sname:VkImage to the external memory.
-In both cases, the result is explicit failure.
-
-Therefore, an application-provided size provides no benefit, and this
-extension should not require it.
-This decision renders slink:VkSubresourceLayout::pname:size an unused field
-during image creation, and thus introduces a risk that implementations may
-require applications to submit sideband creation parameters in the unused
-field.
-To prevent implementations from relying on sideband data, this extension
-_requires_ the application to set pname:size to 0.
---
-
-==== References
-
-  . [[VK_EXT_image_drm_format_modifier-fn1]]
-    https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_image_dma_buf_import.txt[`EGL_EXT_image_dma_buf_import`]
-  . [[VK_EXT_image_drm_format_modifier-fn2]]
-    https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_image_dma_buf_import_modifiers.txt[`EGL_EXT_image_dma_buf_import_modifiers`]
-  . [[VK_EXT_image_drm_format_modifier-fn3]]
-    https://www.khronos.org/registry/EGL/extensions/MESA/EGL_MESA_image_dma_buf_export.txt[`EGL_MESA_image_dma_buf_export`]
-  . [[VK_EXT_image_drm_format_modifier-fn4]]
-    https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/uapi/drm/drm_mode.h?id=refs/tags/v4.10#n392[`struct
-    drm_mode_fb_cmd2`]
-  . [[VK_EXT_image_drm_format_modifier-fn5]]
-    https://cgit.freedesktop.org/mesa/mesa/tree/src/gbm/main/gbm.h?id=refs/tags/mesa-18.0.0-rc1[`gbm.h`]
-
-==== Version History
-
-  * Revision 1, 2018-08-29 (Chad Versace)
-    - First stable revision
-  * Revision 2, 2021-09-30 (Jon Leech)
-    - Add interaction with `apiext:VK_KHR_format_feature_flags2` to `vk.xml`
diff --git a/registry/vulkan/appendices/VK_EXT_image_robustness.txt b/registry/vulkan/appendices/VK_EXT_image_robustness.txt
deleted file mode 100644
index fbe5b25..0000000
--- a/registry/vulkan/appendices/VK_EXT_image_robustness.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_image_robustness.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-04-27
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-    - Graeme Leese, Broadcom
-    - Jan-Harald Fredriksen, ARM
-    - Jeff Bolz, NVIDIA
-    - Spencer Fricke, Samsung
-    - Courtney Goeltzenleuchter, Google
-    - Slawomir Cygan, Intel
-
-=== Description
-
-This extension adds stricter requirements for how out of bounds reads from
-images are handled.
-Rather than returning undefined values, most out of bounds reads return R,
-G, and B values of zero and alpha values of either zero or one.
-Components not present in the image format may be set to zero or to values
-based on the format as described in <<textures-conversion-to-rgba,
-Conversion to RGBA>>.
-
-include::{generated}/interfaces/VK_EXT_image_robustness.txt[]
-
-=== Issues
-
-1. How does this extension differ from VK_EXT_robustness2?
-
-The guarantees provided by this extension are a subset of those provided by
-the robustImageAccess2 feature of VK_EXT_robustness2.
-Where this extension allows return values of (0, 0, 0, 0) or (0, 0, 0, 1),
-robustImageAccess2 requires that a particular value dependent on the image
-format be returned.
-This extension provides no guarantees about the values returned for an
-access to an invalid Lod.
-
-=== Examples
-
-None.
-
-=== Version History
-
-    * Revision 1, 2020-04-27 (Graeme Leese)
-        - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_index_type_uint8.txt b/registry/vulkan/appendices/VK_EXT_index_type_uint8.txt
deleted file mode 100644
index 2683fea..0000000
--- a/registry/vulkan/appendices/VK_EXT_index_type_uint8.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_index_type_uint8.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-05-02
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension allows code:uint8_t indices to be used with
-flink:vkCmdBindIndexBuffer.
-
-include::{generated}/interfaces/VK_EXT_index_type_uint8.txt[]
-
-=== Version History
-
- * Revision 1, 2019-05-02 (Piers Daniell)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_inline_uniform_block.txt b/registry/vulkan/appendices/VK_EXT_inline_uniform_block.txt
deleted file mode 100644
index f13c561..0000000
--- a/registry/vulkan/appendices/VK_EXT_inline_uniform_block.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_inline_uniform_block.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-08-01
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Daniel Rakos, AMD
-  - Jeff Bolz, NVIDIA
-  - Slawomir Grajewski, Intel
-  - Neil Henning, Codeplay
-
-=== Description
-
-This extension introduces the ability to back uniform blocks directly with
-descriptor sets by storing inline uniform data within descriptor pool
-storage.
-Compared to push constants this new construct allows uniform data to be
-reused across multiple disjoint sets of drawing or dispatching commands and
-may: enable uniform data to be accessed with fewer indirections compared to
-uniforms backed by buffer memory.
-
-include::{generated}/interfaces/VK_EXT_inline_uniform_block.txt[]
-
-=== Issues
-
-1) Do we need a new storage class for inline uniform blocks vs uniform
-blocks?
-
-*RESOLVED*: No.
-The code:Uniform storage class is used to allow the same syntax used for
-both uniform buffers and inline uniform blocks.
-
-2) Is the descriptor array index and array size expressed in terms of bytes
-or dwords for inline uniform block descriptors?
-
-*RESOLVED*: In bytes, but both must: be a multiple of 4, similar to how push
-constant ranges are specified.
-The pname:descriptorCount of sname:VkDescriptorSetLayoutBinding thus
-provides the total number of bytes a particular binding with an inline
-uniform block descriptor type can hold, while the pname:srcArrayElement,
-pname:dstArrayElement, and pname:descriptorCount members of
-sname:VkWriteDescriptorSet, sname:VkCopyDescriptorSet, and
-sname:VkDescriptorUpdateTemplateEntry (where applicable) specify the byte
-offset and number of bytes to write/copy to the binding's backing store.
-Additionally, the pname:stride member of
-sname:VkDescriptorUpdateTemplateEntry is ignored for inline uniform blocks
-and a default value of one is used, meaning that the data to update inline
-uniform block bindings with must be contiguous in memory.
-
-3) What layout rules apply for uniform blocks corresponding to inline
-constants?
-
-*RESOLVED*: They use the same layout rules as uniform buffers.
-
-4) Do we need to add non-uniform indexing features/properties as introduced
-by `VK_EXT_descriptor_indexing` for inline uniform blocks?
-
-*RESOLVED*: No, because inline uniform blocks are not allowed to be
-"`arrayed`".
-A single binding with an inline uniform block descriptor type corresponds to
-a single uniform block instance and the array indices inside that binding
-refer to individual offsets within the uniform block (see issue #2).
-However, this extension does introduce new features/properties about the
-level of support for update-after-bind inline uniform blocks.
-
-5) Is the pname:descriptorBindingVariableDescriptorCount feature introduced
-by `VK_EXT_descriptor_indexing` supported for inline uniform blocks?
-
-*RESOLVED*: Yes, as long as other inline uniform block specific limits are
-respected.
-
-6) Do the robustness guarantees of pname:robustBufferAccess apply to inline
-uniform block accesses?
-
-*RESOLVED*: No, similarly to push constants, as they are not backed by
-buffer memory like uniform buffers.
-
-=== Version History
-
- * Revision 1, 2018-08-01 (Daniel Rakos)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_line_rasterization.txt b/registry/vulkan/appendices/VK_EXT_line_rasterization.txt
deleted file mode 100644
index 2a18277..0000000
--- a/registry/vulkan/appendices/VK_EXT_line_rasterization.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_line_rasterization.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-05-09
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Allen Jensen, NVIDIA
-  - Jason Ekstrand, Intel
-
-=== Description
-
-This extension adds some line rasterization features that are commonly used
-in CAD applications and supported in other APIs like OpenGL.
-Bresenham-style line rasterization is supported, smooth rectangular lines
-(coverage to alpha) are supported, and stippled lines are supported for all
-three line rasterization modes.
-
-include::{generated}/interfaces/VK_EXT_line_rasterization.txt[]
-
-=== Issues
-
- (1) Do we need to support Bresenham-style and smooth lines with more than
- one rasterization sample? i.e. the equivalent of glDisable(GL_MULTISAMPLE)
- in OpenGL when the framebuffer has more than one sample?
-
-  RESOLVED: Yes.
-  For simplicity, Bresenham line rasterization carries forward a few
-  restrictions from OpenGL, such as not supporting per-sample shading, alpha
-  to coverage, or alpha to one.
-
-=== Version History
-
-  * Revision 1, 2019-05-09 (Jeff Bolz)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_load_store_op_none.txt b/registry/vulkan/appendices/VK_EXT_load_store_op_none.txt
deleted file mode 100644
index 1408940..0000000
--- a/registry/vulkan/appendices/VK_EXT_load_store_op_none.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_load_store_op_none.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-06-06
-*Contributors*::
-  - Shahbaz Youssefi, Google
-  - Bill Licea-Kane, Qualcomm Technologies, Inc.
-  - Tobias Hector, AMD
-
-=== Description
-
-This extension incorporates ename:VK_ATTACHMENT_STORE_OP_NONE_EXT from
-`apiext:VK_QCOM_render_pass_store_ops`, enabling applications to avoid
-unnecessary synchronization when an attachment is not written during a
-render pass.
-
-Additionally, ename:VK_ATTACHMENT_LOAD_OP_NONE_EXT is introduced to avoid
-unnecessary synchronization when an attachment is not used during a render
-pass at all.
-In combination with ename:VK_ATTACHMENT_STORE_OP_NONE_EXT, this is useful as
-an alternative to preserve attachments in applications that cannot decide if
-an attachment will be used in a render pass until after the necessary
-pipelines have been created.
-
-include::{generated}/interfaces/VK_EXT_load_store_op_none.txt[]
-
-=== Version History
-
-  * Revision 1, 2021-06-06 (Shahbaz Youssefi)
-    - Initial revision, based on VK_QCOM_render_pass_store_ops.
-    - Added VK_ATTACHMENT_LOAD_OP_NONE_EXT.
diff --git a/registry/vulkan/appendices/VK_EXT_memory_budget.txt b/registry/vulkan/appendices/VK_EXT_memory_budget.txt
deleted file mode 100644
index ceea77b..0000000
--- a/registry/vulkan/appendices/VK_EXT_memory_budget.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_memory_budget.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-10-08
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Jeff Juliano, NVIDIA
-
-=== Description
-
-While running a Vulkan application, other processes on the machine might
-also be attempting to use the same device memory, which can pose problems.
-This extension adds support for querying the amount of memory used and the
-total memory budget for a memory heap.
-The values returned by this query are implementation-dependent and can
-depend on a variety of factors including operating system and system load.
-
-The slink:VkPhysicalDeviceMemoryBudgetPropertiesEXT::pname:heapBudget values
-can be used as a guideline for how much total memory from each heap the
-**current process** can use at any given time, before allocations may start
-failing or causing performance degradation.
-The values may change based on other activity in the system that is outside
-the scope and control of the Vulkan implementation.
-
-The slink:VkPhysicalDeviceMemoryBudgetPropertiesEXT::pname:heapUsage will
-display the **current process** estimated heap usage.
-
-With this information, the idea is for an application at some interval (once
-per frame, per few seconds, etc) to query pname:heapBudget and
-pname:heapUsage.
-From here the application can notice if it is over budget and decide how it
-wants to handle the memory situation (free it, move to host memory, changing
-mipmap levels, etc).
-This extension is designed to be used in concert with
-`apiext:VK_EXT_memory_priority` to help with this part of memory management.
-
-include::{generated}/interfaces/VK_EXT_memory_budget.txt[]
-
-=== Version History
-
- * Revision 1, 2018-10-08 (Jeff Bolz)
-   - Initial revision
diff --git a/registry/vulkan/appendices/VK_EXT_memory_priority.txt b/registry/vulkan/appendices/VK_EXT_memory_priority.txt
deleted file mode 100644
index b97a621..0000000
--- a/registry/vulkan/appendices/VK_EXT_memory_priority.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_memory_priority.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-10-08
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Jeff Juliano, NVIDIA
-
-=== Description
-
-This extension adds a pname:priority value specified at memory allocation
-time.
-On some systems with both device-local and non-device-local memory heaps,
-the implementation may transparently move memory from one heap to another
-when a heap becomes full (for example, when the total memory used across all
-processes exceeds the size of the heap).
-In such a case, this priority value may be used to determine which
-allocations are more likely to remain in device-local memory.
-
-include::{generated}/interfaces/VK_EXT_memory_priority.txt[]
-
-=== Version History
-
- * Revision 1, 2018-10-08 (Jeff Bolz)
-   - Initial revision
-
diff --git a/registry/vulkan/appendices/VK_EXT_metal_surface.txt b/registry/vulkan/appendices/VK_EXT_metal_surface.txt
deleted file mode 100644
index d96a60b..0000000
--- a/registry/vulkan/appendices/VK_EXT_metal_surface.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_metal_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-10-01
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Dzmitry Malyshau, Mozilla Corp.
-
-=== Description
-
-The `VK_EXT_metal_surface` extension is an instance extension.
-It provides a mechanism to create a slink:VkSurfaceKHR object (defined by
-the `apiext:VK_KHR_surface` extension) from basetype:CAMetalLayer, which is
-the native rendering surface of Apple's Metal framework.
-
-include::{generated}/interfaces/VK_EXT_metal_surface.txt[]
-
-=== Version History
-
- * Revision 1, 2018-10-01 (Dzmitry Malyshau)
-   - Initial version
diff --git a/registry/vulkan/appendices/VK_EXT_multi_draw.txt b/registry/vulkan/appendices/VK_EXT_multi_draw.txt
deleted file mode 100644
index 7c46d84..0000000
--- a/registry/vulkan/appendices/VK_EXT_multi_draw.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_multi_draw.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-05-19
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Mike Blumenkrantz, VALVE
-  - Piers Daniell, NVIDIA
-  - Jason Ekstrand, INTEL
-  - Spencer Fricke, SAMSUNG
-  - Ricardo Garcia, IGALIA
-  - Jon Leech, KHRONOS
-  - Stu Smith, AMD
-
-=== Description
-
-Processing multiple draw commands in sequence incurs measurable overhead
-within drivers due to repeated state checks and updates during dispatch.
-This extension enables passing the entire sequence of draws directly to the
-driver in order to avoid any such overhead, using an array of
-slink:VkMultiDrawInfoEXT or slink:VkMultiDrawIndexedInfoEXT structs with
-fname:vkCmdDrawMultiEXT or fname:vkCmdDrawMultiIndexedEXT, respectively.
-These functions could be used any time multiple draw commands are being
-recorded without any state changes between them in order to maximize
-performance.
-
-include::{generated}/interfaces/VK_EXT_multi_draw.txt[]
-
-=== New or Modified Built-In Variables
-
-  * (modified)code:DrawIndex
-
-=== Version History
-
-  * Revision 1, 2021-01-20 (Mike Blumenkrantz)
-    - Initial version
diff --git a/registry/vulkan/appendices/VK_EXT_pageable_device_local_memory.txt b/registry/vulkan/appendices/VK_EXT_pageable_device_local_memory.txt
deleted file mode 100644
index 7e062d5..0000000
--- a/registry/vulkan/appendices/VK_EXT_pageable_device_local_memory.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_pageable_device_local_memory.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-08-24
-*Contributors*::
-  - Hans-Kristian Arntzen, Valve
-  - Axel Gneiting, id Software
-  - Billy Khan, id Software
-  - Daniel Koch, NVIDIA
-  - Chris Lentini, NVIDIA
-  - Joshua Schnarr, NVIDIA
-  - Stu Smith, AMD
-
-=== Description
-
-Vulkan is frequently implemented on multi-user and multi-process operating
-systems where the device-local memory can be shared by more than one
-process.
-On such systems the size of the device-local memory available to the
-application may not be the full size of the memory heap at all times.
-In order for these operating systems to support multiple applications the
-device-local memory is virtualized and paging is used to move memory between
-device-local and host-local memory heaps, transparent to the application.
-
-The current Vulkan specification does not expose this behavior well and may
-cause applications to make suboptimal memory choices when allocating memory.
-For example, in a system with multiple applications running, the application
-may think that device-local memory is full and revert to making
-performance-sensitive allocations from host-local memory.
-In reality the memory heap might not have been full, it just appeared to be
-at the time memory consumption was queried, and a device-local allocation
-would have succeeded.
-A well designed operating system that implements pageable device-local
-memory will try to have all memory allocations for the foreground
-application paged into device-local memory, and paged out for other
-applications as needed when not in use.
-
-When this extension is exposed by the Vulkan implementation it indicates to
-the application that the operating system implements pageable device-local
-memory and the application should adjust its memory allocation strategy
-accordingly.
-The extension also exposes a new flink:vkSetDeviceMemoryPriorityEXT function
-to allow the application to dynamically adjust the priority of existing
-memory allocations based on its current needs.
-This will help the operating system page out lower priority memory
-allocations before higher priority allocations when needed.
-It will also help the operating system decide which memory allocations to
-page back into device-local memory first.
-
-To take best advantage of pageable device-local memory the application must
-create the Vulkan device with the
-slink:VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT::pname:pageableDeviceLocalMemory
-feature enabled.
-When enabled the Vulkan implementation will allow device-local memory
-allocations to be paged in and out by the operating system, and may: not
-return VK_ERROR_OUT_OF_DEVICE_MEMORY even if device-local memory appears to
-be full, but will instead page this, or other allocations, out to make room.
-The Vulkan implementation will also ensure that host-local memory
-allocations will never be promoted to device-local memory by the operating
-system, or consume device-local memory.
-
-
-include::{generated}/interfaces/VK_EXT_pageable_device_local_memory.txt[]
-
-=== Version History
-
- * Revision 1, 2021-08-24 (Piers Daniell)
-   - Initial revision
diff --git a/registry/vulkan/appendices/VK_EXT_pci_bus_info.txt b/registry/vulkan/appendices/VK_EXT_pci_bus_info.txt
deleted file mode 100644
index adfca7e..0000000
--- a/registry/vulkan/appendices/VK_EXT_pci_bus_info.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_pci_bus_info.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-12-10
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Matthaeus G. Chajdas, AMD
-  - Daniel Rakos, AMD
-
-=== Description
-
-This extension adds a new query to obtain PCI bus information about a
-physical device.
-
-Not all physical devices have PCI bus information, either due to the device
-not being connected to the system through a PCI interface or due to platform
-specific restrictions and policies.
-Thus this extension is only expected to be supported by physical devices
-which can provide the information.
-
-As a consequence, applications should always check for the presence of the
-extension string for each individual physical device for which they intend
-to issue the new query for and should not have any assumptions about the
-availability of the extension on any given platform.
-
-include::{generated}/interfaces/VK_EXT_pci_bus_info.txt[]
-
-=== Version History
-
-  * Revision 2, 2018-12-10 (Daniel Rakos)
-    - Changed all members of the new structure to have the uint32_t type
-  * Revision 1, 2018-10-11 (Daniel Rakos)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_EXT_physical_device_drm.txt b/registry/vulkan/appendices/VK_EXT_physical_device_drm.txt
deleted file mode 100644
index e97b44d..0000000
--- a/registry/vulkan/appendices/VK_EXT_physical_device_drm.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2020 Simon Ser
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_physical_device_drm.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-06-09
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-    - Simon Ser
-
-=== Description
-
-This extension provides new facilities to query DRM properties for physical
-devices, enabling users to match Vulkan physical devices with DRM nodes on
-Linux.
-
-Its functionality closely overlaps with
-`EGL_EXT_device_drm`^<<VK_EXT_physical_device_drm-fn1,1>>^.
-Unlike the EGL extension, this extension does not expose a string containing
-the name of the device file and instead exposes device minor numbers.
-
-DRM defines multiple device node types.
-Each physical device may have one primary node and one render node
-associated.
-Physical devices may have no primary node (e.g. if the device does not have
-a display subsystem), may have no render node (e.g. if it is a software
-rendering engine), or may have neither (e.g. if it is a software rendering
-engine without a display subsystem).
-
-To query DRM properties for a physical device, chain
-slink:VkPhysicalDeviceDrmPropertiesEXT to slink:VkPhysicalDeviceProperties2.
-
-include::{generated}/interfaces/VK_EXT_physical_device_drm.txt[]
-
-=== References
-
-  . [[VK_EXT_physical_device_drm-fn1]]
-    https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_device_drm.txt[`EGL_EXT_device_drm`]
-
-=== Version History
-
-  * Revision 1, 2021-06-09
-    - First stable revision
diff --git a/registry/vulkan/appendices/VK_EXT_pipeline_creation_cache_control.txt b/registry/vulkan/appendices/VK_EXT_pipeline_creation_cache_control.txt
deleted file mode 100644
index 8c3178a..0000000
--- a/registry/vulkan/appendices/VK_EXT_pipeline_creation_cache_control.txt
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_pipeline_creation_cache_control.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-03-23
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Gregory Grebe, AMD
-  - Tobias Hector, AMD
-  - Matthaeus Chajdas, AMD
-  - Mitch Singer, AMD
-  - Spencer Fricke, Samsung Electronics
-  - Stuart Smith, Imagination Technologies
-  - Jeff Bolz, NVIDIA Corporation
-  - Daniel Koch, NVIDIA Corporation
-  - Dan Ginsburg, Valve Corporation
-  - Jeff Leger, QUALCOMM
-  - Michal Pietrasiuk, Intel
-  - Jan-Harald Fredriksen, Arm Limited
-
-=== Description
-
-This extension adds flags to stext:Vk*PipelineCreateInfo and
-slink:VkPipelineCacheCreateInfo structures with the aim of improving the
-predictability of pipeline creation cost.
-The goal is to provide information about potentially expensive hazards
-within the client driver during pipeline creation to the application before
-carrying them out rather than after.
-
-=== Background
-
-Pipeline creation is a costly operation, and the explicit nature of the
-Vulkan design means that cost is not hidden from the developer.
-Applications are also expected to schedule, prioritize, and load balance all
-calls for pipeline creation.
-It is strongly advised that applications create pipelines sufficiently ahead
-of their usage.
-Failure to do so will result in an unresponsive application, intermittent
-stuttering, or other poor user experiences.
-Proper usage of pipeline caches and/or derivative pipelines help mitigate
-this but is not assured to eliminate disruption in all cases.
-In the event that an ahead-of-time creation is not possible, considerations
-should be taken to ensure that the current execution context is suitable for
-the workload of pipeline creation including possible shader compilation.
-
-Applications making API calls to create a pipeline must be prepared for any
-of the following to occur:
-
-  * OS/kernel calls to be made by the ICD
-  * Internal memory allocation not tracked by the pname:pAllocator passed to
-    ftext:vkCreate*Pipelines
-  * Internal thread synchronization or yielding of the current thread's core
-  * Extremely long (multi-millisecond+), blocking, compilation times
-  * Arbitrary call stacks depths and stack memory usage
-
-The job or task based game engines that are being developed to take
-advantage of explicit graphics APIs like Vulkan may behave exceptionally
-poorly if any of the above scenarios occur.
-However, most game engines are already built to "`stream`" in assets
-dynamically as the user plays the game.
-By adding control by way of tlink:VkPipelineCreateFlags, we can require an
-ICD to report back a failure in critical execution paths rather than forcing
-an unexpected wait.
-
-Applications can prevent unexpected compilation by setting
-ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT on
-stext:Vk*PipelineCreateInfo::pname:flags.
-When set, an ICD must not attempt pipeline or shader compilation to create
-the pipeline object.
-The ICD will return the result ename:VK_PIPELINE_COMPILE_REQUIRED_EXT.
-An ICD may still return a valid sname:VkPipeline object by either re-using
-existing pre-compiled objects such as those from a pipeline cache, or
-derivative pipelines.
-
-By default ftext:vkCreate*Pipelines calls must attempt to create all
-pipelines before returning.
-Setting ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT on
-stext:Vk*PipelineCreateInfo::pname:flags can be used as an escape hatch for
-batched pipeline creates.
-
-Hidden locks also add to the unpredictability of the cost of pipeline
-creation.
-The most common case of locks inside the stext:vkCreate*Pipelines is
-internal synchronization of the slink:VkPipelineCache object.
-ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT can be set
-when calling flink:vkCreatePipelineCache to state the cache is
-<<fundamentals-threadingbehavior,externally synchronized>>.
-
-The hope is that armed with this information application and engine
-developers can leverage existing asset streaming systems to recover from
-"just-in-time" pipeline creation stalls.
-
-include::{generated}/interfaces/VK_EXT_pipeline_creation_cache_control.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-11-01 (Gregory Grebe)
-    - Initial revision
-  * Revision 2, 2020-02-24 (Gregory Grebe)
-    - Initial public revision
-  * Revision 3, 2020-03-23 (Tobias Hector)
-    - Changed ename:VK_PIPELINE_COMPILE_REQUIRED_EXT to a success code,
-      adding an alias for the original
-      ename:VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT.
-      Also updated the xml to include these codes as return values.
diff --git a/registry/vulkan/appendices/VK_EXT_pipeline_creation_feedback.txt b/registry/vulkan/appendices/VK_EXT_pipeline_creation_feedback.txt
deleted file mode 100644
index 6d10d30..0000000
--- a/registry/vulkan/appendices/VK_EXT_pipeline_creation_feedback.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_pipeline_creation_feedback.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-03-12
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jean-Francois Roy, Google
-  - Hai Nguyen, Google
-  - Andrew Ellem, Google
-  - Bob Fraser, Google
-  - Sujeevan Rajayogam, Google
-  - Jan-Harald Fredriksen, ARM
-  - Jeff Leger, Qualcomm Technologies, Inc.
-  - Jeff Bolz, NVIDIA
-  - Daniel Koch, NVIDIA
-  - Neil Henning, AMD
-
-=== Description
-
-This extension adds a mechanism to provide feedback to an application about
-pipeline creation, with the specific goal of allowing a feedback loop
-between build systems and in-the-field application executions to ensure
-effective pipeline caches are shipped to customers.
-
-include::{generated}/interfaces/VK_EXT_pipeline_creation_feedback.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-03-12 (Jean-Francois Roy)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_EXT_post_depth_coverage.txt b/registry/vulkan/appendices/VK_EXT_post_depth_coverage.txt
deleted file mode 100644
index dadd69e..0000000
--- a/registry/vulkan/appendices/VK_EXT_post_depth_coverage.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_post_depth_coverage.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-07-17
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_post_depth_coverage.html[`SPV_KHR_post_depth_coverage`]
-  - This extension provides API support for
-    https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_post_depth_coverage.txt[`GL_ARB_post_depth_coverage`]
-    and
-    https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_post_depth_coverage.txt[`GL_EXT_post_depth_coverage`]
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * `SPV_KHR_post_depth_coverage`
-
-which allows the fragment shader to control whether values in the
-code:SampleMask built-in input variable reflect the coverage after early
-<<fragops-depth,depth>> and <<fragops-stencil,stencil>> tests are applied.
-
-This extension adds a new code:PostDepthCoverage execution mode under the
-code:SampleMaskPostDepthCoverage capability.
-When this mode is specified along with code:EarlyFragmentTests, the value of
-an input variable decorated with the
-<<interfaces-builtin-variables-samplemask, code:SampleMask>> built-in
-reflects the coverage after the <<shaders-fragment-earlytest, early fragment
-tests>> are applied.
-Otherwise, it reflects the coverage before the depth and stencil tests.
-
-When using GLSL source-based shading languages, the code:post_depth_coverage
-layout qualifier from GL_ARB_post_depth_coverage or
-GL_EXT_post_depth_coverage maps to the code:PostDepthCoverage execution
-mode.
-
-include::{generated}/interfaces/VK_EXT_post_depth_coverage.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-SampleMaskPostDepthCoverage,SampleMaskPostDepthCoverage>>
-
-=== Version History
-
-  * Revision 1, 2017-07-17 (Daniel Koch)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_primitive_topology_list_restart.txt b/registry/vulkan/appendices/VK_EXT_primitive_topology_list_restart.txt
deleted file mode 100644
index a8b4609..0000000
--- a/registry/vulkan/appendices/VK_EXT_primitive_topology_list_restart.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_primitive_topology_list_restart.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-01-11
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Courtney Goeltzenleuchter, Google
-  - Shahbaz Youssefi, Google
-
-=== Description
-
-This extension allows list primitives to use the primitive restart index
-value.
-This provides a more efficient implementation when layering OpenGL
-functionality on Vulkan by avoiding emulation which incurs data copies.
-
-include::{generated}/interfaces/VK_EXT_primitive_topology_list_restart.txt[]
-
-=== Version History
-
- * Revision 0, 2020-09-14 (Courtney Goeltzenleuchter)
-   - Internal revisions
-
- * Revision 1, 2021-01-11 (Shahbaz Youssefi)
-   - Add the `primitiveTopologyPatchListRestart` feature
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_private_data.txt b/registry/vulkan/appendices/VK_EXT_private_data.txt
deleted file mode 100644
index ead5f38..0000000
--- a/registry/vulkan/appendices/VK_EXT_private_data.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_private_data.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-03-25
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Matthew Rusch, NVIDIA
-  - Nuno Subtil, NVIDIA
-  - Piers Daniell, NVIDIA
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-The 'VK_EXT_private_data' extension is a device extension which enables
-attaching arbitrary payloads to Vulkan objects.
-It introduces the idea of private data slots as a means of storing a 64-bit
-unsigned integer of application defined data.
-Private data slots can be created or destroyed any time an associated device
-is available.
-Private data slots can be reserved at device creation time, and limiting use
-to the amount reserved will allow the extension to exhibit better
-performance characteristics.
-
-include::{generated}/interfaces/VK_EXT_private_data.txt[]
-
-=== Examples
-
-  * In progress
-
-=== Version History
-
- * Revision 1, 2020-01-15 (Matthew Rusch)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_provoking_vertex.txt b/registry/vulkan/appendices/VK_EXT_provoking_vertex.txt
deleted file mode 100644
index 7d259e0..0000000
--- a/registry/vulkan/appendices/VK_EXT_provoking_vertex.txt
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_provoking_vertex.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-02-22
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Alexis Hétu, Google
-  - Bill Licea-Kane, Qualcomm
-  - Daniel Koch, Nvidia
-  - Jamie Madill, Google
-  - Jan-Harald Fredriksen, Arm
-  - Jason Ekstrand, Intel
-  - Jeff Bolz, Nvidia
-  - Jeff Leger, Qualcomm
-  - Jesse Hall, Google
-  - Jörg Wagner, Arm
-  - Matthew Netsch, Qualcomm
-  - Mike Blumenkrantz, Valve
-  - Piers Daniell, Nvidia
-  - Tobias Hector, AMD
-
-=== Description
-
-This extension allows changing the provoking vertex convention between
-Vulkan's default convention (first vertex) and OpenGL's convention (last
-vertex).
-
-This extension is intended for use by API-translation layers that implement
-APIs like OpenGL on top of Vulkan, and need to match the source API's
-provoking vertex convention.
-Applications using Vulkan directly should use Vulkan's default convention.
-
-include::{generated}/interfaces/VK_EXT_provoking_vertex.txt[]
-
-=== Issues
-
-1) At what granularity should this state be set?
-
-*RESOLVED*: At pipeline bind, with an optional per-render pass restriction.
-
-The most natural place to put this state is in the graphics pipeline object.
-Some implementations require it to be known when creating the pipeline, and
-pipeline state is convenient for implementing OpenGL 3.2's
-glProvokingVertex, which can change the state between draw calls.
-However, some implementations can only change it approximately render pass
-granularity.
-To accommodate both, provoking vertex will be pipeline state, but
-implementations can require that only one mode is used within a render pass
-instance; the render pass's mode is chosen implicitly when the first
-pipeline is bound.
-
-2) Does the provoking vertex mode affect the order that vertices are written
-to transform feedback buffers?
-
-*RESOLVED*: Yes, to enable layered implementations of OpenGL and D3D.
-
-All of OpenGL, OpenGL ES, and Direct3D 11 require that vertices are written
-to transform feedback buffers such that flat-shaded attributes have the same
-value when drawing the contents of the transform feedback buffer as they did
-in the original drawing when the transform feedback buffer was written
-(assuming the provoking vertex mode has not changed, in APIs that support
-more than one mode).
-
-
-=== Version History
-
-  * Revision 1, (1c) 2021-02-22 (Jesse Hall)
-    - Added
-      VkPhysicalDeviceProvokingVertexPropertiesEXT::transformFeedbackPreservesTriangleFanProvokingVertex
-      to accommodate implementations that cannot change the transform
-      feedback vertex order for triangle fans.
-  * Revision 1, (1b) 2020-06-14 (Jesse Hall)
-    - Added
-      VkPhysicalDeviceProvokingVertexFeaturesEXT::transformFeedbackPreservesProvokingVertex
-      and required that transform feedback write vertices so as to preserve
-      the provoking vertex of each primitive.
-  * Revision 1, (1a) 2019-10-23 (Jesse Hall)
-    - Initial draft, based on a proposal by Alexis Hétu
diff --git a/registry/vulkan/appendices/VK_EXT_queue_family_foreign.txt b/registry/vulkan/appendices/VK_EXT_queue_family_foreign.txt
deleted file mode 100644
index ce1ad1e..0000000
--- a/registry/vulkan/appendices/VK_EXT_queue_family_foreign.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_queue_family_foreign.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-11-01
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Chad Versace, Google
-  - James Jones, NVIDIA
-  - Jason Ekstrand, Intel
-  - Jesse Hall, Google
-  - Daniel Rakos, AMD
-  - Ray Smith, ARM
-
-=== Description
-
-This extension defines a special queue family,
-ename:VK_QUEUE_FAMILY_FOREIGN_EXT, which can be used to transfer ownership
-of resources backed by external memory to foreign, external queues.
-This is similar to ename:VK_QUEUE_FAMILY_EXTERNAL_KHR, defined in
-`apiext:VK_KHR_external_memory`.
-The key differences between the two are:
-
-  * The queues represented by ename:VK_QUEUE_FAMILY_EXTERNAL_KHR must share
-    the same physical device and the same driver version as the current
-    slink:VkInstance.
-    ename:VK_QUEUE_FAMILY_FOREIGN_EXT has no such restrictions.
-    It can represent devices and drivers from other vendors, and can even
-    represent non-Vulkan-capable devices.
-  * All resources backed by external memory support
-    ename:VK_QUEUE_FAMILY_EXTERNAL_KHR.
-    Support for ename:VK_QUEUE_FAMILY_FOREIGN_EXT is more restrictive.
-  * Applications should expect transitions to/from
-    ename:VK_QUEUE_FAMILY_FOREIGN_EXT to be more expensive than transitions
-    to/from ename:VK_QUEUE_FAMILY_EXTERNAL_KHR.
-
-include::{generated}/interfaces/VK_EXT_queue_family_foreign.txt[]
-
-=== Version History
-
-  * Revision 1, 2017-11-01 (Chad Versace)
-    - Squashed internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_rgba10x6_formats.txt b/registry/vulkan/appendices/VK_EXT_rgba10x6_formats.txt
deleted file mode 100644
index 444f79f..0000000
--- a/registry/vulkan/appendices/VK_EXT_rgba10x6_formats.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_rgba10x6_formats.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-09-29
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jan-Harald Fredriksen, Arm
-  - Graeme Leese, Broadcom
-  - Spencer Fricke, Samsung
-
-=== Description
-
-This extension enables the
-ename:VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 format to be used without
-a <<samplers-YCbCr-conversion, sampler {YCbCr} conversion>> enabled.
-
-include::{generated}/interfaces/VK_EXT_rgba10x6_formats.txt[]
-
-=== Issues
-
-1) Should we reuse the existing format enumeration or introduce a new one?
-
-*RESOLVED*: We reuse an existing format enumeration,
-ename:VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16, that was previously
-exclusively used for YCbCr and therefore had a set of limitations related to
-that usage.
-The alternative was to introduce a new format token with exactly the same
-bit representation as the existing token, but without the limitations.
-
-2) Should we only introduce
-ename:VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 or also 1-3 component
-variations?
-
-*RESOLVED*: Only the 4-component format is introduced because the 1- and 2-
-component variations are already not exclusive to YCbCr, and the 3-component
-variation is not a good match for hardware capabilities.
-
-=== Version History
-
- * Revision 1, 2021-09-29 (Jan-Harald Fredriksen)
-   - Initial EXT version
diff --git a/registry/vulkan/appendices/VK_EXT_robustness2.txt b/registry/vulkan/appendices/VK_EXT_robustness2.txt
deleted file mode 100644
index d37760a..0000000
--- a/registry/vulkan/appendices/VK_EXT_robustness2.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_robustness2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-01-29
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-    - Liam Middlebrook, NVIDIA
-    - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension adds stricter requirements for how out of bounds reads and
-writes are handled.
-Most accesses must: be tightly bounds-checked, out of bounds writes must: be
-discarded, out of bound reads must: return zero.
-Rather than allowing multiple possible [eq]#(0,0,0,x)# vectors, the out of
-bounds values are treated as zero, and then missing components are inserted
-based on the format as described in <<textures-conversion-to-rgba,
-Conversion to RGBA>> and <<fxvertex-input-extraction,vertex input attribute
-extraction>>.
-
-These additional requirements may: be expensive on some implementations, and
-should only be enabled when truly necessary.
-
-This extension also adds support for "`null descriptors`", where
-dlink:VK_NULL_HANDLE can: be used instead of a valid handle.
-Accesses to null descriptors have well-defined behavior, and do not rely on
-robustness.
-
-include::{generated}/interfaces/VK_EXT_robustness2.txt[]
-
-=== Issues
-
-1. Why do
-   slink:VkPhysicalDeviceRobustness2PropertiesEXT::pname:robustUniformBufferAccessSizeAlignment
-   and
-   slink:VkPhysicalDeviceRobustness2PropertiesEXT::pname:robustStorageBufferAccessSizeAlignment
-   exist?
-
-*RESOLVED*: Some implementations cannot efficiently tightly bounds-check all
-buffer accesses.
-Rather, the size of the bound range is padded to some power of two multiple,
-up to 256 bytes for uniform buffers and up to 4 bytes for storage buffers,
-and that padded size is bounds-checked.
-This is sufficient to implement D3D-like behavior, because D3D only allows
-binding whole uniform buffers or ranges that are a multiple of 256 bytes,
-and D3D raw and structured buffers only support 32-bit accesses.
-
-=== Examples
-
-None.
-
-=== Version History
-
-    * Revision 1, 2019-11-01 (Jeff Bolz, Liam Middlebrook)
-        - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_sample_locations.txt b/registry/vulkan/appendices/VK_EXT_sample_locations.txt
deleted file mode 100644
index 7b89491..0000000
--- a/registry/vulkan/appendices/VK_EXT_sample_locations.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_sample_locations.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-08-02
-*Contributors*::
-  - Mais Alnasser, AMD
-  - Matthaeus G. Chajdas, AMD
-  - Maciej Jesionowski, AMD
-  - Daniel Rakos, AMD
-  - Slawomir Grajewski, Intel
-  - Jeff Bolz, NVIDIA
-  - Bill Licea-Kane, Qualcomm
-
-=== Description
-
-This extension allows an application to modify the locations of samples
-within a pixel used in rasterization.
-Additionally, it allows applications to specify different sample locations
-for each pixel in a group of adjacent pixels, which can: increase
-antialiasing quality (particularly if a custom resolve shader is used that
-takes advantage of these different locations).
-
-It is common for implementations to optimize the storage of depth values by
-storing values that can: be used to reconstruct depth at each sample
-location, rather than storing separate depth values for each sample.
-For example, the depth values from a single triangle may: be represented
-using plane equations.
-When the depth value for a sample is needed, it is automatically evaluated
-at the sample location.
-Modifying the sample locations causes the reconstruction to no longer
-evaluate the same depth values as when the samples were originally
-generated, thus the depth aspect of a depth/stencil attachment must: be
-cleared before rendering to it using different sample locations.
-
-Some implementations may: need to evaluate depth image values while
-performing image layout transitions.
-To accommodate this, instances of the slink:VkSampleLocationsInfoEXT
-structure can: be specified for each situation where an explicit or
-automatic layout transition has to take place.
-slink:VkSampleLocationsInfoEXT can: be chained from
-slink:VkImageMemoryBarrier structures to provide sample locations for layout
-transitions performed by flink:vkCmdWaitEvents and
-flink:vkCmdPipelineBarrier calls, and
-slink:VkRenderPassSampleLocationsBeginInfoEXT can: be chained from
-slink:VkRenderPassBeginInfo to provide sample locations for layout
-transitions performed implicitly by a render pass instance.
-
-include::{generated}/interfaces/VK_EXT_sample_locations.txt[]
-
-=== Version History
-
- * Revision 1, 2017-08-02 (Daniel Rakos)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_sampler_filter_minmax.txt b/registry/vulkan/appendices/VK_EXT_sampler_filter_minmax.txt
deleted file mode 100644
index 7d1832d..0000000
--- a/registry/vulkan/appendices/VK_EXT_sampler_filter_minmax.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_sampler_filter_minmax.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-05-19
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Piers Daniell, NVIDIA
-
-=== Description
-
-In unextended Vulkan, minification and magnification filters such as LINEAR
-allow sampled image lookups to return a filtered texel value produced by
-computing a weighted average of a collection of texels in the neighborhood
-of the texture coordinate provided.
-
-This extension provides a new sampler parameter which allows applications to
-produce a filtered texel value by computing a component-wise minimum (MIN)
-or maximum (MAX) of the texels that would normally be averaged.
-The reduction mode is orthogonal to the minification and magnification
-filter parameters.
-The filter parameters are used to identify the set of texels used to produce
-a final filtered value; the reduction mode identifies how these texels are
-combined.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-EXT suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_EXT_sampler_filter_minmax.txt[]
-
-=== Version History
-
- * Revision 2, 2017-05-19 (Piers Daniell)
-   - Renamed to EXT
-
- * Revision 1, 2017-03-25 (Jeff Bolz)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_scalar_block_layout.txt b/registry/vulkan/appendices/VK_EXT_scalar_block_layout.txt
deleted file mode 100644
index c7e9da6..0000000
--- a/registry/vulkan/appendices/VK_EXT_scalar_block_layout.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_scalar_block_layout.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-11-14
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*Contributors*::
-  - Jeff Bolz
-  - Jan-Harald Fredriksen
-  - Graeme Leese
-  - Jason Ekstrand
-  - John Kessenich
-
-=== Description
-
-This extension enables C-like structure layout for SPIR-V blocks.
-It modifies the alignment rules for uniform buffers, storage buffers and
-push constants, allowing non-scalar types to be aligned solely based on the
-size of their components, without additional requirements.
-
-=== Promotion to Vulkan 1.2
-
-Functionality in this extension is included in core Vulkan 1.2, with the EXT
-suffix omitted.
-However, if Vulkan 1.2 is supported and this extension is not, the
-code:scalarBlockLayout capability is optional.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_EXT_scalar_block_layout.txt[]
-
-=== Version History
-
-  * Revision 1, 2018-11-14 (Tobias Hector)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_separate_stencil_usage.txt b/registry/vulkan/appendices/VK_EXT_separate_stencil_usage.txt
deleted file mode 100644
index e29c025..0000000
--- a/registry/vulkan/appendices/VK_EXT_separate_stencil_usage.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_separate_stencil_usage.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-11-08
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Daniel Rakos, AMD
-  - Jordan Logan, AMD
-
-=== Description
-
-This extension allows specifying separate usage flags for the stencil aspect
-of images with a depth-stencil format at image creation time.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-EXT suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_EXT_separate_stencil_usage.txt[]
-
-=== Version History
-
-  * Revision 1, 2018-11-08 (Daniel Rakos)
-    - Internal revisions.
diff --git a/registry/vulkan/appendices/VK_EXT_shader_atomic_float.txt b/registry/vulkan/appendices/VK_EXT_shader_atomic_float.txt
deleted file mode 100644
index acdb7dd..0000000
--- a/registry/vulkan/appendices/VK_EXT_shader_atomic_float.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_shader_atomic_float.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-07-15
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/EXT/SPV_EXT_shader_atomic_float_add.html[`SPV_EXT_shader_atomic_float_add`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/tree/master/extensions/ext/GLSL_EXT_shader_atomic_float.txt[`GL_EXT_shader_atomic_float`]
-*Contributors*::
-  - Vikram Kushwaha, NVIDIA
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension allows a shader to contain floating-point atomic operations
-on buffer, workgroup, and image memory.
-It also advertises the SPIR-V code:AtomicFloat32AddEXT and
-code:AtomicFloat64AddEXT capabilities that allows atomic addition on
-floating-points numbers.
-The supported operations include code:OpAtomicFAddEXT,
-code:OpAtomicExchange, code:OpAtomicLoad and code:OpAtomicStore.
-
-include::{generated}/interfaces/VK_EXT_shader_atomic_float.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-AtomicFloat32AddEXT,
-    code:AtomicFloat32AddEXT>>
-  * <<spirvenv-capabilities-table-AtomicFloat64AddEXT,
-    code:AtomicFloat64AddEXT>>
-
-=== Version History
-
-  * Revision 1, 2020-07-15 (Vikram Kushwaha)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_shader_atomic_float2.txt b/registry/vulkan/appendices/VK_EXT_shader_atomic_float2.txt
deleted file mode 100755
index 905db95..0000000
--- a/registry/vulkan/appendices/VK_EXT_shader_atomic_float2.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2018-2020 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_shader_atomic_float2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-08-14
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires the VK_EXT_shader_atomic_float extension.
-  - This extension requires
-    {spirv}/EXT/SPV_EXT_shader_atomic_float_min_max.html[`SPV_EXT_shader_atomic_float_min_max`]
-    and
-    {spirv}/EXT/SPV_EXT_shader_atomic_float16_add.html[`SPV_EXT_shader_atomic_float16_add`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_shader_atomic_float2.txt[`GLSL_EXT_shader_atomic_float2`]
-*Contributors*::
-  - Jason Ekstrand, Intel
-
-=== Description
-
-This extension allows a shader to perform 16-bit floating-point atomic
-operations on buffer and workgroup memory as well as floating-point atomic
-minimum and maximum operations on buffer, workgroup, and image memory.
-It advertises the SPIR-V code:AtomicFloat16AddEXT capability which allows
-atomic add operations on 16-bit floating-point numbers and the SPIR-V
-code:AtomicFloat16MinMaxEXT, code:AtomicFloat32MinMaxEXT and
-code:AtomicFloat64MinMaxEXT capabilities which allow atomic minimum and
-maximum operations on floating-point numbers.
-The supported operations include code:OpAtomicFAddEXT, code:OpAtomicFMinEXT
-and code:OpAtomicFMaxEXT.
-
-include::{generated}/interfaces/VK_EXT_shader_atomic_float2.txt[]
-
-=== Issues
-
-1) Should this extension add support for 16-bit image atomics?
-
-*RESOLVED*: No.
-While Vulkan supports creating storage images with
-ename:VK_FORMAT_R16_SFLOAT and doing load and store on them, the data in the
-shader has a 32-bit representation.
-Vulkan currently has no facility for even basic reading or writing such
-images using 16-bit float values in the shader.
-Adding such functionality would be required before 16-bit image atomics
-would make sense and is outside the scope of this extension.
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-AtomicFloat16AddEXT,
-    code:AtomicFloat32MinMaxEXT>>
-  * <<spirvenv-capabilities-table-AtomicFloat16MinMaxEXT,
-    code:AtomicFloat32MinMaxEXT>>
-  * <<spirvenv-capabilities-table-AtomicFloat32MinMaxEXT,
-    code:AtomicFloat32MinMaxEXT>>
-  * <<spirvenv-capabilities-table-AtomicFloat64MinMaxEXT,
-    code:AtomicFloat64MinMaxEXT>>
-
-=== Version History
-
-  * Revision 1, 2020-08-14 (Jason Ekstrand)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_shader_demote_to_helper_invocation.txt b/registry/vulkan/appendices/VK_EXT_shader_demote_to_helper_invocation.txt
deleted file mode 100644
index 26346bc..0000000
--- a/registry/vulkan/appendices/VK_EXT_shader_demote_to_helper_invocation.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_shader_demote_to_helper_invocation.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-06-01
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/EXT/SPV_EXT_demote_to_helper_invocation.html[`SPV_EXT_demote_to_helper_invocation`]
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension adds Vulkan support for the
-{spirv}/EXT/SPV_EXT_demote_to_helper_invocation.html[`SPV_EXT_demote_to_helper_invocation`]
-SPIR-V extension.
-That SPIR-V extension provides a new instruction
-code:OpDemoteToHelperInvocationEXT allowing shaders to "`demote`" a fragment
-shader invocation to behave like a helper invocation for its duration.
-The demoted invocation will have no further side effects and will not output
-to the framebuffer, but remains active and can participate in computing
-derivatives and in <<shaders-group-operations, group operations>>.
-This is a better match for the "`discard`" instruction in HLSL.
-
-include::{generated}/interfaces/VK_EXT_shader_demote_to_helper_invocation.txt[]
-
-=== New SPIR-V Capability
-
-  * <<spirvenv-capabilities-table-DemoteToHelperInvocationEXT,DemoteToHelperInvocationEXT>>
-
-=== Version History
-
- * Revision 1, 2019-06-01 (Jeff Bolz)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_shader_image_atomic_int64.txt b/registry/vulkan/appendices/VK_EXT_shader_image_atomic_int64.txt
deleted file mode 100644
index 322a0a7..0000000
--- a/registry/vulkan/appendices/VK_EXT_shader_image_atomic_int64.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_shader_image_atomic_int64.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-07-14
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Matthaeus Chajdas, AMD
-  - Graham Wihlidal, Epic Games
-  - Tobias Hector, AMD
-  - Jeff Bolz, Nvidia
-  - Jason Ekstrand, Intel
-*Interactions and External Dependencies*::
-  - This extension requires the
-    {spirv}/EXT/SPV_EXT_shader_image_int64.html[`SPV_EXT_shader_image_int64`]
-    SPIR-V extension.
-  - This extension requires the
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_shader_image_int64.txt[`GLSL_EXT_shader_image_int64`]
-    extension for GLSL source languages.
-
-=== Description
-
-This extension extends existing 64-bit integer atomic support to enable
-these operations on images as well.
-
-When working with large 2- or 3-dimensional data sets (e.g. rasterization or
-screen-space effects), image accesses are generally more efficient than
-equivalent buffer accesses.
-This extension allows applications relying on 64-bit integer atomics in this
-manner to quickly improve performance with only relatively minor code
-changes.
-
-64-bit integer atomic support is guaranteed for optimally tiled images with
-the ename:VK_FORMAT_R64_UINT and ename:VK_FORMAT_R64_SINT formats.
-
-include::{generated}/interfaces/VK_EXT_shader_image_atomic_int64.txt[]
-
-=== Version History
-
- * Revision 1, 2020-07-14 (Tobias Hector)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_shader_stencil_export.txt b/registry/vulkan/appendices/VK_EXT_shader_stencil_export.txt
deleted file mode 100644
index 4b45ac4..0000000
--- a/registry/vulkan/appendices/VK_EXT_shader_stencil_export.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_shader_stencil_export.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-07-19
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/EXT/SPV_EXT_shader_stencil_export.html[`SPV_EXT_shader_stencil_export`]
-  - This extension provides API support for
-    https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_stencil_export.txt[`GL_ARB_shader_stencil_export`]
-*Contributors*::
-  - Dominik Witczak, AMD
-  - Daniel Rakos, AMD
-  - Rex Xu, AMD
-
-=== Description
-
-This extension adds support for the SPIR-V extension
-`SPV_EXT_shader_stencil_export`, providing a mechanism whereby a shader may
-generate the stencil reference value per invocation.
-When stencil testing is enabled, this allows the test to be performed
-against the value generated in the shader.
-
-include::{generated}/interfaces/VK_EXT_shader_stencil_export.txt[]
-
-=== Version History
-
- * Revision 1, 2017-07-19 (Dominik Witczak)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_shader_subgroup_ballot.txt b/registry/vulkan/appendices/VK_EXT_shader_subgroup_ballot.txt
deleted file mode 100644
index 9d6d55a..0000000
--- a/registry/vulkan/appendices/VK_EXT_shader_subgroup_ballot.txt
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2016-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_shader_subgroup_ballot.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-11-28
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_shader_ballot.html[`SPV_KHR_shader_ballot`]
-  - This extension provides API support for
-    https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_ballot.txt[`GL_ARB_shader_ballot`]
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Neil Henning, Codeplay
-  - Daniel Koch, NVIDIA Corporation
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * `SPV_KHR_shader_ballot`
-
-This extension provides the ability for a group of invocations, which
-execute in parallel, to do limited forms of cross-invocation communication
-via a group broadcast of a invocation value, or broadcast of a bitarray
-representing a predicate value from each invocation in the group.
-
-This extension provides access to a number of additional built-in shader
-variables in Vulkan:
-
-  * code:SubgroupEqMaskKHR, which contains the subgroup mask of the current
-    subgroup invocation,
-  * code:SubgroupGeMaskKHR, which contains the subgroup mask of the
-    invocations greater than or equal to the current invocation,
-  * code:SubgroupGtMaskKHR, which contains the subgroup mask of the
-    invocations greater than the current invocation,
-  * code:SubgroupLeMaskKHR, which contains the subgroup mask of the
-    invocations less than or equal to the current invocation,
-  * code:SubgroupLtMaskKHR, which contains the subgroup mask of the
-    invocations less than the current invocation,
-  * code:SubgroupLocalInvocationId, which contains the index of an
-    invocation within a subgroup, and
-  * code:SubgroupSize, which contains the maximum number of invocations in a
-    subgroup.
-
-Additionally, this extension provides access to the new SPIR-V instructions:
-
-  * code:OpSubgroupBallotKHR,
-  * code:OpSubgroupFirstInvocationKHR, and
-  * code:OpSubgroupReadInvocationKHR,
-
-When using GLSL source-based shader languages, the following variables and
-shader functions from GL_ARB_shader_ballot can map to these SPIR-V built-in
-decorations and instructions:
-
-  * `in uint64_t gl_SubGroupEqMaskARB;` -> code:SubgroupEqMaskKHR,
-  * `in uint64_t gl_SubGroupGeMaskARB;` -> code:SubgroupGeMaskKHR,
-  * `in uint64_t gl_SubGroupGtMaskARB;` -> code:SubgroupGtMaskKHR,
-  * `in uint64_t gl_SubGroupLeMaskARB;` -> code:SubgroupLeMaskKHR,
-  * `in uint64_t gl_SubGroupLtMaskARB;` -> code:SubgroupLtMaskKHR,
-  * `in uint gl_SubGroupInvocationARB;` -> code:SubgroupLocalInvocationId,
-  * `uniform uint gl_SubGroupSizeARB;` -> code:SubgroupSize,
-  * code:ballotARB() -> code:OpSubgroupBallotKHR,
-  * code:readFirstInvocationARB() -> code:OpSubgroupFirstInvocationKHR, and
-  * code:readInvocationARB() -> code:OpSubgroupReadInvocationKHR.
-
-=== Deprecated by Vulkan 1.2
-
-Most of the functionality in this extension is superseded by the core Vulkan
-1.1 <<VkPhysicalDeviceSubgroupProperties, subgroup operations>>.
-However, Vulkan 1.1 required the code:OpGroupNonUniformBroadcast "`Id`" to
-be constant.
-This restriction was removed in Vulkan 1.2 with the addition of the
-<<features-subgroupBroadcastDynamicId,subgroupBroadcastDynamicId>> feature.
-
-include::{generated}/interfaces/VK_EXT_shader_subgroup_ballot.txt[]
-
-=== New Built-In Variables
-
-  * <<interfaces-builtin-variables-sgeq,code:SubgroupEqMaskKHR>>
-  * <<interfaces-builtin-variables-sgge,code:SubgroupGeMaskKHR>>
-  * <<interfaces-builtin-variables-sggt,code:SubgroupGtMaskKHR>>
-  * <<interfaces-builtin-variables-sgle,code:SubgroupLeMaskKHR>>
-  * <<interfaces-builtin-variables-sglt,code:SubgroupLtMaskKHR>>
-  * <<interfaces-builtin-variables-sgli,code:SubgroupLocalInvocationId>>
-  * <<interfaces-builtin-variables-sgs,code:SubgroupSize>>
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-SubgroupBallotKHR,SubgroupBallotKHR>>
-
-=== Version History
-
-  * Revision 1, 2016-11-28 (Daniel Koch)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_shader_subgroup_vote.txt b/registry/vulkan/appendices/VK_EXT_shader_subgroup_vote.txt
deleted file mode 100644
index f55c480..0000000
--- a/registry/vulkan/appendices/VK_EXT_shader_subgroup_vote.txt
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2016-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_shader_subgroup_vote.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-11-28
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_subgroup_vote.html[`SPV_KHR_subgroup_vote`]
-  - This extension provides API support for
-    https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_group_vote.txt[`GL_ARB_shader_group_vote`]
-*Contributors*::
-  - Neil Henning, Codeplay
-  - Daniel Koch, NVIDIA Corporation
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * `SPV_KHR_subgroup_vote`
-
-This extension provides new SPIR-V instructions:
-
-  * code:OpSubgroupAllKHR,
-  * code:OpSubgroupAnyKHR, and
-  * code:OpSubgroupAllEqualKHR.
-
-to compute the composite of a set of boolean conditions across a group of
-shader invocations that are running concurrently (a _subgroup_).
-These composite results may be used to execute shaders more efficiently on a
-slink:VkPhysicalDevice.
-
-When using GLSL source-based shader languages, the following shader
-functions from GL_ARB_shader_group_vote can map to these SPIR-V
-instructions:
-
-  * code:anyInvocationARB() -> code:OpSubgroupAnyKHR,
-  * code:allInvocationsARB() -> code:OpSubgroupAllKHR, and
-  * code:allInvocationsEqualARB() -> code:OpSubgroupAllEqualKHR.
-
-The subgroup across which the boolean conditions are evaluated is
-implementation-dependent, and this extension provides no guarantee over how
-individual shader invocations are assigned to subgroups.
-In particular, a subgroup has no necessary relationship with the compute
-shader _local workgroup_ -- any pair of shader invocations in a compute
-local workgroup may execute in different subgroups as used by these
-instructions.
-
-Compute shaders operate on an explicitly specified group of threads (a local
-workgroup), but many implementations will also group non-compute shader
-invocations and execute them concurrently.
-When executing code like
-
-[source,c++]
-----------------------------------------
-if (condition) {
-  result = do_fast_path();
-} else {
-  result = do_general_path();
-}
-----------------------------------------
-
-where code:condition diverges between invocations, an implementation might
-first execute code:do_fast_path() for the invocations where code:condition
-is true and leave the other invocations dormant.
-Once code:do_fast_path() returns, it might call code:do_general_path() for
-invocations where code:condition is code:false and leave the other
-invocations dormant.
-In this case, the shader executes *both* the fast and the general path and
-might be better off just using the general path for all invocations.
-
-This extension provides the ability to avoid divergent execution by
-evaluating a condition across an entire subgroup using code like:
-
-[source,c++]
-----------------------------------------
-if (allInvocationsARB(condition)) {
-  result = do_fast_path();
-} else {
-  result = do_general_path();
-}
-----------------------------------------
-
-The built-in function code:allInvocationsARB() will return the same value
-for all invocations in the group, so the group will either execute
-code:do_fast_path() or code:do_general_path(), but never both.
-For example, shader code might want to evaluate a complex function
-iteratively by starting with an approximation of the result and then
-refining the approximation.
-Some input values may require a small number of iterations to generate an
-accurate result (code:do_fast_path) while others require a larger number
-(code:do_general_path).
-In another example, shader code might want to evaluate a complex function
-(code:do_general_path) that can be greatly simplified when assuming a
-specific value for one of its inputs (code:do_fast_path).
-
-=== Deprecated by Vulkan 1.1
-
-All functionality in this extension is superseded by the core Vulkan 1.1
-<<VkPhysicalDeviceSubgroupProperties, subgroup operations>>.
-
-include::{generated}/interfaces/VK_EXT_shader_subgroup_vote.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-SubgroupVoteKHR,SubgroupVoteKHR>>
-
-=== Version History
-
-  * Revision 1, 2016-11-28 (Daniel Koch)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_shader_viewport_index_layer.txt b/registry/vulkan/appendices/VK_EXT_shader_viewport_index_layer.txt
deleted file mode 100644
index 3b2a581..0000000
--- a/registry/vulkan/appendices/VK_EXT_shader_viewport_index_layer.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_shader_viewport_index_layer.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-08-08
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-  - This extension requires
-    {spirv}/EXT/SPV_EXT_shader_viewport_index_layer.html[`SPV_EXT_shader_viewport_index_layer`]
-  - This extension provides API support for
-    https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_viewport_layer_array.txt[`GL_ARB_shader_viewport_layer_array`],
-    https://www.khronos.org/registry/OpenGL/extensions/AMD/AMD_vertex_shader_layer.txt[`GL_AMD_vertex_shader_layer`],
-    https://www.khronos.org/registry/OpenGL/extensions/AMD/AMD_vertex_shader_viewport_index.txt[`GL_AMD_vertex_shader_viewport_index`],
-    and
-    https://www.khronos.org/registry/OpenGL/extensions/NV/NV_viewport_array2.txt[`GL_NV_viewport_array2`]
-  - This extension requires the pname:multiViewport feature.
-  - This extension interacts with the pname:tessellationShader feature.
-*Contributors*::
-  - Piers Daniell, NVIDIA
-  - Jeff Bolz, NVIDIA
-  - Jan-Harald Fredriksen, ARM
-  - Daniel Rakos, AMD
-  - Slawomir Grajeswki, Intel
-
-=== Description
-
-This extension adds support for the code:ShaderViewportIndexLayerEXT
-capability from the `SPV_EXT_shader_viewport_index_layer` extension in
-Vulkan.
-
-This extension allows variables decorated with the code:Layer and
-code:ViewportIndex built-ins to be exported from vertex or tessellation
-shaders, using the code:ShaderViewportIndexLayerEXT capability.
-
-When using GLSL source-based shading languages, the code:gl_ViewportIndex
-and code:gl_Layer built-in variables map to the SPIR-V code:ViewportIndex
-and code:Layer built-in decorations, respectively.
-Behaviour of these variables is extended as described in the
-`GL_ARB_shader_viewport_layer_array` (or the precursor
-`GL_AMD_vertex_shader_layer`, `GL_AMD_vertex_shader_viewport_index`, and
-`GL_NV_viewport_array2` extensions).
-
-ifdef::VK_NV_viewport_array2[]
-[NOTE]
-.Note
-====
-The code:ShaderViewportIndexLayerEXT capability is equivalent to the
-code:ShaderViewportIndexLayerNV capability added by
-`apiext:VK_NV_viewport_array2`.
-====
-endif::VK_NV_viewport_array2[]
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2.
-
-The single code:ShaderViewportIndexLayerEXT capability from the
-`SPV_EXT_shader_viewport_index_layer` extension is replaced by the
-<<spirvenv-capabilities-table-ShaderViewportIndex,code:ShaderViewportIndex>>
-and <<spirvenv-capabilities-table-ShaderLayer,code:ShaderLayer>>
-capabilities from SPIR-V 1.5 which are enabled by the
-<<features-shaderOutputViewportIndex,shaderOutputViewportIndex>> and
-<<features-shaderOutputLayer,shaderOutputLayer>> features, respectively.
-Additionally, if Vulkan 1.2 is supported but this extension is not, these
-capabilities are optional.
-
-Enabling both features is equivalent to enabling the
-`VK_EXT_shader_viewport_index_layer` extension.
-
-include::{generated}/interfaces/VK_EXT_shader_viewport_index_layer.txt[]
-
-=== New or Modified Built-In Variables
-
-  * (modified) <<interfaces-builtin-variables-layer,code:Layer>>
-  * (modified)
-    <<interfaces-builtin-variables-viewportindex,code:ViewportIndex>>
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-ShaderViewportIndexLayerEXT,code:ShaderViewportIndexLayerEXT>>
-
-=== Version History
-
-  * Revision 1, 2017-08-08 (Daniel Koch)
-    - Internal drafts
diff --git a/registry/vulkan/appendices/VK_EXT_subgroup_size_control.txt b/registry/vulkan/appendices/VK_EXT_subgroup_size_control.txt
deleted file mode 100644
index dab90f2..0000000
--- a/registry/vulkan/appendices/VK_EXT_subgroup_size_control.txt
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_subgroup_size_control.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-03-05
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Jason Ekstrand, Intel
-  - Sławek Grajewski, Intel
-  - Jesse Hall, Google
-  - Neil Henning, AMD
-  - Daniel Koch, NVIDIA
-  - Jeff Leger, Qualcomm
-  - Graeme Leese, Broadcom
-  - Allan MacKinnon, Google
-  - Mariusz Merecki, Intel
-  - Graham Wihlidal, Electronic Arts
-
-
-=== Description
-
-This extension enables an implementation to control the subgroup size by
-allowing a varying subgroup size and also specifying a required subgroup
-size.
-
-It extends the subgroup support in Vulkan 1.1 to allow an implementation to
-expose a varying subgroup size.
-Previously Vulkan exposed a single subgroup size per physical device, with
-the expectation that implementations will behave as if all subgroups have
-the same size.
-Some implementations may: dispatch shaders with a varying subgroup size for
-different subgroups.
-As a result they could implicitly split a large subgroup into smaller
-subgroups or represent a small subgroup as a larger subgroup, some of whose
-invocations were inactive on launch.
-
-To aid developers in understanding the performance characteristics of their
-programs, this extension exposes a minimum and maximum subgroup size that a
-physical device supports and a pipeline create flag to enable that pipeline
-to vary its subgroup size.
-If enabled, any code:SubgroupSize decorated variables in the SPIR-V shader
-modules provided to pipeline creation may: vary between the
-<<limits-min-subgroup-size,minimum>> and
-<<limits-max-subgroup-size,maximum>> subgroup sizes.
-
-An implementation is also optionally allowed to support specifying a
-required subgroup size for a given pipeline stage.
-Implementations advertise which <<limits-required-subgroup-size-stages,
-stages support a required subgroup size>>, and any pipeline of a supported
-stage can be passed a
-slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure to
-set the subgroup size for that shader stage of the pipeline.
-For compute shaders, this requires the developer to query the
-<<limits-max-subgroups-per-workgroup, pname:maxComputeWorkgroupSubgroups>>
-and ensure that:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-s = { WorkGroupSize.x \times WorkGroupSize.y \times WorkgroupSize.z \leq SubgroupSize \times maxComputeWorkgroupSubgroups }
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-Developers can also specify a new pipeline shader stage create flag that
-requires the implementation to have fully populated subgroups within local
-workgroups.
-This requires the workgroup size in the X dimension to be a multiple of the
-subgroup size.
-
-include::{generated}/interfaces/VK_EXT_subgroup_size_control.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-03-05 (Neil Henning)
-    - Initial draft
-
-  * Revision 2, 2019-07-26 (Jason Ekstrand)
-    - Add the missing slink:VkPhysicalDeviceSubgroupSizeControlFeaturesEXT
-      for querying subgroup size control features.
diff --git a/registry/vulkan/appendices/VK_EXT_swapchain_colorspace.txt b/registry/vulkan/appendices/VK_EXT_swapchain_colorspace.txt
deleted file mode 100644
index 95e1a99..0000000
--- a/registry/vulkan/appendices/VK_EXT_swapchain_colorspace.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2016-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_swapchain_colorspace.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-04-26
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Courtney Goeltzenleuchter, Google
-
-=== Description
-
-To be done.
-
-include::{generated}/interfaces/VK_EXT_swapchain_colorspace.txt[]
-
-=== Issues
-
-1) Does the spec need to specify which kinds of image formats support the
-color spaces?
-
-*RESOLVED*: Pixel format is independent of color space (though some color
-spaces really want / need floating point color components to be useful).
-Therefore, do not plan on documenting what formats support which
-colorspaces.
-An application can: call flink:vkGetPhysicalDeviceSurfaceFormatsKHR to query
-what a particular implementation supports.
-
-2) How does application determine if HW supports appropriate transfer
-function for a colorspace?
-
-*RESOLVED*: Extension indicates that implementation must: not do the OETF
-encoding if it is not sRGB.
-That responsibility falls to the application shaders.
-Any other native OETF / EOTF functions supported by an implementation can be
-described by separate extension.
-
-=== Version History
-
-  * Revision 1, 2016-12-27 (Courtney Goeltzenleuchter)
-    - Initial version
-
-  * Revision 2, 2017-01-19 (Courtney Goeltzenleuchter)
-    - Add pass through and multiple options for BT2020.
-    - Clean up some issues with equations not displaying properly.
-
-  * Revision 3, 2017-06-23 (Courtney Goeltzenleuchter)
-    - Add extended sRGB non-linear enum.
-
-  * Revision 4, 2019-04-26 (Graeme Leese)
-    - Clarify colorspace transfer function usage.
-    - Refer to normative definitions in the Data Format Specification.
-    - Clarify DCI-P3 and Display P3 usage.
diff --git a/registry/vulkan/appendices/VK_EXT_texel_buffer_alignment.txt b/registry/vulkan/appendices/VK_EXT_texel_buffer_alignment.txt
deleted file mode 100644
index af5ca5a..0000000
--- a/registry/vulkan/appendices/VK_EXT_texel_buffer_alignment.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_texel_buffer_alignment.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-06-06
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension adds more expressive alignment requirements for uniform and
-storage texel buffers.
-Some implementations have single texel alignment requirements that cannot be
-expressed via
-slink:VkPhysicalDeviceLimits::pname:minTexelBufferOffsetAlignment.
-
-include::{generated}/interfaces/VK_EXT_texel_buffer_alignment.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-06-06 (Jeff Bolz)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_texture_compression_astc_hdr.txt b/registry/vulkan/appendices/VK_EXT_texture_compression_astc_hdr.txt
deleted file mode 100644
index 441006c..0000000
--- a/registry/vulkan/appendices/VK_EXT_texture_compression_astc_hdr.txt
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_texture_compression_astc_hdr.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-05-28
-*IP Status*::
-    No known issues.
-*Contributors*::
-  - Jan-Harald Fredriksen, Arm
-
-=== Description
-
-This extension adds support for textures compressed using the Adaptive
-Scalable Texture Compression (ASTC) High Dynamic Range (HDR) profile.
-
-When this extension is enabled, the HDR profile is supported for all ASTC
-formats listed in <<appendix-compressedtex-astc, ASTC Compressed Image
-Formats>>.
-
-include::{generated}/interfaces/VK_EXT_texture_compression_astc_hdr.txt[]
-
-=== Issues
-
-1) Should we add a feature or limit for this functionality?
-
-Yes.
-It is consistent with the ASTC LDR support to add a feature like
-textureCompressionASTC_HDR.
-
-The feature is strictly speaking redundant as long as this is just an
-extension; it would be sufficient to just enable the extension.
-But adding the feature is more forward-looking if wanted to make this an
-optional core feature in the future.
-
-2) Should we introduce new format enums for HDR?
-
-Yes.
-Vulkan 1.0 describes the ASTC format enums as UNORM, e.g.
-ename:VK_FORMAT_ASTC_4x4_UNORM_BLOCK, so it is confusing to make these
-contain HDR data.
-Note that the OpenGL (ES) extensions did not make this distinction because a
-single ASTC HDR texture may contain both unorm and float blocks.
-Implementations may: not be able to distinguish between LDR and HDR ASTC
-textures internally and just treat them as the same format, i.e. if this
-extension is supported then sampling from a
-ename:VK_FORMAT_ASTC_4x4_UNORM_BLOCK image format may: return HDR results.
-Applications can: get predictable results by using the appropriate image
-format.
-
-
-=== Version History
-
-  * Revision 1, 2019-05-28 (Jan-Harald Fredriksen)
-    - Initial version
-
diff --git a/registry/vulkan/appendices/VK_EXT_tooling_info.txt b/registry/vulkan/appendices/VK_EXT_tooling_info.txt
deleted file mode 100644
index 67eb718..0000000
--- a/registry/vulkan/appendices/VK_EXT_tooling_info.txt
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_tooling_info.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-11-05
-*Contributors*::
-  - Rolando Caloca
-  - Matthaeus Chajdas
-  - Baldur Karlsson
-  - Daniel Rakos
-
-=== Description
-
-When an error occurs during application development, a common question is
-"What tools are actually running right now?" This extension adds the ability
-to query that information directly from the Vulkan implementation.
-
-Outdated versions of one tool might not play nicely with another, or perhaps
-a tool is not actually running when it should have been.
-Trying to figure that out can cause headaches as it is necessary to consult
-each known tool to figure out what is going on -- in some cases the tool
-might not even be known.
-
-Typically, the expectation is that developers will simply print out this
-information for visual inspection when an issue occurs, however a small
-amount of semantic information about what the tool is doing is provided to
-help identify it programmatically.
-For example, if the advertised limits or features of an implementation are
-unexpected, is there a tool active which modifies these limits? Or if an
-application is providing debug markers, but the implementation is not
-actually doing anything with that information, this can quickly point that
-out.
-
-include::{generated}/interfaces/VK_EXT_tooling_info.txt[]
-
-=== Examples
-
-.Printing Tool Information
-
-```
-uint32_t num_tools;
-VkPhysicalDeviceToolPropertiesEXT *pToolProperties;
-vkGetPhysicalDeviceToolPropertiesEXT(physicalDevice, &num_tools, NULL);
-
-pToolProperties = (VkPhysicalDeviceToolPropertiesEXT*)malloc(sizeof(VkPhysicalDeviceToolPropertiesEXT) * num_tools);
-
-vkGetPhysicalDeviceToolPropertiesEXT(physicalDevice, &num_tools, pToolProperties);
-
-for (int i = 0; i < num_tools; ++i) {
-    printf("%s:\n", pToolProperties[i].name);
-    printf("Version:\n");
-    printf("%s:\n", pToolProperties[i].version);
-    printf("Description:\n");
-    printf("\t%s\n", pToolProperties[i].description);
-    printf("Purposes:\n");
-    printf("\t%s\n", VkToolPurposeFlagBitsEXT_to_string(pToolProperties[i].purposes));
-    if (strnlen_s(pToolProperties[i].layer,VK_MAX_EXTENSION_NAME_SIZE) > 0) {
-        printf("Corresponding Layer:\n");
-        printf("\t%s\n", pToolProperties[i].layer);
-    }
-}
-```
-
-=== Issues
-
-1) Why is this information separate from the layer mechanism?
-
-Some tooling may be built into a driver, or be part of the Vulkan loader
-etc.
-- and so tying this information directly to layers would've been awkward at
-  best.
-
-=== Version History
-
- * Revision 1, 2018-11-05 (Tobias Hector)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_transform_feedback.txt b/registry/vulkan/appendices/VK_EXT_transform_feedback.txt
deleted file mode 100644
index 75f0671..0000000
--- a/registry/vulkan/appendices/VK_EXT_transform_feedback.txt
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_transform_feedback.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-10-09
-*Contributors*::
-  - Baldur Karlsson, Valve
-  - Boris Zanin, Mobica
-  - Daniel Rakos, AMD
-  - Donald Scorgie, Imagination
-  - Henri Verbeet, CodeWeavers
-  - Jan-Harald Fredriksen, Arm
-  - Jason Ekstrand, Intel
-  - Jeff Bolz, NVIDIA
-  - Jesse Barker, Unity
-  - Jesse Hall, Google
-  - Pierre-Loup Griffais, Valve
-  - Philip Rebohle, DXVK
-  - Ruihao Zhang, Qualcomm
-  - Samuel Pitoiset, Valve
-  - Slawomir Grajewski, Intel
-  - Stu Smith, Imagination Technologies
-
-=== Description
-
-This extension adds transform feedback to the Vulkan API by exposing the
-SPIR-V code:TransformFeedback and code:GeometryStreams capabilities to
-capture vertex, tessellation or geometry shader outputs to one or more
-buffers.
-It adds API functionality to bind transform feedback buffers to capture the
-primitives emitted by the graphics pipeline from SPIR-V outputs decorated
-for transform feedback.
-The transform feedback capture can be paused and resumed by way of storing
-and retrieving a byte counter.
-The captured data can be drawn again where the vertex count is derived from
-the byte counter without CPU intervention.
-If the implementation is capable, a vertex stream other than zero can be
-rasterized.
-
-All these features are designed to match the full capabilities of OpenGL
-core transform feedback functionality and beyond.
-Many of the features are optional to allow base OpenGL ES GPUs to also
-implement this extension.
-
-The primary purpose of the functionality exposed by this extension is to
-support translation layers from other 3D APIs.
-This functionality is not considered forward looking, and is not expected to
-be promoted to a KHR extension or to core Vulkan.
-Unless this is needed for translation, it is recommended that developers use
-alternative techniques of using the GPU to process and capture vertex data.
-
-include::{generated}/interfaces/VK_EXT_transform_feedback.txt[]
-
-=== Issues
-
-1) Should we include pause/resume functionality?
-
-*RESOLVED*: Yes, this is needed to ease layering other APIs which have this
-functionality.
-To pause use fname:vkCmdEndTransformFeedbackEXT and provide valid buffer
-handles in the pname:pCounterBuffers array and offsets in the
-pname:pCounterBufferOffsets array for the implementation to save the resume
-points.
-Then to resume use fname:vkCmdBeginTransformFeedbackEXT with the previous
-pname:pCounterBuffers and pname:pCounterBufferOffsets values.
-Between the pause and resume there needs to be a memory barrier for the
-counter buffers with a source access of
-ename:VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT at pipeline stage
-ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT to a destination access
-of ename:VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT at pipeline stage
-ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT.
-
-2) How does this interact with multiview?
-
-*RESOLVED*: Transform feedback cannot be made active in a render pass with
-multiview enabled.
-
-3) How should queries be done?
-
-*RESOLVED*: There is a new query type
-ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT.
-A query pool created with this type will capture 2 integers -
-numPrimitivesWritten and numPrimitivesNeeded - for the specified vertex
-stream output from the last
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>>.
-The vertex stream output queried is zero by default, but can be specified
-with the new fname:vkCmdBeginQueryIndexedEXT and
-fname:vkCmdEndQueryIndexedEXT commands.
-
-=== Version History
-
-  * Revision 1, 2018-10-09 (Piers Daniell)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_validation_cache.txt b/registry/vulkan/appendices/VK_EXT_validation_cache.txt
deleted file mode 100644
index 1c21e91..0000000
--- a/registry/vulkan/appendices/VK_EXT_validation_cache.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_validation_cache.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-08-29
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Cort Stratton, Google
-  - Chris Forbes, Google
-
-=== Description
-
-This extension provides a mechanism for caching the results of potentially
-expensive internal validation operations across multiple runs of a Vulkan
-application.
-At the core is the slink:VkValidationCacheEXT object type, which is managed
-similarly to the existing slink:VkPipelineCache.
-
-The new struct slink:VkShaderModuleValidationCacheCreateInfoEXT can be
-included in the pname:pNext chain at flink:vkCreateShaderModule time.
-It contains a slink:VkValidationCacheEXT to use when validating the
-slink:VkShaderModule.
-
-include::{generated}/interfaces/VK_EXT_validation_cache.txt[]
-
-=== Version History
-
- * Revision 1, 2017-08-29 (Cort Stratton)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_validation_features.txt b/registry/vulkan/appendices/VK_EXT_validation_features.txt
deleted file mode 100644
index aee0777..0000000
--- a/registry/vulkan/appendices/VK_EXT_validation_features.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_validation_features.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-11-14
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Karl Schultz, LunarG
-  - Dave Houlton, LunarG
-  - Mark Lobodzinski, LunarG
-  - Camden Stocker, LunarG
-  - Tony Barbour, LunarG
-  - John Zulauf, LunarG
-
-=== Description
-
-This extension provides the slink:VkValidationFeaturesEXT struct that can be
-included in the pname:pNext chain of the slink:VkInstanceCreateInfo
-structure passed as the pname:pCreateInfo parameter of
-flink:vkCreateInstance.
-The structure contains an array of elink:VkValidationFeatureEnableEXT enum
-values that enable specific validation features that are disabled by
-default.
-The structure also contains an array of elink:VkValidationFeatureDisableEXT
-enum values that disable specific validation layer features that are enabled
-by default.
-
-[NOTE]
-.Note
-====
-The `apiext:VK_EXT_validation_features` extension subsumes all the
-functionality provided in the `apiext:VK_EXT_validation_flags` extension.
-====
-
-include::{generated}/interfaces/VK_EXT_validation_features.txt[]
-
-=== Version History
-
- * Revision 1, 2018-11-14 (Karl Schultz)
-   - Initial revision
- * Revision 2, 2019-08-06 (Mark Lobodzinski)
-   - Add Best Practices enable
- * Revision 3, 2020-03-04 (Tony Barbour)
-   - Add Debug Printf enable
- * Revision 4, 2020-07-29 (John Zulauf)
-   - Add Synchronization Validation enable
- * Revision 5, 2021-05-18 (Tony Barbour)
-   - Add Shader Validation Cache disable
diff --git a/registry/vulkan/appendices/VK_EXT_validation_flags.txt b/registry/vulkan/appendices/VK_EXT_validation_flags.txt
deleted file mode 100644
index 522c7a7..0000000
--- a/registry/vulkan/appendices/VK_EXT_validation_flags.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_validation_flags.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-08-19
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Tobin Ehlis, Google
-  - Courtney Goeltzenleuchter, Google
-
-=== Description
-
-This extension provides the slink:VkValidationFlagsEXT struct that can be
-included in the pname:pNext chain of the slink:VkInstanceCreateInfo
-structure passed as the pname:pCreateInfo parameter of
-flink:vkCreateInstance.
-The structure contains an array of elink:VkValidationCheckEXT values that
-will be disabled by the validation layers.
-
-=== Deprecation by `VK_EXT_validation_features`
-Functionality in this extension is subsumed into the
-`apiext:VK_EXT_validation_features` extension.
-
-include::{generated}/interfaces/VK_EXT_validation_flags.txt[]
-
-=== Version History
-
- * Revision 2, 2019-08-19 (Mark Lobodzinski)
-   - Marked as deprecated
- * Revision 1, 2016-08-26 (Courtney Goeltzenleuchter)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_vertex_attribute_divisor.txt b/registry/vulkan/appendices/VK_EXT_vertex_attribute_divisor.txt
deleted file mode 100644
index 9058d7d..0000000
--- a/registry/vulkan/appendices/VK_EXT_vertex_attribute_divisor.txt
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2017-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_vertex_attribute_divisor.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-08-03
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Vikram Kushwaha, NVIDIA
-  - Jason Ekstrand, Intel
-
-=== Description
-
-This extension allows instance-rate vertex attributes to be repeated for
-certain number of instances instead of advancing for every instance when
-instanced rendering is enabled.
-
-include::{generated}/interfaces/VK_EXT_vertex_attribute_divisor.txt[]
-
-=== Issues
-
-1) What is the effect of a non-zero value for pname:firstInstance?
-
-*RESOLVED*: The Vulkan API should follow the OpenGL convention and offset
-attribute fetching by pname:firstInstance while computing vertex attribute
-offsets.
-
-2) Should zero be an allowed divisor?
-
-*RESOLVED*: Yes.
-A zero divisor means the vertex attribute is repeated for all instances.
-
-
-=== Examples
-
-To create a vertex binding such that the first binding uses instanced
-rendering and the same attribute is used for every 4 draw instances, an
-application could use the following set of structures:
-
-
-[source,c++]
-----------------------------------------
-
-    const VkVertexInputBindingDivisorDescriptionEXT divisorDesc =
-    {
-        0,
-        4
-    };
-
-    const VkPipelineVertexInputDivisorStateCreateInfoEXT divisorInfo =
-    {
-        VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT, // sType
-        NULL,                                                             // pNext
-        1,                                                                // vertexBindingDivisorCount
-        &divisorDesc                                                      // pVertexBindingDivisors
-    }
-
-    const VkVertexInputBindingDescription binding =
-    {
-        0,                                                                // binding
-        sizeof(Vertex),                                                   // stride
-        VK_VERTEX_INPUT_RATE_INSTANCE                                     // inputRate
-    };
-
-    const VkPipelineVertexInputStateCreateInfo viInfo =
-    {
-        VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO,              // sType
-        &divisorInfo,                                                     // pNext
-        ...
-    };
-    //...
-----------------------------------------
-
-=== Version History
-
-  * Revision 1, 2017-12-04 (Vikram Kushwaha)
-    - First Version
-  * Revision 2, 2018-07-16 (Jason Ekstrand)
-    - Adjust the interaction between pname:divisor and pname:firstInstance
-      to match the OpenGL convention.
-    - Disallow divisors of zero.
-  * Revision 3, 2018-08-03 (Vikram Kushwaha)
-    - Allow a zero divisor.
-    - Add a physical device features structure to query/enable this feature.
diff --git a/registry/vulkan/appendices/VK_EXT_vertex_input_dynamic_state.txt b/registry/vulkan/appendices/VK_EXT_vertex_input_dynamic_state.txt
deleted file mode 100644
index 9cae1e9..0000000
--- a/registry/vulkan/appendices/VK_EXT_vertex_input_dynamic_state.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_vertex_input_dynamic_state.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-08-21
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Spencer Fricke, Samsung
-  - Stu Smith, AMD
-
-=== Description
-
-One of the states that contributes to the combinatorial explosion of
-pipeline state objects that need to be created, is the vertex input binding
-and attribute descriptions.
-By allowing them to be dynamic applications may reduce the number of
-pipeline objects they need to create.
-
-This extension adds dynamic state support for what is normally static state
-in slink:VkPipelineVertexInputStateCreateInfo.
-
-include::{generated}/interfaces/VK_EXT_vertex_input_dynamic_state.txt[]
-
-=== Version History
-
- * Revision 2, 2020-11-05 (Piers Daniell)
-   - Make slink:VkVertexInputBindingDescription2EXT extensible
-   - Add new slink:VkVertexInputAttributeDescription2EXT struct for the
-     pname:pVertexAttributeDescriptions parameter to
-     flink:vkCmdSetVertexInputEXT so it is also extensible
-
- * Revision 1, 2020-08-21 (Piers Daniell)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_EXT_video_decode_h264.txt b/registry/vulkan/appendices/VK_EXT_video_decode_h264.txt
deleted file mode 100644
index bb3c9b8..0000000
--- a/registry/vulkan/appendices/VK_EXT_video_decode_h264.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_video_decode_h264.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-03-29
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Chunbo Chen, Intel
-  - HoHin Lau, AMD
-  - Jake Beju, AMD
-  - Peter Fang, AMD
-  - Ping Liu, Intel
-  - Srinath Kumarapuram, NVIDIA
-  - Tony Zlatinski, NVIDIA
-
-include::{generated}/interfaces/VK_EXT_video_decode_h264.txt[]
-
-=== Version History
-
-  * Revision 1, 2018-6-11 (Peter Fang)
-    - Initial draft
-  * Revision 2, March 29 2021 (Tony Zlatinski)
-    - Spec and API Updates
-  * Revision 3, August 1 2021 (Srinath Kumarapuram)
-    - Rename `VkVideoDecodeH264FieldLayoutFlagsEXT` to
-     `VkVideoDecodeH264PictureLayoutFlagsEXT`,
-     `VkVideoDecodeH264FieldLayoutFlagBitsEXT` to
-     `VkVideoDecodeH264PictureLayoutFlagBitsEXT` (along with the names of
-     enumerants it defines), and `VkVideoDecodeH264ProfileEXT.fieldLayout`
-     to `VkVideoDecodeH264ProfileEXT.pictureLayout`, following Vulkan naming
-     conventions.
diff --git a/registry/vulkan/appendices/VK_EXT_video_decode_h265.txt b/registry/vulkan/appendices/VK_EXT_video_decode_h265.txt
deleted file mode 100644
index e13b4ae..0000000
--- a/registry/vulkan/appendices/VK_EXT_video_decode_h265.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_video_decode_h265.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-03-29
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - HoHin Lau, AMD
-  - Jake Beju, AMD
-  - Peter Fang, AMD
-  - Ping Liu, Intel
-  - Srinath Kumarapuram, NVIDIA
-  - Tony Zlatinski, NVIDIA
-
-include::{generated}/interfaces/VK_EXT_video_decode_h265.txt[]
-
-=== Version History
-
- * Revision 1, 2018-6-11 (Peter Fang)
-   - Initial draft
- * Revision 1.6, March 29 2021 (Tony Zlatinski)
-   - Spec and API updates.
diff --git a/registry/vulkan/appendices/VK_EXT_video_encode_h264.txt b/registry/vulkan/appendices/VK_EXT_video_encode_h264.txt
deleted file mode 100644
index 98092b4..0000000
--- a/registry/vulkan/appendices/VK_EXT_video_encode_h264.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_video_encode_h264.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-03-29
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Ahmed Abdelkhalek, AMD
-  - Daniel Rakos, AMD
-  - George Hao, AMD
-  - Jake Beju, AMD
-  - Peter Fang, AMD
-  - Ping Liu, Intel
-  - Srinath Kumarapuram, NVIDIA
-  - Tony Zlatinski, NVIDIA
-  - Yang Liu, AMD
-
-include::{generated}/interfaces/VK_EXT_video_encode_h264.txt[]
-
-=== Version History
-
-  * Revision 0, 2018-7-23 (Ahmed Abdelkhalek)
-    - Initial draft
-  * Revision 0.5, 2020-02-13 (Tony Zlatinski)
-    - General Spec cleanup
-    - Added DPB structures
-    - Change the VCL frame encode structure
-    - Added a common Non-VCL Picture Paramarameters structure
-  * Revision 1, 2021-03-29 (Tony Zlatinski)
-    - Spec and API updates
-  * Revision 2, August 1 2021 (Srinath Kumarapuram)
-    - Rename `VkVideoEncodeH264CapabilitiesFlagsEXT` to
-     `VkVideoEncodeH264CapabilityFlagsEXT` and
-     `VkVideoEncodeH264CapabilitiesFlagsEXT` to
-     `VkVideoEncodeH264CapabilityFlagsEXT`, following Vulkan naming
-     conventions.
diff --git a/registry/vulkan/appendices/VK_EXT_video_encode_h265.txt b/registry/vulkan/appendices/VK_EXT_video_encode_h265.txt
deleted file mode 100644
index f53b10b..0000000
--- a/registry/vulkan/appendices/VK_EXT_video_encode_h265.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_video_encode_h265.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-01-22
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Ahmed Abdelkhalek, AMD
-  - George Hao, AMD
-  - Jake Beju, AMD
-  - Chunbo Chen, Intel
-  - Ping Liu, Intel
-  - Srinath Kumarapuram, NVIDIA
-  - Tony Zlatinski, NVIDIA
-
-=== Description
-
-This extension allows applications to compress a raw video sequence by using
-the H.265/HEVC video compression standard.
-
-include::{generated}/interfaces/VK_EXT_video_encode_h265.txt[]
-
-=== Version History
-
- * Revision 0, 2019-11-14 (Ahmed Abdelkhalek)
-   - Initial draft
- * Revision 0.5, 2020-02-13 (Tony Zlatinski)
-   - General Spec cleanup
-   - Added DPB structures
-   - Change the VCL frame encode structure
-   - Added a common Non-VCL Picture Paramarameters structure
- * Revision 2, Oct 10 2021 (Srinath Kumarapuram)
-   - Vulkan Video Encode h.265 update and spec edits
diff --git a/registry/vulkan/appendices/VK_EXT_ycbcr_2plane_444_formats.txt b/registry/vulkan/appendices/VK_EXT_ycbcr_2plane_444_formats.txt
deleted file mode 100644
index 9a79339..0000000
--- a/registry/vulkan/appendices/VK_EXT_ycbcr_2plane_444_formats.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_ycbcr_2plane_444_formats.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-07-28
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Piers Daniell, NVIDIA
-  - Ping Liu, Intel
-
-=== Description
-
-This extension adds some {YCbCr} formats that are in common use for video
-encode and decode, but were not part of the
-`apiext:VK_KHR_sampler_ycbcr_conversion` extension.
-
-include::{generated}/interfaces/VK_EXT_ycbcr_2plane_444_formats.txt[]
-
-=== Version History
-
- * Revision 1, 2020-03-08 (Piers Daniell)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_EXT_ycbcr_image_arrays.txt b/registry/vulkan/appendices/VK_EXT_ycbcr_image_arrays.txt
deleted file mode 100644
index 9ae0abb..0000000
--- a/registry/vulkan/appendices/VK_EXT_ycbcr_image_arrays.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_EXT_ycbcr_image_arrays.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-01-15
-*Contributors*::
-  - Piers Daniell, NVIDIA
-
-=== Description
-
-This extension allows images of a format that requires
-<<formats-requiring-sampler-ycbcr-conversion, {YCbCr} conversion>> to be
-created with multiple array layers, which is otherwise restricted.
-
-include::{generated}/interfaces/VK_EXT_ycbcr_image_arrays.txt[]
-
-=== Version History
-
- * Revision 1, 2019-01-15 (Piers Daniell)
-   - Initial revision
-
diff --git a/registry/vulkan/appendices/VK_FUCHSIA_buffer_collection.txt b/registry/vulkan/appendices/VK_FUCHSIA_buffer_collection.txt
deleted file mode 100644
index 99862ad..0000000
--- a/registry/vulkan/appendices/VK_FUCHSIA_buffer_collection.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_FUCHSIA_buffer_collection.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-09-23
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Craig Stout, Google
-  - John Bauman, Google
-  - John Rosasco, Google
-
-=== Description
-A buffer collection is a collection of one or more buffers which were
-allocated together as a group and which all have the same properties.
-These properties describe the buffers’ internal representation such as its
-dimensions and memory layout.
-This ensures that all of the buffers can be used interchangeably by tasks
-that require swapping among multiple buffers, such as double-buffered
-graphics rendering.
-
-By sharing such a collection of buffers between components, communication
-about buffer lifecycle can be made much simpler and more efficient.
-For example, when a content producer finishes writing to a buffer, it can
-message the consumer of the buffer with the buffer index, rather than
-passing a handle to the shared memory.
-
-On Fuchsia, the Sysmem service uses buffer collections as a core construct
-in its design.
-VK_FUCHSIA_buffer_collection is the Vulkan extension that allows Vulkan
-applications to interoperate with the Sysmem service on Fuchsia.
-
-include::{generated}/interfaces/VK_FUCHSIA_buffer_collection.txt[]
-
-=== Issues
-
-1) When configuring a slink:VkImageConstraintsInfoFUCHSIA structure for
-constraint setting, should a NULL pname:pFormatConstraints parameter be
-allowed ?
-
-*RESOLVED*: No.
-Specifying a NULL pname:pFormatConstraints results in logical complexity of
-interpreting the relationship between the
-slink:VkImageCreateInfo::pname:usage settings of the elements of the
-pname:pImageCreateInfos array and the implied or desired
-tlink:VkFormatFeatureFlags.
-
-The explicit requirement for pname:pFormatConstraints to be non-NULL
-simplifies the implied logic of the implementation and expectations for the
-Vulkan application.
-
-=== Version History
-
-  * Revision 2, 2021-09-23 (John Rosasco)
-    - Review passes
-  * Revision 1, 2021-03-09 (John Rosasco)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_FUCHSIA_external_memory.txt b/registry/vulkan/appendices/VK_FUCHSIA_external_memory.txt
deleted file mode 100644
index 053d944..0000000
--- a/registry/vulkan/appendices/VK_FUCHSIA_external_memory.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2017-2021 Google Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_FUCHSIA_external_memory.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-03-01
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Craig Stout, Google
-  - John Bauman, Google
-  - John Rosasco, Google
-
-=== Description
-
-Vulkan apps may wish to export or import device memory handles to or from
-other logical devices, instances or APIs.
-
-This memory sharing can eliminate copies of memory buffers when different
-subsystems need to interoperate on them.
-Sharing memory buffers may also facilitate a better distribution of
-processing workload for more complex memory manipulation pipelines.
-
-include::{generated}/interfaces/VK_FUCHSIA_external_memory.txt[]
-
-=== Issues
-
-See `apiext:VK_KHR_external_memory` issues list for further information.
-
-=== Version History
-
-  * Revision 1, 2021-03-01 (John Rosasco)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_FUCHSIA_external_semaphore.txt b/registry/vulkan/appendices/VK_FUCHSIA_external_semaphore.txt
deleted file mode 100644
index d3c8740..0000000
--- a/registry/vulkan/appendices/VK_FUCHSIA_external_semaphore.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_FUCHSIA_external_semaphore.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-03-08
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Craig Stout, Google
-  - John Bauman, Google
-  - John Rosasco, Google
-
-=== Description
-
-An application using external memory may wish to synchronize access to that
-memory using semaphores.
-This extension enables an application to export semaphore payload to and
-import semaphore payload from Zircon event handles.
-
-include::{generated}/interfaces/VK_FUCHSIA_external_semaphore.txt[]
-
-=== Issues
-
-1) Does the application need to close the Zircon event handle returned by
-flink:vkGetSemaphoreZirconHandleFUCHSIA?
-
-*RESOLVED*: Yes, unless it is passed back in to a driver instance to import
-the semaphore.
-A successful get call transfers ownership of the Zircon event handle to the
-application, and a successful import transfers it back to the driver.
-Destroying the original semaphore object will not close the Zircon event
-handle nor remove its reference to the underlying semaphore resource
-associated with it.
-
-=== Version History
-
-  * Revision 1, 2021-03-08 (John Rosasco)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_FUCHSIA_imagepipe_surface.txt b/registry/vulkan/appendices/VK_FUCHSIA_imagepipe_surface.txt
deleted file mode 100644
index 9519f2f..0000000
--- a/registry/vulkan/appendices/VK_FUCHSIA_imagepipe_surface.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_FUCHSIA_imagepipe_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-07-27
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Craig Stout, Google
-  - Ian Elliott, Google
-  - Jesse Hall, Google
-
-=== Description
-
-The `VK_FUCHSIA_imagepipe_surface` extension is an instance extension.
-It provides a mechanism to create a slink:VkSurfaceKHR object (defined by
-the `apiext:VK_KHR_surface` extension) that refers to a Fuchsia
-code:imagePipeHandle.
-
-include::{generated}/interfaces/VK_FUCHSIA_imagepipe_surface.txt[]
-
-=== Version History
-
- * Revision 1, 2018-07-27 (Craig Stout)
-   - Initial draft.
diff --git a/registry/vulkan/appendices/VK_GGP_frame_token.txt b/registry/vulkan/appendices/VK_GGP_frame_token.txt
deleted file mode 100644
index e7a7f81..0000000
--- a/registry/vulkan/appendices/VK_GGP_frame_token.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_GGP_frame_token.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-01-28
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jean-Francois Roy, Google
-  - Richard O'Grady, Google
-
-=== Description
-
-This extension allows an application that uses the `apiext:VK_KHR_swapchain`
-extension in combination with a Google Games Platform surface provided by
-the `apiext:VK_GGP_stream_descriptor_surface` extension to associate a
-Google Games Platform frame token with a present operation.
-
-include::{generated}/interfaces/VK_GGP_frame_token.txt[]
-
-=== Version History
-
- * Revision 1, 2018-11-26 (Jean-Francois Roy)
-   - Initial revision.
diff --git a/registry/vulkan/appendices/VK_GGP_stream_descriptor_surface.txt b/registry/vulkan/appendices/VK_GGP_stream_descriptor_surface.txt
deleted file mode 100644
index 9fbeb80..0000000
--- a/registry/vulkan/appendices/VK_GGP_stream_descriptor_surface.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_GGP_stream_descriptor_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-01-28
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jean-Francois Roy, Google
-  - Brad Grantham, Google
-  - Connor Smith, Google
-  - Cort Stratton, Google
-  - Hai Nguyen, Google
-  - Ian Elliott, Google
-  - Jesse Hall, Google
-  - Jim Ray, Google
-  - Katherine Wu, Google
-  - Kaye Mason, Google
-  - Kuangye Guo, Google
-  - Mark Segal, Google
-  - Nicholas Vining, Google
-  - Paul Lalonde, Google
-  - Richard O'Grady, Google
-
-=== Description
-
-The `VK_GGP_stream_descriptor_surface` extension is an instance extension.
-It provides a mechanism to create a slink:VkSurfaceKHR object (defined by
-the `apiext:VK_KHR_surface` extension) that refers to a Google Games
-Platform code:GgpStreamDescriptor.
-
-include::{generated}/interfaces/VK_GGP_stream_descriptor_surface.txt[]
-
-=== Version History
-
- * Revision 1, 2018-11-26 (Jean-Francois Roy)
-   - Initial revision.
diff --git a/registry/vulkan/appendices/VK_GOOGLE_decorate_string.txt b/registry/vulkan/appendices/VK_GOOGLE_decorate_string.txt
deleted file mode 100644
index f6777a6..0000000
--- a/registry/vulkan/appendices/VK_GOOGLE_decorate_string.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2018-2020 Google LLC
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_GOOGLE_decorate_string.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-07-09
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/GOOGLE/SPV_GOOGLE_decorate_string.html[`SPV_GOOGLE_decorate_string`]
-*Contributors*::
-  - Hai Nguyen, Google
-  - Neil Henning, AMD
-
-=== Description
-
-The `VK_GOOGLE_decorate_string` extension allows use of the
-`SPV_GOOGLE_decorate_string` extension in SPIR-V shader modules.
-
-include::{generated}/interfaces/VK_GOOGLE_decorate_string.txt[]
-
-=== Version History
-
-  * Revision 1, 2018-07-09 (Neil Henning)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_GOOGLE_display_timing.txt b/registry/vulkan/appendices/VK_GOOGLE_display_timing.txt
deleted file mode 100644
index 046000b..0000000
--- a/registry/vulkan/appendices/VK_GOOGLE_display_timing.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_GOOGLE_display_timing.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-02-14
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Ian Elliott, Google
-  - Jesse Hall, Google
-
-=== Description
-
-This device extension allows an application that uses the
-`apiext:VK_KHR_swapchain` extension to obtain information about the
-presentation engine's display, to obtain timing information about each
-present, and to schedule a present to happen no earlier than a desired time.
-An application can use this to minimize various visual anomalies (e.g.
-stuttering).
-
-Traditional game and real-time animation applications need to correctly
-position their geometry for when the presentable image will be presented to
-the user.
-To accomplish this, applications need various timing information about the
-presentation engine's display.
-They need to know when presentable images were actually presented, and when
-they could have been presented.
-Applications also need to tell the presentation engine to display an image
-no sooner than a given time.
-This allows the application to avoid stuttering, so the animation looks
-smooth to the user.
-
-This extension treats variable-refresh-rate (VRR) displays as if they are
-fixed-refresh-rate (FRR) displays.
-
-include::{generated}/interfaces/VK_GOOGLE_display_timing.txt[]
-
-=== Examples
-
-[NOTE]
-.Note
-====
-The example code for the this extension (like the `apiext:VK_KHR_surface`
-and `VK_GOOGLE_display_timing` extensions) is contained in the cube demo
-that is shipped with the official Khronos SDK, and is being kept up-to-date
-in that location (see:
-https://github.com/KhronosGroup/Vulkan-Tools/blob/master/cube/cube.c ).
-====
-
-=== Version History
-
- * Revision 1, 2017-02-14 (Ian Elliott)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_GOOGLE_hlsl_functionality1.txt b/registry/vulkan/appendices/VK_GOOGLE_hlsl_functionality1.txt
deleted file mode 100644
index c8774b7..0000000
--- a/registry/vulkan/appendices/VK_GOOGLE_hlsl_functionality1.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2018-2020 Google LLC
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_GOOGLE_hlsl_functionality1.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-07-09
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/GOOGLE/SPV_GOOGLE_hlsl_functionality1.html[`SPV_GOOGLE_hlsl_functionality1`]
-*Contributors*::
-  - Hai Nguyen, Google
-  - Neil Henning, AMD
-
-=== Description
-
-The `VK_GOOGLE_hlsl_functionality1` extension allows use of the
-`SPV_GOOGLE_hlsl_functionality1` extension in SPIR-V shader modules.
-
-include::{generated}/interfaces/VK_GOOGLE_hlsl_functionality1.txt[]
-
-=== Version History
-
-  * Revision 1, 2018-07-09 (Neil Henning)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_GOOGLE_user_type.txt b/registry/vulkan/appendices/VK_GOOGLE_user_type.txt
deleted file mode 100644
index bfb6333..0000000
--- a/registry/vulkan/appendices/VK_GOOGLE_user_type.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2019-2020 Google LLC
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_GOOGLE_user_type.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-07-09
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/GOOGLE/SPV_GOOGLE_user_type.asciidoc[`SPV_GOOGLE_user_type`]
-*Contributors*::
-  - Kaye Mason, Google
-  - Hai Nguyen, Google
-
-=== Description
-
-The `VK_GOOGLE_user_type` extension allows use of the `SPV_GOOGLE_user_type`
-extension in SPIR-V shader modules.
-
-include::{generated}/interfaces/VK_GOOGLE_user_type.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-09-07 (Kaye Mason)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_HUAWEI_invocation_mask.txt b/registry/vulkan/appendices/VK_HUAWEI_invocation_mask.txt
deleted file mode 100644
index a822892..0000000
--- a/registry/vulkan/appendices/VK_HUAWEI_invocation_mask.txt
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) 2021 Huawei Technologies Co. Ltd.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_HUAWEI_invocation_mask.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-05-27
-*Interactions and External Dependencies*::
-  - This extension requires `apiext:VK_KHR_ray_tracing_pipeline`, which
-    allow to bind an invocation mask image before the ray tracing command
-  - This extension requires `apiext:VK_KHR_synchronization2`, which allows
-    new pipeline stage for the invocation mask image
-*Contributors*::
-  - Yunpeng Zhu, HuaWei
-
-=== Description
-
-The rays to trace may be sparse in some use cases.
-For example, the scene only have a few regions to reflect.
-Providing an invocation mask image to the ray tracing commands could
-potentially give the hardware the hint to do certain optimization without
-invoking an additional pass to compact the ray buffer.
-
-include::{generated}/interfaces/VK_HUAWEI_invocation_mask.txt[]
-
-=== Examples
-
-RT mask is updated before each traceRay.
-
-Step 1.
-Generate InvocationMask.
-
-[source,c]
----------------------------------------------------
-//the rt mask image bind as color attachment in the fragment shader
-Layout(location = 2) out vec4 outRTmask
-vec4 mask = vec4(x,x,x,x);
-outRTmask = mask;
----------------------------------------------------
-
-Step 2.
-traceRay with InvocationMask
-
-[source,c]
----------------------------------------------------
-vkCmdBindPipeline(
-    commandBuffers[imageIndex],
-    VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, m_rtPipeline);
-    vkCmdBindDescriptorSets(commandBuffers[imageIndex],
-    VK_PIPELINE_BIND_POINT_RAY_TRACING_NV,
-    m_rtPipelineLayout, 0, 1, &m_rtDescriptorSet,
-    0, nullptr);
-
-vkCmdBindInvocationMaskHUAWEI(
-    commandBuffers[imageIndex],
-    InvocationMaskimageView,
-    InvocationMaskimageLayout);
-    vkCmdTraceRaysKHR(commandBuffers[imageIndex],
-    pRaygenShaderBindingTable,
-    pMissShaderBindingTable,
-    swapChainExtent.width,
-    swapChainExtent.height, 1);
----------------------------------------------------
-
-=== Version History
-
- * Revision 1, 2021-05-27 (Yunpeng Zhu)
-   - Initial draft.
diff --git a/registry/vulkan/appendices/VK_HUAWEI_subpass_shading.txt b/registry/vulkan/appendices/VK_HUAWEI_subpass_shading.txt
deleted file mode 100644
index 26d3047..0000000
--- a/registry/vulkan/appendices/VK_HUAWEI_subpass_shading.txt
+++ /dev/null
@@ -1,260 +0,0 @@
-// Copyright (c) 2020-2024 Huawei Technologies Co. Ltd.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_HUAWEI_subpass_shading.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-06-01
-*Interactions and External Dependencies*::
-  - This extension requires
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/huawei/GLSL_HUAWEI_subpass_shading.txt[`GL_HUAWEI_subpass_shading`].
-  - This extension requires
-    {spirv}/HUAWEI/SPV_HUAWEI_subpass_shading.html[`SPV_HUAWEI_subpass_shading`].
-*Contributors*::
-  - Hueilong Wang
-
-=== Description
-
-This extension allows applications to execute a subpass shading pipeline in
-a subpass of a render pass in order to save memory bandwidth for algorithms
-like tile-based deferred rendering and forward plus.
-A subpass shading pipeline is a pipeline with the compute pipeline ability,
-allowed to read values from input attachments, and only allowed to be
-dispatched inside a stand-alone subpass.
-Its work dimension is defined by the render pass's render area size.
-Its workgroup size (width, height) shall be a power-of-two number in width
-or height, with minimum value from 8, and maximum value shall be decided
-from the render pass attachments and sample counts but depends on
-implementation.
-
-The code:GlobalInvocationId.xy of a subpass shading pipeline is equal to the
-code:FragCoord.xy of a graphic pipeline in the same render pass subtracted
-the <<VkRect2D,pname:offset>> of the
-slink:VkRenderPassBeginInfo::code:renderArea.
-code:GlobalInvocationId.z is mapped to the Layer if
-`apiext:VK_EXT_shader_viewport_index_layer` is supported.
-The code:GlobalInvocationId.xy is equal to the index of the local workgroup
-multiplied by the size of the local workgroup plus the
-code:LocalInvocationId and the <<VkRect2D,pname:offset>> of the
-slink:VkRenderPassBeginInfo::code:renderArea.
-
-This extension allows a subpass's pipeline bind point to be
-ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI.
-
-include::{generated}/interfaces/VK_HUAWEI_subpass_shading.txt[]
-
-
-=== Sample Code
-
-Example of subpass shading in a GLSL shader
-
-[source,c]
----------------------------------------------------
-#extension GL_HUAWEI_subpass_shading: enable
-#extension GL_KHR_shader_subgroup_arithmetic: enable
-
-layout(constant_id = 0) const uint tileWidth = 8;
-layout(constant_id = 1) const uint tileHeight = 8;
-layout(local_size_x_id = 0, local_size_y_id = 1, local_size_z = 1) in;
-layout (set=0, binding=0, input_attachment_index=0) uniform subpassInput depth;
-
-void main()
-{
-  float d = subpassLoad(depth).x;
-  float minD = subgroupMin(d);
-  float maxD = subgroupMax(d);
-}
----------------------------------------------------
-
-Example of subpass shading dispatching in a subpass
-
-[source,c]
----------------------------------------------------
-vkCmdNextSubpass(commandBuffer, VK_SUBPASS_CONTENTS_INLINE);
-vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI, subpassShadingPipeline);
-vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI, subpassShadingPipelineLayout,
-  firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
-vkCmdSubpassShadingHUAWEI(commandBuffer)
-vkCmdEndRenderPass(commandBuffer);
----------------------------------------------------
-
-Example of subpass shading render pass creation
-
-[source,c]
----------------------------------------------------
-VkAttachmentDescription2 attachments[] = {
-  {
-    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, NULL,
-    0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
-    VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_DONT_CARE,
-    VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_LOAD_OP_DONT_CARE,
-    VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-  },
-  {
-    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, NULL,
-    0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
-    VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_DONT_CARE,
-    VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_LOAD_OP_DONT_CARE,
-    VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-  },
-  {
-    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, NULL,
-    0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
-    VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_DONT_CARE,
-    VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_LOAD_OP_DONT_CARE,
-    VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-  },
-  {
-    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, NULL,
-    0, VK_FORMAT_D24_UNORM_S8_UINT, VK_SAMPLE_COUNT_1_BIT,
-    VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_DONT_CARE,
-    VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_LOAD_OP_DONT_CARE,
-    VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
-  },
-  {
-    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2, NULL,
-    0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
-    VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE,
-    VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_LOAD_OP_DONT_CARE,
-    VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-  }
-};
-
-VkAttachmentReference2 gBufferAttachmentReferences[] = {
-  { VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, NULL, 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT },
-  { VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, NULL, 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT },
-  { VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, NULL, 2, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT }
-};
-VkAttachmentReference2 gBufferDepthStencilAttachmentReferences =
-  { VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, NULL, 3, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT };
-VkAttachmentReference2 depthInputAttachmentReferences[] = {
-  { VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, NULL, 3, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT };
-};
-VkAttachmentReference2 preserveAttachmentReferences[] = {
-  { VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, NULL, 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT },
-  { VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, NULL, 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT },
-  { VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, NULL, 2, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT },
-  { VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, NULL, 3, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT }
-}; // G buffer including depth/stencil
-VkAttachmentReference2 colorAttachmentReferences[] = {
-  { VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, NULL, 4, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT }
-};
-VkAttachmentReference2 resolveAttachmentReference =
-  { VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, NULL, 4, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_ASPECT_COLOR_BIT };
-
-VkSubpassDescription2 subpasses[] = {
-  {
-    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2, NULL, 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0,
-    0, NULL, // input
-    sizeof(gBufferAttachmentReferences)/sizeof(gBufferAttachmentReferences[0]), gBufferAttachmentReferences, // color
-    NULL, &gBufferDepthStencilAttachmentReferences, // resolve & DS
-    0, NULL
-  },
-  {
-    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2, NULL, 0, VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI , 0,
-    sizeof(depthInputAttachmentReferences)/sizeof(depthInputAttachmentReferences[0]), depthInputAttachmentReferences, // input
-    0, NULL, // color
-    NULL, NULL, // resolve & DS
-    sizeof(preserveAttachmentReferences)/sizeof(preserveAttachmentReferences[0]), preserveAttachmentReferences,
-  },
-  {
-    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2, NULL, 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0,
-    sizeof(gBufferAttachmentReferences)/sizeof(gBufferAttachmentReferences[0]), gBufferAttachmentReferences, // input
-    sizeof(colorAttachmentReferences)/sizeof(colorAttachmentReferences[0]), colorAttachmentReferences, // color
-    &resolveAttachmentReference, &gBufferDepthStencilAttachmentReferences, // resolve & DS
-    0, NULL
-  },
-};
-
-VkMemoryBarrier2KHR fragmentToSubpassShading = {
-  VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR, NULL,
-  VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT|VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
-  VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI, VK_ACCESS_INPUT_ATTACHMENT_READ_BIT
-};
-
-VkMemoryBarrier2KHR subpassShadingToFragment = {
-  VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR, NULL,
-  VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI, VK_ACCESS_SHADER_WRITE_BIT,
-  VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR, VK_ACCESS_SHADER_READ_BIT
-};
-
-VkSubpassDependency2 dependencies[] = {
-  {
-    VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2, &fragmentToSubpassShading,
-    0, 1,
-    0, 0, 0, 0,
-    0, 0
-  },
-  {
-    VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2, &subpassShadingToFragment,
-    1, 2,
-    0, 0, 0, 0,
-    0, 0
-  },
-};
-
-VkRenderPassCreateInfo2 renderPassCreateInfo = {
-  VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2, NULL, 0,
-    sizeof(attachments)/sizeof(attachments[0]), attachments,
-    sizeof(subpasses)/sizeof(subpasses[0]), subpasses,
-    sizeof(dependencies)/sizeof(dependencies[0]), dependencies,
-    0, NULL
-};
-VKRenderPass renderPass;
-vkCreateRenderPass2(device, &renderPassCreateInfo, NULL, &renderPass);
----------------------------------------------------
-
-Example of subpass shading pipeline creation
-
-[source,c]
----------------------------------------------------
-VkExtent2D maxWorkgroupSize;
-
-VkSpecializationMapEntry subpassShadingConstantMapEntries[] = {
-  { 0, 0 * sizeof(uint32_t), sizeof(uint32_t) },
-  { 1, 1 * sizeof(uint32_t), sizeof(uint32_t) }
-};
-
-VkSpecializationInfo subpassShadingConstants = {
-  2, subpassShadingConstantMapEntries,
-  sizeof(VkExtent2D), &maxWorkgroupSize
-};
-
-VkSubpassShadingPipelineCreateInfoHUAWEI subpassShadingPipelineCreateInfo {
-  VK_STRUCTURE_TYPE_SUBPASSS_SHADING_PIPELINE_CREATE_INFO_HUAWEI, NULL,
-  renderPass, 1
-};
-
-VkPipelineShaderStageCreateInfo subpassShadingPipelineStageCreateInfo {
-  VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, NULL,
-  0, VK_SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI,
-  shaderModule, "main",
-  &subpassShadingConstants
-};
-
-VkComputePipelineCreateInfo subpassShadingComputePipelineCreateInfo = {
-  VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, &subpassShadingPipelineCreateInfo,
-  0, &subpassShadingPipelineStageCreateInfo,
-  pipelineLayout, basePipelineHandle, basePipelineIndex
-};
-
-VKPipeline pipeline;
-
-vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI(device, renderPass, &maxWorkgroupSize);
-vkCreateComputePipelines(device, pipelineCache, 1, &subpassShadingComputePipelineCreateInfo, NULL, &pipeline);
-
----------------------------------------------------
-
-
-=== Version History
-
-  * Revision 2, 2021-06-28 (Hueilong Wang)
-    - Change vkGetSubpassShadingMaxWorkgroupSizeHUAWEI to
-      vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI to resolve issue
-      https://github.com/KhronosGroup/Vulkan-Docs/issues/1564[`pub1564`]
-  * Revision 1, 2020-12-15 (Hueilong Wang)
-    - Initial draft.
-
diff --git a/registry/vulkan/appendices/VK_IMG_filter_cubic.txt b/registry/vulkan/appendices/VK_IMG_filter_cubic.txt
deleted file mode 100644
index f1747c3..0000000
--- a/registry/vulkan/appendices/VK_IMG_filter_cubic.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2016-2020 Imagination Technologies Limited
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_IMG_filter_cubic.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-02-23
-*Contributors*::
-  - Tobias Hector, Imagination Technologies
-
-=== Description
-
-`VK_IMG_filter_cubic` adds an additional, high quality cubic filtering mode
-to Vulkan, using a Catmull-Rom bicubic filter.
-Performing this kind of filtering can be done in a shader by using 16
-samples and a number of instructions, but this can be inefficient.
-The cubic filter mode exposes an optimized high quality texture sampling
-using fixed texture sampling functionality.
-
-include::{generated}/interfaces/VK_IMG_filter_cubic.txt[]
-
-=== Example
-
-Creating a sampler with the new filter for both magnification and
-minification
-
-[source,c++]
-----------------------------------------
-    VkSamplerCreateInfo createInfo =
-    {
-        VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO // sType
-        // Other members set to application-desired values
-    };
-
-    createInfo.magFilter = VK_FILTER_CUBIC_IMG;
-    createInfo.minFilter = VK_FILTER_CUBIC_IMG;
-
-    VkSampler sampler;
-    VkResult result = vkCreateSampler(
-        device,
-        &createInfo,
-        &sampler);
-----------------------------------------
-
-=== Version History
-
- * Revision 1, 2016-02-23 (Tobias Hector)
-   - Initial version
-
diff --git a/registry/vulkan/appendices/VK_IMG_format_pvrtc.txt b/registry/vulkan/appendices/VK_IMG_format_pvrtc.txt
deleted file mode 100644
index a6e504e..0000000
--- a/registry/vulkan/appendices/VK_IMG_format_pvrtc.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2019-2020 Imagination Technologies Limited
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_IMG_format_pvrtc.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-09-02
-*IP Status*::
-    Imagination Technologies Proprietary
-*Contributors*::
-  - Stuart Smith, Imagination Technologies
-
-=== Description
-
-`VK_IMG_format_pvrtc` provides additional texture compression functionality
-specific to Imagination Technologies PowerVR Texture compression format
-(called PVRTC).
-
-include::{generated}/interfaces/VK_IMG_format_pvrtc.txt[]
-
-=== Version History
-
- * Revision 1, 2019-09-02 (Stuart Smith)
-   - Initial version
-
diff --git a/registry/vulkan/appendices/VK_INTEL_performance_query.txt b/registry/vulkan/appendices/VK_INTEL_performance_query.txt
deleted file mode 100644
index 723710f..0000000
--- a/registry/vulkan/appendices/VK_INTEL_performance_query.txt
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright (c) 2018-2020 Intel Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_INTEL_performance_query.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-05-16
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Lionel Landwerlin, Intel
-  - Piotr Maciejewski, Intel
-
-=== Description
-
-This extension allows an application to capture performance data to be
-interpreted by a external application or library.
-
-Such a library is available at : https://github.com/intel/metrics-discovery
-
-Performance analysis tools such as
-link:++https://software.intel.com/content/www/us/en/develop/tools/graphics-performance-analyzers.html++[Graphics
-Performance Analyzers] make use of this extension and the metrics-discovery
-library to present the data in a human readable way.
-
-include::{generated}/interfaces/VK_INTEL_performance_query.txt[]
-
-=== Example Code
-
-[source,c]
----------------------------------------------------
-
-// A previously created device
-VkDevice device;
-
-// A queue derived from the device
-VkQueue queue;
-
-VkInitializePerformanceApiInfoINTEL performanceApiInfoIntel = {
-  VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL,
-  NULL,
-  NULL
-};
-
-vkInitializePerformanceApiINTEL(
-  device,
-  &performanceApiInfoIntel);
-
-VkQueryPoolPerformanceQueryCreateInfoINTEL queryPoolIntel = {
-  VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL,
-  NULL,
-  VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL,
-};
-
-VkQueryPoolCreateInfo queryPoolCreateInfo = {
-  VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
-  &queryPoolIntel,
-  0,
-  VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL,
-  1,
-  0
-};
-
-VkQueryPool queryPool;
-
-VkResult result = vkCreateQueryPool(
-  device,
-  &queryPoolCreateInfo,
-  NULL,
-  &queryPool);
-
-assert(VK_SUCCESS == result);
-
-// A command buffer we want to record counters on
-VkCommandBuffer commandBuffer;
-
-VkCommandBufferBeginInfo commandBufferBeginInfo = {
-  VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
-  NULL,
-  VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
-  NULL
-};
-
-result = vkBeginCommandBuffer(commandBuffer, &commandBufferBeginInfo);
-
-assert(VK_SUCCESS == result);
-
-vkCmdResetQueryPool(
-  commandBuffer,
-  queryPool,
-  0,
-  1);
-
-vkCmdBeginQuery(
-  commandBuffer,
-  queryPool,
-  0,
-  0);
-
-// Perform the commands you want to get performance information on
-// ...
-
-// Perform a barrier to ensure all previous commands were complete before
-// ending the query
-vkCmdPipelineBarrier(commandBuffer,
-  VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
-  VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
-  0,
-  0,
-  NULL,
-  0,
-  NULL,
-  0,
-  NULL);
-
-vkCmdEndQuery(
-  commandBuffer,
-  queryPool,
-  0);
-
-result = vkEndCommandBuffer(commandBuffer);
-
-assert(VK_SUCCESS == result);
-
-VkPerformanceConfigurationAcquireInfoINTEL performanceConfigurationAcquireInfo = {
-  VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL,
-  NULL,
-  VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL
-};
-
-VkPerformanceConfigurationINTEL performanceConfigurationIntel;
-
-result = vkAcquirePerformanceConfigurationINTEL(
-  device,
-  &performanceConfigurationAcquireInfo,
-  &performanceConfigurationIntel);
-
-vkQueueSetPerformanceConfigurationINTEL(queue, performanceConfigurationIntel);
-
-assert(VK_SUCCESS == result);
-
-// Submit the command buffer and wait for its completion
-// ...
-
-result = vkReleasePerformanceConfigurationINTEL(
-  device,
-  performanceConfigurationIntel);
-
-assert(VK_SUCCESS == result);
-
-// Get the report size from metrics-discovery's QueryReportSize
-
-result = vkGetQueryPoolResults(
-  device,
-  queryPool,
-  0, 1, QueryReportSize,
-  data, QueryReportSize, 0);
-
-assert(VK_SUCCESS == result);
-
-// The data can then be passed back to metrics-discovery from which
-// human readable values can be queried.
-
----------------------------------------------------
-
-=== Version History
-
- * Revision 2, 2020-03-06 (Lionel Landwerlin)
-   - Rename VkQueryPoolCreateInfoINTEL in
-     VkQueryPoolPerformanceQueryCreateInfoINTEL
-
- * Revision 1, 2018-05-16 (Lionel Landwerlin)
-   - Initial revision
diff --git a/registry/vulkan/appendices/VK_INTEL_shader_integer_functions2.txt b/registry/vulkan/appendices/VK_INTEL_shader_integer_functions2.txt
deleted file mode 100644
index 1a5f53e..0000000
--- a/registry/vulkan/appendices/VK_INTEL_shader_integer_functions2.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2019-2020 Intel Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_INTEL_shader_integer_functions2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-04-30
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Ian Romanick, Intel
-  - Ben Ashbaugh, Intel
-
-=== Description
-
-This extension adds support for several new integer instructions in SPIR-V
-for use in graphics shaders.
-Many of these instructions have pre-existing counterparts in the Kernel
-environment.
-
-The added integer functions are defined by the
-{spirv}/INTEL/SPV_INTEL_shader_integer_functions2.html[`SPV_INTEL_shader_integer_functions`]
-SPIR-V extension and can be used with the GL_INTEL_shader_integer_functions2
-GLSL extension.
-
-include::{generated}/interfaces/VK_INTEL_shader_integer_functions2.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-IntegerFunctions2INTEL,IntegerFunctions2INTEL>>
-
-=== Version History
-
- * Revision 1, 2019-04-30 (Ian Romanick)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_KHR_16bit_storage.txt b/registry/vulkan/appendices/VK_KHR_16bit_storage.txt
deleted file mode 100644
index bce8665..0000000
--- a/registry/vulkan/appendices/VK_KHR_16bit_storage.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_16bit_storage.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-09-05
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_16bit_storage.html[`SPV_KHR_16bit_storage`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_shader_16bit_storage.txt[`GL_EXT_shader_16bit_storage`]
-*Contributors*::
-  - Alexander Galazin, ARM
-  - Jan-Harald Fredriksen, ARM
-  - Joerg Wagner, ARM
-  - Neil Henning, Codeplay
-  - Jeff Bolz, Nvidia
-  - Daniel Koch, Nvidia
-  - David Neto, Google
-  - John Kessenich, Google
-
-=== Description
-
-The `VK_KHR_16bit_storage` extension allows use of 16-bit types in shader
-input and output interfaces, and push constant blocks.
-This extension introduces several new optional features which map to SPIR-V
-capabilities and allow access to 16-bit data in code:Block-decorated objects
-in the code:Uniform and the code:StorageBuffer storage classes, and objects
-in the code:PushConstant storage class.
-This extension allows 16-bit variables to be declared and used as
-user-defined shader inputs and outputs but does not change location
-assignment and component assignment rules.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-However, if Vulkan 1.1 is supported and this extension is not, the
-code:storageBuffer16BitAccess capability is optional.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_16bit_storage.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-StorageBuffer16BitAccess,
-    code:StorageBuffer16BitAccess>>
-  * <<spirvenv-capabilities-table-UniformAndStorageBuffer16BitAccess,
-    code:UniformAndStorageBuffer16BitAccess>>
-  * <<spirvenv-capabilities-table-StoragePushConstant16,
-    code:StoragePushConstant16>>
-  * <<spirvenv-capabilities-table-StorageInputOutput16,
-    code:StorageInputOutput16>>
-
-=== Version History
-
-  * Revision 1, 2017-03-23 (Alexander Galazin)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_KHR_8bit_storage.txt b/registry/vulkan/appendices/VK_KHR_8bit_storage.txt
deleted file mode 100644
index 44f84d3..0000000
--- a/registry/vulkan/appendices/VK_KHR_8bit_storage.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_8bit_storage.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-02-05
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_8bit_storage.html[`SPV_KHR_8bit_storage`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_shader_16bit_storage.txt[`GL_EXT_shader_16bit_storage`]
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Alexander Galazin, Arm
-
-=== Description
-
-The `VK_KHR_8bit_storage` extension allows use of 8-bit types in uniform and
-storage buffers, and push constant blocks.
-This extension introduces several new optional features which map to SPIR-V
-capabilities and allow access to 8-bit data in code:Block-decorated objects
-in the code:Uniform and the code:StorageBuffer storage classes, and objects
-in the code:PushConstant storage class.
-
-The code:StorageBuffer8BitAccess capability must: be supported by all
-implementations of this extension.
-The other capabilities are optional.
-
-=== Promotion to Vulkan 1.2
-
-Functionality in this extension is included in core Vulkan 1.2, with the KHR
-suffix omitted.
-However, if Vulkan 1.2 is supported and this extension is not, the
-code:StorageBuffer8BitAccess capability is optional.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_8bit_storage.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-StorageBuffer8BitAccess,
-    code:StorageBuffer8BitAccess>>
-  * <<spirvenv-capabilities-table-UniformAndStorageBuffer8BitAccess,
-    code:UniformAndStorageBuffer8BitAccess>>
-  * <<spirvenv-capabilities-table-StoragePushConstant8,
-    code:StoragePushConstant8>>
-
-=== Version History
-
-  * Revision 1, 2018-02-05 (Alexander Galazin)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_KHR_acceleration_structure.txt b/registry/vulkan/appendices/VK_KHR_acceleration_structure.txt
deleted file mode 100644
index a911305..0000000
--- a/registry/vulkan/appendices/VK_KHR_acceleration_structure.txt
+++ /dev/null
@@ -1,545 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_acceleration_structure.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-09-30
-*Contributors*::
-  - Samuel Bourasseau, Adobe
-  - Matthäus Chajdas, AMD
-  - Greg Grebe, AMD
-  - Nicolai Hähnle, AMD
-  - Tobias Hector, AMD
-  - Dave Oldcorn, AMD
-  - Skyler Saleh, AMD
-  - Mathieu Robart, Arm
-  - Marius Bjorge, Arm
-  - Tom Olson, Arm
-  - Sebastian Tafuri, EA
-  - Henrik Rydgard, Embark
-  - Juan Cañada, Epic Games
-  - Patrick Kelly, Epic Games
-  - Yuriy O'Donnell, Epic Games
-  - Michael Doggett, Facebook/Oculus
-  - Ricardo Garcia, Igalia
-  - Andrew Garrard, Imagination
-  - Don Scorgie, Imagination
-  - Dae Kim, Imagination
-  - Joshua Barczak, Intel
-  - Slawek Grajewski, Intel
-  - Jeff Bolz, NVIDIA
-  - Pascal Gautron, NVIDIA
-  - Daniel Koch, NVIDIA
-  - Christoph Kubisch, NVIDIA
-  - Ashwin Lele, NVIDIA
-  - Robert Stepinski, NVIDIA
-  - Martin Stich, NVIDIA
-  - Nuno Subtil, NVIDIA
-  - Eric Werness, NVIDIA
-  - Jon Leech, Khronos
-  - Jeroen van Schijndel, OTOY
-  - Juul Joosten, OTOY
-  - Alex Bourd, Qualcomm
-  - Roman Larionov, Qualcomm
-  - David McAllister, Qualcomm
-  - Lewis Gordon, Samsung
-  - Ralph Potter, Samsung
-  - Jasper Bekkers, Traverse Research
-  - Jesse Barker, Unity
-  - Baldur Karlsson, Valve
-
-=== Description
-
-In order to be efficient, rendering techniques such as ray tracing need a
-quick way to identify which primitives may be intersected by a ray
-traversing the geometries.
-Acceleration structures are the most common way to represent the geometry
-spatially sorted, in order to quickly identify such potential intersections.
-
-This extension adds new functionalities:
-
-  * Acceleration structure objects and build commands
-  * Structures to describe geometry inputs to acceleration structure builds
-  * Acceleration structure copy commands
-
-
-include::{generated}/interfaces/VK_KHR_acceleration_structure.txt[]
-
-
-=== Issues
-
-(1) How does this extension differ from VK_NV_ray_tracing?
---
-*DISCUSSION*:
-
-The following is a summary of the main functional differences between
-VK_KHR_acceleration_structure and VK_NV_ray_tracing:
-
-  * added acceleration structure serialization / deserialization
-    (ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR,
-    ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR,
-    flink:vkCmdCopyAccelerationStructureToMemoryKHR,
-    flink:vkCmdCopyMemoryToAccelerationStructureKHR)
-  * document <<acceleration-structure-inactive-prims,inactive primitives and
-    instances>>
-  * added slink:VkPhysicalDeviceAccelerationStructureFeaturesKHR structure
-  * added indirect and batched acceleration structure builds
-    (flink:vkCmdBuildAccelerationStructuresIndirectKHR)
-  * added <<host-acceleration-structure,host acceleration structure>>
-    commands
-  * reworked geometry structures so they could be better shared between
-    device, host, and indirect builds
-  * explicitly made slink:VkAccelerationStructureKHR use device addresses
-  * added acceleration structure compatibility check function
-    (flink:vkGetDeviceAccelerationStructureCompatibilityKHR)
-  * add parameter for requesting memory requirements for host and/or device
-    build
-  * added format feature for acceleration structure build vertex formats
-    (ename:VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR)
---
-
-ifdef::VK_NV_ray_tracing[]
-(2) Can you give a more detailed comparision of differences and similarities
-between VK_NV_ray_tracing and VK_KHR_acceleration_structure?
---
-*DISCUSSION*:
-
-The following is a more detailed comparision of which commands, structures,
-and enums are aliased, changed, or removed.
-
-  * Aliased functionality -- enums, structures, and commands that are
-    considered equivalent:
-  ** elink:VkGeometryTypeNV {harr} elink:VkGeometryTypeKHR
-  ** elink:VkAccelerationStructureTypeNV {harr}
-     elink:VkAccelerationStructureTypeKHR
-  ** elink:VkCopyAccelerationStructureModeNV {harr}
-     elink:VkCopyAccelerationStructureModeKHR
-  ** tlink:VkGeometryFlagsNV {harr} tlink:VkGeometryFlagsKHR
-  ** elink:VkGeometryFlagBitsNV {harr} elink:VkGeometryFlagBitsKHR
-  ** tlink:VkGeometryInstanceFlagsNV {harr} tlink:VkGeometryInstanceFlagsKHR
-  ** elink:VkGeometryInstanceFlagBitsNV {harr}
-     elink:VkGeometryInstanceFlagBitsKHR
-  ** tlink:VkBuildAccelerationStructureFlagsNV {harr}
-     tlink:VkBuildAccelerationStructureFlagsKHR
-  ** elink:VkBuildAccelerationStructureFlagBitsNV {harr}
-     elink:VkBuildAccelerationStructureFlagBitsKHR
-  ** slink:VkTransformMatrixNV {harr} slink:VkTransformMatrixKHR (added to
-     VK_NV_ray_tracing for descriptive purposes)
-  ** slink:VkAabbPositionsNV {harr} slink:VkAabbPositionsKHR (added to
-     VK_NV_ray_tracing for descriptive purposes)
-  ** slink:VkAccelerationStructureInstanceNV {harr}
-     slink:VkAccelerationStructureInstanceKHR (added to VK_NV_ray_tracing
-     for descriptive purposes)
-
-  * Changed enums, structures, and commands:
-  ** renamed ename:VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV ->
-     ename:VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR in
-     elink:VkGeometryInstanceFlagBitsKHR
-  ** slink:VkGeometryTrianglesNV ->
-     slink:VkAccelerationStructureGeometryTrianglesDataKHR (device or host
-     address instead of buffer+offset)
-  ** slink:VkGeometryAABBNV ->
-     slink:VkAccelerationStructureGeometryAabbsDataKHR (device or host
-     address instead of buffer+offset)
-  ** slink:VkGeometryDataNV -> slink:VkAccelerationStructureGeometryDataKHR
-     (union of triangle/aabbs/instances)
-  ** slink:VkGeometryNV -> slink:VkAccelerationStructureGeometryKHR (changed
-     type of geometry)
-  ** slink:VkAccelerationStructureCreateInfoNV ->
-     slink:VkAccelerationStructureCreateInfoKHR (reshuffle geometry
-     layout/information)
-  ** slink:VkPhysicalDeviceRayTracingPropertiesNV ->
-     slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR (for
-     acceleration structure properties, renamed pname:maxTriangleCount to
-     pname:maxPrimitiveCount, added per stage and update after bind limits)
-     and slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR (for ray
-     tracing pipeline properties)
-  ** slink:VkAccelerationStructureMemoryRequirementsInfoNV (deleted -
-     replaced by allocating on top of slink:VkBuffer)
-  ** slink:VkWriteDescriptorSetAccelerationStructureNV ->
-     slink:VkWriteDescriptorSetAccelerationStructureKHR (different
-     acceleration structure type)
-  ** flink:vkCreateAccelerationStructureNV ->
-     flink:vkCreateAccelerationStructureKHR (device address, different
-     geometry layout/information)
-  ** flink:vkGetAccelerationStructureMemoryRequirementsNV (deleted -
-     replaced by allocating on top of slink:VkBuffer)
-  ** flink:vkCmdBuildAccelerationStructureNV ->
-     flink:vkCmdBuildAccelerationStructuresKHR (params moved to structs,
-     layout differences)
-  ** flink:vkCmdCopyAccelerationStructureNV ->
-     flink:vkCmdCopyAccelerationStructureKHR (params to struct, extendable)
-  ** flink:vkGetAccelerationStructureHandleNV ->
-     flink:vkGetAccelerationStructureDeviceAddressKHR (device address
-     instead of handle)
-  ** elink:VkAccelerationStructureMemoryRequirementsTypeNV -> size queries
-     for scratch space moved to
-     flink:vkGetAccelerationStructureBuildSizesKHR
-  ** flink:vkDestroyAccelerationStructureNV ->
-     flink:vkDestroyAccelerationStructureKHR (different acceleration
-     structure types)
-  ** flink:vkCmdWriteAccelerationStructuresPropertiesNV ->
-     flink:vkCmdWriteAccelerationStructuresPropertiesKHR (different
-     acceleration structure types)
-  * Added enums, structures and commands:
-  ** ename:VK_GEOMETRY_TYPE_INSTANCES_KHR to elink:VkGeometryTypeKHR enum
-  ** ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR,
-     ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR to
-     elink:VkCopyAccelerationStructureModeKHR enum
-  ** slink:VkPhysicalDeviceAccelerationStructureFeaturesKHR structure
-  ** elink:VkAccelerationStructureBuildTypeKHR enum
-  ** elink:VkBuildAccelerationStructureModeKHR enum
-  ** slink:VkDeviceOrHostAddressKHR and slink:VkDeviceOrHostAddressConstKHR
-     unions
-  ** slink:VkAccelerationStructureBuildRangeInfoKHR struct
-  ** slink:VkAccelerationStructureGeometryInstancesDataKHR struct
-  ** slink:VkAccelerationStructureDeviceAddressInfoKHR struct
-  ** slink:VkAccelerationStructureVersionInfoKHR struct
-  ** slink:VkStridedDeviceAddressRegionKHR struct
-  ** slink:VkCopyAccelerationStructureToMemoryInfoKHR struct
-  ** slink:VkCopyMemoryToAccelerationStructureInfoKHR struct
-  ** slink:VkCopyAccelerationStructureInfoKHR struct
-  ** flink:vkBuildAccelerationStructuresKHR command (host build)
-  ** flink:vkCopyAccelerationStructureKHR command (host copy)
-  ** flink:vkCopyAccelerationStructureToMemoryKHR (host serialize)
-  ** flink:vkCopyMemoryToAccelerationStructureKHR (host deserialize)
-  ** flink:vkWriteAccelerationStructuresPropertiesKHR (host properties)
-  ** flink:vkCmdCopyAccelerationStructureToMemoryKHR (device serialize)
-  ** flink:vkCmdCopyMemoryToAccelerationStructureKHR (device deserialize)
-  ** flink:vkGetDeviceAccelerationStructureCompatibilityKHR (serialization)
-
---
-endif::VK_NV_ray_tracing[]
-
-(3) What are the changes between the public provisional (VK_KHR_ray_tracing
-v8) release and the internal provisional (VK_KHR_ray_tracing v9) release?
---
-  * added pname:geometryFlags to
-    stext:VkAccelerationStructureCreateGeometryTypeInfoKHR (later reworked
-    to obsolete this)
-  * added pname:minAccelerationStructureScratchOffsetAlignment property to
-    VkPhysicalDeviceRayTracingPropertiesKHR
-  * fix naming and return enum from
-    flink:vkGetDeviceAccelerationStructureCompatibilityKHR
-  ** renamed stext:VkAccelerationStructureVersionKHR to
-     slink:VkAccelerationStructureVersionInfoKHR
-  ** renamed etext:VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_VERSION_KHR to
-     ename:VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_VERSION_INFO_KHR
-  ** removed etext:VK_ERROR_INCOMPATIBLE_VERSION_KHR
-  ** added elink:VkAccelerationStructureCompatibilityKHR enum
-  ** remove return value from
-     flink:vkGetDeviceAccelerationStructureCompatibilityKHR and added return
-     enum parameter
-  * Require Vulkan 1.1
-  * added creation time capture and replay flags
-  ** added elink:VkAccelerationStructureCreateFlagBitsKHR and
-     tlink:VkAccelerationStructureCreateFlagsKHR
-  ** renamed the pname:flags member of
-     slink:VkAccelerationStructureCreateInfoKHR to pname:buildFlags (later
-     removed) and added the pname:createFlags member
-  * change flink:vkCmdBuildAccelerationStructuresIndirectKHR to use buffer
-    device address for indirect parameter
-  * make `apiext:VK_KHR_deferred_host_operations` an interaction instead of
-    a required extension (later went back on this)
-  * renamed stext:VkAccelerationStructureBuildOffsetInfoKHR to
-    slink:VkAccelerationStructureBuildRangeInfoKHR
-  ** renamed the pname:ppOffsetInfos parameter of
-     flink:vkCmdBuildAccelerationStructuresKHR to pname:ppBuildRangeInfos
-  * Re-unify geometry description between build and create
-  ** remove stext:VkAccelerationStructureCreateGeometryTypeInfoKHR and
-     etext:VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_GEOMETRY_TYPE_INFO_KHR
-  ** added stext:VkAccelerationStructureCreateSizeInfoKHR structure (later
-     removed)
-  ** change type of the pname:pGeometryInfos member of
-     slink:VkAccelerationStructureCreateInfoKHR from
-     stext:VkAccelerationStructureCreateGeometryTypeInfoKHR to
-     slink:VkAccelerationStructureGeometryKHR (later removed)
-  ** added pname:pCreateSizeInfos member to
-     slink:VkAccelerationStructureCreateInfoKHR (later removed)
-  * Fix ppGeometries ambiguity, add pGeometries
-  ** remove pname:geometryArrayOfPointers member of
-     VkAccelerationStructureBuildGeometryInfoKHR
-  ** disambiguate two meanings of pname:ppGeometries by explicitly adding
-     pname:pGeometries to the
-     slink:VkAccelerationStructureBuildGeometryInfoKHR structure and require
-     one of them be `NULL`
-  * added <<features-nullDescriptor,nullDescriptor>> support for
-    acceleration structures
-  * changed the pname:update member of
-    slink:VkAccelerationStructureBuildGeometryInfoKHR from a bool to the
-    pname:mode elink:VkBuildAccelerationStructureModeKHR enum which allows
-    future extensibility in update types
-  * Clarify deferred host ops for pipeline creation
-  ** slink:VkDeferredOperationKHR is now a top-level parameter for
-     flink:vkBuildAccelerationStructuresKHR,
-     flink:vkCreateRayTracingPipelinesKHR,
-     flink:vkCopyAccelerationStructureToMemoryKHR,
-     flink:vkCopyAccelerationStructureKHR, and
-     flink:vkCopyMemoryToAccelerationStructureKHR
-  ** removed stext:VkDeferredOperationInfoKHR structure
-  ** change deferred host creation/return parameter behavior such that the
-     implementation can modify such parameters until the deferred host
-     operation completes
-  ** `apiext:VK_KHR_deferred_host_operations` is required again
-  * Change acceleration structure build to always be sized
-  ** de-alias ename:VkAccelerationStructureMemoryRequirementsTypeNV and
-     etext:VkAccelerationStructureMemoryRequirementsTypeKHR, and remove
-     etext:VkAccelerationStructureMemoryRequirementsTypeKHR
-  ** add flink:vkGetAccelerationStructureBuildSizesKHR command and
-     slink:VkAccelerationStructureBuildSizesInfoKHR structure and
-     ename:VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR
-     enum to query sizes for acceleration structures and scratch storage
-  ** move size queries for scratch space to
-     flink:vkGetAccelerationStructureBuildSizesKHR
-  ** remove pname:compactedSize, pname:buildFlags, pname:maxGeometryCount,
-     pname:pGeometryInfos, pname:pCreateSizeInfos members of
-     slink:VkAccelerationStructureCreateInfoKHR and add the pname:size
-     member
-  ** add pname:maxVertex member to
-     slink:VkAccelerationStructureGeometryTrianglesDataKHR structure
-  ** remove stext:VkAccelerationStructureCreateSizeInfoKHR structure
---
-
-(4) What are the changes between the internal provisional
-(VK_KHR_ray_tracing v9) release and the final (VK_KHR_acceleration_structure
-v11) release?
---
-  * refactor VK_KHR_ray_tracing into 3 extensions, enabling implementation
-    flexibility and decoupling ray query support from ray pipelines:
-  ** `apiext:VK_KHR_acceleration_structure` (for acceleration structure
-     operations)
-  ** `apiext:VK_KHR_ray_tracing_pipeline` (for ray tracing pipeline and
-     shader stages)
-  ** `apiext:VK_KHR_ray_query` (for ray queries in existing shader stages)
-  * clarify buffer usage flags for ray tracing
-  ** ename:VK_BUFFER_USAGE_RAY_TRACING_BIT_NV is left alone in
-     `apiext:VK_NV_ray_tracing` (required on pname:scratch and
-     pname:instanceData)
-  ** ename:VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR is added as an alias
-     of ename:VK_BUFFER_USAGE_RAY_TRACING_BIT_NV in
-     `apiext:VK_KHR_ray_tracing_pipeline` and is required on shader binding
-     table buffers
-  ** ename:VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR
-     is added in `apiext:VK_KHR_acceleration_structure` for all vertex,
-     index, transform, aabb, and instance buffer data referenced by device
-     build commands
-  ** ename:VK_BUFFER_USAGE_STORAGE_BUFFER_BIT is used for pname:scratchData
-  * add max primitive counts (pname:ppMaxPrimitiveCounts) to
-    flink:vkCmdBuildAccelerationStructuresIndirectKHR
-  * Allocate acceleration structures from stext:VkBuffers and add a mode to
-    constrain the device address
-  ** de-alias sname:VkBindAccelerationStructureMemoryInfoNV and
-     fname:vkBindAccelerationStructureMemoryNV, and remove
-     stext:VkBindAccelerationStructureMemoryInfoKHR,
-     stext:VkAccelerationStructureMemoryRequirementsInfoKHR, and
-     ftext:vkGetAccelerationStructureMemoryRequirementsKHR
-  ** acceleration structures now take a slink:VkBuffer and offset at
-     creation time for memory placement
-  ** add a new ename:VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR
-     buffer usage for such buffers
-  ** add a new ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR acceleration
-     structure type for layering
-  * move ename:VK_GEOMETRY_TYPE_INSTANCES_KHR to main enum instead of being
-    added via extension
-  * make build commands more consistent - all now build multiple
-    acceleration structures and are named plurally
-    (flink:vkCmdBuildAccelerationStructuresIndirectKHR,
-    flink:vkCmdBuildAccelerationStructuresKHR,
-    flink:vkBuildAccelerationStructuresKHR)
-  * add interactions with
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT for
-    acceleration structures, including a new feature
-    (pname:descriptorBindingAccelerationStructureUpdateAfterBind) and 3 new
-    properties (pname:maxPerStageDescriptorAccelerationStructures,
-    pname:maxPerStageDescriptorUpdateAfterBindAccelerationStructures,
-    pname:maxDescriptorSetUpdateAfterBindAccelerationStructures)
-  * extension is no longer provisional
-  * define synchronization requirements for builds, traces, and copies
-  * define synchronization requirements for AS build inputs and indirect
-    build buffer
---
-
-(5) What is ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR for?
---
-*RESOLVED*: It is primarily intended for API layering.
-In DXR, the acceleration structure is basically just a buffer in a special
-layout, and you do not know at creation time whether it will be used as a
-top or bottom level acceleration structure.
-We thus added a generic acceleration structure type whose type is unknown at
-creation time, but is specified at build time instead.
-Applications which are written directly for Vulkan should not use it.
---
-
-=== Version History
-  * Revision 1, 2019-12-05 (Members of the Vulkan Ray Tracing TSG)
-    - Internal revisions (forked from VK_NV_ray_tracing)
-  * Revision 2, 2019-12-20 (Daniel Koch, Eric Werness)
-    - Add const version of DeviceOrHostAddress (!3515)
-    - Add VU to clarify that only handles in the current pipeline are valid
-      (!3518)
-    - Restore some missing VUs and add in-place update language (#1902,
-      !3522)
-    - rename VkAccelerationStructureInstanceKHR member from
-      accelerationStructure to accelerationStructureReference to better
-      match its type (!3523)
-    - Allow VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS for pipeline creation if
-      shader group handles cannot be reused (!3523)
-    - update documentation for the VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS
-      error code and add missing documentation for new return codes from
-      VK_KHR_deferred_host_operations (!3523)
-    - list new query types for VK_KHR_ray_tracing (!3523)
-    - Fix VU statements for VkAccelerationStructureGeometryKHR referring to
-      correct union members and update to use more current wording (!3523)
-  * Revision 3, 2020-01-10 (Daniel Koch, Jon Leech, Christoph Kubisch)
-    - Fix 'instance of' and 'that/which contains/defines' markup issues
-      (!3528)
-    - factor out VK_KHR_pipeline_library as stand-alone extension (!3540)
-    - Resolve Vulkan-hpp issues (!3543)
-      - add missing require for VkGeometryInstanceFlagsKHR
-      - de-alias VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV
-        since the KHR structure is no longer equivalent
-      - add len to pDataSize attribute for
-        vkWriteAccelerationStructuresPropertiesKHR
-  * Revision 4, 2020-01-23 (Daniel Koch, Eric Werness)
-    - Improve vkWriteAccelerationStructuresPropertiesKHR, add return value
-      and VUs (#1947)
-    - Clarify language to allow multiple raygen shaders (#1959)
-    - Various editorial feedback (!3556)
-    - Add language to help deal with looped self-intersecting fans (#1901)
-    - Change vkCmdTraceRays{Indirect}KHR args to pointers (!3559)
-    - Add scratch address validation language (#1941, !3551)
-    - Fix definition and add hierarchy information for shader call scope
-      (#1977, !3571)
-  * Revision 5, 2020-02-04 (Eric Werness, Jeff Bolz, Daniel Koch)
-    - remove vestigial accelerationStructureUUID (!3582)
-    - update definition of repack instructions and improve memory model
-      interactions (#1910, #1913, !3584)
-    - Fix wrong sType for VkPhysicalDeviceRayTracingFeaturesKHR (#1988)
-    - Use provisional SPIR-V capabilities (#1987)
-    - require rayTraversalPrimitiveCulling if rayQuery is supported (#1927)
-    - Miss shaders do not have object parameters (!3592)
-    - Fix missing required types in XML (!3592)
-    - clarify matching conditions for update (!3592)
-    - add goal that host and device builds be similar (!3592)
-    - clarify that pname:maxPrimitiveCount limit should apply to triangles
-      and AABBs (!3592)
-    - Require alignment for instance arrayOfPointers (!3592)
-    - Zero is a valid value for instance flags (!3592)
-    - Add some alignment VUs that got lost in refactoring (!3592)
-    - Recommend TMin epsilon rather than culling (!3592)
-    - Get angle from dot product not cross product (!3592)
-    - Clarify that AH can access the payload and attributes (!3592)
-    - Match DXR behavior for inactive primitive definition (!3592)
-    - Use a more generic term than degenerate for inactive to avoid
-      confusion (!3592)
-  * Revision 6, 2020-02-20 (Daniel Koch)
-    - fix some dangling NV references (#1996)
-    - rename VkCmdTraceRaysIndirectCommandKHR to
-      VkTraceRaysIndirectCommandKHR (!3607)
-    - update contributor list (!3611)
-    - use uint64_t instead of VkAccelerationStructureReferenceKHR in
-      VkAccelerationStructureInstanceKHR (#2004)
-  * Revision 7, 2020-02-28 (Tobias Hector)
-    - remove HitTKHR SPIR-V builtin (spirv/spirv-extensions#7)
-  * Revision 8, 2020-03-06 (Tobias Hector, Dae Kim, Daniel Koch, Jeff Bolz,
-    Eric Werness)
-    - explicitly state that Tmax is updated when new closest intersection is
-      accepted (#2020,!3536)
-    - Made references to min and max t values consistent (!3644)
-    - finish enumerating differences relative to VK_NV_ray_tracing in issues
-      (1) and (2) (#1974,!3642)
-    - fix formatting in some math equations (!3642)
-    - Restrict the Hit Kind operand of code:OpReportIntersectionKHR to
-      7-bits (spirv/spirv-extensions#8,!3646)
-    - Say ray tracing 'should:' be watertight (#2008,!3631)
-    - Clarify memory requirements for ray tracing buffers (#2005,!3649)
-    - Add callable size limits (#1997,!3652)
-  * Revision 9, 2020-04-15 (Eric Werness, Daniel Koch, Tobias Hector, Joshua
-    Barczak)
-    - Add geometry flags to acceleration structure creation (!3672)
-    - add build scratch memory alignment
-      (minAccelerationStructureScratchOffsetAlignment) (#2065,!3725)
-    - fix naming and return enum from
-      vkGetDeviceAccelerationStructureCompatibilityKHR (#2051,!3726)
-    - require SPIR-V 1.4 (#2096,!3777)
-    - added creation time capture/replay flags (#2104,!3774)
-    - require Vulkan 1.1 (#2133,!3806)
-    - use device addresses instead of VkBuffers for ray tracing commands
-      (#2074,!3815)
-    - add interactions with Vulkan 1.2 and VK_KHR_vulkan_memory_model
-      (#2133,!3830)
-    - make VK_KHR_pipeline_library an interaction instead of required
-      (#2045,#2108,!3830)
-    - make VK_KHR_deferred_host_operations an interaction instead of
-      required (#2045,!3830)
-    - removed maxCallableSize and added explicit stack size management for
-      ray pipelines (#1997,!3817,!3772,!3844)
-    - improved documentation for VkAccelerationStructureVersionInfoKHR
-      (#2135,3835)
-    - rename VkAccelerationStructureBuildOffsetInfoKHR to
-      VkAccelerationStructureBuildRangeInfoKHR (#2058,!3754)
-    - Re-unify geometry description between build and create (!3754)
-    - Fix ppGeometries ambiguity, add pGeometries (#2032,!3811)
-    - add interactions with VK_EXT_robustness2 and allow nullDescriptor
-      support for acceleration structures (#1920,!3848)
-    - added future extensibility for AS updates (#2114,!3849)
-    - Fix VU for dispatchrays and add a limit on the size of the full grid
-      (#2160,!3851)
-    - Add shaderGroupHandleAlignment property (#2180,!3875)
-    - Clarify deferred host ops for pipeline creation (#2067,!3813)
-    - Change acceleration structure build to always be sized
-      (#2131,#2197,#2198,!3854,!3883,!3880)
-  * Revision 10, 2020-07-03 (Mathieu Robart, Daniel Koch, Eric Werness,
-    Tobias Hector)
-    - Decomposition of the specification, from VK_KHR_ray_tracing to
-      VK_KHR_acceleration_structure (#1918,!3912)
-    - clarify buffer usage flags for ray tracing (#2181,!3939)
-    - add max primitive counts to build indirect command (#2233,!3944)
-    - Allocate acceleration structures from VkBuffers and add a mode to
-      constrain the device address (#2131,!3936)
-    - Move VK_GEOMETRY_TYPE_INSTANCES_KHR to main enum (#2243,!3952)
-    - make build commands more consistent (#2247,!3958)
-    - add interactions with UPDATE_AFTER_BIND (#2128,!3986)
-    - correct and expand build command VUs (!4020)
-    - fix copy command VUs (!4018)
-    - added various alignment requirements (#2229,!3943)
-    - fix valid usage for arrays of geometryCount items (#2198,!4010)
-    - define what is allowed to change on RTAS updates and relevant VUs
-      (#2177,!3961)
-  * Revision 11, 2020-11-12 (Eric Werness, Josh Barczak, Daniel Koch, Tobias
-    Hector)
-    - de-alias NV and KHR acceleration structure types and associated
-      commands (#2271,!4035)
-    - specify alignment for host copy commands (#2273,!4037)
-    - document
-      ename:VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR
-    - specify that acceleration structures are non-linear (#2289,!4068)
-    - add several missing VUs for strides, vertexFormat, and indexType
-      (#2315,!4069)
-    - restore VUs for VkAccelerationStructureBuildGeometryInfoKHR
-      (#2337,!4098)
-    - ban multi-instance memory for host operations (#2324,!4102)
-    - allow dstAccelerationStructure to be null for
-      vkGetAccelerationStructureBuildSizesKHR (#2330,!4111)
-    - more build VU cleanup (#2138,#4130)
-    - specify host endianness for AS serialization (#2261,!4136)
-    - add invertible transform matrix VU (#1710,!4140)
-    - require geometryCount to be 1 for TLAS builds (!4145)
-    - improved validity conditions for build addresses (#4142)
-    - add single statement SPIR-V VUs, build limit VUs (!4158)
-    - document limits for vertex and aabb strides (#2390,!4184)
-    - specify that
-      ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR applies
-      to AS copies (#2382,#4173)
-    - define sync for AS build inputs and indirect buffer (#2407,!4208)
-  * Revision 12, 2021-08-06 (Samuel Bourasseau)
-    - rename VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR to
-      VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR (keep previous as
-      alias).
-    - Clarify description and add note.
-  * Revision 13, 2021-09-30 (Jon Leech)
-    - Add interaction with `apiext:VK_KHR_format_feature_flags2` to `vk.xml`
diff --git a/registry/vulkan/appendices/VK_KHR_android_surface.txt b/registry/vulkan/appendices/VK_KHR_android_surface.txt
deleted file mode 100644
index e99cd78..0000000
--- a/registry/vulkan/appendices/VK_KHR_android_surface.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_android_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-01-14
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Patrick Doane, Blizzard
-  - Jason Ekstrand, Intel
-  - Ian Elliott, LunarG
-  - Courtney Goeltzenleuchter, LunarG
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-  - Antoine Labour, Google
-  - Jon Leech, Khronos
-  - David Mao, AMD
-  - Norbert Nopper, Freescale
-  - Alon Or-bach, Samsung
-  - Daniel Rakos, AMD
-  - Graham Sellers, AMD
-  - Ray Smith, ARM
-  - Jeff Vigil, Qualcomm
-  - Chia-I Wu, LunarG
-
-=== Description
-
-The `VK_KHR_android_surface` extension is an instance extension.
-It provides a mechanism to create a slink:VkSurfaceKHR object (defined by
-the `apiext:VK_KHR_surface` extension) that refers to an
-basetype:ANativeWindow, Android's native surface type.
-The basetype:ANativeWindow represents the producer endpoint of any buffer
-queue, regardless of consumer endpoint.
-Common consumer endpoints for code:ANativeWindows are the system window
-compositor, video encoders, and application-specific compositors importing
-the images through a code:SurfaceTexture.
-
-include::{generated}/interfaces/VK_KHR_android_surface.txt[]
-
-=== Issues
-
-1) Does Android need a way to query for compatibility between a particular
-physical device (and queue family?) and a specific Android display?
-
-*RESOLVED*: No.
-Currently on Android, any physical device is expected to be able to present
-to the system compositor, and all queue families must support the necessary
-image layout transitions and synchronization operations.
-
-=== Version History
-
- * Revision 1, 2015-09-23 (Jesse Hall)
-   - Initial draft.
-
- * Revision 2, 2015-10-26 (Ian Elliott)
-   - Renamed from VK_EXT_KHR_android_surface to VK_KHR_android_surface.
-
- * Revision 3, 2015-11-03 (Daniel Rakos)
-   - Added allocation callbacks to surface creation function.
-
- * Revision 4, 2015-11-10 (Jesse Hall)
-   - Removed VK_ERROR_INVALID_ANDROID_WINDOW_KHR.
-
- * Revision 5, 2015-11-28 (Daniel Rakos)
-   - Updated the surface create function to take a pCreateInfo structure.
-
- * Revision 6, 2016-01-14 (James Jones)
-   - Moved VK_ERROR_NATIVE_WINDOW_IN_USE_KHR from the VK_KHR_android_surface
-     to the VK_KHR_surface extension.
diff --git a/registry/vulkan/appendices/VK_KHR_bind_memory2.txt b/registry/vulkan/appendices/VK_KHR_bind_memory2.txt
deleted file mode 100644
index ab37b8a..0000000
--- a/registry/vulkan/appendices/VK_KHR_bind_memory2.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_bind_memory2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-09-05
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Tobias Hector, Imagination Technologies
-
-=== Description
-
-This extension provides versions of flink:vkBindBufferMemory and
-flink:vkBindImageMemory that allow multiple bindings to be performed at
-once, and are extensible.
-
-This extension also introduces ename:VK_IMAGE_CREATE_ALIAS_BIT_KHR, which
-allows "`identical`" images that alias the same memory to interpret the
-contents consistently, even across image layout changes.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_bind_memory2.txt[]
-
-=== Version History
-
- * Revision 1, 2017-05-19 (Tobias Hector)
-   - Pulled bind memory functions into their own extension
diff --git a/registry/vulkan/appendices/VK_KHR_buffer_device_address.txt b/registry/vulkan/appendices/VK_KHR_buffer_device_address.txt
deleted file mode 100644
index 6698fd1..0000000
--- a/registry/vulkan/appendices/VK_KHR_buffer_device_address.txt
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_buffer_device_address.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-06-24
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_physical_storage_buffer.html[`SPV_KHR_physical_storage_buffer`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference.txt[`GL_EXT_buffer_reference`]
-    and
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference2.txt[`GL_EXT_buffer_reference2`]
-    and
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference_uvec2.txt[`GL_EXT_buffer_reference_uvec2`]
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Neil Henning, AMD
-  - Tobias Hector, AMD
-  - Jason Ekstrand, Intel
-  - Baldur Karlsson, Valve
-  - Jan-Harald Fredriksen, Arm
-
-=== Description
-
-This extension allows the application to query a 64-bit buffer device
-address value for a buffer, which can be used to access the buffer memory
-via the code:PhysicalStorageBuffer storage class in the
-https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference.txt[`GL_EXT_buffer_reference`]
-GLSL extension and
-{spirv}/KHR/SPV_KHR_physical_storage_buffer.html[`SPV_KHR_physical_storage_buffer`]
-SPIR-V extension.
-
-Another way to describe this extension is that it adds "`pointers to buffer
-memory in shaders`".
-By calling flink:vkGetBufferDeviceAddress with a sname:VkBuffer, it will
-return a basetype:VkDeviceAddress value which represents the address of the
-start of the buffer.
-
-flink:vkGetBufferOpaqueCaptureAddress and
-flink:vkGetDeviceMemoryOpaqueCaptureAddress allow opaque addresses for
-buffers and memory objects to be queried for the current process.
-A trace capture and replay tool can then supply these addresses to be used
-at replay time to match the addresses used when the trace was captured.
-To enable tools to insert these queries, new memory allocation flags must be
-specified for memory objects that will be bound to buffers accessed via the
-code:PhysicalStorageBuffer storage class.
-Note that this mechanism is intended only to support capture/replay tools,
-and is not recommended for use in other applications.
-
-There are various use cases this extension is designed for.
-It is required for ray tracing, useful for DX12 portability, and by allowing
-buffer addresses to be stored in memory it enables more complex data
-structures to be created.
-
-This extension can also be used to hardcode a dedicated debug channel into
-all shaders by querying a pointer at startup and pushing that into shaders
-as a run-time constant (e.g. specialization constant) that avoids impacting
-other descriptor limits.
-
-There are examples of usage in the
-https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference.txt[`GL_EXT_buffer_reference`]
-spec for how to use this in a high-level shading language such as GLSL.
-The
-https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference2.txt[`GL_EXT_buffer_reference2`]
-and
-https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference_uvec2.txt[`GL_EXT_buffer_reference_uvec2`]
-extensions were also added to help cover a few additional edge cases.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-However, if Vulkan 1.2 is supported and this extension is not, the
-code:bufferDeviceAddress capability is optional.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_buffer_device_address.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-PhysicalStorageBufferAddresses,code:PhysicalStorageBufferAddresses>>
-
-=== Version History
-
- * Revision 1, 2019-06-24 (Jan-Harald Fredriksen)
-   - Internal revisions based on VK_EXT_buffer_device_address
-
-ifdef::isrefpage[]
-
-=== Examples
-
-There are various use cases this extensions is designed for.
-It is required for ray tracing, useful for DX12 portability, and it allows
-storing buffer addresses in memory (enabling creating more complex data
-strcutures).
-
-This extension can also be used to hardcode a dedicated debug channel into
-all shaders without impacting other descriptor limits by querying a buffer
-device address at startup and pushing that into shaders as a run-time
-constant (e.g. specialization constant).
-
-There are examples of usage in the
-https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference.txt[`GL_EXT_buffer_reference`]
-spec for how to use this in a high-level shading language such as GLSL.
-The
-https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference2.txt[`GL_EXT_buffer_reference2`]
-and
-https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference_uvec2.txt[`GL_EXT_buffer_reference_uvec2`]
-extensions were added to help cover a few edge cases missed by the original
-`GL_EXT_buffer_reference`.
-
-It is important to also be aware that the capture/replay mechanisms are
-meant for capture/replay tools, and should not be used general application
-usage.
-
-endif::isrefpage[]
diff --git a/registry/vulkan/appendices/VK_KHR_copy_commands2.txt b/registry/vulkan/appendices/VK_KHR_copy_commands2.txt
deleted file mode 100644
index 55fe09e..0000000
--- a/registry/vulkan/appendices/VK_KHR_copy_commands2.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_copy_commands2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-07-06
-*Interactions and External Dependencies*::
-  - None
-*Contributors*::
-  - Jeff Leger, Qualcomm
-  - Tobias Hector, AMD
-  - Jan-Harald Fredriksen, ARM
-  - Tom Olson, ARM
-
-
-=== Description
-
-This extension provides extensible versions of the Vulkan buffer and image
-copy commands.
-The new commands are functionally identical to the core commands, except
-that their copy parameters are specified using extensible structures that
-can be used to pass extension-specific information.
-
-The following extensible copy commands are introduced with this extension:
-flink:vkCmdCopyBuffer2KHR, flink:vkCmdCopyImage2KHR,
-flink:vkCmdCopyBufferToImage2KHR, flink:vkCmdCopyImageToBuffer2KHR,
-flink:vkCmdBlitImage2KHR, and flink:vkCmdResolveImage2KHR.
-Each command contains an stext:*Info2KHR structure parameter that includes
-ptext:sType/ptext:pNext members.
-Lower level structures that describe each region to be copied are also
-extended with ptext:sType/ptext:pNext members.
-
-include::{generated}/interfaces/VK_KHR_copy_commands2.txt[]
-
-=== Version History
-
- * Revision 1, 2020-07-06 (Jeff Leger)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_KHR_create_renderpass2.txt b/registry/vulkan/appendices/VK_KHR_create_renderpass2.txt
deleted file mode 100644
index 3328aa2..0000000
--- a/registry/vulkan/appendices/VK_KHR_create_renderpass2.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_create_renderpass2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-02-07
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*Contributors*::
-  - Tobias Hector
-  - Jeff Bolz
-
-=== Description
-
-This extension provides a new entry point to create render passes in a way
-that can be easily extended by other extensions through the substructures of
-render pass creation.
-The Vulkan 1.0 render pass creation sub-structures do not include
-ptext:sType/ptext:pNext members.
-Additionally, the render pass begin/next/end commands have been augmented
-with new extensible structures for passing additional subpass information.
-
-The slink:VkRenderPassMultiviewCreateInfo and
-slink:VkInputAttachmentAspectReference structures that extended the original
-slink:VkRenderPassCreateInfo are not accepted into the new creation
-functions, and instead their parameters are folded into this extension as
-follows:
-
-  * Elements of slink:VkRenderPassMultiviewCreateInfo::pname:pViewMasks are
-    now specified in slink:VkSubpassDescription2KHR::pname:viewMask.
-  * Elements of slink:VkRenderPassMultiviewCreateInfo::pname:pViewOffsets
-    are now specified in slink:VkSubpassDependency2KHR::pname:viewOffset.
-  * slink:VkRenderPassMultiviewCreateInfo::pname:correlationMaskCount and
-    slink:VkRenderPassMultiviewCreateInfo::pname:pCorrelationMasks are
-    directly specified in slink:VkRenderPassCreateInfo2KHR.
-  * slink:VkInputAttachmentAspectReference::pname:aspectMask is now
-    specified in the relevant input attachment description in
-    slink:VkAttachmentDescription2KHR::pname:aspectMask
-
-The details of these mappings are explained fully in the new structures.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_create_renderpass2.txt[]
-
-=== Version History
-
- * Revision 1, 2018-02-07 (Tobias Hector)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_KHR_dedicated_allocation.txt b/registry/vulkan/appendices/VK_KHR_dedicated_allocation.txt
deleted file mode 100644
index 2d04e17..0000000
--- a/registry/vulkan/appendices/VK_KHR_dedicated_allocation.txt
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_dedicated_allocation.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-09-05
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Jason Ekstrand, Intel
-
-=== Description
-
-This extension enables resources to be bound to a dedicated allocation,
-rather than suballocated.
-For any particular resource, applications can: query whether a dedicated
-allocation is recommended, in which case using a dedicated allocation may:
-improve the performance of access to that resource.
-Normal device memory allocations must support multiple resources per
-allocation, memory aliasing and sparse binding, which could interfere with
-some optimizations.
-Applications should query the implementation for when a dedicated allocation
-may: be beneficial by adding a sname:VkMemoryDedicatedRequirementsKHR
-structure to the pname:pNext chain of the sname:VkMemoryRequirements2
-structure passed as the pname:pMemoryRequirements parameter of a call to
-fname:vkGetBufferMemoryRequirements2 or fname:vkGetImageMemoryRequirements2.
-Certain external handle types and external images or buffers may: also
-depend on dedicated allocations on implementations that associate image or
-buffer metadata with OS-level memory objects.
-
-This extension adds a two small structures to memory requirements querying
-and memory allocation: a new structure that flags whether an image/buffer
-should have a dedicated allocation, and a structure indicating the image or
-buffer that an allocation will be bound to.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_dedicated_allocation.txt[]
-
-=== Examples
-
-[source,c++]
---------------------------------------
-
-    // Create an image with a dedicated allocation based on the
-    // implementation's preference
-
-    VkImageCreateInfo imageCreateInfo =
-    {
-        // Image creation parameters
-    };
-
-    VkImage image;
-    VkResult result = vkCreateImage(
-        device,
-        &imageCreateInfo,
-        NULL,                               // pAllocator
-        &image);
-
-    VkMemoryDedicatedRequirementsKHR dedicatedRequirements =
-    {
-        VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR,
-        NULL,                               // pNext
-    };
-
-    VkMemoryRequirements2 memoryRequirements =
-    {
-        VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
-        &dedicatedRequirements,             // pNext
-    };
-
-    const VkImageMemoryRequirementsInfo2 imageRequirementsInfo =
-    {
-        VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2,
-        NULL,                               // pNext
-        image
-    };
-
-    vkGetImageMemoryRequirements2(
-        device,
-        &imageRequirementsInfo,
-        &memoryRequirements);
-
-    if (dedicatedRequirements.prefersDedicatedAllocation) {
-        // Allocate memory with VkMemoryDedicatedAllocateInfoKHR::image
-        // pointing to the image we are allocating the memory for
-
-        VkMemoryDedicatedAllocateInfoKHR dedicatedInfo =
-        {
-            VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR,   // sType
-            NULL,                                                   // pNext
-            image,                                                  // image
-            VK_NULL_HANDLE,                                         // buffer
-        };
-
-        VkMemoryAllocateInfo memoryAllocateInfo =
-        {
-            VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,                 // sType
-            &dedicatedInfo,                                         // pNext
-            memoryRequirements.size,                                // allocationSize
-            FindMemoryTypeIndex(memoryRequirements.memoryTypeBits), // memoryTypeIndex
-        };
-
-        VkDeviceMemory memory;
-        vkAllocateMemory(
-            device,
-            &memoryAllocateInfo,
-            NULL,                       // pAllocator
-            &memory);
-
-        // Bind the image to the memory
-
-        vkBindImageMemory(
-            device,
-            image,
-            memory,
-            0);
-    } else {
-        // Take the normal memory sub-allocation path
-    }
-
---------------------------------------
-
-=== Version History
-
- * Revision 1, 2017-02-27 (James Jones)
-   - Copy content from VK_NV_dedicated_allocation
-   - Add some references to external object interactions to the overview.
-
- * Revision 2, 2017-03-27 (Jason Ekstrand)
-   - Rework the extension to be query-based
-
- * Revision 3, 2017-07-31 (Jason Ekstrand)
-   - Clarify that memory objects allocated with
-     VkMemoryDedicatedAllocateInfoKHR can only have the specified resource
-     bound and no others.
diff --git a/registry/vulkan/appendices/VK_KHR_deferred_host_operations.txt b/registry/vulkan/appendices/VK_KHR_deferred_host_operations.txt
deleted file mode 100644
index dc2220f..0000000
--- a/registry/vulkan/appendices/VK_KHR_deferred_host_operations.txt
+++ /dev/null
@@ -1,192 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_deferred_host_operations.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-11-12
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Joshua Barczak, Intel
-  - Jeff Bolz, NVIDIA
-  - Daniel Koch, NVIDIA
-  - Slawek Grajewski, Intel
-  - Tobias Hector, AMD
-  - Yuriy O'Donnell, Epic
-  - Eric Werness, NVIDIA
-  - Baldur Karlsson, Valve
-  - Jesse Barker, Unity
-  - Contributors to VK_KHR_acceleration_structure,
-    VK_KHR_ray_tracing_pipeline
-
-=== Description
-
-The `apiext:VK_KHR_deferred_host_operations` extension defines the
-infrastructure and usage patterns for deferrable commands, but does not
-specify any commands as deferrable.
-This is left to additional dependent extensions.
-Commands must: not be deferred unless the deferral is specifically allowed
-by another extension which depends on
-`apiext:VK_KHR_deferred_host_operations`.
-
-include::{generated}/interfaces/VK_KHR_deferred_host_operations.txt[]
-
-=== Code Examples
-
-The following examples will illustrate the concept of deferrable operations
-using a hypothetical example.
-The command ftext:vkDoSomethingExpensiveEXT denotes a deferrable command.
-The structure stext:VkExpensiveOperationArgsEXT represents the arguments
-which it would normally accept.
-
-The following example illustrates how a vulkan application might request
-deferral of an expensive operation:
-
-[source,cpp]
-----
-
-// create a deferred operation
-VkDeferredOperationKHR hOp;
-VkResult result = vkCreateDeferredOperationKHR(device, pCallbacks, &hOp);
-assert(result == VK_SUCCESS);
-
-result = vkDoSomethingExpensive(device, hOp, ...);
-assert( result == VK_OPERATION_DEFERRED_KHR );
-
-// operation was deferred.  Execute it asynchronously
-std::async::launch(
-    [ hOp ] ( )
-    {
-        vkDeferredOperationJoinKHR(device, hOp);
-
-        result = vkGetDeferredOperationResultKHR(device, hOp);
-
-        // deferred operation is now complete.  'result' indicates success or failure
-
-        vkDestroyDeferredOperationKHR(device, hOp, pCallbacks);
-    }
-);
-
-----
-
-The following example illustrates extracting concurrency from a single
-deferred operation:
-
-[source,cpp]
-----
-
-// create a deferred operation
-VkDeferredOperationKHR hOp;
-VkResult result = vkCreateDeferredOperationKHR(device, pCallbacks, &hOp);
-assert(result == VK_SUCCESS);
-
-result = vkDoSomethingExpensive(device, hOp, ...);
-assert( result == VK_OPERATION_DEFERRED_KHR );
-
-// Query the maximum amount of concurrency and clamp to the desired maximum
-uint32_t numLaunches = std::min(vkGetDeferredOperationMaxConcurrencyKHR(device, hOp), maxThreads);
-
-std::vector<std::future<void> > joins;
-
-for (uint32_t i = 0; i < numLaunches; i++) {
-  joins.emplace_back(std::async::launch(
-    [ hOp ] ( )
-    {
-        vkDeferredOperationJoinKHR(device, hOp);
-                // in a job system, a return of VK_THREAD_IDLE_KHR should queue another
-                // job, but it is not functionally required
-    }
-  );
-}
-
-for (auto &f : joins) {
-  f.get();
-}
-
-result = vkGetDeferredOperationResultKHR(device, hOp);
-
-// deferred operation is now complete.  'result' indicates success or failure
-
-vkDestroyDeferredOperationKHR(device, hOp, pCallbacks);
-
-----
-
-
-The following example shows a subroutine which guarantees completion of a
-deferred operation, in the presence of multiple worker threads, and returns
-the result of the operation.
-
-[source,cpp]
-----
-
-VkResult FinishDeferredOperation(VkDeferredOperationKHR hOp)
-{
-    // Attempt to join the operation until the implementation indicates that we should stop
-
-    VkResult result = vkDeferredOperationJoinKHR(device, hOp);
-    while( result == VK_THREAD_IDLE_KHR )
-    {
-        std::this_thread::yield();
-        result = vkDeferredOperationJoinKHR(device, hOp);
-    }
-
-    switch( result )
-    {
-    case VK_SUCCESS:
-        {
-            // deferred operation has finished.  Query its result
-            result = vkGetDeferredOperationResultKHR(device, hOp);
-        }
-        break;
-
-    case VK_THREAD_DONE_KHR:
-        {
-            // deferred operation is being wrapped up by another thread
-            //  wait for that thread to finish
-            do
-            {
-                std::this_thread::yield();
-                result = vkGetDeferredOperationResultKHR(device, hOp);
-            } while( result == VK_NOT_READY );
-        }
-        break;
-
-    default:
-        assert(false); // other conditions are illegal.
-        break;
-    }
-
-    return result;
-}
-----
-
-=== Issues
-
-. Should this extension have a VkPhysicalDevice*FeaturesKHR structure?
-
-*RESOLVED*: No.
-This extension does not add any functionality on its own and requires a
-dependent extension to actually enable functionality and thus there is no
-value in adding a feature structure.
-If necessary, any dependent extension could add a feature boolean if it
-wanted to indicate that it is adding optional deferral support.
-
-=== Version History
-
- * Revision 1, 2019-12-05 (Josh Barczak, Daniel Koch)
-   - Initial draft.
- * Revision 2, 2020-03-06 (Daniel Koch, Tobias Hector)
-   - Add missing VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR enum
-   - fix sample code
-   - Clarified deferred operation parameter lifetimes (#2018,!3647)
- * Revision 3, 2020-05-15 (Josh Barczak)
-   - Clarify behavior of vkGetDeferredOperationMaxConcurrencyKHR, allowing
-     it to return 0 if the operation is complete (#2036,!3850)
- * Revision 4, 2020-11-12 (Tobias Hector, Daniel Koch)
-   - Remove VkDeferredOperationInfoKHR and change return value semantics
-     when deferred host operations are in use (#2067,3813)
-   - clarify return value of vkGetDeferredOperationResultKHR (#2339,!4110)
diff --git a/registry/vulkan/appendices/VK_KHR_depth_stencil_resolve.txt b/registry/vulkan/appendices/VK_KHR_depth_stencil_resolve.txt
deleted file mode 100644
index 93cd81a..0000000
--- a/registry/vulkan/appendices/VK_KHR_depth_stencil_resolve.txt
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_depth_stencil_resolve.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-04-09
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*Contributors*::
-  - Jan-Harald Fredriksen, Arm
-  - Andrew Garrard, Samsung Electronics
-  - Soowan Park, Samsung Electronics
-  - Jeff Bolz, NVIDIA
-  - Daniel Rakos, AMD
-
-=== Description
-
-This extension adds support for automatically resolving multisampled
-depth/stencil attachments in a subpass in a similar manner as for color
-attachments.
-
-Multisampled color attachments can be resolved at the end of a subpass by
-specifying pname:pResolveAttachments entries corresponding to the
-pname:pColorAttachments array entries.
-This does not allow for a way to map the resolve attachments to the
-depth/stencil attachment.
-The flink:vkCmdResolveImage command does not allow for depth/stencil images.
-While there are other ways to resolve the depth/stencil attachment, they can
-give sub-optimal performance.
-Extending the sname:VkSubpassDescription2 in this extension allows an
-application to add a pname:pDepthStencilResolveAttachment, that is similar
-to the color pname:pResolveAttachments, that the
-pname:pDepthStencilAttachment can be resolved into.
-
-Depth and stencil samples are resolved to a single value based on the
-resolve mode.
-The set of possible resolve modes is defined in the
-elink:VkResolveModeFlagBits enum.
-The ename:VK_RESOLVE_MODE_SAMPLE_ZERO_BIT mode is the only mode that is
-required of all implementations (that support the extension or support
-Vulkan 1.2 or higher).
-Some implementations may also support averaging (the same as color sample
-resolve) or taking the minimum or maximum sample, which may be more suitable
-for depth/stencil resolve.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_depth_stencil_resolve.txt[]
-
-=== Version History
-
- * Revision 1, 2018-04-09 (Jan-Harald Fredriksen)
-   - Initial revision
-
-ifdef::isrefpage[]
-
-=== Additional Resources
-
-* GDC 2019
-** https://www.youtube.com/watch?v=GnnEmJFFC7Q&feature=youtu.be&t=1983[`video`]
-** https://www.khronos.org/assets/uploads/developers/library/2019-gdc/Vulkan-Depth-Stencil-Resolve-GDC-Mar19.pdf[`slides`]
-
-endif::isrefpage[]
diff --git a/registry/vulkan/appendices/VK_KHR_descriptor_update_template.txt b/registry/vulkan/appendices/VK_KHR_descriptor_update_template.txt
deleted file mode 100644
index be62b3b..0000000
--- a/registry/vulkan/appendices/VK_KHR_descriptor_update_template.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_descriptor_update_template.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-09-05
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Interacts with `apiext:VK_KHR_push_descriptor`
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Michael Worcester, Imagination Technologies
-
-=== Description
-
-Applications may wish to update a fixed set of descriptors in a large number
-of descriptor sets very frequently, i.e. during initializaton phase or if it
-is required to rebuild descriptor sets for each frame.
-For those cases it is also not unlikely that all information required to
-update a single descriptor set is stored in a single struct.
-This extension provides a way to update a fixed set of descriptors in a
-single slink:VkDescriptorSet with a pointer to a user defined data structure
-describing the new descriptors.
-
-=== Promotion to Vulkan 1.1
-
-ifdef::VK_KHR_push_descriptor[]
-flink:vkCmdPushDescriptorSetWithTemplateKHR is included as an interaction
-with `apiext:VK_KHR_push_descriptor`.
-If Vulkan 1.1 and `VK_KHR_push_descriptor` are supported, this is included
-by `apiext:VK_KHR_push_descriptor`.
-endif::VK_KHR_push_descriptor[]
-
-The base functionality in this extension is included in core Vulkan 1.1,
-with the KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_descriptor_update_template.txt[]
-
-=== Version History
-
-  * Revision 1, 2016-01-11 (Markus Tavenrath)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_KHR_device_group.txt b/registry/vulkan/appendices/VK_KHR_device_group.txt
deleted file mode 100644
index 6ed300f..0000000
--- a/registry/vulkan/appendices/VK_KHR_device_group.txt
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_device_group.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-10-10
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Tobias Hector, Imagination Technologies
-
-=== Description
-
-This extension provides functionality to use a logical device that consists
-of multiple physical devices, as created with the
-`apiext:VK_KHR_device_group_creation` extension.
-A device group can allocate memory across the subdevices, bind memory from
-one subdevice to a resource on another subdevice, record command buffers
-where some work executes on an arbitrary subset of the subdevices, and
-potentially present a swapchain image from one or more subdevices.
-
-=== Promotion to Vulkan 1.1
-
-ifdef::VK_KHR_swapchain[]
-The following enums, types and commands are included as interactions with
-`apiext:VK_KHR_swapchain`:
-
-  * ename:VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR
-  * ename:VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR
-  * ename:VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR
-  * ename:VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR
-  * ename:VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR
-  * ename:VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR
-  * ename:VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR
-  * elink:VkDeviceGroupPresentModeFlagBitsKHR
-  * slink:VkDeviceGroupPresentCapabilitiesKHR
-  * slink:VkImageSwapchainCreateInfoKHR
-  * slink:VkBindImageMemorySwapchainInfoKHR
-  * slink:VkAcquireNextImageInfoKHR
-  * slink:VkDeviceGroupPresentInfoKHR
-  * slink:VkDeviceGroupSwapchainCreateInfoKHR
-  * flink:vkGetDeviceGroupPresentCapabilitiesKHR
-  * flink:vkGetDeviceGroupSurfacePresentModesKHR
-  * flink:vkGetPhysicalDevicePresentRectanglesKHR
-  * flink:vkAcquireNextImage2KHR
-
-If Vulkan 1.1 and `apiext:VK_KHR_swapchain` are supported, these are
-included by `VK_KHR_swapchain`.
-endif::VK_KHR_swapchain[]
-
-The base functionality in this extension is included in core Vulkan 1.1,
-with the KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_device_group.txt[]
-
-=== New Built-in Variables
-
-  * <<interfaces-builtin-variables-deviceindex,code:DeviceIndex>>
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-DeviceGroup,code:DeviceGroup>>
-
-=== Version History
-
- * Revision 1, 2016-10-19 (Jeff Bolz)
-   - Internal revisions
- * Revision 2, 2017-05-19 (Tobias Hector)
-   - Removed extended memory bind functions to VK_KHR_bind_memory2, added
-     dependency on that extension, and device-group-specific structs for
-     those functions.
- * Revision 3, 2017-10-06 (Ian Elliott)
-   - Corrected Vulkan 1.1 interactions with the WSI extensions.
-     All Vulkan 1.1 WSI interactions are with the VK_KHR_swapchain
-     extension.
- * Revision 4, 2017-10-10 (Jeff Bolz)
-   - Rename "`SFR`" bits and structure members to use the phrase "`split
-     instance bind regions`".
diff --git a/registry/vulkan/appendices/VK_KHR_device_group_creation.txt b/registry/vulkan/appendices/VK_KHR_device_group_creation.txt
deleted file mode 100644
index d52c036..0000000
--- a/registry/vulkan/appendices/VK_KHR_device_group_creation.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_device_group_creation.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-10-19
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension provides instance-level commands to enumerate groups of
-physical devices, and to create a logical device from a subset of one of
-those groups.
-Such a logical device can then be used with new features in the
-`apiext:VK_KHR_device_group` extension.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_device_group_creation.txt[]
-
-=== Examples
-
-[source,c++]
-----------------------------------------
-
-    VkDeviceCreateInfo devCreateInfo = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO };
-    // (not shown) fill out devCreateInfo as usual.
-    uint32_t deviceGroupCount = 0;
-    VkPhysicalDeviceGroupPropertiesKHR *props = NULL;
-
-    // Query the number of device groups
-    vkEnumeratePhysicalDeviceGroupsKHR(g_vkInstance, &deviceGroupCount, NULL);
-
-    // Allocate and initialize structures to query the device groups
-    props = (VkPhysicalDeviceGroupPropertiesKHR *)malloc(deviceGroupCount*sizeof(VkPhysicalDeviceGroupPropertiesKHR));
-    for (i = 0; i < deviceGroupCount; ++i) {
-        props[i].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHR;
-        props[i].pNext = NULL;
-    }
-    vkEnumeratePhysicalDeviceGroupsKHR(g_vkInstance, &deviceGroupCount, props);
-
-    // If the first device group has more than one physical device. create
-    // a logical device using all of the physical devices.
-    VkDeviceGroupDeviceCreateInfoKHR deviceGroupInfo = { VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHR };
-    if (props[0].physicalDeviceCount > 1) {
-        deviceGroupInfo.physicalDeviceCount = props[0].physicalDeviceCount;
-        deviceGroupInfo.pPhysicalDevices = props[0].physicalDevices;
-        devCreateInfo.pNext = &deviceGroupInfo;
-    }
-
-    vkCreateDevice(props[0].physicalDevices[0], &devCreateInfo, NULL, &g_vkDevice);
-    free(props);
-
-----------------------------------------
-
-=== Version History
-
- * Revision 1, 2016-10-19 (Jeff Bolz)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_KHR_display.txt b/registry/vulkan/appendices/VK_KHR_display.txt
deleted file mode 100644
index 4d3882f..0000000
--- a/registry/vulkan/appendices/VK_KHR_display.txt
+++ /dev/null
@@ -1,352 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_display.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-03-13
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - James Jones, NVIDIA
-  - Norbert Nopper, Freescale
-  - Jeff Vigil, Qualcomm
-  - Daniel Rakos, AMD
-
-=== Description
-
-This extension provides the API to enumerate displays and available modes on
-a given device.
-
-include::{generated}/interfaces/VK_KHR_display.txt[]
-
-=== Issues
-
-1) Which properties of a mode should be fixed in the mode information vs.
-settable in some other function when setting the mode? E.g., do we need to
-double the size of the mode pool to include both stereo and non-stereo
-modes? YUV and RGB scanout even if they both take RGB input images? BGR vs.
-RGB input? etc.
-
-*PROPOSED RESOLUTION*: Many modern displays support at most a handful of
-resolutions and timings natively.
-Other "`modes`" are expected to be supported using scaling hardware on the
-display engine or GPU.
-Other properties, such as rotation and mirroring should not require
-duplicating hardware modes just to express all combinations.
-Further, these properties may be implemented on a per-display or per-overlay
-granularity.
-
-To avoid the exponential growth of modes as mutable properties are added, as
-was the case with code:EGLConfig/WGL pixel formats/code:GLXFBConfig, this
-specification should separate out hardware properties and configurable state
-into separate objects.
-Modes and overlay planes will express capabilities of the hardware, while a
-separate structure will allow applications to configure scaling, rotation,
-mirroring, color keys, LUT values, alpha masks, etc.
-for a given swapchain independent of the mode in use.
-Constraints on these settings will be established by properties of the
-immutable objects.
-
-Note the resolution of this issue may affect issue 5 as well.
-
-2) What properties of a display itself are useful?
-
-*PROPOSED RESOLUTION*: This issue is too broad.
-It was meant to prompt general discussion, but resolving this issue amounts
-to completing this specification.
-All interesting properties should be included.
-The issue will remain as a placeholder since removing it would make it hard
-to parse existing discussion notes that refer to issues by number.
-
-3) How are multiple overlay planes within a display or mode enumerated?
-
-*PROPOSED RESOLUTION*: They are referred to by an index.
-Each display will report the number of overlay planes it contains.
-
-4) Should swapchains be created relative to a mode or a display?
-
-*PROPOSED RESOLUTION*: When using this extension, swapchains are created
-relative to a mode and a plane.
-The mode implies the display object the swapchain will present to.
-If the specified mode is not the display's current mode, the new mode will
-be applied when the first image is presented to the swapchain, and the
-default operating system mode, if any, will be restored when the swapchain
-is destroyed.
-
-5) Should users query generic ranges from displays and construct their own
-modes explicitly using those constraints rather than querying a fixed set of
-modes (Most monitors only have one real "`mode`" these days, even though
-many support relatively arbitrary scaling, either on the monitor side or in
-the GPU display engine, making "`modes`" something of a relic/compatibility
-construct).
-
-*PROPOSED RESOLUTION*: Expose both.
-Display information structures will expose a set of predefined modes, as
-well as any attributes necessary to construct a customized mode.
-
-6) Is it fine if we return the display and display mode handles in the
-structure used to query their properties?
-
-*PROPOSED RESOLUTION*: Yes.
-
-7) Is there a possibility that not all displays of a device work with all of
-the present queues of a device? If yes, how do we determine which displays
-work with which present queues?
-
-*PROPOSED RESOLUTION*: No known hardware has such limitations, but
-determining such limitations is supported automatically using the existing
-`apiext:VK_KHR_surface` and `apiext:VK_KHR_swapchain` query mechanisms.
-
-8) Should all presentation need to be done relative to an overlay plane, or
-can a display mode + display be used alone to target an output?
-
-*PROPOSED RESOLUTION*: Require specifying a plane explicitly.
-
-9) Should displays have an associated window system display, such as an
-code:HDC or code:Display*?
-
-*PROPOSED RESOLUTION*: No.
-Displays are independent of any windowing system in use on the system.
-Further, neither code:HDC nor code:Display* refer to a physical display
-object.
-
-10) Are displays queried from a physical GPU or from a device instance?
-
-*PROPOSED RESOLUTION*: Developers prefer to query modes directly from the
-physical GPU so they can use display information as an input to their device
-selection algorithms prior to device creation.
-This avoids the need to create placeholder device instances to enumerate
-displays.
-
-This preference must be weighed against the extra initialization that must
-be done by driver vendors prior to device instance creation to support this
-usage.
-
-11) Should displays and/or modes be dispatchable objects? If functions are
-to take displays, overlays, or modes as their first parameter, they must be
-dispatchable objects as defined in Khronos bug 13529.
-If they are not added to the list of dispatchable objects, functions
-operating on them must take some higher-level object as their first
-parameter.
-There is no performance case against making them dispatchable objects, but
-they would be the first extension objects to be dispatchable.
-
-*PROPOSED RESOLUTION*: Do not make displays or modes dispatchable.
-They will dispatch based on their associated physical device.
-
-12) Should hardware cursor capabilities be exposed?
-
-*PROPOSED RESOLUTION*: Defer.
-This could be a separate extension on top of the base WSI specs.
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-There appears to be a missing sentence for the first part of issue 13 here.
-====
-endif::editing-notes[]
-
-if they are one physical display device to an end user, but may internally
-be implemented as two side-by-side displays using the same display engine
-(and sometimes cabling) resources as two physically separate display
-devices.
-
-*RESOLVED*: Tiled displays will appear as a single display object in this
-API.
-
-14) Should the raw EDID data be included in the display information?
-
-*RESOLVED*: No.
-A future extension could be added which reports the EDID if necessary.
-This may be complicated by the outcome of issue 13.
-
-15) Should min and max scaling factor capabilities of overlays be exposed?
-
-*RESOLVED*: Yes.
-This is exposed indirectly by allowing applications to query the min/max
-position and extent of the source and destination regions from which image
-contents are fetched by the display engine when using a particular mode and
-overlay pair.
-
-16) Should devices be able to expose planes that can be moved between
-displays? If so, how?
-
-*RESOLVED*: Yes.
-Applications can determine which displays a given plane supports using
-flink:vkGetDisplayPlaneSupportedDisplaysKHR.
-
-17) Should there be a way to destroy display modes? If so, does it support
-destroying "`built in`" modes?
-
-*RESOLVED*: Not in this extension.
-A future extension could add this functionality.
-
-18) What should the lifetime of display and built-in display mode objects
-be?
-
-*RESOLVED*: The lifetime of the instance.
-These objects cannot be destroyed.
-A future extension may be added to expose a way to destroy these objects
-and/or support display hotplug.
-
-19) Should persistent mode for smart panels be enabled/disabled at swapchain
-creation time, or on a per-present basis.
-
-*RESOLVED*: On a per-present basis.
-
-=== Examples
-
-[NOTE]
-.Note
-====
-The example code for the `VK_KHR_display` and
-`apiext:VK_KHR_display_swapchain` extensions was removed from the appendix
-after revision 1.0.43.
-The display enumeration example code was ported to the cube demo that is
-shipped with the official Khronos SDK, and is being kept up-to-date in that
-location (see:
-https://github.com/KhronosGroup/Vulkan-Tools/blob/master/cube/cube.c).
-====
-
-=== Version History
-
- * Revision 1, 2015-02-24 (James Jones)
-   - Initial draft
-
- * Revision 2, 2015-03-12 (Norbert Nopper)
-   - Added overlay enumeration for a display.
-
- * Revision 3, 2015-03-17 (Norbert Nopper)
-   - Fixed typos and namings as discussed in Bugzilla.
-   - Reordered and grouped functions.
-   - Added functions to query count of display, mode and overlay.
-   - Added native display handle, which may be needed on some platforms to
-     create a native Window.
-
- * Revision 4, 2015-03-18 (Norbert Nopper)
-   - Removed primary and virtualPostion members (see comment of James Jones
-     in Bugzilla).
-   - Added native overlay handle to information structure.
-   - Replaced , with ; in struct.
-
- * Revision 6, 2015-03-18 (Daniel Rakos)
-   - Added WSI extension suffix to all items.
-   - Made the whole API more "`Vulkanish`".
-   - Replaced all functions with a single vkGetDisplayInfoKHR function to
-     better match the rest of the API.
-   - Made the display, display mode, and overlay objects be first class
-     objects, not subclasses of VkBaseObject as they do not support the
-     common functions anyways.
-   - Renamed *Info structures to *Properties.
-   - Removed overlayIndex field from VkOverlayProperties as there is an
-     implicit index already as a result of moving to a "`Vulkanish`" API.
-   - Displays are not get through device, but through physical GPU to match
-     the rest of the Vulkan API.
-     Also this is something ISVs explicitly requested.
-   - Added issue (6) and (7).
-
- * Revision 7, 2015-03-25 (James Jones)
-   - Added an issues section
-   - Added rotation and mirroring flags
-
- * Revision 8, 2015-03-25 (James Jones)
-   - Combined the duplicate issues sections introduced in last change.
-   - Added proposed resolutions to several issues.
-
- * Revision 9, 2015-04-01 (Daniel Rakos)
-   - Rebased extension against Vulkan 0.82.0
-
- * Revision 10, 2015-04-01 (James Jones)
-   - Added issues (10) and (11).
-   - Added more straw-man issue resolutions, and cleaned up the proposed
-     resolution for issue (4).
-   - Updated the rotation and mirroring enums to have proper bitmask
-     semantics.
-
- * Revision 11, 2015-04-15 (James Jones)
-   - Added proposed resolution for issues (1) and (2).
-   - Added issues (12), (13), (14), and (15)
-   - Removed pNativeHandle field from overlay structure.
-   - Fixed small compilation errors in example code.
-
- * Revision 12, 2015-07-29 (James Jones)
-   - Rewrote the guts of the extension against the latest WSI swapchain
-     specifications and the latest Vulkan API.
-   - Address overlay planes by their index rather than an object handle and
-     refer to them as "`planes`" rather than "`overlays`" to make it
-     slightly clearer that even a display with no "`overlays`" still has at
-     least one base "`plane`" that images can be displayed on.
-   - Updated most of the issues.
-   - Added an "`extension type`" section to the specification header.
-   - Re-used the VK_EXT_KHR_surface surface transform enumerations rather
-     than redefining them here.
-   - Updated the example code to use the new semantics.
-
- * Revision 13, 2015-08-21 (Ian Elliott)
-   - Renamed this extension and all of its enumerations, types, functions,
-     etc.
-     This makes it compliant with the proposed standard for Vulkan
-     extensions.
-   - Switched from "`revision`" to "`version`", including use of the
-     VK_MAKE_VERSION macro in the header file.
-
- * Revision 14, 2015-09-01 (James Jones)
-   - Restore single-field revision number.
-
- * Revision 15, 2015-09-08 (James Jones)
-   - Added alpha flags enum.
-   - Added premultiplied alpha support.
-
- * Revision 16, 2015-09-08 (James Jones)
-   - Added description section to the spec.
-   - Added issues 16 - 18.
-
- * Revision 17, 2015-10-02 (James Jones)
-   - Planes are now a property of the entire device rather than individual
-     displays.
-     This allows planes to be moved between multiple displays on devices
-     that support it.
-   - Added a function to create a VkSurfaceKHR object describing a display
-     plane and mode to align with the new per-platform surface creation
-     conventions.
-   - Removed detailed mode timing data.
-     It was agreed that the mode extents and refresh rate are sufficient for
-     current use cases.
-     Other information could be added back in as an extension if it is
-     needed in the future.
-   - Added support for smart/persistent/buffered display devices.
-
- * Revision 18, 2015-10-26 (Ian Elliott)
-   - Renamed from VK_EXT_KHR_display to VK_KHR_display.
-
- * Revision 19, 2015-11-02 (James Jones)
-   - Updated example code to match revision 17 changes.
-
- * Revision 20, 2015-11-03 (Daniel Rakos)
-   - Added allocation callbacks to creation functions.
-
- * Revision 21, 2015-11-10 (Jesse Hall)
-   - Added VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR, and use
-     VkDisplayPlaneAlphaFlagBitsKHR for
-     VkDisplayPlanePropertiesKHR::alphaMode instead of
-     VkDisplayPlaneAlphaFlagsKHR, since it only represents one mode.
-   - Added reserved flags bitmask to VkDisplayPlanePropertiesKHR.
-   - Use VkSurfaceTransformFlagBitsKHR instead of obsolete
-     VkSurfaceTransformKHR.
-   - Renamed vkGetDisplayPlaneSupportedDisplaysKHR parameters for clarity.
-
- * Revision 22, 2015-12-18 (James Jones)
-   - Added missing "`planeIndex`" parameter to
-     vkGetDisplayPlaneSupportedDisplaysKHR()
-
- * Revision 23, 2017-03-13 (James Jones)
-   - Closed all remaining issues.
-     The specification and implementations have been shipping with the
-     proposed resolutions for some time now.
-   - Removed the sample code and noted it has been integrated into the
-     official Vulkan SDK cube demo.
diff --git a/registry/vulkan/appendices/VK_KHR_display_swapchain.txt b/registry/vulkan/appendices/VK_KHR_display_swapchain.txt
deleted file mode 100644
index 9874016..0000000
--- a/registry/vulkan/appendices/VK_KHR_display_swapchain.txt
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_display_swapchain.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-03-13
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - James Jones, NVIDIA
-  - Jeff Vigil, Qualcomm
-  - Jesse Hall, Google
-
-=== Description
-
-This extension provides an API to create a swapchain directly on a device's
-display without any underlying window system.
-
-include::{generated}/interfaces/VK_KHR_display_swapchain.txt[]
-
-=== Issues
-
-1) Should swapchains sharing images each hold a reference to the images, or
-should it be up to the application to destroy the swapchains and images in
-an order that avoids the need for reference counting?
-
-*RESOLVED*: Take a reference.
-The lifetime of presentable images is already complex enough.
-
-2) Should the pname:srcRect and pname:dstRect parameters be specified as
-part of the presentation command, or at swapchain creation time?
-
-*RESOLVED*: As part of the presentation command.
-This allows moving and scaling the image on the screen without the need to
-respecify the mode or create a new swapchain and presentable images.
-
-3) Should pname:srcRect and pname:dstRect be specified as rects, or separate
-offset/extent values?
-
-*RESOLVED*: As rects.
-Specifying them separately might make it easier for hardware to expose
-support for one but not the other, but in such cases applications must just
-take care to obey the reported capabilities and not use non-zero offsets or
-extents that require scaling, as appropriate.
-
-4) How can applications create multiple swapchains that use the same images?
-
-*RESOLVED*: By calling flink:vkCreateSharedSwapchainsKHR.
-
-An earlier resolution used flink:vkCreateSwapchainKHR, chaining multiple
-slink:VkSwapchainCreateInfoKHR structures through pname:pNext.
-In order to allow each swapchain to also allow other extension structs, a
-level of indirection was used: slink:VkSwapchainCreateInfoKHR::pname:pNext
-pointed to a different structure, which had both pname:sType and pname:pNext
-members for additional extensions, and also had a pointer to the next
-slink:VkSwapchainCreateInfoKHR structure.
-The number of swapchains to be created could only be found by walking this
-linked list of alternating structures, and the pname:pSwapchains out
-parameter was reinterpreted to be an array of slink:VkSwapchainKHR handles.
-
-Another option considered was a method to specify a "`shared`" swapchain
-when creating a new swapchain, such that groups of swapchains using the same
-images could be built up one at a time.
-This was deemed unusable because drivers need to know all of the displays an
-image will be used on when determining which internal formats and layouts to
-use for that image.
-
-=== Examples
-
-[NOTE]
-.Note
-====
-The example code for the `apiext:VK_KHR_display` and
-`VK_KHR_display_swapchain` extensions was removed from the appendix after
-revision 1.0.43.
-The display swapchain creation example code was ported to the cube demo that
-is shipped with the official Khronos SDK, and is being kept up-to-date in
-that location (see:
-https://github.com/KhronosGroup/Vulkan-Tools/blob/master/cube/cube.c).
-====
-
-=== Version History
-
- * Revision 1, 2015-07-29 (James Jones)
-   - Initial draft
-
- * Revision 2, 2015-08-21 (Ian Elliott)
-   - Renamed this extension and all of its enumerations, types, functions,
-     etc.
-     This makes it compliant with the proposed standard for Vulkan
-     extensions.
-   - Switched from "`revision`" to "`version`", including use of the
-     VK_MAKE_VERSION macro in the header file.
-
- * Revision 3, 2015-09-01 (James Jones)
-   - Restore single-field revision number.
-
- * Revision 4, 2015-09-08 (James Jones)
-   - Allow creating multiple swap chains that share the same images using a
-     single call to vkCreateSwapchainKHR().
-
- * Revision 5, 2015-09-10 (Alon Or-bach)
-   - Removed underscores from SWAP_CHAIN in two enums.
-
- * Revision 6, 2015-10-02 (James Jones)
-   - Added support for smart panels/buffered displays.
-
- * Revision 7, 2015-10-26 (Ian Elliott)
-   - Renamed from VK_EXT_KHR_display_swapchain to VK_KHR_display_swapchain.
-
- * Revision 8, 2015-11-03 (Daniel Rakos)
-   - Updated sample code based on the changes to VK_KHR_swapchain.
-
- * Revision 9, 2015-11-10 (Jesse Hall)
-   - Replaced VkDisplaySwapchainCreateInfoKHR with
-     vkCreateSharedSwapchainsKHR, changing resolution of issue #4.
-
- * Revision 10, 2017-03-13 (James Jones)
-   - Closed all remaining issues.
-     The specification and implementations have been shipping with the
-     proposed resolutions for some time now.
-   - Removed the sample code and noted it has been integrated into the
-     official Vulkan SDK cube demo.
diff --git a/registry/vulkan/appendices/VK_KHR_draw_indirect_count.txt b/registry/vulkan/appendices/VK_KHR_draw_indirect_count.txt
deleted file mode 100644
index e5426cc..0000000
--- a/registry/vulkan/appendices/VK_KHR_draw_indirect_count.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_draw_indirect_count.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-08-25
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Matthaeus G. Chajdas, AMD
-  - Derrick Owens, AMD
-  - Graham Sellers, AMD
-  - Daniel Rakos, AMD
-  - Dominik Witczak, AMD
-  - Piers Daniell, NVIDIA
-
-=== Description
-
-This extension is based off the `apiext:VK_AMD_draw_indirect_count`
-extension.
-This extension allows an application to source the number of draws for
-indirect draw calls from a buffer.
-
-Applications might want to do culling on the GPU via a compute shader prior
-to drawing.
-This enables the application to generate an arbitrary number of drawing
-commands and execute them without host intervention.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-However, if Vulkan 1.2 is supported and this extension is not, the entry
-points flink:vkCmdDrawIndirectCount and flink:vkCmdDrawIndexedIndirectCount
-are optional.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_draw_indirect_count.txt[]
-
-=== Version History
-
- * Revision 1, 2017-08-25 (Piers Daniell)
-   - Initial draft based off VK_AMD_draw_indirect_count
diff --git a/registry/vulkan/appendices/VK_KHR_driver_properties.txt b/registry/vulkan/appendices/VK_KHR_driver_properties.txt
deleted file mode 100644
index 36fea9f..0000000
--- a/registry/vulkan/appendices/VK_KHR_driver_properties.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_driver_properties.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-04-11
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Baldur Karlsson
-  - Matthaeus G. Chajdas, AMD
-  - Piers Daniell, NVIDIA
-  - Alexander Galazin, Arm
-  - Jesse Hall, Google
-  - Daniel Rakos, AMD
-
-=== Description
-
-This extension provides a new physical device query which allows retrieving
-information about the driver implementation, allowing applications to
-determine which physical device corresponds to which particular vendor's
-driver, and which conformance test suite version the driver implementation
-is compliant with.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_driver_properties.txt[]
-
-=== Version History
-
- * Revision 1, 2018-04-11 (Daniel Rakos)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_KHR_dynamic_rendering.txt b/registry/vulkan/appendices/VK_KHR_dynamic_rendering.txt
deleted file mode 100644
index 77ebe3e..0000000
--- a/registry/vulkan/appendices/VK_KHR_dynamic_rendering.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_dynamic_rendering.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-10-06
-*Contributors*::
-  - Tobias Hector, AMD
-  - Arseny Kapoulkine, Roblox
-  - François Duranleau, Gameloft
-  - Stuart Smith, AMD
-  - Hai Nguyen, Google
-  - Jean-François Roy, Google
-  - Jeff Leger, Qualcomm
-  - Jan-Harald Fredriksen, Arm
-  - Piers Daniell, Nvidia
-  - James Fitzpatrick, Imagination
-  - Piotr Byszewski, Mobica
-  - Jesse Hall, Google
-  - Mike Blumenkrantz, Valve
-
-=== Description
-
-This extension allows applications to create single-pass render pass
-instances without needing to create render pass objects or framebuffers.
-Dynamic render passes can also span across multiple primary command buffers,
-rather than relying on secondary command buffers.
-
-This extension also incorporates ename:VK_ATTACHMENT_STORE_OP_NONE_KHR from
-<<VK_QCOM_render_pass_store_ops,VK_QCOM_render_pass_store_ops>>, enabling
-applications to avoid unnecessary synchronization when an attachment is not
-written during a render pass.
-
-include::{generated}/interfaces/VK_KHR_dynamic_rendering.txt[]
-
-=== Version History
-
-  * Revision 1, 2021-10-06 (Tobias Hector)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_external_fence.txt b/registry/vulkan/appendices/VK_KHR_external_fence.txt
deleted file mode 100644
index 68e639e..0000000
--- a/registry/vulkan/appendices/VK_KHR_external_fence.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_external_fence.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-05-08
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-  - Jeff Juliano, NVIDIA
-  - Cass Everitt, Oculus
-  - Contributors to `apiext:VK_KHR_external_semaphore`
-
-=== Description
-
-An application using external memory may wish to synchronize access to that
-memory using fences.
-This extension enables an application to create fences from which non-Vulkan
-handles that reference the underlying synchronization primitive can be
-exported.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_external_fence.txt[]
-
-=== Issues
-
-This extension borrows concepts, semantics, and language from
-`apiext:VK_KHR_external_semaphore`.
-That extension's issues apply equally to this extension.
-
-=== Version History
-
-  * Revision 1, 2017-05-08 (Jesse Hall)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_external_fence_capabilities.txt b/registry/vulkan/appendices/VK_KHR_external_fence_capabilities.txt
deleted file mode 100644
index fe8480b..0000000
--- a/registry/vulkan/appendices/VK_KHR_external_fence_capabilities.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_external_fence_capabilities.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-05-08
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-  - Jeff Juliano, NVIDIA
-  - Cass Everitt, Oculus
-  - Contributors to `apiext:VK_KHR_external_semaphore_capabilities`
-
-=== Description
-
-An application may wish to reference device fences in multiple Vulkan
-logical devices or instances, in multiple processes, and/or in multiple
-APIs.
-This extension provides a set of capability queries and handle definitions
-that allow an application to determine what types of "`external`" fence
-handles an implementation supports for a given set of use cases.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_external_fence_capabilities.txt[]
-
-=== Version History
-
- * Revision 1, 2017-05-08 (Jesse Hall)
-   - Initial version
diff --git a/registry/vulkan/appendices/VK_KHR_external_fence_fd.txt b/registry/vulkan/appendices/VK_KHR_external_fence_fd.txt
deleted file mode 100644
index a043733..0000000
--- a/registry/vulkan/appendices/VK_KHR_external_fence_fd.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_external_fence_fd.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-05-08
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-  - Jeff Juliano, NVIDIA
-  - Cass Everitt, Oculus
-  - Contributors to `apiext:VK_KHR_external_semaphore_fd`
-
-=== Description
-
-An application using external memory may wish to synchronize access to that
-memory using fences.
-This extension enables an application to export fence payload to and import
-fence payload from POSIX file descriptors.
-
-include::{generated}/interfaces/VK_KHR_external_fence_fd.txt[]
-
-=== Issues
-
-This extension borrows concepts, semantics, and language from
-`apiext:VK_KHR_external_semaphore_fd`.
-That extension's issues apply equally to this extension.
-
-=== Version History
-
-  * Revision 1, 2017-05-08 (Jesse Hall)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_external_fence_win32.txt b/registry/vulkan/appendices/VK_KHR_external_fence_win32.txt
deleted file mode 100644
index 5c88d74..0000000
--- a/registry/vulkan/appendices/VK_KHR_external_fence_win32.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_external_fence_win32.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-05-08
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-  - Jeff Juliano, NVIDIA
-  - Cass Everitt, Oculus
-  - Contributors to `apiext:VK_KHR_external_semaphore_win32`
-
-=== Description
-
-An application using external memory may wish to synchronize access to that
-memory using fences.
-This extension enables an application to export fence payload to and import
-fence payload from Windows handles.
-
-include::{generated}/interfaces/VK_KHR_external_fence_win32.txt[]
-
-=== Issues
-
-This extension borrows concepts, semantics, and language from
-`apiext:VK_KHR_external_semaphore_win32`.
-That extension's issues apply equally to this extension.
-
-1) Should D3D12 fence handle types be supported, like they are for
-semaphores?
-
-*RESOLVED*: No.
-Doing so would require extending the fence signal and wait operations to
-provide values to signal / wait for, like sname:VkD3D12FenceSubmitInfoKHR
-does.
-A D3D12 fence can be signaled by importing it into a slink:VkSemaphore
-instead of a slink:VkFence, and applications can check status or wait on the
-D3D12 fence using non-Vulkan APIs.
-The convenience of being able to do these operations on sname:VkFence
-objects does not justify the extra API complexity.
-
-=== Version History
-
-  * Revision 1, 2017-05-08 (Jesse Hall)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_external_memory.txt b/registry/vulkan/appendices/VK_KHR_external_memory.txt
deleted file mode 100644
index 3020529..0000000
--- a/registry/vulkan/appendices/VK_KHR_external_memory.txt
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_external_memory.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-10-20
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Interacts with `apiext:VK_KHR_dedicated_allocation`.
-  - Interacts with `apiext:VK_NV_dedicated_allocation`.
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Jason Ekstrand, Intel
-  - Ian Elliot, Google
-  - Jesse Hall, Google
-  - Tobias Hector, Imagination Technologies
-  - James Jones, NVIDIA
-  - Jeff Juliano, NVIDIA
-  - Matthew Netsch, Qualcomm Technologies, Inc.
-  - Daniel Rakos, AMD
-  - Carsten Rohde, NVIDIA
-  - Ray Smith, ARM
-  - Chad Versace, Google
-
-=== Description
-
-An application may wish to reference device memory in multiple Vulkan
-logical devices or instances, in multiple processes, and/or in multiple
-APIs.
-This extension enables an application to export non-Vulkan handles from
-Vulkan memory objects such that the underlying resources can be referenced
-outside the scope of the Vulkan logical device that created them.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_external_memory.txt[]
-
-=== Issues
-
-1) How do applications correlate two physical devices across process or
-Vulkan instance boundaries?
-
-*RESOLVED*: New device ID fields have been introduced by
-`apiext:VK_KHR_external_memory_capabilities`.
-These fields, combined with the existing
-slink:VkPhysicalDeviceProperties::pname:driverVersion field can be used to
-identify compatible devices across processes, drivers, and APIs.
-slink:VkPhysicalDeviceProperties::pname:pipelineCacheUUID is not sufficient
-for this purpose because despite its description in the specification, it
-need only identify a unique pipeline cache format in practice.
-Multiple devices may be able to use the same pipeline cache data, and hence
-it would be desirable for all of them to have the same pipeline cache UUID.
-However, only the same concrete physical device can be used when sharing
-memory, so an actual unique device ID was introduced.
-Further, the pipeline cache UUID was specific to Vulkan, but correlation
-with other, non-extensible APIs is required to enable interoperation with
-those APIs.
-
-2) If memory objects are shared between processes and APIs, is this
-considered aliasing according to the rules outlined in the
-<<resources-memory-aliasing,Memory Aliasing>> section?
-
-*RESOLVED*: Yes.
-Applications must take care to obey all restrictions imposed on aliased
-resources when using memory across multiple Vulkan instances or other APIs.
-
-3) Are new image layouts or metadata required to specify image layouts and
-layout transitions compatible with non-Vulkan APIs, or with other instances
-of the same Vulkan driver?
-
-*RESOLVED*: Separate instances of the same Vulkan driver running on the same
-GPU should have identical internal layout semantics, so applications have
-the tools they need to ensure views of images are consistent between the two
-instances.
-Other APIs will fall into two categories: Those that are Vulkan- compatible,
-and those that are Vulkan-incompatible.
-Vulkan-incompatible APIs will require the image to be in the GENERAL layout
-whenever they are accessing them.
-
-Note this does not attempt to address cross-device transitions, nor
-transitions to engines on the same device which are not visible within the
-Vulkan API.
-Both of these are beyond the scope of this extension.
-
-4) Is a new barrier flag or operation of some type needed to prepare
-external memory for handoff to another Vulkan instance or API and/or receive
-it from another instance or API?
-
-*RESOLVED*: Yes.
-Some implementations need to perform additional cache management when
-transitioning memory between address spaces and other APIs, instances, or
-processes which may operate in a separate address space.
-Options for defining this transition include:
-
-  * A new structure that can be added to the pname:pNext list in
-    slink:VkMemoryBarrier, slink:VkBufferMemoryBarrier, and
-    slink:VkImageMemoryBarrier.
-  * A new bit in tlink:VkAccessFlags that can be set to indicate an
-    "`external`" access.
-  * A new bit in tlink:VkDependencyFlags
-  * A new special queue family that represents an "`external`" queue.
-
-A new structure has the advantage that the type of external transition can
-be described in as much detail as necessary.
-However, there is not currently a known need for anything beyond
-differentiating between external and internal accesses, so this is likely an
-over-engineered solution.
-The access flag bit has the advantage that it can be applied at buffer,
-image, or global granularity, and semantically it maps pretty well to the
-operation being described.
-Additionally, the API already includes ename:VK_ACCESS_MEMORY_READ_BIT and
-ename:VK_ACCESS_MEMORY_WRITE_BIT which appear to be intended for this
-purpose.
-However, there is no obvious pipeline stage that would correspond to an
-external access, and therefore no clear way to use
-ename:VK_ACCESS_MEMORY_READ_BIT or ename:VK_ACCESS_MEMORY_WRITE_BIT.
-tlink:VkDependencyFlags and tlink:VkPipelineStageFlags operate at command
-granularity rather than image or buffer granularity, which would make an
-entire pipeline barrier an internal->external or external->internal barrier.
-This may not be a problem in practice, but seems like the wrong scope.
-Another downside of tlink:VkDependencyFlags is that it lacks inherent
-directionality: there are no ptext:src and ptext:dst variants of it in the
-barrier or dependency description semantics, so two bits might need to be
-added to describe both internal->external and external->internal
-transitions.
-Transitioning a resource to a special queue family corresponds well with the
-operation of transitioning to a separate Vulkan instance, in that both
-operations ideally include scheduling a barrier on both sides of the
-transition: Both the releasing and the acquiring queue or process.
-Using a special queue family requires adding an additional reserved queue
-family index.
-Re-using ename:VK_QUEUE_FAMILY_IGNORED would have left it unclear how to
-transition a concurrent usage resource from one process to another, since
-the semantics would have likely been equivalent to the currently-ignored
-transition of
-ename:VK_QUEUE_FAMILY_IGNORED{nbsp}->{nbsp}ename:VK_QUEUE_FAMILY_IGNORED.
-Fortunately, creating a new reserved queue family index is not invasive.
-
-Based on the above analysis, the approach of transitioning to a special
-"`external`" queue family was chosen.
-
-5) Do internal driver memory arrangements and/or other internal driver image
-properties need to be exported and imported when sharing images across
-processes or APIs.
-
-*RESOLVED*: Some vendors claim this is necessary on their implementations,
-but it was determined that the security risks of allowing opaque metadata to
-be passed from applications to the driver were too high.
-Therefore, implementations which require metadata will need to associate it
-with the objects represented by the external handles, and rely on the
-dedicated allocation mechanism to associate the exported and imported memory
-objects with a single image or buffer.
-
-6) Most prior interoperation and cross-process sharing APIs have been based
-on image-level sharing.
-Should Vulkan sharing be based on memory-object sharing or image sharing?
-
-*RESOLVED*: These extensions have assumed memory-level sharing is the
-correct granularity.
-Vulkan is a lower-level API than most prior APIs, and as such attempts to
-closely align with to the underlying primitives of the hardware and
-system-level drivers it abstracts.
-In general, the resource that holds the backing store for both images and
-buffers of various types is memory.
-Images and buffers are merely metadata containing brief descriptions of the
-layout of bits within that memory.
-
-Because memory object-based sharing is aligned with the overall Vulkan API
-design, it enables the full range of Vulkan capabilities with external
-objects.
-External memory can be used as backing for sparse images, for example,
-whereas such usage would be awkward at best with a sharing mechanism based
-on higher-level primitives such as images.
-Further, aligning the mechanism with the API in this way provides some hope
-of trivial compatibility with future API enhancements.
-If new objects backed by memory objects are added to the API, they too can
-be used across processes with minimal additions to the base external memory
-APIs.
-
-Earlier APIs implemented interop at a higher level, and this necessitated
-entirely separate sharing APIs for images and buffers.
-To co-exist and interoperate with those APIs, the Vulkan external sharing
-mechanism must accommodate their model.
-However, if it can be agreed that memory-based sharing is the more desirable
-and forward-looking design, legacy interoperation constraints can be
-considered another reason to favor memory-based sharing: while native and
-legacy driver primitives that may be used to implement sharing may not be as
-low-level as the API here suggests, raw memory is still the least common
-denominator among the types.
-Image-based sharing can be cleanly derived from a set of base memory- object
-sharing APIs with minimal effort, whereas image-based sharing does not
-generalize well to buffer or raw-memory sharing.
-Therefore, following the general Vulkan design principle of minimalism, it
-is better to expose interopability with image-based native and external
-primitives via the memory sharing API, and place sufficient limits on their
-usage to ensure they can be used only as backing for equivalent Vulkan
-images.
-This provides a consistent API for applications regardless of which platform
-or external API they are targeting, which makes development of multi-API and
-multi-platform applications simpler.
-
-7) Should Vulkan define a common external handle type and provide Vulkan
-functions to facilitate cross-process sharing of such handles rather than
-relying on native handles to define the external objects?
-
-*RESOLVED*: No.
-Cross-process sharing of resources is best left to native platforms.
-There are myriad security and extensibility issues with such a mechanism,
-and attempting to re-solve all those issues within Vulkan does not align
-with Vulkan's purpose as a graphics API.
-If desired, such a mechanism could be built as a layer or helper library on
-top of the opaque native handle defined in this family of extensions.
-
-8) Must implementations provide additional guarantees about state implicitly
-included in memory objects for those memory objects that may be exported?
-
-*RESOLVED*: Implementations must ensure that sharing memory objects does not
-transfer any information between the exporting and importing instances and
-APIs other than that required to share the data contained in the memory
-objects explicitly shared.
-As specific examples, data from previously freed memory objects that used
-the same underlying physical memory, and data from memory obects using
-adjacent physical memory must not be visible to applications importing an
-exported memory object.
-
-9) Must implementations validate external handles the application provides
-as inputs to memory import operations?
-
-*RESOLVED*: Implementations must return an error to the application if the
-provided memory handle cannot be used to complete the requested import
-operation.
-However, implementations need not validate handles are of the exact type
-specified by the application.
-
-=== Version History
-
- * Revision 1, 2016-10-20 (James Jones)
-   - Initial version
diff --git a/registry/vulkan/appendices/VK_KHR_external_memory_capabilities.txt b/registry/vulkan/appendices/VK_KHR_external_memory_capabilities.txt
deleted file mode 100644
index 22c4931..0000000
--- a/registry/vulkan/appendices/VK_KHR_external_memory_capabilities.txt
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_external_memory_capabilities.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-10-17
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Interacts with `apiext:VK_KHR_dedicated_allocation`.
-  - Interacts with `apiext:VK_NV_dedicated_allocation`.
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Ian Elliot, Google
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-
-=== Description
-
-An application may wish to reference device memory in multiple Vulkan
-logical devices or instances, in multiple processes, and/or in multiple
-APIs.
-This extension provides a set of capability queries and handle definitions
-that allow an application to determine what types of "`external`" memory
-handles an implementation supports for a given set of use cases.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_external_memory_capabilities.txt[]
-
-=== Issues
-
-1) Why do so many external memory capabilities need to be queried on a
-per-memory-handle-type basis?
-
-*PROPOSED RESOLUTION*: This is because some handle types are based on
-OS-native objects that have far more limited capabilities than the very
-generic Vulkan memory objects.
-Not all memory handle types can name memory objects that support 3D images,
-for example.
-Some handle types cannot even support the deferred image and memory binding
-behavior of Vulkan and require specifying the image when allocating or
-importing the memory object.
-
-2) Do the slink:VkExternalImageFormatPropertiesKHR and
-slink:VkExternalBufferPropertiesKHR structs need to include a list of memory
-type bits that support the given handle type?
-
-*PROPOSED RESOLUTION*: No.
-The memory types that do not support the handle types will simply be
-filtered out of the results returned by flink:vkGetImageMemoryRequirements
-and flink:vkGetBufferMemoryRequirements when a set of handle types was
-specified at image or buffer creation time.
-
-3) Should the non-opaque handle types be moved to their own extension?
-
-*PROPOSED RESOLUTION*: Perhaps.
-However, defining the handle type bits does very little and does not require
-any platform-specific types on its own, and it is easier to maintain the
-bitfield values in a single extension for now.
-Presumably more handle types could be added by separate extensions though,
-and it would be midly weird to have some platform-specific ones defined in
-the core spec and some in extensions
-
-4) Do we need a code:D3D11_TILEPOOL type?
-
-*PROPOSED RESOLUTION*: No.
-This is technically possible, but the synchronization is awkward.
-D3D11 surfaces must be synchronized using shared mutexes, and these
-synchronization primitives are shared by the entire memory object, so D3D11
-shared allocations divided among multiple buffer and image bindings may be
-difficult to synchronize.
-
-5) Should the Windows 7-compatible handle types be named "`KMT`" handles or
-"`GLOBAL_SHARE`" handles?
-
-*PROPOSED RESOLUTION*: KMT, simply because it is more concise.
-
-6) How do applications identify compatible devices and drivers across
-instance, process, and API boundaries when sharing memory?
-
-*PROPOSED RESOLUTION*: New device properties are exposed that allow
-applications to correctly correlate devices and drivers.
-A device and driver UUID that must both match to ensure sharing
-compatibility between two Vulkan instances, or a Vulkan instance and an
-extensible external API are added.
-To allow correlating with Direct3D devices, a device LUID is added that
-corresponds to a DXGI adapter LUID.
-A driver ID is not needed for Direct3D because mismatched driver component
-versions are not currently supported on the Windows OS.
-Should support for such configurations be introduced at the OS level,
-further Vulkan extensions would be needed to correlate userspace component
-builds.
-
-=== Version History
-
- * Revision 1, 2016-10-17 (James Jones)
-   - Initial version
diff --git a/registry/vulkan/appendices/VK_KHR_external_memory_fd.txt b/registry/vulkan/appendices/VK_KHR_external_memory_fd.txt
deleted file mode 100644
index 46122ac..0000000
--- a/registry/vulkan/appendices/VK_KHR_external_memory_fd.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_external_memory_fd.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-10-21
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - James Jones, NVIDIA
-  - Jeff Juliano, NVIDIA
-
-=== Description
-
-An application may wish to reference device memory in multiple Vulkan
-logical devices or instances, in multiple processes, and/or in multiple
-APIs.
-This extension enables an application to export POSIX file descriptor
-handles from Vulkan memory objects and to import Vulkan memory objects from
-POSIX file descriptor handles exported from other Vulkan memory objects or
-from similar resources in other APIs.
-
-include::{generated}/interfaces/VK_KHR_external_memory_fd.txt[]
-
-=== Issues
-
-1) Does the application need to close the file descriptor returned by
-flink:vkGetMemoryFdKHR?
-
-*RESOLVED*: Yes, unless it is passed back in to a driver instance to import
-the memory.
-A successful get call transfers ownership of the file descriptor to the
-application, and a successful import transfers it back to the driver.
-Destroying the original memory object will not close the file descriptor or
-remove its reference to the underlying memory resource associated with it.
-
-2) Do drivers ever need to expose multiple file descriptors per memory
-object?
-
-*RESOLVED*: No.
-This would indicate there are actually multiple memory objects, rather than
-a single memory object.
-
-3) How should the valid size and memory type for POSIX file descriptor
-memory handles created outside of Vulkan be specified?
-
-*RESOLVED*: The valid memory types are queried directly from the external
-handle.
-The size will be specified by future extensions that introduce such external
-memory handle types.
-
-=== Version History
-
-  * Revision 1, 2016-10-21 (James Jones)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_external_memory_win32.txt b/registry/vulkan/appendices/VK_KHR_external_memory_win32.txt
deleted file mode 100644
index aadb741..0000000
--- a/registry/vulkan/appendices/VK_KHR_external_memory_win32.txt
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_external_memory_win32.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-10-21
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - James Jones, NVIDIA
-  - Jeff Juliano, NVIDIA
-  - Carsten Rohde, NVIDIA
-
-=== Description
-
-An application may wish to reference device memory in multiple Vulkan
-logical devices or instances, in multiple processes, and/or in multiple
-APIs.
-This extension enables an application to export Windows handles from Vulkan
-memory objects and to import Vulkan memory objects from Windows handles
-exported from other Vulkan memory objects or from similar resources in other
-APIs.
-
-include::{generated}/interfaces/VK_KHR_external_memory_win32.txt[]
-
-=== Issues
-
-1) Do applications need to call code:CloseHandle() on the values returned
-from flink:vkGetMemoryWin32HandleKHR when pname:handleType is
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR?
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-(Jon) This issue refers to a token from
-`apiext:VK_KHR_external_semaphore_win32`, but there is no dependency or
-interaction with that extension defined above.
-====
-endif::editing-notes[]
-
-*RESOLVED*: Yes, unless it is passed back in to another driver instance to
-import the object.
-A successful get call transfers ownership of the handle to the application.
-Destroying the memory object will not destroy the handle or the handle's
-reference to the underlying memory resource.
-
-2) Should the language regarding KMT/Windows 7 handles be moved to a
-separate extension so that it can be deprecated over time?
-
-*RESOLVED*: No.
-Support for them can be deprecated by drivers if they choose, by no longer
-returning them in the supported handle types of the instance level queries.
-
-3) How should the valid size and memory type for windows memory handles
-created outside of Vulkan be specified?
-
-*RESOLVED*: The valid memory types are queried directly from the external
-handle.
-The size is determined by the associated image or buffer memory requirements
-for external handle types that require dedicated allocations, and by the
-size specified when creating the object from which the handle was exported
-for other external handle types.
-
-=== Version History
-
-  * Revision 1, 2016-10-21 (James Jones)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_external_semaphore.txt b/registry/vulkan/appendices/VK_KHR_external_semaphore.txt
deleted file mode 100644
index 8df6c1d..0000000
--- a/registry/vulkan/appendices/VK_KHR_external_semaphore.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_external_semaphore.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-10-21
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Jason Ekstrand, Intel
-  - Jesse Hall, Google
-  - Tobias Hector, Imagination Technologies
-  - James Jones, NVIDIA
-  - Jeff Juliano, NVIDIA
-  - Matthew Netsch, Qualcomm Technologies, Inc.
-  - Ray Smith, ARM
-  - Chad Versace, Google
-
-=== Description
-
-An application using external memory may wish to synchronize access to that
-memory using semaphores.
-This extension enables an application to create semaphores from which
-non-Vulkan handles that reference the underlying synchronization primitive
-can be exported.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_external_semaphore.txt[]
-
-=== Issues
-
-1) Should there be restrictions on what side effects can occur when waiting
-on imported semaphores that are in an invalid state?
-
-*RESOLVED*: Yes.
-Normally, validating such state would be the responsibility of the
-application, and the implementation would be free to enter an undefined:
-state if valid usage rules were violated.
-However, this could cause security concerns when using imported semaphores,
-as it would require the importing application to trust the exporting
-application to ensure the state is valid.
-Requiring this level of trust is undesirable for many potential use cases.
-
-2) Must implementations validate external handles the application provides
-as input to semaphore state import operations?
-
-*RESOLVED*: Implementations must return an error to the application if the
-provided semaphore state handle cannot be used to complete the requested
-import operation.
-However, implementations need not validate handles are of the exact type
-specified by the application.
-
-=== Version History
-
-  * Revision 1, 2016-10-21 (James Jones)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_external_semaphore_capabilities.txt b/registry/vulkan/appendices/VK_KHR_external_semaphore_capabilities.txt
deleted file mode 100644
index 94f9fc3..0000000
--- a/registry/vulkan/appendices/VK_KHR_external_semaphore_capabilities.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_external_semaphore_capabilities.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-10-20
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-  - Jeff Juliano, NVIDIA
-
-=== Description
-
-An application may wish to reference device semaphores in multiple Vulkan
-logical devices or instances, in multiple processes, and/or in multiple
-APIs.
-This extension provides a set of capability queries and handle definitions
-that allow an application to determine what types of "`external`" semaphore
-handles an implementation supports for a given set of use cases.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_external_semaphore_capabilities.txt[]
-
-=== Version History
-
-  * Revision 1, 2016-10-20 (James Jones)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_external_semaphore_fd.txt b/registry/vulkan/appendices/VK_KHR_external_semaphore_fd.txt
deleted file mode 100644
index 34d89c2..0000000
--- a/registry/vulkan/appendices/VK_KHR_external_semaphore_fd.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_external_semaphore_fd.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-10-21
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-  - Jeff Juliano, NVIDIA
-  - Carsten Rohde, NVIDIA
-
-=== Description
-
-An application using external memory may wish to synchronize access to that
-memory using semaphores.
-This extension enables an application to export semaphore payload to and
-import semaphore payload from POSIX file descriptors.
-
-include::{generated}/interfaces/VK_KHR_external_semaphore_fd.txt[]
-
-=== Issues
-
-1) Does the application need to close the file descriptor returned by
-flink:vkGetSemaphoreFdKHR?
-
-*RESOLVED*: Yes, unless it is passed back in to a driver instance to import
-the semaphore.
-A successful get call transfers ownership of the file descriptor to the
-application, and a successful import transfers it back to the driver.
-Destroying the original semaphore object will not close the file descriptor
-or remove its reference to the underlying semaphore resource associated with
-it.
-
-=== Version History
-
-  * Revision 1, 2016-10-21 (Jesse Hall)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_external_semaphore_win32.txt b/registry/vulkan/appendices/VK_KHR_external_semaphore_win32.txt
deleted file mode 100644
index 780c3f0..0000000
--- a/registry/vulkan/appendices/VK_KHR_external_semaphore_win32.txt
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_external_semaphore_win32.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-10-21
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - James Jones, NVIDIA
-  - Jeff Juliano, NVIDIA
-  - Carsten Rohde, NVIDIA
-
-=== Description
-
-An application using external memory may wish to synchronize access to that
-memory using semaphores.
-This extension enables an application to export semaphore payload to and
-import semaphore payload from Windows handles.
-
-include::{generated}/interfaces/VK_KHR_external_semaphore_win32.txt[]
-
-=== Issues
-
-1) Do applications need to call code:CloseHandle() on the values returned
-from flink:vkGetSemaphoreWin32HandleKHR when pname:handleType is
-ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR?
-
-*RESOLVED*: Yes, unless it is passed back in to another driver instance to
-import the object.
-A successful get call transfers ownership of the handle to the application.
-Destroying the semaphore object will not destroy the handle or the handle's
-reference to the underlying semaphore resource.
-
-2) Should the language regarding KMT/Windows 7 handles be moved to a
-separate extension so that it can be deprecated over time?
-
-*RESOLVED*: No.
-Support for them can be deprecated by drivers if they choose, by no longer
-returning them in the supported handle types of the instance level queries.
-
-3) Should applications be allowed to specify additional object attributes
-for shared handles?
-
-*RESOLVED*: Yes.
-Applications will be allowed to provide similar attributes to those they
-would to any other handle creation API.
-
-4) How do applications communicate the desired fence values to use with
-etext:D3D12_FENCE-based Vulkan semaphores?
-
-*RESOLVED*: There are a couple of options.
-The values for the signaled and reset states could be communicated up front
-when creating the object and remain static for the life of the Vulkan
-semaphore, or they could be specified using auxiliary structures when
-submitting semaphore signal and wait operations, similar to what is done
-with the keyed mutex extensions.
-The latter is more flexible and consistent with the keyed mutex usage, but
-the former is a much simpler API.
-
-Since Vulkan tends to favor flexibility and consistency over simplicity, a
-new structure specifying D3D12 fence acquire and release values is added to
-the flink:vkQueueSubmit function.
-
-=== Version History
-
-  * Revision 1, 2016-10-21 (James Jones)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_format_feature_flags2.txt b/registry/vulkan/appendices/VK_KHR_format_feature_flags2.txt
deleted file mode 100644
index 2e39b6b..0000000
--- a/registry/vulkan/appendices/VK_KHR_format_feature_flags2.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_format_feature_flags2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-07-01
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Lionel Landwerlin, Intel
-  - Jason Ekstrand, Intel
-  - Tobias Hector, AMD
-  - Spencer Fricke, Samsung Electronics
-  - Graeme Leese, Broadcom
-  - Jan-Harald Fredriksen, ARM
-
-=== Description
-
-This extension adds a new elink:VkFormatFeatureFlagBits2KHR 64bits format
-feature flag type to extend the existing elink:VkFormatFeatureFlagBits which
-is limited to 31 flags.
-At the time of this writing 29 bits of elink:VkFormatFeatureFlagBits are
-already used.
-
-Because slink:VkFormatProperties2 is already defined to extend the Vulkan
-1.0 flink:vkGetPhysicalDeviceFormatProperties entry point, this extension
-defines a new slink:VkFormatProperties3KHR to extend the
-slink:VkFormatProperties.
-
-On top of replicating all the bits from elink:VkFormatFeatureFlagBits,
-elink:VkFormatFeatureFlagBits2KHR adds the following bits :
-
-  * ename:VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR and
-    ename:VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR indicate
-    that an implementation supports respectively reading and writing a given
-    elink:VkFormat through storage operations without specifying the format
-    in the shader.
-
-  * ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR
-    indicates that an implementation supports depth comparison performed by
-    code:OpImage*Dref instructions on a given elink:VkFormat.
-    Previously the result of executing a code:OpImage*Dref* instruction on
-    an image view, where the pname:format was not one of the depth/stencil
-    formats with a depth component, was undefined.
-    This bit clarifies on which formats such instructions can be used.
-
-include::{generated}/interfaces/VK_KHR_format_feature_flags2.txt[]
-
-=== Version History
-
- * Revision 1, 2020-07-21 (Lionel Landwerlin)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_KHR_fragment_shading_rate.txt b/registry/vulkan/appendices/VK_KHR_fragment_shading_rate.txt
deleted file mode 100644
index 2b23e3f..0000000
--- a/registry/vulkan/appendices/VK_KHR_fragment_shading_rate.txt
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_fragment_shading_rate.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-09-30
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_fragment_shading_rate.html[`SPV_KHR_fragment_shading_rate`].
-*Contributors*::
-  - Tobias Hector, AMD
-  - Guennadi Riguer, AMD
-  - Matthaeus Chajdas, AMD
-  - Pat Brown, Nvidia
-  - Matthew Netsch, Qualcomm
-  - Slawomir Grajewski, Intel
-  - Jan-Harald Fredriksen, Arm
-  - Jeff Bolz, Nvidia
-  - Contributors to the VK_NV_shading_rate_image specification
-  - Contributors to the VK_EXT_fragment_density_map specification
-
-=== Description
-
-This extension adds the ability to change the rate at which fragments are
-shaded.
-Rather than the usual single fragment invocation for each pixel covered by a
-primitive, multiple pixels can be shaded by a single fragment shader
-invocation.
-
-Up to three methods are available to the application to change the fragment
-shading rate:
-
- - <<primsrast-fragment-shading-rate-pipeline>>, which allows the
-   specification of a rate per-draw.
- - <<primsrast-fragment-shading-rate-primitive>>, which allows the
-   specification of a rate per primitive, specified during shading.
- - <<primsrast-fragment-shading-rate-attachment>>, which allows the
-   specification of a rate per-region of the framebuffer, specified in a
-   specialized image attachment.
-
-Additionally, these rates can all be specified and combined in order to
-adjust the overall detail in the image at each point.
-
-This functionality can be used to focus shading efforts where higher levels
-of detail are needed in some parts of a scene compared to others.
-This can be particularly useful in high resolution rendering, or for XR
-contexts.
-
-This extension also adds support for the `SPV_KHR_fragment_shading_rate`
-extension which enables setting the
-<<primsrast-fragment-shading-rate-primitive, primitive fragment shading
-rate>>, and allows querying the final shading rate from a fragment shader.
-
-include::{generated}/interfaces/VK_KHR_fragment_shading_rate.txt[]
-
-=== Version History
-
-  * Revision 1, 2020-05-06 (Tobias Hector)
-    - Initial revision
-  * Revision 2, 2021-09-30 (Jon Leech)
-    - Add interaction with `apiext:VK_KHR_format_feature_flags2` to `vk.xml`
diff --git a/registry/vulkan/appendices/VK_KHR_get_display_properties2.txt b/registry/vulkan/appendices/VK_KHR_get_display_properties2.txt
deleted file mode 100644
index afe6365..0000000
--- a/registry/vulkan/appendices/VK_KHR_get_display_properties2.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_get_display_properties2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-02-21
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Ian Elliott, Google
-  - James Jones, NVIDIA
-
-=== Description
-
-This extension provides new entry points to query device display properties
-and capabilities in a way that can be easily extended by other extensions,
-without introducing any further entry points.
-This extension can be considered the `apiext:VK_KHR_display` equivalent of
-the `apiext:VK_KHR_get_physical_device_properties2` extension.
-
-include::{generated}/interfaces/VK_KHR_get_display_properties2.txt[]
-
-=== Issues
-
-1) What should this extension be named?
-
-*RESOLVED*: `VK_KHR_get_display_properties2`.
-Other alternatives:
-
-  * `VK_KHR_display2`
-  * One extension, combined with `VK_KHR_surface_capabilites2`.
-
-2) Should extensible input structs be added for these new functions:
-
-*RESOLVED*:
-
-  * flink:vkGetPhysicalDeviceDisplayProperties2KHR: No.
-    The only current input is a slink:VkPhysicalDevice.
-    Other inputs would not make sense.
-  * flink:vkGetPhysicalDeviceDisplayPlaneProperties2KHR: No.
-    The only current input is a slink:VkPhysicalDevice.
-    Other inputs wouldn't make sense.
-  * flink:vkGetDisplayModeProperties2KHR: No.
-    The only current inputs are a slink:VkPhysicalDevice and a
-    slink:VkDisplayModeKHR.
-    Other inputs wouldn't make sense.
-
-3) Should additional display query functions be extended?
-
-*RESOLVED*:
-
-  * flink:vkGetDisplayPlaneSupportedDisplaysKHR: No.
-    Extensions should instead extend
-    flink:vkGetDisplayPlaneCapabilitiesKHR().
-
-=== Version History
-
- * Revision 1, 2017-02-21 (James Jones)
-   - Initial draft.
diff --git a/registry/vulkan/appendices/VK_KHR_get_memory_requirements2.txt b/registry/vulkan/appendices/VK_KHR_get_memory_requirements2.txt
deleted file mode 100644
index d3f9494..0000000
--- a/registry/vulkan/appendices/VK_KHR_get_memory_requirements2.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_get_memory_requirements2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-09-05
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Jason Ekstrand, Intel
-  - Jeff Bolz, NVIDIA
-  - Jesse Hall, Google
-
-=== Description
-
-This extension provides new entry points to query memory requirements of
-images and buffers in a way that can be easily extended by other extensions,
-without introducing any further entry points.
-The Vulkan 1.0 slink:VkMemoryRequirements and
-slink:VkSparseImageMemoryRequirements structures do not include pname:sType
-and pname:pNext members.
-This extension wraps them in new structures with these members, so an
-application can query a chain of memory requirements structures by
-constructing the chain and letting the implementation fill them in.
-A new command is added for each ftext:vkGet*MemoryRequrements command in
-core Vulkan 1.0.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_get_memory_requirements2.txt[]
-
-=== Version History
-
- * Revision 1, 2017-03-23 (Jason Ekstrand)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_KHR_get_physical_device_properties2.txt b/registry/vulkan/appendices/VK_KHR_get_physical_device_properties2.txt
deleted file mode 100644
index d8a75fc..0000000
--- a/registry/vulkan/appendices/VK_KHR_get_physical_device_properties2.txt
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_get_physical_device_properties2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-09-05
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Ian Elliott, Google
-
-=== Description
-
-This extension provides new entry points to query device features, device
-properties, and format properties in a way that can be easily extended by
-other extensions, without introducing any further entry points.
-The Vulkan 1.0 feature/limit/formatproperty structures do not include
-ptext:sType/ptext:pNext members.
-This extension wraps them in new structures with ptext:sType/ptext:pNext
-members, so an application can query a chain of feature/limit/formatproperty
-structures by constructing the chain and letting the implementation fill
-them in.
-A new command is added for each ftext:vkGetPhysicalDevice* command in core
-Vulkan 1.0.
-The new feature structure (and a pname:pNext chain of extending structures)
-can also be passed in to device creation to enable features.
-
-This extension also allows applications to use the physical-device
-components of device extensions before flink:vkCreateDevice is called.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_get_physical_device_properties2.txt[]
-
-=== Examples
-
-[source,c++]
-----------------------------------------
-
-    // Get features with a hypothetical future extension.
-    VkHypotheticalExtensionFeaturesKHR hypotheticalFeatures =
-    {
-        VK_STRUCTURE_TYPE_HYPOTHETICAL_FEATURES_KHR,                // sType
-        NULL,                                                       // pNext
-    };
-
-    VkPhysicalDeviceFeatures2KHR features =
-    {
-        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR,           // sType
-        &hypotheticalFeatures,                                      // pNext
-    };
-
-    // After this call, features and hypotheticalFeatures have been filled out.
-    vkGetPhysicalDeviceFeatures2KHR(physicalDevice, &features);
-
-    // Properties/limits can be chained and queried similarly.
-
-    // Enable some features:
-    VkHypotheticalExtensionFeaturesKHR enabledHypotheticalFeatures =
-    {
-        VK_STRUCTURE_TYPE_HYPOTHETICAL_FEATURES_KHR,                // sType
-        NULL,                                                       // pNext
-    };
-
-    VkPhysicalDeviceFeatures2KHR enabledFeatures =
-    {
-        VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR,           // sType
-        &enabledHypotheticalFeatures,                               // pNext
-    };
-
-    enabledFeatures.features.xyz = VK_TRUE;
-    enabledHypotheticalFeatures.abc = VK_TRUE;
-
-    VkDeviceCreateInfo deviceCreateInfo =
-    {
-        VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,                       // sType
-        &enabledFeatures,                                           // pNext
-        ...
-        NULL,                                                       // pEnabledFeatures
-    };
-
-    VkDevice device;
-    vkCreateDevice(physicalDevice, &deviceCreateInfo, NULL, &device);
-
-----------------------------------------
-
-=== Version History
-
- * Revision 1, 2016-09-12 (Jeff Bolz)
-   - Internal revisions
-
- * Revision 2, 2016-11-02 (Ian Elliott)
-   - Added ability for applications to use the physical-device components of
-     device extensions before vkCreateDevice is called.
diff --git a/registry/vulkan/appendices/VK_KHR_get_surface_capabilities2.txt b/registry/vulkan/appendices/VK_KHR_get_surface_capabilities2.txt
deleted file mode 100644
index 0b04af4..0000000
--- a/registry/vulkan/appendices/VK_KHR_get_surface_capabilities2.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_get_surface_capabilities2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-02-27
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Ian Elliott, Google
-  - James Jones, NVIDIA
-  - Alon Or-bach, Samsung
-
-=== Description
-
-This extension provides new entry points to query device surface
-capabilities in a way that can be easily extended by other extensions,
-without introducing any further entry points.
-This extension can be considered the `apiext:VK_KHR_surface` equivalent of
-the `apiext:VK_KHR_get_physical_device_properties2` extension.
-
-include::{generated}/interfaces/VK_KHR_get_surface_capabilities2.txt[]
-
-=== Issues
-
-1) What should this extension be named?
-
-*RESOLVED*: `VK_KHR_get_surface_capabilities2`.
-Other alternatives:
-
-  * `VK_KHR_surface2`
-  * One extension, combining a separate display-specific query extension.
-
-2) Should additional WSI query functions be extended?
-
-*RESOLVED*:
-
-  * flink:vkGetPhysicalDeviceSurfaceCapabilitiesKHR: Yes.
-    The need for this motivated the extension.
-  * flink:vkGetPhysicalDeviceSurfaceSupportKHR: No.
-    Currently only has boolean output.
-    Extensions should instead extend
-    flink:vkGetPhysicalDeviceSurfaceCapabilities2KHR.
-  * flink:vkGetPhysicalDeviceSurfaceFormatsKHR: Yes.
-  * flink:vkGetPhysicalDeviceSurfacePresentModesKHR: No.
-    Recent discussion concluded this introduced too much variability for
-    applications to deal with.
-    Extensions should instead extend
-    flink:vkGetPhysicalDeviceSurfaceCapabilities2KHR.
-  * flink:vkGetPhysicalDeviceXlibPresentationSupportKHR: Not in this
-    extension.
-  * flink:vkGetPhysicalDeviceXcbPresentationSupportKHR: Not in this
-    extension.
-  * flink:vkGetPhysicalDeviceWaylandPresentationSupportKHR: Not in this
-    extension.
-  * flink:vkGetPhysicalDeviceWin32PresentationSupportKHR: Not in this
-    extension.
-
-=== Version History
-
- * Revision 1, 2017-02-27 (James Jones)
-   - Initial draft.
diff --git a/registry/vulkan/appendices/VK_KHR_image_format_list.txt b/registry/vulkan/appendices/VK_KHR_image_format_list.txt
deleted file mode 100644
index df1ce39..0000000
--- a/registry/vulkan/appendices/VK_KHR_image_format_list.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2016-2020 Intel Corporation
-//
-// SPDX-License-Identifier: Apache-2.0
-
-include::{generated}/meta/{refprefix}VK_KHR_image_format_list.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-03-20
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jason Ekstrand, Intel
-  - Jan-Harald Fredriksen, ARM
-  - Jeff Bolz, NVIDIA
-  - Jeff Leger, Qualcomm
-  - Neil Henning, Codeplay
-
-=== Description
-
-On some implementations, setting the
-ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT on image creation can cause access
-to that image to perform worse than an equivalent image created without
-ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT because the implementation does not
-know what view formats will be paired with the image.
-
-This extension allows an application to provide the list of all formats that
-can: be used with an image when it is created.
-The implementation may then be able to create a more efficient image that
-supports the subset of formats required by the application without having to
-support all formats in the format compatibility class of the image format.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_image_format_list.txt[]
-
-=== Version History
-
-  * Revision 1, 2017-03-20 (Jason Ekstrand)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_imageless_framebuffer.txt b/registry/vulkan/appendices/VK_KHR_imageless_framebuffer.txt
deleted file mode 100644
index 2a4a6ee..0000000
--- a/registry/vulkan/appendices/VK_KHR_imageless_framebuffer.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_imageless_framebuffer.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-12-14
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*Contributors*::
-  - Tobias Hector
-  - Graham Wihlidal
-
-=== Description
-
-This extension allows framebuffers to be created without the need for
-creating images first, allowing more flexibility in how they are used, and
-avoiding the need for many of the confusing compatibility rules.
-
-Framebuffers are now created with a small amount of additional metadata
-about the image views that will be used in
-slink:VkFramebufferAttachmentsCreateInfoKHR, and the actual image views are
-provided at render pass begin time via
-slink:VkRenderPassAttachmentBeginInfoKHR.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_imageless_framebuffer.txt[]
-
-=== Version History
-
- * Revision 1, 2018-12-14 (Tobias Hector)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_KHR_incremental_present.txt b/registry/vulkan/appendices/VK_KHR_incremental_present.txt
deleted file mode 100644
index 7766cbd..0000000
--- a/registry/vulkan/appendices/VK_KHR_incremental_present.txt
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_incremental_present.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-11-02
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Ian Elliott, Google
-  - Jesse Hall, Google
-  - Alon Or-bach, Samsung
-  - James Jones, NVIDIA
-  - Daniel Rakos, AMD
-  - Ray Smith, ARM
-  - Mika Isojarvi, Google
-  - Jeff Juliano, NVIDIA
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This device extension extends flink:vkQueuePresentKHR, from the
-`apiext:VK_KHR_swapchain` extension, allowing an application to specify a
-list of rectangular, modified regions of each image to present.
-This should be used in situations where an application is only changing a
-small portion of the presentable images within a swapchain, since it enables
-the presentation engine to avoid wasting time presenting parts of the
-surface that have not changed.
-
-This extension is leveraged from the `EGL_KHR_swap_buffers_with_damage`
-extension.
-
-include::{generated}/interfaces/VK_KHR_incremental_present.txt[]
-
-=== Issues
-
-1) How should we handle steroescopic-3D swapchains? We need to add a layer
-for each rectangle.
-One approach is to create another struct containing the slink:VkRect2D plus
-layer, and have slink:VkPresentRegionsKHR point to an array of that struct.
-Another approach is to have two parallel arrays, ptext:pRectangles and
-ptext:pLayers, where ptext:pRectangles[i] and ptext:pLayers[i] must be used
-together.
-Which approach should we use, and if the array of a new structure, what
-should that be called?
-
-*RESOLVED*: Create a new structure, which is a slink:VkRect2D plus a layer,
-and will be called slink:VkRectLayerKHR.
-
-2) Where is the origin of the slink:VkRectLayerKHR?
-
-*RESOLVED*: The upper left corner of the presentable image(s) of the
-swapchain, per the definition of framebuffer coordinates.
-
-3) Does the rectangular region, slink:VkRectLayerKHR, specify pixels of the
-swapchain's image(s), or of the surface?
-
-*RESOLVED*: Of the image(s).
-Some presentation engines may scale the pixels of a swapchain's image(s) to
-the size of the surface.
-The size of the swapchain's image(s) will be consistent, where the size of
-the surface may vary over time.
-
-4) What if all of the rectangles for a given swapchain contain a width
-and/or height of zero?
-
-*RESOLVED*: The application is indicating that no pixels changed since the
-last present.
-The presentation engine may use such a hint and not update any pixels for
-the swapchain.
-However, all other semantics of flink:vkQueuePresentKHR must still be
-honored, including waiting for semaphores to signal.
-
-5) When the swapchain is created with
-sname:VkSwapchainCreateInfoKHR::pname:preTransform set to a value other than
-ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, should the rectangular region,
-slink:VkRectLayerKHR, be transformed to align with the pname:preTransform?
-
-*RESOLVED*: No.
-The rectangular region in slink:VkRectLayerKHR should not be tranformed.
-As such, it may not align with the extents of the swapchain's image(s).
-It is the responsibility of the presentation engine to transform the
-rectangular region.
-This matches the behavior of the Android presentation engine, which set the
-precedent.
-
-=== Version History
-
- * Revision 1, 2016-11-02 (Ian Elliott)
-   - Internal revisions
- * Revision 2, 2021-03-18 (Ian Elliott)
-   - Clarified alignment of rectangles for presentation engines that support
-     transformed swapchains.
diff --git a/registry/vulkan/appendices/VK_KHR_maintenance1.txt b/registry/vulkan/appendices/VK_KHR_maintenance1.txt
deleted file mode 100644
index 3656b01..0000000
--- a/registry/vulkan/appendices/VK_KHR_maintenance1.txt
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_maintenance1.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-03-13
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Dan Ginsburg, Valve
-  - Daniel Koch, NVIDIA
-  - Daniel Rakos, AMD
-  - Jan-Harald Fredriksen, ARM
-  - Jason Ekstrand, Intel
-  - Jeff Bolz, NVIDIA
-  - Jesse Hall, Google
-  - John Kessenich, Google
-  - Michael Worcester, Imagination Technologies
-  - Neil Henning, Codeplay Software Ltd.
-  - Piers Daniell, NVIDIA
-  - Slawomir Grajewski, Intel
-  - Tobias Hector, Imagination Technologies
-  - Tom Olson, ARM
-
-=== Description
-
-`VK_KHR_maintenance1` adds a collection of minor features that were
-intentionally left out or overlooked from the original Vulkan 1.0 release.
-
-The new features are as follows:
-
-  * Allow 2D and 2D array image views to be created from 3D images, which
-    can then be used as color framebuffer attachments.
-    This allows applications to render to slices of a 3D image.
-  * Support flink:vkCmdCopyImage between 2D array layers and 3D slices.
-    This extension allows copying from layers of a 2D array image to slices
-    of a 3D image and vice versa.
-  * Allow negative height to be specified in the
-    slink:VkViewport::pname:height field to perform y-inversion of the
-    clip-space to framebuffer-space transform.
-    This allows apps to avoid having to use `gl_Position.y = -gl_Position.y`
-    in shaders also targeting other APIs.
-  * Allow implementations to express support for doing just transfers and
-    clears of image formats that they otherwise support no other format
-    features for.
-    This is done by adding new format feature flags
-    ename:VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR and
-    ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR.
-  * Support flink:vkCmdFillBuffer on transfer-only queues.
-    Previously flink:vkCmdFillBuffer was defined to only work on command
-    buffers allocated from command pools which support graphics or compute
-    queues.
-    It is now allowed on queues that just support transfer operations.
-  * Fix the inconsistency of how error conditions are returned between the
-    flink:vkCreateGraphicsPipelines and flink:vkCreateComputePipelines
-    functions and the flink:vkAllocateDescriptorSets and
-    flink:vkAllocateCommandBuffers functions.
-  * Add new ename:VK_ERROR_OUT_OF_POOL_MEMORY_KHR error so implementations
-    can give a more precise reason for flink:vkAllocateDescriptorSets
-    failures.
-  * Add a new command flink:vkTrimCommandPoolKHR which gives the
-    implementation an opportunity to release any unused command pool memory
-    back to the system.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_maintenance1.txt[]
-
-=== Issues
-
-  . Are viewports with zero height allowed?
-+
-*RESOLVED*: Yes, although they have low utility.
-
-=== Version History
-
- * Revision 1, 2016-10-26 (Piers Daniell)
-   - Internal revisions
- * Revision 2, 2018-03-13 (Jon Leech)
-   - Add issue for zero-height viewports
diff --git a/registry/vulkan/appendices/VK_KHR_maintenance2.txt b/registry/vulkan/appendices/VK_KHR_maintenance2.txt
deleted file mode 100644
index e07767e..0000000
--- a/registry/vulkan/appendices/VK_KHR_maintenance2.txt
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_maintenance2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-09-05
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Michael Worcester, Imagination Technologies
-  - Stuart Smith, Imagination Technologies
-  - Jeff Bolz, NVIDIA
-  - Daniel Koch, NVIDIA
-  - Jan-Harald Fredriksen, ARM
-  - Daniel Rakos, AMD
-  - Neil Henning, Codeplay
-  - Piers Daniell, NVIDIA
-
-=== Description
-
-`VK_KHR_maintenance2` adds a collection of minor features that were
-intentionally left out or overlooked from the original Vulkan 1.0 release.
-
-The new features are as follows:
-
-  * Allow the application to specify which aspect of an input attachment
-    might be read for a given subpass.
-  * Allow implementations to express the clipping behavior of points.
-  * Allow creating images with usage flags that may not be supported for the
-    base image's format, but are supported for image views of the image that
-    have a different but compatible format.
-  * Allow creating uncompressed image views of compressed images.
-  * Allow the application to select between an upper-left and lower-left
-    origin for the tessellation domain space.
-  * Adds two new image layouts for depth stencil images to allow either the
-    depth or stencil aspect to be read-only while the other aspect is
-    writable.
-
-=== Input Attachment Specification
-
-Input attachment specification allows an application to specify which aspect
-of a multi-aspect image (e.g. a combined depth stencil format) will be
-accessed via a code:subpassLoad operation.
-
-On some implementations there may: be a performance penalty if the
-implementation does not know (at flink:vkCreateRenderPass time) which
-aspect(s) of multi-aspect images can: be accessed as input attachments.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_maintenance2.txt[]
-
-=== Input Attachment Specification Example
-
-Consider the case where a render pass has two subpasses and two attachments.
-
-Attachment 0 has the format ename:VK_FORMAT_D24_UNORM_S8_UINT, attachment 1
-has some color format.
-
-Subpass 0 writes to attachment 0, subpass 1 reads only the depth information
-from attachment 0 (using inputAttachmentRead) and writes to attachment 1.
-
-[source,c++]
-----------------------------------------
-    VkInputAttachmentAspectReferenceKHR references[] = {
-        {
-            .subpass = 1,
-            .inputAttachmentIndex = 0,
-            .aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT
-        }
-    };
-
-    VkRenderPassInputAttachmentAspectCreateInfoKHR specifyAspects = {
-        .sType = VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR,
-        .pNext = NULL,
-        .aspectReferenceCount = 1,
-        .pAspectReferences = references
-    };
-
-
-    VkRenderPassCreateInfo createInfo = {
-        ...
-        .pNext = &specifyAspects,
-        ...
-    };
-
-    vkCreateRenderPass(...);
-----------------------------------------
-
-=== Issues
-
-1) What is the default tessellation domain origin?
-
-*RESOLVED*: Vulkan 1.0 originally inadvertently documented a lower-left
-origin, but the conformance tests and all implementations implemented an
-upper-left origin.
-This extension adds a control to select between lower-left (for
-compatibility with OpenGL) and upper-left, and we retroactively fix
-unextended Vulkan to have a default of an upper-left origin.
-
-=== Version History
-
- * Revision 1, 2017-04-28
diff --git a/registry/vulkan/appendices/VK_KHR_maintenance3.txt b/registry/vulkan/appendices/VK_KHR_maintenance3.txt
deleted file mode 100644
index 71f6fea..0000000
--- a/registry/vulkan/appendices/VK_KHR_maintenance3.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_maintenance3.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-09-05
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-`VK_KHR_maintenance3` adds a collection of minor features that were
-intentionally left out or overlooked from the original Vulkan 1.0 release.
-
-The new features are as follows:
-
-  * A limit on the maximum number of descriptors that are supported in a
-    single descriptor set layout.
-    Some implementations have a limit on the total size of descriptors in a
-    set, which cannot be expressed in terms of the limits in Vulkan 1.0.
-  * A limit on the maximum size of a single memory allocation.
-    Some platforms have kernel interfaces that limit the maximum size of an
-    allocation.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_maintenance3.txt[]
-
-=== Version History
-
- * Revision 1, 2017-08-22
diff --git a/registry/vulkan/appendices/VK_KHR_maintenance4.txt b/registry/vulkan/appendices/VK_KHR_maintenance4.txt
deleted file mode 100644
index 04d4944..0000000
--- a/registry/vulkan/appendices/VK_KHR_maintenance4.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_maintenance4.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-08-18
-*Interactions and External Dependencies*::
-  - Requires SPIR-V 1.2 for code:LocalSizeId
-*Contributors*::
-  - Lionel Duc, NVIDIA
-  - Jason Ekstrand, Intel
-  - Spencer Fricke, Samsung
-  - Tobias Hector, AMD
-  - Lionel Landwerlin, Intel
-  - Graeme Leese, Broadcom
-  - Tom Olson, Arm
-  - Stu Smith, AMD
-
-=== Description
-
-`VK_KHR_maintenance4` adds a collection of minor features, none of which
-would warrant an entire extension of their own.
-
-The new features are as follows:
-
-  * Allow the application to destroy their slink:VkPipelineLayout object
-    immediately after it was used to create another object.
-    It is no longer necessary to keep its handle valid while the created
-    object is in use.
-  * Add a new <<limits-maxBufferSize, pname:maxBufferSize>>
-    implementation-defined limit for the maximum size sname:VkBuffer that
-    can: be created.
-  * Add support for the SPIR-V 1.2 code:LocalSizeId execution mode, which
-    can be used as an alternative to code:LocalSize to specify the local
-    workgroup size with specialization constants.
-  * Add a guarantee that images created with identical creation parameters
-    will always have the same alignment requirements.
-  * Add new flink:vkGetDeviceBufferMemoryRequirementsKHR,
-    flink:vkGetDeviceImageMemoryRequirementsKHR, and
-    flink:vkGetDeviceImageSparseMemoryRequirementsKHR to allow the
-    application to query the image memory requirements without having to
-    create an image object and query it.
-  * Relax the requirement that push constants must be initialized before
-    they are dynamically accessed.
-  * Relax the interface matching rules to allow a larger output vector to
-    match with a smaller input vector, with additional values being
-    discarded.
-  
-include::{generated}/interfaces/VK_KHR_maintenance4.txt[]
-
-=== Issues
-
-None.
-
-=== Version History
-
- * Revision 1, 2021-08-18 (Piers Daniell)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_KHR_multiview.txt b/registry/vulkan/appendices/VK_KHR_multiview.txt
deleted file mode 100644
index 6775cf0..0000000
--- a/registry/vulkan/appendices/VK_KHR_multiview.txt
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_multiview.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-10-28
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_multiview.html[`SPV_KHR_multiview`]
-  - This extension provides API support for
-    https://raw.githubusercontent.com/KhronosGroup/GLSL/master/extensions/ext/GL_EXT_multiview.txt[`GL_EXT_multiview`]
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension has the same goal as the OpenGL ES `GL_OVR_multiview`
-extension.
-Multiview is a rendering technique originally designed for VR where it is
-more efficient to record a single set of commands to be executed with
-slightly different behavior for each "`view`".
-
-It includes a concise way to declare a render pass with multiple views, and
-gives implementations freedom to render the views in the most efficient way
-possible.
-This is done with a multiview configuration specified during <<renderpass,
-render pass>> creation with the slink:VkRenderPassMultiviewCreateInfo passed
-into slink:VkRenderPassCreateInfo::pname:pNext.
-
-This extension enables the use of the
-{spirv}/KHR/SPV_KHR_multiview.html[`SPV_KHR_multiview`] shader extension,
-which adds a new `ViewIndex` built-in type that allows shaders to control
-what to do for each view.
-If using GLSL there is also the
-https://raw.githubusercontent.com/KhronosGroup/GLSL/master/extensions/ext/GL_EXT_multiview.txt[`GL_EXT_multiview`]
-extension that introduces a `highp int gl_ViewIndex;` built-in variable for
-vertex, tessellation, geometry, and fragment shaders.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_multiview.txt[]
-
-=== New Built-In Variables
-
-  * <<interfaces-builtin-variables-viewindex,code:ViewIndex>>
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-MultiView,code:MultiView>>
-
-=== Version History
-
- * Revision 1, 2016-10-28 (Jeff Bolz)
-   - Internal revisions
-
-ifdef::isrefpage[]
-
-=== Additional Resources
-
-* https://devblogs.nvidia.com/turing-multi-view-rendering-vrworks['NVIDIA
-  blog post']
-* https://community.arm.com/developer/tools-software/graphics/b/blog/posts/optimizing-virtual-reality-understanding-multiview['ARM
-  blog post']
-
-endif::isrefpage[]
diff --git a/registry/vulkan/appendices/VK_KHR_performance_query.txt b/registry/vulkan/appendices/VK_KHR_performance_query.txt
deleted file mode 100644
index f632dd8..0000000
--- a/registry/vulkan/appendices/VK_KHR_performance_query.txt
+++ /dev/null
@@ -1,328 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_performance_query.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-10-08
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jesse Barker, Unity Technologies
-  - Kenneth Benzie, Codeplay
-  - Jan-Harald Fredriksen, ARM
-  - Jeff Leger, Qualcomm
-  - Jesse Hall, Google
-  - Tobias Hector, AMD
-  - Neil Henning, Codeplay
-  - Baldur Karlsson
-  - Lionel Landwerlin, Intel
-  - Peter Lohrmann, AMD
-  - Alon Or-bach, Samsung
-  - Daniel Rakos, AMD
-  - Niklas Smedberg, Unity Technologies
-  - Igor Ostrowski, Intel
-
-=== Description
-
-The `VK_KHR_performance_query` extension adds a mechanism to allow querying
-of performance counters for use in applications and by profiling tools.
-
-Each queue family may: expose counters that can: be enabled on a queue of
-that family.
-We extend elink:VkQueryType to add a new query type for performance queries,
-and chain a structure on slink:VkQueryPoolCreateInfo to specify the
-performance queries to enable.
-
-include::{generated}/interfaces/VK_KHR_performance_query.txt[]
-
-=== Issues
-
-1) Should this extension include a mechanism to begin a query in command
-buffer _A_ and end the query in command buffer _B_?
-
-*RESOLVED* No - queries are tied to command buffer creation and thus have to
-be encapsulated within a single command buffer.
-
-2) Should this extension include a mechanism to begin and end queries
-globally on the queue, not using the existing command buffer commands?
-
-*RESOLVED* No - for the same reasoning as the resolution of 1).
-
-3) Should this extension expose counters that require multiple passes?
-
-*RESOLVED* Yes - users should re-submit a command buffer with the same
-commands in it multiple times, specifying the pass to count as the query
-parameter in VkPerformanceQuerySubmitInfoKHR.
-
-4) How to handle counters across parallel workloads?
-
-*RESOLVED* In the spirit of Vulkan, a counter description flag
-ename:VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR
-denotes that the accuracy of a counter result is affected by parallel
-workloads.
-
-5) How to handle secondary command buffers?
-
-*RESOLVED* Secondary command buffers inherit any counter pass index
-specified in the parent primary command buffer.
-Note: this is no longer an issue after change from issue 10 resolution
-
-6) What commands does the profiling lock have to be held for?
-
-*RESOLVED* For any command buffer that is being queried with a performance
-query pool, the profiling lock must: be held while that command buffer is in
-the _recording_, _executable_, or _pending state_.
-
-7) Should we support flink:vkCmdCopyQueryPoolResults?
-
-*RESOLVED* Yes.
-
-8) Should we allow performance queries to interact with multiview?
-
-*RESOLVED* Yes, but the performance queries must be performed once for each
-pass per view.
-
-9) Should a `queryCount > 1` be usable for performance queries?
-
-*RESOLVED* Yes.
-Some vendors will have costly performance counter query pool creation, and
-would rather if a certain set of counters were to be used multiple times
-that a `queryCount > 1` can be used to amortize the instantiation cost.
-
-10) Should we introduce an indirect mechanism to set the counter pass index?
-
-*RESOLVED* Specify the counter pass index at submit time instead, to avoid
-requiring re-recording of command buffers when multiple counter passes are
-needed.
-
-
-=== Examples
-
-The following example shows how to find what performance counters a queue
-family supports, setup a query pool to record these performance counters,
-how to add the query pool to the command buffer to record information, and
-how to get the results from the query pool.
-
-[source,c++]
---------------------------------------
-// A previously created physical device
-VkPhysicalDevice physicalDevice;
-
-// One of the queue families our device supports
-uint32_t queueFamilyIndex;
-
-uint32_t counterCount;
-
-// Get the count of counters supported
-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
-  physicalDevice,
-  queueFamilyIndex,
-  &counterCount,
-  NULL,
-  NULL);
-
-VkPerformanceCounterKHR* counters =
-  malloc(sizeof(VkPerformanceCounterKHR) * counterCount);
-VkPerformanceCounterDescriptionKHR* counterDescriptions =
-  malloc(sizeof(VkPerformanceCounterDescriptionKHR) * counterCount);
-
-// Get the counters supported
-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
-  physicalDevice,
-  queueFamilyIndex,
-  &counterCount,
-  counters,
-  counterDescriptions);
-
-// Try to enable the first 8 counters
-uint32_t enabledCounters[8];
-
-const uint32_t enabledCounterCount = min(counterCount, 8));
-
-for (uint32_t i = 0; i < enabledCounterCount; i++) {
-  enabledCounters[i] = i;
-}
-
-// A previously created device that had the performanceCounterQueryPools feature
-// set to VK_TRUE
-VkDevice device;
-
-VkQueryPoolPerformanceCreateInfoKHR performanceQueryCreateInfo = {
-  VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR,
-  NULL,
-
-  // Specify the queue family that this performance query is performed on
-  queueFamilyIndex,
-
-  // The number of counters to enable
-  enabledCounterCount,
-
-  // The array of indices of counters to enable
-  enabledCounters
-};
-
-
-// Get the number of passes our counters will require.
-uint32_t numPasses;
-
-vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
-  physicalDevice,
-  &performanceQueryCreateInfo,
-  &numPasses);
-
-VkQueryPoolCreateInfo queryPoolCreateInfo = {
-  VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
-  &performanceQueryCreateInfo,
-  0,
-
-  // Using our new query type here
-  VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,
-
-  1,
-
-  0
-};
-
-VkQueryPool queryPool;
-
-VkResult result = vkCreateQueryPool(
-  device,
-  &queryPoolCreateInfo,
-  NULL,
-  &queryPool);
-
-assert(VK_SUCCESS == result);
-
-// A queue from queueFamilyIndex
-VkQueue queue;
-
-// A command buffer we want to record counters on
-VkCommandBuffer commandBuffer;
-
-VkCommandBufferBeginInfo commandBufferBeginInfo = {
-  VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
-  NULL,
-  0,
-  NULL
-};
-
-VkAcquireProfilingLockInfoKHR lockInfo = {
-  VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR,
-  NULL,
-  0,
-  UINT64_MAX // Wait forever for the lock
-};
-
-// Acquire the profiling lock before we record command buffers
-// that will use performance queries
-
-result = vkAcquireProfilingLockKHR(device, &lockInfo);
-
-assert(VK_SUCCESS == result);
-
-result = vkBeginCommandBuffer(commandBuffer, &commandBufferBeginInfo);
-
-assert(VK_SUCCESS == result);
-
-vkCmdResetQueryPool(
-  commandBuffer,
-  queryPool,
-  0,
-  1);
-
-vkCmdBeginQuery(
-  commandBuffer,
-  queryPool,
-  0,
-  0);
-
-// Perform the commands you want to get performance information on
-// ...
-
-// Perform a barrier to ensure all previous commands were complete before
-// ending the query
-vkCmdPipelineBarrier(commandBuffer,
-  VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
-  VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
-  0,
-  0,
-  NULL,
-  0,
-  NULL,
-  0,
-  NULL);
-
-vkCmdEndQuery(
-  commandBuffer,
-  queryPool,
-  0);
-
-result = vkEndCommandBuffer(commandBuffer);
-
-assert(VK_SUCCESS == result);
-
-for (uint32_t counterPass = 0; counterPass < numPasses; counterPass++) {
-
-  VkPerformanceQuerySubmitInfoKHR performanceQuerySubmitInfo = {
-    VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR,
-    NULL,
-    counterPass
-  };
-
-
-  // Submit the command buffer and wait for its completion
-  // ...
-}
-
-// Release the profiling lock after the command buffer is no longer in the
-// pending state.
-vkReleaseProfilingLockKHR(device);
-
-result = vkResetCommandBuffer(commandBuffer, 0);
-
-assert(VK_SUCCESS == result);
-
-// Create an array to hold the results of all counters
-VkPerformanceCounterResultKHR* recordedCounters = malloc(
-  sizeof(VkPerformanceCounterResultKHR) * enabledCounterCount);
-
-result = vkGetQueryPoolResults(
-  device,
-  queryPool,
-  0,
-  1,
-  sizeof(VkPerformanceCounterResultKHR) * enabledCounterCount,
-  recordedCounters,
-  sizeof(VkPerformanceCounterResultKHR),
-  NULL);
-
-// recordedCounters is filled with our counters, we will look at one for posterity
-switch (counters[0].storage) {
-  case VK_PERFORMANCE_COUNTER_STORAGE_INT32:
-    // use recordCounters[0].int32 to get at the counter result!
-    break;
-  case VK_PERFORMANCE_COUNTER_STORAGE_INT64:
-    // use recordCounters[0].int64 to get at the counter result!
-    break;
-  case VK_PERFORMANCE_COUNTER_STORAGE_UINT32:
-    // use recordCounters[0].uint32 to get at the counter result!
-    break;
-  case VK_PERFORMANCE_COUNTER_STORAGE_UINT64:
-    // use recordCounters[0].uint64 to get at the counter result!
-    break;
-  case VK_PERFORMANCE_COUNTER_STORAGE_FLOAT32:
-    // use recordCounters[0].float32 to get at the counter result!
-    break;
-  case VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64:
-    // use recordCounters[0].float64 to get at the counter result!
-    break;
-}
---------------------------------------
-
-=== Version History
-
- * Revision 1, 2019-10-08
diff --git a/registry/vulkan/appendices/VK_KHR_pipeline_executable_properties.txt b/registry/vulkan/appendices/VK_KHR_pipeline_executable_properties.txt
deleted file mode 100644
index 0ffbf2e..0000000
--- a/registry/vulkan/appendices/VK_KHR_pipeline_executable_properties.txt
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_pipeline_executable_properties.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-05-28
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-*Contributors*::
-  - Jason Ekstrand, Intel
-  - Ian Romanick, Intel
-  - Kenneth Graunke, Intel
-  - Baldur Karlsson, Valve
-  - Jesse Hall, Google
-  - Jeff Bolz, Nvidia
-  - Piers Daniel, Nvidia
-  - Tobias Hector, AMD
-  - Jan-Harald Fredriksen, ARM
-  - Tom Olson, ARM
-  - Daniel Koch, Nvidia
-  - Spencer Fricke, Samsung
-
-=== Description
-
-When a pipeline is created, its state and shaders are compiled into zero or
-more device-specific executables, which are used when executing commands
-against that pipeline.
-This extension adds a mechanism to query properties and statistics about the
-different executables produced by the pipeline compilation process.
-This is intended to be used by debugging and performance tools to allow them
-to provide more detailed information to the user.
-Certain compile-time shader statistics provided through this extension may
-be useful to developers for debugging or performance analysis.
-
-include::{generated}/interfaces/VK_KHR_pipeline_executable_properties.txt[]
-
-=== Issues
-
-1) What should we call the pieces of the pipeline which are produced by the
-compilation process and about which you can query properties and statistics?
-
-*RESOLVED*: Call them "`executables`".
-The name "`binary`" was used in early drafts of the extension but it was
-determined that "`pipeline binary`" could have a fairly broad meaning (such
-as a binary serialized form of an entire pipeline) and was too big of a
-namespace for the very specific needs of this extension.
-
-
-=== Version History
-
-  * Revision 1, 2019-05-28 (Jason Ekstrand)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_KHR_pipeline_library.txt b/registry/vulkan/appendices/VK_KHR_pipeline_library.txt
deleted file mode 100644
index 5498224..0000000
--- a/registry/vulkan/appendices/VK_KHR_pipeline_library.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2020-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_pipeline_library.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-01-08
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - See contributors to `apiext:VK_KHR_ray_tracing_pipeline`
-
-=== Description
-
-A pipeline library is a special pipeline that cannot be bound, instead it
-defines a set of shaders and shader groups which can be linked into other
-pipelines.
-This extension defines the infrastructure for pipeline libraries, but does
-not specify the creation or usage of pipeline libraries.
-This is left to additional dependent extensions.
-
-include::{generated}/interfaces/VK_KHR_pipeline_library.txt[]
-
-=== Version History
-
- * Revision 1, 2020-01-08 (Christoph Kubisch)
-   - Initial draft.
diff --git a/registry/vulkan/appendices/VK_KHR_portability_subset.txt b/registry/vulkan/appendices/VK_KHR_portability_subset.txt
deleted file mode 100644
index 3a68360..0000000
--- a/registry/vulkan/appendices/VK_KHR_portability_subset.txt
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_portability_subset.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-07-21
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Bill Hollings, The Brenwill Workshop Ltd.
-  - Daniel Koch, NVIDIA
-  - Dzmitry Malyshau, Mozilla
-  - Chip Davis, CodeWeavers
-  - Dan Ginsburg, Valve
-  - Mike Weiblen, LunarG
-  - Neil Trevett, NVIDIA
-  - Alexey Knyazev, Independent
-
-=== Description
-
-The `VK_KHR_portability_subset extension allows a non-conformant Vulkan
-implementation to be built on top of another non-Vulkan graphics API, and
-identifies differences between that implementation and a fully-conformant
-native Vulkan implementation.
-
-This extension provides Vulkan implementations with the ability to mark
-otherwise-required capabilities as unsupported, or to establish additional
-properties and limits that the application should adhere to in order to
-guarantee portable behaviour and operation across platforms, including
-platforms where Vulkan is not natively supported.
-
-The goal of this specification is to document, and make queryable,
-capabilities which are required to be supported by a fully-conformant Vulkan
-1.0 implementation, but may be optional for an implementation of the Vulkan
-1.0 Portability Subset.
-
-The intent is that this extension will be advertised only on implementations
-of the Vulkan 1.0 Portability Subset, and not on conformant implementations
-of Vulkan 1.0.
-Fully-conformant Vulkan implementations provide all the required capabilies,
-and so will not provide this extension.
-Therefore, the existence of this extension can be used to determine that an
-implementation is likely not fully conformant with the Vulkan spec.
-
-If this extension is supported by the Vulkan implementation, the application
-must enable this extension.
-
-This extension defines several new structures that can be chained to the
-existing structures used by certain standard Vulkan calls, in order to query
-for non-conformant portable behavior.
-
-include::{generated}/interfaces/VK_KHR_portability_subset.txt[]
-
-=== Issues
-
-None.
-
-=== Version History
-
- * Revision 1, 2020-07-21 (Bill Hollings)
-   - Initial draft.
diff --git a/registry/vulkan/appendices/VK_KHR_present_id.txt b/registry/vulkan/appendices/VK_KHR_present_id.txt
deleted file mode 100644
index debbbe7..0000000
--- a/registry/vulkan/appendices/VK_KHR_present_id.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2019-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_present_id.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-05-15
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Keith Packard, Valve
-  - Ian Elliott, Google
-  - Alon Or-bach, Samsung
-
-=== Description
-
-This device extension allows an application that uses the
-`apiext:VK_KHR_swapchain` extension to provide an identifier for present
-operations on a swapchain.
-An application can: use this to reference specific present operations in
-other extensions.
-
-include::{generated}/interfaces/VK_KHR_present_id.txt[]
-
-=== Issues
-
-None.
-
-=== Examples
-
-=== Version History
-
- * Revision 1, 2019-05-15 (Keith Packard)
-   - Initial version
diff --git a/registry/vulkan/appendices/VK_KHR_present_wait.txt b/registry/vulkan/appendices/VK_KHR_present_wait.txt
deleted file mode 100644
index 2f4df88..0000000
--- a/registry/vulkan/appendices/VK_KHR_present_wait.txt
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2019-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_present_wait.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-05-15
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Keith Packard, Valve
-  - Ian Elliott, Google
-  - Tobias Hector, AMD
-  - Daniel Stone, Collabora
-
-=== Description
-
-This device extension allows an application that uses the
-`apiext:VK_KHR_swapchain` extension to wait for present operations to
-complete.
-An application can use this to monitor and control the pacing of the
-application by managing the number of outstanding images yet to be
-presented.
-
-include::{generated}/interfaces/VK_KHR_present_wait.txt[]
-
-=== Issues
-
-1) When does the wait finish?
-
-*RESOLVED*.
-The wait will finish when the present is visible to the user.
-There is no requirement for any precise timing relationship between the
-presentation of the image to the user, but implementations should: signal
-the wait as close as possible to the presentation of the first pixel in the
-new image to the user.
-
-2) Should this use fences or other existing synchronization mechanism.
-
-*RESOLVED*.
-Because display and rendering are often implemented in separate drivers,
-this extension will provide a separate synchronization API.
-
-3) Should this extension share present identification with other extensions?
-
-*RESOLVED*.
-Yes.
-A new extension, VK_KHR_present_id, should be created to provide a shared
-structure for presentation identifiers.
-
-4) What happens when presentations complete out of order wrt calls to
-   vkQueuePresent? This could happen if the semaphores for the presentations
-   were ready out of order.
-
-*OPTION A*: Require that when a PresentId is set that the driver ensure that
-            images are always presented in the order of calls to
-            vkQueuePresent.
-
-*OPTION B*: Finish both waits when the earliest present completes.
-            This will complete the later present wait earlier than the
-            actual presentation.
-            This should be the easiest to implement as the driver need only
-            track the largest present ID completed.
-            This is also the 'natural' consequence of interpreting the
-            existing vkWaitForPresentKHR specificationn.
-
-*OPTION C*: Finish both waits when both have completed.
-            This will complete the earlier presentation later than the
-            actual presentation time.
-            This is allowed by the current specification as there is no
-            precise timing requirement for when the presentId value is
-            updated.
-            This requires slightly more complexity in the driver as it will
-            need to track all outstanding presentId values.
-
-=== Examples
-
-=== Version History
-
- * Revision 1, 2019-02-19 (Keith Packard)
-   - Initial version
diff --git a/registry/vulkan/appendices/VK_KHR_push_descriptor.txt b/registry/vulkan/appendices/VK_KHR_push_descriptor.txt
deleted file mode 100644
index 7e17fdd..0000000
--- a/registry/vulkan/appendices/VK_KHR_push_descriptor.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_push_descriptor.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-09-12
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Michael Worcester, Imagination Technologies
-
-=== Description
-
-This extension allows descriptors to be written into the command buffer,
-while the implementation is responsible for managing their memory.
-Push descriptors may enable easier porting from older APIs and in some cases
-can be more efficient than writing descriptors into descriptor sets.
-
-include::{generated}/interfaces/VK_KHR_push_descriptor.txt[]
-
-=== Version History
-
-  * Revision 1, 2016-10-15 (Jeff Bolz)
-    - Internal revisions
-
-  * Revision 2, 2017-09-12 (Tobias Hector)
-    - Added interactions with Vulkan 1.1
diff --git a/registry/vulkan/appendices/VK_KHR_ray_query.txt b/registry/vulkan/appendices/VK_KHR_ray_query.txt
deleted file mode 100644
index f5d9ad8..0000000
--- a/registry/vulkan/appendices/VK_KHR_ray_query.txt
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_ray_query.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-11-12
-*Interactions and External Dependencies*::
-  - This extension requires
-    https://htmlpreview.github.io/?https://github.com/KhronosGroup/SPIRV-Registry/blob/master/extensions/KHR/SPV_KHR_ray_query.html[`SPV_KHR_ray_query`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_ray_query.txt[`GLSL_EXT_ray_query`]
-*Contributors*::
-  - Matthäus Chajdas, AMD
-  - Greg Grebe, AMD
-  - Nicolai Hähnle, AMD
-  - Tobias Hector, AMD
-  - Dave Oldcorn, AMD
-  - Skyler Saleh, AMD
-  - Mathieu Robart, Arm
-  - Marius Bjorge, Arm
-  - Tom Olson, Arm
-  - Sebastian Tafuri, EA
-  - Henrik Rydgard, Embark
-  - Juan Cañada, Epic Games
-  - Patrick Kelly, Epic Games
-  - Yuriy O'Donnell, Epic Games
-  - Michael Doggett, Facebook/Oculus
-  - Andrew Garrard, Imagination
-  - Don Scorgie, Imagination
-  - Dae Kim, Imagination
-  - Joshua Barczak, Intel
-  - Slawek Grajewski, Intel
-  - Jeff Bolz, NVIDIA
-  - Pascal Gautron, NVIDIA
-  - Daniel Koch, NVIDIA
-  - Christoph Kubisch, NVIDIA
-  - Ashwin Lele, NVIDIA
-  - Robert Stepinski, NVIDIA
-  - Martin Stich, NVIDIA
-  - Nuno Subtil, NVIDIA
-  - Eric Werness, NVIDIA
-  - Jon Leech, Khronos
-  - Jeroen van Schijndel, OTOY
-  - Juul Joosten, OTOY
-  - Alex Bourd, Qualcomm
-  - Roman Larionov, Qualcomm
-  - David McAllister, Qualcomm
-  - Spencer Fricke, Samsung
-  - Lewis Gordon, Samsung
-  - Ralph Potter, Samsung
-  - Jasper Bekkers, Traverse Research
-  - Jesse Barker, Unity
-  - Baldur Karlsson, Valve
-
-=== Description
-
-Rasterization has been the dominant method to produce interactive graphics,
-but increasing performance of graphics hardware has made ray tracing a
-viable option for interactive rendering.
-Being able to integrate ray tracing with traditional rasterization makes it
-easier for applications to incrementally add ray traced effects to existing
-applications or to do hybrid approaches with rasterization for primary
-visibility and ray tracing for secondary queries.
-
-Ray queries are available to all shader types, including graphics, compute
-and ray tracing pipelines.
-Ray queries are not able to launch additional shaders, instead returning
-traversal results to the calling shader.
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * `SPV_KHR_ray_query`
-
-include::{generated}/interfaces/VK_KHR_ray_query.txt[]
-
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-RayQueryKHR,RayQueryKHR>>
-  * <<spirvenv-capabilities-table-RayTraversalPrimitiveCullingKHR,RayTraversalPrimitiveCullingKHR>>
-
-
-=== Sample Code
-
-Example of ray query in a GLSL shader
-
-[source,c]
----------------------------------------------------
-rayQueryEXT rq;
-
-rayQueryInitializeEXT(rq, accStruct, gl_RayFlagsNoneEXT, 0, origin, tMin, direction, tMax);
-
-while(rayQueryProceedEXT(rq)) {
-    if (rayQueryGetIntersectionTypeEXT(rq, false) == gl_RayQueryCandidateIntersectionTriangleEXT) {
-        //...
-        rayQueryConfirmIntersectionEXT(rq);
-    }
-}
-
-if (rayQueryGetIntersectionTypeEXT(rq, true) == gl_RayQueryCommittedIntersectionNoneEXT) {
-    //...
-}
----------------------------------------------------
-
-=== Issues
-
-(1) What are the changes between the public provisional (VK_KHR_ray_tracing
-v8) release and the final (VK_KHR_acceleration_structure v11 /
-VK_KHR_ray_query v1) release?
---
-  * refactor VK_KHR_ray_tracing into 3 extensions, enabling implementation
-    flexibility and decoupling ray query support from ray pipelines:
-  ** `apiext:VK_KHR_acceleration_structure` (for acceleration structure
-     operations)
-  ** `apiext:VK_KHR_ray_tracing_pipeline` (for ray tracing pipeline and
-     shader stages)
-  ** `apiext:VK_KHR_ray_query` (for ray queries in existing shader stages)
-  * Update SPIRV capabilities to use code:RayQueryKHR
-  * extension is no longer provisional
---
-
-
-=== Version History
-
-  * Revision 1, 2020-11-12 (Mathieu Robart, Daniel Koch, Andrew Garrard)
-    - Decomposition of the specification, from VK_KHR_ray_tracing to
-      VK_KHR_ray_query (#1918,!3912)
-    - update to use code:RayQueryKHR SPIR-V capability
-    - add numerical limits for ray parameters (#2235,!3960)
-    - relax formula for ray intersection candidate determination
-      (#2322,!4080)
-    - restrict traces to TLAS (#2239,!4141)
-    - require code:HitT to be in ray interval for
-      code:OpRayQueryGenerateIntersectionKHR (#2359,!4146)
-    - add ray query shader stages for AS read bit (#2407,!4203)
diff --git a/registry/vulkan/appendices/VK_KHR_ray_tracing_pipeline.txt b/registry/vulkan/appendices/VK_KHR_ray_tracing_pipeline.txt
deleted file mode 100644
index 45f0432..0000000
--- a/registry/vulkan/appendices/VK_KHR_ray_tracing_pipeline.txt
+++ /dev/null
@@ -1,383 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_ray_tracing_pipeline.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-11-12
-*Interactions and External Dependencies*::
-  - This extension requires
-    https://htmlpreview.github.io/?https://github.com/KhronosGroup/SPIRV-Registry/blob/master/extensions/KHR/SPV_KHR_ray_tracing.html[`SPV_KHR_ray_tracing`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_ray_tracing.txt[`GLSL_EXT_ray_tracing`]
-  - This extension interacts with <<versions-1.2, Vulkan 1.2>> and
-    `apiext:VK_KHR_vulkan_memory_model`, adding the <<shader-call-related,
-    shader-call-related>> relation of invocations, <<shader-call-order,
-    shader-call-order>> partial order of dynamic instances of instructions,
-    and the <<shaders-scope-shadercall, code:ShaderCallKHR>> scope.
-  - This extension interacts with `apiext:VK_KHR_pipeline_library`, enabling
-    pipeline libraries to be used with ray tracing pipelines and enabling
-    usage of slink:VkRayTracingPipelineInterfaceCreateInfoKHR.
-*Contributors*::
-  - Matthäus Chajdas, AMD
-  - Greg Grebe, AMD
-  - Nicolai Hähnle, AMD
-  - Tobias Hector, AMD
-  - Dave Oldcorn, AMD
-  - Skyler Saleh, AMD
-  - Mathieu Robart, Arm
-  - Marius Bjorge, Arm
-  - Tom Olson, Arm
-  - Sebastian Tafuri, EA
-  - Henrik Rydgard, Embark
-  - Juan Cañada, Epic Games
-  - Patrick Kelly, Epic Games
-  - Yuriy O'Donnell, Epic Games
-  - Michael Doggett, Facebook/Oculus
-  - Andrew Garrard, Imagination
-  - Don Scorgie, Imagination
-  - Dae Kim, Imagination
-  - Joshua Barczak, Intel
-  - Slawek Grajewski, Intel
-  - Jeff Bolz, NVIDIA
-  - Pascal Gautron, NVIDIA
-  - Daniel Koch, NVIDIA
-  - Christoph Kubisch, NVIDIA
-  - Ashwin Lele, NVIDIA
-  - Robert Stepinski, NVIDIA
-  - Martin Stich, NVIDIA
-  - Nuno Subtil, NVIDIA
-  - Eric Werness, NVIDIA
-  - Jon Leech, Khronos
-  - Jeroen van Schijndel, OTOY
-  - Juul Joosten, OTOY
-  - Alex Bourd, Qualcomm
-  - Roman Larionov, Qualcomm
-  - David McAllister, Qualcomm
-  - Spencer Fricke, Samsung
-  - Lewis Gordon, Samsung
-  - Ralph Potter, Samsung
-  - Jasper Bekkers, Traverse Research
-  - Jesse Barker, Unity
-  - Baldur Karlsson, Valve
-
-=== Description
-
-Rasterization has been the dominant method to produce interactive graphics,
-but increasing performance of graphics hardware has made ray tracing a
-viable option for interactive rendering.
-Being able to integrate ray tracing with traditional rasterization makes it
-easier for applications to incrementally add ray traced effects to existing
-applications or to do hybrid approaches with rasterization for primary
-visibility and ray tracing for secondary queries.
-
-To enable ray tracing, this extension adds a few different categories of new
-functionality:
-
-  * A new ray tracing pipeline type with new shader domains: ray generation,
-    intersection, any-hit, closest hit, miss, and callable
-  * A shader binding indirection table to link shader groups with
-    acceleration structure items
-  * Ray tracing commands which initiate the ray pipeline traversal and
-    invocation of the various new shader domains depending on which
-    traversal conditions are met
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * `SPV_KHR_ray_tracing`
-
-include::{generated}/interfaces/VK_KHR_ray_tracing_pipeline.txt[]
-
-=== New or Modified Built-In Variables
-
-  * <<interfaces-builtin-variables-launchid,code:LaunchIdKHR>>
-  * <<interfaces-builtin-variables-launchsize,code:LaunchSizeKHR>>
-  * <<interfaces-builtin-variables-worldrayorigin,code:WorldRayOriginKHR>>
-  * <<interfaces-builtin-variables-worldraydirection,code:WorldRayDirectionKHR>>
-  * <<interfaces-builtin-variables-objectrayorigin,code:ObjectRayOriginKHR>>
-  * <<interfaces-builtin-variables-objectraydirection,code:ObjectRayDirectionKHR>>
-  * <<interfaces-builtin-variables-raytmin,code:RayTminKHR>>
-  * <<interfaces-builtin-variables-raytmax,code:RayTmaxKHR>>
-  * <<interfaces-builtin-variables-instancecustomindex,code:InstanceCustomIndexKHR>>
-  * <<interfaces-builtin-variables-instanceid,code:InstanceId>>
-  * <<interfaces-builtin-variables-objecttoworld,code:ObjectToWorldKHR>>
-  * <<interfaces-builtin-variables-worldtoobject,code:WorldToObjectKHR>>
-  * <<interfaces-builtin-variables-hitkind,code:HitKindKHR>>
-  * <<interfaces-builtin-variables-incomingrayflags,code:IncomingRayFlagsKHR>>
-  * <<interfaces-builtin-variables-raygeometryindex,code:RayGeometryIndexKHR>>
-  * (modified)code:PrimitiveId
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-RayTracingKHR,RayTracingKHR>>
-  * <<spirvenv-capabilities-table-RayTraversalPrimitiveCullingKHR,RayTraversalPrimitiveCullingKHR>>
-
-=== Issues
-
-(1) How does this extension differ from VK_NV_ray_tracing?
---
-*DISCUSSION*:
-
-The following is a summary of the main functional differences between
-VK_KHR_ray_tracing_pipeline and VK_NV_ray_tracing:
-
-  * added support for indirect ray tracing (flink:vkCmdTraceRaysIndirectKHR)
-  * uses SPV_KHR_ray_tracing instead of SPV_NV_ray_tracing
-  ** refer to KHR SPIR-V enums instead of NV SPIR-V enums (which are
-     functionally equivalent and aliased to the same values).
-  ** added code:RayGeometryIndexKHR built-in
-  * removed vkCompileDeferredNV compilation functionality and replaced with
-    <<deferred-host-operations, deferred host operations>> interactions for
-    ray tracing
-  * added slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR structure
-  * extended slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR structure
-  ** renamed pname:maxRecursionDepth to pname:maxRayRecursionDepth and it
-     has a minimum of 1 instead of 31
-  ** require pname:shaderGroupHandleSize to be 32 bytes
-  ** added pname:maxRayDispatchInvocationCount,
-     pname:shaderGroupHandleAlignment and pname:maxRayHitAttributeSize
-  * reworked geometry structures so they could be better shared between
-    device, host, and indirect builds
-  * changed SBT parameters to a structure and added size
-    (slink:VkStridedDeviceAddressRegionKHR)
-  * add parameter for requesting memory requirements for host and/or device
-    build
-  * added <<pipeline-library,pipeline library>> support for ray tracing
-  * added <<ray-traversal-watertight, watertightness guarantees>>
-  * added no-null-shader pipeline flags
-    (etext:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_*_SHADERS_BIT_KHR)
-  * added <<ray-tracing-shader-call,memory model interactions>> with ray
-    tracing and define how subgroups work and can be repacked
---
-
-ifdef::VK_NV_ray_tracing[]
-(2) Can you give a more detailed comparision of differences and similarities
-between VK_NV_ray_tracing and VK_KHR_ray_tracing_pipeline?
---
-*DISCUSSION*:
-
-The following is a more detailed comparision of which commands, structures,
-and enums are aliased, changed, or removed.
-
-  * Aliased functionality -- enums, structures, and commands that are
-    considered equivalent:
-  ** elink:VkRayTracingShaderGroupTypeNV {harr}
-     elink:VkRayTracingShaderGroupTypeKHR
-  ** flink:vkGetRayTracingShaderGroupHandlesNV {harr}
-     flink:vkGetRayTracingShaderGroupHandlesKHR
-
-  * Changed enums, structures, and commands:
-  ** slink:VkRayTracingShaderGroupCreateInfoNV ->
-     slink:VkRayTracingShaderGroupCreateInfoKHR (added
-     pname:pShaderGroupCaptureReplayHandle)
-  ** slink:VkRayTracingPipelineCreateInfoNV ->
-     slink:VkRayTracingPipelineCreateInfoKHR (changed type of pname:pGroups,
-     added pname:libraries, pname:pLibraryInterface, and
-     pname:pDynamicState)
-  ** slink:VkPhysicalDeviceRayTracingPropertiesNV ->
-     VkPhysicalDeviceRayTracingPropertiesKHR (renamed pname:maxTriangleCount
-     to pname:maxPrimitiveCount, added
-     pname:shaderGroupHandleCaptureReplaySize)
-  ** flink:vkCmdTraceRaysNV -> flink:vkCmdTraceRaysKHR (params to struct)
-  ** flink:vkCreateRayTracingPipelinesNV ->
-     flink:vkCreateRayTracingPipelinesKHR (different struct, changed
-     functionality)
-
-  * Added enums, structures and commands:
-  ** ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR
-     ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR,
-     ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR,
-     ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR,
-     ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR,
-     ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR to
-     elink:VkPipelineCreateFlagBits
-  ** slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR structure
-  ** slink:VkDeviceOrHostAddressKHR and slink:VkDeviceOrHostAddressConstKHR
-     unions
-  ** slink:VkPipelineLibraryCreateInfoKHR struct
-  ** slink:VkRayTracingPipelineInterfaceCreateInfoKHR struct
-  ** slink:VkStridedDeviceAddressRegionKHR struct
-  ** flink:vkCmdTraceRaysIndirectKHR command and
-     slink:VkTraceRaysIndirectCommandKHR struct
-  ** flink:vkGetRayTracingCaptureReplayShaderGroupHandlesKHR (shader group
-     capture/replay)
-  ** flink:vkCmdSetRayTracingPipelineStackSizeKHR and
-     flink:vkGetRayTracingShaderGroupStackSizeKHR commands for stack size
-     control
-
-  * Functionality removed:
-  ** ename:VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV
-  ** flink:vkCompileDeferredNV command (replaced with
-     `apiext:VK_KHR_deferred_host_operations`)
---
-endif::VK_NV_ray_tracing[]
-
-(3) What are the changes between the public provisional (VK_KHR_ray_tracing
-v8) release and the internal provisional (VK_KHR_ray_tracing v9) release?
---
-  * Require Vulkan 1.1 and SPIR-V 1.4
-  * Added interactions with Vulkan 1.2 and
-    `apiext:VK_KHR_vulkan_memory_model`
-  * added creation time capture and replay flags
-  ** added
-     ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
-     to elink:VkPipelineCreateFlagBits
-  * replace stext:VkStridedBufferRegionKHR with
-    slink:VkStridedDeviceAddressRegionKHR and change
-    flink:vkCmdTraceRaysKHR, flink:vkCmdTraceRaysIndirectKHR, to take these
-    for the shader binding table and use device addresses instead of
-    buffers.
-  * require the shader binding table buffers to have the
-    etext:VK_BUFFER_USAGE_RAY_TRACING_BIT_KHR set
-  * make `apiext:VK_KHR_pipeline_library` an interaction instead of required
-    extension
-  * rename the pname:libraries member of
-    slink:VkRayTracingPipelineCreateInfoKHR to pname:pLibraryInfo and make
-    it a pointer
-  * make `apiext:VK_KHR_deferred_host_operations` an interaction instead of
-    a required extension (later went back on this)
-  * added explicit stack size management for ray tracing pipelines
-  ** removed the pname:maxCallableSize member of
-     slink:VkRayTracingPipelineInterfaceCreateInfoKHR
-  ** added the pname:pDynamicState member to
-     slink:VkRayTracingPipelineCreateInfoKHR
-  ** added ename:VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR
-     dynamic state for ray tracing pipelines
-  ** added flink:vkGetRayTracingShaderGroupStackSizeKHR and
-     flink:vkCmdSetRayTracingPipelineStackSizeKHR commands
-  ** added elink:VkShaderGroupShaderKHR enum
-  * Added pname:maxRayDispatchInvocationCount limit to
-    slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR
-  * Added pname:shaderGroupHandleAlignment property to
-    slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR
-  * Added pname:maxRayHitAttributeSize property to
-    slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR
-  * Clarify deferred host ops for pipeline creation
-  ** slink:VkDeferredOperationKHR is now a top-level parameter for
-     flink:vkCreateRayTracingPipelinesKHR
-  ** removed stext:VkDeferredOperationInfoKHR structure
-  ** change deferred host creation/return parameter behavior such that the
-     implementation can modify such parameters until the deferred host
-     operation completes
-  ** `apiext:VK_KHR_deferred_host_operations` is required again
---
-
-(4) What are the changes between the internal provisional
-(VK_KHR_ray_tracing v9) release and the final (VK_KHR_acceleration_structure
-v11 / VK_KHR_ray_tracing_pipeline v1) release?
---
-  * refactor VK_KHR_ray_tracing into 3 extensions, enabling implementation
-    flexibility and decoupling ray query support from ray pipelines:
-  ** `apiext:VK_KHR_acceleration_structure` (for acceleration structure
-     operations)
-  ** `apiext:VK_KHR_ray_tracing_pipeline` (for ray tracing pipeline and
-     shader stages)
-  ** `apiext:VK_KHR_ray_query` (for ray queries in existing shader stages)
-  * Require code:Volatile for the following builtins in the ray generation,
-    closest hit, miss, intersection, and callable shader stages:
-  ** code:SubgroupSize, code:SubgroupLocalInvocationId, code:SubgroupEqMask,
-     code:SubgroupGeMask, code:SubgroupGtMask, code:SubgroupLeMask,
-     code:SubgroupLtMask
-  ** code:SMIDNV, code:WarpIDNV
-  * clarify buffer usage flags for ray tracing
-  ** ename:VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR is added as an alias
-     of ename:VK_BUFFER_USAGE_RAY_TRACING_BIT_NV and is required on shader
-     binding table buffers
-  ** ename:VK_BUFFER_USAGE_STORAGE_BUFFER_BIT is used in
-     `apiext:VK_KHR_acceleration_structure` for pname:scratchData
-  * rename pname:maxRecursionDepth to pname:maxRayPipelineRecursionDepth
-    (pipeline creation) and pname:maxRayRecursionDepth (limit) to reduce
-    confusion
-  * Add queryable pname:maxRayHitAttributeSize limit and rename members of
-    slink:VkRayTracingPipelineInterfaceCreateInfoKHR to
-    pname:maxPipelineRayPayloadSize and pname:maxPipelineRayHitAttributeSize
-    for clarity
-  * Update SPIRV capabilities to use code:RayTracingKHR
-  * extension is no longer provisional
-  * define synchronization requirements for indirect trace rays and indirect
-    buffer
---
-
-(5) This extension adds gl_InstanceID for the intersection, any-hit, and
-    closest hit shaders, but in KHR_vulkan_glsl, gl_InstanceID is replaced
-    with gl_InstanceIndex.
-    Which should be used for Vulkan in this extension?
---
-*RESOLVED*: This extension uses gl_InstanceID and maps it to code:InstanceId
-in SPIR-V.
-It is acknowledged that this is different than other shader stages in
-Vulkan.
-There are two main reasons for the difference here:
-
-  * symmetry with gl_PrimitiveID which is also available in these shaders
-  * there is no "`baseInstance`" relevant for these shaders, and so ID makes
-    it more obvious that this is zero-based.
---
-
-=== Sample Code
-
-Example ray generation GLSL shader
-
-[source,c]
----------------------------------------------------
-#version 450 core
-#extension GL_EXT_ray_tracing : require
-layout(set = 0, binding = 0, rgba8) uniform image2D image;
-layout(set = 0, binding = 1) uniform accelerationStructureEXT as;
-layout(location = 0) rayPayloadEXT float payload;
-
-void main()
-{
-   vec4 col = vec4(0, 0, 0, 1);
-
-   vec3 origin = vec3(float(gl_LaunchIDEXT.x)/float(gl_LaunchSizeEXT.x), float(gl_LaunchIDEXT.y)/float(gl_LaunchSizeEXT.y), 1.0);
-   vec3 dir = vec3(0.0, 0.0, -1.0);
-
-   traceRayEXT(as, 0, 0xff, 0, 1, 0, origin, 0.0, dir, 1000.0, 0);
-
-   col.y = payload;
-
-   imageStore(image, ivec2(gl_LaunchIDEXT.xy), col);
-}
----------------------------------------------------
-
-=== Version History
-
-  * Revision 1, 2020-11-12 (Mathieu Robart, Daniel Koch, Eric Werness,
-    Tobias Hector)
-    - Decomposition of the specification, from VK_KHR_ray_tracing to
-      VK_KHR_ray_tracing_pipeline (#1918,!3912)
-    - require certain subgroup and sm_shader_builtin shader builtins to be
-      decorated as volatile in the ray generation, closest hit, miss,
-      intersection, and callable stages (#1924,!3903,!3954)
-    - clarify buffer usage flags for ray tracing (#2181,!3939)
-    - rename maxRecursionDepth to maxRayPipelineRecursionDepth and
-      maxRayRecursionDepth (#2203,!3937)
-    - add queriable maxRayHitAttributeSize and rename members of
-      VkRayTracingPipelineInterfaceCreateInfoKHR (#2102,!3966)
-    - update to use code:RayTracingKHR SPIR-V capability
-    - add VUs for matching hit group type against geometry type
-      (#2245,!3994)
-    - require code:RayTMaxKHR be volatile in intersection shaders
-      (#2268,!4030)
-    - add numerical limits for ray parameters (#2235,!3960)
-    - fix SBT indexing rules for device addresses (#2308,!4079)
-    - relax formula for ray intersection candidate determination
-      (#2322,!4080)
-    - add more details on code:ShaderRecordBufferKHR variables (#2230,!4083)
-    - clarify valid bits for code:InstanceCustomIndexKHR
-      (GLSL/GLSL#19,!4128)
-    - allow at most one code:IncomingRayPayloadKHR,
-      code:IncomingCallableDataKHR, and code:HitAttributeKHR (!4129)
-    - add minimum for maxShaderGroupStride (#2353,!4131)
-    - require VK_KHR_pipeline_library extension to be supported
-      (#2348,!4135)
-    - clarify meaning of 'geometry index' (#2272,!4137)
-    - restrict traces to TLAS (#2239,!4141)
-    - add note about maxPipelineRayPayloadSize (#2383,!4172)
-    - do not require raygen shader in pipeline libraries (!4185)
-    - define sync for indirect trace rays and indirect buffer (#2407,!4208)
-
diff --git a/registry/vulkan/appendices/VK_KHR_relaxed_block_layout.txt b/registry/vulkan/appendices/VK_KHR_relaxed_block_layout.txt
deleted file mode 100644
index ab3bf98..0000000
--- a/registry/vulkan/appendices/VK_KHR_relaxed_block_layout.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_relaxed_block_layout.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-03-26
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - John Kessenich, Google
-
-=== Description
-
-The `VK_KHR_relaxed_block_layout` extension allows implementations to
-indicate they can support more variation in block code:Offset decorations.
-For example, placing a vector of three floats at an offset of
-[eq]#16{times}N {plus} 4#.
-
-See <<interfaces-resources-layout,Offset and Stride Assignment>> for
-details.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_relaxed_block_layout.txt[]
-
-=== Version History
-  * Revision 1, 2017-03-26 (JohnK)
diff --git a/registry/vulkan/appendices/VK_KHR_sampler_mirror_clamp_to_edge.txt b/registry/vulkan/appendices/VK_KHR_sampler_mirror_clamp_to_edge.txt
deleted file mode 100644
index ddec972..0000000
--- a/registry/vulkan/appendices/VK_KHR_sampler_mirror_clamp_to_edge.txt
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_sampler_mirror_clamp_to_edge.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-08-17
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*Contributors*::
-  - Tobias Hector, Imagination Technologies
-  - Jon Leech, Khronos
-
-=== Description
-
-`VK_KHR_sampler_mirror_clamp_to_edge` extends the set of sampler address
-modes to include an additional mode
-(ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE) that effectively uses a
-texture map twice as large as the original image in which the additional
-half of the new image is a mirror image of the original image.
-
-This new mode relaxes the need to generate images whose opposite edges match
-by using the original image to generate a matching "`mirror image`".
-This mode allows the texture to be mirrored only once in the negative s, t,
-and r directions.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2.
-However, if Vulkan 1.2 is supported and this extension is not, the
-elink:VkSamplerAddressMode
-ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE is optional.
-Since the original extension did not use an author suffix on the enum
-ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE, it is used by both core
-and extension implementations.
-
-include::{generated}/interfaces/VK_KHR_sampler_mirror_clamp_to_edge.txt[]
-
-=== Example
-
-Creating a sampler with the new address mode in each dimension
-
-
-[source,c++]
-----------------------------------------
-    VkSamplerCreateInfo createInfo =
-    {
-        VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO // sType
-        // Other members set to application-desired values
-    };
-
-    createInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
-    createInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
-    createInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
-
-    VkSampler sampler;
-    VkResult result = vkCreateSampler(
-        device,
-        &createInfo,
-        &sampler);
-----------------------------------------
-
-=== Issues
-
-1) Why are both KHR and core versions of the
-ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE token present?
-
-*RESOLVED*: This functionality was intended to be required in Vulkan 1.0.
-We realized shortly before public release that not all implementations could
-support it, and moved the functionality into an optional extension, but did
-not apply the KHR extension suffix.
-Adding a KHR-suffixed alias of the non-suffixed enum has been done to comply
-with our own naming rules.
-
-In a related change, before spec revision 1.1.121 this extension was
-hardwiring into the spec Makefile so it was always included with the
-Specification, even in the core-only versions.
-This has now been reverted, and it is treated as any other extension.
-
-=== Version History
-
- * Revision 1, 2016-02-16 (Tobias Hector)
-   - Initial draft
- * Revision 2, 2019-08-14 (Jon Leech)
-   - Add KHR-suffixed alias of non-suffixed enum.
- * Revision 3, 2019-08-17 (Jon Leech)
-   - Add an issue explaining the reason for the extension API not being
-     suffixed with KHR.
diff --git a/registry/vulkan/appendices/VK_KHR_sampler_ycbcr_conversion.txt b/registry/vulkan/appendices/VK_KHR_sampler_ycbcr_conversion.txt
deleted file mode 100644
index 3df219b..0000000
--- a/registry/vulkan/appendices/VK_KHR_sampler_ycbcr_conversion.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_sampler_ycbcr_conversion.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-08-11
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Andrew Garrard, Samsung Electronics
-  - Tobias Hector, Imagination Technologies
-  - James Jones, NVIDIA
-  - Daniel Koch, NVIDIA
-  - Daniel Rakos, AMD
-  - Romain Guy, Google
-  - Jesse Hall, Google
-  - Tom Cooksey, ARM Ltd
-  - Jeff Leger, Qualcomm Technologies, Inc
-  - Jan-Harald Fredriksen, ARM Ltd
-  - Jan Outters, Samsung Electronics
-  - Alon Or-bach, Samsung Electronics
-  - Michael Worcester, Imagination Technologies
-  - Jeff Bolz, NVIDIA
-  - Tony Zlatinski, NVIDIA
-  - Matthew Netsch, Qualcomm Technologies, Inc
-
-=== Description
-
-The use of {YCbCr} sampler conversion is an area in 3D graphics not used by
-most Vulkan developers.
-It is mainly used for processing inputs from video decoders and cameras.
-The use of the extension assumes basic knowledge of {YCbCr} concepts.
-
-This extension provides the ability to perform specified color space
-conversions during texture sampling operations for the {YCbCr} color space
-natively.
-It also adds a selection of multi-planar formats, image aspect plane, and
-the ability to bind memory to the planes of an image collectively or
-separately.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted.
-However, if Vulkan 1.1 is supported and this extension is not, the
-code:samplerYcbcrConversion capability is optional.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_sampler_ycbcr_conversion.txt[]
-
-=== Version History
-
- * Revision 1, 2017-01-24 (Andrew Garrard)
-   - Initial draft
- * Revision 2, 2017-01-25 (Andrew Garrard)
-   - After initial feedback
- * Revision 3, 2017-01-27 (Andrew Garrard)
-   - Higher bit depth formats, renaming, swizzle
- * Revision 4, 2017-02-22 (Andrew Garrard)
-   - Added query function, formats as RGB, clarifications
- * Revision 5, 2017-04-?? (Andrew Garrard)
-   - Simplified query and removed output conversions
- * Revision 6, 2017-04-24 (Andrew Garrard)
-   - Tidying, incorporated new image query, restored transfer functions
- * Revision 7, 2017-04-25 (Andrew Garrard)
-   - Added cosited option/midpoint requirement for formats,
-     "`bypassConversion`"
- * Revision 8, 2017-04-25 (Andrew Garrard)
-   - Simplified further
- * Revision 9, 2017-04-27 (Andrew Garrard)
-   - Disjoint no more
- * Revision 10, 2017-04-28 (Andrew Garrard)
-   - Restored disjoint
- * Revision 11, 2017-04-29 (Andrew Garrard)
-   - Now Ycbcr conversion, and KHR
- * Revision 12, 2017-06-06 (Andrew Garrard)
-   - Added conversion to image view creation
- * Revision 13, 2017-07-13 (Andrew Garrard)
-   - Allowed cosited-only chroma samples for formats
- * Revision 14, 2017-08-11 (Andrew Garrard)
-   - Reflected quantization changes in BT.2100-1
diff --git a/registry/vulkan/appendices/VK_KHR_separate_depth_stencil_layouts.txt b/registry/vulkan/appendices/VK_KHR_separate_depth_stencil_layouts.txt
deleted file mode 100644
index dda24e0..0000000
--- a/registry/vulkan/appendices/VK_KHR_separate_depth_stencil_layouts.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2019-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_separate_depth_stencil_layouts.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-06-25
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*Contributors*::
-  - Daniel Koch, NVIDIA
-  - Jeff Bolz, NVIDIA
-  - Jesse Barker, Unity
-  - Tobias Hector, AMD
-
-=== Description
-
-This extension allows image memory barriers for depth/stencil images to have
-just one of the ename:VK_IMAGE_ASPECT_DEPTH_BIT or
-ename:VK_IMAGE_ASPECT_STENCIL_BIT aspect bits set, rather than require both.
-This allows their layouts to be set independently.
-To support depth/stencil images with different layouts for the depth and
-stencil aspects, the depth/stencil attachment interface has been updated to
-support a separate layout for stencil.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_separate_depth_stencil_layouts.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-06-25 (Piers Daniell)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_KHR_shader_atomic_int64.txt b/registry/vulkan/appendices/VK_KHR_shader_atomic_int64.txt
deleted file mode 100644
index 68fd623..0000000
--- a/registry/vulkan/appendices/VK_KHR_shader_atomic_int64.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_shader_atomic_int64.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-07-05
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-  - This extension enables
-    https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_gpu_shader_int64.txt[`GL_ARB_gpu_shader_int64`]
-    and
-    https://raw.githubusercontent.com/KhronosGroup/GLSL/master/extensions/ext/GL_EXT_shader_atomic_int64.txt[`GL_EXT_shader_atomic_int64`]
-    for GLSL source languages.
-*Contributors*::
-  - Aaron Hagan, AMD
-  - Daniel Rakos, AMD
-  - Jeff Bolz, NVIDIA
-  - Neil Henning, Codeplay
-
-=== Description
-
-This extension advertises the SPIR-V *Int64Atomics* capability for Vulkan,
-which allows a shader to contain 64-bit atomic operations on signed and
-unsigned integers.
-The supported operations include OpAtomicMin, OpAtomicMax, OpAtomicAnd,
-OpAtomicOr, OpAtomicXor, OpAtomicAdd, OpAtomicExchange, and
-OpAtomicCompareExchange.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-However, if Vulkan 1.2 is supported and this extension is not, the
-code:shaderBufferInt64Atomics capability is optional.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_shader_atomic_int64.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-Int64Atomics,Int64Atomics>>
-
-=== Version History
-
-  * Revision 1, 2018-07-05 (Aaron Hagan)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_KHR_shader_clock.txt b/registry/vulkan/appendices/VK_KHR_shader_clock.txt
deleted file mode 100644
index 8134373..0000000
--- a/registry/vulkan/appendices/VK_KHR_shader_clock.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_shader_clock.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-4-25
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_shader_clock.html[`SPV_KHR_shader_clock`].
-  - This extension provides API support for
-    https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_clock.txt[`ARB_shader_clock`]
-    and
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_shader_realtime_clock.txt[`EXT_shader_realtime_clock`]
-*Contributors*::
-  - Aaron Hagan, AMD
-  - Daniel Koch, NVIDIA
-
-=== Description
-
-This extension advertises the SPIR-V code:ShaderClockKHR capability for
-Vulkan, which allows a shader to query a real-time or monotonically
-incrementing counter at the subgroup level or across the device level.
-The two valid SPIR-V scopes for code:OpReadClockKHR are code:Subgroup and
-code:Device.
-
-When using GLSL source-based shading languages, the code:clockRealtime*EXT()
-timing functions map to the code:OpReadClockKHR instruction with a scope of
-code:Device, and the code:clock*ARB() timing functions map to the
-code:OpReadClockKHR instruction with a scope of code:Subgroup.
-
-include::{generated}/interfaces/VK_KHR_shader_clock.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-ShaderClockKHR,ShaderClockKHR>>
-
-=== Version History
-
-  * Revision 1, 2019-4-25 (Aaron Hagan)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_shader_draw_parameters.txt b/registry/vulkan/appendices/VK_KHR_shader_draw_parameters.txt
deleted file mode 100644
index ef04bbd..0000000
--- a/registry/vulkan/appendices/VK_KHR_shader_draw_parameters.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_shader_draw_parameters.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-09-05
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_shader_draw_parameters.html[`SPV_KHR_shader_draw_parameters`]
-  - This extension provides API support for
-    https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_draw_parameters.txt[`GL_ARB_shader_draw_parameters`]
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Daniel Koch, NVIDIA Corporation
-  - Jeff Bolz, NVIDIA
-  - Daniel Rakos, AMD
-  - Jan-Harald Fredriksen, ARM
-  - John Kessenich, Google
-  - Stuart Smith, IMG
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * `SPV_KHR_shader_draw_parameters`
-
-The extension provides access to three additional built-in shader variables
-in Vulkan:
-
-  * code:BaseInstance, which contains the pname:firstInstance parameter
-    passed to drawing commands,
-  * code:BaseVertex, which contains the pname:firstVertex or
-    pname:vertexOffset parameter passed to drawing commands, and
-  * code:DrawIndex, which contains the index of the draw call currently
-    being processed from an indirect draw call.
-
-When using GLSL source-based shader languages, the following variables from
-`GL_ARB_shader_draw_parameters` can map to these SPIR-V built-in
-decorations:
-
-  * `in int gl_BaseInstanceARB;` -> code:BaseInstance,
-  * `in int gl_BaseVertexARB;` -> code:BaseVertex, and
-  * `in int gl_DrawIDARB;` -> code:DrawIndex.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, however
-a <<features-shaderDrawParameters,feature bit was added>> to distinguish
-whether it is actually available or not.
-
-include::{generated}/interfaces/VK_KHR_shader_draw_parameters.txt[]
-
-=== New Built-In Variables
-
-  * <<interfaces-builtin-variables-baseinstance,code:BaseInstance>>
-  * <<interfaces-builtin-variables-basevertex,code:BaseVertex>>
-  * <<interfaces-builtin-variables-drawindex,code:DrawIndex>>
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-DrawParameters,DrawParameters>>
-
-=== Issues
-
-1) Is this the same functionality as `GL_ARB_shader_draw_parameters`?
-
-*RESOLVED*: It is actually a superset, as it also adds in support for
-arrayed drawing commands.
-
-In GL for `GL_ARB_shader_draw_parameters`, code:gl_BaseVertexARB holds the
-integer value passed to the parameter to the command that resulted in the
-current shader invocation.
-In the case where the command has no code:baseVertex parameter, the value of
-code:gl_BaseVertexARB is zero.
-This means that code:gl_BaseVertexARB = code:baseVertex (for
-code:glDrawElements commands with code:baseVertex) or 0.
-In particular there are no code:glDrawArrays commands that take a
-code:baseVertex parameter.
-
-Now in Vulkan, we have code:BaseVertex = pname:vertexOffset (for indexed
-drawing commands) or pname:firstVertex (for arrayed drawing commands), and
-so Vulkan's version is really a superset of GL functionality.
-
-=== Version History
-
-  * Revision 1, 2016-10-05 (Daniel Koch)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_KHR_shader_float16_int8.txt b/registry/vulkan/appendices/VK_KHR_shader_float16_int8.txt
deleted file mode 100644
index 7217cc7..0000000
--- a/registry/vulkan/appendices/VK_KHR_shader_float16_int8.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_shader_float16_int8.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-03-07
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-  - This extension interacts with `apiext:VK_KHR_8bit_storage`
-  - This extension interacts with `apiext:VK_KHR_16bit_storage`
-  - This extension interacts with `apiext:VK_KHR_shader_float_controls`
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_shader_explicit_arithmetic_types.txt[`GL_EXT_shader_explicit_arithmetic_types`]
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-    - Alexander Galazin, Arm
-    - Jan-Harald Fredriksen, Arm
-    - Jeff Bolz, NVIDIA
-    - Graeme Leese, Broadcom
-    - Daniel Rakos, AMD
-
-=== Description
-
-The `VK_KHR_shader_float16_int8` extension allows use of 16-bit
-floating-point types and 8-bit integer types in shaders for arithmetic
-operations.
-
-It introduces two new optional features pname:shaderFloat16 and
-pname:shaderInt8 which directly map to the code:Float16 and the code:Int8
-SPIR-V capabilities.
-The `VK_KHR_shader_float16_int8` extension also specifies precision
-requirements for half-precision floating-point SPIR-V operations.
-This extension does not enable use of 8-bit integer types or 16-bit
-floating-point types in any <<interfaces-iointerfaces, shader input and
-output interfaces>> and therefore does not supersede the
-`apiext:VK_KHR_8bit_storage` or `apiext:VK_KHR_16bit_storage` extensions.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-However, if Vulkan 1.2 is supported and this extension is not, both the
-code:shaderFloat16 and code:shaderInt8 capabilities are optional.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_shader_float16_int8.txt[]
-
-=== Version History
-  * Revision 1, 2018-03-07 (Alexander Galazin)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_KHR_shader_float_controls.txt b/registry/vulkan/appendices/VK_KHR_shader_float_controls.txt
deleted file mode 100644
index 50fefb1..0000000
--- a/registry/vulkan/appendices/VK_KHR_shader_float_controls.txt
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_shader_float_controls.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-09-11
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_float_controls.html[`SPV_KHR_float_controls`]
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-    - Alexander Galazin, Arm
-    - Jan-Harald Fredriksen, Arm
-    - Jeff Bolz, NVIDIA
-    - Graeme Leese, Broadcom
-    - Daniel Rakos, AMD
-
-=== Description
-
-The `VK_KHR_shader_float_controls` extension enables efficient use of
-floating-point computations through the ability to query and override the
-implementation's default behavior for rounding modes, denormals, signed
-zero, and infinity.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_shader_float_controls.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-DenormPreserve,code:DenormPreserve>>
-  * <<spirvenv-capabilities-table-DenormFlushToZero,code:DenormFlushToZero>>
-  * <<spirvenv-capabilities-table-SignedZeroInfNanPreserve,code:SignedZeroInfNanPreserve>>
-  * <<spirvenv-capabilities-table-RoundingModeRTE,code:RoundingModeRTE>>
-  * <<spirvenv-capabilities-table-RoundingModeRTZ,code:RoundingModeRTZ>>
-
-=== Issues
-
-1) Which instructions must flush denorms?
-
-*RESOLVED*: Only floating-point conversion, floating-point arithmetic,
-floating-point relational (except code:OpIsNaN, code:OpIsInf), and
-floating-point GLSL.std.450 extended instructions must flush denormals.
-
-2) What is the denorm behavior for intermediate results?
-
-*RESOLVED*: When a SPIR-V instruction is implemented as a sequence of other
-instructions:
-
- * in the code:DenormFlushToZero execution mode, the intermediate
-   instructions may flush denormals, the final result of the sequence must:
-   not be denormal.
- * in the code:DenormPreserve execution mode, denormals must be preserved
-   throughout the whole sequence.
-
-3) Do denorm and rounding mode controls apply to code:OpSpecConstantOp?
-
-*RESOLVED*: Yes, except when the opcode is code:OpQuantizeToF16.
-
-4) The SPIR-V specification says that code:OpConvertFToU and
-code:OpConvertFToS unconditionally round towards zero.
-Do the rounding mode controls specified through the execution modes apply to
-them?
-
-*RESOLVED*: No, these instructions unconditionally round towards zero.
-
-5) Do any of the "`Pack`" GLSL.std.450 instructions count as conversion
-instructions and have the rounding mode applied?
-
-*RESOLVED*: No, only instructions listed in "`section 3.32.11.
-Conversion Instructions`" of the SPIR-V specification count as conversion
-instructions.
-
-6) When using inf/nan-ignore mode, what is expected of code:OpIsNan and
-code:OpIsInf?
-
-*RESOLVED*: These instructions must always accurately detect inf/nan if it
-is passed to them.
-
-
-[[VK_KHR_shader_controls_v4_incompatibility]]
-=== Version 4 API incompatibility
-
-The original versions of `VK_KHR_shader_float_controls` shipped with
-booleans named "`separateDenormSettings`" and
-"`separateRoundingModeSettings`", which at first glance could have indicated
-"`they can all be set independently, or not`".
-However the spec language as written indicated that the 32-bit value could
-always be set independently, and only the 16- and 64-bit controls needed to
-be the same if these values were ename:VK_FALSE.
-
-As a result of this slight disparity, and lack of test coverage for this
-facet of the extension, we ended up with two different behaviors in the
-wild, where some implementations worked as written, and others worked based
-on the naming.
-As these are hard limits in hardware with reasons for exposure as written,
-it was not possible to standardise on a single way to make this work within
-the existing API.
-
-No known users of this part of the extension exist in the wild, and as such
-the Vulkan WG took the unusual step of retroactively changing the once
-boolean value into a tri-state enum, breaking source compatibility.
-This was however done in such a way as to retain ABI compatibility, in case
-any code using this did exist; with the numerical values 0 and 1 retaining
-their original specified meaning, and a new value signifying the additional
-"`all need to be set together`" state.
-If any applications exist today, compiled binaries will continue to work as
-written in most cases, but will need changes before the code can be
-recompiled.
-
-
-=== Version History
-
-  * Revision 4, 2019-06-18 (Tobias Hector)
-    - Modified settings restrictions, see
-      <<VK_KHR_shader_controls_v4_incompatibility, Version 4 API
-      incompatibility>>
-  * Revision 3, 2018-09-11 (Alexander Galazin)
-    - Minor restructuring
-  * Revision 2, 2018-04-17 (Alexander Galazin)
-    - Added issues and resolutions
-  * Revision 1, 2018-04-11 (Alexander Galazin)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_KHR_shader_integer_dot_product.txt b/registry/vulkan/appendices/VK_KHR_shader_integer_dot_product.txt
deleted file mode 100644
index 6b01cd8..0000000
--- a/registry/vulkan/appendices/VK_KHR_shader_integer_dot_product.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright (c) 2019-2020 Khronos Group.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_shader_integer_dot_product.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-06-16
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_integer_dot_product.html[`SPV_KHR_integer_dot_product`].
-  - This extension interacts with `apiext:VK_KHR_shader_float16_int8`.
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Kévin Petit, Arm Ltd.
-  - Jeff Bolz, NVidia
-  - Spencer Fricke, Samsung
-  - Jesse Hall, Google
-  - John Kessenich, Google
-  - Graeme Leese, Broadcom
-  - Einar Hov, Arm Ltd.
-  - Stuart Brady, Arm Ltd.
-  - Pablo Cascon, Arm Ltd.
-  - Tobias Hector, AMD
-  - Jeff Leger, Qualcomm
-  - Ruihao Zhang, Qualcomm
-  - Pierre Boudier, NVidia
-  - Jon Leech, The Khronos Group
-  - Tom Olson, Arm Ltd.
-
-=== Description
-
-This extension adds support for the integer dot product SPIR-V instructions
-defined in SPV_KHR_integer_dot_product.
-These instructions are particularly useful for neural network inference and
-training but find uses in other general purpose compute applications as
-well.
-
-include::{generated}/interfaces/VK_KHR_shader_integer_dot_product.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-DotProductInputAllKHR,DotProductInputAllKHR>>
-  * <<spirvenv-capabilities-table-DotProductInput4x8BitKHR,DotProductInput4x8BitKHR>>
-  * <<spirvenv-capabilities-table-DotProductInput4x8BitPackedKHR,DotProductInput4x8BitPackedKHR>>
-  * <<spirvenv-capabilities-table-DotProductKHR,DotProductKHR>>
-
-=== Version History
-
-  * Revision 1, 2021-06-16 (Kévin Petit)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_shader_non_semantic_info.txt b/registry/vulkan/appendices/VK_KHR_shader_non_semantic_info.txt
deleted file mode 100644
index 9531ad2..0000000
--- a/registry/vulkan/appendices/VK_KHR_shader_non_semantic_info.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_shader_non_semantic_info.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-10-16
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_non_semantic_info.html[`SPV_KHR_non_semantic_info`]
-*Contributors*::
-  - Baldur Karlsson, Valve
-
-=== Description
-
-This extension allows the use of the `SPV_KHR_non_semantic_info` extension
-in SPIR-V shader modules.
-
-include::{generated}/interfaces/VK_KHR_shader_non_semantic_info.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-10-16 (Baldur Karlsson)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_shader_subgroup_extended_types.txt b/registry/vulkan/appendices/VK_KHR_shader_subgroup_extended_types.txt
deleted file mode 100644
index 7f13247..0000000
--- a/registry/vulkan/appendices/VK_KHR_shader_subgroup_extended_types.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_shader_subgroup_extended_types.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-01-08
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_shader_subgroup_extended_types.txt[`GLSL_EXT_shader_subgroup_extended_types`]
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Jan-Harald Fredriksen, Arm
-  - Neil Henning, AMD
-  - Daniel Koch, NVIDIA
-  - Jeff Leger, Qualcomm
-  - Graeme Leese, Broadcom
-  - David Neto, Google
-  - Daniel Rakos, AMD
-
-=== Description
-
-This extension enables the Non Uniform Group Operations in SPIR-V to support
-8-bit integer, 16-bit integer, 64-bit integer, 16-bit floating-point, and
-vectors of these types.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_shader_subgroup_extended_types.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-01-08 (Neil Henning)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_KHR_shader_subgroup_uniform_control_flow.txt b/registry/vulkan/appendices/VK_KHR_shader_subgroup_uniform_control_flow.txt
deleted file mode 100644
index 2d97a64..0000000
--- a/registry/vulkan/appendices/VK_KHR_shader_subgroup_uniform_control_flow.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_shader_subgroup_uniform_control_flow.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-08-27
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Requires SPIR-V 1.3.
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_subgroup_uniform_control_flow.html[`SPV_KHR_subgroup_uniform_control_flow`]
-*Contributors*::
-  - Alan Baker, Google
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension allows the use of the `SPV_KHR_subgroup_uniform_control_flow`
-SPIR-V extension in shader modules.
-`SPV_KHR_subgroup_uniform_control_flow` provides stronger guarantees that
-diverged subgroups will reconverge.
-
-Developers should utilize this extension if they use subgroup operations to
-reduce the work performed by a uniform subgroup.
-This extension will guarantee that uniform subgroup will reconverge in the
-same manner as invocation groups (see "`Uniform Control Flow`" in the
-<<spirv-spec,Khronos SPIR-V Specification>>).
-
-include::{generated}/interfaces/VK_KHR_shader_subgroup_uniform_control_flow.txt[]
-
-=== Version History
-
-  * Revision 1, 2020-08-27 (Alan Baker)
-    - Internal draft version
diff --git a/registry/vulkan/appendices/VK_KHR_shader_terminate_invocation.txt b/registry/vulkan/appendices/VK_KHR_shader_terminate_invocation.txt
deleted file mode 100644
index b3b724c..0000000
--- a/registry/vulkan/appendices/VK_KHR_shader_terminate_invocation.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_shader_terminate_invocation.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-08-11
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Requires the
-    {spirv}/KHR/SPV_KHR_terminate_invocation.html[`SPV_KHR_terminate_invocation`]
-    SPIR-V extension.
-*Contributors*::
-  - Alan Baker, Google
-  - Jeff Bolz, NVIDIA
-  - Jesse Hall, Google
-  - Ralph Potter, Samsung
-  - Tom Olson, Arm
-
-=== Description
-
-This extension adds Vulkan support for the
-{spirv}/KHR/SPV_KHR_terminate_invocation.html[`SPV_KHR_terminate_invocation`]
-SPIR-V extension.
-That SPIR-V extension provides a new instruction,
-code:OpTerminateInvocation, which causes a shader invocation to immediately
-terminate and sets the coverage of shaded samples to `0`; only previously
-executed instructions will have observable effects.
-The code:OpTerminateInvocation instruction, along with the
-code:OpDemoteToHelperInvocation instruction from the
-`apiext:VK_EXT_shader_demote_to_helper_invocation` extension, together
-replace the code:OpKill instruction, which could behave like either of these
-instructions.
-code:OpTerminateInvocation provides the behavior required by the GLSL
-code:discard statement, and should be used when available by GLSL compilers
-and applications that need the GLSL code:discard behavior.
-
-include::{generated}/interfaces/VK_KHR_shader_terminate_invocation.txt[]
-
-=== Version History
-
-  * Revision 1, 2020-08-11 (Jesse Hall)
diff --git a/registry/vulkan/appendices/VK_KHR_shared_presentable_image.txt b/registry/vulkan/appendices/VK_KHR_shared_presentable_image.txt
deleted file mode 100644
index ea5b522..0000000
--- a/registry/vulkan/appendices/VK_KHR_shared_presentable_image.txt
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_shared_presentable_image.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-03-20
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Alon Or-bach, Samsung Electronics
-  - Ian Elliott, Google
-  - Jesse Hall, Google
-  - Pablo Ceballos, Google
-  - Chris Forbes, Google
-  - Jeff Juliano, NVIDIA
-  - James Jones, NVIDIA
-  - Daniel Rakos, AMD
-  - Tobias Hector, Imagination Technologies
-  - Graham Connor, Imagination Technologies
-  - Michael Worcester, Imagination Technologies
-  - Cass Everitt, Oculus
-  - Johannes Van Waveren, Oculus
-
-=== Description
-
-This extension extends `apiext:VK_KHR_swapchain` to enable creation of a
-shared presentable image.
-This allows the application to use the image while the presention engine is
-accessing it, in order to reduce the latency between rendering and
-presentation.
-
-include::{generated}/interfaces/VK_KHR_shared_presentable_image.txt[]
-
-=== Issues
-
-1) Should we allow a Vulkan WSI swapchain to toggle between normal usage and
-shared presentation usage?
-
-*RESOLVED*: No.
-WSI swapchains are typically recreated with new properties instead of having
-their properties changed.
-This can also save resources, assuming that fewer images are needed for
-shared presentation, and assuming that most VR applications do not need to
-switch between normal and shared usage.
-
-2) Should we have a query for determining how the presentation engine
-refresh is triggered?
-
-*RESOLVED*: Yes.
-This is done via which presentation modes a surface supports.
-
-3) Should the object representing a shared presentable image be an extension
-of a slink:VkSwapchainKHR or a separate object?
-
-*RESOLVED*: Extension of a swapchain due to overlap in creation properties
-and to allow common functionality between shared and normal presentable
-images and swapchains.
-
-4) What should we call the extension and the new structures it creates?
-
-*RESOLVED*: Shared presentable image / shared present.
-
-5) Should the pname:minImageCount and pname:presentMode values of the
-slink:VkSwapchainCreateInfoKHR be ignored, or required to be compatible
-values?
-
-*RESOLVED*: pname:minImageCount must be set to 1, and pname:presentMode
-should be set to either ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or
-ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR.
-
-6) What should the layout of the shared presentable image be?
-
-*RESOLVED*: After acquiring the shared presentable image, the application
-must transition it to the ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR layout
-prior to it being used.
-After this initial transition, any image usage that was requested during
-swapchain creation can: be performed on the image without layout transitions
-being performed.
-
-7) Do we need a new API for the trigger to refresh new content?
-
-*RESOLVED*: flink:vkQueuePresentKHR to act as API to trigger a refresh, as
-will allow combination with other compatible extensions to
-flink:vkQueuePresentKHR.
-
-8) How should an application detect a ename:VK_ERROR_OUT_OF_DATE_KHR error
-on a swapchain using the ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR
-present mode?
-
-*RESOLVED*: Introduce flink:vkGetSwapchainStatusKHR to allow applications to
-query the status of a swapchain using a shared presentation mode.
-
-9) What should subsequent calls to flink:vkQueuePresentKHR for
-ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR swapchains be defined to
-do?
-
-*RESOLVED*: State that implementations may use it as a hint for updated
-content.
-
-10) Can the ownership of a shared presentable image be transferred to a
-different queue?
-
-*RESOLVED*: No.
-It is not possible to transfer ownership of a shared presentable image
-obtained from a swapchain created using ename:VK_SHARING_MODE_EXCLUSIVE
-after it has been presented.
-
-11) How should flink:vkQueueSubmit behave if a command buffer uses an image
-from a ename:VK_ERROR_OUT_OF_DATE_KHR swapchain?
-
-*RESOLVED*: flink:vkQueueSubmit is expected to return the
-ename:VK_ERROR_DEVICE_LOST error.
-
-12) Can Vulkan provide any guarantee on the order of rendering, to enable
-beam chasing?
-
-*RESOLVED*: This could be achieved via use of render passes to ensure strip
-rendering.
-
-
-=== Version History
- * Revision 1, 2017-03-20 (Alon Or-bach)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_KHR_spirv_1_4.txt b/registry/vulkan/appendices/VK_KHR_spirv_1_4.txt
deleted file mode 100644
index a33f517..0000000
--- a/registry/vulkan/appendices/VK_KHR_spirv_1_4.txt
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_spirv_1_4.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-04-01
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Requires SPIR-V 1.4.
-  - Promoted to Vulkan 1.2 Core
-*Contributors*::
-  - Alexander Galazin, Arm
-  - David Neto, Google
-  - Jesse Hall, Google
-  - John Kessenich, Google
-  - Neil Henning, AMD
-  - Tom Olson, Arm
-
-=== Description
-
-This extension allows the use of SPIR-V 1.4 shader modules.
-SPIR-V 1.4's new features primarily make it an easier target for compilers
-from high-level languages, rather than exposing new hardware functionality.
-
-SPIR-V 1.4 incorporates features that are also available separately as
-extensions.
-SPIR-V 1.4 shader modules do not need to enable those extensions with the
-`OpExtension` opcode, since they are integral parts of SPIR-V 1.4.
-
-SPIR-V 1.4 introduces new floating point execution mode capabilities, also
-available via `SPV_KHR_float_controls`.
-Implementations are not required to support all of these new capabilities;
-support can be queried using
-slink:VkPhysicalDeviceFloatControlsPropertiesKHR from the
-`apiext:VK_KHR_shader_float_controls` extension.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_spirv_1_4.txt[]
-
-=== Issues
-
-1.
-Should we have an extension specific to this SPIR-V version, or add a
-version-generic query for SPIR-V version? SPIR-V 1.4 does not need any other
-API changes.
-
-*RESOLVED*: Just expose SPIR-V 1.4.
-
-Most new SPIR-V versions introduce optionally-required capabilities or have
-implementation-defined limits, and would need more API and specification
-changes specific to that version to make them available in Vulkan.
-ifdef::VK_VERSION_1_1[]
-For example, to support the subgroup capabilities added in SPIR-V 1.3
-required introducing slink:VkPhysicalDeviceSubgroupProperties to allow
-querying the supported group operation categories, maximum supported
-subgroup size, etc.
-endif::VK_VERSION_1_1[]
-While we could expose the parts of a new SPIR-V version that do not need
-accompanying changes generically, we will still end up writing extensions
-specific to each version for the remaining parts.
-Thus the generic mechanism will not reduce future spec-writing effort.
-In addition, making it clear which parts of a future version are supported
-by the generic mechanism and which cannot be used without specific support
-would be difficult to get right ahead of time.
-
-2.
-Can different stages of the same pipeline use shaders with different SPIR-V
-versions?
-
-*RESOLVED*: Yes.
-
-Mixing SPIR-V versions 1.0-1.3 in the same pipeline has not been disallowed,
-so it would be inconsistent to disallow mixing 1.4 with previous versions..
-SPIR-V 1.4 does not introduce anything that should cause new difficulties
-here.
-
-3.
-Must Vulkan extensions corresponding to SPIR-V extensions that were promoted
-to core in 1.4 be enabled in order to use that functionality in a SPIR-V 1.4
-module?
-
-*RESOLVED*: No, with caveats.
-
-The SPIR-V 1.4 module does not need to declare the SPIR-V extensions, since
-the functionality is now part of core, so there is no need to enable the
-Vulkan extension that allows SPIR-V modules to declare the SPIR-V extension.
-However, when the functionality that is now core in SPIR-V 1.4 is optionally
-supported, the query for support is provided by a Vulkan extension, and that
-query can only be used if the extension is enabled.
-
-This applies to any SPIR-V version; specifically for SPIR-V 1.4 this only
-applies to the functionality from `SPV_KHR_float_controls`, which was made
-available in Vulkan by `apiext:VK_KHR_shader_float_controls`.
-Even though the extension was promoted in SPIR-V 1.4, the capabilities are
-still optional in implementations that support `VK_KHR_spirv_1_4`.
-
-A SPIR-V 1.4 module does not need to enable `SPV_KHR_float_controls` in
-order to use the capabilities, so if the application has _a priori_
-knowledge that the implementation supports the capabilities, it does not
-need to enable `apiext:VK_KHR_shader_float_controls`.
-However, if it does not have this knowledge and has to query for support at
-runtime, it must enable `apiext:VK_KHR_shader_float_controls` in order to
-use slink:VkPhysicalDeviceFloatControlsPropertiesKHR.
-
-=== Version History
-
-  * Revision 1, 2019-04-01 (Jesse Hall)
-    - Internal draft versions
diff --git a/registry/vulkan/appendices/VK_KHR_storage_buffer_storage_class.txt b/registry/vulkan/appendices/VK_KHR_storage_buffer_storage_class.txt
deleted file mode 100644
index f5762e7..0000000
--- a/registry/vulkan/appendices/VK_KHR_storage_buffer_storage_class.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_storage_buffer_storage_class.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-09-05
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_storage_buffer_storage_class.html[`SPV_KHR_storage_buffer_storage_class`]
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - Alexander Galazin, ARM
-  - David Neto, Google
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * `SPV_KHR_storage_buffer_storage_class`
-
-This extension provides a new SPIR-V code:StorageBuffer storage class.
-A code:Block-decorated object in this class is equivalent to a
-code:BufferBlock-decorated object in the code:Uniform storage class.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1.
-
-include::{generated}/interfaces/VK_KHR_storage_buffer_storage_class.txt[]
-
-=== Version History
-
-  * Revision 1, 2017-03-23 (Alexander Galazin)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_KHR_surface.txt b/registry/vulkan/appendices/VK_KHR_surface.txt
deleted file mode 100644
index bac3657..0000000
--- a/registry/vulkan/appendices/VK_KHR_surface.txt
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-08-25
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Patrick Doane, Blizzard
-  - Ian Elliott, LunarG
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-  - David Mao, AMD
-  - Norbert Nopper, Freescale
-  - Alon Or-bach, Samsung
-  - Daniel Rakos, AMD
-  - Graham Sellers, AMD
-  - Jeff Vigil, Qualcomm
-  - Chia-I Wu, LunarG
-  - Jason Ekstrand, Intel
-
-=== Description
-
-The `VK_KHR_surface` extension is an instance extension.
-It introduces slink:VkSurfaceKHR objects, which abstract native platform
-surface or window objects for use with Vulkan.
-It also provides a way to determine whether a queue family in a physical
-device supports presenting to particular surface.
-
-Separate extensions for each platform provide the mechanisms for creating
-slink:VkSurfaceKHR objects, but once created they may be used in this and
-other platform-independent extensions, in particular the
-`apiext:VK_KHR_swapchain` extension.
-
-include::{generated}/interfaces/VK_KHR_surface.txt[]
-
-=== Examples
-
-[NOTE]
-.Note
-====
-The example code for the `VK_KHR_surface` and `apiext:VK_KHR_swapchain`
-extensions was removed from the appendix after revision 1.0.29.
-This WSI example code was ported to the cube demo that is shipped with the
-official Khronos SDK, and is being kept up-to-date in that location (see:
-https://github.com/KhronosGroup/Vulkan-Tools/blob/master/cube/cube.c).
-====
-
-=== Issues
-
-1) Should this extension include a method to query whether a physical device
-supports presenting to a specific window or native surface on a given
-platform?
-
-*RESOLVED*: Yes.
-Without this, applications would need to create a device instance to
-determine whether a particular window can be presented to.
-Knowing that a device supports presentation to a platform in general is not
-sufficient, as a single machine might support multiple seats, or instances
-of the platform that each use different underlying physical devices.
-Additionally, on some platforms, such as the X Window System, different
-drivers and devices might be used for different windows depending on which
-section of the desktop they exist on.
-
-2) Should the flink:vkGetPhysicalDeviceSurfaceCapabilitiesKHR,
-flink:vkGetPhysicalDeviceSurfaceFormatsKHR, and
-flink:vkGetPhysicalDeviceSurfacePresentModesKHR functions be in this
-extension and operate on physical devices, rather than being in
-`apiext:VK_KHR_swapchain` (i.e. device extension) and being dependent on
-slink:VkDevice?
-
-*RESOLVED*: Yes.
-While it might be useful to depend on sname:VkDevice (and therefore on
-enabled extensions and features) for the queries, Vulkan was released only
-with the slink:VkPhysicalDevice versions.
-Many cases can be resolved by a Valid Usage statement, and/or by a separate
-pname:pNext chain version of the query struct specific to a given extension
-or parameters, via extensible versions of the queries:
-ifdef::VK_EXT_full_screen_exclusive[flink:vkGetPhysicalDeviceSurfacePresentModes2EXT,]
-flink:vkGetPhysicalDeviceSurfaceCapabilities2KHR, and
-flink:vkGetPhysicalDeviceSurfaceFormats2KHR.
-
-3) Should Vulkan support Xlib or XCB as the API for accessing the X Window
-System platform?
-
-*RESOLVED*: Both.
-XCB is a more modern and efficient API, but Xlib usage is deeply ingrained
-in many applications and likely will remain in use for the foreseeable
-future.
-Not all drivers necessarily need to support both, but including both as
-options in the core specification will probably encourage support, which
-should in turn ease adoption of the Vulkan API in older codebases.
-Additionally, the performance improvements possible with XCB likely will not
-have a measurable impact on the performance of Vulkan presentation and other
-minimal window system interactions defined here.
-
-4) Should the GBM platform be included in the list of platform enums?
-
-*RESOLVED*: Deferred, and will be addressed with a platform-specific
-extension to be written in the future.
-
-=== Version History
-
-  * Revision 1, 2015-05-20 (James Jones)
-    - Initial draft, based on LunarG KHR spec, other KHR specs, patches
-      attached to bugs.
-
-  * Revision 2, 2015-05-22 (Ian Elliott)
-    - Created initial Description section.
-    - Removed query for whether a platform requires the use of a queue for
-      presentation, since it was decided that presentation will always be
-      modeled as being part of the queue.
-    - Fixed typos and other minor mistakes.
-
-  * Revision 3, 2015-05-26 (Ian Elliott)
-    - Improved the Description section.
-
-  * Revision 4, 2015-05-27 (James Jones)
-    - Fixed compilation errors in example code.
-
-  * Revision 5, 2015-06-01 (James Jones)
-    - Added issues 1 and 2 and made related spec updates.
-
-  * Revision 6, 2015-06-01 (James Jones)
-    - Merged the platform type mappings table previously removed from
-      VK_KHR_swapchain with the platform description table in this spec.
-    - Added issues 3 and 4 documenting choices made when building the
-      initial list of native platforms supported.
-
-  * Revision 7, 2015-06-11 (Ian Elliott)
-    - Updated table 1 per input from the KHR TSG.
-    - Updated issue 4 (GBM) per discussion with Daniel Stone.
-      He will create a platform-specific extension sometime in the future.
-
-  * Revision 8, 2015-06-17 (James Jones)
-    - Updated enum-extending values using new convention.
-    - Fixed the value of VK_SURFACE_PLATFORM_INFO_TYPE_SUPPORTED_KHR.
-
-  * Revision 9, 2015-06-17 (James Jones)
-    - Rebased on Vulkan API version 126.
-
-  * Revision 10, 2015-06-18 (James Jones)
-    - Marked issues 2 and 3 resolved.
-
-  * Revision 11, 2015-06-23 (Ian Elliott)
-    - Examples now show use of function pointers for extension functions.
-    - Eliminated extraneous whitespace.
-
-  * Revision 12, 2015-07-07 (Daniel Rakos)
-    - Added error section describing when each error is expected to be
-      reported.
-    - Replaced the term "`queue node index`" with "`queue family index`" in
-      the spec as that is the agreed term to be used in the latest version
-      of the core header and spec.
-    - Replaced bool32_t with VkBool32.
-
-  * Revision 13, 2015-08-06 (Daniel Rakos)
-    - Updated spec against latest core API header version.
-
-  * Revision 14, 2015-08-20 (Ian Elliott)
-    - Renamed this extension and all of its enumerations, types, functions,
-      etc.
-      This makes it compliant with the proposed standard for Vulkan
-      extensions.
-    - Switched from "`revision`" to "`version`", including use of the
-      VK_MAKE_VERSION macro in the header file.
-    - Did miscellaneous cleanup, etc.
-
-  * Revision 15, 2015-08-20 (Ian Elliott--porting a 2015-07-29 change from
-    James Jones)
-    - Moved the surface transform enums here from VK_WSI_swapchain so they
-      could be reused by VK_WSI_display.
-
-  * Revision 16, 2015-09-01 (James Jones)
-    - Restore single-field revision number.
-
-  * Revision 17, 2015-09-01 (James Jones)
-    - Fix example code compilation errors.
-
-  * Revision 18, 2015-09-26 (Jesse Hall)
-    - Replaced VkSurfaceDescriptionKHR with the VkSurfaceKHR object, which
-      is created via layered extensions.
-      Added VkDestroySurfaceKHR.
-
-  * Revision 19, 2015-09-28 (Jesse Hall)
-    - Renamed from VK_EXT_KHR_swapchain to VK_EXT_KHR_surface.
-
-  * Revision 20, 2015-09-30 (Jeff Vigil)
-    - Add error result VK_ERROR_SURFACE_LOST_KHR.
-
-  * Revision 21, 2015-10-15 (Daniel Rakos)
-    - Updated the resolution of issue #2 and include the surface capability
-      queries in this extension.
-    - Renamed SurfaceProperties to SurfaceCapabilities as it better reflects
-      that the values returned are the capabilities of the surface on a
-      particular device.
-    - Other minor cleanup and consistency changes.
-
-  * Revision 22, 2015-10-26 (Ian Elliott)
-    - Renamed from VK_EXT_KHR_surface to VK_KHR_surface.
-
-  * Revision 23, 2015-11-03 (Daniel Rakos)
-    - Added allocation callbacks to vkDestroySurfaceKHR.
-
-  * Revision 24, 2015-11-10 (Jesse Hall)
-    - Removed VkSurfaceTransformKHR.
-      Use VkSurfaceTransformFlagBitsKHR instead.
-    - Rename VkSurfaceCapabilitiesKHR member maxImageArraySize to
-      maxImageArrayLayers.
-
-  * Revision 25, 2016-01-14 (James Jones)
-    - Moved VK_ERROR_NATIVE_WINDOW_IN_USE_KHR from the
-      VK_KHR_android_surface to the VK_KHR_surface extension.
-
-  * 2016-08-23 (Ian Elliott)
-    - Update the example code, to not have so many characters per line, and
-      to split out a new example to show how to obtain function pointers.
-
-  * 2016-08-25 (Ian Elliott)
-    - A note was added at the beginning of the example code, stating that it
-      will be removed from future versions of the appendix.
diff --git a/registry/vulkan/appendices/VK_KHR_surface_protected_capabilities.txt b/registry/vulkan/appendices/VK_KHR_surface_protected_capabilities.txt
deleted file mode 100644
index 9e78018..0000000
--- a/registry/vulkan/appendices/VK_KHR_surface_protected_capabilities.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_surface_protected_capabilities.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-     2018-12-18
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Sandeep Shinde, NVIDIA
-  - James Jones, NVIDIA
-  - Daniel Koch, NVIDIA
-
-=== Description
-
-This extension extends slink:VkSurfaceCapabilities2KHR, providing
-applications a way to query whether swapchains can: be created with the
-ename:VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR flag set.
-
-Vulkan 1.1 added (optional) support for protect memory and protected
-resources including buffers (ename:VK_BUFFER_CREATE_PROTECTED_BIT), images
-(ename:VK_IMAGE_CREATE_PROTECTED_BIT), and swapchains
-(ename:VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR).
-However, on implementations which support multiple windowing systems, not
-all window systems may: be able to provide a protected display path.
-
-This extension provides a way to query if a protected swapchain created for
-a surface (and thus a specific windowing system) can: be displayed on
-screen.
-It extends the existing slink:VkSurfaceCapabilities2KHR structure with a new
-slink:VkSurfaceProtectedCapabilitiesKHR structure from which the application
-can: obtain information about support for protected swapchain creation
-through flink:vkGetPhysicalDeviceSurfaceCapabilities2KHR.
-
-include::{generated}/interfaces/VK_KHR_surface_protected_capabilities.txt[]
-
-=== Version History
-
- * Revision 1, 2018-12-18 (Sandeep Shinde, Daniel Koch)
-   - Internal revisions.
diff --git a/registry/vulkan/appendices/VK_KHR_swapchain.txt b/registry/vulkan/appendices/VK_KHR_swapchain.txt
deleted file mode 100644
index f489872..0000000
--- a/registry/vulkan/appendices/VK_KHR_swapchain.txt
+++ /dev/null
@@ -1,774 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_swapchain.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-10-06
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Interacts with Vulkan 1.1
-*Contributors*::
-  - Patrick Doane, Blizzard
-  - Ian Elliott, LunarG
-  - Jesse Hall, Google
-  - Mathias Heyer, NVIDIA
-  - James Jones, NVIDIA
-  - David Mao, AMD
-  - Norbert Nopper, Freescale
-  - Alon Or-bach, Samsung
-  - Daniel Rakos, AMD
-  - Graham Sellers, AMD
-  - Jeff Vigil, Qualcomm
-  - Chia-I Wu, LunarG
-  - Jason Ekstrand, Intel
-  - Matthaeus G. Chajdas, AMD
-  - Ray Smith, ARM
-
-=== Description
-
-The `VK_KHR_swapchain` extension is the device-level companion to the
-`apiext:VK_KHR_surface` extension.
-It introduces slink:VkSwapchainKHR objects, which provide the ability to
-present rendering results to a surface.
-
-include::{generated}/interfaces/VK_KHR_swapchain.txt[]
-
-=== Issues
-
-1) Does this extension allow the application to specify the memory backing
-of the presentable images?
-
-*RESOLVED*: No.
-Unlike standard images, the implementation will allocate the memory backing
-of the presentable image.
-
-2) What operations are allowed on presentable images?
-
-*RESOLVED*: This is determined by the image usage flags specified when
-creating the presentable image's swapchain.
-
-3) Does this extension support MSAA presentable images?
-
-*RESOLVED*: No.
-Presentable images are always single-sampled.
-Multi-sampled rendering must use regular images.
-To present the rendering results the application must manually resolve the
-multi- sampled image to a single-sampled presentable image prior to
-presentation.
-
-4) Does this extension support stereo/multi-view presentable images?
-
-*RESOLVED*: Yes.
-The number of views associated with a presentable image is determined by the
-pname:imageArrayLayers specified when creating a swapchain.
-All presentable images in a given swapchain use the same array size.
-
-5) Are the layers of stereo presentable images half-sized?
-
-*RESOLVED*: No.
-The image extents always match those requested by the application.
-
-6) Do the "`present`" and "`acquire next image`" commands operate on a
-queue? If not, do they need to include explicit semaphore objects to
-interlock them with queue operations?
-
-*RESOLVED*: The present command operates on a queue.
-The image ownership operation it represents happens in order with other
-operations on the queue, so no explicit semaphore object is required to
-synchronize its actions.
-
-Applications may want to acquire the next image in separate threads from
-those in which they manage their queue, or in multiple threads.
-To make such usage easier, the acquire next image command takes a semaphore
-to signal as a method of explicit synchronization.
-The application must later queue a wait for this semaphore before queuing
-execution of any commands using the image.
-
-7) Does flink:vkAcquireNextImageKHR block if no images are available?
-
-*RESOLVED*: The command takes a timeout parameter.
-Special values for the timeout are 0, which makes the call a non-blocking
-operation, and code:UINT64_MAX, which blocks indefinitely.
-Values in between will block for up to the specified time.
-The call will return when an image becomes available or an error occurs.
-It may, but is not required to, return before the specified timeout expires
-if the swapchain becomes out of date.
-
-8) Can multiple presents be queued using one flink:vkQueuePresentKHR call?
-
-*RESOLVED*: Yes.
-slink:VkPresentInfoKHR contains a list of swapchains and corresponding image
-indices that will be presented.
-When supported, all presentations queued with a single
-flink:vkQueuePresentKHR call will be applied atomically as one operation.
-The same swapchain must not appear in the list more than once.
-Later extensions may provide applications stronger guarantees of atomicity
-for such present operations, and/or allow them to query whether atomic
-presentation of a particular group of swapchains is possible.
-
-9) How do the presentation and acquire next image functions notify the
-application the targeted surface has changed?
-
-*RESOLVED*: Two new result codes are introduced for this purpose:
-
-  * ename:VK_SUBOPTIMAL_KHR - Presentation will still succeed, subject to
-    the window resize behavior, but the swapchain is no longer configured
-    optimally for the surface it targets.
-    Applications should query updated surface information and recreate their
-    swapchain at the next convenient opportunity.
-  * ename:VK_ERROR_OUT_OF_DATE_KHR - Failure.
-    The swapchain is no longer compatible with the surface it targets.
-    The application must query updated surface information and recreate the
-    swapchain before presentation will succeed.
-
-These can be returned by both flink:vkAcquireNextImageKHR and
-flink:vkQueuePresentKHR.
-
-10) Does the flink:vkAcquireNextImageKHR command return a semaphore to the
-application via an output parameter, or accept a semaphore to signal from
-the application as an object handle parameter?
-
-*RESOLVED*: Accept a semaphore to signal as an object handle.
-This avoids the need to specify whether the application must destroy the
-semaphore or whether it is owned by the swapchain, and if the latter, what
-its lifetime is and whether it can be reused for other operations once it is
-received from flink:vkAcquireNextImageKHR.
-
-11) What types of swapchain queuing behavior should be exposed? Options
-include swap interval specification, mailbox/most recent vs. FIFO queue
-management, targeting specific vertical blank intervals or absolute times
-for a given present operation, and probably others.
-For some of these, whether they are specified at swapchain creation time or
-as per-present parameters needs to be decided as well.
-
-*RESOLVED*: The base swapchain extension will expose 3 possible behaviors
-(of which, FIFO will always be supported):
-
-  - Immediate present: Does not wait for vertical blanking period to update
-    the current image, likely resulting in visible tearing.
-    No internal queue is used.
-    Present requests are applied immediately.
-  - Mailbox queue: Waits for the next vertical blanking period to update the
-    current image.
-    No tearing should be observed.
-    An internal single-entry queue is used to hold pending presentation
-    requests.
-    If the queue is full when a new presentation request is received, the
-    new request replaces the existing entry, and any images associated with
-    the prior entry become available for reuse by the application.
-  - FIFO queue: Waits for the next vertical blanking period to update the
-    current image.
-    No tearing should be observed.
-    An internal queue containing [eq]#ptext:numSwapchainImages - 1# entries
-    is used to hold pending presentation requests.
-    New requests are appended to the end of the queue, and one request is
-    removed from the beginning of the queue and processed during each
-    vertical blanking period in which the queue is non-empty
-
-Not all surfaces will support all of these modes, so the modes supported
-will be returned using a surface information query.
-All surfaces must support the FIFO queue mode.
-Applications must choose one of these modes up front when creating a
-swapchain.
-Switching modes can be accomplished by recreating the swapchain.
-
-12) Can ename:VK_PRESENT_MODE_MAILBOX_KHR provide non-blocking guarantees
-for flink:vkAcquireNextImageKHR? If so, what is the proper criteria?
-
-*RESOLVED*: Yes.
-The difficulty is not immediately obvious here.
-Naively, if at least 3 images are requested, mailbox mode should always have
-an image available for the application if the application does not own any
-images when the call to flink:vkAcquireNextImageKHR was made.
-However, some presentation engines may have more than one "`current`" image,
-and would still need to block in some cases.
-The right requirement appears to be that if the application allocates the
-surface's minimum number of images + 1 then it is guaranteed non-blocking
-behavior when it does not currently own any images.
-
-13) Is there a way to create and initialize a new swapchain for a surface
-that has generated a ename:VK_SUBOPTIMAL_KHR return code while still using
-the old swapchain?
-
-*RESOLVED*: Not as part of this specification.
-This could be useful to allow the application to create an "`optimal`"
-replacement swapchain and rebuild all its command buffers using it in a
-background thread at a low priority while continuing to use the
-"`suboptimal`" swapchain in the main thread.
-It could probably use the same "`atomic replace`" semantics proposed for
-recreating direct-to-device swapchains without incurring a mode switch.
-However, after discussion, it was determined some platforms probably could
-not support concurrent swapchains for the same surface though, so this will
-be left out of the base KHR extensions.
-A future extension could add this for platforms where it is supported.
-
-14) Should there be a special value for
-slink:VkSurfaceCapabilitiesKHR::pname:maxImageCount to indicate there are no
-practical limits on the number of images in a swapchain?
-
-*RESOLVED*: Yes.
-There will often be cases where there is no practical limit to the number of
-images in a swapchain other than the amount of available resources (i.e.,
-memory) in the system.
-Trying to derive a hard limit from things like memory size is prone to
-failure.
-It is better in such cases to leave it to applications to figure such soft
-limits out via trial/failure iterations.
-
-15) Should there be a special value for
-slink:VkSurfaceCapabilitiesKHR::pname:currentExtent to indicate the size of
-the platform surface is undefined:?
-
-*RESOLVED*: Yes.
-On some platforms (Wayland, for example), the surface size is defined by the
-images presented to it rather than the other way around.
-
-16) Should there be a special value for
-slink:VkSurfaceCapabilitiesKHR::pname:maxImageExtent to indicate there is no
-practical limit on the surface size?
-
-*RESOLVED*: No.
-It seems unlikely such a system would exist.
-0 could be used to indicate the platform places no limits on the extents
-beyond those imposed by Vulkan for normal images, but this query could just
-as easily return those same limits, so a special "`unlimited`" value does
-not seem useful for this field.
-
-17) How should surface rotation and mirroring be exposed to applications?
-How do they specify rotation and mirroring transforms applied prior to
-presentation?
-
-*RESOLVED*: Applications can query both the supported and current transforms
-of a surface.
-Both are specified relative to the device's "`natural`" display rotation and
-direction.
-The supported transforms indicate which orientations the presentation engine
-accepts images in.
-For example, a presentation engine that does not support transforming
-surfaces as part of presentation, and which is presenting to a surface that
-is displayed with a 90-degree rotation, would return only one supported
-transform bit: ename:VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR.
-Applications must transform their rendering by the transform they specify
-when creating the swapchain in pname:preTransform field.
-
-18) Can surfaces ever not support etext:VK_MIRROR_NONE? Can they support
-vertical and horizontal mirroring simultaneously? Relatedly, should
-etext:VK_MIRROR_NONE[_BIT] be zero, or bit one, and should applications be
-allowed to specify multiple pre and current mirror transform bits, or
-exactly one?
-
-*RESOLVED*: Since some platforms may not support presenting with a transform
-other than the native window's current transform, and prerotation/mirroring
-are specified relative to the device's natural rotation and direction,
-rather than relative to the surface's current rotation and direction, it is
-necessary to express lack of support for no mirroring.
-To allow this, the etext:MIRROR_NONE enum must occupy a bit in the flags.
-Since etext:MIRROR_NONE must be a bit in the bitmask rather than a bitmask
-with no values set, allowing more than one bit to be set in the bitmask
-would make it possible to describe undefined: transforms such as
-etext:VK_MIRROR_NONE_BIT | etext:VK_MIRROR_HORIZONTAL_BIT, or a transform
-that includes both "`no mirroring`" and "`horizontal mirroring`"
-simultaneously.
-Therefore, it is desirable to allow specifying all supported mirroring
-transforms using only one bit.
-The question then becomes, should there be a
-etext:VK_MIRROR_HORIZONTAL_AND_VERTICAL_BIT to represent a simultaneous
-horizontal and vertical mirror transform? However, such a transform is
-equivalent to a 180 degree rotation, so presentation engines and
-applications that wish to support or use such a transform can express it
-through rotation instead.
-Therefore, 3 exclusive bits are sufficient to express all needed mirroring
-transforms.
-
-19) Should support for sRGB be required?
-
-*RESOLVED*: In the advent of UHD and HDR display devices, proper color space
-information is vital to the display pipeline represented by the swapchain.
-The app can discover the supported format/color-space pairs and select a
-pair most suited to its rendering needs.
-Currently only the sRGB color space is supported, future extensions may
-provide support for more color spaces.
-See issues 23 and 24.
-
-20) Is there a mechanism to modify or replace an existing swapchain with one
-targeting the same surface?
-
-*RESOLVED*: Yes.
-This is described above in the text.
-
-21) Should there be a way to set prerotation and mirroring using native APIs
-when presenting using a Vulkan swapchain?
-
-*RESOLVED*: Yes.
-The transforms that can be expressed in this extension are a subset of those
-possible on native platforms.
-If a platform exposes a method to specify the transform of presented images
-for a given surface using native methods and exposes more transforms or
-other properties for surfaces than Vulkan supports, it might be impossible,
-difficult, or inconvenient to set some of those properties using Vulkan KHR
-extensions and some using the native interfaces.
-To avoid overwriting properties set using native commands when presenting
-using a Vulkan swapchain, the application can set the pretransform to
-"`inherit`", in which case the current native properties will be used, or if
-none are available, a platform-specific default will be used.
-Platforms that do not specify a reasonable default or do not provide native
-mechanisms to specify such transforms should not include the inherit bits in
-the pname:supportedTransforms bitmask they return in
-slink:VkSurfaceCapabilitiesKHR.
-
-22) Should the content of presentable images be clipped by objects obscuring
-their target surface?
-
-*RESOLVED*: Applications can choose which behavior they prefer.
-Allowing the content to be clipped could enable more efficient presentation
-methods on some platforms, but some applications might rely on the content
-of presentable images to perform techniques such as partial updates or
-motion blurs.
-
-23) What is the purpose of specifying a elink:VkColorSpaceKHR along with
-elink:VkFormat when creating a swapchain?
-
-*RESOLVED*: While Vulkan itself is color space agnostic (e.g. even the
-meaning of R, G, B and A can be freely defined by the rendering
-application), the swapchain eventually will have to present the images on a
-display device with specific color reproduction characteristics.
-If any color space transformations are necessary before an image can be
-displayed, the color space of the presented image must be known to the
-swapchain.
-A swapchain will only support a restricted set of color format and -space
-pairs.
-This set can be discovered via flink:vkGetPhysicalDeviceSurfaceFormatsKHR.
-As it can be expected that most display devices support the sRGB color
-space, at least one format/color-space pair has to be exposed, where the
-color space is ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR.
-
-24) How are sRGB formats and the sRGB color space related?
-
-*RESOLVED*: While Vulkan exposes a number of SRGB texture formats, using
-such formats does not guarantee working in a specific color space.
-It merely means that the hardware can directly support applying the
-non-linear transfer functions defined by the sRGB standard color space when
-reading from or writing to images of those formats.
-Still, it is unlikely that a swapchain will expose a etext:*_SRGB format
-along with any color space other than
-ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR.
-
-On the other hand, non-etext:*_SRGB formats will be very likely exposed in
-pair with a SRGB color space.
-This means, the hardware will not apply any transfer function when reading
-from or writing to such images, yet they will still be presented on a device
-with sRGB display characteristics.
-In this case the application is responsible for applying the transfer
-function, for instance by using shader math.
-
-25) How are the lifetimes of surfaces and swapchains targeting them related?
-
-*RESOLVED*: A surface must outlive any swapchains targeting it.
-A slink:VkSurfaceKHR owns the binding of the native window to the Vulkan
-driver.
-
-26) How can the client control the way the alpha component of swapchain
-images is treated by the presentation engine during compositing?
-
-*RESOLVED*: We should add new enum values to allow the client to negotiate
-with the presentation engine on how to treat image alpha values during the
-compositing process.
-Since not all platforms can practically control this through the Vulkan
-driver, a value of ename:VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR is provided like
-for surface transforms.
-
-27) Is flink:vkCreateSwapchainKHR the right function to return
-ename:VK_ERROR_NATIVE_WINDOW_IN_USE_KHR, or should the various
-platform-specific slink:VkSurfaceKHR factory functions catch this error
-earlier?
-
-*RESOLVED*: For most platforms, the slink:VkSurfaceKHR structure is a simple
-container holding the data that identifies a native window or other object
-representing a surface on a particular platform.
-For the surface factory functions to return this error, they would likely
-need to register a reference on the native objects with the native display
-server somehow, and ensure no other such references exist.
-Surfaces were not intended to be that heavyweight.
-
-Swapchains are intended to be the objects that directly manipulate native
-windows and communicate with the native presentation mechanisms.
-Swapchains will already need to communicate with the native display server
-to negotiate allocation and/or presentation of presentable images for a
-native surface.
-Therefore, it makes more sense for swapchain creation to be the point at
-which native object exclusivity is enforced.
-Platforms may choose to enforce further restrictions on the number of
-slink:VkSurfaceKHR objects that may be created for the same native window if
-such a requirement makes sense on a particular platform, but a global
-requirement is only sensible at the swapchain level.
-
-=== Examples
-
-[NOTE]
-.Note
-====
-The example code for the `apiext:VK_KHR_surface` and `VK_KHR_swapchain`
-extensions was removed from the appendix after revision 1.0.29.
-This WSI example code was ported to the cube demo that is shipped with the
-official Khronos SDK, and is being kept up-to-date in that location (see:
-https://github.com/KhronosGroup/Vulkan-Tools/blob/master/cube/cube.c).
-====
-
-=== Version History
-
-  * Revision 1, 2015-05-20 (James Jones)
-    - Initial draft, based on LunarG KHR spec, other KHR specs, patches
-      attached to bugs.
-
-  * Revision 2, 2015-05-22 (Ian Elliott)
-    - Made many agreed-upon changes from 2015-05-21 KHR TSG meeting.
-      This includes using only a queue for presentation, and having an
-      explicit function to acquire the next image.
-    - Fixed typos and other minor mistakes.
-
-  * Revision 3, 2015-05-26 (Ian Elliott)
-    - Improved the Description section.
-    - Added or resolved issues that were found in improving the Description.
-      For example, pSurfaceDescription is used consistently, instead of
-      sometimes using pSurface.
-
-  * Revision 4, 2015-05-27 (James Jones)
-    - Fixed some grammatical errors and typos
-    - Filled in the description of imageUseFlags when creating a swapchain.
-    - Added a description of swapInterval.
-    - Replaced the paragraph describing the order of operations on a queue
-      for image ownership and presentation.
-
-  * Revision 5, 2015-05-27 (James Jones)
-    - Imported relevant issues from the (abandoned)
-      vk_wsi_persistent_swapchain_images extension.
-    - Added issues 6 and 7, regarding behavior of the acquire next image and
-      present commands with respect to queues.
-    - Updated spec language and examples to align with proposed resolutions
-      to issues 6 and 7.
-
-  * Revision 6, 2015-05-27 (James Jones)
-    - Added issue 8, regarding atomic presentation of multiple swapchains
-    - Updated spec language and examples to align with proposed resolution
-      to issue 8.
-
-  * Revision 7, 2015-05-27 (James Jones)
-    - Fixed compilation errors in example code, and made related spec fixes.
-
-  * Revision 8, 2015-05-27 (James Jones)
-    - Added issue 9, and the related VK_SUBOPTIMAL_KHR result code.
-    - Renamed VK_OUT_OF_DATE_KHR to VK_ERROR_OUT_OF_DATE_KHR.
-
-  * Revision 9, 2015-05-27 (James Jones)
-    - Added inline proposed resolutions (marked with [JRJ]) to some XXX
-      questions/issues.
-      These should be moved to the issues section in a subsequent update if
-      the proposals are adopted.
-
-  * Revision 10, 2015-05-28 (James Jones)
-    - Converted vkAcquireNextImageKHR back to a non-queue operation that
-      uses a VkSemaphore object for explicit synchronization.
-    - Added issue 10 to determine whether vkAcquireNextImageKHR generates or
-      returns semaphores, or whether it operates on a semaphore provided by
-      the application.
-
-  * Revision 11, 2015-05-28 (James Jones)
-    - Marked issues 6, 7, and 8 resolved.
-    - Renamed VkSurfaceCapabilityPropertiesKHR to VkSurfacePropertiesKHR to
-      better convey the mutable nature of the information it contains.
-
-  * Revision 12, 2015-05-28 (James Jones)
-    - Added issue 11 with a proposed resolution, and the related issue 12.
-    - Updated various sections of the spec to match the proposed resolution
-      to issue 11.
-
-  * Revision 13, 2015-06-01 (James Jones)
-    - Moved some structures to VK_EXT_KHR_swap_chain to resolve the
-      specification's issues 1 and 2.
-
-  * Revision 14, 2015-06-01 (James Jones)
-    - Added code for example 4 demonstrating how an application might make
-      use of the two different present and acquire next image KHR result
-      codes.
-    - Added issue 13.
-
-  * Revision 15, 2015-06-01 (James Jones)
-    - Added issues 14 - 16 and related spec language.
-    - Fixed some spelling errors.
-    - Added language describing the meaningful return values for
-      vkAcquireNextImageKHR and vkQueuePresentKHR.
-
-  * Revision 16, 2015-06-02 (James Jones)
-    - Added issues 17 and 18, as well as related spec language.
-    - Removed some erroneous text added by mistake in the last update.
-
-  * Revision 17, 2015-06-15 (Ian Elliott)
-    - Changed special value from "-1" to "0" so that the data types can be
-      unsigned.
-
-  * Revision 18, 2015-06-15 (Ian Elliott)
-    - Clarified the values of VkSurfacePropertiesKHR::minImageCount and the
-      timeout parameter of the vkAcquireNextImageKHR function.
-
-  * Revision 19, 2015-06-17 (James Jones)
-    - Misc.
-      cleanup.
-      Removed resolved inline issues and fixed typos.
-    - Fixed clarification of VkSurfacePropertiesKHR::minImageCount made in
-      version 18.
-    - Added a brief "Image Ownership" definition to the list of terms used
-      in the spec.
-
-  * Revision 20, 2015-06-17 (James Jones)
-    - Updated enum-extending values using new convention.
-
-  * Revision 21, 2015-06-17 (James Jones)
-    - Added language describing how to use
-      VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR.
-    - Cleaned up an XXX comment regarding the description of which queues
-      vkQueuePresentKHR can be used on.
-
-  * Revision 22, 2015-06-17 (James Jones)
-    - Rebased on Vulkan API version 126.
-
-  * Revision 23, 2015-06-18 (James Jones)
-    - Updated language for issue 12 to read as a proposed resolution.
-    - Marked issues 11, 12, 13, 16, and 17 resolved.
-    - Temporarily added links to the relevant bugs under the remaining
-      unresolved issues.
-    - Added issues 19 and 20 as well as proposed resolutions.
-
-  * Revision 24, 2015-06-19 (Ian Elliott)
-    - Changed special value for VkSurfacePropertiesKHR::currentExtent back
-      to "`-1`" from "`0`".
-      This value will never need to be unsigned, and "`0`" is actually a
-      legal value.
-
-  * Revision 25, 2015-06-23 (Ian Elliott)
-    - Examples now show use of function pointers for extension functions.
-    - Eliminated extraneous whitespace.
-
-  * Revision 26, 2015-06-25 (Ian Elliott)
-    - Resolved Issues 9 & 10 per KHR TSG meeting.
-
-  * Revision 27, 2015-06-25 (James Jones)
-    - Added oldSwapchain member to VkSwapchainCreateInfoKHR.
-
-  * Revision 28, 2015-06-25 (James Jones)
-    - Added the "`inherit`" bits to the rotation and mirroring flags and the
-      associated issue 21.
-
-  * Revision 29, 2015-06-25 (James Jones)
-    - Added the "`clipped`" flag to VkSwapchainCreateInfoKHR, and the
-      associated issue 22.
-    - Specified that presenting an image does not modify it.
-
-  * Revision 30, 2015-06-25 (James Jones)
-    - Added language to the spec that clarifies the behavior of
-      vkCreateSwapchainKHR() when the oldSwapchain field of
-      VkSwapchainCreateInfoKHR is not NULL.
-
-  * Revision 31, 2015-06-26 (Ian Elliott)
-    - Example of new VkSwapchainCreateInfoKHR members, "`oldSwapchain`" and
-      "`clipped`".
-    - Example of using VkSurfacePropertiesKHR::{min|max}ImageCount to set
-      VkSwapchainCreateInfoKHR::minImageCount.
-    - Rename vkGetSurfaceInfoKHR()'s 4th parameter to "`pDataSize`", for
-      consistency with other functions.
-    - Add macro with C-string name of extension (just to header file).
-
-  * Revision 32, 2015-06-26 (James Jones)
-    - Minor adjustments to the language describing the behavior of
-      "`oldSwapchain`"
-    - Fixed the version date on my previous two updates.
-
-  * Revision 33, 2015-06-26 (Jesse Hall)
-    - Add usage flags to VkSwapchainCreateInfoKHR
-
-  * Revision 34, 2015-06-26 (Ian Elliott)
-    - Rename vkQueuePresentKHR()'s 2nd parameter to "`pPresentInfo`", for
-      consistency with other functions.
-
-  * Revision 35, 2015-06-26 (Jason Ekstrand)
-    - Merged the VkRotationFlagBitsKHR and VkMirrorFlagBitsKHR enums into a
-      single VkSurfaceTransformFlagBitsKHR enum.
-
-  * Revision 36, 2015-06-26 (Jason Ekstrand)
-    - Added a VkSurfaceTransformKHR enum that is not a bitmask.
-      Each value in VkSurfaceTransformKHR corresponds directly to one of the
-      bits in VkSurfaceTransformFlagBitsKHR so transforming from one to the
-      other is easy.
-      Having a separate enum means that currentTransform and preTransform
-      are now unambiguous by definition.
-
-  * Revision 37, 2015-06-29 (Ian Elliott)
-    - Corrected one of the signatures of vkAcquireNextImageKHR, which had
-      the last two parameters switched from what it is elsewhere in the
-      specification and header files.
-
-  * Revision 38, 2015-06-30 (Ian Elliott)
-    - Corrected a typo in description of the vkGetSwapchainInfoKHR()
-      function.
-    - Corrected a typo in header file comment for VkPresentInfoKHR::sType.
-
-  * Revision 39, 2015-07-07 (Daniel Rakos)
-    - Added error section describing when each error is expected to be
-      reported.
-    - Replaced bool32_t with VkBool32.
-
-  * Revision 40, 2015-07-10 (Ian Elliott)
-    - Updated to work with version 138 of the `vulkan.h` header.
-      This includes declaring the VkSwapchainKHR type using the new
-      VK_DEFINE_NONDISP_HANDLE macro, and no longer extending VkObjectType
-      (which was eliminated).
-
-  * Revision 41 2015-07-09 (Mathias Heyer)
-    - Added color space language.
-
-  * Revision 42, 2015-07-10 (Daniel Rakos)
-    - Updated query mechanism to reflect the convention changes done in the
-      core spec.
-    - Removed "`queue`" from the name of
-      VK_STRUCTURE_TYPE_QUEUE_PRESENT_INFO_KHR to be consistent with the
-      established naming convention.
-    - Removed reference to the no longer existing VkObjectType enum.
-
-  * Revision 43, 2015-07-17 (Daniel Rakos)
-    - Added support for concurrent sharing of swapchain images across queue
-      families.
-    - Updated sample code based on recent changes
-
-  * Revision 44, 2015-07-27 (Ian Elliott)
-    - Noted that support for VK_PRESENT_MODE_FIFO_KHR is required.
-      That is ICDs may optionally support IMMEDIATE and MAILBOX, but must
-      support FIFO.
-
-  * Revision 45, 2015-08-07 (Ian Elliott)
-    - Corrected a typo in spec file (type and variable name had wrong case
-      for the imageColorSpace member of the VkSwapchainCreateInfoKHR
-      struct).
-    - Corrected a typo in header file (last parameter in
-      PFN_vkGetSurfacePropertiesKHR was missing "`KHR`" at the end of type:
-      VkSurfacePropertiesKHR).
-
-  * Revision 46, 2015-08-20 (Ian Elliott)
-    - Renamed this extension and all of its enumerations, types, functions,
-      etc.
-      This makes it compliant with the proposed standard for Vulkan
-      extensions.
-    - Switched from "`revision`" to "`version`", including use of the
-      VK_MAKE_VERSION macro in the header file.
-    - Made improvements to several descriptions.
-    - Changed the status of several issues from PROPOSED to RESOLVED,
-      leaving no unresolved issues.
-    - Resolved several TODOs, did miscellaneous cleanup, etc.
-
-  * Revision 47, 2015-08-20 (Ian Elliott--porting a 2015-07-29 change from
-    James Jones)
-    - Moved the surface transform enums to VK_WSI_swapchain so they could be
-      reused by VK_WSI_display.
-
-  * Revision 48, 2015-09-01 (James Jones)
-    - Various minor cleanups.
-
-  * Revision 49, 2015-09-01 (James Jones)
-    - Restore single-field revision number.
-
-  * Revision 50, 2015-09-01 (James Jones)
-    - Update Example #4 to include code that illustrates how to use the
-      oldSwapchain field.
-
-  * Revision 51, 2015-09-01 (James Jones)
-    - Fix example code compilation errors.
-
-  * Revision 52, 2015-09-08 (Matthaeus G. Chajdas)
-    - Corrected a typo.
-
-  * Revision 53, 2015-09-10 (Alon Or-bach)
-    - Removed underscore from SWAP_CHAIN left in
-      VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR.
-
-  * Revision 54, 2015-09-11 (Jesse Hall)
-    - Described the execution and memory coherence requirements for image
-      transitions to and from VK_IMAGE_LAYOUT_PRESENT_SOURCE_KHR.
-
-  * Revision 55, 2015-09-11 (Ray Smith)
-    - Added errors for destroying and binding memory to presentable images
-
-  * Revision 56, 2015-09-18 (James Jones)
-    - Added fence argument to vkAcquireNextImageKHR
-    - Added example of how to meter a host thread based on presentation
-      rate.
-
-  * Revision 57, 2015-09-26 (Jesse Hall)
-    - Replace VkSurfaceDescriptionKHR with VkSurfaceKHR.
-    - Added issue 25 with agreed resolution.
-
-  * Revision 58, 2015-09-28 (Jesse Hall)
-    - Renamed from VK_EXT_KHR_device_swapchain to VK_EXT_KHR_swapchain.
-
-  * Revision 59, 2015-09-29 (Ian Elliott)
-    - Changed vkDestroySwapchainKHR() to return void.
-
-  * Revision 60, 2015-10-01 (Jeff Vigil)
-    - Added error result VK_ERROR_SURFACE_LOST_KHR.
-
-  * Revision 61, 2015-10-05 (Jason Ekstrand)
-    - Added the VkCompositeAlpha enum and corresponding structure fields.
-
-  * Revision 62, 2015-10-12 (Daniel Rakos)
-    - Added VK_PRESENT_MODE_FIFO_RELAXED_KHR.
-
-  * Revision 63, 2015-10-15 (Daniel Rakos)
-    - Moved surface capability queries to VK_EXT_KHR_surface.
-
-  * Revision 64, 2015-10-26 (Ian Elliott)
-    - Renamed from VK_EXT_KHR_swapchain to VK_KHR_swapchain.
-
-  * Revision 65, 2015-10-28 (Ian Elliott)
-    - Added optional pResult member to VkPresentInfoKHR, so that
-      per-swapchain results can be obtained from vkQueuePresentKHR().
-
-  * Revision 66, 2015-11-03 (Daniel Rakos)
-    - Added allocation callbacks to create and destroy functions.
-    - Updated resource transition language.
-    - Updated sample code.
-
-  * Revision 67, 2015-11-10 (Jesse Hall)
-    - Add reserved flags bitmask to VkSwapchainCreateInfoKHR.
-    - Modify naming and member ordering to match API style conventions, and
-      so the VkSwapchainCreateInfoKHR image property members mirror
-      corresponding VkImageCreateInfo members but with an 'image' prefix.
-    - Make VkPresentInfoKHR::pResults non-const; it is an output array
-      parameter.
-    - Make pPresentInfo parameter to vkQueuePresentKHR const.
-
-  * Revision 68, 2016-04-05 (Ian Elliott)
-    - Moved the "`validity`" include for vkAcquireNextImage to be in its
-      proper place, after the prototype and list of parameters.
-    - Clarified language about presentable images, including how they are
-      acquired, when applications can and cannot use them, etc.
-      As part of this, removed language about "`ownership`" of presentable
-      images, and replaced it with more-consistent language about
-      presentable images being "`acquired`" by the application.
-
-  * 2016-08-23 (Ian Elliott)
-    - Update the example code, to use the final API command names, to not
-      have so many characters per line, and to split out a new example to
-      show how to obtain function pointers.
-      This code is more similar to the LunarG "`cube`" demo program.
-
-  * 2016-08-25 (Ian Elliott)
-    - A note was added at the beginning of the example code, stating that it
-      will be removed from future versions of the appendix.
-
-  * Revision 69, 2017-09-07 (Tobias Hector)
-    - Added interactions with Vulkan 1.1
-
-  * Revision 70, 2017-10-06 (Ian Elliott)
-    - Corrected interactions with Vulkan 1.1
diff --git a/registry/vulkan/appendices/VK_KHR_swapchain_mutable_format.txt b/registry/vulkan/appendices/VK_KHR_swapchain_mutable_format.txt
deleted file mode 100644
index 338bebe..0000000
--- a/registry/vulkan/appendices/VK_KHR_swapchain_mutable_format.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_swapchain_mutable_format.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-03-28
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jason Ekstrand, Intel
-  - Jan-Harald Fredriksen, ARM
-  - Jesse Hall, Google
-  - Daniel Rakos, AMD
-  - Ray Smith, ARM
-
-=== Description
-
-This extension allows processing of swapchain images as different formats to
-that used by the window system, which is particularly useful for switching
-between sRGB and linear RGB formats.
-
-It adds a new swapchain creation flag that enables creating image views from
-presentable images with a different format than the one used to create the
-swapchain.
-
-include::{generated}/interfaces/VK_KHR_swapchain_mutable_format.txt[]
-
-=== Issues
-
-1) Are there any new capabilities needed?
-
-*RESOLVED*: No.
-It is expected that all implementations exposing this extension support
-swapchain image format mutability.
-
-2) Do we need a separate etext:VK_SWAPCHAIN_CREATE_EXTENDED_USAGE_BIT_KHR?
-
-*RESOLVED*: No.
-This extension requires `VK_KHR_maintenance2` and presentable images of
-swapchains created with ename:VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR are
-created internally in a way equivalent to specifying both
-ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT and
-ename:VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR.
-
-3) Do we need a separate structure to allow specifying an image format list
-for swapchains?
-
-*RESOLVED*: No.
-We simply use the same slink:VkImageFormatListCreateInfoKHR structure
-introduced by `VK_KHR_image_format_list`.
-The structure is required to be included in the pname:pNext chain of
-slink:VkSwapchainCreateInfoKHR for swapchains created with
-ename:VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR.
-
-
-=== Version History
-
- * Revision 1, 2018-03-28 (Daniel Rakos)
-   - Internal revisions.
diff --git a/registry/vulkan/appendices/VK_KHR_synchronization2.txt b/registry/vulkan/appendices/VK_KHR_synchronization2.txt
deleted file mode 100644
index 1b3282c..0000000
--- a/registry/vulkan/appendices/VK_KHR_synchronization2.txt
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2020 Khronos Group.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_synchronization2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-12-03
-*Interactions and External Dependencies*::
-  - Interacts with `apiext:VK_KHR_create_renderpass2`
-*Contributors*::
-  - Tobias Hector
-
-
-=== Description
-
-This extension modifies the original core synchronization APIs to simplify
-the interface and improve usability of these APIs.
-It also adds new pipeline stage and access flag types that extend into the
-64-bit range, as we have run out within the 32-bit range.
-The new flags are identical to the old values within the 32-bit range, with
-new stages and bits beyond that.
-
-Pipeline stages and access flags are now specified together in memory
-barrier structures, making the connection between the two more obvious.
-Additionally, scoping the pipeline stages into the barrier structs allows
-the use of the etext:MEMORY_READ and etext:MEMORY_WRITE flags without
-sacrificing precision.
-The per-stage access flags should be used to disambiguate specific accesses
-in a given stage or set of stages - for instance, between uniform reads and
-sampling operations.
-
-Layout transitions have been simplified as well; rather than requiring a
-different set of layouts for depth/stencil/color attachments, there are
-generic ename:VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR and
-ename:VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR layouts which are contextually
-applied based on the image format.
-For example, for a depth format image,
-ename:VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR is equivalent to
-ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR.
-ename:VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR also functionally replaces
-ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL.
-
-Events are now more efficient, because they include memory dependency
-information when you set them on the device.
-Previously, this information was only known when waiting on an event, so the
-dependencies could not be satisfied until the wait occurred.
-That sometimes meant stalling the pipeline when the wait occurred.
-The new API provides enough information for implementations to satisfy these
-dependencies in parallel with other tasks.
-
-Queue submission has been changed to wrap command buffers and semaphores in
-extensible structures, which incorporate changes from Vulkan 1.1,
-`apiext:VK_KHR_device_group`, and `apiext:VK_KHR_timeline_semaphore`.
-This also adds a pipeline stage to the semaphore signal operation, mirroring
-the existing pipeline stage specification for wait operations.
-
-Other miscellaneous changes include:
-
-  * Events can now be specified as interacting only with the device,
-    allowing more efficient access to the underlying object.
-  * Image memory barriers that do not perform an image layout transition can
-    be specified by setting pname:oldLayout equal to pname:newLayout.
-  ** E.g. the old and new layout can both be set to
-     ename:VK_IMAGE_LAYOUT_UNDEFINED, without discarding data in the image.
-  * Queue family ownership transfer parameters are simplified in some cases.
-  * Where two synchronization commands need to be matched up (queue transfer
-    operations, events), the dependency information specified in each place
-    must now match completely for consistency.
-  * Extensions with commands or functions with a tlink:VkPipelineStageFlags
-    or elink:VkPipelineStageFlagBits parameter have had those APIs replaced
-    with equivalents using tlink:VkPipelineStageFlags2KHR.
-  * The new event and barrier interfaces are now more extensible for future
-    changes.
-  * Relevant pipeline stage masks can now be specified as empty with the new
-    ename:VK_PIPELINE_STAGE_NONE_KHR and ename:VK_PIPELINE_STAGE_2_NONE_KHR
-    values.
-ifdef::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-  * slink:VkMemoryBarrier2KHR can be chained to slink:VkSubpassDependency2,
-    overriding the original 32-bit stage and access masks.
-endif::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-
-include::{generated}/interfaces/VK_KHR_synchronization2.txt[]
-
-=== Examples
-
-See
-https://github.com/KhronosGroup/Vulkan-Docs/wiki/Synchronization-Examples
-
-
-=== Version History
-
- * Revision 1, 2020-12-03 (Tobias Hector)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_KHR_timeline_semaphore.txt b/registry/vulkan/appendices/VK_KHR_timeline_semaphore.txt
deleted file mode 100644
index dfdaa64..0000000
--- a/registry/vulkan/appendices/VK_KHR_timeline_semaphore.txt
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_timeline_semaphore.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-06-12
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension interacts with
-    `apiext:VK_KHR_external_semaphore_capabilities`
-  - This extension interacts with `apiext:VK_KHR_external_semaphore`
-  - This extension interacts with `apiext:VK_KHR_external_semaphore_win32`
-  - Promoted to Vulkan 1.2 Core
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Yuriy O'Donnell, Epic Games
-  - Jason Ekstrand, Intel
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-  - Jeff Juliano, NVIDIA
-  - Daniel Rakos, AMD
-  - Ray Smith, Arm
-
-=== Description
-
-This extension introduces a new type of semaphore that has an integer
-payload identifying a point in a timeline.
-Such timeline semaphores support the following operations:
-
-  * Host query - A host operation that allows querying the payload of the
-    timeline semaphore.
-  * Host wait - A host operation that allows a blocking wait for a timeline
-    semaphore to reach a specified value.
-  * Host signal - A host operation that allows advancing the timeline
-    semaphore to a specified value.
-  * Device wait - A device operation that allows waiting for a timeline
-    semaphore to reach a specified value.
-  * Device signal - A device operation that allows advancing the timeline
-    semaphore to a specified value.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_timeline_semaphore.txt[]
-
-=== Issues
-
-1) Do we need a new object type for this?
-
-*RESOLVED*: No, we just introduce a new type of semaphore object, as
-`VK_KHR_external_semaphore_win32` already uses semaphores as the destination
-for importing D3D12 fence objects, which are semantically close/identical to
-the proposed synchronization primitive.
-
-2) What type of payload the new synchronization primitive has?
-
-*RESOLVED*: A 64-bit unsigned integer that can only be set to strictly
-increasing values by signal operations and is not changed by wait
-operations.
-
-3) Does the new synchronization primitive have the same signal-before-wait
-requirement as the existing semaphores do?
-
-*RESOLVED*: No.
-Timeline semaphores support signaling and waiting entirely asynchronously.
-It is the responsibility of the client to avoid deadlock.
-
-4) Does the new synchronization primitive allow resetting its payload?
-
-*RESOLVED*: No, allowing the payload value to "`go backwards`" is
-problematic.
-Applications looking for reset behavior should create a new instance of the
-sychronization primitive instead.
-
-5) How do we enable host waits on the synchronization primitive?
-
-*RESOLVED*: Both a non-blocking query of the current payload value of the
-synchronization primitive, and a blocking wait operation are provided.
-
-6) How do we enable device waits and signals on the synchronization
-primitive?
-
-*RESOLVED*: Similar to `VK_KHR_external_semaphore_win32`, this extension
-introduces a new structure that can be chained to slink:VkSubmitInfo to
-specify the values signaled semaphores should be set to, and the values
-waited semaphores need to reach.
-
-7) Can the new synchronization primitive be used to synchronize presentation
-and swapchain image acquisition operations?
-
-*RESOLVED*: Some implementations may have problems with supporting that
-directly, thus it is not allowed in this extension.
-
-8) Do we want to support external sharing of the new synchronization
-primitive type?
-
-*RESOLVED*: Yes.
-Timeline semaphore specific external sharing capabilities can be queried
-using flink:vkGetPhysicalDeviceExternalSemaphoreProperties by chaining the
-new slink:VkSemaphoreTypeCreateInfoKHR structure to its
-pname:pExternalSemaphoreInfo structure.
-This allows having a different set of external semaphore handle types
-supported for timeline semaphores vs binary semaphores.
-
-9) Do we need to add a host signal operation for the new synchronization
-primitive type?
-
-*RESOLVED*: Yes.
-This helps in situations where one host thread submits a workload but
-another host thread has the information on when the workload is ready to be
-executed.
-
-10) How should the new synchronization primitive interact with the ordering
-requirements of the original sname:VkSemaphore?
-
-*RESOLVED*: Prior to calling any command which may: cause a wait operation
-on a binary semaphore, the client must: ensure that the semaphore signal
-operation that has been submitted for execution and any semaphore signal
-operations on which it depends (if any) must: have also been submitted for
-execution.
-
-11) Should we have separate feature bits for different sub-features of
-timeline semaphores?
-
-*RESOLVED*: No.
-The only feature which cannot be supported universally is timeline semaphore
-import/export.
-For import/export, the client is already required to query available
-external handle types via
-flink:vkGetPhysicalDeviceExternalSemaphoreProperties and provide the
-semaphore type by adding a slink:VkSemaphoreTypeCreateInfoKHR structure to
-the pname:pNext chain of slink:VkPhysicalDeviceExternalSemaphoreInfo so no
-new feature bit is required.
-
-=== Version History
-
- * Revision 1, 2018-05-10 (Jason Ekstrand)
-   - Initial version
-
- * Revision 2, 2019-06-12 (Jason Ekstrand)
-   - Added an initialValue parameter to timeline semaphore creation
diff --git a/registry/vulkan/appendices/VK_KHR_uniform_buffer_standard_layout.txt b/registry/vulkan/appendices/VK_KHR_uniform_buffer_standard_layout.txt
deleted file mode 100644
index d5bb36f..0000000
--- a/registry/vulkan/appendices/VK_KHR_uniform_buffer_standard_layout.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_uniform_buffer_standard_layout.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-01-25
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-*Contributors*::
-  - Graeme Leese, Broadcom
-  - Jeff Bolz, NVIDIA
-  - Tobias Hector, AMD
-  - Jason Ekstrand, Intel
-  - Neil Henning, AMD
-
-=== Description
-
-This extension enables tighter array and struct packing to be used with
-uniform buffers.
-
-It modifies the alignment rules for uniform buffers, allowing for tighter
-packing of arrays and structures.
-This allows, for example, the std430 layout, as defined in
-https://www.khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.4.60.pdf[GLSL]
-to be supported in uniform buffers.
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_uniform_buffer_standard_layout.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-01-25 (Graeme Leese)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_KHR_variable_pointers.txt b/registry/vulkan/appendices/VK_KHR_variable_pointers.txt
deleted file mode 100644
index a21be10..0000000
--- a/registry/vulkan/appendices/VK_KHR_variable_pointers.txt
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_variable_pointers.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-09-05
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_variable_pointers.html[`SPV_KHR_variable_pointers`]
-  - Promoted to Vulkan 1.1 Core
-*Contributors*::
-  - John Kessenich, Google
-  - Neil Henning, Codeplay
-  - David Neto, Google
-  - Daniel Koch, Nvidia
-  - Graeme Leese, Broadcom
-  - Weifeng Zhang, Qualcomm
-  - Stephen Clarke, Imagination Technologies
-  - Jason Ekstrand, Intel
-  - Jesse Hall, Google
-
-=== Description
-
-The `VK_KHR_variable_pointers` extension allows implementations to indicate
-their level of support for the `SPV_KHR_variable_pointers` SPIR-V extension.
-The SPIR-V extension allows shader modules to use invocation-private
-pointers into uniform and/or storage buffers, where the pointer values can
-be dynamic and non-uniform.
-
-The `SPV_KHR_variable_pointers` extension introduces two capabilities.
-The first, code:VariablePointersStorageBuffer, must: be supported by all
-implementations of this extension.
-The second, code:VariablePointers, is optional.
-
-=== Promotion to Vulkan 1.1
-
-All functionality in this extension is included in core Vulkan 1.1, with the
-KHR suffix omitted, however support for the
-<<features-variablePointersStorageBuffer,
-pname:variablePointersStorageBuffer>> feature is made optional.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_variable_pointers.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-VariablePointers,VariablePointers>>
-  * <<spirvenv-capabilities-table-VariablePointersStorageBuffer,VariablePointersStorageBuffer>>
-
-=== Issues
-
-1) Do we need an optional property for the SPIR-V
-code:VariablePointersStorageBuffer capability or should it be mandatory when
-this extension is advertised?
-
-*RESOLVED*: Add it as a distinct feature, but make support mandatory.
-Adding it as a feature makes the extension easier to include in a future
-core API version.
-In the extension, the feature is mandatory, so that presence of the
-extension guarantees some functionality.
-When included in a core API version, the feature would be optional.
-
-2) Can support for these capabilities vary between shader stages?
-
-*RESOLVED*: No, if the capability is supported in any stage it must be
-supported in all stages.
-
-3) Should the capabilities be features or limits?
-
-*RESOLVED*: Features, primarily for consistency with other similar
-extensions.
-
-=== Version History
-
-  * Revision 1, 2017-03-14 (Jesse Hall and John Kessenich)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_KHR_video_decode_queue.txt b/registry/vulkan/appendices/VK_KHR_video_decode_queue.txt
deleted file mode 100644
index 2efad80..0000000
--- a/registry/vulkan/appendices/VK_KHR_video_decode_queue.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_video_decode_queue.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-09-30
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jake Beju, AMD
-  - Olivier Lapicque, NVIDIA
-  - Peter Fang, AMD
-  - Piers Daniell, NVIDIA
-  - Srinath Kumarapuram, NVIDIA
-  - Tony Zlatinski, NVIDIA
-
-include::{generated}/interfaces/VK_KHR_video_decode_queue.txt[]
-
-=== Version History
-
- * Revision 1, 2018-6-11 (Peter Fang)
-   - Initial draft
- * Revision 1.5, Nov 09 2018 (Tony Zlatinski)
-   - API Updates
- * Revision 1.6, Jan 08 2020 (Tony Zlatinski)
-   - API unify with the video_encode_queue spec
- * Revision 1.7, March 29 2021 (Tony Zlatinski)
-   - Spec and API updates.
- * Revision 2, September 30 2021 (Jon Leech)
-   - Add interaction with `apiext:VK_KHR_format_feature_flags2` to `vk.xml`
diff --git a/registry/vulkan/appendices/VK_KHR_video_encode_queue.txt b/registry/vulkan/appendices/VK_KHR_video_encode_queue.txt
deleted file mode 100644
index 424ca83..0000000
--- a/registry/vulkan/appendices/VK_KHR_video_encode_queue.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_video_encode_queue.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-09-30
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Ahmed Abdelkhalek, AMD
-  - Damien Kessler, NVIDIA
-  - Daniel Rakos, AMD
-  - George Hao, AMD
-  - Jake Beju, AMD
-  - Peter Fang, AMD
-  - Piers Daniell, NVIDIA
-  - Srinath Kumarapuram, NVIDIA
-  - Thomas J. Meier, NVIDIA
-  - Tony Zlatinski, NVIDIA
-  - Yang Liu, AMD
-
-include::{generated}/interfaces/VK_KHR_video_encode_queue.txt[]
-
-=== Version History
-
-  * Revision 1, 2018-07-23 (Ahmed Abdelkhalek)
-    - Initial draft
-  * Revision 1.1, 10/29/2019 (Tony Zlatinski)
-    - Updated the reserved spec tokens and renamed VkVideoEncoderKHR to
-      VkVideoSessionKHR
-  * Revision 1.6, Jan 08 2020 (Tony Zlatinski)
-    - API unify with the video_decode_queue spec
-  * Revision 2, March 29 2021 (Tony Zlatinski)
-    - Spec and API updates.
-  * Revision 3, 2021-09-30 (Jon Leech)
-    - Add interaction with `apiext:VK_KHR_format_feature_flags2` to `vk.xml`
diff --git a/registry/vulkan/appendices/VK_KHR_video_queue.txt b/registry/vulkan/appendices/VK_KHR_video_queue.txt
deleted file mode 100755
index da78bd6..0000000
--- a/registry/vulkan/appendices/VK_KHR_video_queue.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_video_queue.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-03-29
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Ahmed Abdelkhalek, AMD
-  - George Hao, AMD
-  - Jake Beju, AMD
-  - Piers Daniell, NVIDIA
-  - Srinath Kumarapuram, NVIDIA
-  - Tobias Hector, AMD
-  - Tony Zlatinski, NVIDIA
-
-include::{generated}/interfaces/VK_KHR_video_queue.txt[]
-
-=== Version History
-
-  * Revision 0.1, 2019-11-21 (Tony Zlatinski)
-    - Initial draft
-  * Revision 0.2, 2019-11-27 (Tony Zlatinski)
-    - Make vulkan video core common between decode and encode
-  * Revision 1, March 29 2021 (Tony Zlatinski)
-    - Spec and API updates.
-  * Revision 2, August 1 2021 (Srinath Kumarapuram)
-   - Rename `VkVideoCapabilitiesFlagBitsKHR` to
-     `VkVideoCapabilityFlagBitsKHR` (along with the names of enumerants it
-     defines) and `VkVideoCapabilitiesFlagsKHR` to
-     `VkVideoCapabilityFlagsKHR`, following Vulkan naming conventions.
diff --git a/registry/vulkan/appendices/VK_KHR_vulkan_memory_model.txt b/registry/vulkan/appendices/VK_KHR_vulkan_memory_model.txt
deleted file mode 100644
index 7916099..0000000
--- a/registry/vulkan/appendices/VK_KHR_vulkan_memory_model.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_vulkan_memory_model.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-12-10
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Promoted to Vulkan 1.2 Core
-  - This extension requires
-    {spirv}/KHR/SPV_KHR_vulkan_memory_model.html[`SPV_KHR_vulkan_memory_model`]
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Alan Baker, Google
-  - Tobias Hector, AMD
-  - David Neto, Google
-  - Robert Simpson, Qualcomm Technologies, Inc.
-  - Brian Sumner, AMD
-
-=== Description
-
-The `VK_KHR_vulkan_memory_model` extension allows use of the
-<<memory-model,Vulkan Memory Model>>, which formally defines how to
-synchronize memory accesses to the same memory locations performed by
-multiple shader invocations.
-
-[NOTE]
-.Note
-====
-Version 3 of the spec added a member
-(pname:vulkanMemoryModelAvailabilityVisibilityChains) to
-slink:VkPhysicalDeviceVulkanMemoryModelFeaturesKHR, which is an incompatible
-change from version 2.
-====
-
-=== Promotion to Vulkan 1.2
-
-All functionality in this extension is included in core Vulkan 1.2, with the
-KHR suffix omitted.
-However, if Vulkan 1.2 is supported and this extension is not, the
-code:vulkanMemoryModel capability is optional.
-The original type, enum and command names are still available as aliases of
-the core functionality.
-
-include::{generated}/interfaces/VK_KHR_vulkan_memory_model.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-VulkanMemoryModel,code:VulkanMemoryModelKHR>>
-
-=== Version History
-
-  * Revision 1, 2018-06-24 (Jeff Bolz)
-    - Initial draft
-  * Revision 3, 2018-12-10 (Jeff Bolz)
-    - Add vulkanMemoryModelAvailabilityVisibilityChains member to the
-      VkPhysicalDeviceVulkanMemoryModelFeaturesKHR structure.
diff --git a/registry/vulkan/appendices/VK_KHR_wayland_surface.txt b/registry/vulkan/appendices/VK_KHR_wayland_surface.txt
deleted file mode 100644
index 0ff529a..0000000
--- a/registry/vulkan/appendices/VK_KHR_wayland_surface.txt
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_wayland_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2015-11-28
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Patrick Doane, Blizzard
-  - Jason Ekstrand, Intel
-  - Ian Elliott, LunarG
-  - Courtney Goeltzenleuchter, LunarG
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-  - Antoine Labour, Google
-  - Jon Leech, Khronos
-  - David Mao, AMD
-  - Norbert Nopper, Freescale
-  - Alon Or-bach, Samsung
-  - Daniel Rakos, AMD
-  - Graham Sellers, AMD
-  - Ray Smith, ARM
-  - Jeff Vigil, Qualcomm
-  - Chia-I Wu, LunarG
-
-=== Description
-
-The `VK_KHR_wayland_surface` extension is an instance extension.
-It provides a mechanism to create a slink:VkSurfaceKHR object (defined by
-the `apiext:VK_KHR_surface` extension) that refers to a Wayland
-code:wl_surface, as well as a query to determine support for rendering to a
-Wayland compositor.
-
-include::{generated}/interfaces/VK_KHR_wayland_surface.txt[]
-
-=== Issues
-
-1) Does Wayland need a way to query for compatibility between a particular
-physical device and a specific Wayland display? This would be a more general
-query than flink:vkGetPhysicalDeviceSurfaceSupportKHR: if the
-Wayland-specific query returned ename:VK_TRUE for a (slink:VkPhysicalDevice,
-`struct wl_display*`) pair, then the physical device could be assumed to
-support presentation to any slink:VkSurfaceKHR for surfaces on the display.
-
-*RESOLVED*: Yes.
-flink:vkGetPhysicalDeviceWaylandPresentationSupportKHR was added to address
-this issue.
-
-2) Should we require surfaces created with flink:vkCreateWaylandSurfaceKHR
-to support the ename:VK_PRESENT_MODE_MAILBOX_KHR present mode?
-
-*RESOLVED*: Yes.
-Wayland is an inherently mailbox window system and mailbox support is
-required for some Wayland compositor interactions to work as expected.
-While handling these interactions may be possible with
-ename:VK_PRESENT_MODE_FIFO_KHR, it is much more difficult to do without
-deadlock and requiring all Wayland applications to be able to support
-implementations which only support ename:VK_PRESENT_MODE_FIFO_KHR would be
-an onerous restriction on application developers.
-
-=== Version History
-
- * Revision 1, 2015-09-23 (Jesse Hall)
-   - Initial draft, based on the previous contents of VK_EXT_KHR_swapchain
-     (later renamed VK_EXT_KHR_surface).
-
- * Revision 2, 2015-10-02 (James Jones)
-   - Added vkGetPhysicalDeviceWaylandPresentationSupportKHR() to resolve
-     issue #1.
-   - Adjusted wording of issue #1 to match the agreed-upon solution.
-   - Renamed "`window`" parameters to "`surface`" to match Wayland
-     conventions.
-
- * Revision 3, 2015-10-26 (Ian Elliott)
-   - Renamed from VK_EXT_KHR_wayland_surface to VK_KHR_wayland_surface.
-
- * Revision 4, 2015-11-03 (Daniel Rakos)
-   - Added allocation callbacks to vkCreateWaylandSurfaceKHR.
-
- * Revision 5, 2015-11-28 (Daniel Rakos)
-   - Updated the surface create function to take a pCreateInfo structure.
-
- * Revision 6, 2017-02-08 (Jason Ekstrand)
-   - Added the requirement that implementations support
-     ename:VK_PRESENT_MODE_MAILBOX_KHR.
-   - Added wording about interactions between flink:vkQueuePresentKHR and
-     the Wayland requests sent to the compositor.
diff --git a/registry/vulkan/appendices/VK_KHR_win32_keyed_mutex.txt b/registry/vulkan/appendices/VK_KHR_win32_keyed_mutex.txt
deleted file mode 100644
index deddfe7..0000000
--- a/registry/vulkan/appendices/VK_KHR_win32_keyed_mutex.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_win32_keyed_mutex.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-10-21
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - James Jones, NVIDIA
-  - Jeff Juliano, NVIDIA
-  - Carsten Rohde, NVIDIA
-
-=== Description
-
-Applications that wish to import Direct3D 11 memory objects into the Vulkan
-API may wish to use the native keyed mutex mechanism to synchronize access
-to the memory between Vulkan and Direct3D.
-This extension provides a way for an application to access the keyed mutex
-associated with an imported Vulkan memory object when submitting command
-buffers to a queue.
-
-include::{generated}/interfaces/VK_KHR_win32_keyed_mutex.txt[]
-
-=== Version History
-
-  * Revision 1, 2016-10-21 (James Jones)
-    - Initial revision
diff --git a/registry/vulkan/appendices/VK_KHR_win32_surface.txt b/registry/vulkan/appendices/VK_KHR_win32_surface.txt
deleted file mode 100644
index 5e62473..0000000
--- a/registry/vulkan/appendices/VK_KHR_win32_surface.txt
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_win32_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-04-24
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Patrick Doane, Blizzard
-  - Jason Ekstrand, Intel
-  - Ian Elliott, LunarG
-  - Courtney Goeltzenleuchter, LunarG
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-  - Antoine Labour, Google
-  - Jon Leech, Khronos
-  - David Mao, AMD
-  - Norbert Nopper, Freescale
-  - Alon Or-bach, Samsung
-  - Daniel Rakos, AMD
-  - Graham Sellers, AMD
-  - Ray Smith, ARM
-  - Jeff Vigil, Qualcomm
-  - Chia-I Wu, LunarG
-
-=== Description
-
-The `VK_KHR_win32_surface` extension is an instance extension.
-It provides a mechanism to create a slink:VkSurfaceKHR object (defined by
-the `apiext:VK_KHR_surface` extension) that refers to a Win32 code:HWND, as
-well as a query to determine support for rendering to the windows desktop.
-
-include::{generated}/interfaces/VK_KHR_win32_surface.txt[]
-
-=== Issues
-
-1) Does Win32 need a way to query for compatibility between a particular
-physical device and a specific screen? Compatibility between a physical
-device and a window generally only depends on what screen the window is on.
-However, there is not an obvious way to identify a screen without already
-having a window on the screen.
-
-*RESOLVED*: No.
-While it may be useful, there is not a clear way to do this on Win32.
-However, a method was added to query support for presenting to the windows
-desktop as a whole.
-
-2) If a native window object (code:HWND) is used by one graphics API, and
-then is later used by a different graphics API (one of which is Vulkan), can
-these uses interfere with each other?
-
-*RESOLVED*: Yes.
-
-Uses of a window object by multiple graphics APIs results in undefined:
-behavior.
-Such behavior may succeed when using one Vulkan implementation but fail when
-using a different Vulkan implementation.
-Potential failures include:
-
-  * Creating then destroying a flip presentation model DXGI swapchain on a
-    window object can prevent flink:vkCreateSwapchainKHR from succeeding on
-    the same window object.
-  * Creating then destroying a slink:VkSwapchainKHR on a window object can
-    prevent creation of a bitblt model DXGI swapchain on the same window
-    object.
-  * Creating then destroying a slink:VkSwapchainKHR on a window object can
-    effectively code:SetPixelFormat to a different format than the format
-    chosen by an OpenGL application.
-  * Creating then destroying a slink:VkSwapchainKHR on a window object on
-    one slink:VkPhysicalDevice can prevent flink:vkCreateSwapchainKHR from
-    succeeding on the same window object, but on a different
-    slink:VkPhysicalDevice that is associated with a different Vulkan ICD.
-
-In all cases the problem can be worked around by creating a new window
-object.
-
-Technical details include:
-
-  * Creating a DXGI swapchain over a window object can alter the object for
-    the remainder of its lifetime.
-    The alteration persists even after the DXGI swapchain has been
-    destroyed.
-    This alteration can make it impossible for a conformant Vulkan
-    implementation to create a slink:VkSwapchainKHR over the same window
-    object.
-    Mention of this alteration can be found in the remarks section of the
-    MSDN documentation for code:DXGI_SWAP_EFFECT.
-  * Calling GDI's code:SetPixelFormat (needed by OpenGL's WGL layer) on a
-    window object alters the object for the remainder of its lifetime.
-    The MSDN documentation for code:SetPixelFormat explains that a window
-    object's pixel format can be set only one time.
-  * Creating a slink:VkSwapchainKHR over a window object can alter the
-    object for its remaining lifetime.
-    Either of the above alterations may occur as a side effect of
-    flink:vkCreateSwapchainKHR.
-
-=== Version History
-
- * Revision 1, 2015-09-23 (Jesse Hall)
-   - Initial draft, based on the previous contents of VK_EXT_KHR_swapchain
-     (later renamed VK_EXT_KHR_surface).
-
- * Revision 2, 2015-10-02 (James Jones)
-   - Added presentation support query for win32 desktops.
-
- * Revision 3, 2015-10-26 (Ian Elliott)
-   - Renamed from VK_EXT_KHR_win32_surface to VK_KHR_win32_surface.
-
- * Revision 4, 2015-11-03 (Daniel Rakos)
-   - Added allocation callbacks to vkCreateWin32SurfaceKHR.
-
- * Revision 5, 2015-11-28 (Daniel Rakos)
-   - Updated the surface create function to take a pCreateInfo structure.
-
- * Revision 6, 2017-04-24 (Jeff Juliano)
-   - Add issue 2 addressing reuse of a native window object in a different
-     Graphics API, or by a different Vulkan ICD.
diff --git a/registry/vulkan/appendices/VK_KHR_workgroup_memory_explicit_layout.txt b/registry/vulkan/appendices/VK_KHR_workgroup_memory_explicit_layout.txt
deleted file mode 100644
index f9c3075..0000000
--- a/registry/vulkan/appendices/VK_KHR_workgroup_memory_explicit_layout.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_workgroup_memory_explicit_layout.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-06-01
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
- - This extension requires
-   {spirv}/KHR/SPV_KHR_workgroup_memory_explicit_layout.html[`SPV_KHR_workgroup_memory_explicit_layout`]
-*Contributors*::
- - Caio Marcelo de Oliveira Filho, Intel
- - Jeff Bolz, NVIDIA
- - Graeme Leese, Broadcom
- - Jason Ekstrand, Intel
- - Daniel Koch, NVIDIA
-
-=== Description
-
-This extension adds Vulkan support for the
-{spirv}/KHR/SPV_KHR_workgroup_memory_explicit_layout.html[`SPV_KHR_workgroup_memory_explicit_layout`]
-SPIR-V extension, which allows shaders to explicitly define the layout of
-code:Workgroup storage class memory and create aliases between variables
-from that storage class in a compute shader.
-
-The aliasing feature allows different "`views`" on the same data, so the
-shader can bulk copy data from another storage class using one type (e.g. an
-array of large vectors), and then use the data with a more specific type.
-It also enables reducing the amount of workgroup memory consumed by allowing
-the shader to alias data whose lifetimes do not overlap.
-
-The explicit layout support and some form of aliasing is also required for
-layering OpenCL on top of Vulkan.
-
-include::{generated}/interfaces/VK_KHR_workgroup_memory_explicit_layout.txt[]
-
-=== New SPIR-V Capabilities
-
- * <<spirvenv-capabilities-table-WorkgroupMemoryExplicitLayoutKHR,
-   code:WorkgroupMemoryExplicitLayoutKHR>>
- * <<spirvenv-capabilities-table-WorkgroupMemoryExplicitLayout8BitAccessKHR,
-   code:WorkgroupMemoryExplicitLayout8BitAccessKHR>>
- * <<spirvenv-capabilities-table-WorkgroupMemoryExplicitLayout16BitAccessKHR,
-   code:WorkgroupMemoryExplicitLayout16BitAccessKHR>>
-
-=== Version History
-
- * Revision 1, 2020-06-01 (Caio Marcelo de Oliveira Filho)
-   - Initial version
diff --git a/registry/vulkan/appendices/VK_KHR_xcb_surface.txt b/registry/vulkan/appendices/VK_KHR_xcb_surface.txt
deleted file mode 100644
index 8849e25..0000000
--- a/registry/vulkan/appendices/VK_KHR_xcb_surface.txt
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_xcb_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2015-11-28
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Patrick Doane, Blizzard
-  - Jason Ekstrand, Intel
-  - Ian Elliott, LunarG
-  - Courtney Goeltzenleuchter, LunarG
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-  - Antoine Labour, Google
-  - Jon Leech, Khronos
-  - David Mao, AMD
-  - Norbert Nopper, Freescale
-  - Alon Or-bach, Samsung
-  - Daniel Rakos, AMD
-  - Graham Sellers, AMD
-  - Ray Smith, ARM
-  - Jeff Vigil, Qualcomm
-  - Chia-I Wu, LunarG
-
-=== Description
-
-The `VK_KHR_xcb_surface` extension is an instance extension.
-It provides a mechanism to create a slink:VkSurfaceKHR object (defined by
-the `apiext:VK_KHR_surface` extension) that refers to an X11 code:Window,
-using the XCB client-side library, as well as a query to determine support
-for rendering via XCB.
-
-include::{generated}/interfaces/VK_KHR_xcb_surface.txt[]
-
-=== Issues
-
-1) Does XCB need a way to query for compatibility between a particular
-physical device and a specific screen? This would be a more general query
-than flink:vkGetPhysicalDeviceSurfaceSupportKHR: If it returned
-ename:VK_TRUE, then the physical device could be assumed to support
-presentation to any window on that screen.
-
-*RESOLVED*: Yes, this is needed for toolkits that want to create a
-slink:VkDevice before creating a window.
-To ensure the query is reliable, it must be made against a particular X
-visual rather than the screen in general.
-
-=== Version History
-
- * Revision 1, 2015-09-23 (Jesse Hall)
-   - Initial draft, based on the previous contents of VK_EXT_KHR_swapchain
-     (later renamed VK_EXT_KHR_surface).
-
- * Revision 2, 2015-10-02 (James Jones)
-   - Added presentation support query for an (xcb_connection_t*,
-     xcb_visualid_t) pair.
-   - Removed "`root`" parameter from CreateXcbSurfaceKHR(), as it is
-     redundant when a window on the same screen is specified as well.
-   - Adjusted wording of issue #1 and added agreed upon resolution.
-
- * Revision 3, 2015-10-14 (Ian Elliott)
-   - Removed "`root`" parameter from CreateXcbSurfaceKHR() in one more
-     place.
-
- * Revision 4, 2015-10-26 (Ian Elliott)
-   - Renamed from VK_EXT_KHR_xcb_surface to VK_KHR_xcb_surface.
-
- * Revision 5, 2015-10-23 (Daniel Rakos)
-   - Added allocation callbacks to vkCreateXcbSurfaceKHR.
-
- * Revision 6, 2015-11-28 (Daniel Rakos)
-   - Updated the surface create function to take a pCreateInfo structure.
diff --git a/registry/vulkan/appendices/VK_KHR_xlib_surface.txt b/registry/vulkan/appendices/VK_KHR_xlib_surface.txt
deleted file mode 100644
index 4db3f96..0000000
--- a/registry/vulkan/appendices/VK_KHR_xlib_surface.txt
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_xlib_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2015-11-28
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Patrick Doane, Blizzard
-  - Jason Ekstrand, Intel
-  - Ian Elliott, LunarG
-  - Courtney Goeltzenleuchter, LunarG
-  - Jesse Hall, Google
-  - James Jones, NVIDIA
-  - Antoine Labour, Google
-  - Jon Leech, Khronos
-  - David Mao, AMD
-  - Norbert Nopper, Freescale
-  - Alon Or-bach, Samsung
-  - Daniel Rakos, AMD
-  - Graham Sellers, AMD
-  - Ray Smith, ARM
-  - Jeff Vigil, Qualcomm
-  - Chia-I Wu, LunarG
-
-=== Description
-
-The `VK_KHR_xlib_surface` extension is an instance extension.
-It provides a mechanism to create a slink:VkSurfaceKHR object (defined by
-the `apiext:VK_KHR_surface` extension) that refers to an X11 code:Window,
-using the Xlib client-side library, as well as a query to determine support
-for rendering via Xlib.
-
-include::{generated}/interfaces/VK_KHR_xlib_surface.txt[]
-
-=== Issues
-
-1) Does X11 need a way to query for compatibility between a particular
-physical device and a specific screen? This would be a more general query
-than flink:vkGetPhysicalDeviceSurfaceSupportKHR; if it returned
-ename:VK_TRUE, then the physical device could be assumed to support
-presentation to any window on that screen.
-
-*RESOLVED*: Yes, this is needed for toolkits that want to create a
-slink:VkDevice before creating a window.
-To ensure the query is reliable, it must be made against a particular X
-visual rather than the screen in general.
-
-=== Version History
-
- * Revision 1, 2015-09-23 (Jesse Hall)
-   - Initial draft, based on the previous contents of VK_EXT_KHR_swapchain
-     (later renamed VK_EXT_KHR_surface).
-
- * Revision 2, 2015-10-02 (James Jones)
-   - Added presentation support query for (Display*, VisualID) pair.
-   - Removed "`root`" parameter from CreateXlibSurfaceKHR(), as it is
-     redundant when a window on the same screen is specified as well.
-   - Added appropriate X errors.
-   - Adjusted wording of issue #1 and added agreed upon resolution.
-
- * Revision 3, 2015-10-14 (Ian Elliott)
-   - Renamed this extension from VK_EXT_KHR_x11_surface to
-     VK_EXT_KHR_xlib_surface.
-
- * Revision 4, 2015-10-26 (Ian Elliott)
-   - Renamed from VK_EXT_KHR_xlib_surface to VK_KHR_xlib_surface.
-
- * Revision 5, 2015-11-03 (Daniel Rakos)
-   - Added allocation callbacks to vkCreateXlibSurfaceKHR.
-
- * Revision 6, 2015-11-28 (Daniel Rakos)
-   - Updated the surface create function to take a pCreateInfo structure.
diff --git a/registry/vulkan/appendices/VK_KHR_zero_initialize_workgroup_memory.txt b/registry/vulkan/appendices/VK_KHR_zero_initialize_workgroup_memory.txt
deleted file mode 100644
index dd4ddf1..0000000
--- a/registry/vulkan/appendices/VK_KHR_zero_initialize_workgroup_memory.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2020-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_KHR_zero_initialize_workgroup_memory.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-11-18
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-    None
-*Contributors*::
-  - Alan Baker, Google
-  - Jeff Bolz, Nvidia
-  - Jason Ekstrand, Intel
-
-=== Description
-
-This extension allows the use of a null constant initializer on shader
-Workgroup memory variables, allowing implementations to expose any special
-hardware or instructions they may have.
-Zero initialization is commonly used by applications running untrusted
-content (e.g. web browsers) as way of defeating memory-scraping attacks.
-
-include::{generated}/interfaces/VK_KHR_zero_initialize_workgroup_memory.txt[]
-
-=== Version History
-
-  * Revision 1, 2020-11-18 (Alan Baker)
-    - Internal draft version
-
diff --git a/registry/vulkan/appendices/VK_MVK_ios_surface.txt b/registry/vulkan/appendices/VK_MVK_ios_surface.txt
deleted file mode 100644
index 19ad1ae..0000000
--- a/registry/vulkan/appendices/VK_MVK_ios_surface.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2015-2018 The Brenwill Workshop Ltd.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_MVK_ios_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-07-31
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Bill Hollings, The Brenwill Workshop Ltd.
-
-=== Description
-
-The `VK_MVK_ios_surface` extension is an instance extension.
-It provides a mechanism to create a slink:VkSurfaceKHR object (defined by
-the `apiext:VK_KHR_surface` extension) based on a code:UIView, the native
-surface type of iOS, which is underpinned by a basetype:CAMetalLayer, to
-support rendering to the surface using Apple's Metal framework.
-
-ifdef::VK_EXT_metal_surface[]
-=== Deprecation by `VK_EXT_metal_surface`
-
-The `VK_MVK_ios_surface` extension is considered deprecated and has been
-superseded by the `apiext:VK_EXT_metal_surface` extension.
-endif::VK_EXT_metal_surface[]
-
-include::{generated}/interfaces/VK_MVK_ios_surface.txt[]
-
-=== Version History
-
- * Revision 1, 2017-02-15 (Bill Hollings)
-   - Initial draft.
-
- * Revision 2, 2017-02-24 (Bill Hollings)
-   - Minor syntax fix to emphasize firm requirement for `UIView` to be
-     backed by a `CAMetalLayer`.
-
- * Revision 3, 2020-07-31 (Bill Hollings)
-   - Update documentation on requirements for UIView.
-   - Mark as deprecated by `VK_EXT_metal_surface`.
diff --git a/registry/vulkan/appendices/VK_MVK_macos_surface.txt b/registry/vulkan/appendices/VK_MVK_macos_surface.txt
deleted file mode 100644
index ab56253..0000000
--- a/registry/vulkan/appendices/VK_MVK_macos_surface.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2015-2018 The Brenwill Workshop Ltd.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_MVK_macos_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-07-31
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Bill Hollings, The Brenwill Workshop Ltd.
-
-=== Description
-
-The `VK_MVK_macos_surface` extension is an instance extension.
-It provides a mechanism to create a slink:VkSurfaceKHR object (defined by
-the `apiext:VK_KHR_surface` extension) based on an code:NSView, the native
-surface type of macOS, which is underpinned by a basetype:CAMetalLayer, to
-support rendering to the surface using Apple's Metal framework.
-
-ifdef::VK_EXT_metal_surface[]
-=== Deprecation by `VK_EXT_metal_surface`
-
-The `VK_MVK_macos_surface` extension is considered deprecated and has been
-superseded by the `apiext:VK_EXT_metal_surface` extension.
-endif::VK_EXT_metal_surface[]
-
-include::{generated}/interfaces/VK_MVK_macos_surface.txt[]
-
-=== Version History
-
- * Revision 1, 2017-02-15 (Bill Hollings)
-   - Initial draft.
-
- * Revision 2, 2017-02-24 (Bill Hollings)
-   - Minor syntax fix to emphasize firm requirement for `NSView` to be
-     backed by a `CAMetalLayer`.
-
- * Revision 3, 2020-07-31 (Bill Hollings)
-   - Update documentation on requirements for `NSView`.
-   - Mark as deprecated by `VK_EXT_metal_surface`.
diff --git a/registry/vulkan/appendices/VK_NN_vi_surface.txt b/registry/vulkan/appendices/VK_NN_vi_surface.txt
deleted file mode 100644
index fcd167d..0000000
--- a/registry/vulkan/appendices/VK_NN_vi_surface.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2016-2020 Nintendo
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NN_vi_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-12-02
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Mathias Heyer, NVIDIA
-  - Michael Chock, NVIDIA
-  - Yasuhiro Yoshioka, Nintendo
-  - Daniel Koch, NVIDIA
-
-=== Description
-
-The `VK_NN_vi_surface` extension is an instance extension.
-It provides a mechanism to create a slink:VkSurfaceKHR object (defined by
-the `apiext:VK_KHR_surface` extension) associated with an
-code:nn::code:vi::code:Layer.
-
-include::{generated}/interfaces/VK_NN_vi_surface.txt[]
-
-=== Issues
-
-1) Does VI need a way to query for compatibility between a particular
-physical device (and queue family?) and a specific VI display?
-
-*RESOLVED*: No.
-It is currently always assumed that the device and display will always be
-compatible.
-
-2) slink:VkViSurfaceCreateInfoNN::pname:pWindow is intended to store an
-code:nn::code:vi::code:NativeWindowHandle, but its declared type is a bare
-code:void* to store the window handle.
-Why the discrepancy?
-
-*RESOLVED*: It is for C compatibility.
-The definition for the VI native window handle type is defined inside the
-code:nn::code:vi C++ namespace.
-This prevents its use in C source files.
-code:nn::code:vi::code:NativeWindowHandle is always defined to be
-code:void*, so this extension uses code:void* to match.
-
-=== Version History
-
- * Revision 1, 2016-12-2 (Michael Chock)
-   - Initial draft.
diff --git a/registry/vulkan/appendices/VK_NVX_binary_import.txt b/registry/vulkan/appendices/VK_NVX_binary_import.txt
deleted file mode 100644
index df14a57..0000000
--- a/registry/vulkan/appendices/VK_NVX_binary_import.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2018-2021 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NVX_binary_import.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-04-09
-*Contributors*::
-  - Eric Werness, NVIDIA
-  - Liam Middlebrook, NVIDIA
-
-=== Description
-
-This extension allows applications to import CuBIN binaries and execute
-them.
-
-ifdef::EXTENSION_UNDEFINED[]
-include::{generated}/interfaces/VK_NVX_binary_import.txt[]
-endif::EXTENSION_UNDEFINED[]
-
-ifndef::EXTENSION_UNDEFINED[]
-// The anchor is added here as a landing place for a reference from
-// the autogenerated section of the features chapter, until spec
-// language is written.
-[[vkCmdCuLaunchKernelNVX]]
-[NOTE]
-.Note
-====
-There is currently no specification language written for this extension, so
-although it appears in the Vulkan headers, its interfaces are not summarized
-here.
-====
-endif::EXTENSION_UNDEFINED[]
-
-=== Version History
-
-  * Revision 1, 2021-04-09 (Eric Werness)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NVX_image_view_handle.txt b/registry/vulkan/appendices/VK_NVX_image_view_handle.txt
deleted file mode 100644
index 16497a9..0000000
--- a/registry/vulkan/appendices/VK_NVX_image_view_handle.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NVX_image_view_handle.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-04-03
-*Contributors*::
-  - Eric Werness, NVIDIA
-  - Jeff Bolz, NVIDIA
-  - Daniel Koch, NVIDIA
-
-=== Description
-
-This extension allows applications to query an opaque handle from an image
-view for use as a sampled image or storage image.
-This provides no direct functionality itself.
-
-include::{generated}/interfaces/VK_NVX_image_view_handle.txt[]
-
-=== Version History
-
-  * Revision 2, 2020-04-03 (Piers Daniell)
-    - Add flink:vkGetImageViewAddressNVX
-
-  * Revision 1, 2018-12-07 (Eric Werness)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NVX_multiview_per_view_attributes.txt b/registry/vulkan/appendices/VK_NVX_multiview_per_view_attributes.txt
deleted file mode 100644
index 376e07b..0000000
--- a/registry/vulkan/appendices/VK_NVX_multiview_per_view_attributes.txt
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) 2017-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NVX_multiview_per_view_attributes.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-01-13
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/NV/SPV_NVX_multiview_per_view_attributes.html[`SPV_NVX_multiview_per_view_attributes`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/nvx/GL_NVX_multiview_per_view_attributes.txt[`GL_NVX_multiview_per_view_attributes`]
-  - This extension interacts with `apiext:VK_NV_viewport_array2`.
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Daniel Koch, NVIDIA
-
-=== Description
-
-This extension adds a new way to write shaders to be used with multiview
-subpasses, where the attributes for all views are written out by a single
-invocation of the
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stages>>.
-Related SPIR-V and GLSL extensions `SPV_NVX_multiview_per_view_attributes`
-and `GL_NVX_multiview_per_view_attributes` introduce per-view position and
-viewport mask attributes arrays, and this extension defines how those
-per-view attribute arrays are interpreted by Vulkan.
-Pipelines using per-view attributes may: only execute the
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stages>> once for all views rather than once per-view, which reduces
-redundant shading work.
-
-A subpass creation flag controls whether the subpass uses this extension.
-A subpass must: either exclusively use this extension or not use it at all.
-
-Some Vulkan implementations only support the position attribute varying
-between views in the X component.
-A subpass can declare via a second creation flag whether all pipelines
-compiled for this subpass will obey this restriction.
-
-Shaders that use the new per-view outputs (e.g. code:gl_PositionPerViewNV)
-must: also write the non-per-view output (code:gl_Position), and the values
-written must: be such that `gl_Position =
-gl_PositionPerViewNV[gl_ViewIndex]` for all views in the subpass.
-Implementations are free to either use the per-view outputs or the
-non-per-view outputs, whichever would be more efficient.
-
-If `apiext:VK_NV_viewport_array2` is not also supported and enabled, the
-per-view viewport mask must: not be used.
-
-include::{generated}/interfaces/VK_NVX_multiview_per_view_attributes.txt[]
-
-=== New Built-In Variables
-
-  * <<interfaces-builtin-variables-positionperview,code:PositionPerViewNV>>
-  * <<interfaces-builtin-variables-viewportmaskperview,code:ViewportMaskPerViewNV>>
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-PerViewAttributesNV,code:PerViewAttributesNV>>
-
-=== Examples
-
-[source,c]
----------------------------------------------------
-#version 450 core
-
-#extension GL_KHX_multiview : enable
-#extension GL_NVX_multiview_per_view_attributes : enable
-
-layout(location = 0) in vec4 position;
-layout(set = 0, binding = 0) uniform Block { mat4 mvpPerView[2]; } buf;
-
-void main()
-{
-    // Output both per-view positions and gl_Position as a function
-    // of gl_ViewIndex
-    gl_PositionPerViewNV[0] = buf.mvpPerView[0] * position;
-    gl_PositionPerViewNV[1] = buf.mvpPerView[1] * position;
-    gl_Position = buf.mvpPerView[gl_ViewIndex] * position;
-}
-
----------------------------------------------------
-
-
-=== Version History
-
- * Revision 1, 2017-01-13 (Jeff Bolz)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_acquire_winrt_display.txt b/registry/vulkan/appendices/VK_NV_acquire_winrt_display.txt
deleted file mode 100644
index 4cf58fa..0000000
--- a/registry/vulkan/appendices/VK_NV_acquire_winrt_display.txt
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright (c) 2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_acquire_winrt_display.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-09-29
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jeff Juliano, NVIDIA
-
-=== Description
-
-This extension allows an application to take exclusive control of a display
-on Windows 10 provided that the display is not already controlled by a
-compositor.
-Examples of compositors include the Windows desktop compositor, other
-applications using this Vulkan extension, and applications that
-https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaymanager.tryacquiretarget["`Acquire`"]
-a
-https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaytarget["`DisplayTarget`"]
-using a https://docs.microsoft.com/en-us/uwp/api/["`WinRT`"] command such as
-https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaymanager.tryacquiretarget["`winrt::Windows::Devices::Display::Core::DisplayManager.TryAcquireTarget()`"].
-
-When control is acquired the application has exclusive access to the display
-until control is released or the application terminates.
-An application's attempt to acquire is denied if a different application has
-already acquired the display.
-
-include::{generated}/interfaces/VK_NV_acquire_winrt_display.txt[]
-
-=== Issues
-
-1) What should the platform substring be for this extension:
-
-*RESOLVED*: The platform substring is "`Winrt`".
-
-The substring "`Winrt`" matches the fact that the OS API exposing the
-acquire and release functionality is called "`WinRT`".
-
-The substring "`Win32`" is wrong because the related "`WinRT`" API is
-explicitly *not* a "`Win32`" API.
-"`WinRT`" is a competing API family to the "`Win32`" API family.
-
-The substring "`Windows`" is suboptimal because there could be more than one
-relevant API on the Windows platform.
-There is preference to use the more-specific substring "`Winrt`".
-
-2) Should flink:vkAcquireWinrtDisplayNV take a winRT DisplayTarget, or a
-Vulkan display handle as input?
-
-*RESOLVED*: A Vulkan display handle.
-This matches the design of flink:vkAcquireXlibDisplayEXT.
-
-3) Should the acquire command be platform-independent named
-"`vkAcquireDisplayNV`", or platform-specific named
-"`vkAcquireWinrtDisplayNV`"?
-
-*RESOLVED*: Add a platform-specific command.
-
-The inputs to the Acquire command are all Vulkan types.
-None are WinRT types.
-This opens the possibility of the winrt extension defining a
-platform-independent acquire command.
-
-The X11 acquire command does need to accept a platform-specific parameter.
-This could be handled by adding to a platform-independent acquire command a
-params struct to which platform-dependent types can be chained by
-pname:pNext pointer.
-
-The prevailing opinion is that it would be odd to create a second
-platform-independent function that is used on the Windows 10 platform, but
-that is not used for the X11 platform.
-Since a Windows 10 platform-specific command is needed anyway for converting
-between vkDisplayKHR and platform-native handles, opinion was to create a
-platform-specific acquire function.
-
-4) Should the flink:vkGetWinrtDisplayNV parameter identifying a display be
-named "`deviceRelativeId`" or "`adapterRelativeId`"?
-
-*RESOLVED*: The WinRT name is "`AdapterRelativeId`".
-The name "`adapter`" is the Windows analog to a Vulkan "`physical device`".
-Vulkan already has precedent to use the name sname:deviceLUID for the
-concept that Windows APIs call "`AdapterLuid`".
-Keeping form with this precedent, the name "`deviceRelativeId`" is chosen.
-
-5) Does flink:vkAcquireWinrtDisplayNV cause the Windows desktop compositor
-to release a display?
-
-*RESOLVED*: No.
-flink:vkAcquireWinrtDisplayNV does not itself cause the Windows desktop
-compositor to release a display.
-This action must be performed outside of Vulkan.
-
-Beginning with Windows 10 version 2004 it is possible to cause the Windows
-desktop compositor to release a display by using the "`Advanced display
-settings`" sub-page of the "`Display settings`" control panel.
-See
-https://docs.microsoft.com/en-us/windows-hardware/drivers/display/specialized-monitors
-
-6) Where can one find additional information about custom compositors for
-Windows 10?
-
-*RESOLVED*: Relevant references are as follows.
-
-According to Microsoft's documentation on
-https://docs.microsoft.com/en-us/windows-hardware/drivers/display/specialized-monitors-compositor["building
-a custom compositor"], the ability to write a custom compositor is not a
-replacement for a fullscreen desktop window.
-The feature is for writing compositor apps that drive specialized hardware.
-
-Only certain editions of Windows 10 support custom compositors,
-https://docs.microsoft.com/en-us/windows-hardware/drivers/display/specialized-monitors#windows-10-version-2004["documented
-here"].
-The product type can be queried from Windows 10.
-See
-https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getproductinfo
-
-=== Version History
-
- * Revision 1, 2020-09-29 (Jeff Juliano)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_NV_clip_space_w_scaling.txt b/registry/vulkan/appendices/VK_NV_clip_space_w_scaling.txt
deleted file mode 100644
index 3f8cd26..0000000
--- a/registry/vulkan/appendices/VK_NV_clip_space_w_scaling.txt
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright (c) 2017-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_clip_space_w_scaling.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-02-15
-*Contributors*::
-  - Eric Werness, NVIDIA
-  - Kedarnath Thangudu, NVIDIA
-
-=== Description
-
-Virtual Reality (VR) applications often involve a post-processing step to
-apply a "`barrel`" distortion to the rendered image to correct the
-"`pincushion`" distortion introduced by the optics in a VR device.
-The barrel distorted image has lower resolution along the edges compared to
-the center.
-Since the original image is rendered at high resolution, which is uniform
-across the complete image, a lot of pixels towards the edges do not make it
-to the final post-processed image.
-
-This extension provides a mechanism to render VR scenes at a non-uniform
-resolution, in particular a resolution that falls linearly from the center
-towards the edges.
-This is achieved by scaling the [eq]#w# coordinate of the vertices in the
-clip space before perspective divide.
-The clip space [eq]#w# coordinate of the vertices can: be offset as of a
-function of [eq]#x# and [eq]#y# coordinates as follows:
-
-[eq]#w' = w {plus} Ax {plus} By#
-
-In the intended use case for viewport position scaling, an application
-should use a set of four viewports, one for each of the four quadrants of a
-Cartesian coordinate system.
-Each viewport is set to the dimension of the image, but is scissored to the
-quadrant it represents.
-The application should specify [eq]#A# and [eq]#B# coefficients of the
-[eq]#w#-scaling equation above, that have the same value, but different
-signs, for each of the viewports.
-The signs of [eq]#A# and [eq]#B# should match the signs of [eq]#x# and
-[eq]#y# for the quadrant that they represent such that the value of [eq]#w'#
-will always be greater than or equal to the original [eq]#w# value for the
-entire image.
-Since the offset to [eq]#w#, ([eq]#Ax {plus} By#), is always positive, and
-increases with the absolute values of [eq]#x# and [eq]#y#, the effective
-resolution will fall off linearly from the center of the image to its edges.
-
-include::{generated}/interfaces/VK_NV_clip_space_w_scaling.txt[]
-
-=== Issues
-
-1) Is the pipeline struct name too long?
-
-*RESOLVED*: It fits with the naming convention.
-
-2) Separate W scaling section or fold into coordinate transformations?
-
-*RESOLVED*: Leaving it as its own section for now.
-
-=== Examples
-
-[source,c++]
---------------------------------------
-
-VkViewport viewports[4];
-VkRect2D scissors[4];
-VkViewportWScalingNV scalings[4];
-
-for (int i = 0; i < 4; i++) {
-    int x = (i & 2) ? 0 : currentWindowWidth / 2;
-    int y = (i & 1) ? 0 : currentWindowHeight / 2;
-
-    viewports[i].x = 0;
-    viewports[i].y = 0;
-    viewports[i].width = currentWindowWidth;
-    viewports[i].height = currentWindowHeight;
-    viewports[i].minDepth = 0.0f;
-    viewports[i].maxDepth = 1.0f;
-
-    scissors[i].offset.x = x;
-    scissors[i].offset.y = y;
-    scissors[i].extent.width = currentWindowWidth/2;
-    scissors[i].extent.height = currentWindowHeight/2;
-
-    const float factor = 0.15;
-    scalings[i].xcoeff = ((i & 2) ? -1.0 : 1.0) * factor;
-    scalings[i].ycoeff = ((i & 1) ? -1.0 : 1.0) * factor;
-}
-
-VkPipelineViewportWScalingStateCreateInfoNV vpWScalingStateInfo = { VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV };
-
-vpWScalingStateInfo.viewportWScalingEnable = VK_TRUE;
-vpWScalingStateInfo.viewportCount = 4;
-vpWScalingStateInfo.pViewportWScalings = &scalings[0];
-
-VkPipelineViewportStateCreateInfo vpStateInfo = { VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO };
-vpStateInfo.viewportCount = 4;
-vpStateInfo.pViewports = &viewports[0];
-vpStateInfo.scissorCount = 4;
-vpStateInfo.pScissors = &scissors[0];
-vpStateInfo.pNext = &vpWScalingStateInfo;
-
---------------------------------------
-
-Example shader to read from a w-scaled texture:
-
-[source,c++]
---------------------------------------
-
-// Vertex Shader
-// Draw a triangle that covers the whole screen
-const vec4 positions[3] = vec4[3](vec4(-1, -1, 0, 1),
-                                  vec4( 3, -1, 0, 1),
-                                  vec4(-1,  3, 0, 1));
-out vec2 uv;
-void main()
-{
-    vec4 pos = positions[ gl_VertexID ];
-    gl_Position = pos;
-    uv = pos.xy;
-}
-
-// Fragment Shader
-uniform sampler2D tex;
-uniform float xcoeff;
-uniform float ycoeff;
-out vec4 Color;
-in vec2 uv;
-
-void main()
-{
-    // Handle uv as if upper right quadrant
-    vec2 uvabs = abs(uv);
-
-    // unscale: transform w-scaled image into an unscaled image
-    //   scale: transform unscaled image int a w-scaled image
-    float unscale = 1.0 / (1 + xcoeff * uvabs.x + xcoeff * uvabs.y);
-    //float scale = 1.0 / (1 - xcoeff * uvabs.x - xcoeff * uvabs.y);
-
-    vec2 P = vec2(unscale * uvabs.x, unscale * uvabs.y);
-
-    // Go back to the right quadrant
-    P *= sign(uv);
-
-    Color = texture(tex, P * 0.5 + 0.5);
-}
---------------------------------------
-
-=== Version History
-
- * Revision 1, 2017-02-15 (Eric Werness)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_compute_shader_derivatives.txt b/registry/vulkan/appendices/VK_NV_compute_shader_derivatives.txt
deleted file mode 100644
index 668c4f0..0000000
--- a/registry/vulkan/appendices/VK_NV_compute_shader_derivatives.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_compute_shader_derivatives.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-07-19
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/NV/SPV_NV_compute_shader_derivatives.html[`SPV_NV_compute_shader_derivatives`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_compute_shader_derivatives.txt[`GL_NV_compute_shader_derivatives`]
-*Contributors*::
-  - Pat Brown, NVIDIA
-
-=== Description
-
-This extension adds Vulkan support for the
-{spirv}/NV/SPV_NV_compute_shader_derivatives.html[`SPV_NV_compute_shader_derivatives`]
-SPIR-V extension.
-
-The SPIR-V extension provides two new execution modes, both of which allow
-compute shaders to use built-ins that evaluate compute derivatives
-explicitly or implicitly.
-Derivatives will be computed via differencing over a 2x2 group of shader
-invocations.
-The code:DerivativeGroupQuadsNV execution mode assembles shader invocations
-into 2x2 groups, where each group has x and y coordinates of the local
-invocation ID of the form (2m+{0,1}, 2n+{0,1}).
-The code:DerivativeGroupLinearNV execution mode assembles shader invocations
-into 2x2 groups, where each group has local invocation index values of the
-form 4m+{0,1,2,3}.
-
-include::{generated}/interfaces/VK_NV_compute_shader_derivatives.txt[]
-
-=== New SPIR-V Capability
-
-  * <<spirvenv-capabilities-table-ComputeDerivativeGroupQuadsNV,ComputeDerivativeGroupQuadsNV>>
-  * <<spirvenv-capabilities-table-ComputeDerivativeGroupLinearNV,ComputeDerivativeGroupLinearNV>>
-
-=== Issues
-
-(1) Should we specify that the groups of four shader invocations used for
-derivatives in a compute shader are the same groups of four invocations that
-form a "`quad`" in shader subgroups?
-
-*RESOLVED*: Yes.
-
-
-=== Examples
-
-None.
-
-=== Version History
-
- * Revision 1, 2018-07-19 (Pat Brown)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_NV_cooperative_matrix.txt b/registry/vulkan/appendices/VK_NV_cooperative_matrix.txt
deleted file mode 100644
index dbae959..0000000
--- a/registry/vulkan/appendices/VK_NV_cooperative_matrix.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2019-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_cooperative_matrix.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-02-05
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/NV/SPV_NV_cooperative_matrix.html[`SPV_NV_cooperative_matrix`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_cooperative_matrix.txt[`GL_NV_cooperative_matrix`]
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Markus Tavenrath, NVIDIA
-  - Daniel Koch, NVIDIA
-
-=== Description
-
-This extension adds support for using cooperative matrix types in SPIR-V.
-Cooperative matrix types are medium-sized matrices that are primarily
-supported in compute shaders, where the storage for the matrix is spread
-across all invocations in some scope (usually a subgroup) and those
-invocations cooperate to efficiently perform matrix multiplies.
-
-Cooperative matrix types are defined by the
-{spirv}/NV/SPV_NV_cooperative_matrix.html[`SPV_NV_cooperative_matrix`]
-SPIR-V extension and can be used with the
-https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_cooperative_matrix.txt[`GL_NV_cooperative_matrix`]
-GLSL extension.
-
-This extension includes support for enumerating the matrix types and
-dimensions that are supported by the implementation.
-
-include::{generated}/interfaces/VK_NV_cooperative_matrix.txt[]
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-CooperativeMatrixNV,CooperativeMatrixNV>>
-
-=== Issues
-
-(1) What matrix properties will be supported in practice?
-
-*RESOLVED*: In NVIDIA's initial implementation, we will support:
-
-    * AType = BType = fp16 CType = DType = fp16 MxNxK = 16x8x16 scope =
-      Subgroup
-    * AType = BType = fp16 CType = DType = fp16 MxNxK = 16x8x8 scope =
-      Subgroup
-    * AType = BType = fp16 CType = DType = fp32 MxNxK = 16x8x16 scope =
-      Subgroup
-    * AType = BType = fp16 CType = DType = fp32 MxNxK = 16x8x8 scope =
-      Subgroup
-
-=== Version History
-
-  * Revision 1, 2019-02-05 (Jeff Bolz)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_corner_sampled_image.txt b/registry/vulkan/appendices/VK_NV_corner_sampled_image.txt
deleted file mode 100644
index 551e132..0000000
--- a/registry/vulkan/appendices/VK_NV_corner_sampled_image.txt
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_corner_sampled_image.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-08-13
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Pat Brown, NVIDIA
-  - Chris Lentini, NVIDIA
-
-=== Description
-
-This extension adds support for a new image organization, which this
-extension refers to as "`corner-sampled`" images.
-A corner-sampled image differs from a conventional image in the following
-ways:
-
-  * Texels are centered on integer coordinates.
-    See <<textures-unnormalized-to-integer, Unnormalized Texel Coordinate
-    Operations>>
-  * Normalized coordinates are scaled using [eq]#coord {times} (dim - 1)#
-    rather than [eq]#coord {times} dim#, where dim is the size of one
-    dimension of the image.
-    See <<textures-normalized-to-unnormalized, normalized texel coordinate
-    transform>>.
-  * Partial derivatives are scaled using [eq]#coord {times} (dim - 1)#
-    rather than [eq]#coord {times} dim#.
-    See <<textures-scale-factor,Scale Factor Operation>>.
-  * Calculation of the next higher lod size goes according to
-    [eq]#{lceil}dim / 2{rceil}# rather than [eq]#{lfloor}dim / 2{rfloor}#.
-    See <<resources-image-miplevel-sizing,Image Miplevel Sizing>>.
-  * The minimum level size is 2x2 for 2D images and 2x2x2 for 3D images.
-    See <<resources-image-miplevel-sizing,Image Miplevel Sizing>>.
-
-This image organization is designed to facilitate a system like Ptex with
-separate textures for each face of a subdivision or polygon mesh.
-Placing sample locations at pixel corners allows applications to maintain
-continuity between adjacent patches by duplicating values along shared
-edges.
-Additionally, using the modified mipmapping logic along with texture
-dimensions of the form [eq]#2^n^+1# allows continuity across shared edges
-even if the adjacent patches use different level-of-detail values.
-
-include::{generated}/interfaces/VK_NV_corner_sampled_image.txt[]
-
-=== Issues
-
-. What should this extension be named?
-+
---
-*DISCUSSION*: While naming this extension, we chose the most distinctive
-aspect of the image organization and referred to such images as
-"`corner-sampled images`".
-As a result, we decided to name the extension NV_corner_sampled_image.
---
-
-. Do we need a format feature flag so formats can advertise if they support corner-sampling?
-+
---
-*DISCUSSION*: Currently NVIDIA supports this for all 2D and 3D formats, but
-not for cube maps or depth-stencil formats.
-A format feature might be useful if other vendors would only support this on
-some formats.
---
-
-. Do integer texel coordinates have a different range for corner-sampled images?
-+
---
-*RESOLVED*: No, these are unchanged.
---
-
-. Do unnormalized sampler coordinates work with corner-sampled images? Are there any functional differences?
-+
---
-*RESOLVED*: Yes.
-Unnormalized coordinates are treated as already scaled for corner-sample
-usage.
---
-
-. Should we have a diagram in the "`Image Operations`" chapter demonstrating different texel sampling locations?
-+
---
-*UNRESOLVED*: Probaby, but later.
---
-
-=== Version History
-
-  * Revision 1, 2018-08-14 (Daniel Koch)
-    - Internal revisions
-  * Revision 2, 2018-08-14 (Daniel Koch)
-    - ???
diff --git a/registry/vulkan/appendices/VK_NV_coverage_reduction_mode.txt b/registry/vulkan/appendices/VK_NV_coverage_reduction_mode.txt
deleted file mode 100644
index 99f481c..0000000
--- a/registry/vulkan/appendices/VK_NV_coverage_reduction_mode.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2019-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_coverage_reduction_mode.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-  2019-01-29
-*Contributors*::
-  - Kedarnath Thangudu, NVIDIA
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-When using a framebuffer with mixed samples, a per-fragment coverage
-reduction operation is performed which generates color sample coverage from
-the pixel coverage.
-This extension defines the following modes to control how this reduction is
-performed.
-
-  * Merge: When there are more samples in the pixel coverage than color
-    samples, there is an implementation-dependent association of each pixel
-    coverage sample to a color sample.
-    In the merge mode, the color sample coverage is computed such that only
-    if any associated sample in the pixel coverage is covered, the color
-    sample is covered.
-    This is the default mode.
-
-  * Truncate: When there are more raster samples (N) than color samples(M),
-    there is one to one association of the first M raster samples to the M
-    color samples; other raster samples are ignored.
-
-When the number of raster samples is equal to the color samples, there is a
-one to one mapping between them in either of the above modes.
-
-The new command
-flink:vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV can
-be used to query the various raster, color, depth/stencil sample count and
-reduction mode combinations that are supported by the implementation.
-This extension would allow an implementation to support the behavior of both
-`VK_NV_framebuffer_mixed_samples` and `VK_AMD_mixed_attachment_samples`
-extensions simultaneously.
-
-include::{generated}/interfaces/VK_NV_coverage_reduction_mode.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-01-29 (Kedarnath Thangudu)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_dedicated_allocation.txt b/registry/vulkan/appendices/VK_NV_dedicated_allocation.txt
deleted file mode 100644
index 943a96a..0000000
--- a/registry/vulkan/appendices/VK_NV_dedicated_allocation.txt
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) 2016-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_dedicated_allocation.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-05-31
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension allows device memory to be allocated for a particular buffer
-or image resource, which on some devices can significantly improve the
-performance of that resource.
-Normal device memory allocations must support memory aliasing and sparse
-binding, which could interfere with optimizations like framebuffer
-compression or efficient page table usage.
-This is important for render targets and very large resources, but need not
-(and probably should not) be used for smaller resources that can benefit
-from suballocation.
-
-This extension adds a few small structures to resource creation and memory
-allocation: a new structure that flags whether am image/buffer will have a
-dedicated allocation, and a structure indicating the image or buffer that an
-allocation will be bound to.
-
-include::{generated}/interfaces/VK_NV_dedicated_allocation.txt[]
-
-=== Examples
-
-[source,c++]
---------------------------------------
-
-    // Create an image with
-    // VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation
-    // set to VK_TRUE
-
-    VkDedicatedAllocationImageCreateInfoNV dedicatedImageInfo =
-    {
-        VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV,            // sType
-        NULL,                                                                   // pNext
-        VK_TRUE,                                                                // dedicatedAllocation
-    };
-
-    VkImageCreateInfo imageCreateInfo =
-    {
-        VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,    // sType
-        &dedicatedImageInfo                     // pNext
-        // Other members set as usual
-    };
-
-    VkImage image;
-    VkResult result = vkCreateImage(
-        device,
-        &imageCreateInfo,
-        NULL,                       // pAllocator
-        &image);
-
-    VkMemoryRequirements memoryRequirements;
-    vkGetImageMemoryRequirements(
-        device,
-        image,
-        &memoryRequirements);
-
-    // Allocate memory with VkDedicatedAllocationMemoryAllocateInfoNV::image
-    // pointing to the image we are allocating the memory for
-
-    VkDedicatedAllocationMemoryAllocateInfoNV dedicatedInfo =
-    {
-        VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV,             // sType
-        NULL,                                                                       // pNext
-        image,                                                                      // image
-        VK_NULL_HANDLE,                                                             // buffer
-    };
-
-    VkMemoryAllocateInfo memoryAllocateInfo =
-    {
-        VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,                 // sType
-        &dedicatedInfo,                                         // pNext
-        memoryRequirements.size,                                // allocationSize
-        FindMemoryTypeIndex(memoryRequirements.memoryTypeBits), // memoryTypeIndex
-    };
-
-    VkDeviceMemory memory;
-    vkAllocateMemory(
-        device,
-        &memoryAllocateInfo,
-        NULL,                       // pAllocator
-        &memory);
-
-    // Bind the image to the memory
-
-    vkBindImageMemory(
-        device,
-        image,
-        memory,
-        0);
-
---------------------------------------
-
-=== Version History
-
- * Revision 1, 2016-05-31 (Jeff Bolz)
-   - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_dedicated_allocation_image_aliasing.txt b/registry/vulkan/appendices/VK_NV_dedicated_allocation_image_aliasing.txt
deleted file mode 100644
index be89c9c..0000000
--- a/registry/vulkan/appendices/VK_NV_dedicated_allocation_image_aliasing.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2019-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_dedicated_allocation_image_aliasing.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-01-04
-*Contributors*::
-  - Nuno Subtil, NVIDIA
-  - Jeff Bolz, NVIDIA
-  - Eric Werness, NVIDIA
-  - Axel Gneiting, id Software
-
-=== Description
-
-This extension allows applications to alias images on dedicated allocations,
-subject to specific restrictions: the extent and the number of layers in the
-image being aliased must be smaller than or equal to those of the original
-image for which the allocation was created, and every other image parameter
-must match.
-
-include::{generated}/interfaces/VK_NV_dedicated_allocation_image_aliasing.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-01-04 (Nuno Subtil)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_device_diagnostic_checkpoints.txt b/registry/vulkan/appendices/VK_NV_device_diagnostic_checkpoints.txt
deleted file mode 100644
index 5153f1d..0000000
--- a/registry/vulkan/appendices/VK_NV_device_diagnostic_checkpoints.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_device_diagnostic_checkpoints.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-07-16
-*Contributors*::
-  - Oleg Kuznetsov, NVIDIA
-  - Alex Dunn, NVIDIA
-  - Jeff Bolz, NVIDIA
-  - Eric Werness, NVIDIA
-  - Daniel Koch, NVIDIA
-
-=== Description
-
-This extension allows applications to insert markers in the command stream
-and associate them with custom data.
-
-If a device lost error occurs, the application may: then query the
-implementation for the last markers to cross specific implementation-defined
-pipeline stages, in order to narrow down which commands were executing at
-the time and might have caused the failure.
-
-include::{generated}/interfaces/VK_NV_device_diagnostic_checkpoints.txt[]
-
-=== Version History
-
-  * Revision 1, 2018-07-16 (Nuno Subtil)
-    - Internal revisions
-  * Revision 2, 2018-07-16 (Nuno Subtil)
-    - ???
diff --git a/registry/vulkan/appendices/VK_NV_device_diagnostics_config.txt b/registry/vulkan/appendices/VK_NV_device_diagnostics_config.txt
deleted file mode 100644
index 1bd1d1c..0000000
--- a/registry/vulkan/appendices/VK_NV_device_diagnostics_config.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2019-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_device_diagnostics_config.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-  2019-12-15
-*Contributors*::
-  - Kedarnath Thangudu, NVIDIA
-  - Thomas Klein, NVIDIA
-
-=== Description
-
-Applications using Nvidia Nsight^(TM)^ Aftermath SDK for Vulkan to integrate
-device crash dumps into their error reporting mechanisms, may: use this
-extension to configure options related to device crash dump creation.
-
-include::{generated}/interfaces/VK_NV_device_diagnostics_config.txt[]
-
-=== Version History
-
-  * Revision 1, 2019-11-21 (Kedarnath Thangudu)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_device_generated_commands.txt b/registry/vulkan/appendices/VK_NV_device_generated_commands.txt
deleted file mode 100644
index 101ff2e..0000000
--- a/registry/vulkan/appendices/VK_NV_device_generated_commands.txt
+++ /dev/null
@@ -1,326 +0,0 @@
-// Copyright (c) 2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_device_generated_commands.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-02-20
-*Interactions and External Dependencies*::
- - This extension requires Vulkan 1.1
- - This extension requires `VK_EXT_buffer_device_address` or
-   `VK_KHR_buffer_device_address` or Vulkan 1.2 for the ability to bind
-   vertex and index buffers on the device.
- - This extension interacts with `VK_NV_mesh_shader`.
-   If the latter extension is not supported, remove the command token to
-   initiate mesh tasks drawing in this extension.
-*Contributors*::
-  - Christoph Kubisch, NVIDIA
-  - Pierre Boudier, NVIDIA
-  - Jeff Bolz, NVIDIA
-  - Eric Werness, NVIDIA
-  - Yuriy O'Donnell, Epic Games
-  - Baldur Karlsson, Valve
-  - Mathias Schott, NVIDIA
-  - Tyson Smith, NVIDIA
-  - Ingo Esser, NVIDIA
-
-=== Description
-
-This extension allows the device to generate a number of critical graphics
-commands for command buffers.
-
-When rendering a large number of objects, the device can be leveraged to
-implement a number of critical functions, like updating matrices, or
-implementing occlusion culling, frustum culling, front to back sorting, etc.
-Implementing those on the device does not require any special extension,
-since an application is free to define its own data structures, and just
-process them using shaders.
-
-However, if the application desires to quickly kick off the rendering of the
-final stream of objects, then unextended Vulkan forces the application to
-read back the processed stream and issue graphics command from the host.
-For very large scenes, the synchronization overhead and cost to generate the
-command buffer can become the bottleneck.
-This extension allows an application to generate a device side stream of
-state changes and commands, and convert it efficiently into a command buffer
-without having to read it back to the host.
-
-Furthermore, it allows incremental changes to such command buffers by
-manipulating only partial sections of a command stream -- for example
-pipeline bindings.
-Unextended Vulkan requires re-creation of entire command buffers in such a
-scenario, or updates synchronized on the host.
-
-The intended usage for this extension is for the application to:
-
-  * create sname:VkBuffer objects and retrieve physical addresses from them
-    via flink:vkGetBufferDeviceAddressEXT
-  * create a graphics pipeline using
-    sname:VkGraphicsPipelineShaderGroupsCreateInfoNV for the ability to
-    change shaders on the device.
-  * create a slink:VkIndirectCommandsLayoutNV, which lists the
-    elink:VkIndirectCommandsTokenTypeNV it wants to dynamically execute as
-    an atomic command sequence.
-    This step likely involves some internal device code compilation, since
-    the intent is for the GPU to generate the command buffer in the
-    pipeline.
-  * fill the input stream buffers with the data for each of the inputs it
-    needs.
-    Each input is an array that will be filled with token-dependent data.
-  * set up a preprocess sname:VkBuffer that uses memory according to the
-    information retrieved via
-    flink:vkGetGeneratedCommandsMemoryRequirementsNV.
-  * optionally preprocess the generated content using
-    flink:vkCmdPreprocessGeneratedCommandsNV, for example on an asynchronous
-    compute queue, or for the purpose of re-using the data in multiple
-    executions.
-  * call flink:vkCmdExecuteGeneratedCommandsNV to create and execute the
-    actual device commands for all sequences based on the inputs provided.
-
-For each draw in a sequence, the following can be specified:
-
-  * a different shader group
-  * a number of vertex buffer bindings
-  * a different index buffer, with an optional dynamic offset and index type
-  * a number of different push constants
-  * a flag that encodes the primitive winding
-
-While the GPU can be faster than a CPU to generate the commands, it will not
-happen asynchronously to the device, therefore the primary use-case is
-generating "`less`" total work (occlusion culling, classification to use
-specialized shaders, etc.).
-
-include::{generated}/interfaces/VK_NV_device_generated_commands.txt[]
-
-=== Issues
-
-1) How to name this extension ?
-
-`VK_NV_device_generated_commands`
-
-As usual, one of the hardest issues ;)
-
-Alternatives: `VK_gpu_commands`, `VK_execute_commands`,
-`VK_device_commands`, `VK_device_execute_commands`, `VK_device_execute`,
-`VK_device_created_commands`, `VK_device_recorded_commands`,
-`VK_device_generated_commands` `VK_indirect_generated_commands`
-
-2) Should we use a serial stateful token stream or stateless sequence
-descriptions?
-
-Similarly to slink:VkPipeline, fixed layouts have the most likelihood to be
-cross-vendor adoptable.
-They also benefit from being processable in parallel.
-This is a different design choice compared to the serial command stream
-generated through `GL_NV_command_list`.
-
-3) How to name a sequence description?
-
-`VkIndirectCommandsLayout` as in the NVX extension predecessor.
-
-Alternative: `VkGeneratedCommandsLayout`
-
-4) Do we want to provide code:indirectCommands inputs with layout or at
-code:indirectCommands time?
-
-Separate layout from data as Vulkan does.
-Provide full flexibility for code:indirectCommands.
-
-5) Should the input be provided as SoA or AoS?
-
-Both ways are desireable.
-AoS can provide portability to other APIs and easier to setup, while SoA
-allows to update individual inputs in a cache-efficient manner, when others
-remain static.
-
-6) How do we make developers aware of the memory requirements of
-implementation-dependent data used for the generated commands?
-
-Make the API explicit and introduce a `preprocess` slink:VkBuffer.
-Developers have to allocate it using
-flink:vkGetGeneratedCommandsMemoryRequirementsNV.
-
-In the NVX version the requirements were hidden implicitly as part of the
-command buffer reservation process, however as the memory requirements can
-be substantial, we want to give developers the ability to budget the memory
-themselves.
-By lowering the `maxSequencesCount` the memory consumption can be reduced.
-Furthermore reuse of the memory is possible, for example for doing explicit
-preprocessing and execution in a ping-pong fashion.
-
-The actual buffer size is implementation-dependent and may be zero, i.e. not
-always required.
-
-When making use of Graphics Shader Groups, the programs should behave
-similar with regards to vertex inputs, clipping and culling outputs of the
-geometry stage, as well as sample shading behavior in fragment shaders, to
-reduce the amount of the worst-case memory approximation.
-
-7) Should we allow additional per-sequence dynamic state changes?
-
-Yes
-
-Introduced a lightweight indirect state flag
-elink:VkIndirectStateFlagBitsNV.
-So far only switching front face winding state is exposed.
-Especially in CAD/DCC mirrored transforms that require such changes are
-common, and similar flexibility is given in the ray tracing instance
-description.
-
-The flag could be extended further, for example to switch between
-primitive-lists or -strips, or make other state modifications.
-
-Furthermore, as new tokens can be added easily, future extension could add
-the ability to change any elink:VkDynamicState.
-
-8) How do we allow re-using already "`generated`" code:indirectCommands?
-
-Expose a `preprocessBuffer` to reuse implementation-dependencyFlags data.
-Set the `isPreprocessed` to true in flink:vkCmdExecuteGeneratedCommandsNV.
-
-9) Under which conditions is flink:vkCmdExecuteGeneratedCommandsNV legal?
-
-It behaves like a regular draw call command.
-
-10) Is flink:vkCmdPreprocessGeneratedCommandsNV copying the input data or
-referencing it?
-
-There are multiple implementations possible:
-
-  * one could have some emulation code that parses the inputs, and generates
-    an output command buffer, therefore copying the inputs.
-  * one could just reference the inputs, and have the processing done in
-    pipe at execution time.
-
-If the data is mandated to be copied, then it puts a penalty on
-implementation that could process the inputs directly in pipe.
-If the data is "`referenced`", then it allows both types of implementation.
-
-The inputs are "`referenced`", and must: not be modified after the call to
-flink:vkCmdExecuteGeneratedCommandsNV has completed.
-
-11) Which buffer usage flags are required for the buffers referenced by
-sname:VkGeneratedCommandsInfoNV ?
-
-Reuse existing ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT
-
-  * slink:VkGeneratedCommandsInfoNV::pname:preprocessBuffer
-  * slink:VkGeneratedCommandsInfoNV::pname:sequencesCountBuffer
-  * slink:VkGeneratedCommandsInfoNV::pname:sequencesIndexBuffer
-  * slink:VkIndirectCommandsStreamNV::pname:buffer
-
-12) In which pipeline stage does the device generated command expansion
-happen?
-
-flink:vkCmdPreprocessGeneratedCommandsNV is treated as if it occurs in a
-separate logical pipeline from either graphics or compute, and that pipeline
-only includes ename:VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, a new stage
-ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV, and
-ename:VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT.
-This new stage has two corresponding new access types,
-ename:VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV and
-ename:VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV, used to synchronize reading
-the buffer inputs and writing the preprocess memory output.
-
-The generated output written in the preprocess buffer memory by
-flink:vkCmdExecuteGeneratedCommandsNV is considered to be consumed by the
-ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT pipeline stage.
-
-Thus, to synchronize from writing the input buffers to preprocessing via
-flink:vkCmdPreprocessGeneratedCommandsNV, use:
-
-  * pname:dstStageMask = ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV
-  * pname:dstAccessMask = ename:VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV
-
-To synchronize from flink:vkCmdPreprocessGeneratedCommandsNV to executing
-the generated commands by flink:vkCmdExecuteGeneratedCommandsNV, use:
-
-  * pname:srcStageMask = ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV
-  * pname:srcAccessMask = ename:VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV
-  * pname:dstStageMask = ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
-  * pname:dstAccessMask = ename:VK_ACCESS_INDIRECT_COMMAND_READ_BIT
-
-When flink:vkCmdExecuteGeneratedCommandsNV is used with a
-pname:isPreprocessed of `VK_FALSE`, the generated commands are implicitly
-preprocessed, therefore one only needs to synchronize the inputs via:
-
-  * pname:dstStageMask = ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
-  * pname:dstAccessMask = ename:VK_ACCESS_INDIRECT_COMMAND_READ_BIT
-
-13) What if most token data is "`static`", but we frequently want to render
-a subsection?
-
-Added "`sequencesIndexBuffer`".
-This allows to easier sort and filter what should actually be executed.
-
-14) What are the changes compared to the previous NVX extension?
-
-  * Compute dispatch support was removed (was never implemented in drivers).
-    There are different approaches how dispatching from the device should
-    work, hence we defer this to a future extension.
-  * The `ObjectTableNVX` was replaced by using physical buffer addresses and
-    introducing Shader Groups for the graphics pipeline.
-  * Less state changes are possible overall, but the important operations
-    are still there (reduces complexity of implementation).
-  * The API was redesigned so all inputs must be passed at both
-    preprocessing and execution time (this was implicit in NVX, now it is
-    explicit)
-  * The reservation of intermediate command space is now mandatory and
-    explicit through a preprocess buffer.
-  * The elink:VkIndirectStateFlagBitsNV were introduced
-
-15) When porting from other APIs, their indirect buffers may use different
-    enums, for example for index buffer types.
-    How to solve this?
-
-Added "`pIndexTypeValues`" to map custom `uint32_t` values to corresponding
-ename:VkIndexType.
-
-16) Do we need more shader group state overrides?
-
-The NVX version allowed all PSO states to be different, however as the goal
-is not to replace all state setup, but focus on highly-frequent state
-changes for drawing lots of objects, we reduced the amount of state
-overrides.
-Especially VkPipelineLayout as well as VkRenderPass configuration should be
-left static, the rest is still open for discussion.
-
-The current focus is just to allow VertexInput changes as well as shaders,
-while all shader groups use the same shader stages.
-
-Too much flexibility will increase the test coverage requirement as well.
-However, further extensions could allow more dynamic state as well.
-
-17) Do we need more detailed physical device feature queries/enables?
-
-An EXT version would need detailed implementor feedback to come up with a
-good set of features.
-Please contact us if you are interested, we are happy to make more features
-optional, or add further restrictions to reduce the minimum feature set of
-an EXT.
-
-18) Is there an interaction with VK_KHR_pipeline_library planned?
-
-Yes, a future version of this extension will detail the interaction, once
-VK_KHR_pipeline_library is no longer provisional.
-
-=== Example Code
-
-Open-Source samples illustrating the usage of the extension can be found at
-the following location (may not yet exist at time of writing):
-
-https://github.com/nvpro-samples/vk_device_generated_cmds
-
-
-=== Version History
-
- * Revision 1, 2020-02-20 (Christoph Kubisch)
-   - Initial version
- * Revision 2, 2020-03-09 (Christoph Kubisch)
-   - Remove VK_EXT_debug_report interactions
- * Revision 3, 2020-03-09 (Christoph Kubisch)
-    - Fix naming VkPhysicalDeviceGenerated to
-      VkPhysicalDeviceDeviceGenerated
diff --git a/registry/vulkan/appendices/VK_NV_external_memory.txt b/registry/vulkan/appendices/VK_NV_external_memory.txt
deleted file mode 100644
index d7db4fe..0000000
--- a/registry/vulkan/appendices/VK_NV_external_memory.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (c) 2016-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_external_memory.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-08-19
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - James Jones, NVIDIA
-  - Carsten Rohde, NVIDIA
-
-=== Description
-
-Applications may wish to export memory to other Vulkan instances or other
-APIs, or import memory from other Vulkan instances or other APIs to enable
-Vulkan workloads to be split up across application module, process, or API
-boundaries.
-This extension enables applications to create exportable Vulkan memory
-objects such that the underlying resources can be referenced outside the
-Vulkan instance that created them.
-
-include::{generated}/interfaces/VK_NV_external_memory.txt[]
-
-=== Issues
-
-1) If memory objects are shared between processes and APIs, is this
-considered aliasing according to the rules outlined in the
-<<resources-memory-aliasing,Memory Aliasing>> section?
-
-*RESOLVED*: Yes, but strict exceptions to the rules are added to allow some
-forms of aliasing in these cases.
-Further, other extensions may build upon these new aliasing rules to define
-specific support usage within Vulkan for imported native memory objects, or
-memory objects from other APIs.
-
-2) Are new image layouts or metadata required to specify image layouts and
-layout transitions compatible with non-Vulkan APIs, or with other instances
-of the same Vulkan driver?
-
-*RESOLVED*: No.
-Separate instances of the same Vulkan driver running on the same GPU should
-have identical internal layout semantics, so applictions have the tools they
-need to ensure views of images are consistent between the two instances.
-Other APIs will fall into two categories: Those that are Vulkan compatible
-(a term to be defined by subsequent interopability extensions), or Vulkan
-incompatible.
-When sharing images with Vulkan incompatible APIs, the Vulkan image must be
-transitioned to the ename:VK_IMAGE_LAYOUT_GENERAL layout before handing it
-off to the external API.
-
-Note this does not attempt to address cross-device transitions, nor
-transitions to engines on the same device which are not visible within the
-Vulkan API.
-Both of these are beyond the scope of this extension.
-
-=== Examples
-
-[source,c++]
-----------------------------------------
-
-    // TODO: Write some sample code here.
-
-----------------------------------------
-
-=== Version History
-
-  * Revision 1, 2016-08-19 (James Jones)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_NV_external_memory_capabilities.txt b/registry/vulkan/appendices/VK_NV_external_memory_capabilities.txt
deleted file mode 100644
index bd9629d..0000000
--- a/registry/vulkan/appendices/VK_NV_external_memory_capabilities.txt
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (c) 2016-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_external_memory_capabilities.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-08-19
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - Interacts with Vulkan 1.1.
-  - Interacts with `apiext:VK_KHR_dedicated_allocation`.
-  - Interacts with `apiext:VK_NV_dedicated_allocation`.
-*Contributors*::
-  - James Jones, NVIDIA
-
-=== Description
-
-Applications may wish to import memory from the Direct 3D API, or export
-memory to other Vulkan instances.
-This extension provides a set of capability queries that allow applications
-determine what types of win32 memory handles an implementation supports for
-a given set of use cases.
-
-include::{generated}/interfaces/VK_NV_external_memory_capabilities.txt[]
-
-=== Issues
-
-1) Why do so many external memory capabilities need to be queried on a
-per-memory-handle-type basis?
-
-*RESOLVED*: This is because some handle types are based on OS-native objects
-that have far more limited capabilities than the very generic Vulkan memory
-objects.
-Not all memory handle types can name memory objects that support 3D images,
-for example.
-Some handle types cannot even support the deferred image and memory binding
-behavior of Vulkan and require specifying the image when allocating or
-importing the memory object.
-
-2) Does the slink:VkExternalImageFormatPropertiesNV struct need to include a
-list of memory type bits that support the given handle type?
-
-*RESOLVED*: No.
-The memory types that do not support the handle types will simply be
-filtered out of the results returned by flink:vkGetImageMemoryRequirements
-when a set of handle types was specified at image creation time.
-
-3) Should the non-opaque handle types be moved to their own extension?
-
-*RESOLVED*: Perhaps.
-However, defining the handle type bits does very little and does not require
-any platform-specific types on its own, and it is easier to maintain the
-bitmask values in a single extension for now.
-Presumably more handle types could be added by separate extensions though,
-and it would be midly weird to have some platform-specific ones defined in
-the core spec and some in extensions
-
-=== Version History
-
- * Revision 1, 2016-08-19 (James Jones)
-   - Initial version
diff --git a/registry/vulkan/appendices/VK_NV_external_memory_rdma.txt b/registry/vulkan/appendices/VK_NV_external_memory_rdma.txt
deleted file mode 100644
index 761d7e5..0000000
--- a/registry/vulkan/appendices/VK_NV_external_memory_rdma.txt
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (c) 2016-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_external_memory_rdma.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-04-19
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Carsten Rohde, NVIDIA
-
-=== Description
-
-This extension adds support for allocating memory which can be used for
-remote direct memory access (RDMA) from other devices.
-
-include::{generated}/interfaces/VK_NV_external_memory_rdma.txt[]
-
-=== Issues
-
-
-=== Examples
-
-[source,cpp]
-----
-
-VkPhysicalDeviceMemoryBudgetPropertiesEXT memoryBudgetProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT };
-VkPhysicalDeviceMemoryProperties2 memoryProperties2 = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2, &memoryBudgetProperties };
-vkGetPhysicalDeviceMemoryProperties2(physicalDevice, &memoryProperties2);
-uint32_t heapIndex = (uint32_t)-1;
-for (uint32_t memoryType = 0; memoryType < memoryProperties2.memoryProperties.memoryTypeCount; memoryType++) {
-    if (memoryProperties2.memoryProperties.memoryTypes[memoryType].propertyFlags & VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV) {
-        heapIndex = memoryProperties2.memoryProperties.memoryTypes[memoryType].heapIndex;
-        break;
-    }
-}
-if ((heapIndex == (uint32_t)-1) ||
-    (memoryBudgetProperties.heapBudget[heapIndex] < size)) {
-    return;
-}
-
-VkPhysicalDeviceExternalBufferInfo externalBufferInfo = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO };
-externalBufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
-externalBufferInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV;
-
-VkExternalBufferProperties externalBufferProperties = { VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES };
-vkGetPhysicalDeviceExternalBufferProperties(physicalDevice, &externalBufferInfo, &externalBufferProperties);
-
-if (!(externalBufferProperties.externalMemoryProperties.externalMemoryFeatures & VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT)) {
-    return;
-}
-
-VkExternalMemoryBufferCreateInfo externalMemoryBufferCreateInfo = { VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO };
-externalMemoryBufferCreateInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV;
-
-VkBufferCreateInfo bufferCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, &externalMemoryBufferCreateInfo };
-bufferCreateInfo.size = size;
-bufferCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
-
-VkMemoryRequirements mem_reqs;
-vkCreateBuffer(device, &bufferCreateInfo, NULL, &buffer);
-vkGetBufferMemoryRequirements(device, buffer, &mem_reqs);
-
-VkExportMemoryAllocateInfo exportMemoryAllocateInfo = { VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO };
-exportMemoryAllocateInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV;
-
-// Find memory type index
-uint32_t i = 0;
-for (; i < VK_MAX_MEMORY_TYPES; i++) {
-    if ((mem_reqs.memoryTypeBits & (1 << i)) &&
-        (memoryProperties.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV)) {
-        break;
-    }
-}
-
-VkMemoryAllocateInfo memAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, &exportMemoryAllocateInfo };
-memAllocInfo.allocationSize = mem_reqs.size;
-memAllocInfo.memoryTypeIndex = i;
-
-vkAllocateMemory(device, &memAllocInfo, NULL, &mem);
-vkBindBufferMemory(device, buffer, mem, 0);
-
-VkMemoryGetRemoteAddressInfoNV getMemoryRemoteAddressInfo = { VK_STRUCTURE_TYPE_MEMORY_GET_REMOTE_ADDRESS_INFO_NV };
-getMemoryRemoteAddressInfo.memory = mem;
-getMemoryRemoteAddressInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV;
-
-VkRemoteAddressNV rdmaAddress;
-vkGetMemoryRemoteAddressNV(device, &getMemoryRemoteAddressInfo, &rdmaAddress);
-// address returned in 'rdmaAddress' can be used by external devices to initiate RDMA transfers
-
-----
-
-=== Version History
-
-  * Revision 1, 2020-12-15 (Carsten Rohde)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_external_memory_win32.txt b/registry/vulkan/appendices/VK_NV_external_memory_win32.txt
deleted file mode 100644
index febfc34..0000000
--- a/registry/vulkan/appendices/VK_NV_external_memory_win32.txt
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright (c) 2016-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_external_memory_win32.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-08-19
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - James Jones, NVIDIA
-  - Carsten Rohde, NVIDIA
-
-=== Description
-
-Applications may wish to export memory to other Vulkan instances or other
-APIs, or import memory from other Vulkan instances or other APIs to enable
-Vulkan workloads to be split up across application module, process, or API
-boundaries.
-This extension enables win32 applications to export win32 handles from
-Vulkan memory objects such that the underlying resources can be referenced
-outside the Vulkan instance that created them, and import win32 handles
-created in the Direct3D API to Vulkan memory objects.
-
-include::{generated}/interfaces/VK_NV_external_memory_win32.txt[]
-
-=== Issues
-
-1) If memory objects are shared between processes and APIs, is this
-considered aliasing according to the rules outlined in the
-<<resources-memory-aliasing,Memory Aliasing>> section?
-
-*RESOLVED*: Yes, but strict exceptions to the rules are added to allow some
-forms of aliasing in these cases.
-Further, other extensions may build upon these new aliasing rules to define
-specific support usage within Vulkan for imported native memory objects, or
-memory objects from other APIs.
-
-2) Are new image layouts or metadata required to specify image layouts and
-layout transitions compatible with non-Vulkan APIs, or with other instances
-of the same Vulkan driver?
-
-*RESOLVED*: No.
-Separate instances of the same Vulkan driver running on the same GPU should
-have identical internal layout semantics, so applictions have the tools they
-need to ensure views of images are consistent between the two instances.
-Other APIs will fall into two categories: Those that are Vulkan compatible
-(a term to be defined by subsequent interopability extensions), or Vulkan
-incompatible.
-When sharing images with Vulkan incompatible APIs, the Vulkan image must be
-transitioned to the ename:VK_IMAGE_LAYOUT_GENERAL layout before handing it
-off to the external API.
-
-Note this does not attempt to address cross-device transitions, nor
-transitions to engines on the same device which are not visible within the
-Vulkan API.
-Both of these are beyond the scope of this extension.
-
-3) Do applications need to call code:CloseHandle() on the values returned
-from flink:vkGetMemoryWin32HandleNV when pname:handleType is
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV?
-
-*RESOLVED*: Yes, unless it is passed back in to another driver instance to
-import the object.
-A successful get call transfers ownership of the handle to the application,
-while an import transfers ownership to the associated driver.
-Destroying the memory object will not destroy the handle or the handle's
-reference to the underlying memory resource.
-
-=== Examples
-
-[source,c++]
---------------------------------------
-
-    //
-    // Create an exportable memory object and export an external
-    // handle from it.
-    //
-
-    // Pick an external format and handle type.
-    static const VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
-    static const VkExternalMemoryHandleTypeFlagsNV handleType =
-        VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV;
-
-    extern VkPhysicalDevice physicalDevice;
-    extern VkDevice device;
-
-    VkPhysicalDeviceMemoryProperties memoryProperties;
-    VkExternalImageFormatPropertiesNV properties;
-    VkExternalMemoryImageCreateInfoNV externalMemoryImageCreateInfo;
-    VkDedicatedAllocationImageCreateInfoNV dedicatedImageCreateInfo;
-    VkImageCreateInfo imageCreateInfo;
-    VkImage image;
-    VkMemoryRequirements imageMemoryRequirements;
-    uint32_t numMemoryTypes;
-    uint32_t memoryType;
-    VkExportMemoryAllocateInfoNV exportMemoryAllocateInfo;
-    VkDedicatedAllocationMemoryAllocateInfoNV dedicatedAllocationInfo;
-    VkMemoryAllocateInfo memoryAllocateInfo;
-    VkDeviceMemory memory;
-    VkResult result;
-    HANDLE memoryHnd;
-
-    // Figure out how many memory types the device supports
-    vkGetPhysicalDeviceMemoryProperties(physicalDevice,
-                                        &memoryProperties);
-    numMemoryTypes = memoryProperties.memoryTypeCount;
-
-    // Check the external handle type capabilities for the chosen format
-    // Exportable 2D image support with at least 1 mip level, 1 array
-    // layer, and VK_SAMPLE_COUNT_1_BIT using optimal tiling and supporting
-    // texturing and color rendering is required.
-    result = vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
-        physicalDevice,
-        format,
-        VK_IMAGE_TYPE_2D,
-        VK_IMAGE_TILING_OPTIMAL,
-        VK_IMAGE_USAGE_SAMPLED_BIT |
-        VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
-        0,
-        handleType,
-        &properties);
-
-    if ((result != VK_SUCCESS) ||
-        !(properties.externalMemoryFeatures &
-          VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV)) {
-        abort();
-    }
-
-    // Set up the external memory image creation info
-    memset(&externalMemoryImageCreateInfo,
-           0, sizeof(externalMemoryImageCreateInfo));
-    externalMemoryImageCreateInfo.sType =
-        VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV;
-    externalMemoryImageCreateInfo.handleTypes = handleType;
-    if (properties.externalMemoryFeatures &
-        VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV) {
-        memset(&dedicatedImageCreateInfo, 0, sizeof(dedicatedImageCreateInfo));
-        dedicatedImageCreateInfo.sType =
-            VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV;
-        dedicatedImageCreateInfo.dedicatedAllocation = VK_TRUE;
-        externalMemoryImageCreateInfo.pNext = &dedicatedImageCreateInfo;
-    }
-    // Set up the  core image creation info
-    memset(&imageCreateInfo, 0, sizeof(imageCreateInfo));
-    imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
-    imageCreateInfo.pNext = &externalMemoryImageCreateInfo;
-    imageCreateInfo.format = format;
-    imageCreateInfo.extent.width = 64;
-    imageCreateInfo.extent.height = 64;
-    imageCreateInfo.extent.depth = 1;
-    imageCreateInfo.mipLevels = 1;
-    imageCreateInfo.arrayLayers = 1;
-    imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
-    imageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
-    imageCreateInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
-        VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
-    imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
-    imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
-
-    vkCreateImage(device, &imageCreateInfo, NULL, &image);
-
-    vkGetImageMemoryRequirements(device,
-                                 image,
-                                 &imageMemoryRequirements);
-
-    // For simplicity, just pick the first compatible memory type.
-    for (memoryType = 0; memoryType < numMemoryTypes; memoryType++) {
-        if ((1 << memoryType) & imageMemoryRequirements.memoryTypeBits) {
-            break;
-        }
-    }
-
-    // At least one memory type must be supported given the prior external
-    // handle capability check.
-    assert(memoryType < numMemoryTypes);
-
-    // Allocate the external memory object.
-    memset(&exportMemoryAllocateInfo, 0, sizeof(exportMemoryAllocateInfo));
-    exportMemoryAllocateInfo.sType =
-        VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV;
-    exportMemoryAllocateInfo.handleTypes = handleType;
-    if (properties.externalMemoryFeatures &
-        VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV) {
-        memset(&dedicatedAllocationInfo, 0, sizeof(dedicatedAllocationInfo));
-        dedicatedAllocationInfo.sType =
-            VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
-        dedicatedAllocationInfo.image = image;
-        exportMemoryAllocateInfo.pNext = &dedicatedAllocationInfo;
-    }
-    memset(&memoryAllocateInfo, 0, sizeof(memoryAllocateInfo));
-    memoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
-    memoryAllocateInfo.pNext = &exportMemoryAllocateInfo;
-    memoryAllocateInfo.allocationSize = imageMemoryRequirements.size;
-    memoryAllocateInfo.memoryTypeIndex = memoryType;
-
-    vkAllocateMemory(device, &memoryAllocateInfo, NULL, &memory);
-
-    if (!(properties.externalMemoryFeatures &
-          VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV)) {
-        vkBindImageMemory(device, image, memory, 0);
-    }
-
-    // Get the external memory opaque FD handle
-    vkGetMemoryWin32HandleNV(device, memory, &memoryHnd);
-
---------------------------------------
-
-=== Version History
-
-  * Revision 1, 2016-08-11 (James Jones)
-    - Initial draft
diff --git a/registry/vulkan/appendices/VK_NV_fill_rectangle.txt b/registry/vulkan/appendices/VK_NV_fill_rectangle.txt
deleted file mode 100644
index ebc978a..0000000
--- a/registry/vulkan/appendices/VK_NV_fill_rectangle.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2016-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_fill_rectangle.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-05-22
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension adds a new elink:VkPolygonMode code:enum where a triangle is
-rasterized by computing and filling its axis-aligned screen-space bounding
-box, disregarding the actual triangle edges.
-This can be useful for drawing a rectangle without being split into two
-triangles with an internal edge.
-It is also useful to minimize the number of primitives that need to be
-drawn, particularly for a user interface.
-
-include::{generated}/interfaces/VK_NV_fill_rectangle.txt[]
-
-=== Version History
-
-  * Revision 1, 2017-05-22 (Jeff Bolz)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_fragment_coverage_to_color.txt b/registry/vulkan/appendices/VK_NV_fragment_coverage_to_color.txt
deleted file mode 100644
index 1fd7254..0000000
--- a/registry/vulkan/appendices/VK_NV_fragment_coverage_to_color.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2017-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_fragment_coverage_to_color.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-05-21
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension allows the fragment coverage value, represented as an integer
-bitmask, to be substituted for a color output being written to a
-single-component color attachment with integer components (e.g.
-ename:VK_FORMAT_R8_UINT).
-The functionality provided by this extension is different from simply
-writing the code:SampleMask fragment shader output, in that the coverage
-value written to the framebuffer is taken after stencil test and depth test,
-as well as after fragment operations such as alpha-to-coverage.
-
-This functionality may be useful for deferred rendering algorithms, where
-the second pass needs to know which samples belong to which original
-fragments.
-
-include::{generated}/interfaces/VK_NV_fragment_coverage_to_color.txt[]
-
-=== Version History
-
-  * Revision 1, 2017-05-21 (Jeff Bolz)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_fragment_shader_barycentric.txt b/registry/vulkan/appendices/VK_NV_fragment_shader_barycentric.txt
deleted file mode 100644
index b66d16b..0000000
--- a/registry/vulkan/appendices/VK_NV_fragment_shader_barycentric.txt
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_fragment_shader_barycentric.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-08-03
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/NV/SPV_NV_fragment_shader_barycentric.html[`SPV_NV_fragment_shader_barycentric`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_fragment_shader_barycentric.txt[`GL_NV_fragment_shader_barycentric`]
-*Contributors*::
-  - Pat Brown, NVIDIA
-  - Daniel Koch, NVIDIA
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * {spirv}/NV/SPV_NV_fragment_shader_barycentric.html[`SPV_NV_fragment_shader_barycentric`]
-
-The extension provides access to three additional fragment shader variable
-decorations in SPIR-V:
-
-  * code:PerVertexNV, which indicates that a fragment shader input will not
-    have interpolated values, but instead must be accessed with an extra
-    array index that identifies one of the vertices of the primitive
-    producing the fragment
-  * code:BaryCoordNV, which indicates that the variable is a three-component
-    floating-point vector holding barycentric weights for the fragment
-    produced using perspective interpolation
-  * code:BaryCoordNoPerspNV, which indicates that the variable is a
-    three-component floating-point vector holding barycentric weights for
-    the fragment produced using linear interpolation
-
-When using GLSL source-based shader languages, the following variables from
-`GL_NV_fragment_shader_barycentric` maps to these SPIR-V built-in
-decorations:
-
-  * `in vec3 gl_BaryCoordNV;` -> code:BaryCoordNV
-  * `in vec3 gl_BaryCoordNoPerspNV;` -> code:BaryCoordNoPerspNV
-
-GLSL variables declared using the code:__pervertexNV GLSL qualifier are
-expected to be decorated with code:PerVertexNV in SPIR-V.
-
-include::{generated}/interfaces/VK_NV_fragment_shader_barycentric.txt[]
-
-=== New Built-In Variables
-
-  * <<interfaces-builtin-variables-barycoordnv,code:BaryCoordNV>>
-  * <<interfaces-builtin-variables-barycoordnoperspnv,code:BaryCoordNoPerspNV>>
-
-=== New SPIR-V Decorations
-
-  * <<shaders-interpolation-decorations-pervertexnv,code:PerVertexNV>>
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-FragmentBarycentricNV,code:FragmentBarycentricNV>>
-
-=== Issues
-
-(1) The AMD_shader_explicit_vertex_parameter extension provides similar
-    functionality.
-    Why write a new extension, and how is this extension different?
-
-*RESOLVED*: For the purposes of Vulkan/SPIR-V, we chose to implement a
-separate extension due to several functional differences.
-
-First, the hardware supporting this extension can provide a three-component
-barycentric weight vector for variables decorated with code:BaryCoordNV,
-while variables decorated with code:BaryCoordSmoothAMD provide only two
-components.
-In some cases, it may be more efficient to explicitly interpolate an
-attribute via:
-
-        float value = (baryCoordNV.x * v[0].attrib +
-                       baryCoordNV.y * v[1].attrib +
-                       baryCoordNV.z * v[2].attrib);
-
-instead of
-
-       float value = (baryCoordSmoothAMD.x * (v[0].attrib - v[2].attrib) +
-                      baryCoordSmoothAMD.y * (v[1].attrib - v[2].attrib) +
-                      v[2].attrib);
-
-Additionally, the semantics of the decoration code:BaryCoordPullModelAMD do
-not appear to map to anything supported by the initial hardware
-implementation of this extension.
-
-This extension provides a smaller number of decorations than the AMD
-extension, as we expect that shaders could derive variables decorated with
-things like code:BaryCoordNoPerspCentroidAMD with explicit attribute
-interpolation instructions.
-One other relevant difference is that explicit per-vertex attribute access
-using this extension does not require a constant vertex number.
-
-(2) Why do the built-in SPIR-V decorations for this extension include two
-separate built-ins code:BaryCoordNV and code:BaryCoordNoPerspNV when a "`no
-perspective`" variable could be decorated with code:BaryCoordNV and
-code:NoPerspective?
-
-*RESOLVED*: The SPIR-V extension for this feature chose to mirror the
-behavior of the GLSL extension, which provides two built-in variables.
-Additionally, it is not clear that its a good idea (or even legal) to have
-two variables using the "`same attribute`", but with different interpolation
-modifiers.
-
-=== Version History
-
-  * Revision 1, 2018-08-03 (Pat Brown)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_fragment_shading_rate_enums.txt b/registry/vulkan/appendices/VK_NV_fragment_shading_rate_enums.txt
deleted file mode 100644
index 7469ece..0000000
--- a/registry/vulkan/appendices/VK_NV_fragment_shading_rate_enums.txt
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (c) 2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_fragment_shading_rate_enums.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-09-02
-
-*Contributors*::
-  - Pat Brown, NVIDIA
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension builds on the fragment shading rate functionality provided by
-the VK_KHR_fragment_shading_rate extension, adding support for
-"`supersample`" fragment shading rates that trigger multiple fragment shader
-invocations per pixel as well as a "`no invocations`" shading rate that
-discards any portions of a primitive that would use that shading rate.
-
-include::{generated}/interfaces/VK_NV_fragment_shading_rate_enums.txt[]
-
-=== Issues
-
-. Why was this extension created?   How should it be named?
-+
---
-*RESOLVED*: The primary goal of this extension was to expose support for
-supersample and "`no invocations`" shading rates, which are supported by the
-VK_NV_shading_rate_image extension but not by VK_KHR_fragment_shading_rate.
-Because VK_KHR_fragment_shading_rate specifies the primitive shading rate
-using a fragment size in pixels, it lacks a good way to specify supersample
-rates.
-To deal with this, we defined enums covering shading rates supported by the
-KHR extension as well as the new shading rates and added structures and APIs
-accepting shading rate enums instead of fragment sizes.
-
-Since this extension adds two different types of shading rates, both
-expressed using enums, we chose the extension name
-VK_NV_fragment_shading_rate_enums.
---
-
-. Is this a standalone extension?
-+
---
-*RESOLVED*: No, this extension requires VK_KHR_fragment_shading_rate.
-In order to use the features of this extension, applications must enable the
-relevant features of KHR extension.
---
-
-. How are the shading rate enums used, and how were the enum values assigned?
-+
---
-*RESOLVED*: The shading rates supported by the enums in this extension are
-accepted as pipeline, primitive, and attachment shading rates and behave
-identically.
-For the shading rates also supported by the KHR extension, the values
-assigned to the corresponding enums are identical to the values already used
-for the primitive and attachment shading rates in the KHR extension.
-For those enums, bits 0 and 1 specify the base two logarithm of the fragment
-height and bits 2 and 3 specify the base two logarithm of the fragment
-width.
-For the new shading rates added by this extension, we chose to use 11
-through 14 (10 plus the base two logarithm of the invocation count) for the
-supersample rates and 15 for the "`no invocations`" rate.
-None of those values are supported as primitive or attachment shading rates
-by the KHR extension.
---
-
-. Between this extension, VK_KHR_fragment_shading_rate, and
-VK_NV_shading_rate_image, there are three different ways to specify shading
-rate state in a pipeline.
-How should we handle this?
-+
---
-*RESOLVED*: We do not allow the concurrent use of VK_NV_shading_rate_image
-and VK_KHR_fragment_shading_rate; it is an error to enable shading rate
-features from both extensions.
-But we do allow applications to enable this extension together with
-VK_KHR_fragment_shading_rate together.
-While we expect that applications will never attach pipeline CreateInfo
-structures for both this extension and the KHR extension concurrently,
-Vulkan does not have any precedent forbidding such behavior and instead
-typically treats a pipeline created without an extension-specific CreateInfo
-structure as equivalent to one containing default values specified by the
-extension.
-Rather than adding such a rule considering the presence or absence of our
-new CreateInfo structure, we instead included a pname:shadingRateType member
-to slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV that selects
-between using state specified by that structure and state specified by
-slink:VkPipelineFragmentShadingRateStateCreateInfoKHR.
---
-
-=== Version History
-
-  * Revision 1, 2020-09-02 (pbrown)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_framebuffer_mixed_samples.txt b/registry/vulkan/appendices/VK_NV_framebuffer_mixed_samples.txt
deleted file mode 100644
index 12927a1..0000000
--- a/registry/vulkan/appendices/VK_NV_framebuffer_mixed_samples.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) 2017-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_framebuffer_mixed_samples.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-06-04
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension allows multisample rendering with a raster and depth/stencil
-sample count that is larger than the color sample count.
-Rasterization and the results of the depth and stencil tests together
-determine the portion of a pixel that is "`covered`".
-It can be useful to evaluate coverage at a higher frequency than color
-samples are stored.
-This coverage is then "`reduced`" to a collection of covered color samples,
-each having an opacity value corresponding to the fraction of the color
-sample covered.
-The opacity can optionally be blended into individual color samples.
-
-Rendering with fewer color samples than depth/stencil samples greatly
-reduces the amount of memory and bandwidth consumed by the color buffer.
-However, converting the coverage values into opacity introduces artifacts
-where triangles share edges and may: not be suitable for normal triangle
-mesh rendering.
-
-One expected use case for this functionality is Stencil-then-Cover path
-rendering (similar to the OpenGL GL_NV_path_rendering extension).
-The stencil step determines the coverage (in the stencil buffer) for an
-entire path at the higher sample frequency, and then the cover step draws
-the path into the lower frequency color buffer using the coverage
-information to antialias path edges.
-With this two-step process, internal edges are fully covered when
-antialiasing is applied and there is no corruption on these edges.
-
-The key features of this extension are:
-
-  * It allows render pass and framebuffer objects to be created where the
-    number of samples in the depth/stencil attachment in a subpass is a
-    multiple of the number of samples in the color attachments in the
-    subpass.
-  * A coverage reduction step is added to Fragment Operations which converts
-    a set of covered raster/depth/stencil samples to a set of color samples
-    that perform blending and color writes.
-    The coverage reduction step also includes an optional coverage
-    modulation step, multiplying color values by a fractional opacity
-    corresponding to the number of associated raster/depth/stencil samples
-    covered.
-
-include::{generated}/interfaces/VK_NV_framebuffer_mixed_samples.txt[]
-
-=== Version History
-
-  * Revision 1, 2017-06-04 (Jeff Bolz)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_geometry_shader_passthrough.txt b/registry/vulkan/appendices/VK_NV_geometry_shader_passthrough.txt
deleted file mode 100644
index efb6654..0000000
--- a/registry/vulkan/appendices/VK_NV_geometry_shader_passthrough.txt
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright (c) 2017-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_geometry_shader_passthrough.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-02-15
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/NV/SPV_NV_geometry_shader_passthrough.html[`SPV_NV_geometry_shader_passthrough`]
-  - This extension provides API support for
-    https://www.khronos.org/registry/OpenGL/extensions/NV/NV_geometry_shader_passthrough.txt[`GL_NV_geometry_shader_passthrough`]
-  - This extension requires the pname:geometryShader feature.
-*Contributors*::
-  - Piers Daniell, NVIDIA
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * `SPV_NV_geometry_shader_passthrough`
-
-Geometry shaders provide the ability for applications to process each
-primitive sent through the graphics pipeline using a programmable shader.
-However, one common use case treats them largely as a "`passthrough`".
-In this use case, the bulk of the geometry shader code simply copies inputs
-from each vertex of the input primitive to corresponding outputs in the
-vertices of the output primitive.
-Such shaders might also compute values for additional built-in or
-user-defined per-primitive attributes (e.g., code:Layer) to be assigned to
-all the vertices of the output primitive.
-
-This extension provides access to the code:PassthroughNV decoration under
-the code:GeometryShaderPassthroughNV capability.
-Adding this to a geometry shader input variable specifies that the values of
-this input are copied to the corresponding vertex of the output primitive.
-
-When using GLSL source-based shading languages, the code:passthrough layout
-qualifier from `GL_NV_geometry_shader_passthrough` maps to the
-code:PassthroughNV decoration.
-To use the code:passthrough layout, in GLSL the
-`GL_NV_geometry_shader_passthrough` extension must be enabled.
-Behaviour is described in the `GL_NV_geometry_shader_passthrough` extension
-specification.
-
-include::{generated}/interfaces/VK_NV_geometry_shader_passthrough.txt[]
-
-=== New Variable Decoration
-
-  * <<geometry-passthrough-passthrough,code:PassthroughNV>> in
-    <<geometry-passthrough,Geometry Shader Passthrough>>
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-GeometryShaderPassthroughNV,GeometryShaderPassthroughNV>>
-
-=== Issues
-
-1) Should we require or allow a passthrough geometry shader to specify the
-output layout qualifiers for the output primitive type and maximum vertex
-count in the SPIR-V?
-
-*RESOLVED*: Yes they should be required in the SPIR-V.
-Per GL_NV_geometry_shader_passthrough they are not permitted in the GLSL
-source shader, but SPIR-V is lower-level.
-It is straightforward for the GLSL compiler to infer them from the input
-primitive type and to explicitly emit them in the SPIR-V according to the
-following table.
-
-[options="header"]
-|====
-| Input Layout     | Implied Output Layout
-| points           | `layout(points, max_vertices=1)`
-| lines            | `layout(line_strip, max_vertices=2)`
-| triangles        | `layout(triangle_strip, max_vertices=3)`
-|====
-
-2) How does interface matching work with passthrough geometry shaders?
-
-*RESOLVED*: This is described in <<geometry-passthrough-interface,
-Passthrough Interface Matching>>.
-In GL when using passthough geometry shaders in separable mode, all inputs
-must also be explicitly assigned location layout qualifiers.
-In Vulkan all SPIR-V shader inputs (except built-ins) must also have
-location decorations specified.
-Redeclarations of built-in varables that add the passthrough layout
-qualifier are exempted from the rule requiring location assignment because
-built-in variables do not have locations and are matched by code:BuiltIn
-decoration.
-
-
-=== Sample Code
-
-Consider the following simple geometry shader in unextended GLSL:
-
-[source,c]
----------------------------------------------------
-layout(triangles) in;
-layout(triangle_strip) out;
-layout(max_vertices=3) out;
-
-in Inputs {
-    vec2 texcoord;
-    vec4 baseColor;
-} v_in[];
-out Outputs {
-    vec2 texcoord;
-    vec4 baseColor;
-};
-
-void main()
-{
-    int layer = compute_layer();
-    for (int i = 0; i < 3; i++) {
-        gl_Position = gl_in[i].gl_Position;
-        texcoord = v_in[i].texcoord;
-        baseColor = v_in[i].baseColor;
-        gl_Layer = layer;
-        EmitVertex();
-    }
-}
----------------------------------------------------
-
-In this shader, the inputs code:gl_Position, code:Inputs.texcoord, and
-code:Inputs.baseColor are simply copied from the input vertex to the
-corresponding output vertex.
-The only "`interesting`" work done by the geometry shader is computing and
-emitting a code:gl_Layer value for the primitive.
-
-The following geometry shader, using this extension, is equivalent:
-
-[source,c]
----------------------------------------------------
-#extension GL_NV_geometry_shader_passthrough : require
-
-layout(triangles) in;
-// No output primitive layout qualifiers required.
-
-// Redeclare gl_PerVertex to pass through "gl_Position".
-layout(passthrough) in gl_PerVertex {
-    vec4 gl_Position;
-} gl_in[];
-
-// Declare "Inputs" with "passthrough" to automatically copy members.
-layout(passthrough) in Inputs {
-    vec2 texcoord;
-    vec4 baseColor;
-} v_in[];
-
-// No output block declaration required.
-
-void main()
-{
-    // The shader simply computes and writes gl_Layer.  We do not
-    // loop over three vertices or call EmitVertex().
-    gl_Layer = compute_layer();
-}
----------------------------------------------------
-
-
-=== Version History
-
-  * Revision 1, 2017-02-15 (Daniel Koch)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_glsl_shader.txt b/registry/vulkan/appendices/VK_NV_glsl_shader.txt
deleted file mode 100644
index 1e32997..0000000
--- a/registry/vulkan/appendices/VK_NV_glsl_shader.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2016-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_glsl_shader.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-02-14
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Piers Daniell, NVIDIA
-
-=== Description
-
-This extension allows GLSL shaders written to the `GL_KHR_vulkan_glsl`
-extension specification to be used instead of SPIR-V.
-The implementation will automatically detect whether the shader is SPIR-V or
-GLSL, and compile it appropriately.
-
-=== Deprecation
-
-Functionality in this extension is outside of the scope of Vulkan and is
-better served by a compiler library such as
-https://github.com/KhronosGroup/glslang[glslang].
-No new implementations will support this extension, so applications should:
-not use it.
-
-include::{generated}/interfaces/VK_NV_glsl_shader.txt[]
-
-=== Examples
-
-*Example 1*
-
-Passing in GLSL code
-
-[source,c++]
-----------------------------------------
-    char const vss[] =
-        "#version 450 core\n"
-        "layout(location = 0) in vec2 aVertex;\n"
-        "layout(location = 1) in vec4 aColor;\n"
-        "out vec4 vColor;\n"
-        "void main()\n"
-        "{\n"
-        "    vColor = aColor;\n"
-        "    gl_Position = vec4(aVertex, 0, 1);\n"
-        "}\n"
-    ;
-    VkShaderModuleCreateInfo vertexShaderInfo = { VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO };
-    vertexShaderInfo.codeSize = sizeof vss;
-    vertexShaderInfo.pCode = vss;
-    VkShaderModule vertexShader;
-    vkCreateShaderModule(device, &vertexShaderInfo, 0, &vertexShader);
-----------------------------------------
-
-=== Version History
-
- * Revision 1, 2016-02-14 (Piers Daniell)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_NV_inherited_viewport_scissor.txt b/registry/vulkan/appendices/VK_NV_inherited_viewport_scissor.txt
deleted file mode 100644
index 06bef17..0000000
--- a/registry/vulkan/appendices/VK_NV_inherited_viewport_scissor.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) 2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_inherited_viewport_scissor.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-02-04
-*Contributors*::
-  - David Zhao Akeley, NVIDIA
-  - Jeff Bolz, NVIDIA
-  - Piers Daniell, NVIDIA
-  - Christoph Kubisch, NVIDIA
-
-=== Description
-
-This extension adds the ability for a secondary command buffer to inherit
-the dynamic viewport and scissor state from a primary command buffer, or a
-previous secondary command buffer executed within the same
-flink:vkCmdExecuteCommands call.
-It addresses a frequent scenario in applications that deal with window
-resizing and want to improve utilization of re-usable secondary command
-buffers.
-The functionality is provided through
-slink:VkCommandBufferInheritanceViewportScissorInfoNV.
-Viewport inheritance is effectively limited to the 2D rectangle; secondary
-command buffers must re-specify the inherited depth range values.
-
-include::{generated}/interfaces/VK_NV_inherited_viewport_scissor.txt[]
-
-=== Issues
-
-(1) Why are viewport depth values configured in the
-slink:VkCommandBufferInheritanceViewportScissorInfoNV struct, rather than by
-a `vkCmd...` function?
---
-*DISCUSSION*:
-
-We considered both adding a new ftext:vkCmdSetViewportDepthNV function, and
-modifying flink:vkCmdSetViewport to ignore the pname:x, pname:y,
-pname:width, and pname:height values when called with a secondary command
-buffer that activates this extension.
-
-The primary design considerations for this extension are debuggability and
-easy integration into existing applications.
-The main issue with adding a new ftext:vkCmdSetViewportDepthNV function is
-reducing ease-of-integration.
-A new function pointer will have to be loaded, but more importantly, a new
-function would require changes to be supported in graphics debuggers; this
-would delay widespread adoption of the extension.
-
-The proposal to modify flink:vkCmdSetViewport would avoid these issues.
-However, we expect that the intent of applications using this extension is
-to have the viewport values used for drawing exactly match the inherited
-values; thus, it would be better for debuggability if no function for
-modifying the viewport depth alone is provided.
-By specifying viewport depth values when starting secondary command buffer
-recording, and requiring the specified depth values to match the inherited
-depth values, we allow for validation layers that flag depth changes as
-errors.
-
-This design also better matches the hardware model.
-In fact, there is no need to re-execute a depth-setting command.
-The graphics device retains the viewport depth state; it is the CPU-side
-state of slink:VkCommandBuffer that must be re-initialized.
---
-
-(2) Why are viewport depth values specified as a partial slink:VkViewport
-struct, rather than a leaner depth-only struct?
---
-*DISCUSSION*:
-
-We considered adding a new stext:VkViewportDepthNV struct containing only
-ptext:minDepth and ptext:maxDepth.
-However, as application developers would need to maintain both a
-`VK_NV_inherited_viewport_scissor` code path and a fallback code path (at
-least in the short term), we ultimately chose to continue using the existing
-slink:VkViewport structure.
-Doing so would allow application developers to reuse the same
-slink:VkViewport array for both code paths, rather than constructing
-separate stext:VkViewportDepthNV and slink:VkViewport arrays for each code
-path.
---
-
-=== Version History
-
-  * Revision 1, 2020-02-04 (David Zhao Akeley)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_mesh_shader.txt b/registry/vulkan/appendices/VK_NV_mesh_shader.txt
deleted file mode 100644
index 8b0c408..0000000
--- a/registry/vulkan/appendices/VK_NV_mesh_shader.txt
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_mesh_shader.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-07-19
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/NV/SPV_NV_mesh_shader.html[`SPV_NV_mesh_shader`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_mesh_shader.txt[`GLSL_NV_mesh_shader`]
-*Contributors*::
-  - Pat Brown, NVIDIA
-  - Jeff Bolz, NVIDIA
-  - Daniel Koch, NVIDIA
-  - Piers Daniell, NVIDIA
-  - Pierre Boudier, NVIDIA
-
-=== Description
-
-This extension provides a new mechanism allowing applications to generate
-collections of geometric primitives via programmable mesh shading.
-It is an alternative to the existing programmable primitive shading
-pipeline, which relied on generating input primitives by a fixed function
-assembler as well as fixed function vertex fetch.
-
-There are new programmable shader types -- the task and mesh shader -- to
-generate these collections to be processed by fixed-function primitive
-assembly and rasterization logic.
-When task and mesh shaders are dispatched, they replace the core
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization stages>>,
-including vertex array attribute fetching, vertex shader processing,
-tessellation, and geometry shader processing.
-
-This extension also adds support for the following SPIR-V extension in
-Vulkan:
-
-  * {spirv}/NV/SPV_NV_mesh_shader.html[`SPV_NV_mesh_shader`]
-
-include::{generated}/interfaces/VK_NV_mesh_shader.txt[]
-
-=== New or Modified Built-In Variables
-
-  * <<interfaces-builtin-variables-taskcount,TaskCountNV>>
-  * <<interfaces-builtin-variables-primitivecount,PrimitiveCountNV>>
-  * <<interfaces-builtin-variables-primitiveindices,PrimitiveIndicesNV>>
-  * <<interfaces-builtin-variables-clipdistancepv,ClipDistancePerViewNV>>
-  * <<interfaces-builtin-variables-culldistancepv,CullDistancePerViewNV>>
-  * <<interfaces-builtin-variables-layerpv,LayerPerViewNV>>
-  * <<interfaces-builtin-variables-meshviewcount,MeshViewCountNV>>
-  * <<interfaces-builtin-variables-meshviewindices,MeshViewIndicesNV>>
-  * (modified)code:Position
-  * (modified)code:PointSize
-  * (modified)code:ClipDistance
-  * (modified)code:CullDistance
-  * (modified)code:PrimitiveId
-  * (modified)code:Layer
-  * (modified)code:ViewportIndex
-  * (modified)code:WorkgroupSize
-  * (modified)code:WorkgroupId
-  * (modified)code:LocalInvocationId
-  * (modified)code:GlobalInvocationId
-  * (modified)code:LocalInvocationIndex
-  * (modified)code:DrawIndex
-  * (modified)code:ViewportMaskNV
-  * (modified)code:PositionPerViewNV
-  * (modified)code:ViewportMaskPerViewNV
-
-=== New SPIR-V Capability
-
-  * <<spirvenv-capabilities-table-MeshShadingNV,MeshShadingNV>>
-
-=== Issues
-
-. How to name this extension?
-+
---
-*RESOLVED*: VK_NV_mesh_shader
-
-Other options considered:
-
-  * VK_NV_mesh_shading
-  * VK_NV_programmable_mesh_shading
-  * VK_NV_primitive_group_shading
-  * VK_NV_grouped_drawing
---
-
-. Do we need a new VkPrimitiveTopology?
-+
---
-*RESOLVED*: No.
-We skip the InputAssembler stage.
---
-
-. Should we allow Instancing?
-+
---
-*RESOLVED*: No.
-There is no fixed function input, other than the IDs.
-However, allow offsetting with a "`first`" value.
---
-
-. Should we use existing vkCmdDraw or introduce new functions?
-+
---
-*RESOLVED*: Introduce new functions.
-
-New functions make it easier to separate from "`programmable primitive
-shading`" chapter, less "`dual use`" language about existing functions
-having alternative behavior.
-The text around the existing "`draws`" is heavily based around emitting
-vertices.
---
-
-. If new functions, how to name?
-+
---
-*RESOLVED*: CmdDrawMeshTasks*
-
-Other options considered:
-
-  * CmdDrawMeshed
-  * CmdDrawTasked
-  * CmdDrawGrouped
---
-
-. Should VK_SHADER_STAGE_ALL_GRAPHICS be updated to include the new stages?
-+
---
-*RESOLVED*: No.
-If an application were to be recompiled with headers that include additional
-shader stage bits in VK_SHADER_STAGE_ALL_GRAPHICS, then the previously valid
-application would no longer be valid on implementations that do not support
-mesh or task shaders.
-This means the change would not be backwards compatible.
-It is too bad VkShaderStageFlagBits does not have a dedicated "`all
-supported graphics stages`" bit like VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
-which would have avoided this problem.
---
-
-=== Version History
-
-  * Revision 1, 2018-07-19 (Christoph Kubisch, Daniel Koch)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_ray_tracing.txt b/registry/vulkan/appendices/VK_NV_ray_tracing.txt
deleted file mode 100644
index f6ba2b4..0000000
--- a/registry/vulkan/appendices/VK_NV_ray_tracing.txt
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_ray_tracing.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-11-20
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/NV/SPV_NV_ray_tracing.html[`SPV_NV_ray_tracing`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_ray_tracing.txt[`GL_NV_ray_tracing`]
-*Contributors*::
-  - Eric Werness, NVIDIA
-  - Ashwin Lele, NVIDIA
-  - Robert Stepinski, NVIDIA
-  - Nuno Subtil, NVIDIA
-  - Christoph Kubisch, NVIDIA
-  - Martin Stich, NVIDIA
-  - Daniel Koch, NVIDIA
-  - Jeff Bolz, NVIDIA
-  - Joshua Barczak, Intel
-  - Tobias Hector, AMD
-  - Henrik Rydgard, NVIDIA
-  - Pascal Gautron, NVIDIA
-
-=== Description
-
-Rasterization has been the dominant method to produce interactive graphics,
-but increasing performance of graphics hardware has made ray tracing a
-viable option for interactive rendering.
-Being able to integrate ray tracing with traditional rasterization makes it
-easier for applications to incrementally add ray traced effects to existing
-applications or to do hybrid approaches with rasterization for primary
-visibility and ray tracing for secondary queries.
-
-To enable ray tracing, this extension adds a few different categories of new
-functionality:
-
-  * Acceleration structure objects and build commands
-  * A new pipeline type with new shader domains
-  * An indirection table to link shader groups with acceleration structure
-    items
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * `SPV_NV_ray_tracing`
-
-include::{generated}/interfaces/VK_NV_ray_tracing.txt[]
-
-=== New or Modified Built-In Variables
-
-  * <<interfaces-builtin-variables-launchid,code:LaunchIdNV>>
-  * <<interfaces-builtin-variables-launchsize,code:LaunchSizeNV>>
-  * <<interfaces-builtin-variables-worldrayorigin,code:WorldRayOriginNV>>
-  * <<interfaces-builtin-variables-worldraydirection,code:WorldRayDirectionNV>>
-  * <<interfaces-builtin-variables-objectrayorigin,code:ObjectRayOriginNV>>
-  * <<interfaces-builtin-variables-objectraydirection,code:ObjectRayDirectionNV>>
-  * <<interfaces-builtin-variables-raytmin,code:RayTminNV>>
-  * <<interfaces-builtin-variables-raytmax,code:RayTmaxNV>>
-  * <<interfaces-builtin-variables-instancecustomindex,code:InstanceCustomIndexNV>>
-  * <<interfaces-builtin-variables-instanceid,code:InstanceId>>
-  * <<interfaces-builtin-variables-objecttoworld,code:ObjectToWorldNV>>
-  * <<interfaces-builtin-variables-worldtoobject,code:WorldToObjectNV>>
-  * <<interfaces-builtin-variables-hitt,code:HitTNV>>
-  * <<interfaces-builtin-variables-hitkind,code:HitKindNV>>
-  * <<interfaces-builtin-variables-incomingrayflags,code:IncomingRayFlagsNV>>
-  * (modified)code:PrimitiveId
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-RayTracingNV,RayTracingNV>>
-
-=== Issues
-
-1) Are there issues?
-
-*RESOLVED*: Yes.
-
-=== Sample Code
-
-Example ray generation GLSL shader
-
-[source,c]
----------------------------------------------------
-#version 450 core
-#extension GL_NV_ray_tracing : require
-layout(set = 0, binding = 0, rgba8) uniform image2D image;
-layout(set = 0, binding = 1) uniform accelerationStructureNV as;
-layout(location = 0) rayPayloadNV float payload;
-
-void main()
-{
-   vec4 col = vec4(0, 0, 0, 1);
-
-   vec3 origin = vec3(float(gl_LaunchIDNV.x)/float(gl_LaunchSizeNV.x), float(gl_LaunchIDNV.y)/float(gl_LaunchSizeNV.y), 1.0);
-   vec3 dir = vec3(0.0, 0.0, -1.0);
-
-   traceNV(as, 0, 0xff, 0, 1, 0, origin, 0.0, dir, 1000.0, 0);
-
-   col.y = payload;
-
-   imageStore(image, ivec2(gl_LaunchIDNV.xy), col);
-}
----------------------------------------------------
-
-=== Version History
-
-  * Revision 1, 2018-09-11 (Robert Stepinski, Nuno Subtil, Eric Werness)
-    - Internal revisions
-  * Revision 2, 2018-10-19 (Eric Werness)
-    - rename to VK_NV_ray_tracing, add support for callables.
-    - too many updates to list
-  * Revision 3, 2018-11-20 (Daniel Koch)
-    - update to use InstanceId instead of InstanceIndex as implemented.
diff --git a/registry/vulkan/appendices/VK_NV_ray_tracing_motion_blur.txt b/registry/vulkan/appendices/VK_NV_ray_tracing_motion_blur.txt
deleted file mode 100755
index 3dd8d66..0000000
--- a/registry/vulkan/appendices/VK_NV_ray_tracing_motion_blur.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2021 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_ray_tracing_motion_blur.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-06-16
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/NV/SPV_NV_ray_tracing_motion_blur.html[`SPV_NV_ray_tracing_motion_blur`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_ray_tracing_motion_blur.txt[`GL_NV_ray_tracing_motion_blur`]
-*Contributors*::
-  - Eric Werness, NVIDIA
-  - Ashwin Lele, NVIDIA
-
-=== Description
-
-Ray tracing support in the API provides an efficient mechanism to intersect
-rays against static geometry, but rendering algorithms often want to support
-motion, which is more efficiently supported with motion-specific algorithms.
-This extension adds a set of mechanisms to support fast tracing of moving
-geometry:
-
-  * A ray pipeline trace call which takes a time parameter
-  * Flags to enable motion support in an acceleration structure
-  * Support for time-varying vertex positions in a geometry
-  * Motion instances to move existing instances over time
-
-The motion represented here is parameterized across a normalized timestep
-between 0.0 and 1.0.
-A motion trace using code:OpTraceRayMotionNV provides a time within that
-normalized range to be used when intersecting that ray with geometry.
-The geometry can be provided with motion by a combination of adding a second
-vertex position for time of 1.0 using
-sname:VkAccelerationStructureGeometryMotionTrianglesDataNV and providing
-multiple transforms in the instance using
-sname:VkAccelerationStructureMotionInstanceNV.
-
-include::{generated}/interfaces/VK_NV_ray_tracing_motion_blur.txt[]
-
-=== Issues
-
-(1) What size is VkAccelerationStructureMotionInstanceNV?
---
- * Added a note on the structure size and made the stride explicit in the
-   language.
---
-
-(2) Allow arrayOfPointers for motion TLAS?
---
- * Yes, with a packed encoding to minimize the amount of data sent for
-   metadata.
---
-
-=== Version History
-
-  * Revision 1, 2020-06-16 (Eric Werness, Ashwin Lele)
-    - Initial external release
diff --git a/registry/vulkan/appendices/VK_NV_representative_fragment_test.txt b/registry/vulkan/appendices/VK_NV_representative_fragment_test.txt
deleted file mode 100644
index 52aca2a..0000000
--- a/registry/vulkan/appendices/VK_NV_representative_fragment_test.txt
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_representative_fragment_test.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-09-13
-*Contributors*::
-  - Kedarnath Thangudu, NVIDIA
-  - Christoph Kubisch, NVIDIA
-  - Pierre Boudier, NVIDIA
-  - Pat Brown, NVIDIA
-  - Jeff Bolz, NVIDIA
-  - Eric Werness, NVIDIA
-
-=== Description
-
-This extension provides a new representative fragment test that allows
-implementations to reduce the amount of rasterization and fragment
-processing work performed for each point, line, or triangle primitive.
-For any primitive that produces one or more fragments that pass all other
-early fragment tests, the implementation is permitted to choose one or more
-"`representative`" fragments for processing and discard all other fragments.
-For draw calls rendering multiple points, lines, or triangles arranged in
-lists, strips, or fans, the representative fragment test is performed
-independently for each of those primitives.
-
-This extension is useful for applications that use an early render pass to
-determine the full set of primitives that would be visible in the final
-scene.
-In this render pass, such applications would set up a fragment shader that
-enables early fragment tests and writes to an image or shader storage buffer
-to record the ID of the primitive that generated the fragment.
-Without this extension, the shader would record the ID separately for each
-visible fragment of each primitive.
-With this extension, fewer stores will be performed, particularly for large
-primitives.
-
-The representative fragment test has no effect if early fragment tests are
-not enabled via the fragment shader.
-The set of fragments discarded by the representative fragment test is
-implementation-dependent and may vary from frame to frame.
-In some cases, the representative fragment test may not discard any
-fragments for a given primitive.
-
-include::{generated}/interfaces/VK_NV_representative_fragment_test.txt[]
-
-=== Issues
-
-(1) Is the representative fragment test guaranteed to have any effect?
-
-*RESOLVED*: No.
-As specified, we only guarantee that each primitive with at least one
-fragment that passes prior tests will have one fragment passing the
-representative fragment tests.
-We do not guarantee that any particular fragment will fail the test.
-
-In the initial implementation of this extension, the representative fragment
-test is treated as an optimization that may be completely disabled for some
-pipeline states.
-This feature was designed for a use case where the fragment shader records
-information on individual primitives using shader storage buffers or storage
-images, with no writes to color or depth buffers.
-
-(2) Will the set of fragments that pass the representative fragment test be
-repeatable if you draw the same scene over and over again?
-
-*RESOLVED*: No.
-The set of fragments that pass the representative fragment test is
-implementation-dependent and may vary due to the timing of operations
-performed by the GPU.
-
-(3) What happens if you enable the representative fragment test with writes
-to color and/or depth render targets enabled?
-
-*RESOLVED*: If writes to the color or depth buffer are enabled, they will be
-performed for any fragments that survive the relevant tests.
-Any fragments that fail the representative fragment test will not update
-color buffers.
-For the use cases intended for this feature, we do not expect color or depth
-writes to be enabled.
-
-(4) How do derivatives and automatic texture level of detail computations
-work with the representative fragment test enabled?
-
-*RESOLVED*: If a fragment shader uses derivative functions or texture
-lookups using automatic level of detail computation, derivatives will be
-computed identically whether or not the representative fragment test is
-enabled.
-For the use cases intended for this feature, we do not expect the use of
-derivatives in the fragment shader.
-
-=== Version History
-
-  * Revision 2, 2018-09-13 (pbrown)
-    - Add issues.
-  * Revision 1, 2018-08-22 (Kedarnath Thangudu)
-    - Internal Revisions
diff --git a/registry/vulkan/appendices/VK_NV_sample_mask_override_coverage.txt b/registry/vulkan/appendices/VK_NV_sample_mask_override_coverage.txt
deleted file mode 100644
index 33a424c..0000000
--- a/registry/vulkan/appendices/VK_NV_sample_mask_override_coverage.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2016-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_sample_mask_override_coverage.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-12-08
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/NV/SPV_NV_sample_mask_override_coverage.html[`SPV_NV_sample_mask_override_coverage`]
-  - This extension provides API support for
-    https://www.khronos.org/registry/OpenGL/extensions/NV/NV_sample_mask_override_coverage.txt[`GL_NV_sample_mask_override_coverage`]
-*Contributors*::
-  - Daniel Koch, NVIDIA
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * `SPV_NV_sample_mask_override_coverage`
-
-The extension provides access to the code:OverrideCoverageNV decoration
-under the code:SampleMaskOverrideCoverageNV capability.
-Adding this decoration to a variable with the code:SampleMask builtin
-decoration allows the shader to modify the coverage mask and affect which
-samples are used to process the fragment.
-
-When using GLSL source-based shader languages, the code:override_coverage
-layout qualifier from `GL_NV_sample_mask_override_coverage` maps to the
-code:OverrideCoverageNV decoration.
-To use the code:override_coverage layout qualifier in GLSL the
-`GL_NV_sample_mask_override_coverage` extension must be enabled.
-Behavior is described in the `GL_NV_sample_mask_override_coverage` extension
-spec.
-
-include::{generated}/interfaces/VK_NV_sample_mask_override_coverage.txt[]
-
-=== New Variable Decoration
-
-  * <<interfaces-builtin-variables-samplemask,OverrideCoverageNV in
-    SampleMask>>
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-SampleMaskOverrideCoverageNV,SampleMaskOverrideCoverageNV>>
-
-=== Version History
-
-  * Revision 1, 2016-12-08 (Piers Daniell)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_scissor_exclusive.txt b/registry/vulkan/appendices/VK_NV_scissor_exclusive.txt
deleted file mode 100644
index 73ea920..0000000
--- a/registry/vulkan/appendices/VK_NV_scissor_exclusive.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_scissor_exclusive.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-07-31
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-    None
-*Contributors*::
-  - Pat Brown, NVIDIA
-  - Jeff Bolz, NVIDIA
-  - Piers Daniell, NVIDIA
-  - Daniel Koch, NVIDIA
-
-=== Description
-
-This extension adds support for an exclusive scissor test to Vulkan.
-The exclusive scissor test behaves like the scissor test, except that the
-exclusive scissor test fails for pixels inside the corresponding rectangle
-and passes for pixels outside the rectangle.
-If the same rectangle is used for both the scissor and exclusive scissor
-tests, the exclusive scissor test will pass if and only if the scissor test
-fails.
-
-include::{generated}/interfaces/VK_NV_scissor_exclusive.txt[]
-
-=== Issues
-
-1) For the scissor test, the viewport state must be created with a matching
-   number of scissor and viewport rectangles.
-   Should we have the same requirement for exclusive scissors?
-
-*RESOLVED*: For exclusive scissors, we relax this requirement and allow an
-exclusive scissor rectangle count that is either zero or equal to the number
-of viewport rectangles.
-If you pass in an exclusive scissor count of zero, the exclusive scissor
-test is treated as disabled.
-
-=== Version History
-
-  * Revision 1, 2018-07-31 (Pat Brown)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_shader_image_footprint.txt b/registry/vulkan/appendices/VK_NV_shader_image_footprint.txt
deleted file mode 100644
index 48feca9..0000000
--- a/registry/vulkan/appendices/VK_NV_shader_image_footprint.txt
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_shader_image_footprint.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-09-13
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/NV/SPV_NV_shader_image_footprint.html[`SPV_NV_shader_image_footprint`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_shader_texture_footprint.txt[`GL_NV_shader_texture_footprint`]
-*Contributors*::
-  - Pat Brown, NVIDIA
-  - Chris Lentini, NVIDIA
-  - Daniel Koch, NVIDIA
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension adds Vulkan support for the
-{spirv}/NV/SPV_NV_shader_image_footprint.html[`SPV_NV_shader_image_footprint`]
-SPIR-V extension.
-That SPIR-V extension provides a new instruction
-code:OpImageSampleFootprintNV allowing shaders to determine the set of
-texels that would be accessed by an equivalent filtered texture lookup.
-
-Instead of returning a filtered texture value, the instruction returns a
-structure that can be interpreted by shader code to determine the footprint
-of a filtered texture lookup.
-This structure includes integer values that identify a small neighborhood of
-texels in the image being accessed and a bitfield that indicates which
-texels in that neighborhood would be used.
-The structure also includes a bitfield where each bit identifies whether any
-texel in a small aligned block of texels would be fetched by the texture
-lookup.
-The size of each block is specified by an access _granularity_ provided by
-the shader.
-The minimum granularity supported by this extension is 2x2 (for 2D textures)
-and 2x2x2 (for 3D textures); the maximum granularity is 256x256 (for 2D
-textures) or 64x32x32 (for 3D textures).
-Each footprint query returns the footprint from a single texture level.
-When using minification filters that combine accesses from multiple mipmap
-levels, shaders must perform separate queries for the two levels accessed
-("`fine`" and "`coarse`").
-The footprint query also returns a flag indicating if the texture lookup
-would access texels from only one mipmap level or from two neighboring
-levels.
-
-This extension should be useful for multi-pass rendering operations that do
-an initial expensive rendering pass to produce a first image that is then
-used as a texture for a second pass.
-If the second pass ends up accessing only portions of the first image (e.g.,
-due to visbility), the work spent rendering the non-accessed portion of the
-first image was wasted.
-With this feature, an application can limit this waste using an initial pass
-over the geometry in the second image that performs a footprint query for
-each visible pixel to determine the set of pixels that it needs from the
-first image.
-This pass would accumulate an aggregate footprint of all visible pixels into
-a separate "`footprint image`" using shader atomics.
-Then, when rendering the first image, the application can kill all shading
-work for pixels not in this aggregate footprint.
-
-This extension has a number of limitations.
-The code:OpImageSampleFootprintNV instruction only supports for two- and
-three-dimensional textures.
-Footprint evaluation only supports the CLAMP_TO_EDGE wrap mode; results are
-undefined: for all other wrap modes.
-Only a limited set of granularity values and that set does not support
-separate coverage information for each texel in the original image.
-
-When using SPIR-V generated from the OpenGL Shading Language, the new
-instruction will be generated from code using the new
-code:textureFootprint*NV built-in functions from the
-`GL_NV_shader_texture_footprint` shading language extension.
-
-include::{generated}/interfaces/VK_NV_shader_image_footprint.txt[]
-
-=== New SPIR-V Capability
-
-  * <<spirvenv-capabilities-table-ImageFootprintNV,ImageFootprintNV>>
-
-=== Issues
-
-(1) The footprint returned by the SPIR-V instruction is a structure that
-    includes an anchor, an offset, and a mask that represents a 8x8 or 4x4x4
-    neighborhood of texel groups.
-    But the bits of the mask are not stored in simple pitch order.
-    Why is the footprint built this way?
-
-*RESOLVED*: We expect that applications using this feature will want to use
-a fixed granularity and accumulate coverage information from the returned
-footprints into an aggregate "`footprint image`" that tracks the portions of
-an image that would be needed by regular texture filtering.
-If an application is using a two-dimensional image with 4x4 pixel
-granularity, we expect that the footprint image will use 64-bit texels where
-each bit in an 8x8 array of bits corresponds to coverage for a 4x4 block in
-the original image.
-Texel (0,0) in the footprint image would correspond to texels (0,0) through
-(31,31) in the original image.
-
-In the usual case, the footprint for a single access will fully contained in
-a 32x32 aligned region of the original texture, which corresponds to a
-single 64-bit texel in the footprint image.
-In that case, the implementation will return an anchor coordinate pointing
-at the single footprint image texel, an offset vector of (0,0), and a mask
-whose bits are aligned with the bits in the footprint texel.
-For this case, the shader can simply atomically OR the mask bits into the
-contents of the footprint texel to accumulate footprint coverage.
-
-In the worst case, the footprint for a single access spans multiple 32x32
-aligned regions and may require updates to four separate footprint image
-texels.
-In this case, the implementation will return an anchor coordinate pointing
-at the lower right footprint image texel and an offset will identify how
-many "`columns`" and "`rows`" of the returned 8x8 mask correspond to
-footprint texels to the left and above the anchor texel.
-If the anchor is (2,3), the 64 bits of the returned mask are arranged
-spatially as follows, where each 4x4 block is assigned a bit number that
-matches its bit number in the footprint image texels:
-
-----
-    +-------------------------+-------------------------+
-    | -- -- -- -- -- -- -- -- | -- -- -- -- -- -- -- -- |
-    | -- -- -- -- -- -- -- -- | -- -- -- -- -- -- -- -- |
-    | -- -- -- -- -- -- -- -- | -- -- -- -- -- -- -- -- |
-    | -- -- -- -- -- -- -- -- | -- -- -- -- -- -- -- -- |
-    | -- -- -- -- -- -- -- -- | -- -- -- -- -- -- -- -- |
-    | -- -- -- -- -- -- 46 47 | 40 41 42 43 44 45 -- -- |
-    | -- -- -- -- -- -- 54 55 | 48 49 50 51 52 53 -- -- |
-    | -- -- -- -- -- -- 62 63 | 56 57 58 59 60 61 -- -- |
-    +-------------------------+-------------------------+
-    | -- -- -- -- -- -- 06 07 | 00 01 02 03 04 05 -- -- |
-    | -- -- -- -- -- -- 14 15 | 08 09 10 11 12 13 -- -- |
-    | -- -- -- -- -- -- 22 23 | 16 17 18 19 20 21 -- -- |
-    | -- -- -- -- -- -- 30 31 | 24 25 26 27 28 29 -- -- |
-    | -- -- -- -- -- -- 38 39 | 32 33 34 35 36 37 -- -- |
-    | -- -- -- -- -- -- -- -- | -- -- -- -- -- -- -- -- |
-    | -- -- -- -- -- -- -- -- | -- -- -- -- -- -- -- -- |
-    | -- -- -- -- -- -- -- -- | -- -- -- -- -- -- -- -- |
-    +-------------------------+-------------------------+
-----
-
-To accumulate coverage for each of the four footprint image texels, a shader
-can AND the returned mask with simple masks derived from the x and y offset
-values and then atomically OR the updated mask bits into the contents of the
-corresponding footprint texel.
-
-[source,c++]
-----
-    uint64_t returnedMask = (uint64_t(footprint.mask.x) | (uint64_t(footprint.mask.y) << 32));
-    uint64_t rightMask    = ((0xFF >> footprint.offset.x) * 0x0101010101010101UL);
-    uint64_t bottomMask   = 0xFFFFFFFFFFFFFFFFUL >> (8 * footprint.offset.y);
-    uint64_t bottomRight  = returnedMask & bottomMask & rightMask;
-    uint64_t bottomLeft   = returnedMask & bottomMask & (~rightMask);
-    uint64_t topRight     = returnedMask & (~bottomMask) & rightMask;
-    uint64_t topLeft      = returnedMask & (~bottomMask) & (~rightMask);
-----
-
-(2) What should an application do to ensure maximum performance when
-accumulating footprints into an aggregate footprint image?
-
-*RESOLVED*: We expect that the most common usage of this feature will be to
-accumulate aggregate footprint coverage, as described in the previous issue.
-Even if you ignore the anisotropic filtering case where the implementation
-may return a granularity larger than that requested by the caller, each
-shader invocation will need to use atomic functions to update up to four
-footprint image texels for each level of detail accessed.
-Having each active shader invocation perform multiple atomic operations can
-be expensive, particularly when neighboring invocations will want to update
-the same footprint image texels.
-
-Techniques can be used to reduce the number of atomic operations performed
-when accumulating coverage include:
-
-  * Have logic that detects returned footprints where all components of the
-    returned offset vector are zero.
-    In that case, the mask returned by the footprint function is guaranteed
-    to be aligned with the footprint image texels and affects only a single
-    footprint image texel.
-  * Have fragment shaders communicate using built-in functions from the
-    `VK_NV_shader_subgroup_partitioned` extension or other shader subgroup
-    extensions.
-    If you have multiple invocations in a subgroup that need to update the
-    same texel (x,y) in the footprint image, compute an aggregate footprint
-    mask across all invocations in the subgroup updating that texel and have
-    a single invocation perform an atomic operation using that aggregate
-    mask.
-  * When the returned footprint spans multiple texels in the footprint
-    image, each invocation need to perform four atomic operations.
-    In the previous issue, we had an example that computed separate masks
-    for "`topLeft`", "`topRight`", "`bottomLeft`", and "`bottomRight`".
-    When the invocations in a subgroup have good locality, it might be the
-    case the "`top left`" for some invocations might refer to footprint
-    image texel (10,10), while neighbors might have their "`top left`"
-    texels at (11,10), (10,11), and (11,11).
-    If you compute separate masks for even/odd x and y values instead of
-    left/right or top/bottom, the "`odd/odd`" mask for all invocations in
-    the subgroup hold coverage for footprint image texel (11,11), which can
-    be updated by a single atomic operation for the entire subgroup.
-
-=== Examples
-
-TBD
-
-=== Version History
-
- * Revision 2, 2018-09-13 (Pat Brown)
-   - Add issue (2) with performance tips.
-
- * Revision 1, 2018-08-12 (Pat Brown)
-   - Initial draft
diff --git a/registry/vulkan/appendices/VK_NV_shader_sm_builtins.txt b/registry/vulkan/appendices/VK_NV_shader_sm_builtins.txt
deleted file mode 100644
index 09e1ff1..0000000
--- a/registry/vulkan/appendices/VK_NV_shader_sm_builtins.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (c) 2019-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_shader_sm_builtins.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-05-28
-*Interactions and External Dependencies*::
- - This extension requires
-   {spirv}/NV/SPV_NV_shader_sm_builtins.html[`SPV_NV_shader_sm_builtins`].
- - This extension enables
-   https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_shader_sm_builtins.txt[`GL_NV_shader_sm_builtins`]
-   for GLSL source languages.
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-  - Eric Werness, NVIDIA
-
-=== Description
-
-This extension provides the ability to determine device-specific properties
-on NVIDIA GPUs.
-It provides the number of streaming multiprocessors (SMs), the maximum
-number of warps (subgroups) that can run on an SM, and shader builtins to
-enable invocations to identify which SM and warp a shader invocation is
-executing on.
-
-This extension enables support for the SPIR-V code:ShaderSMBuiltinsNV
-capability.
-
-These properties and built-ins should: typically only be used for debugging
-purposes.
-
-include::{generated}/interfaces/VK_NV_shader_sm_builtins.txt[]
-
-=== New or Modified Built-In Variables
-
-  * <<interfaces-builtin-variables-warpspersmnv,code:WarpsPerSMNV>>
-  * <<interfaces-builtin-variables-smcountnv,code:SMCountNV>>
-  * <<interfaces-builtin-variables-warpidnv,code:WarpIDNV>>
-  * <<interfaces-builtin-variables-smidnv,code:SMIDNV>>
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-ShaderSMBuiltinsNV,code:ShaderSMBuiltinsNV>>
-
-=== Issues
-. What should we call this extension?
-+
---
-*RESOLVED*: `NV_shader_sm_builtins`.
-Other options considered included:
-
-  * `NV_shader_smid` - but SMID is really easy to typo/confuse as SIMD.
-  * `NV_shader_sm_info` - but *Info* is typically reserved for input
-    structures
-
---
-
-
-=== Version History
-
-  * Revision 1, 2019-05-28 (Daniel Koch)
-    - Internal revisions
-
-
diff --git a/registry/vulkan/appendices/VK_NV_shader_subgroup_partitioned.txt b/registry/vulkan/appendices/VK_NV_shader_subgroup_partitioned.txt
deleted file mode 100644
index a056356..0000000
--- a/registry/vulkan/appendices/VK_NV_shader_subgroup_partitioned.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_shader_subgroup_partitioned.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2018-03-17
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/NV/SPV_NV_shader_subgroup_partitioned.html[`SPV_NV_shader_subgroup_partitioned`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GL_NV_shader_subgroup_partitioned.txt[`GL_NV_shader_subgroup_partitioned`]
-*Contributors*::
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension enables support for a new class of
-<<shaders-group-operations, group operations>> on <<shaders-scope-subgroup,
-subgroups>> via the
-https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GL_NV_shader_subgroup_partitioned.txt[`GL_NV_shader_subgroup_partitioned`]
-GLSL extension and
-{spirv}/NV/SPV_NV_shader_subgroup_partitioned.html[`SPV_NV_shader_subgroup_partitioned`]
-SPIR-V extension.
-Support for these new operations is advertised via the
-ename:VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV bit.
-
-This extension requires Vulkan 1.1, for general subgroup support.
-
-include::{generated}/interfaces/VK_NV_shader_subgroup_partitioned.txt[]
-
-=== Version History
-
-  * Revision 1, 2018-03-17 (Jeff Bolz)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_shading_rate_image.txt b/registry/vulkan/appendices/VK_NV_shading_rate_image.txt
deleted file mode 100644
index dceb828..0000000
--- a/registry/vulkan/appendices/VK_NV_shading_rate_image.txt
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_shading_rate_image.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-07-18
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/NV/SPV_NV_shading_rate.html[`SPV_NV_shading_rate`]
-  - This extension provides API support for
-    https://github.com/KhronosGroup/GLSL/blob/master/extensions/nv/GLSL_NV_shading_rate_image.txt[`GL_NV_shading_rate_image`]
-*Contributors*::
-  - Pat Brown, NVIDIA
-  - Carsten Rohde, NVIDIA
-  - Jeff Bolz, NVIDIA
-  - Daniel Koch, NVIDIA
-  - Mathias Schott, NVIDIA
-  - Matthew Netsch, Qualcomm Technologies, Inc.
-
-=== Description
-
-This extension allows applications to use a variable shading rate when
-processing fragments of rasterized primitives.
-By default, Vulkan will spawn one fragment shader for each pixel covered by
-a primitive.
-In this extension, applications can bind a _shading rate image_ that can be
-used to vary the number of fragment shader invocations across the
-framebuffer.
-Some portions of the screen may be configured to spawn up to 16 fragment
-shaders for each pixel, while other portions may use a single fragment
-shader invocation for a 4x4 block of pixels.
-This can be useful for use cases like eye tracking, where the portion of the
-framebuffer that the user is looking at directly can be processed at high
-frequency, while distant corners of the image can be processed at lower
-frequency.
-Each texel in the shading rate image represents a fixed-size rectangle in
-the framebuffer, covering 16x16 pixels in the initial implementation of this
-extension.
-When rasterizing a primitive covering one of these rectangles, the Vulkan
-implementation reads a texel in the bound shading rate image and looks up
-the fetched value in a palette to determine a base shading rate.
-
-In addition to the API support controlling rasterization, this extension
-also adds Vulkan support for the
-{spirv}/NV/SPV_NV_shading_rate.html[`SPV_NV_shading_rate`] extension to
-SPIR-V.
-That extension provides two fragment shader variable decorations that allow
-fragment shaders to determine the shading rate used for processing the
-fragment:
-
-  * code:FragmentSizeNV, which indicates the width and height of the set of
-    pixels processed by the fragment shader.
-  * code:InvocationsPerPixel, which indicates the maximum number of fragment
-    shader invocations that could be spawned for the pixel(s) covered by the
-    fragment.
-
-When using SPIR-V in conjunction with the OpenGL Shading Language (GLSL),
-the fragment shader capabilities are provided by the
-`GL_NV_shading_rate_image` language extension and correspond to the built-in
-variables code:gl_FragmentSizeNV and code:gl_InvocationsPerPixelNV,
-respectively.
-
-include::{generated}/interfaces/VK_NV_shading_rate_image.txt[]
-
-=== Issues
-
-(1) When using shading rates specifying "`coarse`" fragments covering
-    multiple pixels, we will generate a combined coverage mask that combines
-    the coverage masks of all pixels covered by the fragment.
-    By default, these masks are combined in an implementation-dependent
-    order.
-    Should we provide a mechanism allowing applications to query or specify
-    an exact order?
-
-*RESOLVED*: Yes, this feature is useful for cases where most of the fragment
-shader can be evaluated once for an entire coarse fragment, but where some
-per-pixel computations are also required.
-For example, a per-pixel alpha test may want to kill all the samples for
-some pixels in a coarse fragment.
-This sort of test can be implemented using an output sample mask, but such a
-shader would need to know which bit in the mask corresponds to each sample
-in the coarse fragment.
-We are including a mechanism to allow aplications to specify the orders of
-coverage samples for each shading rate and sample count, either as static
-pipeline state or dynamically via a command buffer.
-This portion of the extension has its own feature bit.
-
-We will not be providing a query to determine the implementation-dependent
-default ordering.
-The thinking here is that if an application cares enough about the coarse
-fragment sample ordering to perform such a query, it could instead just set
-its own order, also using custom per-pixel sample locations if required.
-
-(2) For the pipeline stage
-ename:VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV, should we specify a
-precise location in the pipeline the shading rate image is accessed (after
-geometry shading, but before the early fragment tests) or leave it
-under-specified in case there are other implementations that access the
-image in a different pipeline location?
-
-*RESOLVED* We are specifying the pipeline stage to be between the final
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> (ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT) and before the first
-stage used for fragment processing
-(ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT), which seems to be the
-natural place to access the shading rate image.
-
-(3) How do centroid-sampled variables work with fragments larger than one
-pixel?
-
-*RESOLVED* For single-pixel fragments, fragment shader inputs decorated with
-code:Centroid are sampled at an implementation-dependent location in the
-intersection of the area of the primitive being rasterized and the area of
-the pixel that corresponds to the fragment.
-With multi-pixel fragments, we follow a similar pattern, using the
-intersection of the primitive and the *set* of pixels corresponding to the
-fragment.
-
-One important thing to keep in mind when using such "`coarse`" shading rates
-is that fragment attributes are sampled at the center of the fragment by
-default, regardless of the set of pixels/samples covered by the fragment.
-For fragments with a size of 4x4 pixels, this center location will be more
-than two pixels (1.5 * sqrt(2)) away from the center of the pixels at the
-corners of the fragment.
-When rendering a primitive that covers only a small part of a coarse
-fragment, sampling a color outside the primitive can produce overly bright
-or dark color values if the color values have a large gradient.
-To deal with this, an application can use centroid sampling on attributes
-where "`extrapolation`" artifacts can lead to overly bright or dark pixels.
-Note that this same problem also exists for multisampling with single-pixel
-fragments, but is less severe because it only affects certain samples of a
-pixel and such bright/dark samples may be averaged with other samples that
-do not have a similar problem.
-
-=== Version History
-
-  * Revision 3, 2019-07-18 (Mathias Schott)
-    - Fully list extension interfaces in this appendix.
-  * Revision 2, 2018-09-13 (Pat Brown)
-    - Miscellaneous edits preparing the specification for publication.
-  * Revision 1, 2018-08-08 (Pat Brown)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_viewport_array2.txt b/registry/vulkan/appendices/VK_NV_viewport_array2.txt
deleted file mode 100644
index 1f74abf..0000000
--- a/registry/vulkan/appendices/VK_NV_viewport_array2.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (c) 2017-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_viewport_array2.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2017-02-15
-*Interactions and External Dependencies*::
-  - This extension requires
-    {spirv}/NV/SPV_NV_viewport_array2.html[`SPV_NV_viewport_array2`]
-  - This extension provides API support for
-    https://www.khronos.org/registry/OpenGL/extensions/NV/NV_viewport_array2.txt[`GL_NV_viewport_array2`]
-  - This extension requires the pname:geometryShader and pname:multiViewport
-    features.
-  - This extension interacts with the pname:tessellationShader feature.
-*Contributors*::
-  - Piers Daniell, NVIDIA
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension adds support for the following SPIR-V extension in Vulkan:
-
-  * `SPV_NV_viewport_array2`
-
-which allows a single primitive to be broadcast to multiple viewports and/or
-multiple layers.
-A new shader built-in output code:ViewportMaskNV is provided, which allows a
-single primitive to be output to multiple viewports simultaneously.
-Also, a new SPIR-V decoration is added to control whether the effective
-viewport index is added into the variable decorated with the code:Layer
-built-in decoration.
-These capabilities allow a single primitive to be output to multiple layers
-simultaneously.
-
-This extension allows variables decorated with the code:Layer and
-code:ViewportIndex built-ins to be exported from vertex or tessellation
-shaders, using the code:ShaderViewportIndexLayerNV capability.
-
-This extension adds a new code:ViewportMaskNV built-in decoration that is
-available for output variables in vertex, tessellation evaluation, and
-geometry shaders, and a new code:ViewportRelativeNV decoration that can be
-added on variables decorated with code:Layer when using the
-code:ShaderViewportMaskNV capability.
-
-When using GLSL source-based shading languages, the code:gl_ViewportMask[]
-built-in output variable and code:viewport_relative layout qualifier from
-`GL_NV_viewport_array2` map to the code:ViewportMaskNV and
-code:ViewportRelativeNV decorations, respectively.
-Behaviour is described in the `GL_NV_viewport_array2` extension
-specificiation.
-
-ifdef::VK_EXT_shader_viewport_index_layer[]
-[NOTE]
-.Note
-====
-The code:ShaderViewportIndexLayerNV capability is equivalent to the
-code:ShaderViewportIndexLayerEXT capability added by
-`apiext:VK_EXT_shader_viewport_index_layer`.
-====
-endif::VK_EXT_shader_viewport_index_layer[]
-
-include::{generated}/interfaces/VK_NV_viewport_array2.txt[]
-
-=== New or Modified Built-In Variables
-
-  * (modified) <<interfaces-builtin-variables-layer,code:Layer>>
-  * (modified)
-    <<interfaces-builtin-variables-viewportindex,code:ViewportIndex>>
-  * <<interfaces-builtin-variables-viewportmask,code:ViewportMaskNV>>
-
-=== New Variable Decoration
-
-  * <<interfaces-builtin-variables-layer,code:ViewportRelativeNV in
-    code:Layer>>
-
-=== New SPIR-V Capabilities
-
-  * <<spirvenv-capabilities-table-ShaderViewportIndexLayerNV,code:ShaderViewportIndexLayerNV>>
-  * <<spirvenv-capabilities-table-ShaderViewportMaskNV,code:ShaderViewportMaskNV>>
-
-=== Version History
-
-  * Revision 1, 2017-02-15 (Daniel Koch)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_viewport_swizzle.txt b/registry/vulkan/appendices/VK_NV_viewport_swizzle.txt
deleted file mode 100644
index d1b414d..0000000
--- a/registry/vulkan/appendices/VK_NV_viewport_swizzle.txt
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright (c) 2016-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_viewport_swizzle.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-12-22
-*Interactions and External Dependencies*::
-  - This extension requires pname:multiViewport and pname:geometryShader
-    features to be useful.
-*Contributors*::
-  - Daniel Koch, NVIDIA
-  - Jeff Bolz, NVIDIA
-
-=== Description
-
-This extension provides a new per-viewport swizzle that can modify the
-position of primitives sent to each viewport.
-New viewport swizzle state is added for each viewport, and a new position
-vector is computed for each vertex by selecting from and optionally negating
-any of the four components of the original position vector.
-
-This new viewport swizzle is useful for a number of algorithms, including
-single-pass cube map rendering (broadcasting a primitive to multiple faces
-and reorienting the vertex position for each face) and voxel rasterization.
-The per-viewport component remapping and negation provided by the swizzle
-allows application code to re-orient three-dimensional geometry with a view
-along any of the *X*, *Y*, or *Z* axes.
-If a perspective projection and depth buffering is required, [eq]#1/W#
-buffering should be used, as described in the single-pass cube map rendering
-example in the "`Issues`" section below.
-
-include::{generated}/interfaces/VK_NV_viewport_swizzle.txt[]
-
-=== Issues
-
-1) Where does viewport swizzling occur in the pipeline?
-
-*RESOLVED*: Despite being associated with the viewport, viewport swizzling
-must happen prior to the viewport transform.
-In particular, it needs to be performed before clipping and perspective
-division.
-
-The viewport mask expansion (`apiext:VK_NV_viewport_array2`) and the
-viewport swizzle could potentially be performed before or after transform
-feedback, but feeding back several viewports worth of primitives with
-different swizzles does not seem particularly useful.
-This specification applies the viewport mask and swizzle after transform
-feedback, and makes primitive queries only count each primitive once.
-
-2) Any interesting examples of how this extension,
-`apiext:VK_NV_viewport_array2`, and
-`apiext:VK_NV_geometry_shader_passthrough` can be used together in practice?
-
-*RESOLVED*: One interesting use case for this extension is for single-pass
-rendering to a cube map.
-In this example, the application would attach a cube map texture to a
-layered FBO where the six cube faces are treated as layers.
-Vertices are sent through the vertex shader without applying a projection
-matrix, where the code:gl_Position output is [eq]#(x,y,z,1)# and the center
-of the cube map is at [eq]#(0,0,0)#.
-With unextended Vulkan, one could have a conventional instanced geometry
-shader that looks something like the following:
-
-[source,c]
----------------------------------------------------
-layout(invocations = 6) in;     // separate invocation per face
-layout(triangles) in;
-layout(triangle_strip) out;
-layout(max_vertices = 3) out;
-
-in Inputs {
-vec2 texcoord;
-vec3 normal;
-vec4 baseColor;
-} v[];
-
-    out Outputs {
-    vec2 texcoord;
-    vec3 normal;
-    vec4 baseColor;
-    };
-
-    void main()
-    {
-    int face = gl_InvocationID;  // which face am I?
-
-    // Project gl_Position for each vertex onto the cube map face.
-    vec4 positions[3];
-    for (int i = 0; i < 3; i++) {
-        positions[i] = rotate(gl_in[i].gl_Position, face);
-    }
-
-    // If the primitive does not project onto this face, we are done.
-    if (shouldCull(positions)) {
-        return;
-    }
-
-    // Otherwise, emit a copy of the input primitive to the
-    // appropriate face (using gl_Layer).
-    for (int i = 0; i < 3; i++) {
-        gl_Layer = face;
-        gl_Position = positions[i];
-        texcoord = v[i].texcoord;
-        normal = v[i].normal;
-        baseColor = v[i].baseColor;
-        EmitVertex();
-    }
-}
----------------------------------------------------
-
-With passthrough geometry shaders, this can be done using a much simpler
-shader:
-
-[source,c]
----------------------------------------------------
-layout(triangles) in;
-layout(passthrough) in Inputs {
-    vec2 texcoord;
-    vec3 normal;
-    vec4 baseColor;
-}
-layout(passthrough) in gl_PerVertex {
-    vec4 gl_Position;
-} gl_in[];
-layout(viewport_relative) out int gl_Layer;
-
-void main()
-{
-    // Figure out which faces the primitive projects onto and
-    // generate a corresponding viewport mask.
-    uint mask = 0;
-    for (int i = 0; i < 6; i++) {
-        if (!shouldCull(face)) {
-        mask |= 1U << i;
-        }
-    }
-    gl_ViewportMask = mask;
-    gl_Layer = 0;
-}
----------------------------------------------------
-
-The application code is set up so that each of the six cube faces has a
-separate viewport (numbered 0 to 5).
-Each face also has a separate swizzle, programmed via the
-slink:VkPipelineViewportSwizzleStateCreateInfoNV pipeline state.
-The viewport swizzle feature performs the coordinate transformation handled
-by the code:rotate() function in the original shader.
-The code:viewport_relative layout qualifier says that the viewport number (0
-to 5) is added to the base code:gl_Layer value of 0 to determine which layer
-(cube face) the primitive should be sent to.
-
-Note that the use of the passed through input code:normal in this example
-suggests that the fragment shader in this example would perform an operation
-like per-fragment lighting.
-The viewport swizzle would transform the position to be face-relative, but
-code:normal would remain in the original coordinate system.
-It seems likely that the fragment shader in either version of the example
-would want to perform lighting in the original coordinate system.
-It would likely do this by reconstructing the position of the fragment in
-the original coordinate system using code:gl_FragCoord, a constant or
-uniform holding the size of the cube face, and the input
-code:gl_ViewportIndex (or code:gl_Layer), which identifies the cube face.
-Since the value of code:normal is in the original coordinate system, it
-would not need to be modified as part of this coordinate transformation.
-
-Note that while the code:rotate() operation in the regular geometry shader
-above could include an arbitrary post-rotation projection matrix, the
-viewport swizzle does not support arbitrary math.
-To get proper projection, [eq]#1/W# buffering should be used.
-To do this:
-
-  . Program the viewport swizzles to move the pre-projection [eq]#W# eye
-    coordinate (typically 1.0) into the [eq]#Z# coordinate of the swizzle
-    output and the eye coordinate component used for depth into the [eq]#W#
-    coordinate.
-    For example, the viewport corresponding to the [eq]#+Z# face might use a
-    swizzle of [eq]#(+X, -Y, +W, +Z)#.
-    The [eq]#Z# normalized device coordinate computed after swizzling would
-    then be [eq]#z'/w' = 1/Z~eye~#.
-  . On NVIDIA implementations supporting floating-point depth buffers with
-    values outside [eq]#[0,1]#, prevent unwanted near plane clipping by
-    enabling pname:depthClampEnable.
-    Ensure that the depth clamp does not mess up depth testing by
-    programming the depth range to very large values, such as
-    [eq]#pname:minDepthBounds=-z#, [eq]#pname:maxDepthBounds=+z#, where
-    [eq]#z = 2^127^#.
-    It should be possible to use IEEE infinity encodings also (`0xFF800000`
-    for `-INF`, `0x7F800000` for `+INF`).
-    Even when near/far clipping is disabled, primitives extending behind the
-    eye will still be clipped because one or more vertices will have a
-    negative [eq]#W# coordinate and fail [eq]#X#/[eq]#Y# clipping tests.
-+
---
-On other implementations, scale [eq]#X#, [eq]#Y#, and [eq]#Z# eye
-coordinates so that vertices on the near plane have a post-swizzle [eq]#W#
-coordinate of 1.0.
-For example, if the near plane is at [eq]#Z~eye~ = 1/256#, scale [eq]#X#,
-[eq]#Y#, and [eq]#Z# by 256.
---
-  . Adjust depth testing to reflect the fact that [eq]#1/W# values are large
-    near the eye and small away from the eye.
-    Clear the depth buffer to zero (infinitely far away) and use a depth
-    test of ename:VK_COMPARE_OP_GREATER instead of ename:VK_COMPARE_OP_LESS.
-
-
-=== Version History
-
-  * Revision 1, 2016-12-22 (Piers Daniell)
-    - Internal revisions
diff --git a/registry/vulkan/appendices/VK_NV_win32_keyed_mutex.txt b/registry/vulkan/appendices/VK_NV_win32_keyed_mutex.txt
deleted file mode 100644
index 549f914..0000000
--- a/registry/vulkan/appendices/VK_NV_win32_keyed_mutex.txt
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright (c) 2016-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_NV_win32_keyed_mutex.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2016-08-19
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - James Jones, NVIDIA
-  - Carsten Rohde, NVIDIA
-
-=== Description
-
-Applications that wish to import Direct3D 11 memory objects into the Vulkan
-API may wish to use the native keyed mutex mechanism to synchronize access
-to the memory between Vulkan and Direct3D.
-This extension provides a way for an application to access the keyed mutex
-associated with an imported Vulkan memory object when submitting command
-buffers to a queue.
-
-include::{generated}/interfaces/VK_NV_win32_keyed_mutex.txt[]
-
-=== Examples
-
-[source,c++]
-----------------------------------------
-
-    //
-    // Import a memory object from Direct3D 11, and synchronize
-    // access to it in Vulkan using keyed mutex objects.
-    //
-
-    extern VkPhysicalDevice physicalDevice;
-    extern VkDevice device;
-    extern HANDLE sharedNtHandle;
-
-    static const VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
-    static const VkExternalMemoryHandleTypeFlagsNV handleType =
-        VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_BIT_NV;
-
-    VkPhysicalDeviceMemoryProperties memoryProperties;
-    VkExternalImageFormatPropertiesNV properties;
-    VkExternalMemoryImageCreateInfoNV externalMemoryImageCreateInfo;
-    VkImageCreateInfo imageCreateInfo;
-    VkImage image;
-    VkMemoryRequirements imageMemoryRequirements;
-    uint32_t numMemoryTypes;
-    uint32_t memoryType;
-    VkImportMemoryWin32HandleInfoNV importMemoryInfo;
-    VkMemoryAllocateInfo memoryAllocateInfo;
-    VkDeviceMemory mem;
-    VkResult result;
-
-    // Figure out how many memory types the device supports
-    vkGetPhysicalDeviceMemoryProperties(physicalDevice,
-                                        &memoryProperties);
-    numMemoryTypes = memoryProperties.memoryTypeCount;
-
-    // Check the external handle type capabilities for the chosen format
-    // Importable 2D image support with at least 1 mip level, 1 array
-    // layer, and VK_SAMPLE_COUNT_1_BIT using optimal tiling and supporting
-    // texturing and color rendering is required.
-    result = vkGetPhysicalDeviceExternalImageFormatPropertiesNV(
-        physicalDevice,
-        format,
-        VK_IMAGE_TYPE_2D,
-        VK_IMAGE_TILING_OPTIMAL,
-        VK_IMAGE_USAGE_SAMPLED_BIT |
-        VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
-        0,
-        handleType,
-        &properties);
-
-    if ((result != VK_SUCCESS) ||
-        !(properties.externalMemoryFeatures &
-          VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV)) {
-        abort();
-    }
-
-    // Set up the external memory image creation info
-    memset(&externalMemoryImageCreateInfo,
-           0, sizeof(externalMemoryImageCreateInfo));
-    externalMemoryImageCreateInfo.sType =
-        VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV;
-    externalMemoryImageCreateInfo.handleTypes = handleType;
-    // Set up the  core image creation info
-    memset(&imageCreateInfo, 0, sizeof(imageCreateInfo));
-    imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
-    imageCreateInfo.pNext = &externalMemoryImageCreateInfo;
-    imageCreateInfo.format = format;
-    imageCreateInfo.extent.width = 64;
-    imageCreateInfo.extent.height = 64;
-    imageCreateInfo.extent.depth = 1;
-    imageCreateInfo.mipLevels = 1;
-    imageCreateInfo.arrayLayers = 1;
-    imageCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;
-    imageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
-    imageCreateInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT |
-        VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
-    imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
-    imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
-
-    vkCreateImage(device, &imageCreateInfo, NULL, &image);
-    vkGetImageMemoryRequirements(device,
-                                 image,
-                                 &imageMemoryRequirements);
-
-    // For simplicity, just pick the first compatible memory type.
-    for (memoryType = 0; memoryType < numMemoryTypes; memoryType++) {
-        if ((1 << memoryType) & imageMemoryRequirements.memoryTypeBits) {
-            break;
-        }
-    }
-
-    // At least one memory type must be supported given the prior external
-    // handle capability check.
-    assert(memoryType < numMemoryTypes);
-
-    // Allocate the external memory object.
-    memset(&exportMemoryAllocateInfo, 0, sizeof(exportMemoryAllocateInfo));
-    exportMemoryAllocateInfo.sType =
-        VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV;
-    importMemoryInfo.handleTypes = handleType;
-    importMemoryInfo.handle = sharedNtHandle;
-
-    memset(&memoryAllocateInfo, 0, sizeof(memoryAllocateInfo));
-    memoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
-    memoryAllocateInfo.pNext = &exportMemoryAllocateInfo;
-    memoryAllocateInfo.allocationSize = imageMemoryRequirements.size;
-    memoryAllocateInfo.memoryTypeIndex = memoryType;
-
-    vkAllocateMemory(device, &memoryAllocateInfo, NULL, &mem);
-
-    vkBindImageMemory(device, image, mem, 0);
-
-    ...
-
-    const uint64_t acquireKey = 1;
-    const uint32_t timeout = INFINITE;
-    const uint64_t releaseKey = 2;
-
-    VkWin32KeyedMutexAcquireReleaseInfoNV keyedMutex =
-        { VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV };
-    keyedMutex.acquireCount = 1;
-    keyedMutex.pAcquireSyncs = &mem;
-    keyedMutex.pAcquireKeys = &acquireKey;
-    keyedMutex.pAcquireTimeoutMilliseconds = &timeout;
-    keyedMutex.releaseCount = 1;
-    keyedMutex.pReleaseSyncs = &mem;
-    keyedMutex.pReleaseKeys = &releaseKey;
-
-    VkSubmitInfo submit_info = { VK_STRUCTURE_TYPE_SUBMIT_INFO, &keyedMutex };
-    submit_info.commandBufferCount = 1;
-    submit_info.pCommandBuffers = &cmd_buf;
-    vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
-
-----------------------------------------
-
-=== Version History
-
-  * Revision 2, 2016-08-11 (James Jones)
-    - Updated sample code based on the NV external memory extensions.
-    - Renamed from NVX to NV extension.
-    - Added Overview and Description sections.
-    - Updated sample code to use the NV external memory extensions.
-
-  * Revision 1, 2016-06-14 (Carsten Rohde)
-    - Initial draft.
diff --git a/registry/vulkan/appendices/VK_QCOM_render_pass_shader_resolve.txt b/registry/vulkan/appendices/VK_QCOM_render_pass_shader_resolve.txt
deleted file mode 100644
index 12f5727..0000000
--- a/registry/vulkan/appendices/VK_QCOM_render_pass_shader_resolve.txt
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (c) 2019-2020 Qualcomm Technologies, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_QCOM_render_pass_shader_resolve.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2019-11-07
-*IP Status*::
-    No known IP claims.
-*Interactions and External Dependencies*::
-    None.
-*Contributors*::
-  - Srihari Babu Alla, Qualcomm
-  - Bill Licea-Kane, Qualcomm
-  - Jeff Leger, Qualcomm
-
-=== Description
-
-This extension allows a shader resolve to replace fixed-function resolve.
-
-Fixed-function resolve is limited in function to simple filters of
-multisample buffers to a single sample buffer.
-
-Fixed-function resolve is more performance efficient and/or power efficient
-than shader resolve for such simple filters.
-
-Shader resolve allows a shader writer to create complex, non-linear
-filtering of a multisample buffer in the last subpass of a subpass
-dependency chain.
-
-This extension also provides a bit which can: be used to enlarge a sample
-region dependency to a fragment region dependency, so that a
-framebuffer-region dependency can: replace a framebuffer-global dependency
-in some cases.
-
-include::{generated}/interfaces/VK_QCOM_render_pass_shader_resolve.txt[]
-
-=== Issues
-
-1) Should this extension be named render_pass_shader_resolve?
-
-*RESOLVED* Yes.
-
-This is part of suite of small extensions to render pass.
-
-Following the style guide, instead of following VK_KHR_create_renderpass2.
-
-2) Should the VK_SAMPLE_COUNT_1_BIT be required for each pColorAttachment
-and the DepthStencilAttachent?
-
-*RESOLVED* No.
-
-While this may not be a common use case, and while most fixed-function
-resolve hardware has this limitation, there is little reason to require a
-shader resolve to resolve to a single sample buffer.
-
-3) Should a shader resolve subpass be the last subpass in a render pass?
-
-*RESOLVED* Yes.
-
-To be more specific, it should be the last subpass in a subpass dependency
-chain.
-
-4) Do we need the ename:VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM bit?
-
-*RESOLVED* Yes.
-
-This applies when an input attachment's sample count is equal to
-pname:rasterizationSamples.
-Further, if pname:sampleShading is enabled (explicitly or implicitly) then
-pname:minSampleShading must: equal 0.0.
-
-However, this bit may be set on any subpass, it is not restricted to a
-shader resolve subpass.
-
-=== Version History
-
-  * Revision 1, 2019-06-28 (wwlk)
-    - Initial draft
-  * Revision 2, 2019-11-06 (wwlk)
-    - General clean-up/spec updates
-    - Added issues
-  * Revision 3, 2019-11-07 (wwlk)
-    - Typos
-    - Additional issues
-    - Clarified that a shader resolve subpass is the last subpass in a
-      subpass dependency chain
-  * Revision 4, 2020-01-06 (wwlk)
-    - Change resolution of Issue 1 (_render_pass_, not _renderpass_)
diff --git a/registry/vulkan/appendices/VK_QCOM_render_pass_store_ops.txt b/registry/vulkan/appendices/VK_QCOM_render_pass_store_ops.txt
deleted file mode 100644
index 4097a43..0000000
--- a/registry/vulkan/appendices/VK_QCOM_render_pass_store_ops.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2019-2020 Qualcomm Technologies, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_QCOM_render_pass_store_ops.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-03-25
-*Contributors*::
-  - Bill Licea-Kane, Qualcomm Technologies, Inc.
-
-=== Description
-
-Renderpass attachments can: be read-only for the duration of a render pass.
-
-Examples include input attachments and depth attachments where depth tests
-are enabled but depth writes are not enabled.
-
-In such cases, there can: be no contents generated for an attachment within
-the render area.
-
-This extension adds a new elink:VkAttachmentStoreOp
-ename:VK_ATTACHMENT_STORE_OP_NONE_QCOM which specifies that the contents
-within the render area may: not be written to memory, but that the prior
-contents of the attachment in memory are preserved.
-However, if any contents were generated within the render area during
-rendering, the contents of the attachment will be undefined: inside the
-render area.
-
-[NOTE]
-.Note
-====
-The elink:VkAttachmentStoreOp ename:VK_ATTACHMENT_STORE_OP_STORE may: force
-an implementation to assume that the attachment was written and force an
-implementation to flush data to memory or to a higher level cache.
-The elink:VkAttachmentStoreOp ename:VK_ATTACHMENT_STORE_OP_NONE_QCOM may:
-allow an implementation to assume that the attachment was not written and
-allow an implementation to avoid such a flush..
-====
-
-include::{generated}/interfaces/VK_QCOM_render_pass_store_ops.txt[]
-
-=== Version History
-
- * Revision 1, 2019-12-20 (wwlk)
-   - Initial version
- * Revision 2, 2020-03-25 (wwlk)
-   - Minor renaming
diff --git a/registry/vulkan/appendices/VK_QCOM_render_pass_transform.txt b/registry/vulkan/appendices/VK_QCOM_render_pass_transform.txt
deleted file mode 100644
index 11c8624..0000000
--- a/registry/vulkan/appendices/VK_QCOM_render_pass_transform.txt
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright (c) 2020 Qualcomm Technologies, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_QCOM_render_pass_transform.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-03-09
-*Interactions and External Dependencies*::
-  - This extension requires `apiext:VK_KHR_swapchain`
-  - This extension interacts with `apiext:VK_EXT_fragment_density_map`
-  - This extension interacts with `apiext:VK_KHR_fragment_shading_rate`
-*Contributors*::
-  - Jeff Leger, Qualcomm Technologies, Inc.
-  - Brandon Light, Qualcomm Technologies, Inc.
-  - Matthew Netsch, Qualcomm Technologies, Inc.
-
-=== Description
-
-This extension provides a mechanism for applications to enable driver
-support for <<vertexpostproc-renderpass-transform, render pass transform>>.
-
-Mobile devices can be rotated and mobile applications need to render
-properly when a device is held in a landscape or portrait orientation.
-When the current orientation differs from the device's native orientation, a
-rotation is required so that the "`up`" direction of the rendered scene
-matches the current orientation.
-
-If the Display Processing Unit (DPU) doesnt natively support rotation, the
-Vulkan presentation engine can handle this rotation in a separate
-composition pass.
-Alternatively, the application can render frames "`pre-rotated`" to avoid
-this extra pass.
-The latter is preferred to reduce power consumption and achieve the best
-performance because it avoids tasking the GPU with extra work to perform the
-copy/rotate operation.
-
-Unlike OpenGL ES, the burden of pre-rotation in Vulkan falls on the
-application.
-To implement pre-rotation, applications render into swapchain images
-matching the device native aspect ratio of the display and "`pre-rotate`"
-the rendering content to match the device's current orientation.
-The burden is more than adjusting the Model View Projection (MVP) matrix in
-the vertex shader to account for rotation and aspect ratio.
-The coordinate systems of scissors, viewports, derivatives and several
-shader built-ins may need to be adapted to produce the correct result.
-
-It is difficult for some game engines to manage this burden; many chose to
-simply accept the performance/power overhead of performing rotation in the
-presentation engine.
-
-This extension allows applications to achieve the performance benefits of
-pre-rotated rendering by moving much of the above-mentioned burden to the
-graphics driver.
-The following is unchanged with this extension:
-
-  * Applications create a swapchain matching the native orientation of the
-    display.
-    Applications must also set the
-    slink:VkSwapchainCreateInfoKHR::pname:preTransform equal to the
-    pname:currentTransform as returned by
-    flink:vkGetPhysicalDeviceSurfaceCapabilitiesKHR.
-
-The following is changed with this extension:
-
-  * At flink:vkCmdBeginRenderPass, the application provides extension struct
-    slink:VkRenderPassTransformBeginInfoQCOM specifying the render pass
-    transform parameters.
-  * At flink:vkBeginCommandBuffer for secondary command buffers, the
-    application provides extension struct
-    slink:VkCommandBufferInheritanceRenderPassTransformInfoQCOM specifying
-    the render pass transform parameters.
-  * The pname:renderArea, viewports, scissors, and pname:fragmentSize are
-    all provided in the current (non-rotated) coordinate system.
-    The implementation will transform those into the native (rotated)
-    coordinate system.
-  * The implementation is responsible for transforming shader built-ins
-    (code:FragCoord, code:PointCoord, code:SamplePosition,
-    code:PrimitiveShadingRateKHR, interpolateAt(), dFdx, dFdy, fWidth) into
-    the rotated coordinate system.
-  * The implementation is responsible for transforming code:position to the
-    rotated coordinate system.
-
-include::{generated}/interfaces/VK_QCOM_render_pass_transform.txt[]
-
-=== Issues
-1) Some early Adreno drivers (October 2019 through March 2020) advertised
-support for this extension but expected VK_STRUCTURE_TYPE values different
-from those in the vukan headers.
-To cover all Adreno devices on the market, applications need to detect the
-driver version and use the appropriate VK_STRUCTURE_TYPE values from the
-table below.
-
-The driver version reported in VkPhysicalDeviceProperties.driverVersion is a
-code:uint32_t type.
-You can decode the code:uint32_t value into a major.minor.patch version as
-shown below:
-[source,c]
----------------------------------------------------
-uint32_t  major = ((driverVersion) >> 22);
-uint32_t  minor = ((driverVersion) >> 12) & 0x3ff);
-uint32_t  patch = ((driverVersion) & 0xfff);
----------------------------------------------------
-
-If the Adreno major.minor.patch version is greater than or equal to to
-512.469.0, then simply use the VK_STRUCTURE_TYPE values as defined in
-vulkan_core.h.
-If the version is less than or equal to to 512.468.0, then use the alternate
-values for the two VK_STRUCTURE_TYPEs in the table below.
-
-.fname:Adreno Driver Requirements
-[width="80%",options="header"]
-|====
-|    2+| Adreno Driver Version
-|                      | 512.468.0 and earlier  | 512.469.0 and later
-|VK_STRUCTURE_TYPE_ RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM                     | 1000282000 | 1000282001
-|VK_STRUCTURE_TYPE_ COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM| 1000282001 | 1000282000
-|====
-
-2) Should the extension support only rotations (e.g. 90, 180, 270-degrees),
-or also mirror transforms (e.g. vertical flips)? Mobile use-cases only
-require rotation.
-Other display systems such as projectors might require a flipped transform.
-
-*RESOLVED*: In this version of the extension, the functionality is
-restricted to 90, 180, and 270-degree rotations to address mobile use-cases.
-
-3) How does this extension interact with VK_EXT_fragment_density_map?
-
-*RESOLVED* Some implementations may not be able to support a render pass
-that enables both render pass transform and fragment density maps.
-For simplicity, this extension disallows enabling both features within a
-single render pass.
-
-4) What should this extension be named?
-
-We considered names such as "`rotated_rendering`", "`pre_rotation`" and
-others.
-Since the functionality is limited to a render pass, it seemed the name
-should include "`render_pass`".
-While the current extension is limited to rotations, it could be extended to
-other transforms (like mirror) in the future.
-
-*RESOLVED* The name "`render_pass_transform`" seems like the most accurate
-description of the introduced functionality.
-
-5) How does this extension interact with VK_KHR_fragment_shading_rate?
-
-*RESOLVED*: For the same reasons as issue 3, this extension disallows
-enabling both pname:pFragmentShadingRateAttachment and render pass transform
-within a single render pass.
-
-However, pipeline shading rate and primitive shading rate are supported, and
-their respective pname:fragmentSize and code:PrimitiveShadingRateKHR are
-provided in the current (non-rotated) coordinate system.
-The implementation is responsible for transforming them to the rotated
-coordinate system.
-
-The <<primsrast-fragment-shading-rate, set of supported shading rates>> may:
-be different per transform.
-Supported rates queried from
-flink:vkGetPhysicalDeviceFragmentShadingRatesKHR are in the native (rotated)
-coordinate system.
-This means that the application must: swap the x/y of the reported rates to
-get the set of rates supported for 90 and 270 degree rotation.
-
-
-=== Version History
-
-  * Revision 1, 2020-02-05 (Jeff Leger)
-  * Revision 2, 2021-03-09 (Matthew Netsch)
-    - Adds interactions with VK_KHR_fragment_shading_rate
diff --git a/registry/vulkan/appendices/VK_QCOM_rotated_copy_commands.txt b/registry/vulkan/appendices/VK_QCOM_rotated_copy_commands.txt
deleted file mode 100644
index b65d2b3..0000000
--- a/registry/vulkan/appendices/VK_QCOM_rotated_copy_commands.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2020 Qualcomm Technologies, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_QCOM_rotated_copy_commands.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-09-18
-*Interactions and External Dependencies*::
-  - None
-*Contributors*::
-  - Jeff Leger, Qualcomm Technologies, Inc.
-
-=== Description
-
-This extension extends adds an optional rotation transform to copy commands
-flink:vkCmdBlitImage2KHR, flink:vkCmdCopyImageToBuffer2KHR and
-flink:vkCmdCopyBufferToImage2KHR.
-When copying between two resources, where one resource contains rotated
-content and the other does not, a rotated copy may be desired.
-This extension may be used in combination with VK_QCOM_render_pass_transform
-which adds rotated render passes.
-
-This extension adds an extension structure to the following commands:
-vkCmdBlitImage2KHR, vkCmdCopyImageToBuffer2KHR and
-vkCmdCopyBufferToImage2KHR
-
-
-=== Issues
-
-1) What is an appropriate name for the added extension structure? The style
-guide says "`Structures which extend other structures through the
-pname:pNext chain should reflect the name of the base structure they
-extend.`", but in this case a single extension structure is used to extend
-three base structures (vkCmdBlitImage2KHR, vkCmdCopyImageToBuffer2KHR and
-vkCmdCopyBufferToImage2KHR).
-Creating three identical structures with unique names seemed undesirable.
-
-*RESOLVED*: Deviate from the style guide for extension structure naming.
-
-
-2) Should this extension add a rotation capability to vkCmdCopyImage2KHR?
-
-*RESOLVED*: No.
-Use of rotated vkCmdBlitImage2KHR can fully address this use-case.
-
-3) Should this extension add a rotation capability to vkCmdResolveImage2KHR?
-
-*RESOLVED* No.
-Use of vkCmdResolveImage2KHR is very slow and extremely bandwidth intensive
-on Qualcomm's GPU architecture and use of pResolveAttachments in
-vkRenderPass is the strongly preferred approach.
-Therefore, we choose not to introduce a rotation capability to
-vkCmdResolveImage2KHR.
-
-include::{generated}/interfaces/VK_QCOM_rotated_copy_commands.txt[]
-
-=== Version History
-
-  * Revision 1, 2020-09-19 (Jeff Leger)
diff --git a/registry/vulkan/appendices/VK_QNX_screen_surface.txt b/registry/vulkan/appendices/VK_QNX_screen_surface.txt
deleted file mode 100644
index 3241b58..0000000
--- a/registry/vulkan/appendices/VK_QNX_screen_surface.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2021 BlackBerry Limited.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_QNX_screen_surface.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2021-01-11
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Mike Gorchak, BlackBerry Limited
-
-=== Description
-
-The `VK_QNX_screen_surface` extension is an instance extension.
-It provides a mechanism to create a slink:VkSurfaceKHR object (defined by
-the `apiext:VK_KHR_surface` extension) that refers to a QNX Screen
-code:window, as well as a query to determine support for rendering to a QNX
-Screen compositor.
-
-include::{generated}/interfaces/VK_QNX_screen_surface.txt[]
-
-=== Version History
-
- * Revision 1, 2021-01-11 (Mike Gorchak)
-   - Initial draft.
diff --git a/registry/vulkan/appendices/VK_VALVE_mutable_descriptor_type.txt b/registry/vulkan/appendices/VK_VALVE_mutable_descriptor_type.txt
deleted file mode 100644
index 3aa1cb3..0000000
--- a/registry/vulkan/appendices/VK_VALVE_mutable_descriptor_type.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-include::{generated}/meta/{refprefix}VK_VALVE_mutable_descriptor_type.txt[]
-
-=== Other Extension Metadata
-
-*Last Modified Date*::
-    2020-12-02
-*IP Status*::
-    No known IP claims.
-*Contributors*::
-  - Joshua Ashton, Valve
-  - Hans-Kristian Arntzen, Valve
-
-=== Description
-
-This extension allows applications to reduce descriptor memory footprint by
-allowing a descriptor to be able to mutate to a given list of descriptor
-types depending on which descriptor types are written into, or copied into a
-descriptor set.
-
-The main use case this extension intends to address is descriptor indexing
-with ename:VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT where the
-descriptor types are completely generic, as this means applications can
-allocate one large descriptor set, rather than having one large descriptor
-set per descriptor type, which significantly bloats descriptor memory usage
-and causes performance issues.
-
-This extension also adds a mechanism to declare that a descriptor pool, and
-therefore the descriptor sets that are allocated from it, reside only in
-host memory; as such these descriptors can only be updated/copied, but not
-bound.
-
-These features together allow much more efficient emulation of the raw D3D12
-binding model.
-This extension is primarily intended to be useful for API layering efforts.
-
-include::{generated}/interfaces/VK_VALVE_mutable_descriptor_type.txt[]
-
-=== Version History
-
- * Revision 1, 2020-12-01 (Joshua Ashton, Hans-Kristian Arntzen)
-   - Initial specification, squashed from public draft.
diff --git a/registry/vulkan/appendices/boilerplate.txt b/registry/vulkan/appendices/boilerplate.txt
deleted file mode 100644
index fb11c8a..0000000
--- a/registry/vulkan/appendices/boilerplate.txt
+++ /dev/null
@@ -1,418 +0,0 @@
-// Copyright 2016-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[appendix]
-[[boilerplate]]
-= API Boilerplate
-
-This appendix defines Vulkan API features that are infrastructure required
-for a complete functional description of Vulkan, but do not logically belong
-elsewhere in the Specification.
-
-
-[[boilerplate-headers]]
-== Vulkan Header Files
-
-Vulkan is defined as an API in the C99 language.
-Khronos provides a corresponding set of header files for applications using
-the API, which may be used in either C or C++ code.
-The interface descriptions in the specification are the same as the
-interfaces defined in these header files, and both are derived from the
-`vk.xml` XML API Registry, which is the canonical machine-readable
-description of the Vulkan API.
-The Registry, scripts used for processing it into various forms, and
-documentation of the registry schema are available as described at
-https://www.khronos.org/registry/vulkan/#apiregistry .
-
-Language bindings for other languages can be defined using the information
-in the Specification and the Registry.
-Khronos does not provide any such bindings, but third-party developers have
-created some additional bindings.
-
-
-[[boilerplate-vulkan-h]]
-=== Vulkan Combined API Header `{full_header}` (Informative)
-
-Applications normally will include the header `{full_header}`.
-In turn, `{full_header}` always includes the following headers:
-
-  * <<boilerplate-platform-macros,`vk_platform.h`>>, defining
-    platform-specific macros and headers.
-  * <<boilerplate-vulkan-core,`{core_header}`>>, defining APIs for the
-    Vulkan core and all registered extensions _other_ than
-    <<boilerplate-wsi-header, window system-specific>> and
-    <<boilerplate-provisional-header, provisional>> extensions, which are
-    included in separate header files.
-
-In addition, specific preprocessor macros defined at the time
-`{full_header}` is included cause header files for the corresponding window
-system-specific and provisional interfaces to be included, as described
-below.
-
-
-[[boilerplate-platform-macros]]
-=== Vulkan Platform-Specific Header `vk_platform.h` (Informative)
-
-Platform-specific macros and interfaces are defined in `vk_platform.h`.
-These macros are used to control platform-dependent behavior, and their
-exact definitions are under the control of specific platforms and Vulkan
-implementations.
-
-
-[[boilerplate-platform-specific-calling-conventions]]
-==== Platform-Specific Calling Conventions
-
-On many platforms the following macros are empty strings, causing platform-
-and compiler-specific default calling conventions to be used.
-
-[open,refpage='VKAPI_ATTR',desc='Vulkan function attribute macro',type='freeform',anchor='boilerplate-platform-specific-calling-conventions',xrefs='VKAPI_CALL VKAPI_PTR']
---
-dname:VKAPI_ATTR is a macro placed before the return type in Vulkan API
-function declarations.
-This macro controls calling conventions for C++11 and GCC/Clang-style
-compilers.
---
-
-[open,refpage='VKAPI_CALL',desc='Vulkan function calling conventions macro',type='freeform',anchor='boilerplate-platform-specific-calling-conventions',xrefs='VKAPI_ATTR VKAPI_PTR']
---
-dname:VKAPI_CALL is a macro placed after the return type in Vulkan API
-function declarations.
-This macro controls calling conventions for MSVC-style compilers.
---
-
-[open,refpage='VKAPI_PTR',desc='Vulkan function pointer calling conventions macro',type='freeform',anchor='boilerplate-platform-specific-calling-conventions',xrefs='VKAPI_ATTR VKAPI_CALL']
---
-dname:VKAPI_PTR is a macro placed between the '(' and '*' in Vulkan API
-function pointer declarations.
-This macro also controls calling conventions, and typically has the same
-definition as dname:VKAPI_ATTR or dname:VKAPI_CALL, depending on the
-compiler.
---
-
-With these macros, a Vulkan function declaration takes the form of:
-
-[source,c++]
-----------------------------------------
-VKAPI_ATTR <return_type> VKAPI_CALL <command_name>(<command_parameters>);
-----------------------------------------
-
-Additionally, a Vulkan function pointer type declaration takes the form of:
-
-[source,c++]
-----------------------------------------
-typedef <return_type> (VKAPI_PTR *PFN_<command_name>)(<command_parameters>);
-----------------------------------------
-
-
-[[boilerplate-platform-specific-header-control]]
-==== Platform-Specific Header Control
-
-[open,refpage='VK_NO_STDINT_H',desc='Control definition of <stdint.h> types',type='freeform',anchor='boilerplate-platform-specific-header-control']
---
-If the dname:VK_NO_STDINT_H macro is defined by the application at compile
-time, extended integer types used by the Vulkan API, such as code:uint8_t,
-must: also be defined by the application.
-Otherwise, the Vulkan headers will not compile.
-If dname:VK_NO_STDINT_H is not defined, the system `<stdint.h>` is used to
-define these types.
-There is a fallback path when Microsoft Visual Studio version 2008 and
-earlier versions are detected at compile time.
---
-
-[open,refpage='VK_NO_STDDEF_H',desc='Control definition of <stddef.h> types',type='freeform',anchor='boilerplate-platform-specific-header-control']
---
-If the dname:VK_NO_STDDEF_H macro is defined by the application at compile
-time, code:size_t, must: also be defined by the application.
-Otherwise, the Vulkan headers will not compile.
-If dname:VK_NO_STDDEF_H is not defined, the system `<stddef.h>` is used to
-define this type.
---
-
-
-[[boilerplate-vulkan-core]]
-=== Vulkan Core API Header `{core_header}`
-
-Applications that do not make use of window system-specific extensions may
-simply include `{core_header}` instead of `{full_header}`, although there is
-usually no reason to do so.
-In addition to the Vulkan API, `{core_header}` also defines a small number
-of C preprocessor macros that are described below.
-
-
-
-
-
-==== Vulkan Header File Version Number
-
-[open,refpage='VK_HEADER_VERSION',desc='Vulkan header file version number',type='defines']
---
-dname:VK_HEADER_VERSION is the version number of the `{core_header}` header.
-This value is kept synchronized with the patch version of the released
-Specification.
-
-include::{generated}/api/defines/VK_HEADER_VERSION.txt[]
---
-
-[open,refpage='VK_HEADER_VERSION_COMPLETE',desc='Vulkan header file complete version number',type='defines']
---
-dname:VK_HEADER_VERSION_COMPLETE is the complete version number of the
-`{core_header}` header, comprising the major, minor, and patch versions.
-The major/minor values are kept synchronized with the complete version of
-the released Specification.
-This value is intended for use by automated tools to identify exactly which
-version of the header was used during their generation.
-
-Applications should not use this value as their
-slink:VkApplicationInfo::pname:apiVersion.
-Instead applications should explicitly select a specific fixed major/minor
-API version using, for example, one of the dname:VK_API_VERSION_*_* values.
-
-include::{generated}/api/defines/VK_HEADER_VERSION_COMPLETE.txt[]
---
-
-[open,refpage='VK_API_VERSION',desc='Deprecated version number macro',type='defines']
---
-dname:VK_API_VERSION is now commented out of `{core_header}` and cannot: be
-used.
-
-include::{generated}/api/defines/VK_API_VERSION.txt[]
---
-
-
-==== Vulkan Handle Macros
-
-[open,refpage='VK_DEFINE_HANDLE',desc='Declare a dispatchable object handle',type='defines',xrefs='VkCommandBuffer VkDevice VkInstance VkPhysicalDevice VkQueue']
---
-dname:VK_DEFINE_HANDLE defines a <<fundamentals-objectmodel-overview,
-dispatchable handle>> type.
-
-include::{generated}/api/defines/VK_DEFINE_HANDLE.txt[]
-
-  * pname:object is the name of the resulting C type.
-
-The only dispatchable handle types are those related to device and instance
-management, such as slink:VkDevice.
---
-
-[open,refpage='VK_DEFINE_NON_DISPATCHABLE_HANDLE',desc='Declare a non-dispatchable object handle',type='defines',xrefs='VkBuffer']
---
-dname:VK_DEFINE_NON_DISPATCHABLE_HANDLE defines a
-<<fundamentals-objectmodel-overview, non-dispatchable handle>> type.
-
-include::{generated}/api/defines/VK_DEFINE_NON_DISPATCHABLE_HANDLE.txt[]
-
-  * pname:object is the name of the resulting C type.
-
-Most Vulkan handle types, such as slink:VkBuffer, are non-dispatchable.
-
-[NOTE]
-.Note
-====
-The `{core_header}` header allows the
-dname:VK_DEFINE_NON_DISPATCHABLE_HANDLE and dname:VK_NULL_HANDLE definitions
-to be overridden by the application.
-If dname:VK_DEFINE_NON_DISPATCHABLE_HANDLE is already defined when
-`{core_header}` is compiled, the default definitions for
-dname:VK_DEFINE_NON_DISPATCHABLE_HANDLE and dname:VK_NULL_HANDLE are
-skipped.
-This allows the application to define a binary-compatible custom handle
-which may: provide more type-safety or other features needed by the
-application.
-Applications must: not define handles in a way that is not binary compatible
-- where binary compatibility is platform dependent.
-====
---
-
-[open,refpage='VK_NULL_HANDLE',desc='Reserved non-valid object handle',type='defines']
---
-dname:VK_NULL_HANDLE is a reserved value representing a non-valid object
-handle.
-It may be passed to and returned from Vulkan commands only when
-<<fundamentals-validusage-handles, specifically allowed>>.
-
-include::{generated}/api/defines/VK_NULL_HANDLE.txt[]
---
-
-[open,refpage='VK_USE_64_BIT_PTR_DEFINES',desc='Defines whether non-dispatchable handles are a 64-bit pointer type or a 64-bit unsigned integer type',type='defines']
---
-dname:VK_USE_64_BIT_PTR_DEFINES defines whether the default non-dispatchable
-handles are declared using either a 64-bit pointer type or a 64-bit unsigned
-integer type.
-
-dname:VK_USE_64_BIT_PTR_DEFINES is set to '1' to use a 64-bit pointer type
-or any other value to use a 64-bit unsigned integer type.
-
-include::{generated}/api/defines/VK_USE_64_BIT_PTR_DEFINES.txt[]
-
-[NOTE]
-.Note
-====
-The `{core_header}` header allows the dname:VK_USE_64_BIT_PTR_DEFINES
-definition to be overridden by the application.
-This allows the application to select either a 64-bit pointer type or a
-64-bit unsigned integer type for non-dispatchable handles in the case where
-the predefined preprocessor check does not identify the desired
-configuration.
-====
-
---
-
-[[boilerplate-wsi-header]]
-== Window System-Specific Header Control (Informative)
-
-[open,refpage='WSIheaders',desc='Control inclusion of window system interface extensions',type='freeform',anchor='boilerplate-wsi-header',xrefs='provisional-headers']
---
-To use a Vulkan extension supporting a platform-specific window system,
-header files for that window systems must: be included at compile time, or
-platform-specific types must: be forward-declared.
-The Vulkan header files cannot determine whether or not an external header
-is available at compile time, so platform-specific extensions are provided
-in separate headers from the core API and platform-independent extensions,
-allowing applications to decide which ones should be defined and how the
-external headers are included.
-
-Extensions dependent on particular sets of platform headers, or that
-forward-declare platform-specific types, are declared in a header named for
-that platform.
-Before including these platform-specific Vulkan headers, applications must:
-include both `{core_header}` and any external native headers the platform
-extensions depend on.
-
-As a convenience for applications that do not need the flexibility of
-separate platform-specific Vulkan headers, `{full_header}` includes
-`{core_header}`, and then conditionally includes platform-specific Vulkan
-headers and the external headers they depend on.
-Applications control which platform-specific headers are included by
-#defining macros before including `{full_header}`.
-
-The correspondence between platform-specific extensions, external headers
-they require, the platform-specific header which declares them, and the
-preprocessor macros which enable inclusion by `{full_header}` are shown in
-the <<boilerplate-wsi-header-table,following table>>.
-
-[[boilerplate-wsi-header-table]]
-.Window System Extensions and Headers
-[options="header"]
-|====
-| Extension Name                     | Window System Name | Platform-specific Header | Required External Headers      | Controlling `{full_header}` Macro
-| `apiext:VK_KHR_android_surface`       | Android            | `vulkan_android.h`       | None                           | dname:VK_USE_PLATFORM_ANDROID_KHR
-| `apiext:VK_KHR_wayland_surface`       | Wayland            | `vulkan_wayland.h`       | `<wayland-client.h>`           | dname:VK_USE_PLATFORM_WAYLAND_KHR
-| `apiext:VK_KHR_win32_surface`,
-  `apiext:VK_KHR_external_memory_win32`,
-  `apiext:VK_KHR_win32_keyed_mutex`,
-  `apiext:VK_KHR_external_semaphore_win32`,
-  `apiext:VK_KHR_external_fence_win32`,
-ifdef::VK_NV_external_memory_win32[]
-  `apiext:VK_NV_external_memory_win32`,
-endif::VK_NV_external_memory_win32[]
-ifdef::VK_NV_win32_keyed_mutex[]
-  `apiext:VK_NV_win32_keyed_mutex`
-endif::VK_NV_win32_keyed_mutex[]
-                                     | Microsoft Windows      | `vulkan_win32.h`         | `<windows.h>`                  | dname:VK_USE_PLATFORM_WIN32_KHR
-| `apiext:VK_KHR_xcb_surface`           | X11 Xcb                | `vulkan_xcb.h`           | `<xcb/xcb.h>`                  | dname:VK_USE_PLATFORM_XCB_KHR
-| `apiext:VK_KHR_xlib_surface`          | X11 Xlib               | `vulkan_xlib.h`          | `<X11/Xlib.h>`                 | dname:VK_USE_PLATFORM_XLIB_KHR
-ifdef::VK_EXT_directfb_surface[]
-| `apiext:VK_EXT_directfb_surface`      | DirectFB               | `vulkan_directfb.h`      | `<directfb/directfb.h>`        | dname:VK_USE_PLATFORM_DIRECTFB_EXT
-endif::VK_EXT_directfb_surface[]
-ifdef::VK_EXT_acquire_xlib_display[]
-| `apiext:VK_EXT_acquire_xlib_display`  | X11 XRAndR             | `vulkan_xlib_xrandr.h`   | `<X11/Xlib.h>`,
-                                                                                           `<X11/extensions{wbro}/Xrandr.h>`    | dname:VK_USE_PLATFORM_XLIB_XRANDR_EXT
-endif::VK_EXT_acquire_xlib_display[]
-ifdef::VK_GGP_stream_descriptor_surface[]
-| `apiext:VK_GGP_stream_descriptor_surface`,
-  `apiext:VK_GGP_frame_token`
-                                     | Google Games Platform | `vulkan_ggp.h`        | <ggp_c/vulkan_types.h>         | dname:VK_USE_PLATFORM_GGP
-endif::VK_GGP_stream_descriptor_surface[]
-ifdef::VK_MVK_ios_surface[]
-| `apiext:VK_MVK_ios_surface`           | iOS                    | `vulkan_ios.h`           | None                           | dname:VK_USE_PLATFORM_IOS_MVK
-endif::VK_MVK_ios_surface[]
-ifdef::VK_MVK_macos_surface[]
-| `apiext:VK_MVK_macos_surface`         | macOS                  | `vulkan_macos.h`         | None                           | dname:VK_USE_PLATFORM_MACOS_MVK
-endif::VK_MVK_macos_surface[]
-ifdef::VK_NN_vi_surface[]
-| `apiext:VK_NN_vi_surface`             | VI                     | `vulkan_vi.h`            | None                           | dname:VK_USE_PLATFORM_VI_NN
-endif::VK_NN_vi_surface[]
-ifdef::VK_FUCHSIA_imagepipe_surface[]
-| `apiext:VK_FUCHSIA_imagepipe_surface` | Fuchsia                | `vulkan_fuchsia.h`       | `<zircon/types.h>`             | dname:VK_USE_PLATFORM_FUCHSIA
-endif::VK_FUCHSIA_imagepipe_surface[]
-ifdef::VK_EXT_metal_surface[]
-| `apiext:VK_EXT_metal_surface`         | Metal on CoreAnimation | `vulkan_metal.h`         | None                           | dname:VK_USE_PLATFORM_METAL_EXT
-endif::VK_EXT_metal_surface[]
-ifdef::VK_QNX_screen_surface[]
-| `apiext:VK_QNX_screen_surface`        | QNX Screen             | `vulkan_screen.h`        | `<screen/screen.h>`            | dname:VK_USE_PLATFORM_SCREEN_QNX
-endif::VK_QNX_screen_surface[]
-|====
-
-[NOTE]
-.Note
-====
-This section describes the purpose of the headers independently of the
-specific underlying functionality of the window system extensions
-themselves.
-Each extension name will only link to a description of that extension when
-viewing a specification built with that extension included.
-====
---
-
-
-[[boilerplate-provisional-header]]
-== Provisional Extension Header Control (Informative)
-
-[open,refpage='provisional-headers',desc='Control inclusion of provisional extensions',type='freeform',alias='VK_ENABLE_BETA_EXTENSIONS',anchor='boilerplate-provisional-header',xrefs='WSIheaders']
---
-_Provisional_ extensions should: not be used in production applications.
-The functionality defined by such extensions may: change in ways that break
-backwards compatibility between revisions, and before final release of a
-non-provisional version of that extension.
-
-Provisional extensions are defined in a separate _provisional header_,
-`vulkan_beta.h`, allowing applications to decide whether or not to include
-them.
-The mechanism is similar to <<boilerplate-wsi-header, window system-specific
-headers>>: before including `vulkan_beta.h`, applications must: include
-`{core_header}`.
-
-[NOTE]
-.Note
-====
-Sometimes a provisional extension will include a subset of its interfaces in
-`{core_header}`.
-This may occur if the provisional extension is promoted from an existing
-vendor or EXT extension and some of the existing interfaces are defined as
-aliases of the provisional extension interfaces.
-All other interfaces of that provisional extension which are not aliased
-will be included in `vulkan_beta.h`.
-====
-
-As a convenience for applications, `{full_header}` conditionally includes
-`vulkan_beta.h`.
-Applications can: control inclusion of `vulkan_beta.h` by #defining the
-macro etext:VK_ENABLE_BETA_EXTENSIONS before including `{full_header}`.
-
-[NOTE]
-.Note
-====
-Starting in version 1.2.171 of the Specification, all provisional enumerants
-are protected by the macro etext:VK_ENABLE_BETA_EXTENSIONS.
-Applications needing to use provisional extensions must always define this
-macro, even if they are explicitly including `vulkan_beta.h`.
-This is a minor change to behavior, affecting only provisional extensions.
-====
-
-[NOTE]
-.Note
-====
-This section describes the purpose of the provisional header independently
-of the specific provisional extensions which are contained in that header at
-any given time.
-The extension appendices for provisional extensions note their provisional
-status, and link back to this section for more information.
-Provisional extensions are intended to provide early access for
-bleeding-edge developers, with the understanding that extension interfaces
-may change in response to developer feedback.
-Provisional extensions are very likely to eventually be updated and released
-as non-provisional extensions, but there is no guarantee this will happen,
-or how long it will take if it does happen.
-====
---
diff --git a/registry/vulkan/appendices/compressedtex.txt b/registry/vulkan/appendices/compressedtex.txt
deleted file mode 100644
index 89e51e8..0000000
--- a/registry/vulkan/appendices/compressedtex.txt
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[appendix]
-[[compressed_image_formats]]
-= Compressed Image Formats
-
-The compressed texture formats used by Vulkan are described in the
-specifically identified sections of the <<data-format,Khronos Data Format
-Specification>>, version 1.3.
-
-Unless otherwise described, the quantities encoded in these compressed
-formats are treated as normalized, unsigned values.
-
-Those formats listed as sRGB-encoded have in-memory representations of
-[eq]#R#, [eq]#G# and [eq]#B# components which are nonlinearly-encoded as
-[eq]#R'#, [eq]#G'#, and [eq]#B'#; any alpha component is unchanged.
-As part of filtering, the nonlinear [eq]#R'#, [eq]#G'#, and [eq]#B'# values
-are converted to linear [eq]#R#, [eq]#G#, and [eq]#B# components; any alpha
-component is unchanged.
-The conversion between linear and nonlinear encoding is performed as
-described in the "`KHR_DF_TRANSFER_SRGB`" section of the Khronos Data Format
-Specification.
-
-<<<
-
-[[appendix-compressedtex-bc]]
-== Block-Compressed Image Formats
-
-BC1, BC2 and BC3 formats are described in "`S3TC Compressed Texture Image
-Formats`" chapter of the <<data-format,Khronos Data Format Specification>>.
-BC4 and BC5 are described in the "`RGTC Compressed Texture Image Formats`"
-chapter.
-BC6H and BC7 are described in the "`BPTC Compressed Texture Image Formats`"
-chapter.
-
-.Mapping of Vulkan BC formats to descriptions
-[width="90%",options="header",cols="5,4"]
-|====
-| elink:VkFormat | <<data-format,Khronos Data Format Specification>> description
-2+^| Formats described in the "`S3TC Compressed Texture Image Formats`" chapter
-| ename:VK_FORMAT_BC1_RGB_UNORM_BLOCK |BC1 with no alpha
-| ename:VK_FORMAT_BC1_RGB_SRGB_BLOCK  |BC1 with no alpha, sRGB-encoded
-| ename:VK_FORMAT_BC1_RGBA_UNORM_BLOCK|BC1 with alpha
-| ename:VK_FORMAT_BC1_RGBA_SRGB_BLOCK |BC1 with alpha, sRGB-encoded
-| ename:VK_FORMAT_BC2_UNORM_BLOCK     |BC2
-| ename:VK_FORMAT_BC2_SRGB_BLOCK      |BC2, sRGB-encoded
-| ename:VK_FORMAT_BC3_UNORM_BLOCK     |BC3
-| ename:VK_FORMAT_BC3_SRGB_BLOCK      |BC3, sRGB-encoded
-2+^| Formats described in the "`RGTC Compressed Texture Image Formats`" chapter
-| ename:VK_FORMAT_BC4_UNORM_BLOCK     |BC4 unsigned
-| ename:VK_FORMAT_BC4_SNORM_BLOCK     |BC4 signed
-| ename:VK_FORMAT_BC5_UNORM_BLOCK     |BC5 unsigned
-| ename:VK_FORMAT_BC5_SNORM_BLOCK     |BC5 signed
-2+^| Formats described in the "`BPTC Compressed Texture Image Formats`" chapter
-| ename:VK_FORMAT_BC6H_UFLOAT_BLOCK   |BC6H (unsigned version)
-| ename:VK_FORMAT_BC6H_SFLOAT_BLOCK   |BC6H (signed version)
-| ename:VK_FORMAT_BC7_UNORM_BLOCK     |BC7
-| ename:VK_FORMAT_BC7_SRGB_BLOCK      |BC7, sRGB-encoded
-|====
-
-<<<
-
-[[appendix-compressedtex-etc2]]
-== ETC Compressed Image Formats
-
-The following formats are described in the "`ETC2 Compressed Texture Image
-Formats`" chapter of the <<data-format,Khronos Data Format Specification>>.
-
-.Mapping of Vulkan ETC formats to descriptions
-[options="header",cols="1,1"]
-|====
-| elink:VkFormat | <<data-format,Khronos Data Format Specification>> description
-| ename:VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK     |RGB ETC2
-| ename:VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK      |RGB ETC2 with sRGB encoding
-| ename:VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK   |RGB ETC2 with punch-through alpha
-| ename:VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK    |RGB ETC2 with punch-through alpha and sRGB
-| ename:VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK   |RGBA ETC2
-| ename:VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK    |RGBA ETC2 with sRGB encoding
-| ename:VK_FORMAT_EAC_R11_UNORM_BLOCK         |Unsigned R11 EAC
-| ename:VK_FORMAT_EAC_R11_SNORM_BLOCK         |Signed R11 EAC
-| ename:VK_FORMAT_EAC_R11G11_UNORM_BLOCK      |Unsigned RG11 EAC
-| ename:VK_FORMAT_EAC_R11G11_SNORM_BLOCK      |Signed RG11 EAC
-|====
-
-<<<
-
-[[appendix-compressedtex-astc]]
-== ASTC Compressed Image Formats
-
-ASTC formats are described in the "`ASTC Compressed Texture Image Formats`"
-chapter of the <<data-format,Khronos Data Format Specification>>.
-
-.Mapping of Vulkan ASTC formats to descriptions
-[width="90%",options="header",cols="55%,20%,25%"]
-|====
-| elink:VkFormat ^| Compressed texel block dimensions ^| Requested mode
-| ename:VK_FORMAT_ASTC_4x4_UNORM_BLOCK        ^|[eq]#4 {times} 4#   ^|Linear LDR
-| ename:VK_FORMAT_ASTC_4x4_SRGB_BLOCK         ^|[eq]#4 {times} 4#   ^|sRGB
-| ename:VK_FORMAT_ASTC_5x4_UNORM_BLOCK        ^|[eq]#5 {times} 4#   ^|Linear LDR
-| ename:VK_FORMAT_ASTC_5x4_SRGB_BLOCK         ^|[eq]#5 {times} 4#   ^|sRGB
-| ename:VK_FORMAT_ASTC_5x5_UNORM_BLOCK        ^|[eq]#5 {times} 5#   ^|Linear LDR
-| ename:VK_FORMAT_ASTC_5x5_SRGB_BLOCK         ^|[eq]#5 {times} 5#   ^|sRGB
-| ename:VK_FORMAT_ASTC_6x5_UNORM_BLOCK        ^|[eq]#6 {times} 5#   ^|Linear LDR
-| ename:VK_FORMAT_ASTC_6x5_SRGB_BLOCK         ^|[eq]#6 {times} 5#   ^|sRGB
-| ename:VK_FORMAT_ASTC_6x6_UNORM_BLOCK        ^|[eq]#6 {times} 6#   ^|Linear LDR
-| ename:VK_FORMAT_ASTC_6x6_SRGB_BLOCK         ^|[eq]#6 {times} 6#   ^|sRGB
-| ename:VK_FORMAT_ASTC_8x5_UNORM_BLOCK        ^|[eq]#8 {times} 5#   ^|Linear LDR
-| ename:VK_FORMAT_ASTC_8x5_SRGB_BLOCK         ^|[eq]#8 {times} 5#   ^|sRGB
-| ename:VK_FORMAT_ASTC_8x6_UNORM_BLOCK        ^|[eq]#8 {times} 6#   ^|Linear LDR
-| ename:VK_FORMAT_ASTC_8x6_SRGB_BLOCK         ^|[eq]#8 {times} 6#   ^|sRGB
-| ename:VK_FORMAT_ASTC_8x8_UNORM_BLOCK        ^|[eq]#8 {times} 8#   ^|Linear LDR
-| ename:VK_FORMAT_ASTC_8x8_SRGB_BLOCK         ^|[eq]#8 {times} 8#   ^|sRGB
-| ename:VK_FORMAT_ASTC_10x5_UNORM_BLOCK       ^|[eq]#10 {times} 5#  ^|Linear LDR
-| ename:VK_FORMAT_ASTC_10x5_SRGB_BLOCK        ^|[eq]#10 {times} 5#  ^|sRGB
-| ename:VK_FORMAT_ASTC_10x6_UNORM_BLOCK       ^|[eq]#10 {times} 6#  ^|Linear LDR
-| ename:VK_FORMAT_ASTC_10x6_SRGB_BLOCK        ^|[eq]#10 {times} 6#  ^|sRGB
-| ename:VK_FORMAT_ASTC_10x8_UNORM_BLOCK       ^|[eq]#10 {times} 8#  ^|Linear LDR
-| ename:VK_FORMAT_ASTC_10x8_SRGB_BLOCK        ^|[eq]#10 {times} 8#  ^|sRGB
-| ename:VK_FORMAT_ASTC_10x10_UNORM_BLOCK      ^|[eq]#10 {times} 10# ^|Linear LDR
-| ename:VK_FORMAT_ASTC_10x10_SRGB_BLOCK       ^|[eq]#10 {times} 10# ^|sRGB
-| ename:VK_FORMAT_ASTC_12x10_UNORM_BLOCK      ^|[eq]#12 {times} 10# ^|Linear LDR
-| ename:VK_FORMAT_ASTC_12x10_SRGB_BLOCK       ^|[eq]#12 {times} 10# ^|sRGB
-| ename:VK_FORMAT_ASTC_12x12_UNORM_BLOCK      ^|[eq]#12 {times} 12# ^|Linear LDR
-| ename:VK_FORMAT_ASTC_12x12_SRGB_BLOCK       ^|[eq]#12 {times} 12# ^|sRGB
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-| ename:VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT   ^|[eq]#4 {times} 4#   ^|HDR
-| ename:VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT   ^|[eq]#5 {times} 4#   ^|HDR
-| ename:VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT   ^|[eq]#5 {times} 5#   ^|HDR
-| ename:VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT   ^|[eq]#6 {times} 5#   ^|HDR
-| ename:VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT   ^|[eq]#6 {times} 6#   ^|HDR
-| ename:VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT   ^|[eq]#8 {times} 5#   ^|HDR
-| ename:VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT   ^|[eq]#8 {times} 6#   ^|HDR
-| ename:VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT   ^|[eq]#8 {times} 8#   ^|HDR
-| ename:VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT  ^|[eq]#10 {times} 5#  ^|HDR
-| ename:VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT  ^|[eq]#10 {times} 6#  ^|HDR
-| ename:VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT  ^|[eq]#10 {times} 8#  ^|HDR
-| ename:VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT ^|[eq]#10 {times} 10# ^|HDR
-| ename:VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT ^|[eq]#12 {times} 10# ^|HDR
-| ename:VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT ^|[eq]#12 {times} 12# ^|HDR
-endif::VK_EXT_texture_compression_astc_hdr[]
-|====
-
-ifndef::VK_EXT_texture_compression_astc_hdr[]
-ASTC textures containing any HDR blocks should: not be passed into the API
-using an sRGB or UNORM texture format.
-endif::VK_EXT_texture_compression_astc_hdr[]
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-ASTC textures containing HDR block encodings should: be passed to the API
-using an ASTC SFLOAT texture format.
-endif::VK_EXT_texture_compression_astc_hdr[]
-
-[NOTE]
-.Note
-====
-An HDR block in a texture passed using a LDR UNORM format will return the
-appropriate ASTC error color if the implementation supports only the ASTC
-LDR profile, but may result in either the error color or a decompressed HDR
-color if the implementation supports HDR decoding.
-====
-
-ifdef::VK_EXT_astc_decode_mode[]
-
-=== ASTC decode mode
-
-If the `VK_EXT_astc_decode_mode` extension is enabled, the decode mode is
-determined as follows:
-
-.Mapping of Vulkan ASTC decoding format to ASTC decoding modes
-[width="75%",options="header",cols="75%,25%"]
-|====
-| elink:VkFormat ^| Decoding mode
-| ename:VK_FORMAT_R16G16B16A16_SFLOAT    ^| decode_float16
-| ename:VK_FORMAT_R8G8B8A8_UNORM         ^| decode_unorm8
-| ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 ^| decode_rgb9e5
-|====
-
-Otherwise, the ASTC decode mode is decode_float16.
-
-Note that an implementation may: use HDR mode when linear LDR mode is
-requested unless the decode mode is decode_unorm8.
-endif::VK_EXT_astc_decode_mode[]
-ifndef::VK_EXT_astc_decode_mode[]
-The ASTC decode mode is decode_float16.
-
-Note that an implementation may: use HDR mode when linear LDR mode is
-requested.
-endif::VK_EXT_astc_decode_mode[]
-
-ifdef::VK_IMG_format_pvrtc[]
-<<<
-
-[[appendix-compressedtex-pvrtc]]
-== PVRTC Compressed Image Formats
-
-PVRTC formats are described in the "`PVRTC Compressed Texture Image
-Formats`" chapter of the <<data-format,Khronos Data Format Specification>>.
-
-.Mapping of Vulkan PVRTC formats to descriptions
-[width="75%",options="header",cols="63%,15%,22%"]
-|====
-| elink:VkFormat ^| Compressed texel block dimensions ^| sRGB-encoded
-| ename:VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG  ^|[eq]#8 {times} 4# ^|No
-| ename:VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG  ^|[eq]#4 {times} 4# ^|No
-| ename:VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG  ^|[eq]#8 {times} 4# ^|No
-| ename:VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG  ^|[eq]#4 {times} 4# ^|No
-| ename:VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG   ^|[eq]#8 {times} 4# ^|Yes
-| ename:VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG   ^|[eq]#4 {times} 4# ^|Yes
-| ename:VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG   ^|[eq]#8 {times} 4# ^|Yes
-| ename:VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG   ^|[eq]#4 {times} 4# ^|Yes
-|====
-endif::VK_IMG_format_pvrtc[]
diff --git a/registry/vulkan/appendices/credits.txt b/registry/vulkan/appendices/credits.txt
deleted file mode 100644
index 17d41bb..0000000
--- a/registry/vulkan/appendices/credits.txt
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[appendix]
-[[credits]]
-= Credits (Informative)
-
-Vulkan 1.2 is the result of contributions from many people and companies
-participating in the Khronos Vulkan Working Group, as well as input from the
-Vulkan Advisory Panel.
-
-Members of the Working Group, including the company that they represented at
-the time of their most recent contribution, are listed in the following
-section.
-Some specific contributions made by individuals are listed together with
-their name.
-
-
-== Working Group Contributors to Vulkan
-
-  * Aaron Greig, Codeplay Software Ltd.
-    (version 1.1)
-  * Aaron Hagan, AMD (version 1.1)
-  * Adam Jackson, Red Hat (versions 1.0, 1.1)
-  * Adam Śmigielski, Mobica (version 1.0)
-  * Aidan Fabius, Core Avionics & Industrial Inc.
-    (version 1.2)
-  * Alan Baker, Google (versions 1.1, 1.2)
-  * Alan Ward, Google (versions 1.1, 1.2)
-  * Alejandro Piñeiro, Igalia (version 1.1)
-  * Alex Bourd, Qualcomm Technologies, Inc.
-    (versions 1.0, 1.1)
-  * Alex Crabb, Caster Communications (version 1.2)
-  * Alex Walters, Imagination Technologies (version 1.2)
-  * Alexander Galazin, Arm (versions 1.0, 1.1, 1.2)
-  * Allen Hux, Intel (version 1.0)
-  * Alon Or-bach, Samsung Electronics (versions 1.0, 1.1, 1.2) (WSI
-    technical sub-group chair)
-  * Anastasia Stulova, Arm (version 1.2)
-  * Andreas Vasilakis, Think Silicon (version 1.2)
-  * Andres Gomez, Igalia (version 1.1)
-  * Andrew Cox, Samsung Electronics (version 1.0)
-  * Andrew Garrard, Samsung Electronics (versions 1.0, 1.1, 1.2) (format
-    wrangler)
-  * Andrew Poole, Samsung Electronics (version 1.0)
-  * Andrew Rafter, Samsung Electronics (version 1.0)
-  * Andrew Richards, Codeplay Software Ltd.
-    (version 1.0)
-  * Andrew Woloszyn, Google (versions 1.0, 1.1)
-  * Ann Thorsnes, Khronos (version 1.2)
-  * Antoine Labour, Google (versions 1.0, 1.1)
-  * Aras Pranckevičius, Unity Technologies (version 1.0)
-  * Ashwin Kolhe, NVIDIA (version 1.0)
-  * Baldur Karlsson, Independent (versions 1.1, 1.2)
-  * Barthold Lichtenbelt, NVIDIA (version 1.1)
-  * Bas Nieuwenhuizen, Google (versions 1.1, 1.2)
-  * Ben Bowman, Imagination Technologies (version 1.0)
-  * Benj Lipchak, Unknown (version 1.0)
-  * Bill Hollings, Brenwill (versions 1.0, 1.1, 1.2)
-  * Bill Licea-Kane, Qualcomm Technologies, Inc.
-    (versions 1.0, 1.1)
-  * Blaine Kohl, Khronos (version 1.2)
-  * Boris Zanin, Mobica (version 1.2)
-  * Brent E. Insko, Intel (version 1.0)
-  * Brian Ellis, Qualcomm Technologies, Inc.
-    (version 1.0)
-  * Brian Paul, VMware (version 1.2)
-  * Caio Marcelo de Oliveira Filho, Intel (version 1.2)
-  * Cass Everitt, Oculus VR (versions 1.0, 1.1)
-  * Cemil Azizoglu, Canonical (version 1.0)
-  * Chad Versace, Google (versions 1.0, 1.1, 1.2)
-  * Chang-Hyo Yu, Samsung Electronics (version 1.0)
-  * Chia-I Wu, LunarG (version 1.0)
-  * Chris Frascati, Qualcomm Technologies, Inc.
-    (version 1.0)
-  * Christophe Riccio, Unity Technologies (versions 1.0, 1.1)
-  * Cody Northrop, LunarG (version 1.0)
-  * Colin Riley, AMD (version 1.1)
-  * Cort Stratton, Google (versions 1.1, 1.2)
-  * Courtney Goeltzenleuchter, Google (versions 1.0, 1.1)
-  * Craig Davies, Huawei (version 1.2)
-  * Dae Kim, Imagination Technologies (version 1.1)
-  * Damien Leone, NVIDIA (version 1.0)
-  * Dan Baker, Oxide Games (versions 1.0, 1.1)
-  * Dan Ginsburg, Valve Software (versions 1.0, 1.1, 1.2)
-  * Daniel Johnston, Intel (versions 1.0, 1.1)
-  * Daniel Koch, NVIDIA (versions 1.0, 1.1, 1.2)
-  * Daniel Rakos, AMD (versions 1.0, 1.1, 1.2)
-  * Daniel Stone, Collabora (versions 1.1, 1.2)
-  * Daniel Vetter, Intel (version 1.2)
-  * David Airlie, Red Hat (versions 1.0, 1.1, 1.2)
-  * David Mao, AMD (versions 1.0, 1.2)
-  * David Miller, Miller & Mattson (versions 1.0, 1.1) (Vulkan reference
-    card)
-  * David Neto, Google (versions 1.0, 1.1, 1.2)
-  * David Wilkinson, AMD (version 1.2)
-  * David Yu, Pixar (version 1.0)
-  * Dejan Mircevski, Google (version 1.1)
-  * Dominik Witczak, AMD (versions 1.0, 1.1)
-  * Donald Scorgie, Imagination Technologies (version 1.2)
-  * Dzmitry Malyshau, Mozilla (versions 1.1, 1.2)
-  * Ed Hutchins, Oculus (version 1.2)
-  * Emily Stearns, Khronos (version 1.2)
-  * Frank (LingJun) Chen, Qualcomm Technologies, Inc.
-    (version 1.0)
-  * Fred Liao, Mediatek (version 1.0)
-  * Gabe Dagani, Freescale (version 1.0)
-  * Gabor Sines, AMD (version 1.2)
-  * Graeme Leese, Broadcom (versions 1.0, 1.1, 1.2)
-  * Graham Connor, Imagination Technologies (version 1.0)
-  * Graham Sellers, AMD (versions 1.0, 1.1)
-  * Greg Fischer, LunarG (version 1.1)
-  * Hai Nguyen, Google (version 1.2)
-  * Hans-Kristian Arntzen, Arm (versions 1.1, 1.2)
-  * Henri Verbeet, Codeweavers (version 1.2)
-  * Hwanyong Lee, Kyungpook National University (version 1.0)
-  * Iago Toral, Igalia (versions 1.1, 1.2)
-  * Ian Elliott, Google (versions 1.0, 1.1, 1.2)
-  * Ian Romanick, Intel (versions 1.0, 1.1)
-  * James Hughes, Oculus VR (version 1.0)
-  * James Jones, NVIDIA (versions 1.0, 1.1, 1.2)
-  * James Riordon, Khronos (version 1.2)
-  * Jan Hermes, Continental Corporation (versions 1.0, 1.1)
-  * Jan-Harald Fredriksen, Arm (versions 1.0, 1.1, 1.2)
-  * Jason Ekstrand, Intel (versions 1.0, 1.1, 1.2)
-  * Jean-François Roy, Google (versions 1.1, 1.2)
-  * Jeff Bolz, NVIDIA (versions 1.0, 1.1, 1.2)
-  * Jeff Juliano, NVIDIA (versions 1.0, 1.1, 1.2)
-  * Jeff Leger, Qualcomm Technologies, Inc.
-    (version 1.1)
-  * Jeff Vigil, Samsung Electronics (versions 1.0, 1.1, 1.2)
-  * Jens Owen, Google (versions 1.0, 1.1)
-  * Jeremy Hayes, LunarG (version 1.0)
-  * Jesse Barker, Unity Technologies (versions 1.0, 1.1, 1.2)
-  * Jesse Hall, Google (versions 1.0, 1.1, 1.2)
-  * Joe Davis, Samsung Electronics (version 1.1)
-  * Johannes van Waveren, Oculus VR (versions 1.0, 1.1)
-  * John Kessenich, Google (versions 1.0, 1.1, 1.2) (SPIR-V and GLSL for
-    Vulkan specification author)
-  * John McDonald, Valve Software (versions 1.0, 1.1, 1.2)
-  * John Zulauf, LunarG (versions 1.1, 1.2)
-  * Jon Ashburn, LunarG (version 1.0)
-  * Jon Leech, Independent (versions 1.0, 1.1, 1.2) (XML toolchain,
-    normative language, release wrangler)
-  * Jonas Gustavsson, Samsung Electronics (versions 1.0, 1.1)
-  * Jonas Meyer, Epic Games (version 1.2)
-  * Jonathan Hamilton, Imagination Technologies (version 1.0)
-  * Jordan Justen, Intel (version 1.1)
-  * Jungwoo Kim, Samsung Electronics (versions 1.0, 1.1)
-  * Jörg Wagner, Arm (version 1.1)
-  * Kalle Raita, Google (version 1.1)
-  * Karen Ghavam, LunarG (versions 1.1, 1.2)
-  * Karl Schultz, LunarG (versions 1.1, 1.2)
-  * Kathleen Mattson, Khronos (versions 1.0, 1.1, 1.2)
-  * Kaye Mason, Google (version 1.2)
-  * Keith Packard, Valve (version 1.2)
-  * Kenneth Benzie, Codeplay Software Ltd.
-    (versions 1.0, 1.1)
-  * Kenneth Russell, Google (version 1.1)
-  * Kerch Holt, NVIDIA (versions 1.0, 1.1)
-  * Kevin O'Neil, AMD (version 1.1)
-  * Kris Rose, Khronos (version 1.2)
-  * Kristian Kristensen, Intel (versions 1.0, 1.1)
-  * Krzysztof Iwanicki, Samsung Electronics (version 1.0)
-  * Larry Seiler, Intel (version 1.0)
-  * Lauri Ilola, Nokia (version 1.1)
-  * Lei Zhang, Google (version 1.2)
-  * Lenny Komow, LunarG (versions 1.1, 1.2)
-  * Lionel Landwerlin, Intel (versions 1.1, 1.2)
-  * Liz Maitral, Khronos (version 1.2)
-  * Lutz Latta, Lucasfilm (version 1.0)
-  * Maciej Jesionowski, AMD (version 1.1)
-  * Mais Alnasser, AMD (version 1.1)
-  * Marcin Rogucki, Mobica (version 1.1)
-  * Maria Rovatsou, Codeplay Software Ltd.
-    (version 1.0)
-  * Mark Callow, Independent (versions 1.0, 1.1, 1.2)
-  * Mark Kilgard, NVIDIA (versions 1.1, 1.2)
-  * Mark Lobodzinski, LunarG (versions 1.0, 1.1, 1.2)
-  * Mark Young, LunarG (version 1.1)
-  * Markus Tavenrath, NVIDIA (version 1.1)
-  * Mateusz Przybylski, Intel (version 1.0)
-  * Mathias Heyer, NVIDIA (versions 1.0, 1.1)
-  * Mathias Schott, NVIDIA (versions 1.0, 1.1)
-  * Matt Netsch, Qualcomm Technologies, Inc.
-    (version 1.1)
-  * Matthäus Chajdas, AMD (versions 1.1, 1.2)
-  * Maurice Ribble, Qualcomm Technologies, Inc.
-    (versions 1.0, 1.1)
-  * Maxim Lukyanov, Samsung Electronics (version 1.0)
-  * Michael Lentine, Google (version 1.0)
-  * Michael O'Hara, AMD (version 1.1)
-  * Michael Phillip, Samsung Electronics (version 1.2)
-  * Michael Wong, Codeplay Software Ltd.
-    (version 1.1)
-  * Michael Worcester, Imagination Technologies (versions 1.0, 1.1)
-  * Michal Pietrasiuk, Intel (version 1.0)
-  * Mika Isojarvi, Google (versions 1.0, 1.1)
-  * Mike Schuchardt, LunarG (versions 1.1, 1.2)
-  * Mike Stroyan, LunarG (version 1.0)
-  * Mike Weiblen, LunarG (versions 1.1, 1.2)
-  * Minyoung Son, Samsung Electronics (version 1.0)
-  * Mitch Singer, AMD (versions 1.0, 1.1, 1.2)
-  * Mythri Venugopal, Samsung Electronics (version 1.0)
-  * Naveen Leekha, Google (version 1.0)
-  * Neil Henning, AMD (versions 1.0, 1.1, 1.2)
-  * Neil Hickey, Arm (version 1.2)
-  * Neil Trevett, NVIDIA (versions 1.0, 1.1, 1.2)
-  * Nick Penwarden, Epic Games (version 1.0)
-  * Nicolai Hähnle, AMD (version 1.1)
-  * Niklas Smedberg, Unity Technologies (version 1.0)
-  * Norbert Nopper, Independent (versions 1.0, 1.1)
-  * Nuno Subtil, NVIDIA (versions 1.1, 1.2)
-  * Pat Brown, NVIDIA (version 1.0)
-  * Patrick Cozzi, Independent (version 1.1)
-  * Patrick Doane, Blizzard Entertainment (version 1.0)
-  * Peter Lohrmann, AMD (versions 1.0, 1.2)
-  * Petros Bantolas, Imagination Technologies (version 1.1)
-  * Pierre Boudier, NVIDIA (versions 1.0, 1.1, 1.2)
-  * Pierre-Loup Griffais, Valve Software (versions 1.0, 1.1, 1.2)
-  * Piers Daniell, NVIDIA (versions 1.0, 1.1, 1.2)
-  * Piotr Bialecki, Intel (version 1.0)
-  * Prabindh Sundareson, Samsung Electronics (version 1.0)
-  * Pyry Haulos, Google (versions 1.0, 1.1) (Vulkan conformance test
-    subcommittee chair)
-  * Rajeev Rao, Qualcomm (version 1.2)
-  * Ralph Potter, Codeplay Software Ltd.
-    (versions 1.1, 1.2)
-  * Ray Smith, Arm (versions 1.0, 1.1, 1.2)
-  * Richard Huddy, Samsung Electronics (version 1.2)
-  * Rob Barris, NVIDIA (version 1.1)
-  * Rob Stepinski, Transgaming (version 1.0)
-  * Robert Simpson, Qualcomm Technologies, Inc.
-    (versions 1.0, 1.1)
-  * Rolando Caloca Olivares, Epic Games (versions 1.0, 1.1, 1.2)
-  * Roy Ju, Mediatek (version 1.0)
-  * Rufus Hamade, Imagination Technologies (version 1.0)
-  * Ruihao Zhang, Qualcomm Technologies, Inc.
-    (versions 1.1, 1.2)
-  * Sean Ellis, Arm (version 1.0)
-  * Sean Harmer, KDAB Group (versions 1.0, 1.1)
-  * Shannon Woods, Google (versions 1.0, 1.1, 1.2)
-  * Slawomir Cygan, Intel (versions 1.0, 1.1)
-  * Slawomir Grajewski, Intel (versions 1.0, 1.1)
-  * Sorel Bosan, AMD (version 1.1)
-  * Spencer Fricke, Samsung Electronics (version 1.2)
-  * Stefanus Du Toit, Google (version 1.0)
-  * Stephen Huang, Mediatek (version 1.1)
-  * Steve Hill, Broadcom (versions 1.0, 1.2)
-  * Steve Viggers, Core Avionics & Industrial Inc.
-    (versions 1.0, 1.2)
-  * Stuart Smith, Imagination Technologies (versions 1.0, 1.1, 1.2)
-  * Tilmann Scheller, Samsung Electronics (version 1.1)
-  * Tim Foley, Intel (version 1.0)
-  * Timo Suoranta, AMD (version 1.0)
-  * Timothy Lottes, AMD (versions 1.0, 1.1)
-  * Tobias Hector, AMD (versions 1.0, 1.1, 1.2) (validity language and
-    toolchain)
-  * Tobin Ehlis, LunarG (version 1.0)
-  * Tom Olson, Arm (versions 1.0, 1.1, 1.2) (Working Group chair)
-  * Tomasz Bednarz, Independent (version 1.1)
-  * Tomasz Kubale, Intel (version 1.0)
-  * Tony Barbour, LunarG (versions 1.0, 1.1, 1.2)
-  * Victor Eruhimov, Unknown (version 1.1)
-  * Vincent Hindriksen, StreamHPC (version 1.2)
-  * Wayne Lister, Imagination Technologies (version 1.0)
-  * Wolfgang Engel, Unknown (version 1.1)
-  * Yanjun Zhang, VeriSilicon (versions 1.0, 1.1, 1.2)
-
-
-== Other Credits
-
-The Vulkan Advisory Panel members provided important real-world usage
-information and advice that helped guide design decisions.
-
-The wider Vulkan community have provided useful feedback, questions and
-specification changes that have helped improve the quality of the
-Specification via
-link:https://github.com/KhronosGroup/Vulkan-Docs/graphs/contributors[GitHub].
-
-Administrative support to the Working Group for Vulkan 1.1 and 1.2 was
-provided by Khronos staff including Angela Cheng, Ann Thorsnes, Blaine Kohl,
-Dominic Agoro-Ombaka, Emily Stearns, Jeff Phillips, Lisie Aartsen, and Liz
-Maitral; and by Alex Crabb of Caster Communications.
-
-Administrative support for Vulkan 1.0 was provided by Andrew Riegel,
-Elizabeth Riegel, Glenn Fredericks, Kathleen Mattson and Michelle Clark of
-Gold Standard Group.
-
-Technical support was provided by James Riordon, webmaster of Khronos.org
-and OpenGL.org.
-
diff --git a/registry/vulkan/appendices/extensions.txt b/registry/vulkan/appendices/extensions.txt
deleted file mode 100644
index 449b054..0000000
--- a/registry/vulkan/appendices/extensions.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[appendix]
-
-[[extensions]]
-= Layers & Extensions (Informative)
-
-Extensions to the Vulkan API can: be defined by authors, groups of authors,
-and the Khronos Vulkan Working Group.
-In order not to compromise the readability of the Vulkan Specification, the
-core Specification does not incorporate most extensions.
-The online Registry of extensions is available at URL
-
-https://www.khronos.org/registry/vulkan/
-
-and allows generating versions of the Specification incorporating different
-extensions.
-
-Most of the content previously in this appendix does not specify *use* of
-specific Vulkan extensions and layers, but rather specifies the processes by
-which extensions and layers are created.
-As of version 1.0.21 of the Vulkan Specification, this content has been
-migrated to the <<vulkan-styleguide, Vulkan Documentation and Extensions>>
-document.
-Authors creating extensions and layers must: follow the mandatory procedures
-in that document.
-
-The remainder of this appendix documents a set of extensions chosen when
-this document was built.
-Versions of the Specification published in the Registry include:
-
-  * Core API + mandatory extensions required of all Vulkan implementations.
-  * Core API + all registered and published Khronos (`KHR`) extensions.
-  * Core API + all registered and published extensions.
-
-Extensions are grouped as Khronos `KHR`, multivendor `EXT`, and then
-alphabetically by author ID.
-Within each group, extensions are listed in alphabetical order by their
-name.
-
-[NOTE]
-.Note
-====
-As of the initial Vulkan 1.1 public release, the `KHX` author ID is no
-longer used.
-All `KHX` extensions have been promoted to `KHR` status.
-Previously, this author ID was used to indicate that an extension was
-experimental, and is being considered for standardization in future `KHR` or
-core Vulkan API versions.
-We no longer use this mechanism for exposing experimental functionality.
-
-Some vendors may use an alternate author ID ending in `X` for some of their
-extensions.
-The exact meaning of such an author ID is defined by each vendor, and may
-not be equivalent to `KHX`, but it is likely to indicate a lesser degree of
-interface stability than a non-`X` extension from the same vendor.
-====
-
-include::{generated}/meta/current_extensions_appendix.txt[]
-include::{generated}/meta/provisional_extensions_appendix.txt[]
-include::{generated}/meta/deprecated_extensions_appendix.txt[]
diff --git a/registry/vulkan/appendices/glossary.txt b/registry/vulkan/appendices/glossary.txt
deleted file mode 100644
index 9a5d1b6..0000000
--- a/registry/vulkan/appendices/glossary.txt
+++ /dev/null
@@ -1,1838 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// The asciidoc [glossary] template cannot contain subsections.
-// The abbreviations and prefixes probably belong in the upcoming
-// API/extension-writing-guidelines appendix, anyway.
-
-[appendix]
-[[lexicon]]
-= Lexicon
-
-This appendix defines terms, abbreviations, and API prefixes used in the
-Specification.
-
-
-[[glossary]]
-== Glossary
-
-The terms defined in this section are used consistently throughout the
-Specification and may be used with or without capitalization.
-
-Accessible (Descriptor Binding)::
-    A descriptor binding is accessible to a shader stage if that stage is
-    included in the pname:stageFlags of the descriptor binding.
-    Descriptors using that binding can: only be used by stages in which they
-    are accessible.
-
-Acquire Operation (Resource)::
-    An operation that acquires ownership of an image subresource or buffer
-    range.
-
-ifdef::VK_VALVE_mutable_descriptor_type[]
-Active (Descriptor Type)::
-    When a descriptor with _mutable_ type is updated with
-    flink:vkUpdateDescriptorSets, the active descriptor type changes.
-    When the descriptor is consumed by shaders, it is the active descriptor
-    type which determines validity, i.e.
-    sname:VkDescriptorSetLayoutBinding::pname:descriptorType is replaced
-    with the active descriptor type.
-    A mismatch in active descriptor type and consumption by shader is
-    considered an undefined: descriptor.
-endif::VK_VALVE_mutable_descriptor_type[]
-
-ifdef::VK_EXT_transform_feedback[]
-Active (Transform Feedback)::
-    Transform feedback is made active after
-    flink:vkCmdBeginTransformFeedbackEXT executes and remains active until
-    flink:vkCmdEndTransformFeedbackEXT executes.
-    While transform feedback is active, data written to variables in the
-    output interface of the last
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stage>> of the graphics pipeline are captured to the bound transform
-    feedback buffers if those variables are decorated for transform
-    feedback.
-endif::VK_EXT_transform_feedback[]
-
-Adjacent Vertex::
-    A vertex in an adjacency primitive topology that is not part of a given
-    primitive, but is accessible in geometry shaders.
-
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-Active Object (Ray Tracing)::
-    A primitive or instance in a ray tracing acceleration structure which
-    has a corresponding ID, and is not _inactive_ (meaning that it is
-    visible to rays).
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-
-ifdef::VK_EXT_blend_operation_advanced[]
-Advanced Blend Operation::
-    Blending performed using one of the blend operation enums introduced by
-    the `apiext:VK_EXT_blend_operation_advanced` extension.
-    See <<framebuffer-blend-advanced, Advanced Blending Operations>>.
-endif::VK_EXT_blend_operation_advanced[]
-
-Alias (API type/command)::
-    An identical definition of another API type/command with the same
-    behavior but a different name.
-
-Aliased Range (Memory)::
-    A range of a device memory allocation that is bound to multiple
-    resources simultaneously.
-
-Allocation Scope::
-    An association of a host memory allocation to a parent object or
-    command, where the allocation's lifetime ends before or at the same time
-    as the parent object is freed or destroyed, or during the parent
-    command.
-
-Aspect (Image)::
-    An image may: contain multiple kinds, or aspects, of data for each
-    pixel, where each aspect is used in a particular way by the pipeline and
-    may: be stored differently or separately from other aspects.
-    For example, the color components of an image format make up the color
-    aspect of the image, and may: be used as a framebuffer color attachment.
-    Some operations, like depth testing, operate only on specific aspects of
-    an image.
-
-Attachment (Render Pass)::
-    A zero-based integer index name used in render pass creation to refer to
-    a framebuffer attachment that is accessed by one or more subpasses.
-    The index also refers to an attachment description which includes
-    information about the properties of the image view that will later be
-    attached.
-
-Availability Operation::
-    An operation that causes the values generated by specified memory write
-    accesses to become available for future access.
-
-Available::
-    A state of values written to memory that allows them to be made visible.
-
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-Axis-aligned Bounding Box::
-    A box bounding a region in space defined by extents along each axis and
-    thus representing a box where each edge is aligned to one of the major
-    axes.
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-
-Back-Facing::
-    See Facingness.
-
-Batch::
-    A single structure submitted to a queue as part of a
-    <<devsandqueues-submission, queue submission command>>, describing a set
-    of queue operations to execute.
-
-Backwards Compatibility::
-    A given version of the API is backwards compatible with an earlier
-    version if an application, relying only on valid behavior and
-    functionality defined by the earlier specification, is able to correctly
-    run against each version without any modification.
-    This assumes no active attempt by that application to not run when it
-    detects a different version.
-
-Binary Semaphore::
-    A semaphore with a boolean payload indicating whether the semaphore is
-    signaled or unsignaled.
-    Represented by a slink:VkSemaphore object
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-    created with a semaphore type of ename:VK_SEMAPHORE_TYPE_BINARY
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-    .
-
-Binding (Memory)::
-    An association established between a range of a resource object and a
-    range of a memory object.
-    These associations determine the memory locations affected by operations
-    performed on elements of a resource object.
-    Memory bindings are established using the flink:vkBindBufferMemory
-    command for non-sparse buffer objects, using the flink:vkBindImageMemory
-    command for non-sparse image objects, and using the
-    flink:vkQueueBindSparse command for sparse resources.
-
-Blend Constant::
-    Four floating point (RGBA) values used as an input to blending.
-
-Blending::
-    Arithmetic operations between a fragment color value and a value in a
-    color attachment that produce a final color value to be written to the
-    attachment.
-
-Buffer::
-    A resource that represents a linear array of data in device memory.
-    Represented by a slink:VkBuffer object.
-
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-Buffer Device Address::
-    A 64-bit value used in a shader to access buffer memory through the
-    code:PhysicalStorageBuffer storage class.
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-
-Buffer View::
-    An object that represents a range of a specific buffer, and state that
-    controls how the contents are interpreted.
-    Represented by a slink:VkBufferView object.
-
-Built-In Variable::
-    A variable decorated in a shader, where the decoration makes the
-    variable take values provided by the execution environment or values
-    that are generated by fixed-function pipeline stages.
-
-Built-In Interface Block::
-    A block defined in a shader that contains only variables decorated with
-    built-in decorations, and is used to match against other shader stages.
-
-Clip Coordinates::
-    The homogeneous coordinate space that vertex positions (code:Position
-    decoration) are written in by
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stages>>.
-
-Clip Distance::
-    A built-in output from
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stages>> that defines a clip half-space against which the primitive is
-    clipped.
-
-Clip Volume::
-    The intersection of the view volume with all clip half-spaces.
-
-Color Attachment::
-    A subpass attachment point, or image view, that is the target of
-    fragment color outputs and blending.
-
-ifdef::VK_AMD_shader_fragment_mask[]
-Color Fragment::
-    A unique color value within a pixel of a multisampled color image.
-    The _fragment mask_ will contain indices to the _color fragment_.
-endif::VK_AMD_shader_fragment_mask[]
-
-Color Renderable Format::
-    A elink:VkFormat where ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT is
-    set in one of the following, depending on the image's tiling:
-    * slink:VkFormatProperties::pname:linearTilingFeatures
-    * slink:VkFormatProperties::pname:optimalTilingFeatures
-ifdef::VK_EXT_image_drm_format_modifier[]
-    * slink:VkDrmFormatModifierPropertiesEXT::pname:drmFormatModifierTilingFeatures
-endif::VK_EXT_image_drm_format_modifier[]
-
-Combined Image Sampler::
-    A descriptor type that includes both a sampled image and a sampler.
-
-Command Buffer::
-    An object that records commands to be submitted to a queue.
-    Represented by a slink:VkCommandBuffer object.
-
-Command Pool::
-    An object that command buffer memory is allocated from, and that owns
-    that memory.
-    Command pools aid multithreaded performance by enabling different
-    threads to use different allocators, without internal synchronization on
-    each use.
-    Represented by a slink:VkCommandPool object.
-
-Compatible Allocator::
-    When allocators are compatible, allocations from each allocator can: be
-    freed by the other allocator.
-
-Compatible Image Formats::
-    When formats are compatible, images created with one of the formats can:
-    have image views created from it using any of the compatible formats.
-    Also see _Size-Compatible Image Formats_.
-
-Compatible Queues::
-    Queues within a queue family.
-    Compatible queues have identical properties.
-
-Complete Mipmap Chain::
-    The entire set of miplevels that can be provided for an image, from the
-    largest application specified miplevel size down to the _minimum
-    miplevel size_.
-    See <<resources-image-miplevel-sizing, Image Miplevel Sizing>>.
-
-ifdef::VK_KHR_deferred_host_operations[]
-Completed Operation::
-    A deferred operation whose corresponding command has been executed to
-    completion.
-    See <<deferred-host-operations, Deferred Host Operations>>
-endif::VK_KHR_deferred_host_operations[]
-
-Component (Format)::
-    A distinct part of a format.
-    Color components are represented with `R`, `G`, `B`, and `A`.
-    Depth and stencil components are represented with `D` and `S`.
-    Formats can: have multiple instances of the same component.
-    Some formats have other notations such as `E` or `X` which are not
-    considered a component of the format.
-
-Compressed Texel Block::
-    An element of an image having a block-compressed format, comprising a
-    rectangular block of texel values that are encoded as a single value in
-    memory.
-    Compressed texel blocks of a particular block-compressed format have a
-    corresponding width, height, and depth that define the dimensions of
-    these elements in units of texels, and a size in bytes of the encoding
-    in memory.
-
-Constant Integral Expressions::
-    A SPIR-V constant instruction whose type is code:OpTypeInt.
-    See _Constant Instruction_ in section 2.2.1 "`Instructions`" of the
-    <<spirv-spec,Khronos SPIR-V Specification>>.
-
-ifdef::VK_NV_cooperative_matrix[]
-Cooperative Matrix::
-    A SPIR-V type where the storage for and computations performed on the
-    matrix are spread across a set of invocations such as a subgroup.
-endif::VK_NV_cooperative_matrix[]
-
-ifdef::VK_NV_corner_sampled_image[]
-Corner-Sampled Image::
-    A slink:VkImage where unnormalized texel coordinates are centered on
-    integer values instead of half-integer values.
-    Specified by setting the ename:VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV bit
-    on slink:VkImageCreateInfo::pname:flags at image creation.
-endif::VK_NV_corner_sampled_image[]
-
-Coverage Index::
-    The index of a sample in the coverage mask.
-
-Coverage Mask::
-    A bitfield associated with a fragment representing the samples that were
-    determined to be covered based on the result of rasterization, and then
-    subsequently modified by fragment operations or the fragment shader.
-
-Cull Distance::
-    A built-in output from
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stages>> that defines a cull half-space where the primitive is rejected
-    if all vertices have a negative value for the same cull distance.
-
-Cull Volume::
-    The intersection of the view volume with all cull half-spaces.
-
-Decoration (SPIR-V)::
-    Auxiliary information such as built-in variables, stream numbers,
-    invariance, interpolation type, relaxed precision, etc., added to
-    variables or structure-type members through decorations.
-
-ifdef::VK_KHR_deferred_host_operations[]
-Deferrable Command::
-    A command which allows deferred execution of host-side work.
-    See <<deferred-host-operations,Deferred Host Operations>>.
-
-Deferrable Operation::
-    A single logical item of host-side work which can be deferred.
-    Represented by the slink:VkDeferredOperationKHR object.
-    See <<deferred-host-operations,Deferred Host Operations>>.
-endif::VK_KHR_deferred_host_operations[]
-
-Deprecated (feature)::
-    A feature is deprecated if it is no longer recommended as the correct or
-    best way to achieve its intended purpose.
-
-Depth/Stencil Attachment::
-    A subpass attachment point, or image view, that is the target of depth
-    and/or stencil test operations and writes.
-
-Depth/Stencil Format::
-    A elink:VkFormat that includes depth and/or stencil components.
-
-Depth/Stencil Image (or ImageView)::
-    A slink:VkImage (or slink:VkImageView) with a depth/stencil format.
-
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-Depth/Stencil Resolve Attachment::
-    A subpass attachment point, or image view, that is the target of a
-    multisample resolve operation from the corresponding depth/stencil
-    attachment at the end of the subpass.
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-
-Derivative Group::
-    A set of fragment
-ifdef::VK_NV_compute_shader_derivatives[]
-    or compute
-endif::VK_NV_compute_shader_derivatives[]
-    shader invocations that cooperate to compute derivatives, including
-    implicit derivatives for sampled image operations.
-
-Descriptor::
-    Information about a resource or resource view written into a descriptor
-    set that is used to access the resource or view from a shader.
-
-Descriptor Binding::
-    An entry in a descriptor set layout corresponding to zero or more
-    descriptors of a single descriptor type in a set.
-    Defined by a slink:VkDescriptorSetLayoutBinding structure.
-
-Descriptor Pool::
-    An object that descriptor sets are allocated from, and that owns the
-    storage of those descriptor sets.
-    Descriptor pools aid multithreaded performance by enabling different
-    threads to use different allocators, without internal synchronization on
-    each use.
-    Represented by a slink:VkDescriptorPool object.
-
-Descriptor Set::
-    An object that resource descriptors are written into via the API, and
-    that can: be bound to a command buffer such that the descriptors
-    contained within it can: be accessed from shaders.
-    Represented by a slink:VkDescriptorSet object.
-
-Descriptor Set Layout::
-    An object that defines the set of resources (types and counts) and their
-    relative arrangement (in the binding namespace) within a descriptor set.
-    Used when allocating descriptor sets and when creating pipeline layouts.
-    Represented by a slink:VkDescriptorSetLayout object.
-
-Device::
-    The processor(s) and execution environment that perform tasks requested
-    by the application via the Vulkan API.
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group_creation[]
-Device Group::
-    A set of physical devices that support accessing each other's memory and
-    recording a single command buffer that can: be executed on all the
-    physical devices.
-
-Device Index::
-    A zero-based integer that identifies one physical device from a logical
-    device.
-    A device index is valid if it is less than the number of physical
-    devices in the logical device.
-
-Device Mask::
-    A bitmask where each bit represents one device index.
-    A device mask value is valid if every bit that is set in the mask is at
-    a bit position that is less than the number of physical devices in the
-    logical device.
-endif::VK_VERSION_1_1,VK_KHR_device_group_creation[]
-
-Device Memory::
-    Memory accessible to the device.
-    Represented by a slink:VkDeviceMemory object.
-
-Device-Level Command::
-    Any command that is dispatched from a logical device, or from a child
-    object of a logical device.
-
-Device-Level Functionality::
-    All device-level commands and objects, and their structures, enumerated
-    types, and enumerants.
-
-Device-Level Object::
-    Logical device objects and their child objects.
-    For example, slink:VkDevice, slink:VkQueue, and slink:VkCommandBuffer
-    objects are device-level objects.
-
-Device-Local Memory::
-    Memory that is connected to the device, and may: be more performant for
-    device access than host-local memory.
-
-Direct Drawing Commands::
-    _Drawing commands_ that take all their parameters as direct arguments to
-    the command (and not sourced via structures in buffer memory as the
-    _indirect drawing commands_).
-    Includes
-ifdef::VK_EXT_multi_draw[]
-    flink:vkCmdDrawMultiIndexedEXT, flink:vkCmdDrawMultiEXT,
-endif::VK_EXT_multi_draw[]
-ifdef::VK_NV_mesh_shader[]
-    flink:vkCmdDrawMeshTasksNV,
-endif::VK_NV_mesh_shader[]
-    flink:vkCmdDraw, and flink:vkCmdDrawIndexed.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-Disjoint::
-    _Disjoint planes_ are _image planes_ to which memory is bound
-    independently. +
-    A _disjoint image_ consists of multiple _disjoint planes_, and is
-    created with the ename:VK_IMAGE_CREATE_DISJOINT_BIT bit set.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-Dispatchable Command::
-    A non-global command.
-    The first argument to each dispatchable command is a dispatchable handle
-    type.
-
-Dispatchable Handle::
-    A handle of a pointer handle type which may: be used by layers as part
-    of intercepting API commands.
-
-Dispatching Commands::
-    Commands that provoke work using a compute pipeline.
-    Includes flink:vkCmdDispatch and flink:vkCmdDispatchIndirect.
-
-Drawing Commands::
-    Commands that provoke work using a graphics pipeline.
-    Includes flink:vkCmdDraw, flink:vkCmdDrawIndexed,
-ifdef::VK_VERSION_1_2[]
-    flink:vkCmdDrawIndirectCount, flink:vkCmdDrawIndexedIndirectCount,
-endif::VK_VERSION_1_2[]
-ifdef::VK_KHR_draw_indirect_count[]
-    flink:vkCmdDrawIndirectCountKHR, flink:vkCmdDrawIndexedIndirectCountKHR,
-endif::VK_KHR_draw_indirect_count[]
-ifdef::VK_AMD_draw_indirect_count[]
-    flink:vkCmdDrawIndirectCountAMD, flink:vkCmdDrawIndexedIndirectCountAMD,
-endif::VK_AMD_draw_indirect_count[]
-ifdef::VK_EXT_multi_draw[]
-    flink:vkCmdDrawMultiIndexedEXT, flink:vkCmdDrawMultiEXT,
-endif::VK_EXT_multi_draw[]
-ifdef::VK_NV_mesh_shader[]
-    flink:vkCmdDrawMeshTasksNV, flink:vkCmdDrawMeshTasksIndirectNV,
-    flink:vkCmdDrawMeshTasksIndirectCountNV,
-endif::VK_NV_mesh_shader[]
-    flink:vkCmdDrawIndirect, and flink:vkCmdDrawIndexedIndirect.
-
-Duration (Command)::
-    The _duration_ of a Vulkan command refers to the interval between
-    calling the command and its return to the caller.
-
-Dynamic Storage Buffer::
-    A storage buffer whose offset is specified each time the storage buffer
-    is bound to a command buffer via a descriptor set.
-
-Dynamic Uniform Buffer::
-    A uniform buffer whose offset is specified each time the uniform buffer
-    is bound to a command buffer via a descriptor set.
-
-Dynamically Uniform::
-    See _Dynamically Uniform_ in section 2.2 "`Terms`" of the
-    <<spirv-spec,Khronos SPIR-V Specification>>.
-
-Element::
-    Arrays are composed of multiple elements, where each element exists at a
-    unique index within that array.
-    Used primarily to describe data passed to or returned from the Vulkan
-    API.
-
-Explicitly-Enabled Layer::
-    A layer enabled by the application by adding it to the enabled layer
-    list in flink:vkCreateInstance or flink:vkCreateDevice.
-
-Event::
-    A synchronization primitive that is signaled when execution of previous
-    commands completes through a specified set of pipeline stages.
-    Events can be waited on by the device and polled by the host.
-    Represented by a slink:VkEvent object.
-
-Executable State (Command Buffer)::
-    A command buffer that has ended recording commands and can: be executed.
-    See also Initial State and Recording State.
-
-Execution Dependency::
-    A dependency that guarantees that certain pipeline stages`' work for a
-    first set of commands has completed execution before certain pipeline
-    stages`' work for a second set of commands begins execution.
-    This is accomplished via pipeline barriers, subpass dependencies,
-    events, or implicit ordering operations.
-
-Execution Dependency Chain::
-    A sequence of execution dependencies that transitively act as a single
-    execution dependency.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-Explicit chroma reconstruction::
-    An implementation of sampler {YCbCr} conversion which reconstructs
-    reduced-resolution chroma samples to luma resolution and then separately
-    performs texture sample interpolation.
-    This is distinct from an implicit implementation, which incorporates
-    chroma sample reconstruction into texture sample interpolation.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-Extension Scope::
-    The set of objects and commands that can: be affected by an extension.
-    Extensions are either device scope or instance scope.
-
-Extending Structure::
-    A structure type which may appear in the _pname:pNext chain_ of another
-    structure, extending the functionality of the other structure.
-    Extending structures may be defined by either core API versions or
-    extensions.
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory_capabilities,VK_KHR_external_semaphore_capabilities,VK_KHR_external_fence_capabilities[]
-External Handle::
-    A resource handle which has meaning outside of a specific Vulkan device
-    or its parent instance.
-    External handles may: be used to share resources between multiple Vulkan
-    devices in different instances, or between Vulkan and other APIs.
-    Some external handle types correspond to platform-defined handles, in
-    which case the resource may: outlive any particular Vulkan device or
-    instance and may: be transferred between processes, or otherwise
-    manipulated via functionality defined by the platform for that handle
-    type.
-endif::VK_VERSION_1_1,VK_KHR_external_memory_capabilities,VK_KHR_external_semaphore_capabilities,VK_KHR_external_fence_capabilities[]
-
-External synchronization::
-    A type of synchronization required: of the application, where parameters
-    defined to be externally synchronized must: not be used simultaneously
-    in multiple threads.
-
-Facingness (Polygon)::
-    A classification of a polygon as either front-facing or back-facing,
-    depending on the orientation (winding order) of its vertices.
-
-Facingness (Fragment)::
-    A fragment is either front-facing or back-facing, depending on the
-    primitive it was generated from.
-    If the primitive was a polygon (regardless of polygon mode), the
-    fragment inherits the facingness of the polygon.
-    All other fragments are front-facing.
-
-Fence::
-    A synchronization primitive that is signaled when a set of batches or
-    sparse binding operations complete execution on a queue.
-    Fences can: be waited on by the host.
-    Represented by a slink:VkFence object.
-
-Flat Shading::
-    A property of a vertex attribute that causes the value from a single
-    vertex (the provoking vertex) to be used for all vertices in a
-    primitive, and for interpolation of that attribute to return that single
-    value unaltered.
-
-Format Features::
-    A set of features from elink:VkFormatFeatureFlagBits that a
-    elink:VkFormat is capable of using for various commands.
-    The list is determined by factors such as elink:VkImageTiling.
-
-Fragment::
-    A rectangular framebuffer region with associated data produced by
-    <<primsrast,rasterization>> and processed by <<fragops,fragment
-    operations>> including the fragment shader.
-
-[[glossary-fragment-area]]
-Fragment Area::
-    The width and height, in pixels, of a fragment.
-
-ifdef::VK_EXT_fragment_density_map[]
-[[glossary-fragment-density]]
-Fragment Density::
-    The ratio of fragments per framebuffer area in the x and y direction.
-
-[[glossary-fragment-density-texel-size]]
-Fragment Density Texel Size::
-    The [eq]#(w,h)# framebuffer region in pixels that each texel in a
-    fragment density map applies to.
-endif::VK_EXT_fragment_density_map[]
-
-Fragment Input Attachment Interface::
-    Variables with code:UniformConstant storage class and a decoration of
-    code:InputAttachmentIndex that are statically used by a fragment
-    shader's entry point, which receive values from input attachments.
-
-ifdef::VK_AMD_shader_fragment_mask[]
-Fragment Mask::
-    A lookup table that associates color samples with color fragment values.
-endif::VK_AMD_shader_fragment_mask[]
-
-Fragment Output Interface::
-    A fragment shader entry point's variables with code:Output storage
-    class, which output to color and/or depth/stencil attachments.
-
-Framebuffer::
-    A collection of image views and a set of dimensions that, in conjunction
-    with a render pass, define the inputs and outputs used by drawing
-    commands.
-    Represented by a slink:VkFramebuffer object.
-
-Framebuffer Attachment::
-    One of the image views used in a framebuffer.
-
-Framebuffer Coordinates::
-    A coordinate system in which adjacent pixels`' coordinates differ by 1
-    in x and/or y, with [eq]#(0,0)# in the upper left corner and pixel
-    centers at half-integers.
-
-Framebuffer-Space::
-    Operating with respect to framebuffer coordinates.
-
-Framebuffer-Local::
-    A framebuffer-local dependency guarantees that only for a single
-    framebuffer region, the first set of operations happens-before the
-    second set of operations.
-
-Framebuffer-Global::
-    A framebuffer-global dependency guarantees that for all framebuffer
-    regions, the first set of operations happens-before the second set of
-    operations.
-
-Framebuffer Region::
-    A framebuffer region is a set of sample (x, y, layer, sample)
-    coordinates that is a subset of the entire framebuffer.
-
-Front-Facing::
-    See Facingness.
-
-Full Compatibility::
-    A given version of the API is fully compatible with another version if
-    an application, relying only on valid behavior and functionality defined
-    by either of those specifications, is able to correctly run against each
-    version without any modification.
-    This assumes no active attempt by that application to not run when it
-    detects a different version.
-
-Global Command::
-    A Vulkan command for which the first argument is not a dispatchable
-    handle type.
-
-Global Workgroup::
-    A collection of local workgroups dispatched by a single dispatching
-ifdef::VK_NV_mesh_shader[or single mesh task drawing]
-    command.
-
-Handle::
-    An opaque integer or pointer value used to refer to a Vulkan object.
-    Each object type has a unique handle type.
-
-Happen-after, happens-after::
-    A transitive, irreflexive and antisymmetric ordering relation between
-    operations.
-    An execution dependency with a source of *A* and a destination of *B*
-    enforces that *B* happens-after *A*.
-    The inverse relation of happens-before.
-
-Happen-before, happens-before::
-    A transitive, irreflexive and antisymmetric ordering relation between
-    operations.
-    An execution dependency with a source of *A* and a destination of *B*
-    enforces that *A* happens-before *B*.
-    The inverse relation of happens-after.
-
-Helper Invocation::
-    A fragment shader invocation that is created solely for the purposes of
-    evaluating derivatives for use in non-helper fragment shader
-    invocations, and which does not have side effects.
-
-Host::
-    The processor(s) and execution environment that the application runs on,
-    and that the Vulkan API is exposed on.
-
-Host Mapped Device Memory::
-    Device memory that is mapped for host access using flink:vkMapMemory.
-
-ifdef::VK_EXT_external_memory_host[]
-Host Mapped Foreign Memory::
-    Memory owned by a foreign device that is mapped for host access.
-endif::VK_EXT_external_memory_host[]
-
-Host Memory::
-    Memory not accessible to the device, used to store implementation data
-    structures.
-
-Host-Accessible Subresource::
-    A buffer, or a linear image subresource in either the
-    ename:VK_IMAGE_LAYOUT_PREINITIALIZED or ename:VK_IMAGE_LAYOUT_GENERAL
-    layout.
-    Host-accessible subresources have a well-defined addressing scheme which
-    can be used by the host.
-
-Host-Local Memory::
-    Memory that is not local to the device, and may: be less performant for
-    device access than device-local memory.
-
-Host-Visible Memory::
-    Device memory that can: be mapped on the host and can: be read and
-    written by the host.
-
-Identically Defined Objects::
-    Objects of the same type where all arguments to their creation or
-    allocation functions, with the exception of pname:pAllocator, are +
-    . Vulkan handles which refer to the same object or
-    . identical scalar or enumeration values or
-    . Host pointers which point to an array of values or structures which
-      also satisfy these three constraints.
-
-Image::
-    A resource that represents a multi-dimensional formatted interpretation
-    of device memory.
-    Represented by a slink:VkImage object.
-
-Image Subresource::
-    A specific mipmap level and layer of an image.
-
-Image Subresource Range::
-    A set of image subresources that are contiguous mipmap levels and
-    layers.
-
-Image View::
-    An object that represents an image subresource range of a specific
-    image, and state that controls how the contents are interpreted.
-    Represented by a slink:VkImageView object.
-
-Immutable Sampler::
-    A sampler descriptor provided at descriptor set layout creation time,
-    and that is used for that binding in all descriptor sets allocated from
-    the layout, and cannot be changed.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-Implicit chroma reconstruction::
-    An implementation of sampler {YCbCr} conversion which reconstructs the
-    reduced-resolution chroma samples directly at the sample point, as part
-    of the normal texture sampling operation.
-    This is distinct from an _explicit chroma reconstruction_
-    implementation, which reconstructs the reduced-resolution chroma samples
-    to the resolution of the luma samples, then filters the result as part
-    of texture sample interpolation.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-Implicitly-Enabled Layer::
-    A layer enabled by a loader-defined mechanism outside the Vulkan API,
-    rather than explicitly by the application during instance or device
-    creation.
-
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-Inactive Object (Ray Tracing)::
-    A primitive or instance in a ray tracing acceleration structure which
-    has a corresponding ID, but which will never report an intersection with
-    any ray.
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-
-Index Buffer::
-    A buffer bound via flink:vkCmdBindIndexBuffer which is the source of
-    index values used to fetch vertex attributes for a
-    flink:vkCmdDrawIndexed or flink:vkCmdDrawIndexedIndirect command.
-
-Indexed Drawing Commands::
-    _Drawing commands_ which use an _index buffer_ as the source of index
-    values used to fetch vertex attributes for a drawing command.
-    Includes flink:vkCmdDrawIndexed,
-ifdef::VK_VERSION_1_2[]
-    flink:vkCmdDrawIndexedIndirectCount,
-endif::VK_VERSION_1_2[]
-ifdef::VK_KHR_draw_indirect_count[]
-    flink:vkCmdDrawIndexedIndirectCountKHR,
-endif::VK_KHR_draw_indirect_count[]
-ifdef::VK_AMD_draw_indirect_count[]
-    flink:vkCmdDrawIndexedIndirectCountAMD,
-endif::VK_AMD_draw_indirect_count[]
-ifdef::VK_EXT_multi_draw[]
-    flink:vkCmdDrawMultiIndexedEXT,
-endif::VK_EXT_multi_draw[]
-    and flink:vkCmdDrawIndexedIndirect.
-
-Indirect Commands::
-    Drawing or dispatching commands that source some of their parameters
-    from structures in buffer memory.
-    Includes flink:vkCmdDrawIndirect, flink:vkCmdDrawIndexedIndirect,
-ifdef::VK_VERSION_1_2[]
-    flink:vkCmdDrawIndirectCount, flink:vkCmdDrawIndexedIndirectCount,
-endif::VK_VERSION_1_2[]
-ifdef::VK_KHR_draw_indirect_count[]
-    flink:vkCmdDrawIndirectCountKHR, flink:vkCmdDrawIndexedIndirectCountKHR,
-endif::VK_KHR_draw_indirect_count[]
-ifdef::VK_AMD_draw_indirect_count[]
-    flink:vkCmdDrawIndirectCountAMD, flink:vkCmdDrawIndexedIndirectCountAMD,
-endif::VK_AMD_draw_indirect_count[]
-ifdef::VK_NV_mesh_shader[]
-    flink:vkCmdDrawMeshTasksIndirectNV,
-    flink:vkCmdDrawMeshTasksIndirectCountNV,
-endif::VK_NV_mesh_shader[]
-    and flink:vkCmdDispatchIndirect.
-
-ifdef::VK_NV_device_generated_commands[]
-Indirect Commands Layout::
-    A definition of a sequence of commands, that are generated on the device
-    via flink:vkCmdPreprocessGeneratedCommandsNV and
-    flink:vkCmdExecuteGeneratedCommandsNV.
-    Each sequence is comprised of multiple
-    elink:VkIndirectCommandsTokenTypeNV, which represent a subset of
-    traditional command buffer commands.
-    Represented as slink:VkIndirectCommandsLayoutNV.
-endif::VK_NV_device_generated_commands[]
-
-Indirect Drawing Commands::
-    _Drawing commands_ that source some of their parameters from structures
-    in buffer memory.
-    Includes flink:vkCmdDrawIndirect,
-ifdef::VK_VERSION_1_2[]
-    flink:vkCmdDrawIndirectCount, flink:vkCmdDrawIndexedIndirectCount,
-endif::VK_VERSION_1_2[]
-ifdef::VK_KHR_draw_indirect_count[]
-    flink:vkCmdDrawIndirectCountKHR, flink:vkCmdDrawIndexedIndirectCountKHR,
-endif::VK_KHR_draw_indirect_count[]
-ifdef::VK_AMD_draw_indirect_count[]
-    flink:vkCmdDrawIndirectCountAMD, flink:vkCmdDrawIndexedIndirectCountAMD,
-endif::VK_AMD_draw_indirect_count[]
-ifdef::VK_NV_mesh_shader[]
-    flink:vkCmdDrawMeshTasksIndirectNV,
-    flink:vkCmdDrawMeshTasksIndirectCountNV,
-endif::VK_NV_mesh_shader[]
-    and flink:vkCmdDrawIndexedIndirect.
-
-Initial State (Command Buffer)::
-    A command buffer that has not begun recording commands.
-    See also Recording State and Executable State.
-
-ifdef::VK_EXT_inline_uniform_block[]
-Inline Uniform Block::
-    A descriptor type that represents uniform data stored directly in
-    descriptor sets, and supports read-only access in a shader.
-endif::VK_EXT_inline_uniform_block[]
-
-Input Attachment::
-    A descriptor type that represents an image view, and supports unfiltered
-    read-only access in a shader, only at the fragment's location in the
-    view.
-
-Instance::
-    The top-level Vulkan object, which represents the application's
-    connection to the implementation.
-    Represented by a slink:VkInstance object.
-
-Instance-Level Command::
-    Any command that is dispatched from an instance, or from a child object
-    of an instance, except for physical devices and their children.
-
-Instance-Level Functionality::
-    All instance-level commands and objects, and their structures,
-    enumerated types, and enumerants.
-
-Instance-Level Object::
-    High-level Vulkan objects, which are not physical devices, nor children
-    of physical devices.
-    For example, slink:VkInstance is an instance-level object.
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-Instance (Memory)::
-    In a logical device representing more than one physical device, some
-    device memory allocations have the requested amount of memory allocated
-    multiple times, once for each physical device in a device mask.
-    Each such replicated allocation is an instance of the device memory.
-
-Instance (Resource)::
-    In a logical device representing more than one physical device, buffer
-    and image resources exist on all physical devices but can: be bound to
-    memory differently on each.
-    Each such replicated resource is an instance of the resource.
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-Internal Synchronization::
-    A type of synchronization required: of the implementation, where
-    parameters not defined to be externally synchronized may: require
-    internal mutexing to avoid multithreaded race conditions.
-
-Invocation (Shader)::
-    A single execution of an entry point in a SPIR-V module.
-    For example, a single vertex's execution of a vertex shader or a single
-    fragment's execution of a fragment shader.
-
-Invocation Group::
-    A set of shader invocations that are executed in parallel and that must:
-    execute the same control flow path in order for control flow to be
-    considered dynamically uniform.
-
-ifdef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-Invocation Repack Instruction::
-    A ray tracing shader call <<ray-tracing-repack,instruction>> where the
-    implementation may: change the set of invocations that are executing.
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-
-ifdef::VK_KHR_deferred_host_operations[]
-Join (Deferred Host Operations)::
-    The act of instructing a thread to participate in the execution of a
-    deferred operation.
-    See <<deferred-host-operations, Deferred Host Operations>>.
-endif::VK_KHR_deferred_host_operations[]
-
-[[glossary-linear-resource]]
-Linear Resource::
-+
---
-A resource is _linear_ if it is one of the following:
-
-  * a slink:VkBuffer
-  * a slink:VkImage created with ename:VK_IMAGE_TILING_LINEAR
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * a slink:VkImage created with
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT and whose
-    <<glossary-drm-format-modifier,Linux DRM format modifier>> is
-    code:DRM_FORMAT_MOD_LINEAR
-endif::VK_EXT_image_drm_format_modifier[]
-ifdef::VK_NV_ray_tracing[]
-  * a slink:VkAccelerationStructureNV
-endif::VK_NV_ray_tracing[]
-ifdef::VK_KHR_acceleration_structure[]
-
-Because a slink:VkAccelerationStructureKHR resource does not have memory
-bound to it directly, it is considered neither linear nor non-linear.
-However, the slink:VkBuffer on which a slink:VkAccelerationStructureKHR
-resource is placed is a linear resource.
-endif::VK_KHR_acceleration_structure[]
-
-A resource is _non-linear_ if it is one of the following:
-
-  * a slink:VkImage created with ename:VK_IMAGE_TILING_OPTIMAL
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * a slink:VkImage created with
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT and whose
-    <<glossary-drm-format-modifier,Linux DRM format modifier>> is not
-    code:DRM_FORMAT_MOD_LINEAR
-endif::VK_EXT_image_drm_format_modifier[]
---
-
-ifdef::VK_EXT_image_drm_format_modifier[]
-[[glossary-drm-format-modifier,Linux DRM format modifier]]
-Linux DRM Format Modifier::
-    A 64-bit, vendor-prefixed, semi-opaque unsigned integer describing
-    vendor-specific details of an image's memory layout.
-    In Linux graphics APIs, _modifiers_ are commonly used to specify the
-    memory layout of externally shared images.
-    An image has a _modifier_ if and only if it is created with pname:tiling
-    equal to ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT.
-    For more details, refer to the appendix for extension
-    `apiext:VK_EXT_image_drm_format_modifier`.
-endif::VK_EXT_image_drm_format_modifier[]
-
-Local Workgroup::
-    A collection of compute shader invocations invoked by a single
-    dispatching command, which share data via code:WorkgroupLocal variables
-    and can synchronize with each other.
-
-Logical Device::
-    An object that represents the application's interface to the physical
-    device.
-    The logical device is the parent of most Vulkan objects.
-    Represented by a slink:VkDevice object.
-
-Logical Operation::
-    Bitwise operations between a fragment color value and a value in a color
-    attachment, that produce a final color value to be written to the
-    attachment.
-
-Lost Device::
-    A state that a logical device may: be in as a result of unrecoverable
-    implementation errors, or other exceptional conditions.
-
-Mappable::
-    See Host-Visible Memory.
-
-Memory Dependency::
-    A memory dependency is an execution dependency which includes
-    availability and visibility operations such that:
-
-  * The first set of operations happens-before the availability operation
-  * The availability operation happens-before the visibility operation
-  * The visibility operation happens-before the second set of operations
-
-Memory Domain::
-    A memory domain is an abstract place to which memory writes are made
-    available by availability operations and memory domain operations.
-    The memory domains correspond to the set of agents that the write can:
-    then be made visible to.
-    The memory domains are _host_, _device_, _shader_, _workgroup instance_
-    (for workgroup instance there is a unique domain for each compute
-    workgroup) and _subgroup instance_ (for subgroup instance there is a
-    unique domain for each subgroup).
-
-Memory Domain Operation::
-    An operation that makes the writes that are available to one memory
-    domain available to another memory domain.
-
-Memory Heap::
-    A region of memory from which device memory allocations can: be made.
-
-Memory Type::
-    An index used to select a set of memory properties (e.g. mappable,
-    cached) for a device memory allocation.
-
-ifdef::VK_NV_mesh_shader[]
-Mesh Shading Pipeline::
-    A graphics pipeline where the primitives are assembled explicitly in the
-    shader stages.
-    In contrast to the primitive shading pipeline where input primitives are
-    assembled by fixed function processing.
-endif::VK_NV_mesh_shader[]
-
-ifdef::VK_NV_mesh_shader[]
-Mesh Tasks Drawing Commands::
-    _Drawing commands_ which create shader invocations organized in
-    workgroups for drawing mesh tasks.
-    Includes flink:vkCmdDrawMeshTasksNV, flink:vkCmdDrawMeshTasksIndirectNV,
-    and flink:vkCmdDrawMeshTasksIndirectCountNV.
-endif::VK_NV_mesh_shader[]
-
-Minimum Miplevel Size::
-    The smallest size that is permitted for a miplevel.
-    For conventional images this is 1x1x1.
-ifdef::VK_NV_corner_sampled_image[]
-    For corner-sampled images, this is 2x2x2.
-endif::VK_NV_corner_sampled_image[]
-    See <<resources-image-miplevel-sizing, Image Miplevel Sizing>>.
-
-Mip Tail Region::
-    The set of mipmap levels of a sparse residency texture that are too
-    small to fill a sparse block, and that must: all be bound to memory
-    collectively and opaquely.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-Multi-planar::
-    A _multi-planar format_ (or "`planar format`") is an image format
-    consisting of more than one _plane_, identifiable with a etext:_2PLANE
-    or etext:_3PLANE component to the format name and listed in
-    <<formats-requiring-sampler-ycbcr-conversion>>.
-    A _multi-planar image_ (or "`planar image`") is an image of a
-    multi-planar format.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-Non-Dispatchable Handle::
-    A handle of an integer handle type.
-    Handle values may: not be unique, even for two objects of the same type.
-
-Non-Indexed Drawing Commands::
-    _Drawing commands_ for which the vertex attributes are sourced in linear
-    order from the vertex input attributes for a drawing command (i.e. they
-    do not use an _index buffer_).
-    Includes flink:vkCmdDraw,
-ifdef::VK_VERSION_1_2[]
-    flink:vkCmdDrawIndirectCount,
-endif::VK_VERSION_1_2[]
-ifdef::VK_KHR_draw_indirect_count[]
-    flink:vkCmdDrawIndirectCountKHR,
-endif::VK_KHR_draw_indirect_count[]
-ifdef::VK_AMD_draw_indirect_count[]
-    flink:vkCmdDrawIndirectCountAMD,
-endif::VK_AMD_draw_indirect_count[]
-ifdef::VK_EXT_multi_draw[]
-    flink:vkCmdDrawMultiEXT,
-endif::VK_EXT_multi_draw[]
-    and flink:vkCmdDrawIndirect.
-
-Normalized::
-    A value that is interpreted as being in the range [eq]#[0,1]# as a
-    result of being implicitly divided by some other value.
-
-Normalized Device Coordinates::
-    A coordinate space after perspective division is applied to clip
-    coordinates, and before the viewport transformation converts to
-    framebuffer coordinates.
-
-Obsoleted (feature)::
-    A feature is obsolete if it can no longer be used.
-
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-Opaque Capture Address::
-    A 64-bit value representing the device address of a buffer or memory
-    object that is expected to be used by trace capture/replay tools in
-    combination with the
-    <<features-bufferDeviceAddress,bufferDeviceAddress>> feature.
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-
-Overlapped Range (Aliased Range)::
-    The aliased range of a device memory allocation that intersects a given
-    image subresource of an image or range of a buffer.
-
-Ownership (Resource)::
-    If an entity (e.g. a queue family) has ownership of a resource, access
-    to that resource is well-defined for access by that entity.
-
-Packed Format::
-    A format whose components are stored as a single texel block in memory,
-    with their relative locations defined within that element.
-
-ifdef::VK_NV_geometry_shader_passthrough[]
-Passthrough Geometry Shader::
-    A geometry shader which uses the code:PassthroughNV decoration on a
-    variable in its input interface.
-    Output primitives in a passthrough geometry shader always have the same
-    topology as the input primitive and are not produced by emitting
-    vertices.
-endif::VK_NV_geometry_shader_passthrough[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_semaphore,VK_KHR_external_fence[]
-Payload::
-    Importable or exportable reference to the internal data of an object in
-    Vulkan.
-endif::VK_VERSION_1_1,VK_KHR_external_semaphore,VK_KHR_external_fence[]
-
-ifdef::VK_NV_mesh_shader[]
-Per-View::
-    A variable that has an array of values which are output, one for each
-    view that is being generated.
-    A mesh shader which uses the code:PerViewNV decoration on a variable in
-    its output interface.
-endif::VK_NV_mesh_shader[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-Peer Memory::
-    An instance of memory corresponding to a different physical device than
-    the physical device performing the memory access, in a logical device
-    that represents multiple physical devices.
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-Physical Device::
-    An object that represents a single device in the system.
-    Represented by a slink:VkPhysicalDevice object.
-
-Physical-Device-Level Command::
-    Any command that is dispatched from a physical device.
-
-Physical-Device-Level Functionality::
-    All physical-device-level commands and objects, and their structures,
-    enumerated types, and enumerants.
-
-Physical-Device-Level Object::
-    Physical device objects.
-    For example, slink:VkPhysicalDevice is a physical-device-level object.
-
-Pipeline::
-    An object that controls how graphics or compute work is executed on the
-    device.
-    A pipeline includes one or more shaders, as well as state controlling
-    any non-programmable stages of the pipeline.
-    Represented by a slink:VkPipeline object.
-
-Pipeline Barrier::
-    An execution and/or memory dependency recorded as an explicit command in
-    a command buffer, that forms a dependency between the previous and
-    subsequent commands.
-
-Pipeline Cache::
-    An object that can: be used to collect and retrieve information from
-    pipelines as they are created, and can: be populated with previously
-    retrieved information in order to accelerate pipeline creation.
-    Represented by a slink:VkPipelineCache object.
-
-Pipeline Layout::
-    An object that defines the set of resources (via a collection of
-    descriptor set layouts) and push constants used by pipelines that are
-    created using the layout.
-    Used when creating a pipeline and when binding descriptor sets and
-    setting push constant values.
-    Represented by a slink:VkPipelineLayout object.
-
-ifdef::VK_KHR_pipeline_library[]
-Pipeline Library::
-    A pipeline that cannot be directly used, instead defining a set of
-    shaders and shader groups which will be <<pipeline-library,linked into
-    other pipelines>>.
-endif::VK_KHR_pipeline_library[]
-
-Pipeline Stage::
-    A logically independent execution unit that performs some of the
-    operations defined by an action command.
-
-ifdef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-Pipeline Trace Ray Instruction::
-    A ray tracing instruction which traces a ray into an acceleration
-    structure when using ray tracing pipelines.
-    One of
-ifdef::VK_NV_ray_tracing[code:OpTraceNV,]
-ifdef::VK_NV_ray_tracing_motion_blur[code:OpTraceRayMotionNV, code:OpTraceMotionNV,]
-ifdef::VK_KHR_ray_tracing_pipeline[code:OpTraceRayKHR]
-    .
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-
-pname:pNext Chain::
-    A set of structures <<fundamentals-validusage-pNext,chained together>>
-    through their ptext:pNext members.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-Planar::
-    See _multi-planar_.
-
-Plane::
-    An _image plane_ is part of the representation of an image, containing a
-    subset of the color components required to represent the texels in the
-    image and with a contiguous mapping of coordinates to bound memory.
-    Most images consist only of a single plane, but some formats spread the
-    components across multiple image planes.
-    The host-accessible properties of each image plane are accessed in a
-    linear layout using flink:vkGetImageSubresourceLayout.
-    If a multi-planar image is created with the
-    ename:VK_IMAGE_CREATE_DISJOINT_BIT bit set, the image is described as
-    _disjoint_, and its planes are therefore bound to memory independently.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-Point Sampling (Rasterization)::
-    A rule that determines whether a fragment sample location is covered by
-    a polygon primitive by testing whether the sample location is in the
-    interior of the polygon in framebuffer-space, or on the boundary of the
-    polygon according to the tie-breaking rules.
-
-Potential Format Features::
-    The union of all elink:VkFormatFeatureFlagBits that the implementation
-    supports for a specified elink:VkFormat, over all supported image
-    tilings.
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-    For <<memory-external-android-hardware-buffer-external-formats,external
-    formats>> the elink:VkFormatFeatureFlagBits is provided by the
-    implementation.
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-
-Pre-rasterization::
-    Operations that execute before <<primsrast,rasterization>>, and any
-    state associated with those operations.
-
-ifdef::VK_KHR_swapchain[]
-Presentable image::
-    A sname:VkImage object obtained from a sname:VkSwapchainKHR used to
-    present to a sname:VkSurfaceKHR object.
-endif::VK_KHR_swapchain[]
-
-Preserve Attachment::
-    One of a list of attachments in a subpass description that is not read
-    or written by the subpass, but that is read or written on earlier and
-    later subpasses and whose contents must: be preserved through this
-    subpass.
-
-Primary Command Buffer::
-    A command buffer that can: execute secondary command buffers, and can:
-    be submitted directly to a queue.
-
-ifdef::VK_NV_mesh_shader[]
-Primitive Shading Pipeline::
-    A graphics pipeline where input primitives are assembled by fixed
-    function processing.
-    It is the counterpart to mesh shading.
-endif::VK_NV_mesh_shader[]
-
-Primitive Topology::
-    State that controls how vertices are assembled into primitives, e.g. as
-    lists of triangles, strips of lines, etc..
-
-Promoted (feature)::
-    A feature from an older extension is considered promoted if it is made
-    available as part of a new core version or newer extension with wider
-    support.
-
-ifdef::VK_VERSION_1_1[]
-Protected Buffer::
-    A buffer to which protected device memory can: be bound.
-
-Protected-capable Device Queue::
-    A device queue to which protected command buffers can: be submitted.
-
-Protected Command Buffer::
-    A command buffer which can: be submitted to a protected-capable device
-    queue.
-
-Protected Device Memory::
-    Device memory which can: be visible to the device but must: not be
-    visible to the host.
-
-Protected Image::
-    An image to which protected device memory can: be bound.
-endif::VK_VERSION_1_1[]
-
-Provisional::
-    A feature is released provisionally in order to get wider feedback on
-    the functionality before it is finalized.
-    Provisional features may change in ways that break backwards
-    compatibility, and thus are not recommended for use in production
-    applications.
-
-Provoking Vertex::
-    The vertex in a primitive from which flat shaded attribute values are
-    taken.
-    This is generally the "`first`" vertex in the primitive, and depends on
-    the primitive topology.
-
-Push Constants::
-    A small bank of values writable via the API and accessible in shaders.
-    Push constants allow the application to set values used in shaders
-    without creating buffers or modifying and binding descriptor sets for
-    each update.
-
-Push Constant Interface::
-    The set of variables with code:PushConstant storage class that are
-    statically used by a shader entry point, and which receive values from
-    push constant commands.
-
-ifdef::VK_KHR_push_descriptor[]
-Push Descriptors::
-    Descriptors that are written directly into a command buffer rather than
-    into a descriptor set.
-    Push descriptors allow the application to set descriptors used in
-    shaders without allocating or modifying descriptor sets for each update.
-endif::VK_KHR_push_descriptor[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_descriptor_update_template[]
-Descriptor Update Template::
-    An object that specifies a mapping from descriptor update information in
-    host memory to elements in a descriptor set, which helps enable more
-    efficient descriptor set updates.
-
-endif::VK_VERSION_1_1,VK_KHR_descriptor_update_template[]
-
-Query Pool::
-    An object containing a number of query entries and their associated
-    state and results.
-    Represented by a slink:VkQueryPool object.
-
-Queue::
-    An object that executes command buffers and sparse binding operations on
-    a device.
-    Represented by a slink:VkQueue object.
-
-Queue Family::
-    A set of queues that have common properties and support the same
-    functionality, as advertised in slink:VkQueueFamilyProperties.
-
-Queue Operation::
-    A unit of work to be executed by a specific queue on a device, submitted
-    via a <<devsandqueues-submission, queue submission command>>.
-    Each queue submission command details the specific queue operations that
-    occur as a result of calling that command.
-    Queue operations typically include work that is specific to each
-    command, and synchronization tasks.
-
-Queue Submission::
-    Zero or more batches and an optional fence to be signaled, passed to a
-    command for execution on a queue.
-    See the <<devsandqueues-submission, Devices and Queues chapter>> for
-    more information.
-
-ifdef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-Ray Tracing Command::
-    Commands that provoke work using a ray tracing pipeline.
-    Includes
-ifdef::VK_NV_ray_tracing[flink:vkCmdTraceRaysNV,]
-ifdef::VK_KHR_ray_tracing_pipeline[flink:vkCmdTraceRaysKHR, and flink:vkCmdTraceRaysIndirectKHR]
-    .
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-
-Recording State (Command Buffer)::
-    A command buffer that is ready to record commands.
-    See also Initial State and Executable State.
-
-Release Operation (Resource)::
-    An operation that releases ownership of an image subresource or buffer
-    range.
-
-Render Pass::
-    An object that represents a set of framebuffer attachments and phases of
-    rendering using those attachments.
-    Represented by a slink:VkRenderPass object.
-
-Render Pass Instance::
-    A use of a render pass in a command buffer.
-
-Required Extensions::
-    Extensions that must: be enabled alongside extensions dependent on them
-    (see <<extendingvulkan-extensions-extensiondependencies, Extension
-    Dependencies>>).
-
-Reset (Command Buffer)::
-    Resetting a command buffer discards any previously recorded commands and
-    puts a command buffer in the initial state.
-
-Residency Code::
-    An integer value returned by sparse image instructions, indicating
-    whether any sparse unbound texels were accessed.
-
-Resolve Attachment::
-    A subpass attachment point, or image view, that is the target of a
-    multisample resolve operation from the corresponding color attachment at
-    the end of the subpass.
-
-ifdef::VK_KHR_swapchain[]
-Retired Swapchain::
-    A swapchain that has been used as the pname:oldSwapchain parameter to
-    flink:vkCreateSwapchainKHR.
-    Images cannot be acquired from a retired swapchain, however images that
-    were acquired (but not presented) before the swapchain was retired can:
-    be presented.
-endif::VK_KHR_swapchain[]
-
-Sample Index::
-    The index of a sample within a <<primsrast-multisampling-coverage-mask,
-    single set of samples>>.
-
-Sample Shading::
-    Invoking the fragment shader multiple times per fragment, with the
-    covered samples partitioned among the invocations.
-
-Sampled Image::
-    A descriptor type that represents an image view, and supports filtered
-    (sampled) and unfiltered read-only access in a shader.
-
-Sampler::
-    An object containing state that controls how sampled image data is
-    sampled (or filtered) when accessed in a shader.
-    Also a descriptor type describing the object.
-    Represented by a slink:VkSampler object.
-
-Secondary Command Buffer::
-    A command buffer that can: be executed by a primary command buffer, and
-    must: not be submitted directly to a queue.
-
-Self-Dependency::
-    A subpass dependency from a subpass to itself, i.e. with
-    pname:srcSubpass equal to pname:dstSubpass.
-    A self-dependency is not automatically performed during a render pass
-    instance, rather a subset of it can: be performed via
-    flink:vkCmdPipelineBarrier during the subpass.
-
-Semaphore::
-    A synchronization primitive that supports signal and wait operations,
-    and can: be used to synchronize operations within a queue or across
-    queues.
-    Represented by a slink:VkSemaphore object.
-
-Shader::
-    Instructions selected (via an entry point) from a shader module, which
-    are executed in a shader stage.
-
-ifdef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-Shader Call::
-    An <<ray-tracing-shader-call,instruction>> which may: cause execution to
-    continue in a different shader stage.
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-
-Shader Code::
-    A stream of instructions used to describe the operation of a shader.
-
-ifdef::VK_NV_device_generated_commands,VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-Shader Group::
-    A set of Shader Stages that are part of a slink:VkPipeline which
-    contains multiple of such sets.
-    This allows the device to make use of all the shader groups from the
-    bound pipeline independently.
-endif::VK_NV_device_generated_commands,VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-
-Shader Module::
-    A collection of shader code, potentially including several functions and
-    entry points, that is used to create shaders in pipelines.
-    Represented by a slink:VkShaderModule object.
-
-Shader Stage::
-    A stage of the graphics or compute pipeline that executes shader code.
-
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-[[glossary-shading-rate]]
-Shading Rate::
-    The ratio of the number of fragment shader invocations generated in a
-    fully covered framebuffer region to the size (in pixels) of that region.
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-
-ifdef::VK_NV_shading_rate_image[]
-[[glossary-shading-rate-image]]
-Shading Rate Image::
-    An image used to establish the shading rate for a framebuffer region,
-    where each pixel controls the shading rate for a corresponding
-    framebuffer region.
-endif::VK_NV_shading_rate_image[]
-
-ifdef::VK_KHR_shared_presentable_image[]
-Shared presentable image::
-    A presentable image created from a swapchain with elink:VkPresentModeKHR
-    set to either ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or
-    ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR.
-endif::VK_KHR_shared_presentable_image[]
-
-Side Effect::
-    A store to memory or atomic operation on memory from a shader
-    invocation.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-Single-plane format::
-    A format that is not _multi-planar_.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-Size-Compatible Image Formats::
-    When a compressed image format and an uncompressed image format are
-    size-compatible, it means that the texel block size of the uncompressed
-    format must: equal the texel block size of the compressed format.
-
-Sparse Block::
-    An element of a sparse resource that can be independently bound to
-    memory.
-    Sparse blocks of a particular sparse resource have a corresponding size
-    in bytes that they use in the bound memory.
-
-Sparse Image Block::
-    A sparse block in a sparse partially-resident image.
-    In addition to the sparse block size in bytes, sparse image blocks have
-    a corresponding width, height, and depth that define the dimensions of
-    these elements in units of texels or compressed texel blocks, the latter
-    being used in case of sparse images having a block-compressed format.
-
-Sparse Unbound Texel::
-    A texel read from a region of a sparse texture that does not have memory
-    bound to it.
-
-ifdef::VK_NV_ray_tracing_motion_blur[]
-SRT::
-   A decomposition of a spatial transform separating out scale, rotation,
-   and translation which has better linear interpolation properties for
-   representing motion.
-endif::VK_NV_ray_tracing_motion_blur[]
-
-Static Use::
-    An object in a shader is statically used by a shader entry point if any
-    function in the entry point's call tree contains an instruction using
-    the object.
-    Static use is used to constrain the set of descriptors used by a shader
-    entry point.
-
-Storage Buffer::
-    A descriptor type that represents a buffer, and supports reads, writes,
-    and atomics in a shader.
-
-Storage Image::
-    A descriptor type that represents an image view, and supports unfiltered
-    loads, stores, and atomics in a shader.
-
-Storage Texel Buffer::
-    A descriptor type that represents a buffer view, and supports
-    unfiltered, formatted reads, writes, and atomics in a shader.
-
-ifdef::VK_VERSION_1_1,VK_EXT_shader_subgroup_vote[]
-Subgroup::
-    A set of shader invocations that can: synchronize and share data with
-    each other efficiently.
-    In compute shaders, the _local workgroup_ is a superset of the subgroup.
-endif::VK_VERSION_1_1,VK_EXT_shader_subgroup_vote[]
-
-ifdef::VK_VERSION_1_1,VK_EXT_shader_subgroup_ballot[]
-Subgroup Mask::
-    A bitmask for all invocations in the current subgroup with one bit per
-    invocation, starting with the least significant bit in the first vector
-    component, continuing to the last bit (less than code:SubgroupSize) in
-    the last required vector component.
-endif::VK_VERSION_1_1,VK_EXT_shader_subgroup_ballot[]
-
-Subpass::
-    A phase of rendering within a render pass, that reads and writes a
-    subset of the attachments.
-
-Subpass Dependency::
-    An execution and/or memory dependency between two subpasses described as
-    part of render pass creation, and automatically performed between
-    subpasses in a render pass instance.
-    A subpass dependency limits the overlap of execution of the pair of
-    subpasses, and can: provide guarantees of memory coherence between
-    accesses in the subpasses.
-
-Subpass Description::
-    Lists of attachment indices for input attachments, color attachments,
-    depth/stencil attachment, resolve attachments,
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    depth/stencil resolve,
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    and preserve attachments used by the subpass in a render pass.
-
-Subset (Self-Dependency)::
-    A subset of a self-dependency is a pipeline barrier performed during the
-    subpass of the self-dependency, and whose stage masks and access masks
-    each contain a subset of the bits set in the identically named mask in
-    the self-dependency.
-
-Texel Block::
-    A single addressable element of an image with an uncompressed
-    elink:VkFormat, or a single compressed block of an image with a
-    compressed elink:VkFormat.
-
-Texel Block Size::
-    The size (in bytes) used to store a texel block of a compressed or
-    uncompressed image.
-
-Texel Coordinate System::
-    One of three coordinate systems (normalized, unnormalized, integer) that
-    define how texel coordinates are interpreted in an image or a specific
-    mipmap level of an image.
-
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-Timeline Semaphore::
-    A semaphore with a strictly increasing 64-bit unsigned integer payload
-    indicating whether the semaphore is signaled with respect to a
-    particular reference value.
-    Represented by a slink:VkSemaphore object created with a semaphore type
-    of ename:VK_SEMAPHORE_TYPE_TIMELINE.
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-Uniform Texel Buffer::
-    A descriptor type that represents a buffer view, and supports
-    unfiltered, formatted, read-only access in a shader.
-
-Uniform Buffer::
-    A descriptor type that represents a buffer, and supports read-only
-    access in a shader.
-
-Units in the Last Place (ULP)::
-    A measure of floating-point error loosely defined as the smallest
-    representable step in a floating-point format near a given value.
-    For the precise definition see <<spirvenv-precision-operation, Precision
-    and Operation of SPIR-V instructions>> or Jean-Michel Muller, "`On the
-    definition of ulp(x)`", RR-5504, INRIA.
-    Other sources may also use the term "`unit of least precision`".
-
-Unnormalized::
-    A value that is interpreted according to its conventional
-    interpretation, and is not normalized.
-
-ifdef::VK_VERSION_1_1[]
-Unprotected Buffer::
-    A buffer to which unprotected device memory can: be bound.
-
-Unprotected Command Buffer::
-    A command buffer which can: be submitted to an unprotected device queue
-    or a protected-capable device queue.
-
-Unprotected Device Memory::
-    Device memory which can: be visible to the device and can: be visible to
-    the host.
-
-Unprotected Image::
-    An image to which unprotected device memory can: be bound.
-endif::VK_VERSION_1_1[]
-
-User-Defined Variable Interface::
-    A shader entry point's variables with code:Input or code:Output storage
-    class that are not built-in variables.
-
-Vertex Input Attribute::
-    A graphics pipeline resource that produces input values for the vertex
-    shader by reading data from a vertex input binding and converting it to
-    the attribute's format.
-
-ifdef::VK_EXT_transform_feedback[]
-Vertex Stream::
-    A vertex stream is where the last
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stages>> outputs vertex data, which then goes to the rasterizer, is
-    captured to a transform feedback buffer, or both.
-    Geometry shaders can: emit primitives to multiple independent vertex
-    streams.
-    Each vertex emitted by the geometry shader is directed at one of the
-    vertex streams.
-endif::VK_EXT_transform_feedback[]
-
-ifdef::VK_EXT_validation_cache[]
-Validation Cache::
-    An object that can: be used to collect and retrieve validation results
-    from the validation layers, and can: be populated with previously
-    retrieved results in order to accelerate the validation process.
-    Represented by a slink:VkValidationCacheEXT object.
-endif::VK_EXT_validation_cache[]
-
-Vertex Input Binding::
-    A graphics pipeline resource that is bound to a buffer and includes
-    state that affects addressing calculations within that buffer.
-
-Vertex Input Interface::
-    A vertex shader entry point's variables with code:Input storage class,
-    which receive values from vertex input attributes.
-
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-View Mask::
-    When multiview is enabled, a view mask is a property of a subpass
-    controlling which views the rendering commands are broadcast to.
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-View Volume::
-    A subspace in homogeneous coordinates, corresponding to post-projection
-    x and y values between -1 and +1, and z values between 0 and +1.
-
-Viewport Transformation::
-    A transformation from normalized device coordinates to framebuffer
-    coordinates, based on a viewport rectangle and depth range.
-
-Visibility Operation::
-    An operation that causes available values to become visible to specified
-    memory accesses.
-
-Visible::
-    A state of values written to memory that allows them to be accessed by a
-    set of operations.
-
-// To be added per issue 18:
-// Current State <<fundamentals-queueoperation>>
-// Barycentric Coordinates <<primsrast-polygons-basic>>
-// Internal Allocations <<memory-host-allocation-scope>>
-// Unavailable, Available <<queries-operation>> - NB: this clashes with available/visible in terms of memory
-// Signaled, Unsignaled <<synchronization-semaphores>> <<synchronization-fences>>
-// Interior Vertices <<tessellation-tessellator-spacing>>
-// Inner Vertices <<tessellation-triangle-tessellation>> <<tessellation-quad-tessellation>>
-// Isolines <<tessellation-isoline-tessellation>>
-// Binding Range <<sparsemem-memory-binding>>
-
-
-[[lexicon-common-abbreviations]]
-== Common Abbreviations
-
-The abbreviations and acronyms defined in this section are sometimes used in
-the Specification and the API where they are considered clear and
-commonplace.
-
-Src::
-    Source
-
-Dst::
-    Destination
-
-Min::
-    Minimum
-
-Max::
-    Maximum
-
-Rect::
-    Rectangle
-
-Info::
-    Information
-
-LOD::
-    Level of Detail
-
-ID::
-    Identifier
-
-UUID::
-    Universally Unique Identifier
-
-Op::
-    Operation
-
-R::
-    Red color component
-
-G::
-    Green color component
-
-B::
-    Blue color component
-
-A::
-    Alpha color component
-
-RTZ::
-    Round towards zero
-
-RTE::
-    Round to nearest even
-
-
-[[lexicon-prefixes]]
-== Prefixes
-
-Prefixes are used in the API to denote specific semantic meaning of Vulkan
-names, or as a label to avoid name clashes, and are explained here:
-
-VK/Vk/vk::
-    Vulkan namespace +
-    All types, commands, enumerants and defines in this specification are
-    prefixed with these two characters.
-
-PFN/pfn::
-    Function Pointer +
-    Denotes that a type is a function pointer, or that a variable is of a
-    pointer type.
-
-p::
-    Pointer +
-    Variable is a pointer.
-
-vkCmd::
-    Commands that record commands in command buffers +
-    These API commands do not result in immediate processing on the device.
-    Instead, they record the requested action in a command buffer for
-    execution when the command buffer is submitted to a queue.
-
-s::
-    Structure +
-    Used to denote the etext:VK_STRUCTURE_TYPE* member of each structure in
-    pname:sType
diff --git a/registry/vulkan/appendices/invariance.txt b/registry/vulkan/appendices/invariance.txt
deleted file mode 100644
index 647a5f9..0000000
--- a/registry/vulkan/appendices/invariance.txt
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[appendix]
-[[invariance]]
-= Invariance
-
-The Vulkan specification is not pixel exact.
-It therefore does not guarantee an exact match between images produced by
-different Vulkan implementations.
-However, the specification does specify exact matches, in some cases, for
-images produced by the same implementation.
-The purpose of this appendix is to identify and provide justification for
-those cases that require exact matches.
-
-== Repeatability
-
-The obvious and most fundamental case is repeated issuance of a series of
-Vulkan commands.
-For any given Vulkan and framebuffer state vector, and for any Vulkan
-command, the resulting Vulkan and framebuffer state must: be identical
-whenever the command is executed on that initial Vulkan and framebuffer
-state.
-This repeatability requirement does not apply when using shaders containing
-side effects (image and buffer variable stores and atomic operations),
-because these memory operations are not guaranteed to be processed in a
-defined order.
-
-ifdef::VK_AMD_rasterization_order[]
-The repeatability requirement does not apply for rendering done using a
-graphics pipeline that uses ename:VK_RASTERIZATION_ORDER_RELAXED_AMD.
-endif::VK_AMD_rasterization_order[]
-
-One purpose of repeatability is avoidance of visual artifacts when a
-double-buffered scene is redrawn.
-If rendering is not repeatable, swapping between two buffers rendered with
-the same command sequence may: result in visible changes in the image.
-Such false motion is distracting to the viewer.
-Another reason for repeatability is testability.
-
-Repeatability, while important, is a weak requirement.
-Given only repeatability as a requirement, two scenes rendered with one
-(small) polygon changed in position might differ at every pixel.
-Such a difference, while within the law of repeatability, is certainly not
-within its spirit.
-Additional invariance rules are desirable to ensure useful operation.
-
-
-== Multi-pass Algorithms
-
-Invariance is necessary for a whole set of useful multi-pass algorithms.
-Such algorithms render multiple times, each time with a different Vulkan
-mode vector, to eventually produce a result in the framebuffer.
-Examples of these algorithms include:
-
-  * "`Erasing`" a primitive from the framebuffer by redrawing it, either in
-    a different color or using the XOR logical operation.
-  * Using stencil operations to compute capping planes.
-
-
-== Invariance Rules
-
-For a given Vulkan device:
-
-*Rule 1* _For any given Vulkan and framebuffer state vector, and for any
-given Vulkan command, the resulting Vulkan and framebuffer state must: be
-identical each time the command is executed on that initial Vulkan and
-framebuffer state._
-
-*Rule 2* _Changes to the following state values have no side effects (the
-use of any other state value is not affected by the change):_
-
-*Required:*
-
-  * _Color and depth/stencil attachment contents_
-  * _Scissor parameters (other than enable)_
-  * _Write masks (color, depth, stencil)_
-  * _Clear values (color, depth, stencil)_
-
-*Strongly suggested:*
-
-  * _Stencil parameters (other than enable)_
-  * _Depth test parameters (other than enable)_
-  * _Blend parameters (other than enable)_
-  * _Logical operation parameters (other than enable)_
-
-*Corollary 1* _Fragment generation is invariant with respect to the state
-values listed in Rule 2._
-
-*Rule 3* _The arithmetic of each per-fragment operation is invariant except
-with respect to parameters that directly control it._
-
-*Corollary 2* _Images rendered into different color attachments of the same
-framebuffer, either simultaneously or separately using the same command
-sequence, are pixel identical._
-
-*Rule 4* _Identical pipelines will produce the same result when run multiple
-times with the same input.
-The wording "`Identical pipelines`" means slink:VkPipeline objects that have
-been created with identical SPIR-V binaries and identical state, which are
-then used by commands executed using the same Vulkan state vector.
-Invariance is relaxed for shaders with side effects, such as performing
-stores or atomics._
-
-*Rule 5* _All fragment shaders that either conditionally or unconditionally
-assign_ code:FragCoord.z _to_ code:FragDepth _are depth-invariant with
-respect to each other, for those fragments where the assignment to_
-code:FragDepth _actually is done._
-
-If a sequence of Vulkan commands specifies primitives to be rendered with
-shaders containing side effects (image and buffer variable stores and atomic
-operations), invariance rules are relaxed.
-In particular, rule 1, corollary 2, and rule 4 do not apply in the presence
-of shader side effects.
-
-The following weaker versions of rules 1 and 4 apply to Vulkan commands
-involving shader side effects:
-
-*Rule 6* _For any given Vulkan and framebuffer state vector, and for any
-given Vulkan command, the contents of any framebuffer state not directly or
-indirectly affected by results of shader image or buffer variable stores or
-atomic operations must: be identical each time the command is executed on
-that initial Vulkan and framebuffer state._
-
-*Rule 7* _Identical pipelines will produce the same result when run multiple
-times with the same input as long as:_
-
-  * _shader invocations do not use image atomic operations;_
-  * _no framebuffer memory is written to more than once by image stores,
-    unless all such stores write the same value; and_
-  * _no shader invocation, or other operation performed to process the
-    sequence of commands, reads memory written to by an image store._
-
-
-[NOTE]
-.Note
-====
-The OpenGL specification has the following invariance rule: Consider a
-primitive p' obtained by translating a primitive p through an offset (x, y)
-in window coordinates, where x and y are integers.
-As long as neither p' nor p is clipped, it must: be the case that each
-fragment f' produced from p' is identical to a corresponding fragment f from
-p except that the center of f' is offset by (x, y) from the center of f.
-
-This rule does not apply to Vulkan and is an intentional difference from
-OpenGL.
-====
-
-When any sequence of Vulkan commands triggers shader invocations that
-perform image stores or atomic operations, and subsequent Vulkan commands
-read the memory written by those shader invocations, these operations must:
-be explicitly synchronized.
-
-
-== Tessellation Invariance
-
-When using a pipeline containing tessellation evaluation shaders, the
-fixed-function tessellation primitive generator consumes the input patch
-specified by an application and emits a new set of primitives.
-The following invariance rules are intended to provide repeatability
-guarantees.
-Additionally, they are intended to allow an application with a carefully
-crafted tessellation evaluation shader to ensure that the sets of triangles
-generated for two adjacent patches have identical vertices along shared
-patch edges, avoiding "`cracks`" caused by minor differences in the
-positions of vertices along shared edges.
-
-*Rule 1* _When processing two patches with identical outer and inner
-tessellation levels, the tessellation primitive generator will emit an
-identical set of point, line, or triangle primitives as long as the pipeline
-used to process the patch primitives has tessellation evaluation shaders
-specifying the same tessellation mode, spacing, vertex order, and point mode
-decorations.
-Two sets of primitives are considered identical if and only if they contain
-the same number and type of primitives and the generated tessellation
-coordinates for the vertex numbered m of the primitive numbered n are
-identical for all values of m and n._
-
-*Rule 2* _The set of vertices generated along the outer edge of the
-subdivided primitive in triangle and quad tessellation, and the tessellation
-coordinates of each, depend only on the corresponding outer tessellation
-level and the spacing decorations in the tessellation shaders of the
-pipeline._
-
-*Rule 3* _The set of vertices generated when subdividing any outer primitive
-edge is always symmetric.
-For triangle tessellation, if the subdivision generates a vertex with
-tessellation coordinates of the form (0, x, 1-x), (x, 0, 1-x), or (x, 1-x,
-0), it will also generate a vertex with coordinates of exactly (0, 1-x, x),
-(1-x, 0, x), or (1-x, x, 0), respectively.
-For quad tessellation, if the subdivision generates a vertex with
-coordinates of (x, 0) or (0, x), it will also generate a vertex with
-coordinates of exactly (1-x, 0) or (0, 1-x), respectively.
-For isoline tessellation, if it generates vertices at (0, x) and (1, x)
-where x is not zero, it will also generate vertices at exactly (0, 1-x) and
-(1, 1-x), respectively._
-
-*Rule 4* _The set of vertices generated when subdividing outer edges in
-triangular and quad tessellation must: be independent of the specific edge
-subdivided, given identical outer tessellation levels and spacing.
-For example, if vertices at (x, 1 - x, 0) and (1-x, x, 0) are generated when
-subdividing the w = 0 edge in triangular tessellation, vertices must: be
-generated at (x, 0, 1-x) and (1-x, 0, x) when subdividing an otherwise
-identical v = 0 edge.
-For quad tessellation, if vertices at (x, 0) and (1-x, 0) are generated when
-subdividing the v = 0 edge, vertices must: be generated at (0, x) and (0,
-1-x) when subdividing an otherwise identical u = 0 edge._
-
-*Rule 5* _When processing two patches that are identical in all respects
-enumerated in rule 1 except for vertex order, the set of triangles generated
-for triangle and quad tessellation must: be identical except for vertex and
-triangle order.
-For each triangle n1 produced by processing the first patch, there must: be
-a triangle n2 produced when processing the second patch each of whose
-vertices has the same tessellation coordinates as one of the vertices in
-n1._
-
-*Rule 6* _When processing two patches that are identical in all respects
-enumerated in rule 1 other than matching outer tessellation levels and/or
-vertex order, the set of interior triangles generated for triangle and quad
-tessellation must: be identical in all respects except for vertex and
-triangle order.
-For each interior triangle n1 produced by processing the first patch, there
-must: be a triangle n2 produced when processing the second patch each of
-whose vertices has the same tessellation coordinates as one of the vertices
-in n1.
-A triangle produced by the tessellator is considered an interior triangle if
-none of its vertices lie on an outer edge of the subdivided primitive._
-
-*Rule 7* _For quad and triangle tessellation, the set of triangles
-connecting an inner and outer edge depends only on the inner and outer
-tessellation levels corresponding to that edge and the spacing decorations._
-
-*Rule 8* _The value of all defined components of_ code:TessCoord _will be in
-the range [0, 1].
-Additionally, for any defined component x of_ code:TessCoord, _the results
-of computing 1.0-x in a tessellation evaluation shader will be exact.
-If any floating-point values in the range [0, 1] fail to satisfy this
-property, such values must: not be used as tessellation coordinate
-components._
diff --git a/registry/vulkan/appendices/memorymodel.txt b/registry/vulkan/appendices/memorymodel.txt
deleted file mode 100644
index d67ab3d..0000000
--- a/registry/vulkan/appendices/memorymodel.txt
+++ /dev/null
@@ -1,1207 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[appendix]
-[[memory-model]]
-= Memory Model
-
-
-[[memory-model-agent]]
-== Agent
-
-_Operation_ is a general term for any task that is executed on the system.
-
-[NOTE]
-.Note
-====
-An operation is by definition something that is executed.
-Thus if an instruction is skipped due to control flow, it does not
-constitute an operation.
-====
-
-Each operation is executed by a particular _agent_.
-Possible agents include each shader invocation, each host thread, and each
-fixed-function stage of the pipeline.
-
-
-[[memory-model-memory-location]]
-== Memory Location
-
-A _memory location_ identifies unique storage for 8 bits of data.
-Memory operations access a _set of memory locations_ consisting of one or
-more memory locations at a time, e.g. an operation accessing a 32-bit
-integer in memory would read/write a set of four memory locations.
-Memory operations that access whole aggregates may: access any padding bytes
-between elements or members, but no padding bytes at the end of the
-aggregate.
-Two sets of memory locations _overlap_ if the intersection of their sets of
-memory locations is non-empty.
-A memory operation must: not affect memory at a memory location not within
-its set of memory locations.
-
-Memory locations for buffers and images are explicitly allocated in
-slink:VkDeviceMemory objects, and are implicitly allocated for SPIR-V
-variables in each shader invocation.
-
-ifdef::VK_KHR_workgroup_memory_explicit_layout[]
-Variables with code:Workgroup storage class that point to a block-decorated
-type share a set of memory locations.
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-
-
-[[memory-model-allocation]]
-== Allocation
-
-The values stored in newly allocated memory locations are determined by a
-SPIR-V variable's initializer, if present, or else are undefined:.
-At the time an allocation is created there have been no
-<<memory-model-memory-operation,memory operations>> to any of its memory
-locations.
-The initialization is not considered to be a memory operation.
-
-[NOTE]
-.Note
-====
-For tessellation control shader output variables, a consequence of
-initialization not being considered a memory operation is that some
-implementations may need to insert a barrier between the initialization of
-the output variables and any reads of those variables.
-====
-
-
-[[memory-model-memory-operation]]
-== Memory Operation
-
-For an operation A and memory location M:
-
-  * [[memory-model-access-read]] A _reads_ M if and only if the data stored
-    in M is an input to A.
-  * [[memory-model-access-write]] A _writes_ M if and only if the data
-    output from A is stored to M.
-  * [[memory-model-access-access]] A _accesses_ M if and only if it either
-    reads or writes (or both) M.
-
-[NOTE]
-.Note
-====
-A write whose value is the same as what was already in those memory
-locations is still considered to be a write and has all the same effects.
-====
-
-
-[[memory-model-references]]
-== Reference
-
-A _reference_ is an object that a particular agent can: use to access a set
-of memory locations.
-On the host, a reference is a host virtual address.
-On the device, a reference is:
-
-  * The descriptor that a variable is bound to, for variables in Image,
-    Uniform, or StorageBuffer storage classes.
-    If the variable is an array (or array of arrays, etc.) then each element
-    of the array may: be a unique reference.
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-  * The address range for a buffer in code:PhysicalStorageBuffer storage
-    class, where the base of the address range is queried with
-ifndef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-    flink:vkGetBufferDeviceAddressEXT
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-    flink:vkGetBufferDeviceAddress
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-    and the length of the range is the size of the buffer.
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-ifdef::VK_KHR_workgroup_memory_explicit_layout[]
-   * A single common reference for all variables with code:Workgroup storage
-     class that point to a block-decorated type.
-   * The variable itself for non-block-decorated type variables in
-     code:Workgroup storage class.
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-   * The variable itself for variables in other storage classes.
-
-Two memory accesses through distinct references may: require availability
-and visibility operations as defined
-<<memory-model-location-ordered,below>>.
-
-
-[[memory-model-program-order]]
-== Program-Order
-
-A _dynamic instance_ of an instruction is defined in SPIR-V
-(https://www.khronos.org/registry/spir-v/specs/unified1/SPIRV.html#DynamicInstance)
-as a way of referring to a particular execution of a static instruction.
-Program-order is an ordering on dynamic instances of instructions executed
-by a single shader invocation:
-
-  * (Basic block): If instructions A and B are in the same basic block, and
-    A is listed in the module before B, then the n'th dynamic instance of A
-    is program-ordered before the n'th dynamic instance of B.
-  * (Branch): The dynamic instance of a branch or switch instruction is
-    program-ordered before the dynamic instance of the OpLabel instruction
-    to which it transfers control.
-  * (Call entry): The dynamic instance of an code:OpFunctionCall instruction
-    is program-ordered before the dynamic instances of the
-    code:OpFunctionParameter instructions and the body of the called
-    function.
-  * (Call exit): The dynamic instance of the instruction following an
-    code:OpFunctionCall instruction is program-ordered after the dynamic
-    instance of the return instruction executed by the called function.
-  * (Transitive Closure): If dynamic instance A of any instruction is
-    program-ordered before dynamic instance B of any instruction and B is
-    program-ordered before dynamic instance C of any instruction then A is
-    program-ordered before C.
-  * (Complete definition): No other dynamic instances are program-ordered.
-
-For instructions executed on the host, the source language defines the
-program-order relation (e.g. as "`sequenced-before`").
-
-
-ifdef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-[[shader-call-related]]
-== Shader Call Related
-
-Shader-call-related is an equivalence relation on invocations defined as the
-symmetric and transitive closure of:
-
-  * A is shader-call-related to B if A is created by an
-    <<ray-tracing-repack,invocation repack>> instruction executed by B.
-
-
-[[shader-call-order]]
-== Shader Call Order
-
-Shader-call-order is a partial order on dynamic instances of instructions
-executed by invocations that are shader-call-related:
-
-  * (Program order): If dynamic instance A is program-ordered before B, then
-    A is shader-call-ordered before B.
-  * (Shader call entry): If A is a dynamic instance of an
-    <<ray-tracing-repack,invocation repack>> instruction and B is a dynamic
-    instance executed by an invocation that is created by A, then A is
-    shader-call-ordered before B.
-  * (Shader call exit): If A is a dynamic instance of an
-    <<ray-tracing-repack,invocation repack>> instruction, B is the next
-    dynamic instance executed by the same invocation, and C is a dynamic
-    instance executed by an invocation that is created by A, then C is
-    shader-call-ordered before B.
-  * (Transitive closure): If A is shader-call-ordered-before B and B is
-    shader-call-ordered-before C, then A is shader-call-ordered-before C.
-  * (Complete definition): No other dynamic instances are
-    shader-call-ordered.
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-
-
-[[memory-model-scope]]
-== Scope
-
-Atomic and barrier instructions include scopes which identify sets of shader
-invocations that must: obey the requested ordering and atomicity rules of
-the operation, as defined below.
-
-The various scopes are described in detail in <<shaders-scope, the Shaders
-chapter>>.
-
-
-[[memory-model-atomic-operation]]
-== Atomic Operation
-
-An _atomic operation_ on the device is any SPIR-V operation whose name
-begins with code:OpAtomic.
-An atomic operation on the host is any operation performed with an
-std::atomic typed object.
-
-Each atomic operation has a memory <<memory-model-scope,scope>> and a
-<<memory-model-memory-semantics,semantics>>.
-Informally, the scope determines which other agents it is atomic with
-respect to, and the <<memory-model-memory-semantics,semantics>> constrains
-its ordering against other memory accesses.
-Device atomic operations have explicit scopes and semantics.
-Each host atomic operation implicitly uses the code:CrossDevice scope, and
-uses a memory semantics equivalent to a C++ std::memory_order value of
-relaxed, acquire, release, acq_rel, or seq_cst.
-
-Two atomic operations A and B are _potentially-mutually-ordered_ if and only
-if all of the following are true:
-
-  * They access the same set of memory locations.
-  * They use the same reference.
-  * A is in the instance of B's memory scope.
-  * B is in the instance of A's memory scope.
-  * A and B are not the same operation (irreflexive).
-
-Two atomic operations A and B are _mutually-ordered_ if and only if they are
-potentially-mutually-ordered and any of the following are true:
-
-  * A and B are both device operations.
-  * A and B are both host operations.
-  * A is a device operation, B is a host operation, and the implementation
-    supports concurrent host- and device-atomics.
-
-[NOTE]
-.Note
-====
-If two atomic operations are not mutually-ordered, and if their sets of
-memory locations overlap, then each must: be synchronized against the other
-as if they were non-atomic operations.
-====
-
-
-[[memory-model-scoped-modification-order]]
-== Scoped Modification Order
-
-For a given atomic write A, all atomic writes that are mutually-ordered with
-A occur in an order known as A's _scoped modification order_.
-A's scoped modification order relates no other operations.
-
-[NOTE]
-.Note
-====
-Invocations outside the instance of A's memory scope may: observe the values
-at A's set of memory locations becoming visible to it in an order that
-disagrees with the scoped modification order.
-====
-
-[NOTE]
-.Note
-====
-It is valid to have non-atomic operations or atomics in a different scope
-instance to the same set of memory locations, as long as they are
-synchronized against each other as if they were non-atomic (if they are not,
-it is treated as a <<memory-model-access-data-race,data race>>).
-That means this definition of A's scoped modification order could include
-atomic operations that occur much later, after intervening non-atomics.
-That is a bit non-intuitive, but it helps to keep this definition simple and
-non-circular.
-====
-
-
-[[memory-model-memory-semantics]]
-== Memory Semantics
-
-Non-atomic memory operations, by default, may: be observed by one agent in a
-different order than they were written by another agent.
-
-Atomics and some synchronization operations include _memory semantics_,
-which are flags that constrain the order in which other memory accesses
-(including non-atomic memory accesses and
-<<memory-model-availability-visibility,availability and visibility
-operations>>) performed by the same agent can: be observed by other agents,
-or can: observe accesses by other agents.
-
-Device instructions that include semantics are code:OpAtomic*,
-code:OpControlBarrier, code:OpMemoryBarrier, and code:OpMemoryNamedBarrier.
-Host instructions that include semantics are some std::atomic methods and
-memory fences.
-
-SPIR-V supports the following memory semantics:
-
-  * Relaxed: No constraints on order of other memory accesses.
-  * Acquire: A memory read with this semantic performs an _acquire
-    operation_.
-    A memory barrier with this semantic is an _acquire barrier_.
-  * Release: A memory write with this semantic performs a _release
-    operation_.
-    A memory barrier with this semantic is a _release barrier_.
-  * AcquireRelease: A memory read-modify-write operation with this semantic
-    performs both an acquire operation and a release operation, and inherits
-    the limitations on ordering from both of those operations.
-    A memory barrier with this semantic is both a release and acquire
-    barrier.
-
-[NOTE]
-.Note
-====
-SPIR-V does not support "`consume`" semantics on the device.
-====
-
-The memory semantics operand also includes _storage class semantics_ which
-indicate which storage classes are constrained by the synchronization.
-SPIR-V storage class semantics include:
-
-  * UniformMemory
-  * WorkgroupMemory
-  * ImageMemory
-  * OutputMemory
-
-Each SPIR-V memory operation accesses a single storage class.
-Semantics in synchronization operations can include a combination of storage
-classes.
-
-The UniformMemory storage class semantic applies to accesses to memory in
-the
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-PhysicalStorageBuffer,
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-ifdef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-code:ShaderRecordBufferKHR,
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-Uniform and StorageBuffer storage classes.
-The WorkgroupMemory storage class semantic applies to accesses to memory in
-the Workgroup storage class.
-The ImageMemory storage class semantic applies to accesses to memory in the
-Image storage class.
-The OutputMemory storage class semantic applies to accesses to memory in the
-Output storage class.
-
-[NOTE]
-.Note
-====
-Informally, these constraints limit how memory operations can be reordered,
-and these limits apply not only to the order of accesses as performed in the
-agent that executes the instruction, but also to the order the effects of
-writes become visible to all other agents within the same instance of the
-instruction's memory scope.
-====
-
-[NOTE]
-.Note
-====
-Release and acquire operations in different threads can: act as
-synchronization operations, to guarantee that writes that happened before
-the release are visible after the acquire.
-(This is not a formal definition, just an Informative forward reference.)
-====
-
-[NOTE]
-.Note
-====
-The OutputMemory storage class semantic is only useful in tessellation
-control shaders, which is the only execution model where output variables
-are shared between invocations.
-====
-
-The memory semantics operand can: also include availability and visibility
-flags, which apply availability and visibility operations as described in
-<<memory-model-availability-visibility,availability and visibility>>.
-The availability/visibility flags are:
-
-  * MakeAvailable: Semantics must: be Release or AcquireRelease.
-    Performs an availability operation before the release operation or
-    barrier.
-  * MakeVisible: Semantics must: be Acquire or AcquireRelease.
-    Performs a visibility operation after the acquire operation or barrier.
-
-The specifics of these operations are defined in
-<<memory-model-availability-visibility-semantics,Availability and Visibility
-Semantics>>.
-
-Host atomic operations may: support a different list of memory semantics and
-synchronization operations, depending on the host architecture and source
-language.
-
-
-[[memory-model-release-sequence]]
-== Release Sequence
-
-After an atomic operation A performs a release operation on a set of memory
-locations M, the _release sequence headed by A_ is the longest continuous
-subsequence of A's scoped modification order that consists of:
-
-  * the atomic operation A as its first element
-  * atomic read-modify-write operations on M by any agent
-
-[NOTE]
-.Note
-====
-The atomics in the last bullet must: be mutually-ordered with A by virtue of
-being in A's scoped modification order.
-====
-
-[NOTE]
-.Note
-====
-This intentionally omits "`atomic writes to M performed by the same agent
-that performed A`", which is present in the corresponding C++ definition.
-====
-
-
-[[memory-model-synchronizes-with]]
-== Synchronizes-With
-
-_Synchronizes-with_ is a relation between operations, where each operation
-is either an atomic operation or a memory barrier (aka fence on the host).
-
-If A and B are atomic operations, then A synchronizes-with B if and only if
-all of the following are true:
-
-  * A performs a release operation
-  * B performs an acquire operation
-  * A and B are mutually-ordered
-  * B reads a value written by A or by an operation in the release sequence
-    headed by A
-
-code:OpControlBarrier, code:OpMemoryBarrier, and code:OpMemoryNamedBarrier
-are _memory barrier_ instructions in SPIR-V.
-
-If A is a release barrier and B is an atomic operation that performs an
-acquire operation, then A synchronizes-with B if and only if all of the
-following are true:
-
-  * there exists an atomic write X (with any memory semantics)
-  * A is program-ordered before X
-  * X and B are mutually-ordered
-  * B reads a value written by X or by an operation in the release sequence
-    headed by X
-  ** If X is relaxed, it is still considered to head a hypothetical release
-     sequence for this rule
-  * A and B are in the instance of each other's memory scopes
-  * X's storage class is in A's semantics.
-
-If A is an atomic operation that performs a release operation and B is an
-acquire barrier, then A synchronizes-with B if and only if all of the
-following are true:
-
-  * there exists an atomic read X (with any memory semantics)
-  * X is program-ordered before B
-  * X and A are mutually-ordered
-  * X reads a value written by A or by an operation in the release sequence
-    headed by A
-  * A and B are in the instance of each other's memory scopes
-  * X's storage class is in B's semantics.
-
-If A is a release barrier and B is an acquire barrier, then A
-synchronizes-with B if all of the following are true:
-
-  * there exists an atomic write X (with any memory semantics)
-  * A is program-ordered before X
-  * there exists an atomic read Y (with any memory semantics)
-  * Y is program-ordered before B
-  * X and Y are mutually-ordered
-  * Y reads the value written by X or by an operation in the release
-    sequence headed by X
-  ** If X is relaxed, it is still considered to head a hypothetical release
-     sequence for this rule
-  * A and B are in the instance of each other's memory scopes
-  * X's and Y's storage class is in A's and B's semantics.
-  ** NOTE: X and Y must have the same storage class, because they are
-     mutually ordered.
-
-If A is a release barrier, B is an acquire barrier, and C is a control
-barrier (where A can: equal C, and B can: equal C), then A synchronizes-with
-B if all of the following are true:
-
-  * A is program-ordered before (or equals) C
-  * C is program-ordered before (or equals) B
-  * A and B are in the instance of each other's memory scopes
-  * A and B are in the instance of C's execution scope
-
-[NOTE]
-.Note
-====
-This is similar to the barrier-barrier synchronization above, but with a
-control barrier filling the role of the relaxed atomics.
-====
-
-ifdef::VK_EXT_fragment_shader_interlock[]
-
-Let F be an ordering of fragment shader invocations, such that invocation
-F~1~ is ordered before invocation F~2~ if and only if F~1~ and F~2~ overlap
-as described in <<shaders-scope-fragment-interlock,Fragment Shader
-Interlock>> and F~1~ executes the interlocked code before F~2~.
-
-If A is an code:OpEndInvocationInterlockEXT instruction and B is an
-code:OpBeginInvocationInterlockEXT instruction, then A synchronizes-with B
-if the agent that executes A is ordered before the agent that executes B in
-F. A and B are both considered to have code:FragmentInterlock memory scope
-and semantics of UniformMemory and ImageMemory, and A is considered to have
-Release semantics and B is considered to have Acquire semantics.
-
-[NOTE]
-.Note
-====
-code:OpBeginInvocationInterlockEXT and code:OpBeginInvocationInterlockEXT do
-not perform implicit availability or visibility operations.
-Usually, shaders using fragment shader interlock will declare the relevant
-resources as `coherent` to get implicit
-<<memory-model-instruction-av-vis,per-instruction availability and
-visibility operations>>.
-====
-
-endif::VK_EXT_fragment_shader_interlock[]
-
-ifdef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-If A is a release barrier and B is an acquire barrier, then A
-synchronizes-with B if all of the following are true:
-
-  * A is shader-call-ordered-before B
-  * A and B are in the instance of each other's memory scopes
-
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-
-No other release and acquire barriers synchronize-with each other.
-
-
-[[memory-model-system-synchronizes-with]]
-== System-Synchronizes-With
-
-_System-synchronizes-with_ is a relation between arbitrary operations on the
-device or host.
-Certain operations system-synchronize-with each other, which informally
-means the first operation occurs before the second and that the
-synchronization is performed without using application-visible memory
-accesses.
-
-If there is an <<synchronization-dependencies-execution,execution
-dependency>> between two operations A and B, then the operation in the first
-synchronization scope system-synchronizes-with the operation in the second
-synchronization scope.
-
-[NOTE]
-.Note
-====
-This covers all Vulkan synchronization primitives, including device
-operations executing before a synchronization primitive is signaled, wait
-operations happening before subsequent device operations, signal operations
-happening before host operations that wait on them, and host operations
-happening before flink:vkQueueSubmit.
-The list is spread throughout the synchronization chapter, and is not
-repeated here.
-====
-
-System-synchronizes-with implicitly includes all storage class semantics and
-has code:CrossDevice scope.
-
-If A system-synchronizes-with B, we also say A is
-_system-synchronized-before_ B and B is _system-synchronized-after_ A.
-
-
-[[memory-model-non-private]]
-== Private vs. Non-Private
-
-By default, non-atomic memory operations are treated as _private_, meaning
-such a memory operation is not intended to be used for communication with
-other agents.
-Memory operations with the NonPrivatePointer/NonPrivateTexel bit set are
-treated as _non-private_, and are intended to be used for communication with
-other agents.
-
-More precisely, for private memory operations to be
-<<memory-model-location-ordered,Location-Ordered>> between distinct agents
-requires using system-synchronizes-with rather than shader-based
-synchronization.
-Non-private memory operations still obey program-order.
-
-Atomic operations are always considered non-private.
-
-
-[[memory-model-inter-thread-happens-before]]
-== Inter-Thread-Happens-Before
-
-Let SC be a non-empty set of storage class semantics.
-Then (using template syntax) operation A _inter-thread-happens-before_<SC>
-operation B if and only if any of the following is true:
-
-  * A system-synchronizes-with B
-  * A synchronizes-with B, and both A and B have all of SC in their
-    semantics
-  * A is an operation on memory in a storage class in SC or that has all of
-    SC in its semantics, B is a release barrier or release atomic with all
-    of SC in its semantics, and A is program-ordered before B
-  * A is an acquire barrier or acquire atomic with all of SC in its
-    semantics, B is an operation on memory in a storage class in SC or that
-    has all of SC in its semantics, and A is program-ordered before B
-  * A and B are both host operations and A inter-thread-happens-before B as
-    defined in the host language specification
-  * A inter-thread-happens-before<SC> some X and X
-    inter-thread-happens-before<SC> B
-
-
-[[memory-model-happens-before]]
-== Happens-Before
-
-Operation A _happens-before_ operation B if and only if any of the following
-is true:
-
-  * A is program-ordered before B
-  * A inter-thread-happens-before<SC> B for some set of storage classes SC
-
-_Happens-after_ is defined similarly.
-
-[NOTE]
-.Note
-====
-Unlike C++, happens-before is not always sufficient for a write to be
-visible to a read.
-Additional <<memory-model-availability-visibility,availability and
-visibility>> operations may: be required for writes to be
-<<memory-model-visible-to,visible-to>> other memory accesses.
-====
-
-[NOTE]
-.Note
-====
-Happens-before is not transitive, but each of program-order and
-inter-thread-happens-before<SC> are transitive.
-These can be thought of as covering the "`single-threaded`" case and the
-"`multi-threaded`" case, and it is not necessary (and not valid) to form
-chains between the two.
-====
-
-
-[[memory-model-availability-visibility]]
-== Availability and Visibility
-
-_Availability_ and _visibility_ are states of a write operation, which
-(informally) track how far the write has permeated the system, i.e. which
-agents and references are able to observe the write.
-Availability state is per _memory domain_.
-Visibility state is per (agent,reference) pair.
-Availability and visibility states are per-memory location for each write.
-
-Memory domains are named according to the agents whose memory accesses use
-the domain.
-Domains used by shader invocations are organized hierarchically into
-multiple smaller memory domains which correspond to the different
-<<shaders-scope, scopes>>.
-Each memory domain is considered the _dual_ of a scope, and vice versa.
-The memory domains defined in Vulkan include:
-
-  * _host_ - accessible by host agents
-  * _device_ - accessible by all device agents for a particular device
-  * _shader_ - accessible by shader agents for a particular device,
-    corresponding to the code:Device scope
-  * _queue family instance_ - accessible by shader agents in a single queue
-    family, corresponding to the code:QueueFamily scope.
-ifdef::VK_EXT_fragment_shader_interlock[]
-  * _fragment interlock instance_ - accessible by fragment shader agents
-    that <<shaders-scope-fragment-interlock,overlap>>, corresponding to the
-    code:FragmentInterlock scope.
-endif::VK_EXT_fragment_shader_interlock[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  * _shader call instance_ - accessible by shader agents that are
-    <<shader-call-related,shader-call-related>>, corresponding to the
-    code:ShaderCallKHR scope.
-endif::VK_KHR_ray_tracing_pipeline[]
-  * _workgroup instance_ - accessible by shader agents in the same
-    workgroup, corresponding to the code:Workgroup scope.
-  * _subgroup instance_ - accessible by shader agents in the same subgroup,
-    corresponding to the code:Subgroup scope.
-
-The memory domains are nested in the order listed above,
-ifdef::VK_KHR_ray_tracing_pipeline[]
-except for shader call instance domain,
-endif::VK_KHR_ray_tracing_pipeline[]
-with memory domains later in the list nested in the domains earlier in the
-list.
-ifdef::VK_KHR_ray_tracing_pipeline[]
-The shader call instance domain is at an implementation-dependent location
-in the list, and is nested according to that location.
-The shader call instance domain is not broader than the queue family
-instance domain.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-[NOTE]
-.Note
-====
-Memory domains do not correspond to storage classes or device-local and
-host-local slink:VkDeviceMemory allocations, rather they indicate whether a
-write can be made visible only to agents in the same subgroup, same
-workgroup,
-ifdef::VK_EXT_fragment_shader_interlock[]
-overlapping fragment shader invocation,
-endif::VK_EXT_fragment_shader_interlock[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-shader-call-related ray tracing invocation,
-endif::VK_KHR_ray_tracing_pipeline[]
-in any shader invocation, or anywhere on the device, or host.
-The shader, queue family instance,
-ifdef::VK_EXT_fragment_shader_interlock[]
-fragment interlock instance,
-endif::VK_EXT_fragment_shader_interlock[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-shader call instance,
-endif::VK_KHR_ray_tracing_pipeline[]
-workgroup instance, and subgroup instance domains are only used for
-shader-based availability/visibility operatons, in other cases writes can be
-made available from/visible to the shader via the device domain.
-====
-
-_Availability operations_, _visibility operations_, and _memory domain
-operations_ alter the state of the write operations that happen-before them,
-and which are included in their _source scope_ to be available or visible to
-their _destination scope_.
-
-  * For an availability operation, the source scope is a set of
-    (agent,reference,memory location) tuples, and the destination scope is a
-    set of memory domains.
-  * For a memory domain operation, the source scope is a memory domain and
-    the destination scope is a memory domain.
-  * For a visibility operation, the source scope is a set of memory domains
-    and the destination scope is a set of (agent,reference,memory location)
-    tuples.
-
-How the scopes are determined depends on the specific operation.
-Availability and memory domain operations expand the set of memory domains
-to which the write is available.
-Visibility operations expand the set of (agent,reference,memory location)
-tuples to which the write is visible.
-
-Recall that availability and visibility states are per-memory location, and
-let W be a write operation to one or more locations performed by agent A via
-reference R. Let L be one of the locations written.
-(W,L) (the write W to L), is initially not available to any memory domain
-and only visible to (A,R,L).
-An availability operation AV that happens-after W and that includes (A,R,L)
-in its source scope makes (W,L) _available_ to the memory domains in its
-destination scope.
-
-A memory domain operation DOM that happens-after AV and for which (W,L) is
-available in the source scope makes (W,L) available in the destination
-memory domain.
-
-A visibility operation VIS that happens-after AV (or DOM) and for which
-(W,L) is available in any domain in the source scope makes (W,L) _visible_
-to all (agent,reference,L) tuples included in its destination scope.
-
-If write W~2~ happens-after W, and their sets of memory locations overlap,
-then W will not be available/visible to all agents/references for those
-memory locations that overlap (and future AV/DOM/VIS ops cannot revive W's
-write to those locations).
-
-Availability, memory domain, and visibility operations are treated like
-other non-atomic memory accesses for the purpose of
-<<memory-model-memory-semantics,memory semantics>>, meaning they can be
-ordered by release-acquire sequences or memory barriers.
-
-An _availability chain_ is a sequence of availability operations to
-increasingly broad memory domains, where element N+1 of the chain is
-performed in the dual scope instance of the destination memory domain of
-element N and element N happens-before element N+1.
-An example is an availability operation with destination scope of the
-workgroup instance domain that happens-before an availability operation to
-the shader domain performed by an invocation in the same workgroup.
-An availability chain AVC that happens-after W and that includes (A,R,L) in
-the source scope makes (W,L) _available_ to the memory domains in its final
-destination scope.
-An availability chain with a single element is just the availability
-operation.
-
-Similarly, a _visibility chain_ is a sequence of visibility operations from
-increasingly narrow memory domains, where element N of the chain is
-performed in the dual scope instance of the source memory domain of element
-N+1 and element N happens-before element N+1.
-An example is a visibility operation with source scope of the shader domain
-that happens-before a visibility operation with source scope of the
-workgroup instance domain performed by an invocation in the same workgroup.
-A visibility chain VISC that happens-after AVC (or DOM) and for which (W,L)
-is available in any domain in the source scope makes (W,L) _visible_ to all
-(agent,reference,L) tuples included in its final destination scope.
-A visibility chain with a single element is just the visibility operation.
-
-
-[[memory-model-vulkan-availability-visibility]]
-== Availability, Visibility, and Domain Operations
-
-The following operations generate availability, visibility, and domain
-operations.
-When multiple availability/visibility/domain operations are described, they
-are system-synchronized-with each other in the order listed.
-
-An operation that performs a <<synchronization-dependencies-memory,memory
-dependency>> generates:
-
-  * If the source access mask includes ename:VK_ACCESS_HOST_WRITE_BIT, then
-    the dependency includes a memory domain operation from host domain to
-    device domain.
-  * An availability operation with source scope of all writes in the first
-    <<synchronization-dependencies-access-scopes,access scope>> of the
-    dependency and a destination scope of the device domain.
-  * A visibility operation with source scope of the device domain and
-    destination scope of the second access scope of the dependency.
-  * If the destination access mask includes ename:VK_ACCESS_HOST_READ_BIT or
-    ename:VK_ACCESS_HOST_WRITE_BIT, then the dependency includes a memory
-    domain operation from device domain to host domain.
-
-flink:vkFlushMappedMemoryRanges performs an availability operation, with a
-source scope of (agents,references) = (all host threads, all mapped memory
-ranges passed to the command), and destination scope of the host domain.
-
-flink:vkInvalidateMappedMemoryRanges performs a visibility operation, with a
-source scope of the host domain and a destination scope of
-(agents,references) = (all host threads, all mapped memory ranges passed to
-the command).
-
-flink:vkQueueSubmit performs a memory domain operation from host to device,
-and a visibility operation with source scope of the device domain and
-destination scope of all agents and references on the device.
-
-
-[[memory-model-availability-visibility-semantics]]
-== Availability and Visibility Semantics
-
-A memory barrier or atomic operation via agent A that includes MakeAvailable
-in its semantics performs an availability operation whose source scope
-includes agent A and all references in the storage classes in that
-instruction's storage class semantics, and all memory locations, and whose
-destination scope is a set of memory domains selected as specified below.
-The implicit availability operation is program-ordered between the barrier
-or atomic and all other operations program-ordered before the barrier or
-atomic.
-
-A memory barrier or atomic operation via agent A that includes MakeVisible
-in its semantics performs a visibility operation whose source scope is a set
-of memory domains selected as specified below, and whose destination scope
-includes agent A and all references in the storage classes in that
-instruction's storage class semantics, and all memory locations.
-The implicit visibility operation is program-ordered between the barrier or
-atomic and all other operations program-ordered after the barrier or atomic.
-
-The memory domains are selected based on the memory scope of the instruction
-as follows:
-
-  * code:Device scope uses the shader domain
-  * code:QueueFamily scope uses the queue family instance domain
-ifdef::VK_EXT_fragment_shader_interlock[]
-  * code:FragmentInterlock scope uses the fragment interlock instance domain
-endif::VK_EXT_fragment_shader_interlock[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  * code:ShaderCallKHR scope uses the shader call instance domain
-endif::VK_KHR_ray_tracing_pipeline[]
-  * code:Workgroup scope uses the workgroup instance domain
-  * code:Subgroup uses the subgroup instance domain
-  * code:Invocation perform no availability/visibility operations.
-
-When an availability operation performed by an agent A includes a memory
-domain D in its destination scope, where D corresponds to scope instance S,
-it also includes the memory domains that correspond to each smaller scope
-instance S' that is a subset of S and that includes A. Similarly for
-visibility operations.
-
-
-[[memory-model-instruction-av-vis]]
-== Per-Instruction Availability and Visibility Semantics
-
-A memory write instruction that includes MakePointerAvailable, or an image
-write instruction that includes MakeTexelAvailable, performs an availability
-operation whose source scope includes the agent and reference used to
-perform the write and the memory locations written by the instruction, and
-whose destination scope is a set of memory domains selected by the Scope
-operand specified in <<memory-model-availability-visibility-semantics,
-Availability and Visibility Semantics>>.
-The implicit availability operation is program-ordered between the write and
-all other operations program-ordered after the write.
-
-A memory read instruction that includes MakePointerVisible, or an image read
-instruction that includes MakeTexelVisible, performs a visibility operation
-whose source scope is a set of memory domains selected by the Scope operand
-as specified in <<memory-model-availability-visibility-semantics,
-Availability and Visibility Semantics>>, and whose destination scope
-includes the agent and reference used to perform the read and the memory
-locations read by the instruction.
-The implicit visibility operation is program-ordered between read and all
-other operations program-ordered before the read.
-
-[NOTE]
-.Note
-====
-Although reads with per-instruction visibility only perform visibility ops
-from the shader or
-ifdef::VK_EXT_fragment_shader_interlock[]
-fragment interlock instance or
-endif::VK_EXT_fragment_shader_interlock[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-shader call instance or
-endif::VK_KHR_ray_tracing_pipeline[]
-workgroup instance or subgroup instance domain, they will also see writes
-that were made visible via the device domain, i.e. those writes previously
-performed by non-shader agents and made visible via API commands.
-====
-
-[NOTE]
-.Note
-====
-It is expected that all invocations in a subgroup execute on the same
-processor with the same path to memory, and thus availability and visibility
-operations with subgroup scope can be expected to be "`free`".
-====
-
-
-[[memory-model-location-ordered]]
-== Location-Ordered
-
-Let X and Y be memory accesses to overlapping sets of memory locations M,
-where X != Y. Let (A~X~,R~X~) be the agent and reference used for X, and
-(A~Y~,R~Y~) be the agent and reference used for Y. For now, let "`->`"
-denote happens-before and "`->^rcpo^`" denote the reflexive closure of
-program-ordered before.
-
-If D~1~ and D~2~ are different memory domains, then let DOM(D~1~,D~2~) be a
-memory domain operation from D~1~ to D~2~.
-Otherwise, let DOM(D,D) be a placeholder such that X->DOM(D,D)->Y if and
-only if X->Y.
-
-X is _location-ordered_ before Y for a location L in M if and only if any of
-the following is true:
-
-  * A~X~ == A~Y~ and R~X~ == R~Y~ and X->Y
-  ** NOTE: this case means no availability/visibility ops are required when
-     it is the same (agent,reference).
-
-  * X is a read, both X and Y are non-private, and X->Y
-  * X is a read, and X (transitively) system-synchronizes with Y
-
-  * If R~X~ == R~Y~ and A~X~ and A~Y~ access a common memory domain D (e.g.
-    are in the same workgroup instance if D is the workgroup instance
-    domain), and both X and Y are non-private:
-  ** X is a write, Y is a write, AVC(A~X~,R~X~,D,L) is an availability chain
-     making (X,L) available to domain D, and X->^rcpo^AVC(A~X~,R~X~,D,L)->Y
-  ** X is a write, Y is a read, AVC(A~X~,R~X~,D,L) is an availability chain
-     making (X,L) available to domain D, VISC(A~Y~,R~Y~,D,L) is a visibility
-     chain making writes to L available in domain D visible to Y, and
-     X->^rcpo^AVC(A~X~,R~X~,D,L)->VISC(A~Y~,R~Y~,D,L)->^rcpo^Y
-  ** If
-     slink:VkPhysicalDeviceVulkanMemoryModelFeatures::pname:vulkanMemoryModelAvailabilityVisibilityChains
-     is ename:VK_FALSE, then AVC and VISC must: each only have a single
-     element in the chain, in each sub-bullet above.
-
-  * Let D~X~ and D~Y~ each be either the device domain or the host domain,
-    depending on whether A~X~ and A~Y~ execute on the device or host:
-  ** X is a write and Y is a write, and
-     X->AV(A~X~,R~X~,D~X~,L)->DOM(D~X~,D~Y~)->Y
-  ** X is a write and Y is a read, and
-     X->AV(A~X~,R~X~,D~X~,L)->DOM(D~X~,D~Y~)->VIS(A~Y~,R~Y~,D~Y~,L)->Y
-
-[NOTE]
-.Note
-====
-The final bullet (synchronization through device/host domain) requires
-API-level synchronization operations, since the device/host domains are not
-accessible via shader instructions.
-And "`device domain`" is not to be confused with "`device scope`", which
-synchronizes through the "`shader domain`".
-====
-
-
-[[memory-model-access-data-race]]
-== Data Race
-
-Let X and Y be operations that access overlapping sets of memory locations
-M, where X != Y, and at least one of X and Y is a write, and X and Y are not
-mutually-ordered atomic operations.
-If there does not exist a location-ordered relation between X and Y for each
-location in M, then there is a _data race_.
-
-Applications must: ensure that no data races occur during the execution of
-their application.
-
-[NOTE]
-.Note
-====
-Data races can only occur due to instructions that are actually executed.
-For example, an instruction skipped due to control flow must not contribute
-to a data race.
-====
-
-
-[[memory-model-visible-to]]
-== Visible-To
-
-Let X be a write and Y be a read whose sets of memory locations overlap, and
-let M be the set of memory locations that overlap.
-Let M~2~ be a non-empty subset of M. Then X is _visible-to_ Y for memory
-locations M~2~ if and only if all of the following are true:
-
-  * X is location-ordered before Y for each location L in M~2~.
-  * There does not exist another write Z to any location L in M~2~ such that
-    X is location-ordered before Z for location L and Z is location-ordered
-    before Y for location L.
-
-If X is visible-to Y, then Y reads the value written by X for locations
-M~2~.
-
-[NOTE]
-.Note
-====
-It is possible for there to be a write between X and Y that overwrites a
-subset of the memory locations, but the remaining memory locations (M~2~)
-will still be visible-to Y.
-====
-
-
-[[memory-model-acyclicity]]
-== Acyclicity
-
-_Reads-from_ is a relation between operations, where the first operation is
-a write, the second operation is a read, and the second operation reads the
-value written by the first operation.
-_From-reads_ is a relation between operations, where the first operation is
-a read, the second operation is a write, and the first operation reads a
-value written earlier than the second operation in the second operation's
-scoped modification order (or the first operation reads from the initial
-value, and the second operation is any write to the same locations).
-
-Then the implementation must: guarantee that no cycles exist in the union of
-the following relations:
-
-  * location-ordered
-  * scoped modification order (over all atomic writes)
-  * reads-from
-  * from-reads
-
-[NOTE]
-.Note
-====
-This is a "`consistency`" axiom, which informally guarantees that sequences
-of operations cannot violate causality.
-====
-
-
-[[memory-model-scoped-modification-order-coherence]]
-=== Scoped Modification Order Coherence
-
-Let A and B be mutually-ordered atomic operations, where A is
-location-ordered before B. Then the following rules are a consequence of
-acyclicity:
-
-  * If A and B are both reads and A does not read the initial value, then
-    the write that A takes its value from must: be earlier in its own scoped
-    modification order than (or the same as) the write that B takes its
-    value from (no cycles between location-order, reads-from, and
-    from-reads).
-  * If A is a read and B is a write and A does not read the initial value,
-    then A must: take its value from a write earlier than B in B's scoped
-    modification order (no cycles between location-order, scope modification
-    order, and reads-from).
-  * If A is a write and B is a read, then B must: take its value from A or a
-    write later than A in A's scoped modification order (no cycles between
-    location-order, scoped modification order, and from-reads).
-  * If A and B are both writes, then A must: be earlier than B in A's scoped
-    modification order (no cycles between location-order and scoped
-    modification order).
-  * If A is a write and B is a read-modify-write and B reads the value
-    written by A, then B comes immediately after A in A's scoped
-    modification order (no cycles between scoped modification order and
-    from-reads).
-
-
-[[memory-model-shader-io]]
-== Shader I/O
-
-If a shader invocation A in a shader stage other than code:Vertex performs a
-memory read operation X from an object in storage class
-ifdef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-code:CallableDataKHR, code:IncomingCallableDataKHR, code:RayPayloadKHR,
-code:HitAttributeKHR, code:IncomingRayPayloadKHR, or
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-code:Input, then X is system-synchronized-after all writes to the
-corresponding
-ifdef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-code:CallableDataKHR, code:IncomingCallableDataKHR, code:RayPayloadKHR,
-code:HitAttributeKHR, code:IncomingRayPayloadKHR, or
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-code:Output storage variable(s) in the shader invocation(s) that contribute
-to generating invocation A, and those writes are all visible-to X.
-
-[NOTE]
-.Note
-====
-It is not necessary for the upstream shader invocations to have completed
-execution, they only need to have generated the output that is being read.
-====
-
-
-[[memory-model-deallocation]]
-== Deallocation
-
-A call to flink:vkFreeMemory must: happen-after all memory operations on all
-memory locations in that slink:VkDeviceMemory object.
-
-[NOTE]
-.Note
-====
-Normally, device memory operations in a given queue are synchronized with
-flink:vkFreeMemory by having a host thread wait on a fence signalled by that
-queue, and the wait happens-before the call to flink:vkFreeMemory on the
-host.
-====
-
-The deallocation of SPIR-V variables is managed by the system and
-happens-after all operations on those variables.
-
-
-[[memory-model-informative-descriptions]]
-== Descriptions (Informative)
-
-This subsection offers more easily understandable consequences of the memory
-model for app/compiler developers.
-
-Let SC be the storage class(es) specified by a release or acquire operation
-or barrier.
-
-  * An atomic write with release semantics must not be reordered against any
-    read or write to SC that is program-ordered before it (regardless of the
-    storage class the atomic is in).
-
-  * An atomic read with acquire semantics must not be reordered against any
-    read or write to SC that is program-ordered after it (regardless of the
-    storage class the atomic is in).
-
-  * Any write to SC program-ordered after a release barrier must not be
-    reordered against any read or write to SC program-ordered before that
-    barrier.
-
-  * Any read from SC program-ordered before an acquire barrier must not be
-    reordered against any read or write to SC program-ordered after the
-    barrier.
-
-A control barrier (even if it has no memory semantics) must not be reordered
-against any memory barriers.
-
-This memory model allows memory accesses with and without availability and
-visibility operations, as well as atomic operations, all to be performed on
-the same memory location.
-This is critical to allow it to reason about memory that is reused in
-multiple ways, e.g. across the lifetime of different shader invocations or
-draw calls.
-While GLSL (and legacy SPIR-V) applies the "`coherent`" decoration to
-variables (for historical reasons), this model treats each memory access
-instruction as having optional implicit availability/visibility operations.
-GLSL to SPIR-V compilers should map all (non-atomic) operations on a
-coherent variable to Make{Pointer,Texel}{Available}{Visible} flags in this
-model.
-
-Atomic operations implicitly have availability/visibility operations, and
-the scope of those operations is taken from the atomic operation's scope.
-
-
-[[memory-model-tessellation-output-ordering]]
-== Tessellation Output Ordering
-
-For SPIR-V that uses the Vulkan Memory Model, the code:OutputMemory storage
-class is used to synchronize accesses to tessellation control output
-variables.
-For legacy SPIR-V that does not enable the Vulkan Memory Model via
-code:OpMemoryModel, tessellation outputs can be ordered using a control
-barrier with no particular memory scope or semantics, as defined below.
-
-Let X and Y be memory operations performed by shader invocations A~X~ and
-A~Y~.
-Operation X is _tessellation-output-ordered_ before operation Y if and only
-if all of the following are true:
-
-  * There is a dynamic instance of an code:OpControlBarrier instruction C
-    such that X is program-ordered before C in A~X~ and C is program-ordered
-    before Y in A~Y~.
-  * A~X~ and A~Y~ are in the same instance of C's execution scope.
-
-If shader invocations A~X~ and A~Y~ in the code:TessellationControl
-execution model execute memory operations X and Y, respectively, on the
-code:Output storage class, and X is tessellation-output-ordered before Y
-with a scope of code:Workgroup, then X is location-ordered before Y, and if
-X is a write and Y is a read then X is visible-to Y.
-
-
-ifdef::VK_NV_cooperative_matrix[]
-
-[[memory-model-cooperative-matrix]]
-== Cooperative Matrix Memory Access
-
-For each dynamic instance of a cooperative matrix load or store instruction
-(code:OpCooperativeMatrixLoadNV or code:OpCooperativeMatrixStoreNV), a
-single implementation-dependent invocation within the instance of the
-matrix's scope performs a non-atomic load or store (respectively) to each
-memory location that is defined to be accessed by the instruction.
-
-endif::VK_NV_cooperative_matrix[]
diff --git a/registry/vulkan/appendices/spirvenv.txt b/registry/vulkan/appendices/spirvenv.txt
deleted file mode 100755
index b259bf1..0000000
--- a/registry/vulkan/appendices/spirvenv.txt
+++ /dev/null
@@ -1,1775 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[appendix]
-[[spirvenv]]
-= Vulkan Environment for SPIR-V
-
-Shaders for Vulkan are defined by the <<spirv-spec,Khronos SPIR-V
-Specification>> as well as the <<spirv-extended,Khronos SPIR-V Extended
-Instructions for GLSL>> Specification.
-This appendix defines additional SPIR-V requirements applying to Vulkan
-shaders.
-
-== Versions and Formats
-
-A Vulkan
-ifdef::VK_VERSION_1_2[]
-1.2 implementation must: support the 1.0, 1.1, 1.2, 1.3, 1.4, and 1.5
-versions
-endif::VK_VERSION_1_2[]
-ifndef::VK_VERSION_1_2[]
-ifdef::VK_VERSION_1_1[]
-1.1 implementation must: support the 1.0, 1.1, 1.2, and 1.3 versions
-endif::VK_VERSION_1_1[]
-ifndef::VK_VERSION_1_1[]
-1.0 implementation must: support the 1.0 version
-endif::VK_VERSION_1_1[]
-endif::VK_VERSION_1_2[]
-of SPIR-V and the 1.0 version of the SPIR-V Extended Instructions for GLSL.
-ifndef::VK_VERSION_1_2[]
-ifdef::VK_KHR_spirv_1_4[]
-If the `apiext:VK_KHR_spirv_1_4` extension is enabled, the implementation
-must: additionally support the 1.4 version of SPIR-V.
-endif::VK_KHR_spirv_1_4[]
-endif::VK_VERSION_1_2[]
-
-A SPIR-V module passed into flink:vkCreateShaderModule is interpreted as a
-series of 32-bit words in host endianness, with literal strings packed as
-described in section 2.2 of the SPIR-V Specification.
-The first few words of the SPIR-V module must: be a magic number and a
-SPIR-V version number, as described in section 2.3 of the SPIR-V
-Specification.
-
-
-[[spirvenv-capabilities]]
-== Capabilities
-
-The <<spirvenv-capabilities-table,table below>> lists the set of SPIR-V
-capabilities that may: be supported in Vulkan implementations.
-The application must: not use any of these capabilities in SPIR-V passed to
-flink:vkCreateShaderModule unless one of the following conditions is met for
-the slink:VkDevice specified in the pname:device parameter of
-flink:vkCreateShaderModule:
-
-* The corresponding field in the table is blank.
-* Any corresponding Vulkan feature is enabled.
-* Any corresponding Vulkan extension is enabled.
-* Any corresponding Vulkan property is supported.
-* The corresponding core version is supported (as returned by
-  slink:VkPhysicalDeviceProperties::pname:apiVersion).
-
-:captableindent: {nbsp} {nbsp} {nbsp} {nbsp} {nbsp} {nbsp} {nbsp} {nbsp}
-[[spirvenv-capabilities-table]]
-.List of SPIR-V Capabilities and corresponding Vulkan features, extensions, or core version
-[options="header"]
-|====
-| SPIR-V code:OpCapability +
-  {captableindent} Vulkan feature, extension, or core version
-include::{generated}/spirvcap/captable.txt[]
-|====
-
-The application must: not pass a SPIR-V module containing any of the
-following to flink:vkCreateShaderModule:
-
-  * any code:OpCapability not listed above,
-  * an unsupported capability, or
-  * a capability which corresponds to a Vulkan feature or extension which
-    has not been enabled.
-
-
-[[spirvenv-extensions]]
-=== SPIR-V Extensions
-
-The <<spirvenv-extensions-table,following table>> lists SPIR-V extensions
-that implementations may: support.
-The application must: not pass a SPIR-V module to flink:vkCreateShaderModule
-that uses the following SPIR-V extensions unless one of the following
-conditions is met for the slink:VkDevice specified in the pname:device
-parameter of flink:vkCreateShaderModule:
-
-* Any corresponding Vulkan extension is enabled.
-* The corresponding core version is supported (as returned by
-  slink:VkPhysicalDeviceProperties::pname:apiVersion).
-
-[[spirvenv-extensions-table]]
-.List of SPIR-V Extensions and corresponding Vulkan extensions or core version
-[options="header"]
-|====
-| SPIR-V code:OpExtension +
-  {captableindent} Vulkan extension or core version
-include::{generated}/spirvcap/exttable.txt[]
-|====
-
-
-[[spirvenv-module-validation]]
-== Validation Rules within a Module
-
-A SPIR-V module passed to flink:vkCreateShaderModule must: conform to the
-following rules:
-
-
-[[spirvenv-module-validation-standalone]]
-=== Standalone SPIR-V Validation
-
-[open,refpage='StandaloneSpirv',desc='Standalone SPIR-V Validation',type='spirv']
---
-:refpage: StandaloneSpirv
-
-The following rules can: be validated with only the SPIR-V module itself.
-They do not depend on knowledge of the implementation and its capabilities
-or knowledge of runtime information, such as enabled features.
-
-.Valid Usage
-****
-// NOTE: Do not conditionalize the "standalone" VUs.
-// Write as though all extensions were enabled.
-// Add any needed conditional logic to the runtime section if needed.
-  * [[VUID-{refpage}-None-04633]]
-    Every entry point must: have no return value and accept no arguments
-  * [[VUID-{refpage}-None-04634]]
-    The static function-call graph for an entry point must: not contain
-    cycles; that is, static recursion is not allowed
-  * [[VUID-{refpage}-None-04635]]
-    The *Logical* or *PhysicalStorageBuffer64* addressing model must: be
-    selected
-  * [[VUID-{refpage}-None-04636]]
-    *Scope* for execution must: be limited to *Workgroup* or *Subgroup*
-  * [[VUID-{refpage}-None-04637]]
-    If the *Scope* for execution is *Workgroup*, then it must: only be used
-    in the task, mesh, tessellation control, or compute execution models
-  * [[VUID-{refpage}-None-04638]]
-    *Scope* for memory must: be limited to *Device*, *QueueFamily*,
-    *Workgroup*, *ShaderCallKHR*, *Subgroup*, or *Invocation*
-  * [[VUID-{refpage}-None-04639]]
-    If the *Scope* for memory is *Workgroup*, then it must: only be used in
-    the task, mesh, or compute execution models
-  * [[VUID-{refpage}-None-04640]]
-    If the *Scope* for memory is *ShaderCallKHR*, then it must: only be used
-    in ray generation, intersection, closest hit, any-hit, miss, and
-    callable execution models
-  * [[VUID-{refpage}-None-04641]]
-    If the *Scope* for memory is *Invocation*, then memory semantics must:
-    be *None*
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-None-04642]]
-    *Scope* for <<shaders-group-operations,group operations>> must: be
-    limited to *Subgroup*
-endif::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-None-04643]]
-    *Storage Class* must: be limited to *UniformConstant*, *Input*,
-    *Uniform*, *Output*, *Workgroup*, *Private*, *Function*, *PushConstant*,
-    *Image*, *StorageBuffer*, *RayPayloadKHR*, *IncomingRayPayloadKHR*,
-    *HitAttributeKHR*, *CallableDataKHR*, *IncomingCallableDataKHR*,
-    *ShaderRecordBufferKHR*, or *PhysicalStorageBuffer*
-  * [[VUID-{refpage}-None-04644]]
-    If the *Storage Class* is *Output*, then it must: not be used in the
-    *GlCompute*, *RayGenerationKHR*, *IntersectionKHR*, *AnyHitKHR*,
-    *ClosestHitKHR*, *MissKHR*, or *CallableKHR* execution models
-  * [[VUID-{refpage}-None-04645]]
-    If the *Storage Class* is *Workgroup*, then it must: only be used in the
-    task, mesh, or compute execution models
-  * [[VUID-{refpage}-OpAtomicStore-04730]]
-    code:OpAtomicStore must: not use *Acquire*, *AcquireRelease*, or
-    *SequentiallyConsistent* memory semantics
-  * [[VUID-{refpage}-OpAtomicLoad-04731]]
-    code:OpAtomicLoad must: not use *Release*, *AcquireRelease*, or
-    *SequentiallyConsistent* memory semantics
-  * [[VUID-{refpage}-OpMemoryBarrier-04732]]
-    code:OpMemoryBarrier must: use one of *Acquire*, *Release*,
-    *AcquireRelease*, or *SequentiallyConsistent* memory semantics
-  * [[VUID-{refpage}-OpMemoryBarrier-04733]]
-    code:OpMemoryBarrier must: include at least one storage class
-  * [[VUID-{refpage}-OpControlBarrier-04650]]
-    If the semantics for code:OpControlBarrier includes one of *Acquire*,
-    *Release*, *AcquireRelease*, or *SequentiallyConsistent* memory
-    semantics, then it must: include at least one storage class
-  * [[VUID-{refpage}-OpVariable-04651]]
-    Any code:OpVariable with an code:Initializer operand must: have
-    *Output*, *Private*, *Function*, or *Workgroup* as its *Storage Class*
-    operand
-  * [[VUID-{refpage}-OpVariable-04734]]
-    Any code:OpVariable with an code:Initializer operand and *Workgroup* as
-    its *Storage Class* operand must: use code:OpConstantNull as the
-    initializer
-  * [[VUID-{refpage}-OpReadClockKHR-04652]]
-    *Scope* for code:OpReadClockKHR must: be limited to *Subgroup* or
-    *Device*
-  * [[VUID-{refpage}-OriginLowerLeft-04653]]
-    The code:OriginLowerLeft execution mode must: not be used; fragment
-    entry points must: declare code:OriginUpperLeft
-  * [[VUID-{refpage}-PixelCenterInteger-04654]]
-    The code:PixelCenterInteger execution mode must: not be used (pixels are
-    always centered at half-integer coordinates)
-  * [[VUID-{refpage}-UniformConstant-04655]]
-    Any variable in the code:UniformConstant storage class must: be typed as
-    either code:OpTypeImage, code:OpTypeSampler, code:OpTypeSampledImage,
-    code:OpTypeAccelerationStructureKHR, or an array of one of these types
-  * [[VUID-{refpage}-OpTypeImage-04656]]
-    code:OpTypeImage must: declare a scalar 32-bit float, 64-bit integer, or
-    32-bit integer type for the "`Sampled Type`" (code:RelaxedPrecision can:
-    be applied to a sampling instruction and to the variable holding the
-    result of a sampling instruction)
-  * [[VUID-{refpage}-OpTypeImage-04657]]
-    code:OpTypeImage must: have a "`Sampled`" operand of 1 (sampled image)
-    or 2 (storage image)
-  * [[VUID-{refpage}-Image-04965]]
-    The converted bit width, signedness, and numeric type of the code:Image
-    code:Format operand of an code:OpTypeImage must: match the code:Sampled
-    code:Type, as defined in <<spirvenv-format-type-matching>>
-  * [[VUID-{refpage}-OpImageTexelPointer-04658]]
-    If an code:OpImageTexelPointer is used in an atomic operation, the image
-    type of the code:image parameter to code:OpImageTexelPointer must: have
-    an image format of code:R64i, code:R64ui, code:R32f, code:R32i, or
-    code:R32ui
-  * [[VUID-{refpage}-OpImageQuerySizeLod-04659]]
-    code:OpImageQuerySizeLod, code:OpImageQueryLod, and
-    code:OpImageQueryLevels must: only consume an "`Image`" operand whose
-    type has its "`Sampled`" operand set to 1
-  * [[VUID-{refpage}-OpTypeImage-06214]]
-    An code:OpTypeImage with a "`Dim`" operand of code:SubpassData must:
-    have an "`Arrayed`" operand of 0 (non-arrayed) and a "`Sampled`" operand
-    of 2 (storage image)
-  * [[VUID-{refpage}-SubpassData-04660]]
-    The [eq]#(u,v)# coordinates used for a code:SubpassData must: be the
-    <id> of a constant vector [eq]#(0,0)#, or if a layer coordinate is used,
-    must: be a vector that was formed with constant 0 for the [eq]#u# and
-    [eq]#v# components
-  * [[VUID-{refpage}-OpTypeImage-04661]]
-    Objects of types code:OpTypeImage, code:OpTypeSampler,
-    code:OpTypeSampledImage, and arrays of these types must: not be stored
-    to or modified
-  * [[VUID-{refpage}-Offset-04662]]
-    Any image operation must: use at most one of the code:Offset,
-    code:ConstOffset, and code:ConstOffsets image operands
-  * [[VUID-{refpage}-Offset-04663]]
-    Image operand code:Offset must: only be used with code:OpImage*Gather
-    instructions
-  * [[VUID-{refpage}-Offset-04865]]
-    Any image instruction which uses an code:Offset, code:ConstOffset, or
-    code:ConstOffsets image operand, must only consume a "`Sampled Image`"
-    operand whose type has its "`Sampled`" operand set to 1
-  * [[VUID-{refpage}-OpImageGather-04664]]
-    The "`Component`" operand of code:OpImageGather, and
-    code:OpImageSparseGather must: be the <id> of a constant instruction
-  * [[VUID-{refpage}-OpImage-04777]]
-    code:OpImage*Dref must: not consume an image whose `Dim` is 3D
-  * [[VUID-{refpage}-OpTypeAccelerationStructureKHR-04665]]
-     Objects of types code:OpTypeAccelerationStructureKHR and arrays of this
-     type must: not be stored to or modified
-  * [[VUID-{refpage}-OpReportIntersectionKHR-04666]]
-    The value of the "`Hit Kind`" operand of code:OpReportIntersectionKHR
-    must: be in the range [eq]#[0,127]#
-  * [[VUID-{refpage}-None-04667]]
-    Structure types must: not contain opaque types
-  * [[VUID-{refpage}-BuiltIn-04668]]
-    Any code:BuiltIn decoration not listed in
-    <<interfaces-builtin-variables>> must: not be used
-  * [[VUID-{refpage}-Location-04915]]
-    The code:Location or code:Component decorations must: not be used with
-    code:BuiltIn
-  * [[VUID-{refpage}-Location-04916]]
-    The code:Location decorations must: be used on
-    <<interfaces-iointerfaces-user,user-defined variables>>
-  * [[VUID-{refpage}-Location-04917]]
-    The code:Location decorations must: be used on an code:OpVariable with a
-    structure type that is not a block
-  * [[VUID-{refpage}-Location-04918]]
-    The code:Location decorations must: not be used on the members of
-    code:OpVariable with a structure type that is decorated with
-    code:Location
-  * [[VUID-{refpage}-Location-04919]]
-    The code:Location decorations must: be used on each member of
-    code:OpVariable with a structure type that is a block not decorated with
-    code:Location
-  * [[VUID-{refpage}-Component-04920]]
-    The code:Component decoration value must: not be greater than 3
-  * [[VUID-{refpage}-Component-04921]]
-    If the code:Component decoration is used on an code:OpVariable that has
-    a code:OpTypeVector type with a code:Component code:Type with a
-    code:Width that is less than or equal to 32, the sum of its
-    code:Component code:Count and the code:Component decoration value must:
-    be less than 4
-  * [[VUID-{refpage}-Component-04922]]
-    If the code:Component decoration is used on an code:OpVariable that has
-    a code:OpTypeVector type with a code:Component code:Type with a
-    code:Width that is equal to 64, the sum of two times its code:Component
-    code:Count and the code:Component decoration value must: be less than 4
-  * [[VUID-{refpage}-Component-04923]]
-    The code:Component decorations value must: not be 1 or 3 for scalar or
-    two-component 64-bit data types
-  * [[VUID-{refpage}-Component-04924]]
-    The code:Component decorations must: not used with any type that is not
-    a scalar or vector
-  * [[VUID-{refpage}-GLSLShared-04669]]
-    The code:GLSLShared and code:GLSLPacked decorations must: not be used
-  * [[VUID-{refpage}-Flat-04670]]
-    The code:Flat, code:NoPerspective, code:Sample, and code:Centroid
-    decorations must: only be used on variables with the code:Output or
-    code:Input storage class
-  * [[VUID-{refpage}-Flat-06201]]
-    The code:Flat, code:NoPerspective, code:Sample, and code:Centroid
-    decorations must: not be used on variables with the code:Output storage
-    class in a fragment shader
-  * [[VUID-{refpage}-Flat-06202]]
-    The code:Flat, code:NoPerspective, code:Sample, and code:Centroid
-    decorations must: not be used on variables with the code:Input storage
-    class in a vertex shader
-  * [[VUID-{refpage}-Flat-04744]]
-    Any variable with integer or double-precision floating-point type and
-    with code:Input storage class in a fragment shader, must: be decorated
-    code:Flat
-  * [[VUID-{refpage}-ViewportRelativeNV-04672]]
-    The code:ViewportRelativeNV decoration must: only be used on a variable
-    decorated with code:Layer in the vertex, tessellation evaluation, or
-    geometry shader stages
-  * [[VUID-{refpage}-ViewportRelativeNV-04673]]
-    The code:ViewportRelativeNV decoration must: not be used unless a
-    variable decorated with one of code:ViewportIndex or code:ViewportMaskNV
-    is also statically used by the same code:OpEntryPoint
-  * [[VUID-{refpage}-ViewportMaskNV-04674]]
-    The code:ViewportMaskNV and code:ViewportIndex decorations must: not
-    both be statically used by one or more code:OpEntryPoint's that form the
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stages>> of a graphics pipeline
-  * [[VUID-{refpage}-FPRoundingMode-04675]]
-    Rounding modes other than round-to-nearest-even and round-towards-zero
-    must: not be used for the code:FPRoundingMode decoration
-  * [[VUID-{refpage}-FPRoundingMode-04676]]
-    The code:FPRoundingMode decoration must: only be used for a width-only
-    conversion instruction whose only uses are code:Object operands of
-    code:OpStore instructions storing through a pointer to a 16-bit
-    floating-point object in the code:StorageBuffer,
-    code:PhysicalStorageBuffer, code:Uniform, or code:Output storage class
-  * [[VUID-{refpage}-Invariant-04677]]
-    Variables decorated with code:Invariant and variables with structure
-    types that have any members decorated with code:Invariant must: be in
-    the code:Output or code:Input storage class, code:Invariant used on an
-    code:Input storage class variable or structure member has no effect
-  * [[VUID-{refpage}-VulkanMemoryModel-04678]]
-    [[builtin-volatile-semantics]] If the code:VulkanMemoryModel capability
-    is not declared, the code:Volatile decoration must: be used on any
-    variable declaration that includes one of the code:SMIDNV,
-    code:WarpIDNV, code:SubgroupSize, code:SubgroupLocalInvocationId,
-    code:SubgroupEqMask, code:SubgroupGeMask, code:SubgroupGtMask,
-    code:SubgroupLeMask, or code:SubgroupLtMask code:BuiltIn decorations
-    when used in the ray generation, closest hit, miss, intersection, or
-    callable shaders, or with the code:RayTmaxKHR code:Builtin decoration
-    when used in an intersection shader
-  * [[VUID-{refpage}-VulkanMemoryModel-04679]]
-    If the code:VulkanMemoryModel capability is declared, the code:OpLoad
-    instruction must: use the code:Volatile memory semantics when it
-    accesses into any variable that includes one of the code:SMIDNV,
-    code:WarpIDNV, code:SubgroupSize, code:SubgroupLocalInvocationId,
-    code:SubgroupEqMask, code:SubgroupGeMask, code:SubgroupGtMask,
-    code:SubgroupLeMask, or code:SubgroupLtMask code:BuiltIn decorations
-    when used in the ray generation, closest hit, miss, intersection, or
-    callable shaders, or with the code:RayTmaxKHR code:Builtin decoration
-    when used in an intersection shader
-  * [[VUID-{refpage}-OpTypeRuntimeArray-04680]]
-     code:OpTypeRuntimeArray must: only be used for the last member of an
-     code:OpTypeStruct that is in the code:StorageBuffer or
-     code:PhysicalStorageBuffer storage class decorated as code:Block, or
-     that is in the code:Uniform storage class decorated as code:BufferBlock
-  * [[VUID-{refpage}-Function-04681]]
-    A type _T_ that is an array sized with a specialization constant must:
-    neither be, nor be contained in, the type _T2_ of a variable _V_, unless
-    either: a) _T_ is equal to _T2_, b) _V_ is declared in the
-    code:Function, or code:Private storage classes, c) _V_ is a non-Block
-    variable in the code:Workgroup storage class, or d) _V_ is an interface
-    variable with an additional level of arrayness,
-    <<interfaces-iointerfaces-matching, as described in interface
-    matching>>, and _T_ is the member type of the array type _T2_
-  * [[VUID-{refpage}-OpControlBarrier-04682]]
-    If code:OpControlBarrier is used in ray generation, intersection,
-    any-hit, closest hit, miss, fragment, vertex, tessellation evaluation,
-    or geometry shaders, the execution Scope must: be code:Subgroup
-  * [[VUID-{refpage}-LocalSize-06426]]
-    For each compute shader entry point, either a code:LocalSize or
-    code:LocalSizeId execution mode, or an object decorated with the
-    code:WorkgroupSize decoration must: be specified
-  * [[VUID-{refpage}-DerivativeGroupQuadsNV-04684]]
-    For compute shaders using the code:DerivativeGroupQuadsNV execution
-    mode, the first two dimensions of the local workgroup size must: be a
-    multiple of two
-  * [[VUID-{refpage}-DerivativeGroupLinearNV-04778]]
-    For compute shaders using the code:DerivativeGroupLinearNV execution
-    mode, the product of the dimensions of the local workgroup size must: be
-    a multiple of four
-  * [[VUID-{refpage}-OpGroupNonUniformBallotBitCount-04685]]
-    If code:OpGroupNonUniformBallotBitCount is used, the group operation
-    must: be limited to *Reduce*, *InclusiveScan*, or *ExclusiveScan*
-  * [[VUID-{refpage}-None-04686]]
-    The _Pointer_ operand of all atomic instructions must: have a *Storage
-    Class* limited to *Uniform*, *Workgroup*, *Image*, *StorageBuffer*, or
-    *PhysicalStorageBuffer*
-  * [[VUID-{refpage}-Offset-04687]]
-    Output variables or block members decorated with code:Offset that have a
-    64-bit type, or a composite type containing a 64-bit type, must: specify
-    an code:Offset value aligned to a 8 byte boundary
-  * [[VUID-{refpage}-Offset-04689]]
-    The size of any output block containing any member decorated with
-    code:Offset that is a 64-bit type must: be a multiple of 8
-  * [[VUID-{refpage}-Offset-04690]]
-    The first member of an output block that specifies a code:Offset
-    decoration must: specify a code:Offset value that is aligned to an 8
-    byte boundary if that block contains any member decorated with
-    code:Offset and is a 64-bit type
-  * [[VUID-{refpage}-Offset-04691]]
-    Output variables or block members decorated with code:Offset that have a
-    32-bit type, or a composite type contains a 32-bit type, must: specify
-    an code:Offset value aligned to a 4 byte boundary
-  * [[VUID-{refpage}-Offset-04692]]
-    Output variables, blocks or block members decorated with code:Offset
-    must: only contain base types that have components that are either
-    32-bit or 64-bit in size
-  * [[VUID-{refpage}-Offset-04716]]
-    Only variables or block members in the output interface decorated with
-    code:Offset can: be captured for transform feedback, and those variables
-    or block members must: also be decorated with code:XfbBuffer and
-    code:XfbStride, or inherit code:XfbBuffer and code:XfbStride decorations
-    from a block containing them
-  * [[VUID-{refpage}-XfbBuffer-04693]]
-    All variables or block members in the output interface of the entry
-    point being compiled decorated with a specific code:XfbBuffer value
-    must: all be decorated with identical code:XfbStride values
-  * [[VUID-{refpage}-Stream-04694]]
-    If any variables or block members in the output interface of the entry
-    point being compiled are decorated with code:Stream, then all variables
-    belonging to the same code:XfbBuffer must: specify the same code:Stream
-    value
-  * [[VUID-{refpage}-XfbBuffer-04696]]
-    For any two variables or block members in the output interface of the
-    entry point being compiled with the same code:XfbBuffer value, the
-    ranges determined by the code:Offset decoration and the size of the type
-    must: not overlap
-  * [[VUID-{refpage}-XfbBuffer-04697]]
-    All block members in the output interface of the entry point being
-    compiled that are in the same block and have a declared or inherited
-    code:XfbBuffer decoration must: specify the same code:XfbBuffer value
-  * [[VUID-{refpage}-RayPayloadKHR-04698]]
-    code:RayPayloadKHR storage class must: only be used in ray generation,
-    closest hit or miss shaders
-  * [[VUID-{refpage}-IncomingRayPayloadKHR-04699]]
-    code:IncomingRayPayloadKHR storage class must: only be used in closest
-    hit, any-hit, or miss shaders
-  * [[VUID-{refpage}-IncomingRayPayloadKHR-04700]]
-    There must: be at most one variable with the code:IncomingRayPayloadKHR
-    storage class in the input interface of an entry point
-  * [[VUID-{refpage}-HitAttributeKHR-04701]]
-    code:HitAttributeKHR storage class must: only be used in intersection,
-    any-hit, or closest hit shaders
-  * [[VUID-{refpage}-HitAttributeKHR-04702]]
-    There must: be at most one variable with the code:HitAttributeKHR
-    storage class in the input interface of an entry point
-  * [[VUID-{refpage}-HitAttributeKHR-04703]]
-    A variable with code:HitAttributeKHR storage class must: only be written
-    to in an intersection shader
-  * [[VUID-{refpage}-CallableDataKHR-04704]]
-    code:CallableDataKHR storage class must: only be used in ray generation,
-    closest hit, miss, and callable shaders
-  * [[VUID-{refpage}-IncomingCallableDataKHR-04705]]
-    code:IncomingCallableDataKHR storage class must: only be used in
-    callable shaders
-  * [[VUID-{refpage}-IncomingCallableDataKHR-04706]]
-    There must: be at most one variable with the
-    code:IncomingCallableDataKHR storage class in the input interface of an
-    entry point
-  * [[VUID-{refpage}-Base-04707]]
-    The code:Base operand of code:OpPtrAccessChain must: point to one of the
-    following: *Workgroup*, if code:VariablePointers is enabled;
-    *StorageBuffer*, if code:VariablePointers or
-    code:VariablePointersStorageBuffer is enabled; *PhysicalStorageBuffer*,
-    if the code:PhysicalStorageBuffer64 addressing model is enabled
-  * [[VUID-{refpage}-PhysicalStorageBuffer64-04708]]
-    If the code:PhysicalStorageBuffer64 addressing model is enabled, all
-    instructions that support memory access operands and that use a physical
-    pointer must: include the code:Aligned operand
-  * [[VUID-{refpage}-PhysicalStorageBuffer64-04709]]
-    If the code:PhysicalStorageBuffer64 addressing model is enabled, any
-    access chain instruction that accesses into a code:RowMajor matrix must:
-    only be used as the code:Pointer operand to code:OpLoad or code:OpStore
-  * [[VUID-{refpage}-PhysicalStorageBuffer64-04710]]
-    If the code:PhysicalStorageBuffer64 addressing model is enabled,
-    code:OpConvertUToPtr and code:OpConvertPtrToU must: use an integer type
-    whose code:Width is 64
-  * [[VUID-{refpage}-OpTypeForwardPointer-04711]]
-    code:OpTypeForwardPointer must: have a storage class of
-    code:PhysicalStorageBuffer
-  * [[VUID-{refpage}-None-04745]]
-    All variables with a storage class of *PushConstant* declared as an
-    array must: only be accessed by dynamically uniform indices
-  * [[VUID-{refpage}-Result-04780]]
-    The code:Result code:Type operand of any code:OpImageRead or
-    code:OpImageSparseRead instruction must: be a vector of four components
-  * [[VUID-{refpage}-Base-04781]]
-    The code:Base operand of any code:OpBitCount, code:OpBitReverse,
-    code:OpBitFieldInsert, code:OpBitFieldSExtract, or
-    code:OpBitFieldUExtract instruction must: be a 32-bit integer scalar or
-    a vector of 32-bit integers
-****
---
-
-[[spirvenv-module-validation-runtime]]
-=== Runtime SPIR-V Validation
-
-[open,refpage='RuntimeSpirv',desc='Runtime SPIR-V Validation',type='spirv']
---
-:refpage: RuntimeSpirv
-
-The following rules must: be validated at runtime.
-These rules depend on knowledge of the implementation and its capabilities
-and knowledge of runtime information, such as enabled features.
-
-.Valid Usage
-****
-ifdef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-  * [[VUID-{refpage}-vulkanMemoryModel-06265]]
-    If <<features-vulkanMemoryModel,pname:vulkanMemoryModel>> is enabled and
-    <<features-vulkanMemoryModelDeviceScope,pname:vulkanMemoryModelDeviceScope>>
-    is not enabled, *Device* memory scope must: not be used.
-endif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-ifdef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-  * [[VUID-{refpage}-vulkanMemoryModel-06266]]
-    If <<features-vulkanMemoryModel,pname:vulkanMemoryModel>> is not
-    enabled, *QueueFamily* memory scope must: not be used.
-endif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-ifdef::VK_KHR_shader_clock[]
-  * [[VUID-{refpage}-shaderSubgroupClock-06267]]
-    If <<features-shaderSubgroupClock,pname:shaderSubgroupClock>> is not
-    enabled, the code:Subgroup scope must: not be used for
-    code:OpReadClockKHR.
-  * [[VUID-{refpage}-shaderDeviceClock-06268]]
-    If <<features-shaderDeviceClock,pname:shaderDeviceClock>> is not
-    enabled, the code:Device scope must: not be used for
-    code:OpReadClockKHR.
-endif::VK_KHR_shader_clock[]
-ifndef::VK_KHR_format_feature_flags2[]
-  * [[VUID-{refpage}-OpTypeImage-06269]]
-    If
-    <<features-shaderStorageImageWriteWithoutFormat,shaderStorageImageWriteWithoutFormat>>
-    is not enabled, any variable created with a "`Type`" of code:OpTypeImage
-    that has a "`Sampled`" operand of 2 and an "`Image Format`" operand of
-    code:Unknown must: be decorated with code:NonWritable.
-  * [[VUID-{refpage}-OpTypeImage-06270]]
-    If
-    <<features-shaderStorageImageReadWithoutFormat,shaderStorageImageReadWithoutFormat>>
-    is not enabled, any variable created with a "`Type`" of code:OpTypeImage
-    that has a "`Sampled`" operand of 2 and an "`Image Format`" operand of
-    code:Unknown must: be decorated with code:NonReadable.
-  * [[VUID-{refpage}-BuiltIn-06271]]
-    Any code:BuiltIn decoration that corresponds only to Vulkan features or
-endif::VK_KHR_format_feature_flags2[]
-    extensions that have not been enabled must: not be used.
-  * [[VUID-{refpage}-Location-06272]]
-    The sum of code:Location and the number of locations the variable it
-    decorates consumes must: be less than or equal to the value for the
-    matching {ExecutionModel} defined in <<interfaces-iointerfaces-limits>>
-  * [[VUID-{refpage}-Fragment-06427]]
-    When blending is enabled and one of the dual source blend modes is in
-    use, the maximum number of output attachments written to in the
-    code:Fragment {ExecutionModel} must: be less than or equal to
-    <<limits-maxFragmentDualSrcAttachments,pname:maxFragmentDualSrcAttachments>>
-  * [[VUID-{refpage}-Location-06428]]
-    The maximum number of storage buffers, storage images, and output
-    code:Location decorated color attachments written to in the
-    code:Fragment {ExecutionModel} must: be less than or equal to
-    <<limits-maxFragmentCombinedOutputResources,pname:maxFragmentCombinedOutputResources>>
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * [[VUID-{refpage}-OpTypeRuntimeArray-06273]]
-    code:OpTypeRuntimeArray must: only be used for an array of variables
-    with storage class code:Uniform, code:StorageBuffer, or
-    code:UniformConstant, or for the outermost dimension of an array of
-    arrays of such variables if the
-    <<features-runtimeDescriptorArray,runtimeDescriptorArray>> feature is
-    enabled,
-  * [[VUID-{refpage}-NonUniform-06274]]
-    If an instruction loads from or stores to a resource (including atomics
-    and image instructions) and the resource descriptor being accessed is
-    not dynamically uniform, then the operand corresponding to that resource
-    (e.g. the pointer or sampled image operand) must: be decorated with
-    code:NonUniform.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_2,VK_KHR_shader_subgroup_extended_types[]
-  * [[VUID-{refpage}-None-06275]]
-    <<features-subgroup-extended-types,shaderSubgroupExtendedTypes>> must:
-    be enabled for <<shaders-group-operations,group operations>> to use
-    8-bit integer, 16-bit integer, 64-bit integer, 16-bit floating-point,
-    and vectors of these types
-endif::VK_VERSION_1_2,VK_KHR_shader_subgroup_extended_types[]
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_2[]
-  * [[VUID-{refpage}-subgroupBroadcastDynamicId-06276]]
-    If
-    <<features-subgroupBroadcastDynamicId,code:subgroupBroadcastDynamicId>>
-    is ename:VK_TRUE, and the shader module version is 1.5 or higher, the
-    "`Index`" for code:OpGroupNonUniformQuadBroadcast must: be dynamically
-    uniform within the derivative group.
-    Otherwise, "`Index`" must: be a constant.
-  * [[VUID-{refpage}-subgroupBroadcastDynamicId-06277]]
-    If
-    <<features-subgroupBroadcastDynamicId,code:subgroupBroadcastDynamicId>>
-    is ename:VK_TRUE, and the shader module version is 1.5 or higher, the
-    "`Id`" for code:OpGroupNonUniformBroadcast must: be dynamically uniform
-    within the subgroup.
-    Otherwise, "`Id`" must: be a constant.
-endif::VK_VERSION_1_2[]
-ifdef::VK_KHR_shader_atomic_int64[]
-  * [[VUID-{refpage}-None-06278]]
-    <<features-shaderBufferInt64Atomics,shaderBufferInt64Atomics>> must: be
-    enabled for 64-bit integer atomic operations to be supported on a
-    _Pointer_ with a *Storage Class* of *StorageBuffer* or *Uniform*.
-  * [[VUID-{refpage}-None-06279]]
-    <<features-shaderSharedInt64Atomics,shaderSharedInt64Atomics>> must: be
-    enabled for 64-bit integer atomic operations to be supported on a
-    _Pointer_ with a *Storage Class* of *Workgroup*.
-endif::VK_KHR_shader_atomic_int64[]
-ifdef::VK_EXT_shader_atomic_float[]
-ifndef::VK_EXT_shader_atomic_float2[]
-  * [[VUID-{refpage}-None-06280]]
-    <<features-shaderBufferFloat32Atomics,shaderBufferFloat32Atomics>>, or
-    <<features-shaderBufferFloat32AtomicAdd,shaderBufferFloat32AtomicAdd>>,
-    or <<features-shaderBufferFloat64Atomics,shaderBufferFloat64Atomics>>,
-    or
-    <<features-shaderBufferFloat64AtomicAdd,shaderBufferFloat64AtomicAdd>>
-    must: be enabled for floating-point atomic operations to be supported on
-    a _Pointer_ with a *Storage Class* of *StorageBuffer*.
-  * [[VUID-{refpage}-None-06281]]
-    <<features-shaderSharedFloat32Atomics,shaderSharedFloat32Atomics>>, or
-    <<features-shaderSharedFloat32AtomicAdd,shaderSharedFloat32AtomicAdd>>,
-    or <<features-shaderSharedFloat64Atomics,shaderSharedFloat64Atomics>>,
-    or
-    <<features-shaderSharedFloat64AtomicAdd,shaderSharedFloat64AtomicAdd>>
-    must: be enabled for floating-point atomic operations to be supported on
-    a _Pointer_ with a *Storage Class* of *Workgroup*.
-  * [[VUID-{refpage}-None-06282]]
-    <<features-shaderImageFloat32Atomics,shaderImageFloat32Atomics>> or
-    <<features-shaderImageFloat32AtomicAdd,shaderImageFloat32AtomicAdd>>
-    must: be enabled for 32-bit floating-point atomic operations to be
-    supported on a _Pointer_ with a *Storage Class* of *Image*.
-  * [[VUID-{refpage}-None-06283]]
-    <<features-sparseImageFloat32Atomics,sparseImageFloat32Atomics>> or
-    <<features-sparseImageFloat32AtomicAdd,sparseImageFloat32AtomicAdd>>
-    must: be enabled for 32-bit floating-point atomics to be supported on
-    sparse images.
-endif::VK_EXT_shader_atomic_float2[]
-endif::VK_EXT_shader_atomic_float[]
-ifdef::VK_EXT_shader_atomic_float2[]
-  * [[VUID-{refpage}-None-06284]]
-    <<features-shaderBufferFloat32Atomics,shaderBufferFloat32Atomics>>, or
-    <<features-shaderBufferFloat32AtomicAdd,shaderBufferFloat32AtomicAdd>>,
-    or <<features-shaderBufferFloat64Atomics,shaderBufferFloat64Atomics>>,
-    or
-    <<features-shaderBufferFloat64AtomicAdd,shaderBufferFloat64AtomicAdd>>,
-    or
-    <<features-shaderBufferFloat16AtomicMinMax,shaderBufferFloat16Atomics>>,
-    or
-    <<features-shaderBufferFloat16AtomicMinMax,shaderBufferFloat16AtomicAdd>>,
-    or
-    <<features-shaderBufferFloat16AtomicMinMax,shaderBufferFloat16AtomicMinMax>>,
-    or
-    <<features-shaderBufferFloat32AtomicMinMax,shaderBufferFloat32AtomicMinMax>>,
-    or
-    <<features-shaderBufferFloat64AtomicMinMax,shaderBufferFloat64AtomicMinMax>>
-    must: be enabled for floating-point atomic operations to be supported on
-    a _Pointer_ with a *Storage Class* of *StorageBuffer*.
-  * [[VUID-{refpage}-None-06285]]
-    <<features-shaderSharedFloat32Atomics,shaderSharedFloat32Atomics>>, or
-    <<features-shaderSharedFloat32AtomicAdd,shaderSharedFloat32AtomicAdd>>,
-    or <<features-shaderSharedFloat64Atomics,shaderSharedFloat64Atomics>>,
-    or
-    <<features-shaderSharedFloat64AtomicAdd,shaderSharedFloat64AtomicAdd>>,
-    or
-    <<features-shaderBufferFloat16AtomicMinMax,shaderSharedFloat16Atomics>>,
-    or
-    <<features-shaderBufferFloat16AtomicMinMax,shaderSharedFloat16AtomicAdd>>,
-    or
-    <<features-shaderBufferFloat16AtomicMinMax,shaderSharedFloat16AtomicMinMax>>,
-    or
-    <<features-shaderSharedFloat32AtomicMinMax,shaderSharedFloat32AtomicMinMax>>,
-    or
-    <<features-shaderSharedFloat64AtomicMinMax,shaderSharedFloat64AtomicMinMax>>
-    must: be enabled for floating-point atomic operations to be supported on
-    a _Pointer_ with a *Storage Class* of *Workgroup*.
-  * [[VUID-{refpage}-None-06286]]
-    <<features-shaderImageFloat32Atomics,shaderImageFloat32Atomics>>, or
-    <<features-shaderImageFloat32AtomicAdd,shaderImageFloat32AtomicAdd>>, or
-    <<features-shaderImageFloat32AtomicMinMax,shaderImageFloat32AtomicMinMax>>
-    must: be enabled for 32-bit floating-point atomic operations to be
-    supported on a _Pointer_ with a *Storage Class* of *Image*.
-  * [[VUID-{refpage}-None-06287]]
-    <<features-sparseImageFloat32Atomics,sparseImageFloat32Atomics>>, or
-    <<features-sparseImageFloat32AtomicAdd,sparseImageFloat32AtomicAdd>>, or
-    <<features-sparseImageFloat32AtomicMinMax,sparseImageFloat32AtomicMinMax>>
-    must: be enabled for 32-bit floating-point atomics to be supported on
-    sparse images.
-endif::VK_EXT_shader_atomic_float2[]
-ifdef::VK_EXT_shader_image_atomic_int64[]
-  * [[VUID-{refpage}-None-06288]]
-    <<features-shaderImageInt64Atomics,shaderImageInt64Atomics>> must: be
-    enabled for 64-bit integer atomic operations to be supported on a
-    _Pointer_ with a *Storage Class* of *Image*.
-endif::VK_EXT_shader_image_atomic_int64[]
-ifdef::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-  * [[VUID-{refpage}-denormBehaviorIndependence-06289]]
-    If
-    <<features-denormBehaviorIndependence,pname:denormBehaviorIndependence>>
-    is ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY, then the
-    entry point must: use the same denormals execution mode for both 16-bit
-    and 64-bit floating-point types.
-  * [[VUID-{refpage}-denormBehaviorIndependence-06290]]
-    If
-    <<features-denormBehaviorIndependence,pname:denormBehaviorIndependence>>
-    is ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE, then the entry
-    point must: use the same denormals execution mode for all floating-point
-    types.
-  * [[VUID-{refpage}-roundingModeIndependence-06291]]
-    If <<features-roundingModeIndependence,pname:roundingModeIndependence>>
-    is ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY, then the
-    entry point must: use the same rounding execution mode for both 16-bit
-    and 64-bit floating-point types.
-  * [[VUID-{refpage}-roundingModeIndependence-06292]]
-    If <<features-roundingModeIndependence,pname:roundingModeIndependence>>
-    is ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE, then the entry
-    point must: use the same rounding execution mode for all floating-point
-    types.
-  * [[VUID-{refpage}-shaderSignedZeroInfNanPreserveFloat16-06293]]
-    If
-    <<limits-shaderSignedZeroInfNanPreserveFloat16,pname:shaderSignedZeroInfNanPreserveFloat16>>
-    is ename:VK_FALSE, then code:SignedZeroInfNanPreserve for 16-bit
-    floating-point type must: not be used.
-  * [[VUID-{refpage}-shaderSignedZeroInfNanPreserveFloat32-06294]]
-    If
-    <<limits-shaderSignedZeroInfNanPreserveFloat32,pname:shaderSignedZeroInfNanPreserveFloat32>>
-    is ename:VK_FALSE, then code:SignedZeroInfNanPreserve for 32-bit
-    floating-point type must: not be used.
-  * [[VUID-{refpage}-shaderSignedZeroInfNanPreserveFloat64-06295]]
-    If
-    <<limits-shaderSignedZeroInfNanPreserveFloat64,pname:shaderSignedZeroInfNanPreserveFloat64>>
-    is ename:VK_FALSE, then code:SignedZeroInfNanPreserve for 64-bit
-    floating-point type must: not be used.
-  * [[VUID-{refpage}-shaderDenormPreserveFloat16-06296]]
-    If
-    <<limits-shaderDenormPreserveFloat16,pname:shaderDenormPreserveFloat16>>
-    is ename:VK_FALSE, then code:DenormPreserve for 16-bit floating-point
-    type must: not be used.
-  * [[VUID-{refpage}-shaderDenormPreserveFloat32-06297]]
-    If
-    <<limits-shaderDenormPreserveFloat32,pname:shaderDenormPreserveFloat32>>
-    is ename:VK_FALSE, then code:DenormPreserve for 32-bit floating-point
-    type must: not be used.
-  * [[VUID-{refpage}-shaderDenormPreserveFloat64-06298]]
-    If
-    <<limits-shaderDenormPreserveFloat64,pname:shaderDenormPreserveFloat64>>
-    is ename:VK_FALSE, then code:DenormPreserve for 64-bit floating-point
-    type must: not be used.
-  * [[VUID-{refpage}-shaderDenormFlushToZeroFloat16-06299]]
-    If
-    <<limits-shaderDenormFlushToZeroFloat16,pname:shaderDenormFlushToZeroFloat16>>
-    is ename:VK_FALSE, then code:DenormFlushToZero for 16-bit floating-point
-    type must: not be used.
-  * [[VUID-{refpage}-shaderDenormFlushToZeroFloat32-06300]]
-    If
-    <<limits-shaderDenormFlushToZeroFloat32,pname:shaderDenormFlushToZeroFloat32>>
-    is ename:VK_FALSE, then code:DenormFlushToZero for 32-bit floating-point
-    type must: not be used.
-  * [[VUID-{refpage}-shaderDenormFlushToZeroFloat64-06301]]
-    If
-    <<limits-shaderDenormFlushToZeroFloat64,pname:shaderDenormFlushToZeroFloat64>>
-    is ename:VK_FALSE, then code:DenormFlushToZero for 64-bit floating-point
-    type must: not be used.
-  * [[VUID-{refpage}-shaderRoundingModeRTEFloat16-06302]]
-    If
-    <<limits-shaderRoundingModeRTEFloat16,pname:shaderRoundingModeRTEFloat16>>
-    is ename:VK_FALSE, then code:RoundingModeRTE for 16-bit floating-point
-    type must: not be used.
-  * [[VUID-{refpage}-shaderRoundingModeRTEFloat32-06303]]
-    If
-    <<limits-shaderRoundingModeRTEFloat32,pname:shaderRoundingModeRTEFloat32>>
-    is ename:VK_FALSE, then code:RoundingModeRTE for 32-bit floating-point
-    type must: not be used.
-  * [[VUID-{refpage}-shaderRoundingModeRTEFloat64-06304]]
-    If
-    <<limits-shaderRoundingModeRTEFloat64,pname:shaderRoundingModeRTEFloat64>>
-    is ename:VK_FALSE, then code:RoundingModeRTE for 64-bit floating-point
-    type must: not be used.
-  * [[VUID-{refpage}-shaderRoundingModeRTZFloat16-06305]]
-    If
-    <<limits-shaderRoundingModeRTZFloat16,pname:shaderRoundingModeRTZFloat16>>
-    is ename:VK_FALSE, then code:RoundingModeRTZ for 16-bit floating-point
-    type must: not be used.
-  * [[VUID-{refpage}-shaderRoundingModeRTZFloat32-06306]]
-    If
-    <<limits-shaderRoundingModeRTZFloat32,pname:shaderRoundingModeRTZFloat32>>
-    is ename:VK_FALSE, then code:RoundingModeRTZ for 32-bit floating-point
-    type must: not be used.
-  * [[VUID-{refpage}-shaderRoundingModeRTZFloat64-06307]]
-    If
-    <<limits-shaderRoundingModeRTZFloat64,pname:shaderRoundingModeRTZFloat64>>
-    is ename:VK_FALSE, then code:RoundingModeRTZ for 64-bit floating-point
-    type must: not be used.
-endif::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-{refpage}-Offset-06308]]
-    The code:Offset plus size of the type of each variable, in the output
-    interface of the entry point being compiled, decorated with
-    code:XfbBuffer must: not be greater than
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackBufferDataSize
-  * [[VUID-{refpage}-XfbBuffer-06309]]
-    For any given code:XfbBuffer value, define the buffer data size to be
-    smallest number of bytes such that, for all outputs decorated with the
-    same code:XfbBuffer value, the size of the output interface variable
-    plus the code:Offset is less than or equal to the buffer data size.
-    For a given code:Stream, the sum of all the buffer data sizes for all
-    buffers writing to that stream the must: not exceed
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackStreamDataSize
-  * [[VUID-{refpage}-OpEmitStreamVertex-06310]]
-    The Stream value to code:OpEmitStreamVertex and
-    code:OpEndStreamPrimitive must: be less than
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackStreams
-  * [[VUID-{refpage}-transformFeedbackStreamsLinesTriangles-06311]]
-    If the geometry shader emits to more than one vertex stream and
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:transformFeedbackStreamsLinesTriangles
-    is ename:VK_FALSE, then execution mode must: be code:OutputPoints
-  * [[VUID-{refpage}-Stream-06312]]
-    The stream number value to code:Stream must: be less than
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackStreams
-  * [[VUID-{refpage}-XfbStride-06313]]
-    The XFB Stride value to code:XfbStride must: be less than or equal to
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackBufferDataStride
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-  * [[VUID-{refpage}-PhysicalStorageBuffer64-06314]]
-    If the code:PhysicalStorageBuffer64 addressing model is enabled any load
-    or store through a physical pointer type must: be aligned to a multiple
-    of the size of the largest scalar type in the pointed-to type.
-  * [[VUID-{refpage}-PhysicalStorageBuffer64-06315]]
-    If the code:PhysicalStorageBuffer64 addressing model is enabled the
-    pointer value of a memory access instruction must: be at least as
-    aligned as specified by the code:Aligned memory access operand.
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-ifdef::VK_NV_cooperative_matrix[]
-  * [[VUID-{refpage}-OpTypeCooperativeMatrixNV-06316]]
-    For code:OpTypeCooperativeMatrixNV, the component type, scope, number of
-    rows, and number of columns must: match one of the matrices in any of
-    the supported slink:VkCooperativeMatrixPropertiesNV.
-  * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06317]]
-    For code:OpCooperativeMatrixMulAddNV, the type of code:A must: have
-    slink:VkCooperativeMatrixPropertiesNV::pname:MSize rows and
-    slink:VkCooperativeMatrixPropertiesNV::pname:KSize columns and have a
-    component type that matches
-    slink:VkCooperativeMatrixPropertiesNV::pname:AType.
-  * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06318]]
-    For code:OpCooperativeMatrixMulAddNV, the type of code:B must: have
-    slink:VkCooperativeMatrixPropertiesNV::pname:KSize rows and
-    slink:VkCooperativeMatrixPropertiesNV::pname:NSize columns and have a
-    component type that matches
-    slink:VkCooperativeMatrixPropertiesNV::pname:BType.
-  * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06319]]
-    For code:OpCooperativeMatrixMulAddNV, the type of code:C must: have
-    slink:VkCooperativeMatrixPropertiesNV::pname:MSize rows and
-    slink:VkCooperativeMatrixPropertiesNV::pname:NSize columns and have a
-    component type that matches
-    slink:VkCooperativeMatrixPropertiesNV::pname:CType.
-  * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06320]]
-    For code:OpCooperativeMatrixMulAddNV, the type of code:Result must: have
-    slink:VkCooperativeMatrixPropertiesNV::pname:MSize rows and
-    slink:VkCooperativeMatrixPropertiesNV::pname:NSize columns and have a
-    component type that matches
-    slink:VkCooperativeMatrixPropertiesNV::pname:DType.
-  * [[VUID-{refpage}-OpCooperativeMatrixMulAddNV-06321]]
-    For code:OpCooperativeMatrixMulAddNV, the type of code:A, code:B,
-    code:C, and code:Result must: all have a scope of pname:scope.
-  * [[VUID-{refpage}-OpTypeCooperativeMatrixNV-06322]]
-    code:OpTypeCooperativeMatrixNV and code:OpCooperativeMatrix*
-    instructions must: not be used in shader stages not included in
-    slink:VkPhysicalDeviceCooperativeMatrixPropertiesNV::pname:cooperativeMatrixSupportedStages.
-endif::VK_NV_cooperative_matrix[]
-  * [[VUID-{refpage}-DescriptorSet-06323]]
-    code:DescriptorSet and code:Binding decorations must: obey the
-    constraints on storage class, type, and descriptor type described in
-    <<interfaces-resources-setandbinding,DescriptorSet and Binding
-    Assignment>>
-ifdef::VK_NV_cooperative_matrix[]
-  * [[VUID-{refpage}-OpCooperativeMatrixLoadNV-06324]]
-    For code:OpCooperativeMatrixLoadNV and code:OpCooperativeMatrixStoreNV
-    instructions, the code:Pointer and code:Stride operands must: be aligned
-    to at least the lesser of 16 bytes or the natural alignment of a row or
-    column (depending on code:ColumnMajor) of the matrix (where the natural
-    alignment is the number of columns/rows multiplied by the component
-    size).
-endif::VK_NV_cooperative_matrix[]
-ifdef::VK_KHR_portability_subset[]
-  * [[VUID-{refpage}-shaderSampleRateInterpolationFunctions-06325]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:shaderSampleRateInterpolationFunctions
-    is ename:VK_FALSE, then `GLSL.std.450` fragment interpolation functions
-    are not supported by the implementation and code:OpCapability must: not
-    be set to code:InterpolationFunction.
-  * [[VUID-{refpage}-tessellationShader-06326]]
-    If <<features-tessellationShader,pname:tessellationShader>> is enabled,
-    and the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:tessellationIsolines
-    is ename:VK_FALSE, then code:OpExecutionMode must: not be set to
-    code:IsoLines.
-  * [[VUID-{refpage}-tessellationShader-06327]]
-    If <<features-tessellationShader,pname:tessellationShader>> is enabled,
-    and the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:tessellationPointMode
-    is ename:VK_FALSE, then code:OpExecutionMode must: not be set to
-    code:PointMode.
-endif::VK_KHR_portability_subset[]
-ifdef::VK_KHR_8bit_storage[]
-  * [[VUID-{refpage}-storageBuffer8BitAccess-06328]]
-    If <<features-storageBuffer8BitAccess,pname:storageBuffer8BitAccess>> is
-    ename:VK_FALSE, then objects containing an 8-bit integer element must:
-    not have storage class of *StorageBuffer*, *ShaderRecordBufferKHR*, or
-    *PhysicalStorageBuffer*.
-  * [[VUID-{refpage}-uniformAndStorageBuffer8BitAccess-06329]]
-    If
-    <<features-uniformAndStorageBuffer8BitAccess,pname:uniformAndStorageBuffer8BitAccess>>
-    is ename:VK_FALSE, then objects in the *Uniform* storage class with the
-    *Block* decoration must: not have an 8-bit integer member.
-  * [[VUID-{refpage}-storagePushConstant8-06330]]
-    If <<features-storagePushConstant8,pname:storagePushConstant8>> is
-    ename:VK_FALSE, then objects containing an 8-bit integer element must:
-    not have storage class of *PushConstant*.
-endif::VK_KHR_8bit_storage[]
-ifdef::VK_KHR_16bit_storage[]
-  * [[VUID-{refpage}-storageBuffer16BitAccess-06331]]
-    If <<features-storageBuffer16BitAccess,pname:storageBuffer16BitAccess>>
-    is ename:VK_FALSE, then objects containing 16-bit integer or 16-bit
-    floating-point elements must: not have storage class of *StorageBuffer*,
-    *ShaderRecordBufferKHR*, or *PhysicalStorageBuffer*.
-  * [[VUID-{refpage}-uniformAndStorageBuffer16BitAccess-06332]]
-    If
-    <<features-uniformAndStorageBuffer16BitAccess,pname:uniformAndStorageBuffer16BitAccess>>
-    is ename:VK_FALSE, then objects in the *Uniform* storage class with the
-    *Block* decoration must: not have 16-bit integer or 16-bit
-    floating-point members.
-  * [[VUID-{refpage}-storagePushConstant16-06333]]
-    If <<features-storagePushConstant16,pname:storagePushConstant16>> is
-    ename:VK_FALSE, then objects containing 16-bit integer or 16-bit
-    floating-point elements must: not have storage class of *PushConstant*.
-  * [[VUID-{refpage}-storageInputOutput16-06334]]
-    If <<features-storageInputOutput16,pname:storageInputOutput16>> is
-    ename:VK_FALSE, then objects containing 16-bit integer or 16-bit
-    floating-point elements must: not have storage class of *Input* or
-    *Output*.
-endif::VK_KHR_16bit_storage[]
-ifdef::VK_EXT_shader_atomic_float[]
-ifndef::VK_EXT_shader_atomic_float2[]
-  * [[VUID-{refpage}-None-06335]]
-    <<features-shaderBufferFloat32Atomics,shaderBufferFloat32Atomics>>, or
-    <<features-shaderBufferFloat32AtomicAdd,shaderBufferFloat32AtomicAdd>>,
-    or <<features-shaderSharedFloat32Atomics,shaderSharedFloat32Atomics>>,
-    or
-    <<features-shaderSharedFloat32AtomicAdd,shaderSharedFloat32AtomicAdd>>,
-    or <<features-shaderImageFloat32Atomics,shaderImageFloat32Atomics>>, or
-    <<features-shaderImageFloat32AtomicAdd,shaderImageFloat32AtomicAdd>>
-    must: be enabled for 32-bit floating point atomic operations
-  * [[VUID-{refpage}-None-06336]]
-    <<features-shaderBufferFloat64Atomics,shaderBufferFloat64Atomics>>, or
-    <<features-shaderBufferFloat64AtomicAdd,shaderBufferFloat64AtomicAdd>>,
-    or <<features-shaderSharedFloat64Atomics,shaderSharedFloat64Atomics>>,
-    or
-    <<features-shaderSharedFloat64AtomicAdd,shaderSharedFloat64AtomicAdd>>
-    must: be enabled for 64-bit floating point atomic operations
-endif::VK_EXT_shader_atomic_float2[]
-endif::VK_EXT_shader_atomic_float[]
-ifdef::VK_EXT_shader_atomic_float2[]
-  * [[VUID-{refpage}-None-06337]]
-    <<features-shaderBufferFloat16Atomics,shaderBufferFloat16Atomics>>, or
-    <<features-shaderBufferFloat16AtomicAdd,shaderBufferFloat16AtomicAdd>>,
-    or
-    <<features-shaderBufferFloat16AtomicMinMax,shaderBufferFloat16AtomicMinMax>>,
-    or <<features-shaderSharedFloat16Atomics,shaderSharedFloat16Atomics>>,
-    or
-    <<features-shaderSharedFloat16AtomicAdd,shaderSharedFloat16AtomicAdd>>,
-    or
-    <<features-shaderSharedFloat16AtomicMinMax,shaderSharedFloat16AtomicMinMax>>
-    must: be enabled for 16-bit floating point atomic operations
-  * [[VUID-{refpage}-None-06338]]
-    <<features-shaderBufferFloat32Atomics,shaderBufferFloat32Atomics>>, or
-    <<features-shaderBufferFloat32AtomicAdd,shaderBufferFloat32AtomicAdd>>,
-    or <<features-shaderSharedFloat32Atomics,shaderSharedFloat32Atomics>>,
-    or
-    <<features-shaderSharedFloat32AtomicAdd,shaderSharedFloat32AtomicAdd>>,
-    or <<features-shaderImageFloat32Atomics,shaderImageFloat32Atomics>>, or
-    <<features-shaderImageFloat32AtomicAdd,shaderImageFloat32AtomicAdd>> or
-    <<features-shaderBufferFloat32AtomicMinMax,shaderBufferFloat32AtomicMinMax>>,
-    or
-    <<features-shaderSharedFloat32AtomicMinMax,shaderSharedFloat32AtomicMinMax>>,
-    or
-    <<features-shaderImageFloat32AtomicMinMax,shaderImageFloat32AtomicMinMax>>
-    must: be enabled for 32-bit floating point atomic operations
-  * [[VUID-{refpage}-None-06339]]
-    <<features-shaderBufferFloat64Atomics,shaderBufferFloat64Atomics>>, or
-    <<features-shaderBufferFloat64AtomicAdd,shaderBufferFloat64AtomicAdd>>,
-    or <<features-shaderSharedFloat64Atomics,shaderSharedFloat64Atomics>>,
-    or
-    <<features-shaderSharedFloat64AtomicAdd,shaderSharedFloat64AtomicAdd>>,
-    or
-    <<features-shaderBufferFloat64AtomicMinMax,shaderBufferFloat64AtomicMinMax>>,
-    or
-    <<features-shaderSharedFloat64AtomicMinMax,shaderSharedFloat64AtomicMinMax>>,
-    must: be enabled for 64-bit floating point atomic operations
-endif::VK_EXT_shader_atomic_float2[]
-  * [[VUID-{refpage}-NonWritable-06340]]
-    If <<features-fragmentStoresAndAtomics, fragmentStoresAndAtomics>> is
-    not enabled, then all storage image, storage texel buffer, and storage
-    buffer variables in the fragment stage must: be decorated with the
-    code:NonWritable decoration.
-  * [[VUID-{refpage}-NonWritable-06341]]
-    If <<features-vertexPipelineStoresAndAtomics,
-    vertexPipelineStoresAndAtomics>> is not enabled, then all storage image,
-    storage texel buffer, and storage buffer variables in the vertex,
-    tessellation, and geometry stages must: be decorated with the
-    code:NonWritable decoration.
-  * [[VUID-{refpage}-None-06342]]
-    If <<limits-subgroupQuadOperationsInAllStages,
-    subgroupQuadOperationsInAllStages>> is ename:VK_FALSE, then
-    <<features-subgroup-quad,quad subgroup operations>> must: not be used
-    except for in fragment and compute stages.
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-None-06343]]
-    <<shaders-group-operations,Group operations>> with
-    <<shaders-scope-subgroup, subgroup scope>> must: not be used if the
-    shader stage is not in <<limits-subgroupSupportedStages,
-    subgroupSupportedStages>>.
-endif::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-Offset-06344]]
-    The first element of the code:Offset operand of code:InterpolateAtOffset
-    must: be greater than or equal to:
-    {empty}:: [eq]#frag~width~ {times} <<limits-minInterpolationOffset,
-              pname:minInterpolationOffset>>#
-+
-where [eq]#frag~width~# is the width of the current fragment in pixels.
-  * [[VUID-{refpage}-Offset-06345]]
-    The first element of the code:Offset operand of code:InterpolateAtOffset
-    must: be less than or equal to:
-    {empty}:: [eq]#frag~width~ {times} (<<limits-maxInterpolationOffset,
-              pname:maxInterpolationOffset>> {plus} ULP ) - ULP#
-+
-where [eq]#frag~width~# is the width of the current fragment in pixels and
-[eq]#ULP = 1 /
-2^<<limits-subPixelInterpolationOffsetBits,pname:subPixelInterpolationOffsetBits>>^#.
-  * [[VUID-{refpage}-Offset-06346]]
-    The second element of the code:Offset operand of
-    code:InterpolateAtOffset must: be greater than or equal to:
-    {empty}:: [eq]#frag~height~ {times} <<limits-minInterpolationOffset,
-              pname:minInterpolationOffset>>#
-+
-where [eq]#frag~height~# is the height of the current fragment in pixels.
-  * [[VUID-{refpage}-Offset-06347]]
-    The second element of the code:Offset operand of
-    code:InterpolateAtOffset must: be less than or equal to:
-    {empty}:: [eq]#frag~height~ {times} (<<limits-maxInterpolationOffset,
-              pname:maxInterpolationOffset>> {plus} ULP ) - ULP#
-+
-where [eq]#frag~height~# is the height of the current fragment in pixels and
-[eq]#ULP = 1 /
-2^<<limits-subPixelInterpolationOffsetBits,pname:subPixelInterpolationOffsetBits>>^#.
-
-ifdef::VK_KHR_ray_query[]
-  * [[VUID-{refpage}-OpRayQueryInitializeKHR-06348]]
-    For code:OpRayQueryInitializeKHR instructions, all components of the
-    code:RayOrigin and code:RayDirection operands must: be finite
-    floating-point values.
-  * [[VUID-{refpage}-OpRayQueryInitializeKHR-06349]]
-    For code:OpRayQueryInitializeKHR instructions, the code:RayTmin and
-    code:RayTmax operands must: be non-negative floating-point values.
-  * [[VUID-{refpage}-OpRayQueryInitializeKHR-06350]]
-    For code:OpRayQueryInitializeKHR instructions, the code:RayTmin operand
-    must: be less than or equal to the code:RayTmax operand.
-  * [[VUID-{refpage}-OpRayQueryInitializeKHR-06351]]
-    For code:OpRayQueryInitializeKHR instructions, code:RayOrigin,
-    code:RayDirection, code:RayTmin, and code:RayTmax operands must: not
-    contain NaNs.
-  * [[VUID-{refpage}-OpRayQueryInitializeKHR-06352]]
-    For code:OpRayQueryInitializeKHR instructions, code:Acceleration
-    code:Structure must: be an acceleration structure built as a
-    <<acceleration-structure-top-level, top-level acceleration structure>>.
-  * [[VUID-{refpage}-OpRayQueryGenerateIntersectionKHR-06353]]
-    For code:OpRayQueryGenerateIntersectionKHR instructions, code:Hit code:T
-    must: satisfy the condition [eq]##code:RayTmin {leq} code:Hit code:T
-    {leq} code:RayTmax##, where code:RayTmin is equal to the value returned
-    by code:OpRayQueryGetRayTMinKHR with the same ray query object, and
-    code:RayTmax is equal to the value of code:OpRayQueryGetIntersectionTKHR
-    for the current committed intersection with the same ray query object.
-ifdef::VK_NV_ray_tracing_motion_blur[]
-  * [[VUID-{refpage}-OpRayQueryGenerateIntersectionKHR-06354]]
-    For code:OpRayQueryGenerateIntersectionKHR instructions,
-    code:Acceleration code:Structure must: not be built with
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV in pname:flags.
-endif::VK_NV_ray_tracing_motion_blur[]
-endif::VK_KHR_ray_query[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  * [[VUID-{refpage}-OpTraceRayKHR-06355]]
-    For code:OpTraceRayKHR instructions, all components of the
-    code:RayOrigin and code:RayDirection operands must: be finite
-    floating-point values.
-  * [[VUID-{refpage}-OpTraceRayKHR-06356]]
-    For code:OpTraceRayKHR instructions, the code:RayTmin and code:RayTmax
-    operands must: be non-negative floating-point values.
-  * [[VUID-{refpage}-OpTraceRayKHR-06357]]
-    For code:OpTraceRayKHR instructions, the code:RayTmin operand must: be
-    less than or equal to the code:RayTmax operand.
-  * [[VUID-{refpage}-OpTraceRayKHR-06358]]
-    For code:OpTraceRayKHR instructions, code:RayOrigin, code:RayDirection,
-    code:RayTmin, and code:RayTmax operands must: not contain NaNs.
-  * [[VUID-{refpage}-OpTraceRayKHR-06359]]
-    For code:OpTraceRayKHR instructions, code:Acceleration code:Structure
-    must: be an acceleration structure built as a
-    <<acceleration-structure-top-level, top-level acceleration structure>>.
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_NV_ray_tracing_motion_blur[]
-  * [[VUID-{refpage}-OpTraceRayKHR-06360]]
-    For code:OpTraceRayKHR instructions, if code:Acceleration code:Structure
-    was built with ename:VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV in
-    pname:flags, the pipeline must: have been created with
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV set
-  * [[VUID-{refpage}-OpTraceRayMotionNV-06361]]
-    For code:OpTraceRayMotionNV instructions, all components of the
-    code:RayOrigin and code:RayDirection operands must: be finite
-    floating-point values.
-  * [[VUID-{refpage}-OpTraceRayMotionNV-06362]]
-    For code:OpTraceRayMotionNV instructions, the code:RayTmin and
-    code:RayTmax operands must: be non-negative floating-point values.
-  * [[VUID-{refpage}-OpTraceRayMotionNV-06363]]
-    For code:OpTraceRayMotionNV instructions, the code:RayTmin operand must:
-    be less than or equal to the code:RayTmax operand.
-  * [[VUID-{refpage}-OpTraceRayMotionNV-06364]]
-    For code:OpTraceRayMotionNV instructions, code:RayOrigin,
-    code:RayDirection, code:RayTmin, and code:RayTmax operands must: not
-    contain NaNs.
-  * [[VUID-{refpage}-OpTraceRayMotionNV-06365]]
-    For code:OpTraceRayMotionNV instructions, code:Acceleration
-    code:Structure must: be an acceleration structure built as a
-    <<acceleration-structure-top-level, top-level acceleration structure>>
-    with ename:VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV in pname:flags
-  * [[VUID-{refpage}-OpTraceRayMotionNV-06366]]
-    For code:OpTraceRayMotionNV instructions the code:time operand must: be
-    between 0.0 and 1.0
-  * [[VUID-{refpage}-OpTraceRayMotionNV-06367]]
-    For code:OpTraceRayMotionNV instructions the pipeline must: have been
-    created with ename:VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV
-    set
-endif::VK_NV_ray_tracing_motion_blur[]
-  * [[VUID-{refpage}-x-06429]]
-    The pname:x size in code:LocalSize or code:LocalSizeId must: be less
-    than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupSize[0]
-  * [[VUID-{refpage}-y-06430]]
-    The pname:y size in code:LocalSize or code:LocalSizeId must: be less
-    than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupSize[1]
-  * [[VUID-{refpage}-z-06431]]
-    The pname:z size in code:LocalSize or code:LocalSizeId must: be less
-    than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupSize[2]
-  * [[VUID-{refpage}-x-06432]]
-    The product of pname:x size, pname:y size, and pname:z size in
-    code:LocalSize or code:LocalSizeId must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupInvocations
-ifndef::VK_KHR_maintenance4[]
-  * [[VUID-{refpage}-LocalSizeId-06433]]
-    The execution mode code:LocalSizeId must: not be used
-endif::VK_KHR_maintenance4[]
-ifdef::VK_KHR_maintenance4[]
-  * [[VUID-{refpage}-LocalSizeId-06434]]
-    if execution mode code:LocalSizeId is used, <<features-maintenance4,
-    pname:maintenance4>> must: be enabled
-endif::VK_KHR_maintenance4[]
-ifdef::VK_KHR_zero_initialize_workgroup_memory[]
-  * [[VUID-{refpage}-shaderZeroInitializeWorkgroupMemory-06372]]
-    If
-    <<features-shaderZeroInitializeWorkgroupMemory,pname:shaderZeroInitializeWorkgroupMemory>>
-    is not enabled, any code:OpVariable with *Workgroup* as its *Storage
-    Class* must: not have an code:Initializer operand
-endif::VK_KHR_zero_initialize_workgroup_memory[]
-ifndef::VK_KHR_zero_initialize_workgroup_memory[]
-  * [[VUID-{refpage}-OpVariable-06373]]
-    Any code:OpVariable with *Workgroup* as its *Storage Class* must: not
-    have an code:Initializer operand
-endif::VK_KHR_zero_initialize_workgroup_memory[]
-ifdef::VK_KHR_workgroup_memory_explicit_layout[]
-  * [[VUID-{refpage}-workgroupMemoryExplicitLayout8BitAccess-06374]]
-    If
-    <<features-workgroupMemoryExplicitLayout8BitAccess,pname:workgroupMemoryExplicitLayout8BitAccess>>
-    is ename:VK_FALSE, objects in the code:Workgroup storage class with the
-    code:Block decoration must: not contain 8-bit integer members.
-  * [[VUID-{refpage}-workgroupMemoryExplicitLayout16BitAccess-06375]]
-    If
-    <<features-workgroupMemoryExplicitLayout16BitAccess,pname:workgroupMemoryExplicitLayout16BitAccess>>
-    is ename:VK_FALSE, objects in the code:Workgroup storage class with the
-    code:Block decoration must: not contain 16-bit integer or 16-bit
-    floating-point members.
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-  * [[VUID-{refpage}-OpImage-06376]]
-    If an code:OpImage*Gather operation has an image operand of code:Offset,
-    code:ConstOffset, or code:ConstOffsets the offset value must: be greater
-    than or equal to <<limits-minTexelGatherOffset,minTexelGatherOffset>>
-  * [[VUID-{refpage}-OpImage-06377]]
-    If an code:OpImage*Gather operation has an image operand of code:Offset,
-    code:ConstOffset, or code:ConstOffsets the offset value must: be less
-    than or equal to <<limits-maxTexelGatherOffset,maxTexelGatherOffset>>
-  * [[VUID-{refpage}-OpImageSample-06435]]
-    If an code:OpImageSample* or code:OpImageFetch* operation has an image
-    operand of code:ConstOffset then the offset value must: be greater than
-    or equal to <<limits-minTexelOffset,minTexelOffset>>
-  * [[VUID-{refpage}-OpImageSample-06436]]
-    If an code:OpImageSample* or code:OpImageFetch* operation has an image
-    operand of code:ConstOffset then the offset value must: be less than or
-    equal to <<limits-maxTexelOffset,maxTexelOffset>>
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-  * [[VUID-{refpage}-SampleRateShading-06378]]
-    If the subpass description contains
-    ename:VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM, then the SPIR-V
-    fragment shader Capability code:SampleRateShading must: not be enabled.
-endif::VK_QCOM_render_pass_shader_resolve[]
-ifdef::VK_KHR_shader_subgroup_uniform_control_flow[]
-  * [[VUID-{refpage}-SubgroupUniformControlFlowKHR-06379]]
-    The execution mode code:SubgroupUniformControlFlowKHR must: not be
-    applied to an entry point unless
-    <<features-shaderSubgroupUniformControlFlow,
-    pname:shaderSubgroupUniformControlFlow>> is enabled and the
-    corresponding shader stage bit is set in subgroup
-    <<limits-subgroup-supportedStages, pname:supportedStages>> and the entry
-    point does not execute any <<ray-tracing-repack,_invocation repack
-    instructions_>>.
-endif::VK_KHR_shader_subgroup_uniform_control_flow[]
-****
---
-
-[[spirvenv-precision-operation]]
-== Precision and Operation of SPIR-V Instructions
-
-The following rules apply to half, single, and double-precision floating
-point instructions:
-
-  * Positive and negative infinities and positive and negative zeros are
-    generated as dictated by <<ieee-754,IEEE 754>>, but subject to the
-    precisions allowed in the following table.
-  * Dividing a non-zero by a zero results in the appropriately signed
-    <<ieee-754,IEEE 754>> infinity.
-  * Signaling [eq]##NaN##s are not required to be generated and exceptions
-    are never raised.
-    Signaling [eq]##NaN## may: be converted to quiet [eq]##NaN##s values by
-    any floating point instruction.
-  * By default, the implementation may: perform optimizations on half,
-    single, or double-precision floating-point instructions that ignore sign
-    of a zero, or assume that arguments and results are not NaNs or
-    infinities.
-ifdef::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-    If the entry point is declared with the code:SignedZeroInfNanPreserve
-    execution mode, then NaNs, infinities, and the sign of zero must: not be
-    ignored.
-  ** The following core SPIR-V instructions must: respect the
-     code:SignedZeroInfNanPreserve execution mode: code:OpPhi,
-     code:OpSelect, code:OpReturnValue, code:OpVectorExtractDynamic,
-     code:OpVectorInsertDynamic, code:OpVectorShuffle,
-     code:OpCompositeConstruct, code:OpCompositeExtract,
-     code:OpCompositeInsert, code:OpCopyObject, code:OpTranspose,
-     code:OpFConvert, code:OpFNegate, code:OpFAdd, code:OpFSub, code:OpFMul,
-     code:OpStore.
-     This execution mode must: also be respected by code:OpLoad except for
-     loads from the code:Input storage class in the fragment shader stage
-     with the floating-point result type.
-     Other SPIR-V instructions may: also respect the
-     code:SignedZeroInfNanPreserve execution mode.
-endif::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-  * The following instructions must: not flush denormalized values:
-    code:OpConstant, code:OpConstantComposite, code:OpSpecConstant,
-    code:OpSpecConstantComposite, code:OpLoad, code:OpStore, code:OpBitcast,
-    code:OpPhi, code:OpSelect, code:OpFunctionCall, code:OpReturnValue,
-    code:OpVectorExtractDynamic, code:OpVectorInsertDynamic,
-    code:OpVectorShuffle, code:OpCompositeConstruct,
-    code:OpCompositeExtract, code:OpCompositeInsert, code:OpCopyMemory,
-    code:OpCopyObject.
-ifndef::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-  * Any denormalized value input into a shader or potentially generated by
-    any instruction in a shader (except those listed above) may: be flushed
-    to 0.
-  * The rounding mode cannot: be set, and results will be
-    <<spirvenv-correctly-rounded, correctly rounded>>, as described below.
-  * [eq]##NaN##s may: not be generated.
-    Instructions that operate on a [eq]#NaN# may: not result in a [eq]#NaN#.
-endif::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-ifdef::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-  * Denormalized values are supported.
-  ** By default, any half, single, or double-precision denormalized value
-     input into a shader or potentially generated by any instruction (except
-     those listed above) or any extended instructions for GLSL in a shader
-     may: be flushed to zero.
-  ** If the entry point is declared with the code:DenormFlushToZero
-     execution mode then for the affected instuctions the denormalized
-     result must: be flushed to zero and the denormalized operands may: be
-     flushed to zero.
-     Denormalized values obtained via unpacking an integer into a vector of
-     values with smaller bit width and interpreting those values as
-     floating-point numbers must: be flushed to zero.
-  ** The following core SPIR-V instructions must: respect the
-     code:DenormFlushToZero execution mode: code:OpSpecConstantOp (with
-     opcode code:OpFConvert), code:OpFConvert, code:OpFNegate, code:OpFAdd,
-     code:OpFSub, code:OpFMul, code:OpFDiv, code:OpFRem, code:OpFMod,
-     code:OpVectorTimesScalar, code:OpMatrixTimesScalar,
-     code:OpVectorTimesMatrix, code:OpMatrixTimesVector,
-     code:OpMatrixTimesMatrix, code:OpOuterProduct, code:OpDot; and the
-     following extended instructions for GLSL: code:Round, code:RoundEven,
-     code:Trunc, code:FAbs, code:Floor, code:Ceil, code:Fract, code:Radians,
-     code:Degrees, code:Sin, code:Cos, code:Tan, code:Asin, code:Acos,
-     code:Atan, code:Sinh, code:Cosh, code:Tanh, code:Asinh, code:Acosh,
-     code:Atanh, code:Atan2, code:Pow, code:Exp, code:Log, code:Exp2,
-     code:Log2, code:Sqrt, code:InverseSqrt, code:Determinant,
-     code:MatrixInverse, code:Modf, code:ModfStruct, code:FMin, code:FMax,
-     code:FClamp, code:FMix, code:Step, code:SmoothStep, code:Fma,
-     code:UnpackHalf2x16, code:UnpackDouble2x32, code:Length, code:Distance,
-     code:Cross, code:Normalize, code:FaceForward, code:Reflect,
-     code:Refract, code:NMin, code:NMax, code:NClamp.
-     Other SPIR-V instructions (except those excluded above) may: also flush
-     denormalized values.
-  ** The following core SPIR-V instructions must: respect the
-     code:DenormPreserve execution mode: code:OpTranspose,
-     code:OpSpecConstantOp, code:OpFConvert, code:OpFNegate, code:OpFAdd,
-     code:OpFSub, code:OpFMul, code:OpVectorTimesScalar,
-     code:OpMatrixTimesScalar, code:OpVectorTimesMatrix,
-     code:OpMatrixTimesVector, code:OpMatrixTimesMatrix,
-     code:OpOuterProduct, code:OpDot, code:OpFOrdEqual, code:OpFUnordEqual,
-     code:OpFOrdNotEqual, code:OpFUnordNotEqual, code:OpFOrdLessThan,
-     code:OpFUnordLessThan, code:OpFOrdGreaterThan,
-     code:OpFUnordGreaterThan, code:OpFOrdLessThanEqual,
-     code:OpFUnordLessThanEqual, code:OpFOrdGreaterThanEqual,
-     code:OpFUnordGreaterThanEqual; and the following extended instructions
-     for GLSL: code:FAbs, code:FSign, code:Radians, code:Degrees, code:FMin,
-     code:FMax, code:FClamp, code:FMix, code:Fma, code:PackHalf2x16,
-     code:PackDouble2x32, code:UnpackHalf2x16, code:UnpackDouble2x32,
-     code:NMin, code:NMax, code:NClamp.
-     Other SPIR-V instructions may: also preserve denorm values.
-endif::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-
-The precision of double-precision instructions is at least that of single
-precision.
-
-The precision of operations is defined either in terms of rounding, as an
-error bound in ULP, or as inherited from a formula as follows.
-
-[[spirvenv-correctly-rounded]]
-.Correctly Rounded
-Operations described as "`correctly rounded`" will return the infinitely
-precise result, [eq]#x#, rounded so as to be representable in
-floating-point.
-ifdef::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-The rounding mode is not specified, unless the entry point is declared with
-the code:RoundingModeRTE or the code:RoundingModeRTZ execution mode.
-These execution modes affect only correctly rounded SPIR-V instructions.
-These execution modes do not affect code:OpQuantizeToF16.
-If the rounding mode is not specified then this rounding is implementation
-specific, subject to the following rules.
-endif::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-ifndef::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-The rounding mode used is not defined but must: obey the following rules.
-endif::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-If [eq]#x# is exactly representable then [eq]#x# will be returned.
-Otherwise, either the floating-point value closest to and no less than
-[eq]#x# or the value closest to and no greater than [eq]#x# will be
-returned.
-
-.ULP
-Where an error bound of [eq]#n# ULP (units in the last place) is given, for
-an operation with infinitely precise result #x# the value returned must: be
-in the range [eq]#[x - n {times} ulp(x), x {plus} n {times} ulp(x)]#.
-The function [eq]#ulp(x)# is defined as follows:
-
-  {empty}:: If there exist non-equal floating-point numbers #a# and #b# such
-    that [eq]#a {leq} x {leq} b# then [eq]#ulp(x)# is the minimum possible
-    distance between such numbers, latexmath:[ulp(x) = \mathrm{min}_{a,b} |
-    b - a |].
-    If such numbers do not exist then [eq]#ulp(x)# is defined to be the
-    difference between the two finite floating-point numbers nearest to
-    [eq]#x#.
-
-Where the range of allowed return values includes any value of magnitude
-larger than that of the largest representable finite floating-point number,
-operations may:, additionally, return either an infinity of the appropriate
-sign or the finite number with the largest magnitude of the appropriate
-sign.
-If the infinitely precise result of the operation is not mathematically
-defined then the value returned is undefined:.
-
-.Inherited From ...
-Where an operation's precision is described as being inherited from a
-formula, the result returned must: be at least as accurate as the result of
-computing an approximation to [eq]#x# using a formula equivalent to the
-given formula applied to the supplied inputs.
-Specifically, the formula given may be transformed using the mathematical
-associativity, commutativity and distributivity of the operators involved to
-yield an equivalent formula.
-The SPIR-V precision rules, when applied to each such formula and the given
-input values, define a range of permitted values.
-If [eq]#NaN# is one of the permitted values then the operation may return
-any result, otherwise let the largest permitted value in any of the ranges
-be [eq]#F~max~# and the smallest be [eq]#F~min~#.
-The operation must: return a value in the range [eq]#[x - E, x {plus} E]#
-where latexmath:[E = \mathrm{max} \left( | x - F_{\mathrm{min}} |, | x -
-F_{\mathrm{max}} | \right) ].
-ifdef::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-If the entry point is declared with the code:DenormFlushToZero execution
-mode, then any intermediate denormal value(s) while evaluating the formula
-may: be flushed to zero.
-Denormal final results must: be flushed to zero.
-If the entry point is declared with the code:DenormPreserve execution mode,
-then denormals must: be preserved throughout the formula.
-endif::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_shader_float16_int8[]
-For half- (16 bit) and single- (32 bit) precision instructions, precisions
-are required: to be at least as follows:
-
-.Precision of core SPIR-V Instructions
-[options="header", cols=",,"]
-|====
-| Instruction
- | Single precision, unless decorated with RelaxedPrecision | Half precision
-| code:OpFAdd
-2+| Correctly rounded.
-| code:OpFSub
-2+| Correctly rounded.
-| code:OpFMul, code:OpVectorTimesScalar, code:OpMatrixTimesScalar
-2+| Correctly rounded.
-| code:OpDot(x, y)
-2+a| Inherited from latexmath:[\sum_{i = 0}^{n - 1} x_{i} \times y_{i}].
-| code:OpFOrdEqual, code:OpFUnordEqual
-2+| Correct result.
-| code:OpFOrdLessThan, code:OpFUnordLessThan
-2+| Correct result.
-| code:OpFOrdGreaterThan, code:OpFUnordGreaterThan
-2+| Correct result.
-| code:OpFOrdLessThanEqual, code:OpFUnordLessThanEqual
-2+| Correct result.
-| code:OpFOrdGreaterThanEqual, code:OpFUnordGreaterThanEqual
-2+| Correct result.
-| code:OpFDiv(x,y)
- | 2.5 ULP for [eq]#{vert}y{vert}# in the range [2^-126^, 2^126^].   | 2.5 ULP for [eq]#{vert}y{vert}# in the range [2^-14^, 2^14^].
-| code:OpFRem(x,y)
-2+| Inherited from [eq]#x - y {times} trunc(x/y)#.
-| code:OpFMod(x,y)
-2+| Inherited from [eq]#x - y {times} floor(x/y)#.
-| conversions between types
-2+| Correctly rounded.
-|====
-
-[NOTE]
-.Note
-====
-The code:OpFRem and code:OpFMod instructions use cheap approximations of
-remainder, and the error can be large due to the discontinuity in trunc()
-and floor().
-This can produce mathematically unexpected results in some cases, such as
-FMod(x,x) computing x rather than 0, and can also cause the result to have a
-different sign than the infinitely precise result.
-====
-
-.Precision of GLSL.std.450 Instructions
-[options="header", cols=",,"]
-|====
-|Instruction
-  | Single precision, unless decorated with RelaxedPrecision | Half precision
-| code:fma()
-2+| Inherited from code:OpFMul followed by code:OpFAdd.
-| code:exp(x),  code:exp2(x)
- a| latexmath:[3 + 2 \times \vert x \vert] ULP.             a| latexmath:[1 + 2 \times \vert x \vert] ULP.
-| code:log(),  code:log2()
- a| 3 ULP outside the range latexmath:[[0.5, 2.0\]]. Absolute error < latexmath:[2^{-21}] inside the range latexmath:[[0.5, 2.0\]].
- a| 3 ULP outside the range latexmath:[[0.5, 2.0\]]. Absolute error < latexmath:[2^{-7}] inside the range latexmath:[[0.5, 2.0\]].
-| code:pow(x, y)
-2+| Inherited from code:exp2(y {times} code:log2(x)).
-| code:sqrt()
-2+| Inherited from 1.0 / code:inversesqrt().
-| code:inversesqrt()
-2+| 2 ULP.
-| code:radians(x)
-2+a| Inherited from latexmath:[x \times \frac{\pi}{180}].
-| code:degrees(x)
-2+a| Inherited from latexmath:[x \times \frac{180}{\pi}].
-| code:sin()
-  a| Absolute error latexmath:[\leq 2^{-11}] inside the range latexmath:[[-\pi, \pi\]]. a| Absolute error latexmath:[\leq 2^{-7}] inside the range latexmath:[[-\pi, \pi\]].
-| code:cos()
-  a| Absolute error latexmath:[\leq 2^{-11}] inside the range latexmath:[[-\pi, \pi\]]. a| Absolute error latexmath:[\leq 2^{-7}] inside the range latexmath:[[-\pi, \pi\]].
-| code:tan()
-2+a| Inherited from latexmath:[\frac{\sin()}{\cos()}].
-| code:asin(x)
-2+a| Inherited from latexmath:[\mathrm{atan2}(x, sqrt(1.0 - x \times x))].
-| code:acos(x)
-2+a| Inherited from latexmath:[\mathrm{atan2}(sqrt(1.0 - x \times x), x)].
-| code:atan(), code:atan2()
-   | 4096 ULP                                                      | 5 ULP.
-| code:sinh(x)
-2+a| Inherited from latexmath:[(\exp(x) - \exp(-x)) \times 0.5].
-| code:cosh(x)
-2+a| Inherited from latexmath:[(\exp(x) + \exp(-x)) \times 0.5].
-| code:tanh()
-2+a| Inherited from latexmath:[\frac{\sinh()}{\cosh()}].
-| code:asinh(x)
-2+a| Inherited from latexmath:[\log(x + sqrt(x \times x + 1.0))].
-| code:acosh(x)
-2+a| Inherited from latexmath:[\log(x + sqrt(x \times x - 1.0))].
-| code:atanh(x)
-2+a| Inherited from latexmath:[\log(\frac{1.0 + x}{1.0 - x}) \times 0.5].
-| code:frexp()
-2+| Correctly rounded.
-| code:ldexp()
-2+| Correctly rounded.
-| code:length(x)
-2+a| Inherited from latexmath:[sqrt(dot(x, x))].
-| code:distance(x, y)
-2+a| Inherited from latexmath:[length(x - y)].
-| code:cross()
-2+| Inherited from [eq]#code:OpFSub(code:OpFMul, code:OpFMul)#.
-| code:normalize(x)
-2+a| Inherited from latexmath:[\frac{x}{length(x)}].
-| code:faceforward(N, I, NRef)
-2+| Inherited from [eq]#code:dot(NRef, I) < 0.0 ? N : -N#.
-| code:reflect(x, y)
-2+| Inherited from [eq]#x - 2.0 {times} code:dot(y, x) {times} y#.
-| code:refract(I, N, eta)
-2+| Inherited from [eq]#k < 0.0 ? 0.0 : eta {times} I - (eta {times} code:dot(N, I) {plus} code:sqrt(k)) {times} N#, where [eq]#k = 1 - eta {times} eta {times} (1.0 - code:dot(N, I) {times} code:dot(N, I))#.
-| code:round
-2+| Correctly rounded.
-| code:roundEven
-2+| Correctly rounded.
-| code:trunc
-2+| Correctly rounded.
-| code:fabs
-2+| Correctly rounded.
-| code:fsign
-2+| Correctly rounded.
-| code:floor
-2+| Correctly rounded.
-| code:ceil
-2+| Correctly rounded.
-| code:fract
-2+| Correctly rounded.
-| code:modf
-2+| Correctly rounded.
-| code:fmin
-2+| Correctly rounded.
-| code:fmax
-2+| Correctly rounded.
-| code:fclamp
-2+| Correctly rounded.
-| code:fmix(x, y, a)
-2+a| Inherited from latexmath:[x \times (1.0 - a) + y \times a].
-| code:step
-2+| Correctly rounded.
-| code:smoothStep(edge0, edge1, x)
-2+a| Inherited from latexmath:[t \times t \times (3.0 - 2.0 \times t)],
-where latexmath:[t = clamp(\frac{x - edge0}{edge1 - edge0}, 0.0, 1.0)].
-| code:nmin
-2+| Correctly rounded.
-| code:nmax
-2+| Correctly rounded.
-| code:nclamp
-2+| Correctly rounded.
-|====
-endif::VK_VERSION_1_2,VK_KHR_shader_float16_int8[]
-
-ifndef::VK_VERSION_1_2,VK_KHR_shader_float16_int8[]
-For single precision (32 bit) instructions, precisions are required: to be
-at least as follows, unless decorated with RelaxedPrecision:
-
-.Precision of core SPIR-V Instructions
-[options="header"]
-|====
-| Instruction                                                     | Precision
-| code:OpFAdd                                                     | Correctly rounded.
-| code:OpFSub                                                     | Correctly rounded.
-| code:OpFMul, code:OpVectorTimesScalar, code:OpMatrixTimesScalar | Correctly rounded.
-| code:OpFOrdEqual, code:OpFUnordEqual                            | Correct result.
-| code:OpFOrdLessThan, code:OpFUnordLessThan                      | Correct result.
-| code:OpFOrdGreaterThan, code:OpFUnordGreaterThan                | Correct result.
-| code:OpFOrdLessThanEqual, code:OpFUnordLessThanEqual            | Correct result.
-| code:OpFOrdGreaterThanEqual, code:OpFUnordGreaterThanEqual      | Correct result.
-| code:OpFDiv(x,y)                                                | 2.5 ULP for [eq]#{vert}y{vert}# in the range [2^-126^, 2^126^].
-| conversions between types                                       | Correctly rounded.
-|====
-
-.Precision of GLSL.std.450 Instructions
-[options="header"]
-|====
-|Instruction                 | Precision
-| code:fma()                 | Inherited from code:OpFMul followed by code:OpFAdd.
-| code:exp(x),  code:exp2(x) | [eq]#3 {plus} 2 {times} {vert}x{vert}# ULP.
-| code:log(),  code:log2()   | 3 ULP outside the range [eq]#[0.5, 2.0]#. Absolute error < [eq]#2^-21^# inside the range [eq]#[0.5, 2.0]#.
-| code:pow(x, y)             | Inherited from code:exp2(y {times} code:log2(x)).
-| code:sqrt()                | Inherited from 1.0 / code:inversesqrt().
-| code:inversesqrt()         | 2 ULP.
-|====
-endif::VK_VERSION_1_2,VK_KHR_shader_float16_int8[]
-
-GLSL.std.450 extended instructions specifically defined in terms of the
-above instructions inherit the above errors.
-GLSL.std.450 extended instructions not listed above and not defined in terms
-of the above have undefined: precision.
-
-For the code:OpSRem and code:OpSMod instructions, if either operand is
-negative the result is undefined:.
-
-[NOTE]
-.Note
-====
-While the code:OpSRem and code:OpSMod instructions are supported by the
-Vulkan environment, they require non-negative values and thus do not enable
-additional functionality beyond what code:OpUMod provides.
-====
-
-ifdef::VK_NV_cooperative_matrix[]
-code:OpCooperativeMatrixMulAddNV performs its operations in an
-implementation-dependent order and internal precision.
-endif::VK_NV_cooperative_matrix[]
-
-[[spirvenv-image-signedness]]
-== Signedness of SPIR-V Image Accesses
-
-SPIR-V associates a signedness with all integer image accesses.
-This is required in certain parts of the SPIR-V and the Vulkan image access
-pipeline to ensure defined results.
-The signedness is determined from a combination of the access instruction's
-code:Image code:Operands and the underlying image's code:Sampled code:Type
-as follows:
-
- 1. If the instruction's code:Image code:Operands contains the
-    code:SignExtend operand then the access is signed.
- 2. If the instruction's code:Image code:Operands contains the
-    code:ZeroExtend operand then the access is unsigned.
- 3. Otherwise, the image accesses signedness matches that of the
-    code:Sampled code:Type of the code:OpTypeImage being accessed.
-
-[[spirvenv-format-type-matching]]
-== Image Format and Type Matching
-
-When specifying the code:Image code:Format of an code:OpTypeImage, the
-converted bit width and type, as shown in the table below, must: match the
-code:Sampled code:Type.
-The signedness must: match the <<spirvenv-image-signedness,signedness of any
-access>> to the image.
-
-[NOTE]
-.Note
-====
-Formatted accesses are always converted from a shader readable type to the
-resource's format or vice versa via <<textures-format-conversion>> for reads
-and <<textures-output-format-conversion>> for writes.
-As such, the bit width and format below do not necessarily match 1:1 with
-what might be expected for some formats.
-====
-
-For a given code:Image code:Format, the code:Sampled code:Type must: be the
-type described in the _Type_ column of the below table, with its
-code:Literal code:Width set to that in the _Bit Width_ column.
-Every access that is made to the image must: have a signedness equal to that
-in the _Signedness_ column (where applicable).
-
-[options="autowidth"]
-|===
-| Image Format       | Type                 | Bit Width | Signedness
-
-| code:Unknown       | Any                  | Any       | Any
-| code:Rgba32f   .20+| code:OpTypeFloat .20+| 32    .20+| N/A
-| code:Rg32f
-| code:R32f
-| code:Rgba16f
-| code:Rg16f
-| code:R16f
-| code:Rgba16
-| code:Rg16
-| code:R16
-| code:Rgba16Snorm
-| code:Rg16Snorm
-| code:R16Snorm
-| code:Rgb10A2
-| code:R11fG11fB10f
-| code:Rgba8
-| code:Rg8
-| code:R8
-| code:Rgba8Snorm
-| code:Rg8Snorm
-| code:R8Snorm
-| code:Rgba32i   .19+| code:OpTypeInt   .19+| 32     .9+| 1
-| code:Rg32i
-| code:R32i
-| code:Rgba16i
-| code:Rg16i
-| code:R16i
-| code:Rgba8i
-| code:Rg8i
-| code:R8i
-| code:Rgba32ui                                     .10+| 0
-| code:Rg32ui
-| code:R32ui
-| code:Rgba16ui
-| code:Rg16ui
-| code:R16ui
-| code:Rgb10a2ui
-| code:Rgba8ui
-| code:Rg8ui
-| code:R8ui
-| code:R64i       .2+| code:OpTypeInt    .2+| 64        | 1
-| code:R64ui                                            | 0
-|===
-
-[[spirvenv-image-formats]]
-== Compatibility Between SPIR-V Image Formats And Vulkan Formats
-
-SPIR-V code:Image code:Format values are compatible with elink:VkFormat
-values as defined below:
-
-.SPIR-V and Vulkan Image Format Compatibility
-[cols="2*", options="header"]
-|====
-|SPIR-V Image Format    |Compatible Vulkan Format
-|code:Unknown           |Any
-|code:Rgba32f           |ename:VK_FORMAT_R32G32B32A32_SFLOAT
-|code:Rgba16f           |ename:VK_FORMAT_R16G16B16A16_SFLOAT
-|code:R32f              |ename:VK_FORMAT_R32_SFLOAT
-|code:Rgba8             |ename:VK_FORMAT_R8G8B8A8_UNORM
-|code:Rgba8Snorm        |ename:VK_FORMAT_R8G8B8A8_SNORM
-|code:Rg32f             |ename:VK_FORMAT_R32G32_SFLOAT
-|code:Rg16f             |ename:VK_FORMAT_R16G16_SFLOAT
-|code:R11fG11fB10f      |ename:VK_FORMAT_B10G11R11_UFLOAT_PACK32
-|code:R16f              |ename:VK_FORMAT_R16_SFLOAT
-|code:Rgba16            |ename:VK_FORMAT_R16G16B16A16_UNORM
-|code:Rgb10A2           |ename:VK_FORMAT_A2B10G10R10_UNORM_PACK32
-|code:Rg16              |ename:VK_FORMAT_R16G16_UNORM
-|code:Rg8               |ename:VK_FORMAT_R8G8_UNORM
-|code:R16               |ename:VK_FORMAT_R16_UNORM
-|code:R8                |ename:VK_FORMAT_R8_UNORM
-|code:Rgba16Snorm       |ename:VK_FORMAT_R16G16B16A16_SNORM
-|code:Rg16Snorm         |ename:VK_FORMAT_R16G16_SNORM
-|code:Rg8Snorm          |ename:VK_FORMAT_R8G8_SNORM
-|code:R16Snorm          |ename:VK_FORMAT_R16_SNORM
-|code:R8Snorm           |ename:VK_FORMAT_R8_SNORM
-|code:Rgba32i           |ename:VK_FORMAT_R32G32B32A32_SINT
-|code:Rgba16i           |ename:VK_FORMAT_R16G16B16A16_SINT
-|code:Rgba8i            |ename:VK_FORMAT_R8G8B8A8_SINT
-|code:R32i              |ename:VK_FORMAT_R32_SINT
-|code:Rg32i             |ename:VK_FORMAT_R32G32_SINT
-|code:Rg16i             |ename:VK_FORMAT_R16G16_SINT
-|code:Rg8i              |ename:VK_FORMAT_R8G8_SINT
-|code:R16i              |ename:VK_FORMAT_R16_SINT
-|code:R8i               |ename:VK_FORMAT_R8_SINT
-|code:Rgba32ui          |ename:VK_FORMAT_R32G32B32A32_UINT
-|code:Rgba16ui          |ename:VK_FORMAT_R16G16B16A16_UINT
-|code:Rgba8ui           |ename:VK_FORMAT_R8G8B8A8_UINT
-|code:R32ui             |ename:VK_FORMAT_R32_UINT
-|code:Rgb10a2ui         |ename:VK_FORMAT_A2B10G10R10_UINT_PACK32
-|code:Rg32ui            |ename:VK_FORMAT_R32G32_UINT
-|code:Rg16ui            |ename:VK_FORMAT_R16G16_UINT
-|code:Rg8ui             |ename:VK_FORMAT_R8G8_UINT
-|code:R16ui             |ename:VK_FORMAT_R16_UINT
-|code:R8ui              |ename:VK_FORMAT_R8_UINT
-|code:R64i              |ename:VK_FORMAT_R64_SINT
-|code:R64ui             |ename:VK_FORMAT_R64_UINT
-|====
diff --git a/registry/vulkan/appendices/versions.txt b/registry/vulkan/appendices/versions.txt
deleted file mode 100644
index 14ffc87..0000000
--- a/registry/vulkan/appendices/versions.txt
+++ /dev/null
@@ -1,311 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[appendix]
-
-[[versions]]
-= Core Revisions (Informative)
-
-New minor versions of the Vulkan API are defined periodically by the Khronos
-Vulkan Working Group.
-These consist of some amount of additional functionality added to the core
-API, potentially including both new functionality and functionality
-<<extendingvulkan-compatibility-promotion,promoted>> from extensions.
-
-ifdef::VK_VERSION_1_1[]
-It is possible to build the specification for earlier versions, but to aid
-readability of the latest versions, this appendix gives an overview of the
-changes as compared to earlier versions.
-endif::VK_VERSION_1_1[]
-
-
-ifdef::VK_VERSION_1_2[]
-[[versions-1.2]]
-== Version 1.2
-
-// Unfortunately we can't include titles in an open refpage block, so this
-// is a refpage-specific alternate form of the section.
-ifdef::isrefpage[]
-[open,refpage='VK_VERSION_1_2',desc='Vulkan version 1.2',type='feature',anchor='versions-1.2',xrefs='VK_VERSION_1_0 VK_VERSION_1_1']
---
-Vulkan Version 1.2 <<extendingvulkan-compatibility-promotion,promoted>> a
-number of key extensions into the core API:
-
-include::{generated}/meta/promoted_extensions_VK_VERSION_1_2.txt[]
-
-All differences in behavior between these extensions and the corresponding
-Vulkan 1.2 functionality are summarized in the <<versions-1.2-promotions,
-Vulkan 1.2 specification appendix>>.
-
-include::{generated}/interfaces/VK_VERSION_1_2.txt[]
---
-endif::isrefpage[]
-
-// This is the spec-specific form of the section
-[[versions-1.2-promotions]]
-Vulkan Version 1.2 <<extendingvulkan-compatibility-promotion,promoted>> a
-number of key extensions into the core API:
-
-include::{generated}/meta/promoted_extensions_VK_VERSION_1_2.txt[]
-
-All differences in behavior between these extensions and the corresponding
-Vulkan 1.2 functionality are summarized below.
-
-=== Differences relative to `VK_KHR_8bit_storage`
-
-If the `apiext:VK_KHR_8bit_storage` extension is not supported, support for
-the SPIR-V <<features-storageBuffer8BitAccess,
-code:StorageBuffer8BitAccess>> capability in shader modules is optional.
-Support for this feature is defined by
-slink:VkPhysicalDeviceVulkan12Features::pname:storageBuffer8BitAccess when
-queried via flink:vkGetPhysicalDeviceFeatures2.
-
-=== Differences relative to `VK_KHR_draw_indirect_count`
-
-If the `apiext:VK_KHR_draw_indirect_count` extension is not supported,
-support for the entry points flink:vkCmdDrawIndirectCount and
-flink:vkCmdDrawIndexedIndirectCount is optional.
-Support for this feature is defined by
-slink:VkPhysicalDeviceVulkan12Features::pname:drawIndirectCount when queried
-via flink:vkGetPhysicalDeviceFeatures2.
-
-=== Differences relative to `VK_KHR_sampler_mirror_clamp_to_edge`
-
-If the `apiext:VK_KHR_sampler_mirror_clamp_to_edge` extension is not
-supported, support for the elink:VkSamplerAddressMode
-ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE is optional.
-Support for this feature is defined by
-slink:VkPhysicalDeviceVulkan12Features::pname:samplerMirrorClampToEdge when
-queried via flink:vkGetPhysicalDeviceFeatures2.
-
-=== Differences relative to `VK_EXT_descriptor_indexing`
-
-If the `apiext:VK_EXT_descriptor_indexing` extension is not supported,
-support for the <<features-descriptorIndexing,descriptorIndexing>> feature
-is optional.
-Support for this feature is defined by
-slink:VkPhysicalDeviceVulkan12Features::pname:descriptorIndexing when
-queried via flink:vkGetPhysicalDeviceFeatures2.
-
-=== Differences relative to `VK_EXT_scalar_block_layout`
-
-If the `apiext:VK_EXT_scalar_block_layout` extension is not supported,
-support for the <<features-scalarBlockLayout,scalarBlockLayout>> feature is
-optional.
-Support for this feature is defined by
-slink:VkPhysicalDeviceVulkan12Features::pname:scalarBlockLayout when queried
-via flink:vkGetPhysicalDeviceFeatures2.
-
-=== Differences relative to `VK_EXT_shader_viewport_index_layer`
-
-If the `apiext:VK_EXT_shader_viewport_index_layer` extension is not
-supported, support for the code:ShaderViewportIndexLayerEXT SPIR-V
-capability is optional.
-Support for this feature is defined by
-slink:VkPhysicalDeviceVulkan12Features::pname:shaderOutputViewportIndex and
-slink:VkPhysicalDeviceVulkan12Features::pname:shaderOutputLayer when queried
-via flink:vkGetPhysicalDeviceFeatures2.
-
-=== Differences relative to `VK_KHR_buffer_device_address`
-
-If the `apiext:VK_KHR_buffer_device_address` extension is not supported,
-support for the <<features-bufferDeviceAddress,bufferDeviceAddress>> feature
-is optional.
-Support for this feature is defined by
-slink:VkPhysicalDeviceVulkan12Features::pname:bufferDeviceAddress when
-queried via flink:vkGetPhysicalDeviceFeatures2.
-
-=== Differences relative to `VK_KHR_shader_atomic_int64`
-
-If the `apiext:VK_KHR_shader_atomic_int64` extension is not supported,
-support for the
-<<features-shaderBufferInt64Atomics,shaderBufferInt64Atomics>> feature is
-optional.
-Support for this feature is defined by
-slink:VkPhysicalDeviceVulkan12Features::pname:shaderBufferInt64Atomics when
-queried via flink:vkGetPhysicalDeviceFeatures2.
-
-=== Differences relative to `VK_KHR_shader_float16_int8`
-
-If the `apiext:VK_KHR_shader_float16_int8` extension is not supported,
-support for the <<features-shaderFloat16, pname:shaderFloat16>> and
-<<features-shaderInt8, pname:shaderInt8>> features is optional.
-Support for these features are defined by
-slink:VkPhysicalDeviceVulkan12Features::pname:shaderFloat16 and
-slink:VkPhysicalDeviceVulkan12Features::pname:shaderInt8 when queried via
-flink:vkGetPhysicalDeviceFeatures2.
-
-=== Differences relative to `VK_KHR_vulkan_memory_model`
-
-If the `apiext:VK_KHR_vulkan_memory_model` extension is not supported,
-support for the <<features-vulkanMemoryModel,vulkanMemoryModel>> feature is
-optional.
-Support for this feature is defined by
-slink:VkPhysicalDeviceVulkan12Features::pname:vulkanMemoryModel when queried
-via flink:vkGetPhysicalDeviceFeatures2.
-
-=== Additional Vulkan 1.2 Feature Support
-
-[[versions-1.2-new-features]]
-In addition to the promoted extensions described above, Vulkan 1.2 added
-support for:
-
-  * SPIR-V version 1.4.
-  * SPIR-V version 1.5.
-  * The <<features-samplerMirrorClampToEdge,samplerMirrorClampToEdge>>
-    feature which indicates whether the implementation supports the
-    ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE sampler address mode.
-  * The
-    <<spirvenv-capabilities-table-ShaderNonUniform,code:ShaderNonUniform>>
-    capability in SPIR-V version 1.5.
-  * The <<features-shaderOutputViewportIndex,shaderOutputViewportIndex>>
-    feature which indicates that the
-    <<spirvenv-capabilities-table-ShaderViewportIndex,code:ShaderViewportIndex>>
-    capability can be used.
-  * The <<features-shaderOutputLayer,shaderOutputLayer>> feature which
-    indicates that the
-    <<spirvenv-capabilities-table-ShaderLayer,code:ShaderLayer>> capability
-    can be used.
-  * The <<features-subgroupBroadcastDynamicId,subgroupBroadcastDynamicId>>
-    feature which allows the "`Id`" operand of
-    code:OpGroupNonUniformBroadcast to be dynamically uniform within a
-    subgroup, and the "`Index`" operand of
-    code:OpGroupNonUniformQuadBroadcast to be dynamically uniform within a
-    derivative group, in shader modules of version 1.5 or higher.
-  * The <<features-drawIndirectCount,drawIndirectCount>> feature which
-    indicates whether the flink:vkCmdDrawIndirectCount and
-    flink:vkCmdDrawIndexedIndirectCount functions can be used.
-  * The <<features-descriptorIndexing,descriptorIndexing>> feature which
-    indicates the implementation supports the minimum number of descriptor
-    indexing features as defined in the <<features-requirements,Feature
-    Requirements>> section.
-  * The <<features-samplerFilterMinmax,samplerFilterMinmax>> feature which
-    indicates whether the implementation supports the minimum number of
-    image formats that support the
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT feature bit as
-    defined by the
-    <<limits-filterMinmaxSingleComponentFormats-minimum-requirements,pname:filterMinmaxSingleComponentFormats>>
-    property minimum requirements.
-  * The
-    <<limits-framebufferIntegerColorSampleCounts,framebufferIntegerColorSampleCounts>>
-    limit which indicates the color sample counts that are supported for all
-    framebuffer color attachments with integer formats.
-
-include::{generated}/interfaces/VK_VERSION_1_2.txt[]
-
-endif::VK_VERSION_1_2[]
-
-
-ifdef::VK_VERSION_1_1[]
-[[versions-1.1]]
-== Version 1.1
-
-// Unfortunately we can't include titles in an open refpage block, so this
-// is a refpage-specific alternate form of the section.
-ifdef::isrefpage[]
-[open,refpage='VK_VERSION_1_1',desc='Vulkan version 1.1',type='feature',anchor='versions-1.1',xrefs='VK_VERSION_1_0 VK_VERSION_1_2']
---
-Vulkan Version 1.1 <<extendingvulkan-compatibility-promotion,promoted>> a
-number of key extensions into the core API:
-
-include::{generated}/meta/promoted_extensions_VK_VERSION_1_1.txt[]
-
-All differences in behavior between these extensions and the corresponding
-Vulkan 1.1 functionality are summarized in the <<versions-1.1-promotions,
-Vulkan 1.1 specification appendix>>.
-
-include::{generated}/interfaces/VK_VERSION_1_1.txt[]
---
-endif::isrefpage[]
-
-// This is the spec-specific form of the section
-[[versions-1.1-promotions]]
-Vulkan Version 1.1 <<extendingvulkan-compatibility-promotion,promoted>> a
-number of key extensions into the core API:
-
-include::{generated}/meta/promoted_extensions_VK_VERSION_1_1.txt[]
-
-All differences in behavior between these extensions and the corresponding
-Vulkan 1.1 functionality are summarized below.
-
-=== Differences relative to `VK_KHR_16bit_storage`
-
-If the `apiext:VK_KHR_16bit_storage` extension is not supported, support for
-the <<features-storageBuffer16BitAccess, pname:storageBuffer16BitAccess>>
-feature is optional.
-Support for this feature is defined by
-slink:VkPhysicalDevice16BitStorageFeatures::pname:storageBuffer16BitAccess
-ifdef::VK_VERSION_1_2[]
-or slink:VkPhysicalDeviceVulkan11Features::pname:storageBuffer16BitAccess
-endif::VK_VERSION_1_2[]
-when queried via flink:vkGetPhysicalDeviceFeatures2.
-
-=== Differences relative to `VK_KHR_sampler_ycbcr_conversion`
-
-If the `apiext:VK_KHR_sampler_ycbcr_conversion` extension is not supported,
-support for the
-<<features-samplerYcbcrConversion,pname:samplerYcbcrConversion>> feature is
-optional.
-Support for this feature is defined by
-slink:VkPhysicalDeviceSamplerYcbcrConversionFeatures::pname:samplerYcbcrConversion
-ifdef::VK_VERSION_1_2[]
-or slink:VkPhysicalDeviceVulkan11Features::pname:samplerYcbcrConversion
-endif::VK_VERSION_1_2[]
-when queried via flink:vkGetPhysicalDeviceFeatures2.
-
-=== Differences relative to `VK_KHR_shader_draw_parameters`
-
-If the `apiext:VK_KHR_shader_draw_parameters` extension is not supported,
-support for the
-{spirv}/KHR/SPV_KHR_shader_draw_parameters.html[`SPV_KHR_shader_draw_parameters`]
-SPIR-V extension is optional.
-Support for this feature is defined by
-slink:VkPhysicalDeviceShaderDrawParametersFeatures::pname:shaderDrawParameters
-ifdef::VK_VERSION_1_2[]
-or slink:VkPhysicalDeviceVulkan11Features::pname:shaderDrawParameters
-endif::VK_VERSION_1_2[]
-when queried via flink:vkGetPhysicalDeviceFeatures2.
-
-=== Differences relative to `VK_KHR_variable_pointers`
-
-If the `apiext:VK_KHR_variable_pointers` extension is not supported, support
-for the <<features-variablePointersStorageBuffer,
-pname:variablePointersStorageBuffer>> feature is optional.
-Support for this feature is defined by
-slink:VkPhysicalDeviceVariablePointersFeatures::pname:variablePointersStorageBuffer
-ifdef::VK_VERSION_1_2[]
-or
-slink:VkPhysicalDeviceVulkan11Features::pname:variablePointersStorageBuffer
-endif::VK_VERSION_1_2[]
-when queried via flink:vkGetPhysicalDeviceFeatures2.
-
-=== Additional Vulkan 1.1 Feature Support
-
-[[versions-1.1-new-features]]
-In addition to the promoted extensions described above, Vulkan 1.1 added
-support for:
-
-  * The <<shaders-group-operations, group operations>> and
-    <<shaders-scope-subgroup, subgroup scope>>.
-  * The <<memory-protected-memory, protected memory>> feature.
-  * A new command to enumerate the instance version:
-    flink:vkEnumerateInstanceVersion.
-  * The slink:VkPhysicalDeviceShaderDrawParametersFeatures feature query
-    struct (where the `apiext:VK_KHR_shader_draw_parameters` extension did
-    not have one).
-
-include::{generated}/interfaces/VK_VERSION_1_1.txt[]
-
-endif::VK_VERSION_1_1[]
-
-
-[[versions-1.0]]
-== Version 1.0
-
-[open,refpage='VK_VERSION_1_0',desc='Vulkan version 1.0',type='feature',anchor='versions-1.0',xrefs='VK_VERSION_1_1 VK_VERSION_1_2']
---
-Vulkan Version 1.0 was the initial release of the Vulkan API.
-
-include::{generated}/interfaces/VK_VERSION_1_0.txt[]
---
diff --git a/registry/vulkan/chapters/VK_AMD_buffer_marker/copies.txt b/registry/vulkan/chapters/VK_AMD_buffer_marker/copies.txt
deleted file mode 100644
index bf4011e..0000000
--- a/registry/vulkan/chapters/VK_AMD_buffer_marker/copies.txt
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright (c) 2018-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[copies-buffer-markers]]
-== Buffer Markers
-
-ifdef::VK_KHR_synchronization2[]
-
-[open,refpage='vkCmdWriteBufferMarker2AMD',desc='Execute a pipelined write of a marker value into a buffer',type='protos']
---
-:refpage: vkCmdWriteBufferMarker2AMD
-
-To write a 32-bit marker value into a buffer as a pipelined operation, call:
-
-include::{generated}/api/protos/vkCmdWriteBufferMarker2AMD.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:stage specifies the pipeline stage whose completion triggers the
-    marker write.
-  * pname:dstBuffer is the buffer where the marker will be written.
-  * pname:dstOffset is the byte offset into the buffer where the marker will
-    be written.
-  * pname:marker is the 32-bit value of the marker.
-
-The command will write the 32-bit marker value into the buffer only after
-all preceding commands have finished executing up to at least the specified
-pipeline stage.
-This includes the completion of other preceding
-fname:vkCmdWriteBufferMarker2AMD commands so long as their specified
-pipeline stages occur either at the same time or earlier than this command's
-specified pname:stage.
-
-While consecutive buffer marker writes with the same pname:stage parameter
-implicitly complete in submission order, memory and execution dependencies
-between buffer marker writes and other operations must: still be explicitly
-ordered using synchronization commands.
-The access scope for buffer marker writes falls under the
-ename:VK_ACCESS_TRANSFER_WRITE_BIT, and the pipeline stages for identifying
-the synchronization scope must: include both pname:stage and
-ename:VK_PIPELINE_STAGE_TRANSFER_BIT.
-
-[NOTE]
-.Note
-====
-Similar to fname:vkCmdWriteTimestamp2KHR, if an implementation is unable to
-write a marker at any specific pipeline stage, it may: instead do so at any
-logically later stage.
-====
-
-[NOTE]
-.Note
-====
-Implementations may: only support a limited number of pipelined marker write
-operations in flight at a given time.
-Thus an excessive number of marker write operations may: degrade command
-execution performance.
-====
-
-.Valid Usage
-****
-:stageMaskName: stage
-include::{chapters}/commonvalidity/stage_mask_2_common.txt[]
-  * [[VUID-vkCmdWriteBufferMarker2AMD-synchronization2-03893]]
-    The <<features-synchronization2, pname:synchronization2>> feature must:
-    be enabled
-  * [[VUID-vkCmdWriteBufferMarker2AMD-stage-03894]]
-    pname:stage must: include only a single pipeline stage
-  * [[VUID-vkCmdWriteBufferMarker2AMD-stage-03895]]
-    pname:stage must: include only stages that are valid for the queue
-    family that was used to create the command pool that pname:commandBuffer
-    was allocated from
-  * [[VUID-vkCmdWriteBufferMarker2AMD-dstOffset-03896]]
-    pname:dstOffset must: be less than or equal to the size of
-    pname:dstBuffer minus `4`
-  * [[VUID-vkCmdWriteBufferMarker2AMD-dstBuffer-03897]]
-    pname:dstBuffer must: have been created with the
-    ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag
-  * [[VUID-vkCmdWriteBufferMarker2AMD-dstBuffer-03898]]
-    If pname:dstBuffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-vkCmdWriteBufferMarker2AMD-dstOffset-03899]]
-    pname:dstOffset must: be a multiple of `4`
-****
-
-include::{generated}/validity/protos/vkCmdWriteBufferMarker2AMD.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='vkCmdWriteBufferMarkerAMD',desc='Execute a pipelined write of a marker value into a buffer',type='protos']
---
-:refpage: vkCmdWriteBufferMarkerAMD
-
-To write a 32-bit marker value into a buffer as a pipelined operation, call:
-
-include::{generated}/api/protos/vkCmdWriteBufferMarkerAMD.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pipelineStage is a elink:VkPipelineStageFlagBits value specifying
-    the pipeline stage whose completion triggers the marker write.
-  * pname:dstBuffer is the buffer where the marker will be written to.
-  * pname:dstOffset is the byte offset into the buffer where the marker will
-    be written to.
-  * pname:marker is the 32-bit value of the marker.
-
-The command will write the 32-bit marker value into the buffer only after
-all preceding commands have finished executing up to at least the specified
-pipeline stage.
-This includes the completion of other preceding
-fname:vkCmdWriteBufferMarkerAMD commands so long as their specified pipeline
-stages occur either at the same time or earlier than this command's
-specified pname:pipelineStage.
-
-While consecutive buffer marker writes with the same pname:pipelineStage
-parameter are implicitly complete in submission order, memory and execution
-dependencies between buffer marker writes and other operations must still be
-explicitly ordered using synchronization commands.
-The access scope for buffer marker writes falls under the
-ename:VK_ACCESS_TRANSFER_WRITE_BIT, and the pipeline stages for identifying
-the synchronization scope must: include both pname:pipelineStage and
-ename:VK_PIPELINE_STAGE_TRANSFER_BIT.
-
-[NOTE]
-.Note
-====
-Similar to fname:vkCmdWriteTimestamp, if an implementation is unable to
-write a marker at any specific pipeline stage, it may: instead do so at any
-logically later stage.
-====
-
-[NOTE]
-.Note
-====
-Implementations may: only support a limited number of pipelined marker write
-operations in flight at a given time, thus excessive number of marker write
-operations may: degrade command execution performance.
-====
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/pipeline_stage_common.txt[]
-  * [[VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01798]]
-    pname:dstOffset must: be less than or equal to the size of
-    pname:dstBuffer minus `4`
-  * [[VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01799]]
-    pname:dstBuffer must: have been created with
-    ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag
-  * [[VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01800]]
-    If pname:dstBuffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01801]]
-    pname:dstOffset must: be a multiple of `4`
-****
-
-include::{generated}/validity/protos/vkCmdWriteBufferMarkerAMD.txt[]
---
diff --git a/registry/vulkan/chapters/VK_AMD_pipeline_compiler_control.txt b/registry/vulkan/chapters/VK_AMD_pipeline_compiler_control.txt
deleted file mode 100644
index 2edf1e4..0000000
--- a/registry/vulkan/chapters/VK_AMD_pipeline_compiler_control.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2019-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// This section is included inside the Pipelines chapter (pipelines.txt)
-
-[[pipelines-compiler-control]]
-== Pipeline Compiler Control
-
-[open,refpage='VkPipelineCompilerControlCreateInfoAMD',desc='Structure used to pass compilation control flags to a pipeline',type='structs']
---
-The compilation of a pipeline can: be tuned by adding a
-sname:VkPipelineCompilerControlCreateInfoAMD structure to the pname:pNext
-chain of slink:VkGraphicsPipelineCreateInfo or
-slink:VkComputePipelineCreateInfo.
-
-include::{generated}/api/structs/VkPipelineCompilerControlCreateInfoAMD.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:compilerControlFlags is a bitmask of
-    elink:VkPipelineCompilerControlFlagBitsAMD affecting how the pipeline
-    will be compiled.
-
-include::{generated}/validity/structs/VkPipelineCompilerControlCreateInfoAMD.txt[]
---
-
-[open,refpage='VkPipelineCompilerControlFlagBitsAMD',desc='Enum specifying available compilation control flags',type='enums']
---
-There are currently no available flags for this extension; flags will be
-added by future versions of this extension.
-
-include::{generated}/api/enums/VkPipelineCompilerControlFlagBitsAMD.txt[]
---
-
-[open,refpage='VkPipelineCompilerControlFlagsAMD',desc='Bitmask of VkPipelineCompilerControlFlagBitsAMD',type='flags']
---
-include::{generated}/api/flags/VkPipelineCompilerControlFlagsAMD.txt[]
-
-tname:VkPipelineCompilerControlFlagsAMD is a bitmask type for setting a mask
-of zero or more elink:VkPipelineCompilerControlFlagBitsAMD.
---
diff --git a/registry/vulkan/chapters/VK_AMD_shader_info.txt b/registry/vulkan/chapters/VK_AMD_shader_info.txt
deleted file mode 100644
index 527db55..0000000
--- a/registry/vulkan/chapters/VK_AMD_shader_info.txt
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright (c) 2018-2020 Advanced Micro Devices, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// This section is included inside the Pipelines chapter (pipelines.txt)
-
-[open,refpage='vkGetShaderInfoAMD',desc='Get information about a shader in a pipeline',type='protos']
---
-Information about a particular shader that has been compiled as part of a
-pipeline object can be extracted by calling:
-
-include::{generated}/api/protos/vkGetShaderInfoAMD.txt[]
-
-  * pname:device is the device that created pname:pipeline.
-  * pname:pipeline is the target of the query.
-  * pname:shaderStage is a elink:VkShaderStageFlagBits specifying the
-    particular shader within the pipeline about which information is being
-    queried.
-  * pname:infoType describes what kind of information is being queried.
-  * pname:pInfoSize is a pointer to a value related to the amount of data
-    the query returns, as described below.
-  * pname:pInfo is either `NULL` or a pointer to a buffer.
-
-If pname:pInfo is `NULL`, then the maximum size of the information that can:
-be retrieved about the shader, in bytes, is returned in pname:pInfoSize.
-Otherwise, pname:pInfoSize must: point to a variable set by the user to the
-size of the buffer, in bytes, pointed to by pname:pInfo, and on return the
-variable is overwritten with the amount of data actually written to
-pname:pInfo.
-If pname:pInfoSize is less than the maximum size that can: be retrieved by
-the pipeline cache, then at most pname:pInfoSize bytes will be written to
-pname:pInfo, and ename:VK_INCOMPLETE will be returned, instead of
-ename:VK_SUCCESS, to indicate that not all required of the pipeline cache
-was returned.
-
-Not all information is available for every shader and implementations may
-not support all kinds of information for any shader.
-When a certain type of information is unavailable, the function returns
-ename:VK_ERROR_FEATURE_NOT_PRESENT.
-
-If information is successfully and fully queried, the function will return
-ename:VK_SUCCESS.
-
-For pname:infoType ename:VK_SHADER_INFO_TYPE_STATISTICS_AMD, a
-sname:VkShaderStatisticsInfoAMD structure will be written to the buffer
-pointed to by pname:pInfo.
-This structure will be populated with statistics regarding the physical
-device resources used by that shader along with other miscellaneous
-information and is described in further detail below.
-
-For pname:infoType ename:VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD, pname:pInfo is
-a pointer to a UTF-8 null-terminated string containing human-readable
-disassembly.
-The exact formatting and contents of the disassembly string are
-vendor-specific.
-
-The formatting and contents of all other types of information, including
-pname:infoType ename:VK_SHADER_INFO_TYPE_BINARY_AMD, are left to the vendor
-and are not further specified by this extension.
-
-include::{generated}/validity/protos/vkGetShaderInfoAMD.txt[]
---
-
-[open,refpage='VkShaderInfoTypeAMD',desc='Enum specifying which type of shader information to query',type='enums']
---
-Possible values of flink:vkGetShaderInfoAMD::pname:infoType, specifying the
-information being queried from a shader, are:
-
-include::{generated}/api/enums/VkShaderInfoTypeAMD.txt[]
-
-  * ename:VK_SHADER_INFO_TYPE_STATISTICS_AMD specifies that device resources
-    used by a shader will be queried.
-  * ename:VK_SHADER_INFO_TYPE_BINARY_AMD specifies that
-    implementation-specific information will be queried.
-  * ename:VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD specifies that human-readable
-    dissassembly of a shader.
---
-
-[open,refpage='VkShaderStatisticsInfoAMD',desc='Statistical information about a particular shader within a pipeline',type='structs']
---
-The sname:VkShaderStatisticsInfoAMD structure is defined as:
-
-include::{generated}/api/structs/VkShaderStatisticsInfoAMD.txt[]
-
-  * pname:shaderStageMask are the combination of logical shader stages
-    contained within this shader.
-  * pname:resourceUsage is a slink:VkShaderResourceUsageAMD structure
-    describing internal physical device resources used by this shader.
-  * pname:numPhysicalVgprs is the maximum number of vector instruction
-    general-purpose registers (VGPRs) available to the physical device.
-  * pname:numPhysicalSgprs is the maximum number of scalar instruction
-    general-purpose registers (SGPRs) available to the physical device.
-  * pname:numAvailableVgprs is the maximum limit of VGPRs made available to
-    the shader compiler.
-  * pname:numAvailableSgprs is the maximum limit of SGPRs made available to
-    the shader compiler.
-  * pname:computeWorkGroupSize is the local workgroup size of this shader in
-    { X, Y, Z } dimensions.
-
-Some implementations may merge multiple logical shader stages together in a
-single shader.
-In such cases, pname:shaderStageMask will contain a bitmask of all of the
-stages that are active within that shader.
-Consequently, if specifying those stages as input to
-flink:vkGetShaderInfoAMD, the same output information may: be returned for
-all such shader stage queries.
-
-The number of available VGPRs and SGPRs (pname:numAvailableVgprs and
-pname:numAvailableSgprs respectively) are the shader-addressable subset of
-physical registers that is given as a limit to the compiler for register
-assignment.
-These values may: further be limited by implementations due to performance
-optimizations where register pressure is a bottleneck.
-
-include::{generated}/validity/structs/VkShaderStatisticsInfoAMD.txt[]
---
-
-[open,refpage='VkShaderResourceUsageAMD',desc='Resource usage information about a particular shader within a pipeline',type='structs']
---
-The sname:VkShaderResourceUsageAMD structure is defined as:
-
-include::{generated}/api/structs/VkShaderResourceUsageAMD.txt[]
-
-  * pname:numUsedVgprs is the number of vector instruction general-purpose
-    registers used by this shader.
-  * pname:numUsedSgprs is the number of scalar instruction general-purpose
-    registers used by this shader.
-  * pname:ldsSizePerLocalWorkGroup is the maximum local data store size per
-    work group in bytes.
-  * pname:ldsUsageSizeInBytes is the LDS usage size in bytes per work group
-    by this shader.
-  * pname:scratchMemUsageInBytes is the scratch memory usage in bytes by
-    this shader.
-
-include::{generated}/validity/structs/VkShaderResourceUsageAMD.txt[]
---
diff --git a/registry/vulkan/chapters/VK_EXT_acquire_drm_display/acquire_drm_display.txt b/registry/vulkan/chapters/VK_EXT_acquire_drm_display/acquire_drm_display.txt
deleted file mode 100644
index 2df66f1..0000000
--- a/registry/vulkan/chapters/VK_EXT_acquire_drm_display/acquire_drm_display.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='vkAcquireDrmDisplayEXT',desc='Acquire access to a VkDisplayKHR using DRM',type='protos']
---
-To acquire permission to directly a display in Vulkan from the Direct
-Rendering Manager (DRM) interface, call:
-
-include::{generated}/api/protos/vkAcquireDrmDisplayEXT.txt[]
-
-  * pname:physicalDevice The physical device the display is on.
-  * pname:drmFd DRM primary file descriptor.
-  * pname:display The display the caller wishes Vulkan to control.
-
-All permissions necessary to control the display are granted to the Vulkan
-instance associated with the provided pname:physicalDevice until the display
-is either released or the connector is unplugged.
-The provided pname:drmFd must correspond to the one owned by the
-pname:physicalDevice.
-If not, the error code ename:VK_ERROR_UNKNOWN must be returned.
-The DRM FD must have DRM master permissions.
-If any error is encountered during the acquisition of the display, the call
-must return the error code ename:VK_ERROR_INITIALIZATION_FAILED.
-
-The provided DRM fd should not be closed before the display is released,
-attempting to do it may result in undefined: behaviour.
-
-include::{generated}/validity/protos/vkAcquireDrmDisplayEXT.txt[]
---
-
-[open,refpage='vkGetDrmDisplayEXT',desc='Query the VkDisplayKHR corresponding to a DRM connector ID',type='protos']
---
-Before acquiring a display from the DRM interface, the caller may want to
-select a specific sname:VkDisplayKHR handle by identifying it using a
-pname:connectorId.
-To do so, call:
-
-include::{generated}/api/protos/vkGetDrmDisplayEXT.txt[]
-
-  * pname:physicalDevice The physical device to query the display from.
-  * pname:drmFd DRM primary file descriptor.
-  * pname:connectorId Identifier of the specified DRM connector.
-  * pname:display The corresponding slink:VkDisplayKHR handle will be
-    returned here.
-
-If there is no slink:VkDisplayKHR corresponding to the pname:connectorId on
-the pname:physicalDevice, the returning pname:display must be set to
-dlink:VK_NULL_HANDLE.
-The provided pname:drmFd must correspond to the one owned by the
-pname:physicalDevice.
-If not, the error code ename:VK_ERROR_UNKNOWN must be returned.
-Master permissions are not required, because the file descriptor is just
-used for information gathering purposes.
-The given pname:connectorId must be a resource owned by the provided
-pname:drmFd.
-If not, the error code ename:VK_ERROR_UNKNOWN must be returned.
-If any error is encountered during the identification of the display, the
-call must return the error code ename:VK_ERROR_INITIALIZATION_FAILED.
-
-include::{generated}/validity/protos/vkGetDrmDisplayEXT.txt[]
---
diff --git a/registry/vulkan/chapters/VK_EXT_acquire_xlib_display/acquire_xlib_display.txt b/registry/vulkan/chapters/VK_EXT_acquire_xlib_display/acquire_xlib_display.txt
deleted file mode 100644
index 535547e..0000000
--- a/registry/vulkan/chapters/VK_EXT_acquire_xlib_display/acquire_xlib_display.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='vkAcquireXlibDisplayEXT',desc='Acquire access to a VkDisplayKHR using Xlib',type='protos']
---
-To acquire permission to directly access a display in Vulkan from an X11
-server, call:
-
-include::{generated}/api/protos/vkAcquireXlibDisplayEXT.txt[]
-
-  * pname:physicalDevice The physical device the display is on.
-  * pname:dpy A connection to the X11 server that currently owns
-    pname:display.
-  * pname:display The display the caller wishes to control in Vulkan.
-
-All permissions necessary to control the display are granted to the Vulkan
-instance associated with pname:physicalDevice until the display is released
-or the X11 connection specified by pname:dpy is terminated.
-Permission to access the display may: be temporarily revoked during periods
-when the X11 server from which control was acquired itself loses access to
-pname:display.
-During such periods, operations which require access to the display must:
-fail with an approriate error code.
-If the X11 server associated with pname:dpy does not own pname:display, or
-if permission to access it has already been acquired by another entity, the
-call must: return the error code ename:VK_ERROR_INITIALIZATION_FAILED.
-
-[NOTE]
-.Note
-====
-One example of when an X11 server loses access to a display is when it loses
-ownership of its virtual terminal.
-====
-
-include::{generated}/validity/protos/vkAcquireXlibDisplayEXT.txt[]
---
-
-[open,refpage='vkGetRandROutputDisplayEXT',desc='Query the VkDisplayKHR corresponding to an X11 RandR Output',type='protos']
---
-When acquiring displays from an X11 server, an application may also wish to
-enumerate and identify them using a native handle rather than a
-sname:VkDisplayKHR handle.
-To determine the sname:VkDisplayKHR handle corresponding to an X11 RandR
-Output, call:
-
-include::{generated}/api/protos/vkGetRandROutputDisplayEXT.txt[]
-
-  * pname:physicalDevice The physical device to query the display handle on.
-  * pname:dpy A connection to the X11 server from which pname:rrOutput was
-    queried.
-  * pname:rrOutput An X11 RandR output ID.
-  * pname:pDisplay The corresponding slink:VkDisplayKHR handle will be
-    returned here.
-
-If there is no slink:VkDisplayKHR corresponding to pname:rrOutput on
-pname:physicalDevice, dlink:VK_NULL_HANDLE must: be returned in
-pname:pDisplay.
-
-include::{generated}/validity/protos/vkGetRandROutputDisplayEXT.txt[]
---
diff --git a/registry/vulkan/chapters/VK_EXT_blend_operation_advanced/advanced_blend.txt b/registry/vulkan/chapters/VK_EXT_blend_operation_advanced/advanced_blend.txt
deleted file mode 100644
index 9182914..0000000
--- a/registry/vulkan/chapters/VK_EXT_blend_operation_advanced/advanced_blend.txt
+++ /dev/null
@@ -1,819 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[framebuffer-blend-advanced]]
-=== Advanced Blend Operations
-
-The _advanced blend operations_ are those listed in tables
-<<framebuffer-blend-advanced-fxyz-modes,f/X/Y/Z Advanced Blend Operations>>,
-<<framebuffer-blend-advanced-hsl-modes,Hue-Saturation-Luminosity Advanced
-Blend Operations>>, and
-<<framebuffer-blend-advanced-additional-rgb,Additional RGB Blend
-Operations>>.
-
-[open,refpage='VkPipelineColorBlendAdvancedStateCreateInfoEXT',desc='Structure specifying parameters that affect advanced blend operations',type='structs']
---
-If the pname:pNext chain of slink:VkPipelineColorBlendStateCreateInfo
-includes a sname:VkPipelineColorBlendAdvancedStateCreateInfoEXT structure,
-then that structure includes parameters that affect advanced blend
-operations.
-
-The sname:VkPipelineColorBlendAdvancedStateCreateInfoEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPipelineColorBlendAdvancedStateCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcPremultiplied specifies whether the source color of the blend
-    operation is treated as premultiplied.
-  * pname:dstPremultiplied specifies whether the destination color of the
-    blend operation is treated as premultiplied.
-  * pname:blendOverlap is a elink:VkBlendOverlapEXT value specifying how the
-    source and destination sample's coverage is correlated.
-
-If this structure is not present, pname:srcPremultiplied and
-pname:dstPremultiplied are both considered to be ename:VK_TRUE, and
-pname:blendOverlap is considered to be
-ename:VK_BLEND_OVERLAP_UNCORRELATED_EXT.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-srcPremultiplied-01424]]
-    If the <<limits-advancedBlendNonPremultipliedSrcColor,non-premultiplied
-    source color>> property is not supported, pname:srcPremultiplied must:
-    be ename:VK_TRUE
-  * [[VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-dstPremultiplied-01425]]
-    If the <<limits-advancedBlendNonPremultipliedDstColor,non-premultiplied
-    destination color>> property is not supported, pname:dstPremultiplied
-    must: be ename:VK_TRUE
-  * [[VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-01426]]
-    If the <<limits-advancedBlendCorrelatedOverlap,correlated overlap>>
-    property is not supported, pname:blendOverlap must: be
-    ename:VK_BLEND_OVERLAP_UNCORRELATED_EXT
-****
-
-include::{generated}/validity/structs/VkPipelineColorBlendAdvancedStateCreateInfoEXT.txt[]
---
-
-When using one of the operations in table
-<<framebuffer-blend-advanced-fxyz-modes,f/X/Y/Z Advanced Blend Operations>>
-or <<framebuffer-blend-advanced-hsl-modes,Hue-Saturation-Luminosity Advanced
-Blend Operations>>, blending is performed according to the following
-equations:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-  R & = & f(R_s',R_d')*p_0(A_s,A_d) & + & Y*R_s'*p_1(A_s,A_d) & + & Z*R_d'*p_2(A_s,A_d) \\
-  G & = & f(G_s',G_d')*p_0(A_s,A_d) & + & Y*G_s'*p_1(A_s,A_d) & + & Z*G_d'*p_2(A_s,A_d) \\
-  B & = & f(B_s',B_d')*p_0(A_s,A_d) & + & Y*B_s'*p_1(A_s,A_d) & + & Z*B_d'*p_2(A_s,A_d) \\
-  A & = &            X*p_0(A_s,A_d) & + &      Y*p_1(A_s,A_d) & + &      Z*p_2(A_s,A_d)
-\end{aligned}
-+++++++++++++++++++
-
-where the function f and terms X, Y, and Z are specified in the table.
-The R, G, and B components of the source color used for blending are derived
-according to pname:srcPremultiplied.
-If pname:srcPremultiplied is set to ename:VK_TRUE, the fragment color
-components are considered to have been premultiplied by the A component
-prior to blending.
-The base source color [eq]#(R~s~',G~s~',B~s~')# is obtained by dividing
-through by the A component:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-  (R_s', G_s', B_s') & =
-  \begin{cases}
-    (0, 0, 0)                    & A_s = 0 \\
-    (\frac{R_s}{A_s}, \frac{G_s}{A_s}, \frac{B_s}{A_s})  & \text{otherwise}
-  \end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-If pname:srcPremultiplied is ename:VK_FALSE, the fragment color components
-are used as the base color:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-  (R_s', G_s', B_s') & = (R_s, G_s, B_s)
-\end{aligned}
-+++++++++++++++++++
-
-The R, G, and B components of the destination color used for blending are
-derived according to pname:dstPremultiplied.
-If pname:dstPremultiplied is set to ename:VK_TRUE, the destination
-components are considered to have been premultiplied by the A component
-prior to blending.
-The base destination color [eq]#(R~d~',G~d~',B~d~')# is obtained by dividing
-through by the A component:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-  (R_d', G_d', B_d') & =
-  \begin{cases}
-    (0, 0, 0)                    & A_d = 0 \\
-    (\frac{R_d}{A_d}, \frac{G_d}{A_d}, \frac{B_d}{A_d})  & \text{otherwise}
-  \end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-If pname:dstPremultiplied is ename:VK_FALSE, the destination color
-components are used as the base color:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-  (R_d', G_d', B_d') & = (R_d, G_d, B_d)
-\end{aligned}
-+++++++++++++++++++
-
-When blending using advanced blend operations, we expect that the R, G, and
-B components of premultiplied source and destination color inputs be stored
-as the product of non-premultiplied R, G, and B component values and the A
-component of the color.
-If any R, G, or B component of a premultiplied input color is non-zero and
-the A component is zero, the color is considered ill-formed, and the
-corresponding component of the blend result is undefined:.
-
-All of the advanced blend operation formulas in this chapter compute the
-result as a premultiplied color.
-If pname:dstPremultiplied is ename:VK_FALSE, that result color's R, G, and B
-components are divided by the A component before being written to the
-framebuffer.
-If any R, G, or B component of the color is non-zero and the A component is
-zero, the result is considered ill-formed, and the corresponding component
-of the blend result is undefined:.
-If all components are zero, that value is unchanged.
-
-If the A component of any input or result color is less than zero, the color
-is considered ill-formed, and all components of the blend result are
-undefined:.
-
-[open,refpage='VkBlendOverlapEXT',desc='Enumerant specifying the blend overlap parameter',type='enums']
---
-The weighting functions [eq]#p~0~#, [eq]#p~1~#, and [eq]#p~2~# are defined
-in table <<framebuffer-blend-advanced-overlap-modes,Advanced Blend Overlap
-Modes>>.
-In these functions, the A components of the source and destination colors
-are taken to indicate the portion of the pixel covered by the fragment
-(source) and the fragments previously accumulated in the pixel
-(destination).
-The functions [eq]#p~0~#, [eq]#p~1~#, and [eq]#p~2~# approximate the
-relative portion of the pixel covered by the intersection of the source and
-destination, covered only by the source, and covered only by the
-destination, respectively.
-
-Possible values of
-slink:VkPipelineColorBlendAdvancedStateCreateInfoEXT::pname:blendOverlap,
-specifying the blend overlap functions, are:
-
-include::{generated}/api/enums/VkBlendOverlapEXT.txt[]
-
-  * ename:VK_BLEND_OVERLAP_UNCORRELATED_EXT specifies that there is no
-    correlation between the source and destination coverage.
-  * ename:VK_BLEND_OVERLAP_CONJOINT_EXT specifies that the source and
-    destination coverage are considered to have maximal overlap.
-  * ename:VK_BLEND_OVERLAP_DISJOINT_EXT specifies that the source and
-    destination coverage are considered to have minimal overlap.
-
-[[framebuffer-blend-advanced-overlap-modes]]
-.Advanced Blend Overlap Modes
-[width="80%",options="header"]
-|====
-| Overlap Mode                              | Weighting Equations
-| ename:VK_BLEND_OVERLAP_UNCORRELATED_EXT  a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                p_0(A_s,A_d) & = A_sA_d \\
-                                                p_1(A_s,A_d) & = A_s(1-A_d) \\
-                                                p_2(A_s,A_d) & = A_d(1-A_s) \\
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OVERLAP_CONJOINT_EXT      a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                p_0(A_s,A_d) & = min(A_s,A_d) \\
-                                                p_1(A_s,A_d) & = max(A_s-A_d,0) \\
-                                                p_2(A_s,A_d) & = max(A_d-A_s,0) \\
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-| ename:VK_BLEND_OVERLAP_DISJOINT_EXT      a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                p_0(A_s,A_d) & = max(A_s+A_d-1,0) \\
-                                                p_1(A_s,A_d) & = min(A_s,1-A_d) \\
-                                                p_2(A_s,A_d) & = min(A_d,1-A_s) \\
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-|====
---
-
-[[framebuffer-blend-advanced-fxyz-modes]]
-.f/X/Y/Z Advanced Blend Operations
-[width="80%",options="header"]
-|====
-| Mode                                      | Blend Coefficients
-| ename:VK_BLEND_OP_ZERO_EXT               a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (0,0,0) \\
-                                                f(C_s,C_d) & = 0
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-
-| ename:VK_BLEND_OP_SRC_EXT                a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,0) \\
-                                                f(C_s,C_d) & = C_s
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_DST_EXT                a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,0,1) \\
-                                                f(C_s,C_d) & = C_d
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_SRC_OVER_EXT           a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & = C_s
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_DST_OVER_EXT           a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & = C_d
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_SRC_IN_EXT             a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,0,0) \\
-                                                f(C_s,C_d) & = C_s
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_DST_IN_EXT             a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,0,0) \\
-                                                f(C_s,C_d) & = C_d
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_SRC_OUT_EXT            a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (0,1,0) \\
-                                                f(C_s,C_d) & = 0
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_DST_OUT_EXT            a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (0,0,1) \\
-                                                f(C_s,C_d) & = 0
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_SRC_ATOP_EXT           a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,0,1) \\
-                                                f(C_s,C_d) & = C_s
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_DST_ATOP_EXT           a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,0) \\
-                                                f(C_s,C_d) & = C_d
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_XOR_EXT                a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (0,1,1) \\
-                                                f(C_s,C_d) & = 0
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_MULTIPLY_EXT           a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & = C_sC_d
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_SCREEN_EXT             a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & = C_s+C_d-C_sC_d
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-
-| ename:VK_BLEND_OP_OVERLAY_EXT            a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & =
-                                                \begin{cases}
-                                                    2 C_sC_d            & C_d \leq 0.5 \\
-                                                    1-2 (1-C_s)(1-C_d)  & \text{otherwise}
-                                                \end{cases}
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_DARKEN_EXT             a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & = min(C_s,C_d)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_LIGHTEN_EXT            a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & = max(C_s,C_d)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_COLORDODGE_EXT         a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & =
-                                                \begin{cases}
-                                                  0                         & C_d \leq 0 \\
-                                                  min(1,\frac{C_d}{1-C_s})  & C_d \gt 0 \text{ and } C_s \lt 1 \\
-                                                  1                         & C_d \gt 0 \text{ and } C_s \geq 1
-                                                \end{cases}
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_COLORBURN_EXT          a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & =
-                                                \begin{cases}
-                                                  1                             & C_d \geq 1 \\
-                                                  1 - min(1,\frac{1-C_d}{C_s})  & C_d \lt 1 \text{ and } C_s \gt 0 \\
-                                                  0                             & C_d \lt 1 \text{ and } C_s \leq 0
-                                                \end{cases}
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_HARDLIGHT_EXT          a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & =
-                                                \begin{cases}
-                                                    2 C_sC_d            & C_s \leq 0.5 \\
-                                                    1-2 (1-C_s)(1-C_d)  & \text{otherwise}
-                                                \end{cases}
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_SOFTLIGHT_EXT          a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & =
-                                                \begin{cases}
-                                                  C_d-(1-2 C_s)C_d(1-C_d)               & C_s \leq 0.5 \\
-                                                  C_d+(2 C_s-1)C_d((16 C_d-12)C_d+3)    & C_s \gt 0.5 \text{ and } C_d \leq 0.25 \\
-                                                  C_d+(2 C_s-1)(\sqrt{C_d}-C_d)         & C_s \gt 0.5 \text{ and } C_d \gt 0.25
-                                                \end{cases}
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_DIFFERENCE_EXT         a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & = \lvert C_d-C_s \rvert
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_EXCLUSION_EXT          a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & = C_s+C_d-2C_sC_d
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_INVERT_EXT             a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,0,1) \\
-                                                f(C_s,C_d) & = 1-C_d
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_INVERT_RGB_EXT         a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,0,1) \\
-                                                f(C_s,C_d) & = C_s(1-C_d)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_LINEARDODGE_EXT        a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & =
-                                                \begin{cases}
-                                                  C_s+C_d           & C_s+C_d \leq 1 \\
-                                                  1                 & \text{otherwise}
-                                                \end{cases}
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_LINEARBURN_EXT         a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & =
-                                                \begin{cases}
-                                                  C_s+C_d-1         & C_s+C_d \gt 1 \\
-                                                  0                 & \text{otherwise}
-                                                \end{cases}
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_VIVIDLIGHT_EXT         a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & =
-                                                \begin{cases}
-                                                  1-min(1,\frac{1-C_d}{2C_s})   & 0  \lt  C_s  \lt  0.5 \\
-                                                  0                             & C_s  \leq  0 \\
-                                                  min(1,\frac{C_d}{2(1-C_s)})   & 0.5  \leq  C_s  \lt  1 \\
-                                                  1                             & C_s  \geq  1
-                                                \end{cases}
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_LINEARLIGHT_EXT        a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & =
-                                                \begin{cases}
-                                                  1                         & 2C_s+C_d \gt 2 \\
-                                                  2C_s+C_d-1                & 1  \lt  2C_s+C_d  \leq  2 \\
-                                                  0                         & 2C_s+C_d \leq 1
-                                                \end{cases}
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_PINLIGHT_EXT           a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & =
-                                                \begin{cases}
-                                                  0                         & 2C_s-1 \gt C_d \text{ and } C_s \lt 0.5 \\
-                                                  2C_s-1                    & 2C_s-1 \gt C_d \text{ and } C_s \geq 0.5 \\
-                                                  2C_s                      & 2C_s-1 \leq C_d \text{ and } C_s \lt 0.5C_d \\
-                                                  C_d                       & 2C_s-1 \leq C_d \text{ and } C_s \geq 0.5C_d
-                                                \end{cases}
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_HARDMIX_EXT            a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & =
-                                                \begin{cases}
-                                                  0             & C_s+C_d \lt 1 \\
-                                                  1             & \text{otherwise}
-                                                \end{cases}
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-|====
-
-
-When using one of the HSL blend operations in table
-<<framebuffer-blend-advanced-hsl-modes,Hue-Saturation-Luminosity Advanced
-Blend Operations>> as the blend operation, the RGB color components produced
-by the function f are effectively obtained by converting both the
-non-premultiplied source and destination colors to the HSL (hue, saturation,
-luminosity) color space, generating a new HSL color by selecting H, S, and L
-components from the source or destination according to the blend operation,
-and then converting the result back to RGB.
-In the equations below, a blended RGB color is produced according to the
-following pseudocode:
-
-[source,c++]
-----------------------------------------
-  float minv3(vec3 c) {
-    return min(min(c.r, c.g), c.b);
-  }
-  float maxv3(vec3 c) {
-    return max(max(c.r, c.g), c.b);
-  }
-  float lumv3(vec3 c) {
-    return dot(c, vec3(0.30, 0.59, 0.11));
-  }
-  float satv3(vec3 c) {
-    return maxv3(c) - minv3(c);
-  }
-
-  // If any color components are outside [0,1], adjust the color to
-  // get the components in range.
-  vec3 ClipColor(vec3 color) {
-    float lum = lumv3(color);
-    float mincol = minv3(color);
-    float maxcol = maxv3(color);
-    if (mincol < 0.0) {
-      color = lum + ((color-lum)*lum) / (lum-mincol);
-    }
-    if (maxcol > 1.0) {
-      color = lum + ((color-lum)*(1-lum)) / (maxcol-lum);
-    }
-    return color;
-  }
-
-  // Take the base RGB color <cbase> and override its luminosity
-  // with that of the RGB color <clum>.
-  vec3 SetLum(vec3 cbase, vec3 clum) {
-    float lbase = lumv3(cbase);
-    float llum = lumv3(clum);
-    float ldiff = llum - lbase;
-    vec3 color = cbase + vec3(ldiff);
-    return ClipColor(color);
-  }
-
-  // Take the base RGB color <cbase> and override its saturation with
-  // that of the RGB color <csat>.  The override the luminosity of the
-  // result with that of the RGB color <clum>.
-  vec3 SetLumSat(vec3 cbase, vec3 csat, vec3 clum)
-  {
-    float minbase = minv3(cbase);
-    float sbase = satv3(cbase);
-    float ssat = satv3(csat);
-    vec3 color;
-    if (sbase > 0) {
-      // Equivalent (modulo rounding errors) to setting the
-      // smallest (R,G,B) component to 0, the largest to <ssat>,
-      // and interpolating the "middle" component based on its
-      // original value relative to the smallest/largest.
-      color = (cbase - minbase) * ssat / sbase;
-    } else {
-      color = vec3(0.0);
-    }
-    return SetLum(color, clum);
-  }
-----------------------------------------
-
-[[framebuffer-blend-advanced-hsl-modes]]
-.Hue-Saturation-Luminosity Advanced Blend Operations
-[width="80%",options="header"]
-|====
-| Mode                                      | Result
-| ename:VK_BLEND_OP_HSL_HUE_EXT            a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & = SetLumSat(C_s,C_d,C_d)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_HSL_SATURATION_EXT     a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & = SetLumSat(C_d,C_s,C_d)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_HSL_COLOR_EXT          a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & = SetLum(C_s,C_d)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_HSL_LUMINOSITY_EXT     a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (X,Y,Z) & = (1,1,1) \\
-                                                f(C_s,C_d) & = SetLum(C_d,C_s)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-|====
-
-
-When using one of the operations in table
-<<framebuffer-blend-advanced-additional-rgb,Additional RGB Blend
-Operations>> as the blend operation, the source and destination colors used
-by these blending operations are interpreted according to
-pname:srcPremultiplied and pname:dstPremultiplied.
-The blending operations below are evaluated where the RGB source and
-destination color components are both considered to have been premultiplied
-by the corresponding A component.
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-  (R_s', G_s', B_s') & =
-  \begin{cases}
-    (R_s, G_s, B_s)                     & \text{if srcPremultiplied is VK\_TRUE} \\
-    (R_sA_s, G_sA_s, B_sA_s)            & \text{if srcPremultiplied is VK\_FALSE}
-  \end{cases} \\
-  (R_d', G_d', B_d') & =
-  \begin{cases}
-    (R_d, G_d, B_d)                     & \text{if dstPremultiplied is VK\_TRUE} \\
-    (R_dA_d, G_dA_d, B_dA_d)            & \text{if dstPremultiplied is VK\_FALSE}
-  \end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-[[framebuffer-blend-advanced-additional-rgb]]
-.Additional RGB Blend Operations
-[width="80%",options="header"]
-|====
-| Mode                                      | Result
-| ename:VK_BLEND_OP_PLUS_EXT               a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (R,G,B,A) = ( & R_s'+R_d', \\
-                                                              & G_s'+G_d', \\
-                                                              & B_s'+B_d', \\
-                                                              & A_s+A_d)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_PLUS_CLAMPED_EXT       a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (R,G,B,A) = ( & min(1,R_s'+R_d'), \\
-                                                              & min(1,G_s'+G_d'), \\
-                                                              & min(1,B_s'+B_d'), \\
-                                                              & min(1,A_s+A_d))
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (R,G,B,A) = ( & min(min(1,A_s+A_d),R_s'+R_d'), \\
-                                                              & min(min(1,A_s+A_d),G_s'+G_d'), \\
-                                                              & min(min(1,A_s+A_d),B_s'+B_d'), \\
-                                                              & min(1,A_s+A_d))
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_PLUS_DARKER_EXT        a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (R,G,B,A) = ( & max(0,min(1,A_s+A_d)-((A_s-R_s')+(A_d-R_d'))), \\
-                                                              & max(0,min(1,A_s+A_d)-((A_s-G_s')+(A_d-G_d'))), \\
-                                                              & max(0,min(1,A_s+A_d)-((A_s-B_s')+(A_d-B_d'))), \\
-                                                              & min(1,A_s+A_d))
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_MINUS_EXT              a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (R,G,B,A) = ( & R_d'-R_s', \\
-                                                              & G_d'-G_s', \\
-                                                              & B_d'-B_s', \\
-                                                              & A_d-A_s)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_MINUS_CLAMPED_EXT      a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (R,G,B,A) = ( & max(0,R_d'-R_s'), \\
-                                                              & max(0,G_d'-G_s'), \\
-                                                              & max(0,B_d'-B_s'), \\
-                                                              & max(0,A_d-A_s))
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_CONTRAST_EXT           a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (R,G,B,A) = ( & \frac{A_d}{2} + 2(R_d'-\frac{A_d}{2})(R_s'-\frac{A_s}{2}), \\
-                                                              & \frac{A_d}{2} + 2(G_d'-\frac{A_d}{2})(G_s'-\frac{A_s}{2}), \\
-                                                              & \frac{A_d}{2} + 2(B_d'-\frac{A_d}{2})(B_s'-\frac{A_s}{2}), \\
-                                                              & A_d)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_INVERT_OVG_EXT         a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (R,G,B,A) = ( & A_s(1-R_d') + (1-A_s)R_d', \\
-                                                              & A_s(1-G_d') + (1-A_s)G_d', \\
-                                                              & A_s(1-B_d') + (1-A_s)B_d', \\
-                                                              & A_s+A_d-A_sA_d)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_RED_EXT                a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (R,G,B,A) & = (R_s', G_d', B_d', A_d)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_GREEN_EXT              a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (R,G,B,A) & = (R_d', G_s', B_d', A_d)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-| ename:VK_BLEND_OP_BLUE_EXT               a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                (R,G,B,A) & = (R_d', G_d', B_s', A_d)
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-|====
diff --git a/registry/vulkan/chapters/VK_EXT_debug_marker.txt b/registry/vulkan/chapters/VK_EXT_debug_marker.txt
deleted file mode 100644
index 105da2c..0000000
--- a/registry/vulkan/chapters/VK_EXT_debug_marker.txt
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// This section is included inside the Debugging chapter (debugging.txt)
-
-[[debugging-debug-markers]]
-== Debug Markers
-
-Debug markers provide a flexible way for debugging and validation layers to
-receive annotation and debug information.
-
-The <<debugging-object-annotation,Object Annotation>> section describes how
-to associate a name or binary data with a Vulkan object.
-
-The <<debugging-command-buffer-markers,Command Buffer Markers>> section
-describes how to associate logical elements of the scene with commands in
-the command buffer.
-
-
-[[debugging-object-annotation]]
-=== Object Annotation
-
-The commands in this section allow application developers to associate
-user-defined information with Vulkan objects at will.
-
-[open,refpage='vkDebugMarkerSetObjectNameEXT',desc='Give a user-friendly name to an object',type='protos']
---
-An object can be given a user-friendly name by calling:
-
-include::{generated}/api/protos/vkDebugMarkerSetObjectNameEXT.txt[]
-
-  * pname:device is the device that created the object.
-  * pname:pNameInfo is a pointer to a slink:VkDebugMarkerObjectNameInfoEXT
-    structure specifying the parameters of the name to set on the object.
-
-include::{generated}/validity/protos/vkDebugMarkerSetObjectNameEXT.txt[]
---
-
-[open,refpage='VkDebugMarkerObjectNameInfoEXT',desc='Specify parameters of a name to give to an object',type='structs']
---
-The sname:VkDebugMarkerObjectNameInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkDebugMarkerObjectNameInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:objectType is a elink:VkDebugReportObjectTypeEXT specifying the
-    type of the object to be named.
-  * pname:object is the object to be named.
-  * pname:pObjectName is a null-terminated UTF-8 string specifying the name
-    to apply to pname:object.
-
-Applications may: change the name associated with an object simply by
-calling fname:vkDebugMarkerSetObjectNameEXT again with a new string.
-To remove a previously set name, pname:pObjectName should: be set to an
-empty string.
-
-.Valid Usage
-****
-  * [[VUID-VkDebugMarkerObjectNameInfoEXT-objectType-01490]]
-    pname:objectType must: not be
-    ename:VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT
-  * [[VUID-VkDebugMarkerObjectNameInfoEXT-object-01491]]
-    pname:object must: not be dlink:VK_NULL_HANDLE
-  * [[VUID-VkDebugMarkerObjectNameInfoEXT-object-01492]]
-    pname:object must: be a Vulkan object of the type associated with
-    pname:objectType as defined in <<debug-report-object-types>>
-****
-
-include::{generated}/validity/structs/VkDebugMarkerObjectNameInfoEXT.txt[]
---
-
-[open,refpage='vkDebugMarkerSetObjectTagEXT',desc='Attach arbitrary data to an object',type='protos']
---
-In addition to setting a name for an object, debugging and validation layers
-may have uses for additional binary data on a per-object basis that has no
-other place in the Vulkan API.
-For example, a sname:VkShaderModule could have additional debugging data
-attached to it to aid in offline shader tracing.
-To attach data to an object, call:
-
-include::{generated}/api/protos/vkDebugMarkerSetObjectTagEXT.txt[]
-
-  * pname:device is the device that created the object.
-  * pname:pTagInfo is a pointer to a slink:VkDebugMarkerObjectTagInfoEXT
-    structure specifying the parameters of the tag to attach to the object.
-
-include::{generated}/validity/protos/vkDebugMarkerSetObjectTagEXT.txt[]
---
-
-[open,refpage='VkDebugMarkerObjectTagInfoEXT',desc='Specify parameters of a tag to attach to an object',type='structs']
---
-The sname:VkDebugMarkerObjectTagInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkDebugMarkerObjectTagInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:objectType is a elink:VkDebugReportObjectTypeEXT specifying the
-    type of the object to be named.
-  * pname:object is the object to be tagged.
-  * pname:tagName is a numerical identifier of the tag.
-  * pname:tagSize is the number of bytes of data to attach to the object.
-  * pname:pTag is a pointer to an array of pname:tagSize bytes containing
-    the data to be associated with the object.
-
-The pname:tagName parameter gives a name or identifier to the type of data
-being tagged.
-This can be used by debugging layers to easily filter for only data that can
-be used by that implementation.
-
-.Valid Usage
-****
-  * [[VUID-VkDebugMarkerObjectTagInfoEXT-objectType-01493]]
-    pname:objectType must: not be
-    ename:VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT
-  * [[VUID-VkDebugMarkerObjectTagInfoEXT-object-01494]]
-    pname:object must: not be dlink:VK_NULL_HANDLE
-  * [[VUID-VkDebugMarkerObjectTagInfoEXT-object-01495]]
-    pname:object must: be a Vulkan object of the type associated with
-    pname:objectType as defined in <<debug-report-object-types>>
-****
-
-include::{generated}/validity/structs/VkDebugMarkerObjectTagInfoEXT.txt[]
---
-
-
-[[debugging-command-buffer-markers]]
-=== Command Buffer Markers
-
-Typical Vulkan applications will submit many command buffers in each frame,
-with each command buffer containing a large number of individual commands.
-Being able to logically annotate regions of command buffers that belong
-together as well as hierarchically subdivide the frame is important to a
-developer's ability to navigate the commands viewed holistically.
-
-The marker commands fname:vkCmdDebugMarkerBeginEXT and
-fname:vkCmdDebugMarkerEndEXT define regions of a series of commands that are
-grouped together, and they can be nested to create a hierarchy.
-The fname:vkCmdDebugMarkerInsertEXT command allows insertion of a single
-label within a command buffer.
-
-[open,refpage='vkCmdDebugMarkerBeginEXT',desc='Open a command buffer marker region',type='protos']
---
-A marker region can be opened by calling:
-
-include::{generated}/api/protos/vkCmdDebugMarkerBeginEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:pMarkerInfo is a pointer to a slink:VkDebugMarkerMarkerInfoEXT
-    structure specifying the parameters of the marker region to open.
-
-include::{generated}/validity/protos/vkCmdDebugMarkerBeginEXT.txt[]
---
-
-[open,refpage='VkDebugMarkerMarkerInfoEXT',desc='Specify parameters of a command buffer marker region',type='structs']
---
-The sname:VkDebugMarkerMarkerInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkDebugMarkerMarkerInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pMarkerName is a pointer to a null-terminated UTF-8 string
-    containing the name of the marker.
-  * pname:color is an optional: RGBA color value that can be associated with
-    the marker.
-    A particular implementation may: choose to ignore this color value.
-    The values contain RGBA values in order, in the range 0.0 to 1.0.
-    If all elements in pname:color are set to 0.0 then it is ignored.
-
-include::{generated}/validity/structs/VkDebugMarkerMarkerInfoEXT.txt[]
---
-
-[open,refpage='vkCmdDebugMarkerEndEXT',desc='Close a command buffer marker region',type='protos']
---
-A marker region can be closed by calling:
-
-include::{generated}/api/protos/vkCmdDebugMarkerEndEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-
-An application may: open a marker region in one command buffer and close it
-in another, or otherwise split marker regions across multiple command
-buffers or multiple queue submissions.
-When viewed from the linear series of submissions to a single queue, the
-calls to fname:vkCmdDebugMarkerBeginEXT and fname:vkCmdDebugMarkerEndEXT
-must: be matched and balanced.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01239]]
-    There must: be an outstanding flink:vkCmdDebugMarkerBeginEXT command
-    prior to the fname:vkCmdDebugMarkerEndEXT on the queue that
-    pname:commandBuffer is submitted to
-  * [[VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01240]]
-    If pname:commandBuffer is a secondary command buffer, there must: be an
-    outstanding flink:vkCmdDebugMarkerBeginEXT command recorded to
-    pname:commandBuffer that has not previously been ended by a call to
-    flink:vkCmdDebugMarkerEndEXT
-****
-
-include::{generated}/validity/protos/vkCmdDebugMarkerEndEXT.txt[]
---
-
-[open,refpage='vkCmdDebugMarkerInsertEXT',desc='Insert a marker label into a command buffer',type='protos']
---
-A single marker label can be inserted into a command buffer by calling:
-
-include::{generated}/api/protos/vkCmdDebugMarkerInsertEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:pMarkerInfo is a pointer to a slink:VkDebugMarkerMarkerInfoEXT
-    structure specifying the parameters of the marker to insert.
-
-include::{generated}/validity/protos/vkCmdDebugMarkerInsertEXT.txt[]
---
diff --git a/registry/vulkan/chapters/VK_EXT_debug_report.txt b/registry/vulkan/chapters/VK_EXT_debug_report.txt
deleted file mode 100644
index 7d507dc..0000000
--- a/registry/vulkan/chapters/VK_EXT_debug_report.txt
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// This section is included inside the Debugging chapter (debugging.txt)
-
-[[debugging-debug-report-callbacks]]
-== Debug Report Callbacks
-
-[open,refpage='VkDebugReportCallbackEXT',desc='Opaque handle to a debug report callback object',type='handles']
---
-Debug report callbacks are represented by sname:VkDebugReportCallbackEXT
-handles:
-
-include::{generated}/api/handles/VkDebugReportCallbackEXT.txt[]
---
-
-[open,refpage='vkCreateDebugReportCallbackEXT',desc='Create a debug report callback object',type='protos']
---
-Debug report callbacks give more detailed feedback on the application's use
-of Vulkan when events of interest occur.
-
-To register a debug report callback, an application uses
-flink:vkCreateDebugReportCallbackEXT.
-
-include::{generated}/api/protos/vkCreateDebugReportCallbackEXT.txt[]
-
-  * pname:instance is the instance the callback will be logged on.
-  * pname:pCreateInfo is a pointer to a
-    slink:VkDebugReportCallbackCreateInfoEXT structure defining the
-    conditions under which this callback will be called.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pCallback is a pointer to a slink:VkDebugReportCallbackEXT handle
-    in which the created object is returned.
-
-include::{generated}/validity/protos/vkCreateDebugReportCallbackEXT.txt[]
---
-
-[open,refpage='VkDebugReportCallbackCreateInfoEXT',desc='Structure specifying parameters of a newly created debug report callback',type='structs']
---
-The definition of slink:VkDebugReportCallbackCreateInfoEXT is:
-
-include::{generated}/api/structs/VkDebugReportCallbackCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkDebugReportFlagBitsEXT specifying
-    which event(s) will cause this callback to be called.
-  * pname:pfnCallback is the application callback function to call.
-  * pname:pUserData is user data to be passed to the callback.
-
-For each sname:VkDebugReportCallbackEXT that is created the
-sname:VkDebugReportCallbackCreateInfoEXT::pname:flags determine when that
-sname:VkDebugReportCallbackCreateInfoEXT::pname:pfnCallback is called.
-When an event happens, the implementation will do a bitwise AND of the
-event's elink:VkDebugReportFlagBitsEXT flags to each
-sname:VkDebugReportCallbackEXT object's flags.
-For each non-zero result the corresponding callback will be called.
-The callback will come directly from the component that detected the event,
-unless some other layer intercepts the calls for its own purposes (filter
-them in a different way, log to a system error log, etc.).
-
-An application may: receive multiple callbacks if multiple
-sname:VkDebugReportCallbackEXT objects were created.
-A callback will always be executed in the same thread as the originating
-Vulkan call.
-
-A callback may be called from multiple threads simultaneously (if the
-application is making Vulkan calls from multiple threads).
-
-include::{generated}/validity/structs/VkDebugReportCallbackCreateInfoEXT.txt[]
---
-
-[open,refpage='VkDebugReportFlagBitsEXT',desc='Bitmask specifying events which cause a debug report callback',type='enums']
---
-Bits which can: be set in
-slink:VkDebugReportCallbackCreateInfoEXT::pname:flags, specifying events
-which cause a debug report, are:
-
-include::{generated}/api/enums/VkDebugReportFlagBitsEXT.txt[]
-
-  * ename:VK_DEBUG_REPORT_ERROR_BIT_EXT specifies that the application has
-    violated a valid usage condition of the specification.
-  * ename:VK_DEBUG_REPORT_WARNING_BIT_EXT specifies use of Vulkan that may:
-    expose an app bug.
-    Such cases may not be immediately harmful, such as a fragment shader
-    outputting to a location with no attachment.
-    Other cases may: point to behavior that is almost certainly bad when
-    unintended such as using an image whose memory has not been filled.
-    In general if you see a warning but you know that the behavior is
-    intended/desired, then simply ignore the warning.
-  * ename:VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT specifies a
-    potentially non-optimal use of Vulkan, e.g. using
-    flink:vkCmdClearColorImage when setting
-    slink:VkAttachmentDescription::pname:loadOp to
-    ename:VK_ATTACHMENT_LOAD_OP_CLEAR would have worked.
-  * ename:VK_DEBUG_REPORT_INFORMATION_BIT_EXT specifies an informational
-    message such as resource details that may be handy when debugging an
-    application.
-  * ename:VK_DEBUG_REPORT_DEBUG_BIT_EXT specifies diagnostic information
-    from the implementation and layers.
---
-
-[open,refpage='VkDebugReportFlagsEXT',desc='Bitmask of VkDebugReportFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkDebugReportFlagsEXT.txt[]
-
-tname:VkDebugReportFlagsEXT is a bitmask type for setting a mask of zero or
-more elink:VkDebugReportFlagBitsEXT.
---
-
-[open,refpage='PFN_vkDebugReportCallbackEXT',desc='Application-defined debug report callback function',type='funcpointers']
---
-The prototype for the
-slink:VkDebugReportCallbackCreateInfoEXT::pname:pfnCallback function
-implemented by the application is:
-
-include::{generated}/api/funcpointers/PFN_vkDebugReportCallbackEXT.txt[]
-
-  * pname:flags specifies the elink:VkDebugReportFlagBitsEXT that triggered
-    this callback.
-  * pname:objectType is a elink:VkDebugReportObjectTypeEXT value specifying
-    the type of object being used or created at the time the event was
-    triggered.
-  * pname:object is the object where the issue was detected.
-    If pname:objectType is ename:VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT,
-    pname:object is undefined:.
-  * pname:location is a component (layer, driver, loader) defined value
-    specifying the _location_ of the trigger.
-    This is an optional: value.
-  * pname:messageCode is a layer-defined value indicating what test
-    triggered this callback.
-  * pname:pLayerPrefix is a null-terminated string that is an abbreviation
-    of the name of the component making the callback.
-    pname:pLayerPrefix is only valid for the duration of the callback.
-  * pname:pMessage is a null-terminated string detailing the trigger
-    conditions.
-    pname:pMessage is only valid for the duration of the callback.
-  * pname:pUserData is the user data given when the
-    slink:VkDebugReportCallbackEXT was created.
-
-The callback must: not call fname:vkDestroyDebugReportCallbackEXT.
-
-The callback returns a basetype:VkBool32, which is interpreted in a
-layer-specified manner.
-The application should: always return ename:VK_FALSE.
-The ename:VK_TRUE value is reserved for use in layer development.
-
-pname:object must: be a Vulkan object or dlink:VK_NULL_HANDLE.
-If pname:objectType is not ename:VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT and
-pname:object is not dlink:VK_NULL_HANDLE, pname:object must: be a Vulkan
-object of the corresponding type associated with pname:objectType as defined
-in <<debug-report-object-types>>.
---
-
-[open,refpage='VkDebugReportObjectTypeEXT',desc='Specify the type of an object handle',type='enums']
---
-Possible values passed to the pname:objectType parameter of the callback
-function specified by
-slink:VkDebugReportCallbackCreateInfoEXT::pname:pfnCallback, specifying the
-type of object handle being reported, are:
-
-include::{generated}/api/enums/VkDebugReportObjectTypeEXT.txt[]
-
-[[debug-report-object-types]]
-.`VkDebugReportObjectTypeEXT` and Vulkan Handle Relationship
-[width="80%",cols="<35,<23",options="header"]
-|====
-| elink:VkDebugReportObjectTypeEXT                            | Vulkan Handle Type
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT               | Unknown/Undefined Handle
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT              | slink:VkInstance
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT       | slink:VkPhysicalDevice
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT                | slink:VkDevice
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT                 | slink:VkQueue
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT             | slink:VkSemaphore
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT        | slink:VkCommandBuffer
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT                 | slink:VkFence
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT         | slink:VkDeviceMemory
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT                | slink:VkBuffer
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT                 | slink:VkImage
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT                 | slink:VkEvent
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT            | slink:VkQueryPool
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT           | slink:VkBufferView
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT            | slink:VkImageView
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT         | slink:VkShaderModule
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT        | slink:VkPipelineCache
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT       | slink:VkPipelineLayout
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT           | slink:VkRenderPass
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT              | slink:VkPipeline
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT | slink:VkDescriptorSetLayout
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT               | slink:VkSampler
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT       | slink:VkDescriptorPool
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT        | slink:VkDescriptorSet
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT           | slink:VkFramebuffer
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT          | slink:VkCommandPool
-ifdef::VK_KHR_surface[]
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT           | slink:VkSurfaceKHR
-endif::VK_KHR_surface[]
-ifdef::VK_KHR_surface[]
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT         | slink:VkSwapchainKHR
-endif::VK_KHR_surface[]
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT | slink:VkDebugReportCallbackEXT
-ifdef::VK_KHR_display[]
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT           | slink:VkDisplayKHR
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT      | slink:VkDisplayModeKHR
-endif::VK_KHR_display[]
-ifndef::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1,VK_KHR_descriptor_update_template[]
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR_EXT | slink:VkDescriptorUpdateTemplate
-endif::VK_VERSION_1_1,VK_KHR_descriptor_update_template[]
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1[]
-| ename:VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT | slink:VkDescriptorUpdateTemplate
-endif::VK_VERSION_1_1[]
-|====
-
-[NOTE]
-.Note
-====
-The primary expected use of ename:VK_ERROR_VALIDATION_FAILED_EXT is for
-validation layer testing.
-It is not expected that an application would see this error code during
-normal use of the validation layers.
-====
---
-
-[open,refpage='vkDebugReportMessageEXT',desc='Inject a message into a debug stream',type='protos']
---
-To inject its own messages into the debug stream, call:
-
-include::{generated}/api/protos/vkDebugReportMessageEXT.txt[]
-
-  * pname:instance is the debug stream's slink:VkInstance.
-  * pname:flags specifies the elink:VkDebugReportFlagBitsEXT classification
-    of this event/message.
-  * pname:objectType is a elink:VkDebugReportObjectTypeEXT specifying the
-    type of object being used or created at the time the event was
-    triggered.
-  * pname:object is the object where the issue was detected.
-    pname:object can: be dlink:VK_NULL_HANDLE if there is no object
-    associated with the event.
-  * pname:location is an application defined value.
-  * pname:messageCode is an application defined value.
-  * pname:pLayerPrefix is the abbreviation of the component making this
-    event/message.
-  * pname:pMessage is a null-terminated string detailing the trigger
-    conditions.
-
-The call will propagate through the layers and generate callback(s) as
-indicated by the message's flags.
-The parameters are passed on to the callback in addition to the
-pname:pUserData value that was defined at the time the callback was
-registered.
-
-.Valid Usage
-****
-  * [[VUID-vkDebugReportMessageEXT-object-01241]]
-    pname:object must: be a Vulkan object or dlink:VK_NULL_HANDLE
-  * [[VUID-vkDebugReportMessageEXT-objectType-01498]]
-    If pname:objectType is not ename:VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT
-    and pname:object is not dlink:VK_NULL_HANDLE, pname:object must: be a
-    Vulkan object of the corresponding type associated with pname:objectType
-    as defined in <<debug-report-object-types>>
-****
-
-include::{generated}/validity/protos/vkDebugReportMessageEXT.txt[]
---
-
-[open,refpage='vkDestroyDebugReportCallbackEXT',desc='Destroy a debug report callback object',type='protos']
---
-To destroy a sname:VkDebugReportCallbackEXT object, call:
-
-include::{generated}/api/protos/vkDestroyDebugReportCallbackEXT.txt[]
-
-  * pname:instance is the instance where the callback was created.
-  * pname:callback is the slink:VkDebugReportCallbackEXT object to destroy.
-    pname:callback is an externally synchronized object and must: not be
-    used on more than one thread at a time.
-    This means that fname:vkDestroyDebugReportCallbackEXT must: not be
-    called when a callback is active.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyDebugReportCallbackEXT-instance-01242]]
-    If sname:VkAllocationCallbacks were provided when pname:callback was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyDebugReportCallbackEXT-instance-01243]]
-    If no sname:VkAllocationCallbacks were provided when pname:callback was
-    created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyDebugReportCallbackEXT.txt[]
---
diff --git a/registry/vulkan/chapters/VK_EXT_debug_utils.txt b/registry/vulkan/chapters/VK_EXT_debug_utils.txt
deleted file mode 100644
index b3f7ba3..0000000
--- a/registry/vulkan/chapters/VK_EXT_debug_utils.txt
+++ /dev/null
@@ -1,722 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[debugging-debug-utils]]
-== Debug Utilities
-
-Vulkan provides flexible debugging utilities for debugging an application.
-
-The <<debugging-object-debug-annotation,Object Debug Annotation>> section
-describes how to associate either a name or binary data with a specific
-Vulkan object.
-
-The <<debugging-queue-labels,Queue Labels>> section describes how to
-annotate and group the work submitted to a queue.
-
-The <<debugging-command-buffer-labels,Command Buffer Labels>> section
-describes how to associate logical elements of the scene with commands in a
-slink:VkCommandBuffer.
-
-The <<debugging-debug-messengers,Debug Messengers>> section describes how to
-create debug messenger objects associated with an application supplied
-callback to capture debug messages from a variety of Vulkan components.
-
-
-[[debugging-object-debug-annotation]]
-=== Object Debug Annotation
-
-It can be useful for an application to provide its own content relative to a
-specific Vulkan object.
-The following commands allow application developers to associate
-user-defined information with Vulkan objects.
-
-
-[[debugging-object-naming]]
-==== Object Naming
-
-An object can be provided a user-defined name by calling
-fname:vkSetDebugUtilsObjectNameEXT as defined below.
-
-[open,refpage='vkSetDebugUtilsObjectNameEXT',desc='Give a user-friendly name to an object',type='protos']
---
-include::{generated}/api/protos/vkSetDebugUtilsObjectNameEXT.txt[]
-
-  * pname:device is the device that created the object.
-  * pname:pNameInfo is a pointer to a slink:VkDebugUtilsObjectNameInfoEXT
-    structure specifying parameters of the name to set on the object.
-
-.Valid Usage
-****
-  * [[VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-02587]]
-    pname:pNameInfo->objectType must: not be ename:VK_OBJECT_TYPE_UNKNOWN
-  * [[VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-02588]]
-    pname:pNameInfo->objectHandle must: not be dlink:VK_NULL_HANDLE
-****
-
-include::{generated}/validity/protos/vkSetDebugUtilsObjectNameEXT.txt[]
---
-
-[open,refpage='VkDebugUtilsObjectNameInfoEXT',desc='Specify parameters of a name to give to an object',type='structs']
---
-The sname:VkDebugUtilsObjectNameInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkDebugUtilsObjectNameInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:objectType is a elink:VkObjectType specifying the type of the
-    object to be named.
-  * pname:objectHandle is the object to be named.
-  * pname:pObjectName is either `NULL` or a null-terminated UTF-8 string
-    specifying the name to apply to pname:objectHandle.
-
-Applications may: change the name associated with an object simply by
-calling fname:vkSetDebugUtilsObjectNameEXT again with a new string.
-If pname:pObjectName is either `NULL` or an empty string, then any
-previously set name is removed.
-
-.Valid Usage
-****
-  * [[VUID-VkDebugUtilsObjectNameInfoEXT-objectType-02589]]
-    If pname:objectType is ename:VK_OBJECT_TYPE_UNKNOWN, pname:objectHandle
-    must: not be dlink:VK_NULL_HANDLE
-  * [[VUID-VkDebugUtilsObjectNameInfoEXT-objectType-02590]]
-    If pname:objectType is not ename:VK_OBJECT_TYPE_UNKNOWN,
-    pname:objectHandle must: be dlink:VK_NULL_HANDLE or a valid Vulkan
-    handle of the type associated with pname:objectType as defined in the
-    <<debugging-object-types, `VkObjectType` and Vulkan Handle
-    Relationship>> table
-****
-
-include::{generated}/validity/structs/VkDebugUtilsObjectNameInfoEXT.txt[]
---
-
-
-[[debugging-object-data-association]]
-==== Object Data Association
-
-In addition to setting a name for an object, debugging and validation layers
-may: have uses for additional binary data on a per-object basis that have no
-other place in the Vulkan API.
-
-For example, a sname:VkShaderModule could have additional debugging data
-attached to it to aid in offline shader tracing.
-
-Additional data can be attached to an object by calling
-fname:vkSetDebugUtilsObjectTagEXT as defined below.
-
-[open,refpage='vkSetDebugUtilsObjectTagEXT',desc='Attach arbitrary data to an object',type='protos']
---
-include::{generated}/api/protos/vkSetDebugUtilsObjectTagEXT.txt[]
-
-  * pname:device is the device that created the object.
-  * pname:pTagInfo is a pointer to a slink:VkDebugUtilsObjectTagInfoEXT
-    structure specifying parameters of the tag to attach to the object.
-
-include::{generated}/validity/protos/vkSetDebugUtilsObjectTagEXT.txt[]
---
-
-[open,refpage='VkDebugUtilsObjectTagInfoEXT',desc='Specify parameters of a tag to attach to an object',type='structs']
---
-The sname:VkDebugUtilsObjectTagInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkDebugUtilsObjectTagInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:objectType is a elink:VkObjectType specifying the type of the
-    object to be named.
-  * pname:objectHandle is the object to be tagged.
-  * pname:tagName is a numerical identifier of the tag.
-  * pname:tagSize is the number of bytes of data to attach to the object.
-  * pname:pTag is a pointer to an array of pname:tagSize bytes containing
-    the data to be associated with the object.
-
-The pname:tagName parameter gives a name or identifier to the type of data
-being tagged.
-This can be used by debugging layers to easily filter for only data that can
-be used by that implementation.
-
-.Valid Usage
-****
-  * [[VUID-VkDebugUtilsObjectTagInfoEXT-objectType-01908]]
-    pname:objectType must: not be ename:VK_OBJECT_TYPE_UNKNOWN
-  * [[VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01910]]
-    pname:objectHandle must: be a valid Vulkan handle of the type associated
-    with pname:objectType as defined in the <<debugging-object-types,
-    `VkObjectType` and Vulkan Handle Relationship>> table
-****
-
-include::{generated}/validity/structs/VkDebugUtilsObjectTagInfoEXT.txt[]
---
-
-
-[[debugging-queue-labels]]
-=== Queue Labels
-
-All Vulkan work must be submitted using queues.
-It is possible for an application to use multiple queues, each containing
-multiple command buffers, when performing work.
-It can be useful to identify which queue, or even where in a queue,
-something has occurred.
-
-To begin identifying a region using a debug label inside a queue, you may
-use the flink:vkQueueBeginDebugUtilsLabelEXT command.
-
-Then, when the region of interest has passed, you may end the label region
-using flink:vkQueueEndDebugUtilsLabelEXT.
-
-Additionally, a single debug label may be inserted at any time using
-flink:vkQueueInsertDebugUtilsLabelEXT.
-
-[open,refpage='vkQueueBeginDebugUtilsLabelEXT',desc='Open a queue debug label region',type='protos']
---
-A queue debug label region is opened by calling:
-
-include::{generated}/api/protos/vkQueueBeginDebugUtilsLabelEXT.txt[]
-
-  * pname:queue is the queue in which to start a debug label region.
-  * pname:pLabelInfo is a pointer to a slink:VkDebugUtilsLabelEXT structure
-    specifying parameters of the label region to open.
-
-include::{generated}/validity/protos/vkQueueBeginDebugUtilsLabelEXT.txt[]
---
-
-[open,refpage='VkDebugUtilsLabelEXT',desc='Specify parameters of a label region',type='structs']
---
-The sname:VkDebugUtilsLabelEXT structure is defined as:
-
-include::{generated}/api/structs/VkDebugUtilsLabelEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pLabelName is a pointer to a null-terminated UTF-8 string
-    containing the name of the label.
-  * pname:color is an optional RGBA color value that can be associated with
-    the label.
-    A particular implementation may: choose to ignore this color value.
-    The values contain RGBA values in order, in the range 0.0 to 1.0.
-    If all elements in pname:color are set to 0.0 then it is ignored.
-
-include::{generated}/validity/structs/VkDebugUtilsLabelEXT.txt[]
---
-
-[open,refpage='vkQueueEndDebugUtilsLabelEXT',desc='Close a queue debug label region',type='protos']
---
-A queue debug label region is closed by calling:
-
-include::{generated}/api/protos/vkQueueEndDebugUtilsLabelEXT.txt[]
-
-  * pname:queue is the queue in which a debug label region should be closed.
-
-The calls to flink:vkQueueBeginDebugUtilsLabelEXT and
-flink:vkQueueEndDebugUtilsLabelEXT must: be matched and balanced.
-
-.Valid Usage
-****
-  * [[VUID-vkQueueEndDebugUtilsLabelEXT-None-01911]]
-    There must: be an outstanding fname:vkQueueBeginDebugUtilsLabelEXT
-    command prior to the fname:vkQueueEndDebugUtilsLabelEXT on the queue
-****
-
-include::{generated}/validity/protos/vkQueueEndDebugUtilsLabelEXT.txt[]
---
-
-[open,refpage='vkQueueInsertDebugUtilsLabelEXT',desc='Insert a label into a queue',type='protos']
---
-A single label can be inserted into a queue by calling:
-
-include::{generated}/api/protos/vkQueueInsertDebugUtilsLabelEXT.txt[]
-
-  * pname:queue is the queue into which a debug label will be inserted.
-  * pname:pLabelInfo is a pointer to a slink:VkDebugUtilsLabelEXT structure
-    specifying parameters of the label to insert.
-
-include::{generated}/validity/protos/vkQueueInsertDebugUtilsLabelEXT.txt[]
---
-
-
-[[debugging-command-buffer-labels]]
-=== Command Buffer Labels
-
-Typical Vulkan applications will submit many command buffers in each frame,
-with each command buffer containing a large number of individual commands.
-Being able to logically annotate regions of command buffers that belong
-together as well as hierarchically subdivide the frame is important to a
-developer's ability to navigate the commands viewed holistically.
-
-To identify the beginning of a debug label region in a command buffer,
-flink:vkCmdBeginDebugUtilsLabelEXT can: be used as defined below.
-
-To indicate the end of a debug label region in a command buffer,
-flink:vkCmdEndDebugUtilsLabelEXT can: be used.
-
-To insert a single command buffer debug label inside of a command buffer,
-flink:vkCmdInsertDebugUtilsLabelEXT can: be used as defined below.
-
-[open,refpage='vkCmdBeginDebugUtilsLabelEXT',desc='Open a command buffer debug label region',type='protos']
---
-A command buffer debug label region can be opened by calling:
-
-include::{generated}/api/protos/vkCmdBeginDebugUtilsLabelEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:pLabelInfo is a pointer to a slink:VkDebugUtilsLabelEXT structure
-    specifying parameters of the label region to open.
-
-include::{generated}/validity/protos/vkCmdBeginDebugUtilsLabelEXT.txt[]
---
-
-[open,refpage='vkCmdEndDebugUtilsLabelEXT',desc='Close a command buffer label region',type='protos']
---
-A command buffer label region can be closed by calling:
-
-include::{generated}/api/protos/vkCmdEndDebugUtilsLabelEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-
-An application may: open a debug label region in one command buffer and
-close it in another, or otherwise split debug label regions across multiple
-command buffers or multiple queue submissions.
-When viewed from the linear series of submissions to a single queue, the
-calls to flink:vkCmdBeginDebugUtilsLabelEXT and
-flink:vkCmdEndDebugUtilsLabelEXT must: be matched and balanced.
-
-There can: be problems reporting command buffer debug labels during the
-recording process because command buffers may: be recorded out of sequence
-with the resulting execution order.
-Since the recording order may: be different, a solitary command buffer may:
-have an inconsistent view of the debug label regions by itself.
-Therefore, if an issue occurs during the recording of a command buffer, and
-the environment requires returning debug labels, the implementation may:
-return only those labels it is aware of.
-This is true even if the implementation is aware of only the debug labels
-within the command buffer being actively recorded.
-
-
-.Valid Usage
-****
-  * [[VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01912]]
-    There must: be an outstanding fname:vkCmdBeginDebugUtilsLabelEXT command
-    prior to the fname:vkCmdEndDebugUtilsLabelEXT on the queue that
-    pname:commandBuffer is submitted to
-  * [[VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01913]]
-    If pname:commandBuffer is a secondary command buffer, there must: be an
-    outstanding fname:vkCmdBeginDebugUtilsLabelEXT command recorded to
-    pname:commandBuffer that has not previously been ended by a call to
-    fname:vkCmdEndDebugUtilsLabelEXT
-****
-
-include::{generated}/validity/protos/vkCmdEndDebugUtilsLabelEXT.txt[]
---
-
-[open,refpage='vkCmdInsertDebugUtilsLabelEXT',desc='Insert a label into a command buffer',type='protos']
---
-A single debug label can be inserted into a command buffer by calling:
-
-include::{generated}/api/protos/vkCmdInsertDebugUtilsLabelEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:pInfo is a pointer to a slink:VkDebugUtilsLabelEXT structure
-    specifying parameters of the label to insert.
-
-include::{generated}/validity/protos/vkCmdInsertDebugUtilsLabelEXT.txt[]
---
-
-
-[[debugging-debug-messengers]]
-=== Debug Messengers
-
-Vulkan allows an application to register multiple callbacks with any Vulkan
-component wishing to report debug information.
-Some callbacks may log the information to a file, others may cause a debug
-break point or other application defined behavior.
-A primary producer of callback messages are the validation layers.
-An application can: register callbacks even when no validation layers are
-enabled, but they will only be called for the Vulkan loader and, if
-implemented, other layer and driver events.
-
-[open,refpage='VkDebugUtilsMessengerEXT',desc='Opaque handle to a debug messenger object',type='handles']
---
-A sname:VkDebugUtilsMessengerEXT is a messenger object which handles passing
-along debug messages to a provided debug callback.
-
-include::{generated}/api/handles/VkDebugUtilsMessengerEXT.txt[]
-
-The debug messenger will provide detailed feedback on the application's use
-of Vulkan when events of interest occur.
-When an event of interest does occur, the debug messenger will submit a
-debug message to the debug callback that was provided during its creation.
-Additionally, the debug messenger is responsible with filtering out debug
-messages that the callback is not interested in and will only provide
-desired debug messages.
---
-
-[open,refpage='vkCreateDebugUtilsMessengerEXT',desc='Create a debug messenger object',type='protos']
---
-A debug messenger triggers a debug callback with a debug message when an
-event of interest occurs.
-To create a debug messenger which will trigger a debug callback, call:
-
-include::{generated}/api/protos/vkCreateDebugUtilsMessengerEXT.txt[]
-
-  * pname:instance is the instance the messenger will be used with.
-  * pname:pCreateInfo is a pointer to a
-    slink:VkDebugUtilsMessengerCreateInfoEXT structure containing the
-    callback pointer, as well as defining conditions under which this
-    messenger will trigger the callback.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pMessenger is a pointer to a slink:VkDebugUtilsMessengerEXT handle
-    in which the created object is returned.
-
-include::{generated}/validity/protos/vkCreateDebugUtilsMessengerEXT.txt[]
-
-The application must: ensure that flink:vkCreateDebugUtilsMessengerEXT is
-not executed in parallel with any Vulkan command that is also called with
-pname:instance or child of pname:instance as the dispatchable argument.
---
-
-[open,refpage='VkDebugUtilsMessengerCreateInfoEXT',desc='Structure specifying parameters of a newly created debug messenger',type='structs']
---
-The definition of sname:VkDebugUtilsMessengerCreateInfoEXT is:
-
-include::{generated}/api/structs/VkDebugUtilsMessengerCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is `0` and is reserved for future use.
-  * pname:messageSeverity is a bitmask of
-    elink:VkDebugUtilsMessageSeverityFlagBitsEXT specifying which severity
-    of event(s) will cause this callback to be called.
-  * pname:messageType is a bitmask of
-    elink:VkDebugUtilsMessageTypeFlagBitsEXT specifying which type of
-    event(s) will cause this callback to be called.
-  * pname:pfnUserCallback is the application callback function to call.
-  * pname:pUserData is user data to be passed to the callback.
-
-For each sname:VkDebugUtilsMessengerEXT that is created the
-sname:VkDebugUtilsMessengerCreateInfoEXT::pname:messageSeverity and
-sname:VkDebugUtilsMessengerCreateInfoEXT::pname:messageType determine when
-that sname:VkDebugUtilsMessengerCreateInfoEXT::pname:pfnUserCallback is
-called.
-The process to determine if the user's pname:pfnUserCallback is triggered
-when an event occurs is as follows:
-
-  . The implementation will perform a bitwise AND of the event's
-    elink:VkDebugUtilsMessageSeverityFlagBitsEXT with the
-    pname:messageSeverity provided during creation of the
-    slink:VkDebugUtilsMessengerEXT object.
-  .. If the value is 0, the message is skipped.
-  . The implementation will perform bitwise AND of the event's
-    elink:VkDebugUtilsMessageTypeFlagBitsEXT with the pname:messageType
-    provided during the creation of the slink:VkDebugUtilsMessengerEXT
-    object.
-  .. If the value is 0, the message is skipped.
-  . The callback will trigger a debug message for the current event
-
-The callback will come directly from the component that detected the event,
-unless some other layer intercepts the calls for its own purposes (filter
-them in a different way, log to a system error log, etc.).
-
-An application can: receive multiple callbacks if multiple
-sname:VkDebugUtilsMessengerEXT objects are created.
-A callback will always be executed in the same thread as the originating
-Vulkan call.
-
-A callback can: be called from multiple threads simultaneously (if the
-application is making Vulkan calls from multiple threads).
-
-.Valid Usage
-****
-  * [[VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-01914]]
-    pname:pfnUserCallback must: be a valid
-    tlink:PFN_vkDebugUtilsMessengerCallbackEXT
-****
-
-include::{generated}/validity/structs/VkDebugUtilsMessengerCreateInfoEXT.txt[]
---
-
-[open,refpage='VkDebugUtilsMessengerCreateFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkDebugUtilsMessengerCreateFlagsEXT.txt[]
-
-tname:VkDebugUtilsMessengerCreateFlagsEXT is a bitmask type for setting a
-mask, but is currently reserved for future use.
---
-
-[open,refpage='VkDebugUtilsMessageSeverityFlagBitsEXT',desc='Bitmask specifying which severities of events cause a debug messenger callback',type='enums']
---
-Bits which can: be set in
-slink:VkDebugUtilsMessengerCreateInfoEXT::pname:messageSeverity, specifying
-event severities which cause a debug messenger to call the callback, are:
-
-include::{generated}/api/enums/VkDebugUtilsMessageSeverityFlagBitsEXT.txt[]
-
-  * ename:VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT specifies the most
-    verbose output indicating all diagnostic messages from the Vulkan
-    loader, layers, and drivers should be captured.
-  * ename:VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT specifies an
-    informational message such as resource details that may be handy when
-    debugging an application.
-  * ename:VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT specifies use of
-    Vulkan that may: expose an app bug.
-    Such cases may not be immediately harmful, such as a fragment shader
-    outputting to a location with no attachment.
-    Other cases may: point to behavior that is almost certainly bad when
-    unintended such as using an image whose memory has not been filled.
-    In general if you see a warning but you know that the behavior is
-    intended/desired, then simply ignore the warning.
-  * ename:VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT specifies that the
-    application has violated a valid usage condition of the specification.
-
-[NOTE]
-.Note
-====
-The values of elink:VkDebugUtilsMessageSeverityFlagBitsEXT are sorted based
-on severity.
-The higher the flag value, the more severe the message.
-This allows for simple boolean operation comparisons when looking at
-elink:VkDebugUtilsMessageSeverityFlagBitsEXT values.
-
-For example:
-
-[source,c++]
-~~~~
-    if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) {
-        // Do something for warnings and errors
-    }
-~~~~
-
-In addition, space has been left between the enums to allow for later
-addition of new severities in between the existing values.
-====
---
-
-[open,refpage='VkDebugUtilsMessageSeverityFlagsEXT',desc='Bitmask of VkDebugUtilsMessageSeverityFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkDebugUtilsMessageSeverityFlagsEXT.txt[]
-
-tname:VkDebugUtilsMessageSeverityFlagsEXT is a bitmask type for setting a
-mask of zero or more elink:VkDebugUtilsMessageSeverityFlagBitsEXT.
---
-
-[open,refpage='VkDebugUtilsMessageTypeFlagBitsEXT',desc='Bitmask specifying which types of events cause a debug messenger callback',type='enums']
---
-Bits which can: be set in
-slink:VkDebugUtilsMessengerCreateInfoEXT::pname:messageType, specifying
-event types which cause a debug messenger to call the callback, are:
-
-include::{generated}/api/enums/VkDebugUtilsMessageTypeFlagBitsEXT.txt[]
-
-  * ename:VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT specifies that some
-    general event has occurred.
-    This is typically a non-specification, non-performance event.
-  * ename:VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT specifies that
-    something has occurred during validation against the Vulkan
-    specification that may indicate invalid behavior.
-  * ename:VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT specifies a
-    potentially non-optimal use of Vulkan, e.g. using
-    flink:vkCmdClearColorImage when setting
-    slink:VkAttachmentDescription::pname:loadOp to
-    ename:VK_ATTACHMENT_LOAD_OP_CLEAR would have worked.
---
-
-[open,refpage='VkDebugUtilsMessageTypeFlagsEXT',desc='Bitmask of VkDebugUtilsMessageTypeFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkDebugUtilsMessageTypeFlagsEXT.txt[]
-
-tname:VkDebugUtilsMessageTypeFlagsEXT is a bitmask type for setting a mask
-of zero or more elink:VkDebugUtilsMessageTypeFlagBitsEXT.
---
-
-[open,refpage='PFN_vkDebugUtilsMessengerCallbackEXT',desc='Application-defined debug messenger callback function',type='funcpointers']
---
-The prototype for the
-slink:VkDebugUtilsMessengerCreateInfoEXT::pname:pfnUserCallback function
-implemented by the application is:
-
-include::{generated}/api/funcpointers/PFN_vkDebugUtilsMessengerCallbackEXT.txt[]
-
-  * pname:messageSeverity specifies the
-    elink:VkDebugUtilsMessageSeverityFlagBitsEXT that triggered this
-    callback.
-  * pname:messageTypes is a bitmask of
-    elink:VkDebugUtilsMessageTypeFlagBitsEXT specifying which type of
-    event(s) triggered this callback.
-  * pname:pCallbackData contains all the callback related data in the
-    slink:VkDebugUtilsMessengerCallbackDataEXT structure.
-  * pname:pUserData is the user data provided when the
-    slink:VkDebugUtilsMessengerEXT was created.
-
-The callback returns a basetype:VkBool32, which is interpreted in a
-layer-specified manner.
-The application should: always return ename:VK_FALSE.
-The ename:VK_TRUE value is reserved for use in layer development.
-
-.Valid Usage
-****
-  * [[VUID-PFN_vkDebugUtilsMessengerCallbackEXT-None-04769]]
-    The callback must: not make calls to any Vulkan commands
-****
---
-
-[open,refpage='VkDebugUtilsMessengerCallbackDataEXT',desc='Structure specifying parameters returned to the callback',type='structs']
---
-The definition of sname:VkDebugUtilsMessengerCallbackDataEXT is:
-
-include::{generated}/api/structs/VkDebugUtilsMessengerCallbackDataEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is `0` and is reserved for future use.
-  * pname:pMessageIdName is a null-terminated string that identifies the
-    particular message ID that is associated with the provided message.
-    If the message corresponds to a validation layer message, then this
-    string may contain the portion of the Vulkan specification that is
-    believed to have been violated.
-  * pname:messageIdNumber is the ID number of the triggering message.
-    If the message corresponds to a validation layer message, then this
-    number is related to the internal number associated with the message
-    being triggered.
-  * pname:pMessage is a null-terminated string detailing the trigger
-    conditions.
-  * pname:queueLabelCount is a count of items contained in the
-    pname:pQueueLabels array.
-  * pname:pQueueLabels is `NULL` or a pointer to an array of
-    slink:VkDebugUtilsLabelEXT active in the current sname:VkQueue at the
-    time the callback was triggered.
-    Refer to <<debugging-queue-labels,Queue Labels>> for more information.
-  * pname:cmdBufLabelCount is a count of items contained in the
-    pname:pCmdBufLabels array.
-  * pname:pCmdBufLabels is `NULL` or a pointer to an array of
-    slink:VkDebugUtilsLabelEXT active in the current sname:VkCommandBuffer
-    at the time the callback was triggered.
-    Refer to <<debugging-command-buffer-labels, Command Buffer Labels>> for
-    more information.
-  * pname:objectCount is a count of items contained in the pname:pObjects
-    array.
-  * pname:pObjects is a pointer to an array of
-    slink:VkDebugUtilsObjectNameInfoEXT objects related to the detected
-    issue.
-    The array is roughly in order or importance, but the 0th element is
-    always guaranteed to be the most important object for this message.
-
-[NOTE]
-.Note
-====
-This structure should only be considered valid during the lifetime of the
-triggered callback.
-====
-
-Since adding queue and command buffer labels behaves like pushing and
-popping onto a stack, the order of both pname:pQueueLabels and
-pname:pCmdBufLabels is based on the order the labels were defined.
-The result is that the first label in either pname:pQueueLabels or
-pname:pCmdBufLabels will be the first defined (and therefore the oldest)
-while the last label in each list will be the most recent.
-
-[NOTE]
-.Note
-====
-pname:pQueueLabels will only be non-`NULL` if one of the objects in
-pname:pObjects can be related directly to a defined sname:VkQueue which has
-had one or more labels associated with it.
-
-Likewise, pname:pCmdBufLabels will only be non-`NULL` if one of the objects
-in pname:pObjects can be related directly to a defined sname:VkCommandBuffer
-which has had one or more labels associated with it.
-Additionally, while command buffer labels allow for beginning and ending
-across different command buffers, the debug messaging framework cannot:
-guarantee that labels in pname:pCmdBufLables will contain those defined
-outside of the associated command buffer.
-This is partially due to the fact that the association of one command buffer
-with another may not have been defined at the time the debug message is
-triggered.
-====
-
-include::{generated}/validity/structs/VkDebugUtilsMessengerCallbackDataEXT.txt[]
---
-
-[open,refpage='VkDebugUtilsMessengerCallbackDataFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkDebugUtilsMessengerCallbackDataFlagsEXT.txt[]
-
-tname:VkDebugUtilsMessengerCallbackDataFlagsEXT is a bitmask type for
-setting a mask, but is currently reserved for future use.
---
-
-[open,refpage='vkSubmitDebugUtilsMessageEXT',desc='Inject a message into a debug stream',type='protos']
---
-There may be times that a user wishes to intentionally submit a debug
-message.
-To do this, call:
-
-include::{generated}/api/protos/vkSubmitDebugUtilsMessageEXT.txt[]
-
-  * pname:instance is the debug stream's slink:VkInstance.
-  * pname:messageSeverity is a elink:VkDebugUtilsMessageSeverityFlagBitsEXT
-    value specifying the severity of this event/message.
-  * pname:messageTypes is a bitmask of
-    elink:VkDebugUtilsMessageTypeFlagBitsEXT specifying which type of
-    event(s) to identify with this message.
-  * pname:pCallbackData contains all the callback related data in the
-    slink:VkDebugUtilsMessengerCallbackDataEXT structure.
-
-The call will propagate through the layers and generate callback(s) as
-indicated by the message's flags.
-The parameters are passed on to the callback in addition to the
-pname:pUserData value that was defined at the time the messenger was
-registered.
-
-.Valid Usage
-****
-  * [[VUID-vkSubmitDebugUtilsMessageEXT-objectType-02591]]
-    The pname:objectType member of each element of
-    pname:pCallbackData->pObjects must: not be ename:VK_OBJECT_TYPE_UNKNOWN
-****
-
-include::{generated}/validity/protos/vkSubmitDebugUtilsMessageEXT.txt[]
---
-
-[open,refpage='vkDestroyDebugUtilsMessengerEXT',desc='Destroy a debug messenger object',type='protos']
---
-To destroy a sname:VkDebugUtilsMessengerEXT object, call:
-
-include::{generated}/api/protos/vkDestroyDebugUtilsMessengerEXT.txt[]
-
-  * pname:instance is the instance where the callback was created.
-  * pname:messenger is the slink:VkDebugUtilsMessengerEXT object to destroy.
-    pname:messenger is an externally synchronized object and must: not be
-    used on more than one thread at a time.
-    This means that fname:vkDestroyDebugUtilsMessengerEXT must: not be
-    called when a callback is active.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01915]]
-    If sname:VkAllocationCallbacks were provided when pname:messenger was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01916]]
-    If no sname:VkAllocationCallbacks were provided when pname:messenger was
-    created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyDebugUtilsMessengerEXT.txt[]
-
-The application must: ensure that flink:vkDestroyDebugUtilsMessengerEXT is
-not executed in parallel with any Vulkan command that is also called with
-pname:instance or child of pname:instance as the dispatchable argument.
---
-
diff --git a/registry/vulkan/chapters/VK_EXT_direct_mode_display/acquire_release_displays.txt b/registry/vulkan/chapters/VK_EXT_direct_mode_display/acquire_release_displays.txt
deleted file mode 100644
index 932254c..0000000
--- a/registry/vulkan/chapters/VK_EXT_direct_mode_display/acquire_release_displays.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-==== Acquiring and Releasing Displays
-
-On some platforms, access to displays is limited to a single process or
-native driver instance.
-On such platforms, some or all of the displays may not be available to
-Vulkan if they are already in use by a native windowing system or other
-application.
-
-ifdef::VK_EXT_acquire_xlib_display[]
-include::{chapters}/VK_EXT_acquire_xlib_display/acquire_xlib_display.txt[]
-endif::VK_EXT_acquire_xlib_display[]
-
-ifdef::VK_NV_acquire_winrt_display[]
-include::{chapters}/VK_NV_acquire_winrt_display/acquire_winrt_display.txt[]
-endif::VK_NV_acquire_winrt_display[]
-
-ifdef::VK_EXT_acquire_drm_display[]
-include::{chapters}/VK_EXT_acquire_drm_display/acquire_drm_display.txt[]
-endif::VK_EXT_acquire_drm_display[]
-
-[open,refpage='vkReleaseDisplayEXT',desc='Release access to an acquired VkDisplayKHR',type='protos']
---
-To release a previously acquired display, call:
-
-include::{generated}/api/protos/vkReleaseDisplayEXT.txt[]
-
-  * pname:physicalDevice The physical device the display is on.
-  * pname:display The display to release control of.
-
-include::{generated}/validity/protos/vkReleaseDisplayEXT.txt[]
---
diff --git a/registry/vulkan/chapters/VK_EXT_directfb_surface/platformCreateSurface_directfb.txt b/registry/vulkan/chapters/VK_EXT_directfb_surface/platformCreateSurface_directfb.txt
deleted file mode 100644
index 5b2188a..0000000
--- a/registry/vulkan/chapters/VK_EXT_directfb_surface/platformCreateSurface_directfb.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformCreateSurface_directfb,platformCreateSurface_directfb]]
-
-=== DirectFB Platform
-
-[open,refpage='vkCreateDirectFBSurfaceEXT',desc='Create a slink:VkSurfaceKHR object for a DirectFB surface',type='protos']
---
-To create a sname:VkSurfaceKHR object for a DirectFB surface, call:
-
-include::{generated}/api/protos/vkCreateDirectFBSurfaceEXT.txt[]
-
-  * pname:instance is the instance to associate the surface with.
-  * pname:pCreateInfo is a pointer to a sname:VkDirectFBSurfaceCreateInfoEXT
-    structure containing parameters affecting the creation of the surface
-    object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a slink:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-include::{generated}/validity/protos/vkCreateDirectFBSurfaceEXT.txt[]
---
-
-[open,refpage='VkDirectFBSurfaceCreateInfoEXT',desc='Structure specifying parameters of a newly created DirectFB surface object',type='structs']
---
-The sname:VkDirectFBSurfaceCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkDirectFBSurfaceCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:dfb is a pointer to the code:IDirectFB main interface of DirectFB.
-  * pname:surface is a pointer to a code:IDirectFBSurface surface interface.
-
-.Valid Usage
-****
-  * [[VUID-VkDirectFBSurfaceCreateInfoEXT-dfb-04117]]
-    pname:dfb must: point to a valid DirectFB code:IDirectFB
-  * [[VUID-VkDirectFBSurfaceCreateInfoEXT-surface-04118]]
-    pname:surface must: point to a valid DirectFB code:IDirectFBSurface
-****
-
-include::{generated}/validity/structs/VkDirectFBSurfaceCreateInfoEXT.txt[]
---
-
-With DirectFB, pname:minImageExtent, pname:maxImageExtent, and
-pname:currentExtent must: always equal the surface size.
-
-[open,refpage='VkDirectFBSurfaceCreateFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkDirectFBSurfaceCreateFlagsEXT.txt[]
-
-tname:VkDirectFBSurfaceCreateFlagsEXT is a bitmask type for setting a mask,
-but is currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_EXT_directfb_surface/platformQuerySupport_directfb.txt b/registry/vulkan/chapters/VK_EXT_directfb_surface/platformQuerySupport_directfb.txt
deleted file mode 100644
index 1e1ddb3..0000000
--- a/registry/vulkan/chapters/VK_EXT_directfb_surface/platformQuerySupport_directfb.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformQuerySupport_directfb,platformQuerySupport_directfb]]
-
-=== DirectFB Platform
-
-[open,refpage='vkGetPhysicalDeviceDirectFBPresentationSupportEXT',desc='Query physical device for presentation with DirectFB',type='protos']
---
-To determine whether a queue family of a physical device supports
-presentation with DirectFB library, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceDirectFBPresentationSupportEXT.txt[]
-
-  * pname:physicalDevice is the physical device.
-  * pname:queueFamilyIndex is the queue family index.
-  * pname:dfb is a pointer to the code:IDirectFB main interface of DirectFB.
-
-This platform-specific function can: be called prior to creating a surface.
-
-.Valid Usage
-****
-  * [[VUID-vkGetPhysicalDeviceDirectFBPresentationSupportEXT-queueFamilyIndex-04119]]
-    pname:queueFamilyIndex must: be less than
-    pname:pQueueFamilyPropertyCount returned by
-    fname:vkGetPhysicalDeviceQueueFamilyProperties for the given
-    pname:physicalDevice
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceDirectFBPresentationSupportEXT.txt[]
---
diff --git a/registry/vulkan/chapters/VK_EXT_display_control/display_control.txt b/registry/vulkan/chapters/VK_EXT_display_control/display_control.txt
deleted file mode 100644
index 3fb7bf8..0000000
--- a/registry/vulkan/chapters/VK_EXT_display_control/display_control.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-=== Display Control
-
-[open,refpage='vkDisplayPowerControlEXT',desc='Set the power state of a display',type='protos']
---
-To set the power state of a display, call:
-
-include::{generated}/api/protos/vkDisplayPowerControlEXT.txt[]
-
-  * pname:device is a logical device associated with pname:display.
-  * pname:display is the display whose power state is modified.
-  * pname:pDisplayPowerInfo is a pointer to a slink:VkDisplayPowerInfoEXT
-    structure specifying the new power state of pname:display.
-
-include::{generated}/validity/protos/vkDisplayPowerControlEXT.txt[]
---
-
-[open,refpage='VkDisplayPowerInfoEXT',desc='Describe the power state of a display',type='structs']
---
-The sname:VkDisplayPowerInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkDisplayPowerInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:powerState is a elink:VkDisplayPowerStateEXT value specifying the
-    new power state of the display.
-
-include::{generated}/validity/structs/VkDisplayPowerInfoEXT.txt[]
---
-
-[open,refpage='VkDisplayPowerStateEXT',desc='Possible power states for a display',type='enums']
---
-
-Possible values of slink:VkDisplayPowerInfoEXT::pname:powerState, specifying
-the new power state of a display, are:
-
-include::{generated}/api/enums/VkDisplayPowerStateEXT.txt[]
-
-  * ename:VK_DISPLAY_POWER_STATE_OFF_EXT specifies that the display is
-    powered down.
-  * ename:VK_DISPLAY_POWER_STATE_SUSPEND_EXT specifies that the display is
-    put into a low power mode, from which it may: be able to transition back
-    to ename:VK_DISPLAY_POWER_STATE_ON_EXT more quickly than if it were in
-    ename:VK_DISPLAY_POWER_STATE_OFF_EXT.
-    This state may: be the same as ename:VK_DISPLAY_POWER_STATE_OFF_EXT.
-  * ename:VK_DISPLAY_POWER_STATE_ON_EXT specifies that the display is
-    powered on.
---
diff --git a/registry/vulkan/chapters/VK_EXT_display_control/fence_events.txt b/registry/vulkan/chapters/VK_EXT_display_control/fence_events.txt
deleted file mode 100644
index 1c82ad7..0000000
--- a/registry/vulkan/chapters/VK_EXT_display_control/fence_events.txt
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-=== Alternate Methods to Signal Fences
-
-Besides submitting a fence to a queue as part of a
-<<devsandqueues-submission, queue submission>> command, a fence may: also be
-signaled when a particular event occurs on a device or display.
-
-[open,refpage='vkRegisterDeviceEventEXT',desc='Signal a fence when a device event occurs',type='protos']
---
-To create a fence that will be signaled when an event occurs on a device,
-call:
-
-include::{generated}/api/protos/vkRegisterDeviceEventEXT.txt[]
-
-  * pname:device is a logical device on which the event may: occur.
-  * pname:pDeviceEventInfo is a pointer to a slink:VkDeviceEventInfoEXT
-    structure describing the event of interest to the application.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pFence is a pointer to a handle in which the resulting fence
-    object is returned.
-
-include::{generated}/validity/protos/vkRegisterDeviceEventEXT.txt[]
---
-
-[open,refpage='VkDeviceEventInfoEXT',desc='Describe a device event to create',type='structs']
---
-The sname:VkDeviceEventInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkDeviceEventInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:device is a elink:VkDeviceEventTypeEXT value specifying when the
-    fence will be signaled.
-
-include::{generated}/validity/structs/VkDeviceEventInfoEXT.txt[]
---
-
-[open,refpage='VkDeviceEventTypeEXT',desc='Events that can occur on a device object',type='enums']
---
-Possible values of slink:VkDeviceEventInfoEXT::pname:device, specifying when
-a fence will be signaled, are:
-
-include::{generated}/api/enums/VkDeviceEventTypeEXT.txt[]
-
-  * ename:VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT specifies that the fence
-    is signaled when a display is plugged into or unplugged from the
-    specified device.
-    Applications can: use this notification to determine when they need to
-    re-enumerate the available displays on a device.
---
-
-[open,refpage='vkRegisterDisplayEventEXT',desc='Signal a fence when a display event occurs',type='protos']
---
-To create a fence that will be signaled when an event occurs on a
-slink:VkDisplayKHR object, call:
-
-include::{generated}/api/protos/vkRegisterDisplayEventEXT.txt[]
-
-  * pname:device is a logical device associated with pname:display
-  * pname:display is the display on which the event may: occur.
-  * pname:pDisplayEventInfo is a pointer to a slink:VkDisplayEventInfoEXT
-    structure describing the event of interest to the application.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pFence is a pointer to a handle in which the resulting fence
-    object is returned.
-
-include::{generated}/validity/protos/vkRegisterDisplayEventEXT.txt[]
---
-
-[open,refpage='VkDisplayEventInfoEXT',desc='Describe a display event to create',type='structs']
---
-The sname:VkDisplayEventInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkDisplayEventInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:displayEvent is a elink:VkDisplayEventTypeEXT specifying when the
-    fence will be signaled.
-
-include::{generated}/validity/structs/VkDisplayEventInfoEXT.txt[]
---
-
-[open,refpage='VkDisplayEventTypeEXT',desc='Events that can occur on a display object',type='enums']
---
-Possible values of slink:VkDisplayEventInfoEXT::pname:displayEvent,
-specifying when a fence will be signaled, are:
-
-include::{generated}/api/enums/VkDisplayEventTypeEXT.txt[]
-
-  * ename:VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT specifies that the fence
-    is signaled when the first pixel of the next display refresh cycle
-    leaves the display engine for the display.
---
diff --git a/registry/vulkan/chapters/VK_EXT_display_control/swapchain_counters.txt b/registry/vulkan/chapters/VK_EXT_display_control/swapchain_counters.txt
deleted file mode 100644
index 0c37461..0000000
--- a/registry/vulkan/chapters/VK_EXT_display_control/swapchain_counters.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='VkSwapchainCounterCreateInfoEXT',desc='Specify the surface counters desired',type='structs']
---
-To enable surface counters when creating a swapchain, add a
-sname:VkSwapchainCounterCreateInfoEXT structure to the pname:pNext chain of
-slink:VkSwapchainCreateInfoKHR.
-sname:VkSwapchainCounterCreateInfoEXT is defined as:
-
-include::{generated}/api/structs/VkSwapchainCounterCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:surfaceCounters is a bitmask of elink:VkSurfaceCounterFlagBitsEXT
-    specifying surface counters to enable for the swapchain.
-
-.Valid Usage
-****
-  * [[VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-01244]]
-    The bits in pname:surfaceCounters must: be supported by
-    slink:VkSwapchainCreateInfoKHR::pname:surface, as reported by
-    flink:vkGetPhysicalDeviceSurfaceCapabilities2EXT
-****
-
-include::{generated}/validity/structs/VkSwapchainCounterCreateInfoEXT.txt[]
---
-
-[open,refpage='vkGetSwapchainCounterEXT',desc='Query the current value of a surface counter',type='protos']
---
-The requested counters become active when the first presentation command for
-the associated swapchain is processed by the presentation engine.
-To query the value of an active counter, use:
-
-include::{generated}/api/protos/vkGetSwapchainCounterEXT.txt[]
-
-  * pname:device is the slink:VkDevice associated with pname:swapchain.
-  * pname:swapchain is the swapchain from which to query the counter value.
-  * pname:counter is a elink:VkSurfaceCounterFlagBitsEXT value specifying
-    the counter to query.
-  * pname:pCounterValue will return the current value of the counter.
-
-If a counter is not available because the swapchain is out of date, the
-implementation may: return ename:VK_ERROR_OUT_OF_DATE_KHR.
-
-.Valid Usage
-****
-  * [[VUID-vkGetSwapchainCounterEXT-swapchain-01245]]
-    One or more present commands on pname:swapchain must: have been
-    processed by the presentation engine
-****
-
-include::{generated}/validity/protos/vkGetSwapchainCounterEXT.txt[]
---
diff --git a/registry/vulkan/chapters/VK_EXT_display_surface_counter/surface_capabilities.txt b/registry/vulkan/chapters/VK_EXT_display_surface_counter/surface_capabilities.txt
deleted file mode 100644
index da45577..0000000
--- a/registry/vulkan/chapters/VK_EXT_display_surface_counter/surface_capabilities.txt
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='vkGetPhysicalDeviceSurfaceCapabilities2EXT',desc='Query surface capabilities',type='protos']
---
-To query the basic capabilities of a surface, needed in order to create a
-swapchain, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceSurfaceCapabilities2EXT.txt[]
-
-  * pname:physicalDevice is the physical device that will be associated with
-    the swapchain to be created, as described for
-    flink:vkCreateSwapchainKHR.
-  * pname:surface is the surface that will be associated with the swapchain.
-  * pname:pSurfaceCapabilities is a pointer to a
-    slink:VkSurfaceCapabilities2EXT structure in which the capabilities are
-    returned.
-
-fname:vkGetPhysicalDeviceSurfaceCapabilities2EXT behaves similarly to
-flink:vkGetPhysicalDeviceSurfaceCapabilitiesKHR, with the ability to return
-extended information by adding extending structures to the pname:pNext chain
-of its pname:pSurfaceCapabilities parameter.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/surface_physical_device_common.txt[]
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceSurfaceCapabilities2EXT.txt[]
---
-
-[open,refpage='VkSurfaceCapabilities2EXT',desc='Structure describing capabilities of a surface',type='structs']
---
-The sname:VkSurfaceCapabilities2EXT structure is defined as:
-
-include::{generated}/api/structs/VkSurfaceCapabilities2EXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-include::{chapters}/VK_KHR_surface/wsi.txt[tag=surface_capabilities_members]
-  * pname:supportedSurfaceCounters is a bitmask of
-    elink:VkSurfaceCounterFlagBitsEXT indicating the supported surface
-    counter types.
-
-.Valid Usage
-****
-  * [[VUID-VkSurfaceCapabilities2EXT-supportedSurfaceCounters-01246]]
-    pname:supportedSurfaceCounters must: not include
-    ename:VK_SURFACE_COUNTER_VBLANK_BIT_EXT unless the surface queried is a
-    <<wsi-display-surfaces,display surface>>
-****
-
-include::{generated}/validity/structs/VkSurfaceCapabilities2EXT.txt[]
---
-
-[open,refpage='VkSurfaceCounterFlagBitsEXT',desc='Surface-relative counter types',type='enums']
---
-Bits which can: be set in
-slink:VkSurfaceCapabilities2EXT::pname:supportedSurfaceCounters, indicating
-supported surface counter types, are:
-
-include::{generated}/api/enums/VkSurfaceCounterFlagBitsEXT.txt[]
-
-  * ename:VK_SURFACE_COUNTER_VBLANK_BIT_EXT specifies a counter incrementing
-    once every time a vertical blanking period occurs on the display
-    associated with the surface.
---
-
-[open,refpage='VkSurfaceCounterFlagsEXT',desc='Bitmask of VkSurfaceCounterFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkSurfaceCounterFlagsEXT.txt[]
-
-tname:VkSurfaceCounterFlagsEXT is a bitmask type for setting a mask of zero
-or more elink:VkSurfaceCounterFlagBitsEXT.
---
-
diff --git a/registry/vulkan/chapters/VK_EXT_hdr_metadata.txt b/registry/vulkan/chapters/VK_EXT_hdr_metadata.txt
deleted file mode 100644
index d90103f..0000000
--- a/registry/vulkan/chapters/VK_EXT_hdr_metadata.txt
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// This section is included inside VK_KHR_swapchain
-
-== Hdr Metadata
-
-To improve color reproduction of content it is useful to have information
-that can be used to better reproduce the colors as seen on the reference
-monitor.
-That information can be provided to an implementation by calling
-fname:vkSetHdrMetadataEXT.
-The metadata will be applied to the specified sname:VkSwapchainKHR objects
-at the next fname:vkQueuePresentKHR call using that sname:VkSwapchainKHR
-object.
-The metadata will persist until a subsequent fname:vkSetHdrMetadataEXT
-changes it.
-The definitions below are from the associated SMPTE 2086, CTA 861.3 and CIE
-15:2004 specifications.
-
-The definition of fname:vkSetHdrMetadataEXT is:
-
-[open,refpage='vkSetHdrMetadataEXT',desc='Set Hdr metadata',type='protos']
---
-include::{generated}/api/protos/vkSetHdrMetadataEXT.txt[]
-
-  * pname:device is the logical device where the swapchain(s) were created.
-  * pname:swapchainCount is the number of swapchains included in
-    pname:pSwapchains.
-  * pname:pSwapchains is a pointer to an array of pname:swapchainCount
-    slink:VkSwapchainKHR handles.
-  * pname:pMetadata is a pointer to an array of pname:swapchainCount
-    slink:VkHdrMetadataEXT structures.
-
-include::{generated}/validity/protos/vkSetHdrMetadataEXT.txt[]
---
-
-[open,refpage='VkXYColorEXT',desc='Specify X,Y chromaticity coordinates',type='structs']
---
-include::{generated}/api/structs/VkXYColorEXT.txt[]
-Chromaticity coordinates x and y are as specified in CIE 15:2004
-"`Calculation of chromaticity coordinates`" (Section 7.3) and are limited to
-between 0 and 1 for real colors for the reference monitor.
-
---
-
-[open,refpage='VkHdrMetadataEXT',desc='Specify Hdr metadata',type='structs']
---
-include::{generated}/api/structs/VkHdrMetadataEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:displayPrimaryRed is the reference monitor's red primary in
-    chromaticity coordinates
-  * pname:displayPrimaryGreen is the reference monitor's green primary in
-    chromaticity coordinates
-  * pname:displayPrimaryBlue is the reference monitor's blue primary in
-    chromaticity coordinates
-  * pname:whitePoint is the reference monitor's white-point in chromaticity
-    coordinates
-  * pname:maxLuminance is the maximum luminance of the reference monitor in
-    nits
-  * pname:minLuminance is the minimum luminance of the reference monitor in
-    nits
-  * pname:maxContentLightLevel is content's maximum luminance in nits
-  * pname:maxFrameAverageLightLevel is the maximum frame average light level
-    in nits
-
-include::{generated}/validity/structs/VkHdrMetadataEXT.txt[]
-
-[NOTE]
-.Note
-====
-The validity and use of this data is outside the scope of Vulkan.
-====
-
---
diff --git a/registry/vulkan/chapters/VK_EXT_headless_surface/headless.txt b/registry/vulkan/chapters/VK_EXT_headless_surface/headless.txt
deleted file mode 100644
index 0f8aa60..0000000
--- a/registry/vulkan/chapters/VK_EXT_headless_surface/headless.txt
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2017-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[headless,headless]]
-
-=== Presenting to headless surfaces
-
-Vulkan rendering can be presented to a headless surface, where the
-presentation operation is a no-op producing no externally-visible result.
-
-[NOTE]
-.Note
-====
-Because there is no real presentation target, the headless presentation
-engine may be extended to impose an arbitrary or customisable set of
-restrictions and features.
-This makes it a useful portable test target for applications targeting a
-wide range of presentation engines where the actual target presentation
-engines might be scarce, unavailable or otherwise undesirable or
-inconvenient to use for general Vulkan application development.
-
-The usual surface query mechanisms must be used to determine the actual
-restrictions and features of the implementation.
-====
-
-[open,refpage='vkCreateHeadlessSurfaceEXT',desc='Create a headless slink:VkSurfaceKHR object',type='protos']
---
-To create a headless sname:VkSurfaceKHR object, call:
-
-include::{generated}/api/protos/vkCreateHeadlessSurfaceEXT.txt[]
-
-  * pname:instance is the instance to associate the surface with.
-  * pname:pCreateInfo is a pointer to a slink:VkHeadlessSurfaceCreateInfoEXT
-    structure containing parameters affecting the creation of the surface
-    object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a sname:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-include::{generated}/validity/protos/vkCreateHeadlessSurfaceEXT.txt[]
---
-
-[open,refpage='VkHeadlessSurfaceCreateInfoEXT',desc='Structure specifying parameters of a newly created headless surface object',type='structs']
---
-The sname:VkHeadlessSurfaceCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkHeadlessSurfaceCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-
-include::{generated}/validity/structs/VkHeadlessSurfaceCreateInfoEXT.txt[]
---
-
-For headless surfaces, pname:currentExtent is the reserved value
-[eq]#(0xFFFFFFFF, 0xFFFFFFFF)#.
-Whatever the application sets a swapchain's pname:imageExtent to will be the
-size of the surface, after the first image is presented.
-
-[open,refpage='VkHeadlessSurfaceCreateFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkHeadlessSurfaceCreateFlagsEXT.txt[]
-
-tname:VkHeadlessSurfaceCreateFlagsEXT is a bitmask type for setting a mask,
-but is currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_EXT_metal_surface/platformCreateSurface_metal.txt b/registry/vulkan/chapters/VK_EXT_metal_surface/platformCreateSurface_metal.txt
deleted file mode 100644
index d7309a6..0000000
--- a/registry/vulkan/chapters/VK_EXT_metal_surface/platformCreateSurface_metal.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformCreateSurface_metal,platformCreateSurface_metal]]
-
-=== Metal Platform
-
-[open,refpage='vkCreateMetalSurfaceEXT',desc='Create a VkSurfaceKHR object for CAMetalLayer',type='protos']
---
-To create a sname:VkSurfaceKHR object for a basetype:CAMetalLayer, call:
-
-include::{generated}/api/protos/vkCreateMetalSurfaceEXT.txt[]
-
-  * pname:instance is the instance with which to associate the surface.
-  * pname:pCreateInfo is a pointer to a slink:VkMetalSurfaceCreateInfoEXT
-    structure specifying parameters affecting the creation of the surface
-    object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a sname:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-include::{generated}/validity/protos/vkCreateMetalSurfaceEXT.txt[]
---
-
-[open,refpage='VkMetalSurfaceCreateInfoEXT',desc='Structure specifying parameters of a newly created Metal surface object',type='structs']
---
-The slink:VkMetalSurfaceCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkMetalSurfaceCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:pLayer is a reference to a basetype:CAMetalLayer object
-    representing a renderable surface.
-
-include::{generated}/validity/structs/VkMetalSurfaceCreateInfoEXT.txt[]
---
-
-[open,refpage='CAMetalLayer',desc='CoreAnimation native layer type for Metal',type='basetypes']
---
-To remove an unnecessary compile-time dependency, an incomplete type
-definition of basetype:CAMetalLayer is provided in the Vulkan headers:
-
-include::{generated}/api/basetypes/CAMetalLayer.txt[]
-
-The actual basetype:CAMetalLayer type is defined in the QuartzCore
-framework.
---
-
-[open,refpage='VkMetalSurfaceCreateFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkMetalSurfaceCreateFlagsEXT.txt[]
-
-tname:VkMetalSurfaceCreateFlagsEXT is a bitmask type for setting a mask, but
-is currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_EXT_metal_surface/platformQuerySupport_metal.txt b/registry/vulkan/chapters/VK_EXT_metal_surface/platformQuerySupport_metal.txt
deleted file mode 100644
index a7a2271..0000000
--- a/registry/vulkan/chapters/VK_EXT_metal_surface/platformQuerySupport_metal.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformQuerySupport_metal,platformQuerySupport_metal]]
-
-=== Metal Platform
-
-On Apple platforms with Metal support, all physical devices and queue
-families must: be capable of presentation with any layer.
-As a result there is no Apple-specific query for these capabilities.
diff --git a/registry/vulkan/chapters/VK_EXT_pipeline_creation_feedback/pipelines.txt b/registry/vulkan/chapters/VK_EXT_pipeline_creation_feedback/pipelines.txt
deleted file mode 100644
index 1aca88d..0000000
--- a/registry/vulkan/chapters/VK_EXT_pipeline_creation_feedback/pipelines.txt
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-// This section is included inside the Pipelines chapter (pipelines.txt)
-
-[[pipelines-creation-feedback]]
-== Pipeline Creation Feedback
-
-[open,refpage='VkPipelineCreationFeedbackCreateInfoEXT',desc='Request for feedback about the creation of a pipeline',type='structs',xrefs='VkGraphicsPipelineCreateInfo VkComputePipelineCreateInfo VkRayTracingPipelineCreateInfoNV VkRayTracingPipelineCreateInfoKHR VkPipelineCreationFeedbackEXT']
---
-Feedback about the creation of a particular pipeline object can: be obtained
-by adding a sname:VkPipelineCreationFeedbackCreateInfoEXT structure to the
-pname:pNext chain of slink:VkGraphicsPipelineCreateInfo,
-ifdef::VK_KHR_ray_tracing_pipeline[slink:VkRayTracingPipelineCreateInfoKHR,]
-ifdef::VK_NV_ray_tracing[slink:VkRayTracingPipelineCreateInfoNV,]
-or slink:VkComputePipelineCreateInfo.
-The sname:VkPipelineCreationFeedbackCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkPipelineCreationFeedbackCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pPipelineCreationFeedback is a pointer to a
-    slink:VkPipelineCreationFeedbackEXT structure.
-  * pname:pipelineStageCreationFeedbackCount is the number of elements in
-    pname:pPipelineStageCreationFeedbacks.
-  * pname:pPipelineStageCreationFeedbacks is a pointer to an array of
-    pname:pipelineStageCreationFeedbackCount
-    slink:VkPipelineCreationFeedbackEXT structures.
-
-An implementation should: write pipeline creation feedback to
-pname:pPipelineCreationFeedback and may: write pipeline stage creation
-feedback to pname:pPipelineStageCreationFeedbacks.
-An implementation must: set or clear the
-ename:VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT_EXT in
-slink:VkPipelineCreationFeedbackEXT::pname:flags for
-pname:pPipelineCreationFeedback and every element of
-pname:pPipelineStageCreationFeedbacks.
-
-[NOTE]
-.Note
-====
-One common scenario for an implementation to skip per-stage feedback is when
-ename:VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT_EXT
-is set in pname:pPipelineCreationFeedback.
-====
-
-When chained to
-ifdef::VK_KHR_ray_tracing_pipeline[slink:VkRayTracingPipelineCreateInfoKHR,]
-ifdef::VK_NV_ray_tracing[slink:VkRayTracingPipelineCreateInfoNV,]
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[or]
-slink:VkGraphicsPipelineCreateInfo, the `i` element of
-pname:pPipelineStageCreationFeedbacks corresponds to the `i` element of
-ifdef::VK_KHR_ray_tracing_pipeline[slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages,]
-ifdef::VK_NV_ray_tracing[slink:VkRayTracingPipelineCreateInfoNV::pname:pStages,]
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[or]
-slink:VkGraphicsPipelineCreateInfo::pname:pStages.
-When chained to slink:VkComputePipelineCreateInfo, the first element of
-pname:pPipelineStageCreationFeedbacks corresponds to
-slink:VkComputePipelineCreateInfo::pname:stage.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02668]]
-    When chained to slink:VkGraphicsPipelineCreateInfo,
-    slink:VkPipelineCreationFeedbackEXT::pname:pipelineStageCreationFeedbackCount
-    must: equal slink:VkGraphicsPipelineCreateInfo::pname:stageCount
-  * [[VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02669]]
-    When chained to slink:VkComputePipelineCreateInfo,
-    slink:VkPipelineCreationFeedbackEXT::pname:pipelineStageCreationFeedbackCount
-    must: equal 1
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  * [[VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02670]]
-    When chained to slink:VkRayTracingPipelineCreateInfoKHR,
-    slink:VkPipelineCreationFeedbackEXT::pname:pipelineStageCreationFeedbackCount
-    must: equal slink:VkRayTracingPipelineCreateInfoKHR::pname:stageCount
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_NV_ray_tracing[]
-  * [[VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02969]]
-    When chained to slink:VkRayTracingPipelineCreateInfoNV,
-    slink:VkPipelineCreationFeedbackEXT::pname:pipelineStageCreationFeedbackCount
-    must: equal slink:VkRayTracingPipelineCreateInfoNV::pname:stageCount
-endif::VK_NV_ray_tracing[]
-****
-
-include::{generated}/validity/structs/VkPipelineCreationFeedbackCreateInfoEXT.txt[]
---
-
-[open,refpage='VkPipelineCreationFeedbackEXT',desc='Feedback about the creation of a pipeline or pipeline stage',type='structs',xrefs='VkPipelineCreationFeedbackCreateInfoEXT VkPipelineCreationFeedbackFlagBitsEXT']
---
-The sname:VkPipelineCreationFeedbackEXT structure is defined as:
-
-include::{generated}/api/structs/VkPipelineCreationFeedbackEXT.txt[]
-
-  * pname:flags is a bitmask of elink:VkPipelineCreationFeedbackFlagBitsEXT
-    providing feedback about the creation of a pipeline or of a pipeline
-    stage.
-  * pname:duration is the duration spent creating a pipeline or pipeline
-    stage in nanoseconds.
-
-If the ename:VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT_EXT is not set in
-pname:flags, an implementation must: not set any other bits in pname:flags,
-and the values of all other sname:VkPipelineCreationFeedbackEXT data members
-are undefined:.
-
-include::{generated}/validity/structs/VkPipelineCreationFeedbackEXT.txt[]
---
-
-[open,refpage='VkPipelineCreationFeedbackFlagBitsEXT',desc='Bitmask specifying pipeline or pipeline stage creation feedback',type='enums',xrefs='VkPipelineCreationFeedbackCreateInfoEXT VkPipelineCreationFeedbackEXT']
---
-Possible values of the pname:flags member of
-slink:VkPipelineCreationFeedbackEXT are:
-
-include::{generated}/api/enums/VkPipelineCreationFeedbackFlagBitsEXT.txt[]
-
-  * ename:VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT_EXT indicates that the
-    feedback information is valid.
-  * ename:VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT_EXT
-    indicates that a readily usable pipeline or pipeline stage was found in
-    the pname:pipelineCache specified by the application in the pipeline
-    creation command.
-+
-An implementation should: set the
-ename:VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT_EXT
-bit if it was able to avoid the large majority of pipeline or pipeline stage
-creation work by using the pname:pipelineCache parameter of
-flink:vkCreateGraphicsPipelines,
-ifdef::VK_KHR_ray_tracing_pipeline[flink:vkCreateRayTracingPipelinesKHR,]
-ifdef::VK_NV_ray_tracing[flink:vkCreateRayTracingPipelinesNV,]
-or flink:vkCreateComputePipelines.
-When an implementation sets this bit for the entire pipeline, it may: leave
-it unset for any stage.
-+
-[NOTE]
-.Note
-====
-Implementations are encouraged to provide a meaningful signal to
-applications using this bit.
-The intention is to communicate to the application that the pipeline or
-pipeline stage was created "as fast as it gets" using the pipeline cache
-provided by the application.
-If an implementation uses an internal cache, it is discouraged from setting
-this bit as the feedback would be unactionable.
-====
-
-  * ename:VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT_EXT
-    indicates that the base pipeline specified by the
-    pname:basePipelineHandle or pname:basePipelineIndex member of the
-    stext:Vk*PipelineCreateInfo structure was used to accelerate the
-    creation of the pipeline.
-+
-An implementation should: set the
-ename:VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT_EXT bit
-if it was able to avoid a significant amount of work by using the base
-pipeline.
-+
-[NOTE]
-.Note
-====
-While "significant amount of work" is subjective, implementations are
-encouraged to provide a meaningful signal to applications using this bit.
-For example, a 1% reduction in duration may not warrant setting this bit,
-while a 50% reduction would.
-====
---
-
-[open,refpage='VkPipelineCreationFeedbackFlagsEXT',desc='Bitmask of VkPipelineCreationFeedbackFlagBitsEXT',type='flags',xrefs='VkPipelineCreationFeedbackEXT VkPipelineCreationFeedbackFlagBitsEXT']
---
-include::{generated}/api/flags/VkPipelineCreationFeedbackFlagsEXT.txt[]
-
-tname:VkPipelineCreationFeedbackFlagsEXT is a bitmask type for providing
-zero or more elink:VkPipelineCreationFeedbackFlagBitsEXT.
---
diff --git a/registry/vulkan/chapters/VK_EXT_private_data.txt b/registry/vulkan/chapters/VK_EXT_private_data.txt
deleted file mode 100644
index 9b012dc..0000000
--- a/registry/vulkan/chapters/VK_EXT_private_data.txt
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2020-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[private-data]]
-= Private Data
-
-The private data extension provides a way for users to associate arbitrary
-user defined data with Vulkan objects.
-This association is accomplished by storing 64-bit unsigned integers of user
-defined data in private data slots.
-
-An application can: reserve private data slots at device creation.
-To reserve private data slots, insert a
-slink:VkDevicePrivateDataCreateInfoEXT in the pname:pNext chain in
-slink:VkDeviceCreateInfo before device creation.
-Multiple slink:VkDevicePrivateDataCreateInfoEXT structures can: be chained
-together, and the sum of the requested slots will be reserved.
-This is an exception to the specified valid usage for
-<<fundamentals-validusage-pNext,structure pointer chains>>.
-Reserving slots in this manner is not strictly necessary but it may: improve
-performance.
-
-[open,refpage='VkPrivateDataSlotEXT',desc='Opaque handle to a private data slot object',type='handles']
---
-Private data slots are represented by sname:VkPrivateDataSlotEXT handles:
-
-include::{generated}/api/handles/VkPrivateDataSlotEXT.txt[]
---
-
-[open,refpage='vkCreatePrivateDataSlotEXT',desc='Create a slot for private data storage',type='protos']
---
-To create a private data slot, call:
-
-include::{generated}/api/protos/vkCreatePrivateDataSlotEXT.txt[]
-
-  * pname:device is the logical device associated with the creation of the
-    object(s) holding the private data slot.
-  * pname:pCreateInfo is a pointer to a sname:VkPrivateDataSlotCreateInfoEXT
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pPrivateDataSlot is a pointer to a slink:VkPrivateDataSlotEXT
-    handle in which the resulting private data slot is returned
-
-.Valid Usage
-****
-  * [[VUID-vkCreatePrivateDataSlotEXT-privateData-04564]]
-    The <<features-privateData,pname:privateData>> feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkCreatePrivateDataSlotEXT.txt[]
---
-
-[open,refpage='VkPrivateDataSlotCreateInfoEXT',desc='Structure specifying the parameters of private data slot construction',type='structs']
---
-The sname:VkPrivateDataSlotCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkPrivateDataSlotCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of tlink:VkPrivateDataSlotCreateFlagsEXT
-    specifying additional parameters of the new private data slot
-
-include::{generated}/validity/structs/VkPrivateDataSlotCreateInfoEXT.txt[]
---
-
-[open,refpage='VkPrivateDataSlotCreateFlagBitsEXT',desc='Bitmask specifying additional parameters for private data slot creation',type='enums']
---
-include::{generated}/api/enums/VkPrivateDataSlotCreateFlagBitsEXT.txt[]
---
-
-[open,refpage='VkPrivateDataSlotCreateFlagsEXT',desc='Bitmask of VkPrivateDataSlotCreateFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkPrivateDataSlotCreateFlagsEXT.txt[]
-
-tname:VkPrivateDataSlotCreateFlagsEXT is a bitmask type for setting a mask
-of zero or more elink:VkPrivateDataSlotCreateFlagBitsEXT.
---
-
-[open,refpage='vkDestroyPrivateDataSlotEXT',desc='Destroy a private data slot',type='protos']
---
-To destroy a private data slot, call:
-
-include::{generated}/api/protos/vkDestroyPrivateDataSlotEXT.txt[]
-
-  * pname:device is the logical device associated with the creation of the
-    object(s) holding the private data slot.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:privateDataSlot is the private data slot to destroy.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyPrivateDataSlotEXT-privateDataSlot-04062]]
-    If sname:VkAllocationCallbacks were provided when pname:privateDataSlot
-    was created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyPrivateDataSlotEXT-privateDataSlot-04063]]
-    If no sname:VkAllocationCallbacks were provided when
-    pname:privateDataSlot was created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyPrivateDataSlotEXT.txt[]
---
-
-[open,refpage='vkSetPrivateDataEXT',desc='Associate data with a Vulkan object',type='protos']
---
-To store user defined data in a slot associated with a Vulkan object, call:
-
-include::{generated}/api/protos/vkSetPrivateDataEXT.txt[]
-
-  * pname:device is the device that created the object.
-  * pname:objectType is a elink:VkObjectType specifying the type of object
-    to associate data with.
-  * pname:objectHandle is a handle to the object to associate data with.
-  * pname:privateDataSlot is a handle to a slink:VkPrivateDataSlotEXT
-    specifying location of private data storage.
-  * pname:data is user defined data to associate the object with.
-    This data will be stored at pname:privateDataSlot.
-
-.Valid Usage
-****
-  * [[VUID-vkSetPrivateDataEXT-objectHandle-04016]]
-    pname:objectHandle must: be pname:device or a child of pname:device
-  * [[VUID-vkSetPrivateDataEXT-objectHandle-04017]]
-    pname:objectHandle must: be a valid handle to an object of type
-    pname:objectType
-****
-
-include::{generated}/validity/protos/vkSetPrivateDataEXT.txt[]
---
-
-[open,refpage='vkGetPrivateDataEXT',desc='Retrieve data associated with a Vulkan object',type='protos']
---
-To retrieve user defined data from a slot associated with a Vulkan object,
-call:
-
-include::{generated}/api/protos/vkGetPrivateDataEXT.txt[]
-
-  * pname:device is the device that created the object
-  * pname:objectType is a elink:VkObjectType specifying the type of object
-    data is associated with.
-  * pname:objectHandle is a handle to the object data is associated with.
-  * pname:privateDataSlot is a handle to a slink:VkPrivateDataSlotEXT
-    specifying location of private data pointer storage.
-  * pname:pData is a pointer to specify where user data is returned.
-    `0` will be written in the absence of a previous call to
-    fname:vkSetPrivateDataEXT using the object specified by
-    pname:objectHandle.
-
-[NOTE]
-.Note
-====
-Due to platform details on Android, implementations might not be able to
-reliably return `0` from calls to fname:vkGetPrivateDataEXT for
-slink:VkSwapchainKHR objects on which fname:vkSetPrivateDataEXT has not
-previously been called.
-This erratum is exclusive to the Android platform and objects of type
-slink:VkSwapchainKHR.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkGetPrivateDataEXT-objectType-04018]]
-    pname:objectType must: be ename:VK_OBJECT_TYPE_DEVICE, or an object type
-    whose parent is slink:VkDevice
-****
-
-include::{generated}/validity/protos/vkGetPrivateDataEXT.txt[]
---
diff --git a/registry/vulkan/chapters/VK_EXT_validation_cache/shader-module-validation-cache.txt b/registry/vulkan/chapters/VK_EXT_validation_cache/shader-module-validation-cache.txt
deleted file mode 100644
index 5e4d579..0000000
--- a/registry/vulkan/chapters/VK_EXT_validation_cache/shader-module-validation-cache.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='VkShaderModuleValidationCacheCreateInfoEXT',desc='Specify validation cache to use during shader module creation',type='structs']
---
-To use a slink:VkValidationCacheEXT to cache shader validation results, add
-a slink:VkShaderModuleValidationCacheCreateInfoEXT structure to the
-pname:pNext chain of the slink:VkShaderModuleCreateInfo structure,
-specifying the cache object to use.
-
-The sname:VkShaderModuleValidationCacheCreateInfoEXT struct is defined as:
-
-include::{generated}/api/structs/VkShaderModuleValidationCacheCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:validationCache is the validation cache object from which the
-    results of prior validation attempts will be written, and to which new
-    validation results for this slink:VkShaderModule will be written (if not
-    already present).
-
-include::{generated}/validity/structs/VkShaderModuleValidationCacheCreateInfoEXT.txt[]
---
diff --git a/registry/vulkan/chapters/VK_EXT_validation_features.txt b/registry/vulkan/chapters/VK_EXT_validation_features.txt
deleted file mode 100644
index b002a48..0000000
--- a/registry/vulkan/chapters/VK_EXT_validation_features.txt
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='VkValidationFeaturesEXT',desc='Specify validation features to enable or disable for a Vulkan instance',type='structs']
---
-When creating a Vulkan instance for which you wish to enable or disable
-specific validation features, add a slink:VkValidationFeaturesEXT structure
-to the pname:pNext chain of the slink:VkInstanceCreateInfo structure,
-specifying the features to be enabled or disabled.
-
-include::{generated}/api/structs/VkValidationFeaturesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:enabledValidationFeatureCount is the number of features to enable.
-  * pname:pEnabledValidationFeatures is a pointer to an array of
-    elink:VkValidationFeatureEnableEXT values specifying the validation
-    features to be enabled.
-  * pname:disabledValidationFeatureCount is the number of features to
-    disable.
-  * pname:pDisabledValidationFeatures is a pointer to an array of
-    elink:VkValidationFeatureDisableEXT values specifying the validation
-    features to be disabled.
-
-.Valid Usage
-****
-  * [[VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-02967]]
-    If the pname:pEnabledValidationFeatures array contains
-    ename:VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT,
-    then it must: also contain
-    ename:VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT
-  * [[VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-02968]]
-    If the pname:pEnabledValidationFeatures array contains
-    ename:VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT, then it must: not
-    contain ename:VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT
-****
-
-include::{generated}/validity/structs/VkValidationFeaturesEXT.txt[]
---
-
-[open,refpage='VkValidationFeatureEnableEXT',desc='Specify validation features to enable',type='enums']
---
-Possible values of elements of the
-slink:VkValidationFeaturesEXT::pname:pEnabledValidationFeatures array,
-specifying validation features to be enabled, are:
-
-include::{generated}/api/enums/VkValidationFeatureEnableEXT.txt[]
-
-  * ename:VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT specifies that
-    GPU-assisted validation is enabled.
-    Activating this feature instruments shader programs to generate
-    additional diagnostic data.
-    This feature is disabled by default.
-  * ename:VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT
-    specifies that the validation layers reserve a descriptor set binding
-    slot for their own use.
-    The layer reports a value for
-    slink:VkPhysicalDeviceLimits::pname:maxBoundDescriptorSets that is one
-    less than the value reported by the device.
-    If the device supports the binding of only one descriptor set, the
-    validation layer does not perform GPU-assisted validation.
-    This feature is disabled by default.
-  * ename:VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT specifies that
-    Vulkan best-practices validation is enabled.
-    Activating this feature enables the output of warnings related to common
-    misuse of the API, but which are not explicitly prohibited by the
-    specification.
-    This feature is disabled by default.
-  * ename:VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT specifies that the
-    layers will process code:debugPrintfEXT operations in shaders and send
-    the resulting output to the debug callback.
-    This feature is disabled by default.
-  * ename:VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT
-    specifies that Vulkan synchronization validation is enabled.
-    This feature reports resource access conflicts due to missing or
-    incorrect synchronization operations between actions (Draw, Copy,
-    Dispatch, Blit) reading or writing the same regions of memory.
-    This feature is disabled by default.
---
-
-[open,refpage='VkValidationFeatureDisableEXT',desc='Specify validation features to disable',type='enums']
---
-Possible values of elements of the
-slink:VkValidationFeaturesEXT::pname:pDisabledValidationFeatures array,
-specifying validation features to be disabled, are:
-
-include::{generated}/api/enums/VkValidationFeatureDisableEXT.txt[]
-
-  * ename:VK_VALIDATION_FEATURE_DISABLE_ALL_EXT specifies that all
-    validation checks are disabled.
-  * ename:VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT specifies that shader
-    validation is disabled.
-    This feature is enabled by default.
-  * ename:VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT specifies that
-    thread safety validation is disabled.
-    This feature is enabled by default.
-  * ename:VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT specifies that
-    stateless parameter validation is disabled.
-    This feature is enabled by default.
-  * ename:VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT specifies that
-    object lifetime validation is disabled.
-    This feature is enabled by default.
-  * ename:VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT specifies that core
-    validation checks are disabled.
-    This feature is enabled by default.
-    If this feature is disabled, the shader validation and GPU-assisted
-    validation features are also disabled.
-  * ename:VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT specifies that
-    protection against duplicate non-dispatchable object handles is
-    disabled.
-    This feature is enabled by default.
-  * ename:VK_VALIDATION_FEATURE_DISABLE_SHADER_VALIDATION_CACHE_EXT
-    specifies that there will be no caching of shader validation results and
-    every shader will be validated on every application execution.
-    Shader validation caching is enabled by default.
---
-
-[NOTE]
-.Note
-====
-Disabling checks such as parameter validation and object lifetime validation
-prevents the reporting of error conditions that can cause other validation
-checks to behave incorrectly or crash.
-Some validation checks assume that their inputs are already valid and do not
-always revalidate them.
-====
-
-[NOTE]
-.Note
-====
-The `apiext:VK_EXT_validation_features` extension subsumes all the
-functionality provided in the `apiext:VK_EXT_validation_flags` extension.
-====
diff --git a/registry/vulkan/chapters/VK_EXT_validation_flags.txt b/registry/vulkan/chapters/VK_EXT_validation_flags.txt
deleted file mode 100644
index ccd1ce6..0000000
--- a/registry/vulkan/chapters/VK_EXT_validation_flags.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='VkValidationFlagsEXT',desc='Specify validation checks to disable for a Vulkan instance',type='structs']
---
-When creating a Vulkan instance for which you wish to disable validation
-checks, add a slink:VkValidationFlagsEXT structure to the pname:pNext chain
-of the slink:VkInstanceCreateInfo structure, specifying the checks to be
-disabled.
-
-include::{generated}/api/structs/VkValidationFlagsEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:disabledValidationCheckCount is the number of checks to disable.
-  * pname:pDisabledValidationChecks is a pointer to an array of
-    elink:VkValidationCheckEXT values specifying the validation checks to be
-    disabled.
-
-include::{generated}/validity/structs/VkValidationFlagsEXT.txt[]
---
-
-[open,refpage='VkValidationCheckEXT',desc='Specify validation checks to disable',type='enums']
---
-Possible values of elements of the
-slink:VkValidationFlagsEXT::pname:pDisabledValidationChecks array,
-specifying validation checks to be disabled, are:
-
-include::{generated}/api/enums/VkValidationCheckEXT.txt[]
-
-  * ename:VK_VALIDATION_CHECK_ALL_EXT specifies that all validation checks
-    are disabled.
-  * ename:VK_VALIDATION_CHECK_SHADERS_EXT specifies that shader validation
-    is disabled.
---
diff --git a/registry/vulkan/chapters/VK_FUCHSIA_external_memory/device_memory.txt b/registry/vulkan/chapters/VK_FUCHSIA_external_memory/device_memory.txt
deleted file mode 100644
index 3b53034..0000000
--- a/registry/vulkan/chapters/VK_FUCHSIA_external_memory/device_memory.txt
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright (c) 2021 Google Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[fuchsia-external-memory]]
-=== Fuchsia External Memory
-
-On Fuchsia, when allocating memory that may: be imported from another
-device, process or Vulkan instance, add a
-slink:VkImportMemoryZirconHandleInfoFUCHSIA structure to the pname:pNext
-chain of the slink:VkMemoryAllocateInfo structure.
-
-External memory on Fuchsia is imported and exported using VMO handles of
-type code:zx_handle_t.
-VMO handles to external memory are canonically obtained from Fuchsia's
-Sysmem service or from syscalls such as sname:zx_vmo_create().
-VMO handles for import can also be obtained by exporting them from another
-Vulkan instance as described in <<exporting-fuchsia-device-memory,exporting
-fuchsia device memory>>.
-
-Importing VMO handles to the Vulkan instance transfers ownership of the
-handle to the instance from the application.
-The application must: not perform any operations on the handle after
-successful import.
-
-Applications can: import the same underlying memory into multiple instances
-of Vulkan, into the same instance from which it was exported, and multiple
-times into a given Vulkan instance.
-In all cases, each import operation must: create a distinct
-sname:VkDeviceMemory object.
-
-
-[[importing-fuchsia-external-memory]]
-==== Importing Fuchsia External Memory
-
-[open,refpage='VkImportMemoryZirconHandleInfoFUCHSIA',desc='Structure specifying import parameters for Zircon handle to external memory',type='structs']
---
-The sname:VkImportMemoryZirconHandleInfoFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkImportMemoryZirconHandleInfoFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value
-    specifying the type of pname:handle.
-  * pname:handle is a code:zx_handle_t (Zircon) handle to the external
-    memory.
-
-.Valid Usage
-****
-  * [[VUID-VkImportMemoryZirconHandleInfoFUCHSIA-handleType-04771]]
-    pname:handleType must: be
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA
-  * [[VUID-VkImportMemoryZirconHandleInfoFUCHSIA-handle-04772]]
-    pname:handle must be a valid VMO handle
-****
-
-include::{generated}/validity/structs/VkImportMemoryZirconHandleInfoFUCHSIA.txt[]
---
-
-[open,refpage='vkGetMemoryZirconHandlePropertiesFUCHSIA',desc='Get a Zircon handle properties for an external memory object',type='protos']
---
-To obtain the memoryTypeIndex for the slink:VkMemoryAllocateInfo structure,
-call fname:vkGetMemoryZirconHandlePropertiesFUCHSIA:
-
-include::{generated}/api/protos/vkGetMemoryZirconHandlePropertiesFUCHSIA.txt[]
-
-  * pname:device is the slink:VkDevice.
-  * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value
-    specifying the type of pname:zirconHandle
-  * pname:zirconHandle is a code:zx_handle_t (Zircon) handle to the external
-    resource.
-  * pname:pMemoryZirconHandleProperties is a pointer to a
-    slink:VkMemoryZirconHandlePropertiesFUCHSIA structure in which the
-    result will be stored.
-
-.Valid Usage
-****
-  * [[VUID-vkGetMemoryZirconHandlePropertiesFUCHSIA-handleType-04773]]
-    pname:handleType must: be
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA
-  * [[VUID-vkGetMemoryZirconHandlePropertiesFUCHSIA-zirconHandle-04774]]
-    pname:zirconHandle must reference a valid VMO
-****
-
-include::{generated}/validity/protos/vkGetMemoryZirconHandlePropertiesFUCHSIA.txt[]
---
-
-[open,refpage='VkMemoryZirconHandlePropertiesFUCHSIA',desc='Structure specifying Zircon handle compatible external memory',type='structs']
---
-The sname:VkMemoryZirconHandlePropertiesFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkMemoryZirconHandlePropertiesFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memoryTypeBits a bitmask containing one bit set for every memory
-    type which the specified handle can be imported as.
-
-include::{generated}/validity/structs/VkMemoryZirconHandlePropertiesFUCHSIA.txt[]
---
-
-With pname:pMemoryZirconHandleProperties now successfully populated by
-flink:vkGetMemoryZirconHandlePropertiesFUCHSIA, assign the
-slink:VkMemoryAllocateInfo memoryTypeIndex field to a memory type which has
-a bit set in the slink:VkMemoryZirconHandlePropertiesFUCHSIA memoryTypeBits
-field.
-
-
-[[exporting-fuchsia-device-memory]]
-==== Exporting Fuchsia Device Memory
-Similar to importing, exporting a VMO handle from Vulkan transfers ownership
-of the handle from the Vulkan instance to the application.
-The application is responsible for closing the handle with
-code:zx_handle_close() when it is no longer in use.
-
-
-[open,refpage='vkGetMemoryZirconHandleFUCHSIA',desc='Get a Zircon handle for an external memory object',type='protos']
---
-To export device memory as a Zircon handle that can be used by another
-instance, device, or process, the handle to the slink:VkDeviceMemory must be
-retrieved using flink:vkGetMemoryZirconHandleFUCHSIA:
-
-include::{generated}/api/protos/vkGetMemoryZirconHandleFUCHSIA.txt[]
-
-  * pname:device is the slink:VkDevice.
-  * pname:pGetZirconHandleInfo is a pointer to a
-    slink:VkMemoryGetZirconHandleInfoFUCHSIA structure.
-  * pname:pZirconHandle is a pointer to a code:zx_handle_t which holds the
-    resulting Zircon handle.
-
-include::{generated}/validity/protos/vkGetMemoryZirconHandleFUCHSIA.txt[]
---
-
-[open,refpage='VkMemoryGetZirconHandleInfoFUCHSIA',desc='Structure specifying export parameters for Zircon handle to device memory',type='structs']
---
-sname:VkMemoryGetZirconHandleInfoFUCHSIA is defined as:
-
-include::{generated}/api/structs/VkMemoryGetZirconHandleInfoFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memory the slink:VkDeviceMemory being exported.
-  * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value
-    specifying the type of the handle pointed to by
-    flink:vkGetMemoryZirconHandleFUCHSIA::pname:pZirconHandle.
-
-.Valid Usage
-****
-  * [[VUID-VkMemoryGetZirconHandleInfoFUCHSIA-handleType-04775]]
-    pname:handleType must: be
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA
-  * [[VUID-VkMemoryGetZirconHandleInfoFUCHSIA-handleType-04776]]
-    pname:handleType must: have been included in the sname:handleTypes field
-    of the sname:VkExportMemoryAllocateInfo structure when the external
-    memory was allocated
-****
-
-include::{generated}/validity/structs/VkMemoryGetZirconHandleInfoFUCHSIA.txt[]
---
-
-With the result pname:pZirconHandle now obtained, the memory properties for
-the handle can be retrieved using
-flink:vkGetMemoryZirconHandlePropertiesFUCHSIA as documented above
-substituting the dereferenced, retrieved pname:pZirconHandle in for the
-pname:zirconHandle argument.
diff --git a/registry/vulkan/chapters/VK_FUCHSIA_imagepipe_surface/platformCreateSurface_imagepipe.txt b/registry/vulkan/chapters/VK_FUCHSIA_imagepipe_surface/platformCreateSurface_imagepipe.txt
deleted file mode 100644
index c3552e3..0000000
--- a/registry/vulkan/chapters/VK_FUCHSIA_imagepipe_surface/platformCreateSurface_imagepipe.txt
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformCreateSurface_imagepipe,platformCreateSurface_imagepipe]]
-
-=== Fuchsia Platform
-
-[open,refpage='vkCreateImagePipeSurfaceFUCHSIA',desc='Create a slink:VkSurfaceKHR object for a Fuchsia ImagePipe',type='protos']
---
-To create a sname:VkSurfaceKHR object for a Fuchsia ImagePipe, call:
-
-include::{generated}/api/protos/vkCreateImagePipeSurfaceFUCHSIA.txt[]
-
-  * pname:instance is the instance to associate with the surface.
-  * pname:pCreateInfo is a pointer to a
-    slink:VkImagePipeSurfaceCreateInfoFUCHSIA structure containing
-    parameters affecting the creation of the surface object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a slink:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-include::{generated}/validity/protos/vkCreateImagePipeSurfaceFUCHSIA.txt[]
---
-
-[open,refpage='VkImagePipeSurfaceCreateInfoFUCHSIA',desc='Structure specifying parameters of a newly created ImagePipe surface object',type='structs']
---
-The sname:VkImagePipeSurfaceCreateInfoFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkImagePipeSurfaceCreateInfoFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:imagePipeHandle is a code:zx_handle_t referring to the ImagePipe
-    to associate with the surface.
-
-.Valid Usage
-****
-  * [[VUID-VkImagePipeSurfaceCreateInfoFUCHSIA-imagePipeHandle-04863]]
-    pname:imagePipeHandle must: be a valid code:zx_handle_t
-****
-
-include::{generated}/validity/structs/VkImagePipeSurfaceCreateInfoFUCHSIA.txt[]
---
-
-On Fuchsia, the surface pname:currentExtent is the special value
-[eq]#(0xFFFFFFFF, 0xFFFFFFFF)#, indicating that the surface size will be
-determined by the extent of a swapchain targeting the surface.
-
-[open,refpage='VkImagePipeSurfaceCreateFlagsFUCHSIA',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkImagePipeSurfaceCreateFlagsFUCHSIA.txt[]
-
-tname:VkImagePipeSurfaceCreateFlagsFUCHSIA is a bitmask type for setting a
-mask, but is currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_FUCHSIA_imagepipe_surface/platformQuerySupport_imagepipe.txt b/registry/vulkan/chapters/VK_FUCHSIA_imagepipe_surface/platformQuerySupport_imagepipe.txt
deleted file mode 100644
index 5b58373..0000000
--- a/registry/vulkan/chapters/VK_FUCHSIA_imagepipe_surface/platformQuerySupport_imagepipe.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformQuerySupport_fuchsia,platformQuerySupport_fuchsia]]
-
-=== Fuchsia Platform
-
-On Fuchsia, all physical devices and queue families must: be capable of
-presentation with any ImagePipe.
-As a result there is no Fuchsia-specific query for these capabilities.
-
diff --git a/registry/vulkan/chapters/VK_GGP_frame_token.txt b/registry/vulkan/chapters/VK_GGP_frame_token.txt
deleted file mode 100644
index 591ee21..0000000
--- a/registry/vulkan/chapters/VK_GGP_frame_token.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='VkPresentFrameTokenGGP',desc='The Google Games Platform frame token',type='structs']
---
-When the `apiext:VK_GGP_frame_token` extension is enabled, a Google Games
-Platform frame token can: be specified when presenting an image to a
-swapchain by adding a sname:VkPresentFrameTokenGGP structure to the
-pname:pNext chain of the sname:VkPresentInfoKHR structure.
-
-The sname:VkPresentFrameTokenGGP structure is defined as:
-
-include::{generated}/api/structs/VkPresentFrameTokenGGP.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:frameToken is the Google Games Platform frame token.
-
-.Valid Usage
-****
-  * [[VUID-VkPresentFrameTokenGGP-frameToken-02680]]
-    pname:frameToken must: be a valid code:GgpFrameToken
-****
-
-include::{generated}/validity/structs/VkPresentFrameTokenGGP.txt[]
---
diff --git a/registry/vulkan/chapters/VK_GGP_stream_descriptor_surface/platformCreateSurface_streamdescriptor.txt b/registry/vulkan/chapters/VK_GGP_stream_descriptor_surface/platformCreateSurface_streamdescriptor.txt
deleted file mode 100644
index adeb98c..0000000
--- a/registry/vulkan/chapters/VK_GGP_stream_descriptor_surface/platformCreateSurface_streamdescriptor.txt
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformCreateSurface_streamdescriptor,platformCreateSurface_streamdescriptor]]
-=== Google Games Platform
-
-[open,refpage='vkCreateStreamDescriptorSurfaceGGP',desc='Create a slink:VkSurfaceKHR object for a Google Games Platform stream',type='protos']
---
-To create a sname:VkSurfaceKHR object for a Google Games Platform stream
-descriptor, call:
-
-include::{generated}/api/protos/vkCreateStreamDescriptorSurfaceGGP.txt[]
-
-  * pname:instance is the instance to associate with the surface.
-  * pname:pCreateInfo is a pointer to a
-    sname:VkStreamDescriptorSurfaceCreateInfoGGP structure containing
-    parameters that affect the creation of the surface object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a slink:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-include::{generated}/validity/protos/vkCreateStreamDescriptorSurfaceGGP.txt[]
---
-
-[open,refpage='VkStreamDescriptorSurfaceCreateInfoGGP',desc='Structure specifying parameters of a newly created Google Games Platform stream surface object',type='structs']
---
-The sname:VkStreamDescriptorSurfaceCreateInfoGGP structure is defined as:
-
-include::{generated}/api/structs/VkStreamDescriptorSurfaceCreateInfoGGP.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:streamDescriptor is a code:GgpStreamDescriptor referring to the
-    GGP stream descriptor to associate with the surface.
-
-.Valid Usage
-****
-  * [[VUID-VkStreamDescriptorSurfaceCreateInfoGGP-streamDescriptor-02681]]
-    pname:streamDescriptor must: be a valid code:GgpStreamDescriptor
-****
-
-include::{generated}/validity/structs/VkStreamDescriptorSurfaceCreateInfoGGP.txt[]
---
-
-On Google Games Platform, the surface extents are dynamic.
-The pname:minImageExtent will never be greater than 1080p and the
-pname:maxImageExtent will never be less than 1080p.
-The pname:currentExtent will reflect the current optimal resolution.
-
-ifdef::VK_KHR_swapchain[]
-Applications are expected to choose an appropriate size for the swapchain’s
-pname:imageExtent, within the bounds of the surface.
-Using the surface's pname:currentExtent will offer the best performance and
-quality.
-When a swapchain's pname:imageExtent does not match the surface's
-pname:currentExtent, the presentable images are scaled to the surface's
-dimensions during presentation if possible and ename:VK_SUBOPTIMAL_KHR is
-returned, otherwise presentation fails with ename:VK_ERROR_OUT_OF_DATE_KHR.
-endif::VK_KHR_swapchain[]
-
-[open,refpage='VkStreamDescriptorSurfaceCreateFlagsGGP',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkStreamDescriptorSurfaceCreateFlagsGGP.txt[]
-
-tname:VkStreamDescriptorSurfaceCreateFlagsGGP is a bitmask type for setting
-a mask, but is currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_GGP_stream_descriptor_surface/platformQuerySupport_streamdescriptor.txt b/registry/vulkan/chapters/VK_GGP_stream_descriptor_surface/platformQuerySupport_streamdescriptor.txt
deleted file mode 100644
index 4270756..0000000
--- a/registry/vulkan/chapters/VK_GGP_stream_descriptor_surface/platformQuerySupport_streamdescriptor.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformQuerySupport_streamdescriptor,platformQuerySupport_streamdescriptor]]
-=== Google Games Platform
-
-On Google Games Platform, all physical devices and queue families with the
-ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT capabilities must:
-be capable of presentation with any Google Games Platform stream descriptor.
-As a result, there is no query specific to Google Games Platform for these
-capabilities.
diff --git a/registry/vulkan/chapters/VK_GOOGLE_display_timing/PresentTimeInfo.txt b/registry/vulkan/chapters/VK_GOOGLE_display_timing/PresentTimeInfo.txt
deleted file mode 100644
index 062abbe..0000000
--- a/registry/vulkan/chapters/VK_GOOGLE_display_timing/PresentTimeInfo.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) 2018-2020 Google LLC
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-
-[open,refpage='VkPresentTimesInfoGOOGLE',desc='The earliest time each image should be presented',type='structs']
---
-When the `apiext:VK_GOOGLE_display_timing` extension is enabled, additional
-fields can: be specified that allow an application to specify the earliest
-time that an image should be displayed.
-This allows an application to avoid stutter that is caused by an image being
-displayed earlier than planned.
-Such stuttering can occur with both fixed and variable-refresh-rate
-displays, because stuttering occurs when the geometry is not correctly
-positioned for when the image is displayed.
-An application can: instruct the presentation engine that an image should
-not be displayed earlier than a specified time by adding a
-sname:VkPresentTimesInfoGOOGLE structure to the pname:pNext chain of the
-sname:VkPresentInfoKHR structure.
-
-The sname:VkPresentTimesInfoGOOGLE structure is defined as:
-
-include::{generated}/api/structs/VkPresentTimesInfoGOOGLE.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:swapchainCount is the number of swapchains being presented to by
-    this command.
-  * pname:pTimes is `NULL` or a pointer to an array of
-    sname:VkPresentTimeGOOGLE elements with pname:swapchainCount entries.
-    If not `NULL`, each element of pname:pTimes contains the earliest time
-    to present the image corresponding to the entry in the
-    sname:VkPresentInfoKHR::pname:pImageIndices array.
-
-.Valid Usage
-****
-  * [[VUID-VkPresentTimesInfoGOOGLE-swapchainCount-01247]]
-    pname:swapchainCount must: be the same value as
-    sname:VkPresentInfoKHR::pname:swapchainCount, where
-    sname:VkPresentInfoKHR is included in the pname:pNext chain of this
-    sname:VkPresentTimesInfoGOOGLE structure
-****
-
-include::{generated}/validity/structs/VkPresentTimesInfoGOOGLE.txt[]
---
-
-[open,refpage='VkPresentTimeGOOGLE',desc='The earliest time image should be presented',type='structs']
---
-The sname:VkPresentTimeGOOGLE structure is defined as:
-
-include::{generated}/api/structs/VkPresentTimeGOOGLE.txt[]
-
-  * pname:presentID is an application-provided identification value, that
-    can: be used with the results of
-    flink:vkGetPastPresentationTimingGOOGLE, in order to uniquely identify
-    this present.
-    In order to be useful to the application, it should: be unique within
-    some period of time that is meaningful to the application.
-  * pname:desiredPresentTime specifies that the image given should: not be
-    displayed to the user any earlier than this time.
-    pname:desiredPresentTime is a time in nanoseconds, relative to a
-    monotonically-increasing clock (e.g. `CLOCK_MONOTONIC` (see
-    clock_gettime(2)) on Android and Linux).
-    A value of zero specifies that the presentation engine may: display the
-    image at any time.
-    This is useful when the application desires to provide pname:presentID,
-    but does not need a specific pname:desiredPresentTime.
---
diff --git a/registry/vulkan/chapters/VK_GOOGLE_display_timing/queries.txt b/registry/vulkan/chapters/VK_GOOGLE_display_timing/queries.txt
deleted file mode 100644
index 97a9548..0000000
--- a/registry/vulkan/chapters/VK_GOOGLE_display_timing/queries.txt
+++ /dev/null
@@ -1,260 +0,0 @@
-// Copyright (c) 2016-2018 Google LLC.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-== Display Timing Queries
-
-Traditional game and real-time-animation applications frequently use
-ename:VK_PRESENT_MODE_FIFO_KHR so that presentable images are updated during
-the vertical blanking period of a given refresh cycle (RC) of the
-presentation engine's display.
-This avoids the visual anomaly known as tearing.
-
-However, synchronizing the presentation of images with the RC does not
-prevent all forms of visual anomalies.
-Stuttering occurs when the geometry for each presentable image is not
-accurately positioned for when that image will be displayed.
-The geometry may appear to move too little some RCs, and too much for
-others.
-Sometimes the animation appears to freeze, when the same image is used for
-more than one RC.
-
-In order to minimize stuttering, an application needs to correctly position
-their geometry for when the presentable image will be displayed to the user.
-To accomplish this, applications need various timing information about the
-presentation engine's display.
-They need to know when presentable images were actually presented, and when
-they could have been presented.
-Applications also need to tell the presentation engine to display an image
-no sooner than a given time.
-This can allow the application's animation to look smooth to the user, with
-no stuttering.
-The `VK_GOOGLE_display_timing` extension allows an application to satisfy
-these needs.
-
-The presentation engine's display typically refreshes the pixels that are
-displayed to the user on a periodic basis.
-The period may be fixed or variable.
-In many cases, the presentation engine is associated with fixed refresh rate
-(FRR) display technology, with a fixed refresh rate (RR, e.g. 60Hz).
-In some cases, the presentation engine is associated with variable refresh
-rate (VRR) display technology, where each refresh cycle (RC) can vary in
-length.
-This extension treats VRR displays as if they are FRR.
-
-[open,refpage='vkGetRefreshCycleDurationGOOGLE',desc='Obtain the RC duration of the PE\'s display',type='protos']
---
-To query the duration of a refresh cycle (RC) for the presentation engine's
-display, call:
-
-include::{generated}/api/protos/vkGetRefreshCycleDurationGOOGLE.txt[]
-
-  * pname:device is the device associated with pname:swapchain.
-  * pname:swapchain is the swapchain to obtain the refresh duration for.
-  * pname:pDisplayTimingProperties is a pointer to a
-    sname:VkRefreshCycleDurationGOOGLE structure.
-
-include::{generated}/validity/protos/vkGetRefreshCycleDurationGOOGLE.txt[]
---
-
-[open,refpage='VkRefreshCycleDurationGOOGLE',desc='Structure containing the RC duration of a display',type='structs']
---
-The sname:VkRefreshCycleDurationGOOGLE structure is defined as:
-
-include::{generated}/api/structs/VkRefreshCycleDurationGOOGLE.txt[]
-
-  * pname:refreshDuration is the number of nanoseconds from the start of one
-    refresh cycle to the next.
-
-include::{generated}/validity/structs/VkRefreshCycleDurationGOOGLE.txt[]
---
-
-[NOTE]
-.Note
-====
-The rate at which an application renders and presents new images is known as
-the image present rate (IPR, aka frame rate).
-The inverse of IPR, or the duration between each image present, is the image
-present duration (IPD).
-In order to provide a smooth, stutter-free animation, an application will
-want its IPD to be a multiple of pname:refreshDuration.
-For example, if a display has a 60Hz refresh rate, pname:refreshDuration
-will be a value in nanoseconds that is approximately equal to 16.67ms.
-In such a case, an application will want an IPD of 16.67ms (1X multiplier of
-pname:refreshDuration), or 33.33ms (2X multiplier of pname:refreshDuration),
-or 50.0ms (3X multiplier of pname:refreshDuration), etc.
-
-In order to determine a target IPD for a display (i.e. a multiple of
-pname:refreshDuration), an application needs to determine when its images
-are actually displayed.
-Let's say that an application has an initial target IPD of 16.67ms (1X
-multiplier of pname:refreshDuration).
-It will therefore position the geometry of a new image 16.67ms later than
-the previous image.
-Let's say that this application is running on slower hardware, so that it
-actually takes 20ms to render each new image.
-This will create visual anomalies, because the images will not be displayed
-to the user every 16.67ms, nor every 20ms.
-In this case, it is better for the application to adjust its target IPD to
-33.33ms (i.e. a 2X multiplier of pname:refreshDuration), and tell the
-presentation engine to not present images any sooner than every 33.33ms.
-This will allow the geometry to be correctly positioned for each presentable
-image.
-
-Adjustments to an application's IPD may be needed because different views of
-an application's geometry can take different amounts of time to render.
-For example, looking at the sky may take less time to render than looking at
-multiple, complex items in a room.
-In general, it is good to not frequently change IPD, as that can cause
-visual anomalies.
-Adjustments to a larger IPD because of late images should happen quickly,
-but adjustments to a smaller IPD should only happen if the
-pname:actualPresentTime and pname:earliestPresentTime members of the
-slink:VkPastPresentationTimingGOOGLE structure are consistently different,
-and if pname:presentMargin is consistently large, over multiple images.
-====
-
-[open,refpage='vkGetPastPresentationTimingGOOGLE',desc='Obtain timing of a previously-presented image',type='protos']
---
-The implementation will maintain a limited amount of history of timing
-information about previous presents.
-Because of the asynchronous nature of the presentation engine, the timing
-information for a given flink:vkQueuePresentKHR command will become
-available some time later.
-These time values can be asynchronously queried, and will be returned if
-available.
-All time values are in nanoseconds, relative to a monotonically-increasing
-clock (e.g. `CLOCK_MONOTONIC` (see clock_gettime(2)) on Android and Linux).
-
-To asynchronously query the presentation engine, for newly-available timing
-information about one or more previous presents to a given swapchain, call:
-
-include::{generated}/api/protos/vkGetPastPresentationTimingGOOGLE.txt[]
-
-  * pname:device is the device associated with pname:swapchain.
-  * pname:swapchain is the swapchain to obtain presentation timing
-    information duration for.
-  * pname:pPresentationTimingCount is a pointer to an integer related to the
-    number of sname:VkPastPresentationTimingGOOGLE structures to query, as
-    described below.
-  * pname:pPresentationTimings is either `NULL` or a pointer to an array of
-    sname:VkPastPresentationTimingGOOGLE structures.
-
-If pname:pPresentationTimings is `NULL`, then the number of newly-available
-timing records for the given pname:swapchain is returned in
-pname:pPresentationTimingCount.
-Otherwise, pname:pPresentationTimingCount must: point to a variable set by
-the user to the number of elements in the pname:pPresentationTimings array,
-and on return the variable is overwritten with the number of structures
-actually written to pname:pPresentationTimings.
-If the value of pname:pPresentationTimingCount is less than the number of
-newly-available timing records, at most pname:pPresentationTimingCount
-structures will be written, and ename:VK_INCOMPLETE will be returned instead
-of ename:VK_SUCCESS, to indicate that not all the available timing records
-were returned.
-
-include::{generated}/validity/protos/vkGetPastPresentationTimingGOOGLE.txt[]
---
-
-[open,refpage='VkPastPresentationTimingGOOGLE',desc='Structure containing timing information about a previously-presented image',type='structs']
---
-The sname:VkPastPresentationTimingGOOGLE structure is defined as:
-
-include::{generated}/api/structs/VkPastPresentationTimingGOOGLE.txt[]
-
-  * pname:presentID is an application-provided value that was given to a
-    previous fname:vkQueuePresentKHR command via
-    slink:VkPresentTimeGOOGLE::pname:presentID (see below).
-    It can: be used to uniquely identify a previous present with the
-    flink:vkQueuePresentKHR command.
-  * pname:desiredPresentTime is an application-provided value that was given
-    to a previous flink:vkQueuePresentKHR command via
-    slink:VkPresentTimeGOOGLE::pname:desiredPresentTime.
-    If non-zero, it was used by the application to indicate that an image
-    not be presented any sooner than pname:desiredPresentTime.
-  * pname:actualPresentTime is the time when the image of the
-    pname:swapchain was actually displayed.
-  * pname:earliestPresentTime is the time when the image of the
-    pname:swapchain could have been displayed.
-    This may: differ from pname:actualPresentTime if the application
-    requested that the image be presented no sooner than
-    slink:VkPresentTimeGOOGLE::pname:desiredPresentTime.
-  * pname:presentMargin is an indication of how early the
-    fname:vkQueuePresentKHR command was processed compared to how soon it
-    needed to be processed, and still be presented at
-    pname:earliestPresentTime.
-
-The results for a given pname:swapchain and pname:presentID are only
-returned once from fname:vkGetPastPresentationTimingGOOGLE.
-
-The application can: use the sname:VkPastPresentationTimingGOOGLE values to
-occasionally adjust its timing.
-For example, if pname:actualPresentTime is later than expected (e.g. one
-pname:refreshDuration late), the application may increase its target IPD to
-a higher multiple of pname:refreshDuration (e.g. decrease its frame rate
-from 60Hz to 30Hz).
-If pname:actualPresentTime and pname:earliestPresentTime are consistently
-different, and if pname:presentMargin is consistently large enough, the
-application may decrease its target IPD to a smaller multiple of
-pname:refreshDuration (e.g. increase its frame rate from 30Hz to 60Hz).
-If pname:actualPresentTime and pname:earliestPresentTime are same, and if
-pname:presentMargin is consistently high, the application may delay the
-start of its input-render-present loop in order to decrease the latency
-between user input and the corresponding present (always leaving some margin
-in case a new image takes longer to render than the previous image).
-An application that desires its target IPD to always be the same as
-pname:refreshDuration, can also adjust features until
-pname:actualPresentTime is never late and pname:presentMargin is
-satisfactory.
---
-
-The full `apiext:VK_GOOGLE_display_timing` extension semantics are described
-for swapchains created with ename:VK_PRESENT_MODE_FIFO_KHR.
-For example, non-zero values of
-sname:VkPresentTimeGOOGLE::pname:desiredPresentTime must: be honored, and
-fname:vkGetPastPresentationTimingGOOGLE should: return a
-sname:VkPastPresentationTimingGOOGLE structure with valid values for all
-images presented with fname:vkQueuePresentKHR.
-The semantics for other present modes are as follows:
-
-  * ename:VK_PRESENT_MODE_IMMEDIATE_KHR.
-    The presentation engine may: ignore non-zero values of
-    sname:VkPresentTimeGOOGLE::pname:desiredPresentTime in favor of
-    presenting immediately.
-    The value of
-    sname:VkPastPresentationTimingGOOGLE::pname:earliestPresentTime must: be
-    the same as
-    sname:VkPastPresentationTimingGOOGLE::pname:actualPresentTime, which
-    should: be when the presentation engine displayed the image.
-  * ename:VK_PRESENT_MODE_MAILBOX_KHR.
-    The intention of using this present mode with this extension is to
-    handle cases where an image is presented late, and the next image is
-    presented soon enough to replace it at the next vertical blanking
-    period.
-    For images that are displayed to the user, the value of
-    sname:VkPastPresentationTimingGOOGLE::pname:actualPresentTime must: be
-    when the image was displayed.
-    For images that are not displayed to the user,
-    fname:vkGetPastPresentationTimingGOOGLE may: not return a
-    sname:VkPastPresentationTimingGOOGLE structure, or it may: return a
-    sname:VkPastPresentationTimingGOOGLE structure with the value of zero
-    for both sname:VkPastPresentationTimingGOOGLE::pname:actualPresentTime
-    and sname:VkPastPresentationTimingGOOGLE::pname:earliestPresentTime.
-    It is possible that an application can: submit images with
-    sname:VkPresentTimeGOOGLE::pname:desiredPresentTime values such that new
-    images may: not be displayed.
-    For example, if sname:VkPresentTimeGOOGLE::pname:desiredPresentTime is
-    far enough in the future that an image is not presented before
-    fname:vkQueuePresentKHR is called to present another image, the first
-    image will not be displayed to the user.
-    If the application continues to do that, the presentation may: not
-    display new images.
-  * ename:VK_PRESENT_MODE_FIFO_RELAXED_KHR.
-    For images that are presented in time to be displayed at the next
-    vertical blanking period, the semantics are identical as for
-    ename:VK_PRESENT_MODE_FIFO_RELAXED_KHR.
-    For images that are presented late, and are displayed after the start of
-    the vertical blanking period (i.e. with tearing), the values of
-    sname:VkPastPresentationTimingGOOGLE may: be treated as if the image was
-    displayed at the start of the vertical blanking period, or may: be
-    treated the same as for ename:VK_PRESENT_MODE_IMMEDIATE_KHR.
diff --git a/registry/vulkan/chapters/VK_INTEL_performance_query/queries.txt b/registry/vulkan/chapters/VK_INTEL_performance_query/queries.txt
deleted file mode 100644
index 1b750a8..0000000
--- a/registry/vulkan/chapters/VK_INTEL_performance_query/queries.txt
+++ /dev/null
@@ -1,380 +0,0 @@
-// Copyright (c) 2018-2020 Intel Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-ifdef::VK_INTEL_performance_query[]
-[[queries-performance-intel]]
-== Intel performance queries
-
-Intel performance queries allow an application to capture performance data
-for a set of commands.
-Performance queries are used in a similar way than other types of queries.
-A main difference with existing queries is that the resulting data should be
-handed over to a library capabable to produce human readable results rather
-than being read directly by an application.
-
-[open,refpage='vkInitializePerformanceApiINTEL',desc='Initialize a device for performance queries',type='protos']
---
-Prior to creating a performance query pool, initialize the device for
-performance queries with the call:
-
-include::{generated}/api/protos/vkInitializePerformanceApiINTEL.txt[]
-
-  * pname:device is the logical device used for the queries.
-  * pname:pInitializeInfo is a pointer to a
-    slink:VkInitializePerformanceApiInfoINTEL structure specifying
-    initialization parameters.
-
-include::{generated}/validity/protos/vkInitializePerformanceApiINTEL.txt[]
---
-
-[open,refpage='VkInitializePerformanceApiInfoINTEL',desc='Structure specifying parameters of initialize of the device',type='structs']
---
-The sname:VkInitializePerformanceApiInfoINTEL structure is defined as :
-
-include::{generated}/api/structs/VkInitializePerformanceApiInfoINTEL.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pUserData is a pointer for application data.
-
-include::{generated}/validity/structs/VkInitializePerformanceApiInfoINTEL.txt[]
---
-
-[open,refpage='vkUninitializePerformanceApiINTEL',desc='Uninitialize a device for performance queries',type='protos']
---
-Once performance query operations have completed, uninitalize the device for
-performance queries with the call:
-
-include::{generated}/api/protos/vkUninitializePerformanceApiINTEL.txt[]
-
-  * pname:device is the logical device used for the queries.
-
-include::{generated}/validity/protos/vkUninitializePerformanceApiINTEL.txt[]
---
-
-[open,refpage='vkGetPerformanceParameterINTEL',desc='Query performance capabilities of the device',type='protos']
---
-Some performance query features of a device can be discovered with the call:
-
-include::{generated}/api/protos/vkGetPerformanceParameterINTEL.txt[]
-
-  * pname:device is the logical device to query.
-  * pname:parameter is the parameter to query.
-  * pname:pValue is a pointer to a slink:VkPerformanceValueINTEL structure
-    in which the type and value of the parameter are returned.
-
-include::{generated}/validity/protos/vkGetPerformanceParameterINTEL.txt[]
---
-
-[open,refpage='VkPerformanceParameterTypeINTEL',desc='Parameters that can be queried',type='enums']
---
-Possible values of flink:vkGetPerformanceParameterINTEL::pname:parameter,
-specifying a performance query feature, are:
-
-include::{generated}/api/enums/VkPerformanceParameterTypeINTEL.txt[]
-
-  * ename:VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL has a
-    boolean result which tells whether hardware counters can be captured.
-  * ename:VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL has a
-    32 bits integer result which tells how many bits can be written into the
-    sname:VkPerformanceValueINTEL value.
---
-
-[open,refpage='VkPerformanceValueINTEL',desc='Container for value and types of parameters that can be queried',type='structs']
---
-The sname:VkPerformanceValueINTEL structure is defined as:
-
-include::{generated}/api/structs/VkPerformanceValueINTEL.txt[]
-
-  * pname:type is a elink:VkPerformanceValueTypeINTEL value specifying the
-    type of the returned data.
-  * pname:data is a slink:VkPerformanceValueDataINTEL union specifying the
-    value of the returned data.
-
-include::{generated}/validity/structs/VkPerformanceValueINTEL.txt[]
---
-
-[open,refpage='VkPerformanceValueTypeINTEL',desc='Type of the parameters that can be queried',type='enums']
---
-Possible values of slink:VkPerformanceValueINTEL::pname:type, specifying the
-type of the data returned in slink:VkPerformanceValueINTEL::pname:data, are:
-
-  * ename:VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL specifies that unsigned
-    32-bit integer data is returned in pname:data.value32.
-  * ename:VK_PERFORMANCE_VALUE_TYPE_UINT64_INTEL specifies that unsigned
-    64-bit integer data is returned in pname:data.value64.
-  * ename:VK_PERFORMANCE_VALUE_TYPE_FLOAT_INTEL specifies that
-    floating-point data is returned in pname:data.valueFloat.
-  * ename:VK_PERFORMANCE_VALUE_TYPE_BOOL_INTEL specifies that
-    basetype:Bool32 data is returned in pname:data.valueBool.
-  * ename:VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL specifies that a pointer to
-    a null-terminated UTF-8 string is returned in pname:data.valueString.
-    The pointer is valid for the lifetime of the pname:device parameter
-    passed to flink:vkGetPerformanceParameterINTEL.
-
-include::{generated}/api/enums/VkPerformanceValueTypeINTEL.txt[]
---
-
-[open,refpage='VkPerformanceValueDataINTEL',desc='Values returned for the parameters',type='structs']
---
-The sname:VkPerformanceValueDataINTEL union is defined as:
-
-include::{generated}/api/structs/VkPerformanceValueDataINTEL.txt[]
-
-  * pname:data.value32 represents 32-bit integer data.
-  * pname:data.value64 represents 64-bit integer data.
-  * pname:data.valueFloat represents floating-point data.
-  * pname:data.valueBool represents basetype:Bool32 data.
-  * pname:data.valueString represents a pointer to a null-terminated UTF-8
-    string.
-
-The correct member of the union is determined by the associated
-elink:VkPerformanceValueTypeINTEL value.
-
-include::{generated}/validity/structs/VkPerformanceValueDataINTEL.txt[]
---
-
-[open,refpage='VkQueryPoolPerformanceQueryCreateInfoINTEL',desc='Structure specifying parameters to create a pool of performance queries',type='structs',alias='VkQueryPoolCreateInfoINTEL']
---
-The sname:VkQueryPoolPerformanceQueryCreateInfoINTEL structure is defined
-as:
-
-include::{generated}/api/structs/VkQueryPoolPerformanceQueryCreateInfoINTEL.txt[]
-
-include::{generated}/api/structs/VkQueryPoolCreateInfoINTEL.txt[]
-
-To create a pool for Intel performance queries, set
-slink:VkQueryPoolCreateInfo::pname:queryType to
-ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL and add a
-sname:VkQueryPoolPerformanceQueryCreateInfoINTEL structure to the
-pname:pNext chain of the slink:VkQueryPoolCreateInfo structure.
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:performanceCountersSampling describe how performance queries
-    should be captured.
-
-include::{generated}/validity/structs/VkQueryPoolPerformanceQueryCreateInfoINTEL.txt[]
---
-
-[open,refpage='VkQueryPoolSamplingModeINTEL',desc='Enum specifying how performance queries should be captured',type='enums']
---
-Possible values of
-slink:VkQueryPoolPerformanceQueryCreateInfoINTEL::pname:performanceCountersSampling
-are:
-
-include::{generated}/api/enums/VkQueryPoolSamplingModeINTEL.txt[]
-
-  * ename:VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL is the default mode in
-    which the application calls flink:vkCmdBeginQuery and
-    flink:vkCmdEndQuery to record performance data.
---
-
-[open,refpage='vkCmdSetPerformanceMarkerINTEL',desc='Markers',type='protos']
---
-To help associate query results with a particular point at which an
-application emitted commands, markers can be set into the command buffers
-with the call:
-
-include::{generated}/api/protos/vkCmdSetPerformanceMarkerINTEL.txt[]
-
-The last marker set onto a command buffer before the end of a query will be
-part of the query result.
-
-include::{generated}/validity/protos/vkCmdSetPerformanceMarkerINTEL.txt[]
---
-
-[open,refpage='VkPerformanceMarkerInfoINTEL',desc='Structure specifying performance markers',type='structs']
---
-The sname:VkPerformanceMarkerInfoINTEL structure is defined as:
-
-include::{generated}/api/structs/VkPerformanceMarkerInfoINTEL.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:marker is the marker value that will be recorded into the opaque
-    query results.
-
-include::{generated}/validity/structs/VkPerformanceMarkerInfoINTEL.txt[]
---
-
-[open,refpage='vkCmdSetPerformanceStreamMarkerINTEL',desc='Markers',type='protos']
---
-When monitoring the behavior of an application wihtin the dataset generated
-by the entire set of applications running on the system, it is useful to
-identify draw calls within a potentially huge amount of performance data.
-To do so, application can generate stream markers that will be used to trace
-back a particular draw call with a particular performance data item.
-
-include::{generated}/api/protos/vkCmdSetPerformanceStreamMarkerINTEL.txt[]
-
-include::{generated}/validity/protos/vkCmdSetPerformanceStreamMarkerINTEL.txt[]
---
-
-[open,refpage='VkPerformanceStreamMarkerInfoINTEL',desc='Structure specifying stream performance markers',type='structs']
---
-The sname:VkPerformanceStreamMarkerInfoINTEL structure is defined as:
-
-include::{generated}/api/structs/VkPerformanceStreamMarkerInfoINTEL.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:marker is the marker value that will be recorded into the reports
-    consumed by an external application.
-
-.Valid Usage
-****
-  * [[VUID-VkPerformanceStreamMarkerInfoINTEL-marker-02735]]
-    The value written by the application into pname:marker must: only used
-    the valid bits as reported by flink:vkGetPerformanceParameterINTEL with
-    the ename:VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL
-****
-
-include::{generated}/validity/structs/VkPerformanceStreamMarkerInfoINTEL.txt[]
---
-
-[open,refpage='vkCmdSetPerformanceOverrideINTEL',desc='Performance override settings',type='protos']
---
-Some applications might want measure the effect of a set of commands with a
-different settings.
-It is possible to override a particular settings using :
-
-include::{generated}/api/protos/vkCmdSetPerformanceOverrideINTEL.txt[]
-
-  * pname:commandBuffer is the command buffer where the override takes
-    place.
-  * pname:pOverrideInfo is a pointer to a
-    slink:VkPerformanceOverrideInfoINTEL structure selecting the parameter
-    to override.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetPerformanceOverrideINTEL-pOverrideInfo-02736]]
-    pname:pOverrideInfo must: not be used with a
-    elink:VkPerformanceOverrideTypeINTEL that is not reported available by
-    fname:vkGetPerformanceParameterINTEL
-****
-
-include::{generated}/validity/protos/vkCmdSetPerformanceOverrideINTEL.txt[]
---
-
-[open,refpage='VkPerformanceOverrideInfoINTEL',desc='Performance override information',type='structs']
---
-The sname:VkPerformanceOverrideInfoINTEL structure is defined as:
-
-include::{generated}/api/structs/VkPerformanceOverrideInfoINTEL.txt[]
-
-  * pname:type is the particular elink:VkPerformanceOverrideTypeINTEL to
-    set.
-  * pname:enable defines whether the override is enabled.
-  * pname:parameter is a potential required parameter for the override.
-
-include::{generated}/validity/structs/VkPerformanceOverrideInfoINTEL.txt[]
---
-
-[open,refpage='VkPerformanceOverrideTypeINTEL',desc='Performance override type',type='enums']
---
-Possible values of slink:VkPerformanceOverrideInfoINTEL::pname:type,
-specifying performance override types, are:
-
-include::{generated}/api/enums/VkPerformanceOverrideTypeINTEL.txt[]
-
-  * ename:VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL turns all
-    rendering operations into noop.
-  * ename:VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL stalls the
-    stream of commands until all previously emitted commands have completed
-    and all caches been flushed and invalidated.
---
-
-[open,refpage='VkPerformanceConfigurationINTEL',desc='Device configuration for performance queries',type='handles']
---
-Before submitting command buffers containing performance queries commands to
-a device queue, the application must acquire and set a performance query
-configuration.
-The configuration can be released once all command buffers containing
-performance query commands are not in a pending state.
-
-include::{generated}/api/handles/VkPerformanceConfigurationINTEL.txt[]
---
-
-[open,refpage='vkAcquirePerformanceConfigurationINTEL',desc='Acquire the performance query capability',type='protos']
---
-To acquire a device performance configuration, call:
-
-include::{generated}/api/protos/vkAcquirePerformanceConfigurationINTEL.txt[]
-
-  * pname:device is the logical device that the performance query commands
-    will be submitted to.
-  * pname:pAcquireInfo is a pointer to a
-    slink:VkPerformanceConfigurationAcquireInfoINTEL structure, specifying
-    the performance configuration to acquire.
-  * pname:pConfiguration is a pointer to a
-    sname:VkPerformanceConfigurationINTEL handle in which the resulting
-    configuration object is returned.
-
-include::{generated}/validity/protos/vkAcquirePerformanceConfigurationINTEL.txt[]
---
-
-[open,refpage='VkPerformanceConfigurationAcquireInfoINTEL',desc='Acquire a configuration to capture performance data',type='structs']
---
-The sname:VkPerformanceConfigurationAcquireInfoINTEL structure is defined
-as:
-
-include::{generated}/api/structs/VkPerformanceConfigurationAcquireInfoINTEL.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:type is one of the elink:VkPerformanceConfigurationTypeINTEL type
-    of performance configuration that will be acquired.
-
-include::{generated}/validity/structs/VkPerformanceConfigurationAcquireInfoINTEL.txt[]
---
-
-[open,refpage='VkPerformanceConfigurationTypeINTEL',desc='Type of performance configuration',type='enums']
---
-Possible values of
-slink:VkPerformanceConfigurationAcquireInfoINTEL::pname:type, specifying
-performance configuration types, are:
-
-include::{generated}/api/enums/VkPerformanceConfigurationTypeINTEL.txt[]
---
-
-[open,refpage='vkQueueSetPerformanceConfigurationINTEL',desc='Set a performance query',type='protos']
---
-To set a performance configuration, call:
-
-include::{generated}/api/protos/vkQueueSetPerformanceConfigurationINTEL.txt[]
-
-  * pname:queue is the queue on which the configuration will be used.
-  * pname:configuration is the configuration to use.
-
-include::{generated}/validity/protos/vkQueueSetPerformanceConfigurationINTEL.txt[]
---
-
-[open,refpage='vkReleasePerformanceConfigurationINTEL',desc='Release a configuration to capture performance data',type='protos']
---
-To release a device performance configuration, call:
-
-include::{generated}/api/protos/vkReleasePerformanceConfigurationINTEL.txt[]
-
-  * pname:device is the device associated to the configuration object to
-    release.
-  * pname:configuration is the configuration object to release.
-
-.Valid Usage
-****
-  * [[VUID-vkReleasePerformanceConfigurationINTEL-configuration-02737]]
-    pname:configuration must: not be released before all command buffers
-    submitted while the configuration was set are in
-    <<commandbuffers-lifecycle, pending state>>
-****
-
-include::{generated}/validity/protos/vkReleasePerformanceConfigurationINTEL.txt[]
---
-endif::VK_INTEL_performance_query[]
diff --git a/registry/vulkan/chapters/VK_KHR_android_surface/platformCreateSurface_android.txt b/registry/vulkan/chapters/VK_KHR_android_surface/platformCreateSurface_android.txt
deleted file mode 100644
index 33783ef..0000000
--- a/registry/vulkan/chapters/VK_KHR_android_surface/platformCreateSurface_android.txt
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformCreateSurface_android,platformCreateSurface_android]]
-=== Android Platform
-
-[open,refpage='vkCreateAndroidSurfaceKHR',desc='Create a slink:VkSurfaceKHR object for an Android native window',type='protos']
---
-To create a sname:VkSurfaceKHR object for an Android native window, call:
-
-include::{generated}/api/protos/vkCreateAndroidSurfaceKHR.txt[]
-
-  * pname:instance is the instance to associate the surface with.
-  * pname:pCreateInfo is a pointer to a sname:VkAndroidSurfaceCreateInfoKHR
-    structure containing parameters affecting the creation of the surface
-    object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a slink:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-During the lifetime of a surface created using a particular
-basetype:ANativeWindow handle any attempts to create another surface for the
-same basetype:ANativeWindow and any attempts to connect to the same
-basetype:ANativeWindow through other platform mechanisms will fail.
-
-[NOTE]
-.Note
-====
-In particular, only one sname:VkSurfaceKHR can: exist at a time for a given
-window.
-Similarly, a native window cannot: be used by both a sname:VkSurfaceKHR and
-code:EGLSurface simultaneously.
-====
-
-If successful, fname:vkCreateAndroidSurfaceKHR increments the
-basetype:ANativeWindow's reference count, and fname:vkDestroySurfaceKHR will
-decrement it.
-
-On Android, when a swapchain's pname:imageExtent does not match the
-surface's pname:currentExtent, the presentable images will be scaled to the
-surface's dimensions during presentation.
-pname:minImageExtent is [eq]#(1,1)#, and pname:maxImageExtent is the maximum
-image size supported by the consumer.
-For the system compositor, pname:currentExtent is the window size (i.e. the
-consumer's preferred size).
-
-include::{generated}/validity/protos/vkCreateAndroidSurfaceKHR.txt[]
---
-
-[open,refpage='VkAndroidSurfaceCreateInfoKHR',desc='Structure specifying parameters of a newly created Android surface object',type='structs']
---
-The sname:VkAndroidSurfaceCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkAndroidSurfaceCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:window is a pointer to the basetype:ANativeWindow to associate the
-    surface with.
-
-.Valid Usage
-****
-  * [[VUID-VkAndroidSurfaceCreateInfoKHR-window-01248]]
-    pname:window must: point to a valid Android basetype:ANativeWindow
-****
-
-include::{generated}/validity/structs/VkAndroidSurfaceCreateInfoKHR.txt[]
---
-
-[open,refpage='ANativeWindow',desc='Android native window type',type='basetypes']
---
-To remove an unnecessary compile-time dependency, an incomplete type
-definition of basetype:ANativeWindow is provided in the Vulkan headers:
-
-include::{generated}/api/basetypes/ANativeWindow.txt[]
-
-The actual basetype:ANativeWindow type is defined in Android NDK headers.
---
-
-[open,refpage='VkAndroidSurfaceCreateFlagsKHR',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkAndroidSurfaceCreateFlagsKHR.txt[]
-
-tname:VkAndroidSurfaceCreateFlagsKHR is a bitmask type for setting a mask,
-but is currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_KHR_android_surface/platformQuerySupport_android.txt b/registry/vulkan/chapters/VK_KHR_android_surface/platformQuerySupport_android.txt
deleted file mode 100644
index 02fda23..0000000
--- a/registry/vulkan/chapters/VK_KHR_android_surface/platformQuerySupport_android.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformQuerySupport_android,platformQuerySupport_android]]
-=== Android Platform
-
-On Android, all physical devices and queue families must: be capable of
-presentation with any native window.
-As a result there is no Android-specific query for these capabilities.
-
diff --git a/registry/vulkan/chapters/VK_KHR_deferred_host_operations/deferred_host_operations.txt b/registry/vulkan/chapters/VK_KHR_deferred_host_operations/deferred_host_operations.txt
deleted file mode 100644
index ba20ec6..0000000
--- a/registry/vulkan/chapters/VK_KHR_deferred_host_operations/deferred_host_operations.txt
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[deferred-host-operations]]
-= Deferred Host Operations
-
-Certain Vulkan commands are inherently expensive for the host CPU to
-execute.
-It is often desirable to offload such work onto background threads, and to
-parallelize the work across multiple CPUs.
-The concept of _deferred operations_ allows applications and drivers to
-coordinate the execution of expensive host commands using an
-application-managed thread pool.
-
-The `apiext:VK_KHR_deferred_host_operations` extension defines the
-infrastructure and usage patterns for _deferrable commands_, but does not
-specify any commands as deferrable.
-This is left to additional dependant extensions.
-Commands must: not be deferred unless the deferral is specifically allowed
-by another extension which depends on
-`apiext:VK_KHR_deferred_host_operations`.
-This specification will refer to such extensions as _deferral extensions_.
-
-
-[[deferred-host-operations-requesting]]
-== Requesting Deferral
-
-When an application requests an operation deferral, the implementation may:
-defer the operation.
-When deferral is requested and the implementation defers any operation, the
-implementation must: return ename:VK_OPERATION_DEFERRED_KHR as the success
-code if no errors occurred.
-When deferral is requested, the implementation should: defer the operation
-when the workload is significant, however if the implementation chooses not
-to defer any of the requested operations and instead executes all of them
-immediately, the implementation must: return
-ename:VK_OPERATION_NOT_DEFERRED_KHR as the success code if no errors
-occurred.
-
-A deferred operation is created _complete_ with an initial result value of
-ename:VK_SUCCESS.
-The deferred operation becomes _pending_ when an operation has been
-successfully deferred with that deferred operation object.
-
-A deferred operation is considered pending until the deferred operation
-completes.
-A pending deferred operation becomes _complete_ when it has been fully
-executed by one or more threads.
-Pending deferred operations will never complete until they are _joined_ by
-an application thread, using flink:vkDeferredOperationJoinKHR.
-Applications can: join multiple threads to the same deferred operation,
-enabling concurrent execution of subtasks within that operation.
-
-The application can: query the status of a slink:VkDeferredOperationKHR
-using the flink:vkGetDeferredOperationMaxConcurrencyKHR or
-flink:vkGetDeferredOperationResultKHR commands.
-
-Parameters to the command requesting a deferred operation may: be accessed
-at any time until the deferred operation enters the pending state.
-While a deferred operation is pending:
-
-  * Externally synchronized parameters must: not be accessed.
-  * Pointer parameters must: not be modified (e.g. reallocated/freed).
-  * The contents of pointer parameters which may: be read by the command
-    must: not be modified.
-  * The contents of pointer parameters which may: be written by the command
-    must: not be read.
-  * Vulkan object parameters must: not be passed as externally synchronized
-    parameters to any other command.
-
-When the deferred operation is complete, the application should: call
-flink:vkGetDeferredOperationResultKHR to obtain the elink:VkResult
-indicating success or failure of the operation.
-The elink:VkResult value returned will be one of the values that the command
-requesting the deferred operation is able to return.
-Writes to output parameters of the requesting command will happen-before the
-deferred operation is complete.
-
-
-== Deferred Host Operations API
-
-[open,refpage='VkDeferredOperationKHR',desc='A deferred operation',type='handles']
---
-The sname:VkDeferredOperationKHR handle is defined as:
-
-include::{generated}/api/handles/VkDeferredOperationKHR.txt[]
-
-This handle refers to a tracking structure which manages the execution state
-for a deferred command.
---
-
-[open,refpage='vkCreateDeferredOperationKHR',desc='Create a deferred operation handle',type='protos']
---
-:refpage: vkCreateDeferredOperationKHR
-
-To construct the tracking object for a deferred command, call:
-
-include::{generated}/api/protos/vkCreateDeferredOperationKHR.txt[]
-
-  * pname:device is the device which owns pname:operation.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation,Memory Allocation>> chapter.
-  * pname:pDeferredOperation is a pointer to a handle in which the created
-    slink:VkDeferredOperationKHR is returned.
-
-include::{generated}/validity/protos/vkCreateDeferredOperationKHR.txt[]
---
-
-[open,refpage='vkDeferredOperationJoinKHR',desc='Assign a thread to a deferred operation',type='protos']
---
-:refpage: vkDeferredOperationJoinKHR
-
-To assign a thread to a deferred operation, call:
-
-include::{generated}/api/protos/vkDeferredOperationJoinKHR.txt[]
-
-  * pname:device is the device which owns pname:operation.
-  * pname:operation is the deferred operation that the calling thread should
-    work on.
-
-The fname:vkDeferredOperationJoinKHR command will execute a portion of the
-deferred operation on the calling thread.
-
-The return value will be one of the following:
-
-  * A return value of ename:VK_SUCCESS indicates that pname:operation is
-    complete.
-    The application should: use flink:vkGetDeferredOperationResultKHR to
-    retrieve the result of pname:operation.
-  * A return value of ename:VK_THREAD_DONE_KHR indicates that the deferred
-    operation is not complete, but there is no work remaining to assign to
-    threads.
-    Future calls to flink:vkDeferredOperationJoinKHR are not necessary and
-    will simply harm performance.
-    This situation may: occur when other threads executing
-    flink:vkDeferredOperationJoinKHR are about to complete pname:operation,
-    and the implementation is unable to partition the workload any further.
-  * A return value of ename:VK_THREAD_IDLE_KHR indicates that the deferred
-    operation is not complete, and there is no work for the thread to do at
-    the time of the call.
-    This situation may: occur if the operation encounters a temporary
-    reduction in parallelism.
-    By returning ename:VK_THREAD_IDLE_KHR, the implementation is signaling
-    that it expects that more opportunities for parallelism will emerge as
-    execution progresses, and that future calls to
-    flink:vkDeferredOperationJoinKHR can: be beneficial.
-    In the meantime, the application can: perform other work on the calling
-    thread.
-
-Implementations must: guarantee forward progress by enforcing the following
-invariants:
-
-  1. If only one thread has invoked flink:vkDeferredOperationJoinKHR on a
-     given operation, that thread must: execute the operation to completion
-     and return ename:VK_SUCCESS.
-  2. If multiple threads have concurrently invoked
-     flink:vkDeferredOperationJoinKHR on the same operation, then at least
-     one of them must: complete the operation and return ename:VK_SUCCESS.
-
-include::{generated}/validity/protos/vkDeferredOperationJoinKHR.txt[]
---
-
-[open,refpage='vkDestroyDeferredOperationKHR',desc='Destroy a deferred operation handle',type='protos']
---
-:refpage: vkDestroyDeferredOperationKHR
-
-When a deferred operation is completed, the application can: destroy the
-tracking object by calling:
-
-include::{generated}/api/protos/vkDestroyDeferredOperationKHR.txt[]
-
-  * pname:device is the device which owns pname:operation.
-  * pname:operation is the completed operation to be destroyed.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation,Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyDeferredOperationKHR-operation-03434]]
-    If sname:VkAllocationCallbacks were provided when pname:operation was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyDeferredOperationKHR-operation-03435]]
-    If no sname:VkAllocationCallbacks were provided when pname:operation was
-    created, pname:pAllocator must: be `NULL`
-  * [[VUID-vkDestroyDeferredOperationKHR-operation-03436]]
-    pname:operation must: be completed
-****
-include::{generated}/validity/protos/vkDestroyDeferredOperationKHR.txt[]
---
-
-[open,refpage='vkGetDeferredOperationMaxConcurrencyKHR',desc='Query the maximum concurrency on a deferred operation',type='protos']
---
-:refpage: vkGetDeferredOperationMaxConcurrencyKHR
-
-To query the number of additional threads that can usefully be joined to a
-deferred operation, call:
-
-include::{generated}/api/protos/vkGetDeferredOperationMaxConcurrencyKHR.txt[]
-
-  * pname:device is the device which owns pname:operation.
-  * pname:operation is the deferred operation to be queried.
-
-The returned value is the maximum number of threads that can usefully
-execute a deferred operation concurrently, reported for the state of the
-deferred operation at the point this command is called.
-This value is intended to be used to better schedule work onto available
-threads.
-Applications can: join any number of threads to the deferred operation and
-expect it to eventually complete, though excessive joins may: return
-ename:VK_THREAD_DONE_KHR immediately, performing no useful work.
-
-If pname:operation is complete,
-fname:vkGetDeferredOperationMaxConcurrencyKHR returns zero.
-
-If pname:operation is currently joined to any threads, the value returned by
-this command may: immediately be out of date.
-
-If pname:operation is pending, implementations must: not return zero unless
-at least one thread is currently executing flink:vkDeferredOperationJoinKHR
-on pname:operation.
-If there are such threads, the implementation should: return an estimate of
-the number of additional threads which it could profitably use.
-
-Implementations may: return [eq]#2^32^-1# to indicate that the maximum
-concurrency is unknown and cannot be easily derived.
-Implementations may: return values larger than the maximum concurrency
-available on the host CPU.
-In these situations, an application should: clamp the return value rather
-than oversubscribing the machine.
-
-[NOTE]
-.Note
-====
-The recommended usage pattern for applications is to query this value once,
-after deferral, and schedule no more than the specified number of threads to
-join the operation.
-Each time a joined thread receives ename:VK_THREAD_IDLE_KHR, the application
-should schedule an additional join at some point in the future, but is not
-required to do so.
-====
-
-include::{generated}/validity/protos/vkGetDeferredOperationMaxConcurrencyKHR.txt[]
---
-
-[open,refpage='vkGetDeferredOperationResultKHR',desc='Query the result of a deferred operation',type='protos']
---
-:refpage: vkGetDeferredOperationResultKHR
-
-The fname:vkGetDeferredOperationResultKHR function is defined as:
-
-include::{generated}/api/protos/vkGetDeferredOperationResultKHR.txt[]
-
-  * pname:device is the device which owns pname:operation.
-  * pname:operation is the operation whose deferred result is being queried.
-
-If no command has been deferred on pname:operation,
-fname:vkGetDeferredOperationResultKHR returns ename:VK_SUCCESS.
-
-If the deferred operation is pending, fname:vkGetDeferredOperationResultKHR
-returns ename:VK_NOT_READY.
-
-If the deferred operation is complete, it returns the appropriate return
-value from the original command.
-This value must: be one of the elink:VkResult values which could have been
-returned by the original command if the operation had not been deferred.
-
-include::{generated}/validity/protos/vkGetDeferredOperationResultKHR.txt[]
---
-
diff --git a/registry/vulkan/chapters/VK_KHR_display/display.txt b/registry/vulkan/chapters/VK_KHR_display/display.txt
deleted file mode 100644
index ad9433c..0000000
--- a/registry/vulkan/chapters/VK_KHR_display/display.txt
+++ /dev/null
@@ -1,740 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[display,display]]
-== Presenting Directly to Display Devices
-
-In some environments applications can: also present Vulkan rendering
-directly to display devices without using an intermediate windowing system.
-This can: be useful for embedded applications, or implementing the
-rendering/presentation backend of a windowing system using Vulkan.
-The `VK_KHR_display` extension provides the functionality necessary to
-enumerate display devices and create sname:VkSurfaceKHR objects that target
-displays.
-
-
-=== Display Enumeration
-
-[open,refpage='VkDisplayKHR',desc='Opaque handle to a display object',type='handles']
---
-Displays are represented by sname:VkDisplayKHR handles:
-
-include::{generated}/api/handles/VkDisplayKHR.txt[]
---
-
-[open,refpage='vkGetPhysicalDeviceDisplayPropertiesKHR',desc='Query information about the available displays',type='protos']
---
-Various functions are provided for enumerating the available display devices
-present on a Vulkan physical device.
-To query information about the available displays, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceDisplayPropertiesKHR.txt[]
-
-  * pname:physicalDevice is a physical device.
-  * pname:pPropertyCount is a pointer to an integer related to the number of
-    display devices available or queried, as described below.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    sname:VkDisplayPropertiesKHR structures.
-
-If pname:pProperties is `NULL`, then the number of display devices available
-for pname:physicalDevice is returned in pname:pPropertyCount.
-Otherwise, pname:pPropertyCount must: point to a variable set by the user to
-the number of elements in the pname:pProperties array, and on return the
-variable is overwritten with the number of structures actually written to
-pname:pProperties.
-If the value of pname:pPropertyCount is less than the number of display
-devices for pname:physicalDevice, at most pname:pPropertyCount structures
-will be written, and ename:VK_INCOMPLETE will be returned instead of
-ename:VK_SUCCESS, to indicate that not all the available properties were
-returned.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceDisplayPropertiesKHR.txt[]
---
-
-[open,refpage='VkDisplayPropertiesKHR',desc='Structure describing an available display device',type='structs']
---
-The sname:VkDisplayPropertiesKHR structure is defined as:
-
-include::{generated}/api/structs/VkDisplayPropertiesKHR.txt[]
-
-  * pname:display is a handle that is used to refer to the display described
-    here.
-    This handle will be valid for the lifetime of the Vulkan instance.
-  * pname:displayName is `NULL` or a pointer to a null-terminated UTF-8
-    string containing the name of the display.
-    Generally, this will be the name provided by the display's EDID.
-    If `NULL`, no suitable name is available.
-    If not `NULL`, the string pointed to must: remain accessible and
-    unmodified as long as pname:display is valid.
-  * pname:physicalDimensions describes the physical width and height of the
-    visible portion of the display, in millimeters.
-  * pname:physicalResolution describes the physical, native, or preferred
-    resolution of the display.
-
-[NOTE]
-.Note
-====
-For devices which have no natural value to return here, implementations
-should: return the maximum resolution supported.
-====
-
-  * pname:supportedTransforms is a bitmask of
-    elink:VkSurfaceTransformFlagBitsKHR describing which transforms are
-    supported by this display.
-  * pname:planeReorderPossible tells whether the planes on this display can:
-    have their z order changed.
-    If this is ename:VK_TRUE, the application can: re-arrange the planes on
-    this display in any order relative to each other.
-  * pname:persistentContent tells whether the display supports
-    self-refresh/internal buffering.
-    If this is true, the application can: submit persistent present
-    operations on swapchains created against this display.
-
-[NOTE]
-.Note
-====
-Persistent presents may: have higher latency, and may: use less power when
-the screen content is updated infrequently, or when only a portion of the
-screen needs to be updated in most frames.
-====
-
-include::{generated}/validity/structs/VkDisplayPropertiesKHR.txt[]
---
-
-ifdef::VK_KHR_get_display_properties2[]
-[open,refpage='vkGetPhysicalDeviceDisplayProperties2KHR',desc='Query information about the available displays',type='protos']
---
-To query information about the available displays, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceDisplayProperties2KHR.txt[]
-
-  * pname:physicalDevice is a physical device.
-  * pname:pPropertyCount is a pointer to an integer related to the number of
-    display devices available or queried, as described below.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    sname:VkDisplayProperties2KHR structures.
-
-fname:vkGetPhysicalDeviceDisplayProperties2KHR behaves similarly to
-flink:vkGetPhysicalDeviceDisplayPropertiesKHR, with the ability to return
-extended information via chained output structures.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceDisplayProperties2KHR.txt[]
---
-
-[open,refpage='VkDisplayProperties2KHR',desc='Structure describing an available display device',type='structs']
---
-The sname:VkDisplayProperties2KHR structure is defined as:
-
-include::{generated}/api/structs/VkDisplayProperties2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:displayProperties is a slink:VkDisplayPropertiesKHR structure.
-
-include::{generated}/validity/structs/VkDisplayProperties2KHR.txt[]
---
-endif::VK_KHR_get_display_properties2[]
-
-ifdef::VK_EXT_direct_mode_display[]
-include::{chapters}/VK_EXT_direct_mode_display/acquire_release_displays.txt[]
-endif::VK_EXT_direct_mode_display[]
-
-
-==== Display Planes
-
-[open,refpage='vkGetPhysicalDeviceDisplayPlanePropertiesKHR',desc='Query the plane properties',type='protos']
---
-Images are presented to individual planes on a display.
-Devices must: support at least one plane on each display.
-Planes can: be stacked and blended to composite multiple images on one
-display.
-Devices may: support only a fixed stacking order and fixed mapping between
-planes and displays, or they may: allow arbitrary application specified
-stacking orders and mappings between planes and displays.
-To query the properties of device display planes, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceDisplayPlanePropertiesKHR.txt[]
-
-  * pname:physicalDevice is a physical device.
-  * pname:pPropertyCount is a pointer to an integer related to the number of
-    display planes available or queried, as described below.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    sname:VkDisplayPlanePropertiesKHR structures.
-
-If pname:pProperties is `NULL`, then the number of display planes available
-for pname:physicalDevice is returned in pname:pPropertyCount.
-Otherwise, pname:pPropertyCount must: point to a variable set by the user to
-the number of elements in the pname:pProperties array, and on return the
-variable is overwritten with the number of structures actually written to
-pname:pProperties.
-If the value of pname:pPropertyCount is less than the number of display
-planes for pname:physicalDevice, at most pname:pPropertyCount structures
-will be written.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceDisplayPlanePropertiesKHR.txt[]
---
-
-[open,refpage='VkDisplayPlanePropertiesKHR',desc='Structure describing display plane properties',type='structs']
---
-The sname:VkDisplayPlanePropertiesKHR structure is defined as:
-
-include::{generated}/api/structs/VkDisplayPlanePropertiesKHR.txt[]
-
-  * pname:currentDisplay is the handle of the display the plane is currently
-    associated with.
-    If the plane is not currently attached to any displays, this will be
-    dlink:VK_NULL_HANDLE.
-  * pname:currentStackIndex is the current z-order of the plane.
-    This will be between 0 and the value returned by
-    fname:vkGetPhysicalDeviceDisplayPlanePropertiesKHR in
-    pname:pPropertyCount.
-
-include::{generated}/validity/structs/VkDisplayPlanePropertiesKHR.txt[]
---
-
-ifdef::VK_KHR_get_display_properties2[]
-[open,refpage='vkGetPhysicalDeviceDisplayPlaneProperties2KHR',desc='Query information about the available display planes.',type='protos']
---
-To query the properties of a device's display planes, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceDisplayPlaneProperties2KHR.txt[]
-
-  * pname:physicalDevice is a physical device.
-  * pname:pPropertyCount is a pointer to an integer related to the number of
-    display planes available or queried, as described below.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    sname:VkDisplayPlaneProperties2KHR structures.
-
-fname:vkGetPhysicalDeviceDisplayPlaneProperties2KHR behaves similarly to
-flink:vkGetPhysicalDeviceDisplayPlanePropertiesKHR, with the ability to
-return extended information via chained output structures.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceDisplayPlaneProperties2KHR.txt[]
---
-
-[open,refpage='VkDisplayPlaneProperties2KHR',desc='Structure describing an available display plane',type='structs']
---
-The sname:VkDisplayPlaneProperties2KHR structure is defined as:
-
-include::{generated}/api/structs/VkDisplayPlaneProperties2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:displayPlaneProperties is a slink:VkDisplayPlanePropertiesKHR
-    structure.
-
-include::{generated}/validity/structs/VkDisplayPlaneProperties2KHR.txt[]
---
-endif::VK_KHR_get_display_properties2[]
-
-[open,refpage='vkGetDisplayPlaneSupportedDisplaysKHR',desc='Query the list of displays a plane supports',type='protos']
---
-To determine which displays a plane is usable with, call
-
-include::{generated}/api/protos/vkGetDisplayPlaneSupportedDisplaysKHR.txt[]
-
-  * pname:physicalDevice is a physical device.
-  * pname:planeIndex is the plane which the application wishes to use, and
-    must: be in the range [eq]#[0, physical device plane count - 1]#.
-  * pname:pDisplayCount is a pointer to an integer related to the number of
-    displays available or queried, as described below.
-  * pname:pDisplays is either `NULL` or a pointer to an array of
-    sname:VkDisplayKHR handles.
-
-If pname:pDisplays is `NULL`, then the number of displays usable with the
-specified pname:planeIndex for pname:physicalDevice is returned in
-pname:pDisplayCount.
-Otherwise, pname:pDisplayCount must: point to a variable set by the user to
-the number of elements in the pname:pDisplays array, and on return the
-variable is overwritten with the number of handles actually written to
-pname:pDisplays.
-If the value of pname:pDisplayCount is less than the number of usable
-display-plane pairs for pname:physicalDevice, at most pname:pDisplayCount
-handles will be written, and ename:VK_INCOMPLETE will be returned instead of
-ename:VK_SUCCESS, to indicate that not all the available pairs were
-returned.
-
-.Valid Usage
-****
-  * [[VUID-vkGetDisplayPlaneSupportedDisplaysKHR-planeIndex-01249]]
-    pname:planeIndex must: be less than the number of display planes
-    supported by the device as determined by calling
-    fname:vkGetPhysicalDeviceDisplayPlanePropertiesKHR
-****
-
-include::{generated}/validity/protos/vkGetDisplayPlaneSupportedDisplaysKHR.txt[]
---
-
-Additional properties of displays are queried using specialized query
-functions.
-
-
-==== Display Modes
-
-[open,refpage='VkDisplayModeKHR',desc='Opaque handle to a display mode object',type='handles']
---
-Display modes are represented by sname:VkDisplayModeKHR handles:
-
-include::{generated}/api/handles/VkDisplayModeKHR.txt[]
---
-
-[open,refpage='vkGetDisplayModePropertiesKHR',desc='Query the set of mode properties supported by the display',type='protos']
---
-Each display has one or more supported modes associated with it by default.
-These built-in modes are queried by calling:
-
-include::{generated}/api/protos/vkGetDisplayModePropertiesKHR.txt[]
-
-  * pname:physicalDevice is the physical device associated with
-    pname:display.
-  * pname:display is the display to query.
-  * pname:pPropertyCount is a pointer to an integer related to the number of
-    display modes available or queried, as described below.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    sname:VkDisplayModePropertiesKHR structures.
-
-If pname:pProperties is `NULL`, then the number of display modes available
-on the specified pname:display for pname:physicalDevice is returned in
-pname:pPropertyCount.
-Otherwise, pname:pPropertyCount must: point to a variable set by the user to
-the number of elements in the pname:pProperties array, and on return the
-variable is overwritten with the number of structures actually written to
-pname:pProperties.
-If the value of pname:pPropertyCount is less than the number of display
-modes for pname:physicalDevice, at most pname:pPropertyCount structures will
-be written, and ename:VK_INCOMPLETE will be returned instead of
-ename:VK_SUCCESS, to indicate that not all the available display modes were
-returned.
-
-include::{generated}/validity/protos/vkGetDisplayModePropertiesKHR.txt[]
---
-
-[open,refpage='VkDisplayModePropertiesKHR',desc='Structure describing display mode properties',type='structs']
---
-The sname:VkDisplayModePropertiesKHR structure is defined as:
-
-include::{generated}/api/structs/VkDisplayModePropertiesKHR.txt[]
-
-  * pname:displayMode is a handle to the display mode described in this
-    structure.
-    This handle will be valid for the lifetime of the Vulkan instance.
-  * pname:parameters is a slink:VkDisplayModeParametersKHR structure
-    describing the display parameters associated with pname:displayMode.
-
-include::{generated}/validity/structs/VkDisplayModePropertiesKHR.txt[]
---
-
-[open,refpage='VkDisplayModeCreateFlagsKHR',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkDisplayModeCreateFlagsKHR.txt[]
-
-tname:VkDisplayModeCreateFlagsKHR is a bitmask type for setting a mask, but
-is currently reserved for future use.
---
-
-ifdef::VK_KHR_get_display_properties2[]
-[open,refpage='vkGetDisplayModeProperties2KHR',desc='Query information about the available display modes.',type='protos']
---
-To query the properties of a device's built-in display modes, call:
-
-include::{generated}/api/protos/vkGetDisplayModeProperties2KHR.txt[]
-
-  * pname:physicalDevice is the physical device associated with
-    pname:display.
-  * pname:display is the display to query.
-  * pname:pPropertyCount is a pointer to an integer related to the number of
-    display modes available or queried, as described below.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    sname:VkDisplayModeProperties2KHR structures.
-
-fname:vkGetDisplayModeProperties2KHR behaves similarly to
-flink:vkGetDisplayModePropertiesKHR, with the ability to return extended
-information via chained output structures.
-
-include::{generated}/validity/protos/vkGetDisplayModeProperties2KHR.txt[]
---
-
-[open,refpage='VkDisplayModeProperties2KHR',desc='Structure describing an available display mode',type='structs']
---
-The sname:VkDisplayModeProperties2KHR structure is defined as:
-
-include::{generated}/api/structs/VkDisplayModeProperties2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:displayModeProperties is a slink:VkDisplayModePropertiesKHR
-    structure.
-
-include::{generated}/validity/structs/VkDisplayModeProperties2KHR.txt[]
---
-endif::VK_KHR_get_display_properties2[]
-
-[open,refpage='VkDisplayModeParametersKHR',desc='Structure describing display parameters associated with a display mode',type='structs']
---
-The sname:VkDisplayModeParametersKHR structure is defined as:
-
-include::{generated}/api/structs/VkDisplayModeParametersKHR.txt[]
-
-  * pname:visibleRegion is the 2D extents of the visible region.
-  * pname:refreshRate is a code:uint32_t that is the number of times the
-    display is refreshed each second multiplied by 1000.
-
-[NOTE]
-.Note
-====
-For example, a 60Hz display mode would report a pname:refreshRate of 60,000.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkDisplayModeParametersKHR-width-01990]]
-    The pname:width member of pname:visibleRegion must: be greater than `0`
-  * [[VUID-VkDisplayModeParametersKHR-height-01991]]
-    The pname:height member of pname:visibleRegion must: be greater than `0`
-  * [[VUID-VkDisplayModeParametersKHR-refreshRate-01992]]
-    pname:refreshRate must: be greater than `0`
-****
-
-include::{generated}/validity/structs/VkDisplayModeParametersKHR.txt[]
---
-
-[open,refpage='vkCreateDisplayModeKHR',desc='Create a display mode',type='protos']
---
-Additional modes may: also be created by calling:
-
-include::{generated}/api/protos/vkCreateDisplayModeKHR.txt[]
-
-  * pname:physicalDevice is the physical device associated with
-    pname:display.
-  * pname:display is the display to create an additional mode for.
-  * pname:pCreateInfo is a pointer to a slink:VkDisplayModeCreateInfoKHR
-    structure describing the new mode to create.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    display mode object when there is no more specific allocator available
-    (see <<memory-allocation,Memory Allocation>>).
-  * pname:pMode is a pointer to a slink:VkDisplayModeKHR handle in which the
-    mode created is returned.
-
-include::{generated}/validity/protos/vkCreateDisplayModeKHR.txt[]
---
-
-[open,refpage='VkDisplayModeCreateInfoKHR',desc='Structure specifying parameters of a newly created display mode object',type='structs']
---
-The sname:VkDisplayModeCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkDisplayModeCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use, and must: be zero.
-  * pname:parameters is a slink:VkDisplayModeParametersKHR structure
-    describing the display parameters to use in creating the new mode.
-    If the parameters are not compatible with the specified display, the
-    implementation must: return ename:VK_ERROR_INITIALIZATION_FAILED.
-
-include::{generated}/validity/structs/VkDisplayModeCreateInfoKHR.txt[]
---
-
-[open,refpage='vkGetDisplayPlaneCapabilitiesKHR',desc='Query capabilities of a mode and plane combination',type='protos']
---
-Applications that wish to present directly to a display must: select which
-layer, or "`plane`" of the display they wish to target, and a mode to use
-with the display.
-Each display supports at least one plane.
-The capabilities of a given mode and plane combination are determined by
-calling:
-
-include::{generated}/api/protos/vkGetDisplayPlaneCapabilitiesKHR.txt[]
-
-  * pname:physicalDevice is the physical device associated with the display
-    specified by pname:mode
-  * pname:mode is the display mode the application intends to program when
-    using the specified plane.
-    Note this parameter also implicitly specifies a display.
-  * pname:planeIndex is the plane which the application intends to use with
-    the display, and is less than the number of display planes supported by
-    the device.
-  * pname:pCapabilities is a pointer to a
-    slink:VkDisplayPlaneCapabilitiesKHR structure in which the capabilities
-    are returned.
-
-include::{generated}/validity/protos/vkGetDisplayPlaneCapabilitiesKHR.txt[]
---
-
-[open,refpage='VkDisplayPlaneCapabilitiesKHR',desc='Structure describing capabilities of a mode and plane combination',type='structs']
---
-The sname:VkDisplayPlaneCapabilitiesKHR structure is defined as:
-
-include::{generated}/api/structs/VkDisplayPlaneCapabilitiesKHR.txt[]
-
-  * pname:supportedAlpha is a bitmask of
-    elink:VkDisplayPlaneAlphaFlagBitsKHR describing the supported alpha
-    blending modes.
-  * pname:minSrcPosition is the minimum source rectangle offset supported by
-    this plane using the specified mode.
-  * pname:maxSrcPosition is the maximum source rectangle offset supported by
-    this plane using the specified mode.
-    The pname:x and pname:y components of pname:maxSrcPosition must: each be
-    greater than or equal to the pname:x and pname:y components of
-    pname:minSrcPosition, respectively.
-  * pname:minSrcExtent is the minimum source rectangle size supported by
-    this plane using the specified mode.
-  * pname:maxSrcExtent is the maximum source rectangle size supported by
-    this plane using the specified mode.
-  * pname:minDstPosition, pname:maxDstPosition, pname:minDstExtent,
-    pname:maxDstExtent all have similar semantics to their corresponding
-    ptext:*Src* equivalents, but apply to the output region within the mode
-    rather than the input region within the source image.
-    Unlike the ptext:*Src* offsets, pname:minDstPosition and
-    pname:maxDstPosition may: contain negative values.
-
-The minimum and maximum position and extent fields describe the
-implementation limits, if any, as they apply to the specified display mode
-and plane.
-Vendors may: support displaying a subset of a swapchain's presentable images
-on the specified display plane.
-This is expressed by returning pname:minSrcPosition, pname:maxSrcPosition,
-pname:minSrcExtent, and pname:maxSrcExtent values that indicate a range of
-possible positions and sizes which may: be used to specify the region within
-the presentable images that source pixels will be read from when creating a
-swapchain on the specified display mode and plane.
-
-Vendors may: also support mapping the presentable images`' content to a
-subset or superset of the visible region in the specified display mode.
-This is expressed by returning pname:minDstPosition, pname:maxDstPosition,
-pname:minDstExtent and pname:maxDstExtent values that indicate a range of
-possible positions and sizes which may: be used to describe the region
-within the display mode that the source pixels will be mapped to.
-
-Other vendors may: support only a 1-1 mapping between pixels in the
-presentable images and the display mode.
-This may: be indicated by returning [eq]#(0,0)# for pname:minSrcPosition,
-pname:maxSrcPosition, pname:minDstPosition, and pname:maxDstPosition, and
-(display mode width, display mode height) for pname:minSrcExtent,
-pname:maxSrcExtent, pname:minDstExtent, and pname:maxDstExtent.
-
-The value pname:supportedAlpha must: contain at least one valid
-elink:VkDisplayPlaneAlphaFlagBitsKHR bit.
-
-These values indicate the limits of the implementation's individual fields.
-Not all combinations of values within the offset and extent ranges returned
-in sname:VkDisplayPlaneCapabilitiesKHR are guaranteed to be supported.
-Presentation requests specifying unsupported combinations may: fail.
-
-include::{generated}/validity/structs/VkDisplayPlaneCapabilitiesKHR.txt[]
---
-
-ifdef::VK_KHR_get_display_properties2[]
-[open,refpage='vkGetDisplayPlaneCapabilities2KHR',desc='Query capabilities of a mode and plane combination',type='protos']
---
-To query the capabilities of a given mode and plane combination, call:
-
-include::{generated}/api/protos/vkGetDisplayPlaneCapabilities2KHR.txt[]
-
-  * pname:physicalDevice is the physical device associated with
-    pname:pDisplayPlaneInfo.
-  * pname:pDisplayPlaneInfo is a pointer to a slink:VkDisplayPlaneInfo2KHR
-    structure describing the plane and mode.
-  * pname:pCapabilities is a pointer to a
-    slink:VkDisplayPlaneCapabilities2KHR structure in which the capabilities
-    are returned.
-
-fname:vkGetDisplayPlaneCapabilities2KHR behaves similarly to
-flink:vkGetDisplayPlaneCapabilitiesKHR, with the ability to specify extended
-inputs via chained input structures, and to return extended information via
-chained output structures.
-
-include::{generated}/validity/protos/vkGetDisplayPlaneCapabilities2KHR.txt[]
---
-
-[open,refpage='VkDisplayPlaneInfo2KHR',desc='Structure defining the intended configuration of a display plane',type='structs']
---
-The sname:VkDisplayPlaneInfo2KHR structure is defined as:
-
-include::{generated}/api/structs/VkDisplayPlaneInfo2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:mode is the display mode the application intends to program when
-    using the specified plane.
-
-[NOTE]
-.Note
-====
-This parameter also implicitly specifies a display.
-====
-
-  * pname:planeIndex is the plane which the application intends to use with
-    the display.
-
-The members of sname:VkDisplayPlaneInfo2KHR correspond to the arguments to
-flink:vkGetDisplayPlaneCapabilitiesKHR, with pname:sType and pname:pNext
-added for extensibility.
-
-include::{generated}/validity/structs/VkDisplayPlaneInfo2KHR.txt[]
---
-
-[open,refpage='VkDisplayPlaneCapabilities2KHR',desc='Structure describing the capabilities of a mode and plane combination',type='structs']
---
-The sname:VkDisplayPlaneCapabilities2KHR structure is defined as:
-
-include::{generated}/api/structs/VkDisplayPlaneCapabilities2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:capabilities is a slink:VkDisplayPlaneCapabilitiesKHR structure.
-
-include::{generated}/validity/structs/VkDisplayPlaneCapabilities2KHR.txt[]
---
-endif::VK_KHR_get_display_properties2[]
-
-ifdef::VK_EXT_display_control[]
-include::{chapters}/VK_EXT_display_control/display_control.txt[]
-endif::VK_EXT_display_control[]
-
-
-[[wsi-display-surfaces]]
-=== Display Surfaces
-
-[open,refpage='vkCreateDisplayPlaneSurfaceKHR',desc='Create a slink:VkSurfaceKHR structure representing a display plane and mode',type='protos']
---
-A complete display configuration includes a mode, one or more display planes
-and any parameters describing their behavior, and parameters describing some
-aspects of the images associated with those planes.
-Display surfaces describe the configuration of a single plane within a
-complete display configuration.
-To create a sname:VkSurfaceKHR object for a display plane, call:
-
-include::{generated}/api/protos/vkCreateDisplayPlaneSurfaceKHR.txt[]
-
-  * pname:instance is the instance corresponding to the physical device the
-    targeted display is on.
-  * pname:pCreateInfo is a pointer to a slink:VkDisplaySurfaceCreateInfoKHR
-    structure specifying which mode, plane, and other parameters to use, as
-    described below.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a slink:VkSurfaceKHR handle in which the
-    created surface is returned.
-
-include::{generated}/validity/protos/vkCreateDisplayPlaneSurfaceKHR.txt[]
---
-
-[open,refpage='VkDisplaySurfaceCreateInfoKHR',desc='Structure specifying parameters of a newly created display plane surface object',type='structs']
---
-The sname:VkDisplaySurfaceCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkDisplaySurfaceCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use, and must: be zero.
-  * pname:displayMode is a slink:VkDisplayModeKHR handle specifying the mode
-    to use when displaying this surface.
-  * pname:planeIndex is the plane on which this surface appears.
-  * pname:planeStackIndex is the z-order of the plane.
-  * pname:transform is a elink:VkSurfaceTransformFlagBitsKHR value
-    specifying the transformation to apply to images as part of the scanout
-    operation.
-  * pname:globalAlpha is the global alpha value.
-    This value is ignored if pname:alphaMode is not
-    ename:VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR.
-  * pname:alphaMode is a elink:VkDisplayPlaneAlphaFlagBitsKHR value
-    specifying the type of alpha blending to use.
-  * pname:imageExtent is the size of the presentable images to use with the
-    surface.
-
-[NOTE]
-.Note
-====
-Creating a display surface must: not modify the state of the displays,
-planes, or other resources it names.
-For example, it must: not apply the specified mode to be set on the
-associated display.
-Application of display configuration occurs as a side effect of presenting
-to a display surface.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkDisplaySurfaceCreateInfoKHR-planeIndex-01252]]
-    pname:planeIndex must: be less than the number of display planes
-    supported by the device as determined by calling
-    fname:vkGetPhysicalDeviceDisplayPlanePropertiesKHR
-  * [[VUID-VkDisplaySurfaceCreateInfoKHR-planeReorderPossible-01253]]
-    If the pname:planeReorderPossible member of the
-    sname:VkDisplayPropertiesKHR structure returned by
-    fname:vkGetPhysicalDeviceDisplayPropertiesKHR for the display
-    corresponding to pname:displayMode is ename:VK_TRUE then
-    pname:planeStackIndex must: be less than the number of display planes
-    supported by the device as determined by calling
-    fname:vkGetPhysicalDeviceDisplayPlanePropertiesKHR; otherwise
-    pname:planeStackIndex must: equal the pname:currentStackIndex member of
-    sname:VkDisplayPlanePropertiesKHR returned by
-    fname:vkGetPhysicalDeviceDisplayPlanePropertiesKHR for the display plane
-    corresponding to pname:displayMode
-  * [[VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-01254]]
-    If pname:alphaMode is ename:VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR then
-    pname:globalAlpha must: be between `0` and `1`, inclusive
-  * [[VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-01255]]
-    pname:alphaMode must: be one of the bits present in the
-    pname:supportedAlpha member of sname:VkDisplayPlaneCapabilitiesKHR for
-    the display plane corresponding to pname:displayMode
-  * [[VUID-VkDisplaySurfaceCreateInfoKHR-width-01256]]
-    The pname:width and pname:height members of pname:imageExtent must: be
-    less than or equal to
-    slink:VkPhysicalDeviceLimits::pname:maxImageDimension2D
-****
-
-include::{generated}/validity/structs/VkDisplaySurfaceCreateInfoKHR.txt[]
---
-
-[open,refpage='VkDisplaySurfaceCreateFlagsKHR',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkDisplaySurfaceCreateFlagsKHR.txt[]
-
-tname:VkDisplaySurfaceCreateFlagsKHR is a bitmask type for setting a mask,
-but is currently reserved for future use.
---
-
-[open,refpage='VkDisplayPlaneAlphaFlagBitsKHR',desc='Alpha blending type',type='enums']
---
-Possible values of slink:VkDisplaySurfaceCreateInfoKHR::pname:alphaMode,
-specifying the type of alpha blending to use on a display, are:
-
-include::{generated}/api/enums/VkDisplayPlaneAlphaFlagBitsKHR.txt[]
-
-  * ename:VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR specifies that the source
-    image will be treated as opaque.
-  * ename:VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR specifies that a global
-    alpha value must: be specified that will be applied to all pixels in the
-    source image.
-  * ename:VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR specifies that the alpha
-    value will be determined by the alpha component of the source image's
-    pixels.
-    If the source format contains no alpha values, no blending will be
-    applied.
-    The source alpha values are not premultiplied into the source image's
-    other color components.
-  * ename:VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR is
-    equivalent to ename:VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR, except the
-    source alpha values are assumed to be premultiplied into the source
-    image's other color components.
---
-
-[open,refpage='VkDisplayPlaneAlphaFlagsKHR',desc='Bitmask of VkDisplayPlaneAlphaFlagBitsKHR',type='flags']
---
-include::{generated}/api/flags/VkDisplayPlaneAlphaFlagsKHR.txt[]
-
-tname:VkDisplayPlaneAlphaFlagsKHR is a bitmask type for setting a mask of
-zero or more elink:VkDisplayPlaneAlphaFlagBitsKHR.
---
diff --git a/registry/vulkan/chapters/VK_KHR_display_swapchain/create_shared_swapchains.txt b/registry/vulkan/chapters/VK_KHR_display_swapchain/create_shared_swapchains.txt
deleted file mode 100644
index 9175147..0000000
--- a/registry/vulkan/chapters/VK_KHR_display_swapchain/create_shared_swapchains.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[create_shared_swapchains,create_shared_swapchains]]
-
-[open,refpage='vkCreateSharedSwapchainsKHR',desc='Create multiple swapchains that share presentable images',type='protos']
---
-When the `VK_KHR_display_swapchain` extension is enabled, multiple
-swapchains that share presentable images are created by calling:
-
-include::{generated}/api/protos/vkCreateSharedSwapchainsKHR.txt[]
-
-  * pname:device is the device to create the swapchains for.
-  * pname:swapchainCount is the number of swapchains to create.
-  * pname:pCreateInfos is a pointer to an array of
-    slink:VkSwapchainCreateInfoKHR structures specifying the parameters of
-    the created swapchains.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    swapchain objects when there is no more specific allocator available
-    (see <<memory-allocation,Memory Allocation>>).
-  * pname:pSwapchains is a pointer to an array of slink:VkSwapchainKHR
-    handles in which the created swapchain objects will be returned.
-
-fname:vkCreateSharedSwapchainsKHR is similar to flink:vkCreateSwapchainKHR,
-except that it takes an array of slink:VkSwapchainCreateInfoKHR structures,
-and returns an array of swapchain objects.
-
-The swapchain creation parameters that affect the properties and number of
-presentable images must: match between all the swapchains.
-If the displays used by any of the swapchains do not use the same
-presentable image layout or are incompatible in a way that prevents sharing
-images, swapchain creation will fail with the result code
-ename:VK_ERROR_INCOMPATIBLE_DISPLAY_KHR.
-If any error occurs, no swapchains will be created.
-Images presented to multiple swapchains must: be re-acquired from all of
-them before transitioning away from ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR.
-After destroying one or more of the swapchains, the remaining swapchains and
-the presentable images can: continue to be used.
-
-include::{generated}/validity/protos/vkCreateSharedSwapchainsKHR.txt[]
---
diff --git a/registry/vulkan/chapters/VK_KHR_display_swapchain/destroy_swapchain_interactions.txt b/registry/vulkan/chapters/VK_KHR_display_swapchain/destroy_swapchain_interactions.txt
deleted file mode 100644
index d809a65..0000000
--- a/registry/vulkan/chapters/VK_KHR_display_swapchain/destroy_swapchain_interactions.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-When a swapchain associated with a display surface is destroyed, if the
-image most recently presented to the display surface is from the swapchain
-being destroyed, then either any display resources modified by presenting
-images from any swapchain associated with the display surface must: be
-reverted by the implementation to their state prior to the first present
-performed on one of these swapchains, or such resources must: be left in
-their current state.
diff --git a/registry/vulkan/chapters/VK_KHR_display_swapchain/display_swapchain_present.txt b/registry/vulkan/chapters/VK_KHR_display_swapchain/display_swapchain_present.txt
deleted file mode 100644
index ddf10e4..0000000
--- a/registry/vulkan/chapters/VK_KHR_display_swapchain/display_swapchain_present.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[display_swapchain_present,display_swapchain_present]]
-When the `VK_KHR_display_swapchain` extension is enabled additional fields
-can: be specified when presenting an image to a swapchain by setting
-slink:VkPresentInfoKHR::pname:pNext to point to a
-slink:VkDisplayPresentInfoKHR structure.
-
-[open,refpage='VkDisplayPresentInfoKHR',desc='Structure describing parameters of a queue presentation to a swapchain',type='structs']
---
-
-The sname:VkDisplayPresentInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkDisplayPresentInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcRect is a rectangular region of pixels to present.
-    It must: be a subset of the image being presented.
-    If sname:VkDisplayPresentInfoKHR is not specified, this region will be
-    assumed to be the entire presentable image.
-  * pname:dstRect is a rectangular region within the visible region of the
-    swapchain's display mode.
-    If sname:VkDisplayPresentInfoKHR is not specified, this region will be
-    assumed to be the entire visible region of the swapchain's mode.
-    If the specified rectangle is a subset of the display mode's visible
-    region, content from display planes below the swapchain's plane will be
-    visible outside the rectangle.
-    If there are no planes below the swapchain's, the area outside the
-    specified rectangle will be black.
-    If portions of the specified rectangle are outside of the display's
-    visible region, pixels mapping only to those portions of the rectangle
-    will be discarded.
-  * pname:persistent: If this is ename:VK_TRUE, the display engine will
-    enable buffered mode on displays that support it.
-    This allows the display engine to stop sending content to the display
-    until a new image is presented.
-    The display will instead maintain a copy of the last presented image.
-    This allows less power to be used, but may: increase presentation
-    latency.
-    If sname:VkDisplayPresentInfoKHR is not specified, persistent mode will
-    not be used.
-
-If the extent of the pname:srcRect and pname:dstRect are not equal, the
-presented pixels will be scaled accordingly.
-
-.Valid Usage
-****
-  * [[VUID-VkDisplayPresentInfoKHR-srcRect-01257]]
-    pname:srcRect must: specify a rectangular region that is a subset of the
-    image being presented
-  * [[VUID-VkDisplayPresentInfoKHR-dstRect-01258]]
-    pname:dstRect must: specify a rectangular region that is a subset of the
-    pname:visibleRegion parameter of the display mode the swapchain being
-    presented uses
-  * [[VUID-VkDisplayPresentInfoKHR-persistentContent-01259]]
-    If the pname:persistentContent member of the
-    sname:VkDisplayPropertiesKHR structure returned by
-    fname:vkGetPhysicalDeviceDisplayPropertiesKHR for the display the
-    present operation targets is ename:VK_FALSE, then pname:persistent must:
-    be ename:VK_FALSE
-****
-
-include::{generated}/validity/structs/VkDisplayPresentInfoKHR.txt[]
---
diff --git a/registry/vulkan/chapters/VK_KHR_display_swapchain/queue_present_interactions.txt b/registry/vulkan/chapters/VK_KHR_display_swapchain/queue_present_interactions.txt
deleted file mode 100644
index 2901a7f..0000000
--- a/registry/vulkan/chapters/VK_KHR_display_swapchain/queue_present_interactions.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-If an image is presented to a swapchain created from a display surface, the
-mode of the associated display will be updated, if necessary, to match the
-mode specified when creating the display surface.
-The mode switch and presentation of the specified image will be performed as
-one atomic operation.
diff --git a/registry/vulkan/chapters/VK_KHR_incremental_present/wsi.txt b/registry/vulkan/chapters/VK_KHR_incremental_present/wsi.txt
deleted file mode 100644
index 923c85a..0000000
--- a/registry/vulkan/chapters/VK_KHR_incremental_present/wsi.txt
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='VkPresentRegionsKHR',desc='Structure hint of rectangular regions changed by vkQueuePresentKHR',type='structs']
---
-When the `VK_KHR_incremental_present` extension is enabled, additional
-fields can: be specified that allow an application to specify that only
-certain rectangular regions of the presentable images of a swapchain are
-changed.
-This is an optimization hint that a presentation engine may: use to only
-update the region of a surface that is actually changing.
-The application still must: ensure that all pixels of a presented image
-contain the desired values, in case the presentation engine ignores this
-hint.
-An application can: provide this hint by adding a sname:VkPresentRegionsKHR
-structure to the pname:pNext chain of the sname:VkPresentInfoKHR structure.
-
-The sname:VkPresentRegionsKHR structure is defined as:
-
-include::{generated}/api/structs/VkPresentRegionsKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:swapchainCount is the number of swapchains being presented to by
-    this command.
-  * pname:pRegions is `NULL` or a pointer to an array of
-    sname:VkPresentRegionKHR elements with pname:swapchainCount entries.
-    If not `NULL`, each element of pname:pRegions contains the region that
-    has changed since the last present to the swapchain in the corresponding
-    entry in the sname:VkPresentInfoKHR::pname:pSwapchains array.
-
-.Valid Usage
-****
-  * [[VUID-VkPresentRegionsKHR-swapchainCount-01260]]
-    pname:swapchainCount must: be the same value as
-    sname:VkPresentInfoKHR::pname:swapchainCount, where
-    sname:VkPresentInfoKHR is included in the pname:pNext chain of this
-    sname:VkPresentRegionsKHR structure
-****
-
-include::{generated}/validity/structs/VkPresentRegionsKHR.txt[]
---
-
-[open,refpage='VkPresentRegionKHR',desc='Structure containing rectangular region changed by vkQueuePresentKHR for a given VkImage',type='structs']
---
-For a given image and swapchain, the region to present is specified by the
-sname:VkPresentRegionKHR structure, which is defined as:
-
-include::{generated}/api/structs/VkPresentRegionKHR.txt[]
-
-  * pname:rectangleCount is the number of rectangles in pname:pRectangles,
-    or zero if the entire image has changed and should be presented.
-  * pname:pRectangles is either `NULL` or a pointer to an array of
-    sname:VkRectLayerKHR structures.
-    The sname:VkRectLayerKHR structure is the framebuffer coordinates, plus
-    layer, of a portion of a presentable image that has changed and must: be
-    presented.
-    If non-`NULL`, each entry in pname:pRectangles is a rectangle of the
-    given image that has changed since the last image was presented to the
-    given swapchain.
-    The rectangles must: be specified relative to
-    slink:VkSurfaceCapabilitiesKHR::pname:currentTransform, regardless of
-    the swapchain's pname:preTransform.
-    The presentation engine will apply the pname:preTransform transformation
-    to the rectangles, along with any further transformation it applies to
-    the image content.
-
-include::{generated}/validity/structs/VkPresentRegionKHR.txt[]
---
-
-[open,refpage='VkRectLayerKHR',desc='Structure containing a rectangle, including layer, changed by vkQueuePresentKHR for a given VkImage',type='structs']
---
-The sname:VkRectLayerKHR structure is defined as:
-
-include::{generated}/api/structs/VkRectLayerKHR.txt[]
-
-  * pname:offset is the origin of the rectangle, in pixels.
-  * pname:extent is the size of the rectangle, in pixels.
-  * pname:layer is the layer of the image.
-    For images with only one layer, the value of pname:layer must: be 0.
-
-Some platforms allow the size of a surface to change, and then scale the
-pixels of the image to fit the surface.
-sname:VkRectLayerKHR specifies pixels of the swapchain's image(s), which
-will be constant for the life of the swapchain.
-
-.Valid Usage
-****
-  * [[VUID-VkRectLayerKHR-offset-04864]]
-    The sum of pname:offset and pname:extent, after being transformed
-    according to the pname:preTransform member of the
-    slink:VkSwapchainCreateInfoKHR structure, must: be no greater than the
-    pname:imageExtent member of the slink:VkSwapchainCreateInfoKHR structure
-    passed to flink:vkCreateSwapchainKHR
-  * [[VUID-VkRectLayerKHR-layer-01262]]
-    pname:layer must: be less than the pname:imageArrayLayers member of the
-    slink:VkSwapchainCreateInfoKHR structure passed to
-    flink:vkCreateSwapchainKHR
-****
-
-include::{generated}/validity/structs/VkRectLayerKHR.txt[]
---
diff --git a/registry/vulkan/chapters/VK_KHR_performance_query/features.txt b/registry/vulkan/chapters/VK_KHR_performance_query/features.txt
deleted file mode 100644
index d9f920e..0000000
--- a/registry/vulkan/chapters/VK_KHR_performance_query/features.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2019-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='VkPhysicalDevicePerformanceQueryFeaturesKHR',desc='Structure describing performance query support for an implementation',type='structs']
---
-The sname:VkPhysicalDevicePerformanceQueryFeaturesKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDevicePerformanceQueryFeaturesKHR.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-// tag::VK_KHR_performance_query-features[]
-  * [[features-performanceCounterQueryPools]]
-    pname:performanceCounterQueryPools indicates whether the implementation
-    supports performance counter query pools.
-  * [[features-performanceCounterMultipleQueryPools]]
-    pname:performanceCounterMultipleQueryPools indicates whether the
-    implementation supports using multiple performance query pools in a
-    primary command buffer and secondary command buffers executed within it.
-// end::VK_KHR_performance_query-features[]
-
-:refpage: VkPhysicalDevicePerformanceQueryFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDevicePerformanceQueryFeaturesKHR.txt[]
---
diff --git a/registry/vulkan/chapters/VK_KHR_performance_query/props.txt b/registry/vulkan/chapters/VK_KHR_performance_query/props.txt
deleted file mode 100644
index 7d2ebae..0000000
--- a/registry/vulkan/chapters/VK_KHR_performance_query/props.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2019-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='VkPhysicalDevicePerformanceQueryPropertiesKHR',desc='Structure describing performance query properties for an implementation',type='structs']
---
-The sname:VkPhysicalDevicePerformanceQueryPropertiesKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDevicePerformanceQueryPropertiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:allowCommandBufferQueryCopies is ename:VK_TRUE if the performance
-    query pools are allowed to be used with flink:vkCmdCopyQueryPoolResults.
-
-:refpage: VkPhysicalDevicePerformanceQueryPropertiesKHR
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDevicePerformanceQueryPropertiesKHR.txt[]
---
diff --git a/registry/vulkan/chapters/VK_KHR_performance_query/queriesperformance.txt b/registry/vulkan/chapters/VK_KHR_performance_query/queriesperformance.txt
deleted file mode 100644
index e834628..0000000
--- a/registry/vulkan/chapters/VK_KHR_performance_query/queriesperformance.txt
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2019-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[queries-performance]]
-== Performance Queries
-
-_Performance queries_ provide applications with a mechanism for getting
-performance counter information about the execution of command buffers,
-render passes, and commands.
-
-Each queue family advertises the performance counters that can: be queried
-on a queue of that family via a call to
-flink:vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR.
-Implementations may: limit access to performance counters based on platform
-requirements or only to specialized drivers for development purposes.
-
-[NOTE]
-.Note
-====
-This may include no performance counters being enumerated, or a reduced set.
-Please refer to platform-specific documentation for guidance on any such
-restrictions.
-====
-
-Performance queries use the existing flink:vkCmdBeginQuery and
-flink:vkCmdEndQuery to control what command buffers, render passes, or
-commands to get performance information for.
-
-Implementations may: require multiple passes where the command buffer,
-render passes, or commands being recorded are the same and are executed on
-the same queue to record performance counter data.
-This is achieved by submitting the same batch and providing a
-slink:VkPerformanceQuerySubmitInfoKHR structure containing a counter pass
-index.
-The number of passes required for a given performance query pool can: be
-queried via a call to
-flink:vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR.
-
-[NOTE]
-.Note
-====
-Command buffers created with
-ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT must: not be re-submitted.
-Changing command buffer usage bits may: affect performance.
-To avoid this, the application should: re-record any command buffers with
-the ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT when multiple counter
-passes are required.
-====
-
-Performance counter results from a performance query pool can: be obtained
-with the command flink:vkGetQueryPoolResults.
-
-[open,refpage='VkPerformanceCounterResultKHR',desc='Union containing a performance counter result',type='structs']
---
-Performance query results are returned in an array of
-sname:VkPerformanceCounterResultKHR unions containing the data associated
-with each counter in the query, stored in the same order as the counters
-supplied in pname:pCounterIndices when creating the performance query.
-The slink:VkPerformanceCounterKHR::pname:unit enumeration specifies how to
-parse the counter data.
-
-include::{generated}/api/structs/VkPerformanceCounterResultKHR.txt[]
---
-
-
-[[profiling-lock]]
-=== Profiling Lock
-
-[open,refpage='vkAcquireProfilingLockKHR',desc='Acquires the profiling lock',type='protos']
---
-To record and submit a command buffer that contains a performance query pool
-the profiling lock must: be held.
-The profiling lock must: be acquired prior to any call to
-flink:vkBeginCommandBuffer that will be using a performance query pool.
-The profiling lock must: be held while any command buffer that contains a
-performance query pool is in the _recording_, _executable_, or _pending
-state_.
-To acquire the profiling lock, call:
-
-include::{generated}/api/protos/vkAcquireProfilingLockKHR.txt[]
-
-  * pname:device is the logical device to profile.
-  * pname:pInfo is a pointer to a sname:VkAcquireProfilingLockInfoKHR
-    structure which contains information about how the profiling is to be
-    acquired.
-
-Implementations may: allow multiple actors to hold the profiling lock
-concurrently.
-
-include::{generated}/validity/protos/vkAcquireProfilingLockKHR.txt[]
---
-
-[open,refpage='VkAcquireProfilingLockInfoKHR',desc='Structure specifying parameters to acquire the profiling lock',type='structs']
---
-The sname:VkAcquireProfilingLockInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkAcquireProfilingLockInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:timeout indicates how long the function waits, in nanoseconds, if
-    the profiling lock is not available.
-
-include::{generated}/validity/structs/VkAcquireProfilingLockInfoKHR.txt[]
-
-If pname:timeout is 0, fname:vkAcquireProfilingLockKHR will not block while
-attempting to acquire the profling lock.
-If pname:timeout is code:UINT64_MAX, the function will not return until the
-profiling lock was acquired.
---
-
-[open,refpage='VkAcquireProfilingLockFlagBitsKHR',desc='Reserved for future use',type='enums']
---
-include::{generated}/api/enums/VkAcquireProfilingLockFlagBitsKHR.txt[]
---
-
-[open,refpage='VkAcquireProfilingLockFlagsKHR',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkAcquireProfilingLockFlagsKHR.txt[]
-
-tlink:VkAcquireProfilingLockFlagsKHR is a bitmask type for setting a mask,
-but is currently reserved for future use.
---
-
-[open,refpage='vkReleaseProfilingLockKHR',desc='Releases the profiling lock',type='protos']
---
-To release the profiling lock, call:
-
-include::{generated}/api/protos/vkReleaseProfilingLockKHR.txt[]
-
-  * pname:device is the logical device to cease profiling on.
-
-.Valid Usage
-****
-  * [[VUID-vkReleaseProfilingLockKHR-device-03235]]
-    The profiling lock of pname:device must: have been held via a previous
-    successful call to flink:vkAcquireProfilingLockKHR
-****
-
-include::{generated}/validity/protos/vkReleaseProfilingLockKHR.txt[]
---
diff --git a/registry/vulkan/chapters/VK_KHR_performance_query/querycreateinfo.txt b/registry/vulkan/chapters/VK_KHR_performance_query/querycreateinfo.txt
deleted file mode 100644
index 31edc16..0000000
--- a/registry/vulkan/chapters/VK_KHR_performance_query/querycreateinfo.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2019-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='VkQueryPoolPerformanceCreateInfoKHR',desc='Structure specifying parameters of a newly created performance query pool',type='structs']
---
-The sname:VkQueryPoolPerformanceCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkQueryPoolPerformanceCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:queueFamilyIndex is the queue family index to create this
-    performance query pool for.
-  * pname:counterIndexCount is the length of the pname:pCounterIndices
-    array.
-  * pname:pCounterIndices is a pointer to an array of indices into the
-    flink:vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR::pname:pCounters
-    to enable in this performance query pool.
-
-.Valid Usage
-****
-  * [[VUID-VkQueryPoolPerformanceCreateInfoKHR-queueFamilyIndex-03236]]
-    pname:queueFamilyIndex must: be a valid queue family index of the device
-  * [[VUID-VkQueryPoolPerformanceCreateInfoKHR-performanceCounterQueryPools-03237]]
-    The <<features-performanceCounterQueryPools,
-    pname:performanceCounterQueryPools>> feature must: be enabled
-  * [[VUID-VkQueryPoolPerformanceCreateInfoKHR-pCounterIndices-03321]]
-    Each element of pname:pCounterIndices must: be in the range of counters
-    reported by
-    fname:vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR
-    for the queue family specified in pname:queueFamilyIndex
-****
-
-include::{generated}/validity/structs/VkQueryPoolPerformanceCreateInfoKHR.txt[]
---
-
-[open,refpage='vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR',desc='Reports the number of passes require for a performance query pool type',type='protos']
---
-To query the number of passes required to query a performance query pool on
-a physical device, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR.txt[]
-
-  * pname:physicalDevice is the handle to the physical device whose queue
-    family performance query counter properties will be queried.
-  * pname:pPerformanceQueryCreateInfo is a pointer to a
-    sname:VkQueryPoolPerformanceCreateInfoKHR of the performance query that
-    is to be created.
-  * pname:pNumPasses is a pointer to an integer related to the number of
-    passes required to query the performance query pool, as described below.
-
-The pname:pPerformanceQueryCreateInfo member
-sname:VkQueryPoolPerformanceCreateInfoKHR::pname:queueFamilyIndex must: be a
-queue family of pname:physicalDevice.
-The number of passes required to capture the counters specified in the
-pname:pPerformanceQueryCreateInfo member
-sname:VkQueryPoolPerformanceCreateInfoKHR::pname:pCounters is returned in
-pname:pNumPasses.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR.txt[]
---
diff --git a/registry/vulkan/chapters/VK_KHR_performance_query/queuefamily.txt b/registry/vulkan/chapters/VK_KHR_performance_query/queuefamily.txt
deleted file mode 100644
index f96548c..0000000
--- a/registry/vulkan/chapters/VK_KHR_performance_query/queuefamily.txt
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright 2019-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR',desc='Reports properties of the performance query counters available on a queue family of a device',type='protos']
---
-To enumerate the performance query counters available on a queue family of a
-physical device, call:
-
-include::{generated}/api/protos/vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR.txt[]
-
-  * pname:physicalDevice is the handle to the physical device whose queue
-    family performance query counter properties will be queried.
-  * pname:queueFamilyIndex is the index into the queue family of the
-    physical device we want to get properties for.
-  * pname:pCounterCount is a pointer to an integer related to the number of
-    counters available or queried, as described below.
-  * pname:pCounters is either `NULL` or a pointer to an array of
-    slink:VkPerformanceCounterKHR structures.
-  * pname:pCounterDescriptions is either `NULL` or a pointer to an array of
-    slink:VkPerformanceCounterDescriptionKHR structures.
-
-If pname:pCounters is `NULL` and pname:pCounterDescriptions is `NULL`, then
-the number of counters available is returned in pname:pCounterCount.
-Otherwise, pname:pCounterCount must: point to a variable set by the user to
-the number of elements in the pname:pCounters, pname:pCounterDescriptions,
-or both arrays and on return the variable is overwritten with the number of
-structures actually written out.
-If pname:pCounterCount is less than the number of counters available, at
-most pname:pCounterCount structures will be written, and ename:VK_INCOMPLETE
-will be returned instead of ename:VK_SUCCESS, to indicate that not all the
-available counters were returned.
-
-include::{generated}/validity/protos/vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR.txt[]
---
-
-[open,refpage='VkPerformanceCounterKHR',desc='Structure providing information about a counter',type='structs']
---
-The sname:VkPerformanceCounterKHR structure is defined as:
-
-include::{generated}/api/structs/VkPerformanceCounterKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:unit is a elink:VkPerformanceCounterUnitKHR specifying the unit
-    that the counter data will record.
-  * pname:scope is a elink:VkPerformanceCounterScopeKHR specifying the scope
-    that the counter belongs to.
-  * pname:storage is a elink:VkPerformanceCounterStorageKHR specifying the
-    storage type that the counter's data uses.
-  * pname:uuid is an array of size ename:VK_UUID_SIZE, containing 8-bit
-    values that represent a universally unique identifier for the counter of
-    the physical device.
-
-include::{generated}/validity/structs/VkPerformanceCounterKHR.txt[]
---
-
-[open,refpage='VkPerformanceCounterUnitKHR',desc='Supported counter unit types',type='enums']
---
-Performance counters have an associated unit.
-This unit describes how to interpret the performance counter result.
-
-The performance counter unit types which may: be returned in
-slink:VkPerformanceCounterKHR::pname:unit are:
-
-include::{generated}/api/enums/VkPerformanceCounterUnitKHR.txt[]
-
-  * ename:VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR - the performance counter
-    unit is a generic data point.
-  * ename:VK_PERFORMANCE_COUNTER_UNIT_PERCENTAGE_KHR - the performance
-    counter unit is a percentage (%).
-  * ename:VK_PERFORMANCE_COUNTER_UNIT_NANOSECONDS_KHR - the performance
-    counter unit is a value of nanoseconds (ns).
-  * ename:VK_PERFORMANCE_COUNTER_UNIT_BYTES_KHR - the performance counter
-    unit is a value of bytes.
-  * ename:VK_PERFORMANCE_COUNTER_UNIT_BYTES_PER_SECOND_KHR - the performance
-    counter unit is a value of bytes/s.
-  * ename:VK_PERFORMANCE_COUNTER_UNIT_KELVIN_KHR - the performance counter
-    unit is a temperature reported in Kelvin.
-  * ename:VK_PERFORMANCE_COUNTER_UNIT_WATTS_KHR - the performance counter
-    unit is a value of watts (W).
-  * ename:VK_PERFORMANCE_COUNTER_UNIT_VOLTS_KHR - the performance counter
-    unit is a value of volts (V).
-  * ename:VK_PERFORMANCE_COUNTER_UNIT_AMPS_KHR - the performance counter
-    unit is a value of amps (A).
-  * ename:VK_PERFORMANCE_COUNTER_UNIT_HERTZ_KHR - the performance counter
-    unit is a value of hertz (Hz).
-  * ename:VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR - the performance counter
-    unit is a value of cycles.
---
-
-[open,refpage='VkPerformanceCounterScopeKHR',desc='Supported counter scope types',type='enums']
---
-Performance counters have an associated scope.
-This scope describes the granularity of a performance counter.
-
-The performance counter scope types which may: be returned in
-slink:VkPerformanceCounterKHR::pname:scope are:
-
-include::{generated}/api/enums/VkPerformanceCounterScopeKHR.txt[]
-
-  * ename:VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR - the performance
-    counter scope is a single complete command buffer.
-  * ename:VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR - the performance
-    counter scope is zero or more complete render passes.
-    The performance query containing the performance counter must: begin and
-    end outside a render pass instance.
-  * ename:VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR - the performance counter
-    scope is zero or more commands.
---
-
-[open,refpage='VkPerformanceCounterStorageKHR',desc='Supported counter storage types',type='enums']
---
-Performance counters have an associated storage.
-This storage describes the payload of a counter result.
-
-The performance counter storage types which may: be returned in
-slink:VkPerformanceCounterKHR::pname:storage are:
-
-include::{generated}/api/enums/VkPerformanceCounterStorageKHR.txt[]
-
-  * ename:VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR - the performance counter
-    storage is a 32-bit signed integer.
-  * ename:VK_PERFORMANCE_COUNTER_STORAGE_INT64_KHR - the performance counter
-    storage is a 64-bit signed integer.
-  * ename:VK_PERFORMANCE_COUNTER_STORAGE_UINT32_KHR - the performance
-    counter storage is a 32-bit unsigned integer.
-  * ename:VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR - the performance
-    counter storage is a 64-bit unsigned integer.
-  * ename:VK_PERFORMANCE_COUNTER_STORAGE_FLOAT32_KHR - the performance
-    counter storage is a 32-bit floating-point.
-  * ename:VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR - the performance
-    counter storage is a 64-bit floating-point.
---
-
-[open,refpage='VkPerformanceCounterDescriptionKHR',desc='Structure providing more detailed information about a counter',type='structs']
---
-The sname:VkPerformanceCounterDescriptionKHR structure is defined as:
-
-include::{generated}/api/structs/VkPerformanceCounterDescriptionKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of
-    elink:VkPerformanceCounterDescriptionFlagBitsKHR indicating the usage
-    behavior for the counter.
-  * pname:name is an array of size ename:VK_MAX_DESCRIPTION_SIZE, containing
-    a null-terminated UTF-8 string specifying the name of the counter.
-  * pname:category is an array of size ename:VK_MAX_DESCRIPTION_SIZE,
-    containing a null-terminated UTF-8 string specifying the category of the
-    counter.
-  * pname:description is an array of size ename:VK_MAX_DESCRIPTION_SIZE,
-    containing a null-terminated UTF-8 string specifying the description of
-    the counter.
-
-include::{generated}/validity/structs/VkPerformanceCounterDescriptionKHR.txt[]
---
-
-[open,refpage='VkPerformanceCounterDescriptionFlagBitsKHR',desc='Bitmask specifying usage behavior for a counter',type='enums']
---
-Bits which can: be set in
-slink:VkPerformanceCounterDescriptionKHR::pname:flags to specify usage
-behavior for a performance counter are:
-
-include::{generated}/api/enums/VkPerformanceCounterDescriptionFlagBitsKHR.txt[]
-
-  * ename:VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR
-    specifies that recording the counter may: have a noticeable performance
-    impact.
-  * ename:VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR
-    specifies that concurrently recording the counter while other submitted
-    command buffers are running may: impact the accuracy of the recording.
---
-
-[open,refpage='VkPerformanceCounterDescriptionFlagsKHR',desc='Bitmask of VkPerformanceCounterDescriptionFlagBitsKHR',type='flags']
---
-include::{generated}/api/flags/VkPerformanceCounterDescriptionFlagsKHR.txt[]
-
-tlink:VkPerformanceCounterDescriptionFlagsKHR is a bitmask type for setting
-a mask of zero or more elink:VkPerformanceCounterDescriptionFlagBitsKHR.
---
diff --git a/registry/vulkan/chapters/VK_KHR_pipeline_executable_properties/pipelines.txt b/registry/vulkan/chapters/VK_KHR_pipeline_executable_properties/pipelines.txt
deleted file mode 100644
index ce01b17..0000000
--- a/registry/vulkan/chapters/VK_KHR_pipeline_executable_properties/pipelines.txt
+++ /dev/null
@@ -1,335 +0,0 @@
-// Copyright 2019-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// This section is included inside the Pipelines chapter (pipelines.txt)
-
-[open,refpage='vkGetPipelineExecutablePropertiesKHR',desc='Get the executables associated with a pipeline',type='protos']
---
-When a pipeline is created, its state and shaders are compiled into zero or
-more device-specific executables, which are used when executing commands
-against that pipeline.
-To query the properties of these pipeline executables, call:
-
-include::{generated}/api/protos/vkGetPipelineExecutablePropertiesKHR.txt[]
-
-  * pname:device is the device that created the pipeline.
-  * pname:pPipelineInfo describes the pipeline being queried.
-  * pname:pExecutableCount is a pointer to an integer related to the number
-    of pipeline executables available or queried, as described below.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    slink:VkPipelineExecutablePropertiesKHR structures.
-
-If pname:pProperties is `NULL`, then the number of pipeline executables
-associated with the pipeline is returned in pname:pExecutableCount.
-Otherwise, pname:pExecutableCount must: point to a variable set by the user
-to the number of elements in the pname:pProperties array, and on return the
-variable is overwritten with the number of structures actually written to
-pname:pProperties.
-If pname:pExecutableCount is less than the number of pipeline executables
-associated with the pipeline, at most pname:pExecutableCount structures will
-be written, and ename:VK_INCOMPLETE will be returned instead of
-ename:VK_SUCCESS, to indicate that not all the available properties were
-returned.
-
-.Valid Usage
-****
-  * [[VUID-vkGetPipelineExecutablePropertiesKHR-pipelineExecutableInfo-03270]]
-    <<features-pipelineExecutableInfo, pname:pipelineExecutableInfo>> must:
-    be enabled
-  * [[VUID-vkGetPipelineExecutablePropertiesKHR-pipeline-03271]]
-    pname:pipeline member of pname:pPipelineInfo must: have been created
-    with pname:device
-****
-
-include::{generated}/validity/protos/vkGetPipelineExecutablePropertiesKHR.txt[]
---
-
-[open,refpage='VkPipelineInfoKHR',desc='Structure describing a pipeline',type='structs']
---
-The sname:VkPipelineInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkPipelineInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pipeline is a sname:VkPipeline handle.
-
-include::{generated}/validity/structs/VkPipelineInfoKHR.txt[]
---
-
-[open,refpage='VkPipelineExecutablePropertiesKHR',desc='Structure describing a pipeline executable',type='structs']
---
-The sname:VkPipelineExecutablePropertiesKHR structure is defined as:
-
-include::{generated}/api/structs/VkPipelineExecutablePropertiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:stages is a bitmask of zero or more elink:VkShaderStageFlagBits
-    indicating which shader stages (if any) were principally used as inputs
-    to compile this pipeline executable.
-  * pname:name is an array of ename:VK_MAX_DESCRIPTION_SIZE code:char
-    containing a null-terminated UTF-8 string which is a short human
-    readable name for this pipeline executable.
-  * pname:description is an array of ename:VK_MAX_DESCRIPTION_SIZE code:char
-    containing a null-terminated UTF-8 string which is a human readable
-    description for this pipeline executable.
-  * pname:subgroupSize is the subgroup size with which this pipeline
-    executable is dispatched.
-
-Not all implementations have a 1:1 mapping between shader stages and
-pipeline executables and some implementations may: reduce a given shader
-stage to fixed function hardware programming such that no pipeline
-executable is available.
-No guarantees are provided about the mapping between shader stages and
-pipeline executables and pname:stages should: be considered a best effort
-hint.
-Because the application cannot: rely on the pname:stages field to provide an
-exact description, pname:name and pname:description provide a human readable
-name and description which more accurately describes the given pipeline
-executable.
-
-include::{generated}/validity/structs/VkPipelineExecutablePropertiesKHR.txt[]
---
-
-[open,refpage='vkGetPipelineExecutableStatisticsKHR',desc='Get compile time statistics associated with a pipeline executable',type='protos']
---
-Each pipeline executable may: have a set of statistics associated with it
-that are generated by the pipeline compilation process.
-These statistics may: include things such as instruction counts, amount of
-spilling (if any), maximum number of simultaneous threads, or anything else
-which may: aid developers in evaluating the expected performance of a
-shader.
-To query the compile-time statistics associated with a pipeline executable,
-call:
-
-include::{generated}/api/protos/vkGetPipelineExecutableStatisticsKHR.txt[]
-
-  * pname:device is the device that created the pipeline.
-  * pname:pExecutableInfo describes the pipeline executable being queried.
-  * pname:pStatisticCount is a pointer to an integer related to the number
-    of statistics available or queried, as described below.
-  * pname:pStatistics is either `NULL` or a pointer to an array of
-    slink:VkPipelineExecutableStatisticKHR structures.
-
-If pname:pStatistics is `NULL`, then the number of statistics associated
-with the pipeline executable is returned in pname:pStatisticCount.
-Otherwise, pname:pStatisticCount must: point to a variable set by the user
-to the number of elements in the pname:pStatistics array, and on return the
-variable is overwritten with the number of structures actually written to
-pname:pStatistics.
-If pname:pStatisticCount is less than the number of statistics associated
-with the pipeline executable, at most pname:pStatisticCount structures will
-be written, and ename:VK_INCOMPLETE will be returned instead of
-ename:VK_SUCCESS, to indicate that not all the available statistics were
-returned.
-
-.Valid Usage
-****
-  * [[VUID-vkGetPipelineExecutableStatisticsKHR-pipelineExecutableInfo-03272]]
-    <<features-pipelineExecutableInfo, pname:pipelineExecutableInfo>> must:
-    be enabled
-  * [[VUID-vkGetPipelineExecutableStatisticsKHR-pipeline-03273]]
-    pname:pipeline member of pname:pExecutableInfo must: have been created
-    with pname:device
-  * [[VUID-vkGetPipelineExecutableStatisticsKHR-pipeline-03274]]
-    pname:pipeline member of pname:pExecutableInfo must: have been created
-    with ename:VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR
-****
-
-include::{generated}/validity/protos/vkGetPipelineExecutableStatisticsKHR.txt[]
---
-
-[open,refpage='VkPipelineExecutableInfoKHR',desc='Structure describing a pipeline executable to query for associated statistics or internal representations',type='structs']
---
-The sname:VkPipelineExecutableInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkPipelineExecutableInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pipeline is the pipeline to query.
-  * pname:executableIndex is the index of the pipeline executable to query
-    in the array of executable properties returned by
-    flink:vkGetPipelineExecutablePropertiesKHR.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineExecutableInfoKHR-executableIndex-03275]]
-    pname:executableIndex must: be less than the number of pipeline
-    executables associated with pname:pipeline as returned in the
-    pname:pExecutableCount parameter of
-    fname:vkGetPipelineExecutablePropertiesKHR
-****
-
-include::{generated}/validity/structs/VkPipelineExecutableInfoKHR.txt[]
---
-
-[open,refpage='VkPipelineExecutableStatisticKHR',desc='Structure describing a compile-time pipeline executable statistic',type='structs']
---
-The sname:VkPipelineExecutableStatisticKHR structure is defined as:
-
-include::{generated}/api/structs/VkPipelineExecutableStatisticKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:name is an array of ename:VK_MAX_DESCRIPTION_SIZE code:char
-    containing a null-terminated UTF-8 string which is a short human
-    readable name for this statistic.
-  * pname:description is an array of ename:VK_MAX_DESCRIPTION_SIZE code:char
-    containing a null-terminated UTF-8 string which is a human readable
-    description for this statistic.
-  * pname:format is a elink:VkPipelineExecutableStatisticFormatKHR value
-    specifying the format of the data found in pname:value.
-  * pname:value is the value of this statistic.
-
-include::{generated}/validity/structs/VkPipelineExecutableStatisticKHR.txt[]
---
-
-[open,refpage='VkPipelineExecutableStatisticFormatKHR',desc='Enum describing a pipeline executable statistic's data format',type='enums']
---
-The ename:VkPipelineExecutableStatisticFormatKHR enum is defined as:
-
-include::{generated}/api/enums/VkPipelineExecutableStatisticFormatKHR.txt[]
-
-  * ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR specifies that
-    the statistic is returned as a 32-bit boolean value which must: be
-    either ename:VK_TRUE or ename:VK_FALSE and should: be read from the
-    fname:b32 field of sname:VkPipelineExecutableStatisticValueKHR.
-  * ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR specifies that
-    the statistic is returned as a signed 64-bit integer and should: be read
-    from the fname:i64 field of sname:VkPipelineExecutableStatisticValueKHR.
-  * ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR specifies that
-    the statistic is returned as an unsigned 64-bit integer and should: be
-    read from the fname:u64 field of
-    sname:VkPipelineExecutableStatisticValueKHR.
-  * ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR specifies that
-    the statistic is returned as a 64-bit floating-point value and should:
-    be read from the fname:f64 field of
-    sname:VkPipelineExecutableStatisticValueKHR.
---
-
-[open,refpage='VkPipelineExecutableStatisticValueKHR',desc='A union describing a pipeline executable statistic's value',type='structs']
---
-The sname:VkPipelineExecutableStatisticValueKHR union is defined as:
-
-include::{generated}/api/structs/VkPipelineExecutableStatisticValueKHR.txt[]
-
-  * pname:b32 is the 32-bit boolean value if the
-    ename:VkPipelineExecutableStatisticFormatKHR is
-    ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR.
-  * pname:i64 is the signed 64-bit integer value if the
-    ename:VkPipelineExecutableStatisticFormatKHR is
-    ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR.
-  * pname:u64 is the unsigned 64-bit integer value if the
-    ename:VkPipelineExecutableStatisticFormatKHR is
-    ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR.
-  * pname:f64 is the 64-bit floating-point value if the
-    ename:VkPipelineExecutableStatisticFormatKHR is
-    ename:VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR.
-
-include::{generated}/validity/structs/VkPipelineExecutableStatisticValueKHR.txt[]
---
-
-[open,refpage='vkGetPipelineExecutableInternalRepresentationsKHR',desc='Get internal representations of the pipeline executable',type='protos']
---
-Each pipeline executable may: have one or more text or binary internal
-representations associated with it which are generated as part of the
-compile process.
-These may: include the final shader assembly, a binary form of the compiled
-shader, or the shader compiler's internal representation at any number of
-intermediate compile steps.
-To query the internal representations associated with a pipeline executable,
-call:
-
-include::{generated}/api/protos/vkGetPipelineExecutableInternalRepresentationsKHR.txt[]
-
-  * pname:device is the device that created the pipeline.
-  * pname:pExecutableInfo describes the pipeline executable being queried.
-  * pname:pInternalRepresentationCount is a pointer to an integer related to
-    the number of internal representations available or queried, as
-    described below.
-  * pname:pInternalRepresentations is either `NULL` or a pointer to an array
-    of slink:VkPipelineExecutableInternalRepresentationKHR structures.
-
-If pname:pInternalRepresentations is `NULL`, then the number of internal
-representations associated with the pipeline executable is returned in
-pname:pInternalRepresentationCount.
-Otherwise, pname:pInternalRepresentationCount must: point to a variable set
-by the user to the number of elements in the pname:pInternalRepresentations
-array, and on return the variable is overwritten with the number of
-structures actually written to pname:pInternalRepresentations.
-If pname:pInternalRepresentationCount is less than the number of internal
-representations associated with the pipeline executable, at most
-pname:pInternalRepresentationCount structures will be written, and
-ename:VK_INCOMPLETE will be returned instead of ename:VK_SUCCESS, to
-indicate that not all the available representations were returned.
-
-While the details of the internal representations remain
-implementation-dependent, the implementation should: order the internal
-representations in the order in which they occur in the compiled pipeline
-with the final shader assembly (if any) last.
-
-.Valid Usage
-****
-  * [[VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipelineExecutableInfo-03276]]
-    <<features-pipelineExecutableInfo, pname:pipelineExecutableInfo>> must:
-    be enabled
-  * [[VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipeline-03277]]
-    pname:pipeline member of pname:pExecutableInfo must: have been created
-    with pname:device
-  * [[VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipeline-03278]]
-    pname:pipeline member of pname:pExecutableInfo must: have been created
-    with ename:VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR
-****
-
-include::{generated}/validity/protos/vkGetPipelineExecutableInternalRepresentationsKHR.txt[]
---
-
-[open,refpage='VkPipelineExecutableInternalRepresentationKHR',desc='Structure describing the textual form of a pipeline executable internal representation',type='structs']
---
-The sname:VkPipelineExecutableInternalRepresentationKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkPipelineExecutableInternalRepresentationKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:name is an array of ename:VK_MAX_DESCRIPTION_SIZE code:char
-    containing a null-terminated UTF-8 string which is a short human
-    readable name for this internal representation.
-  * pname:description is an array of ename:VK_MAX_DESCRIPTION_SIZE code:char
-    containing a null-terminated UTF-8 string which is a human readable
-    description for this internal representation.
-  * pname:isText specifies whether the returned data is text or opaque data.
-    If pname:isText is ename:VK_TRUE then the data returned in pname:pData
-    is text and is guaranteed to be a null-terminated UTF-8 string.
-  * pname:dataSize is an integer related to the size, in bytes, of the
-    internal representation's data, as described below.
-  * pname:pData is either `NULL` or a pointer to a block of data into which
-    the implementation will write the internal representation.
-
-If pname:pData is `NULL`, then the size, in bytes, of the internal
-representation data is returned in pname:dataSize.
-Otherwise, pname:dataSize must be the size of the buffer, in bytes, pointed
-to by pname:pData and on return pname:dataSize is overwritten with the
-number of bytes of data actually written to pname:pData including any
-trailing null character.
-If pname:dataSize is less than the size, in bytes, of the internal
-representation's data, at most pname:dataSize bytes of data will be written
-to pname:pData, and ename:VK_INCOMPLETE will be returned instead of
-ename:VK_SUCCESS, to indicate that not all the available representation was
-returned.
-
-If pname:isText is ename:VK_TRUE and pname:pData is not `NULL` and
-pname:dataSize is not zero, the last byte written to pname:pData will be a
-null character.
-
-include::{generated}/validity/structs/VkPipelineExecutableInternalRepresentationKHR.txt[]
---
diff --git a/registry/vulkan/chapters/VK_KHR_present_wait/WaitForPresent.txt b/registry/vulkan/chapters/VK_KHR_present_wait/WaitForPresent.txt
deleted file mode 100644
index ba09b5b..0000000
--- a/registry/vulkan/chapters/VK_KHR_present_wait/WaitForPresent.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2019-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='vkWaitForPresentKHR',desc='Wait for presentation',type='protos']
---
-When the <<features-presentWait, pname:presentWait>> feature is enabled, an
-application can: wait for an image to be presented to the user by first
-specifying a presentId for the target presentation by adding a
-sname:VkPresentIdKHR structure to the pname:pNext chain of the
-slink:VkPresentInfoKHR structure and then waiting for that presentation to
-complete by calling:
-
-include::{generated}/api/protos/vkWaitForPresentKHR.txt[]
-
-  * pname:device is the device associated with pname:swapchain.
-  * pname:swapchain is the non-retired swapchain on which an image was
-    queued for presentation.
-  * pname:presentId is the presentation presentId to wait for.
-  * pname:timeout is the timeout period in units of nanoseconds.
-    pname:timeout is adjusted to the closest value allowed by the
-    implementation-dependent timeout accuracy, which may: be substantially
-    longer than one nanosecond, and may: be longer than the requested
-    period.
-
-fname:vkWaitForPresentKHR waits for the presentId associated with
-pname:swapchain to be increased in value so that it is at least equal to
-pname:presentId.
-
-For ename:VK_PRESENT_MODE_MAILBOX_KHR (or other present mode where images
-may be replaced in the presentation queue) any wait of this type associated
-with such an image must: be signaled no later than a wait associated with
-the replacing image would be signaled.
-
-When the presentation has completed, the presentId associated with the
-related pname:pSwapchains entry will be increased in value so that it is at
-least equal to the value provided in the sname:VkPresentIdKHR structure.
-
-There is no requirement for any precise timing relationship between the
-presentation of the image to the user and the update of the presentId value,
-but implementations should: make this as close as possible to the
-presentation of the first pixel in the new image to the user.
-
-The call to fname:vkWaitForPresentKHR will block until either the presentId
-associated with pname:swapchain is greater than or equal to pname:presentId,
-or pname:timeout nanoseconds passes.
-When the swapchain becomes OUT_OF_DATE, the call will either return
-ename:VK_SUCCESS (if the image was delivered to the presentation engine and
-may have been presented to the user) or will return early with status
-ename:VK_ERROR_OUT_OF_DATE_KHR (if the image was not presented to the user).
-
-As an exception to the normal rules for objects which are externally
-synchronized, the pname:swapchain passed to fname:vkWaitForPresentKHR may:
-be simultaneously used by other threads in calls to functions other than
-flink:vkDestroySwapchainKHR.
-Access to the swapchain data associated with this extension must: be atomic
-within the implementation.
-
-.Valid Usage
-****
-  * [[VUID-vkWaitForPresentKHR-swapchain-04997]]
-    pname:swapchain must: not be in the retired state
-  * [[VUID-vkWaitForPresentKHR-presentWait-06234]]
-    The <<features-presentWait, pname:presentWait>> feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkWaitForPresentKHR.txt[]
---
diff --git a/registry/vulkan/chapters/VK_KHR_present_wait/present_wait.txt b/registry/vulkan/chapters/VK_KHR_present_wait/present_wait.txt
deleted file mode 100644
index 21f1f93..0000000
--- a/registry/vulkan/chapters/VK_KHR_present_wait/present_wait.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[present-wait]]
-== Present Wait
-
-Applications wanting to control the pacing of the application by monitoring
-when presentation processes have completed to limit the number of
-outstanding images queued for presentation, need to have a method of being
-signaled during the presentation process.
-
-ifdef::VK_GOOGLE_display_timing,VK_KHR_present_timing[]
-Using
-ifdef::VK_KHR_present_timing[]
-the `VK_KHR_present_timing` extension
-ifdef::VK_GOOGLE_display_timing[or]
-endif::VK_KHR_present_timing[]
-ifdef::VK_GOOGLE_display_timing[]
-the `VK_GOOGLE_display_timing` extension
-endif::VK_GOOGLE_display_timing[]
-applications can discover when images were presented, but only
-asynchronously.
-endif::VK_GOOGLE_display_timing,VK_KHR_present_timing[]
-
-Providing a mechanism which allows applications to block, waiting for a
-specific step of the presentation process to complete allows them to control
-the amount of outstanding work (and hence the potential lag in responding to
-user input or changes in the rendering environment).
-
-The `apiext:VK_KHR_present_wait` extension allows applications to tell the
-presentation engine at the flink:vkQueuePresentKHR call that it plans on
-waiting for presentation by passing a slink:VkPresentIdKHR structure.
-The pname:presentId passed in that structure may then be passed to a future
-flink:vkWaitForPresentKHR call to cause the application to block until that
-presentation is finished.
diff --git a/registry/vulkan/chapters/VK_KHR_shared_presentable_image/wsi.txt b/registry/vulkan/chapters/VK_KHR_shared_presentable_image/wsi.txt
deleted file mode 100644
index 4718b2f..0000000
--- a/registry/vulkan/chapters/VK_KHR_shared_presentable_image/wsi.txt
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-If a swapchain is created with pname:presentMode set to either
-ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or
-ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, a single presentable
-image can: be acquired, referred to as a shared presentable image.
-A shared presentable image may: be concurrently accessed by the application
-and the presentation engine, without transitioning the image's layout after
-it is initially presented.
-
-  * With ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR, the presentation
-    engine is only required to update to the latest contents of a shared
-    presentable image after a present.
-    The application must: call fname:vkQueuePresentKHR to guarantee an
-    update.
-    However, the presentation engine may: update from it at any time.
-  * With ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, the
-    presentation engine will automatically present the latest contents of a
-    shared presentable image during every refresh cycle.
-    The application is only required to make one initial call to
-    fname:vkQueuePresentKHR, after which the presentation engine will update
-    from it without any need for further present calls.
-    The application can: indicate the image contents have been updated by
-    calling fname:vkQueuePresentKHR, but this does not guarantee the timing
-    of when updates will occur.
-
-The presentation engine may: access a shared presentable image at any time
-after it is first presented.
-To avoid tearing, an application should: coordinate access with the
-presentation engine.
-This requires presentation engine timing information through
-platform-specific mechanisms and ensuring that color attachment writes are
-made available during the portion of the presentation engine’s refresh cycle
-they are intended for.
-
-[NOTE]
-.Note
-====
-The `VK_KHR_shared_presentable_image` extension does not provide
-functionality for determining the timing of the presentation engine's
-refresh cycles.
-====
-
-[open,refpage='vkGetSwapchainStatusKHR',desc='Get a swapchain\'s status',type='protos']
---
-In order to query a swapchain's status when rendering to a shared
-presentable image, call:
-include::{generated}/api/protos/vkGetSwapchainStatusKHR.txt[]
-
-  * pname:device is the device associated with pname:swapchain.
-  * pname:swapchain is the swapchain to query.
-
-include::{generated}/validity/protos/vkGetSwapchainStatusKHR.txt[]
---
-
-The possible return values for fname:vkGetSwapchainStatusKHR should: be
-interpreted as follows:
-
-  * ename:VK_SUCCESS specifies the presentation engine is presenting the
-    contents of the shared presentable image, as per the swapchain's
-    elink:VkPresentModeKHR.
-  * ename:VK_SUBOPTIMAL_KHR the swapchain no longer matches the surface
-    properties exactly, but the presentation engine is presenting the
-    contents of the shared presentable image, as per the swapchain's
-    elink:VkPresentModeKHR.
-  * ename:VK_ERROR_OUT_OF_DATE_KHR the surface has changed in such a way
-    that it is no longer compatible with the swapchain.
-  * ename:VK_ERROR_SURFACE_LOST_KHR the surface is no longer available.
-
-[NOTE]
-.Note
-====
-The swapchain state may: be cached by implementations, so applications
-should: regularly call fname:vkGetSwapchainStatusKHR when using a swapchain
-with elink:VkPresentModeKHR set to
-ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR.
-====
-
-
diff --git a/registry/vulkan/chapters/VK_KHR_surface/wsi.txt b/registry/vulkan/chapters/VK_KHR_surface/wsi.txt
deleted file mode 100644
index f140c15..0000000
--- a/registry/vulkan/chapters/VK_KHR_surface/wsi.txt
+++ /dev/null
@@ -1,1538 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[wsi]]
-= Window System Integration (WSI)
-
-This chapter discusses the window system integration (WSI) between the
-Vulkan API and the various forms of displaying the results of rendering to a
-user.
-Since the Vulkan API can: be used without displaying results, WSI is
-provided through the use of optional Vulkan extensions.
-This chapter provides an overview of WSI.
-See the appendix for additional details of each WSI extension, including
-which extensions must: be enabled in order to use each of the functions
-described in this chapter.
-
-
-== WSI Platform
-
-A platform is an abstraction for a window system, OS, etc.
-Some examples include MS Windows, Android, and Wayland.
-The Vulkan API may: be integrated in a unique manner for each platform.
-
-The Vulkan API does not define any type of platform object.
-Platform-specific WSI extensions are defined, each containing
-platform-specific functions for using WSI.
-Use of these extensions is guarded by preprocessor symbols as defined in the
-<<boilerplate-wsi-header,Window System-Specific Header Control>> appendix.
-
-In order for an application to be compiled to use WSI with a given platform,
-it must either:
-
-  * `#define` the appropriate preprocessor symbol prior to including the
-    `{full_header}` header file, or
-  * include `{core_header}` and any native platform headers, followed by the
-    appropriate platform-specific header.
-
-The preprocessor symbols and platform-specific headers are defined in the
-<<boilerplate-wsi-header-table, Window System Extensions and Headers>>
-table.
-
-Each platform-specific extension is an instance extension.
-The application must: enable instance extensions with fname:vkCreateInstance
-before using them.
-
-
-== WSI Surface
-
-[open,refpage='VkSurfaceKHR',desc='Opaque handle to a surface object',type='handles']
---
-Native platform surface or window objects are abstracted by surface objects,
-which are represented by sname:VkSurfaceKHR handles:
-
-include::{generated}/api/handles/VkSurfaceKHR.txt[]
-
-The `VK_KHR_surface` extension declares the sname:VkSurfaceKHR object, and
-provides a function for destroying sname:VkSurfaceKHR objects.
-Separate platform-specific extensions each provide a function for creating a
-sname:VkSurfaceKHR object for the respective platform.
-From the application's perspective this is an opaque handle, just like the
-handles of other Vulkan objects.
-
-ifdef::implementation-guide[]
-[NOTE]
-.Note
-====
-On certain platforms, the Vulkan loader and ICDs may: have conventions that
-treat the handle as a pointer to a structure containing the
-platform-specific information about the surface.
-This will be described in the documentation for the loader-ICD interface,
-and in the `vk_icd.h` header file of the LoaderAndTools source-code
-repository.
-This does not affect the loader-layer interface; layers may: wrap
-sname:VkSurfaceKHR objects.
-====
-endif::implementation-guide[]
---
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-TODO: Consider replacing the above note editing note with a pointer to the
-loader specification, when it exists.
-However, the information is not relevant to users of the API nor does it
-affect conformance of a Vulkan implementation.
-====
-endif::editing-notes[]
-
-ifdef::VK_KHR_android_surface[]
-include::{chapters}/VK_KHR_android_surface/platformCreateSurface_android.txt[]
-endif::VK_KHR_android_surface[]
-
-ifdef::VK_KHR_wayland_surface[]
-include::{chapters}/VK_KHR_wayland_surface/platformCreateSurface_wayland.txt[]
-endif::VK_KHR_wayland_surface[]
-
-ifdef::VK_KHR_win32_surface[]
-include::{chapters}/VK_KHR_win32_surface/platformCreateSurface_win32.txt[]
-endif::VK_KHR_win32_surface[]
-
-ifdef::VK_KHR_xcb_surface[]
-include::{chapters}/VK_KHR_xcb_surface/platformCreateSurface_xcb.txt[]
-endif::VK_KHR_xcb_surface[]
-
-ifdef::VK_KHR_xlib_surface[]
-include::{chapters}/VK_KHR_xlib_surface/platformCreateSurface_xlib.txt[]
-endif::VK_KHR_xlib_surface[]
-
-ifdef::VK_EXT_directfb_surface[]
-include::{chapters}/VK_EXT_directfb_surface/platformCreateSurface_directfb.txt[]
-endif::VK_EXT_directfb_surface[]
-
-ifdef::VK_FUCHSIA_imagepipe_surface[]
-include::{chapters}/VK_FUCHSIA_imagepipe_surface/platformCreateSurface_imagepipe.txt[]
-endif::VK_FUCHSIA_imagepipe_surface[]
-
-ifdef::VK_GGP_stream_descriptor_surface[]
-include::{chapters}/VK_GGP_stream_descriptor_surface/platformCreateSurface_streamdescriptor.txt[]
-endif::VK_GGP_stream_descriptor_surface[]
-
-ifdef::VK_MVK_ios_surface[]
-include::{chapters}/VK_MVK_ios_surface/platformCreateSurface_ios.txt[]
-endif::VK_MVK_ios_surface[]
-
-ifdef::VK_MVK_macos_surface[]
-include::{chapters}/VK_MVK_macos_surface/platformCreateSurface_macos.txt[]
-endif::VK_MVK_macos_surface[]
-
-ifdef::VK_NN_vi_surface[]
-include::{chapters}/VK_NN_vi_surface/platformCreateSurface_vi.txt[]
-endif::VK_NN_vi_surface[]
-
-ifdef::VK_EXT_metal_surface[]
-include::{chapters}/VK_EXT_metal_surface/platformCreateSurface_metal.txt[]
-endif::VK_EXT_metal_surface[]
-
-ifdef::VK_QNX_screen_surface[]
-include::{chapters}/VK_QNX_screen_surface/platformCreateSurface_screen.txt[]
-endif::VK_QNX_screen_surface[]
-
-=== Platform-Independent Information
-
-Once created, sname:VkSurfaceKHR objects can: be used in this and other
-extensions, in particular the `apiext:VK_KHR_swapchain` extension.
-
-Several WSI functions return ename:VK_ERROR_SURFACE_LOST_KHR if the surface
-becomes no longer available.
-After such an error, the surface (and any child swapchain, if one exists)
-should: be destroyed, as there is no way to restore them to a not-lost
-state.
-Applications may: attempt to create a new sname:VkSurfaceKHR using the same
-native platform window object, but whether such re-creation will succeed is
-platform-dependent and may: depend on the reason the surface became
-unavailable.
-A lost surface does not otherwise cause devices to be
-<<devsandqueues-lost-device,lost>>.
-
-[open,refpage='vkDestroySurfaceKHR',desc='Destroy a VkSurfaceKHR object',type='protos']
---
-To destroy a sname:VkSurfaceKHR object, call:
-
-include::{generated}/api/protos/vkDestroySurfaceKHR.txt[]
-
-  * pname:instance is the instance used to create the surface.
-  * pname:surface is the surface to destroy.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-
-Destroying a sname:VkSurfaceKHR merely severs the connection between Vulkan
-and the native surface, and does not imply destroying the native surface,
-closing a window, or similar behavior.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroySurfaceKHR-surface-01266]]
-    All sname:VkSwapchainKHR objects created for pname:surface must: have
-    been destroyed prior to destroying pname:surface
-  * [[VUID-vkDestroySurfaceKHR-surface-01267]]
-    If sname:VkAllocationCallbacks were provided when pname:surface was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroySurfaceKHR-surface-01268]]
-    If no sname:VkAllocationCallbacks were provided when pname:surface was
-    created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroySurfaceKHR.txt[]
---
-
-ifdef::VK_KHR_display[]
-include::{chapters}/VK_KHR_display/display.txt[]
-endif::VK_KHR_display[]
-
-ifdef::VK_EXT_headless_surface[]
-include::{chapters}/VK_EXT_headless_surface/headless.txt[]
-endif::VK_EXT_headless_surface[]
-
-
-== Querying for WSI Support
-
-Not all physical devices will include WSI support.
-Within a physical device, not all queue families will support presentation.
-WSI support and compatibility can: be determined in a platform-neutral
-manner (which determines support for presentation to a particular surface
-object) and additionally may: be determined in platform-specific manners
-(which determine support for presentation on the specified physical device
-but do not guarantee support for presentation to a particular surface
-object).
-
-[open,refpage='vkGetPhysicalDeviceSurfaceSupportKHR',desc='Query if presentation is supported',type='protos']
---
-To determine whether a queue family of a physical device supports
-presentation to a given surface, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceSurfaceSupportKHR.txt[]
-
-  * pname:physicalDevice is the physical device.
-  * pname:queueFamilyIndex is the queue family.
-  * pname:surface is the surface.
-  * pname:pSupported is a pointer to a basetype:VkBool32, which is set to
-    ename:VK_TRUE to indicate support, and ename:VK_FALSE otherwise.
-
-.Valid Usage
-****
-  * [[VUID-vkGetPhysicalDeviceSurfaceSupportKHR-queueFamilyIndex-01269]]
-    pname:queueFamilyIndex must: be less than
-    pname:pQueueFamilyPropertyCount returned by
-    fname:vkGetPhysicalDeviceQueueFamilyProperties for the given
-    pname:physicalDevice
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceSurfaceSupportKHR.txt[]
---
-
-ifdef::VK_KHR_android_surface[]
-include::{chapters}/VK_KHR_android_surface/platformQuerySupport_android.txt[]
-endif::VK_KHR_android_surface[]
-
-ifdef::VK_KHR_wayland_surface[]
-include::{chapters}/VK_KHR_wayland_surface/platformQuerySupport_wayland.txt[]
-endif::VK_KHR_wayland_surface[]
-
-ifdef::VK_KHR_win32_surface[]
-include::{chapters}/VK_KHR_win32_surface/platformQuerySupport_win32.txt[]
-endif::VK_KHR_win32_surface[]
-
-ifdef::VK_KHR_xcb_surface[]
-include::{chapters}/VK_KHR_xcb_surface/platformQuerySupport_xcb.txt[]
-endif::VK_KHR_xcb_surface[]
-
-ifdef::VK_KHR_xlib_surface[]
-include::{chapters}/VK_KHR_xlib_surface/platformQuerySupport_xlib.txt[]
-endif::VK_KHR_xlib_surface[]
-
-ifdef::VK_EXT_directfb_surface[]
-include::{chapters}/VK_EXT_directfb_surface/platformQuerySupport_directfb.txt[]
-endif::VK_EXT_directfb_surface[]
-
-ifdef::VK_FUCHSIA_imagepipe_surface[]
-include::{chapters}/VK_FUCHSIA_imagepipe_surface/platformQuerySupport_imagepipe.txt[]
-endif::VK_FUCHSIA_imagepipe_surface[]
-
-ifdef::VK_GGP_stream_descriptor_surface[]
-include::{chapters}/VK_GGP_stream_descriptor_surface/platformQuerySupport_streamdescriptor.txt[]
-endif::VK_GGP_stream_descriptor_surface[]
-
-ifdef::VK_MVK_ios_surface[]
-include::{chapters}/VK_MVK_ios_surface/platformQuerySupport_ios.txt[]
-endif::VK_MVK_ios_surface[]
-
-ifdef::VK_MVK_macos_surface[]
-include::{chapters}/VK_MVK_macos_surface/platformQuerySupport_macos.txt[]
-endif::VK_MVK_macos_surface[]
-
-ifdef::VK_NN_vi_surface[]
-include::{chapters}/VK_NN_vi_surface/platformQuerySupport_vi.txt[]
-endif::VK_NN_vi_surface[]
-
-ifdef::VK_QNX_screen_surface[]
-include::{chapters}/VK_QNX_screen_surface/platformQuerySupport_screen.txt[]
-endif::VK_QNX_screen_surface[]
-
-== Surface Queries
-
-The capabilities of a swapchain targeting a surface are the intersection of
-the capabilities of the WSI platform, the native window or display, and the
-physical device.
-The resulting capabilities can: be obtained with the queries listed below in
-this section.
-
-[NOTE]
-.Note
-====
-In addition to the surface capabilities as obtained by surface queries
-below, swapchain images are also subject to ordinary image creation limits
-as reported by flink:vkGetPhysicalDeviceImageFormatProperties.
-As an application is instructed by the appropriate Valid Usage sections,
-both the surface capabilities and the image creation limits have to be
-satisfied whenever swapchain images are created.
-====
-
-
-=== Surface Capabilities
-
-[open,refpage='vkGetPhysicalDeviceSurfaceCapabilitiesKHR',desc='Query surface capabilities',type='protos']
---
-:refpage: vkGetPhysicalDeviceSurfaceCapabilitiesKHR
-
-To query the basic capabilities of a surface, needed in order to create a
-swapchain, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.txt[]
-
-  * pname:physicalDevice is the physical device that will be associated with
-    the swapchain to be created, as described for
-    flink:vkCreateSwapchainKHR.
-  * pname:surface is the surface that will be associated with the swapchain.
-  * pname:pSurfaceCapabilities is a pointer to a
-    slink:VkSurfaceCapabilitiesKHR structure in which the capabilities are
-    returned.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/surface_physical_device_common.txt[]
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceSurfaceCapabilitiesKHR.txt[]
---
-
-[open,refpage='VkSurfaceCapabilitiesKHR',desc='Structure describing capabilities of a surface',type='structs']
---
-The sname:VkSurfaceCapabilitiesKHR structure is defined as:
-
-include::{generated}/api/structs/VkSurfaceCapabilitiesKHR.txt[]
-
-// These members are defined identically in VkSurfaceCapabilities2EXT, an
-// extendable structure version of this query, so they are just reused from
-// here.
-
-// tag::surface_capabilities_members[]
-  * pname:minImageCount is the minimum number of images the specified device
-    supports for a swapchain created for the surface, and will be at least
-    one.
-  * pname:maxImageCount is the maximum number of images the specified device
-    supports for a swapchain created for the surface, and will be either 0,
-    or greater than or equal to pname:minImageCount.
-    A value of 0 means that there is no limit on the number of images,
-    though there may: be limits related to the total amount of memory used
-    by presentable images.
-  * pname:currentExtent is the current width and height of the surface, or
-    the special value [eq]#(0xFFFFFFFF, 0xFFFFFFFF)# indicating that the
-    surface size will be determined by the extent of a swapchain targeting
-    the surface.
-  * pname:minImageExtent contains the smallest valid swapchain extent for
-    the surface on the specified device.
-    The pname:width and pname:height of the extent will each be less than or
-    equal to the corresponding pname:width and pname:height of
-    pname:currentExtent, unless pname:currentExtent has the special value
-    described above.
-  * pname:maxImageExtent contains the largest valid swapchain extent for the
-    surface on the specified device.
-    The pname:width and pname:height of the extent will each be greater than
-    or equal to the corresponding pname:width and pname:height of
-    pname:minImageExtent.
-    The pname:width and pname:height of the extent will each be greater than
-    or equal to the corresponding pname:width and pname:height of
-    pname:currentExtent, unless pname:currentExtent has the special value
-    described above.
-  * pname:maxImageArrayLayers is the maximum number of layers presentable
-    images can: have for a swapchain created for this device and surface,
-    and will be at least one.
-  * pname:supportedTransforms is a bitmask of
-    elink:VkSurfaceTransformFlagBitsKHR indicating the presentation
-    transforms supported for the surface on the specified device.
-    At least one bit will be set.
-  * pname:currentTransform is elink:VkSurfaceTransformFlagBitsKHR value
-    indicating the surface's current transform relative to the presentation
-    engine's natural orientation.
-  * pname:supportedCompositeAlpha is a bitmask of
-    elink:VkCompositeAlphaFlagBitsKHR, representing the alpha compositing
-    modes supported by the presentation engine for the surface on the
-    specified device, and at least one bit will be set.
-    Opaque composition can: be achieved in any alpha compositing mode by
-    either using an image format that has no alpha component, or by ensuring
-    that all pixels in the presentable images have an alpha value of 1.0.
-  * pname:supportedUsageFlags is a bitmask of elink:VkImageUsageFlagBits
-    representing the ways the application can: use the presentable images of
-    a swapchain created
-ifdef::VK_KHR_shared_presentable_image[]
-    with elink:VkPresentModeKHR set to ename:VK_PRESENT_MODE_IMMEDIATE_KHR,
-    ename:VK_PRESENT_MODE_MAILBOX_KHR, ename:VK_PRESENT_MODE_FIFO_KHR or
-    ename:VK_PRESENT_MODE_FIFO_RELAXED_KHR
-endif::VK_KHR_shared_presentable_image[]
-    for the surface on the specified device.
-    ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT must: be included in the set.
-    Implementations may: support additional usages.
-// end::surface_capabilities_members[]
-
-ifdef::VK_KHR_shared_presentable_image[]
-[NOTE]
-.Note
-====
-Supported usage flags of a presentable image when using
-ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or
-ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR presentation mode are
-provided by
-slink:VkSharedPresentSurfaceCapabilitiesKHR::pname:sharedPresentSupportedUsageFlags.
-====
-endif::VK_KHR_shared_presentable_image[]
-
-[NOTE]
-.Note
-====
-Formulas such as [eq]#min(N, pname:maxImageCount)# are not correct, since
-pname:maxImageCount may: be zero.
-====
-
-include::{generated}/validity/structs/VkSurfaceCapabilitiesKHR.txt[]
---
-
-ifdef::VK_KHR_get_surface_capabilities2[]
-[open,refpage='vkGetPhysicalDeviceSurfaceCapabilities2KHR',desc='Reports capabilities of a surface on a physical device',type='protos']
---
-:refpage: vkGetPhysicalDeviceSurfaceCapabilities2KHR
-
-To query the basic capabilities of a surface defined by the core or
-extensions, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceSurfaceCapabilities2KHR.txt[]
-
-  * pname:physicalDevice is the physical device that will be associated with
-    the swapchain to be created, as described for
-    flink:vkCreateSwapchainKHR.
-  * pname:pSurfaceInfo is a pointer to a
-    slink:VkPhysicalDeviceSurfaceInfo2KHR structure describing the surface
-    and other fixed parameters that would be consumed by
-    flink:vkCreateSwapchainKHR.
-  * pname:pSurfaceCapabilities is a pointer to a
-    slink:VkSurfaceCapabilities2KHR structure in which the capabilities are
-    returned.
-
-fname:vkGetPhysicalDeviceSurfaceCapabilities2KHR behaves similarly to
-flink:vkGetPhysicalDeviceSurfaceCapabilitiesKHR, with the ability to specify
-extended inputs via chained input structures, and to return extended
-information via chained output structures.
-
-ifdef::VK_EXT_full_screen_exclusive+VK_KHR_win32_surface[]
-.Valid Usage
-****
-include::{chapters}/commonvalidity/surface_info_physical_device_common.txt[]
-  * [[VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pNext-02671]]
-    If a slink:VkSurfaceCapabilitiesFullScreenExclusiveEXT structure is
-    included in the pname:pNext chain of pname:pSurfaceCapabilities, a
-    slink:VkSurfaceFullScreenExclusiveWin32InfoEXT structure must: be
-    included in the pname:pNext chain of pname:pSurfaceInfo
-****
-endif::VK_EXT_full_screen_exclusive+VK_KHR_win32_surface[]
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceSurfaceCapabilities2KHR.txt[]
---
-
-[open,refpage='VkPhysicalDeviceSurfaceInfo2KHR',desc='Structure specifying a surface and related swapchain creation parameters',type='structs']
---
-The sname:VkPhysicalDeviceSurfaceInfo2KHR structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceSurfaceInfo2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:surface is the surface that will be associated with the swapchain.
-
-The members of sname:VkPhysicalDeviceSurfaceInfo2KHR correspond to the
-arguments to flink:vkGetPhysicalDeviceSurfaceCapabilitiesKHR, with
-pname:sType and pname:pNext added for extensibility.
-
-ifdef::VK_EXT_full_screen_exclusive[]
-Additional capabilities of a surface may: be available to swapchains created
-with different full-screen exclusive settings - particularly if exclusive
-full-screen access is application controlled.
-These additional capabilities can: be queried by adding a
-slink:VkSurfaceFullScreenExclusiveInfoEXT structure to the pname:pNext chain
-of this structure when used to query surface properties.
-ifdef::VK_KHR_win32_surface[]
-Additionally, for Win32 surfaces with application controlled exclusive
-full-screen access, chaining a
-slink:VkSurfaceFullScreenExclusiveWin32InfoEXT structure may: also report
-additional surface capabilities.
-endif::VK_KHR_win32_surface[]
-These additional capabilities only apply to swapchains created with the same
-parameters included in the pname:pNext chain of
-slink:VkSwapchainCreateInfoKHR.
-endif::VK_EXT_full_screen_exclusive[]
-
-ifdef::VK_KHR_win32_surface+VK_EXT_full_screen_exclusive[]
-.Valid Usage
-****
-  * [[VUID-VkPhysicalDeviceSurfaceInfo2KHR-pNext-02672]]
-    If the pname:pNext chain includes a
-    slink:VkSurfaceFullScreenExclusiveInfoEXT structure with its
-    pname:fullScreenExclusive member set to
-    ename:VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT, and
-    pname:surface was created using flink:vkCreateWin32SurfaceKHR, a
-    slink:VkSurfaceFullScreenExclusiveWin32InfoEXT structure must: be
-    included in the pname:pNext chain
-****
-endif::VK_KHR_win32_surface+VK_EXT_full_screen_exclusive[]
-
-include::{generated}/validity/structs/VkPhysicalDeviceSurfaceInfo2KHR.txt[]
---
-
-ifdef::VK_EXT_full_screen_exclusive[]
-[open,refpage='VkSurfaceFullScreenExclusiveInfoEXT',desc='Structure specifying the preferred full-screen transition behavior',type='structs']
---
-If the pname:pNext chain of slink:VkSwapchainCreateInfoKHR includes a
-sname:VkSurfaceFullScreenExclusiveInfoEXT structure, then that structure
-specifies the application's preferred full-screen transition behavior.
-
-The sname:VkSurfaceFullScreenExclusiveInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkSurfaceFullScreenExclusiveInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:fullScreenExclusive is a elink:VkFullScreenExclusiveEXT value
-    specifying the preferred full-screen transition behavior.
-
-If this structure is not present, pname:fullScreenExclusive is considered to
-be ename:VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT.
-
-include::{generated}/validity/structs/VkSurfaceFullScreenExclusiveInfoEXT.txt[]
---
-
-[open,refpage='VkFullScreenExclusiveEXT',desc='Hint values an application can specify affecting full-screen transition behavior',type='enums']
---
-Possible values of
-sname:VkSurfaceFullScreenExclusiveInfoEXT::pname:fullScreenExclusive are:
-
-include::{generated}/api/enums/VkFullScreenExclusiveEXT.txt[]
-
-  * ename:VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT indicates the implementation
-    should: determine the appropriate full-screen method by whatever means
-    it deems appropriate.
-  * ename:VK_FULL_SCREEN_EXCLUSIVE_ALLOWED_EXT indicates the implementation
-    may: use full-screen exclusive mechanisms when available.
-    Such mechanisms may: result in better performance and/or the
-    availability of different presentation capabilities, but may: require a
-    more disruptive transition during swapchain initialization, first
-    presentation and/or destruction.
-  * ename:VK_FULL_SCREEN_EXCLUSIVE_DISALLOWED_EXT indicates the
-    implementation should: avoid using full-screen mechanisms which rely on
-    disruptive transitions.
-  * ename:VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT indicates the
-    application will manage full-screen exclusive mode by using the
-    flink:vkAcquireFullScreenExclusiveModeEXT and
-    flink:vkReleaseFullScreenExclusiveModeEXT commands.
---
-
-ifdef::VK_KHR_win32_surface[]
-[open,refpage='VkSurfaceFullScreenExclusiveWin32InfoEXT',desc='Structure specifying additional creation parameters specific to Win32 fullscreen exclusive mode',type='structs']
---
-The sname:VkSurfaceFullScreenExclusiveWin32InfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkSurfaceFullScreenExclusiveWin32InfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:hmonitor is the Win32 code:HMONITOR handle identifying the display
-    to create the surface with.
-
-[NOTE]
-.Note
-====
-If pname:hmonitor is invalidated (e.g. the monitor is unplugged) during the
-lifetime of a swapchain created with this structure, operations on that
-swapchain will return ename:VK_ERROR_OUT_OF_DATE_KHR.
-====
-
-[NOTE]
-.Note
-====
-It is the responsibility of the application to change the display settings
-of the targeted Win32 display using the appropriate platform APIs.
-Such changes may: alter the surface capabilities reported for the created
-surface.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkSurfaceFullScreenExclusiveWin32InfoEXT-hmonitor-02673]]
-    pname:hmonitor must: be a valid code:HMONITOR
-****
-
-include::{generated}/validity/structs/VkSurfaceFullScreenExclusiveWin32InfoEXT.txt[]
---
-endif::VK_KHR_win32_surface[]
-endif::VK_EXT_full_screen_exclusive[]
-
-[open,refpage='VkSurfaceCapabilities2KHR',desc='Structure describing capabilities of a surface',type='structs']
---
-The sname:VkSurfaceCapabilities2KHR structure is defined as:
-
-include::{generated}/api/structs/VkSurfaceCapabilities2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:surfaceCapabilities is a slink:VkSurfaceCapabilitiesKHR structure
-    describing the capabilities of the specified surface.
-
-include::{generated}/validity/structs/VkSurfaceCapabilities2KHR.txt[]
---
-
-ifdef::VK_KHR_surface_protected_capabilities[]
-[open,refpage='VkSurfaceProtectedCapabilitiesKHR',desc='Structure describing capability of a surface to be protected',type='structs']
---
-An application queries if a protected slink:VkSurfaceKHR is displayable on a
-specific windowing system using sname:VkSurfaceProtectedCapabilitiesKHR,
-which can: be passed in pname:pNext parameter of
-sname:VkSurfaceCapabilities2KHR.
-
-The sname:VkSurfaceProtectedCapabilitiesKHR structure is defined as:
-
-include::{generated}/api/structs/VkSurfaceProtectedCapabilitiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:supportsProtected specifies whether a protected swapchain created
-    from slink:VkPhysicalDeviceSurfaceInfo2KHR::pname:surface for a
-    particular windowing system can: be displayed on screen or not.
-    If pname:supportsProtected is ename:VK_TRUE, then creation of swapchains
-    with the ename:VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR flag set must: be
-    supported for pname:surface.
-
-
-include::{generated}/validity/structs/VkSurfaceProtectedCapabilitiesKHR.txt[]
---
-endif::VK_KHR_surface_protected_capabilities[]
-
-ifdef::VK_KHR_shared_presentable_image[]
-[open,refpage='VkSharedPresentSurfaceCapabilitiesKHR',desc='Structure describing capabilities of a surface for shared presentation',type='structs']
---
-The sname:VkSharedPresentSurfaceCapabilitiesKHR structure is defined as:
-
-include::{generated}/api/structs/VkSharedPresentSurfaceCapabilitiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:sharedPresentSupportedUsageFlags is a bitmask of
-    elink:VkImageUsageFlagBits representing the ways the application can:
-    use the shared presentable image from a swapchain created with
-    elink:VkPresentModeKHR set to
-    ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or
-    ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR for the surface on
-    the specified device.
-    ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT must: be included in the set
-    but implementations may: support additional usages.
-
-include::{generated}/validity/structs/VkSharedPresentSurfaceCapabilitiesKHR.txt[]
---
-endif::VK_KHR_shared_presentable_image[]
-
-ifdef::VK_AMD_display_native_hdr[]
-[open,refpage='VkDisplayNativeHdrSurfaceCapabilitiesAMD',desc='Structure describing display native HDR specific capabilities of a surface',type='structs']
---
-The sname:VkDisplayNativeHdrSurfaceCapabilitiesAMD structure is defined as:
-
-include::{generated}/api/structs/VkDisplayNativeHdrSurfaceCapabilitiesAMD.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:localDimmingSupport specifies whether the surface supports local
-    dimming.
-    If this is ename:VK_TRUE, slink:VkSwapchainDisplayNativeHdrCreateInfoAMD
-    can: be used to explicitly enable or disable local dimming for the
-    surface.
-    Local dimming may also be overriden by flink:vkSetLocalDimmingAMD during
-    the lifetime of the swapchain.
-
-include::{generated}/validity/structs/VkDisplayNativeHdrSurfaceCapabilitiesAMD.txt[]
---
-endif::VK_AMD_display_native_hdr[]
-
-ifdef::VK_EXT_full_screen_exclusive[]
-[open,refpage='VkSurfaceCapabilitiesFullScreenExclusiveEXT',desc='Structure describing full screen exclusive capabilities of a surface',type='structs']
---
-The sname:VkSurfaceCapabilitiesFullScreenExclusiveEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkSurfaceCapabilitiesFullScreenExclusiveEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:fullScreenExclusiveControlSupported is a boolean describing
-    whether the surface is able to make use of exclusive full-screen access.
-
-This structure can: be included in the pname:pNext chain of
-slink:VkSurfaceCapabilities2KHR to determine support for exclusive
-full-screen access.
-If pname:fullScreenExclusiveSupported is ename:VK_FALSE, it indicates that
-exclusive full-screen access is not obtainable for this surface.
-
-Applications must: not attempt to create swapchains with
-ename:VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT set if
-pname:fullScreenExclusiveSupported is ename:VK_FALSE.
-
-include::{generated}/validity/structs/VkSurfaceCapabilitiesFullScreenExclusiveEXT.txt[]
---
-endif::VK_EXT_full_screen_exclusive[]
-endif::VK_KHR_get_surface_capabilities2[]
-
-ifdef::VK_EXT_display_surface_counter[]
-include::{chapters}/VK_EXT_display_surface_counter/surface_capabilities.txt[]
-endif::VK_EXT_display_surface_counter[]
-
-[open,refpage='VkSurfaceTransformFlagBitsKHR',desc='Presentation transforms supported on a device',type='enums']
---
-Bits which may: be set in
-slink:VkSurfaceCapabilitiesKHR::pname:supportedTransforms indicating the
-presentation transforms supported for the surface on the specified device,
-and possible values of
-slink:VkSurfaceCapabilitiesKHR::pname:currentTransform indicating the
-surface's current transform relative to the presentation engine's natural
-orientation, are:
-
-include::{generated}/api/enums/VkSurfaceTransformFlagBitsKHR.txt[]
-
-  * ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR specifies that image content
-    is presented without being transformed.
-  * ename:VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR specifies that image
-    content is rotated 90 degrees clockwise.
-  * ename:VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR specifies that image
-    content is rotated 180 degrees clockwise.
-  * ename:VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR specifies that image
-    content is rotated 270 degrees clockwise.
-  * ename:VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR specifies that
-    image content is mirrored horizontally.
-  * ename:VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR specifies
-    that image content is mirrored horizontally, then rotated 90 degrees
-    clockwise.
-  * ename:VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR
-    specifies that image content is mirrored horizontally, then rotated 180
-    degrees clockwise.
-  * ename:VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR
-    specifies that image content is mirrored horizontally, then rotated 270
-    degrees clockwise.
-  * ename:VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR specifies that the
-    presentation transform is not specified, and is instead determined by
-    platform-specific considerations and mechanisms outside Vulkan.
---
-
-[open,refpage='VkSurfaceTransformFlagsKHR',desc='Bitmask of VkSurfaceTransformFlagBitsKHR',type='flags']
---
-include::{generated}/api/flags/VkSurfaceTransformFlagsKHR.txt[]
-
-tname:VkSurfaceTransformFlagsKHR is a bitmask type for setting a mask of
-zero or more elink:VkSurfaceTransformFlagBitsKHR.
---
-
-[open,refpage='VkCompositeAlphaFlagBitsKHR',desc='Alpha compositing modes supported on a device',type='enums']
---
-The pname:supportedCompositeAlpha member is of type
-elink:VkCompositeAlphaFlagBitsKHR, which contains the following values:
-
-include::{generated}/api/enums/VkCompositeAlphaFlagBitsKHR.txt[]
-
-These values are described as follows:
-
-  * ename:VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR: The alpha component, if it
-    exists, of the images is ignored in the compositing process.
-    Instead, the image is treated as if it has a constant alpha of 1.0.
-  * ename:VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR: The alpha component, if
-    it exists, of the images is respected in the compositing process.
-    The non-alpha components of the image are expected to already be
-    multiplied by the alpha component by the application.
-  * ename:VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR: The alpha component,
-    if it exists, of the images is respected in the compositing process.
-    The non-alpha components of the image are not expected to already be
-    multiplied by the alpha component by the application; instead, the
-    compositor will multiply the non-alpha components of the image by the
-    alpha component during compositing.
-  * ename:VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR: The way in which the
-    presentation engine treats the alpha component in the images is unknown
-    to the Vulkan API.
-    Instead, the application is responsible for setting the composite alpha
-    blending mode using native window system commands.
-    If the application does not set the blending mode using native window
-    system commands, then a platform-specific default will be used.
---
-
-[open,refpage='VkCompositeAlphaFlagsKHR',desc='Bitmask of VkCompositeAlphaFlagBitsKHR',type='flags']
---
-include::{generated}/api/flags/VkCompositeAlphaFlagsKHR.txt[]
-
-tname:VkCompositeAlphaFlagsKHR is a bitmask type for setting a mask of zero
-or more elink:VkCompositeAlphaFlagBitsKHR.
---
-
-
-=== Surface Format Support
-
-[open,refpage='vkGetPhysicalDeviceSurfaceFormatsKHR',desc='Query color formats supported by surface',type='protos']
---
-:refpage: vkGetPhysicalDeviceSurfaceFormatsKHR
-
-To query the supported swapchain format-color space pairs for a surface,
-call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceSurfaceFormatsKHR.txt[]
-
-  * pname:physicalDevice is the physical device that will be associated with
-    the swapchain to be created, as described for
-    flink:vkCreateSwapchainKHR.
-  * pname:surface is the surface that will be associated with the swapchain.
-  * pname:pSurfaceFormatCount is a pointer to an integer related to the
-    number of format pairs available or queried, as described below.
-  * pname:pSurfaceFormats is either `NULL` or a pointer to an array of
-    sname:VkSurfaceFormatKHR structures.
-
-If pname:pSurfaceFormats is `NULL`, then the number of format pairs
-supported for the given pname:surface is returned in
-pname:pSurfaceFormatCount.
-Otherwise, pname:pSurfaceFormatCount must: point to a variable set by the
-user to the number of elements in the pname:pSurfaceFormats array, and on
-return the variable is overwritten with the number of structures actually
-written to pname:pSurfaceFormats.
-If the value of pname:pSurfaceFormatCount is less than the number of format
-pairs supported, at most pname:pSurfaceFormatCount structures will be
-written, and ename:VK_INCOMPLETE will be returned instead of
-ename:VK_SUCCESS, to indicate that not all the available format pairs were
-returned.
-
-The number of format pairs supported must: be greater than or equal to 1.
-pname:pSurfaceFormats must: not contain an entry whose value for
-pname:format is ename:VK_FORMAT_UNDEFINED.
-
-If pname:pSurfaceFormats includes an entry whose value for pname:colorSpace
-is ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR and whose value for pname:format
-is a UNORM (or SRGB) format and the corresponding SRGB (or UNORM) format is
-a color renderable format for ename:VK_IMAGE_TILING_OPTIMAL, then
-pname:pSurfaceFormats must: also contain an entry with the same value for
-pname:colorSpace and pname:format equal to the corresponding SRGB (or UNORM)
-format.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/surface_physical_device_common.txt[]
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceSurfaceFormatsKHR.txt[]
---
-
-[open,refpage='VkSurfaceFormatKHR',desc='Structure describing a supported swapchain format-color space pair',type='structs']
---
-The sname:VkSurfaceFormatKHR structure is defined as:
-
-include::{generated}/api/structs/VkSurfaceFormatKHR.txt[]
-
-  * pname:format is a elink:VkFormat that is compatible with the specified
-    surface.
-  * pname:colorSpace is a presentation elink:VkColorSpaceKHR that is
-    compatible with the surface.
-
-include::{generated}/validity/structs/VkSurfaceFormatKHR.txt[]
---
-
-ifdef::VK_KHR_get_surface_capabilities2[]
-[open,refpage='vkGetPhysicalDeviceSurfaceFormats2KHR',desc='Query color formats supported by surface',type='protos']
---
-:refpage: vkGetPhysicalDeviceSurfaceFormats2KHR
-
-To query the supported swapchain format tuples for a surface, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceSurfaceFormats2KHR.txt[]
-
-  * pname:physicalDevice is the physical device that will be associated with
-    the swapchain to be created, as described for
-    flink:vkCreateSwapchainKHR.
-  * pname:pSurfaceInfo is a pointer to a
-    slink:VkPhysicalDeviceSurfaceInfo2KHR structure describing the surface
-    and other fixed parameters that would be consumed by
-    flink:vkCreateSwapchainKHR.
-  * pname:pSurfaceFormatCount is a pointer to an integer related to the
-    number of format tuples available or queried, as described below.
-  * pname:pSurfaceFormats is either `NULL` or a pointer to an array of
-    slink:VkSurfaceFormat2KHR structures.
-
-flink:vkGetPhysicalDeviceSurfaceFormats2KHR behaves similarly to
-flink:vkGetPhysicalDeviceSurfaceFormatsKHR, with the ability to be extended
-via pname:pNext chains.
-
-If pname:pSurfaceFormats is `NULL`, then the number of format tuples
-supported for the given pname:surface is returned in
-pname:pSurfaceFormatCount.
-Otherwise, pname:pSurfaceFormatCount must: point to a variable set by the
-user to the number of elements in the pname:pSurfaceFormats array, and on
-return the variable is overwritten with the number of structures actually
-written to pname:pSurfaceFormats.
-If the value of pname:pSurfaceFormatCount is less than the number of format
-tuples supported, at most pname:pSurfaceFormatCount structures will be
-written, and ename:VK_INCOMPLETE will be returned instead of
-ename:VK_SUCCESS, to indicate that not all the available values were
-returned.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/surface_info_physical_device_common.txt[]
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceSurfaceFormats2KHR.txt[]
---
-
-[open,refpage='VkSurfaceFormat2KHR',desc='Structure describing a supported swapchain format tuple',type='structs']
---
-The sname:VkSurfaceFormat2KHR structure is defined as:
-
-include::{generated}/api/structs/VkSurfaceFormat2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:surfaceFormat is a slink:VkSurfaceFormatKHR structure describing a
-    format-color space pair that is compatible with the specified surface.
-
-include::{generated}/validity/structs/VkSurfaceFormat2KHR.txt[]
---
-endif::VK_KHR_get_surface_capabilities2[]
-
-While the pname:format of a presentable image refers to the encoding of each
-pixel, the pname:colorSpace determines how the presentation engine
-interprets the pixel values.
-A color space in this document refers to a specific color space (defined by
-the chromaticities of its primaries and a white point in CIE Lab), and a
-transfer function that is applied before storing or transmitting color data
-in the given color space.
-
-[open,refpage='VkColorSpaceKHR',desc='Supported color space of the presentation engine',type='enums']
---
-Possible values of slink:VkSurfaceFormatKHR::pname:colorSpace, specifying
-supported color spaces of a presentation engine, are:
-
-include::{generated}/api/enums/VkColorSpaceKHR.txt[]
-
-  * ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR specifies support for the sRGB
-    color space.
-ifdef::VK_EXT_swapchain_colorspace[]
-  * ename:VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT specifies support for the
-    Display-P3 color space to be displayed using an sRGB-like EOTF (defined
-    below).
-  * ename:VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT specifies support for the
-    extended sRGB color space to be displayed using a linear EOTF.
-  * ename:VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT specifies support for
-    the extended sRGB color space to be displayed using an sRGB EOTF.
-  * ename:VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT specifies support for the
-    Display-P3 color space to be displayed using a linear EOTF.
-  * ename:VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT specifies support for the
-    DCI-P3 color space to be displayed using the DCI-P3 EOTF.
-    Note that values in such an image are interpreted as XYZ encoded color
-    data by the presentation engine.
-  * ename:VK_COLOR_SPACE_BT709_LINEAR_EXT specifies support for the BT709
-    color space to be displayed using a linear EOTF.
-  * ename:VK_COLOR_SPACE_BT709_NONLINEAR_EXT specifies support for the BT709
-    color space to be displayed using the SMPTE 170M EOTF.
-  * ename:VK_COLOR_SPACE_BT2020_LINEAR_EXT specifies support for the BT2020
-    color space to be displayed using a linear EOTF.
-  * ename:VK_COLOR_SPACE_HDR10_ST2084_EXT specifies support for the HDR10
-    (BT2020 color) space to be displayed using the SMPTE ST2084 Perceptual
-    Quantizer (PQ) EOTF.
-  * ename:VK_COLOR_SPACE_DOLBYVISION_EXT specifies support for the Dolby
-    Vision (BT2020 color space), proprietary encoding, to be displayed using
-    the SMPTE ST2084 EOTF.
-  * ename:VK_COLOR_SPACE_HDR10_HLG_EXT specifies support for the HDR10
-    (BT2020 color space) to be displayed using the Hybrid Log Gamma (HLG)
-    EOTF.
-  * ename:VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT specifies support for the
-    AdobeRGB color space to be displayed using a linear EOTF.
-  * ename:VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT specifies support for the
-    AdobeRGB color space to be displayed using the Gamma 2.2 EOTF.
-  * ename:VK_COLOR_SPACE_PASS_THROUGH_EXT specifies that color components
-    are used "`as is`".
-    This is intended to allow applications to supply data for color spaces
-    not described here.
-ifdef::VK_AMD_display_native_hdr[]
-  * ename:VK_COLOR_SPACE_DISPLAY_NATIVE_AMD specifies support for the
-    display's native color space.
-    This matches the color space expectations of AMD's FreeSync2 standard,
-    for displays supporting it.
-endif::VK_AMD_display_native_hdr[]
-
-[NOTE]
-.Note
-====
-In the initial release of the `VK_KHR_surface` and `apiext:VK_KHR_swapchain`
-extensions, the token ename:VK_COLORSPACE_SRGB_NONLINEAR_KHR was used.
-Starting in the 2016-05-13 updates to the extension branches, matching
-release 1.0.13 of the core API specification,
-ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR is used instead for consistency with
-Vulkan naming rules.
-The older enum is still available for backwards compatibility.
-====
-
-[NOTE]
-.Note
-====
-In older versions of this extension
-ename:VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT was misnamed
-ename:VK_COLOR_SPACE_DCI_P3_LINEAR_EXT.
-This has been updated to indicate that it uses RGB color encoding, not XYZ.
-The old name is deprecated but is maintained for backwards compatibility.
-====
-
-The color components of non-linear color space swap chain images must: have
-had the appropriate transfer function applied.
-The color space selected for the swap chain image will not affect the
-processing of data written into the image by the implementation.
-Vulkan requires that all implementations support the sRGB transfer function
-by use of an SRGB pixel format.
-Other transfer functions, such as SMPTE 170M or SMPTE2084, can: be performed
-by the application shader.
-This extension defines enums for elink:VkColorSpaceKHR that correspond to
-the following color spaces:
-
-[[VK_EXT_swapchain_colorspace-table]]
-.Color Spaces and Attributes
-[options="header"]
-|====
-| Name           | Red Primary  | Green Primary | Blue Primary | White-point          | Transfer function
-| DCI-P3         | 1.000, 0.000 | 0.000, 1.000  | 0.000, 0.000 | 0.3333, 0.3333       | DCI P3
-| Display-P3     | 0.680, 0.320 | 0.265, 0.690  | 0.150, 0.060 | 0.3127, 0.3290 (D65) | Display-P3
-| BT709          | 0.640, 0.330 | 0.300, 0.600  | 0.150, 0.060 | 0.3127, 0.3290 (D65) | ITU (SMPTE 170M)
-| sRGB           | 0.640, 0.330 | 0.300, 0.600  | 0.150, 0.060 | 0.3127, 0.3290 (D65) | sRGB
-| extended sRGB  | 0.640, 0.330 | 0.300, 0.600  | 0.150, 0.060 | 0.3127, 0.3290 (D65) | extended sRGB
-| HDR10_ST2084   | 0.708, 0.292 | 0.170, 0.797  | 0.131, 0.046 | 0.3127, 0.3290 (D65) | ST2084 PQ
-| DOLBYVISION    | 0.708, 0.292 | 0.170, 0.797  | 0.131, 0.046 | 0.3127, 0.3290 (D65) | ST2084 PQ
-| HDR10_HLG      | 0.708, 0.292 | 0.170, 0.797  | 0.131, 0.046 | 0.3127, 0.3290 (D65) | HLG
-| AdobeRGB       | 0.640, 0.330 | 0.210, 0.710  | 0.150, 0.060 | 0.3127, 0.3290 (D65) | AdobeRGB
-|====
-
-The transfer functions are described in the "`Transfer Functions`" chapter
-of the <<data-format,Khronos Data Format Specification>>.
-
-Except Display-P3 OETF, which is:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-E & =
-  \begin{cases}
-    1.055 \times L^{1 \over 2.4} - 0.055 & \text{for}\  0.0030186 \leq L \leq 1 \\
-    12.92 \times L                       & \text{for}\  0 \leq L < 0.0030186
-  \end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-where [eq]#L# is the linear value of a color component and [eq]#E# is the
-encoded value (as stored in the image in memory).
-
-[NOTE]
-.Note
-====
-For most uses, the sRGB OETF is equivalent.
-====
-endif::VK_EXT_swapchain_colorspace[]
---
-
-
-=== Surface Presentation Mode Support
-
-[open,refpage='vkGetPhysicalDeviceSurfacePresentModesKHR',desc='Query supported presentation modes',type='protos']
---
-:refpage: vkGetPhysicalDeviceSurfacePresentModesKHR
-
-To query the supported presentation modes for a surface, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceSurfacePresentModesKHR.txt[]
-
-  * pname:physicalDevice is the physical device that will be associated with
-    the swapchain to be created, as described for
-    flink:vkCreateSwapchainKHR.
-  * pname:surface is the surface that will be associated with the swapchain.
-  * pname:pPresentModeCount is a pointer to an integer related to the number
-    of presentation modes available or queried, as described below.
-  * pname:pPresentModes is either `NULL` or a pointer to an array of
-    elink:VkPresentModeKHR values, indicating the supported presentation
-    modes.
-
-If pname:pPresentModes is `NULL`, then the number of presentation modes
-supported for the given pname:surface is returned in
-pname:pPresentModeCount.
-Otherwise, pname:pPresentModeCount must: point to a variable set by the user
-to the number of elements in the pname:pPresentModes array, and on return
-the variable is overwritten with the number of values actually written to
-pname:pPresentModes.
-If the value of pname:pPresentModeCount is less than the number of
-presentation modes supported, at most pname:pPresentModeCount values will be
-written, and ename:VK_INCOMPLETE will be returned instead of
-ename:VK_SUCCESS, to indicate that not all the available modes were
-returned.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/surface_physical_device_common.txt[]
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceSurfacePresentModesKHR.txt[]
---
-
-ifdef::VK_EXT_full_screen_exclusive[]
-[open,refpage='vkGetPhysicalDeviceSurfacePresentModes2EXT',desc='Query supported presentation modes',type='protos']
---
-:refpage: vkGetPhysicalDeviceSurfacePresentModes2EXT
-
-Alternatively, to query the supported presentation modes for a surface
-combined with select other fixed swapchain creation parameters, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceSurfacePresentModes2EXT.txt[]
-
-  * pname:physicalDevice is the physical device that will be associated with
-    the swapchain to be created, as described for
-    flink:vkCreateSwapchainKHR.
-  * pname:pSurfaceInfo is a pointer to a
-    slink:VkPhysicalDeviceSurfaceInfo2KHR structure describing the surface
-    and other fixed parameters that would be consumed by
-    flink:vkCreateSwapchainKHR.
-  * pname:pPresentModeCount is a pointer to an integer related to the number
-    of presentation modes available or queried, as described below.
-  * pname:pPresentModes is either `NULL` or a pointer to an array of
-    elink:VkPresentModeKHR values, indicating the supported presentation
-    modes.
-
-fname:vkGetPhysicalDeviceSurfacePresentModes2EXT behaves similarly to
-flink:vkGetPhysicalDeviceSurfacePresentModesKHR, with the ability to specify
-extended inputs via chained input structures.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/surface_info_physical_device_common.txt[]
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceSurfacePresentModes2EXT.txt[]
---
-endif::VK_EXT_full_screen_exclusive[]
-
-[open,refpage='VkPresentModeKHR',desc='Presentation mode supported for a surface',type='enums']
---
-Possible values of elements of the
-flink:vkGetPhysicalDeviceSurfacePresentModesKHR::pname:pPresentModes array,
-indicating the supported presentation modes for a surface, are:
-
-include::{generated}/api/enums/VkPresentModeKHR.txt[]
-
-  * ename:VK_PRESENT_MODE_IMMEDIATE_KHR specifies that the presentation
-    engine does not wait for a vertical blanking period to update the
-    current image, meaning this mode may: result in visible tearing.
-    No internal queuing of presentation requests is needed, as the requests
-    are applied immediately.
-  * ename:VK_PRESENT_MODE_MAILBOX_KHR specifies that the presentation engine
-    waits for the next vertical blanking period to update the current image.
-    Tearing cannot: be observed.
-    An internal single-entry queue is used to hold pending presentation
-    requests.
-    If the queue is full when a new presentation request is received, the
-    new request replaces the existing entry, and any images associated with
-    the prior entry become available for re-use by the application.
-    One request is removed from the queue and processed during each vertical
-    blanking period in which the queue is non-empty.
-  * ename:VK_PRESENT_MODE_FIFO_KHR specifies that the presentation engine
-    waits for the next vertical blanking period to update the current image.
-    Tearing cannot: be observed.
-    An internal queue is used to hold pending presentation requests.
-    New requests are appended to the end of the queue, and one request is
-    removed from the beginning of the queue and processed during each
-    vertical blanking period in which the queue is non-empty.
-    This is the only value of pname:presentMode that is required: to be
-    supported.
-  * ename:VK_PRESENT_MODE_FIFO_RELAXED_KHR specifies that the presentation
-    engine generally waits for the next vertical blanking period to update
-    the current image.
-    If a vertical blanking period has already passed since the last update
-    of the current image then the presentation engine does not wait for
-    another vertical blanking period for the update, meaning this mode may:
-    result in visible tearing in this case.
-    This mode is useful for reducing visual stutter with an application that
-    will mostly present a new image before the next vertical blanking
-    period, but may occasionally be late, and present a new image just after
-    the next vertical blanking period.
-    An internal queue is used to hold pending presentation requests.
-    New requests are appended to the end of the queue, and one request is
-    removed from the beginning of the queue and processed during or after
-    each vertical blanking period in which the queue is non-empty.
-ifdef::VK_KHR_shared_presentable_image[]
-  * ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR specifies that the
-    presentation engine and application have concurrent access to a single
-    image, which is referred to as a _shared presentable image_.
-    The presentation engine is only required to update the current image
-    after a new presentation request is received.
-    Therefore the application must: make a presentation request whenever an
-    update is required.
-    However, the presentation engine may: update the current image at any
-    point, meaning this mode may: result in visible tearing.
-  * ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR specifies that the
-    presentation engine and application have concurrent access to a single
-    image, which is referred to as a _shared presentable image_.
-    The presentation engine periodically updates the current image on its
-    regular refresh cycle.
-    The application is only required to make one initial presentation
-    request, after which the presentation engine must: update the current
-    image without any need for further presentation requests.
-    The application can: indicate the image contents have been updated by
-    making a presentation request, but this does not guarantee the timing of
-    when it will be updated.
-    This mode may: result in visible tearing if rendering to the image is
-    not timed correctly.
-
-The supported elink:VkImageUsageFlagBits of the presentable images of a
-swapchain created for a surface may: differ depending on the presentation
-mode, and can be determined as per the table below:
-
-.Presentable image usage queries
-[width="100%",cols="<50%,<50%",options="header"]
-|====
-| Presentation mode                                   | Image usage flags
-| ename:VK_PRESENT_MODE_IMMEDIATE_KHR                 | slink:VkSurfaceCapabilitiesKHR::pname:supportedUsageFlags
-| ename:VK_PRESENT_MODE_MAILBOX_KHR                   | slink:VkSurfaceCapabilitiesKHR::pname:supportedUsageFlags
-| ename:VK_PRESENT_MODE_FIFO_KHR                      | slink:VkSurfaceCapabilitiesKHR::pname:supportedUsageFlags
-| ename:VK_PRESENT_MODE_FIFO_RELAXED_KHR              | slink:VkSurfaceCapabilitiesKHR::pname:supportedUsageFlags
-| ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR     | slink:VkSharedPresentSurfaceCapabilitiesKHR::pname:sharedPresentSupportedUsageFlags
-| ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR | slink:VkSharedPresentSurfaceCapabilitiesKHR::pname:sharedPresentSupportedUsageFlags
-|====
-endif::VK_KHR_shared_presentable_image[]
-
-[NOTE]
-.Note
-====
-For reference, the mode indicated by ename:VK_PRESENT_MODE_FIFO_KHR is
-equivalent to the behavior of {wgl|glX|egl}SwapBuffers with a swap interval
-of 1, while the mode indicated by ename:VK_PRESENT_MODE_FIFO_RELAXED_KHR is
-equivalent to the behavior of {wgl|glX}SwapBuffers with a swap interval of
--1 (from the {WGL|GLX}_EXT_swap_control_tear extensions).
-====
---
-
-ifdef::VK_EXT_full_screen_exclusive[]
-== Full Screen Exclusive Control
-
-Swapchains created with pname:fullScreenExclusive set to
-ename:VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT must: acquire and
-release exclusive full-screen access explicitly, using the following
-commands.
-
-[open,refpage='vkAcquireFullScreenExclusiveModeEXT',desc='Acquire full-screen exclusive mode for a swapchain',type='protos']
---
-To acquire exclusive full-screen access for a swapchain, call:
-
-include::{generated}/api/protos/vkAcquireFullScreenExclusiveModeEXT.txt[]
-
-  * pname:device is the device associated with pname:swapchain.
-  * pname:swapchain is the swapchain to acquire exclusive full-screen access
-    for.
-
-.Valid Usage
-****
-  * [[VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-02674]]
-    pname:swapchain must: not be in the retired state
-  * [[VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-02675]]
-    pname:swapchain must: be a swapchain created with a
-    slink:VkSurfaceFullScreenExclusiveInfoEXT structure, with
-    pname:fullScreenExclusive set to
-    ename:VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT
-  * [[VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-02676]]
-    pname:swapchain must: not currently have exclusive full-screen access
-****
-
-A return value of ename:VK_SUCCESS indicates that the pname:swapchain
-successfully acquired exclusive full-screen access.
-The swapchain will retain this exclusivity until either the application
-releases exclusive full-screen access with
-flink:vkReleaseFullScreenExclusiveModeEXT, destroys the swapchain, or if any
-of the swapchain commands return
-ename:VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT indicating that the mode
-was lost because of platform-specific changes.
-
-If the swapchain was unable to acquire exclusive full-screen access to the
-display then ename:VK_ERROR_INITIALIZATION_FAILED is returned.
-An application can: attempt to acquire exclusive full-screen access again
-for the same swapchain even if this command fails, or if
-ename:VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT has been returned by a
-swapchain command.
-
-include::{generated}/validity/protos/vkAcquireFullScreenExclusiveModeEXT.txt[]
---
-
-[open,refpage='vkReleaseFullScreenExclusiveModeEXT',desc='Release full-screen exclusive mode from a swapchain',type='protos']
---
-To release exclusive full-screen access from a swapchain, call:
-
-include::{generated}/api/protos/vkReleaseFullScreenExclusiveModeEXT.txt[]
-
-  * pname:device is the device associated with pname:swapchain.
-  * pname:swapchain is the swapchain to release exclusive full-screen access
-    from.
-
-[NOTE]
-.Note
-====
-Applications will not be able to present to pname:swapchain after this call
-until exclusive full-screen access is reacquired.
-This is usually useful to handle when an application is minimised or
-otherwise intends to stop presenting for a time.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkReleaseFullScreenExclusiveModeEXT-swapchain-02677]]
-    pname:swapchain must: not be in the retired state
-  * [[VUID-vkReleaseFullScreenExclusiveModeEXT-swapchain-02678]]
-    pname:swapchain must: be a swapchain created with a
-    slink:VkSurfaceFullScreenExclusiveInfoEXT structure, with
-    pname:fullScreenExclusive set to
-    ename:VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT
-****
---
-endif::VK_EXT_full_screen_exclusive[]
-
-
-ifdef::VK_KHR_swapchain[]
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-== Device Group Queries
-
-[open,refpage='vkGetDeviceGroupPresentCapabilitiesKHR',desc='Query present capabilities from other physical devices',type='protos']
---
-A logical device that represents multiple physical devices may: support
-presenting from images on more than one physical device, or combining images
-from multiple physical devices.
-
-To query these capabilities, call:
-
-include::{generated}/api/protos/vkGetDeviceGroupPresentCapabilitiesKHR.txt[]
-
-  * pname:device is the logical device.
-  * pname:pDeviceGroupPresentCapabilities is a pointer to a
-    slink:VkDeviceGroupPresentCapabilitiesKHR structure in which the
-    device's capabilities are returned.
-
-include::{generated}/validity/protos/vkGetDeviceGroupPresentCapabilitiesKHR.txt[]
---
-
-[open,refpage='VkDeviceGroupPresentCapabilitiesKHR',desc='Present capabilities from other physical devices',type='structs']
---
-The sname:VkDeviceGroupPresentCapabilitiesKHR structure is defined as:
-
-include::{generated}/api/structs/VkDeviceGroupPresentCapabilitiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:presentMask is an array of ename:VK_MAX_DEVICE_GROUP_SIZE
-    code:uint32_t masks, where the mask at element [eq]#i# is non-zero if
-    physical device [eq]#i# has a presentation engine, and where bit [eq]#j#
-    is set in element [eq]#i# if physical device [eq]#i# can: present
-    swapchain images from physical device [eq]#j#.
-    If element [eq]#i# is non-zero, then bit [eq]#i# must: be set.
-  * pname:modes is a bitmask of elink:VkDeviceGroupPresentModeFlagBitsKHR
-    indicating which device group presentation modes are supported.
-
-pname:modes always has ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR set.
-
-The present mode flags are also used when presenting an image, in
-slink:VkDeviceGroupPresentInfoKHR::pname:mode.
-
-If a device group only includes a single physical device, then pname:modes
-must: equal ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR.
-
-include::{generated}/validity/structs/VkDeviceGroupPresentCapabilitiesKHR.txt[]
---
-
-
-[open,refpage='VkDeviceGroupPresentModeFlagBitsKHR',desc='Bitmask specifying supported device group present modes',type='enums']
---
-Bits which may: be set in
-slink:VkDeviceGroupPresentCapabilitiesKHR::pname:modes to indicate which
-device group presentation modes are supported are:
-
-include::{generated}/api/enums/VkDeviceGroupPresentModeFlagBitsKHR.txt[]
-
-  * ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR specifies that any
-    physical device with a presentation engine can: present its own
-    swapchain images.
-  * ename:VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR specifies that any
-    physical device with a presentation engine can: present swapchain images
-    from any physical device in its pname:presentMask.
-  * ename:VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR specifies that any
-    physical device with a presentation engine can: present the sum of
-    swapchain images from any physical devices in its pname:presentMask.
-  * ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR specifies
-    that multiple physical devices with a presentation engine can: each
-    present their own swapchain images.
---
-
-[open,refpage='VkDeviceGroupPresentModeFlagsKHR',desc='Bitmask of VkDeviceGroupPresentModeFlagBitsKHR',type='flags']
---
-include::{generated}/api/flags/VkDeviceGroupPresentModeFlagsKHR.txt[]
-
-tname:VkDeviceGroupPresentModeFlagsKHR is a bitmask type for setting a mask
-of zero or more elink:VkDeviceGroupPresentModeFlagBitsKHR.
---
-
-[open,refpage='vkGetDeviceGroupSurfacePresentModesKHR',desc='Query present capabilities for a surface',type='protos']
---
-Some surfaces may: not be capable of using all the device group present
-modes.
-
-To query the supported device group present modes for a particular surface,
-call:
-
-include::{generated}/api/protos/vkGetDeviceGroupSurfacePresentModesKHR.txt[]
-
-  * pname:device is the logical device.
-  * pname:surface is the surface.
-  * pname:pModes is a pointer to a tlink:VkDeviceGroupPresentModeFlagsKHR in
-    which the supported device group present modes for the surface are
-    returned.
-
-The modes returned by this command are not invariant, and may: change in
-response to the surface being moved, resized, or occluded.
-These modes must: be a subset of the modes returned by
-flink:vkGetDeviceGroupPresentCapabilitiesKHR.
-
-.Valid Usage
-****
-  * [[VUID-vkGetDeviceGroupSurfacePresentModesKHR-surface-06212]]
-    pname:surface must: be supported by all physical devices associated with
-    pname:device, as reported by flink:vkGetPhysicalDeviceSurfaceSupportKHR
-    or an equivalent platform-specific mechanism
-****
-
-include::{generated}/validity/protos/vkGetDeviceGroupSurfacePresentModesKHR.txt[]
---
-
-ifdef::VK_EXT_full_screen_exclusive[]
-[open,refpage='vkGetDeviceGroupSurfacePresentModes2EXT',desc='Query device group present capabilities for a surface',type='protos']
---
-Alternatively, to query the supported device group presentation modes for a
-surface combined with select other fixed swapchain creation parameters,
-call:
-
-include::{generated}/api/protos/vkGetDeviceGroupSurfacePresentModes2EXT.txt[]
-
-  * pname:device is the logical device.
-  * pname:pSurfaceInfo is a pointer to a
-    slink:VkPhysicalDeviceSurfaceInfo2KHR structure describing the surface
-    and other fixed parameters that would be consumed by
-    flink:vkCreateSwapchainKHR.
-  * pname:pModes is a pointer to a tlink:VkDeviceGroupPresentModeFlagsKHR in
-    which the supported device group present modes for the surface are
-    returned.
-
-fname:vkGetDeviceGroupSurfacePresentModes2EXT behaves similarly to
-flink:vkGetDeviceGroupSurfacePresentModesKHR, with the ability to specify
-extended inputs via chained input structures.
-
-.Valid Usage
-****
-  * [[VUID-vkGetDeviceGroupSurfacePresentModes2EXT-pSurfaceInfo-06213]]
-    pname:pSurfaceInfo->surface must: be supported by all physical devices
-    associated with pname:device, as reported by
-    flink:vkGetPhysicalDeviceSurfaceSupportKHR or an equivalent
-    platform-specific mechanism
-****
-
-include::{generated}/validity/protos/vkGetDeviceGroupSurfacePresentModes2EXT.txt[]
---
-endif::VK_EXT_full_screen_exclusive[]
-
-[open,refpage='vkGetPhysicalDevicePresentRectanglesKHR',desc='Query present rectangles for a surface on a physical device',type='protos']
---
-:refpage: vkGetPhysicalDevicePresentRectanglesKHR
-
-When using ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR,
-the application may: need to know which regions of the surface are used when
-presenting locally on each physical device.
-Presentation of swapchain images to this surface need only have valid
-contents in the regions returned by this command.
-
-To query a set of rectangles used in presentation on the physical device,
-call:
-
-include::{generated}/api/protos/vkGetPhysicalDevicePresentRectanglesKHR.txt[]
-
-  * pname:physicalDevice is the physical device.
-  * pname:surface is the surface.
-  * pname:pRectCount is a pointer to an integer related to the number of
-    rectangles available or queried, as described below.
-  * pname:pRects is either `NULL` or a pointer to an array of slink:VkRect2D
-    structures.
-
-If pname:pRects is `NULL`, then the number of rectangles used when
-presenting the given pname:surface is returned in pname:pRectCount.
-Otherwise, pname:pRectCount must: point to a variable set by the user to the
-number of elements in the pname:pRects array, and on return the variable is
-overwritten with the number of structures actually written to pname:pRects.
-If the value of pname:pRectCount is less than the number of rectangles, at
-most pname:pRectCount structures will be written, and ename:VK_INCOMPLETE
-will be returned instead of ename:VK_SUCCESS, to indicate that not all the
-available rectangles were returned.
-
-The values returned by this command are not invariant, and may: change in
-response to the surface being moved, resized, or occluded.
-
-The rectangles returned by this command must: not overlap.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/surface_physical_device_common.txt[]
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDevicePresentRectanglesKHR.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-ifdef::VK_GOOGLE_display_timing[]
-include::{chapters}/VK_GOOGLE_display_timing/queries.txt[]
-endif::VK_GOOGLE_display_timing[]
-
-ifdef::VK_KHR_present_wait[]
-include::{chapters}/VK_KHR_present_wait/present_wait.txt[]
-endif::VK_KHR_present_wait[]
-
-include::{chapters}/VK_KHR_swapchain/wsi.txt[]
-endif::VK_KHR_swapchain[]
diff --git a/registry/vulkan/chapters/VK_KHR_swapchain/PresentId.txt b/registry/vulkan/chapters/VK_KHR_swapchain/PresentId.txt
deleted file mode 100644
index 9b57bcc..0000000
--- a/registry/vulkan/chapters/VK_KHR_swapchain/PresentId.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2019-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='VkPresentIdKHR',desc='The list of presentation identifiers',type='structs']
---
-The sname:VkPresentIdKHR structure is defined as:
-
-include::{generated}/api/structs/VkPresentIdKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:swapchainCount is the number of swapchains being presented to the
-    fname:vkQueuePresentKHR command.
-  * pname:pPresentIds is `NULL` or a pointer to an array of uint64_t with
-    pname:swapchainCount entries.
-    If not `NULL`, each non-zero value in pname:pPresentIds specifies the
-    present id to be associated with the presentation of the swapchain with
-    the same index in the flink:vkQueuePresentKHR call.
-
-For applications to be able to reference specific presentation events queued
-by a call to fname:vkQueuePresentKHR, an identifier needs to be associated
-with them.
-When the <<features-presentId, pname:presentId>> feature is enabled,
-applications can: include the sname:VkPresentIdKHR structure in the
-pname:pNext chain of the slink:VkPresentInfoKHR structure to supply
-identifiers.
-
-Each sname:VkSwapchainKHR has a presentId associated with it.
-This value is initially set to zero when the sname:VkSwapchainKHR is
-created.
-
-When a sname:VkPresentIdKHR structure with a non-NULL pname:pPresentIds is
-included in the pname:pNext chain of a slink:VkPresentInfoKHR structure,
-each pname:pSwapchains entry has a presentId associated in the
-pname:pPresentIds array at the same index as the swapchain in the
-pname:pSwapchains array.
-If this presentId is non-zero, then the application can: later use this
-value to refer to that image presentation.
-A value of zero indicates that this presentation has no associated
-presentId.
-A non-zero presentId must: be greater than any non-zero presentId passed
-previously by the application for the same swapchain.
-
-There is no requirement for any precise timing relationship between the
-presentation of the image to the user and the update of the presentId value,
-but implementations should: make this as close as possible to the
-presentation of the first pixel in the new image to the user.
-
-.Valid Usage
-****
-  * [[VUID-VkPresentIdKHR-swapchainCount-04998]]
-    pname:swapchainCount must: be the same value as
-    sname:VkPresentInfoKHR::pname:swapchainCount, where this
-    sname:VkPresentIdKHR is in the pname:pNext chain of the
-    sname:VkPresentInfoKHR structure
-  * [[VUID-VkPresentIdKHR-presentIds-04999]]
-    Each pname:presentIds entry must: be greater than any previous
-    pname:presentIds entry passed for the associated pname:pSwapchains entry
-****
-
-include::{generated}/validity/structs/VkPresentIdKHR.txt[]
---
-
-ifdef::VK_KHR_present_wait[]
-include::../VK_KHR_present_wait/WaitForPresent.txt[]
-endif::VK_KHR_present_wait[]
diff --git a/registry/vulkan/chapters/VK_KHR_swapchain/wsi.txt b/registry/vulkan/chapters/VK_KHR_swapchain/wsi.txt
deleted file mode 100644
index 64b5160..0000000
--- a/registry/vulkan/chapters/VK_KHR_swapchain/wsi.txt
+++ /dev/null
@@ -1,1506 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-== WSI Swapchain
-
-[open,refpage='VkSwapchainKHR',desc='Opaque handle to a swapchain object',type='handles']
---
-A swapchain object (a.k.a.
-swapchain) provides the ability to present rendering results to a surface.
-Swapchain objects are represented by sname:VkSwapchainKHR handles:
-
-include::{generated}/api/handles/VkSwapchainKHR.txt[]
-
-A swapchain is an abstraction for an array of presentable images that are
-associated with a surface.
-The presentable images are represented by sname:VkImage objects created by
-the platform.
-One image (which can: be an array image for multiview/stereoscopic-3D
-surfaces) is displayed at a time, but multiple images can: be queued for
-presentation.
-An application renders to the image, and then queues the image for
-presentation to the surface.
-
-A native window cannot: be associated with more than one non-retired
-swapchain at a time.
-Further, swapchains cannot: be created for native windows that have a
-non-Vulkan graphics API surface associated with them.
-
-[NOTE]
-.Note
-====
-The presentation engine is an abstraction for the platform's compositor or
-display engine.
-
-The presentation engine may: be synchronous or asynchronous with respect to
-the application and/or logical device.
-
-Some implementations may: use the device's graphics queue or dedicated
-presentation hardware to perform presentation.
-====
-
-The presentable images of a swapchain are owned by the presentation engine.
-An application can: acquire use of a presentable image from the presentation
-engine.
-Use of a presentable image must: occur only after the image is returned by
-fname:vkAcquireNextImageKHR, and before it is released by
-fname:vkQueuePresentKHR.
-This includes transitioning the image layout and rendering commands.
-
-An application can: acquire use of a presentable image with
-fname:vkAcquireNextImageKHR.
-After acquiring a presentable image and before modifying it, the application
-must: use a synchronization primitive to ensure that the presentation engine
-has finished reading from the image.
-The application can: then transition the image's layout, queue rendering
-commands to it, etc.
-Finally, the application presents the image with fname:vkQueuePresentKHR,
-which releases the acquisition of the image.
-
-The presentation engine controls the order in which presentable images are
-acquired for use by the application.
-
-[NOTE]
-.Note
-====
-This allows the platform to handle situations which require out-of-order
-return of images after presentation.
-At the same time, it allows the application to generate command buffers
-referencing all of the images in the swapchain at initialization time,
-rather than in its main loop.
-====
---
-
-How this all works is described below.
-
-ifdef::VK_KHR_shared_presentable_image[]
-include::{chapters}/VK_KHR_shared_presentable_image/wsi.txt[]
-endif::VK_KHR_shared_presentable_image[]
-
-[open,refpage='vkCreateSwapchainKHR',desc='Create a swapchain',type='protos']
---
-To create a swapchain, call:
-
-include::{generated}/api/protos/vkCreateSwapchainKHR.txt[]
-
-  * pname:device is the device to create the swapchain for.
-  * pname:pCreateInfo is a pointer to a slink:VkSwapchainCreateInfoKHR
-    structure specifying the parameters of the created swapchain.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    swapchain object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSwapchain is a pointer to a slink:VkSwapchainKHR handle in which
-    the created swapchain object will be returned.
-
-ifdef::VK_EXT_full_screen_exclusive[]
-If the pname:oldSwapchain parameter of pname:pCreateInfo is a valid
-swapchain, which has exclusive full-screen access, that access is released
-from pname:oldSwapchain.
-If the command succeeds in this case, the newly created swapchain will
-automatically acquire exclusive full-screen access from pname:oldSwapchain.
-
-[NOTE]
-.Note
-====
-This implicit transfer is intended to avoid exiting and entering full-screen
-exclusive mode, which may otherwise cause unwanted visual updates to the
-display.
-====
-
-In some cases, swapchain creation may: fail if exclusive full-screen mode is
-requested for application control, but for some implementation-specific
-reason exclusive full-screen access is unavailable for the particular
-combination of parameters provided.
-If this occurs, ename:VK_ERROR_INITIALIZATION_FAILED will be returned.
-
-[NOTE]
-.Note
-====
-In particular, it will fail if the pname:imageExtent member of
-pname:pCreateInfo does not match the extents of the monitor.
-ifdef::VK_KHR_win32_surface[]
-Other reasons for failure may include the app not being set as high-dpi
-aware, or if the physical device and monitor are not compatible in this
-mode.
-endif::VK_KHR_win32_surface[]
-====
-
-endif::VK_EXT_full_screen_exclusive[]
-
-ifdef::VK_NV_acquire_winrt_display[]
-When the slink:VkSurfaceKHR in slink:VkSwapchainCreateInfoKHR is a display
-surface, then the slink:VkDisplayModeKHR in display surface's
-slink:VkDisplaySurfaceCreateInfoKHR is associated with a particular
-slink:VkDisplayKHR.
-Swapchain creation may: fail if that slink:VkDisplayKHR is not acquired by
-the application.
-In this scenario ename:VK_ERROR_INITIALIZATION_FAILED is returned.
-endif::VK_NV_acquire_winrt_display[]
-
-include::{generated}/validity/protos/vkCreateSwapchainKHR.txt[]
---
-
-[open,refpage='VkSwapchainCreateInfoKHR',desc='Structure specifying parameters of a newly created swapchain object',type='structs']
---
-The sname:VkSwapchainCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkSwapchainCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkSwapchainCreateFlagBitsKHR
-    indicating parameters of the swapchain creation.
-  * pname:surface is the surface onto which the swapchain will present
-    images.
-    If the creation succeeds, the swapchain becomes associated with
-    pname:surface.
-  * pname:minImageCount is the minimum number of presentable images that the
-    application needs.
-    The implementation will either create the swapchain with at least that
-    many images, or it will fail to create the swapchain.
-  * pname:imageFormat is a elink:VkFormat value specifying the format the
-    swapchain image(s) will be created with.
-  * pname:imageColorSpace is a elink:VkColorSpaceKHR value specifying the
-    way the swapchain interprets image data.
-  * pname:imageExtent is the size (in pixels) of the swapchain image(s).
-    The behavior is platform-dependent if the image extent does not match
-    the surface's pname:currentExtent as returned by
-    fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR.
-+
-[NOTE]
-.Note
-====
-On some platforms, it is normal that pname:maxImageExtent may: become `(0,
-0)`, for example when the window is minimized.
-In such a case, it is not possible to create a swapchain due to the Valid
-Usage requirements.
-====
-  * pname:imageArrayLayers is the number of views in a multiview/stereo
-    surface.
-    For non-stereoscopic-3D applications, this value is 1.
-  * pname:imageUsage is a bitmask of elink:VkImageUsageFlagBits describing
-    the intended usage of the (acquired) swapchain images.
-  * pname:imageSharingMode is the sharing mode used for the image(s) of the
-    swapchain.
-  * pname:queueFamilyIndexCount is the number of queue families having
-    access to the image(s) of the swapchain when pname:imageSharingMode is
-    ename:VK_SHARING_MODE_CONCURRENT.
-  * pname:pQueueFamilyIndices is a pointer to an array of queue family
-    indices having access to the images(s) of the swapchain when
-    pname:imageSharingMode is ename:VK_SHARING_MODE_CONCURRENT.
-  * pname:preTransform is a elink:VkSurfaceTransformFlagBitsKHR value
-    describing the transform, relative to the presentation engine's natural
-    orientation, applied to the image content prior to presentation.
-    If it does not match the pname:currentTransform value returned by
-    fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR, the presentation engine
-    will transform the image content as part of the presentation operation.
-  * pname:compositeAlpha is a elink:VkCompositeAlphaFlagBitsKHR value
-    indicating the alpha compositing mode to use when this surface is
-    composited together with other surfaces on certain window systems.
-  * pname:presentMode is the presentation mode the swapchain will use.
-    A swapchain's present mode determines how incoming present requests will
-    be processed and queued internally.
-  * pname:clipped specifies whether the Vulkan implementation is allowed to
-    discard rendering operations that affect regions of the surface that are
-    not visible.
-  ** If set to ename:VK_TRUE, the presentable images associated with the
-     swapchain may: not own all of their pixels.
-     Pixels in the presentable images that correspond to regions of the
-     target surface obscured by another window on the desktop, or subject to
-     some other clipping mechanism will have undefined: content when read
-     back.
-     Fragment shaders may: not execute for these pixels, and thus any side
-     effects they would have had will not occur.
-     Setting ename:VK_TRUE does not guarantee any clipping will occur, but
-     allows more efficient presentation methods to be used on some
-     platforms.
-  ** If set to ename:VK_FALSE, presentable images associated with the
-     swapchain will own all of the pixels they contain.
-+
-[NOTE]
-.Note
-====
-Applications should: set this value to ename:VK_TRUE if they do not expect
-to read back the content of presentable images before presenting them or
-after reacquiring them, and if their fragment shaders do not have any side
-effects that require them to run for all pixels in the presentable image.
-====
-  * pname:oldSwapchain is dlink:VK_NULL_HANDLE, or the existing non-retired
-    swapchain currently associated with pname:surface.
-    Providing a valid pname:oldSwapchain may: aid in the resource reuse, and
-    also allows the application to still present any images that are already
-    acquired from it.
-
-Upon calling fname:vkCreateSwapchainKHR with an pname:oldSwapchain that is
-not dlink:VK_NULL_HANDLE, pname:oldSwapchain is retired -- even if creation
-of the new swapchain fails.
-The new swapchain is created in the non-retired state whether or not
-pname:oldSwapchain is dlink:VK_NULL_HANDLE.
-
-Upon calling fname:vkCreateSwapchainKHR with an pname:oldSwapchain that is
-not dlink:VK_NULL_HANDLE, any images from pname:oldSwapchain that are not
-acquired by the application may: be freed by the implementation, which may:
-occur even if creation of the new swapchain fails.
-The application can: destroy pname:oldSwapchain to free all memory
-associated with pname:oldSwapchain.
-
-[NOTE]
-.Note
-====
-Multiple retired swapchains can: be associated with the same
-sname:VkSurfaceKHR through multiple uses of pname:oldSwapchain that
-outnumber calls to flink:vkDestroySwapchainKHR.
-
-After pname:oldSwapchain is retired, the application can: pass to
-flink:vkQueuePresentKHR any images it had already acquired from
-pname:oldSwapchain.
-E.g., an application may present an image from the old swapchain before an
-image from the new swapchain is ready to be presented.
-As usual, flink:vkQueuePresentKHR may: fail if pname:oldSwapchain has
-entered a state that causes ename:VK_ERROR_OUT_OF_DATE_KHR to be returned.
-
-ifdef::VK_KHR_shared_presentable_image[]
-The application can: continue to use a shared presentable image obtained
-from pname:oldSwapchain until a presentable image is acquired from the new
-swapchain, as long as it has not entered a state that causes it to return
-ename:VK_ERROR_OUT_OF_DATE_KHR.
-endif::VK_KHR_shared_presentable_image[]
-====
-
-.Valid Usage
-****
-  * [[VUID-VkSwapchainCreateInfoKHR-surface-01270]]
-    pname:surface must: be a surface that is supported by the device as
-    determined using flink:vkGetPhysicalDeviceSurfaceSupportKHR
-ifndef::VK_KHR_shared_presentable_image[]
-  * [[VUID-VkSwapchainCreateInfoKHR-minImageCount-01271]]
-    pname:minImageCount must: be greater than or equal to the value returned
-    in the pname:minImageCount member of the sname:VkSurfaceCapabilitiesKHR
-    structure returned by flink:vkGetPhysicalDeviceSurfaceCapabilitiesKHR
-    for the surface
-endif::VK_KHR_shared_presentable_image[]
-  * [[VUID-VkSwapchainCreateInfoKHR-minImageCount-01272]]
-    pname:minImageCount must: be less than or equal to the value returned in
-    the pname:maxImageCount member of the sname:VkSurfaceCapabilitiesKHR
-    structure returned by fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR
-    for the surface if the returned pname:maxImageCount is not zero
-ifdef::VK_KHR_shared_presentable_image[]
-  * [[VUID-VkSwapchainCreateInfoKHR-presentMode-02839]]
-    If pname:presentMode is not
-    ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR nor
-    ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, then
-    pname:minImageCount must: be greater than or equal to the value returned
-    in the pname:minImageCount member of the sname:VkSurfaceCapabilitiesKHR
-    structure returned by flink:vkGetPhysicalDeviceSurfaceCapabilitiesKHR
-    for the surface
-  * [[VUID-VkSwapchainCreateInfoKHR-minImageCount-01383]]
-    pname:minImageCount must: be `1` if pname:presentMode is either
-    ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or
-    ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR
-endif::VK_KHR_shared_presentable_image[]
-  * [[VUID-VkSwapchainCreateInfoKHR-imageFormat-01273]]
-    pname:imageFormat and pname:imageColorSpace must: match the pname:format
-    and pname:colorSpace members, respectively, of one of the
-    sname:VkSurfaceFormatKHR structures returned by
-    fname:vkGetPhysicalDeviceSurfaceFormatsKHR for the surface
-  * [[VUID-VkSwapchainCreateInfoKHR-imageExtent-01274]]
-    pname:imageExtent must: be between pname:minImageExtent and
-    pname:maxImageExtent, inclusive, where pname:minImageExtent and
-    pname:maxImageExtent are members of the sname:VkSurfaceCapabilitiesKHR
-    structure returned by fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR
-    for the surface
-  * [[VUID-VkSwapchainCreateInfoKHR-imageExtent-01689]]
-    pname:imageExtent members pname:width and pname:height must: both be
-    non-zero
-  * [[VUID-VkSwapchainCreateInfoKHR-imageArrayLayers-01275]]
-    pname:imageArrayLayers must: be greater than `0` and less than or equal
-    to the pname:maxImageArrayLayers member of the
-    sname:VkSurfaceCapabilitiesKHR structure returned by
-    fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface
-ifndef::VK_KHR_shared_presentable_image[]
-  * [[VUID-VkSwapchainCreateInfoKHR-imageUsage-01276]]
-    pname:imageUsage must: be a subset of the supported usage flags present
-    in the pname:supportedUsageFlags member of the
-    sname:VkSurfaceCapabilitiesKHR structure returned by
-    fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_KHR_shared_presentable_image[]
-  * [[VUID-VkSwapchainCreateInfoKHR-presentMode-01427]]
-    If pname:presentMode is ename:VK_PRESENT_MODE_IMMEDIATE_KHR,
-    ename:VK_PRESENT_MODE_MAILBOX_KHR, ename:VK_PRESENT_MODE_FIFO_KHR or
-    ename:VK_PRESENT_MODE_FIFO_RELAXED_KHR, pname:imageUsage must: be a
-    subset of the supported usage flags present in the
-    pname:supportedUsageFlags member of the slink:VkSurfaceCapabilitiesKHR
-    structure returned by flink:vkGetPhysicalDeviceSurfaceCapabilitiesKHR
-    for pname:surface
-  * [[VUID-VkSwapchainCreateInfoKHR-imageUsage-01384]]
-    If pname:presentMode is ename:VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR
-    or ename:VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, pname:imageUsage
-    must: be a subset of the supported usage flags present in the
-    pname:sharedPresentSupportedUsageFlags member of the
-    slink:VkSharedPresentSurfaceCapabilitiesKHR structure returned by
-    flink:vkGetPhysicalDeviceSurfaceCapabilities2KHR for pname:surface
-endif::VK_KHR_shared_presentable_image[]
-  * [[VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01277]]
-    If pname:imageSharingMode is ename:VK_SHARING_MODE_CONCURRENT,
-    pname:pQueueFamilyIndices must: be a valid pointer to an array of
-    pname:queueFamilyIndexCount code:uint32_t values
-  * [[VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01278]]
-    If pname:imageSharingMode is ename:VK_SHARING_MODE_CONCURRENT,
-    pname:queueFamilyIndexCount must: be greater than `1`
-ifndef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-  * [[VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01393]]
-    If pname:imageSharingMode is ename:VK_SHARING_MODE_CONCURRENT, each
-    element of pname:pQueueFamilyIndices must: be unique and must: be less
-    than pname:pQueueFamilyPropertyCount returned by
-    flink:vkGetPhysicalDeviceQueueFamilyProperties for the
-    pname:physicalDevice that was used to create pname:device
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-  * [[VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428]]
-    If pname:imageSharingMode is ename:VK_SHARING_MODE_CONCURRENT, each
-    element of pname:pQueueFamilyIndices must: be unique and must: be less
-    than pname:pQueueFamilyPropertyCount returned by either
-    flink:vkGetPhysicalDeviceQueueFamilyProperties or
-    flink:vkGetPhysicalDeviceQueueFamilyProperties2 for the
-    pname:physicalDevice that was used to create pname:device
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-  * [[VUID-VkSwapchainCreateInfoKHR-preTransform-01279]]
-    pname:preTransform must: be one of the bits present in the
-    pname:supportedTransforms member of the sname:VkSurfaceCapabilitiesKHR
-    structure returned by fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR
-    for the surface
-  * [[VUID-VkSwapchainCreateInfoKHR-compositeAlpha-01280]]
-    pname:compositeAlpha must: be one of the bits present in the
-    pname:supportedCompositeAlpha member of the
-    sname:VkSurfaceCapabilitiesKHR structure returned by
-    fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface
-  * [[VUID-VkSwapchainCreateInfoKHR-presentMode-01281]]
-    pname:presentMode must: be one of the elink:VkPresentModeKHR values
-    returned by fname:vkGetPhysicalDeviceSurfacePresentModesKHR for the
-    surface
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkSwapchainCreateInfoKHR-physicalDeviceCount-01429]]
-    If the logical device was created with
-    slink:VkDeviceGroupDeviceCreateInfo::pname:physicalDeviceCount equal to
-    1, pname:flags must: not contain
-    ename:VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkSwapchainCreateInfoKHR-oldSwapchain-01933]]
-    If pname:oldSwapchain is not dlink:VK_NULL_HANDLE, pname:oldSwapchain
-    must: be a non-retired swapchain associated with native window referred
-    to by pname:surface
-  * [[VUID-VkSwapchainCreateInfoKHR-imageFormat-01778]]
-    The <<swapchain-wsi-image-create-info, implied image creation
-    parameters>> of the swapchain must: be supported as reported by
-    flink:vkGetPhysicalDeviceImageFormatProperties
-ifdef::VK_KHR_swapchain_mutable_format[]
-  * [[VUID-VkSwapchainCreateInfoKHR-flags-03168]]
-    If pname:flags contains ename:VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR
-    then the pname:pNext chain must: include a
-    slink:VkImageFormatListCreateInfo structure with a pname:viewFormatCount
-    greater than zero and pname:pViewFormats must: have an element equal to
-    pname:imageFormat
-  * [[VUID-VkSwapchainCreateInfoKHR-pNext-04099]]
-    If a slink:VkImageFormatListCreateInfo structure was included in the
-    pname:pNext chain and
-    slink:VkImageFormatListCreateInfo::pname:viewFormatCount is not zero
-    then all of the formats in
-    slink:VkImageFormatListCreateInfo::pname:pViewFormats must: be
-    compatible with the pname:format as described in the
-    <<formats-compatibility,compatibility table>>
-  * [[VUID-VkSwapchainCreateInfoKHR-flags-04100]]
-    If pname:flags does not contain
-    ename:VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR and the pname:pNext
-    chain include a slink:VkImageFormatListCreateInfo structure then
-    slink:VkImageFormatListCreateInfo::pname:viewFormatCount must: be `0` or
-    `1`
-endif::VK_KHR_swapchain_mutable_format[]
-ifdef::VK_KHR_surface_protected_capabilities[]
-  * [[VUID-VkSwapchainCreateInfoKHR-flags-03187]]
-    If pname:flags contains ename:VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR,
-    then sname:VkSurfaceProtectedCapabilitiesKHR::pname:supportsProtected
-    must: be ename:VK_TRUE in the slink:VkSurfaceProtectedCapabilitiesKHR
-    structure returned by flink:vkGetPhysicalDeviceSurfaceCapabilities2KHR
-    for pname:surface
-endif::VK_KHR_surface_protected_capabilities[]
-ifdef::VK_EXT_full_screen_exclusive+VK_KHR_win32_surface[]
-  * [[VUID-VkSwapchainCreateInfoKHR-pNext-02679]]
-    If the pname:pNext chain includes a
-    slink:VkSurfaceFullScreenExclusiveInfoEXT structure with its
-    pname:fullScreenExclusive member set to
-    ename:VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT, and
-    pname:surface was created using flink:vkCreateWin32SurfaceKHR, a
-    slink:VkSurfaceFullScreenExclusiveWin32InfoEXT structure must: be
-    included in the pname:pNext chain
-endif::VK_EXT_full_screen_exclusive+VK_KHR_win32_surface[]
-****
-
-include::{generated}/validity/structs/VkSwapchainCreateInfoKHR.txt[]
---
-
-[open,refpage='VkSwapchainCreateFlagBitsKHR',desc='Bitmask controlling swapchain creation',type='enums']
---
-Bits which can: be set in slink:VkSwapchainCreateInfoKHR::pname:flags,
-specifying parameters of swapchain creation, are:
-
-include::{generated}/api/enums/VkSwapchainCreateFlagBitsKHR.txt[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * ename:VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR specifies
-    that images created from the swapchain (i.e. with the pname:swapchain
-    member of slink:VkImageSwapchainCreateInfoKHR set to this swapchain's
-    handle) must: use ename:VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT.
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_VERSION_1_1[]
-  * ename:VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR specifies that images
-    created from the swapchain are protected images.
-endif::VK_VERSION_1_1[]
-ifdef::VK_KHR_swapchain_mutable_format[]
-  * ename:VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR specifies that the
-    images of the swapchain can: be used to create a sname:VkImageView with
-    a different format than what the swapchain was created with.
-    The list of allowed image view formats is specified by adding a
-    slink:VkImageFormatListCreateInfo structure to the pname:pNext chain of
-    slink:VkSwapchainCreateInfoKHR.
-    In addition, this flag also specifies that the swapchain can: be created
-    with usage flags that are not supported for the format the swapchain is
-    created with but are supported for at least one of the allowed image
-    view formats.
-endif::VK_KHR_swapchain_mutable_format[]
---
-
-[open,refpage='VkSwapchainCreateFlagsKHR',desc='Bitmask of VkSwapchainCreateFlagBitsKHR',type='flags']
---
-include::{generated}/api/flags/VkSwapchainCreateFlagsKHR.txt[]
-
-tname:VkSwapchainCreateFlagsKHR is a bitmask type for setting a mask of zero
-or more elink:VkSwapchainCreateFlagBitsKHR.
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[open,refpage='VkDeviceGroupSwapchainCreateInfoKHR',desc='Structure specifying parameters of a newly created swapchain object',type='structs']
---
-If the pname:pNext chain of slink:VkSwapchainCreateInfoKHR includes a
-sname:VkDeviceGroupSwapchainCreateInfoKHR structure, then that structure
-includes a set of device group present modes that the swapchain can: be used
-with.
-
-The sname:VkDeviceGroupSwapchainCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkDeviceGroupSwapchainCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:modes is a bitfield of modes that the swapchain can: be used with.
-
-If this structure is not present, pname:modes is considered to be
-ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR.
-
-include::{generated}/validity/structs/VkDeviceGroupSwapchainCreateInfoKHR.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-ifdef::VK_AMD_display_native_hdr[]
-[open,refpage='VkSwapchainDisplayNativeHdrCreateInfoAMD',desc='Structure specifying display native HDR parameters of a newly created swapchain object',type='structs']
---
-If the pname:pNext chain of slink:VkSwapchainCreateInfoKHR includes a
-sname:VkSwapchainDisplayNativeHdrCreateInfoAMD structure, then that
-structure includes additional swapchain creation parameters specific to
-display native HDR support.
-
-The sname:VkSwapchainDisplayNativeHdrCreateInfoAMD structure is defined as:
-
-include::{generated}/api/structs/VkSwapchainDisplayNativeHdrCreateInfoAMD.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:localDimmingEnable specifies whether local dimming is enabled for
-    the swapchain.
-
-If the pname:pNext chain of slink:VkSwapchainCreateInfoKHR does not include
-this structure, the default value for pname:localDimmingEnable is
-ename:VK_TRUE, meaning local dimming is initially enabled for the swapchain.
-
-include::{generated}/validity/structs/VkSwapchainDisplayNativeHdrCreateInfoAMD.txt[]
-
-.Valid Usage
-****
-  * [[VUID-VkSwapchainDisplayNativeHdrCreateInfoAMD-localDimmingEnable-04449]]
-    It is only valid to set pname:localDimmingEnable to ename:VK_TRUE if
-    slink:VkDisplayNativeHdrSurfaceCapabilitiesAMD::pname:localDimmingSupport
-    is supported
-****
---
-
-[open,refpage='vkSetLocalDimmingAMD',desc='Set Local Dimming',type='protos']
---
-The local dimming HDR setting may also be changed over the life of a
-swapchain by calling:
-
-include::{generated}/api/protos/vkSetLocalDimmingAMD.txt[]
-
-  * pname:device is the device associated with pname:swapChain.
-  * pname:swapChain handle to enable local dimming.
-  * pname:localDimmingEnable specifies whether local dimming is enabled for
-    the swapchain.
-
-include::{generated}/validity/protos/vkSetLocalDimmingAMD.txt[]
-
-.Valid Usage
-****
-  * [[VUID-vkSetLocalDimmingAMD-localDimmingSupport-04618]]
-    slink:VkDisplayNativeHdrSurfaceCapabilitiesAMD::pname:localDimmingSupport
-    must: be supported
-****
---
-endif::VK_AMD_display_native_hdr[]
-
-ifdef::VK_EXT_full_screen_exclusive[]
---
-
-If the pname:pNext chain of slink:VkSwapchainCreateInfoKHR includes a
-slink:VkSurfaceFullScreenExclusiveInfoEXT structure, then that structure
-specifies the application's preferred full-screen presentation behavior.
-If this structure is not present, pname:fullScreenExclusive is considered to
-be ename:VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT.
-
---
-
-endif::VK_EXT_full_screen_exclusive[]
-
-ifdef::VK_EXT_display_control[]
-include::{chapters}/VK_EXT_display_control/swapchain_counters.txt[]
-endif::VK_EXT_display_control[]
-
-As mentioned above, if fname:vkCreateSwapchainKHR succeeds, it will return a
-handle to a swapchain containing an array of at least pname:minImageCount
-presentable images.
-
-While acquired by the application, presentable images can: be used in any
-way that equivalent non-presentable images can: be used.
-A presentable image is equivalent to a non-presentable image created with
-the following slink:VkImageCreateInfo parameters:
-
-[[swapchain-wsi-image-create-info]]
-[options="header"]
-|====
-| sname:VkImageCreateInfo Field | Value
-ifndef::VK_VERSION_1_1,VK_KHR_device_group,VK_KHR_swapchain_mutable_format[]
-| pname:flags                   | 0
-endif::VK_VERSION_1_1,VK_KHR_device_group,VK_KHR_swapchain_mutable_format[]
-ifdef::VK_VERSION_1_1,VK_KHR_device_group,VK_KHR_swapchain_mutable_format[]
-| pname:flags                   |
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-ename:VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT is set if
-ename:VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR is set
-
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_VERSION_1_1[]
-ename:VK_IMAGE_CREATE_PROTECTED_BIT is set if
-ename:VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR is set
-
-endif::VK_VERSION_1_1[]
-ifdef::VK_KHR_swapchain_mutable_format[]
-ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT and
-ename:VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR are both set if
-ename:VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR is set
-
-endif::VK_KHR_swapchain_mutable_format[]
-all other bits are unset
-endif::VK_VERSION_1_1,VK_KHR_device_group,VK_KHR_swapchain_mutable_format[]
-| pname:imageType               | ename:VK_IMAGE_TYPE_2D
-| pname:format                  | pname:pCreateInfo->imageFormat
-| pname:extent                  | {pname:pCreateInfo->imageExtent.width, pname:pCreateInfo->imageExtent.height, `1`}
-| pname:mipLevels               | 1
-| pname:arrayLayers             | pname:pCreateInfo->imageArrayLayers
-| pname:samples                 | ename:VK_SAMPLE_COUNT_1_BIT
-| pname:tiling                  | ename:VK_IMAGE_TILING_OPTIMAL
-| pname:usage                   | pname:pCreateInfo->imageUsage
-| pname:sharingMode             | pname:pCreateInfo->imageSharingMode
-| pname:queueFamilyIndexCount   | pname:pCreateInfo->queueFamilyIndexCount
-| pname:pQueueFamilyIndices     | pname:pCreateInfo->pQueueFamilyIndices
-| pname:initialLayout           | ename:VK_IMAGE_LAYOUT_UNDEFINED
-|====
-
-The pname:surface must: not be destroyed until after the swapchain is
-destroyed.
-
-If pname:oldSwapchain is dlink:VK_NULL_HANDLE, and the native window
-referred to by pname:surface is already associated with a Vulkan swapchain,
-ename:VK_ERROR_NATIVE_WINDOW_IN_USE_KHR must: be returned.
-
-If the native window referred to by pname:surface is already associated with
-a non-Vulkan graphics API surface, ename:VK_ERROR_NATIVE_WINDOW_IN_USE_KHR
-must: be returned.
-
-The native window referred to by pname:surface must: not become associated
-with a non-Vulkan graphics API surface before all associated Vulkan
-swapchains have been destroyed.
-
-Like core functions, several WSI functions, including
-fname:vkCreateSwapchainKHR return ename:VK_ERROR_DEVICE_LOST if the logical
-device was lost.
-See <<devsandqueues-lost-device,Lost Device>>.
-As with most core objects, sname:VkSwapchainKHR is a child of the device and
-is affected by the lost state; it must: be destroyed before destroying the
-sname:VkDevice.
-However, sname:VkSurfaceKHR is not a child of any sname:VkDevice and is not
-otherwise affected by the lost device.
-After successfully recreating a sname:VkDevice, the same sname:VkSurfaceKHR
-can: be used to create a new sname:VkSwapchainKHR, provided the previous one
-was destroyed.
-
-[NOTE]
-.Note
-====
-As mentioned in <<devsandqueues-lost-device,Lost Device>>, after a lost
-device event, the sname:VkPhysicalDevice may: also be lost.
-If other sname:VkPhysicalDevice are available, they can: be used together
-with the same sname:VkSurfaceKHR to create the new sname:VkSwapchainKHR,
-however the application must: query the surface capabilities again, because
-they may: differ on a per-physical device basis.
-====
-
-[open,refpage='vkDestroySwapchainKHR',desc='Destroy a swapchain object',type='protos']
---
-To destroy a swapchain object call:
-
-include::{generated}/api/protos/vkDestroySwapchainKHR.txt[]
-
-  * pname:device is the slink:VkDevice associated with pname:swapchain.
-  * pname:swapchain is the swapchain to destroy.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    swapchain object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-
-The application must: not destroy a swapchain until after completion of all
-outstanding operations on images that were acquired from the swapchain.
-pname:swapchain and all associated sname:VkImage handles are destroyed, and
-must: not be acquired or used any more by the application.
-The memory of each sname:VkImage will only be freed after that image is no
-longer used by the presentation engine.
-For example, if one image of the swapchain is being displayed in a window,
-the memory for that image may: not be freed until the window is destroyed,
-or another swapchain is created for the window.
-Destroying the swapchain does not invalidate the parent sname:VkSurfaceKHR,
-and a new swapchain can: be created with it.
-
-ifdef::VK_KHR_display_swapchain[]
-include::{chapters}/VK_KHR_display_swapchain/destroy_swapchain_interactions.txt[]
-endif::VK_KHR_display_swapchain[]
-
-ifdef::VK_EXT_full_screen_exclusive[]
-If pname:swapchain has exclusive full-screen access, it is released before
-the swapchain is destroyed.
-endif::VK_EXT_full_screen_exclusive[]
-
-.Valid Usage
-****
-  * [[VUID-vkDestroySwapchainKHR-swapchain-01282]]
-    All uses of presentable images acquired from pname:swapchain must: have
-    completed execution
-  * [[VUID-vkDestroySwapchainKHR-swapchain-01283]]
-    If sname:VkAllocationCallbacks were provided when pname:swapchain was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroySwapchainKHR-swapchain-01284]]
-    If no sname:VkAllocationCallbacks were provided when pname:swapchain was
-    created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroySwapchainKHR.txt[]
---
-
-ifdef::VK_KHR_display_swapchain[]
-include::{chapters}/VK_KHR_display_swapchain/create_shared_swapchains.txt[]
-endif::VK_KHR_display_swapchain[]
-
-[open,refpage='vkGetSwapchainImagesKHR',desc='Obtain the array of presentable images associated with a swapchain',type='protos']
---
-To obtain the array of presentable images associated with a swapchain, call:
-
-include::{generated}/api/protos/vkGetSwapchainImagesKHR.txt[]
-
-  * pname:device is the device associated with pname:swapchain.
-  * pname:swapchain is the swapchain to query.
-  * pname:pSwapchainImageCount is a pointer to an integer related to the
-    number of presentable images available or queried, as described below.
-  * pname:pSwapchainImages is either `NULL` or a pointer to an array of
-    sname:VkImage handles.
-
-If pname:pSwapchainImages is `NULL`, then the number of presentable images
-for pname:swapchain is returned in pname:pSwapchainImageCount.
-Otherwise, pname:pSwapchainImageCount must: point to a variable set by the
-user to the number of elements in the pname:pSwapchainImages array, and on
-return the variable is overwritten with the number of structures actually
-written to pname:pSwapchainImages.
-If the value of pname:pSwapchainImageCount is less than the number of
-presentable images for pname:swapchain, at most pname:pSwapchainImageCount
-structures will be written, and ename:VK_INCOMPLETE will be returned instead
-of ename:VK_SUCCESS, to indicate that not all the available presentable
-images were returned.
-
-include::{generated}/validity/protos/vkGetSwapchainImagesKHR.txt[]
---
-
-[NOTE]
-.Note
-====
-By knowing all presentable images used in the swapchain, the application
-can: create command buffers that reference these images prior to entering
-its main rendering loop.
-====
-
-Images returned by flink:vkGetSwapchainImagesKHR are fully backed by memory
-before they are passed to the application.
-All presentable images are initially in the ename:VK_IMAGE_LAYOUT_UNDEFINED
-layout, thus before using presentable images, the application must:
-transition them to a valid layout for the intended use.
-
-Further, the lifetime of presentable images is controlled by the
-implementation, so applications must: not destroy a presentable image.
-See flink:vkDestroySwapchainKHR for further details on the lifetime of
-presentable images.
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-
-Images can: also be created by using flink:vkCreateImage with
-slink:VkImageSwapchainCreateInfoKHR and bound to swapchain memory using
-flink:vkBindImageMemory2KHR with slink:VkBindImageMemorySwapchainInfoKHR.
-These images can: be used anywhere swapchain images are used, and are useful
-in logical devices with multiple physical devices to create peer memory
-bindings of swapchain memory.
-These images and bindings have no effect on what memory is presented.
-Unlike images retrieved from fname:vkGetSwapchainImagesKHR, these images
-must: be destroyed with flink:vkDestroyImage.
-
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-[open,refpage='vkAcquireNextImageKHR',desc='Retrieve the index of the next available presentable image',type='protos']
---
-To acquire an available presentable image to use, and retrieve the index of
-that image, call:
-
-include::{generated}/api/protos/vkAcquireNextImageKHR.txt[]
-
-  * pname:device is the device associated with pname:swapchain.
-  * pname:swapchain is the non-retired swapchain from which an image is
-    being acquired.
-  * pname:timeout specifies how long the function waits, in nanoseconds, if
-    no image is available.
-  * pname:semaphore is dlink:VK_NULL_HANDLE or a semaphore to signal.
-  * pname:fence is dlink:VK_NULL_HANDLE or a fence to signal.
-  * pname:pImageIndex is a pointer to a code:uint32_t in which the index of
-    the next image to use (i.e. an index into the array of images returned
-    by fname:vkGetSwapchainImagesKHR) is returned.
-
-.Valid Usage
-****
-  * [[VUID-vkAcquireNextImageKHR-swapchain-01285]]
-    pname:swapchain must: not be in the retired state
-  * [[VUID-vkAcquireNextImageKHR-semaphore-01286]]
-    If pname:semaphore is not dlink:VK_NULL_HANDLE it must: be unsignaled
-  * [[VUID-vkAcquireNextImageKHR-semaphore-01779]]
-    If pname:semaphore is not dlink:VK_NULL_HANDLE it must: not have any
-    uncompleted signal or wait operations pending
-  * [[VUID-vkAcquireNextImageKHR-fence-01287]]
-    If pname:fence is not dlink:VK_NULL_HANDLE it must: be unsignaled and
-    must: not be associated with any other queue command that has not yet
-    completed execution on that queue
-  * [[VUID-vkAcquireNextImageKHR-semaphore-01780]]
-    pname:semaphore and pname:fence must: not both be equal to
-    dlink:VK_NULL_HANDLE
-  * [[VUID-vkAcquireNextImageKHR-swapchain-01802]]
-    If the number of currently acquired images is greater than the
-    difference between the number of images in pname:swapchain and the value
-    of slink:VkSurfaceCapabilitiesKHR::pname:minImageCount as returned by a
-    call to flink:vkGetPhysicalDeviceSurfaceCapabilities2KHR with the
-    pname:surface used to create pname:swapchain, pname:timeout must: not be
-    code:UINT64_MAX
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-  * [[VUID-vkAcquireNextImageKHR-semaphore-03265]]
-    pname:semaphore must: have a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_BINARY
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-****
-
-include::{generated}/validity/protos/vkAcquireNextImageKHR.txt[]
---
-
-When successful, fname:vkAcquireNextImageKHR acquires a presentable image
-from pname:swapchain that an application can: use, and sets
-pname:pImageIndex to the index of that image within the swapchain.
-The presentation engine may: not have finished reading from the image at the
-time it is acquired, so the application must: use pname:semaphore and/or
-pname:fence to ensure that the image layout and contents are not modified
-until the presentation engine reads have completed.
-If pname:semaphore is not dlink:VK_NULL_HANDLE, the application may assume
-that, once fname:vkAcquireNextImageKHR returns, the semaphore signal
-operation referenced by pname:semaphore has been submitted for execution.
-The order in which images are acquired is implementation-dependent, and may:
-be different than the order the images were presented.
-
-If pname:timeout is zero, then fname:vkAcquireNextImageKHR does not wait,
-and will either successfully acquire an image, or fail and return
-ename:VK_NOT_READY if no image is available.
-
-If the specified timeout period expires before an image is acquired,
-fname:vkAcquireNextImageKHR returns ename:VK_TIMEOUT.
-If pname:timeout is code:UINT64_MAX, the timeout period is treated as
-infinite, and fname:vkAcquireNextImageKHR will block until an image is
-acquired or an error occurs.
-
-fname:vkAcquireNextImageKHR should: not be called if the number of images
-that the application has currently acquired is greater than the difference
-between the number of images in pname:swapchain and the value of
-slink:VkSurfaceCapabilitiesKHR::pname:minImageCount.
-If fname:vkAcquireNextImageKHR is called when the number of images that the
-application has currently acquired is less or equal than the difference
-between the number of images in pname:swapchain and the value of
-slink:VkSurfaceCapabilitiesKHR::pname:minImageCount,
-fname:vkAcquireNextImageKHR must: return in finite time with an allowed
-ename:VkResult code.
-
-[NOTE]
-.Note
-====
-Returning a result in finite time guarantees that the implementation cannot
-deadlock an application, or suspend its execution indefinitely with correct
-API usage.
-Acquiring too many images at once may block indefinitely, which is covered
-by valid usage when attempting to use code:UINT64_MAX.
-For example, a scenario here is when a compositor holds on to images which
-are currently being presented, and there are not any vacant images left to
-be acquired.
-====
-
-If an image is acquired successfully, fname:vkAcquireNextImageKHR must:
-either return ename:VK_SUCCESS or ename:VK_SUBOPTIMAL_KHR.
-The implementation may: return ename:VK_SUBOPTIMAL_KHR if the swapchain no
-longer matches the surface properties exactly, but can: still be used for
-presentation.
-
-[NOTE]
-.Note
-====
-ename:VK_SUBOPTIMAL_KHR may: happen, for example, if the platform surface
-has been resized but the platform is able to scale the presented images to
-the new size to produce valid surface updates.
-It is up to the application to decide whether it prefers to continue using
-the current swapchain in this state, or to re-create the swapchain to better
-match the platform surface properties.
-====
-
-If the swapchain images no longer match native surface properties, either
-ename:VK_SUBOPTIMAL_KHR or ename:VK_ERROR_OUT_OF_DATE_KHR must: be returned.
-If ename:VK_ERROR_OUT_OF_DATE_KHR is returned, no image is acquired and
-attempts to present previously acquired images to the swapchain will also
-fail with ename:VK_ERROR_OUT_OF_DATE_KHR.
-Applications need to create a new swapchain for the surface to continue
-presenting if ename:VK_ERROR_OUT_OF_DATE_KHR is returned.
-
-If device loss occurs (see <<devsandqueues-lost-device,Lost Device>>) before
-the timeout has expired, fname:vkAcquireNextImageKHR must: return in finite
-time with either one of the allowed success codes, or
-ename:VK_ERROR_DEVICE_LOST.
-
-If pname:semaphore is not dlink:VK_NULL_HANDLE, the semaphore must: be
-unsignaled, with no signal or wait operations pending.
-It will become signaled when the application can: use the image.
-
-[NOTE]
-.Note
-====
-Use of pname:semaphore allows rendering operations to be recorded and
-submitted before the presentation engine has completed its use of the image.
-====
-
-If pname:fence is not equal to dlink:VK_NULL_HANDLE, the fence must: be
-unsignaled, with no signal operations pending.
-It will become signaled when the application can: use the image.
-
-[NOTE]
-.Note
-====
-Applications should: not rely on fname:vkAcquireNextImageKHR blocking in
-order to meter their rendering speed.
-The implementation may: return from this function immediately regardless of
-how many presentation requests are queued, and regardless of when queued
-presentation requests will complete relative to the call.
-Instead, applications can: use pname:fence to meter their frame generation
-work to match the presentation rate.
-====
-
-An application must: wait until either the pname:semaphore or pname:fence is
-signaled before accessing the image's data.
-
-[NOTE]
-.Note
-====
-When the presentable image will be accessed by some stage [eq]#S#, the
-recommended idiom for ensuring correct synchronization is:
-
-  * The slink:VkSubmitInfo used to submit the image layout transition for
-    execution includes fname:vkAcquireNextImageKHR::pname:semaphore in its
-    pname:pWaitSemaphores member, with the corresponding element of
-    pname:pWaitDstStageMask including [eq]#S#.
-  * The <<synchronization, synchronization command>> that performs any
-    necessary image layout transition includes [eq]#S# in both the
-    pname:srcStageMask and pname:dstStageMask.
-====
-
-After a successful return, the image indicated by pname:pImageIndex and its
-data will be unmodified compared to when it was presented.
-
-[NOTE]
-.Note
-====
-Exclusive ownership of presentable images corresponding to a swapchain
-created with ename:VK_SHARING_MODE_EXCLUSIVE as defined in
-<<resources-sharing,Resource Sharing>> is not altered by a call to
-fname:vkAcquireNextImageKHR.
-That means upon the first acquisition from such a swapchain presentable
-images are not owned by any queue family, while at subsequent acquisitions
-the presentable images remain owned by the queue family the image was
-previously presented on.
-====
-
-The possible return values for fname:vkAcquireNextImageKHR depend on the
-pname:timeout provided:
-
-  * ename:VK_SUCCESS is returned if an image became available.
-  * ename:VK_ERROR_SURFACE_LOST_KHR is returned if the surface becomes no
-    longer available.
-  * ename:VK_NOT_READY is returned if pname:timeout is zero and no image was
-    available.
-  * ename:VK_TIMEOUT is returned if pname:timeout is greater than zero and
-    less than code:UINT64_MAX, and no image became available within the time
-    allowed.
-  * ename:VK_SUBOPTIMAL_KHR is returned if an image became available, and
-    the swapchain no longer matches the surface properties exactly, but can:
-    still be used to present to the surface successfully.
-
-[NOTE]
-.Note
-====
-This may: happen, for example, if the platform surface has been resized but
-the platform is able to scale the presented images to the new size to
-produce valid surface updates.
-It is up to the application to decide whether it prefers to continue using
-the current swapchain indefinitely or temporarily in this state, or to
-re-create the swapchain to better match the platform surface properties.
-====
-
-  * ename:VK_ERROR_OUT_OF_DATE_KHR is returned if the surface has changed in
-    such a way that it is no longer compatible with the swapchain, and
-    further presentation requests using the swapchain will fail.
-    Applications must: query the new surface properties and recreate their
-    swapchain if they wish to continue presenting to the surface.
-
-If the native surface and presented image sizes no longer match,
-presentation may: fail.
-If presentation does succeed, the mapping from the presented image to the
-native surface is implementation-defined.
-It is the application's responsibility to detect surface size changes and
-react appropriately.
-If presentation fails because of a mismatch in the surface and presented
-image sizes, a ename:VK_ERROR_OUT_OF_DATE_KHR error will be returned.
-
-[NOTE]
-.Note
-====
-For example, consider a 4x3 window/surface that gets resized to be 3x4
-(taller than wider).
-On some window systems, the portion of the window/surface that was
-previously and still is visible (the 3x3 part) will contain the same
-contents as before, while the remaining parts of the window will have
-undefined: contents.
-Other window systems may: squash/stretch the image to fill the new window
-size without any undefined: contents, or apply some other mapping.
-====
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[open,refpage='vkAcquireNextImage2KHR',desc='Retrieve the index of the next available presentable image',type='protos']
---
-To acquire an available presentable image to use, and retrieve the index of
-that image, call:
-
-include::{generated}/api/protos/vkAcquireNextImage2KHR.txt[]
-
-  * pname:device is the device associated with pname:swapchain.
-  * pname:pAcquireInfo is a pointer to a slink:VkAcquireNextImageInfoKHR
-    structure containing parameters of the acquire.
-  * pname:pImageIndex is a pointer to a code:uint32_t that is set to the
-    index of the next image to use.
-
-.Valid Usage
-****
-  * [[VUID-vkAcquireNextImage2KHR-swapchain-01803]]
-    If the number of currently acquired images is greater than the
-    difference between the number of images in the pname:swapchain member of
-    pname:pAcquireInfo and the value of
-    slink:VkSurfaceCapabilitiesKHR::pname:minImageCount as returned by a
-    call to flink:vkGetPhysicalDeviceSurfaceCapabilities2KHR with the
-    pname:surface used to create pname:swapchain, the pname:timeout member
-    of pname:pAcquireInfo must: not be code:UINT64_MAX
-****
-
-include::{generated}/validity/protos/vkAcquireNextImage2KHR.txt[]
---
-
-[open,refpage='VkAcquireNextImageInfoKHR',desc='Structure specifying parameters of the acquire',type='structs']
---
-The sname:VkAcquireNextImageInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkAcquireNextImageInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:swapchain is a non-retired swapchain from which an image is
-    acquired.
-  * pname:timeout specifies how long the function waits, in nanoseconds, if
-    no image is available.
-  * pname:semaphore is dlink:VK_NULL_HANDLE or a semaphore to signal.
-  * pname:fence is dlink:VK_NULL_HANDLE or a fence to signal.
-  * pname:deviceMask is a mask of physical devices for which the swapchain
-    image will be ready to use when the semaphore or fence is signaled.
-
-If flink:vkAcquireNextImageKHR is used, the device mask is considered to
-include all physical devices in the logical device.
-
-[NOTE]
-.Note
-====
-flink:vkAcquireNextImage2KHR signals at most one semaphore, even if the
-application requests waiting for multiple physical devices to be ready via
-the pname:deviceMask.
-However, only a single physical device can: wait on that semaphore, since
-the semaphore becomes unsignaled when the wait succeeds.
-For other physical devices to wait for the image to be ready, it is
-necessary for the application to submit semaphore signal operation(s) to
-that first physical device to signal additional semaphore(s) after the wait
-succeeds, which the other physical device(s) can: wait upon.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkAcquireNextImageInfoKHR-swapchain-01675]]
-    pname:swapchain must: not be in the retired state
-  * [[VUID-VkAcquireNextImageInfoKHR-semaphore-01288]]
-    If pname:semaphore is not dlink:VK_NULL_HANDLE it must: be unsignaled
-  * [[VUID-VkAcquireNextImageInfoKHR-semaphore-01781]]
-    If pname:semaphore is not dlink:VK_NULL_HANDLE it must: not have any
-    uncompleted signal or wait operations pending
-  * [[VUID-VkAcquireNextImageInfoKHR-fence-01289]]
-    If pname:fence is not dlink:VK_NULL_HANDLE it must: be unsignaled and
-    must: not be associated with any other queue command that has not yet
-    completed execution on that queue
-  * [[VUID-VkAcquireNextImageInfoKHR-semaphore-01782]]
-    pname:semaphore and pname:fence must: not both be equal to
-    dlink:VK_NULL_HANDLE
-  * [[VUID-VkAcquireNextImageInfoKHR-deviceMask-01290]]
-    pname:deviceMask must: be a valid device mask
-  * [[VUID-VkAcquireNextImageInfoKHR-deviceMask-01291]]
-    pname:deviceMask must: not be zero
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-  * [[VUID-VkAcquireNextImageInfoKHR-semaphore-03266]]
-    pname:semaphore must: have a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_BINARY
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-****
-
-include::{generated}/validity/structs/VkAcquireNextImageInfoKHR.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-[open,refpage='vkQueuePresentKHR',desc='Queue an image for presentation',type='protos']
---
-After queueing all rendering commands and transitioning the image to the
-correct layout, to queue an image for presentation, call:
-
-include::{generated}/api/protos/vkQueuePresentKHR.txt[]
-
-  * pname:queue is a queue that is capable of presentation to the target
-    surface's platform on the same device as the image's swapchain.
-  * pname:pPresentInfo is a pointer to a slink:VkPresentInfoKHR structure
-    specifying parameters of the presentation.
-
-.Note
-[NOTE]
-====
-There is no requirement for an application to present images in the same
-order that they were acquired - applications can arbitrarily present any
-image that is currently acquired.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkQueuePresentKHR-pSwapchains-01292]]
-    Each element of pname:pSwapchains member of pname:pPresentInfo must: be
-    a swapchain that is created for a surface for which presentation is
-    supported from pname:queue as determined using a call to
-    fname:vkGetPhysicalDeviceSurfaceSupportKHR
-ifdef::VK_KHR_display_swapchain[]
-  * [[VUID-vkQueuePresentKHR-pSwapchains-01293]]
-    If more than one member of pname:pSwapchains was created from a display
-    surface, all display surfaces referenced that refer to the same display
-    must: use the same display mode
-endif::VK_KHR_display_swapchain[]
-  * [[VUID-vkQueuePresentKHR-pWaitSemaphores-01294]]
-    When a semaphore wait operation referring to a binary semaphore defined
-    by the elements of the pname:pWaitSemaphores member of
-    pname:pPresentInfo executes on pname:queue, there must: be no other
-    queues waiting on the same semaphore
-  * [[VUID-vkQueuePresentKHR-pWaitSemaphores-01295]]
-    All elements of the pname:pWaitSemaphores member of pname:pPresentInfo
-    must: be semaphores that are signaled, or have
-    <<synchronization-semaphores-signaling, semaphore signal operations>>
-    previously submitted for execution
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-  * [[VUID-vkQueuePresentKHR-pWaitSemaphores-03267]]
-    All elements of the pname:pWaitSemaphores member of pname:pPresentInfo
-    must: be created with a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_BINARY
-  * [[VUID-vkQueuePresentKHR-pWaitSemaphores-03268]]
-    All elements of the pname:pWaitSemaphores member of pname:pPresentInfo
-    must: reference a semaphore signal operation that has been submitted for
-    execution and any semaphore signal operations on which it depends (if
-    any) must: have also been submitted for execution
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-****
-
-Any writes to memory backing the images referenced by the
-pname:pImageIndices and pname:pSwapchains members of pname:pPresentInfo,
-that are available before flink:vkQueuePresentKHR is executed, are
-automatically made visible to the read access performed by the presentation
-engine.
-This automatic visibility operation for an image happens-after the semaphore
-signal operation, and happens-before the presentation engine accesses the
-image.
-
-Queueing an image for presentation defines a set of _queue operations_,
-including waiting on the semaphores and submitting a presentation request to
-the presentation engine.
-However, the scope of this set of queue operations does not include the
-actual processing of the image by the presentation engine.
-
-.Note
-[NOTE]
-====
-The origin of the native orientation of the surface coordinate system is not
-specified in the Vulkan specification; it depends on the platform.
-For most platforms the origin is by default upper-left, meaning the pixel of
-the presented slink:VkImage at coordinates [eq]#(0,0)# would appear at the
-upper left pixel of the platform surface (assuming
-ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, and the display standing the
-right way up).
-====
-
-If fname:vkQueuePresentKHR fails to enqueue the corresponding set of queue
-operations, it may: return ename:VK_ERROR_OUT_OF_HOST_MEMORY or
-ename:VK_ERROR_OUT_OF_DEVICE_MEMORY.
-If it does, the implementation must: ensure that the state and contents of
-any resources or synchronization primitives referenced is unaffected by the
-call or its failure.
-
-If fname:vkQueuePresentKHR fails in such a way that the implementation is
-unable to make that guarantee, the implementation must: return
-ename:VK_ERROR_DEVICE_LOST.
-
-However, if the presentation request is rejected by the presentation engine
-with an error ename:VK_ERROR_OUT_OF_DATE_KHR,
-ifdef::VK_EXT_full_screen_exclusive[]
-ename:VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT,
-endif::VK_EXT_full_screen_exclusive[]
-or ename:VK_ERROR_SURFACE_LOST_KHR, the set of queue operations are still
-considered to be enqueued and thus any semaphore wait operation specified in
-slink:VkPresentInfoKHR will execute when the corresponding queue operation
-is complete.
-
-Calls to fname:vkQueuePresentKHR may: block, but must: return in finite
-time.
-
-ifdef::VK_EXT_full_screen_exclusive[]
-If any pname:swapchain member of pname:pPresentInfo was created with
-ename:VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT,
-ename:VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT will be returned if that
-swapchain does not have exclusive full-screen access, possibly for
-implementation-specific reasons outside of the application's control.
-endif::VK_EXT_full_screen_exclusive[]
-
-include::{generated}/validity/protos/vkQueuePresentKHR.txt[]
---
-
-[open,refpage='VkPresentInfoKHR',desc='Structure describing parameters of a queue presentation',type='structs']
---
-The sname:VkPresentInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkPresentInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:waitSemaphoreCount is the number of semaphores to wait for before
-    issuing the present request.
-    The number may: be zero.
-  * pname:pWaitSemaphores is `NULL` or a pointer to an array of
-    slink:VkSemaphore objects with pname:waitSemaphoreCount entries, and
-    specifies the semaphores to wait for before issuing the present request.
-  * pname:swapchainCount is the number of swapchains being presented to by
-    this command.
-  * pname:pSwapchains is a pointer to an array of slink:VkSwapchainKHR
-    objects with pname:swapchainCount entries.
-    A given swapchain must: not appear in this list more than once.
-  * pname:pImageIndices is a pointer to an array of indices into the array
-    of each swapchain's presentable images, with pname:swapchainCount
-    entries.
-    Each entry in this array identifies the image to present on the
-    corresponding entry in the pname:pSwapchains array.
-  * pname:pResults is a pointer to an array of elink:VkResult typed elements
-    with pname:swapchainCount entries.
-    Applications that do not need per-swapchain results can: use `NULL` for
-    pname:pResults.
-    If non-`NULL`, each entry in pname:pResults will be set to the
-    elink:VkResult for presenting the swapchain corresponding to the same
-    index in pname:pSwapchains.
-
-Before an application can: present an image, the image's layout must: be
-transitioned to the ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
-ifdef::VK_KHR_shared_presentable_image[]
-layout, or for a shared presentable image the
-ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR
-endif::VK_KHR_shared_presentable_image[]
-layout.
-
-.Note
-[NOTE]
-====
-When transitioning the image to
-ifdef::VK_KHR_shared_presentable_image[]
-ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR or
-endif::VK_KHR_shared_presentable_image[]
-ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, there is no need to delay subsequent
-processing, or perform any visibility operations (as flink:vkQueuePresentKHR
-performs automatic visibility operations).
-To achieve this, the pname:dstAccessMask member of the
-slink:VkImageMemoryBarrier should: be set to `0`, and the pname:dstStageMask
-parameter should: be set to ename:VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT.
-====
-
-.Valid Usage
-****
-ifndef::VK_KHR_shared_presentable_image[]
-  * [[VUID-VkPresentInfoKHR-pImageIndices-01296]]
-    Each element of pname:pImageIndices must: be the index of a presentable
-    image acquired from the swapchain specified by the corresponding element
-    of the pname:pSwapchains array, and the presented image subresource
-    must: be in the ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR layout at the time
-    the operation is executed on a sname:VkDevice
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_KHR_shared_presentable_image[]
-  * [[VUID-VkPresentInfoKHR-pImageIndices-01430]]
-    Each element of pname:pImageIndices must: be the index of a presentable
-    image acquired from the swapchain specified by the corresponding element
-    of the pname:pSwapchains array, and the presented image subresource
-    must: be in the ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR or
-    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR layout at the time the
-    operation is executed on a sname:VkDevice
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_KHR_present_id[]
-  * [[VUID-VkPresentInfoKHR-pNext-06235]]
-    If a slink:VkPresentIdKHR structure is included in the pname:pNext
-    chain, and the <<features-presentId, pname:presentId>> feature is not
-    enabled, each pname:presentIds entry in that structure must: be NULL
-endif::VK_KHR_present_id[]
-****
-
-include::{generated}/validity/structs/VkPresentInfoKHR.txt[]
---
-
-ifdef::VK_KHR_incremental_present[]
-include::{chapters}/VK_KHR_incremental_present/wsi.txt[]
-endif::VK_KHR_incremental_present[]
-
-ifdef::VK_KHR_display_swapchain[]
-include::{chapters}/VK_KHR_display_swapchain/display_swapchain_present.txt[]
-endif::VK_KHR_display_swapchain[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[open,refpage='VkDeviceGroupPresentInfoKHR',desc='Mode and mask controlling which physical devices\' images are presented',type='structs']
---
-If the pname:pNext chain of slink:VkPresentInfoKHR includes a
-sname:VkDeviceGroupPresentInfoKHR structure, then that structure includes an
-array of device masks and a device group present mode.
-
-The sname:VkDeviceGroupPresentInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkDeviceGroupPresentInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:swapchainCount is zero or the number of elements in
-    pname:pDeviceMasks.
-  * pname:pDeviceMasks is a pointer to an array of device masks, one for
-    each element of slink:VkPresentInfoKHR::pSwapchains.
-  * pname:mode is a elink:VkDeviceGroupPresentModeFlagBitsKHR value
-    specifying the device group present mode that will be used for this
-    present.
-
-If pname:mode is ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR, then each
-element of pname:pDeviceMasks selects which instance of the swapchain image
-is presented.
-Each element of pname:pDeviceMasks must: have exactly one bit set, and the
-corresponding physical device must: have a presentation engine as reported
-by slink:VkDeviceGroupPresentCapabilitiesKHR.
-
-If pname:mode is ename:VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR, then
-each element of pname:pDeviceMasks selects which instance of the swapchain
-image is presented.
-Each element of pname:pDeviceMasks must: have exactly one bit set, and some
-physical device in the logical device must: include that bit in its
-slink:VkDeviceGroupPresentCapabilitiesKHR::pname:presentMask.
-
-If pname:mode is ename:VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR, then each
-element of pname:pDeviceMasks selects which instances of the swapchain image
-are component-wise summed and the sum of those images is presented.
-If the sum in any component is outside the representable range, the value of
-that component is undefined:.
-Each element of pname:pDeviceMasks must: have a value for which all set bits
-are set in one of the elements of
-slink:VkDeviceGroupPresentCapabilitiesKHR::pname:presentMask.
-
-If pname:mode is
-ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR, then each
-element of pname:pDeviceMasks selects which instance(s) of the swapchain
-images are presented.
-For each bit set in each element of pname:pDeviceMasks, the corresponding
-physical device must: have a presentation engine as reported by
-slink:VkDeviceGroupPresentCapabilitiesKHR.
-
-If sname:VkDeviceGroupPresentInfoKHR is not provided or pname:swapchainCount
-is zero then the masks are considered to be `1`.
-If sname:VkDeviceGroupPresentInfoKHR is not provided, pname:mode is
-considered to be ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR.
-
-.Valid Usage
-****
-  * [[VUID-VkDeviceGroupPresentInfoKHR-swapchainCount-01297]]
-    pname:swapchainCount must: equal `0` or
-    slink:VkPresentInfoKHR::pname:swapchainCount
-  * [[VUID-VkDeviceGroupPresentInfoKHR-mode-01298]]
-    If pname:mode is ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR, then
-    each element of pname:pDeviceMasks must: have exactly one bit set, and
-    the corresponding element of
-    slink:VkDeviceGroupPresentCapabilitiesKHR::pname:presentMask must: be
-    non-zero
-  * [[VUID-VkDeviceGroupPresentInfoKHR-mode-01299]]
-    If pname:mode is ename:VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR, then
-    each element of pname:pDeviceMasks must: have exactly one bit set, and
-    some physical device in the logical device must: include that bit in its
-    slink:VkDeviceGroupPresentCapabilitiesKHR::pname:presentMask
-  * [[VUID-VkDeviceGroupPresentInfoKHR-mode-01300]]
-    If pname:mode is ename:VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR, then
-    each element of pname:pDeviceMasks must: have a value for which all set
-    bits are set in one of the elements of
-    slink:VkDeviceGroupPresentCapabilitiesKHR::pname:presentMask
-  * [[VUID-VkDeviceGroupPresentInfoKHR-mode-01301]]
-    If pname:mode is
-    ename:VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR, then for
-    each bit set in each element of pname:pDeviceMasks, the corresponding
-    element of slink:VkDeviceGroupPresentCapabilitiesKHR::pname:presentMask
-    must: be non-zero
-  * [[VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-01302]]
-    The value of each element of pname:pDeviceMasks must: be equal to the
-    device mask passed in slink:VkAcquireNextImageInfoKHR::pname:deviceMask
-    when the image index was last acquired
-  * [[VUID-VkDeviceGroupPresentInfoKHR-mode-01303]]
-    pname:mode must: have exactly one bit set, and that bit must: have been
-    included in slink:VkDeviceGroupSwapchainCreateInfoKHR::pname:modes
-****
-
-include::{generated}/validity/structs/VkDeviceGroupPresentInfoKHR.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-ifdef::VK_GOOGLE_display_timing[]
-include::{chapters}/VK_GOOGLE_display_timing/PresentTimeInfo.txt[]
-endif::VK_GOOGLE_display_timing[]
-ifdef::VK_KHR_present_id[]
-include::PresentId.txt[]
-endif::VK_KHR_present_id[]
-
-ifdef::VK_GGP_frame_token[]
-include::{chapters}/VK_GGP_frame_token.txt[]
-endif::VK_GGP_frame_token[]
-
-fname:vkQueuePresentKHR, releases the acquisition of the images referenced
-by pname:imageIndices.
-The queue family corresponding to the queue fname:vkQueuePresentKHR is
-executed on must: have ownership of the presented images as defined in
-<<resources-sharing,Resource Sharing>>.
-fname:vkQueuePresentKHR does not alter the queue family ownership, but the
-presented images must: not be used again before they have been reacquired
-using fname:vkAcquireNextImageKHR.
-
-The processing of the presentation happens in issue order with other queue
-operations, but semaphores have to be used to ensure that prior rendering
-and other commands in the specified queue complete before the presentation
-begins.
-The presentation command itself does not delay processing of subsequent
-commands on the queue, however, presentation requests sent to a particular
-queue are always performed in order.
-Exact presentation timing is controlled by the semantics of the presentation
-engine and native platform in use.
-
-ifdef::VK_KHR_display_swapchain[]
-include::{chapters}/VK_KHR_display_swapchain/queue_present_interactions.txt[]
-endif::VK_KHR_display_swapchain[]
-
-The result codes ename:VK_ERROR_OUT_OF_DATE_KHR and ename:VK_SUBOPTIMAL_KHR
-have the same meaning when returned by fname:vkQueuePresentKHR as they do
-when returned by fname:vkAcquireNextImageKHR.
-If multiple swapchains are presented, the result code is determined applying
-the following rules in order:
-
-  * If the device is lost, ename:VK_ERROR_DEVICE_LOST is returned.
-  * If any of the target surfaces are no longer available the error
-    ename:VK_ERROR_SURFACE_LOST_KHR is returned.
-  * If any of the presents would have a result of
-    ename:VK_ERROR_OUT_OF_DATE_KHR if issued separately then
-    ename:VK_ERROR_OUT_OF_DATE_KHR is returned.
-ifdef::VK_EXT_full_screen_exclusive[]
-  * If any of the presents would have a result of
-    ename:VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT if issued separately
-    then ename:VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT is returned.
-endif::VK_EXT_full_screen_exclusive[]
-  * If any of the presents would have a result of ename:VK_SUBOPTIMAL_KHR if
-    issued separately then ename:VK_SUBOPTIMAL_KHR is returned.
-  * Otherwise ename:VK_SUCCESS is returned.
-
-Presentation is a read-only operation that will not affect the content of
-the presentable images.
-Upon reacquiring the image and transitioning it away from the
-ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR layout, the contents will be the same
-as they were prior to transitioning the image to the present source layout
-and presenting it.
-However, if a mechanism other than Vulkan is used to modify the platform
-window associated with the swapchain, the content of all presentable images
-in the swapchain becomes undefined:.
-
-[NOTE]
-.Note
-====
-The application can: continue to present any acquired images from a retired
-swapchain as long as the swapchain has not entered a state that causes
-flink:vkQueuePresentKHR to return ename:VK_ERROR_OUT_OF_DATE_KHR.
-====
-
-ifdef::VK_EXT_hdr_metadata[]
-include::{chapters}/VK_EXT_hdr_metadata.txt[]
-endif::VK_EXT_hdr_metadata[]
diff --git a/registry/vulkan/chapters/VK_KHR_wayland_surface/platformCreateSurface_wayland.txt b/registry/vulkan/chapters/VK_KHR_wayland_surface/platformCreateSurface_wayland.txt
deleted file mode 100644
index 7f8b24a..0000000
--- a/registry/vulkan/chapters/VK_KHR_wayland_surface/platformCreateSurface_wayland.txt
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformCreateSurface_wayland,platformCreateSurface_wayland]]
-=== Wayland Platform
-
-[open,refpage='vkCreateWaylandSurfaceKHR',desc='Create a slink:VkSurfaceKHR object for a Wayland window',type='protos']
---
-To create a sname:VkSurfaceKHR object for a Wayland surface, call:
-
-include::{generated}/api/protos/vkCreateWaylandSurfaceKHR.txt[]
-
-  * pname:instance is the instance to associate the surface with.
-  * pname:pCreateInfo is a pointer to a slink:VkWaylandSurfaceCreateInfoKHR
-    structure containing parameters affecting the creation of the surface
-    object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a slink:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-include::{generated}/validity/protos/vkCreateWaylandSurfaceKHR.txt[]
---
-
-[open,refpage='VkWaylandSurfaceCreateInfoKHR',desc='Structure specifying parameters of a newly created Wayland surface object',type='structs']
---
-The sname:VkWaylandSurfaceCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkWaylandSurfaceCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:display and pname:surface are pointers to the Wayland
-    code:wl_display and code:wl_surface to associate the surface with.
-
-.Valid Usage
-****
-  * [[VUID-VkWaylandSurfaceCreateInfoKHR-display-01304]]
-    pname:display must: point to a valid Wayland code:wl_display
-  * [[VUID-VkWaylandSurfaceCreateInfoKHR-surface-01305]]
-    pname:surface must: point to a valid Wayland code:wl_surface
-****
-
-include::{generated}/validity/structs/VkWaylandSurfaceCreateInfoKHR.txt[]
---
-
-On Wayland, pname:currentExtent is the special value [eq]#(0xFFFFFFFF,
-0xFFFFFFFF)#, indicating that the surface size will be determined by the
-extent of a swapchain targeting the surface.
-Whatever the application sets a swapchain's pname:imageExtent to will be the
-size of the window, after the first image is presented.
-pname:minImageExtent is [eq]#(1,1)#, and pname:maxImageExtent is the maximum
-supported surface size.
-Any calls to flink:vkGetPhysicalDeviceSurfacePresentModesKHR on a surface
-created with fname:vkCreateWaylandSurfaceKHR are required: to return
-ename:VK_PRESENT_MODE_MAILBOX_KHR as one of the valid present modes.
-
-Some Vulkan functions may: send protocol over the specified code:wl_display
-connection when using a swapchain or presentable images created from a
-sname:VkSurfaceKHR referring to a code:wl_surface.
-Applications must: therefore ensure that both the code:wl_display and the
-code:wl_surface remain valid for the lifetime of any sname:VkSwapchainKHR
-objects created from a particular code:wl_display and code:wl_surface.
-Also, calling flink:vkQueuePresentKHR will result in Vulkan sending
-code:wl_surface.commit requests to the underlying code:wl_surface of each
-sname:VkSwapchainKHR objects referenced by pname:pPresentInfo.
-If the swapchain is created with a present mode of
-ename:VK_PRESENT_MODE_MAILBOX_KHR or ename:VK_PRESENT_MODE_IMMEDIATE_KHR,
-then the corresponding code:wl_surface.attach, code:wl_surface.damage, and
-code:wl_surface.commit request must: be issued by the implementation during
-the call to flink:vkQueuePresentKHR and must: not be issued by the
-implementation outside of flink:vkQueuePresentKHR.
-This ensures that any Wayland requests sent by the client after the call to
-flink:vkQueuePresentKHR returns will be received by the compositor after the
-code:wl_surface.commit.
-Regardless of the mode of swapchain creation, a new code:wl_event_queue
-must: be created for each successful flink:vkCreateWaylandSurfaceKHR call,
-and every Wayland object created by the implementation must: be assigned to
-this event queue.
-If the platform provides Wayland 1.11 or greater, this must: be implemented
-by the use of Wayland proxy object wrappers, to avoid race conditions.
-
-If the application wishes to synchronize any window changes with a
-particular frame, such requests must: be sent to the Wayland display server
-prior to calling flink:vkQueuePresentKHR.
-For full control over interactions between Vulkan rendering and other
-Wayland protocol requests and events, a present mode of
-ename:VK_PRESENT_MODE_MAILBOX_KHR should: be used.
-
-[open,refpage='VkWaylandSurfaceCreateFlagsKHR',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkWaylandSurfaceCreateFlagsKHR.txt[]
-
-tname:VkWaylandSurfaceCreateFlagsKHR is a bitmask type for setting a mask,
-but is currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_KHR_wayland_surface/platformQuerySupport_wayland.txt b/registry/vulkan/chapters/VK_KHR_wayland_surface/platformQuerySupport_wayland.txt
deleted file mode 100644
index b86bb0c..0000000
--- a/registry/vulkan/chapters/VK_KHR_wayland_surface/platformQuerySupport_wayland.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformQuerySupport_walyand,platformQuerySupport_walyand]]
-
-=== Wayland Platform
-
-[open,refpage='vkGetPhysicalDeviceWaylandPresentationSupportKHR',desc='Query physical device for presentation to Wayland',type='protos']
---
-To determine whether a queue family of a physical device supports
-presentation to a Wayland compositor, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceWaylandPresentationSupportKHR.txt[]
-
-  * pname:physicalDevice is the physical device.
-  * pname:queueFamilyIndex is the queue family index.
-  * pname:display is a pointer to the code:wl_display associated with a
-    Wayland compositor.
-
-This platform-specific function can: be called prior to creating a surface.
-
-.Valid Usage
-****
-  * [[VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-queueFamilyIndex-01306]]
-    pname:queueFamilyIndex must: be less than
-    pname:pQueueFamilyPropertyCount returned by
-    fname:vkGetPhysicalDeviceQueueFamilyProperties for the given
-    pname:physicalDevice
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceWaylandPresentationSupportKHR.txt[]
---
diff --git a/registry/vulkan/chapters/VK_KHR_win32_surface/platformCreateSurface_win32.txt b/registry/vulkan/chapters/VK_KHR_win32_surface/platformCreateSurface_win32.txt
deleted file mode 100644
index c1c3701..0000000
--- a/registry/vulkan/chapters/VK_KHR_win32_surface/platformCreateSurface_win32.txt
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformCreateSurface_win32,platformCreateSurface_win32]]
-
-=== Win32 Platform
-
-[open,refpage='vkCreateWin32SurfaceKHR',desc='Create a VkSurfaceKHR object for an Win32 native window',type='protos']
---
-To create a sname:VkSurfaceKHR object for a Win32 window, call:
-
-include::{generated}/api/protos/vkCreateWin32SurfaceKHR.txt[]
-
-  * pname:instance is the instance to associate the surface with.
-  * pname:pCreateInfo is a pointer to a sname:VkWin32SurfaceCreateInfoKHR
-    structure containing parameters affecting the creation of the surface
-    object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a slink:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-include::{generated}/validity/protos/vkCreateWin32SurfaceKHR.txt[]
---
-
-[open,refpage='VkWin32SurfaceCreateInfoKHR',desc='Structure specifying parameters of a newly created Win32 surface object',type='structs']
---
-The sname:VkWin32SurfaceCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkWin32SurfaceCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:hinstance is the Win32 code:HINSTANCE for the window to associate
-    the surface with.
-  * pname:hwnd is the Win32 code:HWND for the window to associate the
-    surface with.
-
-.Valid Usage
-****
-  * [[VUID-VkWin32SurfaceCreateInfoKHR-hinstance-01307]]
-    pname:hinstance must: be a valid Win32 code:HINSTANCE
-  * [[VUID-VkWin32SurfaceCreateInfoKHR-hwnd-01308]]
-    pname:hwnd must: be a valid Win32 code:HWND
-****
-
-include::{generated}/validity/structs/VkWin32SurfaceCreateInfoKHR.txt[]
---
-
-With Win32, pname:minImageExtent, pname:maxImageExtent, and
-pname:currentExtent must: always equal the window size.
-
-The pname:currentExtent of a Win32 surface must: have both pname:width and
-pname:height greater than 0, or both of them 0.
-
-[NOTE]
-.Note
-====
-Due to above restrictions, it is only possible to create a new swapchain on
-this platform with pname:imageExtent being equal to the current size of the
-window.
-
-The window size may: become [eq]#(0, 0)# on this platform (e.g. when the
-window is minimized), and so a swapchain cannot: be created until the size
-changes.
-====
-
-[open,refpage='VkWin32SurfaceCreateFlagsKHR',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkWin32SurfaceCreateFlagsKHR.txt[]
-
-tname:VkWin32SurfaceCreateFlagsKHR is a bitmask type for setting a mask, but
-is currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_KHR_win32_surface/platformQuerySupport_win32.txt b/registry/vulkan/chapters/VK_KHR_win32_surface/platformQuerySupport_win32.txt
deleted file mode 100644
index b6a4478..0000000
--- a/registry/vulkan/chapters/VK_KHR_win32_surface/platformQuerySupport_win32.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformQuerySupport_win32,platformQuerySupport_win32]]
-=== Win32 Platform
-
-[open,refpage='vkGetPhysicalDeviceWin32PresentationSupportKHR',desc='Query queue family support for presentation on a Win32 display',type='protos']
---
-To determine whether a queue family of a physical device supports
-presentation to the Microsoft Windows desktop, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceWin32PresentationSupportKHR.txt[]
-
-  * pname:physicalDevice is the physical device.
-  * pname:queueFamilyIndex is the queue family index.
-
-This platform-specific function can: be called prior to creating a surface.
-
-.Valid Usage
-****
-  * [[VUID-vkGetPhysicalDeviceWin32PresentationSupportKHR-queueFamilyIndex-01309]]
-    pname:queueFamilyIndex must: be less than
-    pname:pQueueFamilyPropertyCount returned by
-    fname:vkGetPhysicalDeviceQueueFamilyProperties for the given
-    pname:physicalDevice
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceWin32PresentationSupportKHR.txt[]
---
diff --git a/registry/vulkan/chapters/VK_KHR_xcb_surface/platformCreateSurface_xcb.txt b/registry/vulkan/chapters/VK_KHR_xcb_surface/platformCreateSurface_xcb.txt
deleted file mode 100644
index 63fd10a..0000000
--- a/registry/vulkan/chapters/VK_KHR_xcb_surface/platformCreateSurface_xcb.txt
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformCreateSurface_xcb,platformCreateSurface_xcb]]
-=== XCB Platform
-
-[open,refpage='vkCreateXcbSurfaceKHR',desc='Create a slink:VkSurfaceKHR object for a X11 window, using the XCB client-side library',type='protos']
---
-To create a sname:VkSurfaceKHR object for an X11 window, using the XCB
-client-side library, call:
-
-include::{generated}/api/protos/vkCreateXcbSurfaceKHR.txt[]
-
-  * pname:instance is the instance to associate the surface with.
-  * pname:pCreateInfo is a pointer to a sname:VkXcbSurfaceCreateInfoKHR
-    structure containing parameters affecting the creation of the surface
-    object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a slink:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-include::{generated}/validity/protos/vkCreateXcbSurfaceKHR.txt[]
---
-
-[open,refpage='VkXcbSurfaceCreateInfoKHR',desc='Structure specifying parameters of a newly created Xcb surface object',type='structs']
---
-The sname:VkXcbSurfaceCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkXcbSurfaceCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:connection is a pointer to an code:xcb_connection_t to the X
-    server.
-  * pname:window is the code:xcb_window_t for the X11 window to associate
-    the surface with.
-
-.Valid Usage
-****
-  * [[VUID-VkXcbSurfaceCreateInfoKHR-connection-01310]]
-    pname:connection must: point to a valid X11 code:xcb_connection_t
-  * [[VUID-VkXcbSurfaceCreateInfoKHR-window-01311]]
-    pname:window must: be a valid X11 code:xcb_window_t
-****
-
-include::{generated}/validity/structs/VkXcbSurfaceCreateInfoKHR.txt[]
---
-
-With Xcb, pname:minImageExtent, pname:maxImageExtent, and
-pname:currentExtent must: always equal the window size.
-
-The pname:currentExtent of an Xcb surface must: have both pname:width and
-pname:height greater than 0, or both of them 0.
-
-[NOTE]
-.Note
-====
-Due to above restrictions, it is only possible to create a new swapchain on
-this platform with pname:imageExtent being equal to the current size of the
-window.
-
-The window size may: become [eq]#(0, 0)# on this platform (e.g. when the
-window is minimized), and so a swapchain cannot: be created until the size
-changes.
-====
-
-Some Vulkan functions may: send protocol over the specified xcb connection
-when using a swapchain or presentable images created from a
-slink:VkSurfaceKHR referring to an xcb window.
-Applications must: therefore ensure the xcb connection is available to
-Vulkan for the duration of any functions that manipulate such swapchains or
-their presentable images, and any functions that build or queue command
-buffers that operate on such presentable images.
-Specifically, applications using Vulkan with xcb-based swapchains must:
-
-  * Avoid holding a server grab on an xcb connection while waiting for
-    Vulkan operations to complete using a swapchain derived from a different
-    xcb connection referring to the same X server instance.
-    Failing to do so may: result in deadlock.
-
-[open,refpage='VkXcbSurfaceCreateFlagsKHR',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkXcbSurfaceCreateFlagsKHR.txt[]
-
-tname:VkXcbSurfaceCreateFlagsKHR is a bitmask type for setting a mask, but
-is currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_KHR_xcb_surface/platformQuerySupport_xcb.txt b/registry/vulkan/chapters/VK_KHR_xcb_surface/platformQuerySupport_xcb.txt
deleted file mode 100644
index d56a635..0000000
--- a/registry/vulkan/chapters/VK_KHR_xcb_surface/platformQuerySupport_xcb.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformQuerySupport_xcb,platformQuerySupport_xcb]]
-=== XCB Platform
-
-[open,refpage='vkGetPhysicalDeviceXcbPresentationSupportKHR',desc='Query physical device for presentation to X11 server using XCB',type='protos']
---
-To determine whether a queue family of a physical device supports
-presentation to an X11 server, using the XCB client-side library, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceXcbPresentationSupportKHR.txt[]
-
-  * pname:physicalDevice is the physical device.
-  * pname:queueFamilyIndex is the queue family index.
-  * pname:connection is a pointer to an code:xcb_connection_t to the X
-    server.
-  * pname:visual_id is an X11 visual (code:xcb_visualid_t).
-
-This platform-specific function can: be called prior to creating a surface.
-
-.Valid Usage
-****
-  * [[VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-queueFamilyIndex-01312]]
-    pname:queueFamilyIndex must: be less than
-    pname:pQueueFamilyPropertyCount returned by
-    fname:vkGetPhysicalDeviceQueueFamilyProperties for the given
-    pname:physicalDevice
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceXcbPresentationSupportKHR.txt[]
---
diff --git a/registry/vulkan/chapters/VK_KHR_xlib_surface/platformCreateSurface_xlib.txt b/registry/vulkan/chapters/VK_KHR_xlib_surface/platformCreateSurface_xlib.txt
deleted file mode 100644
index 2f2ecd4..0000000
--- a/registry/vulkan/chapters/VK_KHR_xlib_surface/platformCreateSurface_xlib.txt
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformCreateSurface_xlib,platformCreateSurface_xlib]]
-=== Xlib Platform
-
-[open,refpage='vkCreateXlibSurfaceKHR',desc='Create a slink:VkSurfaceKHR object for an X11 window, using the Xlib client-side library',type='protos']
---
-To create a sname:VkSurfaceKHR object for an X11 window, using the Xlib
-client-side library, call:
-
-include::{generated}/api/protos/vkCreateXlibSurfaceKHR.txt[]
-
-  * pname:instance is the instance to associate the surface with.
-  * pname:pCreateInfo is a pointer to a sname:VkXlibSurfaceCreateInfoKHR
-    structure containing the parameters affecting the creation of the
-    surface object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a slink:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-include::{generated}/validity/protos/vkCreateXlibSurfaceKHR.txt[]
---
-
-[open,refpage='VkXlibSurfaceCreateInfoKHR',desc='Structure specifying parameters of a newly created Xlib surface object',type='structs']
---
-
-The sname:VkXlibSurfaceCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkXlibSurfaceCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:dpy is a pointer to an Xlib code:Display connection to the X
-    server.
-  * pname:window is an Xlib code:Window to associate the surface with.
-
-.Valid Usage
-****
-  * [[VUID-VkXlibSurfaceCreateInfoKHR-dpy-01313]]
-    pname:dpy must: point to a valid Xlib code:Display
-  * [[VUID-VkXlibSurfaceCreateInfoKHR-window-01314]]
-    pname:window must: be a valid Xlib code:Window
-****
-
-include::{generated}/validity/structs/VkXlibSurfaceCreateInfoKHR.txt[]
---
-
-With Xlib, pname:minImageExtent, pname:maxImageExtent, and
-pname:currentExtent must: always equal the window size.
-
-The pname:currentExtent of an Xlib surface must: have both pname:width and
-pname:height greater than 0, or both of them 0.
-
-[NOTE]
-.Note
-====
-Due to above restrictions, it is only possible to create a new swapchain on
-this platform with pname:imageExtent being equal to the current size of the
-window.
-
-The window size may: become [eq]#(0, 0)# on this platform (e.g. when the
-window is minimized), and so a swapchain cannot: be created until the size
-changes.
-====
-
-Some Vulkan functions may: send protocol over the specified Xlib
-code:Display connection when using a swapchain or presentable images created
-from a slink:VkSurfaceKHR referring to an Xlib window.
-Applications must: therefore ensure the display connection is available to
-Vulkan for the duration of any functions that manipulate such swapchains or
-their presentable images, and any functions that build or queue command
-buffers that operate on such presentable images.
-Specifically, applications using Vulkan with Xlib-based swapchains must:
-
-  * Avoid holding a server grab on a display connection while waiting for
-    Vulkan operations to complete using a swapchain derived from a different
-    display connection referring to the same X server instance.
-    Failing to do so may: result in deadlock.
-
-Some implementations may require threads to implement some presentation
-modes so applications must: call code:XInitThreads() before calling any
-other Xlib functions.
-
-[open,refpage='VkXlibSurfaceCreateFlagsKHR',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkXlibSurfaceCreateFlagsKHR.txt[]
-
-tname:VkXlibSurfaceCreateFlagsKHR is a bitmask type for setting a mask, but
-is currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_KHR_xlib_surface/platformQuerySupport_xlib.txt b/registry/vulkan/chapters/VK_KHR_xlib_surface/platformQuerySupport_xlib.txt
deleted file mode 100644
index 6e97e54..0000000
--- a/registry/vulkan/chapters/VK_KHR_xlib_surface/platformQuerySupport_xlib.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformQuerySupport_xlib,platformQuerySupport_xlib]]
-=== Xlib Platform
-
-[open,refpage='vkGetPhysicalDeviceXlibPresentationSupportKHR',desc='Query physical device for presentation to X11 server using Xlib',type='protos']
---
-To determine whether a queue family of a physical device supports
-presentation to an X11 server, using the Xlib client-side library, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceXlibPresentationSupportKHR.txt[]
-
-  * pname:physicalDevice is the physical device.
-  * pname:queueFamilyIndex is the queue family index.
-  * pname:dpy is a pointer to an Xlib code:Display connection to the server.
-  * pname:visualId is an X11 visual (code:VisualID).
-
-This platform-specific function can: be called prior to creating a surface.
-
-.Valid Usage
-****
-  * [[VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-queueFamilyIndex-01315]]
-    pname:queueFamilyIndex must: be less than
-    pname:pQueueFamilyPropertyCount returned by
-    fname:vkGetPhysicalDeviceQueueFamilyProperties for the given
-    pname:physicalDevice
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceXlibPresentationSupportKHR.txt[]
---
diff --git a/registry/vulkan/chapters/VK_MVK_ios_surface/platformCreateSurface_ios.txt b/registry/vulkan/chapters/VK_MVK_ios_surface/platformCreateSurface_ios.txt
deleted file mode 100644
index a6d5db5..0000000
--- a/registry/vulkan/chapters/VK_MVK_ios_surface/platformCreateSurface_ios.txt
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) 2018-2020 The Brenwill Workshop Ltd.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformCreateSurface_ios,platformCreateSurface_ios]]
-=== iOS Platform
-
-[open,refpage='vkCreateIOSSurfaceMVK',desc='Create a VkSurfaceKHR object for an iOS UIView',type='protos']
---
-To create a sname:VkSurfaceKHR object for an iOS code:UIView or
-basetype:CAMetalLayer, call:
-
-include::{generated}/api/protos/vkCreateIOSSurfaceMVK.txt[]
-
-ifdef::VK_EXT_metal_surface[]
-[NOTE]
-.Note
-====
-The `vkCreateIOSSurfaceMVK` function is considered deprecated and has been
-superseded by flink:vkCreateMetalSurfaceEXT from the
-`apiext:VK_EXT_metal_surface` extension.
-====
-endif::VK_EXT_metal_surface[]
-
-  * pname:instance is the instance with which to associate the surface.
-  * pname:pCreateInfo is a pointer to a slink:VkIOSSurfaceCreateInfoMVK
-    structure containing parameters affecting the creation of the surface
-    object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a slink:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-include::{generated}/validity/protos/vkCreateIOSSurfaceMVK.txt[]
---
-
-[open,refpage='VkIOSSurfaceCreateInfoMVK',desc='Structure specifying parameters of a newly created iOS surface object',type='structs']
---
-The slink:VkIOSSurfaceCreateInfoMVK structure is defined as:
-
-include::{generated}/api/structs/VkIOSSurfaceCreateInfoMVK.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:pView is a reference to either a basetype:CAMetalLayer object or a
-    code:UIView object.
-
-.Valid Usage
-****
-  * [[VUID-VkIOSSurfaceCreateInfoMVK-pView-04143]]
-    If pname:pView is a basetype:CAMetalLayer object, it must: be a valid
-    basetype:CAMetalLayer
-  * [[VUID-VkIOSSurfaceCreateInfoMVK-pView-01316]]
-    If pname:pView is a code:UIView object, it must: be a valid code:UIView,
-    must: be backed by a code:CALayer object of type basetype:CAMetalLayer,
-    and flink:vkCreateIOSSurfaceMVK must: be called on the main thread
-****
-
-include::{generated}/validity/structs/VkIOSSurfaceCreateInfoMVK.txt[]
---
-
-[open,refpage='VkIOSSurfaceCreateFlagsMVK',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkIOSSurfaceCreateFlagsMVK.txt[]
-
-tname:VkIOSSurfaceCreateFlagsMVK is a bitmask type for setting a mask, but
-is currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_MVK_ios_surface/platformQuerySupport_ios.txt b/registry/vulkan/chapters/VK_MVK_ios_surface/platformQuerySupport_ios.txt
deleted file mode 100644
index 18ba39d..0000000
--- a/registry/vulkan/chapters/VK_MVK_ios_surface/platformQuerySupport_ios.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2018-2020 The Brenwill Workshop Ltd.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformQuerySupport_ios,platformQuerySupport_ios]]
-=== iOS Platform
-
-On iOS, all physical devices and queue families must: be capable of
-presentation with any layer.
-As a result there is no iOS-specific query for these capabilities.
diff --git a/registry/vulkan/chapters/VK_MVK_macos_surface/platformCreateSurface_macos.txt b/registry/vulkan/chapters/VK_MVK_macos_surface/platformCreateSurface_macos.txt
deleted file mode 100644
index 2e16e68..0000000
--- a/registry/vulkan/chapters/VK_MVK_macos_surface/platformCreateSurface_macos.txt
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (c) 2018-2020 The Brenwill Workshop Ltd.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformCreateSurface_macos,platformCreateSurface_macos]]
-=== macOS Platform
-
-[open,refpage='vkCreateMacOSSurfaceMVK',desc='Create a VkSurfaceKHR object for a macOS NSView',type='protos']
---
-To create a sname:VkSurfaceKHR object for a macOS code:NSView or
-basetype:CAMetalLayer, call:
-
-include::{generated}/api/protos/vkCreateMacOSSurfaceMVK.txt[]
-
-ifdef::VK_EXT_metal_surface[]
-[NOTE]
-.Note
-====
-The `vkCreateMacOSSurfaceMVK` function is considered deprecated and has been
-superseded by flink:vkCreateMetalSurfaceEXT from the
-`apiext:VK_EXT_metal_surface` extension.
-====
-endif::VK_EXT_metal_surface[]
-
-  * pname:instance is the instance with which to associate the surface.
-  * pname:pCreateInfo is a pointer to a slink:VkMacOSSurfaceCreateInfoMVK
-    structure containing parameters affecting the creation of the surface
-    object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a slink:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-include::{generated}/validity/protos/vkCreateMacOSSurfaceMVK.txt[]
---
-
-[open,refpage='VkMacOSSurfaceCreateInfoMVK',desc='Structure specifying parameters of a newly created macOS surface object',type='structs']
---
-The slink:VkMacOSSurfaceCreateInfoMVK structure is defined as:
-
-include::{generated}/api/structs/VkMacOSSurfaceCreateInfoMVK.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:pView is a reference to either a basetype:CAMetalLayer object or
-    an code:NSView object.
-
-.Valid Usage
-****
-  * [[VUID-VkMacOSSurfaceCreateInfoMVK-pView-04144]]
-    If pname:pView is a basetype:CAMetalLayer object, it must: be a valid
-    basetype:CAMetalLayer
-  * [[VUID-VkMacOSSurfaceCreateInfoMVK-pView-01317]]
-    If pname:pView is an code:NSView object, it must: be a valid
-    code:NSView, must: be backed by a code:CALayer object of type
-    basetype:CAMetalLayer, and flink:vkCreateMacOSSurfaceMVK must: be called
-    on the main thread
-****
-
-include::{generated}/validity/structs/VkMacOSSurfaceCreateInfoMVK.txt[]
---
-
-[open,refpage='VkMacOSSurfaceCreateFlagsMVK',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkMacOSSurfaceCreateFlagsMVK.txt[]
-
-tname:VkMacOSSurfaceCreateFlagsMVK is a bitmask type for setting a mask, but
-is currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_MVK_macos_surface/platformQuerySupport_macos.txt b/registry/vulkan/chapters/VK_MVK_macos_surface/platformQuerySupport_macos.txt
deleted file mode 100644
index 32f9fa7..0000000
--- a/registry/vulkan/chapters/VK_MVK_macos_surface/platformQuerySupport_macos.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2018-2020 The Brenwill Workshop Ltd.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformQuerySupport_macos,platformQuerySupport_macos]]
-=== macOS Platform
-
-On macOS, all physical devices and queue families must: be capable of
-presentation with any layer.
-As a result there is no macOS-specific query for these capabilities.
diff --git a/registry/vulkan/chapters/VK_NN_vi_surface/platformCreateSurface_vi.txt b/registry/vulkan/chapters/VK_NN_vi_surface/platformCreateSurface_vi.txt
deleted file mode 100644
index 97ed676..0000000
--- a/registry/vulkan/chapters/VK_NN_vi_surface/platformCreateSurface_vi.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (c) 2018-2020 Nintendo
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformCreateSurface_vi,platformCreateSurface_vi]]
-=== VI Platform
-
-[open,refpage='vkCreateViSurfaceNN',desc='Create a slink:VkSurfaceKHR object for a VI layer',type='protos']
---
-To create a sname:VkSurfaceKHR object for an code:nn::code:vi::code:Layer,
-query the layer's native handle using
-code:nn::code:vi::code:GetNativeWindow, and then call:
-
-include::{generated}/api/protos/vkCreateViSurfaceNN.txt[]
-
-  * pname:instance is the instance with which to associate the surface.
-  * pname:pCreateInfo is a pointer to a sname:VkViSurfaceCreateInfoNN
-    structure containing parameters affecting the creation of the surface
-    object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a slink:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-During the lifetime of a surface created using a particular
-code:nn::code:vi::code:NativeWindowHandle, applications must: not attempt to
-create another surface for the same code:nn::code:vi::code:Layer or attempt
-to connect to the same code:nn::code:vi::code:Layer through other platform
-mechanisms.
-
-If the native window is created with a specified size, pname:currentExtent
-will reflect that size.
-In this case, applications should use the same size for the swapchain's
-pname:imageExtent.
-Otherwise, the pname:currentExtent will have the special value
-[eq]#(0xFFFFFFFF, 0xFFFFFFFF)#, indicating that applications are expected to
-choose an appropriate size for the swapchain's pname:imageExtent (e.g., by
-matching the result of a call to
-code:nn::code:vi::code:GetDisplayResolution).
-
-include::{generated}/validity/protos/vkCreateViSurfaceNN.txt[]
---
-
-[open,refpage='VkViSurfaceCreateInfoNN',desc='Structure specifying parameters of a newly created VI surface object',type='structs']
---
-The sname:VkViSurfaceCreateInfoNN structure is defined as:
-
-include::{generated}/api/structs/VkViSurfaceCreateInfoNN.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:window is the code:nn::code:vi::code:NativeWindowHandle for the
-    code:nn::code:vi::code:Layer with which to associate the surface.
-
-.Valid Usage
-****
-  * [[VUID-VkViSurfaceCreateInfoNN-window-01318]]
-    pname:window must: be a valid code:nn::code:vi::code:NativeWindowHandle
-****
-
-include::{generated}/validity/structs/VkViSurfaceCreateInfoNN.txt[]
---
-
-[open,refpage='VkViSurfaceCreateFlagsNN',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkViSurfaceCreateFlagsNN.txt[]
-
-tname:VkViSurfaceCreateFlagsNN is a bitmask type for setting a mask, but is
-currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_NN_vi_surface/platformQuerySupport_vi.txt b/registry/vulkan/chapters/VK_NN_vi_surface/platformQuerySupport_vi.txt
deleted file mode 100644
index bfaf3eb..0000000
--- a/registry/vulkan/chapters/VK_NN_vi_surface/platformQuerySupport_vi.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2018-2020 Nintendo
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformQuerySupport_vi,platformQuerySupport_vi]]
-=== VI Platform
-
-On VI, all physical devices and queue families must: be capable of
-presentation with any layer.
-As a result there is no VI-specific query for these capabilities.
-
diff --git a/registry/vulkan/chapters/VK_NV_acquire_winrt_display/acquire_winrt_display.txt b/registry/vulkan/chapters/VK_NV_acquire_winrt_display/acquire_winrt_display.txt
deleted file mode 100644
index ea0d0ba..0000000
--- a/registry/vulkan/chapters/VK_NV_acquire_winrt_display/acquire_winrt_display.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) 2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='vkAcquireWinrtDisplayNV',desc='Acquire access to a VkDisplayKHR',type='protos']
---
-To acquire permission to directly access a display in Vulkan on Windows 10,
-call:
-
-include::{generated}/api/protos/vkAcquireWinrtDisplayNV.txt[]
-
-  * pname:physicalDevice The physical device the display is on.
-  * pname:display The display the caller wishes to control in Vulkan.
-
-All permissions necessary to control the display are granted to the Vulkan
-instance associated with pname:physicalDevice until the display is released
-or the application is terminated.
-Permission to access the display may: be revoked by events that cause
-Windows 10 itself to lose access to pname:display.
-If this has happened, operations which require access to the display must:
-fail with an appropriate error code.
-If permission to access pname:display has already been acquired by another
-entity, the call must: return the error code
-ename:VK_ERROR_INITIALIZATION_FAILED.
-
-[NOTE]
-.Note
-====
-The Vulkan instance acquires control of a
-https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaytarget["`winrt::Windows::Devices::Display::Core::DisplayTarget`"]
-by performing an operation equivalent to
-https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaymanager.tryacquiretarget["`winrt::Windows::Devices::Display::Core::DisplayManager.TryAcquireTarget()`"]
-on the "`DisplayTarget`".
-====
-
-[NOTE]
-.Note
-====
-One example of when Windows 10 loses access to a display is when the display
-is hot-unplugged.
-====
-
-[NOTE]
-.Note
-====
-One example of when a display has already been acquired by another entity is
-when the Windows desktop compositor (DWM) is in control of the display.
-Beginning with Windows 10 version 2004 it is possible to cause DWM to
-release a display by using the "`Advanced display settings`" sub-page of the
-"`Display settings`" control panel.
-flink:vkAcquireWinrtDisplayNV does not itself cause DWM to release a
-display; this action must be performed outside of Vulkan.
-====
-
-include::{generated}/validity/protos/vkAcquireWinrtDisplayNV.txt[]
---
-
-[open,refpage='vkGetWinrtDisplayNV',desc='Query the VkDisplayKHR corresponding to a WinRT DisplayTarget',type='protos']
---
-When acquiring displays on Windows 10, an application may also wish to
-enumerate and identify them using a native handle rather than a
-sname:VkDisplayKHR handle.
-
-To determine the sname:VkDisplayKHR handle corresponding to a
-https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaytarget["`winrt::Windows::Devices::Display::Core::DisplayTarget`"],
-call:
-
-include::{generated}/api/protos/vkGetWinrtDisplayNV.txt[]
-
-  * pname:physicalDevice The physical device on which to query the display
-    handle.
-  * pname:deviceRelativeId The value of the
-    https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaytarget.adapterrelativeid["`AdapterRelativeId`"]
-    property of a
-    https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displaytarget["`DisplayTarget`"]
-    that is enumerated by a
-    https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displayadapter["`DisplayAdapter`"]
-    with an
-    https://docs.microsoft.com/en-us/uwp/api/windows.devices.display.core.displayadapter.id["`Id`"]
-    property matching the pname:deviceLUID property of a
-    slink:VkPhysicalDeviceIDProperties for pname:physicalDevice.
-  * pname:pDisplay The corresponding slink:VkDisplayKHR handle will be
-    returned here.
-
-If there is no slink:VkDisplayKHR corresponding to pname:deviceRelativeId on
-pname:physicalDevice, dlink:VK_NULL_HANDLE must: be returned in
-pname:pDisplay.
-
-include::{generated}/validity/protos/vkGetWinrtDisplayNV.txt[]
---
diff --git a/registry/vulkan/chapters/VK_NV_clip_space_w_scaling/vertexpostproc.txt b/registry/vulkan/chapters/VK_NV_clip_space_w_scaling/vertexpostproc.txt
deleted file mode 100644
index 5d8a551..0000000
--- a/registry/vulkan/chapters/VK_NV_clip_space_w_scaling/vertexpostproc.txt
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[vertexpostproc-viewportwscaling]]
-== Controlling Viewport W Scaling
-
-If viewport *W* scaling is enabled, the *W* component of the clip coordinate
-is modified by the provided coefficients from the corresponding viewport as
-follows.
-
-  {empty}:: [eq]#w~c~' = x~coeff~ x~c~ {plus} y~coeff~ y~c~ {plus} w~c~#
-
-[open,refpage='VkPipelineViewportWScalingStateCreateInfoNV',desc='Structure specifying parameters of a newly created pipeline viewport W scaling state',type='structs']
---
-The sname:VkPipelineViewportWScalingStateCreateInfoNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPipelineViewportWScalingStateCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:viewportWScalingEnable controls whether viewport *W* scaling is
-    enabled.
-  * pname:viewportCount is the number of viewports used by *W* scaling, and
-    must: match the number of viewports in the pipeline if viewport *W*
-    scaling is enabled.
-  * pname:pViewportWScalings is a pointer to an array of
-    sname:VkViewportWScalingNV structures defining the *W* scaling
-    parameters for the corresponding viewports.
-    If the viewport *W* scaling state is dynamic, this member is ignored.
-
-include::{generated}/validity/structs/VkPipelineViewportWScalingStateCreateInfoNV.txt[]
---
-
-The sname:VkPipelineViewportWScalingStateCreateInfoNV state is set by adding
-this structure to the pname:pNext chain of a
-sname:VkPipelineViewportStateCreateInfo structure and setting the graphics
-pipeline state with flink:vkCreateGraphicsPipelines.
-
-[open,refpage='vkCmdSetViewportWScalingNV',desc='Set the viewport W scaling dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the viewport *W* scaling
-parameters, call:
-
-include::{generated}/api/protos/vkCmdSetViewportWScalingNV.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:firstViewport is the index of the first viewport whose parameters
-    are updated by the command.
-  * pname:viewportCount is the number of viewports whose parameters are
-    updated by the command.
-  * pname:pViewportWScalings is a pointer to an array of
-    slink:VkViewportWScalingNV structures specifying viewport parameters.
-
-The viewport parameters taken from element [eq]#i# of
-pname:pViewportWScalings replace the current state for the viewport index
-[eq]#pname:firstViewport {plus} i#, for [eq]#i# in [eq]#[0,
-pname:viewportCount)#.
-
-This command sets the viewport *W* scaling for subsequent drawing commands
-when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineViewportWScalingStateCreateInfoNV::pname:pViewportWScalings
-values used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetViewportWScalingNV-firstViewport-01324]]
-    The sum of pname:firstViewport and pname:viewportCount must: be between
-    `1` and slink:VkPhysicalDeviceLimits::pname:maxViewports, inclusive
-****
-
-include::{generated}/validity/protos/vkCmdSetViewportWScalingNV.txt[]
---
-
-Both slink:VkPipelineViewportWScalingStateCreateInfoNV and
-flink:vkCmdSetViewportWScalingNV use sname:VkViewportWScalingNV to set the
-viewport transformation parameters.
-
-[open,refpage='VkViewportWScalingNV',desc='Structure specifying a viewport',type='structs']
---
-The sname:VkViewportWScalingNV structure is defined as:
-
-include::{generated}/api/structs/VkViewportWScalingNV.txt[]
-
-  * pname:xcoeff and pname:ycoeff are the viewport's W scaling factor for x
-    and y respectively.
-
-include::{generated}/validity/structs/VkViewportWScalingNV.txt[]
---
diff --git a/registry/vulkan/chapters/VK_NV_device_diagnostic_checkpoints/device_diagnostic_checkpoints.txt b/registry/vulkan/chapters/VK_NV_device_diagnostic_checkpoints/device_diagnostic_checkpoints.txt
deleted file mode 100644
index 2cd4914..0000000
--- a/registry/vulkan/chapters/VK_NV_device_diagnostic_checkpoints/device_diagnostic_checkpoints.txt
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-== Device Loss Debugging
-
-
-[[device-diagnostic-checkpoints]]
-=== Device Diagnostic Checkpoints
-
-Device execution progress can: be tracked for the purposes of debugging a
-device loss by annotating the command stream with application-defined
-diagnostic checkpoints.
-
-[open,refpage='vkCmdSetCheckpointNV',desc='Insert diagnostic checkpoint in command stream',type='protos']
---
-Device diagnostic checkpoints are inserted into the command stream by
-calling flink:vkCmdSetCheckpointNV.
-
-include::{generated}/api/protos/vkCmdSetCheckpointNV.txt[]
-
-  * pname:commandBuffer is the command buffer that will receive the marker
-  * pname:pCheckpointMarker is an opaque application-provided value that
-    will be associated with the checkpoint.
-
-include::{generated}/validity/protos/vkCmdSetCheckpointNV.txt[]
---
-
-Note that pname:pCheckpointMarker is treated as an opaque value.
-It does not need to be a valid pointer and will not be dereferenced by the
-implementation.
-
-ifdef::VK_KHR_synchronization2[]
-[open,refpage='vkGetQueueCheckpointData2NV',desc='Retrieve diagnostic checkpoint data',type='protos']
---
-If the device encounters an error during execution, the implementation will
-return a ename:VK_ERROR_DEVICE_LOST error to the application at some point
-during host execution.
-When this happens, the application can: call
-flink:vkGetQueueCheckpointData2NV to retrieve information on the most recent
-diagnostic checkpoints that were executed by the device.
-
-include::{generated}/api/protos/vkGetQueueCheckpointData2NV.txt[]
-
-  * pname:queue is the slink:VkQueue object the caller would like to
-    retrieve checkpoint data for
-  * pname:pCheckpointDataCount is a pointer to an integer related to the
-    number of checkpoint markers available or queried, as described below.
-  * pname:pCheckpointData is either `NULL` or a pointer to an array of
-    sname:VkCheckpointData2NV structures.
-
-If pname:pCheckpointData is `NULL`, then the number of checkpoint markers
-available is returned in pname:pCheckpointDataCount.
-Otherwise, pname:pCheckpointDataCount must: point to a variable set by the
-user to the number of elements in the pname:pCheckpointData array, and on
-return the variable is overwritten with the number of structures actually
-written to pname:pCheckpointData.
-
-If pname:pCheckpointDataCount is less than the number of checkpoint markers
-available, at most pname:pCheckpointDataCount structures will be written.
-
-.Valid Usage
-****
-  * [[VUID-vkGetQueueCheckpointData2NV-queue-03892]]
-    The device that pname:queue belongs to must: be in the lost state
-****
-
-include::{generated}/validity/protos/vkGetQueueCheckpointData2NV.txt[]
---
-
-[open,refpage='VkCheckpointData2NV',desc='Return structure for command buffer checkpoint data',type='structs']
---
-The slink:VkCheckpointData2NV structure is defined as:
-
-include::{generated}/api/structs/VkCheckpointData2NV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:stage indicates a single pipeline stage which the checkpoint
-    marker data refers to.
-  * pname:pCheckpointMarker contains the value of the last checkpoint marker
-    executed in the stage that pname:stage refers to.
-
-include::{generated}/validity/structs/VkCheckpointData2NV.txt[]
-
-The stages at which a checkpoint marker can: be executed are
-implementation-defined and can: be queried by calling
-flink:vkGetPhysicalDeviceQueueFamilyProperties2.
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='vkGetQueueCheckpointDataNV',desc='Retrieve diagnostic checkpoint data',type='protos']
---
-If the device encounters an error during execution, the implementation will
-return a ename:VK_ERROR_DEVICE_LOST error to the application at a certain
-point during host execution.
-When this happens, the application can: call
-flink:vkGetQueueCheckpointDataNV to retrieve information on the most recent
-diagnostic checkpoints that were executed by the device.
-
-include::{generated}/api/protos/vkGetQueueCheckpointDataNV.txt[]
-
-  * pname:queue is the slink:VkQueue object the caller would like to
-    retrieve checkpoint data for
-  * pname:pCheckpointDataCount is a pointer to an integer related to the
-    number of checkpoint markers available or queried, as described below.
-  * pname:pCheckpointData is either `NULL` or a pointer to an array of
-    sname:VkCheckpointDataNV structures.
-
-If pname:pCheckpointData is `NULL`, then the number of checkpoint markers
-available is returned in pname:pCheckpointDataCount.
-
-Otherwise, pname:pCheckpointDataCount must: point to a variable set by the
-user to the number of elements in the pname:pCheckpointData array, and on
-return the variable is overwritten with the number of structures actually
-written to pname:pCheckpointData.
-
-If pname:pCheckpointDataCount is less than the number of checkpoint markers
-available, at most pname:pCheckpointDataCount structures will be written.
-
-.Valid Usage
-****
-  * [[VUID-vkGetQueueCheckpointDataNV-queue-02025]]
-    The device that pname:queue belongs to must: be in the lost state
-****
-
-include::{generated}/validity/protos/vkGetQueueCheckpointDataNV.txt[]
---
-
-[open,refpage='VkCheckpointDataNV',desc='Return structure for command buffer checkpoint data',type='structs']
---
-The slink:VkCheckpointDataNV structure is defined as:
-
-include::{generated}/api/structs/VkCheckpointDataNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:stage is a ename:VkPipelineStageFlagBits value specifying which
-    pipeline stage the checkpoint marker data refers to.
-  * pname:pCheckpointMarker contains the value of the last checkpoint marker
-    executed in the stage that pname:stage refers to.
-
-The stages at which a checkpoint marker can: be executed are
-implementation-defined and can: be queried by calling
-flink:vkGetPhysicalDeviceQueueFamilyProperties2.
-
-include::{generated}/validity/structs/VkCheckpointDataNV.txt[]
---
diff --git a/registry/vulkan/chapters/VK_NV_device_diagnostic_checkpoints/queue_checkpoint_properties.txt b/registry/vulkan/chapters/VK_NV_device_diagnostic_checkpoints/queue_checkpoint_properties.txt
deleted file mode 100644
index b2d62d3..0000000
--- a/registry/vulkan/chapters/VK_NV_device_diagnostic_checkpoints/queue_checkpoint_properties.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-ifdef::VK_KHR_synchronization2[]
-[open,refpage='VkQueueFamilyCheckpointProperties2NV',desc='Return structure for queue family checkpoint information query',type='structs']
---
-The slink:VkQueueFamilyCheckpointProperties2NV structure is defined as:
-
-include::{generated}/api/structs/VkQueueFamilyCheckpointProperties2NV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:checkpointExecutionStageMask is a mask indicating which pipeline
-    stages the implementation can execute checkpoint markers in.
-
-Additional queue family information can be queried by setting
-slink:VkQueueFamilyProperties2::pname:pNext to point to a
-sname:VkQueueFamilyCheckpointProperties2NV structure.
-
-include::{generated}/validity/structs/VkQueueFamilyCheckpointProperties2NV.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='VkQueueFamilyCheckpointPropertiesNV',desc='Return structure for queue family checkpoint information query',type='structs']
---
-The slink:VkQueueFamilyCheckpointPropertiesNV structure is defined as:
-
-include::{generated}/api/structs/VkQueueFamilyCheckpointPropertiesNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:checkpointExecutionStageMask is a mask indicating which pipeline
-    stages the implementation can execute checkpoint markers in.
-
-Additional queue family information can be queried by setting
-slink:VkQueueFamilyProperties2::pname:pNext to point to a
-sname:VkQueueFamilyCheckpointPropertiesNV structure.
-
-include::{generated}/validity/structs/VkQueueFamilyCheckpointPropertiesNV.txt[]
---
diff --git a/registry/vulkan/chapters/VK_NV_device_generated_commands/cmdProcessAllSequences.txt b/registry/vulkan/chapters/VK_NV_device_generated_commands/cmdProcessAllSequences.txt
deleted file mode 100644
index cfbc2cb..0000000
--- a/registry/vulkan/chapters/VK_NV_device_generated_commands/cmdProcessAllSequences.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[source,c]
----------------------------------------------------
-void cmdProcessAllSequences(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsTokens, sequencesCount, indexbuffer, indexbufferOffset)
-{
-  for (s = 0; s < sequencesCount; s++)
-  {
-    sUsed = s;
-
-    if (indirectCommandsLayout.flags & VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV) {
-      sUsed = indexbuffer.load_uint32( sUsed * sizeof(uint32_t) + indexbufferOffset);
-    }
-
-    if (indirectCommandsLayout.flags & VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV) {
-      sUsed = incoherent_implementation_dependent_permutation[ sUsed ];
-    }
-
-    cmdProcessSequence( cmd, pipeline, indirectCommandsLayout, pIndirectCommandsTokens, sUsed );
-  }
-}
----------------------------------------------------
-
diff --git a/registry/vulkan/chapters/VK_NV_device_generated_commands/generatedcommands.txt b/registry/vulkan/chapters/VK_NV_device_generated_commands/generatedcommands.txt
deleted file mode 100644
index c680456..0000000
--- a/registry/vulkan/chapters/VK_NV_device_generated_commands/generatedcommands.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2019-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[device-generated-commands]]
-= Device-Generated Commands
-
-This chapter discusses the generation of command buffer content on the
-device, for which these principle steps are to be taken:
-
-  * Define via sname:VkIndirectCommandsLayoutNV the sequence of commands
-    which should be generated.
-  * Optionally make use of <<graphics-shadergroups, device-bindable Shader
-    Groups>>.
-  * Retrieve device addresses by flink:vkGetBufferDeviceAddressEXT for
-    setting buffers on the device.
-  * Fill one or more sname:VkBuffer with the appropriate content that gets
-    interpreted by sname:VkIndirectCommandsLayoutNV.
-  * Create a `preprocess` sname:VkBuffer using the allocation information
-    from flink:vkGetGeneratedCommandsMemoryRequirementsNV.
-  * Optionally preprocess the input data using
-    flink:vkCmdPreprocessGeneratedCommandsNV in a separate action.
-  * Generate and execute the actual commands via
-    flink:vkCmdExecuteGeneratedCommandsNV passing all required data.
-
-flink:vkCmdPreprocessGeneratedCommandsNV executes in a separate logical
-pipeline from either graphics or compute.
-When preprocessing commands in a separate step they must: be explicitly
-synchronized against the command execution.
-When not preprocessing, the preprocessing is automatically synchronized
-against the command execution.
-
-include::indirectcommands.txt[]
-
-include::generation.txt[]
diff --git a/registry/vulkan/chapters/VK_NV_device_generated_commands/generation.txt b/registry/vulkan/chapters/VK_NV_device_generated_commands/generation.txt
deleted file mode 100644
index 6574dd3..0000000
--- a/registry/vulkan/chapters/VK_NV_device_generated_commands/generation.txt
+++ /dev/null
@@ -1,291 +0,0 @@
-// Copyright (c) 2019-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-== Indirect Commands Generation And Execution
-
-[open,refpage='vkGetGeneratedCommandsMemoryRequirementsNV',desc='Retrieve the buffer allocation requirements for generated commands',type='protos']
---
-The generation of commands on the device requires a `preprocess` buffer.
-To retrieve the memory size and alignment requirements of a particular
-execution state call:
-
-include::{generated}/api/protos/vkGetGeneratedCommandsMemoryRequirementsNV.txt[]
-
-  * pname:device is the logical device that owns the buffer.
-  * pname:pInfo is a pointer to a
-    sname:VkGeneratedCommandsMemoryRequirementsInfoNV structure containing
-    parameters required for the memory requirements query.
-  * pname:pMemoryRequirements is a pointer to a slink:VkMemoryRequirements2
-    structure in which the memory requirements of the buffer object are
-    returned.
-
-.Valid Usage
-****
-  * [[VUID-vkGetGeneratedCommandsMemoryRequirementsNV-deviceGeneratedCommands-02906]]
-    The <<features-deviceGeneratedCommands,
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
-    feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkGetGeneratedCommandsMemoryRequirementsNV.txt[]
---
-
-[open,refpage='VkGeneratedCommandsMemoryRequirementsInfoNV',desc='Structure specifying parameters for the reservation of preprocess buffer space',type='structs']
---
-include::{generated}/api/structs/VkGeneratedCommandsMemoryRequirementsInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pipelineBindPoint is the elink:VkPipelineBindPoint of the
-    pname:pipeline that this buffer memory is intended to be used with
-    during the execution.
-  * pname:pipeline is the slink:VkPipeline that this buffer memory is
-    intended to be used with during the execution.
-  * pname:indirectCommandsLayout is the slink:VkIndirectCommandsLayoutNV
-    that this buffer memory is intended to be used with.
-  * pname:maxSequencesCount is the maximum number of sequences that this
-    buffer memory in combination with the other state provided can: be used
-    with.
-
-.Valid Usage
-****
-  * [[VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-maxSequencesCount-02907]]
-    pname:maxSequencesCount must: be less or equal to
-    slink:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxIndirectSequenceCount
-****
-
-include::{generated}/validity/structs/VkGeneratedCommandsMemoryRequirementsInfoNV.txt[]
---
-
-[open,refpage='vkCmdExecuteGeneratedCommandsNV',desc='Generate and execute commands on the device',type='protos']
---
-:refpage: vkCmdExecuteGeneratedCommandsNV
-
-The actual generation of commands as well as their execution on the device
-is handled as single action with:
-
-include::{generated}/api/protos/vkCmdExecuteGeneratedCommandsNV.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:isPreprocessed represents whether the input data has already been
-    preprocessed on the device.
-    If it is ename:VK_FALSE this command will implicitly trigger the
-    preprocessing step, otherwise not.
-  * pname:pGeneratedCommandsInfo is a pointer to a
-    slink:VkGeneratedCommandsInfoNV structure containing parameters
-    affecting the generation of commands.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_common.txt[]
-include::{chapters}/commonvalidity/draw_vertex_binding.txt[]
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-02970]]
-    pname:commandBuffer must: not be a protected command buffer
-endif::VK_VERSION_1_1[]
-  * [[VUID-vkCmdExecuteGeneratedCommandsNV-isPreprocessed-02908]]
-    If pname:isPreprocessed is ename:VK_TRUE then
-    flink:vkCmdPreprocessGeneratedCommandsNV must: have already been
-    executed on the device, using the same pname:pGeneratedCommandsInfo
-    content as well as the content of the input buffers it references (all
-    except slink:VkGeneratedCommandsInfoNV::pname:preprocessBuffer).
-    Furthermore pname:pGeneratedCommandsInfo`s pname:indirectCommandsLayout
-    must: have been created with the
-    ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV bit
-    set
-  * [[VUID-vkCmdExecuteGeneratedCommandsNV-pipeline-02909]]
-    sname:VkGeneratedCommandsInfoNV::pname:pipeline must: match the current
-    bound pipeline at
-    sname:VkGeneratedCommandsInfoNV::pname:pipelineBindPoint
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-vkCmdExecuteGeneratedCommandsNV-None-02910]]
-    Transform feedback must: not be active
-endif::VK_EXT_transform_feedback[]
-  * [[VUID-vkCmdExecuteGeneratedCommandsNV-deviceGeneratedCommands-02911]]
-    The <<features-deviceGeneratedCommands,
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
-    feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdExecuteGeneratedCommandsNV.txt[]
---
-
-[open,refpage='VkGeneratedCommandsInfoNV',desc='Structure specifying parameters for the generation of commands',type='structs']
---
-include::{generated}/api/structs/VkGeneratedCommandsInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pipelineBindPoint is the elink:VkPipelineBindPoint used for the
-    pname:pipeline.
-  * pname:pipeline is the slink:VkPipeline used in the generation and
-    execution process.
-  * pname:indirectCommandsLayout is the slink:VkIndirectCommandsLayoutNV
-    that provides the command sequence to generate.
-  * pname:streamCount defines the number of input streams
-  * pname:pStreams is a pointer to an array of pname:streamCount
-    slink:VkIndirectCommandsStreamNV structures providing the input data for
-    the tokens used in pname:indirectCommandsLayout.
-  * pname:sequencesCount is the maximum number of sequences to reserve.
-    If pname:sequencesCountBuffer is dlink:VK_NULL_HANDLE, this is also the
-    actual number of sequences generated.
-  * pname:preprocessBuffer is the slink:VkBuffer that is used for
-    preprocessing the input data for execution.
-    If this structure is used with flink:vkCmdExecuteGeneratedCommandsNV
-    with its pname:isPreprocessed set to `VK_TRUE`, then the preprocessing
-    step is skipped and data is only read from this buffer.
-  * pname:preprocessOffset is the byte offset into pname:preprocessBuffer
-    where the preprocessed data is stored.
-  * pname:preprocessSize is the maximum byte size within the
-    pname:preprocessBuffer after the pname:preprocessOffset that is
-    available for preprocessing.
-  * pname:sequencesCountBuffer is a sname:VkBuffer in which the actual
-    number of sequences is provided as single code:uint32_t value.
-  * pname:sequencesCountOffset is the byte offset into
-    pname:sequencesCountBuffer where the count value is stored.
-  * pname:sequencesIndexBuffer is a sname:VkBuffer that encodes the used
-    sequence indices as code:uint32_t array.
-  * pname:sequencesIndexOffset is the byte offset into
-    pname:sequencesIndexBuffer where the index values start.
-
-.Valid Usage
-****
-  * [[VUID-VkGeneratedCommandsInfoNV-pipeline-02912]]
-    The provided pname:pipeline must: match the pipeline bound at execution
-    time
-  * [[VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02913]]
-    If the pname:indirectCommandsLayout uses a token of
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV, then the
-    pname:pipeline must: have been created with multiple shader groups
-  * [[VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02914]]
-    If the pname:indirectCommandsLayout uses a token of
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV, then the
-    pname:pipeline must: have been created with
-    ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV set in
-    sname:VkGraphicsPipelineCreateInfo::pname:flags
-  * [[VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02915]]
-    If the pname:indirectCommandsLayout uses a token of
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, then the
-    pname:pipeline`s sname:VkPipelineLayout must: match the
-    slink:VkIndirectCommandsLayoutTokenNV::pname:pushconstantPipelineLayout
-  * [[VUID-VkGeneratedCommandsInfoNV-streamCount-02916]]
-    pname:streamCount must: match the pname:indirectCommandsLayout's
-    pname:streamCount
-  * [[VUID-VkGeneratedCommandsInfoNV-sequencesCount-02917]]
-    pname:sequencesCount must: be less or equal to
-    slink:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxIndirectSequenceCount
-    and
-    slink:VkGeneratedCommandsMemoryRequirementsInfoNV::pname:maxSequencesCount
-    that was used to determine the pname:preprocessSize
-  * [[VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-02918]]
-    pname:preprocessBuffer must: have the
-    ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set in its usage flag
-  * [[VUID-VkGeneratedCommandsInfoNV-preprocessOffset-02919]]
-    pname:preprocessOffset must: be aligned to
-    slink:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:minIndirectCommandsBufferOffsetAlignment
-  * [[VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-02971]]
-    If pname:preprocessBuffer is non-sparse then it must: be bound
-    completely and contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-VkGeneratedCommandsInfoNV-preprocessSize-02920]]
-    pname:preprocessSize must: be at least equal to the memory requirement`s
-    size returned by flink:vkGetGeneratedCommandsMemoryRequirementsNV using
-    the matching inputs (pname:indirectCommandsLayout, ...) as within this
-    structure
-  * [[VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02921]]
-    pname:sequencesCountBuffer can: be set if the actual used count of
-    sequences is sourced from the provided buffer.
-    In that case the pname:sequencesCount serves as upper bound
-  * [[VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02922]]
-    If pname:sequencesCountBuffer is not dlink:VK_NULL_HANDLE, its usage
-    flag must: have the ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set
-  * [[VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02923]]
-    If pname:sequencesCountBuffer is not dlink:VK_NULL_HANDLE,
-    pname:sequencesCountOffset must: be aligned to
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:minSequencesCountBufferOffsetAlignment
-  * [[VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02972]]
-    If pname:sequencesCountBuffer is not dlink:VK_NULL_HANDLE and is
-    non-sparse then it must: be bound completely and contiguously to a
-    single sname:VkDeviceMemory object
-  * [[VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02924]]
-    If pname:indirectCommandsLayout's
-    ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV is set,
-    pname:sequencesIndexBuffer must: be set otherwise it must: be
-    dlink:VK_NULL_HANDLE
-  * [[VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02925]]
-    If pname:sequencesIndexBuffer is not dlink:VK_NULL_HANDLE, its usage
-    flag must: have the ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set
-  * [[VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02926]]
-    If pname:sequencesIndexBuffer is not dlink:VK_NULL_HANDLE,
-    pname:sequencesIndexOffset must: be aligned to
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:minSequencesIndexBufferOffsetAlignment
-  * [[VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02973]]
-    If pname:sequencesIndexBuffer is not dlink:VK_NULL_HANDLE and is
-    non-sparse then it must: be bound completely and contiguously to a
-    single sname:VkDeviceMemory object
-****
-
-include::{generated}/validity/structs/VkGeneratedCommandsInfoNV.txt[]
---
-
-Referencing the functions defined in <<indirectmdslayout>>,
-fname:vkCmdExecuteGeneratedCommandsNV behaves as:
-
-[source,c]
----------------------------------------------------
-uint32_t sequencesCount = sequencesCountBuffer ?
-      min(maxSequencesCount, sequencesCountBuffer.load_uint32(sequencesCountOffset) :
-      maxSequencesCount;
-
-
-cmdProcessAllSequences(commandBuffer, pipeline,
-                       indirectCommandsLayout, pIndirectCommandsStreams,
-                       sequencesCount,
-                       sequencesIndexBuffer, sequencesIndexOffset);
-
-// The stateful commands within indirectCommandsLayout will not
-// affect the state of subsequent commands in the target
-// command buffer (cmd)
----------------------------------------------------
-
-[NOTE]
-.Note
-====
-It is important to note that the values of all state related to the
-pname:pipelineBindPoint used are undefined: after this command.
-====
-
-[open,refpage='vkCmdPreprocessGeneratedCommandsNV',desc='Performs preprocessing for generated commands',type='protos']
---
-Commands can: be preprocessed prior execution using the following command:
-
-include::{generated}/api/protos/vkCmdPreprocessGeneratedCommandsNV.txt[]
-
-  * pname:commandBuffer is the command buffer which does the preprocessing.
-  * pname:pGeneratedCommandsInfo is a pointer to a
-    slink:VkGeneratedCommandsInfoNV structure containing parameters
-    affecting the preprocessing step.
-
-.Valid Usage
-****
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-02974]]
-    pname:commandBuffer must: not be a protected command buffer
-endif::VK_VERSION_1_1[]
-  * [[VUID-vkCmdPreprocessGeneratedCommandsNV-pGeneratedCommandsInfo-02927]]
-    pname:pGeneratedCommandsInfo`s pname:indirectCommandsLayout must: have
-    been created with the
-    ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV bit
-    set
-  * [[VUID-vkCmdPreprocessGeneratedCommandsNV-deviceGeneratedCommands-02928]]
-    The <<features-deviceGeneratedCommands,
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
-    feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdPreprocessGeneratedCommandsNV.txt[]
---
-
diff --git a/registry/vulkan/chapters/VK_NV_device_generated_commands/indirectcommands.txt b/registry/vulkan/chapters/VK_NV_device_generated_commands/indirectcommands.txt
deleted file mode 100644
index e188d2e..0000000
--- a/registry/vulkan/chapters/VK_NV_device_generated_commands/indirectcommands.txt
+++ /dev/null
@@ -1,621 +0,0 @@
-// Copyright (c) 2019-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[indirectmdslayout]]
-== Indirect Commands Layout
-
-[open,refpage='VkIndirectCommandsLayoutNV',desc='Opaque handle to an indirect commands layout object',type='handles']
---
-The device-side command generation happens through an iterative processing
-of an atomic sequence comprised of command tokens, which are represented by:
-
-include::{generated}/api/handles/VkIndirectCommandsLayoutNV.txt[]
---
-
-
-=== Creation and Deletion
-
-[open,refpage='vkCreateIndirectCommandsLayoutNV',desc='Create an indirect command layout object',type='protos']
---
-Indirect command layouts are created by:
-
-include::{generated}/api/protos/vkCreateIndirectCommandsLayoutNV.txt[]
-
-  * pname:device is the logical device that creates the indirect command
-    layout.
-  * pname:pCreateInfo is a pointer to a
-    sname:VkIndirectCommandsLayoutCreateInfoNV structure containing
-    parameters affecting creation of the indirect command layout.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pIndirectCommandsLayout is a pointer to a
-    sname:VkIndirectCommandsLayoutNV handle in which the resulting indirect
-    command layout is returned.
-
-.Valid Usage
-****
-  * [[VUID-vkCreateIndirectCommandsLayoutNV-deviceGeneratedCommands-02929]]
-    The <<features-deviceGeneratedCommands,
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
-    feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkCreateIndirectCommandsLayoutNV.txt[]
---
-
-[open,refpage='VkIndirectCommandsLayoutCreateInfoNV',desc='Structure specifying the parameters of a newly created indirect commands layout object',type='structs']
---
-The sname:VkIndirectCommandsLayoutCreateInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkIndirectCommandsLayoutCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pipelineBindPoint is the elink:VkPipelineBindPoint that this
-    layout targets.
-  * pname:flags is a bitmask of
-    elink:VkIndirectCommandsLayoutUsageFlagBitsNV specifying usage hints of
-    this layout.
-  * pname:tokenCount is the length of the individual command sequence.
-  * pname:pTokens is an array describing each command token in detail.
-    See elink:VkIndirectCommandsTokenTypeNV and
-    slink:VkIndirectCommandsLayoutTokenNV below for details.
-  * pname:streamCount is the number of streams used to provide the token
-    inputs.
-  * pname:pStreamStrides is an array defining the byte stride for each input
-    stream.
-
-The following code illustrates some of the flags:
-
-[source,c]
-~~~~
-void cmdProcessAllSequences(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsTokens, sequencesCount, indexbuffer, indexbufferOffset)
-{
-  for (s = 0; s < sequencesCount; s++)
-  {
-    sUsed = s;
-
-    if (indirectCommandsLayout.flags & VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV) {
-      sUsed = indexbuffer.load_uint32( sUsed * sizeof(uint32_t) + indexbufferOffset);
-    }
-
-    if (indirectCommandsLayout.flags & VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV) {
-      sUsed = incoherent_implementation_dependent_permutation[ sUsed ];
-    }
-
-    cmdProcessSequence( cmd, pipeline, indirectCommandsLayout, pIndirectCommandsTokens, sUsed );
-  }
-}
-~~~~
-
-.Valid Usage
-****
-  * [[VUID-VkIndirectCommandsLayoutCreateInfoNV-pipelineBindPoint-02930]]
-    The pname:pipelineBindPoint must: be
-    ename:VK_PIPELINE_BIND_POINT_GRAPHICS
-  * [[VUID-VkIndirectCommandsLayoutCreateInfoNV-tokenCount-02931]]
-    pname:tokenCount must: be greater than `0` and less than or equal to
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxIndirectCommandsTokenCount
-  * [[VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02932]]
-    If pname:pTokens contains an entry of
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV it must: be the
-    first element of the array and there must: be only a single element of
-    such token type
-  * [[VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02933]]
-    If pname:pTokens contains an entry of
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV there must: be only
-    a single element of such token type
-  * [[VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02934]]
-    All state tokens in pname:pTokens must: occur prior work provoking
-    tokens (ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV,
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV,
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV)
-  * [[VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02935]]
-    The content of pname:pTokens must: include one single work provoking
-    token that is compatible with the pname:pipelineBindPoint
-  * [[VUID-VkIndirectCommandsLayoutCreateInfoNV-streamCount-02936]]
-    pname:streamCount must: be greater than `0` and less or equal to
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxIndirectCommandsStreamCount
-  * [[VUID-VkIndirectCommandsLayoutCreateInfoNV-pStreamStrides-02937]]
-    each element of pname:pStreamStrides must: be greater than `0`and less
-    than or equal to
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxIndirectCommandsStreamStride.
-    Furthermore the alignment of each token input must: be ensured
-****
-
-include::{generated}/validity/structs/VkIndirectCommandsLayoutCreateInfoNV.txt[]
---
-
-[open,refpage='VkIndirectCommandsLayoutUsageFlagBitsNV',desc='Bitmask specifying allowed usage of an indirect commands layout',type='enums']
---
-Bits which can: be set in
-slink:VkIndirectCommandsLayoutCreateInfoNV::pname:flags, specifying usage
-hints of an indirect command layout, are:
-
-include::{generated}/api/enums/VkIndirectCommandsLayoutUsageFlagBitsNV.txt[]
-
-  * ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV
-    specifies that the layout is always used with the manual preprocessing
-    step through calling flink:vkCmdPreprocessGeneratedCommandsNV and
-    executed by flink:vkCmdExecuteGeneratedCommandsNV with `isPreprocessed`
-    set to ename:VK_TRUE.
-  * ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV
-    specifies that the input data for the sequences is not implicitly
-    indexed from 0..sequencesUsed but a user provided sname:VkBuffer
-    encoding the index is provided.
-  * ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV
-    specifies that the processing of sequences can: happen at an
-    implementation-dependent order, which is not: guaranteed to be coherent
-    using the same input data.
---
-
-[open,refpage='VkIndirectCommandsLayoutUsageFlagsNV',desc='Bitmask of VkIndirectCommandsLayoutUsageFlagBitsNV',type='flags']
---
-include::{generated}/api/flags/VkIndirectCommandsLayoutUsageFlagsNV.txt[]
-
-tname:VkIndirectCommandsLayoutUsageFlagsNV is a bitmask type for setting a
-mask of zero or more elink:VkIndirectCommandsLayoutUsageFlagBitsNV.
---
-
-[open,refpage='vkDestroyIndirectCommandsLayoutNV',desc='Destroy an indirect commands layout',type='protos']
---
-Indirect command layouts are destroyed by:
-
-include::{generated}/api/protos/vkDestroyIndirectCommandsLayoutNV.txt[]
-
-  * pname:device is the logical device that destroys the layout.
-  * pname:indirectCommandsLayout is the layout to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02938]]
-    All submitted commands that refer to pname:indirectCommandsLayout must:
-    have completed execution
-  * [[VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02939]]
-    If sname:VkAllocationCallbacks were provided when
-    pname:indirectCommandsLayout was created, a compatible set of callbacks
-    must: be provided here
-  * [[VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02940]]
-    If no sname:VkAllocationCallbacks were provided when
-    pname:indirectCommandsLayout was created, pname:pAllocator must: be
-    `NULL`
-  * [[VUID-vkDestroyIndirectCommandsLayoutNV-deviceGeneratedCommands-02941]]
-    The <<features-deviceGeneratedCommands,
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
-    feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkDestroyIndirectCommandsLayoutNV.txt[]
---
-
-
-=== Token Input Streams
-
-[open,refpage='VkIndirectCommandsStreamNV',desc='Structure specifying input streams for generated command tokens',type='structs']
---
-The sname:VkIndirectCommandsStreamNV structure specifies the input data for
-one or more tokens at processing time.
-
-include::{generated}/api/structs/VkIndirectCommandsStreamNV.txt[]
-
-  * pname:buffer specifies the slink:VkBuffer storing the functional
-    arguments for each sequence.
-    These arguments can: be written by the device.
-  * pname:offset specified an offset into pname:buffer where the arguments
-    start.
-
-.Valid Usage
-****
-  * [[VUID-VkIndirectCommandsStreamNV-buffer-02942]]
-    The pname:buffer's usage flag must: have the
-    ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set
-  * [[VUID-VkIndirectCommandsStreamNV-offset-02943]]
-    The pname:offset must: be aligned to
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:minIndirectCommandsBufferOffsetAlignment
-  * [[VUID-VkIndirectCommandsStreamNV-buffer-02975]]
-    If pname:buffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-****
-
-include::{generated}/validity/structs/VkIndirectCommandsStreamNV.txt[]
---
-
-The input streams can: contain raw `uint32_t` values, existing indirect
-commands such as:
-
-* slink:VkDrawIndirectCommand
-* slink:VkDrawIndexedIndirectCommand
-ifdef::VK_NV_mesh_shader[]
-* slink:VkDrawMeshTasksIndirectCommandNV
-endif::VK_NV_mesh_shader[]
-
-or additional commands as listed below.
-How the data is used is described in the next section.
-
-[open,refpage='VkBindShaderGroupIndirectCommandNV',desc='Structure specifying input data for a single shader group command token',type='structs']
---
-The sname:VkBindShaderGroupIndirectCommandNV structure specifies the input
-data for the ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV token.
-
-include::{generated}/api/structs/VkBindShaderGroupIndirectCommandNV.txt[]
-
-  * pname:index specifies which shader group of the current bound graphics
-    pipeline is used.
-
-.Valid Usage
-****
-  * [[VUID-VkBindShaderGroupIndirectCommandNV-None-02944]]
-    The current bound graphics pipeline, as well as the pipelines it may
-    reference, must: have been created with
-    ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV
-  * [[VUID-VkBindShaderGroupIndirectCommandNV-index-02945]]
-    The pname:index must: be within range of the accessible shader groups of
-    the current bound graphics pipeline.
-    See flink:vkCmdBindPipelineShaderGroupNV for further details
-****
-
-include::{generated}/validity/structs/VkBindShaderGroupIndirectCommandNV.txt[]
---
-
-[open,refpage='VkBindIndexBufferIndirectCommandNV',desc='Structure specifying input data for a single index buffer command token',type='structs']
---
-The sname:VkBindIndexBufferIndirectCommandNV structure specifies the input
-data for the ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV token.
-
-include::{generated}/api/structs/VkBindIndexBufferIndirectCommandNV.txt[]
-
-  * pname:bufferAddress specifies a physical address of the slink:VkBuffer
-    used as index buffer.
-  * pname:size is the byte size range which is available for this operation
-    from the provided address.
-  * pname:indexType is a elink:VkIndexType value specifying how indices are
-    treated.
-    Instead of the Vulkan enum values, a custom `uint32_t` value can: be
-    mapped to an elink:VkIndexType by specifying the
-    sname:VkIndirectCommandsLayoutTokenNV::pname:pIndexTypes and
-    sname:VkIndirectCommandsLayoutTokenNV::pname:pIndexTypeValues arrays.
-
-.Valid Usage
-****
-  * [[VUID-VkBindIndexBufferIndirectCommandNV-None-02946]]
-    The buffer's usage flag from which the address was acquired must: have
-    the ename:VK_BUFFER_USAGE_INDEX_BUFFER_BIT bit set
-  * [[VUID-VkBindIndexBufferIndirectCommandNV-bufferAddress-02947]]
-    The pname:bufferAddress must: be aligned to the pname:indexType used
-  * [[VUID-VkBindIndexBufferIndirectCommandNV-None-02948]]
-    Each element of the buffer from which the address was acquired and that
-    is non-sparse must: be bound completely and contiguously to a single
-    sname:VkDeviceMemory object
-****
-
-include::{generated}/validity/structs/VkBindIndexBufferIndirectCommandNV.txt[]
---
-
-[open,refpage='VkBindVertexBufferIndirectCommandNV',desc='Structure specifying input data for a single vertex buffer command token',type='structs']
---
-The sname:VkBindVertexBufferIndirectCommandNV structure specifies the input
-data for the ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV token.
-
-include::{generated}/api/structs/VkBindVertexBufferIndirectCommandNV.txt[]
-
-  * pname:bufferAddress specifies a physical address of the slink:VkBuffer
-    used as vertex input binding.
-  * pname:size is the byte size range which is available for this operation
-    from the provided address.
-  * pname:stride is the byte size stride for this vertex input binding as in
-    sname:VkVertexInputBindingDescription::pname:stride.
-    It is only used if
-    sname:VkIndirectCommandsLayoutTokenNV::pname:vertexDynamicStride was
-    set, otherwise the stride is inherited from the current bound graphics
-    pipeline.
-
-.Valid Usage
-****
-  * [[VUID-VkBindVertexBufferIndirectCommandNV-None-02949]]
-    The buffer's usage flag from which the address was acquired must: have
-    the ename:VK_BUFFER_USAGE_VERTEX_BUFFER_BIT bit set
-  * [[VUID-VkBindVertexBufferIndirectCommandNV-None-02950]]
-    Each element of the buffer from which the address was acquired and that
-    is non-sparse must: be bound completely and contiguously to a single
-    sname:VkDeviceMemory object
-****
-
-include::{generated}/validity/structs/VkBindVertexBufferIndirectCommandNV.txt[]
---
-
-[open,refpage='VkSetStateFlagsIndirectCommandNV',desc='Structure specifying input data for a single state flag command token',type='structs']
---
-The sname:VkSetStateFlagsIndirectCommandNV structure specifies the input
-data for the ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV token.
-Which state is changed depends on the elink:VkIndirectStateFlagBitsNV
-specified at sname:VkIndirectCommandsLayoutNV creation time.
-
-include::{generated}/api/structs/VkSetStateFlagsIndirectCommandNV.txt[]
-
-  * pname:data encodes packed state that this command alters.
-  ** Bit `0`: If set represents ename:VK_FRONT_FACE_CLOCKWISE, otherwise
-     ename:VK_FRONT_FACE_COUNTER_CLOCKWISE
-
-include::{generated}/validity/structs/VkSetStateFlagsIndirectCommandNV.txt[]
---
-
-[open,refpage='VkIndirectStateFlagBitsNV',desc='Bitmask specifiying state that can be altered on the device',type='enums']
---
-A subset of the graphics pipeline state can: be altered using indirect state
-flags:
-
-include::{generated}/api/enums/VkIndirectStateFlagBitsNV.txt[]
-
-* ename:VK_INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV allows to toggle the
-  elink:VkFrontFace rasterization state for subsequent draw operations.
---
-
-[open,refpage='VkIndirectStateFlagsNV',desc='Bitmask of VkIndirectStateFlagBitsNV',type='flags']
---
-include::{generated}/api/flags/VkIndirectStateFlagsNV.txt[]
-
-tname:VkIndirectStateFlagsNV is a bitmask type for setting a mask of zero or
-more elink:VkIndirectStateFlagBitsNV.
---
-
-
-=== Tokenized Command Processing
-
-The processing is in principle illustrated below:
-
-[source,c]
----------------------------------------------------
-void cmdProcessSequence(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsStreams, s)
-{
-  for (t = 0; t < indirectCommandsLayout.tokenCount; t++)
-  {
-    uint32_t stream  = indirectCommandsLayout.pTokens[t].stream;
-    uint32_t offset  = indirectCommandsLayout.pTokens[t].offset;
-    uint32_t stride  = indirectCommandsLayout.pStreamStrides[stream];
-    stream            = pIndirectCommandsStreams[stream];
-    const void* input = stream.buffer.pointer( stream.offset + stride * s + offset )
-
-    // further details later
-    indirectCommandsLayout.pTokens[t].command (cmd, pipeline, input, s);
-  }
-}
-
-void cmdProcessAllSequences(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsStreams, sequencesCount)
-{
-  for (s = 0; s < sequencesCount; s++)
-  {
-    cmdProcessSequence(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsStreams, s);
-  }
-}
----------------------------------------------------
-
-The processing of each sequence is considered stateless, therefore all state
-changes must: occur prior work provoking commands within the sequence.
-A single sequence is strictly targeting the elink:VkPipelineBindPoint it was
-created with.
-
-The primary input data for each token is provided through sname:VkBuffer
-content at preprocessing using flink:vkCmdPreprocessGeneratedCommandsNV or
-execution time using flink:vkCmdExecuteGeneratedCommandsNV, however some
-functional arguments, for example binding sets, are specified at layout
-creation time.
-The input size is different for each token.
-
-[open,refpage='VkIndirectCommandsTokenTypeNV',desc='Enum specifying token commands',type='enums']
---
-Possible values of those elements of the
-slink:VkIndirectCommandsLayoutCreateInfoNV::pname:pTokens array which
-specify command tokens (other elements of the array specify command
-parameters) are:
-
-include::{generated}/api/enums/VkIndirectCommandsTokenTypeNV.txt[]
-
-.Supported indirect command tokens
-[width="80%",cols="67%,33%",options="header",align="center"]
-|====
-|Token type                                                 | Equivalent command
-|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV      | flink:vkCmdBindPipelineShaderGroupNV
-|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV       | -
-|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV      | flink:vkCmdBindIndexBuffer
-|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV     | flink:vkCmdBindVertexBuffers
-|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV     | flink:vkCmdPushConstants
-|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV      | flink:vkCmdDrawIndexedIndirect
-|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV              | flink:vkCmdDrawIndirect
-ifdef::VK_NV_mesh_shader[]
-|ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV        | flink:vkCmdDrawMeshTasksIndirectNV
-endif::VK_NV_mesh_shader[]
-|====
---
-
-[open,refpage='VkIndirectCommandsLayoutTokenNV',desc='Struct specifying the details of an indirect command layout token',type='structs']
---
-The sname:VkIndirectCommandsLayoutTokenNV structure specifies details to the
-function arguments that need to be known at layout creation time:
-
-include::{generated}/api/structs/VkIndirectCommandsLayoutTokenNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:tokenType specifies the token command type.
-  * pname:stream is the index of the input stream that contains the token
-    argument data.
-  * pname:offset is a relative starting offset within the input stream
-    memory for the token argument data.
-  * pname:vertexBindingUnit is used for the vertex buffer binding command.
-  * pname:vertexDynamicStride sets if the vertex buffer stride is provided
-    by the binding command rather than the current bound graphics pipeline
-    state.
-  * pname:pushconstantPipelineLayout is the sname:VkPipelineLayout used for
-    the push constant command.
-  * pname:pushconstantShaderStageFlags are the shader stage flags used for
-    the push constant command.
-  * pname:pushconstantOffset is the offset used for the push constant
-    command.
-  * pname:pushconstantSize is the size used for the push constant command.
-  * pname:indirectStateFlags are the active states for the state flag
-    command.
-  * pname:indexTypeCount is the optional size of the pname:pIndexTypes and
-    pname:pIndexTypeValues array pairings.
-    If not zero, it allows to register a custom `uint32_t` value to be
-    treated as specific ename:VkIndexType.
-  * pname:pIndexTypes is the used ename:VkIndexType for the corresponding
-    `uint32_t` value entry in pname:pIndexTypeValues.
-
-.Valid Usage
-****
-  * [[VUID-VkIndirectCommandsLayoutTokenNV-stream-02951]]
-    pname:stream must: be smaller than
-    sname:VkIndirectCommandsLayoutCreateInfoNV::pname:streamCount
-  * [[VUID-VkIndirectCommandsLayoutTokenNV-offset-02952]]
-    pname:offset must: be less than or equal to
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxIndirectCommandsTokenOffset
-  * [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02976]]
-    If pname:tokenType is
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV,
-    pname:vertexBindingUnit must: stay within device supported limits for
-    the appropriate commands
-  * [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02977]]
-    If pname:tokenType is
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,
-    pname:pushconstantPipelineLayout must: be valid
-  * [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02978]]
-    If pname:tokenType is
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,
-    pname:pushconstantOffset must: be a multiple of `4`
-  * [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02979]]
-    If pname:tokenType is
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,
-    pname:pushconstantSize must: be a multiple of `4`
-  * [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02980]]
-    If pname:tokenType is
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,
-    pname:pushconstantOffset must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxPushConstantsSize
-  * [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02981]]
-    If pname:tokenType is
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,
-    pname:pushconstantSize must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPushConstantsSize minus
-    pname:pushconstantOffset
-  * [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02982]]
-    If pname:tokenType is
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, for each byte in
-    the range specified by pname:pushconstantOffset and
-    pname:pushconstantSize and for each shader stage in
-    pname:pushconstantShaderStageFlags, there must: be a push constant range
-    in pname:pushconstantPipelineLayout that includes that byte and that
-    stage
-  * [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02983]]
-    If pname:tokenType is
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, for each byte in
-    the range specified by pname:pushconstantOffset and
-    pname:pushconstantSize and for each push constant range that overlaps
-    that byte, pname:pushconstantShaderStageFlags must: include all stages
-    in that push constant range's
-    slink:VkPushConstantRange::pname:stageFlags
-  * [[VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02984]]
-    If pname:tokenType is
-    ename:VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV,
-    pname:indirectStateFlags must: not be `0`
-****
-
-include::{generated}/validity/structs/VkIndirectCommandsLayoutTokenNV.txt[]
---
-
-The following code provides detailed information on how an individual
-sequence is processed.
-For valid usage, all restrictions from the regular commands apply.
-
-[source,c]
----------------------------------------------------
-void cmdProcessSequence(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsStreams, s)
-{
-  for (uint32_t t = 0; t < indirectCommandsLayout.tokenCount; t++){
-    token = indirectCommandsLayout.pTokens[t];
-
-    uint32_t stride   = indirectCommandsLayout.pStreamStrides[token.stream];
-    stream            = pIndirectCommandsStreams[token.stream];
-    uint32_t offset   = stream.offset + stride * s + token.offset;
-    const void* input = stream.buffer.pointer( offset )
-
-    switch(input.type){
-    VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV:
-      VkBindShaderGroupIndirectCommandNV* bind = input;
-
-      vkCmdBindPipelineShaderGroupNV(cmd, indirectCommandsLayout.pipelineBindPoint,
-        pipeline, bind->groupIndex);
-    break;
-
-    VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV:
-      VkSetStateFlagsIndirectCommandNV* state = input;
-
-      if (token.indirectStateFlags & VK_INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV){
-        if (state.data & (1 << 0)){
-          set VK_FRONT_FACE_CLOCKWISE;
-        } else {
-          set VK_FRONT_FACE_COUNTER_CLOCKWISE;
-        }
-      }
-    break;
-
-    VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV:
-      uint32_t* data = input;
-
-      vkCmdPushConstants(cmd,
-        token.pushconstantPipelineLayout
-        token.pushconstantStageFlags,
-        token.pushconstantOffset,
-        token.pushconstantSize, data);
-    break;
-
-    VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV:
-      VkBindIndexBufferIndirectCommandNV* data = input;
-
-      // the indexType may optionally be remapped
-      // from a custom uint32_t value, via
-      // VkIndirectCommandsLayoutTokenNV::pIndexTypeValues
-
-      vkCmdBindIndexBuffer(cmd,
-        deriveBuffer(data->bufferAddress),
-        deriveOffset(data->bufferAddress),
-        data->indexType);
-    break;
-
-    VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV:
-      VkBindVertexBufferIndirectCommandNV* data = input;
-
-      // if token.vertexDynamicStride is VK_TRUE
-      // then the stride for this binding is set
-      // using data->stride as well
-
-      vkCmdBindVertexBuffers(cmd,
-        token.vertexBindingUnit, 1,
-        &deriveBuffer(data->bufferAddress),
-        &deriveOffset(data->bufferAddress));
-    break;
-
-    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV:
-      vkCmdDrawIndexedIndirect(cmd,
-        stream.buffer, offset, 1, 0);
-    break;
-
-    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV:
-      vkCmdDrawIndirect(cmd,
-        stream.buffer,
-        offset, 1, 0);
-    break;
-
-    // only available if VK_NV_mesh_shader is supported
-    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NV:
-      vkCmdDrawMeshTasksIndirectNV(cmd,
-        stream.buffer, offset, 1, 0);
-    break;
-    }
-  }
-}
----------------------------------------------------
diff --git a/registry/vulkan/chapters/VK_NV_external_memory/allocate_memory.txt b/registry/vulkan/chapters/VK_NV_external_memory/allocate_memory.txt
deleted file mode 100644
index 317fa5a..0000000
--- a/registry/vulkan/chapters/VK_NV_external_memory/allocate_memory.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-When allocating memory that may: be exported to another process or Vulkan
-instance, add a slink:VkExportMemoryAllocateInfoNV structure to the
-pname:pNext chain of the slink:VkMemoryAllocateInfo structure, specifying
-the handle types that may: be exported.
-
-[open,refpage='VkExportMemoryAllocateInfoNV',desc='Specify memory handle types that may be exported',type='structs']
---
-The slink:VkExportMemoryAllocateInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkExportMemoryAllocateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleTypes is a bitmask of
-    elink:VkExternalMemoryHandleTypeFlagBitsNV specifying one or more memory
-    handle types that may: be exported.
-    Multiple handle types may: be requested for the same allocation as long
-    as they are compatible, as reported by
-    flink:vkGetPhysicalDeviceExternalImageFormatPropertiesNV.
-
-include::{generated}/validity/structs/VkExportMemoryAllocateInfoNV.txt[]
---
diff --git a/registry/vulkan/chapters/VK_NV_external_memory_capabilities/external_image_format.txt b/registry/vulkan/chapters/VK_NV_external_memory_capabilities/external_image_format.txt
deleted file mode 100644
index 156187e..0000000
--- a/registry/vulkan/chapters/VK_NV_external_memory_capabilities/external_image_format.txt
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='vkGetPhysicalDeviceExternalImageFormatPropertiesNV',desc='Determine image capabilities compatible with external memory handle types',type='protos']
---
-To determine the image capabilities compatible with an external memory
-handle type, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceExternalImageFormatPropertiesNV.txt[]
-
-  * pname:physicalDevice is the physical device from which to query the
-    image capabilities
-  * pname:format is the image format, corresponding to
-    slink:VkImageCreateInfo::pname:format.
-  * pname:type is the image type, corresponding to
-    slink:VkImageCreateInfo::pname:imageType.
-  * pname:tiling is the image tiling, corresponding to
-    slink:VkImageCreateInfo::pname:tiling.
-  * pname:usage is the intended usage of the image, corresponding to
-    slink:VkImageCreateInfo::pname:usage.
-  * pname:flags is a bitmask describing additional parameters of the image,
-    corresponding to slink:VkImageCreateInfo::pname:flags.
-  * pname:externalHandleType is either one of the bits from
-    elink:VkExternalMemoryHandleTypeFlagBitsNV, or 0.
-  * pname:pExternalImageFormatProperties is a pointer to a
-    slink:VkExternalImageFormatPropertiesNV structure in which capabilities
-    are returned.
-
-If pname:externalHandleType is 0,
-pname:pExternalImageFormatProperties->imageFormatProperties will return the
-same values as a call to flink:vkGetPhysicalDeviceImageFormatProperties, and
-the other members of pname:pExternalImageFormatProperties will all be 0.
-Otherwise, they are filled in as described for
-slink:VkExternalImageFormatPropertiesNV.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceExternalImageFormatPropertiesNV.txt[]
---
-
-[open,refpage='VkExternalImageFormatPropertiesNV',desc='Structure specifying external image format properties',type='structs']
---
-The sname:VkExternalImageFormatPropertiesNV structure is defined as:
-
-include::{generated}/api/structs/VkExternalImageFormatPropertiesNV.txt[]
-
-  * pname:imageFormatProperties will be filled in as when calling
-    flink:vkGetPhysicalDeviceImageFormatProperties, but the values returned
-    may: vary depending on the external handle type requested.
-  * pname:externalMemoryFeatures is a bitmask of
-    elink:VkExternalMemoryFeatureFlagBitsNV, indicating properties of the
-    external memory handle type
-    (flink:vkGetPhysicalDeviceExternalImageFormatPropertiesNV::pname:externalHandleType)
-    being queried, or 0 if the external memory handle type is 0.
-  * pname:exportFromImportedHandleTypes is a bitmask of
-    elink:VkExternalMemoryHandleTypeFlagBitsNV containing a bit set for
-    every external handle type that may: be used to create memory from which
-    the handles of the type specified in
-    flink:vkGetPhysicalDeviceExternalImageFormatPropertiesNV::pname:externalHandleType
-    can: be exported, or 0 if the external memory handle type is 0.
-  * pname:compatibleHandleTypes is a bitmask of
-    elink:VkExternalMemoryHandleTypeFlagBitsNV containing a bit set for
-    every external handle type that may: be specified simultaneously with
-    the handle type specified by
-    flink:vkGetPhysicalDeviceExternalImageFormatPropertiesNV::pname:externalHandleType
-    when calling flink:vkAllocateMemory, or 0 if the external memory handle
-    type is 0.
-    pname:compatibleHandleTypes will always contain
-    flink:vkGetPhysicalDeviceExternalImageFormatPropertiesNV::pname:externalHandleType
-
-include::{generated}/validity/structs/VkExternalImageFormatPropertiesNV.txt[]
---
-
-[open,refpage='VkExternalMemoryFeatureFlagBitsNV',desc='Bitmask specifying external memory features',type='enums',xrefs='vkGetPhysicalDeviceExternalImageFormatPropertiesNV VkExternalImageFormatPropertiesNV']
---
-Bits which can: be set in
-slink:VkExternalImageFormatPropertiesNV::pname:externalMemoryFeatures,
-indicating properties of the external memory handle type, are:
-
-include::{generated}/api/enums/VkExternalMemoryFeatureFlagBitsNV.txt[]
-
-  * ename:VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV specifies that
-    external memory of the specified type must: be created as a dedicated
-    allocation when used in the manner specified.
-  * ename:VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV specifies that the
-    implementation supports exporting handles of the specified type.
-  * ename:VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV specifies that the
-    implementation supports importing handles of the specified type.
---
-
-[open,refpage='VkExternalMemoryFeatureFlagsNV',desc='Bitmask of VkExternalMemoryFeatureFlagBitsNV',type='flags']
---
-include::{generated}/api/flags/VkExternalMemoryFeatureFlagsNV.txt[]
-
-tname:VkExternalMemoryFeatureFlagsNV is a bitmask type for setting a mask of
-zero or more elink:VkExternalMemoryFeatureFlagBitsNV.
---
diff --git a/registry/vulkan/chapters/VK_NV_external_memory_win32/get_handle_win32.txt b/registry/vulkan/chapters/VK_NV_external_memory_win32/get_handle_win32.txt
deleted file mode 100644
index 8871f5c..0000000
--- a/registry/vulkan/chapters/VK_NV_external_memory_win32/get_handle_win32.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='vkGetMemoryWin32HandleNV',desc='Retrieve Win32 handle to a device memory object',type='protos']
---
-To retrieve the handle corresponding to a device memory object created with
-slink:VkExportMemoryAllocateInfoNV::pname:handleTypes set to include
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV or
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_NV, call:
-
-include::{generated}/api/protos/vkGetMemoryWin32HandleNV.txt[]
-
-  * pname:device is the logical device that owns the memory.
-  * pname:memory is the slink:VkDeviceMemory object.
-  * pname:handleType is a bitmask of
-    elink:VkExternalMemoryHandleTypeFlagBitsNV containing a single bit
-    specifying the type of handle requested.
-  * pname:handle is a pointer to a Windows code:HANDLE in which the handle
-    is returned.
-
-.Valid Usage
-****
-  * [[VUID-vkGetMemoryWin32HandleNV-handleType-01326]]
-    pname:handleType must: be a flag specified in
-    slink:VkExportMemoryAllocateInfoNV::pname:handleTypes when allocating
-    pname:memory
-****
-
-include::{generated}/validity/protos/vkGetMemoryWin32HandleNV.txt[]
---
diff --git a/registry/vulkan/chapters/VK_NV_external_memory_win32/handle_permissions.txt b/registry/vulkan/chapters/VK_NV_external_memory_win32/handle_permissions.txt
deleted file mode 100644
index 3eed85c..0000000
--- a/registry/vulkan/chapters/VK_NV_external_memory_win32/handle_permissions.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='VkExportMemoryWin32HandleInfoNV',desc='Specify security attributes and access rights for Win32 memory handles',type='structs']
---
-When slink:VkExportMemoryAllocateInfoNV::pname:handleTypes includes
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV, add a
-sname:VkExportMemoryWin32HandleInfoNV structure to the pname:pNext chain of
-the slink:VkExportMemoryAllocateInfoNV structure to specify security
-attributes and access rights for the memory object's external handle.
-
-The sname:VkExportMemoryWin32HandleInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkExportMemoryWin32HandleInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pAttributes is a pointer to a Windows code:SECURITY_ATTRIBUTES
-    structure specifying security attributes of the handle.
-  * pname:dwAccess is a code:DWORD specifying access rights of the handle.
-
-If this structure is not present, or if pname:pAttributes is set to `NULL`,
-default security descriptor values will be used, and child processes created
-by the application will not inherit the handle, as described in the MSDN
-documentation for "`Synchronization Object Security and Access Rights`"^1^.
-Further, if the structure is not present, the access rights will be
-
-code:DXGI_SHARED_RESOURCE_READ | code:DXGI_SHARED_RESOURCE_WRITE
-
-1::
-    https://docs.microsoft.com/en-us/windows/win32/sync/synchronization-object-security-and-access-rights
-
-include::{generated}/validity/structs/VkExportMemoryWin32HandleInfoNV.txt[]
---
diff --git a/registry/vulkan/chapters/VK_NV_external_memory_win32/import_memory_win32.txt b/registry/vulkan/chapters/VK_NV_external_memory_win32/import_memory_win32.txt
deleted file mode 100644
index 679081f..0000000
--- a/registry/vulkan/chapters/VK_NV_external_memory_win32/import_memory_win32.txt
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='VkImportMemoryWin32HandleInfoNV',desc='Import Win32 memory created on the same physical device',type='structs']
---
-To import memory created on the same physical device but outside of the
-current Vulkan instance, add a slink:VkImportMemoryWin32HandleInfoNV
-structure to the pname:pNext chain of the slink:VkMemoryAllocateInfo
-structure, specifying a handle to and the type of the memory.
-
-The sname:VkImportMemoryWin32HandleInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkImportMemoryWin32HandleInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleType is `0` or a elink:VkExternalMemoryHandleTypeFlagBitsNV
-    value specifying the type of memory handle in pname:handle.
-  * pname:handle is a Windows code:HANDLE referring to the memory.
-
-If pname:handleType is `0`, this structure is ignored by consumers of the
-slink:VkMemoryAllocateInfo structure it is chained from.
-
-.Valid Usage
-****
-  * [[VUID-VkImportMemoryWin32HandleInfoNV-handleType-01327]]
-    pname:handleType must: not have more than one bit set
-  * [[VUID-VkImportMemoryWin32HandleInfoNV-handle-01328]]
-    pname:handle must: be a valid handle to memory, obtained as specified by
-    pname:handleType
-****
-
-include::{generated}/validity/structs/VkImportMemoryWin32HandleInfoNV.txt[]
---
-Bits which can: be set in pname:handleType are:
-
-[open,refpage='VkExternalMemoryHandleTypeFlagBitsNV',desc='Bitmask specifying external memory handle types',type='enums']
---
-Possible values of slink:VkImportMemoryWin32HandleInfoNV::pname:handleType,
-specifying the type of an external memory handle, are:
-
-include::{generated}/api/enums/VkExternalMemoryHandleTypeFlagBitsNV.txt[]
-
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_NV specifies a
-    handle to memory returned by flink:vkGetMemoryWin32HandleNV.
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV specifies a
-    handle to memory returned by flink:vkGetMemoryWin32HandleNV, or one
-    duplicated from such a handle using `DuplicateHandle()`.
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_BIT_NV specifies a
-    valid NT handle to memory returned by
-    `IDXGIResource1::CreateSharedHandle`, or a handle duplicated from such a
-    handle using `DuplicateHandle()`.
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_KMT_BIT_NV specifies a
-    handle to memory returned by `IDXGIResource::GetSharedHandle()`.
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-(Jon) If additional (non-Win32) bits are added to the possible memory types,
-this type should move to the `apiext:VK_NV_external_memory_capabilities`
-section, and each bit would then be protected by ifdefs for the extension it
-is defined by.
-====
-endif::editing-notes[]
---
-
-[open,refpage='VkExternalMemoryHandleTypeFlagsNV',desc='Bitmask of VkExternalMemoryHandleTypeFlagBitsNV',type='flags']
---
-include::{generated}/api/flags/VkExternalMemoryHandleTypeFlagsNV.txt[]
-
-tname:VkExternalMemoryHandleTypeFlagsNV is a bitmask type for setting a mask
-of zero or more elink:VkExternalMemoryHandleTypeFlagBitsNV.
---
-
diff --git a/registry/vulkan/chapters/VK_NV_mesh_shader/drawing.txt b/registry/vulkan/chapters/VK_NV_mesh_shader/drawing.txt
deleted file mode 100644
index 857638d..0000000
--- a/registry/vulkan/chapters/VK_NV_mesh_shader/drawing.txt
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[drawing-mesh-shading]]
-== Programmable Mesh Shading
-
-In this drawing approach, primitives are assembled by the mesh shader stage.
-<<mesh, Mesh shading>> operates similarly to <<dispatch, dispatching
-compute>> as the shaders make use of workgroups.
-
-
-[open,refpage='vkCmdDrawMeshTasksNV',desc='Draw mesh task work items',type='protos']
---
-:refpage: vkCmdDrawMeshTasksNV
-
-To record a draw that uses the mesh pipeline, call:
-
-include::{generated}/api/protos/vkCmdDrawMeshTasksNV.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:taskCount is the number of local workgroups to dispatch in the X
-    dimension.
-    Y and Z dimension are implicitly set to one.
-  * pname:firstTask is the X component of the first workgroup ID.
-
-When the command is executed, a global workgroup consisting of
-pname:taskCount local workgroups is assembled.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_common.txt[]
-  * [[VUID-vkCmdDrawMeshTasksNV-taskCount-02119]]
-    pname:taskCount must: be less than or equal to
-    sname:VkPhysicalDeviceMeshShaderPropertiesNV::pname:maxDrawMeshTasksCount
-****
-
-include::{generated}/validity/protos/vkCmdDrawMeshTasksNV.txt[]
---
-
-[open,refpage='vkCmdDrawMeshTasksIndirectNV',desc='Issue an indirect mesh tasks draw into a command buffer',type='protos']
---
-:refpage: vkCmdDrawMeshTasksIndirectNV
-
-To record an indirect mesh tasks draw, call:
-
-include::{generated}/api/protos/vkCmdDrawMeshTasksIndirectNV.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:buffer is the buffer containing draw parameters.
-  * pname:offset is the byte offset into pname:buffer where parameters
-    begin.
-  * pname:drawCount is the number of draws to execute, and can: be zero.
-  * pname:stride is the byte stride between successive sets of draw
-    parameters.
-
-fname:vkCmdDrawMeshTasksIndirectNV behaves similarly to
-flink:vkCmdDrawMeshTasksNV except that the parameters are read by the device
-from a buffer during execution.
-pname:drawCount draws are executed by the command, with parameters taken
-from pname:buffer starting at pname:offset and increasing by pname:stride
-bytes for each successive draw.
-The parameters of each draw are encoded in an array of
-slink:VkDrawMeshTasksIndirectCommandNV structures.
-If pname:drawCount is less than or equal to one, pname:stride is ignored.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_common.txt[]
-include::{chapters}/commonvalidity/draw_dispatch_indirect_common.txt[]
-include::{chapters}/commonvalidity/draw_indirect_drawcount.txt[]
-  * [[VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146]]
-    If pname:drawCount is greater than `1`, pname:stride must: be a multiple
-    of `4` and must: be greater than or equal to
-    code:sizeof(sname:VkDrawMeshTasksIndirectCommandNV)
-  * [[VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02156]]
-    If pname:drawCount is equal to `1`, [eq]#(pname:offset {plus}
-    code:sizeof(slink:VkDrawMeshTasksIndirectCommandNV))# must: be less than
-    or equal to the size of pname:buffer
-  * [[VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157]]
-    If pname:drawCount is greater than `1`, [eq]#(pname:stride {times}
-    (pname:drawCount - 1) {plus} pname:offset {plus}
-    code:sizeof(slink:VkDrawMeshTasksIndirectCommandNV))# must: be less than
-    or equal to the size of pname:buffer
-****
-
-include::{generated}/validity/protos/vkCmdDrawMeshTasksIndirectNV.txt[]
---
-
-[open,refpage='VkDrawMeshTasksIndirectCommandNV',desc='Structure specifying a mesh tasks draw indirect command',type='structs',xrefs='vkCmdDrawMeshTasksIndirectNV']
---
-The sname:VkDrawMeshTasksIndirectCommandNV structure is defined as:
-
-include::{generated}/api/structs/VkDrawMeshTasksIndirectCommandNV.txt[]
-
-  * pname:taskCount is the number of local workgroups to dispatch in the X
-    dimension.
-    Y and Z dimension are implicitly set to one.
-  * pname:firstTask is the X component of the first workgroup ID.
-
-The members of sname:VkDrawMeshTasksIndirectCommandNV have the same meaning
-as the similarly named parameters of flink:vkCmdDrawMeshTasksNV.
-
-.Valid Usage
-****
-  * [[VUID-VkDrawMeshTasksIndirectCommandNV-taskCount-02175]]
-    pname:taskCount must: be less than or equal to
-    sname:VkPhysicalDeviceMeshShaderPropertiesNV::pname:maxDrawMeshTasksCount
-****
-
-include::{generated}/validity/structs/VkDrawMeshTasksIndirectCommandNV.txt[]
---
-
-[open,refpage='vkCmdDrawMeshTasksIndirectCountNV',desc='Perform an indirect mesh tasks draw with the draw count sourced from a buffer',type='protos']
---
-:refpage: vkCmdDrawMeshTasksIndirectCountNV
-
-To record an indirect mesh tasks draw with the draw count sourced from a
-buffer, call:
-
-include::{generated}/api/protos/vkCmdDrawMeshTasksIndirectCountNV.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:buffer is the buffer containing draw parameters.
-  * pname:offset is the byte offset into pname:buffer where parameters
-    begin.
-  * pname:countBuffer is the buffer containing the draw count.
-  * pname:countBufferOffset is the byte offset into pname:countBuffer where
-    the draw count begins.
-  * pname:maxDrawCount specifies the maximum number of draws that will be
-    executed.
-    The actual number of executed draw calls is the minimum of the count
-    specified in pname:countBuffer and pname:maxDrawCount.
-  * pname:stride is the byte stride between successive sets of draw
-    parameters.
-
-fname:vkCmdDrawMeshTasksIndirectCountNV behaves similarly to
-flink:vkCmdDrawMeshTasksIndirectNV except that the draw count is read by the
-device from a buffer during execution.
-The command will read an unsigned 32-bit integer from pname:countBuffer
-located at pname:countBufferOffset and use this as the draw count.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_common.txt[]
-include::{chapters}/commonvalidity/draw_dispatch_indirect_common.txt[]
-include::{chapters}/commonvalidity/draw_indirect_count_common.txt[]
-  * [[VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182]]
-    pname:stride must: be a multiple of `4` and must: be greater than or
-    equal to code:sizeof(sname:VkDrawMeshTasksIndirectCommandNV)
-  * [[VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183]]
-    If pname:maxDrawCount is greater than or equal to `1`,
-    [eq]#(pname:stride {times} (pname:maxDrawCount - 1) {plus} pname:offset
-    {plus} code:sizeof(sname:VkDrawMeshTasksIndirectCommandNV))# must: be
-    less than or equal to the size of pname:buffer
-  * [[VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02191]]
-    If the count stored in pname:countBuffer is equal to `1`,
-    [eq]#(pname:offset {plus}
-    code:sizeof(sname:VkDrawMeshTasksIndirectCommandNV))# must: be less than
-    or equal to the size of pname:buffer
-  * [[VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02192]]
-    If the count stored in pname:countBuffer is greater than `1`,
-    [eq]#(pname:stride {times} (pname:drawCount - 1) {plus} pname:offset
-    {plus} code:sizeof(sname:VkDrawMeshTasksIndirectCommandNV))# must: be
-    less than or equal to the size of pname:buffer
-****
-
-include::{generated}/validity/protos/vkCmdDrawMeshTasksIndirectCountNV.txt[]
-
---
diff --git a/registry/vulkan/chapters/VK_NV_mesh_shader/mesh.txt b/registry/vulkan/chapters/VK_NV_mesh_shader/mesh.txt
deleted file mode 100644
index 4a2cf8c..0000000
--- a/registry/vulkan/chapters/VK_NV_mesh_shader/mesh.txt
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[mesh]]
-= Mesh Shading
-
-<<shaders-task,Task>> and <<shaders-mesh,mesh shaders>> operate in
-workgroups to produce a collection of primitives that will be processed by
-subsequent stages of the graphics pipeline.
-
-Work on the mesh pipeline is initiated by the application
-<<drawing-mesh-shading,drawing>> a set of mesh tasks organized in global
-workgroups.
-If the optional task shader is active, each workgroup triggers the execution
-of task shader invocations that will create a new set of mesh workgroups
-upon completion.
-Each of these created workgroups, or each of the original workgroups if no
-task shader is present, triggers the execution of mesh shader invocations.
-
-Each mesh shader workgroup emits zero or more output primitives along with
-the group of vertices and their associated data required for each output
-primitive.
-
-
-[[mesh-task-input]]
-== Task Shader Input
-For every workgroup issued via the drawing commands a group of task shader
-invocations is executed.
-There are no inputs other than the builtin workgroup identifiers.
-
-
-[[mesh-task-output]]
-== Task Shader Output
-The task shader can emit zero or more mesh workgroups to be generated using
-the <<interfaces-builtin-variables,built-in variable>> code:TaskCountNV.
-This value must: be less than or equal to
-sname:VkPhysicalDeviceMeshShaderPropertiesNV::pname:maxTaskOutputCount.
-
-It can also output user-defined data that is passed as input to all mesh
-shader invocations that the task creates.
-These outputs are decorated as code:PerTaskNV.
-
-
-[[mesh-generation]]
-== Mesh Generation
-If a task shader exists, the mesh assembler creates a variable amount of
-mesh workgroups depending on each task's output.
-If there is no task shader, the drawing commands emit the mesh shader
-invocations directly.
-
-
-[[mesh-input]]
-== Mesh Shader Input
-The only inputs available to the mesh shader are variables identifying the
-specific workgroup and invocation and, if applicable, any outputs written as
-code:PerTaskNV by the task shader that spawned the mesh shader's workgroup.
-The mesh shader can operate without a task shader as well.
-
-
-[[mesh-output]]
-== Mesh Shader Output Primitives
-
-A mesh shader generates primitives in one of three output modes: points,
-lines, or triangles.
-The primitive mode is specified in the shader using an code:OpExecutionMode
-instruction with the code:OutputPoints, code:OutputLinesNV, or
-code:OutputTrianglesNV modes, respectively.
-Each mesh shader must: include exactly one output primitive mode.
-
-The maximum output vertex count is specified as a literal in the shader
-using an code:OpExecutionMode instruction with the mode set to
-code:OutputVertices and must: be less than or equal to
-sname:VkPhysicalDeviceMeshShaderPropertiesNV::pname:maxMeshOutputVertices.
-
-The maximum output primitive count is specified as a literal in the shader
-using an code:OpExecutionMode instruction with the mode set to
-code:OutputPrimitivesNV and must: be less than or equal to
-sname:VkPhysicalDeviceMeshShaderPropertiesNV::pname:maxMeshOutputPrimitives.
-
-The number of primitives output by the mesh shader is provided via writing
-to the <<interfaces-builtin-variables,built-in variable>>
-code:PrimitiveCountNV and must: be less than or equal to the maximum output
-primitive count specified in the shader.
-A variable decorated with code:PrimitiveIndicesNV is an output array of
-local index values into the vertex output arrays from which primitives are
-assembled according to the output primitive type.
-These resulting primitives are then further processed as described in
-<<primsrast>>.
-
-
-[[mesh-output-perview]]
-== Mesh Shader Per-View Outputs
-
-The mesh shader outputs decorated with the code:PositionPerViewNV,
-code:ClipDistancePerViewNV, code:CullDistancePerViewNV, code:LayerPerViewNV,
-and code:ViewportMaskPerViewNV built-in decorations are the per-view
-versions of the single-view variables with equivalent names (that is
-code:Position, code:ClipDistance, code:CullDistance, code:Layer, and
-code:ViewportMaskNV, respectively).
-If a shader statically assigns a value to any element of a per-view array it
-must: not statically assign a value to the equivalent single-view variable.
-
-Each of these outputs is considered arrayed, with separate values for each
-view.
-The view number is used to index the first dimension of these arrays.
-
-The second dimension of the code:ClipDistancePerViewNV, and
-code:CullDistancePerViewNV arrays have the same requirements as the
-code:ClipDistance, and code:CullDistance arrays.
-
-If a mesh shader output is _per-view_, the corresponding fragment shader
-input is taken from the element of the per-view output array that
-corresponds to the view that is currently being processed by the fragment
-shader.
-
-
-[[mesh-ordering]]
-== Mesh Shader Primitive Ordering
-
-Following guarantees are provided for the relative ordering of primitives
-produced by a mesh shader, as they pertain to <<drawing-primitive-order,
-primitive order>>.
-
-  * When a task shader is used, mesh workgroups spawned from lower tasks
-    will be ordered prior those workgroups from subsequent tasks.
-  * All output primitives generated from a given mesh workgroup are passed
-    to subsequent pipeline stages before any output primitives generated
-    from subsequent input workgroups.
-  * All output primitives within a mesh workgroup, will be generated in the
-    ordering provided by the builtin primitive indexbuffer (from low address
-    to high address).
diff --git a/registry/vulkan/chapters/VK_NV_win32_keyed_mutex/keyed_mutex_submit.txt b/registry/vulkan/chapters/VK_NV_win32_keyed_mutex/keyed_mutex_submit.txt
deleted file mode 100644
index 2b74ba3..0000000
--- a/registry/vulkan/chapters/VK_NV_win32_keyed_mutex/keyed_mutex_submit.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2018-2020 NVIDIA Corporation
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[open,refpage='VkWin32KeyedMutexAcquireReleaseInfoNV',desc='Use Windows keyex mutex mechanism to synchronize work',type='structs']
---
-When submitting work that operates on memory imported from a Direct3D 11
-resource to a queue, the keyed mutex mechanism may: be used in addition to
-Vulkan semaphores to synchronize the work.
-Keyed mutexes are a property of a properly created shareable Direct3D 11
-resource.
-They can: only be used if the imported resource was created with the
-etext:D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX flag.
-
-To acquire keyed mutexes before submitted work and/or release them after,
-add a slink:VkWin32KeyedMutexAcquireReleaseInfoNV structure to the
-pname:pNext chain of the slink:VkSubmitInfo structure.
-
-The sname:VkWin32KeyedMutexAcquireReleaseInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkWin32KeyedMutexAcquireReleaseInfoNV.txt[]
-
-  * pname:acquireCount is the number of entries in the pname:pAcquireSyncs,
-    pname:pAcquireKeys, and pname:pAcquireTimeoutMilliseconds arrays.
-  * pname:pAcquireSyncs is a pointer to an array of slink:VkDeviceMemory
-    objects which were imported from Direct3D 11 resources.
-  * pname:pAcquireKeys is a pointer to an array of mutex key values to wait
-    for prior to beginning the submitted work.
-    Entries refer to the keyed mutex associated with the corresponding
-    entries in pname:pAcquireSyncs.
-  * pname:pAcquireTimeoutMilliseconds is a pointer to an array of timeout
-    values, in millisecond units, for each acquire specified in
-    pname:pAcquireKeys.
-  * pname:releaseCount is the number of entries in the pname:pReleaseSyncs
-    and pname:pReleaseKeys arrays.
-  * pname:pReleaseSyncs is a pointer to an array of slink:VkDeviceMemory
-    objects which were imported from Direct3D 11 resources.
-  * pname:pReleaseKeys is a pointer to an array of mutex key values to set
-    when the submitted work has completed.
-    Entries refer to the keyed mutex associated with the corresponding
-    entries in pname:pReleaseSyncs.
-
-include::{generated}/validity/structs/VkWin32KeyedMutexAcquireReleaseInfoNV.txt[]
---
diff --git a/registry/vulkan/chapters/VK_QCOM_rotated_copies/rotated_addressing_blits.txt b/registry/vulkan/chapters/VK_QCOM_rotated_copies/rotated_addressing_blits.txt
deleted file mode 100644
index fbccc49..0000000
--- a/registry/vulkan/chapters/VK_QCOM_rotated_copies/rotated_addressing_blits.txt
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) 2020 Qualcomm Technologies Incorporated
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[copies-images-scaling-rotation]]
-=== Image Blits with Scaling and Rotation
-
-When slink:VkCopyCommandTransformInfoQCOM is in the pname:pNext chain of
-slink:VkImageBlit2KHR, the specified region is rotated during the blit.
-The following description of rotated addressing replaces the description in
-flink:vkCmdBlitImage.
-
-The following code computes rotation of normalized coordinates.
-
-[source,c]
----------------------------------------------------
-// rotation of normalized coordinates
-VkOffset2D RotateNormUV(VkOffset2D in, VkSurfaceTransformFlagBitsKHR flags)
-{
-    VkOffset2D output;
-    switch (flags)
-    {
-        case VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR:
-            out.x = in.x;
-            out.y = in.y;
-            break;
-        case VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR:
-            out.x = in.y;
-            out.y = 1.0 - in.x;
-            break;
-        case VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR:
-            out.x = 1.0 - in.x;
-            out.y = 1.0 - in.y;
-            break;
-        case VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR:
-            out.x = 1.0 - in.y;
-            out.y = in.x;
-            break;
-    }
-    return out;
-}
-
----------------------------------------------------
-
-  * For each destination texel, the integer coordinate of that texel is
-    converted to an unnormalized texture coordinate, using the effective
-    inverse of the equations described in
-    <<textures-unnormalized-to-integer, unnormalized to integer
-    conversion>>:
-  {empty}:: [eq]#u~base~ = i {plus} {onehalf}#
-  {empty}:: [eq]#v~base~ = j {plus} {onehalf}#
-  {empty}:: [eq]#w~base~ = k {plus} {onehalf}#
-  * These base coordinates are then offset by the first destination offset:
-  {empty}:: [eq]#u~offset~ = u~base~ - x~dst0~#
-  {empty}:: [eq]#v~offset~ = v~base~ - y~dst0~#
-  {empty}:: [eq]#w~offset~ = w~base~ - z~dst0~#
-  {empty}:: [eq]#a~offset~ = a - pname:baseArrayCount~dst~#
-
-  * The UV destination coordinates are scaled by the destination region,
-    rotated, and scaled by the source region.
-  {empty}:: [eq]#u~dest_scaled~ = u~offset~ / (x~dst1~ - x~dst0~)#
-  {empty}:: [eq]#v~dest_scaled~ = v~offset~ / (y~dst1~ - y~dst0~)#
-  {empty}:: [eq]#(u~src_scaled~, v~src_scaled~) =
-            code:RotateNormUV(u~dest_scaled~, v~dest_scaled~,
-            pname:transform)#
-  {empty}:: [eq]#u~scaled~ = u~src_scaled~ * (x~Src1~ - x~Src0~)#
-  {empty}:: [eq]#v~scaled~ = v~src_scaled~ * (y~Src1~ - y~Src0~)#
-
-  * The W coordinate is unaffected by rotation.
-    The scale is determined from the ratio of source and destination
-    regions, and applied to the offset coordinate:
-  {empty}:: [eq]#scale~w~ = (z~Src1~ - z~Src0~) / (z~dst1~ - z~dst0~)#
-  {empty}:: [eq]#w~scaled~ = w~offset~ * scale~w~#
-
-
-  * Finally the source offset is added to the scaled source coordinates, to
-    determine the final unnormalized coordinates used to sample from
-    pname:srcImage:
-  {empty}:: [eq]#u = u~scaled~ {plus} x~Src0~#
-  {empty}:: [eq]#v = v~scaled~ {plus} y~Src0~#
-  {empty}:: [eq]#w = w~scaled~ {plus} z~Src0~#
-  {empty}:: [eq]#q = pname:mipLevel#
-  {empty}:: [eq]#a = a~offset~ {plus} pname:baseArrayCount~src~#
-
-These coordinates are used to sample from the source image as described for
-<<textures, Image Operations>>, with the filter mode equal to that of
-pname:filter; a mipmap mode of ename:VK_SAMPLER_MIPMAP_MODE_NEAREST; and an
-address mode of ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE.
-Implementations must: clamp at the edge of the source image, and may:
-additionally clamp to the edge of the source region.
diff --git a/registry/vulkan/chapters/VK_QCOM_rotated_copies/rotated_addressing_copies.txt b/registry/vulkan/chapters/VK_QCOM_rotated_copies/rotated_addressing_copies.txt
deleted file mode 100644
index 7e13f21..0000000
--- a/registry/vulkan/chapters/VK_QCOM_rotated_copies/rotated_addressing_copies.txt
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (c) 2020 Qualcomm Technologies Incorporated
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-
-[[copies-buffers-images-rotation-addressing]]
-=== Buffer and Image Addressing with Rotation
-
-When slink:VkCopyCommandTransformInfoQCOM is in the pname:pNext chain of
-slink:VkBufferImageCopy2KHR, a _rotated copy_ is specified.
-For both flink:vkCmdCopyImageToBuffer2KHR and
-flink:vkCmdCopyBufferToImage2KHR, a rotation is applied to the region used
-for image accesses, but a non-rotated region is used for buffer accesses.
-In the case of rotated flink:vkCmdCopyImageToBuffer2KHR, the source image
-region is rotated.
-In the case of rotated flink:vkCmdCopyBufferToImage2KHR, the destination
-image region is rotated.
-
-For a _rotated copy_, the following description of rotated addressing
-replaces the description in <<copies-buffers-images-addressing,Buffer and
-Image Addressing>>.
-
-The following code computes rotation of unnormalized coordinates.
-[source,c]
----------------------------------------------------
-// Forward rotation of unnormalized coordinates
-VkOffset2D RotateUV(VkOffset2D in, VkSurfaceTransformFlagBitsKHR flags)
-{
-    VkOffset2D output;
-    switch (flags)
-    {
-        case VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR:
-            out.x = in.x;
-            out.y = in.y;
-            break;
-        case VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR:
-            out.x = -in.y;
-            out.y = in.x;
-            break;
-        case VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR:
-            out.x = -in.x;
-            out.y = -in.y;
-            break;
-        case VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR:
-            out.x = in.y;
-            out.y = -in.x;
-            break;
-    }
-    return out;
-}
----------------------------------------------------
-
-Pseudocode for image/buffer addressing of uncompressed formats with rotation
-is:
-
-[source,c]
----------------------------------------------------
-rowLength = region->bufferRowLength;
-if (rowLength == 0)
-    rowLength = region->imageExtent.width;
-
-imageHeight = region->bufferImageHeight;
-if (imageHeight == 0)
-    imageHeight = region->imageExtent.height;
-
-texelBlockSize = <texel block size of the format of the src/dstImage>;
-
-// Buffer addressing is unaffected by rotation:
-address of (x,y,z) = region->bufferOffset + (((z * imageHeight) + y) * rowLength + x) * texelBlockSize;
-
-// When copying from buffer to image, the source buffer coordinates x,y,z range from (0,0,0) to
-// region->imageExtent.{width,height,depth}.  The source extent is rotated by the specified
-// VK_SURFACE_TRANSFORM, centered on the imageOffset, to define a rotated destination region.
-// For each source buffer texel with coordinates (x,y) the rotated destination image texel has
-// coordinates (x',y') defined as:
-(x',y')= RotateUV(x,y) + ImageOffset.{x,y}
-
-// When copying from image to buffer, the the destination buffer coordinates x,y,z range from (0,0,0) to
-// region->imageExtent.{width,height,depth}.  The destination extent is rotated by the specified
-//  VK_SURFACE_TRANSFORM, centered on the imageOffset, to define a rotated source region.  For each destination
-// buffer texel with coordinates (x,y) the rotated source image texel has coordinates (x',y') defined as:
-(x',y')= RotateUV(x,y) + ImageOffset.{x,y}
-
----------------------------------------------------
-
-Note that pname:imageOffset does not affect addressing calculations for
-buffer memory.
-Instead, pname:bufferOffset can: be used to select the starting address in
-buffer memory.
diff --git a/registry/vulkan/chapters/VK_QNX_screen_surface/platformCreateSurface_screen.txt b/registry/vulkan/chapters/VK_QNX_screen_surface/platformCreateSurface_screen.txt
deleted file mode 100644
index af41fd8..0000000
--- a/registry/vulkan/chapters/VK_QNX_screen_surface/platformCreateSurface_screen.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2021 BlackBerry Limited.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformCreateSurface_screen,platformCreateSurface_screen]]
-=== QNX Screen Platform
-
-[open,refpage='vkCreateScreenSurfaceQNX',desc='Create a slink:VkSurfaceKHR object for a QNX Screen window',type='protos']
---
-To create a sname:VkSurfaceKHR object for a QNX Screen surface, call:
-
-include::{generated}/api/protos/vkCreateScreenSurfaceQNX.txt[]
-
-  * pname:instance is the instance to associate the surface with.
-  * pname:pCreateInfo is a pointer to a slink:VkScreenSurfaceCreateInfoQNX
-    structure containing parameters affecting the creation of the surface
-    object.
-  * pname:pAllocator is the allocator used for host memory allocated for the
-    surface object when there is no more specific allocator available (see
-    <<memory-allocation,Memory Allocation>>).
-  * pname:pSurface is a pointer to a slink:VkSurfaceKHR handle in which the
-    created surface object is returned.
-
-include::{generated}/validity/protos/vkCreateScreenSurfaceQNX.txt[]
---
-
-[open,refpage='VkScreenSurfaceCreateInfoQNX',desc='Structure specifying parameters of a newly created QNX Screen surface object',type='structs']
---
-The sname:VkScreenSurfaceCreateInfoQNX structure is defined as:
-
-include::{generated}/api/structs/VkScreenSurfaceCreateInfoQNX.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:context and pname:window are QNX Screen code:context and
-    code:window to associate the surface with.
-
-.Valid Usage
-****
-  * [[VUID-VkScreenSurfaceCreateInfoQNX-context-04741]]
-    pname:context must: point to a valid QNX Screen code:struct
-    _screen_context
-  * [[VUID-VkScreenSurfaceCreateInfoQNX-window-04742]]
-    pname:window must: point to a valid QNX Screen code:struct
-    _screen_window
-****
-
-include::{generated}/validity/structs/VkScreenSurfaceCreateInfoQNX.txt[]
---
-
-[open,refpage='VkScreenSurfaceCreateFlagsQNX',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkScreenSurfaceCreateFlagsQNX.txt[]
-
-tname:VkScreenSurfaceCreateFlagsQNX is a bitmask type for setting a mask,
-but is currently reserved for future use.
---
diff --git a/registry/vulkan/chapters/VK_QNX_screen_surface/platformQuerySupport_screen.txt b/registry/vulkan/chapters/VK_QNX_screen_surface/platformQuerySupport_screen.txt
deleted file mode 100644
index 9da7a27..0000000
--- a/registry/vulkan/chapters/VK_QNX_screen_surface/platformQuerySupport_screen.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2021 BlackBerry Limited.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[platformQuerySupport_screen,platformQuerySupport_screen]]
-=== QNX Screen Platform
-
-[open,refpage='vkGetPhysicalDeviceScreenPresentationSupportQNX',desc='Query physical device for presentation to QNX Screen',type='protos']
---
-To determine whether a queue family of a physical device supports
-presentation to a QNX Screen compositor, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceScreenPresentationSupportQNX.txt[]
-
-  * pname:physicalDevice is the physical device.
-  * pname:queueFamilyIndex is the queue family index.
-  * pname:window is the QNX Screen code:window object.
-
-This platform-specific function can: be called prior to creating a surface.
-
-.Valid Usage
-****
-  * [[VUID-vkGetPhysicalDeviceScreenPresentationSupportQNX-queueFamilyIndex-04743]]
-    pname:queueFamilyIndex must: be less than
-    pname:pQueueFamilyPropertyCount returned by
-    fname:vkGetPhysicalDeviceQueueFamilyProperties for the given
-    pname:physicalDevice
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceScreenPresentationSupportQNX.txt[]
---
diff --git a/registry/vulkan/chapters/accelstructures.txt b/registry/vulkan/chapters/accelstructures.txt
deleted file mode 100755
index a01f655..0000000
--- a/registry/vulkan/chapters/accelstructures.txt
+++ /dev/null
@@ -1,2356 +0,0 @@
-// Copyright 2020-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[acceleration-structure]]
-= Acceleration Structures
-
-
-[[acceleration-structure-def]]
-== Acceleration Structures
-
-_Acceleration structures_ are data structures used by the implementation to
-efficiently manage scene geometry as it is <<ray-traversal, traversed during
-a ray tracing query>>.
-The application is responsible for managing acceleration structure objects
-(see <<resources-acceleration-structures,Acceleration Structures>>),
-including allocation, destruction, executing builds or updates, and
-synchronizing resources used during ray tracing queries.
-
-There are two types of acceleration structures, _top level acceleration
-structures_ and _bottom level acceleration structures_.
-
-An acceleration structure is considered to be constructed if an
-<<acceleration-structure-building,acceleration structure build command>> or
-<<acceleration-structure-copying,copy command>> has been executed with the
-given acceleration structure as the destination.
-
-[[fig-accelstruct]]
-image::{images}/accelstruct.svg[align="center",title="Acceleration Structure",opts="{imageopts}"]
-
-.Caption
-****
-The diagram shows the relationship between top and bottom level acceleration
-structures.
-****
-
-
-[[acceleration-structure-geometry]]
-=== Geometry
-
-_Geometries_ refer to a triangle or axis-aligned bounding box.
-
-
-[[acceleration-structure-top-level]]
-=== Top Level Acceleration Structures
-
-Opaque acceleration structure for an array of instances.
-The descriptor or device address referencing this is the starting point for
-traversal.
-
-The top level acceleration structure takes a reference to any bottom level
-acceleration structure referenced by its instances.
-Those bottom level acceleration structure objects must: be valid when the
-top level acceleration structure is accessed.
-
-
-[[acceleration-structure-bottom-level]]
-=== Bottom Level Acceleration Structures
-
-Opaque acceleration structure for an array of geometries.
-
-
-[[acceleration-structure-update]]
-=== Acceleration Structure Update Rules
-
-The API defines two types of operations to produce acceleration structures
-from geometry:
-
-  * A _build_ operation is used to construct an acceleration structure.
-  * An _update_ operation is used to modify an existing acceleration
-    structure.
-
-An update operation imposes certain constraints on the input, in exchange
-for considerably faster execution.
-When performing an update, the application is required to provide a full
-description of the acceleration structure, but is prohibited from changing
-anything other than instance definitions, transform matrices, and vertex or
-AABB positions.
-All other aspects of the description must: exactly match the one from the
-original build.
-
-More precisely, the application must: not use an update operation to do any
-of the following:
-
-  * Change primitives or instances from _active_ to _inactive_ (as defined
-    in <<acceleration-structure-inactive-prims>>).
-  * Change the index or vertex formats of triangle geometry.
-  * Change triangle geometry transform pointers from null to non-null or
-    vice versa.
-  * Change the number of geometries or instances in the structure.
-  * Change the geometry flags for any geometry in the structure.
-  * Change the number of vertices or primitives for any geometry in the
-    structure.
-
-
-[[acceleration-structure-inactive-prims]]
-=== Inactive Primitives and Instances
-
-Acceleration structures allow the use of particular input values to signal
-_inactive_ primitives or instances.
-
-An _inactive_ triangle is one for which the first (X) component of each
-vertex is NaN.
-If any other vertex component is NaN, and the first is not, the behavior is
-undefined:.
-If the vertex format does not have a NaN representation, then all triangles
-are considered active.
-
-An _inactive_ instance is one whose acceleration structure handle is
-dlink:VK_NULL_HANDLE.
-
-An _inactive_ AABB is one for which the minimum X coordinate is NaN.
-If any other component is NaN, and the first is not, the behavior is
-undefined:.
-
-In the above definitions, "NaN" refers to any type of NaN.
-Signaling, non-signaling, quiet, loud, or otherwise.
-
-An inactive object is considered invisible to all rays, and should: not be
-represented in the acceleration structure.
-Implementations should: ensure that the presence of inactive objects does
-not seriously degrade traversal performance.
-
-Inactive objects are counted in the auto-generated index sequences which are
-provided to shaders via code:InstanceId and code:PrimitiveId SPIR-V
-decorations.
-This allows objects in the scene to change freely between the active and
-inactive states, without affecting the layout of any arrays which are being
-indexed using the ID values.
-
-Any transition between the active and inactive states requires a full
-acceleration structure rebuild.
-Applications must: not perform an acceleration structure update where an
-object is active in the source acceleration structure but would be inactive
-in the destination, or vice versa.
-
-
-[[acceleration-structure-building]]
-=== Building Acceleration Structures
-
-ifdef::VK_NV_ray_tracing[]
-[open,refpage='vkCmdBuildAccelerationStructureNV',desc='Build an acceleration structure',type='protos']
---
-:refpage: vkCmdBuildAccelerationStructureNV
-
-To build an acceleration structure call:
-
-include::{generated}/api/protos/vkCmdBuildAccelerationStructureNV.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pInfo contains the shared information for the acceleration
-    structure's structure.
-  * pname:instanceData is the buffer containing an array of
-    slink:VkAccelerationStructureInstanceKHR structures defining
-    acceleration structures.
-    This parameter must: be `NULL` for bottom level acceleration structures.
-  * pname:instanceOffset is the offset in bytes (relative to the start of
-    pname:instanceData) at which the instance data is located.
-  * pname:update specifies whether to update the pname:dst acceleration
-    structure with the data in pname:src.
-  * pname:dst is a pointer to the target acceleration structure for the
-    build.
-  * pname:src is a pointer to an existing acceleration structure that is to
-    be used to update the pname:dst acceleration structure.
-  * pname:scratch is the slink:VkBuffer that will be used as scratch memory
-    for the build.
-  * pname:scratchOffset is the offset in bytes relative to the start of
-    pname:scratch that will be used as a scratch memory.
-
-Accesses to pname:dst, pname:src, and pname:scratch must: be
-<<synchronization-dependencies,synchronized>> with the
-ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-<<synchronization-pipeline-stages, pipeline stage>> and an
-<<synchronization-access-types, access type>> of
-ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR or
-ename:VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBuildAccelerationStructureNV-geometryCount-02241]]
-    pname:geometryCount must: be less than or equal to
-    slink:VkPhysicalDeviceRayTracingPropertiesNV::pname:maxGeometryCount
-  * [[VUID-vkCmdBuildAccelerationStructureNV-dst-02488]]
-    pname:dst must: have been created with compatible
-    slink:VkAccelerationStructureInfoNV where
-    slink:VkAccelerationStructureInfoNV::pname:type and
-    slink:VkAccelerationStructureInfoNV::pname:flags are identical,
-    slink:VkAccelerationStructureInfoNV::pname:instanceCount and
-    slink:VkAccelerationStructureInfoNV::pname:geometryCount for pname:dst
-    are greater than or equal to the build size and each geometry in
-    slink:VkAccelerationStructureInfoNV::pname:pGeometries for pname:dst has
-    greater than or equal to the number of vertices, indices, and AABBs
-  * [[VUID-vkCmdBuildAccelerationStructureNV-update-02489]]
-    If pname:update is ename:VK_TRUE, pname:src must: not be
-    dlink:VK_NULL_HANDLE
-  * [[VUID-vkCmdBuildAccelerationStructureNV-update-02490]]
-    If pname:update is ename:VK_TRUE, pname:src must: have previously been
-    constructed with
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_NV set in
-    slink:VkAccelerationStructureInfoNV::pname:flags in the original build
-  * [[VUID-vkCmdBuildAccelerationStructureNV-update-02491]]
-    If pname:update is ename:VK_FALSE, the pname:size member of the
-    slink:VkMemoryRequirements structure returned from a call to
-    flink:vkGetAccelerationStructureMemoryRequirementsNV with
-    slink:VkAccelerationStructureMemoryRequirementsInfoNV::pname:accelerationStructure
-    set to pname:dst and
-    slink:VkAccelerationStructureMemoryRequirementsInfoNV::pname:type set to
-    ename:VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV
-    must: be less than or equal to the size of pname:scratch minus
-    pname:scratchOffset
-  * [[VUID-vkCmdBuildAccelerationStructureNV-update-02492]]
-    If pname:update is ename:VK_TRUE, the pname:size member of the
-    slink:VkMemoryRequirements structure returned from a call to
-    flink:vkGetAccelerationStructureMemoryRequirementsNV with
-    slink:VkAccelerationStructureMemoryRequirementsInfoNV::pname:accelerationStructure
-    set to pname:dst and
-    slink:VkAccelerationStructureMemoryRequirementsInfoNV::pname:type set to
-    ename:VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV
-    must: be less than or equal to the size of pname:scratch minus
-    pname:scratchOffset
-  * [[VUID-vkCmdBuildAccelerationStructureNV-scratch-03522]]
-    pname:scratch must: have been created with
-    ename:VK_BUFFER_USAGE_RAY_TRACING_BIT_NV usage flag
-  * [[VUID-vkCmdBuildAccelerationStructureNV-instanceData-03523]]
-    If pname:instanceData is not dlink:VK_NULL_HANDLE, pname:instanceData
-    must: have been created with ename:VK_BUFFER_USAGE_RAY_TRACING_BIT_NV
-    usage flag
-  * [[VUID-vkCmdBuildAccelerationStructureNV-accelerationStructureReference-03786]]
-    Each
-    slink:VkAccelerationStructureInstanceKHR::pname:accelerationStructureReference
-    value in pname:instanceData must: be a valid device address containing a
-    value obtained from flink:vkGetAccelerationStructureHandleNV
-  * [[VUID-vkCmdBuildAccelerationStructureNV-update-03524]]
-    If pname:update is ename:VK_TRUE, then objects that were previously
-    active must: not be made inactive as per
-    <<acceleration-structure-inactive-prims>>
-  * [[VUID-vkCmdBuildAccelerationStructureNV-update-03525]]
-    If pname:update is ename:VK_TRUE, then objects that were previously
-    inactive must: not be made active as per
-    <<acceleration-structure-inactive-prims>>
-  * [[VUID-vkCmdBuildAccelerationStructureNV-update-03526]]
-    If pname:update is ename:VK_TRUE, the pname:src and pname:dst objects
-    must: either be the same object or not have any
-    <<resources-memory-aliasing, memory aliasing>>
-
-****
-
-include::{generated}/validity/protos/vkCmdBuildAccelerationStructureNV.txt[]
---
-endif::VK_NV_ray_tracing[]
-
-ifdef::VK_KHR_acceleration_structure[]
-[open,refpage='vkCmdBuildAccelerationStructuresKHR',desc='Build an acceleration structure',type='protos']
---
-:refpage: vkCmdBuildAccelerationStructuresKHR
-:maxinstancecheck: pname:ppBuildRangeInfos[i][j].pname:primitiveCount
-
-To build acceleration structures call:
-
-include::{generated}/api/protos/vkCmdBuildAccelerationStructuresKHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:infoCount is the number of acceleration structures to build.
-    It specifies the number of the pname:pInfos structures and
-    pname:ppBuildRangeInfos pointers that must: be provided.
-  * pname:pInfos is a pointer to an array of pname:infoCount
-    slink:VkAccelerationStructureBuildGeometryInfoKHR structures defining
-    the geometry used to build each acceleration structure.
-  * pname:ppBuildRangeInfos is a pointer to an array of pname:infoCount
-    pointers to arrays of slink:VkAccelerationStructureBuildRangeInfoKHR
-    structures.
-    Each pname:ppBuildRangeInfos[i] is a pointer to an array of
-    pname:pInfos[i].pname:geometryCount
-    slink:VkAccelerationStructureBuildRangeInfoKHR structures defining
-    dynamic offsets to the addresses where geometry data is stored, as
-    defined by pname:pInfos[i].
-
-The fname:vkCmdBuildAccelerationStructuresKHR command provides the ability
-to initiate multiple acceleration structures builds, however there is no
-ordering or synchronization implied between any of the individual
-acceleration structure builds.
-
-[NOTE]
-.Note
-====
-This means that an application cannot: build a top-level acceleration
-structure in the same flink:vkCmdBuildAccelerationStructuresKHR call as the
-associated bottom-level or instance acceleration structures are being built.
-There also cannot: be any memory aliasing between any acceleration structure
-memories or scratch memories being used by any of the builds.
-====
-
-[[acceleration-structure-scratch]]
-Accesses to the acceleration structure scratch buffers as identified by the
-slink:VkAccelerationStructureBuildGeometryInfoKHR::pname:scratchData buffer
-device addresses must: be <<synchronization-dependencies,synchronized>> with
-the ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-<<synchronization-pipeline-stages, pipeline stage>> and an
-<<synchronization-access-types, access type>> of
-ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR or
-ename:VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR.
-Similarly for accesses to each
-slink:VkAccelerationStructureBuildGeometryInfoKHR::pname:srcAccelerationStructure
-and
-slink:VkAccelerationStructureBuildGeometryInfoKHR::pname:dstAccelerationStructure.
-
-Accesses to other input buffers as identified by any used values of
-ifdef::VK_NV_ray_tracing_motion_blur[]
-slink:VkAccelerationStructureGeometryMotionTrianglesDataNV::pname:vertexData,
-endif::VK_NV_ray_tracing_motion_blur[]
-slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:vertexData,
-slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:indexData,
-slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:transformData,
-slink:VkAccelerationStructureGeometryAabbsDataKHR::pname:data, and
-slink:VkAccelerationStructureGeometryInstancesDataKHR::pname:data must: be
-<<synchronization-dependencies,synchronized>> with the
-ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-<<synchronization-pipeline-stages, pipeline stage>> and an
-<<synchronization-access-types, access type>> of
-ename:VK_ACCESS_SHADER_READ_BIT.
-
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/build_acceleration_structure_common.txt[]
-include::{chapters}/commonvalidity/build_acceleration_structure_device_common.txt[]
-include::{chapters}/commonvalidity/build_acceleration_structure_nonindirect_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdBuildAccelerationStructuresKHR.txt[]
---
-
-[open,refpage='vkCmdBuildAccelerationStructuresIndirectKHR',desc='Build an acceleration structure with some parameters provided on the device',type='protos']
---
-:refpage: vkCmdBuildAccelerationStructuresIndirectKHR
-:maxinstancecheck: pname:ppMaxPrimitiveCounts[i][j]
-
-To build acceleration structures with some parameters sourced on the device
-call:
-
-include::{generated}/api/protos/vkCmdBuildAccelerationStructuresIndirectKHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:infoCount is the number of acceleration structures to build.
-  * pname:pInfos is a pointer to an array of pname:infoCount
-    slink:VkAccelerationStructureBuildGeometryInfoKHR structures defining
-    the geometry used to build each acceleration structure.
-  * pname:pIndirectDeviceAddresses is a pointer to an array of
-    pname:infoCount buffer device addresses which point to
-    pname:pInfos[i].pname:geometryCount
-    slink:VkAccelerationStructureBuildRangeInfoKHR structures defining
-    dynamic offsets to the addresses where geometry data is stored, as
-    defined by pname:pInfos[i].
-  * pname:pIndirectStrides is a pointer to an array of pname:infoCount byte
-    strides between elements of pname:pIndirectDeviceAddresses.
-  * pname:ppMaxPrimitiveCounts is a pointer to an array of pname:infoCount
-    pointers to arrays of pname:pInfos[i].pname:geometryCount values
-    indicating the maximum number of primitives that will be built by this
-    command for each geometry.
-
-Accesses to acceleration structures, scratch buffers, vertex buffers, index
-buffers, and instance buffers must be synchronized as with
-<<acceleration-structure-scratch,vkCmdBuildAccelerationStructuresKHR>>.
-
-Accesses to any element of pname:pIndirectDeviceAddresses must: be
-<<synchronization-dependencies,synchronized>> with the
-ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-<<synchronization-pipeline-stages, pipeline stage>> and an
-<<synchronization-access-types, access type>> of
-ename:VK_ACCESS_INDIRECT_COMMAND_READ_BIT.
-
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/build_acceleration_structure_common.txt[]
-include::{chapters}/commonvalidity/build_acceleration_structure_device_common.txt[]
-  * [[VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectDeviceAddresses-03645]]
-    For any element of pname:pIndirectDeviceAddresses, if the buffer from
-    which it was queried is non-sparse then it must: be bound completely and
-    contiguously to a single slink:VkDeviceMemory object
-  * [[VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectDeviceAddresses-03646]]
-    For any element of pname:pIndirectDeviceAddresses[i], all device
-    addresses between pname:pIndirectDeviceAddresses[i] and
-    [eq]#pname:pIndirectDeviceAddresses[i] {plus}
-    (pname:pInfos[i].pname:geometryCount {times} pname:pIndirectStrides[i]) -
-    1# must: be in the buffer device address range of the same buffer
-  * [[VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectDeviceAddresses-03647]]
-    For any element of pname:pIndirectDeviceAddresses, the buffer from which
-    it was queried must: have been created with the
-    ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set
-  * [[VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectDeviceAddresses-03648]]
-    Each element of pname:pIndirectDeviceAddresses must: be a multiple of
-    `4`
-  * [[VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectStrides-03787]]
-    Each element of pname:pIndirectStrides must: be a multiple of `4`
-  * [[VUID-vkCmdBuildAccelerationStructuresIndirectKHR-commandBuffer-03649]]
-    pname:commandBuffer must: not be a protected command buffer
-  * [[VUID-vkCmdBuildAccelerationStructuresIndirectKHR-accelerationStructureIndirectBuild-03650]]
-    The <<features-accelerationStructureIndirectBuild,
-    sname:VkPhysicalDeviceAccelerationStructureFeaturesKHR::pname:accelerationStructureIndirectBuild>>
-    feature must: be enabled
-  * [[VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectDeviceAddresses-03651]]
-    Each slink:VkAccelerationStructureBuildRangeInfoKHR structure referenced
-    by any element of pname:pIndirectDeviceAddresses must: be a valid
-    slink:VkAccelerationStructureBuildRangeInfoKHR structure
-  * [[VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03652]]
-    pname:pInfos[i].pname:dstAccelerationStructure must: have been created
-    with a value of slink:VkAccelerationStructureCreateInfoKHR::pname:size
-    greater than or equal to the memory size required by the build
-    operation, as returned by flink:vkGetAccelerationStructureBuildSizesKHR
-    with [eq]#pname:pBuildInfo = pname:pInfos[i]# and
-    [eq]#pname:pMaxPrimitiveCounts = pname:ppMaxPrimitiveCounts[i]#
-  * [[VUID-vkCmdBuildAccelerationStructuresIndirectKHR-ppMaxPrimitiveCounts-03653]]
-    Each pname:ppMaxPrimitiveCounts[i][j] must: be greater than or equal to
-    the the pname:primitiveCount value specified by the
-    slink:VkAccelerationStructureBuildRangeInfoKHR structure located at
-    [eq]#pname:pIndirectDeviceAddresses[i] {plus} (code:j {times}
-    pname:pIndirectStrides[i])#
-****
-
-include::{generated}/validity/protos/vkCmdBuildAccelerationStructuresIndirectKHR.txt[]
---
-
-
-[open,refpage='VkAccelerationStructureBuildGeometryInfoKHR',desc='Structure specifying the geometry data used to build an acceleration structure',type='structs']
---
-:refpage: VkAccelerationStructureBuildGeometryInfoKHR
-
-The sname:VkAccelerationStructureBuildGeometryInfoKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkAccelerationStructureBuildGeometryInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:type is a elink:VkAccelerationStructureTypeKHR value specifying
-    the type of acceleration structure being built.
-  * pname:flags is a bitmask of
-    elink:VkBuildAccelerationStructureFlagBitsKHR specifying additional
-    parameters of the acceleration structure.
-  * pname:mode is a elink:VkBuildAccelerationStructureModeKHR value
-    specifying the type of operation to perform.
-  * pname:srcAccelerationStructure is a pointer to an existing acceleration
-    structure that is to be used to update the pname:dst acceleration
-    structure when pname:mode is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR.
-  * pname:dstAccelerationStructure is a pointer to the target acceleration
-    structure for the build.
-  * pname:geometryCount specifies the number of geometries that will be
-    built into pname:dstAccelerationStructure.
-  * pname:pGeometries is a pointer to an array of
-    slink:VkAccelerationStructureGeometryKHR structures.
-  * pname:ppGeometries is a pointer to an array of pointers to
-    slink:VkAccelerationStructureGeometryKHR structures.
-  * pname:scratchData is the device or host address to memory that will be
-    used as scratch memory for the build.
-
-Only one of pname:pGeometries or pname:ppGeometries can: be a valid pointer,
-the other must: be `NULL`.
-Each element of the non-`NULL` array describes the data used to build each
-acceleration structure geometry.
-
-ifdef::VK_KHR_ray_tracing_pipeline,VK_KHR_ray_query[]
-[[acceleration-structure-geometry-index]]
-The index of each element of the pname:pGeometries or pname:ppGeometries
-members of slink:VkAccelerationStructureBuildGeometryInfoKHR is used as the
-_geometry index_ during ray traversal.
-ifdef::VK_KHR_ray_tracing_pipeline[]
-The geometry index is available in ray shaders via the
-<<interfaces-builtin-variables-raygeometryindex,code:RayGeometryIndexKHR
-built-in>>, and is <<shader-binding-table-hit-shader-indexing, used to
-determine hit and intersection shaders executed during traversal>>.
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_KHR_ray_query[]
-The geometry index is available to ray queries via the
-code:OpRayQueryGetIntersectionGeometryIndexKHR instruction.
-endif::VK_KHR_ray_query[]
-endif::VK_KHR_ray_tracing_pipeline,VK_KHR_ray_query[]
-
-ifdef::VK_NV_ray_tracing_motion_blur[]
-[[acceleration-structure-motion-instances]]
-Setting ename:VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV in pname:flags
-indicates that this build is a motion top level acceleration structure.
-A motion top level uses instances of format
-slink:VkAccelerationStructureMotionInstanceNV if
-slink:VkAccelerationStructureGeometryInstancesDataKHR::pname:arrayOfPointers
-is ename:VK_FALSE.
-
-If
-slink:VkAccelerationStructureGeometryInstancesDataKHR::pname:arrayOfPointers
-is ename:VK_TRUE, the pointer for any given element of the array of instance
-pointers consists of 4 bits of
-ename:VkAccelerationStructureMotionInstanceTypeNV in the low 4 bits of the
-pointer identifying the type of structure at the pointer.
-The device address accessed is the value in the array with the low 4 bits
-set to zero.
-The structure at the pointer is one of
-slink:VkAccelerationStructureInstanceKHR,
-slink:VkAccelerationStructureMatrixMotionInstanceNV or
-slink:VkAccelerationStructureSRTMotionInstanceNV, depending on the type
-value encoded in the low 4 bits.
-
-A top level acceleration structure with either motion instances or vertex
-motion in its instances must: set
-ename:VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV in pname:flags.
-endif::VK_NV_ray_tracing_motion_blur[]
-
-Members pname:srcAccelerationStructure and pname:dstAccelerationStructure
-may: be the same or different for an update operation (when pname:mode is
-ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR).
-If they are the same, the update happens in-place.
-Otherwise, the target acceleration structure is updated and the source is
-not modified.
-
-.Valid Usage
-****
-  * [[VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03654]]
-    pname:type must: not be ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR
-  * [[VUID-VkAccelerationStructureBuildGeometryInfoKHR-pGeometries-03788]]
-    Only one of pname:pGeometries or pname:ppGeometries can: be a valid
-    pointer, the other must: be `NULL`
-  * [[VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03789]]
-    If pname:type is ename:VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR, the
-    pname:geometryType member of elements of either pname:pGeometries or
-    pname:ppGeometries must: be ename:VK_GEOMETRY_TYPE_INSTANCES_KHR
-  * [[VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03790]]
-    If pname:type is ename:VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR,
-    pname:geometryCount must: be `1`
-  * [[VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03791]]
-    If pname:type is ename:VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR
-    the pname:geometryType member of elements of either pname:pGeometries or
-    pname:ppGeometries must: not be ename:VK_GEOMETRY_TYPE_INSTANCES_KHR
-  * [[VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03792]]
-    If pname:type is ename:VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR
-    then the pname:geometryType member of each geometry in either
-    pname:pGeometries or pname:ppGeometries must: be the same
-  * [[VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03793]]
-    If pname:type is ename:VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR
-    then pname:geometryCount must: be less than or equal to
-    slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:maxGeometryCount
-  * [[VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03794]]
-    If pname:type is ename:VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR
-    and the pname:geometryType member of either pname:pGeometries or
-    pname:ppGeometries is ename:VK_GEOMETRY_TYPE_AABBS_KHR, the total number
-    of AABBs in all geometries must: be less than or equal to
-    slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:maxPrimitiveCount
-  * [[VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03795]]
-    If pname:type is ename:VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR
-    and the pname:geometryType member of either pname:pGeometries or
-    pname:ppGeometries is ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, the total
-    number of triangles in all geometries must: be less than or equal to
-    slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:maxPrimitiveCount
-  * [[VUID-VkAccelerationStructureBuildGeometryInfoKHR-flags-03796]]
-    If pname:flags has the
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR bit set,
-    then it must: not have the
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR bit set
-ifdef::VK_NV_ray_tracing_motion_blur[]
-  * [[VUID-VkAccelerationStructureBuildGeometryInfoKHR-dstAccelerationStructure-04927]]
-    If pname:dstAccelerationStructure was created with
-    ename:VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV set in
-    slink:VkAccelerationStructureCreateInfoKHR::pname:flags,
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV must: be set in
-    pname:flags
-  * [[VUID-VkAccelerationStructureBuildGeometryInfoKHR-flags-04928]]
-    If ename:VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV is set in
-    pname:flags, pname:dstAccelerationStructure must: have been created with
-    ename:VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV set in
-    slink:VkAccelerationStructureCreateInfoKHR::pname:flags
-  * [[VUID-VkAccelerationStructureBuildGeometryInfoKHR-flags-04929]]
-    If ename:VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV is set in
-    pname:flags, pname:type must: not be
-    ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR
-endif::VK_NV_ray_tracing_motion_blur[]
-****
-include::{generated}/validity/structs/VkAccelerationStructureBuildGeometryInfoKHR.txt[]
---
-
-[open,refpage='VkBuildAccelerationStructureModeKHR',desc='Enum specifying the type of build operation to perform',type='enums']
---
-:refpage: VkBuildAccelerationStructureModeKHR
-
-The ename:VkBuildAccelerationStructureModeKHR enumeration is defined as:
-
-include::{generated}/api/enums/VkBuildAccelerationStructureModeKHR.txt[]
-
-  * ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR specifies that the
-    destination acceleration structure will be built using the specified
-    geometries.
-  * ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR specifies that the
-    destination acceleration structure will be built using data in a source
-    acceleration structure, updated by the specified geometries.
---
-
-[open,refpage='VkDeviceOrHostAddressKHR',desc='Union specifying a device or host address',type='structs']
---
-:refpage: VkDeviceOrHostAddressKHR
-
-The sname:VkDeviceOrHostAddressKHR union is defined as:
-
-include::{generated}/api/structs/VkDeviceOrHostAddressKHR.txt[]
-
-  * pname:deviceAddress is a buffer device address as returned by the
-    flink:vkGetBufferDeviceAddressKHR command.
-  * pname:hostAddress is a host memory address.
-
-include::{generated}/validity/structs/VkDeviceOrHostAddressKHR.txt[]
---
-
-[open,refpage='VkDeviceOrHostAddressConstKHR',desc='Union specifying a const device or host address',type='structs']
---
-:refpage: VkDeviceOrHostAddressConstKHR
-
-The sname:VkDeviceOrHostAddressConstKHR union is defined as:
-
-include::{generated}/api/structs/VkDeviceOrHostAddressConstKHR.txt[]
-
-  * pname:deviceAddress is a buffer device address as returned by the
-    flink:vkGetBufferDeviceAddressKHR command.
-  * pname:hostAddress is a const host memory address.
-
-include::{generated}/validity/structs/VkDeviceOrHostAddressConstKHR.txt[]
---
-
-[open,refpage='VkAccelerationStructureGeometryKHR',desc='Structure specifying geometries to be built into an acceleration structure',type='structs']
---
-:refpage: VkAccelerationStructureGeometryKHR
-
-The sname:VkAccelerationStructureGeometryKHR structure is defined as:
-
-include::{generated}/api/structs/VkAccelerationStructureGeometryKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:geometryType describes which type of geometry this
-    sname:VkAccelerationStructureGeometryKHR refers to.
-  * pname:geometry is a slink:VkAccelerationStructureGeometryDataKHR union
-    describing the geometry data for the relevant geometry type.
-  * pname:flags is a bitmask of elink:VkGeometryFlagBitsKHR values
-    describing additional properties of how the geometry should be built.
-
-include::{generated}/validity/structs/VkAccelerationStructureGeometryKHR.txt[]
---
-
-[open,refpage='VkAccelerationStructureGeometryDataKHR',desc='Union specifying acceleration structure geometry data',type='structs']
---
-:refpage: VkAccelerationStructureGeometryDataKHR
-
-The sname:VkAccelerationStructureGeometryDataKHR union is defined as:
-
-include::{generated}/api/structs/VkAccelerationStructureGeometryDataKHR.txt[]
-
-  * pname:triangles is a
-    slink:VkAccelerationStructureGeometryTrianglesDataKHR structure.
-  * pname:aabbs is a slink:VkAccelerationStructureGeometryAabbsDataKHR
-    struture.
-  * pname:instances is a
-    slink:VkAccelerationStructureGeometryInstancesDataKHR structure.
-
-include::{generated}/validity/structs/VkAccelerationStructureGeometryDataKHR.txt[]
---
-
-[open,refpage='VkAccelerationStructureGeometryTrianglesDataKHR',desc='Structure specifying a triangle geometry in a bottom-level acceleration structure',type='structs']
---
-:refpage: VkAccelerationStructureGeometryTrianglesDataKHR
-
-The sname:VkAccelerationStructureGeometryTrianglesDataKHR structure is
-defined as:
-
-include::{generated}/api/structs/VkAccelerationStructureGeometryTrianglesDataKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:vertexFormat is the elink:VkFormat of each vertex element.
-  * pname:vertexData is a device or host address to memory containing vertex
-    data for this geometry.
-  * pname:maxVertex is the highest index of a vertex that will be addressed
-    by a build command using this structure.
-  * pname:vertexStride is the stride in bytes between each vertex.
-  * pname:indexType is the elink:VkIndexType of each index element.
-  * pname:indexData is a device or host address to memory containing index
-    data for this geometry.
-  * pname:transformData is a device or host address to memory containing an
-    optional reference to a slink:VkTransformMatrixKHR structure that
-    describes a transformation from the space in which the vertices in this
-    geometry are described to the space in which the acceleration structure
-    is defined.
-
-[NOTE]
-.Note
-====
-Unlike the stride for vertex buffers in
-slink:VkVertexInputBindingDescription for graphics pipelines which must not
-exceed pname:maxVertexInputBindingStride, pname:vertexStride for
-acceleration structure geometry is instead restricted to being a 32-bit
-value.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkAccelerationStructureGeometryTrianglesDataKHR-vertexStride-03735]]
-    pname:vertexStride must: be a multiple of the size in bytes of the
-    smallest component of pname:vertexFormat
-  * [[VUID-VkAccelerationStructureGeometryTrianglesDataKHR-vertexStride-03819]]
-    pname:vertexStride must: be less than or equal to [eq]#2^32^-1#
-  * [[VUID-VkAccelerationStructureGeometryTrianglesDataKHR-vertexFormat-03797]]
-    pname:vertexFormat must: support the
-    ename:VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR in
-    slink:VkFormatProperties::pname:bufferFeatures as returned by
-    flink:vkGetPhysicalDeviceFormatProperties2
-  * [[VUID-VkAccelerationStructureGeometryTrianglesDataKHR-indexType-03798]]
-    pname:indexType must: be ename:VK_INDEX_TYPE_UINT16,
-    ename:VK_INDEX_TYPE_UINT32, or ename:VK_INDEX_TYPE_NONE_KHR
-****
-
-include::{generated}/validity/structs/VkAccelerationStructureGeometryTrianglesDataKHR.txt[]
---
-
-ifdef::VK_NV_ray_tracing_motion_blur[]
-[open,refpage='VkAccelerationStructureGeometryMotionTrianglesDataNV',desc='Structure specifying vertex motion in a bottom-level acceleration structure',type='structs']
---
-:refpage: VkAccelerationStructureGeometryMotionTrianglesDataNV
-
-The sname:VkAccelerationStructureGeometryMotionTrianglesDataNV structure is
-defined as:
-
-include::{generated}/api/structs/VkAccelerationStructureGeometryMotionTrianglesDataNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:vertexData is a pointer to vertex data for this geometry at time
-    1.0
-
-If sname:VkAccelerationStructureGeometryMotionTrianglesDataNV is included in
-the pname:pNext chain of a
-slink:VkAccelerationStructureGeometryTrianglesDataKHR structure, the basic
-vertex positions are used for the position of the triangles in the geometry
-at time 0.0 and the pname:vertexData in
-sname:VkAccelerationStructureGeometryMotionTrianglesDataNV is used for the
-vertex positions at time 1.0, with positions linearly interpolated at
-intermediate times.
-
-Indexing for sname:VkAccelerationStructureGeometryMotionTrianglesDataNV
-pname:vertexData is equivalent to the basic vertex position data.
-
-include::{generated}/validity/structs/VkAccelerationStructureGeometryMotionTrianglesDataNV.txt[]
---
-endif::VK_NV_ray_tracing_motion_blur[]
-endif::VK_KHR_acceleration_structure[]
-
-[open,refpage='VkTransformMatrixKHR',desc='Structure specifying a 3x4 affine transformation matrix',type='structs',alias='VkTransformMatrixNV']
---
-:refpage: VkTransformMatrixKHR
-
-The sname:VkTransformMatrixKHR structure is defined as:
-
-include::{generated}/api/structs/VkTransformMatrixKHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/structs/VkTransformMatrixNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-  * pname:matrix is a 3x4 row-major affine transformation matrix.
-
-include::{generated}/validity/structs/VkTransformMatrixKHR.txt[]
-
-.Valid Usage
-****
-  * [[VUID-VkTransformMatrixKHR-matrix-03799]]
-    The first three columns of pname:matrix must: define an invertible 3x3
-    matrix
-****
---
-
-ifdef::VK_KHR_acceleration_structure[]
-[open,refpage='VkAccelerationStructureGeometryAabbsDataKHR',desc='Structure specifying axis-aligned bounding box geometry in a bottom-level acceleration structure',type='structs']
---
-:refpage: VkAccelerationStructureGeometryAabbsDataKHR
-
-The sname:VkAccelerationStructureGeometryAabbsDataKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkAccelerationStructureGeometryAabbsDataKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:data is a device or host address to memory containing
-    slink:VkAabbPositionsKHR structures containing position data for each
-    axis-aligned bounding box in the geometry.
-  * pname:stride is the stride in bytes between each entry in pname:data.
-    The stride must: be a multiple of `8`.
-
-.Valid Usage
-****
-  * [[VUID-VkAccelerationStructureGeometryAabbsDataKHR-stride-03545]]
-    pname:stride must: be a multiple of `8`
-  * [[VUID-VkAccelerationStructureGeometryAabbsDataKHR-stride-03820]]
-    pname:stride must: be less than or equal to [eq]#2^32^-1#
-****
-
-include::{generated}/validity/structs/VkAccelerationStructureGeometryAabbsDataKHR.txt[]
---
-endif::VK_KHR_acceleration_structure[]
-
-[open,refpage='VkAabbPositionsKHR',desc='Structure specifying two opposing corners of an axis-aligned bounding box',type='structs',alias='VkAabbPositionsNV']
---
-:refpage: VkAabbPositionsKHR
-
-The sname:VkAabbPositionsKHR structure is defined as:
-
-include::{generated}/api/structs/VkAabbPositionsKHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/structs/VkAabbPositionsNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-
-  * pname:minX is the x position of one opposing corner of a bounding box.
-  * pname:minY is the y position of one opposing corner of a bounding box.
-  * pname:minZ is the z position of one opposing corner of a bounding box.
-  * pname:maxX is the x position of the other opposing corner of a bounding
-    box.
-  * pname:maxY is the y position of the other opposing corner of a bounding
-    box.
-  * pname:maxZ is the z position of the other opposing corner of a bounding
-    box.
-
-.Valid Usage
-****
-  * [[VUID-VkAabbPositionsKHR-minX-03546]]
-    pname:minX must: be less than or equal to pname:maxX
-  * [[VUID-VkAabbPositionsKHR-minY-03547]]
-    pname:minY must: be less than or equal to pname:maxY
-  * [[VUID-VkAabbPositionsKHR-minZ-03548]]
-    pname:minZ must: be less than or equal to pname:maxZ
-****
-
-include::{generated}/validity/structs/VkAabbPositionsKHR.txt[]
---
-
-ifdef::VK_KHR_acceleration_structure[]
-[open,refpage='VkAccelerationStructureGeometryInstancesDataKHR',desc='Structure specifying a geometry consisting of instances of other acceleration structures',type='structs']
---
-:refpage: VkAccelerationStructureGeometryInstancesDataKHR
-
-The sname:VkAccelerationStructureGeometryInstancesDataKHR structure is
-defined as:
-
-include::{generated}/api/structs/VkAccelerationStructureGeometryInstancesDataKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:arrayOfPointers specifies whether pname:data is used as an array
-    of addresses or just an array.
-  * pname:data is either the address of an array of device or host addresses
-    referencing individual slink:VkAccelerationStructureInstanceKHR
-    structures
-ifdef::VK_NV_ray_tracing_motion_blur[]
-    or packed motion instance information as described in
-    <<acceleration-structure-motion-instances, motion instances>>
-endif::VK_NV_ray_tracing_motion_blur[]
-    if pname:arrayOfPointers is ename:VK_TRUE, or the address of an array of
-    slink:VkAccelerationStructureInstanceKHR
-ifdef::VK_NV_ray_tracing_motion_blur[]
-    or slink:VkAccelerationStructureMotionInstanceNV
-endif::VK_NV_ray_tracing_motion_blur[]
-    structures.
-    Addresses and slink:VkAccelerationStructureInstanceKHR structures are
-    tightly packed.
-ifdef::VK_NV_ray_tracing_motion_blur[]
-    slink:VkAccelerationStructureMotionInstanceNV structures have a stride
-    of 160 bytes.
-endif::VK_NV_ray_tracing_motion_blur[]
-
-include::{generated}/validity/structs/VkAccelerationStructureGeometryInstancesDataKHR.txt[]
---
-endif::VK_KHR_acceleration_structure[]
-
-[open,refpage='VkAccelerationStructureInstanceKHR',desc='Structure specifying a single acceleration structure instance for building into an acceleration structure geometry',type='structs',alias='VkAccelerationStructureInstanceNV']
---
-:refpage: VkAccelerationStructureInstanceKHR
-
-_Acceleration structure instances_ can: be built into top-level acceleration
-structures.
-Each acceleration structure instance is a separate entry in the top-level
-acceleration structure which includes all the geometry of a bottom-level
-acceleration structure at a transformed location.
-Multiple instances can: point to the same bottom level acceleration
-structure.
-
-An acceleration structure instance is defined by the structure:
-
-include::{generated}/api/structs/VkAccelerationStructureInstanceKHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/structs/VkAccelerationStructureInstanceNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-  * pname:transform is a slink:VkTransformMatrixKHR structure describing a
-    transformation to be applied to the acceleration structure.
-  * pname:instanceCustomIndex is a 24-bit user-specified index value
-    accessible to ray shaders in the code:InstanceCustomIndexKHR built-in.
-  * pname:mask is an 8-bit visibility mask for the geometry.
-    The instance may: only be hit if `Cull Mask & instance.mask != 0`
-  * pname:instanceShaderBindingTableRecordOffset is a 24-bit offset used in
-    calculating the hit shader binding table index.
-  * pname:flags is an 8-bit mask of elink:VkGeometryInstanceFlagBitsKHR
-    values to apply to this instance.
-  * pname:accelerationStructureReference is either:
-  ** a device address containing the value obtained from
-ifdef::VK_KHR_acceleration_structure[flink:vkGetAccelerationStructureDeviceAddressKHR]
-ifdef::VK_KHR_acceleration_structure+VK_NV_ray_tracing[or]
-ifdef::VK_NV_ray_tracing[flink:vkGetAccelerationStructureHandleNV]
-     (used by device operations which reference acceleration structures) or,
-  ** a slink:VkAccelerationStructureKHR object (used by host operations
-     which reference acceleration structures).
-
-The C language specification does not define the ordering of bit-fields, but
-in practice, this struct produces the correct layout with existing
-compilers.
-The intended bit pattern is for the following:
-
-  * pname:instanceCustomIndex and pname:mask occupy the same memory as if a
-    single code:uint32_t was specified in their place
-  ** pname:instanceCustomIndex occupies the 24 least significant bits of
-     that memory
-  ** pname:mask occupies the 8 most significant bits of that memory
-  * pname:instanceShaderBindingTableRecordOffset and pname:flags occupy the
-    same memory as if a single code:uint32_t was specified in their place
-  ** pname:instanceShaderBindingTableRecordOffset occupies the 24 least
-     significant bits of that memory
-  ** pname:flags occupies the 8 most significant bits of that memory
-
-If a compiler produces code that diverges from that pattern, applications
-must: employ another method to set values according to the correct bit
-pattern.
-
-include::{generated}/validity/structs/VkAccelerationStructureInstanceKHR.txt[]
---
-
-[open,refpage='VkGeometryInstanceFlagBitsKHR',desc='Instance flag bits',type='enums',alias='VkGeometryInstanceFlagBitsNV']
---
-:refpage: VkGeometryInstanceFlagBitsKHR
-
-Possible values of pname:flags in the instance modifying the behavior of
-that instance are:
-
-include::{generated}/api/enums/VkGeometryInstanceFlagBitsKHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/enums/VkGeometryInstanceFlagBitsNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-  * ename:VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR disables
-    face culling for this instance.
-  * ename:VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR indicates that
-    the <<ray-traversal-culling-face, facing determination>> for geometry in
-    this instance is inverted.
-    Because the facing is determined in object space, an instance transform
-    does not change the winding, but a geometry transform does.
-  * ename:VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR causes this instance to
-    act as though ename:VK_GEOMETRY_OPAQUE_BIT_KHR were specified on all
-    geometries referenced by this instance.
-    This behavior can: be overridden by the SPIR-V code:NoOpaqueKHR ray
-    flag.
-  * ename:VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR causes this instance
-    to act as though ename:VK_GEOMETRY_OPAQUE_BIT_KHR were not specified on
-    all geometries referenced by this instance.
-    This behavior can: be overridden by the SPIR-V code:OpaqueKHR ray flag.
-
-ename:VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR and
-ename:VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR must: not be used in the
-same flag.
---
-
-[open,refpage='VkGeometryInstanceFlagsKHR',desc='Bitmask of VkGeometryInstanceFlagBitsKHR',type='flags',alias='VkGeometryInstanceFlagsNV']
---
-:refpage: VkGeometryInstanceFlagsKHR
-
-include::{generated}/api/flags/VkGeometryInstanceFlagsKHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/flags/VkGeometryInstanceFlagsNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-tname:VkGeometryInstanceFlagsKHR is a bitmask type for setting a mask of
-zero or more elink:VkGeometryInstanceFlagBitsKHR.
---
-
-ifdef::VK_NV_ray_tracing_motion_blur[]
-[open,refpage='VkAccelerationStructureMotionInstanceNV',desc='Structure specifying a single acceleration structure motion instance for building into an acceleration structure geometry',type='structs']
---
-:refpage: VkAccelerationStructureMotionInstanceNV
-
-_Acceleration structure motion instances_ can: be built into top-level
-acceleration structures.
-Each acceleration structure instance is a separate entry in the top-level
-acceleration structure which includes all the geometry of a bottom-level
-acceleration structure at a transformed location including a type of motion
-and parameters to determine the motion of the instance over time.
-
-An acceleration structure motion instance is defined by the structure:
-
-include::{generated}/api/structs/VkAccelerationStructureMotionInstanceNV.txt[]
-
-  * pname:type is a elink:VkAccelerationStructureMotionInstanceTypeNV
-    enumerant identifying which type of motion instance this is and which
-    type of the union is valid.
-  * pname:flags is currently unused, but is required to keep natural
-    alignment of pname:data.
-  * pname:data is a slink:VkAccelerationStructureMotionInstanceDataNV
-    containing motion instance data for this instance.
-
-[NOTE]
-.Note
-====
-If writing this other than with a standard C compiler, note that the final
-structure should be 152 bytes in size.
-====
-
-include::{generated}/validity/structs/VkAccelerationStructureMotionInstanceNV.txt[]
---
-
-[open,refpage='VkAccelerationStructureMotionInstanceDataNV',desc='Union specifying a acceleration structure motion instance data for building into an acceleration structure geometry',type='structs']
---
-:refpage: VkAccelerationStructureMotionInstanceDataNV
-
-Acceleration structure motion instance is defined by the union:
-
-include::{generated}/api/structs/VkAccelerationStructureMotionInstanceDataNV.txt[]
-
-  * pname:staticInstance is a slink:VkAccelerationStructureInstanceKHR
-    structure containing data for a static instance.
-  * pname:matrixMotionInstance is a
-    slink:VkAccelerationStructureMatrixMotionInstanceNV structure containing
-    data for a matrix motion instance.
-  * pname:srtMotionInstance is a
-    slink:VkAccelerationStructureSRTMotionInstanceNV structure containing
-    data for an SRT motion instance.
-
-include::{generated}/validity/structs/VkAccelerationStructureMotionInstanceDataNV.txt[]
---
-
-[open,refpage='VkAccelerationStructureMotionInstanceFlagsNV',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkAccelerationStructureMotionInstanceFlagsNV.txt[]
-
-tname:VkAccelerationStructureMotionInstanceFlagsNV is a bitmask type for
-setting a mask, but is currently reserved for future use.
---
-
-[open,refpage='VkAccelerationStructureMotionInstanceTypeNV',desc='Enum specifying a type of acceleration structure motion instance data for building into an acceleration structure geometry',type='enums']
---
-:refpage: VkAccelerationStructureMotionInstanceTypeNV
-
-The ename:VkAccelerationStructureMotionInstanceTypeNV enumeration is defined
-as:
-
-include::{generated}/api/enums/VkAccelerationStructureMotionInstanceTypeNV.txt[]
-
-  * ename:VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_STATIC_NV specifies
-    that the instance is a static instance with no instance motion.
-  * ename:VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_MATRIX_MOTION_NV
-    specifies that the instance is a motion instance with motion specified
-    by interpolation between two matrices.
-  * ename:VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_SRT_MOTION_NV
-    specifies that the instance is a motion instance with motion specified
-    by interpolation in the SRT decomposition.
---
-
-[open,refpage='VkAccelerationStructureMatrixMotionInstanceNV',desc='Structure specifying a single acceleration structure matrix motion instance for building into an acceleration structure geometry',type='structs']
---
-:refpage: VkAccelerationStructureMatrixMotionInstanceNV
-
-An acceleration structure matrix motion instance is defined by the
-structure:
-
-include::{generated}/api/structs/VkAccelerationStructureMatrixMotionInstanceNV.txt[]
-
-  * pname:transformT0 is a slink:VkTransformMatrixKHR structure describing a
-    transformation to be applied to the acceleration structure at time 0.
-  * pname:transformT1 is a slink:VkTransformMatrixKHR structure describing a
-    transformation to be applied to the acceleration structure at time 1.
-  * pname:instanceCustomIndex is a 24-bit user-specified index value
-    accessible to ray shaders in the code:InstanceCustomIndexKHR built-in.
-  * pname:mask is an 8-bit visibility mask for the geometry.
-    The instance may: only be hit if `Cull Mask & instance.mask != 0`
-  * pname:instanceShaderBindingTableRecordOffset is a 24-bit offset used in
-    calculating the hit shader binding table index.
-  * pname:flags is an 8-bit mask of elink:VkGeometryInstanceFlagBitsKHR
-    values to apply to this instance.
-  * pname:accelerationStructureReference is either:
-  ** a device address containing the value obtained from
-ifdef::VK_KHR_acceleration_structure[flink:vkGetAccelerationStructureDeviceAddressKHR]
-ifdef::VK_KHR_acceleration_structure+VK_NV_ray_tracing[or]
-ifdef::VK_NV_ray_tracing[flink:vkGetAccelerationStructureHandleNV]
-     (used by device operations which reference acceleration structures) or,
-  ** a slink:VkAccelerationStructureKHR object (used by host operations
-     which reference acceleration structures).
-
-The C language specification does not define the ordering of bit-fields, but
-in practice, this struct produces the correct layout with existing
-compilers.
-The intended bit pattern is for the following:
-
-  * pname:instanceCustomIndex and pname:mask occupy the same memory as if a
-    single code:uint32_t was specified in their place
-  ** pname:instanceCustomIndex occupies the 24 least significant bits of
-     that memory
-  ** pname:mask occupies the 8 most significant bits of that memory
-  * pname:instanceShaderBindingTableRecordOffset and pname:flags occupy the
-    same memory as if a single code:uint32_t was specified in their place
-  ** pname:instanceShaderBindingTableRecordOffset occupies the 24 least
-     significant bits of that memory
-  ** pname:flags occupies the 8 most significant bits of that memory
-
-If a compiler produces code that diverges from that pattern, applications
-must: employ another method to set values according to the correct bit
-pattern.
-
-The transform for a matrix motion instance at a point in time is derived by
-component-wise linear interpolation of the two transforms.
-That is, for a code:time in [0,1] the resulting transform is
-
-  {empty}:: [eq]#pname:transformT0 {times} (1 - code:time) {plus}
-            pname:transformT1 {times} code:time#
-
-include::{generated}/validity/structs/VkAccelerationStructureMatrixMotionInstanceNV.txt[]
---
-
-[open,refpage='VkAccelerationStructureSRTMotionInstanceNV',desc='Structure specifying a single acceleration structure SRT motion instance for building into an acceleration structure geometry',type='structs']
---
-:refpage: VkAccelerationStructureSRTMotionInstanceNV
-
-An acceleration structure SRT motion instance is defined by the structure:
-
-include::{generated}/api/structs/VkAccelerationStructureSRTMotionInstanceNV.txt[]
-
-  * pname:transformT0 is a slink:VkSRTDataNV structure describing a
-    transformation to be applied to the acceleration structure at time 0.
-  * pname:transformT1 is a slink:VkSRTDataNV structure describing a
-    transformation to be applied to the acceleration structure at time 1.
-  * pname:instanceCustomIndex is a 24-bit user-specified index value
-    accessible to ray shaders in the code:InstanceCustomIndexKHR built-in.
-  * pname:mask is an 8-bit visibility mask for the geometry.
-    The instance may: only be hit if `Cull Mask & instance.mask != 0`
-  * pname:instanceShaderBindingTableRecordOffset is a 24-bit offset used in
-    calculating the hit shader binding table index.
-  * pname:flags is an 8-bit mask of elink:VkGeometryInstanceFlagBitsKHR
-    values to apply to this instance.
-  * pname:accelerationStructureReference is either:
-  ** a device address containing the value obtained from
-ifdef::VK_KHR_acceleration_structure[flink:vkGetAccelerationStructureDeviceAddressKHR]
-ifdef::VK_KHR_acceleration_structure+VK_NV_ray_tracing[or]
-ifdef::VK_NV_ray_tracing[flink:vkGetAccelerationStructureHandleNV]
-     (used by device operations which reference acceleration structures) or,
-  ** a slink:VkAccelerationStructureKHR object (used by host operations
-     which reference acceleration structures).
-
-The C language specification does not define the ordering of bit-fields, but
-in practice, this struct produces the correct layout with existing
-compilers.
-The intended bit pattern is for the following:
-
-  * pname:instanceCustomIndex and pname:mask occupy the same memory as if a
-    single code:uint32_t was specified in their place
-  ** pname:instanceCustomIndex occupies the 24 least significant bits of
-     that memory
-  ** pname:mask occupies the 8 most significant bits of that memory
-  * pname:instanceShaderBindingTableRecordOffset and pname:flags occupy the
-    same memory as if a single code:uint32_t was specified in their place
-  ** pname:instanceShaderBindingTableRecordOffset occupies the 24 least
-     significant bits of that memory
-  ** pname:flags occupies the 8 most significant bits of that memory
-
-If a compiler produces code that diverges from that pattern, applications
-must: employ another method to set values according to the correct bit
-pattern.
-
-The transform for a SRT motion instance at a point in time is derived from
-component-wise linear interpolation of the two SRT transforms.
-That is, for a code:time in [0,1] the resulting transform is
-
-  {empty}:: [eq]#pname:transformT0 {times} (1 - code:time) {plus}
-            pname:transformT1 {times} code:time#
-
-include::{generated}/validity/structs/VkAccelerationStructureSRTMotionInstanceNV.txt[]
---
-
-[open,refpage='VkSRTDataNV',desc='Structure specifying a transform in SRT decomposition',type='structs']
---
-:refpage: VkSRTDataNV
-
-An acceleration structure SRT transform is defined by the structure:
-
-include::{generated}/api/structs/VkSRTDataNV.txt[]
-
-  * pname:sx is the x component of the scale of the transform
-  * pname:a is one component of the shear for the transform
-  * pname:b is one component of the shear for the transform
-  * pname:pvx is the x component of the pivot point of the transform
-  * pname:sy is the y component of the scale of the transform
-  * pname:c is one component of the shear for the transform
-  * pname:pvy is the y component of the pivot point of the transform
-  * pname:sz is the z component of the scale of the transform
-  * pname:pvz is the z component of the pivot point of the transform
-  * pname:qx is the x component of the rotation quaternion
-  * pname:qy is the y component of the rotation quaternion
-  * pname:qz is the z component of the rotation quaternion
-  * pname:qw is the w component of the rotation quaternion
-  * pname:tx is the x component of the post-rotation translation
-  * pname:ty is the y component of the post-rotation translation
-  * pname:tz is the z component of the post-rotation translation
-
-This transform decomposition consists of three elements.
-The first is a matrix S, consisting of a scale, shear, and translation,
-usually used to define the pivot point of the following rotation.
-This matrix is constructed from the parameters above by:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-S =
-\left(
-    \begin{matrix}
-        sx & a  & b  & pvx \\
-        0  & sy & c  & pvy \\
-        0  & 0  & sz & pvz
-    \end{matrix}
-\right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-The rotation quaternion is defined as:
-
-  {empty}:: [eq]#code:R = [ pname:qx, pname:qy, pname:qz, pname:qw ]#
-
-This is a rotation around a conceptual normalized axis [eq]#[ ax, ay, az ]#
-of amount code:theta such that:
-
-  {empty}:: [eq]#[ pname:qx, pname:qy, pname:qz ] = sin(code:theta/2)
-            {times} [ code:ax, code:ay, code:az ]#
-
-and
-
-  {empty}:: [eq]#pname:qw = cos(code:theta/2)#
-
-Finally, the transform has a translation T constructed from the parameters
-above by:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-T =
-\left(
-    \begin{matrix}
-        1 & 0 & 0 & tx \\
-        0 & 1 & 0 & ty \\
-        0 & 0 & 1 & tz
-    \end{matrix}
-\right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-The effective derived transform is then given by
-
-  {empty}:: [eq]#code:T {times} code:R {times} code:S#
-
-include::{generated}/validity/structs/VkSRTDataNV.txt[]
---
-endif::VK_NV_ray_tracing_motion_blur[]
-
-ifdef::VK_KHR_acceleration_structure[]
-[open,refpage='VkAccelerationStructureBuildRangeInfoKHR',desc='Structure specifying build offsets and counts for acceleration structure builds',type='structs']
---
-:refpage: VkAccelerationStructureBuildOffsetInfoKHR
-
-sname:VkAccelerationStructureBuildRangeInfoKHR is defined as:
-
-include::{generated}/api/structs/VkAccelerationStructureBuildRangeInfoKHR.txt[]
-
-  * pname:primitiveCount defines the number of primitives for a
-    corresponding acceleration structure geometry.
-  * pname:primitiveOffset defines an offset in bytes into the memory where
-    primitive data is defined.
-  * pname:firstVertex is the index of the first vertex to build from for
-    triangle geometry.
-  * pname:transformOffset defines an offset in bytes into the memory where a
-    transform matrix is defined.
-
-The primitive count and primitive offset are interpreted differently
-depending on the elink:VkGeometryTypeKHR used:
-
-  * For geometries of type ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR,
-    pname:primitiveCount is the number of triangles to be built, where each
-    triangle is treated as 3 vertices.
-  ** If the geometry uses indices, [eq]#pname:primitiveCount {times} 3#
-     indices are consumed from
-     slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:indexData,
-     starting at an offset of pname:primitiveOffset.
-     The value of pname:firstVertex is added to the index values before
-     fetching vertices.
-  ** If the geometry does not use indices, [eq]#pname:primitiveCount {times}
-     3# vertices are consumed from
-     slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:vertexData,
-     starting at an offset of [eq]#pname:primitiveOffset {plus}
-     slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:vertexStride
-     {times} pname:firstVertex#.
-  ** If
-     slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:transformData
-     is not `NULL`, a single slink:VkTransformMatrixKHR structure is
-     consumed from
-     slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:transformData,
-     at an offset of pname:transformOffset.
-     This matrix describes a transformation from the space in which the
-     vertices for all triangles in this geometry are described to the space
-     in which the acceleration structure is defined.
-  * For geometries of type ename:VK_GEOMETRY_TYPE_AABBS_KHR,
-    pname:primitiveCount is the number of axis-aligned bounding boxes.
-    pname:primitiveCount slink:VkAabbPositionsKHR structures are consumed
-    from slink:VkAccelerationStructureGeometryAabbsDataKHR::pname:data,
-    starting at an offset of pname:primitiveOffset.
-  * For geometries of type ename:VK_GEOMETRY_TYPE_INSTANCES_KHR,
-    pname:primitiveCount is the number of acceleration structures.
-    pname:primitiveCount slink:VkAccelerationStructureInstanceKHR
-ifdef::VK_NV_ray_tracing_motion_blur[]
-    or slink:VkAccelerationStructureMotionInstanceNV
-endif::VK_NV_ray_tracing_motion_blur[]
-    structures are consumed from
-    slink:VkAccelerationStructureGeometryInstancesDataKHR::pname:data,
-    starting at an offset of pname:primitiveOffset.
-
-.Valid Usage
-****
-  * [[VUID-VkAccelerationStructureBuildRangeInfoKHR-primitiveOffset-03656]]
-    For geometries of type ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, if the
-    geometry uses indices, the offset pname:primitiveOffset from
-    slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:indexData
-    must: be a multiple of the element size of
-    slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:indexType
-  * [[VUID-VkAccelerationStructureBuildRangeInfoKHR-primitiveOffset-03657]]
-    For geometries of type ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, if the
-    geometry does not use indices, the offset pname:primitiveOffset from
-    slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:vertexData
-    must: be a multiple of the component size of
-    slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:vertexFormat
-  * [[VUID-VkAccelerationStructureBuildRangeInfoKHR-transformOffset-03658]]
-    For geometries of type ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, the offset
-    pname:transformOffset from
-    slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:transformData
-    must: be a multiple of 16
-  * [[VUID-VkAccelerationStructureBuildRangeInfoKHR-primitiveOffset-03659]]
-    For geometries of type ename:VK_GEOMETRY_TYPE_AABBS_KHR, the offset
-    pname:primitiveOffset from
-    slink:VkAccelerationStructureGeometryAabbsDataKHR::pname:data must: be a
-    multiple of 8
-  * [[VUID-VkAccelerationStructureBuildRangeInfoKHR-primitiveOffset-03660]]
-    For geometries of type ename:VK_GEOMETRY_TYPE_INSTANCES_KHR, the offset
-    pname:primitiveOffset from
-    slink:VkAccelerationStructureGeometryInstancesDataKHR::pname:data must:
-    be a multiple of 16
-****
-
-include::{generated}/validity/structs/VkAccelerationStructureBuildRangeInfoKHR.txt[]
---
-endif::VK_KHR_acceleration_structure[]
-
-
-[[acceleration-structure-copying]]
-=== Copying Acceleration Structures
-
-An additional command exists for copying acceleration structures without
-updating their contents.
-The acceleration structure object can: be compacted in order to improve
-performance.
-Before copying, an application must: query the size of the resulting
-acceleration structure.
-
-[open,refpage='vkCmdWriteAccelerationStructuresPropertiesKHR',desc='Write acceleration structure result parameters to query results.',type='protos']
---
-:refpage: vkCmdWriteAccelerationStructuresPropertiesKHR
-
-To query acceleration structure size parameters call:
-
-ifdef::VK_KHR_acceleration_structure[]
-include::{generated}/api/protos/vkCmdWriteAccelerationStructuresPropertiesKHR.txt[]
-endif::VK_KHR_acceleration_structure[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:accelerationStructureCount is the count of acceleration structures
-    for which to query the property.
-  * pname:pAccelerationStructures is a pointer to an array of existing
-    previously built acceleration structures.
-  * pname:queryType is a elink:VkQueryType value specifying the type of
-    queries managed by the pool.
-  * pname:queryPool is the query pool that will manage the results of the
-    query.
-  * pname:firstQuery is the first query index within the query pool that
-    will contain the pname:accelerationStructureCount number of results.
-
-Accesses to any of the acceleration structures listed in
-pname:pAccelerationStructures must: be <<synchronization-dependencies,
-synchronized>> with the
-ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-<<synchronization-pipeline-stages, pipeline stage>> and an
-<<synchronization-access-types, access type>> of
-ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR.
-
-  * If pname:queryType is
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR, then the
-    value written out is the number of bytes required by a compacted
-    acceleration structure.
-  * If pname:queryType is
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR, then
-    the value written out is the number of bytes required by a serialized
-    acceleration structure.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-02493]]
-    pname:queryPool must: have been created with a pname:queryType matching
-    pname:queryType
-  * [[VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-02494]]
-    The queries identified by pname:queryPool and pname:firstQuery must: be
-    _unavailable_
-  * [[VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-buffer-03736]]
-    The pname:buffer used to create each acceleration structure in
-    pname:pAccelerationStructures must: be bound to device memory
-  * [[VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-query-04880]]
-    The sum of pname:query plus pname:accelerationStructureCount must: be
-    less than or equal to the number of queries in pname:queryPool
-include::{chapters}/commonvalidity/write_acceleration_structure_properties_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdWriteAccelerationStructuresPropertiesKHR.txt[]
---
-
-ifdef::VK_NV_ray_tracing[]
-[open,refpage='vkCmdWriteAccelerationStructuresPropertiesNV',desc='Write acceleration structure result parameters to query results.',type='protos']
---
-:refpage: vkCmdWriteAccelerationStructuresPropertiesNV
-
-To query acceleration structure size parameters call:
-
-include::{generated}/api/protos/vkCmdWriteAccelerationStructuresPropertiesNV.txt[]
-
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:accelerationStructureCount is the count of acceleration structures
-    for which to query the property.
-  * pname:pAccelerationStructures is a pointer to an array of existing
-    previously built acceleration structures.
-  * pname:queryType is a elink:VkQueryType value specifying the type of
-    queries managed by the pool.
-  * pname:queryPool is the query pool that will manage the results of the
-    query.
-  * pname:firstQuery is the first query index within the query pool that
-    will contain the pname:accelerationStructureCount number of results.
-
-Accesses to any of the acceleration structures listed in
-pname:pAccelerationStructures must: be <<synchronization-dependencies,
-synchronized>> with the
-ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-<<synchronization-pipeline-stages, pipeline stage>> and an
-<<synchronization-access-types, access type>> of
-ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdWriteAccelerationStructuresPropertiesNV-queryPool-03755]]
-    pname:queryPool must: have been created with a pname:queryType matching
-    pname:queryType
-  * [[VUID-vkCmdWriteAccelerationStructuresPropertiesNV-queryPool-03756]]
-    The queries identified by pname:queryPool and pname:firstQuery must: be
-    _unavailable_
-  * [[VUID-vkCmdWriteAccelerationStructuresPropertiesNV-accelerationStructure-03757]]
-    pname:accelerationStructure must: be bound completely and contiguously
-    to a single sname:VkDeviceMemory object via
-    flink:vkBindAccelerationStructureMemoryNV
-  * [[VUID-vkCmdWriteAccelerationStructuresPropertiesNV-pAccelerationStructures-04958]]
-    All acceleration structures in pname:pAccelerationStructures must: have
-    been built prior to the execution of this command
-  * [[VUID-vkCmdWriteAccelerationStructuresPropertiesNV-pAccelerationStructures-06215]]
-    All acceleration structures in pname:pAccelerationStructures must: have
-    been built with
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR if
-    pname:queryType is
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV
-  * [[VUID-vkCmdWriteAccelerationStructuresPropertiesNV-queryType-06216]]
-    pname:queryType must: be
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV
-****
-
-include::{generated}/validity/protos/vkCmdWriteAccelerationStructuresPropertiesNV.txt[]
---
-
-[open,refpage='vkCmdCopyAccelerationStructureNV',desc='Copy an acceleration structure',type='protos']
---
-:refpage: vkCmdCopyAccelerationStructureNV
-
-To copy an acceleration structure call:
-
-include::{generated}/api/protos/vkCmdCopyAccelerationStructureNV.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:dst is the target acceleration structure for the copy.
-  * pname:src is the source acceleration structure for the copy.
-  * pname:mode is a elink:VkCopyAccelerationStructureModeKHR value
-    specifying additional operations to perform during the copy.
-
-Accesses to pname:src and pname:dst must: be <<synchronization-dependencies,
-synchronized>> with the
-ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-<<synchronization-pipeline-stages, pipeline stage>> and an
-<<synchronization-access-types, access type>> of
-ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR or
-ename:VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR as appropriate.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/copy_acceleration_structure_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdCopyAccelerationStructureNV.txt[]
---
-endif::VK_NV_ray_tracing[]
-
-ifdef::VK_KHR_acceleration_structure[]
-[open,refpage='vkCmdCopyAccelerationStructureKHR',desc='Copy an acceleration structure',type='protos']
---
-:refpage: vkCmdCopyAccelerationStructureKHR
-
-To copy an acceleration structure call:
-
-include::{generated}/api/protos/vkCmdCopyAccelerationStructureKHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pInfo is a pointer to a slink:VkCopyAccelerationStructureInfoKHR
-    structure defining the copy operation.
-
-This command copies the pname:pInfo->src acceleration structure to the
-pname:pInfo->dst acceleration structure in the manner specified by
-pname:pInfo->mode.
-
-Accesses to pname:pInfo->src and pname:pInfo->dst must: be
-<<synchronization-dependencies, synchronized>> with the
-ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-<<synchronization-pipeline-stages, pipeline stage>> and an
-<<synchronization-access-types, access type>> of
-ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR or
-ename:VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR as appropriate.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdCopyAccelerationStructureKHR-buffer-03737]]
-    The pname:buffer used to create pname:pInfo->src must: be bound to
-    device memory
-  * [[VUID-vkCmdCopyAccelerationStructureKHR-buffer-03738]]
-    The pname:buffer used to create pname:pInfo->dst must: be bound to
-    device memory
-****
-
-include::{generated}/validity/protos/vkCmdCopyAccelerationStructureKHR.txt[]
---
-
-[open,refpage='VkCopyAccelerationStructureInfoKHR',desc='Parameters for copying an acceleration structure',type='structs']
---
-:refpage: VkCopyAccelerationStructureInfoKHR
-
-The sname:VkCopyAccelerationStructureInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkCopyAccelerationStructureInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:src is the source acceleration structure for the copy.
-  * pname:dst is the target acceleration structure for the copy.
-  * pname:mode is a elink:VkCopyAccelerationStructureModeKHR value that
-    specifies additional operations to perform during the copy.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/copy_acceleration_structure_common.txt[]
-****
-
-include::{generated}/validity/structs/VkCopyAccelerationStructureInfoKHR.txt[]
---
-endif::VK_KHR_acceleration_structure[]
-
-[open,refpage='VkCopyAccelerationStructureModeKHR',desc='Acceleration structure copy mode',type='enums',alias='VkCopyAccelerationStructureModeNV']
---
-:refpage: VkCopyAccelerationStructureModeKHR
-
-Possible values of pname:mode specifying additional operations to perform
-during the copy, are:
-
-include::{generated}/api/enums/VkCopyAccelerationStructureModeKHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/enums/VkCopyAccelerationStructureModeNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-  * ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR creates a direct
-    copy of the acceleration structure specified in pname:src into the one
-    specified by pname:dst.
-    The pname:dst acceleration structure must: have been created with the
-    same parameters as pname:src.
-    If pname:src contains references to other acceleration structures,
-    pname:dst will reference the same acceleration structures.
-  * ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR creates a more
-    compact version of an acceleration structure pname:src into pname:dst.
-    The acceleration structure pname:dst must: have been created with a size
-    at least as large as that returned by
-    flink:vkCmdWriteAccelerationStructuresPropertiesKHR
-ifdef::VK_KHR_acceleration_structure[]
-    or flink:vkWriteAccelerationStructuresPropertiesKHR
-endif::VK_KHR_acceleration_structure[]
-    after the build of the acceleration structure specified by pname:src.
-    If pname:src contains references to other acceleration structures,
-    pname:dst will reference the same acceleration structures.
-  * ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR serializes the
-    acceleration structure to a semi-opaque format which can be reloaded on
-    a compatible implementation.
-  * ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR deserializes
-    the semi-opaque serialization format in the buffer to the acceleration
-    structure.
---
-
-[open,refpage='vkCmdCopyAccelerationStructureToMemoryKHR',desc='Copy an acceleration structure to device memory',type='protos']
---
-:refpage: vkCmdCopyAccelerationStructureToMemoryKHR
-
-To copy an acceleration structure to device memory call:
-
-include::{generated}/api/protos/vkCmdCopyAccelerationStructureToMemoryKHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pInfo is an a pointer to a
-    slink:VkCopyAccelerationStructureToMemoryInfoKHR structure defining the
-    copy operation.
-
-Accesses to pname:pInfo->src must: be <<synchronization-dependencies,
-synchronized>> with the
-ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-<<synchronization-pipeline-stages, pipeline stage>> and an
-<<synchronization-access-types, access type>> of
-ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR.
-Accesses to the buffer indicated by pname:pInfo->dst.deviceAddress must: be
-synchronized with the
-ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR pipeline stage
-and an access type of ename:VK_ACCESS_TRANSFER_WRITE_BIT.
-
-This command produces the same results as
-flink:vkCopyAccelerationStructureToMemoryKHR, but writes its result to a
-device address, and is executed on the device rather than the host.
-The output may: not necessarily be bit-for-bit identical, but it can be
-equally used by either flink:vkCmdCopyMemoryToAccelerationStructureKHR or
-flink:vkCopyMemoryToAccelerationStructureKHR.
-
-The defined header structure for the serialized data consists of:
-
-  * ename:VK_UUID_SIZE bytes of data matching
-    sname:VkPhysicalDeviceIDProperties::pname:driverUUID
-  * ename:VK_UUID_SIZE bytes of data identifying the compatibility for
-    comparison using flink:vkGetDeviceAccelerationStructureCompatibilityKHR
-  * A 64-bit integer of the total size matching the value queried using
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR
-  * A 64-bit integer of the deserialized size to be passed in to
-    sname:VkAccelerationStructureCreateInfoKHR::pname:size
-  * A 64-bit integer of the count of the number of acceleration structure
-    handles following.
-    This will be zero for a bottom-level acceleration structure.
-    For top-level acceleration structures this number is
-    implementation-dependent; the number of and ordering of the handles may
-    not match the instance descriptions which were used to build the
-    acceleration structure.
-
-The corresponding handles matching the values returned by
-ifdef::VK_KHR_acceleration_structure[flink:vkGetAccelerationStructureDeviceAddressKHR]
-ifdef::VK_KHR_acceleration_structure+VK_NV_ray_tracing[or]
-ifdef::VK_NV_ray_tracing[flink:vkGetAccelerationStructureHandleNV]
-are tightly packed in the buffer following the count.
-The application is expected to store a mapping between those handles and the
-original application-generated bottom-level acceleration structures to
-provide when deserializing.
-The serialized data is written to the buffer (or read from the buffer)
-according to the host endianness.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pInfo-03739]]
-    pname:pInfo->dst.deviceAddress must: be a valid device address for a
-    buffer bound to device memory
-  * [[VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pInfo-03740]]
-    pname:pInfo->dst.deviceAddress must: be aligned to `256` bytes
-  * [[VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pInfo-03741]]
-    If the buffer pointed to by pname:pInfo->dst.deviceAddress is non-sparse
-    then it must: be bound completely and contiguously to a single
-    slink:VkDeviceMemory object
-  * [[VUID-vkCmdCopyAccelerationStructureToMemoryKHR-None-03559]]
-    The pname:buffer used to create pname:pInfo->src must: be bound to
-    device memory
-****
-
-include::{generated}/validity/protos/vkCmdCopyAccelerationStructureToMemoryKHR.txt[]
---
-
-[open,refpage='VkCopyAccelerationStructureToMemoryInfoKHR',desc='Parameters for serializing an acceleration structure',type='structs']
---
-:refpage: VkCopyAccelerationStructureToMemoryInfoKHR
-
-include::{generated}/api/structs/VkCopyAccelerationStructureToMemoryInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:src is the source acceleration structure for the copy
-  * pname:dst is the device or host address to memory which is the target
-    for the copy
-  * pname:mode is a elink:VkCopyAccelerationStructureModeKHR value that
-    specifies additional operations to perform during the copy.
-
-.Valid Usage
-****
-  * [[VUID-VkCopyAccelerationStructureToMemoryInfoKHR-src-04959]]
-    The source acceleration structure pname:src must: have been constructed
-    prior to the execution of this command
-  * [[VUID-VkCopyAccelerationStructureToMemoryInfoKHR-dst-03561]]
-    The memory pointed to by pname:dst must: be at least as large as the
-    serialization size of pname:src, as reported by
-    flink:vkWriteAccelerationStructuresPropertiesKHR or
-    flink:vkCmdWriteAccelerationStructuresPropertiesKHR with a query type of
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR
-  * [[VUID-VkCopyAccelerationStructureToMemoryInfoKHR-mode-03412]]
-    pname:mode must: be
-    ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR
-****
-
-include::{generated}/validity/structs/VkCopyAccelerationStructureToMemoryInfoKHR.txt[]
---
-
-[open,refpage='vkCmdCopyMemoryToAccelerationStructureKHR',desc='Copy device memory to an acceleration structure',type='protos']
---
-:refpage: vkCmdCopyMemoryToAccelerationStructureKHR
-
-To copy device memory to an acceleration structure call:
-
-include::{generated}/api/protos/vkCmdCopyMemoryToAccelerationStructureKHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pInfo is a pointer to a
-    slink:VkCopyMemoryToAccelerationStructureInfoKHR structure defining the
-    copy operation.
-
-Accesses to pname:pInfo->dst must: be <<synchronization-dependencies,
-synchronized>> with the
-ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-<<synchronization-pipeline-stages, pipeline stage>> and an
-<<synchronization-access-types, access type>> of
-ename:VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR.
-Accesses to the buffer indicated by pname:pInfo->src.deviceAddress must: be
-synchronized with the
-ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR pipeline stage
-and an access type of ename:VK_ACCESS_TRANSFER_READ_BIT.
-
-This command can accept acceleration structures produced by either
-flink:vkCmdCopyAccelerationStructureToMemoryKHR or
-flink:vkCopyAccelerationStructureToMemoryKHR.
-
-The structure provided as input to deserialize is as described in
-flink:vkCmdCopyAccelerationStructureToMemoryKHR, with any acceleration
-structure handles filled in with the newly-queried handles to bottom level
-acceleration structures created before deserialization.
-These do not need to be built at deserialize time, but must: be created.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-03742]]
-    pname:pInfo->src.deviceAddress must: be a valid device address for a
-    buffer bound to device memory
-  * [[VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-03743]]
-    pname:pInfo->src.deviceAddress must: be aligned to `256` bytes
-  * [[VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-03744]]
-    If the buffer pointed to by pname:pInfo->src.deviceAddress is non-sparse
-    then it must: be bound completely and contiguously to a single
-    slink:VkDeviceMemory object
-  * [[VUID-vkCmdCopyMemoryToAccelerationStructureKHR-buffer-03745]]
-    The pname:buffer used to create pname:pInfo->dst must: be bound to
-    device memory
-****
-
-include::{generated}/validity/protos/vkCmdCopyMemoryToAccelerationStructureKHR.txt[]
---
-
-[open,refpage='VkCopyMemoryToAccelerationStructureInfoKHR',desc='Parameters for deserializing an acceleration structure',type='structs']
---
-:refpage: VkCopyMemoryToAccelerationStructureInfoKHR
-
-The sname:VkCopyMemoryToAccelerationStructureInfoKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkCopyMemoryToAccelerationStructureInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:src is the device or host address to memory containing the source
-    data for the copy.
-  * pname:dst is the target acceleration structure for the copy.
-  * pname:mode is a elink:VkCopyAccelerationStructureModeKHR value that
-    specifies additional operations to perform during the copy.
-
-.Valid Usage
-****
-  * [[VUID-VkCopyMemoryToAccelerationStructureInfoKHR-src-04960]]
-    The source memory pointed to by pname:src must: contain data previously
-    serialized using flink:vkCmdCopyAccelerationStructureToMemoryKHR,
-    potentially modified to relocate acceleration structure references as
-    described in that command
-  * [[VUID-VkCopyMemoryToAccelerationStructureInfoKHR-mode-03413]]
-    pname:mode must: be
-    ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR
-  * [[VUID-VkCopyMemoryToAccelerationStructureInfoKHR-pInfo-03414]]
-    The data in pname:src must: have a format compatible with the
-    destination physical device as returned by
-    flink:vkGetDeviceAccelerationStructureCompatibilityKHR
-  * [[VUID-VkCopyMemoryToAccelerationStructureInfoKHR-dst-03746]]
-    pname:dst must: have been created with a pname:size greater than or
-    equal to that used to serialize the data in pname:src
-****
-
-include::{generated}/validity/structs/VkCopyMemoryToAccelerationStructureInfoKHR.txt[]
---
-
-[open,refpage='vkGetDeviceAccelerationStructureCompatibilityKHR',desc='Check if a serialized acceleration structure is compatible with the current device',type='protos']
---
-:refpage: vkGetDeviceAccelerationStructureCompatibilityKHR
-
-To check if a serialized acceleration structure is compatible with the
-current device call:
-
-include::{generated}/api/protos/vkGetDeviceAccelerationStructureCompatibilityKHR.txt[]
-
-  * pname:device is the device to check the version against.
-  * pname:pVersionInfo is a pointer to a
-    slink:VkAccelerationStructureVersionInfoKHR structure specifying version
-    information to check against the device.
-  * pname:pCompatibility is a pointer to a
-    elink:VkAccelerationStructureCompatibilityKHR value in which
-    compatibility information is returned.
-
-.Valid Usage
-****
-// TBD
-  * [[VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-rayTracingPipeline-03661]]
-    The <<features-rayTracingPipeline, pname:rayTracingPipeline>> or
-    <<features-rayQuery, pname:rayQuery>> feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkGetDeviceAccelerationStructureCompatibilityKHR.txt[]
---
-
-[open,refpage='VkAccelerationStructureVersionInfoKHR',desc='Acceleration structure version information',type='structs']
---
-:refpage: VkAccelerationStructureVersionKHR
-
-The sname:VkAccelerationStructureVersionInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkAccelerationStructureVersionInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pVersionData is a pointer to the version header of an acceleration
-    structure as defined in flink:vkCmdCopyAccelerationStructureToMemoryKHR
-
-[NOTE]
-.Note
-====
-pname:pVersionData is a _pointer_ to an array of 2*ename:VK_UUID_SIZE
-code:uint8_t values instead of two ename:VK_UUID_SIZE arrays as the expected
-use case for this member is to be pointed at the header of an previously
-serialized acceleration structure (via
-flink:vkCmdCopyAccelerationStructureToMemoryKHR or
-flink:vkCopyAccelerationStructureToMemoryKHR) that is loaded in memory.
-Using arrays would necessitate extra memory copies of the UUIDs.
-====
-
-include::{generated}/validity/structs/VkAccelerationStructureVersionInfoKHR.txt[]
---
-
-[open,refpage='VkAccelerationStructureCompatibilityKHR',desc='Acceleration structure compatibility',type='enums']
---
-Possible values of pname:pCompatibility returned by
-flink:vkGetDeviceAccelerationStructureCompatibilityKHR are:
-
-include::{generated}/api/enums/VkAccelerationStructureCompatibilityKHR.txt[]
-
-  * ename:VK_ACCELERATION_STRUCTURE_COMPATIBILITY_COMPATIBLE_KHR if the
-    pname:pVersionData version acceleration structure is compatible with
-    pname:device.
-  * ename:VK_ACCELERATION_STRUCTURE_COMPATIBILITY_INCOMPATIBLE_KHR if the
-    pname:pVersionData version acceleration structure is not compatible with
-    pname:device.
---
-
-
-[[host-acceleration-structure]]
-== Host Acceleration Structure Operations
-
-Implementations are also required to provide host implementations of the
-acceleration structure operations if the
-<<features-accelerationStructureHostCommands,pname:accelerationStructureHostCommands>>
-feature is enabled:
-
-  * flink:vkBuildAccelerationStructuresKHR corresponding to
-    flink:vkCmdBuildAccelerationStructuresKHR
-  * flink:vkCopyAccelerationStructureKHR corresponding to
-    flink:vkCmdCopyAccelerationStructureKHR
-  * flink:vkCopyAccelerationStructureToMemoryKHR corresponding to
-    flink:vkCmdCopyAccelerationStructureToMemoryKHR
-  * flink:vkCopyMemoryToAccelerationStructureKHR corresponding to
-    flink:vkCmdCopyMemoryToAccelerationStructureKHR
-  * flink:vkWriteAccelerationStructuresPropertiesKHR corresponding to
-    flink:vkCmdWriteAccelerationStructuresPropertiesKHR
-
-These commands are functionally equivalent to their device counterparts,
-except that they are executed on the host timeline, rather than being
-enqueued into command buffers.
-
-All acceleration structures used by the host commands must: be bound to
-host-visible memory, and all input data for acceleration structure builds
-must: be referenced using host addresses instead of device addresses.
-Applications are not required to map acceleration structure memory when
-using the host commands.
-
-
-[NOTE]
-.Note
-====
-The flink:vkBuildAccelerationStructuresKHR and
-flink:vkCmdBuildAccelerationStructuresKHR may: use different algorithms, and
-thus are not required to produce identical structures.
-The structures produced by these two commands may: exhibit different memory
-footprints or traversal performance, but should strive to be similar where
-possible.
-
-Apart from these details, the host and device operations are interchangable.
-For example, an application can: use flink:vkBuildAccelerationStructuresKHR
-to build a structure, compact it on the device using
-flink:vkCmdCopyAccelerationStructureKHR, and serialize the result using
-flink:vkCopyAccelerationStructureToMemoryKHR.
-====
-
-[NOTE]
-.Note
-====
-For efficient execution, acceleration structures manipulated using these
-commands should always be bound to host cached memory, as the implementation
-may need to repeatedly read and write this memory during the execution of
-the command.
-====
-
-[open,refpage='vkBuildAccelerationStructuresKHR',desc='Build an acceleration structure on the host',type='protos']
---
-:refpage: vkBuildAccelerationStructuresKHR
-:maxinstancecheck: pname:ppBuildRangeInfos[i][j].pname:primitiveCount
-
-To build acceleration structures on the host, call:
-
-include::{generated}/api/protos/vkBuildAccelerationStructuresKHR.txt[]
-
-  * pname:device is the sname:VkDevice for which the acceleration structures
-    are being built.
-  * pname:deferredOperation is an optional slink:VkDeferredOperationKHR to
-    <<deferred-host-operations-requesting, request deferral>> for this
-    command.
-  * pname:infoCount is the number of acceleration structures to build.
-    It specifies the number of the pname:pInfos structures and
-    pname:ppBuildRangeInfos pointers that must: be provided.
-  * pname:pInfos is a pointer to an array of pname:infoCount
-    slink:VkAccelerationStructureBuildGeometryInfoKHR structures defining
-    the geometry used to build each acceleration structure.
-  * pname:ppBuildRangeInfos is a pointer to an array of pname:infoCount
-    pointers to arrays of slink:VkAccelerationStructureBuildRangeInfoKHR
-    structures.
-    Each pname:ppBuildRangeInfos[i] is a pointer to an array of
-    pname:pInfos[i].pname:geometryCount
-    slink:VkAccelerationStructureBuildRangeInfoKHR structures defining
-    dynamic offsets to the addresses where geometry data is stored, as
-    defined by pname:pInfos[i].
-
-This command fulfills the same task as
-flink:vkCmdBuildAccelerationStructuresKHR but is executed by the host.
-
-The fname:vkBuildAccelerationStructuresKHR command provides the ability to
-initiate multiple acceleration structures builds, however there is no
-ordering or synchronization implied between any of the individual
-acceleration structure builds.
-
-[NOTE]
-.Note
-====
-This means that an application cannot: build a top-level acceleration
-structure in the same flink:vkBuildAccelerationStructuresKHR call as the
-associated bottom-level or instance acceleration structures are being built.
-There also cannot: be any memory aliasing between any acceleration structure
-memories or scratch memories being used by any of the builds.
-====
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/build_acceleration_structure_common.txt[]
-include::{chapters}/commonvalidity/build_acceleration_structure_nonindirect_common.txt[]
-include::{chapters}/commonvalidity/deferred_operations_common.txt[]
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03722]]
-    For each element of pname:pInfos, the pname:buffer used to create its
-    pname:dstAccelerationStructure member must: be bound to host-visible
-    device memory
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03723]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR the pname:buffer
-    used to create its pname:srcAccelerationStructure member must: be bound
-    to host-visible device memory
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03724]]
-    For each element of pname:pInfos, the pname:buffer used to create each
-    acceleration structure referenced by the pname:geometry.instances.data
-    member of any element of pname:pGeometries or pname:ppGeometries with a
-    pname:geometryType of ename:VK_GEOMETRY_TYPE_INSTANCES_KHR must: be
-    bound to host-visible device memory
-  * [[VUID-vkBuildAccelerationStructuresKHR-accelerationStructureHostCommands-03581]]
-    The <<features-accelerationStructureHostCommands,
-    sname:VkPhysicalDeviceAccelerationStructureFeaturesKHR::pname:accelerationStructureHostCommands>>
-    feature must: be enabled
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03725]]
-    If pname:pInfos[i].pname:mode is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR, all addresses
-    between pname:pInfos[i].pname:scratchData.hostAddress and
-    pname:pInfos[i].pname:scratchData.hostAddress + N - 1 must: be valid
-    host memory, where N is given by the pname:buildScratchSize member of
-    the slink:VkAccelerationStructureBuildSizesInfoKHR structure returned
-    from a call to flink:vkGetAccelerationStructureBuildSizesKHR with an
-    identical slink:VkAccelerationStructureBuildGeometryInfoKHR structure
-    and primitive count
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03726]]
-    If pname:pInfos[i].pname:mode is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, all addresses
-    between pname:pInfos[i].pname:scratchData.hostAddress and
-    pname:pInfos[i].pname:scratchData.hostAddress + N - 1 must: be valid
-    host memory, where N is given by the pname:updateScratchSize member of
-    the slink:VkAccelerationStructureBuildSizesInfoKHR structure returned
-    from a call to flink:vkGetAccelerationStructureBuildSizesKHR with an
-    identical slink:VkAccelerationStructureBuildGeometryInfoKHR structure
-    and primitive count
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03771]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR,
-    pname:geometry.triangles.vertexData.hostAddress must: be a valid host
-    address
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03772]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, if
-    pname:geometry.triangles.indexType is not ename:VK_INDEX_TYPE_NONE_KHR,
-    pname:geometry.triangles.indexData.hostAddress must: be a valid host
-    address
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03773]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, if
-    pname:geometry.triangles.transformData.hostAddress is not `0`, it must:
-    be a valid host address
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03774]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_AABBS_KHR, pname:geometry.aabbs.data.hostAddress
-    must: be a valid host address
-ifdef::VK_KHR_device_group,VK_VERSION_1_1[]
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03775]]
-    For each element of pname:pInfos, the pname:buffer used to create its
-    pname:dstAccelerationStructure member must: be bound to memory that was
-    not allocated with multiple instances
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03776]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR the pname:buffer
-    used to create its pname:srcAccelerationStructure member must: be bound
-    to memory that was not allocated with multiple instances
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03777]]
-    For each element of pname:pInfos, the pname:buffer used to create each
-    acceleration structure referenced by the pname:geometry.instances.data
-    member of any element of pname:pGeometries or pname:ppGeometries with a
-    pname:geometryType of ename:VK_GEOMETRY_TYPE_INSTANCES_KHR must: be
-    bound to memory that was not allocated with multiple instances
-endif::VK_KHR_device_group,VK_VERSION_1_1[]
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03778]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_INSTANCES_KHR,
-    pname:geometry.instances.data.hostAddress must: be a valid host address
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-03779]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_INSTANCES_KHR, each
-    slink:VkAccelerationStructureInstanceKHR::pname:accelerationStructureReference
-    value in pname:geometry.instances.data.hostAddress must be a valid
-    slink:VkAccelerationStructureKHR object
-ifdef::VK_NV_ray_tracing_motion_blur[]
-  * [[VUID-vkBuildAccelerationStructuresKHR-pInfos-04930]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_INSTANCES_KHR with
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV set, each
-    pname:accelerationStructureReference in any structure in
-    slink:VkAccelerationStructureMotionInstanceNV value in
-    pname:geometry.instances.data.hostAddress must be a valid
-    slink:VkAccelerationStructureKHR object
-endif::VK_NV_ray_tracing_motion_blur[]
-****
-
-include::{generated}/validity/protos/vkBuildAccelerationStructuresKHR.txt[]
---
-
-[open,refpage='vkCopyAccelerationStructureKHR',desc='Copy an acceleration structure on the host',type='protos']
---
-:refpage: vkCopyAccelerationStructureKHR
-
-To copy or compact an acceleration structure on the host, call:
-
-include::{generated}/api/protos/vkCopyAccelerationStructureKHR.txt[]
-
-  * pname:device is the device which owns the acceleration structures.
-  * pname:deferredOperation is an optional slink:VkDeferredOperationKHR to
-    <<deferred-host-operations-requesting, request deferral>> for this
-    command.
-  * pname:pInfo is a pointer to a slink:VkCopyAccelerationStructureInfoKHR
-    structure defining the copy operation.
-
-This command fulfills the same task as
-flink:vkCmdCopyAccelerationStructureKHR but is executed by the host.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/deferred_operations_common.txt[]
-  * [[VUID-vkCopyAccelerationStructureKHR-buffer-03727]]
-    The pname:buffer used to create pname:pInfo->src must: be bound to
-    host-visible device memory
-  * [[VUID-vkCopyAccelerationStructureKHR-buffer-03728]]
-    The pname:buffer used to create pname:pInfo->dst must: be bound to
-    host-visible device memory
-  * [[VUID-vkCopyAccelerationStructureKHR-accelerationStructureHostCommands-03582]]
-    The <<features-accelerationStructureHostCommands,
-    sname:VkPhysicalDeviceAccelerationStructureFeaturesKHR::pname:accelerationStructureHostCommands>>
-    feature must: be enabled
-ifdef::VK_KHR_device_group,VK_VERSION_1_1[]
-  * [[VUID-vkCopyAccelerationStructureKHR-buffer-03780]]
-    The pname:buffer used to create pname:pInfo->src must: be bound to
-    memory that was not allocated with multiple instances
-  * [[VUID-vkCopyAccelerationStructureKHR-buffer-03781]]
-    The pname:buffer used to create pname:pInfo->dst must: be bound to
-    memory that was not allocated with multiple instances
-endif::VK_KHR_device_group,VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/protos/vkCopyAccelerationStructureKHR.txt[]
---
-
-[open,refpage='vkCopyMemoryToAccelerationStructureKHR',desc='Deserialize an acceleration structure on the host',type='protos']
---
-:refpage: vkCopyMemoryToAccelerationStructureKHR
-
-To copy host accessible memory to an acceleration structure, call:
-
-include::{generated}/api/protos/vkCopyMemoryToAccelerationStructureKHR.txt[]
-
-  * pname:device is the device which owns pname:pInfo->dst.
-  * pname:deferredOperation is an optional slink:VkDeferredOperationKHR to
-    <<deferred-host-operations-requesting, request deferral>> for this
-    command.
-  * pname:pInfo is a pointer to a
-    slink:VkCopyMemoryToAccelerationStructureInfoKHR structure defining the
-    copy operation.
-
-This command fulfills the same task as
-flink:vkCmdCopyMemoryToAccelerationStructureKHR but is executed by the host.
-
-This command can accept acceleration structures produced by either
-flink:vkCmdCopyAccelerationStructureToMemoryKHR or
-flink:vkCopyAccelerationStructureToMemoryKHR.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/deferred_operations_common.txt[]
-  * [[VUID-vkCopyMemoryToAccelerationStructureKHR-pInfo-03729]]
-    pname:pInfo->src.hostAddress must: be a valid host pointer
-  * [[VUID-vkCopyMemoryToAccelerationStructureKHR-pInfo-03750]]
-    pname:pInfo->src.hostAddress must: be aligned to 16 bytes
-  * [[VUID-vkCopyMemoryToAccelerationStructureKHR-buffer-03730]]
-    The pname:buffer used to create pname:pInfo->dst must: be bound to
-    host-visible device memory
-  * [[VUID-vkCopyMemoryToAccelerationStructureKHR-accelerationStructureHostCommands-03583]]
-    The <<features-accelerationStructureHostCommands,
-    sname:VkPhysicalDeviceAccelerationStructureFeaturesKHR::pname:accelerationStructureHostCommands>>
-    feature must: be enabled
-ifdef::VK_KHR_device_group,VK_VERSION_1_1[]
-  * [[VUID-vkCopyMemoryToAccelerationStructureKHR-buffer-03782]]
-    The pname:buffer used to create pname:pInfo->dst must: be bound to
-    memory that was not allocated with multiple instances
-endif::VK_KHR_device_group,VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/protos/vkCopyMemoryToAccelerationStructureKHR.txt[]
---
-
-[open,refpage='vkCopyAccelerationStructureToMemoryKHR',desc='Serialize an acceleration structure on the host',type='protos']
---
-:refpage: vkCopyAccelerationStructureToMemoryKHR
-
-To copy an acceleration structure to host accessible memory, call:
-
-include::{generated}/api/protos/vkCopyAccelerationStructureToMemoryKHR.txt[]
-
-  * pname:device is the device which owns pname:pInfo->src.
-  * pname:deferredOperation is an optional slink:VkDeferredOperationKHR to
-    <<deferred-host-operations-requesting, request deferral>> for this
-    command.
-  * pname:pInfo is a pointer to a
-    slink:VkCopyAccelerationStructureToMemoryInfoKHR structure defining the
-    copy operation.
-
-This command fulfills the same task as
-flink:vkCmdCopyAccelerationStructureToMemoryKHR but is executed by the host.
-
-This command produces the same results as
-flink:vkCmdCopyAccelerationStructureToMemoryKHR, but writes its result
-directly to a host pointer, and is executed on the host rather than the
-device.
-The output may: not necessarily be bit-for-bit identical, but it can be
-equally used by either flink:vkCmdCopyMemoryToAccelerationStructureKHR or
-flink:vkCopyMemoryToAccelerationStructureKHR.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/deferred_operations_common.txt[]
-  * [[VUID-vkCopyAccelerationStructureToMemoryKHR-buffer-03731]]
-    The pname:buffer used to create pname:pInfo->src must: be bound to
-    host-visible device memory
-  * [[VUID-vkCopyAccelerationStructureToMemoryKHR-pInfo-03732]]
-    pname:pInfo->dst.hostAddress must: be a valid host pointer
-  * [[VUID-vkCopyAccelerationStructureToMemoryKHR-pInfo-03751]]
-    pname:pInfo->dst.hostAddress must: be aligned to 16 bytes
-  * [[VUID-vkCopyAccelerationStructureToMemoryKHR-accelerationStructureHostCommands-03584]]
-    The <<features-accelerationStructureHostCommands,
-    sname:VkPhysicalDeviceAccelerationStructureFeaturesKHR::pname:accelerationStructureHostCommands>>
-    feature must: be enabled
-ifdef::VK_KHR_device_group,VK_VERSION_1_1[]
-  * [[VUID-vkCopyAccelerationStructureToMemoryKHR-buffer-03783]]
-    The pname:buffer used to create pname:pInfo->src must: be bound to
-    memory that was not allocated with multiple instances
-endif::VK_KHR_device_group,VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/protos/vkCopyAccelerationStructureToMemoryKHR.txt[]
---
-
-[open,refpage='vkWriteAccelerationStructuresPropertiesKHR',desc='Query acceleration structure meta-data on the host',type='protos']
---
-:refpage: vkWriteAccelerationStructuresPropertiesKHR
-
-To query acceleration structure size parameters on the host, call:
-
-include::{generated}/api/protos/vkWriteAccelerationStructuresPropertiesKHR.txt[]
-
-  * pname:device is the device which owns the acceleration structures in
-    pname:pAccelerationStructures.
-  * pname:accelerationStructureCount is the count of acceleration structures
-    for which to query the property.
-  * pname:pAccelerationStructures is a pointer to an array of existing
-    previously built acceleration structures.
-  * pname:queryType is a elink:VkQueryType value specifying the property to
-    be queried.
-  * pname:dataSize is the size in bytes of the buffer pointed to by
-    pname:pData.
-  * pname:pData is a pointer to a user-allocated buffer where the results
-    will be written.
-  * pname:stride is the stride in bytes between results for individual
-    queries within pname:pData.
-
-This command fulfills the same task as
-flink:vkCmdWriteAccelerationStructuresPropertiesKHR but is executed by the
-host.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/write_acceleration_structure_properties_common.txt[]
-  * [[VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03448]]
-    If pname:queryType is
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR, then
-    pname:stride must: be a multiple of the size of basetype:VkDeviceSize
-  * [[VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03449]]
-    If pname:queryType is
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR, then
-    pname:data must: point to a basetype:VkDeviceSize
-  * [[VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03450]]
-    If pname:queryType is
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR, then
-    pname:stride must: be a multiple of the size of basetype:VkDeviceSize
-  * [[VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03451]]
-    If pname:queryType is
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR, then
-    pname:data must: point to a basetype:VkDeviceSize
-  * [[VUID-vkWriteAccelerationStructuresPropertiesKHR-dataSize-03452]]
-    pname:dataSize must: be greater than or equal to
-    [eq]#pname:accelerationStructureCount*pname:stride#
-  * [[VUID-vkWriteAccelerationStructuresPropertiesKHR-buffer-03733]]
-    The pname:buffer used to create each acceleration structure in
-    pname:pAccelerationStructures must: be bound to host-visible device
-    memory
-  * [[VUID-vkWriteAccelerationStructuresPropertiesKHR-accelerationStructureHostCommands-03585]]
-    The <<features-accelerationStructureHostCommands,
-    sname:VkPhysicalDeviceAccelerationStructureFeaturesKHR::pname:accelerationStructureHostCommands>>
-    feature must: be enabled
-ifdef::VK_KHR_device_group,VK_VERSION_1_1[]
-  * [[VUID-vkWriteAccelerationStructuresPropertiesKHR-buffer-03784]]
-    The pname:buffer used to create each acceleration structure in
-    pname:pAccelerationStructures must: be bound to memory that was not
-    allocated with multiple instances
-endif::VK_KHR_device_group,VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/protos/vkWriteAccelerationStructuresPropertiesKHR.txt[]
---
diff --git a/registry/vulkan/chapters/capabilities.txt b/registry/vulkan/chapters/capabilities.txt
deleted file mode 100644
index 3628f74..0000000
--- a/registry/vulkan/chapters/capabilities.txt
+++ /dev/null
@@ -1,1610 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[capabilities]]
-= Additional Capabilities
-
-This chapter describes additional capabilities beyond the minimum
-capabilities described in the <<limits,Limits>> and <<formats,Formats>>
-chapters, including:
-
-  * <<capabilities-image, Additional Image Capabilities>>
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory_capabilities[]
-  * <<capabilities-buffer, Additional Buffer Capabilities>>
-endif::VK_VERSION_1_1,VK_KHR_external_memory_capabilities[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities[]
-  * <<capabilities-semaphore, Optional Semaphore Capabilities>>
-endif::VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_fence_capabilities[]
-  * <<capabilities-fence, Optional Fence Capabilities>>
-endif::VK_VERSION_1_1,VK_KHR_external_fence_capabilities[]
-ifdef::VK_EXT_calibrated_timestamps[]
-  * <<features-timestamp-calibration, Timestamp Calibration Capabilities>>
-endif::VK_EXT_calibrated_timestamps[]
-
-
-[[capabilities-image]]
-== Additional Image Capabilities
-
-Additional image capabilities, such as larger dimensions or additional
-sample counts for certain image types, or additional capabilities for
-_linear_ tiling format images, are described in this section.
-
-[open,refpage='vkGetPhysicalDeviceImageFormatProperties',desc='Lists physical device\'s image format capabilities',type='protos']
---
-To query additional capabilities specific to image types, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceImageFormatProperties.txt[]
-
-  * pname:physicalDevice is the physical device from which to query the
-    image capabilities.
-  * pname:format is a elink:VkFormat value specifying the image format,
-    corresponding to slink:VkImageCreateInfo::pname:format.
-  * pname:type is a elink:VkImageType value specifying the image type,
-    corresponding to slink:VkImageCreateInfo::pname:imageType.
-  * pname:tiling is a elink:VkImageTiling value specifying the image tiling,
-    corresponding to slink:VkImageCreateInfo::pname:tiling.
-  * pname:usage is a bitmask of elink:VkImageUsageFlagBits specifying the
-    intended usage of the image, corresponding to
-    slink:VkImageCreateInfo::pname:usage.
-  * pname:flags is a bitmask of elink:VkImageCreateFlagBits specifying
-    additional parameters of the image, corresponding to
-    slink:VkImageCreateInfo::pname:flags.
-  * pname:pImageFormatProperties is a pointer to a
-    slink:VkImageFormatProperties structure in which capabilities are
-    returned.
-
-The pname:format, pname:type, pname:tiling, pname:usage, and pname:flags
-parameters correspond to parameters that would be consumed by
-flink:vkCreateImage (as members of slink:VkImageCreateInfo).
-
-If pname:format is not a supported image format, or if the combination of
-pname:format, pname:type, pname:tiling, pname:usage, and pname:flags is not
-supported for images, then fname:vkGetPhysicalDeviceImageFormatProperties
-returns ename:VK_ERROR_FORMAT_NOT_SUPPORTED.
-
-The limitations on an image format that are reported by
-fname:vkGetPhysicalDeviceImageFormatProperties have the following property:
-if code:usage1 and code:usage2 of type tlink:VkImageUsageFlags are such that
-the bits set in code:usage1 are a subset of the bits set in code:usage2, and
-code:flags1 and code:flags2 of type tlink:VkImageCreateFlags are such that
-the bits set in code:flags1 are a subset of the bits set in code:flags2,
-then the limitations for code:usage1 and code:flags1 must: be no more strict
-than the limitations for code:usage2 and code:flags2, for all values of
-pname:format, pname:type, and pname:tiling.
-
-ifdef::VK_EXT_image_drm_format_modifier[]
-.Valid Usage
-****
-  * [[VUID-vkGetPhysicalDeviceImageFormatProperties-tiling-02248]]
-    pname:tiling must: not be ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT.
-    (Use flink:vkGetPhysicalDeviceImageFormatProperties2 instead)
-****
-endif::VK_EXT_image_drm_format_modifier[]
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceImageFormatProperties.txt[]
---
-
-[open,refpage='VkImageFormatProperties',desc='Structure specifying an image format properties',type='structs']
---
-The sname:VkImageFormatProperties structure is defined as:
-
-include::{generated}/api/structs/VkImageFormatProperties.txt[]
-
-  * pname:maxExtent are the maximum image dimensions.
-    See the <<features-extentperimagetype,Allowed Extent Values>> section
-    below for how these values are constrained by pname:type.
-  * pname:maxMipLevels is the maximum number of mipmap levels.
-    pname:maxMipLevels must: be equal to the number of levels in the
-    complete mipmap chain based on the [eq]#pname:maxExtent.width#,
-    [eq]#pname:maxExtent.height#, and [eq]#pname:maxExtent.depth#, except
-    when one of the following conditions is true, in which case it may:
-    instead be `1`:
-  ** fname:vkGetPhysicalDeviceImageFormatProperties::pname:tiling was
-     ename:VK_IMAGE_TILING_LINEAR
-ifdef::VK_EXT_image_drm_format_modifier[]
-  ** slink:VkPhysicalDeviceImageFormatInfo2::pname:tiling was
-     ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT
-endif::VK_EXT_image_drm_format_modifier[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory_capabilities[]
-  ** the slink:VkPhysicalDeviceImageFormatInfo2::pname:pNext chain included
-     a slink:VkPhysicalDeviceExternalImageFormatInfo structure with a handle
-     type included in the pname:handleTypes member for which mipmap image
-     support is not required
-endif::VK_VERSION_1_1,VK_KHR_external_memory_capabilities[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  ** image pname:format is one of the
-    <<formats-requiring-sampler-ycbcr-conversion, formats that require a
-    sampler Y'C~B~C~R~ conversion>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_EXT_fragment_density_map[]
-  ** pname:flags contains ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-  * pname:maxArrayLayers is the maximum number of array layers.
-    pname:maxArrayLayers must: be no less than
-    slink:VkPhysicalDeviceLimits::pname:maxImageArrayLayers, except when one
-    of the following conditions is true, in which case it may: instead be
-    `1`:
-  ** pname:tiling is ename:VK_IMAGE_TILING_LINEAR
-  ** pname:tiling is ename:VK_IMAGE_TILING_OPTIMAL and pname:type is
-     ename:VK_IMAGE_TYPE_3D
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  ** pname:format is one of the
-    <<formats-requiring-sampler-ycbcr-conversion, formats that require a
-    sampler Y'C~B~C~R~ conversion>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * If pname:tiling is ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then
-    pname:maxArrayLayers must: not be 0.
-endif::VK_EXT_image_drm_format_modifier[]
-  * pname:sampleCounts is a bitmask of elink:VkSampleCountFlagBits
-    specifying all the supported sample counts for this image as described
-    <<features-supported-sample-counts, below>>.
-  * pname:maxResourceSize is an upper bound on the total image size in
-    bytes, inclusive of all image subresources.
-    Implementations may: have an address space limit on total size of a
-    resource, which is advertised by this property.
-    pname:maxResourceSize must: be at least 2^31^.
-
-[NOTE]
-.Note
-====
-There is no mechanism to query the size of an image before creating it, to
-compare that size against pname:maxResourceSize.
-If an application attempts to create an image that exceeds this limit, the
-creation will fail and flink:vkCreateImage will return
-ename:VK_ERROR_OUT_OF_DEVICE_MEMORY.
-While the advertised limit must: be at least 2^31^, it may: not be possible
-to create an image that approaches that size, particularly for
-ename:VK_IMAGE_TYPE_1D.
-====
-
-If the combination of parameters to
-fname:vkGetPhysicalDeviceImageFormatProperties is not supported by the
-implementation for use in flink:vkCreateImage, then all members of
-sname:VkImageFormatProperties will be filled with zero.
-
-[NOTE]
-.Note
-====
-Filling sname:VkImageFormatProperties with zero for unsupported formats is
-an exception to the usual rule that output structures have undefined:
-contents on error.
-This exception was unintentional, but is preserved for backwards
-compatibility.
-====
-
-include::{generated}/validity/structs/VkImageFormatProperties.txt[]
---
-
-ifdef::VK_NV_external_memory_capabilities[]
-include::./VK_NV_external_memory_capabilities/external_image_format.txt[]
-endif::VK_NV_external_memory_capabilities[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-[open,refpage='vkGetPhysicalDeviceImageFormatProperties2',desc='Lists physical device\'s image format capabilities',type='protos']
---
-To query additional capabilities specific to image types, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetPhysicalDeviceImageFormatProperties2.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_get_physical_device_properties2[or the equivalent command]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-include::{generated}/api/protos/vkGetPhysicalDeviceImageFormatProperties2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:physicalDevice is the physical device from which to query the
-    image capabilities.
-  * pname:pImageFormatInfo is a pointer to a
-    slink:VkPhysicalDeviceImageFormatInfo2 structure describing the
-    parameters that would be consumed by flink:vkCreateImage.
-  * pname:pImageFormatProperties is a pointer to a
-    slink:VkImageFormatProperties2 structure in which capabilities are
-    returned.
-
-fname:vkGetPhysicalDeviceImageFormatProperties2 behaves similarly to
-flink:vkGetPhysicalDeviceImageFormatProperties, with the ability to return
-extended information in a pname:pNext chain of output structures.
-
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-.Valid Usage
-****
-  * [[VUID-vkGetPhysicalDeviceImageFormatProperties2-pNext-01868]]
-    If the pname:pNext chain of pname:pImageFormatProperties includes a
-    slink:VkAndroidHardwareBufferUsageANDROID structure, the pname:pNext
-    chain of pname:pImageFormatInfo must: include a
-    slink:VkPhysicalDeviceExternalImageFormatInfo structure with
-    pname:handleType set to
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID
-****
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceImageFormatProperties2.txt[]
---
-
-[open,refpage='VkPhysicalDeviceImageFormatInfo2',desc='Structure specifying image creation parameters',type='structs']
---
-The sname:VkPhysicalDeviceImageFormatInfo2 structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceImageFormatInfo2.txt[]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceImageFormatInfo2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-    The pname:pNext chain of sname:VkPhysicalDeviceImageFormatInfo2 is used
-    to provide additional image parameters to
-    fname:vkGetPhysicalDeviceImageFormatProperties2.
-  * pname:format is a elink:VkFormat value indicating the image format,
-    corresponding to slink:VkImageCreateInfo::pname:format.
-  * pname:type is a elink:VkImageType value indicating the image type,
-    corresponding to slink:VkImageCreateInfo::pname:imageType.
-  * pname:tiling is a elink:VkImageTiling value indicating the image tiling,
-    corresponding to slink:VkImageCreateInfo::pname:tiling.
-  * pname:usage is a bitmask of elink:VkImageUsageFlagBits indicating the
-    intended usage of the image, corresponding to
-    slink:VkImageCreateInfo::pname:usage.
-  * pname:flags is a bitmask of elink:VkImageCreateFlagBits indicating
-    additional parameters of the image, corresponding to
-    slink:VkImageCreateInfo::pname:flags.
-
-The members of sname:VkPhysicalDeviceImageFormatInfo2 correspond to the
-arguments to flink:vkGetPhysicalDeviceImageFormatProperties, with
-pname:sType and pname:pNext added for extensibility.
-
-ifdef::VK_EXT_image_drm_format_modifier[]
-.Valid Usage
-****
-  * [[VUID-VkPhysicalDeviceImageFormatInfo2-tiling-02249]]
-    pname:tiling must: be ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT if
-    and only if the pname:pNext chain includes
-    slink:VkPhysicalDeviceImageDrmFormatModifierInfoEXT
-  * [[VUID-VkPhysicalDeviceImageFormatInfo2-tiling-02313]]
-    If pname:tiling is ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT and
-    pname:flags contains ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, then the
-    pname:pNext chain must: include a slink:VkImageFormatListCreateInfo
-    structure with non-zero pname:viewFormatCount
-****
-endif::VK_EXT_image_drm_format_modifier[]
-
-include::{generated}/validity/structs/VkPhysicalDeviceImageFormatInfo2.txt[]
---
-
-[open,refpage='VkImageFormatProperties2',desc='Structure specifying an image format properties',type='structs']
---
-The sname:VkImageFormatProperties2 structure is defined as:
-
-include::{generated}/api/structs/VkImageFormatProperties2.txt[]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-or the equivalent
-
-include::{generated}/api/structs/VkImageFormatProperties2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-    The pname:pNext chain of sname:VkImageFormatProperties2 is used to allow
-    the specification of additional capabilities to be returned from
-    fname:vkGetPhysicalDeviceImageFormatProperties2.
-  * pname:imageFormatProperties is a slink:VkImageFormatProperties structure
-    in which capabilities are returned.
-
-If the combination of parameters to
-fname:vkGetPhysicalDeviceImageFormatProperties2 is not supported by the
-implementation for use in flink:vkCreateImage, then all members of
-pname:imageFormatProperties will be filled with zero.
-
-[NOTE]
-.Note
-====
-Filling pname:imageFormatProperties with zero for unsupported formats is an
-exception to the usual rule that output structures have undefined: contents
-on error.
-This exception was unintentional, but is preserved for backwards
-compatibility.
-This exeption only applies to pname:imageFormatProperties, not pname:sType,
-pname:pNext, or any structures chained from pname:pNext.
-====
-
-include::{generated}/validity/structs/VkImageFormatProperties2.txt[]
---
-
-ifdef::VK_AMD_texture_gather_bias_lod[]
-[open,refpage='VkTextureLODGatherFormatPropertiesAMD',desc='Structure informing whether or not texture gather bias/LOD functionality is supported for a given image format and a given physical device.',type='structs']
---
-To determine if texture gather functions that take explicit LOD and/or bias
-argument values can: be used with a given image format, add a
-slink:VkTextureLODGatherFormatPropertiesAMD structure to the pname:pNext
-chain of the slink:VkImageFormatProperties2 structure in a call to
-fname:vkGetPhysicalDeviceImageFormatProperties2.
-
-The sname:VkTextureLODGatherFormatPropertiesAMD structure is defined as:
-
-include::{generated}/api/structs/VkTextureLODGatherFormatPropertiesAMD.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:supportsTextureGatherLODBiasAMD tells if the image format can be
-    used with texture gather bias/LOD functions, as introduced by the
-    `apiext:VK_AMD_texture_gather_bias_lod` extension.
-    This field is set by the implementation.
-    User-specified value is ignored.
-
-include::{generated}/validity/structs/VkTextureLODGatherFormatPropertiesAMD.txt[]
---
-endif::VK_AMD_texture_gather_bias_lod[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory_capabilities[]
-[open,refpage='VkPhysicalDeviceExternalImageFormatInfo',desc='Structure specifying external image creation parameters',type='structs']
---
-To determine the image capabilities compatible with an external memory
-handle type, add a slink:VkPhysicalDeviceExternalImageFormatInfo structure
-to the pname:pNext chain of the slink:VkPhysicalDeviceImageFormatInfo2
-structure and a sname:VkExternalImageFormatProperties structure to the
-pname:pNext chain of the slink:VkImageFormatProperties2 structure.
-
-The sname:VkPhysicalDeviceExternalImageFormatInfo structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceExternalImageFormatInfo.txt[]
-
-ifdef::VK_KHR_external_memory_capabilities[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceExternalImageFormatInfoKHR.txt[]
-endif::VK_KHR_external_memory_capabilities[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value
-    specifying the memory handle type that will be used with the memory
-    associated with the image.
-
-If pname:handleType is 0, flink:vkGetPhysicalDeviceImageFormatProperties2
-will behave as if slink:VkPhysicalDeviceExternalImageFormatInfo was not
-present, and slink:VkExternalImageFormatProperties will be ignored.
-
-If pname:handleType is not compatible with the pname:format, pname:type,
-pname:tiling, pname:usage, and pname:flags specified in
-slink:VkPhysicalDeviceImageFormatInfo2, then
-flink:vkGetPhysicalDeviceImageFormatProperties2 returns
-ename:VK_ERROR_FORMAT_NOT_SUPPORTED.
-
-include::{generated}/validity/structs/VkPhysicalDeviceExternalImageFormatInfo.txt[]
---
-
-[open,refpage='VkExternalMemoryHandleTypeFlagBits',desc='Bit specifying external memory handle types',type='enums']
---
-Possible values of
-slink:VkPhysicalDeviceExternalImageFormatInfo::pname:handleType, specifying
-an external memory handle type, are:
-
-include::{generated}/api/enums/VkExternalMemoryHandleTypeFlagBits.txt[]
-
-ifdef::VK_KHR_external_memory_capabilities[]
-or the equivalent
-
-include::{generated}/api/enums/VkExternalMemoryHandleTypeFlagBitsKHR.txt[]
-endif::VK_KHR_external_memory_capabilities[]
-
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT specifies a POSIX
-    file descriptor handle that has only limited valid usage outside of
-    Vulkan and other compatible APIs.
-    It must: be compatible with the POSIX system calls code:dup, code:dup2,
-    code:close, and the non-standard system call code:dup3.
-    Additionally, it must: be transportable over a socket using an
-    code:SCM_RIGHTS control message.
-    It owns a reference to the underlying memory resource represented by its
-    Vulkan memory object.
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT specifies an NT
-    handle that has only limited valid usage outside of Vulkan and other
-    compatible APIs.
-    It must: be compatible with the functions code:DuplicateHandle,
-    code:CloseHandle, code:CompareObjectHandles, code:GetHandleInformation,
-    and code:SetHandleInformation.
-    It owns a reference to the underlying memory resource represented by its
-    Vulkan memory object.
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT specifies a
-    global share handle that has only limited valid usage outside of Vulkan
-    and other compatible APIs.
-    It is not compatible with any native APIs.
-    It does not own a reference to the underlying memory resource
-    represented by its Vulkan memory object, and will therefore become
-    invalid when all Vulkan memory objects associated with it are destroyed.
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT specifies an NT
-    handle returned by code:IDXGIResource1::code:CreateSharedHandle
-    referring to a Direct3D 10 or 11 texture resource.
-    It owns a reference to the memory used by the Direct3D resource.
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT specifies a
-    global share handle returned by code:IDXGIResource::code:GetSharedHandle
-    referring to a Direct3D 10 or 11 texture resource.
-    It does not own a reference to the underlying Direct3D resource, and
-    will therefore become invalid when all Vulkan memory objects and
-    Direct3D resources associated with it are destroyed.
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT specifies an NT
-    handle returned by code:ID3D12Device::code:CreateSharedHandle referring
-    to a Direct3D 12 heap resource.
-    It owns a reference to the resources used by the Direct3D heap.
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT specifies an NT
-    handle returned by code:ID3D12Device::code:CreateSharedHandle referring
-    to a Direct3D 12 committed resource.
-    It owns a reference to the memory used by the Direct3D resource.
-ifdef::VK_EXT_external_memory_host[]
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT specifies a
-    host pointer returned by a host memory allocation command.
-    It does not own a reference to the underlying memory resource, and will
-    therefore become invalid if the host memory is freed.
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT
-    specifies a host pointer to _host mapped foreign memory_.
-    It does not own a reference to the underlying memory resource, and will
-    therefore become invalid if the foreign memory is unmapped or otherwise
-    becomes no longer available.
-endif::VK_EXT_external_memory_host[]
-ifdef::VK_EXT_external_memory_dma_buf[]
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT is a file
-    descriptor for a Linux dma_buf.
-    It owns a reference to the underlying memory resource represented by its
-    Vulkan memory object.
-endif::VK_EXT_external_memory_dma_buf[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID
-    specifies an basetype:AHardwareBuffer object defined by the Android NDK.
-    See <<memory-external-android-hardware-buffer,Android Hardware Buffers>>
-    for more details of this handle type.
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_FUCHSIA_external_memory[]
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA is a Zircon
-    handle to a virtual memory object.
-endif::VK_FUCHSIA_external_memory[]
-ifdef::VK_NV_external_memory_rdma[]
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV is a handle to
-    an allocation accessible by remote devices.
-    It owns a reference to the underlying memory resource represented by its
-    Vulkan memory object.
-endif::VK_NV_external_memory_rdma[]
-
-<<<
-
-Some external memory handle types can only be shared within the same
-underlying physical device and/or the same driver version, as defined in the
-following table:
-
-[[external-memory-handle-types-compatibility]]
-.External memory handle types compatibility
-|====
-| Handle type | sname:VkPhysicalDeviceIDProperties{wbro}::pname:driverUUID | sname:VkPhysicalDeviceIDProperties{wbro}::pname:deviceUUID
-| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT | Must match | Must match
-| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT | Must match | Must match
-| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT | Must match | Must match
-| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT | Must match | Must match
-| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT | Must match | Must match
-| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT | Must match | Must match
-| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT | Must match | Must match
-ifdef::VK_EXT_external_memory_host[]
-| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT | No restriction | No restriction
-| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT | No restriction | No restriction
-endif::VK_EXT_external_memory_host[]
-ifdef::VK_EXT_external_memory_dma_buf[]
-| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT | No restriction | No restriction
-endif::VK_EXT_external_memory_dma_buf[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID | No restriction | No restriction
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_FUCHSIA_external_memory[]
-| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA | No restriction | No restriction
-endif::VK_FUCHSIA_external_memory[]
-ifdef::VK_NV_external_memory_rdma[]
-| ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV | No restriction | No restriction
-endif::VK_NV_external_memory_rdma[]
-|====
-
-ifdef::VK_EXT_external_memory_host[]
-[NOTE]
-.Note
-====
-The above table does not restrict the drivers and devices with which
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT and
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT may:
-be shared, as these handle types inherently mean memory that does not come
-from the same device, as they import memory from the host or a foreign
-device, respectively.
-====
-endif::VK_EXT_external_memory_host[]
-
-ifdef::VK_EXT_external_memory_dma_buf[]
-[NOTE]
-.Note
-====
-Even though the above table does not restrict the drivers and devices with
-which ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT may: be shared,
-query mechanisms exist in the Vulkan API that prevent the import of
-incompatible dma-bufs (such as flink:vkGetMemoryFdPropertiesKHR) and that
-prevent incompatible usage of dma-bufs (such as
-slink:VkPhysicalDeviceExternalBufferInfo and
-slink:VkPhysicalDeviceExternalImageFormatInfo).
-====
-endif::VK_EXT_external_memory_dma_buf[]
---
-
-[open,refpage='VkExternalMemoryHandleTypeFlags',desc='Bitmask of VkExternalMemoryHandleTypeFlagBits',type='flags']
---
-include::{generated}/api/flags/VkExternalMemoryHandleTypeFlags.txt[]
-
-ifdef::VK_KHR_external_memory_capabilities[]
-or the equivalent
-
-include::{generated}/api/flags/VkExternalMemoryHandleTypeFlagsKHR.txt[]
-endif::VK_KHR_external_memory_capabilities[]
-
-tname:VkExternalMemoryHandleTypeFlags is a bitmask type for setting a mask
-of zero or more elink:VkExternalMemoryHandleTypeFlagBits.
---
-
-[open,refpage='VkExternalImageFormatProperties',desc='Structure specifying supported external handle properties',type='structs']
---
-The sname:VkExternalImageFormatProperties structure is defined as:
-
-include::{generated}/api/structs/VkExternalImageFormatProperties.txt[]
-
-ifdef::VK_KHR_external_memory_capabilities[]
-or the equivalent
-
-include::{generated}/api/structs/VkExternalImageFormatPropertiesKHR.txt[]
-endif::VK_KHR_external_memory_capabilities[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:externalMemoryProperties is a slink:VkExternalMemoryProperties
-    structure specifying various capabilities of the external handle type
-    when used with the specified image creation parameters.
-
-include::{generated}/validity/structs/VkExternalImageFormatProperties.txt[]
---
-
-[open,refpage='VkExternalMemoryProperties',desc='Structure specifying external memory handle type capabilities',type='structs']
---
-The sname:VkExternalMemoryProperties structure is defined as:
-
-include::{generated}/api/structs/VkExternalMemoryProperties.txt[]
-
-ifdef::VK_KHR_external_memory_capabilities[]
-or the equivalent
-
-include::{generated}/api/structs/VkExternalMemoryPropertiesKHR.txt[]
-endif::VK_KHR_external_memory_capabilities[]
-
-  * pname:externalMemoryFeatures is a bitmask of
-    elink:VkExternalMemoryFeatureFlagBits specifying the features of
-    pname:handleType.
-  * pname:exportFromImportedHandleTypes is a bitmask of
-    elink:VkExternalMemoryHandleTypeFlagBits specifying which types of
-    imported handle pname:handleType can: be exported from.
-  * pname:compatibleHandleTypes is a bitmask of
-    elink:VkExternalMemoryHandleTypeFlagBits specifying handle types which
-    can: be specified at the same time as pname:handleType when creating an
-    image compatible with external memory.
-
-pname:compatibleHandleTypes must: include at least pname:handleType.
-Inclusion of a handle type in pname:compatibleHandleTypes does not imply the
-values returned in slink:VkImageFormatProperties2 will be the same when
-slink:VkPhysicalDeviceExternalImageFormatInfo::pname:handleType is set to
-that type.
-The application is responsible for querying the capabilities of all handle
-types intended for concurrent use in a single image and intersecting them to
-obtain the compatible set of capabilities.
-
-include::{generated}/validity/structs/VkExternalMemoryProperties.txt[]
---
-
-[open,refpage='VkExternalMemoryFeatureFlagBits',desc='Bitmask specifying features of an external memory handle type',type='enums']
---
-Bits which may: be set in
-slink:VkExternalMemoryProperties::pname:externalMemoryFeatures, specifying
-features of an external memory handle type, are:
-
-include::{generated}/api/enums/VkExternalMemoryFeatureFlagBits.txt[]
-
-ifdef::VK_KHR_external_memory_capabilities[]
-or the equivalent
-
-include::{generated}/api/enums/VkExternalMemoryFeatureFlagBitsKHR.txt[]
-endif::VK_KHR_external_memory_capabilities[]
-
-  * ename:VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT specifies that
-    images or buffers created with the specified parameters and handle type
-    must: use the mechanisms defined by slink:VkMemoryDedicatedRequirements
-    and slink:VkMemoryDedicatedAllocateInfo to create (or import) a
-    dedicated allocation for the image or buffer.
-  * ename:VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT specifies that handles
-    of this type can: be exported from Vulkan memory objects.
-  * ename:VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT specifies that handles
-    of this type can: be imported as Vulkan memory objects.
-
-Because their semantics in external APIs roughly align with that of an image
-or buffer with a dedicated allocation in Vulkan, implementations are
-required: to report ename:VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT for
-the following external handle types:
-
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID
-    for images only
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-Implementations must: not report
-ename:VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT for buffers with
-external handle type
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID.
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_EXT_external_memory_host[]
-Implementations must: not report
-ename:VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT for images or buffers
-with external handle type
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT, or
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT.
-endif::VK_EXT_external_memory_host[]
-
---
-
-[open,refpage='VkExternalMemoryFeatureFlags',desc='Bitmask of VkExternalMemoryFeatureFlagBits',type='flags']
---
-include::{generated}/api/flags/VkExternalMemoryFeatureFlags.txt[]
-
-ifdef::VK_KHR_external_memory_capabilities[]
-or the equivalent
-
-include::{generated}/api/flags/VkExternalMemoryFeatureFlagsKHR.txt[]
-endif::VK_KHR_external_memory_capabilities[]
-
-tname:VkExternalMemoryFeatureFlags is a bitmask type for setting a mask of
-zero or more elink:VkExternalMemoryFeatureFlagBits.
---
-
-endif::VK_VERSION_1_1,VK_KHR_external_memory_capabilities[]
-
-ifdef::VK_EXT_image_drm_format_modifier[]
-[open,refpage='VkPhysicalDeviceImageDrmFormatModifierInfoEXT',desc='Structure specifying a DRM format modifier as image creation parameter',type='structs']
---
-To query the image capabilities that are compatible with a
-<<glossary-drm-format-modifier,Linux DRM format modifier>>, set
-slink:VkPhysicalDeviceImageFormatInfo2::pname:tiling to
-ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT and add a
-slink:VkPhysicalDeviceImageDrmFormatModifierInfoEXT structure to the
-pname:pNext chain of slink:VkPhysicalDeviceImageFormatInfo2.
-
-The slink:VkPhysicalDeviceImageDrmFormatModifierInfoEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceImageDrmFormatModifierInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:drmFormatModifier is the image's _Linux DRM format modifier_,
-    corresponding to
-    slink:VkImageDrmFormatModifierExplicitCreateInfoEXT::pname:modifier or
-    to slink:VkImageDrmFormatModifierListCreateInfoEXT::pname:pModifiers.
-  * pname:sharingMode specifies how the image will be accessed by multiple
-    queue families.
-  * pname:queueFamilyIndexCount is the number of entries in the
-    pname:pQueueFamilyIndices array.
-  * pname:pQueueFamilyIndices is a pointer to an array of queue families
-    that will access the image.
-    It is ignored if pname:sharingMode is not
-    ename:VK_SHARING_MODE_CONCURRENT.
-
-If the pname:drmFormatModifier is incompatible with the parameters specified
-in slink:VkPhysicalDeviceImageFormatInfo2 and its pname:pNext chain, then
-flink:vkGetPhysicalDeviceImageFormatProperties2 returns
-ename:VK_ERROR_FORMAT_NOT_SUPPORTED.
-The implementation must: support the query of any pname:drmFormatModifier,
-including unknown and invalid modifier values.
-
-.Valid Usage
-****
-  * [[VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02314]]
-    If pname:sharingMode is ename:VK_SHARING_MODE_CONCURRENT, then
-    pname:pQueueFamilyIndices must: be a valid pointer to an array of
-    pname:queueFamilyIndexCount code:uint32_t values
-  * [[VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02315]]
-    If pname:sharingMode is ename:VK_SHARING_MODE_CONCURRENT, then
-    pname:queueFamilyIndexCount must: be greater than `1`
-  * [[VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02316]]
-    If pname:sharingMode is ename:VK_SHARING_MODE_CONCURRENT, each element
-    of pname:pQueueFamilyIndices must: be unique and must: be less than the
-    pname:pQueueFamilyPropertyCount returned by
-    flink:vkGetPhysicalDeviceQueueFamilyProperties2 for the
-    pname:physicalDevice that was used to create pname:device
-****
-
-include::{generated}/validity/structs/VkPhysicalDeviceImageDrmFormatModifierInfoEXT.txt[]
---
-endif::VK_EXT_image_drm_format_modifier[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-[open,refpage='VkSamplerYcbcrConversionImageFormatProperties',desc='Structure specifying combined image sampler descriptor count for multi-planar images',type='structs']
---
-To determine the number of combined image samplers required to support a
-multi-planar format, add slink:VkSamplerYcbcrConversionImageFormatProperties
-to the pname:pNext chain of the slink:VkImageFormatProperties2 structure in
-a call to fname:vkGetPhysicalDeviceImageFormatProperties2.
-
-The sname:VkSamplerYcbcrConversionImageFormatProperties structure is defined
-as:
-
-include::{generated}/api/structs/VkSamplerYcbcrConversionImageFormatProperties.txt[]
-
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-or the equivalent
-
-include::{generated}/api/structs/VkSamplerYcbcrConversionImageFormatPropertiesKHR.txt[]
-endif::VK_KHR_sampler_ycbcr_conversion[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:combinedImageSamplerDescriptorCount is the number of combined
-    image sampler descriptors that the implementation uses to access the
-    format.
-
-include::{generated}/validity/structs/VkSamplerYcbcrConversionImageFormatProperties.txt[]
---
-
-pname:combinedImageSamplerDescriptorCount is a number between 1 and the
-number of planes in the format.
-A descriptor set layout binding with immutable {YCbCr} conversion samplers
-will have a maximum pname:combinedImageSamplerDescriptorCount which is the
-maximum across all formats supported by its samplers of the
-pname:combinedImageSamplerDescriptorCount for each format.
-Descriptor sets with that layout will internally use that maximum
-pname:combinedImageSamplerDescriptorCount descriptors for each descriptor in
-the binding.
-This expanded number of descriptors will be consumed from the descriptor
-pool when a descriptor set is allocated, and counts towards the
-pname:maxDescriptorSetSamplers, pname:maxDescriptorSetSampledImages,
-pname:maxPerStageDescriptorSamplers, and
-pname:maxPerStageDescriptorSampledImages limits.
-
-.Note
-[NOTE]
-====
-All descriptors in a binding use the same maximum
-pname:combinedImageSamplerDescriptorCount descriptors to allow
-implementations to use a uniform stride for dynamic indexing of the
-descriptors in the binding.
-
-For example, consider a descriptor set layout binding with two descriptors
-and immutable samplers for multi-planar formats that have
-sname:VkSamplerYcbcrConversionImageFormatProperties::pname:combinedImageSamplerDescriptorCount
-values of `2` and `3` respectively.
-There are two descriptors in the binding and the maximum
-pname:combinedImageSamplerDescriptorCount is `3`, so descriptor sets with
-this layout consume `6` descriptors from the descriptor pool.
-To create a descriptor pool that allows allocating four descriptor sets with
-this layout, pname:descriptorCount must be at least `24`.
-====
-
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-
-[open,refpage='VkAndroidHardwareBufferUsageANDROID',desc='Struct containing Android hardware buffer usage flags',type='structs']
---
-To obtain optimal Android hardware buffer usage flags for specific image
-creation parameters, add a sname:VkAndroidHardwareBufferUsageANDROID
-structure to the pname:pNext chain of a slink:VkImageFormatProperties2
-structure passed to flink:vkGetPhysicalDeviceImageFormatProperties2.
-This structure is defined as:
-
-include::{generated}/api/structs/VkAndroidHardwareBufferUsageANDROID.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:androidHardwareBufferUsage returns the Android hardware buffer
-    usage flags.
-
-The pname:androidHardwareBufferUsage field must: include Android hardware
-buffer usage flags listed in the
-<<memory-external-android-hardware-buffer-usage,AHardwareBuffer Usage
-Equivalence>> table when the corresponding Vulkan image usage or image
-creation flags are included in the pname:usage or pname:flags fields of
-slink:VkPhysicalDeviceImageFormatInfo2.
-It must: include at least one GPU usage flag
-(code:AHARDWAREBUFFER_USAGE_GPU_*), even if none of the corresponding Vulkan
-usages or flags are requested.
-
-.Note
-[NOTE]
-====
-Requiring at least one GPU usage flag ensures that Android hardware buffer
-memory will be allocated in a memory pool accessible to the Vulkan
-implementation, and that specializing the memory layout based on usage flags
-does not prevent it from being compatible with Vulkan.
-Implementations may: avoid unnecessary restrictions caused by this
-requirement by using vendor usage flags to indicate that only the Vulkan
-uses indicated in slink:VkImageFormatProperties2 are required.
-====
-
-include::{generated}/validity/structs/VkAndroidHardwareBufferUsageANDROID.txt[]
---
-
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-
-ifdef::VK_EXT_filter_cubic[]
-
-
-
-To determine if cubic filtering can be used with a given image format and a
-given image view type add a
-slink:VkPhysicalDeviceImageViewImageFormatInfoEXT structure to the
-pname:pNext chain of the slink:VkPhysicalDeviceImageFormatInfo2 structure,
-and a slink:VkFilterCubicImageViewImageFormatPropertiesEXT structure to the
-pname:pNext chain of the slink:VkImageFormatProperties2 structure.
-
-[open,refpage='VkPhysicalDeviceImageViewImageFormatInfoEXT',desc='Structure for providing image view type',type='structs']
---
-The sname:VkPhysicalDeviceImageViewImageFormatInfoEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceImageViewImageFormatInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:imageViewType is a elink:VkImageViewType value specifying the type
-    of the image view.
-
-include::{generated}/validity/structs/VkPhysicalDeviceImageViewImageFormatInfoEXT.txt[]
---
-
-[open,refpage='VkFilterCubicImageViewImageFormatPropertiesEXT',desc='Structure for querying cubic filtering capabilities of an image view type',type='structs']
---
-The sname:VkFilterCubicImageViewImageFormatPropertiesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkFilterCubicImageViewImageFormatPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:filterCubic tells if image format, image type and image view type
-    can: be used with cubic filtering.
-    This field is set by the implementation.
-    User-specified value is ignored.
-  * pname:filterCubicMinmax tells if image format, image type and image view
-    type can: be used with cubic filtering and minmax filtering.
-    This field is set by the implementation.
-    User-specified value is ignored.
-
-include::{generated}/validity/structs/VkFilterCubicImageViewImageFormatPropertiesEXT.txt[]
-
-.Valid Usage
-****
-  * [[VUID-VkFilterCubicImageViewImageFormatPropertiesEXT-pNext-02627]]
-    If the pname:pNext chain of the slink:VkImageFormatProperties2 structure
-    includes a slink:VkFilterCubicImageViewImageFormatPropertiesEXT
-    structure, the pname:pNext chain of the
-    slink:VkPhysicalDeviceImageFormatInfo2 structure must: include a
-    slink:VkPhysicalDeviceImageViewImageFormatInfoEXT structure with an
-    pname:imageViewType that is compatible with pname:imageType
-****
---
-
-endif::VK_EXT_filter_cubic[]
-
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-
-[[features-supported-sample-counts]]
-=== Supported Sample Counts
-fname:vkGetPhysicalDeviceImageFormatProperties returns a bitmask of
-elink:VkSampleCountFlagBits in pname:sampleCounts specifying the supported
-sample counts for the image parameters.
-
-pname:sampleCounts will be set to ename:VK_SAMPLE_COUNT_1_BIT if at least
-one of the following conditions is true:
-
-  * pname:tiling is ename:VK_IMAGE_TILING_LINEAR
-  * pname:type is not ename:VK_IMAGE_TYPE_2D
-  * pname:flags contains ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
-  * Neither the ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT flag nor the
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT flag in
-    sname:VkFormatProperties::pname:optimalTilingFeatures returned by
-    flink:vkGetPhysicalDeviceFormatProperties is set
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory_capabilities[]
-  * slink:VkPhysicalDeviceExternalImageFormatInfo::pname:handleType is an
-    external handle type for which multisampled image support is not
-    required.
-endif::VK_VERSION_1_1,VK_KHR_external_memory_capabilities[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * pname:format is one of the <<formats-requiring-sampler-ycbcr-conversion,
-    formats that require a sampler Y'C~B~C~R~ conversion>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  * pname:usage contains
-    ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-ifdef::VK_EXT_fragment_density_map[]
-  * pname:usage contains ename:VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-
-Otherwise, the bits set in pname:sampleCounts will be the sample counts
-supported for the specified values of pname:usage and pname:format.
-For each bit set in pname:usage, the supported sample counts relate to the
-limits in sname:VkPhysicalDeviceLimits as follows:
-
-  * If pname:usage includes ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT and
-    pname:format is a floating- or fixed-point color format, a superset of
-    sname:VkPhysicalDeviceLimits::pname:framebufferColorSampleCounts
-ifdef::VK_VERSION_1_2[]
-  * If pname:usage includes ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT and
-    pname:format is an integer format, a superset of
-    sname:VkPhysicalDeviceVulkan12Properties::pname:framebufferIntegerColorSampleCounts
-endif::VK_VERSION_1_2[]
-  * If pname:usage includes
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, and pname:format
-    includes a depth aspect, a superset of
-    sname:VkPhysicalDeviceLimits::pname:framebufferDepthSampleCounts
-  * If pname:usage includes
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, and pname:format
-    includes a stencil aspect, a superset of
-    sname:VkPhysicalDeviceLimits::pname:framebufferStencilSampleCounts
-  * If pname:usage includes ename:VK_IMAGE_USAGE_SAMPLED_BIT, and
-    pname:format includes a color aspect, a superset of
-    sname:VkPhysicalDeviceLimits::pname:sampledImageColorSampleCounts
-  * If pname:usage includes ename:VK_IMAGE_USAGE_SAMPLED_BIT, and
-    pname:format includes a depth aspect, a superset of
-    sname:VkPhysicalDeviceLimits::pname:sampledImageDepthSampleCounts
-  * If pname:usage includes ename:VK_IMAGE_USAGE_SAMPLED_BIT, and
-    pname:format is an integer format, a superset of
-    sname:VkPhysicalDeviceLimits::pname:sampledImageIntegerSampleCounts
-  * If pname:usage includes ename:VK_IMAGE_USAGE_STORAGE_BIT, a superset of
-    sname:VkPhysicalDeviceLimits::pname:storageImageSampleCounts
-
-If multiple bits are set in pname:usage, pname:sampleCounts will be the
-intersection of the per-usage values described above.
-
-If none of the bits described above are set in pname:usage, then there is no
-corresponding limit in sname:VkPhysicalDeviceLimits.
-In this case, pname:sampleCounts must: include at least
-ename:VK_SAMPLE_COUNT_1_BIT.
-
-
-[[features-extentperimagetype]]
-=== Allowed Extent Values Based On Image Type
-
-Implementations may: support extent values larger than the <<limits-minmax,
-required minimum/maximum values>> for certain types of images.
-slink:VkImageFormatProperties::pname:maxExtent for each type is subject to
-the constraints below.
-
-[NOTE]
-.Note
-====
-Implementations must: support images with dimensions up to the
-<<limits-minmax, required minimum/maximum values>> for all types of images.
-It follows that the query for additional capabilities must: return extent
-values that are at least as large as the required values.
-====
-
-For ename:VK_IMAGE_TYPE_1D:
-
-  * [eq]#pname:maxExtent.width {geq}
-    slink:VkPhysicalDeviceLimits::pname:maxImageDimension1D#
-  * [eq]#pname:maxExtent.height = 1#
-  * [eq]#pname:maxExtent.depth = 1#
-
-For ename:VK_IMAGE_TYPE_2D when pname:flags does not contain
-ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT:
-
-  * [eq]#pname:maxExtent.width {geq}
-    slink:VkPhysicalDeviceLimits::pname:maxImageDimension2D#
-  * [eq]#pname:maxExtent.height {geq}
-    slink:VkPhysicalDeviceLimits::pname:maxImageDimension2D#
-  * [eq]#pname:maxExtent.depth = 1#
-
-For ename:VK_IMAGE_TYPE_2D when pname:flags contains
-ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT:
-
-  * [eq]#pname:maxExtent.width {geq}
-    slink:VkPhysicalDeviceLimits::pname:maxImageDimensionCube#
-  * [eq]#pname:maxExtent.height {geq}
-    slink:VkPhysicalDeviceLimits::pname:maxImageDimensionCube#
-  * [eq]#pname:maxExtent.depth = 1#
-
-For ename:VK_IMAGE_TYPE_3D:
-
-  * [eq]#pname:maxExtent.width {geq}
-    slink:VkPhysicalDeviceLimits::pname:maxImageDimension3D#
-  * [eq]#pname:maxExtent.height {geq}
-    slink:VkPhysicalDeviceLimits::pname:maxImageDimension3D#
-  * [eq]#pname:maxExtent.depth {geq}
-    slink:VkPhysicalDeviceLimits::pname:maxImageDimension3D#
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory_capabilities[]
-[[capabilities-buffer]]
-== Additional Buffer Capabilities
-
-[open,refpage='vkGetPhysicalDeviceExternalBufferProperties',desc='Query external handle types supported by buffers',type='protos']
---
-To query the external handle types supported by buffers, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetPhysicalDeviceExternalBufferProperties.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_external_memory_capabilities[or the equivalent command]
-
-ifdef::VK_KHR_external_memory_capabilities[]
-include::{generated}/api/protos/vkGetPhysicalDeviceExternalBufferPropertiesKHR.txt[]
-endif::VK_KHR_external_memory_capabilities[]
-
-  * pname:physicalDevice is the physical device from which to query the
-    buffer capabilities.
-  * pname:pExternalBufferInfo is a pointer to a
-    slink:VkPhysicalDeviceExternalBufferInfo structure describing the
-    parameters that would be consumed by flink:vkCreateBuffer.
-  * pname:pExternalBufferProperties is a pointer to a
-    slink:VkExternalBufferProperties structure in which capabilities are
-    returned.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceExternalBufferProperties.txt[]
---
-
-[open,refpage='VkPhysicalDeviceExternalBufferInfo',desc='Structure specifying buffer creation parameters',type='structs']
---
-The sname:VkPhysicalDeviceExternalBufferInfo structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceExternalBufferInfo.txt[]
-
-ifdef::VK_KHR_external_memory_capabilities[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceExternalBufferInfoKHR.txt[]
-endif::VK_KHR_external_memory_capabilities[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkBufferCreateFlagBits describing
-    additional parameters of the buffer, corresponding to
-    slink:VkBufferCreateInfo::pname:flags.
-  * pname:usage is a bitmask of elink:VkBufferUsageFlagBits describing the
-    intended usage of the buffer, corresponding to
-    slink:VkBufferCreateInfo::pname:usage.
-  * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value
-    specifying the memory handle type that will be used with the memory
-    associated with the buffer.
-
-include::{generated}/validity/structs/VkPhysicalDeviceExternalBufferInfo.txt[]
---
-
-[open,refpage='VkExternalBufferProperties',desc='Structure specifying supported external handle capabilities',type='structs']
---
-The sname:VkExternalBufferProperties structure is defined as:
-
-include::{generated}/api/structs/VkExternalBufferProperties.txt[]
-
-ifdef::VK_KHR_external_memory_capabilities[]
-or the equivalent
-
-include::{generated}/api/structs/VkExternalBufferPropertiesKHR.txt[]
-endif::VK_KHR_external_memory_capabilities[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:externalMemoryProperties is a slink:VkExternalMemoryProperties
-    structure specifying various capabilities of the external handle type
-    when used with the specified buffer creation parameters.
-
-include::{generated}/validity/structs/VkExternalBufferProperties.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_external_memory_capabilities[]
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities[]
-[[capabilities-semaphore]]
-== Optional Semaphore Capabilities
-
-[open,refpage='vkGetPhysicalDeviceExternalSemaphoreProperties',desc='Function for querying external semaphore handle capabilities.',type='protos']
---
-Semaphores may: support import and export of their
-<<synchronization-semaphores-payloads, payload>> to external handles.
-To query the external handle types supported by semaphores, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetPhysicalDeviceExternalSemaphoreProperties.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_external_semaphore_capabilities[or the equivalent command]
-
-ifdef::VK_KHR_external_semaphore_capabilities[]
-include::{generated}/api/protos/vkGetPhysicalDeviceExternalSemaphorePropertiesKHR.txt[]
-endif::VK_KHR_external_semaphore_capabilities[]
-
-  * pname:physicalDevice is the physical device from which to query the
-    semaphore capabilities.
-  * pname:pExternalSemaphoreInfo is a pointer to a
-    slink:VkPhysicalDeviceExternalSemaphoreInfo structure describing the
-    parameters that would be consumed by flink:vkCreateSemaphore.
-  * pname:pExternalSemaphoreProperties is a pointer to a
-    slink:VkExternalSemaphoreProperties structure in which capabilities are
-    returned.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceExternalSemaphoreProperties.txt[]
---
-
-[open,refpage='VkPhysicalDeviceExternalSemaphoreInfo',desc='Structure specifying semaphore creation parameters.',type='structs']
---
-The sname:VkPhysicalDeviceExternalSemaphoreInfo structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceExternalSemaphoreInfo.txt[]
-
-ifdef::VK_KHR_external_semaphore_capabilities[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceExternalSemaphoreInfoKHR.txt[]
-endif::VK_KHR_external_semaphore_capabilities[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleType is a elink:VkExternalSemaphoreHandleTypeFlagBits value
-    specifying the external semaphore handle type for which capabilities
-    will be returned.
-
-include::{generated}/validity/structs/VkPhysicalDeviceExternalSemaphoreInfo.txt[]
---
-
-[open,refpage='VkExternalSemaphoreHandleTypeFlagBits',desc='Bitmask of valid external semaphore handle types',type='enums']
---
-Bits which may: be set in
-slink:VkPhysicalDeviceExternalSemaphoreInfo::pname:handleType, specifying an
-external semaphore handle type, are:
-
-include::{generated}/api/enums/VkExternalSemaphoreHandleTypeFlagBits.txt[]
-
-ifdef::VK_KHR_external_semaphore_capabilities[]
-or the equivalent
-
-include::{generated}/api/enums/VkExternalSemaphoreHandleTypeFlagBitsKHR.txt[]
-endif::VK_KHR_external_semaphore_capabilities[]
-
-  * ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT specifies a POSIX
-    file descriptor handle that has only limited valid usage outside of
-    Vulkan and other compatible APIs.
-    It must: be compatible with the POSIX system calls code:dup, code:dup2,
-    code:close, and the non-standard system call code:dup3.
-    Additionally, it must: be transportable over a socket using an
-    code:SCM_RIGHTS control message.
-    It owns a reference to the underlying synchronization primitive
-    represented by its Vulkan semaphore object.
-  * ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT specifies an NT
-    handle that has only limited valid usage outside of Vulkan and other
-    compatible APIs.
-    It must: be compatible with the functions code:DuplicateHandle,
-    code:CloseHandle, code:CompareObjectHandles, code:GetHandleInformation,
-    and code:SetHandleInformation.
-    It owns a reference to the underlying synchronization primitive
-    represented by its Vulkan semaphore object.
-  * ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT specifies a
-    global share handle that has only limited valid usage outside of Vulkan
-    and other compatible APIs.
-    It is not compatible with any native APIs.
-    It does not own a reference to the underlying synchronization primitive
-    represented by its Vulkan semaphore object, and will therefore become
-    invalid when all Vulkan semaphore objects associated with it are
-    destroyed.
-  * ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT specifies an NT
-    handle returned by code:ID3D12Device::code:CreateSharedHandle referring
-    to a Direct3D 12 fence, or code:ID3D11Device5::code:CreateFence
-    referring to a Direct3D 11 fence.
-    It owns a reference to the underlying synchronization primitive
-    associated with the Direct3D fence.
-  * ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT is an alias of
-    ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT with the same
-    meaning.
-    It is provided for convenience and code clarity when interacting with
-    D3D11 fences.
-  * ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT specifies a POSIX
-    file descriptor handle to a Linux Sync File or Android Fence object.
-    It can be used with any native API accepting a valid sync file or fence
-    as input.
-    It owns a reference to the underlying synchronization primitive
-    associated with the file descriptor.
-    Implementations which support importing this handle type must: accept
-    any type of sync or fence FD supported by the native system they are
-    running on.
-ifdef::VK_FUCHSIA_external_semaphore[]
-  * ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA
-    specifies a handle to a Zircon event object.
-    It can be used with any native API that accepts a Zircon event handle.
-    Zircon event handles are created with code:ZX_RIGHTS_BASIC and
-    code:ZX_RIGHTS_SIGNAL rights.
-    Vulkan on Fuchsia uses only the ZX_EVENT_SIGNALED bit when signaling or
-    waiting.
-endif::VK_FUCHSIA_external_semaphore[]
-
-[NOTE]
-.Note
-====
-Handles of type ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT
-generated by the implementation may represent either Linux Sync Files or
-Android Fences at the implementation's discretion.
-Applications should: only use operations defined for both types of file
-descriptors, unless they know via means external to Vulkan the type of the
-file descriptor, or are prepared to deal with the system-defined operation
-failures resulting from using the wrong type.
-====
-
-<<<
-
-Some external semaphore handle types can only be shared within the same
-underlying physical device and/or the same driver version, as defined in the
-following table:
-
-[[external-semaphore-handle-types-compatibility]]
-.External semaphore handle types compatibility
-|====
-| Handle type | sname:VkPhysicalDeviceIDProperties{wbro}::pname:driverUUID | sname:VkPhysicalDeviceIDProperties{wbro}::pname:deviceUUID
-| ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT | Must match | Must match
-| ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT | Must match | Must match
-| ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT | Must match | Must match
-| ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT | Must match | Must match
-| ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT | No restriction | No restriction
-| ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA | No restriction | No restriction
-|====
---
-
-[open,refpage='VkExternalSemaphoreHandleTypeFlags',desc='Bitmask of VkExternalSemaphoreHandleTypeFlagBits',type='flags']
---
-include::{generated}/api/flags/VkExternalSemaphoreHandleTypeFlags.txt[]
-
-ifdef::VK_KHR_external_semaphore_capabilities[]
-or the equivalent
-
-include::{generated}/api/flags/VkExternalSemaphoreHandleTypeFlagsKHR.txt[]
-endif::VK_KHR_external_semaphore_capabilities[]
-
-tname:VkExternalSemaphoreHandleTypeFlags is a bitmask type for setting a
-mask of zero or more elink:VkExternalSemaphoreHandleTypeFlagBits.
---
-
-[open,refpage='VkExternalSemaphoreProperties',desc='Structure describing supported external semaphore handle features',type='structs']
---
-The sname:VkExternalSemaphoreProperties structure is defined as:
-
-include::{generated}/api/structs/VkExternalSemaphoreProperties.txt[]
-
-ifdef::VK_KHR_external_semaphore_capabilities[]
-or the equivalent
-
-include::{generated}/api/structs/VkExternalSemaphorePropertiesKHR.txt[]
-endif::VK_KHR_external_semaphore_capabilities[]
-
-  * pname:sType is the type of this structure
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:exportFromImportedHandleTypes is a bitmask of
-    elink:VkExternalSemaphoreHandleTypeFlagBits specifying which types of
-    imported handle pname:handleType can: be exported from.
-  * pname:compatibleHandleTypes is a bitmask of
-    elink:VkExternalSemaphoreHandleTypeFlagBits specifying handle types
-    which can: be specified at the same time as pname:handleType when
-    creating a semaphore.
-  * pname:externalSemaphoreFeatures is a bitmask of
-    elink:VkExternalSemaphoreFeatureFlagBits describing the features of
-    pname:handleType.
-
-If pname:handleType is not supported by the implementation, then
-slink:VkExternalSemaphoreProperties::pname:externalSemaphoreFeatures will be
-set to zero.
-
-include::{generated}/validity/structs/VkExternalSemaphoreProperties.txt[]
---
-
-[open,refpage='VkExternalSemaphoreFeatureFlagBits',desc='Bitfield describing features of an external semaphore handle type',type='enums']
---
-Possible values of
-slink:VkExternalSemaphoreProperties::pname:externalSemaphoreFeatures,
-specifying the features of an external semaphore handle type, are:
-
-include::{generated}/api/enums/VkExternalSemaphoreFeatureFlagBits.txt[]
-
-ifdef::VK_KHR_external_semaphore_capabilities[]
-or the equivalent
-
-include::{generated}/api/enums/VkExternalSemaphoreFeatureFlagBitsKHR.txt[]
-endif::VK_KHR_external_semaphore_capabilities[]
-
-  * ename:VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT specifies that
-    handles of this type can: be exported from Vulkan semaphore objects.
-  * ename:VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT specifies that
-    handles of this type can: be imported as Vulkan semaphore objects.
---
-
-[open,refpage='VkExternalSemaphoreFeatureFlags',desc='Bitmask of VkExternalSemaphoreFeatureFlagBitsKHR',type='flags']
---
-include::{generated}/api/flags/VkExternalSemaphoreFeatureFlags.txt[]
-
-ifdef::VK_KHR_external_semaphore_capabilities[]
-or the equivalent
-
-include::{generated}/api/flags/VkExternalSemaphoreFeatureFlagsKHR.txt[]
-endif::VK_KHR_external_semaphore_capabilities[]
-
-tname:VkExternalSemaphoreFeatureFlags is a bitmask type for setting a mask
-of zero or more elink:VkExternalSemaphoreFeatureFlagBits.
---
-endif::VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities[]
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_fence_capabilities[]
-[[capabilities-fence]]
-== Optional Fence Capabilities
-
-[open,refpage='vkGetPhysicalDeviceExternalFenceProperties',desc='Function for querying external fence handle capabilities.',type='protos']
---
-Fences may: support import and export of their
-<<synchronization-fences-payloads, payload>> to external handles.
-To query the external handle types supported by fences, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetPhysicalDeviceExternalFenceProperties.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_external_fence_capabilities[or the equivalent command]
-
-ifdef::VK_KHR_external_fence_capabilities[]
-include::{generated}/api/protos/vkGetPhysicalDeviceExternalFencePropertiesKHR.txt[]
-endif::VK_KHR_external_fence_capabilities[]
-
-  * pname:physicalDevice is the physical device from which to query the
-    fence capabilities.
-  * pname:pExternalFenceInfo is a pointer to a
-    slink:VkPhysicalDeviceExternalFenceInfo structure describing the
-    parameters that would be consumed by flink:vkCreateFence.
-  * pname:pExternalFenceProperties is a pointer to a
-    slink:VkExternalFenceProperties structure in which capabilities are
-    returned.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceExternalFenceProperties.txt[]
---
-
-[open,refpage='VkPhysicalDeviceExternalFenceInfo',desc='Structure specifying fence creation parameters.',type='structs']
---
-The sname:VkPhysicalDeviceExternalFenceInfo structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceExternalFenceInfo.txt[]
-
-ifdef::VK_KHR_external_fence_capabilities[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceExternalFenceInfoKHR.txt[]
-endif::VK_KHR_external_fence_capabilities[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleType is a elink:VkExternalFenceHandleTypeFlagBits value
-    specifying an external fence handle type for which capabilities will be
-    returned.
-
-[NOTE]
-.Note
-====
-Handles of type ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT generated by
-the implementation may represent either Linux Sync Files or Android Fences
-at the implementation's discretion.
-Applications should: only use operations defined for both types of file
-descriptors, unless they know via means external to Vulkan the type of the
-file descriptor, or are prepared to deal with the system-defined operation
-failures resulting from using the wrong type.
-====
-
-include::{generated}/validity/structs/VkPhysicalDeviceExternalFenceInfo.txt[]
---
-
-[open,refpage='VkExternalFenceHandleTypeFlagBits',desc='Bitmask of valid external fence handle types',type='enums']
---
-Bits which may: be set in
-slink:VkPhysicalDeviceExternalFenceInfo::pname:handleType, and in the
-pname:exportFromImportedHandleTypes and pname:compatibleHandleTypes members
-of slink:VkExternalFenceProperties, to indicate external fence handle types,
-are:
-
-include::{generated}/api/enums/VkExternalFenceHandleTypeFlagBits.txt[]
-
-ifdef::VK_KHR_external_fence_capabilities[]
-or the equivalent
-
-include::{generated}/api/enums/VkExternalFenceHandleTypeFlagBitsKHR.txt[]
-endif::VK_KHR_external_fence_capabilities[]
-
-  * ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT specifies a POSIX file
-    descriptor handle that has only limited valid usage outside of Vulkan
-    and other compatible APIs.
-    It must: be compatible with the POSIX system calls code:dup, code:dup2,
-    code:close, and the non-standard system call code:dup3.
-    Additionally, it must: be transportable over a socket using an
-    code:SCM_RIGHTS control message.
-    It owns a reference to the underlying synchronization primitive
-    represented by its Vulkan fence object.
-  * ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT specifies an NT
-    handle that has only limited valid usage outside of Vulkan and other
-    compatible APIs.
-    It must: be compatible with the functions code:DuplicateHandle,
-    code:CloseHandle, code:CompareObjectHandles, code:GetHandleInformation,
-    and code:SetHandleInformation.
-    It owns a reference to the underlying synchronization primitive
-    represented by its Vulkan fence object.
-  * ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT specifies a
-    global share handle that has only limited valid usage outside of Vulkan
-    and other compatible APIs.
-    It is not compatible with any native APIs.
-    It does not own a reference to the underlying synchronization primitive
-    represented by its Vulkan fence object, and will therefore become
-    invalid when all Vulkan fence objects associated with it are destroyed.
-  * ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT specifies a POSIX file
-    descriptor handle to a Linux Sync File or Android Fence.
-    It can be used with any native API accepting a valid sync file or fence
-    as input.
-    It owns a reference to the underlying synchronization primitive
-    associated with the file descriptor.
-    Implementations which support importing this handle type must: accept
-    any type of sync or fence FD supported by the native system they are
-    running on.
-
-<<<
-
-Some external fence handle types can only be shared within the same
-underlying physical device and/or the same driver version, as defined in the
-following table:
-
-[[external-fence-handle-types-compatibility]]
-.External fence handle types compatibility
-|====
-| Handle type | sname:VkPhysicalDeviceIDProperties{wbro}::pname:driverUUID | sname:VkPhysicalDeviceIDProperties{wbro}::pname:deviceUUID
-| ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT | Must match | Must match
-| ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT | Must match | Must match
-| ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT | Must match | Must match
-| ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT | No restriction | No restriction
-|====
---
-
-[open,refpage='VkExternalFenceHandleTypeFlags',desc='Bitmask of VkExternalFenceHandleTypeFlagBits',type='flags']
---
-include::{generated}/api/flags/VkExternalFenceHandleTypeFlags.txt[]
-
-ifdef::VK_KHR_external_fence_capabilities[]
-or the equivalent
-
-include::{generated}/api/flags/VkExternalFenceHandleTypeFlagsKHR.txt[]
-endif::VK_KHR_external_fence_capabilities[]
-
-tname:VkExternalFenceHandleTypeFlags is a bitmask type for setting a mask of
-zero or more elink:VkExternalFenceHandleTypeFlagBits.
---
-
-[open,refpage='VkExternalFenceProperties',desc='Structure describing supported external fence handle features',type='structs']
---
-The sname:VkExternalFenceProperties structure is defined as:
-
-include::{generated}/api/structs/VkExternalFenceProperties.txt[]
-
-ifdef::VK_KHR_external_fence_capabilities[]
-or the equivalent
-
-include::{generated}/api/structs/VkExternalFencePropertiesKHR.txt[]
-endif::VK_KHR_external_fence_capabilities[]
-
-  * pname:exportFromImportedHandleTypes is a bitmask of
-    elink:VkExternalFenceHandleTypeFlagBits indicating which types of
-    imported handle pname:handleType can: be exported from.
-  * pname:compatibleHandleTypes is a bitmask of
-    elink:VkExternalFenceHandleTypeFlagBits specifying handle types which
-    can: be specified at the same time as pname:handleType when creating a
-    fence.
-  * pname:externalFenceFeatures is a bitmask of
-    elink:VkExternalFenceFeatureFlagBits indicating the features of
-    pname:handleType.
-
-If pname:handleType is not supported by the implementation, then
-slink:VkExternalFenceProperties::pname:externalFenceFeatures will be set to
-zero.
-
-include::{generated}/validity/structs/VkExternalFenceProperties.txt[]
---
-
-[open,refpage='VkExternalFenceFeatureFlagBits',desc='Bitfield describing features of an external fence handle type',type='enums']
---
-Bits which may: be set in
-slink:VkExternalFenceProperties::pname:externalFenceFeatures, indicating
-features of a fence external handle type, are:
-
-include::{generated}/api/enums/VkExternalFenceFeatureFlagBits.txt[]
-
-ifdef::VK_KHR_external_fence_capabilities[]
-or the equivalent
-
-include::{generated}/api/enums/VkExternalFenceFeatureFlagBitsKHR.txt[]
-endif::VK_KHR_external_fence_capabilities[]
-
-  * ename:VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT specifies handles of this
-    type can: be exported from Vulkan fence objects.
-  * ename:VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT specifies handles of this
-    type can: be imported to Vulkan fence objects.
---
-
-[open,refpage='VkExternalFenceFeatureFlags',desc='Bitmask of VkExternalFenceFeatureFlagBits',type='flags']
---
-include::{generated}/api/flags/VkExternalFenceFeatureFlags.txt[]
-
-ifdef::VK_KHR_external_fence_capabilities[]
-or the equivalent
-
-include::{generated}/api/flags/VkExternalFenceFeatureFlagsKHR.txt[]
-endif::VK_KHR_external_fence_capabilities[]
-
-tname:VkExternalFenceFeatureFlags is a bitmask type for setting a mask of
-zero or more elink:VkExternalFenceFeatureFlagBits.
---
-endif::VK_VERSION_1_1,VK_KHR_external_fence_capabilities[]
-
-
-ifdef::VK_EXT_calibrated_timestamps[]
-[[features-timestamp-calibration]]
-== Timestamp Calibration Capabilities
-
-[open,refpage='vkGetPhysicalDeviceCalibrateableTimeDomainsEXT',desc='Query calibrateable time domains',type='protos']
---
-To query the set of time domains for which a physical device supports
-timestamp calibration, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceCalibrateableTimeDomainsEXT.txt[]
-
-  * pname:physicalDevice is the physical device from which to query the set
-    of calibrateable time domains.
-  * pname:pTimeDomainCount is a pointer to an integer related to the number
-    of calibrateable time domains available or queried, as described below.
-  * pname:pTimeDomains is either `NULL` or a pointer to an array of
-    elink:VkTimeDomainEXT values, indicating the supported calibrateable
-    time domains.
-
-If pname:pTimeDomains is `NULL`, then the number of calibrateable time
-domains supported for the given pname:physicalDevice is returned in
-pname:pTimeDomainCount.
-Otherwise, pname:pTimeDomainCount must: point to a variable set by the user
-to the number of elements in the pname:pTimeDomains array, and on return the
-variable is overwritten with the number of values actually written to
-pname:pTimeDomains.
-If the value of pname:pTimeDomainCount is less than the number of
-calibrateable time domains supported, at most pname:pTimeDomainCount values
-will be written to pname:pTimeDomains, and ename:VK_INCOMPLETE will be
-returned instead of ename:VK_SUCCESS, to indicate that not all the available
-time domains were returned.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceCalibrateableTimeDomainsEXT.txt[]
---
-endif::VK_EXT_calibrated_timestamps[]
diff --git a/registry/vulkan/chapters/clears.txt b/registry/vulkan/chapters/clears.txt
deleted file mode 100644
index c1d399b..0000000
--- a/registry/vulkan/chapters/clears.txt
+++ /dev/null
@@ -1,654 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[clears]]
-= Clear Commands
-
-
-[[clears-outside]]
-== Clearing Images Outside A Render Pass Instance
-
-Color and depth/stencil images can: be cleared outside a render pass
-instance using flink:vkCmdClearColorImage or
-flink:vkCmdClearDepthStencilImage, respectively.
-These commands are only allowed outside of a render pass instance.
-
-[open,refpage='vkCmdClearColorImage',desc='Clear regions of a color image',type='protos']
---
-To clear one or more subranges of a color image, call:
-
-include::{generated}/api/protos/vkCmdClearColorImage.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:image is the image to be cleared.
-  * pname:imageLayout specifies the current layout of the image subresource
-    ranges to be cleared, and must: be
-ifdef::VK_KHR_shared_presentable_image[]
-    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
-endif::VK_KHR_shared_presentable_image[]
-    ename:VK_IMAGE_LAYOUT_GENERAL or
-    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL.
-  * pname:pColor is a pointer to a slink:VkClearColorValue structure
-    containing the values that the image subresource ranges will be cleared
-    to (see <<clears-values>> below).
-  * pname:rangeCount is the number of image subresource range structures in
-    pname:pRanges.
-  * pname:pRanges is a pointer to an array of slink:VkImageSubresourceRange
-    structures describing a range of mipmap levels, array layers, and
-    aspects to be cleared, as described in <<resources-image-views,Image
-    Views>>.
-
-Each specified range in pname:pRanges is cleared to the value specified by
-pname:pColor.
-
-.Valid Usage
-****
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-vkCmdClearColorImage-image-01993]]
-    The <<resources-image-format-features,format features>> of pname:image
-    must: contain ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-vkCmdClearColorImage-image-00002]]
-    pname:image must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-vkCmdClearColorImage-image-01545]]
-    pname:image must: not use any of the
-    <<formats-requiring-sampler-ycbcr-conversion, formats that require a
-    sampler Y'C~B~C~R~ conversion>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-vkCmdClearColorImage-image-00003]]
-    If pname:image is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-vkCmdClearColorImage-imageLayout-00004]]
-    pname:imageLayout must: specify the layout of the image subresource
-    ranges of pname:image specified in pname:pRanges at the time this
-    command is executed on a sname:VkDevice
-ifndef::VK_KHR_shared_presentable_image[]
-  * [[VUID-vkCmdClearColorImage-imageLayout-00005]]
-    pname:imageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_GENERAL
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_KHR_shared_presentable_image[]
-  * [[VUID-vkCmdClearColorImage-imageLayout-01394]]
-    pname:imageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_GENERAL, or
-    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR
-endif::VK_KHR_shared_presentable_image[]
-  * [[VUID-vkCmdClearColorImage-aspectMask-02498]]
-    The slink:VkImageSubresourceRange::pname:aspectMask members of the
-    elements of the pname:pRanges array must: each only include
-    ename:VK_IMAGE_ASPECT_COLOR_BIT
-  * [[VUID-vkCmdClearColorImage-baseMipLevel-01470]]
-    The slink:VkImageSubresourceRange::pname:baseMipLevel members of the
-    elements of the pname:pRanges array must: each be less than the
-    pname:mipLevels specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-vkCmdClearColorImage-pRanges-01692]]
-    For each slink:VkImageSubresourceRange element of pname:pRanges, if the
-    pname:levelCount member is not ename:VK_REMAINING_MIP_LEVELS, then
-    [eq]#pname:baseMipLevel {plus} pname:levelCount# must: be less than the
-    pname:mipLevels specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-vkCmdClearColorImage-baseArrayLayer-01472]]
-    The slink:VkImageSubresourceRange::pname:baseArrayLayer members of the
-    elements of the pname:pRanges array must: each be less than the
-    pname:arrayLayers specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-vkCmdClearColorImage-pRanges-01693]]
-    For each slink:VkImageSubresourceRange element of pname:pRanges, if the
-    pname:layerCount member is not ename:VK_REMAINING_ARRAY_LAYERS, then
-    [eq]#pname:baseArrayLayer {plus} pname:layerCount# must: be less than
-    the pname:arrayLayers specified in slink:VkImageCreateInfo when
-    pname:image was created
-  * [[VUID-vkCmdClearColorImage-image-00007]]
-    pname:image must: not have a compressed or depth/stencil format
-  * [[VUID-vkCmdClearColorImage-pColor-04961]]
-    pname:pColor must: be a valid pointer to a slink:VkClearColorValue union
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-vkCmdClearColorImage-commandBuffer-01805]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:image must: not be a protected image
-  * [[VUID-vkCmdClearColorImage-commandBuffer-01806]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    must: not be an unprotected image
-endif::VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/protos/vkCmdClearColorImage.txt[]
---
-
-[open,refpage='vkCmdClearDepthStencilImage',desc='Fill regions of a combined depth/stencil image',type='protos']
---
-To clear one or more subranges of a depth/stencil image, call:
-
-include::{generated}/api/protos/vkCmdClearDepthStencilImage.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:image is the image to be cleared.
-  * pname:imageLayout specifies the current layout of the image subresource
-    ranges to be cleared, and must: be ename:VK_IMAGE_LAYOUT_GENERAL or
-    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL.
-  * pname:pDepthStencil is a pointer to a slink:VkClearDepthStencilValue
-    structure containing the values that the depth and stencil image
-    subresource ranges will be cleared to (see <<clears-values>> below).
-  * pname:rangeCount is the number of image subresource range structures in
-    pname:pRanges.
-  * pname:pRanges is a pointer to an array of slink:VkImageSubresourceRange
-    structures describing a range of mipmap levels, array layers, and
-    aspects to be cleared, as described in <<resources-image-views,Image
-    Views>>.
-
-.Valid Usage
-****
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-vkCmdClearDepthStencilImage-image-01994]]
-    The <<resources-image-format-features,format features>> of pname:image
-    must: contain ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifndef::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-  * [[VUID-vkCmdClearDepthStencilImage-image-00009]]
-    pname:image must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag
-endif::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-ifdef::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-  * [[VUID-vkCmdClearDepthStencilImage-pRanges-02658]]
-    If the pname:aspect member of any element of pname:pRanges includes
-    ename:VK_IMAGE_ASPECT_STENCIL_BIT, and pname:image was created with
-    <<VkImageStencilUsageCreateInfo,separate stencil usage>>,
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT must: have been included in the
-    slink:VkImageStencilUsageCreateInfo::pname:stencilUsage used to create
-    pname:image
-  * [[VUID-vkCmdClearDepthStencilImage-pRanges-02659]]
-    If the pname:aspect member of any element of pname:pRanges includes
-    ename:VK_IMAGE_ASPECT_STENCIL_BIT, and pname:image was not created with
-    <<VkImageStencilUsageCreateInfo,separate stencil usage>>,
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT must: have been included in the
-    slink:VkImageCreateInfo::pname:usage used to create pname:image
-  * [[VUID-vkCmdClearDepthStencilImage-pRanges-02660]]
-    If the pname:aspect member of any element of pname:pRanges includes
-    ename:VK_IMAGE_ASPECT_DEPTH_BIT, ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT
-    must: have been included in the slink:VkImageCreateInfo::pname:usage
-    used to create pname:image
-endif::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-  * [[VUID-vkCmdClearDepthStencilImage-image-00010]]
-    If pname:image is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-vkCmdClearDepthStencilImage-imageLayout-00011]]
-    pname:imageLayout must: specify the layout of the image subresource
-    ranges of pname:image specified in pname:pRanges at the time this
-    command is executed on a sname:VkDevice
-  * [[VUID-vkCmdClearDepthStencilImage-imageLayout-00012]]
-    pname:imageLayout must: be either of
-    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_GENERAL
-  * [[VUID-vkCmdClearDepthStencilImage-aspectMask-02824]]
-    The slink:VkImageSubresourceRange::pname:aspectMask member of each
-    element of the pname:pRanges array must: not include bits other than
-    ename:VK_IMAGE_ASPECT_DEPTH_BIT or ename:VK_IMAGE_ASPECT_STENCIL_BIT
-  * [[VUID-vkCmdClearDepthStencilImage-image-02825]]
-    If the pname:image's format does not have a stencil component, then the
-    slink:VkImageSubresourceRange::pname:aspectMask member of each element
-    of the pname:pRanges array must: not include the
-    ename:VK_IMAGE_ASPECT_STENCIL_BIT bit
-  * [[VUID-vkCmdClearDepthStencilImage-image-02826]]
-    If the pname:image's format does not have a depth component, then the
-    slink:VkImageSubresourceRange::pname:aspectMask member of each element
-    of the pname:pRanges array must: not include the
-    ename:VK_IMAGE_ASPECT_DEPTH_BIT bit
-  * [[VUID-vkCmdClearDepthStencilImage-baseMipLevel-01474]]
-    The slink:VkImageSubresourceRange::pname:baseMipLevel members of the
-    elements of the pname:pRanges array must: each be less than the
-    pname:mipLevels specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-vkCmdClearDepthStencilImage-pRanges-01694]]
-    For each slink:VkImageSubresourceRange element of pname:pRanges, if the
-    pname:levelCount member is not ename:VK_REMAINING_MIP_LEVELS, then
-    [eq]#pname:baseMipLevel {plus} pname:levelCount# must: be less than the
-    pname:mipLevels specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-vkCmdClearDepthStencilImage-baseArrayLayer-01476]]
-    The slink:VkImageSubresourceRange::pname:baseArrayLayer members of the
-    elements of the pname:pRanges array must: each be less than the
-    pname:arrayLayers specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-vkCmdClearDepthStencilImage-pRanges-01695]]
-    For each slink:VkImageSubresourceRange element of pname:pRanges, if the
-    pname:layerCount member is not ename:VK_REMAINING_ARRAY_LAYERS, then
-    [eq]#pname:baseArrayLayer {plus} pname:layerCount# must: be less than
-    the pname:arrayLayers specified in slink:VkImageCreateInfo when
-    pname:image was created
-  * [[VUID-vkCmdClearDepthStencilImage-image-00014]]
-    pname:image must: have a depth/stencil format
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-vkCmdClearDepthStencilImage-commandBuffer-01807]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:image must: not be a protected image
-  * [[VUID-vkCmdClearDepthStencilImage-commandBuffer-01808]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:image must: not be an unprotected image
-endif::VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/protos/vkCmdClearDepthStencilImage.txt[]
---
-
-Clears outside render pass instances are treated as transfer operations for
-the purposes of memory barriers.
-
-
-[[clears-inside]]
-== Clearing Images Inside A Render Pass Instance
-
-[open,refpage='vkCmdClearAttachments',desc='Clear regions within bound framebuffer attachments',type='protos']
---
-To clear one or more regions of color and depth/stencil attachments inside a
-render pass instance, call:
-
-include::{generated}/api/protos/vkCmdClearAttachments.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:attachmentCount is the number of entries in the pname:pAttachments
-    array.
-  * pname:pAttachments is a pointer to an array of slink:VkClearAttachment
-    structures defining the attachments to clear and the clear values to
-    use.
-    If any attachment index to be cleared is not backed by an image view,
-    then the clear has no effect.
-  * pname:rectCount is the number of entries in the pname:pRects array.
-  * pname:pRects is a pointer to an array of slink:VkClearRect structures
-    defining regions within each selected attachment to clear.
-
-ifdef::VK_EXT_fragment_density_map[]
-If the render pass has a <<renderpass-fragmentdensitymapattachment,fragment
-density map attachment>>, clears follow the
-<<fragmentdensitymapops,operations of fragment density maps>> as if each
-clear region was a primitive which generates fragments.
-The clear color is applied to all pixels inside each fragment's area
-regardless if the pixels lie outside of the clear region.
-Clears may: have a different set of supported fragment areas than draws.
-endif::VK_EXT_fragment_density_map[]
-
-Unlike other <<clears,clear commands>>, flink:vkCmdClearAttachments executes
-as a drawing command, rather than a transfer command, with writes performed
-by it executing in <<primsrast-order, rasterization order>>.
-Clears to color attachments are executed as color attachment writes, by the
-ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT stage.
-Clears to depth/stencil attachments are executed as <<fragops-depth, depth
-writes>> and <<fragops-stencil, writes>> by the
-ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT and
-ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT stages.
-
-fname:vkCmdClearAttachments is not affected by the bound pipeline state.
-
-[NOTE]
-.Note
-====
-It's generally advised that attachments are cleared by using the
-ename:VK_ATTACHMENT_LOAD_OP_CLEAR load operation at the start of rendering,
-which will be more efficient on some implementations.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkCmdClearAttachments-aspectMask-02501]]
-    If the pname:aspectMask member of any element of pname:pAttachments
-    contains ename:VK_IMAGE_ASPECT_COLOR_BIT, then the pname:colorAttachment
-    member of that element must: either refer to a color attachment which is
-    ename:VK_ATTACHMENT_UNUSED, or must: be a valid color attachment
-  * [[VUID-vkCmdClearAttachments-aspectMask-02502]]
-    If the pname:aspectMask member of any element of pname:pAttachments
-    contains ename:VK_IMAGE_ASPECT_DEPTH_BIT, then the current subpass'
-    depth/stencil attachment must: either be ename:VK_ATTACHMENT_UNUSED, or
-    must: have a depth component
-  * [[VUID-vkCmdClearAttachments-aspectMask-02503]]
-    If the pname:aspectMask member of any element of pname:pAttachments
-    contains ename:VK_IMAGE_ASPECT_STENCIL_BIT, then the current subpass'
-    depth/stencil attachment must: either be ename:VK_ATTACHMENT_UNUSED, or
-    must: have a stencil component
-  * [[VUID-vkCmdClearAttachments-rect-02682]]
-    The pname:rect member of each element of pname:pRects must: have an
-    pname:extent.width greater than `0`
-  * [[VUID-vkCmdClearAttachments-rect-02683]]
-    The pname:rect member of each element of pname:pRects must: have an
-    pname:extent.height greater than `0`
-  * [[VUID-vkCmdClearAttachments-pRects-00016]]
-    The rectangular region specified by each element of pname:pRects must:
-    be contained within the render area of the current render pass instance
-  * [[VUID-vkCmdClearAttachments-pRects-00017]]
-    The layers specified by each element of pname:pRects must: be contained
-    within every attachment that pname:pAttachments refers to
-  * [[VUID-vkCmdClearAttachments-layerCount-01934]]
-    The pname:layerCount member of each element of pname:pRects must: not be
-    `0`
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-vkCmdClearAttachments-commandBuffer-02504]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    each attachment to be cleared must: not be a protected image
-  * [[VUID-vkCmdClearAttachments-commandBuffer-02505]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    each attachment to be cleared must: not be an unprotected image
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-vkCmdClearAttachments-baseArrayLayer-00018]]
-    If the render pass instance this is recorded in uses multiview, then
-    pname:baseArrayLayer must: be zero and pname:layerCount must: be one
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-****
-
-include::{generated}/validity/protos/vkCmdClearAttachments.txt[]
---
-
-[open,refpage='VkClearRect',desc='Structure specifying a clear rectangle',type='structs']
---
-The sname:VkClearRect structure is defined as:
-
-include::{generated}/api/structs/VkClearRect.txt[]
-
-  * pname:rect is the two-dimensional region to be cleared.
-  * pname:baseArrayLayer is the first layer to be cleared.
-  * pname:layerCount is the number of layers to clear.
-
-The layers [eq]#[pname:baseArrayLayer, pname:baseArrayLayer {plus}
-pname:layerCount)# counting from the base layer of the attachment image view
-are cleared.
-
-include::{generated}/validity/structs/VkClearRect.txt[]
---
-
-[open,refpage='VkClearAttachment',desc='Structure specifying a clear attachment',type='structs']
---
-The sname:VkClearAttachment structure is defined as:
-
-include::{generated}/api/structs/VkClearAttachment.txt[]
-
-  * pname:aspectMask is a mask selecting the color, depth and/or stencil
-    aspects of the attachment to be cleared.
-  * pname:colorAttachment is only meaningful if
-    ename:VK_IMAGE_ASPECT_COLOR_BIT is set in pname:aspectMask, in which
-    case it is an index into the currently bound color attachments.
-  * pname:clearValue is the color or depth/stencil value to clear the
-    attachment to, as described in <<clears-values,Clear Values>> below.
-
-.Valid Usage
-****
-  * [[VUID-VkClearAttachment-aspectMask-00019]]
-    If pname:aspectMask includes ename:VK_IMAGE_ASPECT_COLOR_BIT, it must:
-    not include ename:VK_IMAGE_ASPECT_DEPTH_BIT or
-    ename:VK_IMAGE_ASPECT_STENCIL_BIT
-  * [[VUID-VkClearAttachment-aspectMask-00020]]
-    pname:aspectMask must: not include ename:VK_IMAGE_ASPECT_METADATA_BIT
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkClearAttachment-aspectMask-02246]]
-    pname:aspectMask must: not include
-    `VK_IMAGE_ASPECT_MEMORY_PLANE__{ibit}__BIT_EXT` for any index _i_
-endif::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkClearAttachment-clearValue-00021]]
-    pname:clearValue must: be a valid sname:VkClearValue union
-****
-
-include::{generated}/validity/structs/VkClearAttachment.txt[]
---
-
-
-[[clears-values]]
-== Clear Values
-
-[open,refpage='VkClearColorValue',desc='Structure specifying a clear color value',type='structs']
---
-The sname:VkClearColorValue structure is defined as:
-
-include::{generated}/api/structs/VkClearColorValue.txt[]
-
-  * pname:float32 are the color clear values when the format of the image or
-    attachment is one of the formats in the <<formats-numericformat>> table
-    other than signed integer (etext:SINT) or unsigned integer (etext:UINT).
-    Floating point values are automatically converted to the format of the
-    image, with the clear value being treated as linear if the image is
-    sRGB.
-  * pname:int32 are the color clear values when the format of the image or
-    attachment is signed integer (etext:SINT).
-    Signed integer values are converted to the format of the image by
-    casting to the smaller type (with negative 32-bit values mapping to
-    negative values in the smaller type).
-    If the integer clear value is not representable in the target type (e.g.
-    would overflow in conversion to that type), the clear value is
-    undefined:.
-  * pname:uint32 are the color clear values when the format of the image or
-    attachment is unsigned integer (etext:UINT).
-    Unsigned integer values are converted to the format of the image by
-    casting to the integer type with fewer bits.
-
-The four array elements of the clear color map to R, G, B, and A components
-of image formats, in order.
-
-If the image has more than one sample, the same value is written to all
-samples for any pixels being cleared.
-
-include::{generated}/validity/structs/VkClearColorValue.txt[]
---
-
-[open,refpage='VkClearDepthStencilValue',desc='Structure specifying a clear depth stencil value',type='structs']
---
-The sname:VkClearDepthStencilValue structure is defined as:
-
-include::{generated}/api/structs/VkClearDepthStencilValue.txt[]
-
-  * pname:depth is the clear value for the depth aspect of the depth/stencil
-    attachment.
-    It is a floating-point value which is automatically converted to the
-    attachment's format.
-  * pname:stencil is the clear value for the stencil aspect of the
-    depth/stencil attachment.
-    It is a 32-bit integer value which is converted to the attachment's
-    format by taking the appropriate number of LSBs.
-
-.Valid Usage
-****
-ifdef::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-VkClearDepthStencilValue-depth-00022]]
-    Unless the `apiext:VK_EXT_depth_range_unrestricted` extension is enabled
-    pname:depth must: be between `0.0` and `1.0`, inclusive
-endif::VK_EXT_depth_range_unrestricted[]
-ifndef::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-VkClearDepthStencilValue-depth-02506]]
-    pname:depth must: be between `0.0` and `1.0`, inclusive
-endif::VK_EXT_depth_range_unrestricted[]
-****
-
-include::{generated}/validity/structs/VkClearDepthStencilValue.txt[]
---
-
-[open,refpage='VkClearValue',desc='Structure specifying a clear value',type='structs']
---
-The sname:VkClearValue union is defined as:
-
-include::{generated}/api/structs/VkClearValue.txt[]
-
-  * pname:color specifies the color image clear values to use when clearing
-    a color image or attachment.
-  * pname:depthStencil specifies the depth and stencil clear values to use
-    when clearing a depth/stencil image or attachment.
-
-This union is used where part of the API requires either color or
-depth/stencil clear values, depending on the attachment, and defines the
-initial clear values in the slink:VkRenderPassBeginInfo structure.
-
-include::{generated}/validity/structs/VkClearValue.txt[]
---
-
-
-[[clears-filling-buffers]]
-== Filling Buffers
-
-[open,refpage='vkCmdFillBuffer',desc='Fill a region of a buffer with a fixed value',type='protos']
---
-To clear buffer data, call:
-
-include::{generated}/api/protos/vkCmdFillBuffer.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:dstBuffer is the buffer to be filled.
-  * pname:dstOffset is the byte offset into the buffer at which to start
-    filling, and must: be a multiple of 4.
-  * pname:size is the number of bytes to fill, and must: be either a
-    multiple of 4, or ename:VK_WHOLE_SIZE to fill the range from
-    pname:offset to the end of the buffer.
-    If ename:VK_WHOLE_SIZE is used and the remaining size of the buffer is
-    not a multiple of 4, then the nearest smaller multiple is used.
-  * pname:data is the 4-byte word written repeatedly to the buffer to fill
-    pname:size bytes of data.
-    The data word is written to memory according to the host endianness.
-
-fname:vkCmdFillBuffer is treated as "`transfer`" operation for the purposes
-of synchronization barriers.
-The ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT must: be specified in pname:usage
-of slink:VkBufferCreateInfo in order for the buffer to be compatible with
-fname:vkCmdFillBuffer.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdFillBuffer-dstOffset-00024]]
-    pname:dstOffset must: be less than the size of pname:dstBuffer
-  * [[VUID-vkCmdFillBuffer-dstOffset-00025]]
-    pname:dstOffset must: be a multiple of `4`
-  * [[VUID-vkCmdFillBuffer-size-00026]]
-    If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:size must: be
-    greater than `0`
-  * [[VUID-vkCmdFillBuffer-size-00027]]
-    If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:size must: be
-    less than or equal to the size of pname:dstBuffer minus pname:dstOffset
-  * [[VUID-vkCmdFillBuffer-size-00028]]
-    If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:size must: be a
-    multiple of `4`
-  * [[VUID-vkCmdFillBuffer-dstBuffer-00029]]
-    pname:dstBuffer must: have been created with
-    ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-vkCmdFillBuffer-commandBuffer-00030]]
-    The sname:VkCommandPool that pname:commandBuffer was allocated from
-    must: support graphics or compute operations
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-vkCmdFillBuffer-dstBuffer-00031]]
-    If pname:dstBuffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-vkCmdFillBuffer-commandBuffer-01811]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstBuffer must: not be a protected buffer
-  * [[VUID-vkCmdFillBuffer-commandBuffer-01812]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstBuffer must: not be an unprotected buffer
-endif::VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/protos/vkCmdFillBuffer.txt[]
---
-
-
-[[clears-updating-buffers]]
-== Updating Buffers
-
-[open,refpage='vkCmdUpdateBuffer',desc='Update a buffer\'s contents from host memory',type='protos']
---
-To update buffer data inline in a command buffer, call:
-
-include::{generated}/api/protos/vkCmdUpdateBuffer.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:dstBuffer is a handle to the buffer to be updated.
-  * pname:dstOffset is the byte offset into the buffer to start updating,
-    and must: be a multiple of 4.
-  * pname:dataSize is the number of bytes to update, and must: be a multiple
-    of 4.
-  * pname:pData is a pointer to the source data for the buffer update, and
-    must: be at least pname:dataSize bytes in size.
-
-pname:dataSize must: be less than or equal to 65536 bytes.
-For larger updates, applications can: use buffer to buffer
-<<copies-buffers,copies>>.
-
-[NOTE]
-.Note
-====
-Buffer updates performed with fname:vkCmdUpdateBuffer first copy the data
-into command buffer memory when the command is recorded (which requires
-additional storage and may incur an additional allocation), and then copy
-the data from the command buffer into pname:dstBuffer when the command is
-executed on a device.
-
-The additional cost of this functionality compared to <<copies-buffers,
-buffer to buffer copies>> means it is only recommended for very small
-amounts of data, and is why it is limited to only 65536 bytes.
-
-Applications can: work around this by issuing multiple
-fname:vkCmdUpdateBuffer commands to different ranges of the same buffer, but
-it is strongly recommended that they should: not.
-====
-
-The source data is copied from the user pointer to the command buffer when
-the command is called.
-
-fname:vkCmdUpdateBuffer is only allowed outside of a render pass.
-This command is treated as "`transfer`" operation, for the purposes of
-synchronization barriers.
-The ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT must: be specified in pname:usage
-of slink:VkBufferCreateInfo in order for the buffer to be compatible with
-fname:vkCmdUpdateBuffer.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdUpdateBuffer-dstOffset-00032]]
-    pname:dstOffset must: be less than the size of pname:dstBuffer
-  * [[VUID-vkCmdUpdateBuffer-dataSize-00033]]
-    pname:dataSize must: be less than or equal to the size of
-    pname:dstBuffer minus pname:dstOffset
-  * [[VUID-vkCmdUpdateBuffer-dstBuffer-00034]]
-    pname:dstBuffer must: have been created with
-    ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag
-  * [[VUID-vkCmdUpdateBuffer-dstBuffer-00035]]
-    If pname:dstBuffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-vkCmdUpdateBuffer-dstOffset-00036]]
-    pname:dstOffset must: be a multiple of `4`
-  * [[VUID-vkCmdUpdateBuffer-dataSize-00037]]
-    pname:dataSize must: be less than or equal to `65536`
-  * [[VUID-vkCmdUpdateBuffer-dataSize-00038]]
-    pname:dataSize must: be a multiple of `4`
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-vkCmdUpdateBuffer-commandBuffer-01813]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstBuffer must: not be a protected buffer
-  * [[VUID-vkCmdUpdateBuffer-commandBuffer-01814]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstBuffer must: not be an unprotected buffer
-endif::VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/protos/vkCmdUpdateBuffer.txt[]
---
-
-[NOTE]
-.Note
-====
-The pname:pData parameter was of type code:uint32_t* instead of code:void*
-prior to version 1.0.19 of the Specification and dlink:VK_HEADER_VERSION 19
-of the <<boilerplate-headers,Vulkan Header Files>>.
-This was a historical anomaly, as the source data may be of other types.
-====
diff --git a/registry/vulkan/chapters/cmdbuffers.txt b/registry/vulkan/chapters/cmdbuffers.txt
deleted file mode 100644
index 5642d49..0000000
--- a/registry/vulkan/chapters/cmdbuffers.txt
+++ /dev/null
@@ -1,2764 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[commandbuffers]]
-= Command Buffers
-
-[open,refpage='VkCommandBuffer',desc='Opaque handle to a command buffer object',type='handles']
---
-Command buffers are objects used to record commands which can: be
-subsequently submitted to a device queue for execution.
-There are two levels of command buffers - _primary command buffers_, which
-can: execute secondary command buffers, and which are submitted to queues,
-and _secondary command buffers_, which can: be executed by primary command
-buffers, and which are not directly submitted to queues.
-
-Command buffers are represented by sname:VkCommandBuffer handles:
-
-include::{generated}/api/handles/VkCommandBuffer.txt[]
---
-
-Recorded commands include commands to bind pipelines and descriptor sets to
-the command buffer, commands to modify dynamic state, commands to draw (for
-graphics rendering), commands to dispatch (for compute), commands to execute
-secondary command buffers (for primary command buffers only), commands to
-copy buffers and images, and other commands.
-
-[[commandbuffers-statereset]]
-Each command buffer manages state independently of other command buffers.
-There is no inheritance of state across primary and secondary command
-buffers, or between secondary command buffers.
-When a command buffer begins recording, all state in that command buffer is
-undefined:.
-When secondary command buffer(s) are recorded to execute on a primary
-command buffer, the secondary command buffer inherits no state from the
-primary command buffer, and all state of the primary command buffer is
-undefined: after an execute secondary command buffer command is recorded.
-There is one exception to this rule - if the primary command buffer is
-inside a render pass instance, then the render pass and subpass state is not
-disturbed by executing secondary command buffers.
-For state dependent commands (such as draws and dispatches), any state
-consumed by those commands must: not be undefined:.
-
-ifdef::VK_NV_inherited_viewport_scissor[]
-slink:VkCommandBufferInheritanceViewportScissorInfoNV defines an exception
-allowing limited inheritance of dynamic viewport and scissor state.
-endif::VK_NV_inherited_viewport_scissor[]
-
-Unless otherwise specified, and without explicit synchronization, the
-various commands submitted to a queue via command buffers may: execute in
-arbitrary order relative to each other, and/or concurrently.
-Also, the memory side effects of those commands may: not be directly visible
-to other commands without explicit memory dependencies.
-This is true within a command buffer, and across command buffers submitted
-to a given queue.
-See <<synchronization, the synchronization chapter>> for information on
-<<synchronization-implicit, implicit>> and explicit synchronization between
-commands.
-
-
-[[commandbuffers-lifecycle]]
-== Command Buffer Lifecycle
-
-Each command buffer is always in one of the following states:
-
-Initial::
-    When a command buffer is <<vkAllocateCommandBuffers, allocated>>, it is
-    in the _initial state_.
-    Some commands are able to _reset_ a command buffer (or a set of command
-    buffers) back to this state from any of the executable, recording or
-    invalid state.
-    Command buffers in the initial state can: only be moved to the recording
-    state, or freed.
-Recording::
-    flink:vkBeginCommandBuffer changes the state of a command buffer from
-    the initial state to the _recording state_.
-    Once a command buffer is in the recording state, ftext:vkCmd* commands
-    can: be used to record to the command buffer.
-Executable::
-    flink:vkEndCommandBuffer ends the recording of a command buffer, and
-    moves it from the recording state to the _executable state_.
-    Executable command buffers can: be <<commandbuffers-submission,
-    submitted>>, reset, or <<commandbuffers-secondary, recorded to another
-    command buffer>>.
-Pending::
-    <<commandbuffers-submission, Queue submission>> of a command buffer
-    changes the state of a command buffer from the executable state to the
-    _pending state_.
-    Whilst in the pending state, applications must: not attempt to modify
-    the command buffer in any way - as the device may: be processing the
-    commands recorded to it.
-    Once execution of a command buffer completes, the command buffer either
-    reverts back to the _executable state_, or if it was recorded with
-    ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, it moves to the
-    _invalid state_.
-    A <<synchronization, synchronization>> command should: be used to detect
-    when this occurs.
-Invalid::
-    Some operations, such as <<fundamentals-objectmodel-lifetime-cmdbuffers,
-    modifying or deleting a resource>> that was used in a command recorded
-    to a command buffer, will transition the state of that command buffer
-    into the _invalid state_.
-    Command buffers in the invalid state can: only be reset or freed.
-
-[[commandbuffer-lifecycle-diagram]]
-image::{images}/commandbuffer_lifecycle.svg[title="Lifecycle of a command buffer",align="center",opts="{imageopts}"]
-
-Any given command that operates on a command buffer has its own requirements
-on what state a command buffer must: be in, which are detailed in the valid
-usage constraints for that command.
-
-Resetting a command buffer is an operation that discards any previously
-recorded commands and puts a command buffer in the _initial state_.
-Resetting occurs as a result of flink:vkResetCommandBuffer or
-flink:vkResetCommandPool, or as part of flink:vkBeginCommandBuffer (which
-additionally puts the command buffer in the _recording state_).
-
-<<commandbuffers-secondary, Secondary command buffers>> can: be recorded to
-a primary command buffer via flink:vkCmdExecuteCommands.
-This partially ties the lifecycle of the two command buffers together - if
-the primary is submitted to a queue, both the primary and any secondaries
-recorded to it move to the _pending state_.
-Once execution of the primary completes, so it does for any secondary
-recorded within it.
-After all executions of each command buffer complete, they each move to
-their appropriate completion state (either to the _executable state_ or the
-_invalid state_, as specified above).
-
-If a secondary moves to the _invalid state_ or the _initial state_, then all
-primary buffers it is recorded in move to the _invalid state_.
-A primary moving to any other state does not affect the state of a secondary
-recorded in it.
-
-[NOTE]
-.Note
-====
-Resetting or freeing a primary command buffer removes the lifecycle linkage
-to all secondary command buffers that were recorded into it.
-====
-
-
-[[commandbuffers-pools]]
-== Command Pools
-
-[open,refpage='VkCommandPool',desc='Opaque handle to a command pool object',type='handles']
---
-Command pools are opaque objects that command buffer memory is allocated
-from, and which allow the implementation to amortize the cost of resource
-creation across multiple command buffers.
-Command pools are externally synchronized, meaning that a command pool must:
-not be used concurrently in multiple threads.
-That includes use via recording commands on any command buffers allocated
-from the pool, as well as operations that allocate, free, and reset command
-buffers or the pool itself.
-
-Command pools are represented by sname:VkCommandPool handles:
-
-include::{generated}/api/handles/VkCommandPool.txt[]
---
-
-[open,refpage='vkCreateCommandPool',desc='Create a new command pool object',type='protos']
---
-To create a command pool, call:
-
-include::{generated}/api/protos/vkCreateCommandPool.txt[]
-
-  * pname:device is the logical device that creates the command pool.
-  * pname:pCreateInfo is a pointer to a slink:VkCommandPoolCreateInfo
-    structure specifying the state of the command pool object.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pCommandPool is a pointer to a slink:VkCommandPool handle in which
-    the created pool is returned.
-
-.Valid Usage
-****
-  * [[VUID-vkCreateCommandPool-queueFamilyIndex-01937]]
-    pname:pCreateInfo->queueFamilyIndex must: be the index of a queue family
-    available in the logical device pname:device
-****
-
-include::{generated}/validity/protos/vkCreateCommandPool.txt[]
---
-
-[open,refpage='VkCommandPoolCreateInfo',desc='Structure specifying parameters of a newly created command pool',type='structs']
---
-The sname:VkCommandPoolCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkCommandPoolCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkCommandPoolCreateFlagBits indicating
-    usage behavior for the pool and command buffers allocated from it.
-  * pname:queueFamilyIndex designates a queue family as described in section
-    <<devsandqueues-queueprops,Queue Family Properties>>.
-    All command buffers allocated from this command pool must: be submitted
-    on queues from the same queue family.
-
-.Valid Usage
-****
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-VkCommandPoolCreateInfo-flags-02860]]
-    If the protected memory feature is not enabled, the
-    ename:VK_COMMAND_POOL_CREATE_PROTECTED_BIT bit of pname:flags must: not
-    be set
-endif::VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/structs/VkCommandPoolCreateInfo.txt[]
---
-
-[open,refpage='VkCommandPoolCreateFlagBits',desc='Bitmask specifying usage behavior for a command pool',type='enums']
---
-Bits which can: be set in slink:VkCommandPoolCreateInfo::pname:flags to
-specify usage behavior for a command pool are:
-
-include::{generated}/api/enums/VkCommandPoolCreateFlagBits.txt[]
-
-  * ename:VK_COMMAND_POOL_CREATE_TRANSIENT_BIT specifies that command
-    buffers allocated from the pool will be short-lived, meaning that they
-    will be reset or freed in a relatively short timeframe.
-    This flag may: be used by the implementation to control memory
-    allocation behavior within the pool.
-  * ename:VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT allows any command
-    buffer allocated from a pool to be individually reset to the
-    <<commandbuffers-lifecycle, initial state>>; either by calling
-    flink:vkResetCommandBuffer, or via the implicit reset when calling
-    flink:vkBeginCommandBuffer.
-    If this flag is not set on a pool, then fname:vkResetCommandBuffer must:
-    not be called for any command buffer allocated from that pool.
-ifdef::VK_VERSION_1_1[]
-  * ename:VK_COMMAND_POOL_CREATE_PROTECTED_BIT specifies that command
-    buffers allocated from the pool are protected command buffers.
-endif::VK_VERSION_1_1[]
---
-
-[open,refpage='VkCommandPoolCreateFlags',desc='Bitmask of VkCommandPoolCreateFlagBits',type='flags']
---
-include::{generated}/api/flags/VkCommandPoolCreateFlags.txt[]
-
-tname:VkCommandPoolCreateFlags is a bitmask type for setting a mask of zero
-or more elink:VkCommandPoolCreateFlagBits.
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-[open,refpage='vkTrimCommandPool',desc='Trim a command pool',type='protos']
---
-To trim a command pool, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkTrimCommandPool.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_maintenance1[or the equivalent command]
-
-ifdef::VK_KHR_maintenance1[]
-include::{generated}/api/protos/vkTrimCommandPoolKHR.txt[]
-endif::VK_KHR_maintenance1[]
-
-  * pname:device is the logical device that owns the command pool.
-  * pname:commandPool is the command pool to trim.
-  * pname:flags is reserved for future use.
-
-Trimming a command pool recycles unused memory from the command pool back to
-the system.
-Command buffers allocated from the pool are not affected by the command.
-
-[NOTE]
-.Note
-====
-This command provides applications with some control over the internal
-memory allocations used by command pools.
-
-Unused memory normally arises from command buffers that have been recorded
-and later reset, such that they are no longer using the memory.
-On reset, a command buffer can return memory to its command pool, but the
-only way to release memory from a command pool to the system requires
-calling flink:vkResetCommandPool, which cannot be executed while any command
-buffers from that pool are still in use.
-Subsequent recording operations into command buffers will re-use this memory
-but since total memory requirements fluctuate over time, unused memory can
-accumulate.
-
-In this situation, trimming a command pool may: be useful to return unused
-memory back to the system, returning the total outstanding memory allocated
-by the pool back to a more "`average`" value.
-
-Implementations utilize many internal allocation strategies that make it
-impossible to guarantee that all unused memory is released back to the
-system.
-For instance, an implementation of a command pool may: involve allocating
-memory in bulk from the system and sub-allocating from that memory.
-In such an implementation any live command buffer that holds a reference to
-a bulk allocation would prevent that allocation from being freed, even if
-only a small proportion of the bulk allocation is in use.
-
-In most cases trimming will result in a reduction in allocated but unused
-memory, but it does not guarantee the "`ideal`" behavior.
-
-Trimming may: be an expensive operation, and should: not be called
-frequently.
-Trimming should: be treated as a way to relieve memory pressure after
-application-known points when there exists enough unused memory that the
-cost of trimming is "`worth`" it.
-====
-
-include::{generated}/validity/protos/vkTrimCommandPool.txt[]
---
-
-[open,refpage='VkCommandPoolTrimFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkCommandPoolTrimFlags.txt[]
-
-ifdef::VK_KHR_maintenance1[]
-or the equivalent
-
-include::{generated}/api/flags/VkCommandPoolTrimFlagsKHR.txt[]
-endif::VK_KHR_maintenance1[]
-
-tname:VkCommandPoolTrimFlags is a bitmask type for setting a mask, but is
-currently reserved for future use.
---
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-
-[open,refpage='vkResetCommandPool',desc='Reset a command pool',type='protos']
---
-To reset a command pool, call:
-
-include::{generated}/api/protos/vkResetCommandPool.txt[]
-
-  * pname:device is the logical device that owns the command pool.
-  * pname:commandPool is the command pool to reset.
-  * pname:flags is a bitmask of elink:VkCommandPoolResetFlagBits controlling
-    the reset operation.
-
-Resetting a command pool recycles all of the resources from all of the
-command buffers allocated from the command pool back to the command pool.
-All command buffers that have been allocated from the command pool are put
-in the <<commandbuffers-lifecycle, initial state>>.
-
-Any primary command buffer allocated from another slink:VkCommandPool that
-is in the <<commandbuffers-lifecycle, recording or executable state>> and
-has a secondary command buffer allocated from pname:commandPool recorded
-into it, becomes <<commandbuffers-lifecycle, invalid>>.
-
-.Valid Usage
-****
-  * [[VUID-vkResetCommandPool-commandPool-00040]]
-    All sname:VkCommandBuffer objects allocated from pname:commandPool must:
-    not be in the <<commandbuffers-lifecycle, pending state>>
-****
-
-include::{generated}/validity/protos/vkResetCommandPool.txt[]
---
-
-[open,refpage='VkCommandPoolResetFlagBits',desc='Bitmask controlling behavior of a command pool reset',type='enums']
---
-Bits which can: be set in flink:vkResetCommandPool::pname:flags to control
-the reset operation are:
-
-include::{generated}/api/enums/VkCommandPoolResetFlagBits.txt[]
-
-  * ename:VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT specifies that
-    resetting a command pool recycles all of the resources from the command
-    pool back to the system.
---
-
-[open,refpage='VkCommandPoolResetFlags',desc='Bitmask of VkCommandPoolResetFlagBits',type='flags']
---
-include::{generated}/api/flags/VkCommandPoolResetFlags.txt[]
-
-tname:VkCommandPoolResetFlags is a bitmask type for setting a mask of zero
-or more elink:VkCommandPoolResetFlagBits.
---
-
-[open,refpage='vkDestroyCommandPool',desc='Destroy a command pool object',type='protos']
---
-To destroy a command pool, call:
-
-include::{generated}/api/protos/vkDestroyCommandPool.txt[]
-
-  * pname:device is the logical device that destroys the command pool.
-  * pname:commandPool is the handle of the command pool to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-When a pool is destroyed, all command buffers allocated from the pool are
-<<vkFreeCommandBuffers, freed>>.
-
-Any primary command buffer allocated from another slink:VkCommandPool that
-is in the <<commandbuffers-lifecycle, recording or executable state>> and
-has a secondary command buffer allocated from pname:commandPool recorded
-into it, becomes <<commandbuffers-lifecycle, invalid>>.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyCommandPool-commandPool-00041]]
-    All sname:VkCommandBuffer objects allocated from pname:commandPool must:
-    not be in the <<commandbuffers-lifecycle, pending state>>
-  * [[VUID-vkDestroyCommandPool-commandPool-00042]]
-    If sname:VkAllocationCallbacks were provided when pname:commandPool was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyCommandPool-commandPool-00043]]
-    If no sname:VkAllocationCallbacks were provided when pname:commandPool
-    was created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyCommandPool.txt[]
---
-
-
-[[commandbuffer-allocation]]
-== Command Buffer Allocation and Management
-
-[open,refpage='vkAllocateCommandBuffers',desc='Allocate command buffers from an existing command pool',type='protos']
---
-To allocate command buffers, call:
-
-include::{generated}/api/protos/vkAllocateCommandBuffers.txt[]
-
-  * pname:device is the logical device that owns the command pool.
-  * pname:pAllocateInfo is a pointer to a sname:VkCommandBufferAllocateInfo
-    structure describing parameters of the allocation.
-  * pname:pCommandBuffers is a pointer to an array of slink:VkCommandBuffer
-    handles in which the resulting command buffer objects are returned.
-    The array must: be at least the length specified by the
-    pname:commandBufferCount member of pname:pAllocateInfo.
-    Each allocated command buffer begins in the initial state.
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-fname:vkAllocateCommandBuffers can: be used to allocate multiple command
-buffers.
-If the allocation of any of those command buffers fails, the implementation
-must: free all successfully allocated command buffer objects from this
-command, set all entries of the pname:pCommandBuffers array to `NULL` and
-return the error.
-
-[NOTE]
-.Note
-====
-Filling pname:pCommandBuffers with `NULL` values on failure is an exception
-to the default error behavior that output parameters will have undefined:
-contents.
-====
-
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-
-When command buffers are first allocated, they are in the
-<<commandbuffers-lifecycle, initial state>>.
-
-include::{generated}/validity/protos/vkAllocateCommandBuffers.txt[]
---
-
-[open,refpage='VkCommandBufferAllocateInfo',desc='Structure specifying the allocation parameters for command buffer object',type='structs']
---
-The sname:VkCommandBufferAllocateInfo structure is defined as:
-
-include::{generated}/api/structs/VkCommandBufferAllocateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:commandPool is the command pool from which the command buffers are
-    allocated.
-  * pname:level is a elink:VkCommandBufferLevel value specifying the command
-    buffer level.
-  * pname:commandBufferCount is the number of command buffers to allocate
-    from the pool.
-
-include::{generated}/validity/structs/VkCommandBufferAllocateInfo.txt[]
---
-
-[open,refpage='VkCommandBufferLevel',desc='Enumerant specifying a command buffer level',type='enums']
---
-Possible values of slink:VkCommandBufferAllocateInfo::pname:level,
-specifying the command buffer level, are:
-
-include::{generated}/api/enums/VkCommandBufferLevel.txt[]
-
-  * ename:VK_COMMAND_BUFFER_LEVEL_PRIMARY specifies a primary command
-    buffer.
-  * ename:VK_COMMAND_BUFFER_LEVEL_SECONDARY specifies a secondary command
-    buffer.
---
-
-[open,refpage='vkResetCommandBuffer',desc='Reset a command buffer to the initial state',type='protos']
---
-To reset a command buffer, call:
-
-include::{generated}/api/protos/vkResetCommandBuffer.txt[]
-
-  * pname:commandBuffer is the command buffer to reset.
-    The command buffer can: be in any state other than
-    <<commandbuffers-lifecycle, pending>>, and is moved into the
-    <<commandbuffers-lifecycle, initial state>>.
-  * pname:flags is a bitmask of elink:VkCommandBufferResetFlagBits
-    controlling the reset operation.
-
-Any primary command buffer that is in the <<commandbuffers-lifecycle,
-recording or executable state>> and has pname:commandBuffer recorded into
-it, becomes <<commandbuffers-lifecycle, invalid>>.
-
-.Valid Usage
-****
-  * [[VUID-vkResetCommandBuffer-commandBuffer-00045]]
-    pname:commandBuffer must: not be in the <<commandbuffers-lifecycle,
-    pending state>>
-  * [[VUID-vkResetCommandBuffer-commandBuffer-00046]]
-    pname:commandBuffer must: have been allocated from a pool that was
-    created with the ename:VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
-****
-
-include::{generated}/validity/protos/vkResetCommandBuffer.txt[]
---
-
-[open,refpage='VkCommandBufferResetFlagBits',desc='Bitmask controlling behavior of a command buffer reset',type='enums']
---
-Bits which can: be set in flink:vkResetCommandBuffer::pname:flags to control
-the reset operation are:
-
-include::{generated}/api/enums/VkCommandBufferResetFlagBits.txt[]
-
-  * ename:VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT specifies that most
-    or all memory resources currently owned by the command buffer should: be
-    returned to the parent command pool.
-    If this flag is not set, then the command buffer may: hold onto memory
-    resources and reuse them when recording commands.
-    pname:commandBuffer is moved to the <<commandbuffers-lifecycle, initial
-    state>>.
---
-
-[open,refpage='VkCommandBufferResetFlags',desc='Bitmask of VkCommandBufferResetFlagBits',type='flags']
---
-include::{generated}/api/flags/VkCommandBufferResetFlags.txt[]
-
-tname:VkCommandBufferResetFlags is a bitmask type for setting a mask of zero
-or more elink:VkCommandBufferResetFlagBits.
---
-
-[open,refpage='vkFreeCommandBuffers',desc='Free command buffers',type='protos']
---
-To free command buffers, call:
-
-include::{generated}/api/protos/vkFreeCommandBuffers.txt[]
-
-  * pname:device is the logical device that owns the command pool.
-  * pname:commandPool is the command pool from which the command buffers
-    were allocated.
-  * pname:commandBufferCount is the length of the pname:pCommandBuffers
-    array.
-  * pname:pCommandBuffers is a pointer to an array of handles of command
-    buffers to free.
-
-Any primary command buffer that is in the <<commandbuffers-lifecycle,
-recording or executable state>> and has any element of pname:pCommandBuffers
-recorded into it, becomes <<commandbuffers-lifecycle, invalid>>.
-
-.Valid Usage
-****
-  * [[VUID-vkFreeCommandBuffers-pCommandBuffers-00047]]
-    All elements of pname:pCommandBuffers must: not be in the
-    <<commandbuffers-lifecycle, pending state>>
-  * [[VUID-vkFreeCommandBuffers-pCommandBuffers-00048]]
-    pname:pCommandBuffers must: be a valid pointer to an array of
-    pname:commandBufferCount sname:VkCommandBuffer handles, each element of
-    which must: either be a valid handle or `NULL`
-****
-
-include::{generated}/validity/protos/vkFreeCommandBuffers.txt[]
---
-
-
-[[commandbuffers-recording]]
-== Command Buffer Recording
-
-[open,refpage='vkBeginCommandBuffer',desc='Start recording a command buffer',type='protos']
---
-To begin recording a command buffer, call:
-
-include::{generated}/api/protos/vkBeginCommandBuffer.txt[]
-
-  * pname:commandBuffer is the handle of the command buffer which is to be
-    put in the recording state.
-  * pname:pBeginInfo is a pointer to a slink:VkCommandBufferBeginInfo
-    structure defining additional information about how the command buffer
-    begins recording.
-
-.Valid Usage
-****
-  * [[VUID-vkBeginCommandBuffer-commandBuffer-00049]]
-    pname:commandBuffer must: not be in the <<commandbuffers-lifecycle,
-    recording or pending state>>
-  * [[VUID-vkBeginCommandBuffer-commandBuffer-00050]]
-    If pname:commandBuffer was allocated from a slink:VkCommandPool which
-    did not have the ename:VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
-    flag set, pname:commandBuffer must: be in the
-    <<commandbuffers-lifecycle, initial state>>
-  * [[VUID-vkBeginCommandBuffer-commandBuffer-00051]]
-    If pname:commandBuffer is a secondary command buffer, the
-    pname:pInheritanceInfo member of pname:pBeginInfo must: be a valid
-    sname:VkCommandBufferInheritanceInfo structure
-  * [[VUID-vkBeginCommandBuffer-commandBuffer-00052]]
-    If pname:commandBuffer is a secondary command buffer and either the
-    pname:occlusionQueryEnable member of the pname:pInheritanceInfo member
-    of pname:pBeginInfo is ename:VK_FALSE, or the precise occlusion queries
-    feature is not enabled, then
-    pname:pBeginInfo->pInheritanceInfo->queryFlags must: not contain
-    ename:VK_QUERY_CONTROL_PRECISE_BIT
-  * [[VUID-vkBeginCommandBuffer-commandBuffer-02840]]
-    If pname:commandBuffer is a primary command buffer, then
-    pname:pBeginInfo->flags must: not set both the
-    ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT and the
-    ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flags
-****
-
-include::{generated}/validity/protos/vkBeginCommandBuffer.txt[]
---
-
-[open,refpage='VkCommandBufferBeginInfo',desc='Structure specifying a command buffer begin operation',type='structs']
---
-The sname:VkCommandBufferBeginInfo structure is defined as:
-
-include::{generated}/api/structs/VkCommandBufferBeginInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkCommandBufferUsageFlagBits
-    specifying usage behavior for the command buffer.
-  * pname:pInheritanceInfo is a pointer to a
-    sname:VkCommandBufferInheritanceInfo structure, used if
-    pname:commandBuffer is a secondary command buffer.
-    If this is a primary command buffer, then this value is ignored.
-
-.Valid Usage
-****
-ifndef::VK_KHR_dynamic_rendering[]
-  * [[VUID-VkCommandBufferBeginInfo-flags-00053]]
-    If pname:flags contains
-    ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the
-    pname:renderPass member of pname:pInheritanceInfo must: be a valid
-    sname:VkRenderPass
-  * [[VUID-VkCommandBufferBeginInfo-flags-00054]]
-    If pname:flags contains
-    ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the
-    pname:subpass member of pname:pInheritanceInfo must: be a valid subpass
-    index within the pname:renderPass member of pname:pInheritanceInfo
-endif::VK_KHR_dynamic_rendering[]
-  * [[VUID-VkCommandBufferBeginInfo-flags-00055]]
-    If pname:flags contains
-    ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the
-    pname:framebuffer member of pname:pInheritanceInfo must: be either
-    dlink:VK_NULL_HANDLE, or a valid sname:VkFramebuffer that is compatible
-    with the pname:renderPass member of pname:pInheritanceInfo
-ifdef::VK_KHR_dynamic_rendering[]
-  * [[VUID-VkCommandBufferBeginInfo-flags-06000]]
-    If pname:flags contains
-    ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT and the
-    pname:renderPass member of pname:pInheritanceInfo is not
-    dlink:VK_NULL_HANDLE, pname:renderPass must: be a valid
-    sname:VkRenderPass
-  * [[VUID-VkCommandBufferBeginInfo-flags-06001]]
-    If pname:flags contains
-    ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT and the
-    pname:renderPass member of pname:pInheritanceInfo is not
-    dlink:VK_NULL_HANDLE, the pname:subpass member of pname:pInheritanceInfo
-    must: be a valid subpass index within the pname:renderPass member of
-    pname:pInheritanceInfo
-  * [[VUID-VkCommandBufferBeginInfo-flags-06002]]
-    If pname:flags contains
-    ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT and the
-    pname:renderPass member of pname:pInheritanceInfo is
-    dlink:VK_NULL_HANDLE, the pname:pNext chain of pname:pInheritanceInfo
-    must: include a slink:VkCommandBufferInheritanceRenderingInfoKHR
-    structure
-ifdef::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
-  * [[VUID-VkCommandBufferBeginInfo-flags-06003]]
-    If pname:flags contains
-    ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the
-    pname:renderPass member of pname:pInheritanceInfo is
-    dlink:VK_NULL_HANDLE, and the pname:pNext chain of
-    pname:pInheritanceInfo includes a slink:VkAttachmentSampleCountInfoAMD
-    or slink:VkAttachmentSampleCountInfoNV structure, the
-    pname:colorAttachmentCount member of that structure must: be equal to
-    the value of
-    slink:VkCommandBufferInheritanceRenderingInfoKHR::pname:colorAttachmentCount
-endif::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
-endif::VK_KHR_dynamic_rendering[]
-****
-
-include::{generated}/validity/structs/VkCommandBufferBeginInfo.txt[]
---
-
-[open,refpage='VkCommandBufferUsageFlagBits',desc='Bitmask specifying usage behavior for command buffer',type='enums']
---
-Bits which can: be set in slink:VkCommandBufferBeginInfo::pname:flags to
-specify usage behavior for a command buffer are:
-
-include::{generated}/api/enums/VkCommandBufferUsageFlagBits.txt[]
-
-  * ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT specifies that each
-    recording of the command buffer will only be submitted once, and the
-    command buffer will be reset and recorded again between each submission.
-  * ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT specifies that a
-    secondary command buffer is considered to be entirely inside a render
-    pass.
-    If this is a primary command buffer, then this bit is ignored.
-  * ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT specifies that a
-    command buffer can: be resubmitted to a queue while it is in the
-    _pending state_, and recorded into multiple primary command buffers.
---
-
-[open,refpage='VkCommandBufferUsageFlags',desc='Bitmask of VkCommandBufferUsageFlagBits',type='flags']
---
-include::{generated}/api/flags/VkCommandBufferUsageFlags.txt[]
-
-tname:VkCommandBufferUsageFlags is a bitmask type for setting a mask of zero
-or more elink:VkCommandBufferUsageFlagBits.
---
-
-[open,refpage='VkCommandBufferInheritanceInfo',desc='Structure specifying command buffer inheritance information',type='structs']
---
-If the command buffer is a secondary command buffer, then the
-sname:VkCommandBufferInheritanceInfo structure defines any state that will
-be inherited from the primary command buffer:
-
-include::{generated}/api/structs/VkCommandBufferInheritanceInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:renderPass is a slink:VkRenderPass object defining which render
-    passes the sname:VkCommandBuffer will be <<renderpass-compatibility,
-    compatible>> with and can: be executed within.
-  * pname:subpass is the index of the subpass within the render pass
-    instance that the sname:VkCommandBuffer will be executed within.
-  * pname:framebuffer can: refer to the slink:VkFramebuffer object that the
-    sname:VkCommandBuffer will be rendering to if it is executed within a
-    render pass instance.
-    It can: be dlink:VK_NULL_HANDLE if the framebuffer is not known.
-+
-[NOTE]
-.Note
-====
-Specifying the exact framebuffer that the secondary command buffer will be
-executed with may: result in better performance at command buffer execution
-time.
-====
-  * pname:occlusionQueryEnable specifies whether the command buffer can: be
-    executed while an occlusion query is active in the primary command
-    buffer.
-    If this is ename:VK_TRUE, then this command buffer can: be executed
-    whether the primary command buffer has an occlusion query active or not.
-    If this is ename:VK_FALSE, then the primary command buffer must: not
-    have an occlusion query active.
-  * pname:queryFlags specifies the query flags that can: be used by an
-    active occlusion query in the primary command buffer when this secondary
-    command buffer is executed.
-    If this value includes the ename:VK_QUERY_CONTROL_PRECISE_BIT bit, then
-    the active query can: return boolean results or actual sample counts.
-    If this bit is not set, then the active query must: not use the
-    ename:VK_QUERY_CONTROL_PRECISE_BIT bit.
-  * pname:pipelineStatistics is a bitmask of
-    elink:VkQueryPipelineStatisticFlagBits specifying the set of pipeline
-    statistics that can: be counted by an active query in the primary
-    command buffer when this secondary command buffer is executed.
-    If this value includes a given bit, then this command buffer can: be
-    executed whether the primary command buffer has a pipeline statistics
-    query active that includes this bit or not.
-    If this value excludes a given bit, then the active pipeline statistics
-    query must: not be from a query pool that counts that statistic.
-
-If the slink:VkCommandBuffer will not be executed within a render pass
-instance,
-ifdef::VK_KHR_dynamic_rendering[]
-or if the render pass instance was begun with flink:vkCmdBeginRenderingKHR,
-endif::VK_KHR_dynamic_rendering[]
-pname:renderPass, pname:subpass, and pname:framebuffer are ignored.
-
-.Valid Usage
-****
-  * [[VUID-VkCommandBufferInheritanceInfo-occlusionQueryEnable-00056]]
-    If the <<features-inheritedQueries,inherited queries>> feature is not
-    enabled, pname:occlusionQueryEnable must: be ename:VK_FALSE
-  * [[VUID-VkCommandBufferInheritanceInfo-queryFlags-00057]]
-    If the <<features-inheritedQueries,inherited queries>> feature is
-    enabled, pname:queryFlags must: be a valid combination of
-    elink:VkQueryControlFlagBits values
-  * [[VUID-VkCommandBufferInheritanceInfo-queryFlags-02788]]
-    If the <<features-inheritedQueries,inherited queries>> feature is not
-    enabled, pname:queryFlags must: be code:0
-  * [[VUID-VkCommandBufferInheritanceInfo-pipelineStatistics-02789]]
-    If the <<features-pipelineStatisticsQuery,pipeline statistics queries>>
-    feature is enabled, pname:pipelineStatistics must: be a valid
-    combination of elink:VkQueryPipelineStatisticFlagBits values
-  * [[VUID-VkCommandBufferInheritanceInfo-pipelineStatistics-00058]]
-    If the <<features-pipelineStatisticsQuery,pipeline statistics queries>>
-    feature is not enabled, pname:pipelineStatistics must: be code:0
-****
-
-include::{generated}/validity/structs/VkCommandBufferInheritanceInfo.txt[]
---
-
-[NOTE]
-.Note
-====
-On some implementations, not using the
-ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT bit enables command
-buffers to be patched in-place if needed, rather than creating a copy of the
-command buffer.
-====
-
-If a command buffer is in the <<commandbuffers-lifecycle, invalid, or
-executable state>>, and the command buffer was allocated from a command pool
-with the ename:VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set,
-then fname:vkBeginCommandBuffer implicitly resets the command buffer,
-behaving as if fname:vkResetCommandBuffer had been called with
-ename:VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT not set.
-After the implicit reset, pname:commandBuffer is moved to the
-<<commandbuffers-lifecycle, recording state>>.
-
-ifdef::VK_EXT_conditional_rendering[]
-[open,refpage='VkCommandBufferInheritanceConditionalRenderingInfoEXT',desc='Structure specifying command buffer inheritance information',type='structs']
---
-If the pname:pNext chain of slink:VkCommandBufferInheritanceInfo includes a
-sname:VkCommandBufferInheritanceConditionalRenderingInfoEXT structure, then
-that structure controls whether a command buffer can: be executed while
-conditional rendering is <<active-conditional-rendering,active>> in the
-primary command buffer.
-
-The sname:VkCommandBufferInheritanceConditionalRenderingInfoEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkCommandBufferInheritanceConditionalRenderingInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:conditionalRenderingEnable specifies whether the command buffer
-    can: be executed while conditional rendering is active in the primary
-    command buffer.
-    If this is ename:VK_TRUE, then this command buffer can: be executed
-    whether the primary command buffer has active conditional rendering or
-    not.
-    If this is ename:VK_FALSE, then the primary command buffer must: not
-    have conditional rendering active.
-
-If this structure is not present, the behavior is as if
-pname:conditionalRenderingEnable is ename:VK_FALSE.
-
-.Valid Usage
-****
-  * [[VUID-VkCommandBufferInheritanceConditionalRenderingInfoEXT-conditionalRenderingEnable-01977]]
-    If the <<features-inheritedConditionalRendering, inherited conditional
-    rendering>> feature is not enabled, pname:conditionalRenderingEnable
-    must: be ename:VK_FALSE
-****
-
-include::{generated}/validity/structs/VkCommandBufferInheritanceConditionalRenderingInfoEXT.txt[]
---
-endif::VK_EXT_conditional_rendering[]
-
-ifdef::VK_QCOM_render_pass_transform[]
-[open,refpage='VkCommandBufferInheritanceRenderPassTransformInfoQCOM',desc='Structure describing transformed render pass parameters command buffer',type='structs']
---
-
-To begin recording a secondary command buffer compatible with execution
-inside a render pass using <<vertexpostproc-renderpass-transform, render
-pass transform>>, add the
-slink:VkCommandBufferInheritanceRenderPassTransformInfoQCOM to the
-pname:pNext chain of slink:VkCommandBufferInheritanceInfo structure passed
-to the flink:vkBeginCommandBuffer command specifying the parameters for
-transformed rasterization.
-
-The sname:VkCommandBufferInheritanceRenderPassTransformInfoQCOM structure is
-defined as:
-
-include::{generated}/api/structs/VkCommandBufferInheritanceRenderPassTransformInfoQCOM.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:transform is a elink:VkSurfaceTransformFlagBitsKHR value
-    describing the transform to be applied to the render pass.
-  * pname:renderArea is the render area that is affected by the command
-    buffer.
-
-When the secondary is recorded to execute within a render pass instance
-using flink:vkCmdExecuteCommands, the render pass transform parameters of
-the secondary command buffer must: be consistent with the render pass
-transform parameters specified for the render pass instance.
-In particular, the pname:transform and pname:renderArea for command buffer
-must: be identical to the pname:transform and pname:renderArea of the render
-pass instance.
-
-.Valid Usage
-****
-  * [[VUID-VkCommandBufferInheritanceRenderPassTransformInfoQCOM-transform-02864]]
-    pname:transform must: be ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,
-    ename:VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,
-    ename:VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR, or
-    ename:VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR
-****
-
-include::{generated}/validity/structs/VkCommandBufferInheritanceRenderPassTransformInfoQCOM.txt[]
---
-endif::VK_QCOM_render_pass_transform[]
-
-ifdef::VK_NV_inherited_viewport_scissor[]
-[open,refpage='VkCommandBufferInheritanceViewportScissorInfoNV',desc='Structure specifying command buffer inheritance information',type='structs']
---
-The sname:VkCommandBufferInheritanceViewportScissorInfoNV structure is
-defined as:
-
-include::{generated}/api/structs/VkCommandBufferInheritanceViewportScissorInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:viewportScissor2D specifies whether the listed dynamic state is
-    inherited.
-  * pname:viewportDepthCount specifies the maximum number of viewports to
-    inherit.
-    When pname:viewportScissor2D is ename:VK_FALSE, the behavior is as if
-    this value is zero.
-  * pname:pViewportDepths is a pointer to a slink:VkViewport structure
-    specifying the expected depth range for each inherited viewport.
-
-If the pname:pNext chain of slink:VkCommandBufferInheritanceInfo includes a
-sname:VkCommandBufferInheritanceViewportScissorInfoNV structure, then that
-structure controls whether a command buffer can: inherit the following state
-from other command buffers:
-
-  * ename:VK_DYNAMIC_STATE_SCISSOR
-ifdef::VK_EXT_extended_dynamic_state[]
-  * ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT
-endif::VK_EXT_extended_dynamic_state[]
-ifdef::VK_EXT_discard_rectangles[]
-  * ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT
-endif::VK_EXT_discard_rectangles[]
-
-as well as the following state, with restrictions on inherited depth values
-and viewport count:
-
-  * ename:VK_DYNAMIC_STATE_VIEWPORT
-ifdef::VK_EXT_extended_dynamic_state[]
-  * ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT
-endif::VK_EXT_extended_dynamic_state[]
-
-If pname:viewportScissor2D is ename:VK_FALSE, then the command buffer does
-not inherit the listed dynamic state, and should: set this state itself.
-If this structure is not present, the behavior is as if
-pname:viewportScissor2D is ename:VK_FALSE.
-
-If pname:viewportScissor2D is ename:VK_TRUE, then the listed dynamic state
-is inherited, and the command buffer must: not set this
-ifndef::VK_EXT_extended_dynamic_state[state.]
-ifdef::VK_EXT_extended_dynamic_state[]
-state, except that the viewport and scissor count may: be set by binding a
-graphics pipeline that does not specify this state as dynamic.
-
-[NOTE]
-.Note
-====
-Due to this restriction, applications should: ensure either all or none of
-the graphics pipelines bound in this secondary command buffer use dynamic
-viewport/scissor counts.
-====
-endif::VK_EXT_extended_dynamic_state[]
-
-When the command buffer is executed as part of a the execution of a
-flink:vkCmdExecuteCommands command, the inherited state (if enabled) is
-determined by the following procedure, performed separately for each dynamic
-state, and separately for each value for dynamic state that consists of
-multiple values (e.g. multiple viewports).
-
-  * With [eq]#i# being the index of the executed command buffer in the
-    pname:pCommandBuffers array of flink:vkCmdExecuteCommands, if [eq]#i >
-    0# and any secondary command buffer from index [eq]#0# to [eq]#i-1#
-    modifies the state, the inherited state is provisionally set to the
-    final value set by the last such secondary command buffer.
-    Binding a graphics pipeline that defines the state statically is
-    equivalent to setting the state to an undefined: value.
-  * Otherwise, the tentatative inherited state is that of the primary
-    command buffer at the point the flink:vkCmdExecuteCommands command was
-    recorded; if the state is undefined:, then so is the provisional
-    inherited state.
-  * If the provisional inherited state is an undefined: value, then the
-    state is not inherited.
-  * If the provisional inherited state is a viewport, with [eq]#n# being its
-    viewport index, then if [eq]#n {geq} pname:viewportDepthCount#, or if
-    either slink:VkViewport::pname:minDepth or
-    slink:VkViewport::pname:maxDepth are not equal to the respective values
-    of the [eq]#n^th^# element of pname:pViewportDepths, then the state is
-    not inherited.
-  * If the provisional inherited state passes both checks, then it becomes
-    the actual inherited state.
-
-[NOTE]
-.Note
-====
-There is no support for inheriting dynamic state from a secondary command
-buffer executed as part of a different `vkCmdExecuteCommands` command.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkCommandBufferInheritanceViewportScissorInfoNV-viewportScissor2D-04782]]
-    If the <<features-inheritedViewportScissor2D, inherited viewport
-    scissor>> feature is not enabled, pname:viewportScissor2D must: be
-    ename:VK_FALSE
-  * [[VUID-VkCommandBufferInheritanceViewportScissorInfoNV-viewportScissor2D-04783]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled and pname:viewportScissor2D is ename:VK_TRUE, then
-    pname:viewportDepthCount must: be `1`
-  * [[VUID-VkCommandBufferInheritanceViewportScissorInfoNV-viewportScissor2D-04784]]
-    If pname:viewportScissor2D is ename:VK_TRUE, then
-    pname:viewportDepthCount must: be greater than `0`
-  * [[VUID-VkCommandBufferInheritanceViewportScissorInfoNV-viewportScissor2D-04785]]
-    If pname:viewportScissor2D is ename:VK_TRUE, then pname:pViewportDepths
-    must: be a valid pointer to an array of `viewportDepthCount` valid
-    sname:VkViewport structures, except any requirements on `x`, `y`,
-    `width`, and `height` do not apply
-  * [[VUID-VkCommandBufferInheritanceViewportScissorInfoNV-viewportScissor2D-04786]]
-    If pname:viewportScissor2D is ename:VK_TRUE, then the command buffer
-    must: be recorded with the
-    ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
-****
-
-include::{generated}/validity/structs/VkCommandBufferInheritanceViewportScissorInfoNV.txt[]
---
-endif::VK_NV_inherited_viewport_scissor[]
-
-ifdef::VK_KHR_dynamic_rendering[]
-[open,refpage='VkCommandBufferInheritanceRenderingInfoKHR',desc='Structure specifying command buffer inheritance info for dynamic render pass instances',type='structs']
---
-
-The sname:VkCommandBufferInheritanceRenderingInfoKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkCommandBufferInheritanceRenderingInfoKHR.txt[]
-
-  * pname:sType is the type of this structure
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure
-  * pname:flags is a bitmask of elink:VkRenderingFlagBitsKHR used by the
-    render pass instance.
-  * pname:viewMask is the view mask used for rendering.
-  * pname:colorAttachmentCount is the number of color attachments specified
-    in the render pass instance.
-  * pname:pColorAttachmentFormats is an array of elink:VkFormat values
-    defining the format of color attachments.
-  * pname:depthAttachmentFormat is a elink:VkFormat value defining the
-    format of the depth attachment.
-  * pname:stencilAttachmentFormat is a elink:VkFormat value defining the
-    format of the stencil attachment.
-  * pname:rasterizationSamples is a elink:VkSampleCountFlagBits specifying
-    the number of samples used in rasterization.
-
-If the pname:pNext chain of slink:VkCommandBufferInheritanceInfo includes a
-sname:VkCommandBufferInheritanceRenderingInfoKHR structure, then that
-structure controls parameters of dynamic render pass instances that the
-slink:VkCommandBuffer can: be executed within.
-If slink:VkCommandBufferInheritanceInfo::pname:renderPass is not
-dlink:VK_NULL_HANDLE, or
-ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT is not specified in
-slink:VkCommandBufferBeginInfo::pname:flags, parameters of this structure
-are ignored.
-
-If pname:colorAttachmentCount is `0` and the
-<<features-variableMultisampleRate,pname:variableMultisampleRate>> feature
-is enabled, pname:rasterizationSamples is ignored.
-
-If pname:depthAttachmentFormat, pname:stencilAttachmentFormat, or any
-element of pname:pColorAttachmentFormats is ename:VK_FORMAT_UNDEFINED, it
-indicates that the corresponding attachment is unused within the render
-pass.
-
-.Valid Usage
-****
-  * [[VUID-VkCommandBufferInheritanceRenderingInfoKHR-colorAttachmentCount-06004]]
-    If pname:colorAttachmentCount is not `0`, pname:rasterizationSamples
-    must: be a valid elink:VkSampleCountFlagBits value
-  * [[VUID-VkCommandBufferInheritanceRenderingInfoKHR-variableMultisampleRate-06005]]
-    If the
-    <<features-variableMultisampleRate,pname:variableMultisampleRate>>
-    feature is not enabled, pname:rasterizationSamples must: be a valid
-    elink:VkSampleCountFlagBits value
-  * [[VUID-VkCommandBufferInheritanceRenderingInfoKHR-pColorAttachmentFormats-06006]]
-    If any element of pname:pColorAttachmentFormats is not
-    ename:VK_FORMAT_UNDEFINED, it must: be a format with
-    <<potential-format-features, potential format features>> that include
-    ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
-  * [[VUID-VkCommandBufferInheritanceRenderingInfoKHR-depthAttachmentFormat-06007]]
-    If pname:depthAttachmentFormat is not ename:VK_FORMAT_UNDEFINED, it
-    must: be a format with <<potential-format-features, potential format
-    features>> that include
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkCommandBufferInheritanceRenderingInfoKHR-stencilAttachmentFormat-06199]]
-    If pname:stencilAttachmentFormat is not ename:VK_FORMAT_UNDEFINED, it
-    must: be a format with <<potential-format-features, potential format
-    features>> that include
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkCommandBufferInheritanceRenderingInfoKHR-depthAttachmentFormat-06200]]
-    If pname:depthAttachmentFormat is not ename:VK_FORMAT_UNDEFINED and
-    pname:stencilAttachmentFormat is not ename:VK_FORMAT_UNDEFINED,
-    pname:depthAttachmentFormat must: equal pname:stencilAttachmentFormat
-  * [[VUID-VkCommandBufferInheritanceRenderingInfoKHR-multiview-06008]]
-    If the <<features-multiview,pname:multiview>> feature is not enabled,
-    pname:viewMask must: be `0`
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkCommandBufferInheritanceRenderingInfoKHR-viewMask-06009]]
-    The index of the most significant bit in pname:viewMask must: be less
-    than <<limits-maxMultiviewViewCount,pname:maxMultiviewViewCount>>
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-****
-
-include::{generated}/validity/structs/VkCommandBufferInheritanceRenderingInfoKHR.txt[]
---
-
-ifdef::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
-[open,refpage='VkAttachmentSampleCountInfoAMD',desc='Structure specifying command buffer inheritance info for dynamic render pass instances',type='structs',alias='VkAttachmentSampleCountInfoNV']
---
-
-The
-ifdef::VK_AMD_mixed_attachment_samples[sname:VkAttachmentSampleCountInfoAMD]
-ifdef::VK_AMD_mixed_attachment_samples+VK_NV_framebuffer_mixed_samples[or]
-ifdef::VK_NV_framebuffer_mixed_samples[sname:VkAttachmentSampleCountInfoNV]
-structure is defined as:
-
-ifdef::VK_AMD_mixed_attachment_samples[]
-include::{generated}/api/structs/VkAttachmentSampleCountInfoAMD.txt[]
-endif::VK_AMD_mixed_attachment_samples[]
-
-ifdef::VK_AMD_mixed_attachment_samples+VK_NV_framebuffer_mixed_samples[or the equivalent]
-
-ifdef::VK_NV_framebuffer_mixed_samples[]
-include::{generated}/api/structs/VkAttachmentSampleCountInfoNV.txt[]
-endif::VK_NV_framebuffer_mixed_samples[]
-
-  * pname:sType is the type of this structure
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure
-  * pname:colorAttachmentCount is the number of color attachments specified
-    in a render pass instance.
-  * pname:pColorAttachmentSamples is an array of elink:VkSampleCountFlagBits
-    values defining the sample count of color attachments.
-  * pname:depthStencilAttachmentSamples is a elink:VkSampleCountFlagBits
-    value defining the sample count of a depth/stencil attachment.
-
-If slink:VkCommandBufferInheritanceInfo::pname:renderPass is
-dlink:VK_NULL_HANDLE, ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
-is specified in slink:VkCommandBufferBeginInfo::pname:flags, and the
-pname:pNext chain of slink:VkCommandBufferInheritanceInfo includes
-sname:VkAttachmentSampleCountInfoAMD, then this structure defines the sample
-counts of each attachment within the render pass instance.
-If sname:VkAttachmentSampleCountInfoAMD is not included, the value of
-slink:VkCommandBufferInheritanceRenderingInfoKHR::pname:rasterizationSamples
-is used as the sample count for each attachment.
-If slink:VkCommandBufferInheritanceInfo::pname:renderPass is not
-dlink:VK_NULL_HANDLE, or
-ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT is not specified in
-slink:VkCommandBufferBeginInfo::pname:flags, parameters of this structure
-are ignored.
-
-sname:VkAttachmentSampleCountInfoAMD can: also be included in the
-pname:pNext chain of slink:VkGraphicsPipelineCreateInfo.
-When a graphics pipeline is created without a slink:VkRenderPass, if this
-structure is present in the pname:pNext chain of
-slink:VkGraphicsPipelineCreateInfo, it specifies the sample count of
-attachments used for rendering.
-If this structure is not specified, and the pipeline does not include a
-slink:VkRenderPass, the value of
-slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples is
-used as the sample count for each attachment.
-If a graphics pipeline is created with a valid slink:VkRenderPass,
-parameters of this structure are ignored.
-
-include::{generated}/validity/structs/VkAttachmentSampleCountInfoAMD.txt[]
---
-endif::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
-
-endif::VK_KHR_dynamic_rendering[]
-
-Once recording starts, an application records a sequence of commands
-(ftext:vkCmd*) to set state in the command buffer, draw, dispatch, and other
-commands.
-
-ifdef::VK_NV_device_generated_commands[]
-Several commands can also be recorded indirectly from sname:VkBuffer
-content, see <<device-generated-commands>>.
-endif::VK_NV_device_generated_commands[]
-
-[open,refpage='vkEndCommandBuffer',desc='Finish recording a command buffer',type='protos']
---
-To complete recording of a command buffer, call:
-
-include::{generated}/api/protos/vkEndCommandBuffer.txt[]
-
-  * pname:commandBuffer is the command buffer to complete recording.
-
-If there was an error during recording, the application will be notified by
-an unsuccessful return code returned by fname:vkEndCommandBuffer.
-If the application wishes to further use the command buffer, the command
-buffer must: be reset.
-
-The command buffer must: have been in the <<commandbuffers-lifecycle,
-recording state>>, and is moved to the <<commandbuffers-lifecycle,
-executable state>>.
-
-.Valid Usage
-****
-  * [[VUID-vkEndCommandBuffer-commandBuffer-00059]]
-    pname:commandBuffer must: be in the <<commandbuffers-lifecycle,
-    recording state>>
-  * [[VUID-vkEndCommandBuffer-commandBuffer-00060]]
-    If pname:commandBuffer is a primary command buffer, there must: not be
-    an active render pass instance
-  * [[VUID-vkEndCommandBuffer-commandBuffer-00061]]
-    All queries made <<queries-operation-active,active>> during the
-    recording of pname:commandBuffer must: have been made inactive
-ifdef::VK_EXT_conditional_rendering[]
-  * [[VUID-vkEndCommandBuffer-None-01978]]
-    Conditional rendering must: not be
-    <<active-conditional-rendering,active>>
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_debug_utils[]
-  * [[VUID-vkEndCommandBuffer-commandBuffer-01815]]
-    If pname:commandBuffer is a secondary command buffer, there must: not be
-    an outstanding flink:vkCmdBeginDebugUtilsLabelEXT command recorded to
-    pname:commandBuffer that has not previously been ended by a call to
-    flink:vkCmdEndDebugUtilsLabelEXT
-endif::VK_EXT_debug_utils[]
-ifdef::VK_EXT_debug_marker[]
-  * [[VUID-vkEndCommandBuffer-commandBuffer-00062]]
-    If pname:commandBuffer is a secondary command buffer, there must: not be
-    an outstanding flink:vkCmdDebugMarkerBeginEXT command recorded to
-    pname:commandBuffer that has not previously been ended by a call to
-    flink:vkCmdDebugMarkerEndEXT
-endif::VK_EXT_debug_marker[]
-****
-
-include::{generated}/validity/protos/vkEndCommandBuffer.txt[]
---
-
-When a command buffer is in the executable state, it can: be submitted to a
-queue for execution.
-
-
-[[commandbuffers-submission]]
-== Command Buffer Submission
-
-[NOTE]
-.Note
-====
-Submission can be a high overhead operation, and applications should:
-attempt to batch work together into as few calls to fname:vkQueueSubmit
-ifdef::VK_KHR_synchronization2[]
-or fname:vkQueueSubmit2KHR
-endif::VK_KHR_synchronization2[]
-as possible.
-====
-
-ifdef::VK_KHR_synchronization2[]
-[open,refpage='vkQueueSubmit2KHR',desc='Submits command buffers to a queue',type='protos']
---
-To submit command buffers to a queue, call:
-
-include::{generated}/api/protos/vkQueueSubmit2KHR.txt[]
-
-  * pname:queue is the queue that the command buffers will be submitted to.
-  * pname:submitCount is the number of elements in the pname:pSubmits array.
-  * pname:pSubmits is a pointer to an array of slink:VkSubmitInfo2KHR
-    structures, each specifying a command buffer submission batch.
-  * pname:fence is an optional: handle to a fence to be signaled once all
-    submitted command buffers have completed execution.
-    If pname:fence is not dlink:VK_NULL_HANDLE, it defines a
-    <<synchronization-fences-signaling, fence signal operation>>.
-
-fname:vkQueueSubmit2KHR is a <<devsandqueues-submission,queue submission
-command>>, with each batch defined by an element of pname:pSubmits.
-
-Semaphore operations submitted with flink:vkQueueSubmit2KHR have additional
-ordering constraints compared to other submission commands, with
-dependencies involving previous and subsequent queue operations.
-Information about these additional constraints can be found in the
-<<synchronization-semaphores, semaphore>> section of <<synchronization, the
-synchronization chapter>>.
-
-If any command buffer submitted to this queue is in the
-<<commandbuffers-lifecycle, executable state>>, it is moved to the
-<<commandbuffers-lifecycle, pending state>>.
-Once execution of all submissions of a command buffer complete, it moves
-from the <<commandbuffers-lifecycle, pending state>>, back to the
-<<commandbuffers-lifecycle, executable state>>.
-If a command buffer was recorded with the
-ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT flag, it instead moves
-back to the <<commandbuffers-lifecycle, invalid state>>.
-
-If fname:vkQueueSubmit2KHR fails, it may: return
-ename:VK_ERROR_OUT_OF_HOST_MEMORY or ename:VK_ERROR_OUT_OF_DEVICE_MEMORY.
-If it does, the implementation must: ensure that the state and contents of
-any resources or synchronization primitives referenced by the submitted
-command buffers and any semaphores referenced by pname:pSubmits is
-unaffected by the call or its failure.
-If fname:vkQueueSubmit2KHR fails in such a way that the implementation is
-unable to make that guarantee, the implementation must: return
-ename:VK_ERROR_DEVICE_LOST.
-See <<devsandqueues-lost-device,Lost Device>>.
-
-.Valid Usage
-****
-  * [[VUID-vkQueueSubmit2KHR-fence-04894]]
-    If pname:fence is not dlink:VK_NULL_HANDLE, pname:fence must: be
-    unsignaled
-  * [[VUID-vkQueueSubmit2KHR-fence-04895]]
-    If pname:fence is not dlink:VK_NULL_HANDLE, pname:fence must: not be
-    associated with any other queue command that has not yet completed
-    execution on that queue
-  * [[VUID-vkQueueSubmit2KHR-synchronization2-03866]]
-    The <<features-synchronization2, pname:synchronization2>> feature must:
-    be enabled
-  * [[VUID-vkQueueSubmit2KHR-commandBuffer-03867]]
-    If a command recorded into the pname:commandBuffer member of any element
-    of the pname:pCommandBufferInfos member of any element of pname:pSubmits
-    referenced an slink:VkEvent, that event must: not be referenced by a
-    command that has been submitted to another queue and is still in the
-    _pending state_
-  * [[VUID-vkQueueSubmit2KHR-semaphore-03868]]
-    The pname:semaphore member of any binary semaphore element of the
-    pname:pSignalSemaphoreInfos member of any element of pname:pSubmits
-    must: be unsignaled when the semaphore signal operation it defines is
-    executed on the device
-  * [[VUID-vkQueueSubmit2KHR-stageMask-03869]]
-    The pname:stageMask member of any element of the
-    pname:pSignalSemaphoreInfos member of any element of pname:pSubmits
-    must: only include pipeline stages that are supported by the queue
-    family which pname:queue belongs to
-  * [[VUID-vkQueueSubmit2KHR-stageMask-03870]]
-    The pname:stageMask member of any element of the
-    pname:pWaitSemaphoreInfos member of any element of pname:pSubmits must:
-    only include pipeline stages that are supported by the queue family
-    which pname:queue belongs to
-  * [[VUID-vkQueueSubmit2KHR-semaphore-03871]]
-    When a semaphore wait operation for a binary semaphore is executed, as
-    defined by the pname:semaphore member of any element of the
-    pname:pWaitSemaphoreInfos member of any element of pname:pSubmits, there
-    must: be no other queues waiting on the same semaphore
-  * [[VUID-vkQueueSubmit2KHR-semaphore-03872]]
-    The pname:semaphore member of any element of the
-    pname:pWaitSemaphoreInfos member of any element of pname:pSubmits must:
-    be semaphores that are signaled, or have
-    <<synchronization-semaphores-signaling, semaphore signal operations>>
-    previously submitted for execution
-ifdef::VK_KHR_timeline_semaphore[]
-  * [[VUID-vkQueueSubmit2KHR-semaphore-03873]]
-    Any pname:semaphore member of any element of the
-    pname:pWaitSemaphoreInfos member of any element of pname:pSubmits that
-    was created with a elink:VkSemaphoreTypeKHR of
-    ename:VK_SEMAPHORE_TYPE_BINARY_KHR must: reference a semaphore signal
-    operation that has been submitted for execution and any semaphore signal
-    operations on which it depends (if any) must: have also been submitted
-    for execution
-endif::VK_KHR_timeline_semaphore[]
-  * [[VUID-vkQueueSubmit2KHR-commandBuffer-03874]]
-    The pname:commandBuffer member of any element of the
-    pname:pCommandBufferInfos member of any element of pname:pSubmits must:
-    be in the <<commandbuffers-lifecycle, pending or executable state>>
-  * [[VUID-vkQueueSubmit2KHR-commandBuffer-03875]]
-    If a command recorded into the pname:commandBuffer member of any element
-    of the pname:pCommandBufferInfos member of any element of pname:pSubmits
-    was not recorded with the
-    ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, it must: not be in
-    the <<commandbuffers-lifecycle, pending state>>
-  * [[VUID-vkQueueSubmit2KHR-commandBuffer-03876]]
-    Any <<commandbuffers-secondary, secondary command buffers recorded>>
-    into the pname:commandBuffer member of any element of the
-    pname:pCommandBufferInfos member of any element of pname:pSubmits must:
-    be in the <<commandbuffers-lifecycle, pending or executable state>>
-  * [[VUID-vkQueueSubmit2KHR-commandBuffer-03877]]
-    If any <<commandbuffers-secondary, secondary command buffers recorded>>
-    into the pname:commandBuffer member of any element of the
-    pname:pCommandBufferInfos member of any element of pname:pSubmits was
-    not recorded with the
-    ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, it must: not be in
-    the <<commandbuffers-lifecycle, pending state>>
-  * [[VUID-vkQueueSubmit2KHR-commandBuffer-03878]]
-    The pname:commandBuffer member of any element of the
-    pname:pCommandBufferInfos member of any element of pname:pSubmits must:
-    have been allocated from a sname:VkCommandPool that was created for the
-    same queue family pname:queue belongs to
-  * [[VUID-vkQueueSubmit2KHR-commandBuffer-03879]]
-    If a command recorded into the pname:commandBuffer member of any element
-    of the pname:pCommandBufferInfos member of any element of pname:pSubmits
-    includes a <<synchronization-queue-transfers-acquire, Queue Family
-    Transfer Acquire Operation>>, there must: exist a previously submitted
-    <<synchronization-queue-transfers-release, Queue Family Transfer Release
-    Operation>> on a queue in the queue family identified by the acquire
-    operation, with parameters matching the acquire operation as defined in
-    the definition of such <<synchronization-queue-transfers-acquire,
-    acquire operations>>, and which happens before the acquire operation
-ifdef::VK_KHR_performance_query[]
-  * [[VUID-vkQueueSubmit2KHR-commandBuffer-03880]]
-    If a command recorded into the pname:commandBuffer member of any element
-    of the pname:pCommandBufferInfos member of any element of pname:pSubmits
-    was a flink:vkCmdBeginQuery whose pname:queryPool was created with a
-    pname:queryType of ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the
-    <<profiling-lock, profiling lock>> must: have been held continuously on
-    the sname:VkDevice that pname:queue was retrieved from, throughout
-    recording of those command buffers
-endif::VK_KHR_performance_query[]
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-vkQueueSubmit2KHR-queue-06447]]
-    If pname:queue was not created with
-    ename:VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT, the pname:flags member of
-    any element of pname:pSubmits must: not include
-    ename:VK_SUBMIT_PROTECTED_BIT_KHR
-endif::VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/protos/vkQueueSubmit2KHR.txt[]
---
-
-[open,refpage='VkSubmitInfo2KHR',desc='Structure specifying a queue submit operation',type='structs']
---
-The sname:VkSubmitInfo2KHR structure is defined as:
-
-include::{generated}/api/structs/VkSubmitInfo2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkSubmitFlagBitsKHR.
-  * pname:waitSemaphoreInfoCount is the number of elements in
-    pname:pWaitSemaphoreInfos.
-  * pname:pWaitSemaphoreInfos is a pointer to an array of
-    slink:VkSemaphoreSubmitInfoKHR structures defining
-    <<synchronization-semaphores-waiting, semaphore wait operations>>.
-  * pname:commandBufferInfoCount is the number of elements in
-    pname:pCommandBufferInfos and the number of command buffers to execute
-    in the batch.
-  * pname:pCommandBufferInfos is a pointer to an array of
-    slink:VkCommandBufferSubmitInfoKHR structures describing command buffers
-    to execute in the batch.
-  * pname:signalSemaphoreInfoCount is the number of elements in
-    pname:pSignalSemaphoreInfos.
-  * pname:pSignalSemaphoreInfos is a pointer to an array of
-    slink:VkSemaphoreSubmitInfoKHR describing
-    <<synchronization-semaphores-signaling, semaphore signal operations>>.
-
-.Valid Usage
-****
-ifdef::VK_KHR_timeline_semaphore[]
-  * [[VUID-VkSubmitInfo2KHR-semaphore-03881]]
-    If the same semaphore is used as the pname:semaphore member of both an
-    element of pname:pSignalSemaphoreInfos and pname:pWaitSemaphoreInfos,
-    and that semaphore is a timeline semaphore, the pname:value member of
-    the pname:pSignalSemaphoreInfos element must: be greater than the
-    pname:value member of the pname:pWaitSemaphoreInfos element
-  * [[VUID-VkSubmitInfo2KHR-semaphore-03882]]
-    If the pname:semaphore member of any element of
-    pname:pSignalSemaphoreInfos is a timeline semaphore, the pname:value
-    member of that element must: have a value greater than the current value
-    of the semaphore when the <<synchronization-semaphores-signaling,
-    semaphore signal operation>> is executed
-  * [[VUID-VkSubmitInfo2KHR-semaphore-03883]]
-    If the pname:semaphore member of any element of
-    pname:pSignalSemaphoreInfos is a timeline semaphore, the pname:value
-    member of that element must: have a value which does not differ from the
-    current value of the semaphore or the value of any outstanding semaphore
-    wait or signal operation on that semaphore by more than
-    <<limits-maxTimelineSemaphoreValueDifference,
-    pname:maxTimelineSemaphoreValueDifference>>
-  * [[VUID-VkSubmitInfo2KHR-semaphore-03884]]
-    If the pname:semaphore member of any element of
-    pname:pWaitSemaphoreInfos is a timeline semaphore, the pname:value
-    member of that element must: have a value which does not differ from the
-    current value of the semaphore or the value of any outstanding semaphore
-    wait or signal operation on that semaphore by more than
-    <<limits-maxTimelineSemaphoreValueDifference,
-    pname:maxTimelineSemaphoreValueDifference>>
-endif::VK_KHR_timeline_semaphore[]
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-VkSubmitInfo2KHR-flags-03886]]
-    If pname:flags includes ename:VK_SUBMIT_PROTECTED_BIT_KHR, all elements
-    of pname:pCommandBuffers must: be protected command buffers
-  * [[VUID-VkSubmitInfo2KHR-flags-03887]]
-    If pname:flags does not include ename:VK_SUBMIT_PROTECTED_BIT_KHR, each
-    element of pname:pCommandBuffers must: not be a protected command buffer
-endif::VK_VERSION_1_1[]
-ifdef::VK_KHR_dynamic_rendering[]
-  * [[VUID-VkSubmitInfo2KHR-commandBuffer-06192]]
-    If any pname:commandBuffer member of an element of
-    pname:pCommandBufferInfos contains any <<renderpass-suspension,resumed
-    render pass instances>>, they must: be suspended by a render pass
-    instance earlier in submission order within pname:pCommandBufferInfos
-  * [[VUID-VkSubmitInfo2KHR-commandBuffer-06010]]
-    If any pname:commandBuffer member of an element of
-    pname:pCommandBufferInfos contains any <<renderpass-suspension,suspended
-    render pass instances>>, they must: be resumed by a render pass instance
-    later in submission order within pname:pCommandBufferInfos
-  * [[VUID-VkSubmitInfo2KHR-commandBuffer-06011]]
-    If any pname:commandBuffer member of an element of
-    pname:pCommandBufferInfos contains any <<renderpass-suspension,suspended
-    render pass instances>>, there must: be no action or synchronization
-    commands between that render pass instance and the render pass instance
-    that resumes it
-  * [[VUID-VkSubmitInfo2KHR-commandBuffer-06012]]
-    If any pname:commandBuffer member of an element of
-    pname:pCommandBufferInfos contains any <<renderpass-suspension,suspended
-    render pass instances>>, there must: be no render pass instances between
-    that render pass instance and the render pass instance that resumes it
-ifdef::VK_EXT_sample_locations[]
-  * [[VUID-VkSubmitInfo2KHR-variableSampleLocations-06013]]
-    If the <<limits-variableSampleLocations, pname:variableSampleLocations>>
-    limit is not supported, and any pname:commandBuffer member of an element
-    of pname:pCommandBufferInfos contains any
-    <<renderpass-suspension,suspended render pass instances>>, where a
-    graphics pipeline has been bound, any pipelines bound in the render pass
-    instance that resumes it, or any subsequent render pass instances that
-    resume from that one and so on, must: use the same sample locations
-endif::VK_EXT_sample_locations[]
-endif::VK_KHR_dynamic_rendering[]
-****
-
-include::{generated}/validity/structs/VkSubmitInfo2KHR.txt[]
---
-
-[open,refpage='VkSubmitFlagBitsKHR',desc='Bitmask specifying behavior of a submission',type='enums']
---
-Bits which can: be set in slink:VkSubmitInfo2KHR::pname:flags to specify
-submission behavior are:
-
-include::{generated}/api/enums/VkSubmitFlagBitsKHR.txt[]
-
-  * ename:VK_SUBMIT_PROTECTED_BIT_KHR specifies that this batch is a
-    protected submission.
---
-
-[open,refpage='VkSubmitFlagsKHR',desc='Bitmask of VkSubmitFlagBitsKHR',type='flags']
---
-include::{generated}/api/flags/VkSubmitFlagsKHR.txt[]
-
-tname:VkSubmitFlagsKHR is a bitmask type for setting a mask of zero or more
-elink:VkSubmitFlagBitsKHR.
---
-
-[open,refpage='VkSemaphoreSubmitInfoKHR',desc='Structure specifying a semaphore signal or wait operation',type='structs']
---
-:refpage: VkSemaphoreSubmitInfoKHR
-
-The sname:VkSemaphoreSubmitInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkSemaphoreSubmitInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:semaphore is a slink:VkSemaphore affected by this operation.
-  * pname:value is
-ifdef::VK_KHR_timeline_semaphore[]
-    either the value used to signal pname:semaphore or the value waited on
-    by pname:semaphore, if pname:semaphore is a timeline semaphore.
-    Otherwise it is
-endif::VK_KHR_timeline_semaphore[]
-    ignored.
-  * pname:stageMask is a tlink:VkPipelineStageFlags2KHR mask of pipeline
-    stages which limit the first synchronization scope of a semaphore signal
-    operation, or second synchronization scope of a semaphore wait operation
-    as described in the <<synchronization-semaphores-waiting, semaphore wait
-    operation>> and <<synchronization-semaphores-signaling, semaphore signal
-    operation>> sections of <<synchronization, the synchronization
-    chapter>>.
-  * pname:deviceIndex is the index of the device within a device group that
-    executes the semaphore wait or signal operation.
-
-Whether this structure defines a semaphore wait or signal operation is
-defined by how it is used.
-
-.Valid Usage
-****
-:stageMaskName: stageMask
-include::{chapters}/commonvalidity/stage_mask_2_common.txt[]
-  * [[VUID-VkSemaphoreSubmitInfoKHR-device-03888]]
-    If the pname:device that pname:semaphore was created on is not a device
-    group, pname:deviceIndex must: be `0`
-ifdef::VK_KHR_device_group_creation,VK_VERSION_1_1[]
-  * [[VUID-VkSemaphoreSubmitInfoKHR-device-03889]]
-    If the pname:device that pname:semaphore was created on is a device
-    group, pname:deviceIndex must: be a valid device index
-endif::VK_KHR_device_group_creation,VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/structs/VkSemaphoreSubmitInfoKHR.txt[]
---
-
-[open,refpage='VkCommandBufferSubmitInfoKHR',desc='Structure specifying a command buffer submission',type='structs']
---
-The sname:VkCommandBufferSubmitInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkCommandBufferSubmitInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:commandBuffer is a slink:VkCommandBuffer to be submitted for
-    execution.
-  * pname:deviceMask is a bitmask indicating which devices in a device group
-    execute the command buffer.
-    A pname:deviceMask of `0` is equivalent to setting all bits
-    corresponding to valid devices in the group to `1`.
-
-.Valid Usage
-****
-  * [[VUID-VkCommandBufferSubmitInfoKHR-commandBuffer-03890]]
-    pname:commandBuffer must: not have been allocated with
-    ename:VK_COMMAND_BUFFER_LEVEL_SECONDARY
-ifdef::VK_KHR_device_group_creation,VK_VERSION_1_1[]
-  * [[VUID-VkCommandBufferSubmitInfoKHR-deviceMask-03891]]
-    If pname:deviceMask is not `0`, it must: be a valid device mask
-endif::VK_KHR_device_group_creation,VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/structs/VkCommandBufferSubmitInfoKHR.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='vkQueueSubmit',desc='Submits a sequence of semaphores or command buffers to a queue',type='protos']
---
-To submit command buffers to a queue, call:
-
-include::{generated}/api/protos/vkQueueSubmit.txt[]
-
-  * pname:queue is the queue that the command buffers will be submitted to.
-  * pname:submitCount is the number of elements in the pname:pSubmits array.
-  * pname:pSubmits is a pointer to an array of slink:VkSubmitInfo
-    structures, each specifying a command buffer submission batch.
-  * pname:fence is an optional: handle to a fence to be signaled once all
-    submitted command buffers have completed execution.
-    If pname:fence is not dlink:VK_NULL_HANDLE, it defines a
-    <<synchronization-fences-signaling, fence signal operation>>.
-
-fname:vkQueueSubmit is a <<devsandqueues-submission,queue submission
-command>>, with each batch defined by an element of pname:pSubmits.
-Batches begin execution in the order they appear in pname:pSubmits, but may:
-complete out of order.
-
-Fence and semaphore operations submitted with flink:vkQueueSubmit have
-additional ordering constraints compared to other submission commands, with
-dependencies involving previous and subsequent queue operations.
-Information about these additional constraints can be found in the
-<<synchronization-semaphores, semaphore>> and <<synchronization-fences,
-fence>> sections of <<synchronization, the synchronization chapter>>.
-
-Details on the interaction of pname:pWaitDstStageMask with synchronization
-are described in the <<synchronization-semaphores-waiting, semaphore wait
-operation>> section of <<synchronization, the synchronization chapter>>.
-
-The order that batches appear in pname:pSubmits is used to determine
-<<synchronization-submission-order, submission order>>, and thus all the
-<<synchronization-implicit, implicit ordering guarantees>> that respect it.
-Other than these implicit ordering guarantees and any <<synchronization,
-explicit synchronization primitives>>, these batches may: overlap or
-otherwise execute out of order.
-
-If any command buffer submitted to this queue is in the
-<<commandbuffers-lifecycle, executable state>>, it is moved to the
-<<commandbuffers-lifecycle, pending state>>.
-Once execution of all submissions of a command buffer complete, it moves
-from the <<commandbuffers-lifecycle, pending state>>, back to the
-<<commandbuffers-lifecycle, executable state>>.
-If a command buffer was recorded with the
-ename:VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT flag, it instead moves to
-the <<commandbuffers-lifecycle, invalid state>>.
-
-If fname:vkQueueSubmit fails, it may: return
-ename:VK_ERROR_OUT_OF_HOST_MEMORY or ename:VK_ERROR_OUT_OF_DEVICE_MEMORY.
-If it does, the implementation must: ensure that the state and contents of
-any resources or synchronization primitives referenced by the submitted
-command buffers and any semaphores referenced by pname:pSubmits is
-unaffected by the call or its failure.
-If fname:vkQueueSubmit fails in such a way that the implementation is unable
-to make that guarantee, the implementation must: return
-ename:VK_ERROR_DEVICE_LOST.
-See <<devsandqueues-lost-device,Lost Device>>.
-
-.Valid Usage
-****
-  * [[VUID-vkQueueSubmit-fence-00063]]
-    If pname:fence is not dlink:VK_NULL_HANDLE, pname:fence must: be
-    unsignaled
-  * [[VUID-vkQueueSubmit-fence-00064]]
-    If pname:fence is not dlink:VK_NULL_HANDLE, pname:fence must: not be
-    associated with any other queue command that has not yet completed
-    execution on that queue
-  * [[VUID-vkQueueSubmit-pCommandBuffers-00065]]
-    Any calls to flink:vkCmdSetEvent, flink:vkCmdResetEvent or
-    flink:vkCmdWaitEvents that have been recorded into any of the command
-    buffer elements of the pname:pCommandBuffers member of any element of
-    pname:pSubmits, must: not reference any slink:VkEvent that is referenced
-    by any of those commands in a command buffer that has been submitted to
-    another queue and is still in the _pending state_
-  * [[VUID-vkQueueSubmit-pWaitDstStageMask-00066]]
-    Any stage flag included in any element of the pname:pWaitDstStageMask
-    member of any element of pname:pSubmits must: be a pipeline stage
-    supported by one of the capabilities of pname:queue, as specified in the
-    <<synchronization-pipeline-stages-supported, table of supported pipeline
-    stages>>
-  * [[VUID-vkQueueSubmit-pSignalSemaphores-00067]]
-    Each binary semaphore element of the pname:pSignalSemaphores member of
-    any element of pname:pSubmits must: be unsignaled when the semaphore
-    signal operation it defines is executed on the device
-  * [[VUID-vkQueueSubmit-pWaitSemaphores-00068]]
-    When a semaphore wait operation referring to a binary semaphore defined
-    by any element of the pname:pWaitSemaphores member of any element of
-    pname:pSubmits executes on pname:queue, there must: be no other queues
-    waiting on the same semaphore
-ifndef::VK_KHR_timeline_semaphore[]
-  * [[VUID-vkQueueSubmit-pWaitSemaphores-00069]]
-    All elements of the pname:pWaitSemaphores member of all elements of
-    pname:pSubmits must: be semaphores that are signaled, or have
-    <<synchronization-semaphores-signaling, semaphore signal operations>>
-    previously submitted for execution
-endif::VK_KHR_timeline_semaphore[]
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-  * [[VUID-vkQueueSubmit-pWaitSemaphores-03238]]
-    All elements of the pname:pWaitSemaphores member of all elements of
-    pname:pSubmits created with a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_BINARY must: reference a semaphore signal
-    operation that has been submitted for execution and any semaphore signal
-    operations on which it depends (if any) must: have also been submitted
-    for execution
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-  * [[VUID-vkQueueSubmit-pCommandBuffers-00070]]
-    Each element of the pname:pCommandBuffers member of each element of
-    pname:pSubmits must: be in the <<commandbuffers-lifecycle, pending or
-    executable state>>
-  * [[VUID-vkQueueSubmit-pCommandBuffers-00071]]
-    If any element of the pname:pCommandBuffers member of any element of
-    pname:pSubmits was not recorded with the
-    ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, it must: not be in
-    the <<commandbuffers-lifecycle, pending state>>
-  * [[VUID-vkQueueSubmit-pCommandBuffers-00072]]
-    Any <<commandbuffers-secondary, secondary command buffers recorded>>
-    into any element of the pname:pCommandBuffers member of any element of
-    pname:pSubmits must: be in the <<commandbuffers-lifecycle, pending or
-    executable state>>
-  * [[VUID-vkQueueSubmit-pCommandBuffers-00073]]
-    If any <<commandbuffers-secondary, secondary command buffers recorded>>
-    into any element of the pname:pCommandBuffers member of any element of
-    pname:pSubmits was not recorded with the
-    ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, it must: not be in
-    the <<commandbuffers-lifecycle, pending state>>
-  * [[VUID-vkQueueSubmit-pCommandBuffers-00074]]
-    Each element of the pname:pCommandBuffers member of each element of
-    pname:pSubmits must: have been allocated from a sname:VkCommandPool that
-    was created for the same queue family pname:queue belongs to
-  * [[VUID-vkQueueSubmit-pSubmits-02207]]
-    If any element of pname:pSubmits->pCommandBuffers includes a
-    <<synchronization-queue-transfers-acquire, Queue Family Transfer Acquire
-    Operation>>, there must: exist a previously submitted
-    <<synchronization-queue-transfers-release, Queue Family Transfer Release
-    Operation>> on a queue in the queue family identified by the acquire
-    operation, with parameters matching the acquire operation as defined in
-    the definition of such <<synchronization-queue-transfers-acquire,
-    acquire operations>>, and which happens-before the acquire operation
-ifdef::VK_KHR_performance_query[]
-  * [[VUID-vkQueueSubmit-pCommandBuffers-03220]]
-    If a command recorded into any element of pname:pCommandBuffers was a
-    flink:vkCmdBeginQuery whose pname:queryPool was created with a
-    pname:queryType of ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the
-    <<profiling-lock, profiling lock>> must: have been held continuously on
-    the sname:VkDevice that pname:queue was retrieved from, throughout
-    recording of those command buffers
-endif::VK_KHR_performance_query[]
-  * [[VUID-vkQueueSubmit-pSubmits-02808]]
-    Any resource created with ename:VK_SHARING_MODE_EXCLUSIVE that is read
-    by an operation specified by pname:pSubmits must: not be owned by any
-    queue family other than the one which pname:queue belongs to, at the
-    time it is executed
-  * [[VUID-vkQueueSubmit-pSubmits-04626]]
-    Any resource created with ename:VK_SHARING_MODE_CONCURRENT that is
-    accessed by an operation specified by pname:pSubmits must: have included
-    the queue family of pname:queue at resource creation time
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-vkQueueSubmit-queue-06448]]
-    If pname:queue was not created with
-    ename:VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT, there must: be no element of
-    pname:pSubmits that includes an slink:VkProtectedSubmitInfo structure in
-    its pname:pNext chain with pname:protectedSubmit equal to ename:VK_TRUE
-endif::VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/protos/vkQueueSubmit.txt[]
---
-
-[open,refpage='VkSubmitInfo',desc='Structure specifying a queue submit operation',type='structs']
---
-The sname:VkSubmitInfo structure is defined as:
-
-include::{generated}/api/structs/VkSubmitInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:waitSemaphoreCount is the number of semaphores upon which to wait
-    before executing the command buffers for the batch.
-  * pname:pWaitSemaphores is a pointer to an array of slink:VkSemaphore
-    handles upon which to wait before the command buffers for this batch
-    begin execution.
-    If semaphores to wait on are provided, they define a
-    <<synchronization-semaphores-waiting, semaphore wait operation>>.
-  * pname:pWaitDstStageMask is a pointer to an array of pipeline stages at
-    which each corresponding semaphore wait will occur.
-  * pname:commandBufferCount is the number of command buffers to execute in
-    the batch.
-  * pname:pCommandBuffers is a pointer to an array of slink:VkCommandBuffer
-    handles to execute in the batch.
-  * pname:signalSemaphoreCount is the number of semaphores to be signaled
-    once the commands specified in pname:pCommandBuffers have completed
-    execution.
-  * pname:pSignalSemaphores is a pointer to an array of slink:VkSemaphore
-    handles which will be signaled when the command buffers for this batch
-    have completed execution.
-    If semaphores to be signaled are provided, they define a
-    <<synchronization-semaphores-signaling, semaphore signal operation>>.
-
-The order that command buffers appear in pname:pCommandBuffers is used to
-determine <<synchronization-submission-order, submission order>>, and thus
-all the <<synchronization-implicit, implicit ordering guarantees>> that
-respect it.
-Other than these implicit ordering guarantees and any <<synchronization,
-explicit synchronization primitives>>, these command buffers may: overlap or
-otherwise execute out of order.
-
-
-.Valid Usage
-****
-  * [[VUID-VkSubmitInfo-pCommandBuffers-00075]]
-    Each element of pname:pCommandBuffers must: not have been allocated with
-    ename:VK_COMMAND_BUFFER_LEVEL_SECONDARY
-  * [[VUID-VkSubmitInfo-pWaitDstStageMask-00076]]
-    If the <<features-geometryShader,geometry shaders>> feature is not
-    enabled, each element of pname:pWaitDstStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
-  * [[VUID-VkSubmitInfo-pWaitDstStageMask-00077]]
-    If the <<features-tessellationShader,tessellation shaders>> feature is
-    not enabled, each element of pname:pWaitDstStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or
-    ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
-  * [[VUID-VkSubmitInfo-pWaitDstStageMask-00078]]
-    Each element of pname:pWaitDstStageMask must: not include
-    ename:VK_PIPELINE_STAGE_HOST_BIT
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-  * [[VUID-VkSubmitInfo-pWaitSemaphores-03239]]
-    If any element of pname:pWaitSemaphores or pname:pSignalSemaphores was
-    created with a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_TIMELINE, then the pname:pNext chain must:
-    include a slink:VkTimelineSemaphoreSubmitInfo structure
-  * [[VUID-VkSubmitInfo-pNext-03240]]
-    If the pname:pNext chain of this structure includes a
-    slink:VkTimelineSemaphoreSubmitInfo structure and any element of
-    pname:pWaitSemaphores was created with a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_TIMELINE, then its pname:waitSemaphoreValueCount
-    member must: equal pname:waitSemaphoreCount
-  * [[VUID-VkSubmitInfo-pNext-03241]]
-    If the pname:pNext chain of this structure includes a
-    slink:VkTimelineSemaphoreSubmitInfo structure and any element of
-    pname:pSignalSemaphores was created with a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_TIMELINE, then its
-    pname:signalSemaphoreValueCount member must: equal
-    pname:signalSemaphoreCount
-  * [[VUID-VkSubmitInfo-pSignalSemaphores-03242]]
-    For each element of pname:pSignalSemaphores created with a
-    elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE the
-    corresponding element of
-    slink:VkTimelineSemaphoreSubmitInfo::pname:pSignalSemaphoreValues must:
-    have a value greater than the current value of the semaphore when the
-    <<synchronization-semaphores-signaling,semaphore signal operation>> is
-    executed
-  * [[VUID-VkSubmitInfo-pWaitSemaphores-03243]]
-    For each element of pname:pWaitSemaphores created with a
-    elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE the
-    corresponding element of
-    slink:VkTimelineSemaphoreSubmitInfo::pname:pWaitSemaphoreValues must:
-    have a value which does not differ from the current value of the
-    semaphore or the value of any outstanding semaphore wait or signal
-    operation on that semaphore by more than
-    <<limits-maxTimelineSemaphoreValueDifference,
-    pname:maxTimelineSemaphoreValueDifference>>
-  * [[VUID-VkSubmitInfo-pSignalSemaphores-03244]]
-    For each element of pname:pSignalSemaphores created with a
-    elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE the
-    corresponding element of
-    slink:VkTimelineSemaphoreSubmitInfo::pname:pSignalSemaphoreValues must:
-    have a value which does not differ from the current value of the
-    semaphore or the value of any outstanding semaphore wait or signal
-    operation on that semaphore by more than
-    <<limits-maxTimelineSemaphoreValueDifference,
-    pname:maxTimelineSemaphoreValueDifference>>
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-ifdef::VK_NV_mesh_shader[]
-  * [[VUID-VkSubmitInfo-pWaitDstStageMask-02089]]
-    If the <<features-meshShader,mesh shaders>> feature is not enabled, each
-    element of pname:pWaitDstStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV
-  * [[VUID-VkSubmitInfo-pWaitDstStageMask-02090]]
-    If the <<features-taskShader,task shaders>> feature is not enabled, each
-    element of pname:pWaitDstStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV
-endif::VK_NV_mesh_shader[]
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-VkSubmitInfo-pNext-04120]]
-    If the pname:pNext chain of this structure does not include a
-    sname:VkProtectedSubmitInfo structure with pname:protectedSubmit set to
-    ename:VK_TRUE, then each element of the pname:pCommandBuffers array
-    must: be an unprotected command buffer
-  * [[VUID-VkSubmitInfo-pNext-04148]]
-    If the pname:pNext chain of this structure includes a
-    sname:VkProtectedSubmitInfo structure with pname:protectedSubmit set to
-    ename:VK_TRUE, then each element of the pname:pCommandBuffers array
-    must: be a protected command buffer
-endif::VK_VERSION_1_1[]
-ifdef::VK_KHR_dynamic_rendering[]
-  * [[VUID-VkSubmitInfo-pCommandBuffers-06193]]
-    If pname:pCommandBuffers contains any <<renderpass-suspension,resumed
-    render pass instances>>, they must: be suspended by a render pass
-    instance earlier in submission order within pname:pCommandBuffers
-  * [[VUID-VkSubmitInfo-pCommandBuffers-06014]]
-    If pname:pCommandBuffers contains any <<renderpass-suspension,suspended
-    render pass instances>>, they must: be resumed by a render pass instance
-    later in submission order within pname:pCommandBuffers
-  * [[VUID-VkSubmitInfo-pCommandBuffers-06015]]
-    If pname:pCommandBuffers contains any <<renderpass-suspension,suspended
-    render pass instances>>, there must: be no action or synchronization
-    commands between that render pass instance and the render pass instance
-    that resumes it
-  * [[VUID-VkSubmitInfo-pCommandBuffers-06016]]
-    If pname:pCommandBuffers contains any <<renderpass-suspension,suspended
-    render pass instances>>, there must: be no render pass instances between
-    that render pass instance and the render pass instance that resumes it
-ifdef::VK_EXT_sample_locations[]
-  * [[VUID-VkSubmitInfo-variableSampleLocations-06017]]
-    If the <<limits-variableSampleLocations, pname:variableSampleLocations>>
-    limit is not supported, and any element of pname:pCommandBuffers
-    contains any <<renderpass-suspension,suspended render pass instances>>,
-    where a graphics pipeline has been bound, any pipelines bound in the
-    render pass instance that resumes it, or any subsequent render pass
-    instances that resume from that one and so on, must: use the same sample
-    locations
-endif::VK_EXT_sample_locations[]
-endif::VK_KHR_dynamic_rendering[]
-****
-
-include::{generated}/validity/structs/VkSubmitInfo.txt[]
---
-
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-[open,refpage='VkTimelineSemaphoreSubmitInfo',desc='Structure specifying signal and wait values for timeline semaphores',type='structs',alias='VkTimelineSemaphoreSubmitInfoKHR']
---
-To specify the values to use when waiting for and signaling semaphores
-created with a elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE,
-add a slink:VkTimelineSemaphoreSubmitInfo structure to the pname:pNext chain
-of the slink:VkSubmitInfo structure when using flink:vkQueueSubmit or the
-slink:VkBindSparseInfo structure when using flink:vkQueueBindSparse.
-The sname:VkTimelineSemaphoreSubmitInfo structure is defined as:
-
-include::{generated}/api/structs/VkTimelineSemaphoreSubmitInfo.txt[]
-
-ifdef::VK_KHR_timeline_semaphore[]
-or the equivalent
-
-include::{generated}/api/structs/VkTimelineSemaphoreSubmitInfoKHR.txt[]
-endif::VK_KHR_timeline_semaphore[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:waitSemaphoreValueCount is the number of semaphore wait values
-    specified in pname:pWaitSemaphoreValues.
-  * pname:pWaitSemaphoreValues is a pointer to an array of
-    pname:waitSemaphoreValueCount values for the corresponding semaphores in
-    slink:VkSubmitInfo::pname:pWaitSemaphores to wait for.
-  * pname:signalSemaphoreValueCount is the number of semaphore signal values
-    specified in pname:pSignalSemaphoreValues.
-  * pname:pSignalSemaphoreValues is a pointer to an array
-    pname:signalSemaphoreValueCount values for the corresponding semaphores
-    in slink:VkSubmitInfo::pname:pSignalSemaphores to set when signaled.
-
-If the semaphore in slink:VkSubmitInfo::pname:pWaitSemaphores or
-slink:VkSubmitInfo::pname:pSignalSemaphores corresponding to an entry in
-pname:pWaitSemaphoreValues or pname:pSignalSemaphoreValues respectively was
-not created with a elink:VkSemaphoreType of
-ename:VK_SEMAPHORE_TYPE_TIMELINE, the implementation must: ignore the value
-in the pname:pWaitSemaphoreValues or pname:pSignalSemaphoreValues entry.
-
-include::{generated}/validity/structs/VkTimelineSemaphoreSubmitInfo.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-ifdef::VK_KHR_external_semaphore_win32[]
-[open,refpage='VkD3D12FenceSubmitInfoKHR',desc='Structure specifying values for Direct3D 12 fence-backed semaphores',type='structs']
---
-To specify the values to use when waiting for and signaling semaphores whose
-<<synchronization-semaphores-importing,current payload>> refers to a
-Direct3D 12 fence, add a slink:VkD3D12FenceSubmitInfoKHR structure to the
-pname:pNext chain of the slink:VkSubmitInfo structure.
-The sname:VkD3D12FenceSubmitInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkD3D12FenceSubmitInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:waitSemaphoreValuesCount is the number of semaphore wait values
-    specified in pname:pWaitSemaphoreValues.
-  * pname:pWaitSemaphoreValues is a pointer to an array of
-    pname:waitSemaphoreValuesCount values for the corresponding semaphores
-    in slink:VkSubmitInfo::pname:pWaitSemaphores to wait for.
-  * pname:signalSemaphoreValuesCount is the number of semaphore signal
-    values specified in pname:pSignalSemaphoreValues.
-  * pname:pSignalSemaphoreValues is a pointer to an array of
-    pname:signalSemaphoreValuesCount values for the corresponding semaphores
-    in slink:VkSubmitInfo::pname:pSignalSemaphores to set when signaled.
-
-If the semaphore in slink:VkSubmitInfo::pname:pWaitSemaphores or
-slink:VkSubmitInfo::pname:pSignalSemaphores corresponding to an entry in
-pname:pWaitSemaphoreValues or pname:pSignalSemaphoreValues respectively does
-not currently have a <<synchronization-semaphores-payloads, payload>>
-referring to a Direct3D 12 fence, the implementation must: ignore the value
-in the pname:pWaitSemaphoreValues or pname:pSignalSemaphoreValues entry.
-
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-[NOTE]
-.Note
-====
-As the introduction of the external semaphore handle type
-ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT predates that of
-timeline semaphores, support for importing semaphore payloads from external
-handles of that type into semaphores created (implicitly or explicitly) with
-a elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_BINARY is preserved for
-backwards compatibility.
-However, applications should: prefer importing such handle types into
-semaphores created with a elink:VkSemaphoreType of
-ename:VK_SEMAPHORE_TYPE_TIMELINE, and use the
-slink:VkTimelineSemaphoreSubmitInfo structure instead of the
-sname:VkD3D12FenceSubmitInfoKHR structure to specify the values to use when
-waiting for and signaling such semaphores.
-====
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-.Valid Usage
-****
-  * [[VUID-VkD3D12FenceSubmitInfoKHR-waitSemaphoreValuesCount-00079]]
-    pname:waitSemaphoreValuesCount must: be the same value as
-    sname:VkSubmitInfo::pname:waitSemaphoreCount, where sname:VkSubmitInfo
-    is in the pname:pNext chain of this sname:VkD3D12FenceSubmitInfoKHR
-    structure
-  * [[VUID-VkD3D12FenceSubmitInfoKHR-signalSemaphoreValuesCount-00080]]
-    pname:signalSemaphoreValuesCount must: be the same value as
-    sname:VkSubmitInfo::pname:signalSemaphoreCount, where sname:VkSubmitInfo
-    is in the pname:pNext chain of this sname:VkD3D12FenceSubmitInfoKHR
-    structure
-****
-
-include::{generated}/validity/structs/VkD3D12FenceSubmitInfoKHR.txt[]
---
-endif::VK_KHR_external_semaphore_win32[]
-
-ifdef::VK_KHR_win32_keyed_mutex[]
-[open,refpage='VkWin32KeyedMutexAcquireReleaseInfoKHR',desc='Use the Windows keyed mutex mechanism to synchronize work',type='structs']
---
-When submitting work that operates on memory imported from a Direct3D 11
-resource to a queue, the keyed mutex mechanism may: be used in addition to
-Vulkan semaphores to synchronize the work.
-Keyed mutexes are a property of a properly created shareable Direct3D 11
-resource.
-They can: only be used if the imported resource was created with the
-etext:D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX flag.
-
-To acquire keyed mutexes before submitted work and/or release them after,
-add a slink:VkWin32KeyedMutexAcquireReleaseInfoKHR structure to the
-pname:pNext chain of the slink:VkSubmitInfo structure.
-
-The sname:VkWin32KeyedMutexAcquireReleaseInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkWin32KeyedMutexAcquireReleaseInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:acquireCount is the number of entries in the pname:pAcquireSyncs,
-    pname:pAcquireKeys, and pname:pAcquireTimeouts arrays.
-  * pname:pAcquireSyncs is a pointer to an array of slink:VkDeviceMemory
-    objects which were imported from Direct3D 11 resources.
-  * pname:pAcquireKeys is a pointer to an array of mutex key values to wait
-    for prior to beginning the submitted work.
-    Entries refer to the keyed mutex associated with the corresponding
-    entries in pname:pAcquireSyncs.
-  * pname:pAcquireTimeouts is a pointer to an array of timeout values, in
-    millisecond units, for each acquire specified in pname:pAcquireKeys.
-  * pname:releaseCount is the number of entries in the pname:pReleaseSyncs
-    and pname:pReleaseKeys arrays.
-  * pname:pReleaseSyncs is a pointer to an array of slink:VkDeviceMemory
-    objects which were imported from Direct3D 11 resources.
-  * pname:pReleaseKeys is a pointer to an array of mutex key values to set
-    when the submitted work has completed.
-    Entries refer to the keyed mutex associated with the corresponding
-    entries in pname:pReleaseSyncs.
-
-.Valid Usage
-****
-  * [[VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireSyncs-00081]]
-    Each member of pname:pAcquireSyncs and pname:pReleaseSyncs must: be a
-    device memory object imported by setting
-    slink:VkImportMemoryWin32HandleInfoKHR::pname:handleType to
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT or
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT
-****
-
-include::{generated}/validity/structs/VkWin32KeyedMutexAcquireReleaseInfoKHR.txt[]
---
-endif::VK_KHR_win32_keyed_mutex[]
-
-ifdef::VK_NV_win32_keyed_mutex[]
-include::VK_NV_win32_keyed_mutex/keyed_mutex_submit.txt[]
-endif::VK_NV_win32_keyed_mutex[]
-
-ifdef::VK_VERSION_1_1[]
-[open,refpage='VkProtectedSubmitInfo',desc='Structure indicating whether the submission is protected',type='structs']
---
-If the pname:pNext chain of slink:VkSubmitInfo includes a
-sname:VkProtectedSubmitInfo structure, then the structure indicates whether
-the batch is protected.
-The sname:VkProtectedSubmitInfo structure is defined as:
-
-include::{generated}/api/structs/VkProtectedSubmitInfo.txt[]
-
-  * pname:protectedSubmit specifies whether the batch is protected.
-    If pname:protectedSubmit is ename:VK_TRUE, the batch is protected.
-    If pname:protectedSubmit is ename:VK_FALSE, the batch is unprotected.
-    If the sname:VkSubmitInfo::pname:pNext chain does not include this
-    structure, the batch is unprotected.
-
-include::{generated}/validity/structs/VkProtectedSubmitInfo.txt[]
---
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[open,refpage='VkDeviceGroupSubmitInfo',desc='Structure indicating which physical devices execute semaphore operations and command buffers',type='structs']
---
-
-If the pname:pNext chain of slink:VkSubmitInfo includes a
-sname:VkDeviceGroupSubmitInfo structure, then that structure includes device
-indices and masks specifying which physical devices execute semaphore
-operations and command buffers.
-
-The sname:VkDeviceGroupSubmitInfo structure is defined as:
-
-include::{generated}/api/structs/VkDeviceGroupSubmitInfo.txt[]
-
-ifdef::VK_KHR_device_group[]
-or the equivalent
-
-include::{generated}/api/structs/VkDeviceGroupSubmitInfoKHR.txt[]
-endif::VK_KHR_device_group[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:waitSemaphoreCount is the number of elements in the
-    pname:pWaitSemaphoreDeviceIndices array.
-  * pname:pWaitSemaphoreDeviceIndices is a pointer to an array of
-    pname:waitSemaphoreCount device indices indicating which physical device
-    executes the semaphore wait operation in the corresponding element of
-    slink:VkSubmitInfo::pname:pWaitSemaphores.
-  * pname:commandBufferCount is the number of elements in the
-    pname:pCommandBufferDeviceMasks array.
-  * pname:pCommandBufferDeviceMasks is a pointer to an array of
-    pname:commandBufferCount device masks indicating which physical devices
-    execute the command buffer in the corresponding element of
-    slink:VkSubmitInfo::pname:pCommandBuffers.
-    A physical device executes the command buffer if the corresponding bit
-    is set in the mask.
-  * pname:signalSemaphoreCount is the number of elements in the
-    pname:pSignalSemaphoreDeviceIndices array.
-  * pname:pSignalSemaphoreDeviceIndices is a pointer to an array of
-    pname:signalSemaphoreCount device indices indicating which physical
-    device executes the semaphore signal operation in the corresponding
-    element of slink:VkSubmitInfo::pname:pSignalSemaphores.
-
-If this structure is not present, semaphore operations and command buffers
-execute on device index zero.
-
-.Valid Usage
-****
-  * [[VUID-VkDeviceGroupSubmitInfo-waitSemaphoreCount-00082]]
-    pname:waitSemaphoreCount must: equal
-    slink:VkSubmitInfo::pname:waitSemaphoreCount
-  * [[VUID-VkDeviceGroupSubmitInfo-commandBufferCount-00083]]
-    pname:commandBufferCount must: equal
-    slink:VkSubmitInfo::pname:commandBufferCount
-  * [[VUID-VkDeviceGroupSubmitInfo-signalSemaphoreCount-00084]]
-    pname:signalSemaphoreCount must: equal
-    slink:VkSubmitInfo::pname:signalSemaphoreCount
-  * [[VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-00085]]
-    All elements of pname:pWaitSemaphoreDeviceIndices and
-    pname:pSignalSemaphoreDeviceIndices must: be valid device indices
-  * [[VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-00086]]
-    All elements of pname:pCommandBufferDeviceMasks must: be valid device
-    masks
-****
-
-include::{generated}/validity/structs/VkDeviceGroupSubmitInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-ifdef::VK_KHR_performance_query[]
-If the pname:pNext chain of slink:VkSubmitInfo includes a
-slink:VkPerformanceQuerySubmitInfoKHR structure, then the structure
-indicates which counter pass is active for the batch in that submit.
-
-[open,refpage='VkPerformanceQuerySubmitInfoKHR',desc='Structure indicating which counter pass index is active for performance queries',type='structs']
---
-The sname:VkPerformanceQuerySubmitInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkPerformanceQuerySubmitInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:counterPassIndex specifies which counter pass index is active.
-
-If the sname:VkSubmitInfo::pname:pNext chain does not include this
-structure, the batch defaults to use counter pass index 0.
-
-.Valid Usage
-****
-  * [[VUID-VkPerformanceQuerySubmitInfoKHR-counterPassIndex-03221]]
-    pname:counterPassIndex must: be less than the number of counter passes
-    required by any queries within the batch.
-    The required number of counter passes for a performance query is
-    obtained by calling
-    flink:vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR
-****
-
-include::{generated}/validity/structs/VkPerformanceQuerySubmitInfoKHR.txt[]
---
-endif::VK_KHR_performance_query[]
-
-
-[[commandbuffers-submission-progress]]
-== Queue Forward Progress
-
-When using binary semaphores, the application must: ensure that command
-buffer submissions will be able to complete without any subsequent
-operations by the application on any queue.
-After any call to fname:vkQueueSubmit (or other queue operation), for every
-queued wait on a semaphore
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-created with a elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_BINARY
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-there must: be a prior signal of that semaphore that will not be consumed by
-a different wait on the semaphore.
-
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-When using timeline semaphores, wait-before-signal behavior is well-defined
-and applications can: submit work via fname:vkQueueSubmit which defines a
-<<synchronization-semaphores-waiting, timeline semaphore wait operation>>
-before submitting a corresponding <<synchronization-semaphores-signaling,
-semaphore signal operation>>.
-For each <<synchronization-semaphores-waiting, timeline semaphore wait
-operation>> defined by a call to fname:vkQueueSubmit, the application must:
-ensure that a corresponding <<synchronization-semaphores-signaling,
-semaphore signal operation>> is executed before forward progress can be
-made.
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-Command buffers in the submission can: include flink:vkCmdWaitEvents
-commands that wait on events that will not be signaled by earlier commands
-in the queue.
-Such events must: be signaled by the application using flink:vkSetEvent, and
-the fname:vkCmdWaitEvents commands that wait upon them must: not be inside a
-render pass instance.
-The event must: be set before the flink:vkCmdWaitEvents command is executed.
-
-[NOTE]
-.Note
-====
-Implementations may have some tolerance for waiting on events to be set, but
-this is defined outside of the scope of Vulkan.
-====
-
-
-[[commandbuffers-secondary]]
-== Secondary Command Buffer Execution
-
-[open,refpage='vkCmdExecuteCommands',desc='Execute a secondary command buffer from a primary command buffer',type='protos']
---
-A secondary command buffer must: not be directly submitted to a queue.
-Instead, secondary command buffers are recorded to execute as part of a
-primary command buffer with the command:
-
-include::{generated}/api/protos/vkCmdExecuteCommands.txt[]
-
-  * pname:commandBuffer is a handle to a primary command buffer that the
-    secondary command buffers are executed in.
-  * pname:commandBufferCount is the length of the pname:pCommandBuffers
-    array.
-  * pname:pCommandBuffers is a pointer to an array of
-    pname:commandBufferCount secondary command buffer handles, which are
-    recorded to execute in the primary command buffer in the order they are
-    listed in the array.
-
-If any element of pname:pCommandBuffers was not recorded with the
-ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag, and it was recorded
-into any other primary command buffer which is currently in the
-<<commandbuffers-lifecycle, executable or recording state>>, that primary
-command buffer becomes <<commandbuffers-lifecycle, invalid>>.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-00088]]
-    Each element of pname:pCommandBuffers must: have been allocated with a
-    pname:level of ename:VK_COMMAND_BUFFER_LEVEL_SECONDARY
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-00089]]
-    Each element of pname:pCommandBuffers must: be in the
-    <<commandbuffers-lifecycle, pending or executable state>>
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-00091]]
-    If any element of pname:pCommandBuffers was not recorded with the
-    ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag, it must: not be
-    in the <<commandbuffers-lifecycle, pending state>>
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-00092]]
-    If any element of pname:pCommandBuffers was not recorded with the
-    ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag, it must: not
-    have already been recorded to pname:commandBuffer
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-00093]]
-    If any element of pname:pCommandBuffers was not recorded with the
-    ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag, it must: not
-    appear more than once in pname:pCommandBuffers
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-00094]]
-    Each element of pname:pCommandBuffers must: have been allocated from a
-    sname:VkCommandPool that was created for the same queue family as the
-    sname:VkCommandPool from which pname:commandBuffer was allocated
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-00096]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance, each element of pname:pCommandBuffers must: have been recorded
-    with the ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-00099]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance, and any element of pname:pCommandBuffers was recorded with
-    slink:VkCommandBufferInheritanceInfo::pname:framebuffer not equal to
-    dlink:VK_NULL_HANDLE, that sname:VkFramebuffer must: match the
-    sname:VkFramebuffer used in the current render pass instance
-  * [[VUID-vkCmdExecuteCommands-contents-06018]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderPass, its pname:contents
-    parameter must: have been set to
-    ename:VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-06019]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderPass, each element of
-    pname:pCommandBuffers must: have been recorded with
-    slink:VkCommandBufferInheritanceInfo::pname:subpass set to the index of
-    the subpass which the given command buffer will be executed in
-  * [[VUID-vkCmdExecuteCommands-pBeginInfo-06020]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderPass, the render passes
-    specified in the pname:pBeginInfo->pInheritanceInfo->renderPass members
-    of the flink:vkBeginCommandBuffer commands used to begin recording each
-    element of pname:pCommandBuffers must: be
-    <<renderpass-compatibility,compatible>> with the current render pass
-ifndef::VK_KHR_dynamic_rendering[]
-  * [[VUID-vkCmdExecuteCommands-contents-00095]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance, that render pass instance must: have been begun with the
-    pname:contents parameter of fname:vkCmdBeginRenderPass set to
-    ename:VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-00097]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance, each element of pname:pCommandBuffers must: have been recorded
-    with sname:VkCommandBufferInheritanceInfo::pname:subpass set to the
-    index of the subpass which the given command buffer will be executed in
-  * [[VUID-vkCmdExecuteCommands-pInheritanceInfo-00098]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance, the render passes specified in the
-    pname:pBeginInfo->pInheritanceInfo->renderPass members of the
-    flink:vkBeginCommandBuffer commands used to begin recording each element
-    of pname:pCommandBuffers must: be
-    <<renderpass-compatibility,compatible>> with the current render pass
-endif::VK_KHR_dynamic_rendering[]
-ifdef::VK_QCOM_render_pass_transform[]
-  * [[VUID-vkCmdExecuteCommands-pNext-02865]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance that included slink:VkRenderPassTransformBeginInfoQCOM in the
-    pname:pNext chain of slink:VkRenderPassBeginInfo, then each element of
-    pname:pCommandBuffers must: have been recorded with
-    slink:VkCommandBufferInheritanceRenderPassTransformInfoQCOM in the
-    pname:pNext chain of slink:VkCommandBufferBeginInfo
-  * [[VUID-vkCmdExecuteCommands-pNext-02866]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance that included slink:VkRenderPassTransformBeginInfoQCOM in the
-    pname:pNext chain of slink:VkRenderPassBeginInfo, then each element of
-    pname:pCommandBuffers must: have been recorded with
-    slink:VkCommandBufferInheritanceRenderPassTransformInfoQCOM::pname:transform
-    identical to slink:VkRenderPassTransformBeginInfoQCOM::pname:transform
-  * [[VUID-vkCmdExecuteCommands-pNext-02867]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance that included slink:VkRenderPassTransformBeginInfoQCOM in the
-    pname:pNext chain of slink:VkRenderPassBeginInfo, then each element of
-    pname:pCommandBuffers must: have been recorded with
-    slink:VkCommandBufferInheritanceRenderPassTransformInfoQCOM::pname:renderArea
-    identical to slink:VkRenderPassBeginInfo::pname:renderArea
-endif::VK_QCOM_render_pass_transform[]
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-00100]]
-    If fname:vkCmdExecuteCommands is not being called within a render pass
-    instance, each element of pname:pCommandBuffers must: not have been
-    recorded with the ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
-  * [[VUID-vkCmdExecuteCommands-commandBuffer-00101]]
-    If the <<features-inheritedQueries,inherited queries>> feature is not
-    enabled, pname:commandBuffer must: not have any queries
-    <<queries-operation-active,active>>
-  * [[VUID-vkCmdExecuteCommands-commandBuffer-00102]]
-    If pname:commandBuffer has a ename:VK_QUERY_TYPE_OCCLUSION query
-    <<queries-operation-active,active>>, then each element of
-    pname:pCommandBuffers must: have been recorded with
-    sname:VkCommandBufferInheritanceInfo::pname:occlusionQueryEnable set to
-    ename:VK_TRUE
-  * [[VUID-vkCmdExecuteCommands-commandBuffer-00103]]
-    If pname:commandBuffer has a ename:VK_QUERY_TYPE_OCCLUSION query
-    <<queries-operation-active,active>>, then each element of
-    pname:pCommandBuffers must: have been recorded with
-    sname:VkCommandBufferInheritanceInfo::pname:queryFlags having all bits
-    set that are set for the query
-  * [[VUID-vkCmdExecuteCommands-commandBuffer-00104]]
-    If pname:commandBuffer has a ename:VK_QUERY_TYPE_PIPELINE_STATISTICS
-    query <<queries-operation-active,active>>, then each element of
-    pname:pCommandBuffers must: have been recorded with
-    sname:VkCommandBufferInheritanceInfo::pname:pipelineStatistics having
-    all bits set that are set in the sname:VkQueryPool the query uses
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-00105]]
-    Each element of pname:pCommandBuffers must: not begin any query types
-    that are <<queries-operation-active,active>> in pname:commandBuffer
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-vkCmdExecuteCommands-commandBuffer-01820]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    each element of pname:pCommandBuffers must: be a protected command
-    buffer
-  * [[VUID-vkCmdExecuteCommands-commandBuffer-01821]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    each element of pname:pCommandBuffers must: be an unprotected command
-    buffer
-endif::VK_VERSION_1_1[]
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-vkCmdExecuteCommands-None-02286]]
-    This command must: not be recorded when transform feedback is active
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_KHR_dynamic_rendering[]
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-06021]]
-    If pname:pCommandBuffers contains any <<renderpass-suspension,suspended
-    render pass instances>>, there must: be no action or synchronization
-    commands between that render pass instance and any render pass instance
-    that resumes it
-  * [[VUID-vkCmdExecuteCommands-pCommandBuffers-06022]]
-    If pname:pCommandBuffers contains any <<renderpass-suspension,suspended
-    render pass instances>>, there must: be no render pass instances between
-    that render pass instance and any render pass instance that resumes it
-ifdef::VK_EXT_sample_locations[]
-  * [[VUID-vkCmdExecuteCommands-variableSampleLocations-06023]]
-    If the <<limits-variableSampleLocations, pname:variableSampleLocations>>
-    limit is not supported, and any element of pname:pCommandBuffers
-    contains any <<renderpass-suspension,suspended render pass instances>>,
-    where a graphics pipeline has been bound, any pipelines bound in the
-    render pass instance that resumes it, or any subsequent render pass
-    instances that resume from that one and so on, must: use the same sample
-    locations
-endif::VK_EXT_sample_locations[]
-  * [[VUID-vkCmdExecuteCommands-flags-06024]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR, its
-    slink:VkRenderingInfoKHR::pname:flags parameter must: have included
-    ename:VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR
-  * [[VUID-vkCmdExecuteCommands-pBeginInfo-06025]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR, the render passes
-    specified in the pname:pBeginInfo->pInheritanceInfo->renderPass members
-    of the flink:vkBeginCommandBuffer commands used to begin recording each
-    element of pname:pCommandBuffers must: be dlink:VK_NULL_HANDLE
-  * [[VUID-vkCmdExecuteCommands-flags-06026]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR, the pname:flags member
-    of the slink:VkCommandBufferInheritanceRenderingInfoKHR structure
-    included in the pname:pNext chain of
-    slink:VkCommandBufferBeginInfo::pname:pInheritanceInfo used to begin
-    recording each element of pname:pCommandBuffers must: be equal to the
-    slink:VkRenderingInfoKHR::pname:flags parameter to
-    flink:vkCmdBeginRenderingKHR, excluding
-    ename:VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR
-  * [[VUID-vkCmdExecuteCommands-colorAttachmentCount-06027]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR, the
-    pname:colorAttachmentCount member of the
-    slink:VkCommandBufferInheritanceRenderingInfoKHR structure included in
-    the pname:pNext chain of
-    slink:VkCommandBufferBeginInfo::pname:pInheritanceInfo used to begin
-    recording each element of pname:pCommandBuffers must: be equal to the
-    slink:VkRenderingInfoKHR::pname:colorAttachmentCount parameter to
-    flink:vkCmdBeginRenderingKHR
-  * [[VUID-vkCmdExecuteCommands-imageView-06028]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR, if the pname:imageView
-    member of an element of the
-    slink:VkRenderingInfoKHR::pname:pColorAttachments parameter to
-    flink:vkCmdBeginRenderingKHR is not dlink:VK_NULL_HANDLE, the
-    corresponding element of the pname:pColorAttachmentFormats member of the
-    slink:VkCommandBufferInheritanceRenderingInfoKHR structure included in
-    the pname:pNext chain of
-    slink:VkCommandBufferBeginInfo::pname:pInheritanceInfo used to begin
-    recording each element of pname:pCommandBuffers must: be equal to the
-    format used to create that image view
-  * [[VUID-vkCmdExecuteCommands-pDepthAttachment-06029]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR, if the
-    slink:VkRenderingInfoKHR::pname:pDepthAttachment->imageView parameter to
-    flink:vkCmdBeginRenderingKHR is not dlink:VK_NULL_HANDLE, the value of
-    the pname:depthAttachmentFormat member of the
-    slink:VkCommandBufferInheritanceRenderingInfoKHR structure included in
-    the pname:pNext chain of
-    slink:VkCommandBufferBeginInfo::pname:pInheritanceInfo used to begin
-    recording each element of pname:pCommandBuffers must: be equal to the
-    format used to create that image view
-  * [[VUID-vkCmdExecuteCommands-pStencilAttachment-06030]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR, if the
-    slink:VkRenderingInfoKHR::pname:pStencilAttachment->imageView parameter
-    to flink:vkCmdBeginRenderingKHR is not dlink:VK_NULL_HANDLE, the value
-    of the pname:stencilAttachmentFormat member of the
-    slink:VkCommandBufferInheritanceRenderingInfoKHR structure included in
-    the pname:pNext chain of
-    slink:VkCommandBufferBeginInfo::pname:pInheritanceInfo used to begin
-    recording each element of pname:pCommandBuffers must: be equal to the
-    format used to create that image view
-ifdef::VK_KHR_multiview,VK_VERSION_1_1[]
-  * [[VUID-vkCmdExecuteCommands-viewMask-06031]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR, the pname:viewMask
-    member of the slink:VkCommandBufferInheritanceRenderingInfoKHR structure
-    included in the pname:pNext chain of
-    slink:VkCommandBufferBeginInfo::pname:pInheritanceInfo used to begin
-    recording each element of pname:pCommandBuffers must: be equal to the
-    slink:VkRenderingInfoKHR::pname:viewMask parameter to
-    flink:vkCmdBeginRenderingKHR
-endif::VK_KHR_multiview,VK_VERSION_1_1[]
-ifdef::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
-  * [[VUID-vkCmdExecuteCommands-pNext-06032]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR and the pname:pNext
-    chain of slink:VkCommandBufferInheritanceInfo includes a
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure, if the pname:imageView
-    member of an element of the
-    slink:VkRenderingInfoKHR::pname:pColorAttachments parameter to
-    flink:vkCmdBeginRenderingKHR is not dlink:VK_NULL_HANDLE, the
-    corresponding element of the pname:pColorAttachmentSamples member of the
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure included in the
-    pname:pNext chain of
-    slink:VkCommandBufferBeginInfo::pname:pInheritanceInfo used to begin
-    recording each element of pname:pCommandBuffers must: be equal to the
-    sample count used to create that image view
-  * [[VUID-vkCmdExecuteCommands-pNext-06033]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR and the pname:pNext
-    chain of slink:VkCommandBufferInheritanceInfo includes a
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure, if the
-    slink:VkRenderingInfoKHR::pname:pDepthAttachment->imageView parameter to
-    flink:vkCmdBeginRenderingKHR is not dlink:VK_NULL_HANDLE, the value of
-    the pname:depthStencilAttachmentSamples member of the
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure included in the
-    pname:pNext chain of
-    slink:VkCommandBufferBeginInfo::pname:pInheritanceInfo used to begin
-    recording each element of pname:pCommandBuffers must: be equal to the
-    sample count used to create that image view
-  * [[VUID-vkCmdExecuteCommands-pNext-06034]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR and the pname:pNext
-    chain of slink:VkCommandBufferInheritanceInfo includes a
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure, if the
-    slink:VkRenderingInfoKHR::pname:pStencilAttachment->imageView parameter
-    to flink:vkCmdBeginRenderingKHR is not dlink:VK_NULL_HANDLE, the value
-    of the pname:depthStencilAttachmentSamples member of the
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure included in the
-    pname:pNext chain of
-    slink:VkCommandBufferBeginInfo::pname:pInheritanceInfo used to begin
-    recording each element of pname:pCommandBuffers must: be equal to the
-    sample count used to create that image view
-  * [[VUID-vkCmdExecuteCommands-pNext-06035]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR and the pname:pNext
-    chain of slink:VkCommandBufferInheritanceInfo does not include a
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure, if the pname:imageView
-    member of an element of the
-    slink:VkRenderingInfoKHR::pname:pColorAttachments parameter to
-    flink:vkCmdBeginRenderingKHR is not dlink:VK_NULL_HANDLE, the value of
-    slink:VkCommandBufferInheritanceRenderingInfoKHR::pname:rasterizationSamples
-    must: be equal to the sample count used to create that image view
-  * [[VUID-vkCmdExecuteCommands-pNext-06036]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR and the pname:pNext
-    chain of slink:VkCommandBufferInheritanceInfo does not include a
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure, if the
-    slink:VkRenderingInfoKHR::pname:pDepthAttachment->imageView parameter to
-    flink:vkCmdBeginRenderingKHR is not dlink:VK_NULL_HANDLE, the value of
-    slink:VkCommandBufferInheritanceRenderingInfoKHR::pname:rasterizationSamples
-    must: be equal to the sample count used to create that image view
-  * [[VUID-vkCmdExecuteCommands-pNext-06037]]
-    If fname:vkCmdExecuteCommands is being called within a render pass
-    instance begun with flink:vkCmdBeginRenderingKHR and the pname:pNext
-    chain of slink:VkCommandBufferInheritanceInfo does not include a
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure, if the
-    slink:VkRenderingInfoKHR::pname:pStencilAttachment->imageView parameter
-    to flink:vkCmdBeginRenderingKHR is not dlink:VK_NULL_HANDLE, the value
-    of
-    slink:VkCommandBufferInheritanceRenderingInfoKHR::pname:rasterizationSamples
-    must: be equal to the sample count used to create that image view
-endif::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
-endif::VK_KHR_dynamic_rendering[]
-****
-
-include::{generated}/validity/protos/vkCmdExecuteCommands.txt[]
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[[commandbuffers-devicemask]]
-== Command Buffer Device Mask
-
-Each command buffer has a piece of state storing the current device mask of
-the command buffer.
-This mask controls which physical devices within the logical device all
-subsequent commands will execute on, including state-setting commands,
-action commands, and synchronization commands.
-
-ifndef::VK_NV_scissor_exclusive[]
-Scissor
-endif::VK_NV_scissor_exclusive[]
-ifdef::VK_NV_scissor_exclusive[]
-Scissor, exclusive scissor,
-endif::VK_NV_scissor_exclusive[]
-and viewport state
-ifdef::VK_EXT_extended_dynamic_state[]
-(excluding the count of each)
-endif::VK_EXT_extended_dynamic_state[]
-can: be set to different values on each physical device (only when set as
-dynamic state), and each physical device will render using its local copy of
-the state.
-Other state is shared between physical devices, such that all physical
-devices use the most recently set values for the state.
-However, when recording an action command that uses a piece of state, the
-most recent command that set that state must: have included all physical
-devices that execute the action command in its current device mask.
-
-The command buffer's device mask is orthogonal to the
-pname:pCommandBufferDeviceMasks member of slink:VkDeviceGroupSubmitInfo.
-Commands only execute on a physical device if the device index is set in
-both device masks.
-
-[open,refpage='VkDeviceGroupCommandBufferBeginInfo',desc='Set the initial device mask for a command buffer',type='structs']
---
-If the pname:pNext chain of slink:VkCommandBufferBeginInfo includes a
-sname:VkDeviceGroupCommandBufferBeginInfo structure, then that structure
-includes an initial device mask for the command buffer.
-
-The sname:VkDeviceGroupCommandBufferBeginInfo structure is defined as:
-
-include::{generated}/api/structs/VkDeviceGroupCommandBufferBeginInfo.txt[]
-
-ifdef::VK_KHR_device_group[]
-or the equivalent
-
-include::{generated}/api/structs/VkDeviceGroupCommandBufferBeginInfoKHR.txt[]
-endif::VK_KHR_device_group[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:deviceMask is the initial value of the command buffer's device
-    mask.
-
-The initial device mask also acts as an upper bound on the set of devices
-that can: ever be in the device mask in the command buffer.
-
-If this structure is not present, the initial value of a command buffer's
-device mask is set to include all physical devices in the logical device
-when the command buffer begins recording.
-
-.Valid Usage
-****
-  * [[VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00106]]
-    pname:deviceMask must: be a valid device mask value
-  * [[VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00107]]
-    pname:deviceMask must: not be zero
-****
-
-include::{generated}/validity/structs/VkDeviceGroupCommandBufferBeginInfo.txt[]
---
-
-[open,refpage='vkCmdSetDeviceMask',desc='Modify device mask of a command buffer',type='protos']
---
-To update the current device mask of a command buffer, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkCmdSetDeviceMask.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_device_group[or the equivalent command]
-
-ifdef::VK_KHR_device_group[]
-include::{generated}/api/protos/vkCmdSetDeviceMaskKHR.txt[]
-endif::VK_KHR_device_group[]
-
-  * pname:commandBuffer is command buffer whose current device mask is
-    modified.
-  * pname:deviceMask is the new value of the current device mask.
-
-pname:deviceMask is used to filter out subsequent commands from executing on
-all physical devices whose bit indices are not set in the mask, except
-commands beginning a render pass instance, commands transitioning to the
-next subpass in the render pass instance, and commands ending a render pass
-instance, which always execute on the set of physical devices whose bit
-indices are included in the pname:deviceMask member of the
-slink:VkDeviceGroupRenderPassBeginInfo structure passed to the command
-beginning the corresponding render pass instance.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetDeviceMask-deviceMask-00108]]
-    pname:deviceMask must: be a valid device mask value
-  * [[VUID-vkCmdSetDeviceMask-deviceMask-00109]]
-    pname:deviceMask must: not be zero
-  * [[VUID-vkCmdSetDeviceMask-deviceMask-00110]]
-    pname:deviceMask must: not include any set bits that were not in the
-    slink:VkDeviceGroupCommandBufferBeginInfo::pname:deviceMask value when
-    the command buffer began recording
-  * [[VUID-vkCmdSetDeviceMask-deviceMask-00111]]
-    If fname:vkCmdSetDeviceMask is called inside a render pass instance,
-    pname:deviceMask must: not include any set bits that were not in the
-    slink:VkDeviceGroupRenderPassBeginInfo::pname:deviceMask value when the
-    render pass instance began recording
-****
-
-include::{generated}/validity/protos/vkCmdSetDeviceMask.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
diff --git a/registry/vulkan/chapters/commonvalidity/access_mask_2_common.txt b/registry/vulkan/chapters/commonvalidity/access_mask_2_common.txt
deleted file mode 100644
index ab3e8c9..0000000
--- a/registry/vulkan/chapters/commonvalidity/access_mask_2_common.txt
+++ /dev/null
@@ -1,275 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-// Common Valid Usage
-// Common to structs taking VkPipelineStageFlags2KHR and VkAccessFlags2KHR parameters to define scopes
-// Set "stageMaskName" and "accessMaskName" attribute to the name of the stage and access mask to validate
-  * [[VUID-{refpage}-{accessMaskName}-03900]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-03901]]
-    If pname:{accessMaskName} includes ename:VK_ACCESS_2_INDEX_READ_BIT_KHR,
-    pname:{stageMaskName} must: include
-    ename:VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-03902]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT_KHR, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-03903]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT_KHR, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI,
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-03904]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_UNIFORM_READ_BIT_KHR, pname:{stageMaskName} must:
-    include ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR, or one of the
-    etext:VK_PIPELINE_STAGE_*_SHADER_BIT stages
-  * [[VUID-{refpage}-{accessMaskName}-03905]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR, or one of the
-    etext:VK_PIPELINE_STAGE_*_SHADER_BIT stages
-  * [[VUID-{refpage}-{accessMaskName}-03906]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR, or one of the
-    etext:VK_PIPELINE_STAGE_*_SHADER_BIT stages
-  * [[VUID-{refpage}-{accessMaskName}-03907]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR, or one of the
-    etext:VK_PIPELINE_STAGE_*_SHADER_BIT stages
-  * [[VUID-{refpage}-{accessMaskName}-03908]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_SHADER_READ_BIT_KHR, pname:{stageMaskName} must:
-    include ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, or one
-    of the etext:VK_PIPELINE_STAGE_*_SHADER_BIT stages
-  * [[VUID-{refpage}-{accessMaskName}-03909]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_SHADER_WRITE_BIT_KHR, pname:{stageMaskName} must:
-    include ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR, or one of the
-    etext:VK_PIPELINE_STAGE_*_SHADER_BIT stages
-  * [[VUID-{refpage}-{accessMaskName}-03910]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-03911]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-03912]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT_KHR,
-    pname:{stageMaskName} must: include
-    ename:VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-03913]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT_KHR,
-    pname:{stageMaskName} must: include
-    ename:VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-03914]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_TRANSFER_READ_BIT_KHR, pname:{stageMaskName} must:
-    include ename:VK_PIPELINE_STAGE_2_COPY_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_BLIT_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-03915]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR, pname:{stageMaskName} must:
-    include ename:VK_PIPELINE_STAGE_2_COPY_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_BLIT_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-03916]]
-    If pname:{accessMaskName} includes ename:VK_ACCESS_2_HOST_READ_BIT_KHR,
-    pname:{stageMaskName} must: include
-    ename:VK_PIPELINE_STAGE_2_HOST_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-03917]]
-    If pname:{accessMaskName} includes ename:VK_ACCESS_2_HOST_WRITE_BIT_KHR,
-    pname:{stageMaskName} must: include
-    ename:VK_PIPELINE_STAGE_2_HOST_BIT_KHR
-ifdef::VK_EXT_conditional_rendering[]
-  * [[VUID-{refpage}-{accessMaskName}-03918]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT,
-    pname:{stageMaskName} must: include
-    ename:VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT,
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-{refpage}-{accessMaskName}-03919]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT,
-    pname:{stageMaskName} must: include
-    ename:VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT,
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-{refpage}-{accessMaskName}-03920]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,
-    pname:{stageMaskName} must: include
-    ename:VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT,
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-04747]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT,
-    pname:{stageMaskName} must: include
-    ename:VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT,
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-03922]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,
-    pname:{stageMaskName} must: include
-    ename:VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT,
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_shading_rate_image[]
-  * [[VUID-{refpage}-{accessMaskName}-03923]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV,
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-endif::VK_NV_shading_rate_image[]
-ifdef::VK_HUAWEI_invocation_mask[]
-  * [[VUID-{refpage}-{accessMaskName}-04994]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI
-endif::VK_HUAWEI_invocation_mask[]
-ifdef::VK_NV_device_generated_commands[]
-  * [[VUID-{refpage}-{accessMaskName}-03924]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-03925]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_EXT_blend_operation_advanced[]
-  * [[VUID-{refpage}-{accessMaskName}-03926]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT,
-    pname:{stageMaskName} must: include
-    ename:VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR
-    ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-endif::VK_EXT_blend_operation_advanced[]
-ifdef::VK_KHR_acceleration_structure,VK_NV_ray_tracing[]
-  * [[VUID-{refpage}-{accessMaskName}-03927]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,
-    pname:{stageMaskName} must: include
-    ename:VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR, or one of the
-    etext:VK_PIPELINE_STAGE_*_SHADER_BIT stages
-  * [[VUID-{refpage}-{accessMaskName}-03928]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,
-    pname:{stageMaskName} must: include
-    ename:VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR or
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-ifndef::VK_KHR_ray_query[]
-ifdef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-  * [[VUID-{refpage}-{accessMaskName}-06254]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,
-    pname:{stageMaskName} must: not include any of the
-    etext:VK_PIPELINE_STAGE_*_SHADER_BIT stages except
-    ename:VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-ifndef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-  * [[VUID-{refpage}-{accessMaskName}-06255]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,
-    pname:{stageMaskName} must: not include any of the
-    etext:VK_PIPELINE_STAGE_*_SHADER_BIT stages
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-endif::VK_KHR_ray_query[]
-ifdef::VK_KHR_ray_query[]
-ifdef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-  * [[VUID-{refpage}-{accessMaskName}-06256]]
-    If <<features-rayQuery,pname:rayQuery>> is not enabled and
-    pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,
-    pname:{stageMaskName} must: not include any of the
-    etext:VK_PIPELINE_STAGE_*_SHADER_BIT stages except
-    ename:VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-ifndef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-  * [[VUID-{refpage}-{accessMaskName}-06257]]
-    If <<features-rayQuery,pname:rayQuery>> is not enabled and
-    pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,
-    pname:{stageMaskName} must: not include any of the
-    etext:VK_PIPELINE_STAGE_*_SHADER_BIT stages
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-endif::VK_KHR_ray_query[]
-endif::VK_KHR_acceleration_structure,VK_NV_ray_tracing[]
-ifdef::VK_KHR_video_decode_queue[]
-  * [[VUID-{refpage}-{accessMaskName}-04858]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR, pname:{stageMaskName} must:
-    include ename:VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-04859]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-  * [[VUID-{refpage}-{accessMaskName}-04860]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR, pname:{stageMaskName} must:
-    include ename:VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR
-  * [[VUID-{refpage}-{accessMaskName}-04861]]
-    If pname:{accessMaskName} includes
-    ename:VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR, pname:{stageMaskName}
-    must: include ename:VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR
-endif::VK_KHR_video_encode_queue[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/bind_buffer_common.txt b/registry/vulkan/chapters/commonvalidity/bind_buffer_common.txt
deleted file mode 100644
index 87fc821..0000000
--- a/registry/vulkan/chapters/commonvalidity/bind_buffer_common.txt
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to binding any memory to a buffer
-  * [[VUID-{refpage}-buffer-01029]]
-    pname:buffer must: not already be backed by a memory object
-  * [[VUID-{refpage}-buffer-01030]]
-    pname:buffer must: not have been created with any sparse memory binding
-    flags
-  * [[VUID-{refpage}-memoryOffset-01031]]
-    pname:memoryOffset must: be less than the size of pname:memory
-  * [[VUID-{refpage}-memory-01035]]
-    pname:memory must: have been allocated using one of the memory types
-    allowed in the pname:memoryTypeBits member of the
-    sname:VkMemoryRequirements structure returned from a call to
-    fname:vkGetBufferMemoryRequirements with pname:buffer
-  * [[VUID-{refpage}-memoryOffset-01036]]
-    pname:memoryOffset must: be an integer multiple of the pname:alignment
-    member of the sname:VkMemoryRequirements structure returned from a call
-    to fname:vkGetBufferMemoryRequirements with pname:buffer
-  * [[VUID-{refpage}-size-01037]]
-    The pname:size member of the sname:VkMemoryRequirements structure
-    returned from a call to fname:vkGetBufferMemoryRequirements with
-    pname:buffer must: be less than or equal to the size of pname:memory
-    minus pname:memoryOffset
-ifdef::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
-  * [[VUID-{refpage}-buffer-01444]]
-    If pname:buffer requires a dedicated allocation (as reported by
-    flink:vkGetBufferMemoryRequirements2 in
-    slink:VkMemoryDedicatedRequirements::pname:requiresDedicatedAllocation
-    for pname:buffer), pname:memory must: have been allocated with
-    slink:VkMemoryDedicatedAllocateInfo::pname:buffer equal to pname:buffer
-  * [[VUID-{refpage}-memory-01508]]
-    If the sname:VkMemoryAllocateInfo provided when pname:memory was
-    allocated included a slink:VkMemoryDedicatedAllocateInfo structure in
-    its pname:pNext chain, and
-    slink:VkMemoryDedicatedAllocateInfo::pname:buffer was not
-    dlink:VK_NULL_HANDLE, then pname:buffer must: equal
-    slink:VkMemoryDedicatedAllocateInfo::pname:buffer, and
-    pname:memoryOffset must: be zero
-endif::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-None-01898]]
-    If pname:buffer was created with the
-    ename:VK_BUFFER_CREATE_PROTECTED_BIT bit set, the buffer must: be bound
-    to a memory object allocated with a memory type that reports
-    ename:VK_MEMORY_PROPERTY_PROTECTED_BIT
-  * [[VUID-{refpage}-None-01899]]
-    If pname:buffer was created with the
-    ename:VK_BUFFER_CREATE_PROTECTED_BIT bit not set, the buffer must: not
-    be bound to a memory object allocated with a memory type that reports
-    ename:VK_MEMORY_PROPERTY_PROTECTED_BIT
-endif::VK_VERSION_1_1[]
-ifdef::VK_NV_dedicated_allocation[]
-  * [[VUID-{refpage}-buffer-01038]]
-    If pname:buffer was created with
-    slink:VkDedicatedAllocationBufferCreateInfoNV::pname:dedicatedAllocation
-    equal to ename:VK_TRUE, pname:memory must: have been allocated with
-    slink:VkDedicatedAllocationMemoryAllocateInfoNV::pname:buffer equal to a
-    buffer handle created with identical creation parameters to pname:buffer
-    and pname:memoryOffset must: be zero
-ifndef::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
-  * [[VUID-{refpage}-buffer-01039]]
-    If pname:buffer was not created with
-    slink:VkDedicatedAllocationBufferCreateInfoNV::pname:dedicatedAllocation
-    equal to ename:VK_TRUE, pname:memory must: not have been allocated
-    dedicated for a specific buffer or image
-endif::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
-endif::VK_NV_dedicated_allocation[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * [[VUID-{refpage}-memory-02726]]
-    If the value of slink:VkExportMemoryAllocateInfo::pname:handleTypes used
-    to allocate pname:memory is not `0`, it must: include at least one of
-    the handles set in
-    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes when
-    pname:buffer was created
-ifndef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-{refpage}-memory-02727]]
-    If pname:memory was allocated by a memory import operation, the external
-    handle type of the imported memory must: also have been set in
-    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes when
-    pname:buffer was created
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-{refpage}-memory-02985]]
-    If pname:memory was allocated by a memory import operation, that is not
-    slink:VkImportAndroidHardwareBufferInfoANDROID with a non-`NULL`
-    pname:buffer value, the external handle type of the imported memory
-    must: also have been set in
-    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes when
-    pname:buffer was created
-  * [[VUID-{refpage}-memory-02986]]
-    If pname:memory was allocated with the
-    slink:VkImportAndroidHardwareBufferInfoANDROID memory import operation
-    with a non-`NULL` pname:buffer value,
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID
-    must: also have been set in
-    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes when
-    pname:buffer was created
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-  * [[VUID-{refpage}-bufferDeviceAddress-03339]]
-    If the
-    slink:VkPhysicalDeviceBufferDeviceAddressFeatures::pname:bufferDeviceAddress
-    feature is enabled and pname:buffer was created with the
-    ename:VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT bit set, pname:memory
-    must: have been allocated with the
-    ename:VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT bit set
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-ifdef::VK_FUCHSIA_buffer_collection[]
-  * [[VUID-{refpage}-buffer-06408]]
-    If pname:buffer was created with
-    slink:VkBufferCollectionBufferCreateInfoFUCHSIA chained to
-    slink:VkBufferCreateInfo::pname:pNext, pname:memory must: be allocated
-    with a slink:VkImportMemoryBufferCollectionFUCHSIA chained to
-    slink:VkMemoryAllocateInfo::pname:pNext
-endif::VK_FUCHSIA_buffer_collection[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/bind_image_common.txt b/registry/vulkan/chapters/commonvalidity/bind_image_common.txt
deleted file mode 100644
index f8ca307..0000000
--- a/registry/vulkan/chapters/commonvalidity/bind_image_common.txt
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to binding any memory to an image
-  * [[VUID-{refpage}-image-01044]]
-    pname:image must: not already be backed by a memory object
-  * [[VUID-{refpage}-image-01045]]
-    pname:image must: not have been created with any sparse memory binding
-    flags
-  * [[VUID-{refpage}-memoryOffset-01046]]
-    pname:memoryOffset must: be less than the size of pname:memory
-ifdef::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
-  * [[VUID-{refpage}-image-01445]]
-    If pname:image requires a dedicated allocation (as reported by
-    flink:vkGetImageMemoryRequirements2 in
-    slink:VkMemoryDedicatedRequirements::pname:requiresDedicatedAllocation
-    for pname:image), pname:memory must: have been created with
-    slink:VkMemoryDedicatedAllocateInfo::pname:image equal to pname:image
-ifndef::VK_NV_dedicated_allocation_image_aliasing[]
-  * [[VUID-{refpage}-memory-01509]]
-    If the sname:VkMemoryAllocateInfo provided when pname:memory was
-    allocated included a slink:VkMemoryDedicatedAllocateInfo structure in
-    its pname:pNext chain, and
-    slink:VkMemoryDedicatedAllocateInfo::pname:image was not
-    dlink:VK_NULL_HANDLE, then pname:image must: equal
-    slink:VkMemoryDedicatedAllocateInfo::pname:image and pname:memoryOffset
-    must: be zero
-endif::VK_NV_dedicated_allocation_image_aliasing[]
-ifdef::VK_NV_dedicated_allocation_image_aliasing[]
-  * [[VUID-{refpage}-memory-02628]]
-    If the <<features-dedicatedAllocationImageAliasing,dedicated allocation
-    image aliasing>> feature is not enabled, and the
-    sname:VkMemoryAllocateInfo provided when pname:memory was allocated
-    included a slink:VkMemoryDedicatedAllocateInfo structure in its
-    pname:pNext chain, and slink:VkMemoryDedicatedAllocateInfo::pname:image
-    was not dlink:VK_NULL_HANDLE, then pname:image must: equal
-    slink:VkMemoryDedicatedAllocateInfo::pname:image and pname:memoryOffset
-    must: be zero
-  * [[VUID-{refpage}-memory-02629]]
-    If the <<features-dedicatedAllocationImageAliasing,dedicated allocation
-    image aliasing>> feature is enabled, and the sname:VkMemoryAllocateInfo
-    provided when pname:memory was allocated included a
-    slink:VkMemoryDedicatedAllocateInfo structure in its pname:pNext chain,
-    and slink:VkMemoryDedicatedAllocateInfo::pname:image was not
-    dlink:VK_NULL_HANDLE, then pname:memoryOffset must: be zero, and
-    pname:image must: be either equal to
-    slink:VkMemoryDedicatedAllocateInfo::pname:image or an image that was
-    created using the same parameters in slink:VkImageCreateInfo, with the
-    exception that pname:extent and pname:arrayLayers may: differ subject to
-    the following restrictions: every dimension in the pname:extent
-    parameter of the image being bound must: be equal to or smaller than the
-    original image for which the allocation was created; and the
-    pname:arrayLayers parameter of the image being bound must: be equal to
-    or smaller than the original image for which the allocation was created
-endif::VK_NV_dedicated_allocation_image_aliasing[]
-endif::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-None-01901]]
-    If image was created with the ename:VK_IMAGE_CREATE_PROTECTED_BIT bit
-    set, the image must: be bound to a memory object allocated with a memory
-    type that reports ename:VK_MEMORY_PROPERTY_PROTECTED_BIT
-  * [[VUID-{refpage}-None-01902]]
-    If image was created with the ename:VK_IMAGE_CREATE_PROTECTED_BIT bit
-    not set, the image must: not be bound to a memory object created with a
-    memory type that reports ename:VK_MEMORY_PROPERTY_PROTECTED_BIT
-endif::VK_VERSION_1_1[]
-ifdef::VK_NV_dedicated_allocation[]
-  * [[VUID-{refpage}-image-01050]]
-    If pname:image was created with
-    slink:VkDedicatedAllocationImageCreateInfoNV::pname:dedicatedAllocation
-    equal to ename:VK_TRUE, pname:memory must: have been created with
-    slink:VkDedicatedAllocationMemoryAllocateInfoNV::pname:image equal to an
-    image handle created with identical creation parameters to pname:image
-    and pname:memoryOffset must: be zero
-ifndef::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
-  * [[VUID-{refpage}-image-01051]]
-    If pname:image was not created with
-    slink:VkDedicatedAllocationImageCreateInfoNV::pname:dedicatedAllocation
-    equal to ename:VK_TRUE, pname:memory must: not have been allocated
-    dedicated for a specific buffer or image
-endif::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
-endif::VK_NV_dedicated_allocation[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * [[VUID-{refpage}-memory-02728]]
-    If the value of slink:VkExportMemoryAllocateInfo::pname:handleTypes used
-    to allocate pname:memory is not `0`, it must: include at least one of
-    the handles set in
-    slink:VkExternalMemoryImageCreateInfo::pname:handleTypes when
-    pname:image was created
-ifndef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-{refpage}-memory-02729]]
-    If pname:memory was created by a memory import operation, the external
-    handle type of the imported memory must: also have been set in
-    slink:VkExternalMemoryImageCreateInfo::pname:handleTypes when
-    pname:image was created
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-{refpage}-memory-02989]]
-    If pname:memory was created by a memory import operation, that is not
-    slink:VkImportAndroidHardwareBufferInfoANDROID with a non-`NULL`
-    pname:buffer value, the external handle type of the imported memory
-    must: also have been set in
-    slink:VkExternalMemoryImageCreateInfo::pname:handleTypes when
-    pname:image was created
-  * [[VUID-{refpage}-memory-02990]]
-    If pname:memory was created with the
-    slink:VkImportAndroidHardwareBufferInfoANDROID memory import operation
-    with a non-`NULL` pname:buffer value,
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID
-    must: also have been set in
-    slink:VkExternalMemoryImageCreateInfo::pname:handleTypes when
-    pname:image was created
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/blit_image_command_buffer_common.txt b/registry/vulkan/chapters/commonvalidity/blit_image_command_buffer_common.txt
deleted file mode 100644
index 2aaa924..0000000
--- a/registry/vulkan/chapters/commonvalidity/blit_image_command_buffer_common.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkCmdBlitImage* command buffer
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-commandBuffer-01834]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:srcImage must: not be a protected image
-  * [[VUID-{refpage}-commandBuffer-01835]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstImage must: not be a protected image
-  * [[VUID-{refpage}-commandBuffer-01836]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstImage must: not be an unprotected image
-endif::VK_VERSION_1_1[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/blit_image_common.txt b/registry/vulkan/chapters/commonvalidity/blit_image_common.txt
deleted file mode 100644
index 8b75131..0000000
--- a/registry/vulkan/chapters/commonvalidity/blit_image_common.txt
+++ /dev/null
@@ -1,194 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkCmdBlitImage* commands
-  * [[VUID-{refpage}-pRegions-00215]]
-    The source region specified by each element of pname:pRegions must: be a
-    region that is contained within pname:srcImage
-  * [[VUID-{refpage}-pRegions-00216]]
-    The destination region specified by each element of pname:pRegions must:
-    be a region that is contained within pname:dstImage
-  * [[VUID-{refpage}-pRegions-00217]]
-    The union of all destination regions, specified by the elements of
-    pname:pRegions, must: not overlap in memory with any texel that may: be
-    sampled during the blit operation
-  * [[VUID-{refpage}-srcImage-01999]]
-    The <<resources-image-format-features,format features>> of
-    pname:srcImage must: contain ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-srcImage-06421]]
-    pname:srcImage must: not use a
-    <<formats-requiring-sampler-ycbcr-conversion, format that requires a
-    sampler Y'C~B~C~R~ conversion>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-srcImage-00219]]
-    pname:srcImage must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag
-  * [[VUID-{refpage}-srcImage-00220]]
-    If pname:srcImage is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-srcImageLayout-00221]]
-    pname:srcImageLayout must: specify the layout of the image subresources
-    of pname:srcImage specified in pname:pRegions at the time this command
-    is executed on a sname:VkDevice
-ifndef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-srcImageLayout-00222]]
-    pname:srcImageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
-    or ename:VK_IMAGE_LAYOUT_GENERAL
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-srcImageLayout-01398]]
-    pname:srcImageLayout must: be ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
-    ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_GENERAL
-endif::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-dstImage-02000]]
-    The <<resources-image-format-features,format features>> of
-    pname:dstImage must: contain ename:VK_FORMAT_FEATURE_BLIT_DST_BIT
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-dstImage-06422]]
-    pname:dstImage must: not use a
-    <<formats-requiring-sampler-ycbcr-conversion, format that requires a
-    sampler Y'C~B~C~R~ conversion>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-dstImage-00224]]
-    pname:dstImage must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag
-  * [[VUID-{refpage}-dstImage-00225]]
-    If pname:dstImage is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-dstImageLayout-00226]]
-    pname:dstImageLayout must: specify the layout of the image subresources
-    of pname:dstImage specified in pname:pRegions at the time this command
-    is executed on a sname:VkDevice
-ifndef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-dstImageLayout-00227]]
-    pname:dstImageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
-    or ename:VK_IMAGE_LAYOUT_GENERAL
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-dstImageLayout-01399]]
-    pname:dstImageLayout must: be ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
-    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_GENERAL
-endif::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-srcImage-00229]]
-    If either of pname:srcImage or pname:dstImage was created with a signed
-    integer elink:VkFormat, the other must: also have been created with a
-    signed integer elink:VkFormat
-  * [[VUID-{refpage}-srcImage-00230]]
-    If either of pname:srcImage or pname:dstImage was created with an
-    unsigned integer elink:VkFormat, the other must: also have been created
-    with an unsigned integer elink:VkFormat
-  * [[VUID-{refpage}-srcImage-00231]]
-    If either of pname:srcImage or pname:dstImage was created with a
-    depth/stencil format, the other must: have exactly the same format
-  * [[VUID-{refpage}-srcImage-00232]]
-    If pname:srcImage was created with a depth/stencil format, pname:filter
-    must: be ename:VK_FILTER_NEAREST
-  * [[VUID-{refpage}-srcImage-00233]]
-    pname:srcImage must: have been created with a pname:samples value of
-    ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-{refpage}-dstImage-00234]]
-    pname:dstImage must: have been created with a pname:samples value of
-    ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-{refpage}-filter-02001]]
-    If pname:filter is ename:VK_FILTER_LINEAR, then the
-    <<resources-image-format-features,format features>> of pname:srcImage
-    must: contain ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-ifdef::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-  * [[VUID-{refpage}-filter-02002]]
-    If pname:filter is ename:VK_FILTER_CUBIC_EXT, then the
-    <<resources-image-format-features,format features>> of pname:srcImage
-    must: contain ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT
-  * [[VUID-{refpage}-filter-00237]]
-    If pname:filter is ename:VK_FILTER_CUBIC_EXT, pname:srcImage must: be of
-    type ename:VK_IMAGE_TYPE_2D
-endif::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-  * [[VUID-{refpage}-srcSubresource-01705]]
-    The pname:srcSubresource.mipLevel member of each element of
-    pname:pRegions must: be less than the pname:mipLevels specified in
-    slink:VkImageCreateInfo when pname:srcImage was created
-  * [[VUID-{refpage}-dstSubresource-01706]]
-    The pname:dstSubresource.mipLevel member of each element of
-    pname:pRegions must: be less than the pname:mipLevels specified in
-    slink:VkImageCreateInfo when pname:dstImage was created
-  * [[VUID-{refpage}-srcSubresource-01707]]
-    The [eq]#pname:srcSubresource.baseArrayLayer {plus}
-    pname:srcSubresource.layerCount# of each element of pname:pRegions must:
-    be less than or equal to the pname:arrayLayers specified in
-    slink:VkImageCreateInfo when pname:srcImage was created
-  * [[VUID-{refpage}-dstSubresource-01708]]
-    The [eq]#pname:dstSubresource.baseArrayLayer {plus}
-    pname:dstSubresource.layerCount# of each element of pname:pRegions must:
-    be less than or equal to the pname:arrayLayers specified in
-    slink:VkImageCreateInfo when pname:dstImage was created
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-{refpage}-dstImage-02545]]
-    pname:dstImage and pname:srcImage must: not have been created with
-    pname:flags containing ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-// Common Valid Usage
-  * [[VUID-{refpage}-srcImage-00240]]
-    If either pname:srcImage or pname:dstImage is of type
-    ename:VK_IMAGE_TYPE_3D, then for each element of pname:pRegions,
-    pname:srcSubresource.baseArrayLayer and
-    pname:dstSubresource.baseArrayLayer must: each be `0`, and
-    pname:srcSubresource.layerCount and pname:dstSubresource.layerCount
-    must: each be `1`
-  * [[VUID-{refpage}-aspectMask-00241]]
-    For each element of pname:pRegions, pname:srcSubresource.aspectMask
-    must: specify aspects present in pname:srcImage
-  * [[VUID-{refpage}-aspectMask-00242]]
-    For each element of pname:pRegions, pname:dstSubresource.aspectMask
-    must: specify aspects present in pname:dstImage
-  * [[VUID-{refpage}-srcOffset-00243]]
-    For each element of pname:pRegions, pname:srcOffsets[0].x and
-    pname:srcOffsets[1].x must: both be greater than or equal to `0` and
-    less than or equal to the width of the specified pname:srcSubresource of
-    pname:srcImage
-  * [[VUID-{refpage}-srcOffset-00244]]
-    For each element of pname:pRegions, pname:srcOffsets[0].y and
-    pname:srcOffsets[1].y must: both be greater than or equal to `0` and
-    less than or equal to the height of the specified pname:srcSubresource
-    of pname:srcImage
-  * [[VUID-{refpage}-srcImage-00245]]
-    If pname:srcImage is of type ename:VK_IMAGE_TYPE_1D, then for each
-    element of pname:pRegions, pname:srcOffsets[0].y must: be `0` and
-    pname:srcOffsets[1].y must: be `1`
-  * [[VUID-{refpage}-srcOffset-00246]]
-    For each element of pname:pRegions, pname:srcOffsets[0].z and
-    pname:srcOffsets[1].z must: both be greater than or equal to `0` and
-    less than or equal to the depth of the specified pname:srcSubresource of
-    pname:srcImage
-  * [[VUID-{refpage}-srcImage-00247]]
-    If pname:srcImage is of type ename:VK_IMAGE_TYPE_1D or
-    ename:VK_IMAGE_TYPE_2D, then for each element of pname:pRegions,
-    pname:srcOffsets[0].z must: be `0` and pname:srcOffsets[1].z must: be
-    `1`
-  * [[VUID-{refpage}-dstOffset-00248]]
-    For each element of pname:pRegions, pname:dstOffsets[0].x and
-    pname:dstOffsets[1].x must: both be greater than or equal to `0` and
-    less than or equal to the width of the specified pname:dstSubresource of
-    pname:dstImage
-  * [[VUID-{refpage}-dstOffset-00249]]
-    For each element of pname:pRegions, pname:dstOffsets[0].y and
-    pname:dstOffsets[1].y must: both be greater than or equal to `0` and
-    less than or equal to the height of the specified pname:dstSubresource
-    of pname:dstImage
-  * [[VUID-{refpage}-dstImage-00250]]
-    If pname:dstImage is of type ename:VK_IMAGE_TYPE_1D, then for each
-    element of pname:pRegions, pname:dstOffsets[0].y must: be `0` and
-    pname:dstOffsets[1].y must: be `1`
-  * [[VUID-{refpage}-dstOffset-00251]]
-    For each element of pname:pRegions, pname:dstOffsets[0].z and
-    pname:dstOffsets[1].z must: both be greater than or equal to `0` and
-    less than or equal to the depth of the specified pname:dstSubresource of
-    pname:dstImage
-  * [[VUID-{refpage}-dstImage-00252]]
-    If pname:dstImage is of type ename:VK_IMAGE_TYPE_1D or
-    ename:VK_IMAGE_TYPE_2D, then for each element of pname:pRegions,
-    pname:dstOffsets[0].z must: be `0` and pname:dstOffsets[1].z must: be
-    `1`
diff --git a/registry/vulkan/chapters/commonvalidity/buffer_copy_common.txt b/registry/vulkan/chapters/commonvalidity/buffer_copy_common.txt
deleted file mode 100644
index baf66ca..0000000
--- a/registry/vulkan/chapters/commonvalidity/buffer_copy_common.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkBufferCopy* struct
-  * [[VUID-{refpage}-size-01988]]
-    The pname:size must: be greater than `0`
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/buffer_image_copy_common.txt b/registry/vulkan/chapters/commonvalidity/buffer_image_copy_common.txt
deleted file mode 100644
index ae3b174..0000000
--- a/registry/vulkan/chapters/commonvalidity/buffer_image_copy_common.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkBufferImageCopy* struct
-  * [[VUID-{refpage}-bufferRowLength-00195]]
-    pname:bufferRowLength must: be `0`, or greater than or equal to the
-    pname:width member of pname:imageExtent
-  * [[VUID-{refpage}-bufferImageHeight-00196]]
-    pname:bufferImageHeight must: be `0`, or greater than or equal to the
-    pname:height member of pname:imageExtent
-  * [[VUID-{refpage}-aspectMask-00212]]
-    The pname:aspectMask member of pname:imageSubresource must: only have a
-    single bit set
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/buffer_memory_barrier_common.txt b/registry/vulkan/chapters/commonvalidity/buffer_memory_barrier_common.txt
deleted file mode 100644
index 5539cd9..0000000
--- a/registry/vulkan/chapters/commonvalidity/buffer_memory_barrier_common.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkBufferMemoryBarrier* structs
-  * [[VUID-{refpage}-offset-01187]]
-    pname:offset must: be less than the size of pname:buffer
-  * [[VUID-{refpage}-size-01188]]
-    If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:size must: be
-    greater than `0`
-  * [[VUID-{refpage}-size-01189]]
-    If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:size must: be
-    less than or equal to than the size of pname:buffer minus pname:offset
-  * [[VUID-{refpage}-buffer-01931]]
-    If pname:buffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-ifndef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * [[VUID-{refpage}-buffer-04086]]
-    If pname:buffer was created with a sharing mode of
-    ename:VK_SHARING_MODE_EXCLUSIVE, and pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex are not equal, pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex must: be valid queue families
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * [[VUID-{refpage}-srcQueueFamilyIndex-04087]]
-    If pname:srcQueueFamilyIndex is not equal to pname:dstQueueFamilyIndex,
-    at least one must: not be a special queue family reserved for external
-    memory ownership transfers, as described in
-    <<synchronization-queue-transfers>>
-  * [[VUID-{refpage}-buffer-04088]]
-    If pname:buffer was created with a sharing mode of
-    ename:VK_SHARING_MODE_CONCURRENT, pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex are not equal, and one of
-    pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex is one of the
-    special queue family values reserved for external memory transfers, the
-    other must: be ename:VK_QUEUE_FAMILY_IGNORED
-  * [[VUID-{refpage}-buffer-04089]]
-    If pname:buffer was created with a sharing mode of
-    ename:VK_SHARING_MODE_EXCLUSIVE, and pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex are not equal, pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex must: both be valid queue families, or one of
-    the special queue family values reserved for external memory transfers,
-    as described in <<synchronization-queue-transfers>>
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/build_acceleration_structure_common.txt b/registry/vulkan/chapters/commonvalidity/build_acceleration_structure_common.txt
deleted file mode 100644
index 7c0c4ac..0000000
--- a/registry/vulkan/chapters/commonvalidity/build_acceleration_structure_common.txt
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to acceleration structure build commands
-  * [[VUID-{refpage}-mode-04628]]
-    The pname:mode member of each element of pname:pInfos must: be a valid
-    elink:VkBuildAccelerationStructureModeKHR value
-  * [[VUID-{refpage}-srcAccelerationStructure-04629]]
-    If the pname:srcAccelerationStructure member of any element of
-    pname:pInfos is not dlink:VK_NULL_HANDLE, the
-    pname:srcAccelerationStructure member must: be a valid
-    slink:VkAccelerationStructureKHR handle
-  * [[VUID-{refpage}-pInfos-04630]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its
-    pname:srcAccelerationStructure member must: not be dlink:VK_NULL_HANDLE
-  * [[VUID-{refpage}-pInfos-03403]]
-    The pname:srcAccelerationStructure member of any element of pname:pInfos
-    must: not be the same acceleration structure as the
-    pname:dstAccelerationStructure member of any other element of
-    pname:pInfos
-  * [[VUID-{refpage}-dstAccelerationStructure-03698]]
-    The pname:dstAccelerationStructure member of any element of pname:pInfos
-    must: not be the same acceleration structure as the
-    pname:dstAccelerationStructure member of any other element of
-    pname:pInfos
-  * [[VUID-{refpage}-dstAccelerationStructure-03800]]
-    The pname:dstAccelerationStructure member of any element of pname:pInfos
-    must: be a valid slink:VkAccelerationStructureKHR handle
-  * [[VUID-{refpage}-pInfos-03699]]
-    For each element of pname:pInfos, if its pname:type member is
-    ename:VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR, its
-    pname:dstAccelerationStructure member must: have been created with a
-    value of slink:VkAccelerationStructureCreateInfoKHR::pname:type equal to
-    either ename:VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR or
-    ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR
-  * [[VUID-{refpage}-pInfos-03700]]
-    For each element of pname:pInfos, if its pname:type member is
-    ename:VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR, its
-    pname:dstAccelerationStructure member must: have been created with a
-    value of slink:VkAccelerationStructureCreateInfoKHR::pname:type equal to
-    either ename:VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR or
-    ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR
-  * [[VUID-{refpage}-pInfos-03663]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,
-    <<acceleration-structure-inactive-prims,inactive primitives>> in its
-    pname:srcAccelerationStructure member must: not be made active
-  * [[VUID-{refpage}-pInfos-03664]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, active primitives
-    in its pname:srcAccelerationStructure member must: not be made
-    <<acceleration-structure-inactive-prims,inactive>>
-  * [[VUID-{refpage}-None-03407]]
-    The pname:dstAccelerationStructure member of any element of pname:pInfos
-    must: not be referenced by the pname:geometry.instances.data member of
-    any element of pname:pGeometries or pname:ppGeometries with a
-    pname:geometryType of ename:VK_GEOMETRY_TYPE_INSTANCES_KHR in any other
-    element of pname:pInfos
-  * [[VUID-{refpage}-dstAccelerationStructure-03701]]
-    The range of memory backing the pname:dstAccelerationStructure member of
-    any element of pname:pInfos that is accessed by this command must: not
-    overlap the memory backing the pname:srcAccelerationStructure member of
-    any other element of pname:pInfos with a pname:mode equal to
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, which is accessed
-    by this command
-  * [[VUID-{refpage}-dstAccelerationStructure-03702]]
-    The range of memory backing the pname:dstAccelerationStructure member of
-    any element of pname:pInfos that is accessed by this command must: not
-    overlap the memory backing the pname:dstAccelerationStructure member of
-    any other element of pname:pInfos, which is accessed by this command
-  * [[VUID-{refpage}-dstAccelerationStructure-03703]]
-    The range of memory backing the pname:dstAccelerationStructure member of
-    any element of pname:pInfos that is accessed by this command must: not
-    overlap the memory backing the pname:scratchData member of any element
-    of pname:pInfos (including the same element), which is accessed by this
-    command
-  * [[VUID-{refpage}-scratchData-03704]]
-    The range of memory backing the pname:scratchData member of any element
-    of pname:pInfos that is accessed by this command must: not overlap the
-    memory backing the pname:scratchData member of any other element of
-    pname:pInfos, which is accessed by this command
-  * [[VUID-{refpage}-scratchData-03705]]
-    The range of memory backing the pname:scratchData member of any element
-    of pname:pInfos that is accessed by this command must: not overlap the
-    memory backing the pname:srcAccelerationStructure member of any element
-    of pname:pInfos with a pname:mode equal to
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR (including the
-    same element), which is accessed by this command
-  * [[VUID-{refpage}-dstAccelerationStructure-03706]]
-    The range of memory backing the pname:dstAccelerationStructure member of
-    any element of pname:pInfos that is accessed by this command must: not
-    overlap the memory backing any acceleration structure referenced by the
-    pname:geometry.instances.data member of any element of pname:pGeometries
-    or pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_INSTANCES_KHR in any other element of
-    pname:pInfos, which is accessed by this command
-  * [[VUID-{refpage}-pInfos-03667]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its
-    pname:srcAccelerationStructure member must: have previously been
-    constructed with
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR set in
-    slink:VkAccelerationStructureBuildGeometryInfoKHR::pname:flags in the
-    build
-  * [[VUID-{refpage}-pInfos-03668]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its
-    pname:srcAccelerationStructure and pname:dstAccelerationStructure
-    members must: either be the same slink:VkAccelerationStructureKHR, or
-    not have any <<resources-memory-aliasing, memory aliasing>>
-  * [[VUID-{refpage}-pInfos-03758]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its
-    pname:geometryCount member must: have the same value which was specified
-    when pname:srcAccelerationStructure was last built
-  * [[VUID-{refpage}-pInfos-03759]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its pname:flags
-    member must: have the same value which was specified when
-    pname:srcAccelerationStructure was last built
-  * [[VUID-{refpage}-pInfos-03760]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its pname:type
-    member must: have the same value which was specified when
-    pname:srcAccelerationStructure was last built
-  * [[VUID-{refpage}-pInfos-03761]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each
-    sname:VkAccelerationStructureGeometryKHR structure referred to by its
-    pname:pGeometries or pname:ppGeometries members, its pname:geometryType
-    member must: have the same value which was specified when
-    pname:srcAccelerationStructure was last built
-  * [[VUID-{refpage}-pInfos-03762]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each
-    sname:VkAccelerationStructureGeometryKHR structure referred to by its
-    pname:pGeometries or pname:ppGeometries members, its pname:flags member
-    must: have the same value which was specified when
-    pname:srcAccelerationStructure was last built
-  * [[VUID-{refpage}-pInfos-03763]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each
-    sname:VkAccelerationStructureGeometryKHR structure referred to by its
-    pname:pGeometries or pname:ppGeometries members, if pname:geometryType
-    is ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, its
-    pname:geometry.triangles.vertexFormat member must: have the same value
-    which was specified when pname:srcAccelerationStructure was last built
-  * [[VUID-{refpage}-pInfos-03764]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each
-    sname:VkAccelerationStructureGeometryKHR structure referred to by its
-    pname:pGeometries or pname:ppGeometries members, if pname:geometryType
-    is ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, its
-    pname:geometry.triangles.maxVertex member must: have the same value
-    which was specified when pname:srcAccelerationStructure was last built
-  * [[VUID-{refpage}-pInfos-03765]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each
-    sname:VkAccelerationStructureGeometryKHR structure referred to by its
-    pname:pGeometries or pname:ppGeometries members, if pname:geometryType
-    is ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, its
-    pname:geometry.triangles.indexType member must: have the same value
-    which was specified when pname:srcAccelerationStructure was last built
-  * [[VUID-{refpage}-pInfos-03766]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each
-    sname:VkAccelerationStructureGeometryKHR structure referred to by its
-    pname:pGeometries or pname:ppGeometries members, if pname:geometryType
-    is ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, if its
-    pname:geometry.triangles.transformData address was `NULL` when
-    pname:srcAccelerationStructure was last built, then it must: be `NULL`
-  * [[VUID-{refpage}-pInfos-03767]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each
-    sname:VkAccelerationStructureGeometryKHR structure referred to by its
-    pname:pGeometries or pname:ppGeometries members, if pname:geometryType
-    is ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, if its
-    pname:geometry.triangles.transformData address was not `NULL` when
-    pname:srcAccelerationStructure was last built, then it must: not be
-    `NULL`
-  * [[VUID-{refpage}-pInfos-03768]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each
-    sname:VkAccelerationStructureGeometryKHR structure referred to by its
-    pname:pGeometries or pname:ppGeometries members, if pname:geometryType
-    is ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, and
-    pname:geometry.triangles.indexType is not ename:VK_INDEX_TYPE_NONE_KHR,
-    then the value of each index referenced must: be the same as the
-    corresponding index value when pname:srcAccelerationStructure was last
-    built
-  * [[VUID-{refpage}-primitiveCount-03769]]
-    For each sname:VkAccelerationStructureBuildRangeInfoKHR referenced by
-    this command, its pname:primitiveCount member must: have the same value
-    which was specified when pname:srcAccelerationStructure was last built
-  * [[VUID-{refpage}-firstVertex-03770]]
-    For each sname:VkAccelerationStructureBuildRangeInfoKHR referenced by
-    this command, if the corresponding geometry uses indices, its
-    pname:firstVertex member must: have the same value which was specified
-    when pname:srcAccelerationStructure was last built
-  * [[VUID-{refpage}-pInfos-03801]]
-    For each element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_INSTANCES_KHR, the corresponding
-    {maxinstancecheck} must: be less than or equal to
-    slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:maxInstanceCount
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/build_acceleration_structure_device_common.txt b/registry/vulkan/chapters/commonvalidity/build_acceleration_structure_device_common.txt
deleted file mode 100644
index 0ac8963..0000000
--- a/registry/vulkan/chapters/commonvalidity/build_acceleration_structure_device_common.txt
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to acceleration structure build commands executed on the device
-  * [[VUID-{refpage}-pInfos-03707]]
-    For each element of pname:pInfos, the pname:buffer used to create its
-    pname:dstAccelerationStructure member must: be bound to device memory
-  * [[VUID-{refpage}-pInfos-03708]]
-    For each element of pname:pInfos, if its pname:mode member is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR the pname:buffer
-    used to create its pname:srcAccelerationStructure member must: be bound
-    to device memory
-  * [[VUID-{refpage}-pInfos-03709]]
-    For each element of pname:pInfos, the pname:buffer used to create each
-    acceleration structure referenced by the pname:geometry.instances.data
-    member of any element of pname:pGeometries or pname:ppGeometries with a
-    pname:geometryType of ename:VK_GEOMETRY_TYPE_INSTANCES_KHR must: be
-    bound to device memory
-  * [[VUID-{refpage}-pInfos-03671]]
-    If pname:pInfos[i].pname:mode is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR, all addresses
-    between pname:pInfos[i].pname:scratchData.deviceAddress and
-    pname:pInfos[i].pname:scratchData.deviceAddress {plus} N - 1 must: be in
-    the buffer device address range of the same buffer, where N is given by
-    the pname:buildScratchSize member of the
-    slink:VkAccelerationStructureBuildSizesInfoKHR structure returned from a
-    call to flink:vkGetAccelerationStructureBuildSizesKHR with an identical
-    slink:VkAccelerationStructureBuildGeometryInfoKHR structure and
-    primitive count
-  * [[VUID-{refpage}-pInfos-03672]]
-    If pname:pInfos[i].pname:mode is
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, all addresses
-    between pname:pInfos[i].pname:scratchData.deviceAddress and
-    pname:pInfos[i].pname:scratchData.deviceAddress {plus} N - 1 must: be in
-    the buffer device address range of the same buffer, where N is given by
-    the pname:updateScratchSize member of the
-    slink:VkAccelerationStructureBuildSizesInfoKHR structure returned from a
-    call to flink:vkGetAccelerationStructureBuildSizesKHR with an identical
-    slink:VkAccelerationStructureBuildGeometryInfoKHR structure and
-    primitive count
-  * [[VUID-{refpage}-geometry-03673]]
-    The buffers from which the buffer device addresses for all of the
-    pname:geometry.triangles.vertexData, pname:geometry.triangles.indexData,
-    pname:geometry.triangles.transformData, pname:geometry.aabbs.data, and
-    pname:geometry.instances.data members of all
-    pname:pInfos[i].pname:pGeometries and pname:pInfos[i].pname:ppGeometries
-    are queried must: have been created with the
-    ename:VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR
-    usage flag
-  * [[VUID-{refpage}-pInfos-03674]]
-    The buffer from which the buffer device address
-    pname:pInfos[i].pname:scratchData.deviceAddress is queried must: have
-    been created with ename:VK_BUFFER_USAGE_STORAGE_BUFFER_BIT usage flag
-  * [[VUID-{refpage}-pInfos-03802]]
-    For each element of pname:pInfos, its pname:scratchData.deviceAddress
-    member must: be a valid device address obtained from
-    flink:vkGetBufferDeviceAddress
-  * [[VUID-{refpage}-pInfos-03803]]
-    For each element of pname:pInfos, if pname:scratchData.deviceAddress is
-    the address of a non-sparse buffer then it must: be bound completely and
-    contiguously to a single slink:VkDeviceMemory object
-  * [[VUID-{refpage}-pInfos-03710]]
-    For each element of pname:pInfos, its pname:scratchData.deviceAddress
-    member must: be a multiple of
-    slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:minAccelerationStructureScratchOffsetAlignment
-  * [[VUID-{refpage}-pInfos-03804]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR,
-    pname:geometry.triangles.vertexData.deviceAddress must: be a valid
-    device address obtained from flink:vkGetBufferDeviceAddress
-  * [[VUID-{refpage}-pInfos-03805]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, if
-    pname:geometry.triangles.vertexData.deviceAddress is the address of a
-    non-sparse buffer then it must: be bound completely and contiguously to
-    a single slink:VkDeviceMemory object
-  * [[VUID-{refpage}-pInfos-03711]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR,
-    pname:geometry.triangles.vertexData.deviceAddress must: be aligned to
-    the size in bytes of the smallest component of the format in
-    pname:vertexFormat
-  * [[VUID-{refpage}-pInfos-03806]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, if
-    pname:geometry.triangles.indexType is not ename:VK_INDEX_TYPE_NONE_KHR,
-    pname:geometry.triangles.indexData.deviceAddress must: be a valid device
-    address obtained from flink:vkGetBufferDeviceAddress
-  * [[VUID-{refpage}-pInfos-03807]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, if
-    pname:geometry.triangles.indexType is not ename:VK_INDEX_TYPE_NONE_KHR,
-    if pname:geometry.triangles.indexData.deviceAddress is the address of a
-    non-sparse buffer then it must: be bound completely and contiguously to
-    a single slink:VkDeviceMemory object
-  * [[VUID-{refpage}-pInfos-03712]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, and with
-    pname:geometry.triangles.indexType not equal to
-    ename:VK_INDEX_TYPE_NONE_KHR,
-    pname:geometry.triangles.indexData.deviceAddress must: be aligned to the
-    size in bytes of the type in pname:indexType
-  * [[VUID-{refpage}-pInfos-03808]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, if
-    pname:geometry.triangles.transformData.deviceAddress is not `0`, it
-    must: be a valid device address obtained from
-    flink:vkGetBufferDeviceAddress
-  * [[VUID-{refpage}-pInfos-03809]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, if
-    pname:geometry.triangles.transformData.deviceAddress is the address of a
-    non-sparse buffer then it must: be bound completely and contiguously to
-    a single slink:VkDeviceMemory object
-  * [[VUID-{refpage}-pInfos-03810]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, if
-    pname:geometry.triangles.transformData.deviceAddress is not `0`, it
-    must: be aligned to `16` bytes
-  * [[VUID-{refpage}-pInfos-03811]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_AABBS_KHR,
-    pname:geometry.aabbs.data.deviceAddress must: be a valid device address
-    obtained from flink:vkGetBufferDeviceAddress
-  * [[VUID-{refpage}-pInfos-03812]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_AABBS_KHR, if
-    pname:geometry.aabbs.data.deviceAddress is the address of a non-sparse
-    buffer then it must: be bound completely and contiguously to a single
-    slink:VkDeviceMemory object
-  * [[VUID-{refpage}-pInfos-03714]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_AABBS_KHR,
-    pname:geometry.aabbs.data.deviceAddress must: be aligned to `8` bytes
-  * [[VUID-{refpage}-pInfos-03715]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_INSTANCES_KHR, if pname:geometry.arrayOfPointers
-    is ename:VK_FALSE, pname:geometry.instances.data.deviceAddress must: be
-    aligned to `16` bytes
-  * [[VUID-{refpage}-pInfos-03716]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_INSTANCES_KHR, if pname:geometry.arrayOfPointers
-    is ename:VK_TRUE, pname:geometry.instances.data.deviceAddress must: be
-    aligned to `8` bytes
-  * [[VUID-{refpage}-pInfos-03717]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_INSTANCES_KHR, if pname:geometry.arrayOfPointers
-    is ename:VK_TRUE, each element of
-    pname:geometry.instances.data.deviceAddress in device memory must: be
-    aligned to `16` bytes
-  * [[VUID-{refpage}-pInfos-03813]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_INSTANCES_KHR,
-    pname:geometry.instances.data.deviceAddress must: be a valid device
-    address obtained from flink:vkGetBufferDeviceAddress
-  * [[VUID-{refpage}-pInfos-03814]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_INSTANCES_KHR, if
-    pname:geometry.instances.data.deviceAddress is the address of a
-    non-sparse buffer then it must: be bound completely and contiguously to
-    a single slink:VkDeviceMemory object
-  * [[VUID-{refpage}-pInfos-03815]]
-    For any element of pname:pInfos[i].pname:pGeometries or
-    pname:pInfos[i].pname:ppGeometries with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_INSTANCES_KHR, each
-    slink:VkAccelerationStructureInstanceKHR::pname:accelerationStructureReference
-    value in pname:geometry.instances.data.deviceAddress must: be a valid
-    device address containing a value obtained from
-    flink:vkGetAccelerationStructureDeviceAddressKHR
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/build_acceleration_structure_nonindirect_common.txt b/registry/vulkan/chapters/commonvalidity/build_acceleration_structure_nonindirect_common.txt
deleted file mode 100644
index 52f7878..0000000
--- a/registry/vulkan/chapters/commonvalidity/build_acceleration_structure_nonindirect_common.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to acceleration structure build commands
-  * [[VUID-{refpage}-pInfos-03675]]
-    For each pname:pInfos[i], pname:dstAccelerationStructure must: have been
-    created with a value of
-    slink:VkAccelerationStructureCreateInfoKHR::pname:size greater than or
-    equal to the memory size required by the build operation, as returned by
-    flink:vkGetAccelerationStructureBuildSizesKHR with [eq]#pname:pBuildInfo
-    = pname:pInfos[i]# and with each element of the
-    pname:pMaxPrimitiveCounts array greater than or equal to the equivalent
-    pname:ppBuildRangeInfos[i][j].pname:primitiveCount values for code:j in
-    [eq]#[0,pname:pInfos[i].pname:geometryCount)#
-  * [[VUID-{refpage}-ppBuildRangeInfos-03676]]
-    Each element of pname:ppBuildRangeInfos[i] must: be a valid pointer to
-    an array of pname:pInfos[i].pname:geometryCount
-    sname:VkAccelerationStructureBuildRangeInfoKHR structures
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/copy_acceleration_structure_common.txt b/registry/vulkan/chapters/commonvalidity/copy_acceleration_structure_common.txt
deleted file mode 100644
index cfa7eb8..0000000
--- a/registry/vulkan/chapters/commonvalidity/copy_acceleration_structure_common.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to acceleration structure copy commands
-  * [[VUID-{refpage}-mode-03410]]
-    pname:mode must: be
-    ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR or
-    ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR
-  * [[VUID-{refpage}-src-04963]]
-    The source acceleration structure pname:src must: have been constructed
-    prior to the execution of this command
-  * [[VUID-{refpage}-src-03411]]
-    If pname:mode is ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR,
-    pname:src must: have been constructed with
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR in the
-    build
-  * [[VUID-{refpage}-buffer-03718]]
-    The pname:buffer used to create pname:src must: be bound to device
-    memory
-  * [[VUID-{refpage}-buffer-03719]]
-    The pname:buffer used to create pname:dst must: be bound to device
-    memory
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/copy_buffer_command_buffer_common.txt b/registry/vulkan/chapters/commonvalidity/copy_buffer_command_buffer_common.txt
deleted file mode 100644
index 5826e44..0000000
--- a/registry/vulkan/chapters/commonvalidity/copy_buffer_command_buffer_common.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkCmdCopyBuffer* command buffer
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-commandBuffer-01822]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:srcBuffer must: not be a protected buffer
-  * [[VUID-{refpage}-commandBuffer-01823]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstBuffer must: not be a protected buffer
-  * [[VUID-{refpage}-commandBuffer-01824]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstBuffer must: not be an unprotected buffer
-endif::VK_VERSION_1_1[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/copy_buffer_common.txt b/registry/vulkan/chapters/commonvalidity/copy_buffer_common.txt
deleted file mode 100644
index 3d367f5..0000000
--- a/registry/vulkan/chapters/commonvalidity/copy_buffer_common.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkCmdCopyBuffer* commands
-  * [[VUID-{refpage}-srcOffset-00113]]
-    The pname:srcOffset member of each element of pname:pRegions must: be
-    less than the size of pname:srcBuffer
-  * [[VUID-{refpage}-dstOffset-00114]]
-    The pname:dstOffset member of each element of pname:pRegions must: be
-    less than the size of pname:dstBuffer
-  * [[VUID-{refpage}-size-00115]]
-    The pname:size member of each element of pname:pRegions must: be less
-    than or equal to the size of pname:srcBuffer minus pname:srcOffset
-  * [[VUID-{refpage}-size-00116]]
-    The pname:size member of each element of pname:pRegions must: be less
-    than or equal to the size of pname:dstBuffer minus pname:dstOffset
-  * [[VUID-{refpage}-pRegions-00117]]
-    The union of the source regions, and the union of the destination
-    regions, specified by the elements of pname:pRegions, must: not overlap
-    in memory
-  * [[VUID-{refpage}-srcBuffer-00118]]
-    pname:srcBuffer must: have been created with
-    ename:VK_BUFFER_USAGE_TRANSFER_SRC_BIT usage flag
-  * [[VUID-{refpage}-srcBuffer-00119]]
-    If pname:srcBuffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-dstBuffer-00120]]
-    pname:dstBuffer must: have been created with
-    ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag
-  * [[VUID-{refpage}-dstBuffer-00121]]
-    If pname:dstBuffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/copy_buffer_to_image_command_buffer_common.txt b/registry/vulkan/chapters/commonvalidity/copy_buffer_to_image_command_buffer_common.txt
deleted file mode 100644
index 7c9f305..0000000
--- a/registry/vulkan/chapters/commonvalidity/copy_buffer_to_image_command_buffer_common.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkCmdCopyBufferToImage* command buffer
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-commandBuffer-01828]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:srcBuffer must: not be a protected buffer
-  * [[VUID-{refpage}-commandBuffer-01829]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstImage must: not be a protected image
-  * [[VUID-{refpage}-commandBuffer-01830]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstImage must: not be an unprotected image
-endif::VK_VERSION_1_1[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/copy_buffer_to_image_common.txt b/registry/vulkan/chapters/commonvalidity/copy_buffer_to_image_common.txt
deleted file mode 100644
index d755095..0000000
--- a/registry/vulkan/chapters/commonvalidity/copy_buffer_to_image_common.txt
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkCmdCopyBufferToImage* commands
-  * [[VUID-{refpage}-pRegions-00171]]
-    pname:srcBuffer must: be large enough to contain all buffer locations
-    that are accessed according to <<copies-buffers-images-addressing,Buffer
-    and Image Addressing>>, for each element of pname:pRegions
-  * [[VUID-{refpage}-pRegions-00173]]
-    The union of all source regions, and the union of all destination
-    regions, specified by the elements of pname:pRegions, must: not overlap
-    in memory
-  * [[VUID-{refpage}-srcBuffer-00174]]
-    pname:srcBuffer must: have been created with
-    ename:VK_BUFFER_USAGE_TRANSFER_SRC_BIT usage flag
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-dstImage-01997]]
-    The <<resources-image-format-features,format features>> of
-    pname:dstImage must: contain ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-srcBuffer-00176]]
-    If pname:srcBuffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-dstImage-00177]]
-    pname:dstImage must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag
-  * [[VUID-{refpage}-dstImage-00178]]
-    If pname:dstImage is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-dstImage-00179]]
-    pname:dstImage must: have a sample count equal to
-    ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-{refpage}-dstImageLayout-00180]]
-    pname:dstImageLayout must: specify the layout of the image subresources
-    of pname:dstImage specified in pname:pRegions at the time this command
-    is executed on a sname:VkDevice
-ifndef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-dstImageLayout-00181]]
-    pname:dstImageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
-    or ename:VK_IMAGE_LAYOUT_GENERAL
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-dstImageLayout-01396]]
-    pname:dstImageLayout must: be
-    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_GENERAL, or
-    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR
-endif::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-imageSubresource-01701]]
-    The pname:imageSubresource.mipLevel member of each element of
-    pname:pRegions must: be less than the pname:mipLevels specified in
-    slink:VkImageCreateInfo when pname:dstImage was created
-  * [[VUID-{refpage}-imageSubresource-01702]]
-    The [eq]#pname:imageSubresource.baseArrayLayer {plus}
-    pname:imageSubresource.layerCount# of each element of pname:pRegions
-    must: be less than or equal to the pname:arrayLayers specified in
-    slink:VkImageCreateInfo when pname:dstImage was created
-  * [[VUID-{refpage}-imageOffset-01793]]
-    The pname:imageOffset and pname:imageExtent members of each element of
-    pname:pRegions must: respect the image transfer granularity requirements
-    of pname:commandBuffer's command pool's queue family, as described in
-    slink:VkQueueFamilyProperties
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-{refpage}-dstImage-02543]]
-    pname:dstImage must: not have been created with pname:flags containing
-    ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-ifndef::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-{refpage}-None-00214]]
-    For each element of pname:pRegions whose pname:imageSubresource contains
-    a depth aspect, the data in pname:srcBuffer must: be in the range
-    [eq]#[0,1]#
-endif::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-{refpage}-commandBuffer-04477]]
-    If the queue family used to create the slink:VkCommandPool which
-    pname:commandBuffer was allocated from does not support
-    ename:VK_QUEUE_GRAPHICS_BIT, for each element of pname:pRegions, the
-    pname:aspectMask member of pname:imageSubresource must: not be
-    ename:VK_IMAGE_ASPECT_DEPTH_BIT or ename:VK_IMAGE_ASPECT_STENCIL_BIT
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/copy_bufferimage_to_imagebuffer_common.txt b/registry/vulkan/chapters/commonvalidity/copy_bufferimage_to_imagebuffer_common.txt
deleted file mode 100644
index ce6d0f7..0000000
--- a/registry/vulkan/chapters/commonvalidity/copy_bufferimage_to_imagebuffer_common.txt
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to commands copying from images to buffers, or buffers to images
-// This relies on an additional attribute {imageparam} set by the command
-// which includes this file, specifying the name of the source or
-// destination image.
-
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-bufferOffset-00193]]
-    If {imageparam} does not have a depth/stencil format, then for each
-    element of pname:pRegions, pname:bufferOffset must: be a multiple of the
-    format's texel block size
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-bufferOffset-01558]]
-    If {imageparam} does not have either a depth/stencil or a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar format>>, then
-    for each element of pname:pRegions, pname:bufferOffset must: be a
-    multiple of the format's texel block size
-  * [[VUID-{refpage}-bufferOffset-01559]]
-    If {imageparam} has a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar format>>, then
-    for each element of pname:pRegions, pname:bufferOffset must: be a
-    multiple of the element size of the compatible format for the format and
-    the pname:aspectMask of the pname:imageSubresource as defined in
-    <<formats-compatible-planes>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-srcImage-00199]]
-    If {imageparam} is of type ename:VK_IMAGE_TYPE_1D, then for each element
-    of pname:pRegions, pname:imageOffset.y must: be `0` and
-    pname:imageExtent.height must: be `1`
-  * [[VUID-{refpage}-imageOffset-00200]]
-    For each element of pname:pRegions, pname:imageOffset.z and
-    [eq]#(pname:imageExtent.depth {plus} pname:imageOffset.z)# must: both be
-    greater than or equal to `0` and less than or equal to the depth of the
-    specified pname:imageSubresource of {imageparam}
-  * [[VUID-{refpage}-srcImage-00201]]
-    If {imageparam} is of type ename:VK_IMAGE_TYPE_1D or
-    ename:VK_IMAGE_TYPE_2D, then for each element of pname:pRegions,
-    pname:imageOffset.z must: be `0` and pname:imageExtent.depth must: be
-    `1`
-  * [[VUID-{refpage}-bufferRowLength-00203]]
-    If {imageparam} is a <<blocked-image, blocked image>>, for each element
-    of pname:pRegions, pname:bufferRowLength must: be a multiple of the
-    compressed texel block width
-  * [[VUID-{refpage}-bufferImageHeight-00204]]
-    If {imageparam} is a <<blocked-image, blocked image>>, for each element
-    of pname:pRegions, pname:bufferImageHeight must: be a multiple of the
-    compressed texel block height
-  * [[VUID-{refpage}-imageOffset-00205]]
-    If {imageparam} is a <<blocked-image, blocked image>>, for each element
-    of pname:pRegions, all members of pname:imageOffset must: be a multiple
-    of the corresponding dimensions of the compressed texel block
-  * [[VUID-{refpage}-bufferOffset-00206]]
-    If {imageparam} is a <<blocked-image, blocked image>>, for each element
-    of pname:pRegions, pname:bufferOffset must: be a multiple of the
-    compressed texel block size in bytes
-  * [[VUID-{refpage}-imageExtent-00207]]
-    If {imageparam} is a <<blocked-image, blocked image>>, for each element
-    of pname:pRegions, pname:imageExtent.width must: be a multiple of the
-    compressed texel block width or [eq]#(pname:imageExtent.width {plus}
-    pname:imageOffset.x)# must: equal the width of the specified
-    pname:imageSubresource of {imageparam}
-  * [[VUID-{refpage}-imageExtent-00208]]
-    If {imageparam} is a <<blocked-image, blocked image>>, for each element
-    of pname:pRegions, pname:imageExtent.height must: be a multiple of the
-    compressed texel block height or [eq]#(pname:imageExtent.height {plus}
-    pname:imageOffset.y)# must: equal the height of the specified
-    pname:imageSubresource of {imageparam}
-  * [[VUID-{refpage}-imageExtent-00209]]
-    If {imageparam} is a <<blocked-image, blocked image>>, for each element
-    of pname:pRegions, pname:imageExtent.depth must: be a multiple of the
-    compressed texel block depth or [eq]#(pname:imageExtent.depth {plus}
-    pname:imageOffset.z)# must: equal the depth of the specified
-    pname:imageSubresource of {imageparam}
-  * [[VUID-{refpage}-aspectMask-00211]]
-    For each element of pname:pRegions, pname:imageSubresource.aspectMask
-    must: specify aspects present in {imageparam}
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-aspectMask-01560]]
-    If {imageparam} has a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar format>>, then
-    for each element of pname:pRegions, pname:imageSubresource.aspectMask
-    must: be ename:VK_IMAGE_ASPECT_PLANE_0_BIT,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT, or ename:VK_IMAGE_ASPECT_PLANE_2_BIT
-    (with ename:VK_IMAGE_ASPECT_PLANE_2_BIT valid only for image formats
-    with three planes)
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-baseArrayLayer-00213]]
-    If {imageparam} is of type ename:VK_IMAGE_TYPE_3D, for each element of
-    pname:pRegions, pname:imageSubresource.baseArrayLayer must: be `0` and
-    pname:imageSubresource.layerCount must: be `1`
-  * [[VUID-{refpage}-pRegions-04725]]
-    If {imageparam} is not a <<blocked-image, blocked image>>, for each
-    element of pname:pRegions, pname:bufferRowLength multiplied by the texel
-    block size of {imageparam} must: be less than or equal to [eq]#2^31^-1#
-  * [[VUID-{refpage}-pRegions-04726]]
-    If {imageparam} is a <<blocked-image, blocked image>>, for each element
-    of pname:pRegions, pname:bufferRowLength divided by the compressed texel
-    block width and then multiplied by the texel block size of {imageparam}
-    must: be less than or equal to [eq]#2^31^-1#
-  * [[VUID-{refpage}-commandBuffer-04052]]
-    If the queue family used to create the slink:VkCommandPool which
-    pname:commandBuffer was allocated from does not support
-    ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT, the
-    pname:bufferOffset member of any element of pname:pRegions must: be a
-    multiple of `4`
-  * [[VUID-{refpage}-srcImage-04053]]
-    If {imageparam} has a depth/stencil format, the pname:bufferOffset
-    member of any element of pname:pRegions must: be a multiple of `4`
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/copy_image_command_buffer_common.txt b/registry/vulkan/chapters/commonvalidity/copy_image_command_buffer_common.txt
deleted file mode 100644
index c4cef5b..0000000
--- a/registry/vulkan/chapters/commonvalidity/copy_image_command_buffer_common.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkCmdCopyImage* command buffer
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-commandBuffer-01825]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:srcImage must: not be a protected image
-  * [[VUID-{refpage}-commandBuffer-01826]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstImage must: not be a protected image
-  * [[VUID-{refpage}-commandBuffer-01827]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstImage must: not be an unprotected image
-endif::VK_VERSION_1_1[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/copy_image_common.txt b/registry/vulkan/chapters/commonvalidity/copy_image_common.txt
deleted file mode 100644
index d8d4fca..0000000
--- a/registry/vulkan/chapters/commonvalidity/copy_image_common.txt
+++ /dev/null
@@ -1,322 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkCmdCopyImage* commands
-  * [[VUID-{refpage}-pRegions-00124]]
-    The union of all source regions, and the union of all destination
-    regions, specified by the elements of pname:pRegions, must: not overlap
-    in memory
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-srcImage-01995]]
-    The <<resources-image-format-features,format features>> of
-    pname:srcImage must: contain ename:VK_FORMAT_FEATURE_TRANSFER_SRC_BIT
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-srcImage-00126]]
-    pname:srcImage must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-srcImage-00127]]
-    If pname:srcImage is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-srcImage-01546]]
-    If pname:srcImage is non-sparse then the image or _disjoint_ plane to be
-    copied must: be bound completely and contiguously to a single
-    sname:VkDeviceMemory object
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-srcImageLayout-00128]]
-    pname:srcImageLayout must: specify the layout of the image subresources
-    of pname:srcImage specified in pname:pRegions at the time this command
-    is executed on a sname:VkDevice
-ifndef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-srcImageLayout-00129]]
-    pname:srcImageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
-    or ename:VK_IMAGE_LAYOUT_GENERAL
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-srcImageLayout-01917]]
-    pname:srcImageLayout must: be
-    ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_GENERAL, or
-    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-dstImage-01996]]
-    The <<resources-image-format-features,format features>> of
-    pname:dstImage must: contain ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-dstImage-00131]]
-    pname:dstImage must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-dstImage-00132]]
-    If pname:dstImage is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-dstImage-01547]]
-    If pname:dstImage is non-sparse then the image or _disjoint_ plane that
-    is the destination of the copy must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-dstImageLayout-00133]]
-    pname:dstImageLayout must: specify the layout of the image subresources
-    of pname:dstImage specified in pname:pRegions at the time this command
-    is executed on a sname:VkDevice
-ifndef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-dstImageLayout-00134]]
-    pname:dstImageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
-    or ename:VK_IMAGE_LAYOUT_GENERAL
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-dstImageLayout-01395]]
-    pname:dstImageLayout must: be
-    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_GENERAL, or
-    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR
-endif::VK_KHR_shared_presentable_image[]
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-srcImage-00135]]
-    The elink:VkFormat of each of pname:srcImage and pname:dstImage must: be
-    compatible, as defined <<copies-images-format-compatibility, above>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-srcImage-01548]]
-    If the elink:VkFormat of each of pname:srcImage and pname:dstImage is
-    not a <<formats-requiring-sampler-ycbcr-conversion,_multi-planar
-    format_>>, the elink:VkFormat of each of pname:srcImage and
-    pname:dstImage must: be compatible, as defined
-    <<copies-images-format-compatibility, above>>
-  * [[VUID-{refpage}-None-01549]]
-    In a copy to or from a plane of a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar image>>, the
-    elink:VkFormat of the image and plane must: be compatible according to
-    <<formats-compatible-planes,the description of compatible planes>> for
-    the plane being copied
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-srcImage-00136]]
-    The sample count of pname:srcImage and pname:dstImage must: match
-  * [[VUID-{refpage}-srcSubresource-01696]]
-    The pname:srcSubresource.mipLevel member of each element of
-    pname:pRegions must: be less than the pname:mipLevels specified in
-    slink:VkImageCreateInfo when pname:srcImage was created
-  * [[VUID-{refpage}-dstSubresource-01697]]
-    The pname:dstSubresource.mipLevel member of each element of
-    pname:pRegions must: be less than the pname:mipLevels specified in
-    slink:VkImageCreateInfo when pname:dstImage was created
-  * [[VUID-{refpage}-srcSubresource-01698]]
-    The [eq]#pname:srcSubresource.baseArrayLayer {plus}
-    pname:srcSubresource.layerCount# of each element of pname:pRegions must:
-    be less than or equal to the pname:arrayLayers specified in
-    slink:VkImageCreateInfo when pname:srcImage was created
-  * [[VUID-{refpage}-dstSubresource-01699]]
-    The [eq]#pname:dstSubresource.baseArrayLayer {plus}
-    pname:dstSubresource.layerCount# of each element of pname:pRegions must:
-    be less than or equal to the pname:arrayLayers specified in
-    slink:VkImageCreateInfo when pname:dstImage was created
-  * [[VUID-{refpage}-srcOffset-01783]]
-    The pname:srcOffset and pname:extent members of each element of
-    pname:pRegions must: respect the image transfer granularity requirements
-    of pname:commandBuffer's command pool's queue family, as described in
-    slink:VkQueueFamilyProperties
-  * [[VUID-{refpage}-dstOffset-01784]]
-    The pname:dstOffset and pname:extent members of each element of
-    pname:pRegions must: respect the image transfer granularity requirements
-    of pname:commandBuffer's command pool's queue family, as described in
-    slink:VkQueueFamilyProperties
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-{refpage}-dstImage-02542]]
-    pname:dstImage and pname:srcImage must: not have been created with
-    pname:flags containing ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-// The remaining common VU used to be in image_copy_common.txt and have been
-// rewritten to apply to the calling command rather than the structure
-// parameter(s) of that command.
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-srcImage-01551]]
-    If neither pname:srcImage nor pname:dstImage has a
-    <<formats-requiring-sampler-ycbcr-conversion, multi-planar image
-    format>> then for each element of pname:pRegions,
-    pname:srcSubresource.aspectMask and pname:dstSubresource.aspectMask
-    must: match
-  * [[VUID-{refpage}-srcImage-01552]]
-    If pname:srcImage has a elink:VkFormat with
-    <<formats-requiring-sampler-ycbcr-conversion,two planes>> then for each
-    element of pname:pRegions, pname:srcSubresource.aspectMask must: be
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT or ename:VK_IMAGE_ASPECT_PLANE_1_BIT
-  * [[VUID-{refpage}-srcImage-01553]]
-    If pname:srcImage has a elink:VkFormat with
-    <<formats-requiring-sampler-ycbcr-conversion,three planes>> then for
-    each element of pname:pRegions, pname:srcSubresource.aspectMask must: be
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT, or
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT
-  * [[VUID-{refpage}-dstImage-01554]]
-    If pname:dstImage has a elink:VkFormat with
-    <<formats-requiring-sampler-ycbcr-conversion,two planes>> then for each
-    element of pname:pRegions, pname:dstSubresource.aspectMask must: be
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT or ename:VK_IMAGE_ASPECT_PLANE_1_BIT
-  * [[VUID-{refpage}-dstImage-01555]]
-    If pname:dstImage has a elink:VkFormat with
-    <<formats-requiring-sampler-ycbcr-conversion,three planes>> then for
-    each element of pname:pRegions, pname:dstSubresource.aspectMask must: be
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT, or
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT
-  * [[VUID-{refpage}-srcImage-01556]]
-    If pname:srcImage has a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar image format>>
-    and the pname:dstImage does not have a multi-planar image format, then
-    for each element of pname:pRegions, pname:dstSubresource.aspectMask
-    must: be ename:VK_IMAGE_ASPECT_COLOR_BIT
-  * [[VUID-{refpage}-dstImage-01557]]
-    If pname:dstImage has a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar image format>>
-    and the pname:srcImage does not have a multi-planar image format, then
-    for each element of pname:pRegions, pname:srcSubresource.aspectMask
-    must: be ename:VK_IMAGE_ASPECT_COLOR_BIT
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-srcImage-00139]]
-    If either pname:srcImage or pname:dstImage is of type
-    ename:VK_IMAGE_TYPE_3D, then for each element of pname:pRegions,
-    pname:srcSubresource.baseArrayLayer and
-    pname:dstSubresource.baseArrayLayer must: each be `0`, and
-    pname:srcSubresource.layerCount and pname:dstSubresource.layerCount
-    must: each be `1`
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-srcImage-04443]]
-    If pname:srcImage is of type ename:VK_IMAGE_TYPE_3D, then for each
-    element of pname:pRegions, pname:srcSubresource.baseArrayLayer must: be
-    `0` and pname:srcSubresource.layerCount must: be `1`
-  * [[VUID-{refpage}-dstImage-04444]]
-    If pname:dstImage is of type ename:VK_IMAGE_TYPE_3D, then for each
-    element of pname:pRegions, pname:dstSubresource.baseArrayLayer must: be
-    `0` and pname:dstSubresource.layerCount must: be `1`
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-aspectMask-00142]]
-    For each element of pname:pRegions, pname:srcSubresource.aspectMask
-    must: specify aspects present in pname:srcImage
-  * [[VUID-{refpage}-aspectMask-00143]]
-    For each element of pname:pRegions, pname:dstSubresource.aspectMask
-    must: specify aspects present in pname:dstImage
-  * [[VUID-{refpage}-srcOffset-00144]]
-    For each element of pname:pRegions, pname:srcOffset.x and
-    [eq]#(pname:extent.width {plus} pname:srcOffset.x)# must: both be
-    greater than or equal to `0` and less than or equal to the width of the
-    specified pname:srcSubresource of pname:srcImage
-  * [[VUID-{refpage}-srcOffset-00145]]
-    For each element of pname:pRegions, pname:srcOffset.y and
-    [eq]#(pname:extent.height {plus} pname:srcOffset.y)# must: both be
-    greater than or equal to `0` and less than or equal to the height of the
-    specified pname:srcSubresource of pname:srcImage
-  * [[VUID-{refpage}-srcImage-00146]]
-    If pname:srcImage is of type ename:VK_IMAGE_TYPE_1D, then for each
-    element of pname:pRegions, pname:srcOffset.y must: be `0` and
-    pname:extent.height must: be `1`
-  * [[VUID-{refpage}-srcOffset-00147]]
-    For each element of pname:pRegions, pname:srcOffset.z and
-    [eq]#(pname:extent.depth {plus} pname:srcOffset.z)# must: both be
-    greater than or equal to `0` and less than or equal to the depth of the
-    specified pname:srcSubresource of pname:srcImage
-  * [[VUID-{refpage}-srcImage-01785]]
-    If pname:srcImage is of type ename:VK_IMAGE_TYPE_1D, then for each
-    element of pname:pRegions, pname:srcOffset.z must: be `0` and
-    pname:extent.depth must: be `1`
-  * [[VUID-{refpage}-dstImage-01786]]
-    If pname:dstImage is of type ename:VK_IMAGE_TYPE_1D, then for each
-    element of pname:pRegions, pname:dstOffset.z must: be `0` and
-    pname:extent.depth must: be `1`
-  * [[VUID-{refpage}-srcImage-01787]]
-    If pname:srcImage is of type ename:VK_IMAGE_TYPE_2D, then for each
-    element of pname:pRegions, pname:srcOffset.z must: be `0`
-  * [[VUID-{refpage}-dstImage-01788]]
-    If pname:dstImage is of type ename:VK_IMAGE_TYPE_2D, then for each
-    element of pname:pRegions, pname:dstOffset.z must: be `0`
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-srcImage-01789]]
-    If pname:srcImage or pname:dstImage is of type ename:VK_IMAGE_TYPE_2D,
-    then for each element of pname:pRegions, pname:extent.depth must: be `1`
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-srcImage-01790]]
-    If pname:srcImage and pname:dstImage are both of type
-    ename:VK_IMAGE_TYPE_2D, then for each element of pname:pRegions,
-    pname:extent.depth must: be `1`
-  * [[VUID-{refpage}-srcImage-01791]]
-    If pname:srcImage is of type ename:VK_IMAGE_TYPE_2D, and pname:dstImage
-    is of type ename:VK_IMAGE_TYPE_3D, then for each element of
-    pname:pRegions, pname:extent.depth must: equal
-    pname:srcSubresource.layerCount
-  * [[VUID-{refpage}-dstImage-01792]]
-    If pname:dstImage is of type ename:VK_IMAGE_TYPE_2D, and pname:srcImage
-    is of type ename:VK_IMAGE_TYPE_3D, then for each element of
-    pname:pRegions, pname:extent.depth must: equal
-    pname:dstSubresource.layerCount
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-dstOffset-00150]]
-    For each element of pname:pRegions, pname:dstOffset.x and
-    [eq]#(pname:extent.width {plus} pname:dstOffset.x)# must: both be
-    greater than or equal to `0` and less than or equal to the width of the
-    specified pname:dstSubresource of pname:dstImage
-  * [[VUID-{refpage}-dstOffset-00151]]
-    For each element of pname:pRegions, pname:dstOffset.y and
-    [eq]#(pname:extent.height {plus} pname:dstOffset.y)# must: both be
-    greater than or equal to `0` and less than or equal to the height of the
-    specified pname:dstSubresource of pname:dstImage
-  * [[VUID-{refpage}-dstImage-00152]]
-    If pname:dstImage is of type ename:VK_IMAGE_TYPE_1D, then for each
-    element of pname:pRegions, pname:dstOffset.y must: be `0` and
-    pname:extent.height must: be `1`
-  * [[VUID-{refpage}-dstOffset-00153]]
-    For each element of pname:pRegions, pname:dstOffset.z and
-    [eq]#(pname:extent.depth {plus} pname:dstOffset.z)# must: both be
-    greater than or equal to `0` and less than or equal to the depth of the
-    specified pname:dstSubresource of pname:dstImage
-  * [[VUID-{refpage}-srcImage-01727]]
-    If pname:srcImage is a <<blocked-image, blocked image>>, then for each
-    element of pname:pRegions, all members of pname:srcOffset must: be a
-    multiple of the corresponding dimensions of the compressed texel block
-  * [[VUID-{refpage}-srcImage-01728]]
-    If pname:srcImage is a <<blocked-image, blocked image>>, then for each
-    element of pname:pRegions, pname:extent.width must: be a multiple of the
-    compressed texel block width or [eq]#(pname:extent.width {plus}
-    pname:srcOffset.x)# must: equal the width of the specified
-    pname:srcSubresource of pname:srcImage
-  * [[VUID-{refpage}-srcImage-01729]]
-    If pname:srcImage is a <<blocked-image, blocked image>>, then for each
-    element of pname:pRegions, pname:extent.height must: be a multiple of
-    the compressed texel block height or [eq]#(pname:extent.height {plus}
-    pname:srcOffset.y)# must: equal the height of the specified
-    pname:srcSubresource of pname:srcImage
-  * [[VUID-{refpage}-srcImage-01730]]
-    If pname:srcImage is a <<blocked-image, blocked image>>, then for each
-    element of pname:pRegions, pname:extent.depth must: be a multiple of the
-    compressed texel block depth or [eq]#(pname:extent.depth {plus}
-    pname:srcOffset.z)# must: equal the depth of the specified
-    pname:srcSubresource of pname:srcImage
-  * [[VUID-{refpage}-dstImage-01731]]
-    If pname:dstImage is a <<blocked-image, blocked image>>, then for each
-    element of pname:pRegions, all members of pname:dstOffset must: be a
-    multiple of the corresponding dimensions of the compressed texel block
-  * [[VUID-{refpage}-dstImage-01732]]
-    If pname:dstImage is a <<blocked-image, blocked image>>, then for each
-    element of pname:pRegions, pname:extent.width must: be a multiple of the
-    compressed texel block width or [eq]#(pname:extent.width {plus}
-    pname:dstOffset.x)# must: equal the width of the specified
-    pname:dstSubresource of pname:dstImage
-  * [[VUID-{refpage}-dstImage-01733]]
-    If pname:dstImage is a <<blocked-image, blocked image>>, then for each
-    element of pname:pRegions, pname:extent.height must: be a multiple of
-    the compressed texel block height or [eq]#(pname:extent.height {plus}
-    pname:dstOffset.y)# must: equal the height of the specified
-    pname:dstSubresource of pname:dstImage
-  * [[VUID-{refpage}-dstImage-01734]]
-    If pname:dstImage is a <<blocked-image, blocked image>>, then for each
-    element of pname:pRegions, pname:extent.depth must: be a multiple of the
-    compressed texel block depth or [eq]#(pname:extent.depth {plus}
-    pname:dstOffset.z)# must: equal the depth of the specified
-    pname:dstSubresource of pname:dstImage
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/copy_image_to_buffer_command_buffer_common.txt b/registry/vulkan/chapters/commonvalidity/copy_image_to_buffer_command_buffer_common.txt
deleted file mode 100644
index d549a77..0000000
--- a/registry/vulkan/chapters/commonvalidity/copy_image_to_buffer_command_buffer_common.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkCmdCopyImageToBuffer* command buffer
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-commandBuffer-01831]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:srcImage must: not be a protected image
-  * [[VUID-{refpage}-commandBuffer-01832]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstBuffer must: not be a protected buffer
-  * [[VUID-{refpage}-commandBuffer-01833]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstBuffer must: not be an unprotected buffer
-endif::VK_VERSION_1_1[]
-
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/copy_image_to_buffer_common.txt b/registry/vulkan/chapters/commonvalidity/copy_image_to_buffer_common.txt
deleted file mode 100644
index 8387efc..0000000
--- a/registry/vulkan/chapters/commonvalidity/copy_image_to_buffer_common.txt
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkCmdCopyImageToBuffer* commands
-  * [[VUID-{refpage}-pRegions-00183]]
-    pname:dstBuffer must: be large enough to contain all buffer locations
-    that are accessed according to <<copies-buffers-images-addressing,Buffer
-    and Image Addressing>>, for each element of pname:pRegions
-  * [[VUID-{refpage}-pRegions-00184]]
-    The union of all source regions, and the union of all destination
-    regions, specified by the elements of pname:pRegions, must: not overlap
-    in memory
-  * [[VUID-{refpage}-srcImage-00186]]
-    pname:srcImage must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-srcImage-01998]]
-    The <<resources-image-format-features,format features>> of
-    pname:srcImage must: contain ename:VK_FORMAT_FEATURE_TRANSFER_SRC_BIT
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-srcImage-00187]]
-    If pname:srcImage is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-dstBuffer-00191]]
-    pname:dstBuffer must: have been created with
-    ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag
-  * [[VUID-{refpage}-dstBuffer-00192]]
-    If pname:dstBuffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-srcImage-00188]]
-    pname:srcImage must: have a sample count equal to
-    ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-{refpage}-srcImageLayout-00189]]
-    pname:srcImageLayout must: specify the layout of the image subresources
-    of pname:srcImage specified in pname:pRegions at the time this command
-    is executed on a sname:VkDevice
-ifndef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-srcImageLayout-00190]]
-    pname:srcImageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
-    or ename:VK_IMAGE_LAYOUT_GENERAL
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-srcImageLayout-01397]]
-    pname:srcImageLayout must: be
-    ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_GENERAL, or
-    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR
-endif::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-imageSubresource-01703]]
-    The pname:imageSubresource.mipLevel member of each element of
-    pname:pRegions must: be less than the pname:mipLevels specified in
-    slink:VkImageCreateInfo when pname:srcImage was created
-  * [[VUID-{refpage}-imageSubresource-01704]]
-    The [eq]#pname:imageSubresource.baseArrayLayer {plus}
-    pname:imageSubresource.layerCount# of each element of pname:pRegions
-    must: be less than or equal to the pname:arrayLayers specified in
-    slink:VkImageCreateInfo when pname:srcImage was created
-  * [[VUID-{refpage}-imageOffset-01794]]
-    The pname:imageOffset and pname:imageExtent members of each element of
-    pname:pRegions must: respect the image transfer granularity requirements
-    of pname:commandBuffer's command pool's queue family, as described in
-    slink:VkQueueFamilyProperties
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-{refpage}-srcImage-02544]]
-    pname:srcImage must: not have been created with pname:flags containing
-    ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/create_ray_tracing_pipelines_common.txt b/registry/vulkan/chapters/commonvalidity/create_ray_tracing_pipelines_common.txt
deleted file mode 100644
index 8b06ca4..0000000
--- a/registry/vulkan/chapters/commonvalidity/create_ray_tracing_pipelines_common.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// common to CreateRayTracingPipelines
-  * [[VUID-{refpage}-flags-03415]]
-    If the pname:flags member of any element of pname:pCreateInfos contains
-    the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the
-    pname:basePipelineIndex member of that same element is not `-1`,
-    pname:basePipelineIndex must: be less than the index into
-    pname:pCreateInfos that corresponds to that element
-  * [[VUID-{refpage}-flags-03416]]
-    If the pname:flags member of any element of pname:pCreateInfos contains
-    the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, the base pipeline
-    must: have been created with the
-    ename:VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-{refpage}-flags-03816]]
-    pname:flags must: not contain the ename:VK_PIPELINE_CREATE_DISPATCH_BASE
-    flag
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-  * [[VUID-{refpage}-pipelineCache-02903]]
-    If pname:pipelineCache was created with
-    ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, host
-    access to pname:pipelineCache must: be
-    <<fundamentals-threadingbehavior,externally synchronized>>
-endif::VK_EXT_pipeline_creation_cache_control[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/deferred_operations_common.txt b/registry/vulkan/chapters/commonvalidity/deferred_operations_common.txt
deleted file mode 100644
index b5fe7ad..0000000
--- a/registry/vulkan/chapters/commonvalidity/deferred_operations_common.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to commands including a deferredOperation parameter
-  * [[VUID-{refpage}-deferredOperation-03677]]
-    If pname:deferredOperation is not dlink:VK_NULL_HANDLE, it must: be a
-    valid slink:VkDeferredOperationKHR object
-  * [[VUID-{refpage}-deferredOperation-03678]]
-    Any previous deferred operation that was associated with
-    pname:deferredOperation must: be complete
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/draw_common.txt b/registry/vulkan/chapters/commonvalidity/draw_common.txt
deleted file mode 100644
index 55361ae..0000000
--- a/registry/vulkan/chapters/commonvalidity/draw_common.txt
+++ /dev/null
@@ -1,415 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to all drawing commands
-include::draw_dispatch_common.txt[]
-  * [[VUID-{refpage}-renderPass-02684]]
-    The current render pass must: be <<renderpass-compatibility,compatible>>
-    with the pname:renderPass member of the
-    sname:VkGraphicsPipelineCreateInfo structure specified when creating the
-    sname:VkPipeline bound to ename:VK_PIPELINE_BIND_POINT_GRAPHICS
-  * [[VUID-{refpage}-subpass-02685]]
-    The subpass index of the current render pass must: be equal to the
-    pname:subpass member of the sname:VkGraphicsPipelineCreateInfo structure
-    specified when creating the sname:VkPipeline bound to
-    ename:VK_PIPELINE_BIND_POINT_GRAPHICS
-  * [[VUID-{refpage}-None-02686]]
-    Every input attachment used by the current subpass must: be bound to the
-    pipeline via a descriptor set
-  * [[VUID-{refpage}-None-04584]]
-    Image subresources used as attachments in the current render pass must:
-    not be accessed in any way other than as an attachment by this command,
-    except for cases involving read-only access to depth/stencil attachments
-    as described in the <<renderpass-attachment-nonattachment, Render Pass>>
-    chapter
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-{refpage}-maxMultiviewInstanceIndex-02688]]
-    If the draw is recorded in a render pass instance with multiview
-    enabled, the maximum instance index must: be less than or equal to
-    slink:VkPhysicalDeviceMultiviewProperties::pname:maxMultiviewInstanceIndex
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifdef::VK_EXT_sample_locations[]
-  * [[VUID-{refpage}-sampleLocationsEnable-02689]]
-    If the bound graphics pipeline was created with
-    slink:VkPipelineSampleLocationsStateCreateInfoEXT::pname:sampleLocationsEnable
-    set to ename:VK_TRUE and the current subpass has a depth/stencil
-    attachment, then that attachment must: have been created with the
-    ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set
-endif::VK_EXT_sample_locations[]
-ifdef::VK_EXT_extended_dynamic_state[]
-  * [[VUID-{refpage}-viewportCount-03417]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled,
-    but not the ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state
-    enabled, then flink:vkCmdSetViewportWithCountEXT must: have been called
-    in the current command buffer prior to this drawing command, and the
-    pname:viewportCount parameter of fname:vkCmdSetViewportWithCountEXT
-    must: match the
-    sname:VkPipelineViewportStateCreateInfo::pname:scissorCount of the
-    pipeline
-  * [[VUID-{refpage}-scissorCount-03418]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, but
-    not the ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state
-    enabled, then flink:vkCmdSetScissorWithCountEXT must: have been called
-    in the current command buffer prior to this drawing command, and the
-    pname:scissorCount parameter of fname:vkCmdSetScissorWithCountEXT must:
-    match the sname:VkPipelineViewportStateCreateInfo::pname:viewportCount
-    of the pipeline
-  * [[VUID-{refpage}-viewportCount-03419]]
-    If the bound graphics pipeline state was created with both the
-    ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT and
-    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic states enabled
-    then both flink:vkCmdSetViewportWithCountEXT and
-    flink:vkCmdSetScissorWithCountEXT must: have been called in the current
-    command buffer prior to this drawing command, and the
-    pname:viewportCount parameter of fname:vkCmdSetViewportWithCountEXT
-    must: match the pname:scissorCount parameter of
-    fname:vkCmdSetScissorWithCountEXT
-ifdef::VK_NV_clip_space_w_scaling[]
-  * [[VUID-{refpage}-viewportCount-04137]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled,
-    but not the ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV dynamic state
-    enabled, then the bound graphics pipeline must: have been created with
-    slink:VkPipelineViewportWScalingStateCreateInfoNV::pname:viewportCount
-    greater or equal to the pname:viewportCount parameter in the last call
-    to flink:vkCmdSetViewportWithCountEXT
-  * [[VUID-{refpage}-viewportCount-04138]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT and
-    ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV dynamic states enabled then
-    the pname:viewportCount parameter in the last call to
-    flink:vkCmdSetViewportWScalingNV must: be greater than or equal to the
-    pname:viewportCount parameter in the last call to
-    flink:vkCmdSetViewportWithCountEXT
-endif::VK_NV_clip_space_w_scaling[]
-ifdef::VK_NV_shading_rate_image[]
-  * [[VUID-{refpage}-viewportCount-04139]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled,
-    but not the ename:VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV
-    dynamic state enabled, then the bound graphics pipeline must: have been
-    created with
-    slink:VkPipelineViewportShadingRateImageStateCreateInfoNV::pname:viewportCount
-    greater or equal to the pname:viewportCount parameter in the last call
-    to flink:vkCmdSetViewportWithCountEXT
-  * [[VUID-{refpage}-viewportCount-04140]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT and
-    ename:VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV dynamic states
-    enabled then the pname:viewportCount parameter in the last call to
-    flink:vkCmdSetViewportShadingRatePaletteNV must: be greater than or
-    equal to the pname:viewportCount parameter in the last call to
-    flink:vkCmdSetViewportWithCountEXT
-endif::VK_NV_shading_rate_image[]
-ifdef::VK_NV_viewport_swizzle[]
-  * [[VUID-{refpage}-VkPipelineVieportCreateInfo-04141]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled and
-    a slink:VkPipelineViewportSwizzleStateCreateInfoNV structure chained
-    from pname:VkPipelineVieportCreateInfo, then the bound graphics pipeline
-    must: have been created with
-    slink:VkPipelineViewportSwizzleStateCreateInfoNV::pname:viewportCount
-    greater or equal to the pname:viewportCount parameter in the last call
-    to flink:vkCmdSetViewportWithCountEXT
-endif::VK_NV_viewport_swizzle[]
-ifdef::VK_NV_scissor_exclusive[]
-  * [[VUID-{refpage}-VkPipelineVieportCreateInfo-04142]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled and
-    a slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV structure
-    chained from pname:VkPipelineVieportCreateInfo, then the bound graphics
-    pipeline must: have been created with
-    slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV::pname:exclusiveScissorCount
-    greater or equal to the pname:viewportCount parameter in the last call
-    to flink:vkCmdSetViewportWithCountEXT
-endif::VK_NV_scissor_exclusive[]
-  * [[VUID-{refpage}-primitiveTopology-03420]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT dynamic state enabled then
-    flink:vkCmdSetPrimitiveTopologyEXT must: have been called in the current
-    command buffer prior to this drawing command, and the
-    pname:primitiveTopology parameter of fname:vkCmdSetPrimitiveTopologyEXT
-    must: be of the same <<drawing-primitive-topology-class, topology
-    class>> as the pipeline
-    slink:VkPipelineInputAssemblyStateCreateInfo::pname:topology state
-endif::VK_EXT_extended_dynamic_state[]
-ifdef::VK_EXT_extended_dynamic_state2[]
-  * [[VUID-{refpage}-None-04875]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT dynamic state enabled
-    then flink:vkCmdSetPatchControlPointsEXT must: have been called in the
-    current command buffer prior to this drawing command
-  * [[VUID-{refpage}-None-04876]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT dynamic state
-    enabled then flink:vkCmdSetRasterizerDiscardEnableEXT must: have been
-    called in the current command buffer prior to this drawing command
-  * [[VUID-{refpage}-None-04877]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT dynamic state enabled then
-    flink:vkCmdSetDepthBiasEnableEXT must: have been called in the current
-    command buffer prior to this drawing command
-  * [[VUID-{refpage}-logicOp-04878]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_LOGIC_OP_EXT dynamic state enabled then
-    flink:vkCmdSetLogicOpEXT must: have been called in the current command
-    buffer prior to this drawing command and the pname:logicOp must: be a
-    valid elink:VkLogicOp value
-  * [[VUID-{refpage}-None-04879]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT dynamic state
-    enabled then flink:vkCmdSetPrimitiveRestartEnableEXT must: have been
-    called in the current command buffer prior to this drawing command
-endif::VK_EXT_extended_dynamic_state2[]
-ifdef::VK_KHR_fragment_shading_rate+VK_EXT_extended_dynamic_state[]
-  * [[VUID-{refpage}-primitiveFragmentShadingRateWithMultipleViewports-04552]]
-    If the <<limits-primitiveFragmentShadingRateWithMultipleViewports,
-    pname:primitiveFragmentShadingRateWithMultipleViewports>> limit is not
-    supported, the bound graphics pipeline was created with the
-    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled,
-    and any of the shader stages of the bound graphics pipeline write to the
-    code:PrimitiveShadingRateKHR built-in, then
-    flink:vkCmdSetViewportWithCountEXT must: have been called in the current
-    command buffer prior to this drawing command, and the
-    pname:viewportCount parameter of fname:vkCmdSetViewportWithCountEXT
-    must: be `1`
-endif::VK_KHR_fragment_shading_rate+VK_EXT_extended_dynamic_state[]
-  * [[VUID-{refpage}-blendEnable-04727]]
-    If rasterization is not disabled in the bound graphics pipeline, then
-    for each color attachment in the subpass, if the corresponding image
-    view's <<resources-image-view-format-features,format features>> do not
-    contain ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT, then the
-    pname:blendEnable member of the corresponding element of the
-    pname:pAttachments member of pname:pColorBlendState must: be
-    ename:VK_FALSE
-  * [[VUID-{refpage}-rasterizationSamples-04740]]
-    If rasterization is not disabled in the bound graphics pipeline, and
-    neither the `apiext:VK_AMD_mixed_attachment_samples` nor the
-    `apiext:VK_NV_framebuffer_mixed_samples` extensions are enabled, then
-    slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples
-    must: be the same as the current subpass color and/or depth/stencil
-    attachments
-ifdef::VK_EXT_extended_dynamic_state[]
-ifdef::VK_EXT_vertex_input_dynamic_state[]
-  * [[VUID-{refpage}-None-04912]]
-    If the bound graphics pipeline was created with both the
-    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT and
-    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT dynamic states
-    enabled, then flink:vkCmdSetVertexInputEXT must: have been called in the
-    current command buffer prior to this draw command
-  * [[VUID-{refpage}-pStrides-04913]]
-    If the bound graphics pipeline was created with the
-    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT dynamic state
-    enabled, but not the ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT dynamic
-    state enabled, then flink:vkCmdBindVertexBuffers2EXT must: have been
-    called in the current command buffer prior to this draw command, and the
-    pname:pStrides parameter of flink:vkCmdBindVertexBuffers2EXT must: not
-    be `NULL`
-endif::VK_EXT_vertex_input_dynamic_state[]
-ifndef::VK_EXT_vertex_input_dynamic_state[]
-  * [[VUID-{refpage}-pStrides-04884]]
-    If the bound graphics pipeline was created with the
-    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT dynamic state
-    enabled, then flink:vkCmdBindVertexBuffers2EXT must: have been called in
-    the current command buffer prior to this drawing command, and the
-    pname:pStrides parameter of flink:vkCmdBindVertexBuffers2EXT must: not
-    be `NULL`
-endif::VK_EXT_vertex_input_dynamic_state[]
-endif::VK_EXT_extended_dynamic_state[]
-ifdef::VK_EXT_vertex_input_dynamic_state[]
-  * [[VUID-{refpage}-None-04914]]
-    If the bound graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT dynamic state enabled, then
-    flink:vkCmdSetVertexInputEXT must: have been called in the current
-    command buffer prior to this draw command
-endif::VK_EXT_vertex_input_dynamic_state[]
-ifdef::VK_KHR_dynamic_rendering[]
-  * [[VUID-{refpage}-imageView-06172]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR, the pname:imageView member of
-    pname:pDepthAttachment is not dlink:VK_NULL_HANDLE, and the pname:layout
-    member of pname:pDepthAttachment is
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, this command
-    must: not write any values to the depth attachment
-  * [[VUID-{refpage}-imageView-06173]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR, the pname:imageView member of
-    pname:pStencilAttachment is not dlink:VK_NULL_HANDLE, and the
-    pname:layout member of pname:pStencilAttachment is
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, this command
-    must: not write any values to the stencil attachment
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-  * [[VUID-{refpage}-imageView-06174]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR, the pname:imageView member of
-    pname:pDepthAttachment is not dlink:VK_NULL_HANDLE, and the pname:layout
-    member of pname:pDepthAttachment is
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, this
-    command must: not write any values to the depth attachment
-  * [[VUID-{refpage}-imageView-06175]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR, the pname:imageView member of
-    pname:pStencilAttachment is not dlink:VK_NULL_HANDLE, and the
-    pname:layout member of pname:pStencilAttachment is
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, this
-    command must: not write any values to the stencil attachment
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * [[VUID-{refpage}-imageView-06176]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR, the pname:imageView member of
-    pname:pDepthAttachment is not dlink:VK_NULL_HANDLE, and the pname:layout
-    member of pname:pDepthAttachment is
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, this command must: not
-    write any values to the depth attachment
-  * [[VUID-{refpage}-imageView-06177]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR, the pname:imageView member of
-    pname:pStencilAttachment is not dlink:VK_NULL_HANDLE, and the
-    pname:layout member of pname:pStencilAttachment is
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL, this command must: not
-    write any values to the stencil attachment
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * [[VUID-{refpage}-viewMask-06178]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR, the currently bound graphics pipeline
-    must: have been created with a
-    slink:VkPipelineRenderingCreateInfoKHR::pname:viewMask equal to
-    slink:VkRenderingInfoKHR::pname:viewMask
-  * [[VUID-{refpage}-colorAttachmentCount-06179]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR, the currently bound graphics pipeline
-    must: have been created with a
-    slink:VkPipelineRenderingCreateInfoKHR::pname:colorAttachmentCount equal
-    to slink:VkRenderingInfoKHR::pname:colorAttachmentCount
-  * [[VUID-{refpage}-colorAttachmentCount-06180]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR and
-    slink:VkRenderingInfoKHR::pname:colorAttachmentCount greater than `0`,
-    then each element of the
-    slink:VkRenderingInfoKHR::pname:pColorAttachments array with a
-    pname:imageView not equal to dlink:VK_NULL_HANDLE must: have been
-    created with a elink:VkFormat equal to the corresponding element of
-    slink:VkPipelineRenderingCreateInfoKHR::pname:pColorAttachmentFormats
-    used to create the currently bound graphics pipeline
-  * [[VUID-{refpage}-pDepthAttachment-06181]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR and
-    slink:VkRenderingInfoKHR::pname:pDepthAttachment->pname:imageView was
-    not dlink:VK_NULL_HANDLE, the value of
-    slink:VkPipelineRenderingCreateInfoKHR::pname:depthAttachmentFormat used
-    to create the currently bound graphics pipeline must: be equal to the
-    elink:VkFormat used to create
-    slink:VkRenderingInfoKHR::pname:pDepthAttachment->pname:imageView
-  * [[VUID-{refpage}-pStencilAttachment-06182]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR and
-    slink:VkRenderingInfoKHR::pname:pStencilAttachment->pname:imageView was
-    not dlink:VK_NULL_HANDLE, the value of
-    slink:VkPipelineRenderingCreateInfoKHR::pname:stencilAttachmentFormat
-    used to create the currently bound graphics pipeline must: be equal to
-    the elink:VkFormat used to create
-    slink:VkRenderingInfoKHR::pname:pStencilAttachment->pname:imageView
-ifdef::VK_KHR_fragment_shading_rate[]
-  * [[VUID-{refpage}-imageView-06183]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR and
-    slink:VkRenderingFragmentShadingRateAttachmentInfoKHR::pname:imageView
-    was not dlink:VK_NULL_HANDLE, the currently bound graphics pipeline
-    must: have been created with
-    ename:VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-{refpage}-imageView-06184]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR and
-    slink:VkRenderingFragmentDensityMapAttachmentInfoEXT::pname:imageView
-    was not dlink:VK_NULL_HANDLE, the currently bound graphics pipeline
-    must: have been created with
-    ename:VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
-  * [[VUID-{refpage}-colorAttachmentCount-06185]]
-    If the currently bound pipeline was created with a
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure, and the current render
-    pass instance was begun with flink:vkCmdBeginRenderingKHR with a
-    slink:VkRenderingInfoKHR::pname:colorAttachmentCount parameter greater
-    than `0`, then each element of the
-    slink:VkRenderingInfoKHR::pname:pColorAttachments array with a
-    pname:imageView not equal to dlink:VK_NULL_HANDLE must: have been
-    created with a sample count equal to the corresponding element of the
-    pname:pColorAttachmentSamples member of
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV used to create the currently bound
-    graphics pipeline
-  * [[VUID-{refpage}-pDepthAttachment-06186]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR, the currently bound pipeline was created
-    with a slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure, and
-    slink:VkRenderingInfoKHR::pname:pDepthAttachment->pname:imageView was
-    not dlink:VK_NULL_HANDLE, the value of the
-    pname:depthStencilAttachmentSamples member of
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV used to create the currently bound
-    graphics pipeline must: be equal to the sample count used to create
-    slink:VkRenderingInfoKHR::pname:pDepthAttachment->pname:imageView
-  * [[VUID-{refpage}-pStencilAttachment-06187]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR, the currently bound pipeline was created
-    with a slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure, and
-    slink:VkRenderingInfoKHR::pname:pStencilAttachment->pname:imageView was
-    not dlink:VK_NULL_HANDLE, the value of the
-    pname:depthStencilAttachmentSamples member of
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV used to create the currently bound
-    graphics pipeline must: be equal to the sample count used to create
-    slink:VkRenderingInfoKHR::pname:pStencilAttachment->pname:imageView
-  * [[VUID-{refpage}-colorAttachmentCount-06188]]
-    If the currently bound pipeline was created without a
-    slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure, and the current render
-    pass instance was begun with flink:vkCmdBeginRenderingKHR with a
-    slink:VkRenderingInfoKHR::pname:colorAttachmentCount parameter greater
-    than `0`, then each element of the
-    slink:VkRenderingInfoKHR::pname:pColorAttachments array with a
-    pname:imageView not equal to dlink:VK_NULL_HANDLE must: have been
-    created with a sample count equal to the value of
-    slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples
-    used to create the currently bound graphics pipeline
-  * [[VUID-{refpage}-pDepthAttachment-06189]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR, the currently bound pipeline was created
-    without a slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure, and
-    slink:VkRenderingInfoKHR::pname:pDepthAttachment->pname:imageView was
-    not dlink:VK_NULL_HANDLE, the value of
-    slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples
-    used to create the currently bound graphics pipeline must: be equal to
-    the sample count used to create
-    slink:VkRenderingInfoKHR::pname:pDepthAttachment->pname:imageView
-  * [[VUID-{refpage}-pStencilAttachment-06190]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR, the currently bound pipeline was created
-    without a slink:VkAttachmentSampleCountInfoAMD or
-    slink:VkAttachmentSampleCountInfoNV structure, and
-    slink:VkRenderingInfoKHR::pname:pStencilAttachment->pname:imageView was
-    not dlink:VK_NULL_HANDLE, the value of
-    slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples
-    used to create the currently bound graphics pipeline must: be equal to
-    the sample count used to create
-    slink:VkRenderingInfoKHR::pname:pStencilAttachment->pname:imageView
-  * [[VUID-{refpage}-renderPass-06198]]
-    If the current render pass instance was begun with
-    flink:vkCmdBeginRenderingKHR, the currently bound pipeline must: have
-    been created with a slink:VkGraphicsPipelineCreateInfo::pname:renderPass
-    equal to dlink:VK_NULL_HANDLE
-endif::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
-endif::VK_KHR_dynamic_rendering[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/draw_dispatch_common.txt b/registry/vulkan/chapters/commonvalidity/draw_dispatch_common.txt
deleted file mode 100644
index 6146953..0000000
--- a/registry/vulkan/chapters/commonvalidity/draw_dispatch_common.txt
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to all dispatch and drawing commands
-  * [[VUID-{refpage}-magFilter-04553]]
-    If a slink:VkSampler created with pname:magFilter or pname:minFilter
-    equal to ename:VK_FILTER_LINEAR and pname:compareEnable equal to
-    ename:VK_FALSE is used to sample a slink:VkImageView as a result of this
-    command, then the image view's
-    <<resources-image-view-format-features,format features>> must: contain
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-  * [[VUID-{refpage}-mipmapMode-04770]]
-    If a slink:VkSampler created with pname:mipmapMode equal to
-    ename:VK_SAMPLER_MIPMAP_MODE_LINEAR and pname:compareEnable equal to
-    ename:VK_FALSE is used to sample a slink:VkImageView as a result of this
-    command, then the image view's
-    <<resources-image-view-format-features,format features>> must: contain
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-  * [[VUID-{refpage}-None-02691]]
-    If a sname:VkImageView is accessed using atomic operations as a result
-    of this command, then the image view's
-    <<resources-image-view-format-features,format features>> must: contain
-    ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT
-ifdef::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-  * [[VUID-{refpage}-None-02692]]
-    If a sname:VkImageView is sampled with ename:VK_FILTER_CUBIC_EXT as a
-    result of this command, then the image view's
-    <<resources-image-view-format-features,format features>> must: contain
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT
-ifndef::VK_EXT_filter_cubic[]
-  * [[VUID-{refpage}-None-02693]]
-    Any slink:VkImageView being sampled with ename:VK_FILTER_CUBIC_EXT as a
-    result of this command must: not have a elink:VkImageViewType of
-    ename:VK_IMAGE_VIEW_TYPE_3D, ename:VK_IMAGE_VIEW_TYPE_CUBE, or
-    ename:VK_IMAGE_VIEW_TYPE_CUBE_ARRAY
-endif::VK_EXT_filter_cubic[]
-ifdef::VK_EXT_filter_cubic[]
-  * [[VUID-{refpage}-filterCubic-02694]]
-    Any slink:VkImageView being sampled with ename:VK_FILTER_CUBIC_EXT as a
-    result of this command must: have a elink:VkImageViewType and format
-    that supports cubic filtering, as specified by
-    sname:VkFilterCubicImageViewImageFormatPropertiesEXT::pname:filterCubic
-    returned by fname:vkGetPhysicalDeviceImageFormatProperties2
-  * [[VUID-{refpage}-filterCubicMinmax-02695]]
-    Any slink:VkImageView being sampled with ename:VK_FILTER_CUBIC_EXT with
-    a reduction mode of either ename:VK_SAMPLER_REDUCTION_MODE_MIN or
-    ename:VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must:
-    have a elink:VkImageViewType and format that supports cubic filtering
-    together with minmax filtering, as specified by
-    sname:VkFilterCubicImageViewImageFormatPropertiesEXT::pname:filterCubicMinmax
-    returned by fname:vkGetPhysicalDeviceImageFormatProperties2
-endif::VK_EXT_filter_cubic[]
-endif::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-ifdef::VK_NV_corner_sampled_image[]
-  * [[VUID-{refpage}-flags-02696]]
-    Any slink:VkImage created with a slink:VkImageCreateInfo::pname:flags
-    containing ename:VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a
-    result of this command must: only be sampled using a
-    elink:VkSamplerAddressMode of
-    ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE
-endif::VK_NV_corner_sampled_image[]
-ifdef::VK_KHR_format_feature_flags2[]
-  * [[VUID-{refpage}-OpTypeImage-06423]]
-    Any slink:VkImageView or slink:VkBufferView being written as a storage
-    image or storage texel buffer where the image format field of the
-    code:OpTypeImage is code:Unknown must: have image format features that
-    support ename:VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR
-  * [[VUID-{refpage}-OpTypeImage-06424]]
-    Any slink:VkImageView or slink:VkBufferView being read as a storage
-    image or storage texel buffer where the image format field of the
-    code:OpTypeImage is code:Unknown must: have image format features that
-    support ename:VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR
-endif::VK_KHR_format_feature_flags2[]
-  * [[VUID-{refpage}-None-02697]]
-    For each set _n_ that is statically used by the sname:VkPipeline bound
-    to the pipeline bind point used by this command, a descriptor set must:
-    have been bound to _n_ at the same pipeline bind point, with a
-    sname:VkPipelineLayout that is compatible for set _n_, with the
-    sname:VkPipelineLayout used to create the current sname:VkPipeline, as
-    described in <<descriptorsets-compatibility>>
-ifndef::VK_KHR_maintenance4[]
-  * [[VUID-{refpage}-None-02698]]
-    For each push constant that is statically used by the sname:VkPipeline
-    bound to the pipeline bind point used by this command, a push constant
-    value must: have been set for the same pipeline bind point, with a
-    sname:VkPipelineLayout that is compatible for push constants, with the
-    sname:VkPipelineLayout used to create the current sname:VkPipeline, as
-    described in <<descriptorsets-compatibility>>
-endif::VK_KHR_maintenance4[]
-ifdef::VK_KHR_maintenance4[]
-  * [[VUID-{refpage}-maintenance4-06425]]
-    If the <<features-maintenance4, pname:maintenance4>> feature is not
-    enabled, then for each push constant that is statically used by the
-    sname:VkPipeline bound to the pipeline bind point used by this command,
-    a push constant value must: have been set for the same pipeline bind
-    point, with a sname:VkPipelineLayout that is compatible for push
-    constants, with the sname:VkPipelineLayout used to create the current
-    sname:VkPipeline, as described in <<descriptorsets-compatibility>>
-endif::VK_KHR_maintenance4[]
-  * [[VUID-{refpage}-None-02699]]
-    Descriptors in each bound descriptor set, specified via
-    fname:vkCmdBindDescriptorSets, must: be valid if they are statically
-    used by the sname:VkPipeline bound to the pipeline bind point used by
-    this command
-  * [[VUID-{refpage}-None-02700]]
-    A valid pipeline must: be bound to the pipeline bind point used by this
-    command
-  * [[VUID-{refpage}-commandBuffer-02701]]
-    If the sname:VkPipeline object bound to the pipeline bind point used by
-    this command requires any dynamic state, that state must: have been set
-    or inherited (if the `apiext:VK_NV_inherited_viewport_scissor` extension
-    is enabled) for pname:commandBuffer, and done so after any previously
-    bound pipeline with the corresponding state not specified as dynamic
-  * [[VUID-{refpage}-None-02859]]
-    There must: not have been any calls to dynamic state setting commands
-    for any state not specified as dynamic in the sname:VkPipeline object
-    bound to the pipeline bind point used by this command, since that
-    pipeline was bound
-  * [[VUID-{refpage}-None-02702]]
-    If the sname:VkPipeline object bound to the pipeline bind point used by
-    this command accesses a sname:VkSampler object that uses unnormalized
-    coordinates, that sampler must: not be used to sample from any
-    sname:VkImage with a sname:VkImageView of the type
-    ename:VK_IMAGE_VIEW_TYPE_3D, ename:VK_IMAGE_VIEW_TYPE_CUBE,
-    ename:VK_IMAGE_VIEW_TYPE_1D_ARRAY, ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY or
-    ename:VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage
-  * [[VUID-{refpage}-None-02703]]
-    If the sname:VkPipeline object bound to the pipeline bind point used by
-    this command accesses a sname:VkSampler object that uses unnormalized
-    coordinates, that sampler must: not be used with any of the SPIR-V
-    `OpImageSample*` or `OpImageSparseSample*` instructions with
-    code:ImplicitLod, code:Dref or code:Proj in their name, in any shader
-    stage
-  * [[VUID-{refpage}-None-02704]]
-    If the sname:VkPipeline object bound to the pipeline bind point used by
-    this command accesses a sname:VkSampler object that uses unnormalized
-    coordinates, that sampler must: not be used with any of the SPIR-V
-    `OpImageSample*` or `OpImageSparseSample*` instructions that includes a
-    LOD bias or any offset values, in any shader stage
-  * [[VUID-{refpage}-None-02705]]
-    If the <<features-robustBufferAccess,robust buffer access>> feature is
-    not enabled, and if the sname:VkPipeline object bound to the pipeline
-    bind point used by this command accesses a uniform buffer, it must: not
-    access values outside of the range of the buffer as specified in the
-    descriptor set bound to the same pipeline bind point
-  * [[VUID-{refpage}-None-02706]]
-    If the <<features-robustBufferAccess,robust buffer access>> feature is
-    not enabled, and if the sname:VkPipeline object bound to the pipeline
-    bind point used by this command accesses a storage buffer, it must: not
-    access values outside of the range of the buffer as specified in the
-    descriptor set bound to the same pipeline bind point
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-commandBuffer-02707]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    any resource accessed by the slink:VkPipeline object bound to the
-    pipeline bind point used by this command must: not be a protected
-    resource
-endif::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-None-04115]]
-    If a slink:VkImageView is accessed using code:OpImageWrite as a result
-    of this command, then the code:Type of the code:Texel operand of that
-    instruction must: have at least as many components as the image view's
-    format
-  * [[VUID-{refpage}-OpImageWrite-04469]]
-    If a slink:VkBufferView is accessed using code:OpImageWrite as a result
-    of this command, then the code:Type of the code:Texel operand of that
-    instruction must: have at least as many components as the buffer view's
-    format
-ifdef::VK_EXT_shader_image_atomic_int64[]
-  * [[VUID-{refpage}-SampledType-04470]]
-    If a slink:VkImageView with a elink:VkFormat that has a 64-bit component
-    width is accessed as a result of this command, the code:SampledType of
-    the code:OpTypeImage operand of that instruction must: have a code:Width
-    of 64
-  * [[VUID-{refpage}-SampledType-04471]]
-    If a slink:VkImageView with a elink:VkFormat that has a component width
-    less than 64-bit is accessed as a result of this command, the
-    code:SampledType of the code:OpTypeImage operand of that instruction
-    must: have a code:Width of 32
-  * [[VUID-{refpage}-SampledType-04472]]
-    If a slink:VkBufferView with a elink:VkFormat that has a 64-bit
-    component width is accessed as a result of this command, the
-    code:SampledType of the code:OpTypeImage operand of that instruction
-    must: have a code:Width of 64
-  * [[VUID-{refpage}-SampledType-04473]]
-    If a slink:VkBufferView with a elink:VkFormat that has a component width
-    less than 64-bit is accessed as a result of this command, the
-    code:SampledType of the code:OpTypeImage operand of that instruction
-    must: have a code:Width of 32
-  * [[VUID-{refpage}-sparseImageInt64Atomics-04474]]
-    If the
-    <<features-sparseImageInt64Atomics,pname:sparseImageInt64Atomics>>
-    feature is not enabled, slink:VkImage objects created with the
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT flag must: not be accessed by
-    atomic instructions through an code:OpTypeImage with a code:SampledType
-    with a code:Width of 64 by this command
-  * [[VUID-{refpage}-sparseImageInt64Atomics-04475]]
-    If the
-    <<features-sparseImageInt64Atomics,pname:sparseImageInt64Atomics>>
-    feature is not enabled, slink:VkBuffer objects created with the
-    ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT flag must: not be accessed
-    by atomic instructions through an code:OpTypeImage with a
-    code:SampledType with a code:Width of 64 by this command
-endif::VK_EXT_shader_image_atomic_int64[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/draw_dispatch_indirect_common.txt b/registry/vulkan/chapters/commonvalidity/draw_dispatch_indirect_common.txt
deleted file mode 100644
index 106f24a..0000000
--- a/registry/vulkan/chapters/commonvalidity/draw_dispatch_indirect_common.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to indirect drawing commands
-  * [[VUID-{refpage}-buffer-02708]]
-    If pname:buffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-buffer-02709]]
-    pname:buffer must: have been created with the
-    ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set
-  * [[VUID-{refpage}-offset-02710]]
-    pname:offset must: be a multiple of `4`
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-commandBuffer-02711]]
-    pname:commandBuffer must: not be a protected command buffer
-endif::VK_VERSION_1_1[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/draw_dispatch_nonindirect_common.txt b/registry/vulkan/chapters/commonvalidity/draw_dispatch_nonindirect_common.txt
deleted file mode 100644
index ca8a562..0000000
--- a/registry/vulkan/chapters/commonvalidity/draw_dispatch_nonindirect_common.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to non-indirect drawing commands
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-commandBuffer-02712]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    any resource written to by the sname:VkPipeline object bound to the
-    pipeline bind point used by this command must: not be an unprotected
-    resource
-  * [[VUID-{refpage}-commandBuffer-02713]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pipeline stages other than the framebuffer-space and compute stages in
-    the sname:VkPipeline object bound to the pipeline bind point used by
-    this command must: not write to any resource
-  * [[VUID-{refpage}-commandBuffer-04617]]
-    If any of the shader stages of the sname:VkPipeline bound to the
-    pipeline bind point used by this command uses the
-    <<spirvenv-capabilities-table-RayQueryKHR,RayQueryKHR>> capability, then
-    pname:commandBuffer must: not be a protected command buffer
-endif::VK_VERSION_1_1[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/draw_indirect_count_common.txt b/registry/vulkan/chapters/commonvalidity/draw_indirect_count_common.txt
deleted file mode 100644
index 0bde71c..0000000
--- a/registry/vulkan/chapters/commonvalidity/draw_indirect_count_common.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to indirect drawing commands with a pname:countBuffer parameter
-  * [[VUID-{refpage}-countBuffer-02714]]
-    If pname:countBuffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-countBuffer-02715]]
-    pname:countBuffer must: have been created with the
-    ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set
-  * [[VUID-{refpage}-countBufferOffset-02716]]
-    pname:countBufferOffset must: be a multiple of `4`
-  * [[VUID-{refpage}-countBuffer-02717]]
-    The count stored in pname:countBuffer must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDrawIndirectCount
-  * [[VUID-{refpage}-countBufferOffset-04129]]
-    [eq]#(pname:countBufferOffset {plus} code:sizeof(uint32_t))# must: be
-    less than or equal to the size of pname:countBuffer
-ifdef::VK_VERSION_1_2[]
-  * [[VUID-{refpage}-None-04445]]
-    If <<features-drawIndirectCount,drawIndirectCount>> is not enabled this
-    function must: not be used
-endif::VK_VERSION_1_2[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/draw_indirect_drawcount.txt b/registry/vulkan/chapters/commonvalidity/draw_indirect_drawcount.txt
deleted file mode 100644
index ffcec87..0000000
--- a/registry/vulkan/chapters/commonvalidity/draw_indirect_drawcount.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to indirect drawing commands with a pname:drawCount parameter
-  * [[VUID-{refpage}-drawCount-02718]]
-    If the <<features-multiDrawIndirect,multi-draw indirect>> feature is not
-    enabled, pname:drawCount must: be `0` or `1`
-  * [[VUID-{refpage}-drawCount-02719]]
-    pname:drawCount must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDrawIndirectCount
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/draw_vertex_binding.txt b/registry/vulkan/chapters/commonvalidity/draw_vertex_binding.txt
deleted file mode 100644
index 7f57278..0000000
--- a/registry/vulkan/chapters/commonvalidity/draw_vertex_binding.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to drawing commands that consume vertex binding state
-  * [[VUID-{refpage}-None-04007]]
-    All vertex input bindings accessed via vertex input variables declared
-    in the vertex shader entry point's interface must: have either valid or
-    dlink:VK_NULL_HANDLE buffers bound
-  * [[VUID-{refpage}-None-04008]]
-    If the <<features-nullDescriptor,nullDescriptor>> feature is not
-    enabled, all vertex input bindings accessed via vertex input variables
-    declared in the vertex shader entry point's interface must: not be
-    dlink:VK_NULL_HANDLE
-  * [[VUID-{refpage}-None-02721]]
-    For a given vertex buffer binding, any attribute data fetched must: be
-    entirely contained within the corresponding vertex buffer binding, as
-    described in <<fxvertex-input>>
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/fine_sync_commands_common.txt b/registry/vulkan/chapters/commonvalidity/fine_sync_commands_common.txt
deleted file mode 100644
index 99b3351..0000000
--- a/registry/vulkan/chapters/commonvalidity/fine_sync_commands_common.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to vkCmdPipelineBarrier and vkCmdWaitEvents
-  * [[VUID-{refpage}-srcAccessMask-02815]]
-    The pname:srcAccessMask member of each element of pname:pMemoryBarriers
-    must: only include access flags that are supported by one or more of the
-    pipeline stages in pname:srcStageMask, as specified in the
-    <<synchronization-access-types-supported, table of supported access
-    types>>
-  * [[VUID-{refpage}-dstAccessMask-02816]]
-    The pname:dstAccessMask member of each element of pname:pMemoryBarriers
-    must: only include access flags that are supported by one or more of the
-    pipeline stages in pname:dstStageMask, as specified in the
-    <<synchronization-access-types-supported, table of supported access
-    types>>
-  * [[VUID-{refpage}-pBufferMemoryBarriers-02817]]
-    For any element of pname:pBufferMemoryBarriers, if its
-    pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex members are
-    equal, or if its pname:srcQueueFamilyIndex is the queue family index
-    that was used to create the command pool that pname:commandBuffer was
-    allocated from, then its pname:srcAccessMask member must: only contain
-    access flags that are supported by one or more of the pipeline stages in
-    pname:srcStageMask, as specified in the
-    <<synchronization-access-types-supported, table of supported access
-    types>>
-  * [[VUID-{refpage}-pBufferMemoryBarriers-02818]]
-    For any element of pname:pBufferMemoryBarriers, if its
-    pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex members are
-    equal, or if its pname:dstQueueFamilyIndex is the queue family index
-    that was used to create the command pool that pname:commandBuffer was
-    allocated from, then its pname:dstAccessMask member must: only contain
-    access flags that are supported by one or more of the pipeline stages in
-    pname:dstStageMask, as specified in the
-    <<synchronization-access-types-supported, table of supported access
-    types>>
-  * [[VUID-{refpage}-pImageMemoryBarriers-02819]]
-    For any element of pname:pImageMemoryBarriers, if its
-    pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex members are
-    equal, or if its pname:srcQueueFamilyIndex is the queue family index
-    that was used to create the command pool that pname:commandBuffer was
-    allocated from, then its pname:srcAccessMask member must: only contain
-    access flags that are supported by one or more of the pipeline stages in
-    pname:srcStageMask, as specified in the
-    <<synchronization-access-types-supported, table of supported access
-    types>>
-  * [[VUID-{refpage}-pImageMemoryBarriers-02820]]
-    For any element of pname:pImageMemoryBarriers, if its
-    pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex members are
-    equal, or if its pname:dstQueueFamilyIndex is the queue family index
-    that was used to create the command pool that pname:commandBuffer was
-    allocated from, then its pname:dstAccessMask member must: only contain
-    access flags that are supported by one or more of the pipeline stages in
-    pname:dstStageMask, as specified in the
-    <<synchronization-access-types-supported, table of supported access
-    types>>
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/image_blit_common.txt b/registry/vulkan/chapters/commonvalidity/image_blit_common.txt
deleted file mode 100644
index fb9c864..0000000
--- a/registry/vulkan/chapters/commonvalidity/image_blit_common.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkImageBlit* structures
-  * [[VUID-{refpage}-aspectMask-00238]]
-    The pname:aspectMask member of pname:srcSubresource and
-    pname:dstSubresource must: match
-  * [[VUID-{refpage}-layerCount-00239]]
-    The pname:layerCount member of pname:srcSubresource and
-    pname:dstSubresource must: match
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/image_copy_common.txt b/registry/vulkan/chapters/commonvalidity/image_copy_common.txt
deleted file mode 100644
index f48646e..0000000
--- a/registry/vulkan/chapters/commonvalidity/image_copy_common.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkImageCopy* struct
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-aspectMask-00137]]
-    The pname:aspectMask member of pname:srcSubresource and
-    pname:dstSubresource must: match
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-layerCount-00138]]
-    The pname:layerCount member of pname:srcSubresource and
-    pname:dstSubresource must: match
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-{refpage}-extent-00140]]
-    The number of slices of the pname:extent (for 3D) or layers of the
-    pname:srcSubresource (for non-3D) must: match the number of slices of
-    the pname:extent (for 3D) or layers of the pname:dstSubresource (for
-    non-3D)
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/image_memory_barrier_common.txt b/registry/vulkan/chapters/commonvalidity/image_memory_barrier_common.txt
deleted file mode 100644
index d56ce88..0000000
--- a/registry/vulkan/chapters/commonvalidity/image_memory_barrier_common.txt
+++ /dev/null
@@ -1,263 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkImageMemoryBarrier* structs
-  * [[VUID-{refpage}-subresourceRange-01486]]
-    pname:subresourceRange.baseMipLevel must: be less than the
-    pname:mipLevels specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-{refpage}-subresourceRange-01724]]
-    If pname:subresourceRange.levelCount is not
-    ename:VK_REMAINING_MIP_LEVELS, [eq]#pname:subresourceRange.baseMipLevel
-    {plus} pname:subresourceRange.levelCount# must: be less than or equal to
-    the pname:mipLevels specified in slink:VkImageCreateInfo when
-    pname:image was created
-  * [[VUID-{refpage}-subresourceRange-01488]]
-    pname:subresourceRange.baseArrayLayer must: be less than the
-    pname:arrayLayers specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-{refpage}-subresourceRange-01725]]
-    If pname:subresourceRange.layerCount is not
-    ename:VK_REMAINING_ARRAY_LAYERS,
-    [eq]#pname:subresourceRange.baseArrayLayer {plus}
-    pname:subresourceRange.layerCount# must: be less than or equal to the
-    pname:arrayLayers specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-{refpage}-image-01932]]
-    If pname:image is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-oldLayout-01208]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL then pname:image must:
-    have been created with ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
-  * [[VUID-{refpage}-oldLayout-01209]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL then pname:image
-    must: have been created with
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-{refpage}-oldLayout-01210]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then pname:image
-    must: have been created with
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-{refpage}-oldLayout-01211]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL then pname:image must:
-    have been created with ename:VK_IMAGE_USAGE_SAMPLED_BIT or
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
-  * [[VUID-{refpage}-oldLayout-01212]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL then pname:image must: have
-    been created with ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT
-  * [[VUID-{refpage}-oldLayout-01213]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL then pname:image must: have
-    been created with ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT
-  * [[VUID-{refpage}-oldLayout-01197]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    pname:oldLayout must: be ename:VK_IMAGE_LAYOUT_UNDEFINED or the current
-    layout of the image subresources affected by the barrier
-  * [[VUID-{refpage}-newLayout-01198]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    pname:newLayout must: not be ename:VK_IMAGE_LAYOUT_UNDEFINED or
-    ename:VK_IMAGE_LAYOUT_PREINITIALIZED
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-  * [[VUID-{refpage}-oldLayout-01658]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL then
-    pname:image must: have been created with
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-{refpage}-oldLayout-01659]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL then
-    pname:image must: have been created with
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_2,VK_EXT_separate_depth_stencil_layouts[]
-  * [[VUID-{refpage}-srcQueueFamilyIndex-04065]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL then pname:image must:
-    have been created with at least one of
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
-    ename:VK_IMAGE_USAGE_SAMPLED_BIT, or
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
-  * [[VUID-{refpage}-srcQueueFamilyIndex-04066]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL then pname:image must:
-    have been created with ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-    set
-  * [[VUID-{refpage}-srcQueueFamilyIndex-04067]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL then pname:image must:
-    have been created with at least one of
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
-    ename:VK_IMAGE_USAGE_SAMPLED_BIT, or
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
-  * [[VUID-{refpage}-srcQueueFamilyIndex-04068]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL then pname:image must:
-    have been created with ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-    set
-endif::VK_VERSION_1_2,VK_EXT_separate_depth_stencil_layouts[]
-ifdef::VK_KHR_synchronization2[]
-  * [[VUID-{refpage}-srcQueueFamilyIndex-03938]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR, pname:image must: have
-    been created with ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT or
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-{refpage}-srcQueueFamilyIndex-03939]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR, pname:image must: have been
-    created with at least one of
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
-    ename:VK_IMAGE_USAGE_SAMPLED_BIT, or
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
-endif::VK_KHR_synchronization2[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  * [[VUID-{refpage}-oldLayout-02088]]
-    If pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    and pname:oldLayout or pname:newLayout is
-    ename:VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR then
-    pname:image must: have been created with
-    ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR set
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-image-02902]]
-    If pname:image has a color format, then the pname:aspectMask member of
-    pname:subresourceRange must: be ename:VK_IMAGE_ASPECT_COLOR_BIT
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-{refpage}-image-01671]]
-    If pname:image has a single-plane color format or is not _disjoint_,
-    then the pname:aspectMask member of pname:subresourceRange must: be
-    ename:VK_IMAGE_ASPECT_COLOR_BIT
-  * [[VUID-{refpage}-image-01672]]
-    If pname:image has a multi-planar format and the image is _disjoint_,
-    then the pname:aspectMask member of pname:subresourceRange must: include
-    either at least one of ename:VK_IMAGE_ASPECT_PLANE_0_BIT,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT, and
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT; or must: include
-    ename:VK_IMAGE_ASPECT_COLOR_BIT
-  * [[VUID-{refpage}-image-01673]]
-    If pname:image has a multi-planar format with only two planes, then the
-    pname:aspectMask member of pname:subresourceRange must: not include
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifndef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * [[VUID-{refpage}-image-01207]]
-    If pname:image has a depth/stencil format with both depth and stencil
-    components, then the pname:aspectMask member of pname:subresourceRange
-    must: include both ename:VK_IMAGE_ASPECT_DEPTH_BIT and
-    ename:VK_IMAGE_ASPECT_STENCIL_BIT
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * [[VUID-{refpage}-image-03319]]
-    If pname:image has a depth/stencil format with both depth and stencil
-    and the <<features-separateDepthStencilLayouts,
-    separateDepthStencilLayouts>> feature is enabled, then the
-    pname:aspectMask member of pname:subresourceRange must: include either
-    or both ename:VK_IMAGE_ASPECT_DEPTH_BIT and
-    ename:VK_IMAGE_ASPECT_STENCIL_BIT
-  * [[VUID-{refpage}-image-03320]]
-    If pname:image has a depth/stencil format with both depth and stencil
-    and the <<features-separateDepthStencilLayouts,
-    separateDepthStencilLayouts>> feature is not enabled, then the
-    pname:aspectMask member of pname:subresourceRange must: include both
-    ename:VK_IMAGE_ASPECT_DEPTH_BIT and ename:VK_IMAGE_ASPECT_STENCIL_BIT
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-ifndef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * [[VUID-{refpage}-image-04069]]
-    If pname:image was created with a sharing mode of
-    ename:VK_SHARING_MODE_EXCLUSIVE, and pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex are not equal, pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex must: be valid queue families
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * [[VUID-{refpage}-srcQueueFamilyIndex-04070]]
-    If pname:srcQueueFamilyIndex is not equal to pname:dstQueueFamilyIndex,
-    at least one must: not be a special queue family reserved for external
-    memory ownership transfers, as described in
-    <<synchronization-queue-transfers>>
-  * [[VUID-{refpage}-image-04071]]
-    If pname:image was created with a sharing mode of
-    ename:VK_SHARING_MODE_CONCURRENT, pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex are not equal, and one of
-    pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex is one of the
-    special queue family values reserved for external memory transfers, the
-    other must: be ename:VK_QUEUE_FAMILY_IGNORED
-  * [[VUID-{refpage}-image-04072]]
-    If pname:image was created with a sharing mode of
-    ename:VK_SHARING_MODE_EXCLUSIVE, and pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex are not equal, pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex must: both be valid queue families, or one of
-    the special queue family values reserved for external memory transfers,
-    as described in <<synchronization-queue-transfers>>
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/image_resolve_common.txt b/registry/vulkan/chapters/commonvalidity/image_resolve_common.txt
deleted file mode 100644
index 9223b55..0000000
--- a/registry/vulkan/chapters/commonvalidity/image_resolve_common.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkImageResolve* struct
-  * [[VUID-{refpage}-aspectMask-00266]]
-    The pname:aspectMask member of pname:srcSubresource and
-    pname:dstSubresource must: only contain ename:VK_IMAGE_ASPECT_COLOR_BIT
-  * [[VUID-{refpage}-layerCount-00267]]
-    The pname:layerCount member of pname:srcSubresource and
-    pname:dstSubresource must: match
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/performance_query_begin_common.txt b/registry/vulkan/chapters/commonvalidity/performance_query_begin_common.txt
deleted file mode 100644
index 8b0e9d5..0000000
--- a/registry/vulkan/chapters/commonvalidity/performance_query_begin_common.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to all drawing commands
-ifdef::VK_KHR_performance_query[]
-  * [[VUID-{refpage}-queryPool-03223]]
-    If pname:queryPool was created with a pname:queryType of
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the <<profiling-lock,
-    profiling lock>> must: have been held before flink:vkBeginCommandBuffer
-    was called on pname:commandBuffer
-  * [[VUID-{refpage}-queryPool-03224]]
-    If pname:queryPool was created with a pname:queryType of
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one of the counters used
-    to create pname:queryPool was
-    ename:VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR, the query begin
-    must: be the first recorded command in pname:commandBuffer
-  * [[VUID-{refpage}-queryPool-03225]]
-    If pname:queryPool was created with a pname:queryType of
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one of the counters used
-    to create pname:queryPool was
-    ename:VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR, the begin command
-    must: not be recorded within a render pass instance
-  * [[VUID-{refpage}-queryPool-03226]]
-    If pname:queryPool was created with a pname:queryType of
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and another query pool with a
-    pname:queryType ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR has been used
-    within pname:commandBuffer, its parent primary command buffer or
-    secondary command buffer recorded within the same parent primary command
-    buffer as pname:commandBuffer, the
-    <<features-performanceCounterMultipleQueryPools,pname:performanceCounterMultipleQueryPools>>
-    feature must: be enabled
-  * [[VUID-{refpage}-None-02863]]
-    If pname:queryPool was created with a pname:queryType of
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, this command must: not be
-    recorded in a command buffer that, either directly or through secondary
-    command buffers, also contains a fname:vkCmdResetQueryPool command
-    affecting the same query
-endif::VK_KHR_performance_query[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/pipeline_barrier_common.txt b/registry/vulkan/chapters/commonvalidity/pipeline_barrier_common.txt
deleted file mode 100644
index bcf7755..0000000
--- a/registry/vulkan/chapters/commonvalidity/pipeline_barrier_common.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to vkCmdPipelineBarrier* commands
-  * [[VUID-{refpage}-pDependencies-02285]]
-    If fname:{refpage} is called within a render pass instance, the render
-    pass must: have been created with at least one slink:VkSubpassDependency
-    instance in sname:VkRenderPassCreateInfo::pname:pDependencies that
-    expresses a dependency from the current subpass to itself, with
-    <<synchronization-dependencies-scopes, synchronization scopes>> and
-    <<synchronization-dependencies-access-scopes, access scopes>> that are
-    all supersets of the scopes defined in this command
-  * [[VUID-{refpage}-bufferMemoryBarrierCount-01178]]
-    If fname:{refpage} is called within a render pass instance, it must: not
-    include any buffer memory barriers
-  * [[VUID-{refpage}-image-04073]]
-    If fname:{refpage} is called within a render pass instance, the
-    pname:image member of any image memory barrier included in this command
-    must: be an attachment used in the current subpass both as an input
-    attachment, and as either a color or depth/stencil attachment
-  * [[VUID-{refpage}-oldLayout-01181]]
-    If fname:{refpage} is called within a render pass instance, the
-    pname:oldLayout and pname:newLayout members of any image memory barrier
-    included in this command must: be equal
-  * [[VUID-{refpage}-srcQueueFamilyIndex-01182]]
-    If fname:{refpage} is called within a render pass instance, the
-    pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex members of any
-    image memory barrier included in this command must: be equal
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-{refpage}-dependencyFlags-01186]]
-    If fname:{refpage} is called outside of a render pass instance,
-    ename:VK_DEPENDENCY_VIEW_LOCAL_BIT must: not be included in the
-    dependency flags
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifdef::VK_KHR_dynamic_rendering[]
-  * [[VUID-{refpage}-None-06191]]
-    If fname:{refpage} is called within a render pass instance, the render
-    pass must: not have been started with flink:vkCmdBeginRenderingKHR
-endif::VK_KHR_dynamic_rendering[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/pipeline_stage_common.txt b/registry/vulkan/chapters/commonvalidity/pipeline_stage_common.txt
deleted file mode 100644
index 0982cd8..0000000
--- a/registry/vulkan/chapters/commonvalidity/pipeline_stage_common.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkPipelineStageFlagBits parameters
-  * [[VUID-{refpage}-pipelineStage-04074]]
-    pname:pipelineStage must: be a
-    <<synchronization-pipeline-stages-supported,valid stage>> for the queue
-    family that was used to create the command pool that pname:commandBuffer
-    was allocated from
-  * [[VUID-{refpage}-pipelineStage-04075]]
-    If the <<features-geometryShader,geometry shaders>> feature is not
-    enabled, pname:pipelineStage must: not be
-    ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
-  * [[VUID-{refpage}-pipelineStage-04076]]
-    If the <<features-tessellationShader,tessellation shaders>> feature is
-    not enabled, pname:pipelineStage must: not be
-    ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or
-    ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
-ifdef::VK_EXT_conditional_rendering[]
-  * [[VUID-{refpage}-pipelineStage-04077]]
-    If the <<features-conditionalRendering,conditional rendering>> feature
-    is not enabled, pname:pipelineStage must: not be
-    ename:VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-{refpage}-pipelineStage-04078]]
-    If the <<features-fragmentDensityMap,fragment density map>> feature is
-    not enabled, pname:pipelineStage must: not be
-    ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-{refpage}-pipelineStage-04079]]
-    If the <<features-transformFeedback,transform feedback>> feature is not
-    enabled, pname:pipelineStage must: not be
-    ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_mesh_shader[]
-  * [[VUID-{refpage}-pipelineStage-04080]]
-    If the <<features-meshShader,mesh shaders>> feature is not enabled,
-    pname:pipelineStage must: not be
-    ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV or
-    ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV
-endif::VK_NV_mesh_shader[]
-ifdef::VK_NV_shading_rate_image[]
-  * [[VUID-{refpage}-pipelineStage-04081]]
-    If the <<features-shadingRateImage,shading rate image>> feature is not
-    enabled, pname:pipelineStage must: not be
-    ename:VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV
-endif::VK_NV_shading_rate_image[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/query_begin_common.txt b/registry/vulkan/chapters/commonvalidity/query_begin_common.txt
deleted file mode 100644
index 9a22ffa..0000000
--- a/registry/vulkan/chapters/commonvalidity/query_begin_common.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to vkCmdBeginQuery* commands
-  * [[VUID-{refpage}-None-00807]]
-    All queries used by the command must: be unavailable
-  * [[VUID-{refpage}-queryType-02804]]
-    The pname:queryType used to create pname:queryPool must: not be
-    ename:VK_QUERY_TYPE_TIMESTAMP
-ifdef::VK_KHR_acceleration_structure[]
-  * [[VUID-{refpage}-queryType-04728]]
-    The pname:queryType used to create pname:queryPool must: not be
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR or
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_NV_ray_tracing[]
-  * [[VUID-{refpage}-queryType-04729]]
-    The pname:queryType used to create pname:queryPool must: not be
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV
-endif::VK_NV_ray_tracing[]
-  * [[VUID-{refpage}-queryType-00800]]
-    If the <<features-occlusionQueryPrecise,precise occlusion queries>>
-    feature is not enabled, or the pname:queryType used to create
-    pname:queryPool was not ename:VK_QUERY_TYPE_OCCLUSION, pname:flags must:
-    not contain ename:VK_QUERY_CONTROL_PRECISE_BIT
-  * [[VUID-{refpage}-query-00802]]
-    pname:query must: be less than the number of queries in pname:queryPool
-  * [[VUID-{refpage}-queryType-00803]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_OCCLUSION, the sname:VkCommandPool that
-    pname:commandBuffer was allocated from must: support graphics operations
-  * [[VUID-{refpage}-queryType-00804]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_PIPELINE_STATISTICS and any of the
-    pname:pipelineStatistics indicate graphics operations, the
-    sname:VkCommandPool that pname:commandBuffer was allocated from must:
-    support graphics operations
-  * [[VUID-{refpage}-queryType-00805]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_PIPELINE_STATISTICS and any of the
-    pname:pipelineStatistics indicate compute operations, the
-    sname:VkCommandPool that pname:commandBuffer was allocated from must:
-    support compute operations
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-commandBuffer-01885]]
-    pname:commandBuffer must: not be a protected command buffer
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-{refpage}-query-00808]]
-    If called within a render pass instance, the sum of pname:query and the
-    number of bits set in the current subpass's view mask must: be less than
-    or equal to the number of queries in pname:queryPool
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifdef::VK_KHR_video_encode_queue[]
-  * [[VUID-{refpage}-queryType-04862]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_VIDEO_ENCODE_BITSTREAM_BUFFER_RANGE_KHR the
-    sname:VkCommandPool that pname:commandBuffer was allocated from must:
-    support <<video-encode-operations, video encode operations>>
-endif::VK_KHR_video_encode_queue[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/ray_tracing_pipeline_create_info_common.txt b/registry/vulkan/chapters/commonvalidity/ray_tracing_pipeline_create_info_common.txt
deleted file mode 100644
index 6d3b2df..0000000
--- a/registry/vulkan/chapters/commonvalidity/ray_tracing_pipeline_create_info_common.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// common to VkRayTracingPipelineCreateInfo* structures
-  * [[VUID-{refpage}-flags-03421]]
-    If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
-    flag, and pname:basePipelineIndex is `-1`, pname:basePipelineHandle
-    must: be a valid handle to a ray tracing sname:VkPipeline
-  * [[VUID-{refpage}-flags-03422]]
-    If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
-    flag, and pname:basePipelineHandle is dlink:VK_NULL_HANDLE,
-    pname:basePipelineIndex must: be a valid index into the calling
-    command's pname:pCreateInfos parameter
-  * [[VUID-{refpage}-flags-03423]]
-    If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
-    flag, and pname:basePipelineIndex is not `-1`, pname:basePipelineHandle
-    must: be dlink:VK_NULL_HANDLE
-  * [[VUID-{refpage}-flags-03424]]
-    If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
-    flag, and pname:basePipelineHandle is not dlink:VK_NULL_HANDLE,
-    pname:basePipelineIndex must: be `-1`
-  * [[VUID-{refpage}-pStages-03426]]
-    The shader code for the entry points identified by pname:pStages, and
-    the rest of the state identified by this structure must: adhere to the
-    pipeline linking rules described in the <<interfaces,Shader Interfaces>>
-    chapter
-  * [[VUID-{refpage}-layout-03427]]
-    pname:layout must: be
-    <<descriptorsets-pipelinelayout-consistency,consistent>> with all
-    shaders specified in pname:pStages
-  * [[VUID-{refpage}-layout-03428]]
-    The number of resources in pname:layout accessible to each shader stage
-    that is used by the pipeline must: be less than or equal to
-    slink:VkPhysicalDeviceLimits::pname:maxPerStageResources
-ifdef::VK_NV_device_generated_commands[]
-  * [[VUID-{refpage}-flags-02904]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-  * [[VUID-{refpage}-pipelineCreationCacheControl-02905]]
-    If the <<features-pipelineCreationCacheControl,
-    pname:pipelineCreationCacheControl>> feature is not enabled, pname:flags
-    must: not include
-    ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or
-    ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT
-endif::VK_EXT_pipeline_creation_cache_control[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/resolve_image_command_buffer_common.txt b/registry/vulkan/chapters/commonvalidity/resolve_image_command_buffer_common.txt
deleted file mode 100644
index 5c8c27b..0000000
--- a/registry/vulkan/chapters/commonvalidity/resolve_image_command_buffer_common.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkCmdResolveImage* command buffer
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-{refpage}-commandBuffer-01837]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:srcImage must: not be a protected image
-  * [[VUID-{refpage}-commandBuffer-01838]]
-    If pname:commandBuffer is an unprotected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstImage must: not be a protected image
-  * [[VUID-{refpage}-commandBuffer-01839]]
-    If pname:commandBuffer is a protected command buffer and
-    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
-    pname:dstImage must: not be an unprotected image
-endif::VK_VERSION_1_1[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/resolve_image_common.txt b/registry/vulkan/chapters/commonvalidity/resolve_image_common.txt
deleted file mode 100644
index 34aba94..0000000
--- a/registry/vulkan/chapters/commonvalidity/resolve_image_common.txt
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkCmdResolveImage* commands
-  * [[VUID-{refpage}-pRegions-00255]]
-    The union of all source regions, and the union of all destination
-    regions, specified by the elements of pname:pRegions, must: not overlap
-    in memory
-  * [[VUID-{refpage}-srcImage-00256]]
-    If pname:srcImage is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-srcImage-00257]]
-    pname:srcImage must: have a sample count equal to any valid sample count
-    value other than ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-{refpage}-dstImage-00258]]
-    If pname:dstImage is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-dstImage-00259]]
-    pname:dstImage must: have a sample count equal to
-    ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-{refpage}-srcImageLayout-00260]]
-    pname:srcImageLayout must: specify the layout of the image subresources
-    of pname:srcImage specified in pname:pRegions at the time this command
-    is executed on a sname:VkDevice
-ifndef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-srcImageLayout-00261]]
-    pname:srcImageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
-    or ename:VK_IMAGE_LAYOUT_GENERAL
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-srcImageLayout-01400]]
-    pname:srcImageLayout must: be ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
-    ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_GENERAL
-endif::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-dstImageLayout-00262]]
-    pname:dstImageLayout must: specify the layout of the image subresources
-    of pname:dstImage specified in pname:pRegions at the time this command
-    is executed on a sname:VkDevice
-ifndef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-dstImageLayout-00263]]
-    pname:dstImageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
-    or ename:VK_IMAGE_LAYOUT_GENERAL
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-dstImageLayout-01401]]
-    pname:dstImageLayout must: be ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
-    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_GENERAL
-endif::VK_KHR_shared_presentable_image[]
-  * [[VUID-{refpage}-dstImage-02003]]
-    The <<resources-image-format-features,format features>> of
-    pname:dstImage must: contain
-    ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
-  * [[VUID-{refpage}-srcImage-01386]]
-    pname:srcImage and pname:dstImage must: have been created with the same
-    image format
-  * [[VUID-{refpage}-srcSubresource-01709]]
-    The pname:srcSubresource.mipLevel member of each element of
-    pname:pRegions must: be less than the pname:mipLevels specified in
-    slink:VkImageCreateInfo when pname:srcImage was created
-  * [[VUID-{refpage}-dstSubresource-01710]]
-    The pname:dstSubresource.mipLevel member of each element of
-    pname:pRegions must: be less than the pname:mipLevels specified in
-    slink:VkImageCreateInfo when pname:dstImage was created
-  * [[VUID-{refpage}-srcSubresource-01711]]
-    The [eq]#pname:srcSubresource.baseArrayLayer {plus}
-    pname:srcSubresource.layerCount# of each element of pname:pRegions must:
-    be less than or equal to the pname:arrayLayers specified in
-    slink:VkImageCreateInfo when pname:srcImage was created
-  * [[VUID-{refpage}-dstSubresource-01712]]
-    The [eq]#pname:dstSubresource.baseArrayLayer {plus}
-    pname:dstSubresource.layerCount# of each element of pname:pRegions must:
-    be less than or equal to the pname:arrayLayers specified in
-    slink:VkImageCreateInfo when pname:dstImage was created
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-{refpage}-dstImage-02546]]
-    pname:dstImage and pname:srcImage must: not have been created with
-    pname:flags containing ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-  * [[VUID-{refpage}-srcImage-04446]]
-    If either pname:srcImage or pname:dstImage are of type
-    ename:VK_IMAGE_TYPE_3D, then for each element of pname:pRegions,
-    pname:srcSubresource.baseArrayLayer must: be `0` and
-    pname:srcSubresource.layerCount must: be `1`
-  * [[VUID-{refpage}-srcImage-04447]]
-    If either pname:srcImage or pname:dstImage are of type
-    ename:VK_IMAGE_TYPE_3D, then for each element of pname:pRegions,
-    pname:dstSubresource.baseArrayLayer must: be `0` and
-    pname:dstSubresource.layerCount must: be `1`
-  * [[VUID-{refpage}-srcOffset-00269]]
-    For each element of pname:pRegions, pname:srcOffset.x and
-    [eq]#(pname:extent.width {plus} pname:srcOffset.x)# must: both be
-    greater than or equal to `0` and less than or equal to the width of the
-    specified pname:srcSubresource of pname:srcImage
-  * [[VUID-{refpage}-srcOffset-00270]]
-    For each element of pname:pRegions, pname:srcOffset.y and
-    [eq]#(pname:extent.height {plus} pname:srcOffset.y)# must: both be
-    greater than or equal to `0` and less than or equal to the height of the
-    specified pname:srcSubresource of pname:srcImage
-  * [[VUID-{refpage}-srcImage-00271]]
-    If pname:srcImage is of type ename:VK_IMAGE_TYPE_1D, then for each
-    element of pname:pRegions, pname:srcOffset.y must: be `0` and
-    pname:extent.height must: be `1`
-  * [[VUID-{refpage}-srcOffset-00272]]
-    For each element of pname:pRegions, pname:srcOffset.z and
-    [eq]#(pname:extent.depth {plus} pname:srcOffset.z)# must: both be
-    greater than or equal to `0` and less than or equal to the depth of the
-    specified pname:srcSubresource of pname:srcImage
-  * [[VUID-{refpage}-srcImage-00273]]
-    If pname:srcImage is of type ename:VK_IMAGE_TYPE_1D or
-    ename:VK_IMAGE_TYPE_2D, then for each element of pname:pRegions,
-    pname:srcOffset.z must: be `0` and pname:extent.depth must: be `1`
-  * [[VUID-{refpage}-dstOffset-00274]]
-    For each element of pname:pRegions, pname:dstOffset.x and
-    [eq]#(pname:extent.width {plus} pname:dstOffset.x)# must: both be
-    greater than or equal to `0` and less than or equal to the width of the
-    specified pname:dstSubresource of pname:dstImage
-  * [[VUID-{refpage}-dstOffset-00275]]
-    For each element of pname:pRegions, pname:dstOffset.y and
-    [eq]#(pname:extent.height {plus} pname:dstOffset.y)# must: both be
-    greater than or equal to `0` and less than or equal to the height of the
-    specified pname:dstSubresource of pname:dstImage
-  * [[VUID-{refpage}-dstImage-00276]]
-    If pname:dstImage is of type ename:VK_IMAGE_TYPE_1D, then for each
-    element of pname:pRegions, pname:dstOffset.y must: be `0` and
-    pname:extent.height must: be `1`
-  * [[VUID-{refpage}-dstOffset-00277]]
-    For each element of pname:pRegions, pname:dstOffset.z and
-    [eq]#(pname:extent.depth {plus} pname:dstOffset.z)# must: both be
-    greater than or equal to `0` and less than or equal to the depth of the
-    specified pname:dstSubresource of pname:dstImage
-  * [[VUID-{refpage}-dstImage-00278]]
-    If pname:dstImage is of type ename:VK_IMAGE_TYPE_1D or
-    ename:VK_IMAGE_TYPE_2D, then for each element of pname:pRegions,
-    pname:dstOffset.z must: be `0` and pname:extent.depth must: be `1`
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/stage_mask_2_common.txt b/registry/vulkan/chapters/commonvalidity/stage_mask_2_common.txt
deleted file mode 100644
index 92ec1c5..0000000
--- a/registry/vulkan/chapters/commonvalidity/stage_mask_2_common.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2020-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkPipelineStageFlags2KHR parameters
-// Set "stageMaskName" attribute to the name of the stage mask to validate
-  * [[VUID-{refpage}-{stageMaskName}-03929]]
-    If the <<features-geometryShader,geometry shaders>> feature is not
-    enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR
-  * [[VUID-{refpage}-{stageMaskName}-03930]]
-    If the <<features-tessellationShader,tessellation shaders>> feature is
-    not enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR or
-    ename:VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR
-ifdef::VK_EXT_conditional_rendering[]
-  * [[VUID-{refpage}-{stageMaskName}-03931]]
-    If the <<features-conditionalRendering,conditional rendering>> feature
-    is not enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-{refpage}-{stageMaskName}-03932]]
-    If the <<features-fragmentDensityMap,fragment density map>> feature is
-    not enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-{refpage}-{stageMaskName}-03933]]
-    If the <<features-transformFeedback,transform feedback>> feature is not
-    enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_mesh_shader[]
-  * [[VUID-{refpage}-{stageMaskName}-03934]]
-    If the <<features-meshShader,mesh shaders>> feature is not enabled,
-    pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV
-  * [[VUID-{refpage}-{stageMaskName}-03935]]
-    If the <<features-taskShader,task shaders>> feature is not enabled,
-    pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV
-endif::VK_NV_mesh_shader[]
-ifdef::VK_NV_shading_rate_image[]
-  * [[VUID-{refpage}-{stageMaskName}-04956]]
-    If the <<features-shadingRateImage,shading rate image>> feature is not
-    enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV
-endif::VK_NV_shading_rate_image[]
-ifdef::VK_HUAWEI_subpass_shading[]
-  * [[VUID-{refpage}-{stageMaskName}-04957]]
-    If the <<features-subpassShading,subpass shading>> feature is not
-    enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI
-endif::VK_HUAWEI_subpass_shading[]
-ifdef::VK_HUAWEI_invocation_mask[]
-  * [[VUID-{refpage}-{stageMaskName}-04995]]
-    If the <<features-invocationMask, invocation mask image>> feature is not
-    enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI
-endif::VK_HUAWEI_invocation_mask[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/stage_mask_common.txt b/registry/vulkan/chapters/commonvalidity/stage_mask_common.txt
deleted file mode 100644
index 599f6ff..0000000
--- a/registry/vulkan/chapters/commonvalidity/stage_mask_common.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to VkPipelineStageFlags parameters
-// Set "stageMaskName" attribute to the name of the stage mask to validate
-  * [[VUID-{refpage}-{stageMaskName}-04090]]
-    If the <<features-geometryShader,geometry shaders>> feature is not
-    enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
-  * [[VUID-{refpage}-{stageMaskName}-04091]]
-    If the <<features-tessellationShader,tessellation shaders>> feature is
-    not enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or
-    ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
-ifdef::VK_EXT_conditional_rendering[]
-  * [[VUID-{refpage}-{stageMaskName}-04092]]
-    If the <<features-conditionalRendering,conditional rendering>> feature
-    is not enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-{refpage}-{stageMaskName}-04093]]
-    If the <<features-fragmentDensityMap,fragment density map>> feature is
-    not enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-{refpage}-{stageMaskName}-04094]]
-    If the <<features-transformFeedback,transform feedback>> feature is not
-    enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_mesh_shader[]
-  * [[VUID-{refpage}-{stageMaskName}-04095]]
-    If the <<features-meshShader,mesh shaders>> feature is not enabled,
-    pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV
-  * [[VUID-{refpage}-{stageMaskName}-04096]]
-    If the <<features-taskShader,task shaders>> feature is not enabled,
-    pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV
-endif::VK_NV_mesh_shader[]
-ifdef::VK_NV_shading_rate_image[]
-  * [[VUID-{refpage}-{stageMaskName}-04097]]
-    If the <<features-shadingRateImage,shading rate image>> feature is not
-    enabled, pname:{stageMaskName} must: not contain
-    ename:VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV
-endif::VK_NV_shading_rate_image[]
-  * [[VUID-{refpage}-{stageMaskName}-04098]]
-    Any pipeline stage included in pname:{stageMaskName} must: be supported
-    by the capabilities of the queue family specified by the
-    pname:queueFamilyIndex member of the slink:VkCommandPoolCreateInfo
-    structure that was used to create the sname:VkCommandPool that
-    pname:commandBuffer was allocated from, as specified in the
-    <<synchronization-pipeline-stages-supported, table of supported pipeline
-    stages>>
-ifdef::VK_KHR_synchronization2[]
-  * [[VUID-{refpage}-{stageMaskName}-03937]]
-    If the <<features-synchronization2, pname:synchronization2>> feature is
-    not enabled, pname:{stageMaskName} must: not be `0`
-endif::VK_KHR_synchronization2[]
-ifndef::VK_KHR_synchronization2[]
-  * [[VUID-{refpage}-{stageMaskName}-04996]]
-    pname:{stageMaskName} must: not be `0`
-endif::VK_KHR_synchronization2[]
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/surface_info_physical_device_common.txt b/registry/vulkan/chapters/commonvalidity/surface_info_physical_device_common.txt
deleted file mode 100644
index 1cbb30c..0000000
--- a/registry/vulkan/chapters/commonvalidity/surface_info_physical_device_common.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to all VkPhysicalDevice commands accepting a
-// VkPhysicalDeviceSurfaceInfo2KHR param
-
-  * [[VUID-{refpage}-pSurfaceInfo-06210]]
-    pname:pSurfaceInfo->surface must: be supported by pname:physicalDevice,
-    as reported by flink:vkGetPhysicalDeviceSurfaceSupportKHR or an
-    equivalent platform-specific mechanism
-
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/surface_physical_device_common.txt b/registry/vulkan/chapters/commonvalidity/surface_physical_device_common.txt
deleted file mode 100644
index 882d713..0000000
--- a/registry/vulkan/chapters/commonvalidity/surface_physical_device_common.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to all VkPhysicalDevice commands accepting a VkSurfaceKHR param
-
-  * [[VUID-{refpage}-surface-06211]]
-    pname:surface must: be supported by pname:physicalDevice, as reported by
-    flink:vkGetPhysicalDeviceSurfaceSupportKHR or an equivalent
-    platform-specific mechanism
-
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/trace_rays_common.txt b/registry/vulkan/chapters/commonvalidity/trace_rays_common.txt
deleted file mode 100644
index 10286eb..0000000
--- a/registry/vulkan/chapters/commonvalidity/trace_rays_common.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to trace rays commands
-
-include::{chapters}/commonvalidity/draw_dispatch_common.txt[]
-  * [[VUID-{refpage}-None-03429]]
-    Any shader group handle referenced by this call must: have been queried
-    from the currently bound ray tracing pipeline
-
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/trace_rays_common_khr.txt b/registry/vulkan/chapters/commonvalidity/trace_rays_common_khr.txt
deleted file mode 100644
index b93a116..0000000
--- a/registry/vulkan/chapters/commonvalidity/trace_rays_common_khr.txt
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to KHR trace rays commands
-
-  * [[VUID-{refpage}-maxPipelineRayRecursionDepth-03679]]
-    This command must: not cause a shader call instruction to be executed
-    from a shader invocation with a <<ray-tracing-recursion-depth, recursion
-    depth>> greater than the value of pname:maxPipelineRayRecursionDepth
-    used to create the bound ray tracing pipeline
-  * [[VUID-{refpage}-pRayGenShaderBindingTable-03680]]
-    If the buffer from which pname:pRayGenShaderBindingTable->deviceAddress
-    was queried is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-pRayGenShaderBindingTable-03681]]
-    The buffer from which the pname:pRayGenShaderBindingTable->deviceAddress
-    is queried must: have been created with the
-    ename:VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR usage flag
-  * [[VUID-{refpage}-pRayGenShaderBindingTable-03682]]
-    pname:pRayGenShaderBindingTable->deviceAddress must: be a multiple of
-    sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupBaseAlignment
-  * [[VUID-{refpage}-size-04023]]
-    The pname:size member of pname:pRayGenShaderBindingTable must: be equal
-    to its pname:stride member
-  * [[VUID-{refpage}-pMissShaderBindingTable-03683]]
-    If the buffer from which pname:pMissShaderBindingTable->deviceAddress
-    was queried is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-pMissShaderBindingTable-03684]]
-    The buffer from which the pname:pMissShaderBindingTable->deviceAddress
-    is queried must: have been created with the
-    ename:VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR usage flag
-  * [[VUID-{refpage}-pMissShaderBindingTable-03685]]
-    pname:pMissShaderBindingTable->deviceAddress must: be a multiple of
-    sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupBaseAlignment
-  * [[VUID-{refpage}-stride-03686]]
-    The pname:stride member of pname:pMissShaderBindingTable must: be a
-    multiple of
-    sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupHandleAlignment
-  * [[VUID-{refpage}-stride-04029]]
-    The pname:stride member of pname:pMissShaderBindingTable must: be less
-    than or equal to
-    sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:maxShaderGroupStride
-  * [[VUID-{refpage}-pHitShaderBindingTable-03687]]
-    If the buffer from which pname:pHitShaderBindingTable->deviceAddress was
-    queried is non-sparse then it must: be bound completely and contiguously
-    to a single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-pHitShaderBindingTable-03688]]
-    The buffer from which the pname:pHitShaderBindingTable->deviceAddress is
-    queried must: have been created with the
-    ename:VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR usage flag
-  * [[VUID-{refpage}-pHitShaderBindingTable-03689]]
-    pname:pHitShaderBindingTable->deviceAddress must: be a multiple of
-    sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupBaseAlignment
-  * [[VUID-{refpage}-stride-03690]]
-    The pname:stride member of pname:pHitShaderBindingTable must: be a
-    multiple of
-    sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupHandleAlignment
-  * [[VUID-{refpage}-stride-04035]]
-    The pname:stride member of pname:pHitShaderBindingTable must: be less
-    than or equal to
-    sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:maxShaderGroupStride
-  * [[VUID-{refpage}-pCallableShaderBindingTable-03691]]
-    If the buffer from which
-    pname:pCallableShaderBindingTable->deviceAddress was queried is
-    non-sparse then it must: be bound completely and contiguously to a
-    single sname:VkDeviceMemory object
-  * [[VUID-{refpage}-pCallableShaderBindingTable-03692]]
-    The buffer from which the
-    pname:pCallableShaderBindingTable->deviceAddress is queried must: have
-    been created with the ename:VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR
-    usage flag
-  * [[VUID-{refpage}-pCallableShaderBindingTable-03693]]
-    pname:pCallableShaderBindingTable->deviceAddress must: be a multiple of
-    sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupBaseAlignment
-  * [[VUID-{refpage}-stride-03694]]
-    The pname:stride member of pname:pCallableShaderBindingTable must: be a
-    multiple of
-    sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupHandleAlignment
-  * [[VUID-{refpage}-stride-04041]]
-    The pname:stride member of pname:pCallableShaderBindingTable must: be
-    less than or equal to
-    sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:maxShaderGroupStride
-  * [[VUID-{refpage}-flags-03696]]
-    If the currently bound ray tracing pipeline was created with pname:flags
-    that included
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR,
-    the pname:deviceAddress member of pname:pHitShaderBindingTable must: not
-    be zero
-  * [[VUID-{refpage}-flags-03697]]
-    If the currently bound ray tracing pipeline was created with pname:flags
-    that included
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR,
-    the pname:deviceAddress member of pname:pHitShaderBindingTable must: not
-    be zero
-  * [[VUID-{refpage}-flags-03511]]
-    If the currently bound ray tracing pipeline was created with pname:flags
-    that included
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR, the
-    shader group handle identified by pname:pMissShaderBindingTable must:
-    not be set to zero
-  * [[VUID-{refpage}-flags-03512]]
-    If the currently bound ray tracing pipeline was created with pname:flags
-    that included
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR,
-    entries in pname:pHitShaderBindingTable accessed as a result of this
-    command in order to execute an any-hit shader must: not be set to zero
-  * [[VUID-{refpage}-flags-03513]]
-    If the currently bound ray tracing pipeline was created with pname:flags
-    that included
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR,
-    entries in pname:pHitShaderBindingTable accessed as a result of this
-    command in order to execute a closest hit shader must: not be set to
-    zero
-  * [[VUID-{refpage}-flags-03514]]
-    If the currently bound ray tracing pipeline was created with pname:flags
-    that included
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR,
-    entries in pname:pHitShaderBindingTable accessed as a result of this
-    command in order to execute an intersection shader must: not be set to
-    zero
-  * [[VUID-{refpage}-pHitShaderBindingTable-04735]]
-    Any non-zero hit shader group entries in pname:pHitShaderBindingTable
-    accessed by this call from a geometry with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR must: have been created with
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR
-  * [[VUID-{refpage}-pHitShaderBindingTable-04736]]
-    Any non-zero hit shader group entries in pname:pHitShaderBindingTable
-    accessed by this call from a geometry with a pname:geometryType of
-    ename:VK_GEOMETRY_TYPE_AABBS_KHR must: have been created with
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR
-
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/commonvalidity/write_acceleration_structure_properties_common.txt b/registry/vulkan/chapters/commonvalidity/write_acceleration_structure_properties_common.txt
deleted file mode 100644
index 0874521..0000000
--- a/registry/vulkan/chapters/commonvalidity/write_acceleration_structure_properties_common.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2019-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Common Valid Usage
-// Common to acceleration structure property query
-  * [[VUID-{refpage}-pAccelerationStructures-04964]]
-    All acceleration structures in pname:pAccelerationStructures must: have
-    been built prior to the execution of this command
-  * [[VUID-{refpage}-accelerationStructures-03431]]
-    All acceleration structures in pname:pAccelerationStructures must: have
-    been built with
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR if
-    pname:queryType is
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR
-  * [[VUID-{refpage}-queryType-03432]]
-    pname:queryType must: be
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR or
-    ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR
-// Common Valid Usage
diff --git a/registry/vulkan/chapters/copies.txt b/registry/vulkan/chapters/copies.txt
deleted file mode 100644
index 662d638..0000000
--- a/registry/vulkan/chapters/copies.txt
+++ /dev/null
@@ -1,1639 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[copies]]
-= Copy Commands
-
-An application can: copy buffer and image data using several methods
-depending on the type of data transfer.
-Data can: be copied between buffer objects with
-ifdef::VK_KHR_copy_commands2[]
-fname:vkCmdCopyBuffer2KHR and
-endif::VK_KHR_copy_commands2[]
-fname:vkCmdCopyBuffer and a portion of an image can: be copied to another
-image with
-ifdef::VK_KHR_copy_commands2[]
-fname:vkCmdCopyImage2KHR and
-endif::VK_KHR_copy_commands2[]
-fname:vkCmdCopyImage.
-Image data can: also be copied to and from buffer memory using
-ifndef::VK_KHR_copy_commands2[]
-fname:vkCmdCopyImageToBuffer and fname:vkCmdCopyBufferToImage.
-endif::VK_KHR_copy_commands2[]
-ifdef::VK_KHR_copy_commands2[]
-fname:vkCmdCopyImageToBuffer2KHR, fname:vkCmdCopyImageToBuffer,
-fname:vkCmdCopyBufferToImage2KHR, and fname:vkCmdCopyBufferToImage.
-endif::VK_KHR_copy_commands2[]
-Image data can: be blitted (with or without scaling and filtering) with
-ifdef::VK_KHR_copy_commands2[]
-fname:vkCmdBlitImage2KHR and
-endif::VK_KHR_copy_commands2[]
-fname:vkCmdBlitImage.
-Multisampled images can: be resolved to a non-multisampled image with
-ifdef::VK_KHR_copy_commands2[]
-fname:vkCmdResolveImage2KHR and
-endif::VK_KHR_copy_commands2[]
-fname:vkCmdResolveImage.
-
-
-== Common Operation
-
-The following valid usage rules apply to all copy commands:
-
-  * Copy commands must: be recorded outside of a render pass instance.
-  * The set of all bytes bound to all the source regions must: not overlap
-    the set of all bytes bound to the destination regions.
-  * The set of all bytes bound to each destination region must: not overlap
-    the set of all bytes bound to another destination region.
-  * Copy regions must: be non-empty.
-  * Regions must: not extend outside the bounds of the buffer or image
-    level, except that regions of compressed images can: extend as far as
-    the dimension of the image level rounded up to a complete compressed
-    texel block.
-  * Source image subresources must: be in either the
-    ename:VK_IMAGE_LAYOUT_GENERAL or
-    ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL layout.
-    Destination image subresources must: be in the
-ifdef::VK_KHR_shared_presentable_image[]
-    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
-endif::VK_KHR_shared_presentable_image[]
-    ename:VK_IMAGE_LAYOUT_GENERAL or
-    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL layout.
-    As a consequence, if an image subresource is used as both source and
-    destination of a copy, it must: be in the ename:VK_IMAGE_LAYOUT_GENERAL
-    layout.
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * Source images must: have ename:VK_FORMAT_FEATURE_TRANSFER_SRC_BIT in
-    their <<resources-image-format-features,format features>>.
-  * Destination images must: have ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT
-    in their <<resources-image-format-features,format features>>.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * Source buffers must: have been created with the
-    ename:VK_BUFFER_USAGE_TRANSFER_SRC_BIT usage bit enabled and destination
-    buffers must: have been created with the
-    ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT usage bit enabled.
-ifndef::VK_VERSION_1_2+VK_EXT_separate_stencil_usage[]
-  * Source images must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT set in
-    slink:VkImageCreateInfo::pname:usage
-  * Destination images must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT set in
-    slink:VkImageCreateInfo::pname:usage
-endif::VK_VERSION_1_2+VK_EXT_separate_stencil_usage[]
-ifdef::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-  * If the stencil aspect of source image is accessed, and the source image
-    was not created with <<VkImageStencilUsageCreateInfo,separate stencil
-    usage>>, the source image must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT set in
-    slink:VkImageCreateInfo::pname:usage
-  * If the stencil aspect of destination image is accessed, and the
-    destination image was not created with
-    <<VkImageStencilUsageCreateInfo,separate stencil usage>>, the
-    destination image must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT set in
-    slink:VkImageCreateInfo::pname:usage
-  * If the stencil aspect of source image is accessed, and the source image
-    was created with <<VkImageStencilUsageCreateInfo,separate stencil
-    usage>>, the source image must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT set in
-    slink:VkImageStencilUsageCreateInfo::pname:stencilUsage
-  * If the stencil aspect of destination image is accessed, and the
-    destination image was created with
-    <<VkImageStencilUsageCreateInfo,separate stencil usage>>, the
-    destination image must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT set in
-    slink:VkImageStencilUsageCreateInfo::pname:stencilUsage
-  * If non-stencil aspects of a source image are accessed, the source image
-    must: have been created with ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT set
-    in slink:VkImageCreateInfo::pname:usage
-  * If non-stencil aspects of a destination image are accessed, the
-    destination image must: have been created with
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT set in
-    slink:VkImageCreateInfo::pname:usage
-endif::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-
-All copy commands are treated as "`transfer`" operations for the purposes of
-synchronization barriers.
-
-All copy commands that have a source format with an X component in its
-format description read undefined: values from those bits.
-
-All copy commands that have a destination format with an X component in its
-format description write undefined: values to those bits.
-
-
-[[copies-buffers]]
-== Copying Data Between Buffers
-
-[open,refpage='vkCmdCopyBuffer',desc='Copy data between buffer regions',type='protos']
---
-:refpage: vkCmdCopyBuffer
-
-To copy data between buffer objects, call:
-
-include::{generated}/api/protos/vkCmdCopyBuffer.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:srcBuffer is the source buffer.
-  * pname:dstBuffer is the destination buffer.
-  * pname:regionCount is the number of regions to copy.
-  * pname:pRegions is a pointer to an array of slink:VkBufferCopy structures
-    specifying the regions to copy.
-
-Each region in pname:pRegions is copied from the source buffer to the same
-region of the destination buffer.
-pname:srcBuffer and pname:dstBuffer can: be the same buffer or alias the
-same memory, but the resulting values are undefined: if the copy regions
-overlap in memory.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/copy_buffer_command_buffer_common.txt[]
-include::{chapters}/commonvalidity/copy_buffer_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdCopyBuffer.txt[]
---
-
-[open,refpage='VkBufferCopy',desc='Structure specifying a buffer copy operation',type='structs']
---
-:refpage: VkBufferCopy
-
-The sname:VkBufferCopy structure is defined as:
-
-include::{generated}/api/structs/VkBufferCopy.txt[]
-
-  * pname:srcOffset is the starting offset in bytes from the start of
-    pname:srcBuffer.
-  * pname:dstOffset is the starting offset in bytes from the start of
-    pname:dstBuffer.
-  * pname:size is the number of bytes to copy.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/buffer_copy_common.txt[]
-****
-
-include::{generated}/validity/structs/VkBufferCopy.txt[]
---
-
-ifdef::VK_KHR_copy_commands2[]
-
-A more extensible version of the copy buffer command is defined below.
-
-[open,refpage='vkCmdCopyBuffer2KHR',desc='Copy data between buffer regions',type='protos']
---
-:refpage: vkCmdCopyBuffer2KHR
-
-To copy data between buffer objects, call:
-
-include::{generated}/api/protos/vkCmdCopyBuffer2KHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pCopyBufferInfo is a pointer to a slink:VkCopyBufferInfo2KHR
-    structure describing the copy parameters.
-
-This command is functionally identical to flink:vkCmdCopyBuffer, but
-includes extensible sub-structures that include pname:sType and pname:pNext
-parameters, allowing them to be more easily extended.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/copy_buffer_command_buffer_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdCopyBuffer2KHR.txt[]
---
-
-[open,refpage='VkCopyBufferInfo2KHR',desc='Structure specifying parameters of a buffer copy command',type='structs']
---
-:refpage: VkCopyBufferInfo2KHR
-
-The sname:VkCopyBufferInfo2KHR structure is defined as:
-
-include::{generated}/api/structs/VkCopyBufferInfo2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcBuffer is the source buffer.
-  * pname:dstBuffer is the destination buffer.
-  * pname:regionCount is the number of regions to copy.
-  * pname:pRegions is a pointer to an array of slink:VkBufferCopy2KHR
-    structures specifying the regions to copy.
-
-Members defined by this structure with the same name as parameters in
-flink:vkCmdCopyBuffer have the identical effect to those parameters; the
-child structure slink:VkBufferCopy2KHR is a variant of slink:VkBufferCopy
-which includes pname:sType and pname:pNext parameters, allowing it to be
-extended.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/copy_buffer_common.txt[]
-****
-
-include::{generated}/validity/structs/VkCopyBufferInfo2KHR.txt[]
---
-
-[open,refpage='VkBufferCopy2KHR',desc='Structure specifying a buffer copy operation',type='structs']
---
-:refpage: VkBufferCopy2KHR
-
-The sname:VkBufferCopy2KHR structure is defined as:
-
-include::{generated}/api/structs/VkBufferCopy2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcOffset is the starting offset in bytes from the start of
-    pname:srcBuffer.
-  * pname:dstOffset is the starting offset in bytes from the start of
-    pname:dstBuffer.
-  * pname:size is the number of bytes to copy.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/buffer_copy_common.txt[]
-****
-
-include::{generated}/validity/structs/VkBufferCopy2KHR.txt[]
---
-
-endif::VK_KHR_copy_commands2[]
-
-
-[[copies-images]]
-== Copying Data Between Images
-
-fname:vkCmdCopyImage performs image copies in a similar manner to a host
-memcpy.
-It does not perform general-purpose conversions such as scaling, resizing,
-blending, color-space conversion, or format conversions.
-Rather, it simply copies raw image data.
-fname:vkCmdCopyImage can: copy between images with different formats,
-provided the formats are compatible as defined below.
-
-[open,refpage='vkCmdCopyImage',desc='Copy data between images',type='protos']
---
-:refpage: vkCmdCopyImage
-
-To copy data between image objects, call:
-
-include::{generated}/api/protos/vkCmdCopyImage.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:srcImage is the source image.
-  * pname:srcImageLayout is the current layout of the source image
-    subresource.
-  * pname:dstImage is the destination image.
-  * pname:dstImageLayout is the current layout of the destination image
-    subresource.
-  * pname:regionCount is the number of regions to copy.
-  * pname:pRegions is a pointer to an array of slink:VkImageCopy structures
-    specifying the regions to copy.
-
-Each region in pname:pRegions is copied from the source image to the same
-region of the destination image.
-pname:srcImage and pname:dstImage can: be the same image or alias the same
-memory.
-
-[[copies-images-format-compatibility]]
-The formats of pname:srcImage and pname:dstImage must: be compatible.
-Formats are compatible if they share the same class, as shown in the
-<<formats-compatibility,Compatible Formats>> table.
-Depth/stencil formats must: match exactly.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-If either pname:srcImage or pname:dstImage has a
-<<formats-requiring-sampler-ycbcr-conversion, _multi-planar_ format>>,
-regions of each plane to be copied must: be specified separately using the
-pname:srcSubresource and pname:dstSubresource members of the
-slink:VkImageCopy structure.
-In this case, the pname:aspectMask of the pname:srcSubresource or
-pname:dstSubresource that refers to the multi-planar image must: be
-ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT, or
-ename:VK_IMAGE_ASPECT_PLANE_2_BIT.
-For the purposes of fname:vkCmdCopyImage, each plane of a multi-planar image
-is treated as having the format listed in <<formats-compatible-planes>> for
-the plane identified by the pname:aspectMask of the corresponding
-subresource.
-This applies both to elink:VkFormat and to coordinates used in the copy,
-which correspond to texels in the _plane_ rather than how these texels map
-to coordinates in the image as a whole.
-
-[NOTE]
-.Note
-====
-For example, the ename:VK_IMAGE_ASPECT_PLANE_1_BIT plane of a
-ename:VK_FORMAT_G8_B8R8_2PLANE_420_UNORM image is compatible with an image
-of format ename:VK_FORMAT_R8G8_UNORM and (less usefully) with the
-ename:VK_IMAGE_ASPECT_PLANE_0_BIT plane of an image of format
-ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16, as each texel is
-2 bytes in size.
-====
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-[[copies-images-format-size-compatibility]]
-fname:vkCmdCopyImage allows copying between _size-compatible_ compressed and
-uncompressed internal formats.
-Formats are size-compatible if the texel block size of the uncompressed
-format is equal to the texel block size of the compressed format.
-Such a copy does not perform on-the-fly compression or decompression.
-When copying from an uncompressed format to a compressed format, each texel
-of uncompressed data of the source image is copied as a raw value to the
-corresponding compressed texel block of the destination image.
-When copying from a compressed format to an uncompressed format, each
-compressed texel block of the source image is copied as a raw value to the
-corresponding texel of uncompressed data in the destination image.
-Thus, for example, it is legal to copy between a 128-bit uncompressed format
-and a compressed format which has a 128-bit sized compressed texel block
-representing 4{times}4 texels (using 8 bits per texel), or between a 64-bit
-uncompressed format and a compressed format which has a 64-bit sized
-compressed texel block representing 4{times}4 texels (using 4 bits per
-texel).
-
-When copying between compressed and uncompressed formats the pname:extent
-members represent the texel dimensions of the source image and not the
-destination.
-When copying from a compressed image to an uncompressed image the image
-texel dimensions written to the uncompressed image will be source extent
-divided by the compressed texel block dimensions.
-When copying from an uncompressed image to a compressed image the image
-texel dimensions written to the compressed image will be the source extent
-multiplied by the compressed texel block dimensions.
-In both cases the number of bytes read and the number of bytes written will
-be identical.
-
-Copying to or from block-compressed images is typically done in multiples of
-the compressed texel block size.
-For this reason the pname:extent must: be a multiple of the compressed texel
-block dimension.
-There is one exception to this rule which is required: to handle compressed
-images created with dimensions that are not a multiple of the compressed
-texel block dimensions: if the pname:srcImage is compressed, then:
-
-  * If pname:extent.width is not a multiple of the compressed texel block
-    width, then [eq]#(pname:extent.width {plus} pname:srcOffset.x)# must:
-    equal the image subresource width.
-  * If pname:extent.height is not a multiple of the compressed texel block
-    height, then [eq]#(pname:extent.height {plus} pname:srcOffset.y)# must:
-    equal the image subresource height.
-  * If pname:extent.depth is not a multiple of the compressed texel block
-    depth, then [eq]#(pname:extent.depth {plus} pname:srcOffset.z)# must:
-    equal the image subresource depth.
-
-Similarly, if the pname:dstImage is compressed, then:
-
-  * If pname:extent.width is not a multiple of the compressed texel block
-    width, then [eq]#(pname:extent.width {plus} pname:dstOffset.x)# must:
-    equal the image subresource width.
-  * If pname:extent.height is not a multiple of the compressed texel block
-    height, then [eq]#(pname:extent.height {plus} pname:dstOffset.y)# must:
-    equal the image subresource height.
-  * If pname:extent.depth is not a multiple of the compressed texel block
-    depth, then [eq]#(pname:extent.depth {plus} pname:dstOffset.z)# must:
-    equal the image subresource depth.
-
-This allows the last compressed texel block of the image in each
-non-multiple dimension to be included as a source or destination of the
-copy.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-"`etext:_422`" image formats that are not
-<<formats-requiring-sampler-ycbcr-conversion,_multi-planar_>> are treated as
-having a 2{times}1 compressed texel block for the purposes of these rules.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-fname:vkCmdCopyImage can: be used to copy image data between multisample
-images, but both images must: have the same number of samples.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/copy_image_command_buffer_common.txt[]
-include::{chapters}/commonvalidity/copy_image_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdCopyImage.txt[]
---
-
-[open,refpage='VkImageCopy',desc='Structure specifying an image copy operation',type='structs']
---
-:refpage: VkImageCopy
-
-The sname:VkImageCopy structure is defined as:
-
-include::{generated}/api/structs/VkImageCopy.txt[]
-
-  * pname:srcSubresource and pname:dstSubresource are
-    slink:VkImageSubresourceLayers structures specifying the image
-    subresources of the images used for the source and destination image
-    data, respectively.
-  * pname:srcOffset and pname:dstOffset select the initial pname:x, pname:y,
-    and pname:z offsets in texels of the sub-regions of the source and
-    destination image data.
-  * pname:extent is the size in texels of the image to copy in pname:width,
-    pname:height and pname:depth.
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-For ename:VK_IMAGE_TYPE_3D images, copies are performed slice by slice
-starting with the pname:z member of the pname:srcOffset or pname:dstOffset,
-and copying pname:depth slices.
-For images with multiple layers, copies are performed layer by layer
-starting with the pname:baseArrayLayer member of the pname:srcSubresource or
-pname:dstSubresource and copying pname:layerCount layers.
-Image data can: be copied between images with different image types.
-If one image is ename:VK_IMAGE_TYPE_3D and the other image is
-ename:VK_IMAGE_TYPE_2D with multiple layers, then each slice is copied to or
-from a different layer.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-Copies are done layer by layer starting with pname:baseArrayLayer member of
-pname:srcSubresource for the source and pname:dstSubresource for the
-destination.
-pname:layerCount layers are copied to the destination image.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-Copies involving a <<formats-requiring-sampler-ycbcr-conversion,
-multi-planar image format>> specify the region to be copied in terms of the
-_plane_ to be copied, not the coordinates of the multi-planar image.
-This means that copies accessing the R/B planes of "`etext:_422`" format
-images must: fit the copied region within half the pname:width of the parent
-image, and that copies accessing the R/B planes of "`etext:_420`" format
-images must: fit the copied region within half the pname:width and
-pname:height of the parent image.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/image_copy_common.txt[]
-****
-
-include::{generated}/validity/structs/VkImageCopy.txt[]
---
-
-[open,refpage='VkImageSubresourceLayers',desc='Structure specifying an image subresource layers',type='structs']
---
-
-The sname:VkImageSubresourceLayers structure is defined as:
-
-include::{generated}/api/structs/VkImageSubresourceLayers.txt[]
-
-  * pname:aspectMask is a combination of elink:VkImageAspectFlagBits,
-    selecting the color, depth and/or stencil aspects to be copied.
-  * pname:mipLevel is the mipmap level to copy
-  * pname:baseArrayLayer and pname:layerCount are the starting layer and
-    number of layers to copy.
-
-.Valid Usage
-****
-  * [[VUID-VkImageSubresourceLayers-aspectMask-00167]]
-    If pname:aspectMask contains ename:VK_IMAGE_ASPECT_COLOR_BIT, it must:
-    not contain either of ename:VK_IMAGE_ASPECT_DEPTH_BIT or
-    ename:VK_IMAGE_ASPECT_STENCIL_BIT
-  * [[VUID-VkImageSubresourceLayers-aspectMask-00168]]
-    pname:aspectMask must: not contain ename:VK_IMAGE_ASPECT_METADATA_BIT
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkImageSubresourceLayers-aspectMask-02247]]
-    pname:aspectMask must: not include
-    `VK_IMAGE_ASPECT_MEMORY_PLANE__{ibit}__BIT_EXT` for any index _i_
-endif::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkImageSubresourceLayers-layerCount-01700]]
-    pname:layerCount must: be greater than 0
-****
-
-include::{generated}/validity/structs/VkImageSubresourceLayers.txt[]
---
-
-ifdef::VK_KHR_copy_commands2[]
-
-A more extensible version of the copy image command is defined below.
-
-[open,refpage='vkCmdCopyImage2KHR',desc='Copy data between images',type='protos']
---
-:refpage: vkCmdCopyImage2KHR
-
-To copy data between image objects, call:
-
-include::{generated}/api/protos/vkCmdCopyImage2KHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pCopyImageInfo is a pointer to a slink:VkCopyImageInfo2KHR
-    structure describing the copy parameters.
-
-This command is functionally identical to flink:vkCmdCopyImage, but includes
-extensible sub-structures that include pname:sType and pname:pNext
-parameters, allowing them to be more easily extended.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/copy_image_command_buffer_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdCopyImage2KHR.txt[]
---
-
-
-[open,refpage='VkCopyImageInfo2KHR',desc='Structure specifying parameters of an image copy command',type='structs']
---
-:refpage: VkCopyImageInfo2KHR
-
-The sname:VkCopyImageInfo2KHR structure is defined as:
-
-include::{generated}/api/structs/VkCopyImageInfo2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcImage is the source image.
-  * pname:srcImageLayout is the current layout of the source image
-    subresource.
-  * pname:dstImage is the destination image.
-  * pname:dstImageLayout is the current layout of the destination image
-    subresource.
-  * pname:regionCount is the number of regions to copy.
-  * pname:pRegions is a pointer to an array of slink:VkImageCopy2KHR
-    structures specifying the regions to copy.
-
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/copy_image_common.txt[]
-****
-
-include::{generated}/validity/structs/VkCopyImageInfo2KHR.txt[]
---
-
-[open,refpage='VkImageCopy2KHR',desc='Structure specifying an image copy operation',type='structs']
---
-:refpage: VkImageCopy2KHR
-
-The sname:VkImageCopy2KHR structure is defined as:
-
-include::{generated}/api/structs/VkImageCopy2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcSubresource and pname:dstSubresource are
-    slink:VkImageSubresourceLayers structures specifying the image
-    subresources of the images used for the source and destination image
-    data, respectively.
-  * pname:srcOffset and pname:dstOffset select the initial pname:x, pname:y,
-    and pname:z offsets in texels of the sub-regions of the source and
-    destination image data.
-  * pname:extent is the size in texels of the image to copy in pname:width,
-    pname:height and pname:depth.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/image_copy_common.txt[]
-****
-
-include::{generated}/validity/structs/VkImageCopy2KHR.txt[]
---
-
-endif::VK_KHR_copy_commands2[]
-
-
-[[copies-buffers-images]]
-== Copying Data Between Buffers and Images
-
-[open,refpage='vkCmdCopyBufferToImage',desc='Copy data from a buffer into an image',type='protos']
---
-:refpage: vkCmdCopyBufferToImage
-:imageparam: pname:dstImage
-
-To copy data from a buffer object to an image object, call:
-
-include::{generated}/api/protos/vkCmdCopyBufferToImage.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:srcBuffer is the source buffer.
-  * pname:dstImage is the destination image.
-  * pname:dstImageLayout is the layout of the destination image subresources
-    for the copy.
-  * pname:regionCount is the number of regions to copy.
-  * pname:pRegions is a pointer to an array of slink:VkBufferImageCopy
-    structures specifying the regions to copy.
-
-Each region in pname:pRegions is copied from the specified region of the
-source buffer to the specified region of the destination image.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-If pname:dstImage has a
-<<formats-requiring-sampler-ycbcr-conversion,multi-planar format>>, regions
-of each plane to be a target of a copy must: be specified separately using
-the pname:pRegions member of the slink:VkBufferImageCopy structure.
-In this case, the pname:aspectMask of pname:imageSubresource must: be
-ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT, or
-ename:VK_IMAGE_ASPECT_PLANE_2_BIT.
-For the purposes of fname:vkCmdCopyBufferToImage, each plane of a
-multi-planar image is treated as having the format listed in
-<<formats-compatible-planes>> for the plane identified by the
-pname:aspectMask of the corresponding subresource.
-This applies both to elink:VkFormat and to coordinates used in the copy,
-which correspond to texels in the _plane_ rather than how these texels map
-to coordinates in the image as a whole.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/copy_buffer_to_image_command_buffer_common.txt[]
-  * [[VUID-vkCmdCopyBufferToImage-pRegions-06217]]
-    The image region specified by each element of pname:pRegions must: be
-    contained within the specified pname:imageSubresource of pname:dstImage
-include::{chapters}/commonvalidity/copy_buffer_to_image_common.txt[]
-  * [[VUID-vkCmdCopyBufferToImage-pRegions-06218]]
-    For each element of pname:pRegions, pname:imageOffset.x and
-    [eq]#(pname:imageExtent.width {plus} pname:imageOffset.x)# must: both be
-    greater than or equal to `0` and less than or equal to the width of the
-    specified pname:imageSubresource of pname:dstImage
-  * [[VUID-vkCmdCopyBufferToImage-pRegions-06219]]
-    For each element of pname:pRegions, pname:imageOffset.y and
-    [eq]#(pname:imageExtent.height {plus} pname:imageOffset.y)# must: both
-    be greater than or equal to `0` and less than or equal to the height of
-    the specified pname:imageSubresource of pname:dstImage
-include::{chapters}/commonvalidity/copy_bufferimage_to_imagebuffer_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdCopyBufferToImage.txt[]
---
-
-[open,refpage='vkCmdCopyImageToBuffer',desc='Copy image data into a buffer',type='protos']
---
-:refpage: vkCmdCopyImageToBuffer
-:imageparam: pname:srcImage
-
-To copy data from an image object to a buffer object, call:
-
-include::{generated}/api/protos/vkCmdCopyImageToBuffer.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:srcImage is the source image.
-  * pname:srcImageLayout is the layout of the source image subresources for
-    the copy.
-  * pname:dstBuffer is the destination buffer.
-  * pname:regionCount is the number of regions to copy.
-  * pname:pRegions is a pointer to an array of slink:VkBufferImageCopy
-    structures specifying the regions to copy.
-
-Each region in pname:pRegions is copied from the specified region of the
-source image to the specified region of the destination buffer.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-If pname:srcImage has a <<formats-requiring-sampler-ycbcr-conversion,
-multi-planar format>>, regions of each plane to be a source of a copy must:
-be specified separately using the pname:pRegions member of the
-slink:VkBufferImageCopy structure.
-In this case, the pname:aspectMask of pname:imageSubresource must: be
-ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT, or
-ename:VK_IMAGE_ASPECT_PLANE_2_BIT.
-For the purposes of fname:vkCmdCopyBufferToImage, each plane of a
-multi-planar image is treated as having the format listed in
-<<formats-compatible-planes>> for the plane identified by the
-pname:aspectMask of the corresponding subresource.
-This applies both to elink:VkFormat and to coordinates used in the copy,
-which correspond to texels in the _plane_ rather than how these texels map
-to coordinates in the image as a whole.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/copy_image_to_buffer_command_buffer_common.txt[]
-  * [[VUID-vkCmdCopyImageToBuffer-pRegions-06220]]
-    The image region specified by each element of pname:pRegions must: be
-    contained within the specified pname:imageSubresource of pname:srcImage
-include::{chapters}/commonvalidity/copy_image_to_buffer_common.txt[]
-  * [[VUID-vkCmdCopyImageToBuffer-pRegions-06221]]
-    For each element of pname:pRegions, pname:imageOffset.x and
-    [eq]#(pname:imageExtent.width {plus} pname:imageOffset.x)# must: both be
-    greater than or equal to `0` and less than or equal to the width of the
-    specified pname:imageSubresource of pname:srcImage
-  * [[VUID-vkCmdCopyImageToBuffer-pRegions-06222]]
-    For each element of pname:pRegions, pname:imageOffset.y and
-    [eq]#(imageExtent.height {plus} pname:imageOffset.y)# must: both be
-    greater than or equal to `0` and less than or equal to the height of the
-    specified pname:imageSubresource of pname:srcImage
-include::{chapters}/commonvalidity/copy_bufferimage_to_imagebuffer_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdCopyImageToBuffer.txt[]
---
-
-[open,refpage='VkBufferImageCopy',desc='Structure specifying a buffer image copy operation',type='structs']
---
-:refpage: VkBufferImageCopy
-
-For both flink:vkCmdCopyBufferToImage and flink:vkCmdCopyImageToBuffer, each
-element of pname:pRegions is a structure defined as:
-
-include::{generated}/api/structs/VkBufferImageCopy.txt[]
-
-  * pname:bufferOffset is the offset in bytes from the start of the buffer
-    object where the image data is copied from or to.
-  * pname:bufferRowLength and pname:bufferImageHeight specify in texels a
-    subregion of a larger two- or three-dimensional image in buffer memory,
-    and control the addressing calculations.
-    If either of these values is zero, that aspect of the buffer memory is
-    considered to be tightly packed according to the pname:imageExtent.
-  * pname:imageSubresource is a slink:VkImageSubresourceLayers used to
-    specify the specific image subresources of the image used for the source
-    or destination image data.
-  * pname:imageOffset selects the initial pname:x, pname:y, pname:z offsets
-    in texels of the sub-region of the source or destination image data.
-  * pname:imageExtent is the size in texels of the image to copy in
-    pname:width, pname:height and pname:depth.
-
-When copying to or from a depth or stencil aspect, the data in buffer memory
-uses a layout that is a (mostly) tightly packed representation of the depth
-or stencil data.
-Specifically:
-
-  * data copied to or from the stencil aspect of any depth/stencil format is
-    tightly packed with one ename:VK_FORMAT_S8_UINT value per texel.
-  * data copied to or from the depth aspect of a ename:VK_FORMAT_D16_UNORM
-    or ename:VK_FORMAT_D16_UNORM_S8_UINT format is tightly packed with one
-    ename:VK_FORMAT_D16_UNORM value per texel.
-  * data copied to or from the depth aspect of a ename:VK_FORMAT_D32_SFLOAT
-    or ename:VK_FORMAT_D32_SFLOAT_S8_UINT format is tightly packed with one
-    ename:VK_FORMAT_D32_SFLOAT value per texel.
-  * data copied to or from the depth aspect of a
-    ename:VK_FORMAT_X8_D24_UNORM_PACK32 or ename:VK_FORMAT_D24_UNORM_S8_UINT
-    format is packed with one 32-bit word per texel with the D24 value in
-    the LSBs of the word, and undefined: values in the eight MSBs.
-
-[NOTE]
-.Note
-====
-To copy both the depth and stencil aspects of a depth/stencil format, two
-entries in pname:pRegions can: be used, where one specifies the depth aspect
-in pname:imageSubresource, and the other specifies the stencil aspect.
-====
-
-Because depth or stencil aspect buffer to image copies may: require format
-conversions on some implementations, they are not supported on queues that
-do not support graphics.
-
-When copying to a depth aspect,
-ifdef::VK_EXT_depth_range_unrestricted[]
-and the `apiext:VK_EXT_depth_range_unrestricted` extension is not enabled,
-endif::VK_EXT_depth_range_unrestricted[]
-the data in buffer memory must: be in the range [eq]#[0,1]#, or the
-resulting values are undefined:.
-
-Copies are done layer by layer starting with image layer
-pname:baseArrayLayer member of pname:imageSubresource.
-pname:layerCount layers are copied from the source image or to the
-destination image.
-
-[[blocked-image]]
-For purpose of valid usage statements here and in related copy commands, a
-_blocked image_ is defined as:
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * an image with a _single-plane_, "`etext:_422`" format, which is treated
-    as a format with a 2 {times} 1 compressed texel block, or
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * a compressed image.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/buffer_image_copy_common.txt[]
-****
-
-include::{generated}/validity/structs/VkBufferImageCopy.txt[]
---
-
-ifdef::VK_KHR_copy_commands2[]
-
-More extensible versions of the commands to copy between buffers and images
-are defined below.
-
-[open,refpage='vkCmdCopyBufferToImage2KHR',desc='Copy data from a buffer into an image',type='protos']
---
-:refpage: vkCmdCopyBufferToImage2KHR
-
-To copy data from a buffer object to an image object, call:
-
-include::{generated}/api/protos/vkCmdCopyBufferToImage2KHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pCopyBufferToImageInfo is a pointer to a
-    slink:VkCopyBufferToImageInfo2KHR structure describing the copy
-    parameters.
-
-This command is functionally identical to flink:vkCmdCopyBufferToImage, but
-includes extensible sub-structures that include pname:sType and pname:pNext
-parameters, allowing them to be more easily extended.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/copy_buffer_to_image_command_buffer_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdCopyBufferToImage2KHR.txt[]
---
-
-[open,refpage='VkCopyBufferToImageInfo2KHR',desc='Structure specifying parameters of a buffer to image copy command',type='structs']
---
-:refpage: VkCopyBufferToImageInfo2KHR
-:imageparam: pname:dstImage
-
-The sname:VkCopyBufferToImageInfo2KHR structure is defined as:
-
-include::{generated}/api/structs/VkCopyBufferToImageInfo2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcBuffer is the source buffer.
-  * pname:dstImage is the destination image.
-  * pname:dstImageLayout is the layout of the destination image subresources
-    for the copy.
-  * pname:regionCount is the number of regions to copy.
-  * pname:pRegions is a pointer to an array of slink:VkBufferImageCopy2KHR
-    structures specifying the regions to copy.
-
-.Valid Usage
-****
-ifndef::VK_QCOM_rotated_copy_commands[]
-  * [[VUID-VkCopyBufferToImageInfo2KHR-pRegions-00172]]
-    The image region specified by each element of pname:pRegions must: be
-    contained within the specified pname:imageSubresource of pname:dstImage
-endif::VK_QCOM_rotated_copy_commands[]
-ifdef::VK_QCOM_rotated_copy_commands[]
-  * [[VUID-VkCopyBufferToImageInfo2KHR-pRegions-04565]]
-    If the image region specified by each element of pname:pRegions does not
-    contain slink:VkCopyCommandTransformInfoQCOM in its pname:pNext chain,
-    it must: be a region that is contained within the specified
-    pname:imageSubresource of pname:dstImage
-  * [[VUID-VkCopyBufferToImageInfo2KHR-pRegions-04554]]
-    If the image region specified by each element of pname:pRegions contains
-    slink:VkCopyCommandTransformInfoQCOM in its pname:pNext chain, the
-    rotated destination region as described in
-    <<copies-buffers-images-rotation-addressing>> must: be contained within
-    pname:dstImage
-  * [[VUID-VkCopyBufferToImageInfo2KHR-pRegions-04555]]
-    If any element of pname:pRegions contains
-    slink:VkCopyCommandTransformInfoQCOM in its pname:pNext chain, then
-    pname:dstImage must: not be a <<blocked-image,blocked image>>
-  * [[VUID-VkCopyBufferToImageInfo2KHR-pRegions-06203]]
-    If any element of pname:pRegions contains
-    slink:VkCopyCommandTransformInfoQCOM in its pname:pNext chain, then
-    pname:dstImage must: be of type ename:VK_IMAGE_TYPE_2D
-  * [[VUID-VkCopyBufferToImageInfo2KHR-pRegions-06204]]
-    If any element of pname:pRegions contains
-    slink:VkCopyCommandTransformInfoQCOM in its pname:pNext chain, then
-    pname:dstImage must: not have a
-    <<formats-requiring-sampler-ycbcr-conversion, multi-planar format>>
-endif::VK_QCOM_rotated_copy_commands[]
-include::{chapters}/commonvalidity/copy_buffer_to_image_common.txt[]
-  * [[VUID-VkCopyBufferToImageInfo2KHR-pRegions-06223]]
-    For each element of pname:pRegions not containing
-    sname:VkCopyCommandTransformInfoQCOM in its pname:pNext chain,
-    pname:imageOffset.x and [eq]#(pname:imageExtent.width {plus}
-    pname:imageOffset.x)# must: both be greater than or equal to `0` and
-    less than or equal to the width of the specified pname:imageSubresource
-    of pname:dstImage
-  * [[VUID-VkCopyBufferToImageInfo2KHR-pRegions-06224]]
-    For each element of pname:pRegions not containing
-    sname:VkCopyCommandTransformInfoQCOM in its pname:pNext chain,
-    pname:imageOffset.y and [eq]#(pname:imageExtent.height {plus}
-    pname:imageOffset.y)# must: both be greater than or equal to `0` and
-    less than or equal to the height of the specified pname:imageSubresource
-    of pname:dstImage
-include::{chapters}/commonvalidity/copy_bufferimage_to_imagebuffer_common.txt[]
-****
-
-include::{generated}/validity/structs/VkCopyBufferToImageInfo2KHR.txt[]
---
-
-[open,refpage='vkCmdCopyImageToBuffer2KHR',desc='Copy image data into a buffer',type='protos']
---
-:refpage: vkCmdCopyImageToBuffer2KHR
-:imageparam: pname:srcImage
-
-To copy data from an image object to a buffer object, call:
-
-include::{generated}/api/protos/vkCmdCopyImageToBuffer2KHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pCopyImageToBufferInfo is a pointer to a
-    slink:VkCopyImageToBufferInfo2KHR structure describing the copy
-    parameters.
-
-This command is functionally identical to flink:vkCmdCopyImageToBuffer, but
-includes extensible sub-structures that include pname:sType and pname:pNext
-parameters, allowing them to be more easily extended.
-
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/copy_image_to_buffer_command_buffer_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdCopyImageToBuffer2KHR.txt[]
---
-
-[open,refpage='VkCopyImageToBufferInfo2KHR',desc='Structure specifying parameters of an image to buffer copy command',type='structs']
---
-:refpage: VkCopyImageToBufferInfo2KHR
-
-The sname:VkCopyImageToBufferInfo2KHR structure is defined as:
-
-include::{generated}/api/structs/VkCopyImageToBufferInfo2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcImage is the source image.
-  * pname:srcImageLayout is the layout of the source image subresources for
-    the copy.
-  * pname:dstBuffer is the destination buffer.
-  * pname:regionCount is the number of regions to copy.
-  * pname:pRegions is a pointer to an array of slink:VkBufferImageCopy2KHR
-    structures specifying the regions to copy.
-
-.Valid Usage
-****
-ifndef::VK_QCOM_rotated_copy_commands[]
-  * [[VUID-VkCopyImageToBufferInfo2KHR-pRegions-00182]]
-    The image region specified by each element of pname:pRegions must: be
-    contained within the specified pname:imageSubresource of pname:srcImage
-endif::VK_QCOM_rotated_copy_commands[]
-ifdef::VK_QCOM_rotated_copy_commands[]
-  * [[VUID-VkCopyImageToBufferInfo2KHR-pRegions-04566]]
-    If the image region specified by each element of pname:pRegions does not
-    contain slink:VkCopyCommandTransformInfoQCOM in its pname:pNext chain,
-    it must: be contained within the specified pname:imageSubresource of
-    pname:srcImage
-  * [[VUID-VkCopyImageToBufferInfo2KHR-pRegions-04557]]
-    If the image region specified by each element of pname:pRegions contains
-    slink:VkCopyCommandTransformInfoQCOM in its pname:pNext chain, the
-    rotated source region as described in
-    <<copies-buffers-images-rotation-addressing>> must: be contained within
-    pname:srcImage
-  * [[VUID-VkCopyImageToBufferInfo2KHR-pRegions-04558]]
-    If any element of pname:pRegions contains
-    slink:VkCopyCommandTransformInfoQCOM in its pname:pNext chain, then
-    pname:srcImage must: not be a <<blocked-image,blocked image>>
-  * [[VUID-VkCopyImageToBufferInfo2KHR-pRegions-06205]]
-    If any element of pname:pRegions contains
-    slink:VkCopyCommandTransformInfoQCOM in its pname:pNext chain, then
-    pname:srcImage must: be of type ename:VK_IMAGE_TYPE_2D
-  * [[VUID-VkCopyImageToBufferInfo2KHR-pRegions-06206]]
-    If any element of pname:pRegions contains
-    slink:VkCopyCommandTransformInfoQCOM in its pname:pNext chain, then
-    pname:srcImage must: not have a
-    <<formats-requiring-sampler-ycbcr-conversion, multi-planar format>>
-endif::VK_QCOM_rotated_copy_commands[]
-include::{chapters}/commonvalidity/copy_image_to_buffer_common.txt[]
-  * [[VUID-VkCopyImageToBufferInfo2KHR-imageOffset-00197]]
-    For each element of pname:pRegions not containing
-    sname:VkCopyCommandTransformInfoQCOM in its pname:pNext chain,
-    pname:imageOffset.x and [eq]#(pname:imageExtent.width {plus}
-    pname:imageOffset.x)# must: both be greater than or equal to `0` and
-    less than or equal to the width of the specified pname:imageSubresource
-    of pname:srcImage
-  * [[VUID-VkCopyImageToBufferInfo2KHR-imageOffset-00198]]
-    For each element of pname:pRegions not containing
-    sname:VkCopyCommandTransformInfoQCOM in its pname:pNext chain,
-    pname:imageOffset.y and [eq]#(pname:imageExtent.height {plus}
-    pname:imageOffset.y)# must: both be greater than or equal to `0` and
-    less than or equal to the height of the specified pname:imageSubresource
-    of pname:srcImage
-include::{chapters}/commonvalidity/copy_bufferimage_to_imagebuffer_common.txt[]
-****
-
-include::{generated}/validity/structs/VkCopyImageToBufferInfo2KHR.txt[]
---
-
-[open,refpage='VkBufferImageCopy2KHR',desc='Structure specifying a buffer image copy operation',type='structs']
---
-:refpage: VkBufferImageCopy2KHR
-
-For both flink:vkCmdCopyBufferToImage2KHR and
-flink:vkCmdCopyImageToBuffer2KHR, each element of pname:pRegions is a
-structure defined as:
-
-include::{generated}/api/structs/VkBufferImageCopy2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:bufferOffset is the offset in bytes from the start of the buffer
-    object where the image data is copied from or to.
-  * pname:bufferRowLength and pname:bufferImageHeight specify in texels a
-    subregion of a larger two- or three-dimensional image in buffer memory,
-    and control the addressing calculations.
-    If either of these values is zero, that aspect of the buffer memory is
-    considered to be tightly packed according to the pname:imageExtent.
-  * pname:imageSubresource is a slink:VkImageSubresourceLayers used to
-    specify the specific image subresources of the image used for the source
-    or destination image data.
-  * pname:imageOffset selects the initial pname:x, pname:y, pname:z offsets
-    in texels of the sub-region of the source or destination image data.
-  * pname:imageExtent is the size in texels of the image to copy in
-    pname:width, pname:height and pname:depth.
-
-This structure is functionally identical to slink:VkBufferImageCopy, but
-adds pname:sType and pname:pNext parameters, allowing it to be more easily
-extended.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/buffer_image_copy_common.txt[]
-****
-
-include::{generated}/validity/structs/VkBufferImageCopy2KHR.txt[]
---
-endif::VK_KHR_copy_commands2[]
-
-ifdef::VK_QCOM_rotated_copy_commands[]
-For both flink:vkCmdCopyBufferToImage2KHR and
-flink:vkCmdCopyImageToBuffer2KHR, each region copied can include a rotation.
-To specify a region with rotation, add the
-slink:VkCopyCommandTransformInfoQCOM to the pname:pNext chain of
-slink:VkBufferImageCopy2KHR.
-When a rotation is specified, <<copies-buffers-images-rotation-addressing,
-Buffer and Image Addressing with Rotation>> specifies how coordinates of
-texels in the source region are rotated by pname:transform to produce texel
-coordinates in the destination region.
-When rotation is specified, the source and destination images must: each be
-2D images.
-They must: not be <<blocked-image,blocked images>> or have a
-<<formats-requiring-sampler-ycbcr-conversion, multi-planar format>>.
-
-[open,refpage='VkCopyCommandTransformInfoQCOM',desc='Structure describing transform parameters of rotated copy command',type='structs']
---
-The sname:VkRenderPassTransformBeginInfoQCOM structure is defined as:
-
-include::{generated}/api/structs/VkCopyCommandTransformInfoQCOM.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:transform is a elink:VkSurfaceTransformFlagBitsKHR value
-    describing the transform to be applied.
-
-.Valid Usage
-****
-  * [[VUID-VkCopyCommandTransformInfoQCOM-transform-04560]]
-    pname:transform must: be ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,
-    ename:VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,
-    ename:VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR, or
-    ename:VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR
-****
-
-include::{generated}/validity/structs/VkCopyCommandTransformInfoQCOM.txt[]
---
-
-endif::VK_QCOM_rotated_copy_commands[]
-
-
-[[copies-buffers-images-addressing]]
-=== Buffer and Image Addressing
-
-Pseudocode for image/buffer addressing of uncompressed formats is:
-
-[source,c]
----------------------------------------------------
-rowLength = region->bufferRowLength;
-if (rowLength == 0)
-    rowLength = region->imageExtent.width;
-
-imageHeight = region->bufferImageHeight;
-if (imageHeight == 0)
-    imageHeight = region->imageExtent.height;
-
-texelBlockSize = <texel block size of the format of the src/dstImage>;
-
-address of (x,y,z) = region->bufferOffset + (((z * imageHeight) + y) * rowLength + x) * texelBlockSize;
-
-where x,y,z range from (0,0,0) to region->imageExtent.{width,height,depth}.
----------------------------------------------------
-
-Note that pname:imageOffset does not affect addressing calculations for
-buffer memory.
-Instead, pname:bufferOffset can: be used to select the starting address in
-buffer memory.
-
-For block-compressed formats, all parameters are still specified in texels
-rather than compressed texel blocks, but the addressing math operates on
-whole compressed texel blocks.
-Pseudocode for compressed copy addressing is:
-
-[source,c]
----------------------------------------------------
-rowLength = region->bufferRowLength;
-if (rowLength == 0)
-    rowLength = region->imageExtent.width;
-
-imageHeight = region->bufferImageHeight;
-if (imageHeight == 0)
-    imageHeight = region->imageExtent.height;
-
-compressedTexelBlockSizeInBytes = <compressed texel block size taken from the src/dstImage>;
-rowLength = (rowLength + compressedTexelBlockWidth - 1) / compressedTexelBlockWidth;
-imageHeight = (imageHeight + compressedTexelBlockHeight - 1) / compressedTexelBlockHeight;
-
-address of (x,y,z) = region->bufferOffset + (((z * imageHeight) + y) * rowLength + x) * compressedTexelBlockSizeInBytes;
-
-where x,y,z range from (0,0,0) to region->imageExtent.{width/compressedTexelBlockWidth,height/compressedTexelBlockHeight,depth/compressedTexelBlockDepth}.
----------------------------------------------------
-
-Copying to or from block-compressed images is typically done in multiples of
-the compressed texel block size.
-For this reason the pname:imageExtent must: be a multiple of the compressed
-texel block dimension.
-There is one exception to this rule which is required: to handle compressed
-images created with dimensions that are not a multiple of the compressed
-texel block dimensions:
-
-  * If pname:imageExtent.width is not a multiple of the compressed texel
-    block width, then [eq]#(pname:imageExtent.width {plus}
-    pname:imageOffset.x)# must: equal the image subresource width.
-  * If pname:imageExtent.height is not a multiple of the compressed texel
-    block height, then [eq]#(pname:imageExtent.height {plus}
-    pname:imageOffset.y)# must: equal the image subresource height.
-  * If pname:imageExtent.depth is not a multiple of the compressed texel
-    block depth, then [eq]#(pname:imageExtent.depth {plus}
-    pname:imageOffset.z)# must: equal the image subresource depth.
-
-This allows the last compressed texel block of the image in each
-non-multiple dimension to be included as a source or destination of the
-copy.
-
-ifdef::VK_QCOM_rotated_copy_commands[]
-include::VK_QCOM_rotated_copies/rotated_addressing_copies.txt[]
-endif::VK_QCOM_rotated_copy_commands[]
-
-
-[[copies-imagescaling]]
-== Image Copies with Scaling
-
-[open,refpage='vkCmdBlitImage',desc='Copy regions of an image, potentially performing format conversion,',type='protos']
---
-:refpage: vkCmdBlitImage
-
-To copy regions of a source image into a destination image, potentially
-performing format conversion, arbitrary scaling, and filtering, call:
-
-include::{generated}/api/protos/vkCmdBlitImage.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:srcImage is the source image.
-  * pname:srcImageLayout is the layout of the source image subresources for
-    the blit.
-  * pname:dstImage is the destination image.
-  * pname:dstImageLayout is the layout of the destination image subresources
-    for the blit.
-  * pname:regionCount is the number of regions to blit.
-  * pname:pRegions is a pointer to an array of slink:VkImageBlit structures
-    specifying the regions to blit.
-  * pname:filter is a elink:VkFilter specifying the filter to apply if the
-    blits require scaling.
-
-fname:vkCmdBlitImage must: not be used for multisampled source or
-destination images.
-Use flink:vkCmdResolveImage for this purpose.
-
-As the sizes of the source and destination extents can: differ in any
-dimension, texels in the source extent are scaled and filtered to the
-destination extent.
-Scaling occurs via the following operations:
-
-  * For each destination texel, the integer coordinate of that texel is
-    converted to an unnormalized texture coordinate, using the effective
-    inverse of the equations described in
-    <<textures-unnormalized-to-integer, unnormalized to integer
-    conversion>>:
-  {empty}:: [eq]#u~base~ = i {plus} {onehalf}#
-  {empty}:: [eq]#v~base~ = j {plus} {onehalf}#
-  {empty}:: [eq]#w~base~ = k {plus} {onehalf}#
-  * These base coordinates are then offset by the first destination offset:
-  {empty}:: [eq]#u~offset~ = u~base~ - x~dst0~#
-  {empty}:: [eq]#v~offset~ = v~base~ - y~dst0~#
-  {empty}:: [eq]#w~offset~ = w~base~ - z~dst0~#
-  {empty}:: [eq]#a~offset~ = a - pname:baseArrayCount~dst~#
-  * The scale is determined from the source and destination regions, and
-    applied to the offset coordinates:
-  {empty}:: [eq]#scale~u~ = (x~src1~ - x~src0~) / (x~dst1~ - x~dst0~)#
-  {empty}:: [eq]#scale~v~ = (y~src1~ - y~src0~) / (y~dst1~ - y~dst0~)#
-  {empty}:: [eq]#scale~w~ = (z~src1~ - z~src0~) / (z~dst1~ - z~dst0~)#
-  {empty}:: [eq]#u~scaled~ = u~offset~ {times} scale~u~#
-  {empty}:: [eq]#v~scaled~ = v~offset~ {times} scale~v~#
-  {empty}:: [eq]#w~scaled~ = w~offset~ {times} scale~w~#
-  * Finally the source offset is added to the scaled coordinates, to
-    determine the final unnormalized coordinates used to sample from
-    pname:srcImage:
-  {empty}:: [eq]#u = u~scaled~ {plus} x~src0~#
-  {empty}:: [eq]#v = v~scaled~ {plus} y~src0~#
-  {empty}:: [eq]#w = w~scaled~ {plus} z~src0~#
-  {empty}:: [eq]#q = pname:mipLevel#
-  {empty}:: [eq]#a = a~offset~ {plus} pname:baseArrayCount~src~#
-
-These coordinates are used to sample from the source image, as described in
-<<textures, Image Operations chapter>>, with the filter mode equal to that
-of pname:filter, a mipmap mode of ename:VK_SAMPLER_MIPMAP_MODE_NEAREST and
-an address mode of ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE.
-Implementations must: clamp at the edge of the source image, and may:
-additionally clamp to the edge of the source region.
-
-[NOTE]
-.Note
-====
-Due to allowable rounding errors in the generation of the source texture
-coordinates, it is not always possible to guarantee exactly which source
-texels will be sampled for a given blit.
-As rounding errors are implementation-dependent, the exact results of a
-blitting operation are also implementation-dependent.
-====
-
-Blits are done layer by layer starting with the pname:baseArrayLayer member
-of pname:srcSubresource for the source and pname:dstSubresource for the
-destination.
-pname:layerCount layers are blitted to the destination image.
-
-When blitting 3D textures, slices in the destination region bounded by
-pname:dstOffsets[0].z and pname:dstOffsets[1].z are sampled from slices in
-the source region bounded by pname:srcOffsets[0].z and
-pname:srcOffsets[1].z.
-If the pname:filter parameter is ename:VK_FILTER_LINEAR then the value
-sampled from the source image is taken by doing linear filtering using the
-interpolated *z* coordinate represented by *w* in the previous equations.
-If the pname:filter parameter is ename:VK_FILTER_NEAREST then the value
-sampled from the source image is taken from the single nearest slice, with
-an implementation-dependent arithmetic rounding mode.
-
-The following filtering and conversion rules apply:
-
-  * Integer formats can: only be converted to other integer formats with the
-    same signedness.
-  * No format conversion is supported between depth/stencil images.
-    The formats must: match.
-  * Format conversions on unorm, snorm, unscaled and packed float formats of
-    the copied aspect of the image are performed by first converting the
-    pixels to float values.
-  * For sRGB source formats, nonlinear RGB values are converted to linear
-    representation prior to filtering.
-  * After filtering, the float values are first clamped and then cast to the
-    destination image format.
-    In case of sRGB destination format, linear RGB values are converted to
-    nonlinear representation before writing the pixel to the image.
-
-Signed and unsigned integers are converted by first clamping to the
-representable range of the destination format, then casting the value.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/blit_image_command_buffer_common.txt[]
-include::{chapters}/commonvalidity/blit_image_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdBlitImage.txt[]
---
-
-[open,refpage='VkImageBlit',desc='Structure specifying an image blit operation',type='structs']
---
-:refpage: VkImageBlit
-
-The sname:VkImageBlit structure is defined as:
-
-include::{generated}/api/structs/VkImageBlit.txt[]
-
-  * pname:srcSubresource is the subresource to blit from.
-  * pname:srcOffsets is a pointer to an array of two slink:VkOffset3D
-    structures specifying the bounds of the source region within
-    pname:srcSubresource.
-  * pname:dstSubresource is the subresource to blit into.
-  * pname:dstOffsets is a pointer to an array of two slink:VkOffset3D
-    structures specifying the bounds of the destination region within
-    pname:dstSubresource.
-
-For each element of the pname:pRegions array, a blit operation is performed
-for the specified source and destination regions.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/image_blit_common.txt[]
-****
-
-include::{generated}/validity/structs/VkImageBlit.txt[]
---
-
-ifdef::VK_KHR_copy_commands2[]
-
-A more extensible version of the blit image command is defined below.
-
-[open,refpage='vkCmdBlitImage2KHR',desc='Copy regions of an image, potentially performing format conversion,',type='protos']
---
-:refpage: vkCmdBlitImage2KHR
-
-To copy regions of a source image into a destination image, potentially
-performing format conversion, arbitrary scaling, and filtering, call:
-
-include::{generated}/api/protos/vkCmdBlitImage2KHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pBlitImageInfo is a pointer to a slink:VkBlitImageInfo2KHR
-    structure describing the blit parameters.
-
-This command is functionally identical to flink:vkCmdBlitImage, but includes
-extensible sub-structures that include pname:sType and pname:pNext
-parameters, allowing them to be more easily extended.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/blit_image_command_buffer_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdBlitImage2KHR.txt[]
---
-
-[open,refpage='VkBlitImageInfo2KHR',desc='Structure specifying parameters of blit image command',type='structs']
---
-:refpage: VkBlitImageInfo2KHR
-
-The sname:VkBlitImageInfo2KHR structure is defined as:
-
-include::{generated}/api/structs/VkBlitImageInfo2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcImage is the source image.
-  * pname:srcImageLayout is the layout of the source image subresources for
-    the blit.
-  * pname:dstImage is the destination image.
-  * pname:dstImageLayout is the layout of the destination image subresources
-    for the blit.
-  * pname:regionCount is the number of regions to blit.
-  * pname:pRegions is a pointer to an array of slink:VkImageBlit2KHR
-    structures specifying the regions to blit.
-  * pname:filter is a elink:VkFilter specifying the filter to apply if the
-    blits require scaling.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/blit_image_common.txt[]
-ifdef::VK_QCOM_rotated_copy_commands[]
-  * [[VUID-VkBlitImageInfo2KHR-pRegions-04561]]
-    If any element of pname:pRegions contains
-    slink:VkCopyCommandTransformInfoQCOM in its pname:pNext chain, then
-    pname:srcImage and pname:dstImage must: not be block-compressed images
-  * [[VUID-VkBlitImageInfo2KHR-pRegions-06207]]
-    If any element of pname:pRegions contains
-    slink:VkCopyCommandTransformInfoQCOM in its pname:pNext chain, then
-    pname:srcImage must: be of type ename:VK_IMAGE_TYPE_2D
-  * [[VUID-VkBlitImageInfo2KHR-pRegions-06208]]
-    If any element of pname:pRegions contains
-    slink:VkCopyCommandTransformInfoQCOM in its pname:pNext chain, then
-    pname:srcImage must: not have a
-    <<formats-requiring-sampler-ycbcr-conversion, multi-planar format>>
-endif::VK_QCOM_rotated_copy_commands[]
-****
-
-include::{generated}/validity/structs/VkBlitImageInfo2KHR.txt[]
---
-
-[open,refpage='VkImageBlit2KHR',desc='Structure specifying an image blit operation',type='structs']
---
-:refpage: VkImageBlit2KHR
-
-The sname:VkImageBlit2KHR structure is defined as:
-
-include::{generated}/api/structs/VkImageBlit2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcSubresource is the subresource to blit from.
-  * pname:srcOffsets is a pointer to an array of two slink:VkOffset3D
-    structures specifying the bounds of the source region within
-    pname:srcSubresource.
-  * pname:dstSubresource is the subresource to blit into.
-  * pname:dstOffsets is a pointer to an array of two slink:VkOffset3D
-    structures specifying the bounds of the destination region within
-    pname:dstSubresource.
-
-For each element of the pname:pRegions array, a blit operation is performed
-for the specified source and destination regions.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/image_blit_common.txt[]
-****
-
-include::{generated}/validity/structs/VkImageBlit2KHR.txt[]
---
-
-ifdef::VK_QCOM_rotated_copy_commands[]
-For flink:vkCmdBlitImage2KHR, each region copied can include a rotation.
-To specify a rotated region, add slink:VkCopyCommandTransformInfoQCOM to the
-pname:pNext chain of slink:VkImageBlit2KHR.
-For each region with a rotation specified,
-<<copies-images-scaling-rotation,Image Blits with Scaling and Rotation>>
-specifies how coordinates are rotated prior to sampling from the source
-image.
-When rotation is specified, the source and destination images must: each be
-2D images.
-They must: not be <<blocked-image,blocked images>> or have a
-<<formats-requiring-sampler-ycbcr-conversion, multi-planar format>>.
-endif::VK_QCOM_rotated_copy_commands[]
-
-endif::VK_KHR_copy_commands2[]
-
-ifdef::VK_QCOM_rotated_copy_commands[]
-include::VK_QCOM_rotated_copies/rotated_addressing_blits.txt[]
-endif::VK_QCOM_rotated_copy_commands[]
-
-
-[[copies-resolve]]
-== Resolving Multisample Images
-
-[open,refpage='vkCmdResolveImage',desc='Resolve regions of an image',type='protos']
---
-:refpage: vkCmdResolveImage
-
-To resolve a multisample color image to a non-multisample color image, call:
-
-include::{generated}/api/protos/vkCmdResolveImage.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:srcImage is the source image.
-  * pname:srcImageLayout is the layout of the source image subresources for
-    the resolve.
-  * pname:dstImage is the destination image.
-  * pname:dstImageLayout is the layout of the destination image subresources
-    for the resolve.
-  * pname:regionCount is the number of regions to resolve.
-  * pname:pRegions is a pointer to an array of slink:VkImageResolve
-    structures specifying the regions to resolve.
-
-During the resolve the samples corresponding to each pixel location in the
-source are converted to a single sample before being written to the
-destination.
-If the source formats are floating-point or normalized types, the sample
-values for each pixel are resolved in an implementation-dependent manner.
-If the source formats are integer types, a single sample's value is selected
-for each pixel.
-
-pname:srcOffset and pname:dstOffset select the initial pname:x, pname:y, and
-pname:z offsets in texels of the sub-regions of the source and destination
-image data.
-pname:extent is the size in texels of the source image to resolve in
-pname:width, pname:height and pname:depth.
-Each element of pname:pRegions must: be a region that is contained within
-its corresponding image.
-
-Resolves are done layer by layer starting with pname:baseArrayLayer member
-of pname:srcSubresource for the source and pname:dstSubresource for the
-destination.
-pname:layerCount layers are resolved to the destination image.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/resolve_image_command_buffer_common.txt[]
-include::{chapters}/commonvalidity/resolve_image_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdResolveImage.txt[]
---
-
-[open,refpage='VkImageResolve',desc='Structure specifying an image resolve operation',type='structs']
---
-:refpage: VkImageResolve
-
-The sname:VkImageResolve structure is defined as:
-
-include::{generated}/api/structs/VkImageResolve.txt[]
-
-  * pname:srcSubresource and pname:dstSubresource are
-    slink:VkImageSubresourceLayers structures specifying the image
-    subresources of the images used for the source and destination image
-    data, respectively.
-    Resolve of depth/stencil images is not supported.
-  * pname:srcOffset and pname:dstOffset select the initial pname:x, pname:y,
-    and pname:z offsets in texels of the sub-regions of the source and
-    destination image data.
-  * pname:extent is the size in texels of the source image to resolve in
-    pname:width, pname:height and pname:depth.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/image_resolve_common.txt[]
-****
-
-include::{generated}/validity/structs/VkImageResolve.txt[]
---
-
-ifdef::VK_AMD_buffer_marker[]
-include::VK_AMD_buffer_marker/copies.txt[]
-endif::VK_AMD_buffer_marker[]
-
-ifdef::VK_KHR_copy_commands2[]
-
-A more extensible version of the resolve image command is defined below.
-
-[open,refpage='vkCmdResolveImage2KHR',desc='Resolve regions of an image',type='protos']
---
-:refpage: vkCmdResolveImage2KHR
-
-To resolve a multisample image to a non-multisample image, call:
-
-include::{generated}/api/protos/vkCmdResolveImage2KHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pResolveImageInfo is a pointer to a slink:VkResolveImageInfo2KHR
-    structure describing the resolve parameters.
-
-This command is functionally identical to flink:vkCmdResolveImage, but
-includes extensible sub-structures that include pname:sType and pname:pNext
-parameters, allowing them to be more easily extended.
-
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/resolve_image_command_buffer_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdResolveImage2KHR.txt[]
---
-
-[open,refpage='VkResolveImageInfo2KHR',desc='Structure specifying parameters of resolve image command',type='structs']
---
-:refpage: VkResolveImageInfo2KHR
-
-The sname:VkResolveImageInfo2KHR structure is defined as:
-
-include::{generated}/api/structs/VkResolveImageInfo2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcImage is the source image.
-  * pname:srcImageLayout is the layout of the source image subresources for
-    the resolve.
-  * pname:dstImage is the destination image.
-  * pname:dstImageLayout is the layout of the destination image subresources
-    for the resolve.
-  * pname:regionCount is the number of regions to resolve.
-  * pname:pRegions is a pointer to an array of slink:VkImageResolve2KHR
-    structures specifying the regions to resolve.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/resolve_image_common.txt[]
-****
-
-include::{generated}/validity/structs/VkResolveImageInfo2KHR.txt[]
---
-
-[open,refpage='VkImageResolve2KHR',desc='Structure specifying an image resolve operation',type='structs']
---
-:refpage: VkImageResolve2KHR
-
-The sname:VkImageResolve2KHR structure is defined as:
-
-include::{generated}/api/structs/VkImageResolve2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcSubresource and pname:dstSubresource are
-    slink:VkImageSubresourceLayers structures specifying the image
-    subresources of the images used for the source and destination image
-    data, respectively.
-    Resolve of depth/stencil images is not supported.
-  * pname:srcOffset and pname:dstOffset select the initial pname:x, pname:y,
-    and pname:z offsets in texels of the sub-regions of the source and
-    destination image data.
-  * pname:extent is the size in texels of the source image to resolve in
-    pname:width, pname:height and pname:depth.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/image_resolve_common.txt[]
-****
-
-include::{generated}/validity/structs/VkImageResolve2KHR.txt[]
---
-
-endif::VK_KHR_copy_commands2[]
diff --git a/registry/vulkan/chapters/debugging.txt b/registry/vulkan/chapters/debugging.txt
deleted file mode 100644
index cfeba6c..0000000
--- a/registry/vulkan/chapters/debugging.txt
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright 2015-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-= Debugging
-
-To aid developers in tracking down errors in the application's use of
-Vulkan, particularly in combination with an external debugger or profiler,
-_debugging extensions_ may be available.
-
-[open,refpage='VkObjectType',desc='Specify an enumeration to track object handle types',type='enums']
---
-The elink:VkObjectType enumeration defines values, each of which corresponds
-to a specific Vulkan handle type.
-These values can: be used to associate debug information with a particular
-type of object through one or more extensions.
-
-include::{generated}/api/enums/VkObjectType.txt[]
-
-[[debugging-object-types]]
-.`VkObjectType` and Vulkan Handle Relationship
-[width="80%",cols="<35,<23",options="header"]
-|====
-| elink:VkObjectType                         | Vulkan Handle Type
-| ename:VK_OBJECT_TYPE_UNKNOWN               | Unknown/Undefined Handle
-| ename:VK_OBJECT_TYPE_INSTANCE              | slink:VkInstance
-| ename:VK_OBJECT_TYPE_PHYSICAL_DEVICE       | slink:VkPhysicalDevice
-| ename:VK_OBJECT_TYPE_DEVICE                | slink:VkDevice
-| ename:VK_OBJECT_TYPE_QUEUE                 | slink:VkQueue
-| ename:VK_OBJECT_TYPE_SEMAPHORE             | slink:VkSemaphore
-| ename:VK_OBJECT_TYPE_COMMAND_BUFFER        | slink:VkCommandBuffer
-| ename:VK_OBJECT_TYPE_FENCE                 | slink:VkFence
-| ename:VK_OBJECT_TYPE_DEVICE_MEMORY         | slink:VkDeviceMemory
-| ename:VK_OBJECT_TYPE_BUFFER                | slink:VkBuffer
-| ename:VK_OBJECT_TYPE_IMAGE                 | slink:VkImage
-| ename:VK_OBJECT_TYPE_EVENT                 | slink:VkEvent
-| ename:VK_OBJECT_TYPE_QUERY_POOL            | slink:VkQueryPool
-| ename:VK_OBJECT_TYPE_BUFFER_VIEW           | slink:VkBufferView
-| ename:VK_OBJECT_TYPE_IMAGE_VIEW            | slink:VkImageView
-| ename:VK_OBJECT_TYPE_SHADER_MODULE         | slink:VkShaderModule
-| ename:VK_OBJECT_TYPE_PIPELINE_CACHE        | slink:VkPipelineCache
-| ename:VK_OBJECT_TYPE_PIPELINE_LAYOUT       | slink:VkPipelineLayout
-| ename:VK_OBJECT_TYPE_RENDER_PASS           | slink:VkRenderPass
-| ename:VK_OBJECT_TYPE_PIPELINE              | slink:VkPipeline
-| ename:VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT | slink:VkDescriptorSetLayout
-| ename:VK_OBJECT_TYPE_SAMPLER               | slink:VkSampler
-| ename:VK_OBJECT_TYPE_DESCRIPTOR_POOL       | slink:VkDescriptorPool
-| ename:VK_OBJECT_TYPE_DESCRIPTOR_SET        | slink:VkDescriptorSet
-| ename:VK_OBJECT_TYPE_FRAMEBUFFER           | slink:VkFramebuffer
-| ename:VK_OBJECT_TYPE_COMMAND_POOL          | slink:VkCommandPool
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-| ename:VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION | slink:VkSamplerYcbcrConversion
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_descriptor_update_template[]
-| ename:VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE | slink:VkDescriptorUpdateTemplate
-endif::VK_VERSION_1_1,VK_KHR_descriptor_update_template[]
-ifdef::VK_KHR_surface[]
-| ename:VK_OBJECT_TYPE_SURFACE_KHR           | slink:VkSurfaceKHR
-endif::VK_KHR_surface[]
-ifdef::VK_KHR_swapchain[]
-| ename:VK_OBJECT_TYPE_SWAPCHAIN_KHR         | slink:VkSwapchainKHR
-endif::VK_KHR_swapchain[]
-ifdef::VK_KHR_display[]
-| ename:VK_OBJECT_TYPE_DISPLAY_KHR           | slink:VkDisplayKHR
-| ename:VK_OBJECT_TYPE_DISPLAY_MODE_KHR      | slink:VkDisplayModeKHR
-endif::VK_KHR_display[]
-ifdef::VK_EXT_debug_report[]
-| ename:VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT | slink:VkDebugReportCallbackEXT
-endif::VK_EXT_debug_report[]
-ifdef::VK_NV_device_generated_commands[]
-| ename:VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV | slink:VkIndirectCommandsLayoutNV
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_EXT_debug_utils[]
-| ename:VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT | slink:VkDebugUtilsMessengerEXT
-endif::VK_EXT_debug_utils[]
-ifdef::VK_EXT_validation_cache[]
-| ename:VK_OBJECT_TYPE_VALIDATION_CACHE_EXT | slink:VkValidationCacheEXT
-endif::VK_EXT_validation_cache[]
-ifdef::VK_NV_ray_tracing[]
-| ename:VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV | slink:VkAccelerationStructureNV
-endif::VK_NV_ray_tracing[]
-ifdef::VK_KHR_acceleration_structure[]
-| ename:VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR | slink:VkAccelerationStructureKHR
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_INTEL_performance_query[]
-| ename:VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL | slink:VkPerformanceConfigurationINTEL
-endif::VK_INTEL_performance_query[]
-ifdef::VK_KHR_deferred_host_operations[]
-| ename:VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR | slink:VkDeferredOperationKHR
-endif::VK_KHR_deferred_host_operations[]
-ifdef::VK_EXT_private_data[]
-| ename:VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT | slink:VkPrivateDataSlotEXT
-endif::VK_EXT_private_data[]
-|====
---
-
-If this Specification was generated with any such extensions included, they
-will be described in the remainder of this chapter.
-
-ifdef::VK_EXT_debug_utils[]
-include::VK_EXT_debug_utils.txt[]
-endif::VK_EXT_debug_utils[]
-
-ifdef::VK_EXT_debug_marker[]
-include::VK_EXT_debug_marker.txt[]
-endif::VK_EXT_debug_marker[]
-
-ifdef::VK_EXT_debug_report[]
-include::VK_EXT_debug_report.txt[]
-endif::VK_EXT_debug_report[]
-
-ifdef::VK_NV_device_diagnostic_checkpoints[]
-include::VK_NV_device_diagnostic_checkpoints/device_diagnostic_checkpoints.txt[]
-endif::VK_NV_device_diagnostic_checkpoints[]
-
-
-ifdef::VK_EXT_tooling_info[]
-[[debugging-tooling-info]]
-== Active Tooling Information
-
-[open,refpage='vkGetPhysicalDeviceToolPropertiesEXT',desc='Reports properties of tools active on the specified physical device',type='protos']
---
-Information about tools providing debugging, profiling, or similar services,
-active for a given physical device, can be obtained by calling:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceToolPropertiesEXT.txt[]
-
-  * pname:physicalDevice is the handle to the physical device to query for
-    active tools.
-  * pname:pToolCount is a pointer to an integer describing the number of
-    tools active on pname:physicalDevice.
-  * pname:pToolProperties is either `NULL` or a pointer to an array of
-    slink:VkPhysicalDeviceToolPropertiesEXT structures.
-
-If pname:pToolProperties is `NULL`, then the number of tools currently
-active on pname:physicalDevice is returned in pname:pToolCount.
-Otherwise, pname:pToolCount must: point to a variable set by the user to the
-number of elements in the pname:pToolProperties array, and on return the
-variable is overwritten with the number of structures actually written to
-pname:pToolProperties.
-If pname:pToolCount is less than the number of currently active tools, at
-most pname:pToolCount structures will be written.
-
-The count and properties of active tools may: change in response to events
-outside the scope of the specification.
-An application should: assume these properties might change at any given
-time.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceToolPropertiesEXT.txt[]
---
-
-[open,refpage='VkPhysicalDeviceToolPropertiesEXT',desc='Structure providing information about an active tool',type='structs']
---
-The slink:VkPhysicalDeviceToolPropertiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceToolPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:name is a null-terminated UTF-8 string containing the name of the
-    tool.
-  * pname:version is a null-terminated UTF-8 string containing the version
-    of the tool.
-  * pname:purposes is a bitmask of elink:VkToolPurposeFlagBitsEXT which is
-    populated with purposes supported by the tool.
-  * pname:description is a null-terminated UTF-8 string containing a
-    description of the tool.
-  * pname:layer is a null-terminated UTF-8 string that contains the name of
-    the layer implementing the tool, if the tool is implemented in a layer -
-    otherwise it may: be an empty string.
-
-include::{generated}/validity/structs/VkPhysicalDeviceToolPropertiesEXT.txt[]
---
-
-[open,refpage='VkToolPurposeFlagBitsEXT',desc='Bitmask specifying the purposes of an active tool',type='enums']
---
-Bits which can: be set in slink:VkDeviceQueueCreateInfo::pname:purposes
-specifying the purposes of an active tool are:
-
-include::{generated}/api/enums/VkToolPurposeFlagBitsEXT.txt[]
-
-  * ename:VK_TOOL_PURPOSE_VALIDATION_BIT_EXT specifies that the tool
-    provides validation of API usage.
-  * ename:VK_TOOL_PURPOSE_PROFILING_BIT_EXT specifies that the tool provides
-    profiling of API usage.
-  * ename:VK_TOOL_PURPOSE_TRACING_BIT_EXT specifies that the tool is
-    capturing data about the application's API usage, including anything
-    from simple logging to capturing data for later replay.
-  * ename:VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT_EXT specifies that the
-    tool provides additional API features/extensions on top of the
-    underlying implementation.
-  * ename:VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT_EXT specifies that the tool
-    modifies the API features/limits/extensions presented to the
-    application.
-ifdef::VK_EXT_debug_report,VK_EXT_debug_utils[]
-  * ename:VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT specifies that the tool
-    reports additional information to the application via callbacks
-    specified by
-ifdef::VK_EXT_debug_report[]
-    flink:vkCreateDebugReportCallbackEXT
-endif::VK_EXT_debug_report[]
-ifdef::VK_EXT_debug_report+VK_EXT_debug_utils[]
-    or
-endif::VK_EXT_debug_report+VK_EXT_debug_utils[]
-ifdef::VK_EXT_debug_utils[]
-    flink:vkCreateDebugUtilsMessengerEXT
-endif::VK_EXT_debug_utils[]
-endif::VK_EXT_debug_report,VK_EXT_debug_utils[]
-ifdef::VK_EXT_debug_marker,VK_EXT_debug_utils[]
-  * ename:VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT specifies that the tool
-    consumes
-ifdef::VK_EXT_debug_marker[]
-    <<debugging-debug-markers,debug markers>>
-endif::VK_EXT_debug_marker[]
-ifdef::VK_EXT_debug_marker+VK_EXT_debug_utils[]
-    or
-endif::VK_EXT_debug_marker+VK_EXT_debug_utils[]
-ifdef::VK_EXT_debug_utils[]
-    <<debugging-object-debug-annotation,object debug annotation>>,
-    <<debugging-queue-labels, queue labels>>, or
-    <<debugging-command-buffer-labels, command buffer labels>>
-endif::VK_EXT_debug_utils[]
-endif::VK_EXT_debug_marker,VK_EXT_debug_utils[]
---
-
-[open,refpage='VkToolPurposeFlagsEXT',desc='Bitmask of VkToolPurposeFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkToolPurposeFlagsEXT.txt[]
-
-tlink:VkToolPurposeFlagsEXT is a bitmask type for setting a mask of zero or
-more elink:VkToolPurposeFlagBitsEXT.
---
-endif::VK_EXT_tooling_info[]
diff --git a/registry/vulkan/chapters/descriptorsets.txt b/registry/vulkan/chapters/descriptorsets.txt
deleted file mode 100644
index e47d128..0000000
--- a/registry/vulkan/chapters/descriptorsets.txt
+++ /dev/null
@@ -1,4835 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[descriptorsets]]
-= Resource Descriptors
-
-A _descriptor_ is an opaque data structure representing a shader resource
-such as a buffer, buffer view, image view, sampler, or combined image
-sampler.
-Descriptors are organised into _descriptor sets_, which are bound during
-command recording for use in subsequent drawing commands.
-The arrangement of content in each descriptor set is determined by a
-_descriptor set layout_, which determines what descriptors can be stored
-within it.
-The sequence of descriptor set layouts that can: be used by a pipeline is
-specified in a _pipeline layout_.
-Each pipeline object can: use up to pname:maxBoundDescriptorSets (see
-<<limits, Limits>>) descriptor sets.
-
-Shaders access resources via variables decorated with a descriptor set and
-binding number that link them to a descriptor in a descriptor set.
-The shader interface mapping to bound descriptor sets is described in the
-<<interfaces-resources, Shader Resource Interface>> section.
-
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-Shaders can: also access buffers without going through descriptors by using
-<<descriptorsets-physical-storage-buffer,Physical Storage Buffer Access>> to
-access them through 64-bit addresses.
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-
-
-[[descriptorsets-types]]
-== Descriptor Types
-
-There are a number of different types of descriptor supported by Vulkan,
-corresponding to different resources or usage.
-The following sections describe the API definitions of each descriptor type.
-The mapping of each type to SPIR-V is listed in the
-<<interfaces-resources-correspondence, Shader Resource and Descriptor Type
-Correspondence>> and <<interfaces-resources-storage-class-correspondence,
-Shader Resource and Storage Class Correspondence>> tables in the
-<<interfaces, Shader Interfaces>> chapter.
-
-
-[[descriptorsets-storageimage]]
-=== Storage Image
-
-A _storage image_ (ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) is a descriptor
-type associated with an <<resources-images, image resource>> via an
-<<resources-image-views, image view>> that load, store, and atomic
-operations can: be performed on.
-
-Storage image loads are supported in all shader stages for image views whose
-<<resources-image-view-format-features,format features>> contain
-<<formats-properties,ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT>>.
-
-Stores to storage images are supported in compute shaders for image views
-whose <<resources-image-view-format-features,format features>> contain
-<<formats-properties,ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT>>.
-
-Atomic operations on storage images are supported in compute shaders for
-image views whose <<resources-image-view-format-features,format features>>
-contain
-<<formats-properties,ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT>>.
-
-When the <<features-fragmentStoresAndAtomics,
-pname:fragmentStoresAndAtomics>> feature is enabled, stores and atomic
-operations are also supported for storage images in fragment shaders with
-the same set of image formats as supported in compute shaders.
-When the <<features-vertexPipelineStoresAndAtomics,
-pname:vertexPipelineStoresAndAtomics>> feature is enabled, stores and atomic
-operations are also supported in vertex, tessellation, and geometry shaders
-with the same set of image formats as supported in compute shaders.
-
-The image subresources for a storage image must: be in the
-ifdef::VK_KHR_shared_presentable_image[]
-ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR or
-endif::VK_KHR_shared_presentable_image[]
-ename:VK_IMAGE_LAYOUT_GENERAL layout in order to access its data in a
-shader.
-
-
-[[descriptorsets-sampler]]
-=== Sampler
-
-A _sampler descriptor_ (ename:VK_DESCRIPTOR_TYPE_SAMPLER) is a descriptor
-type associated with a <<samplers,sampler>> object, used to control the
-behavior of <<textures,sampling operations>> performed on a
-<<descriptorsets-sampledimage, sampled image>>.
-
-
-[[descriptorsets-sampledimage]]
-=== Sampled Image
-
-A _sampled image_ (ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) is a descriptor
-type associated with an <<resources-images, image resource>> via an
-<<resources-image-views, image view>> that <<textures,sampling operations>>
-can: be performed on.
-
-Shaders combine a sampled image variable and a sampler variable to perform
-sampling operations.
-
-Sampled images are supported in all shader stages for image views whose
-<<resources-image-view-format-features,format features>> contain
-<<formats-properties,ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT>>.
-
-The image subresources for a sampled image must: be in the
-ifdef::VK_KHR_shared_presentable_image[]
-ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
-ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
-ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, or
-ename:VK_IMAGE_LAYOUT_GENERAL layout in order to access its data in a
-shader.
-
-
-[[descriptorsets-combinedimagesampler]]
-=== Combined Image Sampler
-
-A _combined image sampler_ (ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
-is a single descriptor type associated with both a <<samplers,sampler>> and
-an <<resources-images,image resource>>, combining both a
-<<descriptorsets-sampler,sampler>> and <<descriptorsets-sampledimage,
-sampled image>> descriptor into a single descriptor.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-If the descriptor refers to a sampler that performs
-ifndef::VK_EXT_fragment_density_map[]
-<<samplers-YCbCr-conversion,{YCbCr} conversion>>,
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_EXT_fragment_density_map[]
-<<samplers-YCbCr-conversion,{YCbCr} conversion>> or samples a
-<<samplers-subsamplesampler,subsampled image>>,
-endif::VK_EXT_fragment_density_map[]
-the sampler must: only be used to sample the image in the same descriptor.
-Otherwise, the
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifndef::VK_EXT_fragment_density_map[]
-The
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_EXT_fragment_density_map[]
-If the descriptor refers to a sampler that samples a
-<<samplers-subsamplesampler,subsampled image>>, the sampler must: only be
-used to sample the image in the same descriptor.
-Otherwise, the
-endif::VK_EXT_fragment_density_map[]
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-sampler and image in this type of descriptor can: be used freely with any
-other samplers and images.
-
-The image subresources for a combined image sampler must: be in the
-ifdef::VK_KHR_shared_presentable_image[]
-ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
-ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
-ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, or
-ename:VK_IMAGE_LAYOUT_GENERAL layout in order to access its data in a
-shader.
-
-[NOTE]
-.Note
-====
-On some implementations, it may: be more efficient to sample from an image
-using a combination of sampler and sampled image that are stored together in
-the descriptor set in a combined descriptor.
-====
-
-
-[[descriptorsets-uniformtexelbuffer]]
-=== Uniform Texel Buffer
-
-A _uniform texel buffer_ (ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) is
-a descriptor type associated with a <<resources-buffers,buffer resource>>
-via a <<resources-buffer-views, buffer view>> that <<textures,formatted load
-operations>> can: be performed on.
-
-Uniform texel buffers define a tightly-packed 1-dimensional linear array of
-texels, with texels going through format conversion when read in a shader in
-the same way as they are for an image.
-
-Load operations from uniform texel buffers are supported in all shader
-stages for image formats which report support for the
-<<formats-properties,ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT>>
-feature bit via flink:vkGetPhysicalDeviceFormatProperties in
-slink:VkFormatProperties::pname:bufferFeatures.
-
-
-[[descriptorsets-storagetexelbuffer]]
-=== Storage Texel Buffer
-
-A _storage texel buffer_ (ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER) is
-a descriptor type associated with a <<resources-buffers,buffer resource>>
-via a <<resources-buffer-views, buffer view>> that <<textures,formatted
-load, store, and atomic operations>> can: be performed on.
-
-Storage texel buffers define a tightly-packed 1-dimensional linear array of
-texels, with texels going through format conversion when read in a shader in
-the same way as they are for an image.
-Unlike <<descriptorsets-uniformtexelbuffer,uniform texel buffers>>, these
-buffers can also be written to in the same way as for
-<<descriptorsets-storageimage, storage images>>.
-
-Storage texel buffer loads are supported in all shader stages for texel
-buffer formats which report support for the
-<<formats-properties,ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT>>
-feature bit via flink:vkGetPhysicalDeviceFormatProperties in
-slink:VkFormatProperties::pname:bufferFeatures.
-
-Stores to storage texel buffers are supported in compute shaders for texel
-buffer formats which report support for the
-ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT feature via
-flink:vkGetPhysicalDeviceFormatProperties in
-slink:VkFormatProperties::pname:bufferFeatures.
-
-Atomic operations on storage texel buffers are supported in compute shaders
-for texel buffer formats which report support for the
-<<formats-properties,ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT>>
-feature via flink:vkGetPhysicalDeviceFormatProperties in
-slink:VkFormatProperties::pname:bufferFeatures.
-
-When the <<features-fragmentStoresAndAtomics,
-pname:fragmentStoresAndAtomics>> feature is enabled, stores and atomic
-operations are also supported for storage texel buffers in fragment shaders
-with the same set of texel buffer formats as supported in compute shaders.
-When the <<features-vertexPipelineStoresAndAtomics,
-pname:vertexPipelineStoresAndAtomics>> feature is enabled, stores and atomic
-operations are also supported in vertex, tessellation, and geometry shaders
-with the same set of texel buffer formats as supported in compute shaders.
-
-
-[[descriptorsets-storagebuffer]]
-=== Storage Buffer
-
-A _storage buffer_ (ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) is a descriptor
-type associated with a <<resources-buffers,buffer resource>> directly,
-described in a shader as a structure with various members that load, store,
-and atomic operations can: be performed on.
-
-[NOTE]
-.Note
-====
-Atomic operations can: only be performed on members of certain types as
-defined in the <<spirvenv, SPIR-V environment appendix>>.
-====
-
-
-[[descriptorsets-uniformbuffer]]
-=== Uniform Buffer
-
-A _uniform buffer_ (ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) is a descriptor
-type associated with a <<resources-buffers,buffer resource>> directly,
-described in a shader as a structure with various members that load
-operations can: be performed on.
-
-
-[[descriptorsets-uniformbufferdynamic]]
-=== Dynamic Uniform Buffer
-
-A _dynamic uniform buffer_ (ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)
-is almost identical to a <<descriptorsets-uniformbuffer, uniform buffer>>,
-and differs only in how the offset into the buffer is specified.
-The base offset calculated by the slink:VkDescriptorBufferInfo when
-initially <<descriptorsets-updates, updating the descriptor set>> is added
-to a <<descriptorsets-binding-dynamicoffsets, dynamic offset>> when binding
-the descriptor set.
-
-
-[[descriptorsets-storagebufferdynamic]]
-=== Dynamic Storage Buffer
-
-A _dynamic storage buffer_ (ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)
-is almost identical to a <<descriptorsets-storagebuffer, storage buffer>>,
-and differs only in how the offset into the buffer is specified.
-The base offset calculated by the slink:VkDescriptorBufferInfo when
-initially <<descriptorsets-updates, updating the descriptor set>> is added
-to a <<descriptorsets-binding-dynamicoffsets, dynamic offset>> when binding
-the descriptor set.
-
-
-ifdef::VK_EXT_inline_uniform_block[]
-
-[[descriptorsets-inlineuniformblock]]
-=== Inline Uniform Block
-
-An _inline uniform block_
-(ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT) is almost identical to a
-<<descriptorsets-uniformbuffer, uniform buffer>>, and differs only in taking
-its storage directly from the encompassing descriptor set instead of being
-backed by buffer memory.
-It is typically used to access a small set of constant data that does not
-require the additional flexibility provided by the indirection enabled when
-using a uniform buffer where the descriptor and the referenced buffer memory
-are decoupled.
-Compared to push constants, they allow reusing the same set of constant data
-across multiple disjoint sets of drawing and dispatching commands.
-
-Inline uniform block descriptors cannot: be aggregated into arrays.
-Instead, the array size specified for an inline uniform block descriptor
-binding specifies the binding's capacity in bytes.
-
-endif::VK_EXT_inline_uniform_block[]
-
-
-[[descriptorsets-inputattachment]]
-=== Input Attachment
-
-An _input attachment_ (ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT) is a
-descriptor type associated with an <<resources-images, image resource>> via
-an <<resources-image-views, image view>> that can: be used for
-<<synchronization-framebuffer-regions,framebuffer local>> load operations in
-fragment shaders.
-
-All image formats that are supported for color attachments
-(ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) or depth/stencil attachments
-(ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) for a given image
-tiling mode are also supported for input attachments.
-
-The image subresources for an input attachment must: be in a
-<<attachment-type-imagelayout, valid image layout>> in order to access its
-data in a shader.
-
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-[[descriptorsets-accelerationstructure]]
-=== Acceleration Structure
-
-An _acceleration structure_ (
-ifdef::VK_KHR_acceleration_structure[ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR]
-ifdef::VK_KHR_acceleration_structure+VK_NV_ray_tracing[or]
-ifdef::VK_NV_ray_tracing[ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV]
-) is a descriptor type that is used to retrieve scene geometry from within
-shaders that are used for ray traversal.
-Shaders have read-only access to the memory.
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-
-ifdef::VK_VALVE_mutable_descriptor_type[]
-[[descriptorsets-mutable]]
-=== Mutable
-
-A descriptor of _mutable_ (ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE) type
-indicates that this descriptor can: mutate to any of the descriptor types
-given in the
-slink:VkMutableDescriptorTypeCreateInfoVALVE::pname:pDescriptorTypes list of
-descriptor types in the pname:pNext chain of
-slink:VkDescriptorSetLayoutCreateInfo for this binding.
-At any point, each individual descriptor of mutable type has an active
-descriptor type.
-The active descriptor type can: be any one of the declared types in
-pname:pDescriptorTypes.
-Additionally, a mutable descriptor's active descriptor type can: be of the
-ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE type, which is the initial active
-descriptor type.
-The active descriptor type can: change when the descriptor is updated.
-When a descriptor is consumed by binding a descriptor set, the active
-descriptor type is considered, not ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE.
-
-An active descriptor type of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE is
-considered an undefined: descriptor.
-If a descriptor is consumed where the active descriptor type does not match
-what the shader expects, the descriptor is considered an undefined:
-descriptor.
-
-[NOTE]
-.Note
-====
-To find which descriptor types are supported as
-ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the application can: use
-flink:vkGetDescriptorSetLayoutSupport with an
-ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE binding, with the list of descriptor
-types to query in the
-slink:VkMutableDescriptorTypeCreateInfoVALVE::pname:pDescriptorTypes array
-for that binding.
-====
-
-[NOTE]
-.Note
-====
-The intention of a mutable descriptor type is that implementations allocate
-N bytes per descriptor, where N is determined by the maximum descriptor size
-for a given descriptor binding.
-Implementations are not expected to keep track of the active descriptor
-type, and it should be considered a C-like union type.
-
-A mutable descriptor type is not considered as efficient in terms of
-run-time performance as using a non-mutable descriptor type, and
-applications are not encouraged to use them outside API layering efforts.
-Mutable descriptor types can be more efficient if the alternative is using
-many different descriptors to emulate mutable descriptor types.
-====
-
-endif::VK_VALVE_mutable_descriptor_type[]
-
-[[descriptorsets-sets]]
-== Descriptor Sets
-
-Descriptors are grouped together into descriptor set objects.
-A descriptor set object is an opaque object containing storage for a set of
-descriptors, where the types and number of descriptors is defined by a
-descriptor set layout.
-The layout object may: be used to define the association of each descriptor
-binding with memory or other implementation resources.
-The layout is used both for determining the resources that need to be
-associated with the descriptor set, and determining the interface between
-shader stages and shader resources.
-
-
-[[descriptorsets-setlayout]]
-=== Descriptor Set Layout
-
-[open,refpage='VkDescriptorSetLayout',desc='Opaque handle to a descriptor set layout object',type='handles']
---
-A descriptor set layout object is defined by an array of zero or more
-descriptor bindings.
-Each individual descriptor binding is specified by a descriptor type, a
-count (array size) of the number of descriptors in the binding, a set of
-shader stages that can: access the binding, and (if using immutable
-samplers) an array of sampler descriptors.
-
-Descriptor set layout objects are represented by sname:VkDescriptorSetLayout
-handles:
-
-include::{generated}/api/handles/VkDescriptorSetLayout.txt[]
---
-
-[open,refpage='vkCreateDescriptorSetLayout',desc='Create a new descriptor set layout',type='protos']
---
-To create descriptor set layout objects, call:
-
-include::{generated}/api/protos/vkCreateDescriptorSetLayout.txt[]
-
-  * pname:device is the logical device that creates the descriptor set
-    layout.
-  * pname:pCreateInfo is a pointer to a
-    slink:VkDescriptorSetLayoutCreateInfo structure specifying the state of
-    the descriptor set layout object.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pSetLayout is a pointer to a slink:VkDescriptorSetLayout handle in
-    which the resulting descriptor set layout object is returned.
-
-include::{generated}/validity/protos/vkCreateDescriptorSetLayout.txt[]
---
-
-[open,refpage='VkDescriptorSetLayoutCreateInfo',desc='Structure specifying parameters of a newly created descriptor set layout',type='structs']
---
-Information about the descriptor set layout is passed in a
-sname:VkDescriptorSetLayoutCreateInfo structure:
-
-include::{generated}/api/structs/VkDescriptorSetLayoutCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask
-ifdef::VK_KHR_push_descriptor[]
-    of elink:VkDescriptorSetLayoutCreateFlagBits
-endif::VK_KHR_push_descriptor[]
-    specifying options for descriptor set layout creation.
-  * pname:bindingCount is the number of elements in pname:pBindings.
-  * pname:pBindings is a pointer to an array of
-    slink:VkDescriptorSetLayoutBinding structures.
-
-.Valid Usage
-****
-  * [[VUID-VkDescriptorSetLayoutCreateInfo-binding-00279]]
-    The slink:VkDescriptorSetLayoutBinding::pname:binding members of the
-    elements of the pname:pBindings array must: each have different values
-ifdef::VK_KHR_push_descriptor[]
-  * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-00280]]
-    If pname:flags contains
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then all
-    elements of pname:pBindings must: not have a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-02208]]
-    If pname:flags contains
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then all
-    elements of pname:pBindings must: not have a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
-endif::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-00281]]
-    If pname:flags contains
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then the
-    total number of elements of all bindings must: be less than or equal to
-    slink:VkPhysicalDevicePushDescriptorPropertiesKHR::pname:maxPushDescriptors
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-04590]]
-    If pname:flags contains
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR,
-    pname:flags must: not contain
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE
-  * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-04591]]
-    If pname:flags contains
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR,
-    pname:pBindings must: not have a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE
-endif::VK_VALVE_mutable_descriptor_type[]
-endif::VK_KHR_push_descriptor[]
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-03000]]
-    If any binding has the ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT
-    bit set, pname:flags must: include
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT
-  * [[VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-03001]]
-    If any binding has the ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT
-    bit set, then all bindings must: not have pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-04592]]
-    If pname:flags contains
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,
-    pname:flags must: not contain
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE
-endif::VK_VALVE_mutable_descriptor_type[]
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-04593]]
-    If any binding has a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, then a
-    slink:VkMutableDescriptorTypeCreateInfoVALVE must: be present in the
-    pname:pNext chain
-  * [[VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-04594]]
-    If a binding has a pname:descriptorType value of
-    ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, then sname:pImmutableSamplers
-    must: be `NULL`
-  * [[VUID-VkDescriptorSetLayoutCreateInfo-mutableDescriptorType-04595]]
-    If
-    slink:VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE::pname:mutableDescriptorType
-    is not enabled, pname:pBindings must: not contain a pname:descriptorType
-    of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE
-  * [[VUID-VkDescriptorSetLayoutCreateInfo-flags-04596]]
-    If pname:flags contains
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE,
-    slink:VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE::pname:mutableDescriptorType
-    must: be enabled
-endif::VK_VALVE_mutable_descriptor_type[]
-****
-
-include::{generated}/validity/structs/VkDescriptorSetLayoutCreateInfo.txt[]
---
-
-ifdef::VK_VALVE_mutable_descriptor_type[]
-
-[open,refpage='VkMutableDescriptorTypeCreateInfoVALVE',desc='Structure describing the list of possible active descriptor types for mutable type descriptors',type='structs']
---
-Information about the possible descriptor types for mutable descriptor types
-is passed in a sname:VkMutableDescriptorTypeCreateInfoVALVE structure as a
-pname:pNext to a slink:VkDescriptorSetLayoutCreateInfo structure or a
-slink:VkDescriptorPoolCreateInfo structure.
-
-The sname:VkMutableDescriptorTypeCreateInfoVALVE structure is defined as:
-
-include::{generated}/api/structs/VkMutableDescriptorTypeCreateInfoVALVE.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:mutableDescriptorTypeListCount is the number of elements in
-    pname:pMutableDescriptorTypeLists.
-  * pname:pMutableDescriptorTypeLists is a pointer to an array of
-    sname:VkMutableDescriptorTypeListVALVE structures.
-
-If pname:mutableDescriptorTypeListCount is zero or if this structure is not
-included in the pname:pNext chain, the
-slink:VkMutableDescriptorTypeListVALVE for each element is considered to be
-zero or `NULL` for each member.
-Otherwise, the descriptor set layout binding at
-slink:VkDescriptorSetLayoutCreateInfo::pname:pBindings[i] uses the
-descriptor type lists in
-slink:VkMutableDescriptorTypeCreateInfoVALVE::pname:pMutableDescriptorTypeLists[i].
-
-include::{generated}/validity/structs/VkMutableDescriptorTypeCreateInfoVALVE.txt[]
---
-
-[open,refpage='VkMutableDescriptorTypeListVALVE',desc='Structure describing descriptor types that a given descriptor may mutate to',type='structs']
---
-The list of potential descriptor types a given mutable descriptor can:
-mutate to is passed in a sname:VkMutableDescriptorTypeListVALVE structure.
-
-The sname:VkMutableDescriptorTypeListVALVE structure is defined as:
-
-include::{generated}/api/structs/VkMutableDescriptorTypeListVALVE.txt[]
-
-  * pname:descriptorTypeCount is the number of elements in
-    pname:pDescriptorTypes.
-  * pname:pDescriptorTypes is `NULL` or a pointer to an array of
-    pname:descriptorTypeCount elink:VkDescriptorType values which define
-    which descriptor types a given binding may mutate to.
-
-.Valid Usage
-****
-  * [[VUID-VkMutableDescriptorTypeListVALVE-descriptorTypeCount-04597]]
-    pname:descriptorTypeCount must: not be `0` if the corresponding binding
-    is of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE
-  * [[VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04598]]
-    pname:pDescriptorTypes must: be a valid pointer to an array of
-    pname:descriptorTypeCount valid, unique elink:VkDescriptorType values if
-    the given binding is of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE type
-  * [[VUID-VkMutableDescriptorTypeListVALVE-descriptorTypeCount-04599]]
-    pname:descriptorTypeCount must: be `0` if the corresponding binding is
-    not of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE
-  * [[VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04600]]
-    pname:pDescriptorTypes must: not contain
-    ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE
-  * [[VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04601]]
-    pname:pDescriptorTypes must: not contain
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC
-  * [[VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04602]]
-    pname:pDescriptorTypes must: not contain
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkMutableDescriptorTypeListVALVE-pDescriptorTypes-04603]]
-    pname:pDescriptorTypes must: not contain
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
-endif::VK_EXT_inline_uniform_block[]
-****
-
-include::{generated}/validity/structs/VkMutableDescriptorTypeListVALVE.txt[]
---
-
-endif::VK_VALVE_mutable_descriptor_type[]
-
-[open,refpage='VkDescriptorSetLayoutCreateFlagBits',desc='Bitmask specifying descriptor set layout properties',type='enums']
---
-Bits which can: be set in slink:VkDescriptorSetLayoutCreateInfo::pname:flags
-to specify options for descriptor set layout are:
-
-include::{generated}/api/enums/VkDescriptorSetLayoutCreateFlagBits.txt[]
-
-ifdef::VK_KHR_push_descriptor[]
-  * ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR specifies
-    that descriptor sets must: not be allocated using this layout, and
-    descriptors are instead pushed by flink:vkCmdPushDescriptorSetKHR.
-endif::VK_KHR_push_descriptor[]
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-// Jon - "UpdateAfterBind" is a vague reference, should be more precise /
-// link to the right specification area
-  * ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT
-    specifies that descriptor sets using this layout must: be allocated from
-    a descriptor pool created with the
-    ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT bit set.
-    Descriptor set layouts created with this bit set have alternate limits
-    for the maximum number of descriptors per-stage and per-pipeline layout.
-    The non-UpdateAfterBind limits only count descriptors in sets created
-    without this flag.
-    The UpdateAfterBind limits count all descriptors, but the limits may: be
-    higher than the non-UpdateAfterBind limits.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE specifies
-    that descriptor sets using this layout must: be allocated from a
-    descriptor pool created with the
-    ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE bit set.
-    Descriptor set layouts created with this bit have no expressable limit
-    for maximum number of descriptors per-stage.
-    Host descriptor sets are limited only by available host memory, but may:
-    be limited for implementation specific reasons.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Implementations may: limit the number of supported descriptors to
-    UpdateAfterBind limits or non-UpdateAfterBind limits, whichever is
-    larger.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Implementations may: limit the number of supported descriptors to
-    non-UpdateAfterBind limits.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-endif::VK_VALVE_mutable_descriptor_type[]
-
-ifndef::VK_KHR_push_descriptor[]
-[NOTE]
-.Note
-====
-All bits for this type are defined by extensions, and none of those
-extensions are enabled in this build of the specification.
-====
-endif::VK_KHR_push_descriptor[]
---
-
-[open,refpage='VkDescriptorSetLayoutCreateFlags',desc='Bitmask of VkDescriptorSetLayoutCreateFlagBits',type='flags']
---
-include::{generated}/api/flags/VkDescriptorSetLayoutCreateFlags.txt[]
-
-tname:VkDescriptorSetLayoutCreateFlags is a bitmask type for setting a mask
-of zero or more elink:VkDescriptorSetLayoutCreateFlagBits.
---
-
-[open,refpage='VkDescriptorSetLayoutBinding',desc='Structure specifying a descriptor set layout binding',type='structs']
---
-The sname:VkDescriptorSetLayoutBinding structure is defined as:
-
-include::{generated}/api/structs/VkDescriptorSetLayoutBinding.txt[]
-
-  * pname:binding is the binding number of this entry and corresponds to a
-    resource of the same binding number in the shader stages.
-  * pname:descriptorType is a elink:VkDescriptorType specifying which type
-    of resource descriptors are used for this binding.
-  * pname:descriptorCount is the number of descriptors contained in the
-    binding, accessed in a shader as an
-ifndef::VK_EXT_inline_uniform_block[array.]
-ifdef::VK_EXT_inline_uniform_block[]
-    array, except if pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT in which case
-    pname:descriptorCount is the size in bytes of the inline uniform block.
-endif::VK_EXT_inline_uniform_block[]
-    If pname:descriptorCount is zero this binding entry is reserved and the
-    resource must: not be accessed from any stage via this binding within
-    any pipeline using the set layout.
-  * pname:stageFlags member is a bitmask of elink:VkShaderStageFlagBits
-    specifying which pipeline shader stages can: access a resource for this
-    binding.
-    ename:VK_SHADER_STAGE_ALL is a shorthand specifying that all defined
-    shader stages, including any additional stages defined by extensions,
-    can: access the resource.
-+
-If a shader stage is not included in pname:stageFlags, then a resource must:
-not be accessed from that stage via this binding within any pipeline using
-the set layout.
-Other than input attachments which are limited to the fragment shader, there
-are no limitations on what combinations of stages can: use a descriptor
-binding, and in particular a binding can: be used by both graphics stages
-and the compute stage.
-
-  * pname:pImmutableSamplers affects initialization of samplers.
-    If pname:descriptorType specifies a ename:VK_DESCRIPTOR_TYPE_SAMPLER or
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER type descriptor, then
-    pname:pImmutableSamplers can: be used to initialize a set of _immutable
-    samplers_.
-    Immutable samplers are permanently bound into the set layout and must:
-    not be changed; updating a ename:VK_DESCRIPTOR_TYPE_SAMPLER descriptor
-    with immutable samplers is not allowed and updates to a
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER descriptor with
-    immutable samplers does not modify the samplers (the image views are
-    updated, but the sampler updates are ignored).
-    If pname:pImmutableSamplers is not `NULL`, then it is a pointer to an
-    array of sampler handles that will be copied into the set layout and
-    used for the corresponding binding.
-    Only the sampler handles are copied; the sampler objects must: not be
-    destroyed before the final use of the set layout and any descriptor
-    pools and sets created using it.
-    If pname:pImmutableSamplers is `NULL`, then the sampler slots are
-    dynamic and sampler handles must: be bound into descriptor sets using
-    this layout.
-    If pname:descriptorType is not one of these descriptor types, then
-    pname:pImmutableSamplers is ignored.
-
-The above layout definition allows the descriptor bindings to be specified
-sparsely such that not all binding numbers between 0 and the maximum binding
-number need to be specified in the pname:pBindings array.
-Bindings that are not specified have a pname:descriptorCount and
-pname:stageFlags of zero, and the value of pname:descriptorType is
-undefined:.
-However, all binding numbers between 0 and the maximum binding number in the
-slink:VkDescriptorSetLayoutCreateInfo::pname:pBindings array may: consume
-memory in the descriptor set layout even if not all descriptor bindings are
-used, though it should: not consume additional memory from the descriptor
-pool.
-
-[NOTE]
-.Note
-====
-The maximum binding number specified should: be as compact as possible to
-avoid wasted memory.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkDescriptorSetLayoutBinding-descriptorType-00282]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLER or
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and
-    pname:descriptorCount is not `0` and pname:pImmutableSamplers is not
-    `NULL`, pname:pImmutableSamplers must: be a valid pointer to an array of
-    pname:descriptorCount valid sname:VkSampler handles
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkDescriptorSetLayoutBinding-descriptorType-04604]]
-    If the <<features-inlineUniformBlock,inlineUniformBlock>> feature is not
-    enabled, pname:descriptorType must: not be
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
-  * [[VUID-VkDescriptorSetLayoutBinding-descriptorType-02209]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
-    pname:descriptorCount must: be a multiple of `4`
-  * [[VUID-VkDescriptorSetLayoutBinding-descriptorType-02210]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
-    pname:descriptorCount must: be less than or equal to
-    sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxInlineUniformBlockSize
-endif::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkDescriptorSetLayoutBinding-descriptorCount-00283]]
-    If pname:descriptorCount is not `0`, pname:stageFlags must: be a valid
-    combination of elink:VkShaderStageFlagBits values
-  * [[VUID-VkDescriptorSetLayoutBinding-descriptorType-01510]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT and
-    pname:descriptorCount is not `0`, then pname:stageFlags must: be `0` or
-    ename:VK_SHADER_STAGE_FRAGMENT_BIT
-ifdef::VK_EXT_custom_border_color[]
-  * [[VUID-VkDescriptorSetLayoutBinding-pImmutableSamplers-04009]]
-    The sampler objects indicated by pname:pImmutableSamplers must: not have
-    a pname:borderColor with one of the values
-    ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT or
-    ename:VK_BORDER_COLOR_INT_CUSTOM_EXT
-endif::VK_EXT_custom_border_color[]
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkDescriptorSetLayoutBinding-descriptorType-04605]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, then
-    sname:pImmutableSamplers must: be `NULL`
-endif::VK_VALVE_mutable_descriptor_type[]
-****
-
-include::{generated}/validity/structs/VkDescriptorSetLayoutBinding.txt[]
---
-
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-[open,refpage='VkDescriptorSetLayoutBindingFlagsCreateInfo',desc='Structure specifying creation flags for descriptor set layout bindings',type='structs',alias='VkDescriptorSetLayoutBindingFlagsCreateInfoEXT']
---
-If the pname:pNext chain of a slink:VkDescriptorSetLayoutCreateInfo
-structure includes a slink:VkDescriptorSetLayoutBindingFlagsCreateInfo
-structure, then that structure includes an array of flags, one for each
-descriptor set layout binding.
-
-The slink:VkDescriptorSetLayoutBindingFlagsCreateInfo structure is defined
-as:
-
-include::{generated}/api/structs/VkDescriptorSetLayoutBindingFlagsCreateInfo.txt[]
-
-ifdef::VK_EXT_descriptor_indexing[]
-or the equivalent
-
-include::{generated}/api/structs/VkDescriptorSetLayoutBindingFlagsCreateInfoEXT.txt[]
-endif::VK_EXT_descriptor_indexing[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:bindingCount is zero or the number of elements in
-    pname:pBindingFlags.
-  * pname:pBindingFlags is a pointer to an array of
-    tlink:VkDescriptorBindingFlags bitfields, one for each descriptor set
-    layout binding.
-
-If pname:bindingCount is zero or if this structure is not included in the
-pname:pNext chain, the tlink:VkDescriptorBindingFlags for each descriptor
-set layout binding is considered to be zero.
-Otherwise, the descriptor set layout binding at
-slink:VkDescriptorSetLayoutCreateInfo::pname:pBindings[i] uses the flags in
-pname:pBindingFlags[i].
-
-.Valid Usage
-****
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-bindingCount-03002]]
-    If pname:bindingCount is not zero, pname:bindingCount must: equal
-    slink:VkDescriptorSetLayoutCreateInfo::pname:bindingCount
-ifdef::VK_KHR_push_descriptor[]
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-flags-03003]]
-    If slink:VkDescriptorSetLayoutCreateInfo::pname:flags includes
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then all
-    elements of pname:pBindingFlags must: not include
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT,
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT, or
-    ename:VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT
-endif::VK_KHR_push_descriptor[]
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-pBindingFlags-03004]]
-    If an element of pname:pBindingFlags includes
-    ename:VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT, then all
-    other elements of slink:VkDescriptorSetLayoutCreateInfo::pname:pBindings
-    must: have a smaller value of pname:binding
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUniformBufferUpdateAfterBind-03005]]
-    If
-    slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingUniformBufferUpdateAfterBind
-    is not enabled, all bindings with descriptor type
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER must: not use
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingSampledImageUpdateAfterBind-03006]]
-    If
-    slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingSampledImageUpdateAfterBind
-    is not enabled, all bindings with descriptor type
-    ename:VK_DESCRIPTOR_TYPE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, or
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE must: not use
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageImageUpdateAfterBind-03007]]
-    If
-    slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingStorageImageUpdateAfterBind
-    is not enabled, all bindings with descriptor type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE must: not use
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageBufferUpdateAfterBind-03008]]
-    If
-    slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingStorageBufferUpdateAfterBind
-    is not enabled, all bindings with descriptor type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER must: not use
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUniformTexelBufferUpdateAfterBind-03009]]
-    If
-    slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingUniformTexelBufferUpdateAfterBind
-    is not enabled, all bindings with descriptor type
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER must: not use
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageTexelBufferUpdateAfterBind-03010]]
-    If
-    slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingStorageTexelBufferUpdateAfterBind
-    is not enabled, all bindings with descriptor type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER must: not use
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingInlineUniformBlockUpdateAfterBind-02211]]
-    If
-    slink:VkPhysicalDeviceInlineUniformBlockFeaturesEXT::pname:descriptorBindingInlineUniformBlockUpdateAfterBind
-    is not enabled, all bindings with descriptor type
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT must: not use
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT
-endif::VK_EXT_inline_uniform_block[]
-ifdef::VK_KHR_acceleration_structure[]
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingAccelerationStructureUpdateAfterBind-03570]]
-    If
-    slink:VkPhysicalDeviceAccelerationStructureFeaturesKHR::pname:descriptorBindingAccelerationStructureUpdateAfterBind
-    is not enabled, all bindings with descriptor type
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR or
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV must: not use
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT
-endif::VK_KHR_acceleration_structure[]
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-None-03011]]
-    All bindings with descriptor type
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC must: not use
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUpdateUnusedWhilePending-03012]]
-    If
-    slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingUpdateUnusedWhilePending
-    is not enabled, all elements of pname:pBindingFlags must: not include
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingPartiallyBound-03013]]
-    If
-    slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingPartiallyBound
-    is not enabled, all elements of pname:pBindingFlags must: not include
-    ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingVariableDescriptorCount-03014]]
-    If
-    slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingVariableDescriptorCount
-    is not enabled, all elements of pname:pBindingFlags must: not include
-    ename:VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT
-  * [[VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-pBindingFlags-03015]]
-    If an element of pname:pBindingFlags includes
-    ename:VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT, that
-    element's pname:descriptorType must: not be
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC
-****
-
-include::{generated}/validity/structs/VkDescriptorSetLayoutBindingFlagsCreateInfo.txt[]
---
-
-[open,refpage='VkDescriptorBindingFlagBits',desc='Bitmask specifying descriptor set layout binding properties',type='enums',alias='VkDescriptorBindingFlagBitsEXT']
---
-Bits which can: be set in each element of
-slink:VkDescriptorSetLayoutBindingFlagsCreateInfo::pname:pBindingFlags to
-specify options for the corresponding descriptor set layout binding are:
-
-include::{generated}/api/enums/VkDescriptorBindingFlagBits.txt[]
-
-ifdef::VK_EXT_descriptor_indexing[]
-or the equivalent
-
-include::{generated}/api/enums/VkDescriptorBindingFlagBitsEXT.txt[]
-endif::VK_EXT_descriptor_indexing[]
-
-  * ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT indicates that if
-    descriptors in this binding are updated between when the descriptor set
-    is bound in a command buffer and when that command buffer is submitted
-    to a queue, then the submission will use the most recently set
-    descriptors for this binding and the updates do not invalidate the
-    command buffer.
-    Descriptor bindings created with this flag are also partially exempt
-    from the external synchronization requirement in
-ifdef::VK_KHR_descriptor_update_template[]
-    flink:vkUpdateDescriptorSetWithTemplateKHR and
-endif::VK_KHR_descriptor_update_template[]
-    flink:vkUpdateDescriptorSets.
-    Multiple descriptors with this flag set can: be updated concurrently in
-    different threads, though the same descriptor must: not be updated
-    concurrently by two threads.
-    Descriptors with this flag set can: be updated concurrently with the set
-    being bound to a command buffer in another thread, but not concurrently
-    with the set being reset or freed.
-  * ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT indicates that
-    descriptors in this binding that are not _dynamically used_ need not
-    contain valid descriptors at the time the descriptors are consumed.
-    A descriptor is dynamically used if any shader invocation executes an
-    instruction that performs any memory access using the descriptor.
-  * ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT indicates
-    that descriptors in this binding can: be updated after a command buffer
-    has bound this descriptor set, or while a command buffer that uses this
-    descriptor set is pending execution, as long as the descriptors that are
-    updated are not used by those command buffers.
-    If ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT is also set, then
-    descriptors can: be updated as long as they are not dynamically used by
-    any shader invocations.
-    If ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT is not set, then
-    descriptors can: be updated as long as they are not statically used by
-    any shader invocations.
-  * ename:VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT indicates that
-    this descriptor binding has a variable size that will be specified when
-    a descriptor set is allocated using this layout.
-    The value of pname:descriptorCount is treated as an upper bound on the
-    size of the binding.
-    This must: only be used for the last binding in the descriptor set
-    layout (i.e. the binding with the largest value of pname:binding).
-    For the purposes of counting against limits such as
-    pname:maxDescriptorSet* and pname:maxPerStageDescriptor*, the full value
-    of pname:descriptorCount is
-ifndef::VK_EXT_inline_uniform_block[counted.]
-ifdef::VK_EXT_inline_uniform_block[]
-    counted, except for descriptor bindings with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT where
-    pname:descriptorCount specifies the upper bound on the byte size of the
-    binding, thus it counts against the <<limits-maxInlineUniformBlockSize,
-    pname:maxInlineUniformBlockSize>> limit instead.
-endif::VK_EXT_inline_uniform_block[]
-
-[NOTE]
-.Note
-====
-Note that while ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT and
-ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT both involve
-updates to descriptor sets after they are bound,
-ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT is a weaker
-requirement since it is only about descriptors that are not used, whereas
-ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT requires the
-implementation to observe updates to descriptors that are used.
-====
---
-
-[open,refpage='VkDescriptorBindingFlags',desc='Bitmask of VkDescriptorBindingFlagBits',type='flags',alias='VkDescriptorBindingFlagsEXT']
---
-include::{generated}/api/flags/VkDescriptorBindingFlags.txt[]
-
-ifdef::VK_EXT_descriptor_indexing[]
-or the equivalent
-
-include::{generated}/api/flags/VkDescriptorBindingFlagsEXT.txt[]
-endif::VK_EXT_descriptor_indexing[]
-
-tname:VkDescriptorBindingFlags is a bitmask type for setting a mask of zero
-or more elink:VkDescriptorBindingFlagBits.
---
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance3[]
-[open,refpage='vkGetDescriptorSetLayoutSupport',desc='Query whether a descriptor set layout can be created',type='protos']
---
-To query information about whether a descriptor set layout can: be created,
-call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetDescriptorSetLayoutSupport.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_maintenance3[or the equivalent command]
-
-ifdef::VK_KHR_maintenance3[]
-include::{generated}/api/protos/vkGetDescriptorSetLayoutSupportKHR.txt[]
-endif::VK_KHR_maintenance3[]
-
-  * pname:device is the logical device that would create the descriptor set
-    layout.
-  * pname:pCreateInfo is a pointer to a
-    slink:VkDescriptorSetLayoutCreateInfo structure specifying the state of
-    the descriptor set layout object.
-  * pname:pSupport is a pointer to a slink:VkDescriptorSetLayoutSupport
-    structure, in which information about support for the descriptor set
-    layout object is returned.
-
-Some implementations have limitations on what fits in a descriptor set which
-are not easily expressible in terms of existing limits like
-pname:maxDescriptorSet*, for example if all descriptor types share a limited
-space in memory but each descriptor is a different size or alignment.
-This command returns information about whether a descriptor set satisfies
-this limit.
-If the descriptor set layout satisfies the
-slink:VkPhysicalDeviceMaintenance3Properties::pname:maxPerSetDescriptors
-limit, this command is guaranteed to return ename:VK_TRUE in
-slink:VkDescriptorSetLayoutSupport::pname:supported.
-If the descriptor set layout exceeds the
-slink:VkPhysicalDeviceMaintenance3Properties::pname:maxPerSetDescriptors
-limit, whether the descriptor set layout is supported is
-implementation-dependent and may: depend on whether the descriptor sizes and
-alignments cause the layout to exceed an internal limit.
-
-This command does not consider other limits such as
-pname:maxPerStageDescriptor*, and so a descriptor set layout that is
-supported according to this command must: still satisfy the pipeline layout
-limits such as pname:maxPerStageDescriptor* in order to be used in a
-pipeline layout.
-
-[NOTE]
-.Note
-====
-This is a sname:VkDevice query rather than sname:VkPhysicalDevice because
-the answer may: depend on enabled features.
-====
-
-include::{generated}/validity/protos/vkGetDescriptorSetLayoutSupport.txt[]
---
-
-[open,refpage='VkDescriptorSetLayoutSupport',desc='Structure returning information about whether a descriptor set layout can be supported',type='structs']
---
-Information about support for the descriptor set layout is returned in a
-sname:VkDescriptorSetLayoutSupport structure:
-
-include::{generated}/api/structs/VkDescriptorSetLayoutSupport.txt[]
-
-ifdef::VK_KHR_maintenance3[]
-or the equivalent
-
-include::{generated}/api/structs/VkDescriptorSetLayoutSupportKHR.txt[]
-endif::VK_KHR_maintenance3[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:supported specifies whether the descriptor set layout can: be
-    created.
-
-pname:supported is set to ename:VK_TRUE if the descriptor set can: be
-created, or else is set to ename:VK_FALSE.
-
-include::{generated}/validity/structs/VkDescriptorSetLayoutSupport.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_maintenance3[]
-
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-[open,refpage='VkDescriptorSetVariableDescriptorCountLayoutSupport',desc='Structure returning information about whether a descriptor set layout can be supported',type='structs',alias='VkDescriptorSetVariableDescriptorCountLayoutSupportEXT']
---
-If the pname:pNext chain of a slink:VkDescriptorSetLayoutSupport structure
-includes a sname:VkDescriptorSetVariableDescriptorCountLayoutSupport
-structure, then that structure returns additional information about whether
-the descriptor set layout is supported.
-
-include::{generated}/api/structs/VkDescriptorSetVariableDescriptorCountLayoutSupport.txt[]
-
-ifdef::VK_EXT_descriptor_indexing[]
-or the equivalent
-
-include::{generated}/api/structs/VkDescriptorSetVariableDescriptorCountLayoutSupportEXT.txt[]
-endif::VK_EXT_descriptor_indexing[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxVariableDescriptorCount indicates the maximum number of
-    descriptors supported in the highest numbered binding of the layout, if
-    that binding is variable-sized.
-ifdef::VK_EXT_inline_uniform_block[]
-    If the highest numbered binding of the layout has a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
-    pname:maxVariableDescriptorCount indicates the maximum byte size
-    supported for the binding, if that binding is variable-sized.
-endif::VK_EXT_inline_uniform_block[]
-
-If the slink:VkDescriptorSetLayoutCreateInfo structure specified in
-flink:vkGetDescriptorSetLayoutSupport::pname:pCreateInfo includes a
-variable-sized descriptor, then pname:supported is determined assuming the
-requested size of the variable-sized descriptor, and
-pname:maxVariableDescriptorCount is set to the maximum size of that
-descriptor that can: be successfully created (which is greater than or equal
-to the requested size passed in).
-If the slink:VkDescriptorSetLayoutCreateInfo structure does not include a
-variable-sized descriptor, or if the
-slink:VkPhysicalDeviceDescriptorIndexingFeatures::pname:descriptorBindingVariableDescriptorCount
-feature is not enabled, then pname:maxVariableDescriptorCount is set to
-zero.
-For the purposes of this command, a variable-sized descriptor binding with a
-pname:descriptorCount of zero is treated as if the pname:descriptorCount is
-one, and thus the binding is not ignored and the maximum descriptor count
-will be returned.
-If the layout is not supported, then the value written to
-pname:maxVariableDescriptorCount is undefined:.
-
-include::{generated}/validity/structs/VkDescriptorSetVariableDescriptorCountLayoutSupport.txt[]
---
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-
-The following examples show a shader snippet using two descriptor sets, and
-application code that creates corresponding descriptor set layouts.
-
-.GLSL example
-[source,glsl]
----------------------------------------------------
-//
-// binding to a single sampled image descriptor in set 0
-//
-layout (set=0, binding=0) uniform texture2D mySampledImage;
-
-//
-// binding to an array of sampled image descriptors in set 0
-//
-layout (set=0, binding=1) uniform texture2D myArrayOfSampledImages[12];
-
-//
-// binding to a single uniform buffer descriptor in set 1
-//
-layout (set=1, binding=0) uniform myUniformBuffer
-{
-    vec4 myElement[32];
-};
----------------------------------------------------
-
-.SPIR-V example
-[source,spirv]
----------------------------------------------------
-               ...
-          %1 = OpExtInstImport "GLSL.std.450"
-               ...
-               OpName %9 "mySampledImage"
-               OpName %14 "myArrayOfSampledImages"
-               OpName %18 "myUniformBuffer"
-               OpMemberName %18 0 "myElement"
-               OpName %20 ""
-               OpDecorate %9 DescriptorSet 0
-               OpDecorate %9 Binding 0
-               OpDecorate %14 DescriptorSet 0
-               OpDecorate %14 Binding 1
-               OpDecorate %17 ArrayStride 16
-               OpMemberDecorate %18 0 Offset 0
-               OpDecorate %18 Block
-               OpDecorate %20 DescriptorSet 1
-               OpDecorate %20 Binding 0
-          %2 = OpTypeVoid
-          %3 = OpTypeFunction %2
-          %6 = OpTypeFloat 32
-          %7 = OpTypeImage %6 2D 0 0 0 1 Unknown
-          %8 = OpTypePointer UniformConstant %7
-          %9 = OpVariable %8 UniformConstant
-         %10 = OpTypeInt 32 0
-         %11 = OpConstant %10 12
-         %12 = OpTypeArray %7 %11
-         %13 = OpTypePointer UniformConstant %12
-         %14 = OpVariable %13 UniformConstant
-         %15 = OpTypeVector %6 4
-         %16 = OpConstant %10 32
-         %17 = OpTypeArray %15 %16
-         %18 = OpTypeStruct %17
-         %19 = OpTypePointer Uniform %18
-         %20 = OpVariable %19 Uniform
-               ...
----------------------------------------------------
-
-.API example
-[source,c++]
----------------------------------------------------
-VkResult myResult;
-
-const VkDescriptorSetLayoutBinding myDescriptorSetLayoutBinding[] =
-{
-    // binding to a single image descriptor
-    {
-        0,                                      // binding
-        VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,       // descriptorType
-        1,                                      // descriptorCount
-        VK_SHADER_STAGE_FRAGMENT_BIT,           // stageFlags
-        NULL                                    // pImmutableSamplers
-    },
-
-    // binding to an array of image descriptors
-    {
-        1,                                      // binding
-        VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,       // descriptorType
-        12,                                     // descriptorCount
-        VK_SHADER_STAGE_FRAGMENT_BIT,           // stageFlags
-        NULL                                    // pImmutableSamplers
-    },
-
-    // binding to a single uniform buffer descriptor
-    {
-        0,                                      // binding
-        VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,      // descriptorType
-        1,                                      // descriptorCount
-        VK_SHADER_STAGE_FRAGMENT_BIT,           // stageFlags
-        NULL                                    // pImmutableSamplers
-    }
-};
-
-const VkDescriptorSetLayoutCreateInfo myDescriptorSetLayoutCreateInfo[] =
-{
-    // Information for first descriptor set with two descriptor bindings
-    {
-        VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,    // sType
-        NULL,                                                   // pNext
-        0,                                                      // flags
-        2,                                                      // bindingCount
-        &myDescriptorSetLayoutBinding[0]                        // pBindings
-    },
-
-    // Information for second descriptor set with one descriptor binding
-    {
-        VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,    // sType
-        NULL,                                                   // pNext
-        0,                                                      // flags
-        1,                                                      // bindingCount
-        &myDescriptorSetLayoutBinding[2]                        // pBindings
-    }
-};
-
-VkDescriptorSetLayout myDescriptorSetLayout[2];
-
-//
-// Create first descriptor set layout
-//
-myResult = vkCreateDescriptorSetLayout(
-    myDevice,
-    &myDescriptorSetLayoutCreateInfo[0],
-    NULL,
-    &myDescriptorSetLayout[0]);
-
-//
-// Create second descriptor set layout
-//
-myResult = vkCreateDescriptorSetLayout(
-    myDevice,
-    &myDescriptorSetLayoutCreateInfo[1],
-    NULL,
-    &myDescriptorSetLayout[1]);
----------------------------------------------------
-
-[open,refpage='vkDestroyDescriptorSetLayout',desc='Destroy a descriptor set layout object',type='protos']
---
-To destroy a descriptor set layout, call:
-
-include::{generated}/api/protos/vkDestroyDescriptorSetLayout.txt[]
-
-  * pname:device is the logical device that destroys the descriptor set
-    layout.
-  * pname:descriptorSetLayout is the descriptor set layout to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00284]]
-    If sname:VkAllocationCallbacks were provided when
-    pname:descriptorSetLayout was created, a compatible set of callbacks
-    must: be provided here
-  * [[VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00285]]
-    If no sname:VkAllocationCallbacks were provided when
-    pname:descriptorSetLayout was created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyDescriptorSetLayout.txt[]
---
-
-
-[[descriptorsets-pipelinelayout]]
-=== Pipeline Layouts
-
-[open,refpage='VkPipelineLayout',desc='Opaque handle to a pipeline layout object',type='handles']
---
-Access to descriptor sets from a pipeline is accomplished through a
-_pipeline layout_.
-Zero or more descriptor set layouts and zero or more push constant ranges
-are combined to form a pipeline layout object describing the complete set of
-resources that can: be accessed by a pipeline.
-The pipeline layout represents a sequence of descriptor sets with each
-having a specific layout.
-This sequence of layouts is used to determine the interface between shader
-stages and shader resources.
-Each pipeline is created using a pipeline layout.
-
-Pipeline layout objects are represented by sname:VkPipelineLayout handles:
-
-include::{generated}/api/handles/VkPipelineLayout.txt[]
---
-
-[open,refpage='vkCreatePipelineLayout',desc='Creates a new pipeline layout object',type='protos']
---
-To create a pipeline layout, call:
-
-include::{generated}/api/protos/vkCreatePipelineLayout.txt[]
-
-  * pname:device is the logical device that creates the pipeline layout.
-  * pname:pCreateInfo is a pointer to a slink:VkPipelineLayoutCreateInfo
-    structure specifying the state of the pipeline layout object.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pPipelineLayout is a pointer to a slink:VkPipelineLayout handle in
-    which the resulting pipeline layout object is returned.
-
-include::{generated}/validity/protos/vkCreatePipelineLayout.txt[]
---
-
-[open,refpage='VkPipelineLayoutCreateInfo',desc='Structure specifying the parameters of a newly created pipeline layout object',type='structs']
---
-The slink:VkPipelineLayoutCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkPipelineLayoutCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:setLayoutCount is the number of descriptor sets included in the
-    pipeline layout.
-  * pname:pSetLayouts is a pointer to an array of
-    sname:VkDescriptorSetLayout objects.
-  * pname:pushConstantRangeCount is the number of push constant ranges
-    included in the pipeline layout.
-  * pname:pPushConstantRanges is a pointer to an array of
-    sname:VkPushConstantRange structures defining a set of push constant
-    ranges for use in a single pipeline layout.
-    In addition to descriptor set layouts, a pipeline layout also describes
-    how many push constants can: be accessed by each stage of the pipeline.
-+
-[NOTE]
-.Note
-====
-Push constants represent a high speed path to modify constant data in
-pipelines that is expected to outperform memory-backed resource updates.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineLayoutCreateInfo-setLayoutCount-00286]]
-    pname:setLayoutCount must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxBoundDescriptorSets
-ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00287]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_SAMPLER and
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible to any shader
-    stage across all elements of pname:pSetLayouts must: be less than or
-    equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorSamplers
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00288]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER and
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible to any shader
-    stage across all elements of pname:pSetLayouts must: be less than or
-    equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorUniformBuffers
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00289]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER and
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible to any shader
-    stage across all elements of pname:pSetLayouts must: be less than or
-    equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorStorageBuffers
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00290]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible to any shader
-    stage across all elements of pname:pSetLayouts must: be less than or
-    equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorSampledImages
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00291]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible to any shader
-    stage across all elements of pname:pSetLayouts must: be less than or
-    equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorStorageImages
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01676]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible to any given shader
-    stage across all elements of pname:pSetLayouts must: be less than or
-    equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorInputAttachments
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02212]]
-    The total number of bindings with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any
-    given shader stage across all elements of pname:pSetLayouts must: be
-    less than or equal to
-    sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxPerStageDescriptorInlineUniformBlocks
-endif::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01677]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_SAMPLER and
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetSamplers
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01678]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader
-    stages and across all elements of pname:pSetLayouts must: be less than
-    or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetUniformBuffers
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01679]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetUniformBuffersDynamic
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01680]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER accessible across all shader
-    stages and across all elements of pname:pSetLayouts must: be less than
-    or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetStorageBuffers
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01681]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetStorageBuffersDynamic
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01682]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetSampledImages
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01683]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetStorageImages
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01684]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible across all shader
-    stages and across all elements of pname:pSetLayouts must: be less than
-    or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetInputAttachments
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02213]]
-    The total number of bindings with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxDescriptorSetInlineUniformBlocks
-endif::VK_EXT_inline_uniform_block[]
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03016]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_SAMPLER and
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible to any given
-    shader stage across all elements of pname:pSetLayouts must: be less than
-    or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorSamplers
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03017]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
-    and ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible to any
-    given shader stage across all elements of pname:pSetLayouts must: be
-    less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorUniformBuffers
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03018]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER
-    and ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible to any
-    given shader stage across all elements of pname:pSetLayouts must: be
-    less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorStorageBuffers
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03019]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible to any given
-    shader stage across all elements of pname:pSetLayouts must: be less than
-    or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorSampledImages
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03020]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
-    and ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible to any
-    given shader stage across all elements of pname:pSetLayouts must: be
-    less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorStorageImages
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03021]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
-    accessible to any given shader stage across all elements of
-    pname:pSetLayouts must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageDescriptorInputAttachments
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02214]]
-    The total number of bindings in descriptor set layouts created without
-    the ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any
-    given shader stage across all elements of pname:pSetLayouts must: be
-    less than or equal to
-    sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxPerStageDescriptorInlineUniformBlocks
-endif::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03022]]
-    The total number of descriptors with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_SAMPLER and
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible to any given
-    shader stage across all elements of pname:pSetLayouts must: be less than
-    or equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxPerStageDescriptorUpdateAfterBindSamplers
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03023]]
-    The total number of descriptors with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER and
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible to any given
-    shader stage across all elements of pname:pSetLayouts must: be less than
-    or equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxPerStageDescriptorUpdateAfterBindUniformBuffers
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03024]]
-    The total number of descriptors with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER and
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible to any given
-    shader stage across all elements of pname:pSetLayouts must: be less than
-    or equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxPerStageDescriptorUpdateAfterBindStorageBuffers
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03025]]
-    The total number of descriptors with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible to any given
-    shader stage across all elements of pname:pSetLayouts must: be less than
-    or equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxPerStageDescriptorUpdateAfterBindSampledImages
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03026]]
-    The total number of descriptors with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible to any given
-    shader stage across all elements of pname:pSetLayouts must: be less than
-    or equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxPerStageDescriptorUpdateAfterBindStorageImages
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03027]]
-    The total number of descriptors with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible to any given shader
-    stage across all elements of pname:pSetLayouts must: be less than or
-    equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxPerStageDescriptorUpdateAfterBindInputAttachments
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02215]]
-    The total number of bindings with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any
-    given shader stage across all elements of pname:pSetLayouts must: be
-    less than or equal to
-    sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks
-endif::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03028]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_SAMPLER and
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetSamplers
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03029]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
-    accessible across all shader stages and across all elements of
-    pname:pSetLayouts must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetUniformBuffers
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03030]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetUniformBuffersDynamic
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03031]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER
-    accessible across all shader stages and across all elements of
-    pname:pSetLayouts must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetStorageBuffers
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03032]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetStorageBuffersDynamic
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03033]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetSampledImages
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03034]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
-    and ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetStorageImages
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03035]]
-    The total number of descriptors in descriptor set layouts created
-    without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    with a pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
-    accessible across all shader stages and across all elements of
-    pname:pSetLayouts must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxDescriptorSetInputAttachments
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02216]]
-    The total number of bindings in descriptor set layouts created without
-    the ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxDescriptorSetInlineUniformBlocks
-endif::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03036]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_SAMPLER and
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindSamplers
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03037]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader
-    stages and across all elements of pname:pSetLayouts must: be less than
-    or equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindUniformBuffers
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03038]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindUniformBuffersDynamic
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03039]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER accessible across all shader
-    stages and across all elements of pname:pSetLayouts must: be less than
-    or equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindStorageBuffers
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03040]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindStorageBuffersDynamic
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03041]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindSampledImages
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03042]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindStorageImages
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03043]]
-    The total number of descriptors of the type
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible across all shader
-    stages and across all elements of pname:pSetLayouts must: be less than
-    or equal to
-    sname:VkPhysicalDeviceDescriptorIndexingProperties::pname:maxDescriptorSetUpdateAfterBindInputAttachments
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02217]]
-    The total number of bindings with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT::pname:maxDescriptorSetUpdateAfterBindInlineUniformBlocks
-endif::VK_EXT_inline_uniform_block[]
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * [[VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-00292]]
-    Any two elements of pname:pPushConstantRanges must: not include the same
-    stage in pname:stageFlags
-ifdef::VK_KHR_push_descriptor[]
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00293]]
-    pname:pSetLayouts must: not contain more than one descriptor set layout
-    that was created with
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR set
-endif::VK_KHR_push_descriptor[]
-ifdef::VK_KHR_acceleration_structure[]
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03571]]
-    The total number of bindings in descriptor set layouts created without
-    the ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR accessible to any
-    given shader stage across all elements of pname:pSetLayouts must: be
-    less than or equal to
-    slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:maxPerStageDescriptorAccelerationStructures
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03572]]
-    The total number of bindings with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR accessible to any
-    given shader stage across all elements of pname:pSetLayouts must: be
-    less than or equal to
-    slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:maxPerStageDescriptorUpdateAfterBindAccelerationStructures
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03573]]
-    The total number of bindings in descriptor set layouts created without
-    the ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR accessible across
-    all shader stages and across all elements of pname:pSetLayouts must: be
-    less than or equal to
-    slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:maxDescriptorSetAccelerationStructures
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-03574]]
-    The total number of bindings with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR accessible across
-    all shader stages and across all elements of pname:pSetLayouts must: be
-    less than or equal to
-    slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:maxDescriptorSetUpdateAfterBindAccelerationStructures
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_NV_ray_tracing[]
-  * [[VUID-VkPipelineLayoutCreateInfo-descriptorType-02381]]
-    The total number of bindings with a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV accessible across all
-    shader stages and across all elements of pname:pSetLayouts must: be less
-    than or equal to
-    slink:VkPhysicalDeviceRayTracingPropertiesNV::pname:maxDescriptorSetAccelerationStructures
-endif::VK_NV_ray_tracing[]
-ifdef::VK_EXT_fragment_density_map2[]
-  * [[VUID-VkPipelineLayoutCreateInfo-pImmutableSamplers-03566]]
-    The total number of pname:pImmutableSamplers created with pname:flags
-    containing ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT or
-    ename:VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT across
-    all shader stages and across all elements of pname:pSetLayouts must: be
-    less than or equal to
-    <<limits-maxDescriptorSetSubsampledSamplers,sname:VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::pname:maxDescriptorSetSubsampledSamplers>>
-endif::VK_EXT_fragment_density_map2[]
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkPipelineLayoutCreateInfo-pSetLayouts-04606]]
-    Any element of pname:pSetLayouts must: not have been created with the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE bit set
-endif::VK_VALVE_mutable_descriptor_type[]
-****
-
-include::{generated}/validity/structs/VkPipelineLayoutCreateInfo.txt[]
---
-
-[open,refpage='VkPipelineLayoutCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineLayoutCreateFlags.txt[]
-
-tname:VkPipelineLayoutCreateFlags is a bitmask type for setting a mask, but
-is currently reserved for future use.
---
-
-[open,refpage='VkPushConstantRange',desc='Structure specifying a push constant range',type='structs']
---
-The sname:VkPushConstantRange structure is defined as:
-
-include::{generated}/api/structs/VkPushConstantRange.txt[]
-
-  * pname:stageFlags is a set of stage flags describing the shader stages
-    that will access a range of push constants.
-    If a particular stage is not included in the range, then accessing
-    members of that range of push constants from the corresponding shader
-    stage will return undefined: values.
-  * pname:offset and pname:size are the start offset and size, respectively,
-    consumed by the range.
-    Both pname:offset and pname:size are in units of bytes and must: be a
-    multiple of 4.
-    The layout of the push constant variables is specified in the shader.
-
-.Valid Usage
-****
-  * [[VUID-VkPushConstantRange-offset-00294]]
-    pname:offset must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxPushConstantsSize
-  * [[VUID-VkPushConstantRange-offset-00295]]
-    pname:offset must: be a multiple of `4`
-  * [[VUID-VkPushConstantRange-size-00296]]
-    pname:size must: be greater than `0`
-  * [[VUID-VkPushConstantRange-size-00297]]
-    pname:size must: be a multiple of `4`
-  * [[VUID-VkPushConstantRange-size-00298]]
-    pname:size must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPushConstantsSize minus
-    pname:offset
-****
-
-include::{generated}/validity/structs/VkPushConstantRange.txt[]
---
-
-Once created, pipeline layouts are used as part of pipeline creation (see
-<<pipelines, Pipelines>>), as part of binding descriptor sets (see
-<<descriptorsets-binding, Descriptor Set Binding>>), and as part of setting
-push constants (see <<descriptorsets-push-constants, Push Constant
-Updates>>).
-Pipeline creation accepts a pipeline layout as input, and the layout may: be
-used to map (set, binding, arrayElement) tuples to implementation resources
-or memory locations within a descriptor set.
-The assignment of implementation resources depends only on the bindings
-defined in the descriptor sets that comprise the pipeline layout, and not on
-any shader source.
-
-[[descriptorsets-pipelinelayout-consistency]]
-All resource variables <<shaders-staticuse,statically used>> in all shaders
-in a pipeline must: be declared with a (set,binding,arrayElement) that
-exists in the corresponding descriptor set layout and is of an appropriate
-descriptor type and includes the set of shader stages it is used by in
-pname:stageFlags.
-The pipeline layout can: include entries that are not used by a particular
-pipeline, or that are dead-code eliminated from any of the shaders.
-The pipeline layout allows the application to provide a consistent set of
-bindings across multiple pipeline compiles, which enables those pipelines to
-be compiled in a way that the implementation may: cheaply switch pipelines
-without reprogramming the bindings.
-
-Similarly, the push constant block declared in each shader (if present)
-must: only place variables at offsets that are each included in a push
-constant range with pname:stageFlags including the bit corresponding to the
-shader stage that uses it.
-The pipeline layout can: include ranges or portions of ranges that are not
-used by a particular pipeline, or for which the variables have been
-dead-code eliminated from any of the shaders.
-
-There is a limit on the total number of resources of each type that can: be
-included in bindings in all descriptor set layouts in a pipeline layout as
-shown in <<descriptorsets-pipelinelayout-limits,Pipeline Layout Resource
-Limits>>.
-The "`Total Resources Available`" column gives the limit on the number of
-each type of resource that can: be included in bindings in all descriptor
-sets in the pipeline layout.
-Some resource types count against multiple limits.
-Additionally, there are limits on the total number of each type of resource
-that can: be used in any pipeline stage as described in
-<<interfaces-resources-limits,Shader Resource Limits>>.
-
-[[descriptorsets-pipelinelayout-limits]]
-.Pipeline Layout Resource Limits
-[width="80%",cols="<37,<22",options="header"]
-|====
-| Total Resources Available | Resource Types
-.2+<.^| pname:maxDescriptorSetSamplers
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxDescriptorSetUpdateAfterBindSamplers
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | sampler           | combined image sampler
-.3+<.^| pname:maxDescriptorSetSampledImages
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxDescriptorSetUpdateAfterBindSampledImages
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | sampled image     | combined image sampler | uniform texel buffer
-.2+<.^| pname:maxDescriptorSetStorageImages
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxDescriptorSetUpdateAfterBindStorageImages
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | storage image     | storage texel buffer
-.2+<.^| pname:maxDescriptorSetUniformBuffers
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxDescriptorSetUpdateAfterBindUniformBuffers
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | uniform buffer    | uniform buffer dynamic
-| pname:maxDescriptorSetUniformBuffersDynamic
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxDescriptorSetUpdateAfterBindUniformBuffersDynamic
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | uniform buffer dynamic
-.2+<.^| pname:maxDescriptorSetStorageBuffers
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxDescriptorSetUpdateAfterBindStorageBuffers
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | storage buffer    | storage buffer dynamic
-| pname:maxDescriptorSetStorageBuffersDynamic
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxDescriptorSetUpdateAfterBindStorageBuffersDynamic
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | storage buffer dynamic
-| pname:maxDescriptorSetInputAttachments
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxDescriptorSetUpdateAfterBindInputAttachments
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | input attachment
-ifdef::VK_EXT_inline_uniform_block[]
-| pname:maxDescriptorSetInlineUniformBlocks
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxDescriptorSetUpdateAfterBindInlineUniformBlocks
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | inline uniform block
-endif::VK_EXT_inline_uniform_block[]
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-| pname:maxDescriptorSetAccelerationStructures
-ifdef::VK_KHR_acceleration_structure[]
-or pname:maxDescriptorSetUpdateAfterBindAccelerationStructures
-endif::VK_KHR_acceleration_structure[]
-            | acceleration structure
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-|====
-
-
-[open,refpage='vkDestroyPipelineLayout',desc='Destroy a pipeline layout object',type='protos']
---
-To destroy a pipeline layout, call:
-
-include::{generated}/api/protos/vkDestroyPipelineLayout.txt[]
-
-  * pname:device is the logical device that destroys the pipeline layout.
-  * pname:pipelineLayout is the pipeline layout to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyPipelineLayout-pipelineLayout-00299]]
-    If sname:VkAllocationCallbacks were provided when pname:pipelineLayout
-    was created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyPipelineLayout-pipelineLayout-00300]]
-    If no sname:VkAllocationCallbacks were provided when
-    pname:pipelineLayout was created, pname:pAllocator must: be `NULL`
-  * [[VUID-vkDestroyPipelineLayout-pipelineLayout-02004]]
-    pname:pipelineLayout must: not have been passed to any ftext:vkCmd*
-    command for any command buffers that are still in the
-    <<commandbuffers-lifecycle, recording state>> when
-    fname:vkDestroyPipelineLayout is called
-****
-
-include::{generated}/validity/protos/vkDestroyPipelineLayout.txt[]
---
-
-
-[[descriptorsets-compatibility]]
-==== Pipeline Layout Compatibility
-
-Two pipeline layouts are defined to be "`compatible for
-<<descriptorsets-push-constants, push constants>>`" if they were created
-with identical push constant ranges.
-Two pipeline layouts are defined to be "`compatible for set N`" if they were
-created with _identically defined_ descriptor set layouts for sets zero
-through N, and if they were created with identical push constant ranges.
-
-When binding a descriptor set (see <<descriptorsets-binding, Descriptor Set
-Binding>>) to set number N, if the previously bound descriptor sets for sets
-zero through N-1 were all bound using compatible pipeline layouts, then
-performing this binding does not disturb any of the lower numbered sets.
-If, additionally, the previously bound descriptor set for set N was bound
-using a pipeline layout compatible for set N, then the bindings in sets
-numbered greater than N are also not disturbed.
-
-Similarly, when binding a pipeline, the pipeline can: correctly access any
-previously bound descriptor sets which were bound with compatible pipeline
-layouts, as long as all lower numbered sets were also bound with compatible
-layouts.
-
-Layout compatibility means that descriptor sets can: be bound to a command
-buffer for use by any pipeline created with a compatible pipeline layout,
-and without having bound a particular pipeline first.
-It also means that descriptor sets can: remain valid across a pipeline
-change, and the same resources will be accessible to the newly bound
-pipeline.
-
-ifdef::implementation-guide[]
-.Implementor's Note
-****
-A consequence of layout compatibility is that when the implementation
-compiles a pipeline layout and maps pipeline resources to implementation
-resources, the mechanism for set N should: only be a function of sets
-[0..N].
-****
-endif::implementation-guide[]
-
-
-[NOTE]
-.Note
-====
-Place the least frequently changing descriptor sets near the start of the
-pipeline layout, and place the descriptor sets representing the most
-frequently changing resources near the end.
-When pipelines are switched, only the descriptor set bindings that have been
-invalidated will need to be updated and the remainder of the descriptor set
-bindings will remain in place.
-====
-
-The maximum number of descriptor sets that can: be bound to a pipeline
-layout is queried from physical device properties (see
-pname:maxBoundDescriptorSets in <<limits, Limits>>).
-
-.API example
-[source,c++]
----------------------------------------------------
-const VkDescriptorSetLayout layouts[] = { layout1, layout2 };
-
-const VkPushConstantRange ranges[] =
-{
-    {
-        VK_SHADER_STAGE_VERTEX_BIT,    // stageFlags
-        0,                             // offset
-        4                              // size
-    },
-
-    {
-        VK_SHADER_STAGE_FRAGMENT_BIT,  // stageFlags
-        4,                             // offset
-        4                              // size
-    },
-};
-
-const VkPipelineLayoutCreateInfo createInfo =
-{
-    VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,  // sType
-    NULL,                                           // pNext
-    0,                                              // flags
-    2,                                              // setLayoutCount
-    layouts,                                        // pSetLayouts
-    2,                                              // pushConstantRangeCount
-    ranges                                          // pPushConstantRanges
-};
-
-VkPipelineLayout myPipelineLayout;
-myResult = vkCreatePipelineLayout(
-    myDevice,
-    &createInfo,
-    NULL,
-    &myPipelineLayout);
----------------------------------------------------
-
-
-[[descriptorsets-allocation]]
-=== Allocation of Descriptor Sets
-
-[open,refpage='VkDescriptorPool',desc='Opaque handle to a descriptor pool object',type='handles']
---
-A _descriptor pool_ maintains a pool of descriptors, from which descriptor
-sets are allocated.
-Descriptor pools are externally synchronized, meaning that the application
-must: not allocate and/or free descriptor sets from the same pool in
-multiple threads simultaneously.
-
-Descriptor pools are represented by sname:VkDescriptorPool handles:
-
-include::{generated}/api/handles/VkDescriptorPool.txt[]
-
---
-
-[open,refpage='vkCreateDescriptorPool',desc='Creates a descriptor pool object',type='protos']
---
-To create a descriptor pool object, call:
-
-include::{generated}/api/protos/vkCreateDescriptorPool.txt[]
-
-  * pname:device is the logical device that creates the descriptor pool.
-  * pname:pCreateInfo is a pointer to a slink:VkDescriptorPoolCreateInfo
-    structure specifying the state of the descriptor pool object.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pDescriptorPool is a pointer to a slink:VkDescriptorPool handle in
-    which the resulting descriptor pool object is returned.
-
-The created descriptor pool is returned in pname:pDescriptorPool.
-
-include::{generated}/validity/protos/vkCreateDescriptorPool.txt[]
---
-
-[open,refpage='VkDescriptorPoolCreateInfo',desc='Structure specifying parameters of a newly created descriptor pool',type='structs']
---
-Additional information about the pool is passed in a
-sname:VkDescriptorPoolCreateInfo structure:
-
-include::{generated}/api/structs/VkDescriptorPoolCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkDescriptorPoolCreateFlagBits
-    specifying certain supported operations on the pool.
-  * pname:maxSets is the maximum number of descriptor sets that can: be
-    allocated from the pool.
-  * pname:poolSizeCount is the number of elements in pname:pPoolSizes.
-  * pname:pPoolSizes is a pointer to an array of slink:VkDescriptorPoolSize
-    structures, each containing a descriptor type and number of descriptors
-    of that type to be allocated in the pool.
-
-If multiple sname:VkDescriptorPoolSize structures containing the same
-descriptor type appear in the pname:pPoolSizes array then the pool will be
-created with enough storage for the total number of descriptors of each
-type.
-
-Fragmentation of a descriptor pool is possible and may: lead to descriptor
-set allocation failures.
-A failure due to fragmentation is defined as failing a descriptor set
-allocation despite the sum of all outstanding descriptor set allocations
-from the pool plus the requested allocation requiring no more than the total
-number of descriptors requested at pool creation.
-Implementations provide certain guarantees of when fragmentation must: not
-cause allocation failure, as described below.
-
-If a descriptor pool has not had any descriptor sets freed since it was
-created or most recently reset then fragmentation must: not cause an
-allocation failure (note that this is always the case for a pool created
-without the ename:VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT bit
-set).
-Additionally, if all sets allocated from the pool since it was created or
-most recently reset use the same number of descriptors (of each type) and
-the requested allocation also uses that same number of descriptors (of each
-type), then fragmentation must: not cause an allocation failure.
-
-If an allocation failure occurs due to fragmentation, an application can:
-create an additional descriptor pool to perform further descriptor set
-allocations.
-
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-If pname:flags has the ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT
-bit set, descriptor pool creation may: fail with the error
-ename:VK_ERROR_FRAGMENTATION if the total number of descriptors across all
-pools (including this one) created with this bit set exceeds
-pname:maxUpdateAfterBindDescriptorsInAllPools, or if fragmentation of the
-underlying hardware resources occurs.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-
-ifdef::VK_VALVE_mutable_descriptor_type[]
-If a pname:pPoolSizes[i]::pname:type is
-ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, a
-slink:VkMutableDescriptorTypeCreateInfoVALVE struct in the pname:pNext chain
-can: be used to specify which mutable descriptor types can: be allocated
-from the pool.
-If present in the pname:pNext chain,
-slink:VkMutableDescriptorTypeCreateInfoVALVE::pname:pMutableDescriptorTypeLists[i]
-specifies which kind of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE descriptors
-can: be allocated from this pool entry.
-If slink:VkMutableDescriptorTypeCreateInfoVALVE does not exist in the
-pname:pNext chain, or
-slink:VkMutableDescriptorTypeCreateInfoVALVE::pname:pMutableDescriptorTypeLists[i]
-is out of range, the descriptor pool allocates enough memory to be able to
-allocate a ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE descriptor with any
-supported elink:VkDescriptorType as a mutable descriptor.
-A mutable descriptor can: be allocated from a pool entry if the type list in
-slink:VkDescriptorSetLayoutCreateInfo is a subset of the type list declared
-in the descriptor pool, or if the pool entry is created without a descriptor
-type list.
-Multiple pname:pPoolSizes entries with
-ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE can: be declared.
-When multiple such pool entries are present in pname:pPoolSizes, they
-specify sets of supported descriptor types which either fully overlap,
-partially overlap, or are disjoint.
-Two sets fully overlap if the sets of supported descriptor types are equal.
-If the sets are not disjoint they partially overlap.
-A pool entry without a sname:VkMutableDescriptorTypeListVALVE assigned to it
-is considered to partially overlap any other pool entry which has a
-sname:VkMutableDescriptorTypeListVALVE assigned to it.
-The application must: ensure that partial overlap does not exist in
-pname:pPoolSizes.
-
-[NOTE]
-.Note
-====
-The requirement of no partial overlap is intended to resolve ambiguity for
-validation as there is no confusion which pname:pPoolSizes entries will be
-allocated from.
-An implementation is not expected to depend on this requirement.
-====
-endif::VK_VALVE_mutable_descriptor_type[]
-
-.Valid Usage
-****
-  * [[VUID-VkDescriptorPoolCreateInfo-maxSets-00301]]
-    pname:maxSets must: be greater than `0`
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkDescriptorPoolCreateInfo-flags-04607]]
-    If pname:flags has the
-    ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE bit set, then the
-    ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT bit must: not be
-    set
-endif::VK_VALVE_mutable_descriptor_type[]
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkDescriptorPoolCreateInfo-mutableDescriptorType-04608]]
-    If
-    slink:VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE::pname:mutableDescriptorType
-    is not enabled, pname:pPoolSizes must: not contain a
-    pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE
-  * [[VUID-VkDescriptorPoolCreateInfo-flags-04609]]
-    If pname:flags has the
-    ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE bit set,
-    slink:VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE::pname:mutableDescriptorType
-    must: be enabled
-  * [[VUID-VkDescriptorPoolCreateInfo-pPoolSizes-04787]]
-    If pname:pPoolSizes contains a pname:descriptorType of
-    ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, any other
-    ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE element in pname:pPoolSizes must:
-    not have sets of supported descriptor types which partially overlap
-endif::VK_VALVE_mutable_descriptor_type[]
-****
-
-include::{generated}/validity/structs/VkDescriptorPoolCreateInfo.txt[]
---
-
-ifdef::VK_EXT_inline_uniform_block[]
-[open,refpage='VkDescriptorPoolInlineUniformBlockCreateInfoEXT',desc='Structure specifying the maximum number of inline uniform block bindings of a newly created descriptor pool',type='structs']
---
-In order to be able to allocate descriptor sets having
-<<descriptorsets-inlineuniformblock, inline uniform block>> bindings the
-descriptor pool must: be created with specifying the inline uniform block
-binding capacity of the descriptor pool, in addition to the total inline
-uniform data capacity in bytes which is specified through a
-slink:VkDescriptorPoolSize structure with a pname:descriptorType value of
-ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT.
-This can: be done by adding a
-sname:VkDescriptorPoolInlineUniformBlockCreateInfoEXT structure to the
-pname:pNext chain of slink:VkDescriptorPoolCreateInfo.
-
-The sname:VkDescriptorPoolInlineUniformBlockCreateInfoEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkDescriptorPoolInlineUniformBlockCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxInlineUniformBlockBindings is the number of inline uniform
-    block bindings to allocate.
-
-include::{generated}/validity/structs/VkDescriptorPoolInlineUniformBlockCreateInfoEXT.txt[]
---
-endif::VK_EXT_inline_uniform_block[]
-
-[open,refpage='VkDescriptorPoolCreateFlagBits',desc='Bitmask specifying certain supported operations on a descriptor pool',type='enums']
---
-Bits which can: be set in slink:VkDescriptorPoolCreateInfo::pname:flags to
-enable operations on a descriptor pool are:
-
-include::{generated}/api/enums/VkDescriptorPoolCreateFlagBits.txt[]
-
-  * ename:VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT specifies that
-    descriptor sets can: return their individual allocations to the pool,
-    i.e. all of flink:vkAllocateDescriptorSets, flink:vkFreeDescriptorSets,
-    and flink:vkResetDescriptorPool are allowed.
-    Otherwise, descriptor sets allocated from the pool must: not be
-    individually freed back to the pool, i.e. only
-    flink:vkAllocateDescriptorSets and flink:vkResetDescriptorPool are
-    allowed.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT specifies that
-    descriptor sets allocated from this pool can: include bindings with the
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT bit set.
-    It is valid to allocate descriptor sets that have bindings that do not
-    set the ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT bit from a
-    pool that has ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT set.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE specifies that this
-    descriptor pool and the descriptor sets allocated from it reside
-    entirely in host memory and cannot be bound.
-    Descriptor sets allocated from this pool are partially exempt from the
-    external synchronization requirement in
-ifdef::VK_KHR_descriptor_update_template[]
-    flink:vkUpdateDescriptorSetWithTemplateKHR and
-endif::VK_KHR_descriptor_update_template[]
-    flink:vkUpdateDescriptorSets.
-    Descriptor sets and their descriptors can be updated concurrently in
-    different threads, though the same descriptor must: not be updated
-    concurrently by two threads.
-endif::VK_VALVE_mutable_descriptor_type[]
---
-
-[open,refpage='VkDescriptorPoolCreateFlags',desc='Bitmask of VkDescriptorPoolCreateFlagBits',type='flags']
---
-include::{generated}/api/flags/VkDescriptorPoolCreateFlags.txt[]
-
-tname:VkDescriptorPoolCreateFlags is a bitmask type for setting a mask of
-zero or more elink:VkDescriptorPoolCreateFlagBits.
---
-
-[open,refpage='VkDescriptorPoolSize',desc='Structure specifying descriptor pool size',type='structs']
---
-The sname:VkDescriptorPoolSize structure is defined as:
-
-include::{generated}/api/structs/VkDescriptorPoolSize.txt[]
-
-  * pname:type is the type of descriptor.
-  * pname:descriptorCount is the number of descriptors of that type to
-    allocate.
-ifdef::VK_EXT_inline_uniform_block[]
-    If pname:type is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
-    pname:descriptorCount is the number of bytes to allocate for descriptors
-    of this type.
-endif::VK_EXT_inline_uniform_block[]
-
-ifdef::VK_VULKAN_1_1,VK_KHR_sampler_ycbcr_conversion[]
-[NOTE]
-.Note
-====
-When creating a descriptor pool that will contain descriptors for combined
-image samplers of multi-planar formats, an application needs to account for
-non-trivial descriptor consumption when choosing the pname:descriptorCount
-value, as indicated by
-slink:VkSamplerYcbcrConversionImageFormatProperties::pname:combinedImageSamplerDescriptorCount.
-====
-endif::VK_VULKAN_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-.Valid Usage
-****
-  * [[VUID-VkDescriptorPoolSize-descriptorCount-00302]]
-    pname:descriptorCount must: be greater than `0`
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkDescriptorPoolSize-type-02218]]
-    If pname:type is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
-    pname:descriptorCount must: be a multiple of `4`
-endif::VK_EXT_inline_uniform_block[]
-****
-
-include::{generated}/validity/structs/VkDescriptorPoolSize.txt[]
---
-
-[open,refpage='vkDestroyDescriptorPool',desc='Destroy a descriptor pool object',type='protos']
---
-To destroy a descriptor pool, call:
-
-include::{generated}/api/protos/vkDestroyDescriptorPool.txt[]
-
-  * pname:device is the logical device that destroys the descriptor pool.
-  * pname:descriptorPool is the descriptor pool to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-When a pool is destroyed, all descriptor sets allocated from the pool are
-implicitly freed and become invalid.
-Descriptor sets allocated from a given pool do not need to be freed before
-destroying that descriptor pool.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyDescriptorPool-descriptorPool-00303]]
-    All submitted commands that refer to pname:descriptorPool (via any
-    allocated descriptor sets) must: have completed execution
-  * [[VUID-vkDestroyDescriptorPool-descriptorPool-00304]]
-    If sname:VkAllocationCallbacks were provided when pname:descriptorPool
-    was created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyDescriptorPool-descriptorPool-00305]]
-    If no sname:VkAllocationCallbacks were provided when
-    pname:descriptorPool was created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyDescriptorPool.txt[]
---
-
-[open,refpage='VkDescriptorSet',desc='Opaque handle to a descriptor set object',type='handles']
---
-Descriptor sets are allocated from descriptor pool objects, and are
-represented by sname:VkDescriptorSet handles:
-
-include::{generated}/api/handles/VkDescriptorSet.txt[]
---
-
-[open,refpage='vkAllocateDescriptorSets',desc='Allocate one or more descriptor sets',type='protos']
---
-To allocate descriptor sets from a descriptor pool, call:
-
-include::{generated}/api/protos/vkAllocateDescriptorSets.txt[]
-
-  * pname:device is the logical device that owns the descriptor pool.
-  * pname:pAllocateInfo is a pointer to a slink:VkDescriptorSetAllocateInfo
-    structure describing parameters of the allocation.
-  * pname:pDescriptorSets is a pointer to an array of slink:VkDescriptorSet
-    handles in which the resulting descriptor set objects are returned.
-
-The allocated descriptor sets are returned in pname:pDescriptorSets.
-
-When a descriptor set is allocated, the initial state is largely
-uninitialized and all descriptors are undefined:.
-Descriptors also become undefined: if the underlying resource is destroyed.
-Descriptor sets containing undefined: descriptors can: still be bound and
-used, subject to the following conditions:
-
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * For descriptor set bindings created with the
-    ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT bit set, all descriptors
-    in that binding that are dynamically used must: have been populated
-    before the descriptor set is <<descriptorsets-binding,consumed>>.
-  * For descriptor set bindings created without the
-    ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT bit set, all descriptors
-    in that binding that are statically used must: have been populated
-    before the descriptor set is <<descriptorsets-binding,consumed>>.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * Descriptors that are <<shaders-staticuse,statically used>> must: have
-    been populated before the descriptor set is
-    <<descriptorsets-binding,consumed>>.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_EXT_inline_uniform_block[]
-  * Descriptor bindings with descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT can: be undefined:
-    when the descriptor set is <<descriptorsets-binding,consumed>>; though
-    values in that block will be undefined:.
-endif::VK_EXT_inline_uniform_block[]
-  * Entries that are not used by a pipeline can: have undefined:
-    descriptors.
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-If a call to fname:vkAllocateDescriptorSets would cause the total number of
-descriptor sets allocated from the pool to exceed the value of
-slink:VkDescriptorPoolCreateInfo::pname:maxSets used to create
-pname:pAllocateInfo->descriptorPool, then the allocation may: fail due to
-lack of space in the descriptor pool.
-Similarly, the allocation may: fail due to lack of space if the call to
-fname:vkAllocateDescriptorSets would cause the number of any given
-descriptor type to exceed the sum of all the pname:descriptorCount members
-of each element of slink:VkDescriptorPoolCreateInfo::pname:pPoolSizes with a
-pname:type equal to that type.
-
-ifdef::VK_EXT_inline_uniform_block[]
-Additionally, the allocation may: also fail if a call to
-fname:vkAllocateDescriptorSets would cause the total number of inline
-uniform block bindings allocated from the pool to exceed the value of
-slink:VkDescriptorPoolInlineUniformBlockCreateInfoEXT::pname:maxInlineUniformBlockBindings
-used to create the descriptor pool.
-endif::VK_EXT_inline_uniform_block[]
-
-If the allocation fails due to no more space in the descriptor pool, and not
-because of system or device memory exhaustion, then
-ename:VK_ERROR_OUT_OF_POOL_MEMORY must: be returned.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-If an allocation fails due to fragmentation, an indeterminate error is
-returned with an unspecified error code.
-Any returned error other than
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ename:VK_ERROR_OUT_OF_POOL_MEMORY or
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ename:VK_ERROR_FRAGMENTED_POOL does not imply its usual meaning:
-applications should: assume that the allocation failed due to fragmentation,
-and create a new descriptor pool.
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-fname:vkAllocateDescriptorSets can: be used to create multiple descriptor
-sets.
-If the creation of any of those descriptor sets fails, then the
-implementation must: destroy all successfully created descriptor set objects
-from this command, set all entries of the pname:pDescriptorSets array to
-dlink:VK_NULL_HANDLE and return the error.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-[NOTE]
-.Note
-====
-Applications should: check for a negative return value when allocating new
-descriptor sets, assume that any error
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-other than ename:VK_ERROR_OUT_OF_POOL_MEMORY
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-effectively means ename:VK_ERROR_FRAGMENTED_POOL, and try to create a new
-descriptor pool.
-If ename:VK_ERROR_FRAGMENTED_POOL is the actual return value, it adds
-certainty to that decision.
-
-The reason for this is that ename:VK_ERROR_FRAGMENTED_POOL was only added in
-a later version of the 1.0 specification, and so drivers may: return other
-errors if they were written against earlier versions.
-To ensure full compatibility with earlier patch versions, these other errors
-are allowed.
-====
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-
-include::{generated}/validity/protos/vkAllocateDescriptorSets.txt[]
---
-
-[open,refpage='VkDescriptorSetAllocateInfo',desc='Structure specifying the allocation parameters for descriptor sets',type='structs']
---
-The sname:VkDescriptorSetAllocateInfo structure is defined as:
-
-include::{generated}/api/structs/VkDescriptorSetAllocateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:descriptorPool is the pool which the sets will be allocated from.
-  * pname:descriptorSetCount determines the number of descriptor sets to be
-    allocated from the pool.
-  * pname:pSetLayouts is a pointer to an array of descriptor set layouts,
-    with each member specifying how the corresponding descriptor set is
-    allocated.
-
-.Valid Usage
-****
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-00306]]
-    pname:descriptorSetCount must: not be greater than the number of sets
-    that are currently available for allocation in pname:descriptorPool
-  * [[VUID-VkDescriptorSetAllocateInfo-descriptorPool-00307]]
-    pname:descriptorPool must: have enough free descriptor capacity
-    remaining to allocate the descriptor sets of the specified layouts
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifdef::VK_KHR_push_descriptor[]
-  * [[VUID-VkDescriptorSetAllocateInfo-pSetLayouts-00308]]
-    Each element of pname:pSetLayouts must: not have been created with
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR set
-endif::VK_KHR_push_descriptor[]
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * [[VUID-VkDescriptorSetAllocateInfo-pSetLayouts-03044]]
-    If any element of pname:pSetLayouts was created with the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set, pname:descriptorPool must: have been created with the
-    ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkDescriptorSetAllocateInfo-pSetLayouts-04610]]
-    If any element of pname:pSetLayouts was created with the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE bit set,
-    pname:descriptorPool must: have been created with the
-    ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE flag set
-endif::VK_VALVE_mutable_descriptor_type[]
-****
-
-include::{generated}/validity/structs/VkDescriptorSetAllocateInfo.txt[]
---
-
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-[open,refpage='VkDescriptorSetVariableDescriptorCountAllocateInfo',desc='Structure specifying additional allocation parameters for descriptor sets',type='structs',alias='VkDescriptorSetVariableDescriptorCountAllocateInfoEXT']
---
-If the pname:pNext chain of a slink:VkDescriptorSetAllocateInfo structure
-includes a sname:VkDescriptorSetVariableDescriptorCountAllocateInfo
-structure, then that structure includes an array of descriptor counts for
-variable descriptor count bindings, one for each descriptor set being
-allocated.
-
-The sname:VkDescriptorSetVariableDescriptorCountAllocateInfo structure is
-defined as:
-
-include::{generated}/api/structs/VkDescriptorSetVariableDescriptorCountAllocateInfo.txt[]
-
-ifdef::VK_EXT_descriptor_indexing[]
-or the equivalent
-
-include::{generated}/api/structs/VkDescriptorSetVariableDescriptorCountAllocateInfoEXT.txt[]
-endif::VK_EXT_descriptor_indexing[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:descriptorSetCount is zero or the number of elements in
-    pname:pDescriptorCounts.
-  * pname:pDescriptorCounts is a pointer to an array of descriptor counts,
-    with each member specifying the number of descriptors in a variable
-    descriptor count binding in the corresponding descriptor set being
-    allocated.
-
-If pname:descriptorSetCount is zero or this structure is not included in the
-pname:pNext chain, then the variable lengths are considered to be zero.
-Otherwise, pname:pDescriptorCounts[i] is the number of descriptors in the
-variable count descriptor binding in the corresponding descriptor set
-layout.
-ifdef::VK_EXT_inline_uniform_block[]
-If the variable count descriptor binding in the corresponding descriptor set
-layout has a descriptor type of
-ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
-pname:pDescriptorCounts[i] specifies the binding's capacity in bytes.
-endif::VK_EXT_inline_uniform_block[]
-If slink:VkDescriptorSetAllocateInfo::pname:pSetLayouts[i] does not include
-a variable count descriptor binding, then pname:pDescriptorCounts[i] is
-ignored.
-
-.Valid Usage
-****
-  * [[VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-descriptorSetCount-03045]]
-    If pname:descriptorSetCount is not zero, pname:descriptorSetCount must:
-    equal slink:VkDescriptorSetAllocateInfo::pname:descriptorSetCount
-  * [[VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-pSetLayouts-03046]]
-    If slink:VkDescriptorSetAllocateInfo::pname:pSetLayouts[i] has a
-    variable descriptor count binding, then pname:pDescriptorCounts[i] must:
-    be less than or equal to the descriptor count specified for that binding
-    when the descriptor set layout was created
-****
-
-include::{generated}/validity/structs/VkDescriptorSetVariableDescriptorCountAllocateInfo.txt[]
---
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-
-[open,refpage='vkFreeDescriptorSets',desc='Free one or more descriptor sets',type='protos']
---
-To free allocated descriptor sets, call:
-
-include::{generated}/api/protos/vkFreeDescriptorSets.txt[]
-
-  * pname:device is the logical device that owns the descriptor pool.
-  * pname:descriptorPool is the descriptor pool from which the descriptor
-    sets were allocated.
-  * pname:descriptorSetCount is the number of elements in the
-    pname:pDescriptorSets array.
-  * pname:pDescriptorSets is a pointer to an array of handles to
-    slink:VkDescriptorSet objects.
-
-After calling fname:vkFreeDescriptorSets, all descriptor sets in
-pname:pDescriptorSets are invalid.
-
-.Valid Usage
-****
-  * [[VUID-vkFreeDescriptorSets-pDescriptorSets-00309]]
-    All submitted commands that refer to any element of
-    pname:pDescriptorSets must: have completed execution
-  * [[VUID-vkFreeDescriptorSets-pDescriptorSets-00310]]
-    pname:pDescriptorSets must: be a valid pointer to an array of
-    pname:descriptorSetCount sname:VkDescriptorSet handles, each element of
-    which must: either be a valid handle or dlink:VK_NULL_HANDLE
-  * [[VUID-vkFreeDescriptorSets-descriptorPool-00312]]
-    pname:descriptorPool must: have been created with the
-    ename:VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT flag
-****
-
-include::{generated}/validity/protos/vkFreeDescriptorSets.txt[]
---
-
-[open,refpage='vkResetDescriptorPool',desc='Resets a descriptor pool object',type='protos']
---
-To return all descriptor sets allocated from a given pool to the pool,
-rather than freeing individual descriptor sets, call:
-
-include::{generated}/api/protos/vkResetDescriptorPool.txt[]
-
-  * pname:device is the logical device that owns the descriptor pool.
-  * pname:descriptorPool is the descriptor pool to be reset.
-  * pname:flags is reserved for future use.
-
-Resetting a descriptor pool recycles all of the resources from all of the
-descriptor sets allocated from the descriptor pool back to the descriptor
-pool, and the descriptor sets are implicitly freed.
-
-.Valid Usage
-****
-  * [[VUID-vkResetDescriptorPool-descriptorPool-00313]]
-    All uses of pname:descriptorPool (via any allocated descriptor sets)
-    must: have completed execution
-****
-
-include::{generated}/validity/protos/vkResetDescriptorPool.txt[]
---
-
-[open,refpage='VkDescriptorPoolResetFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkDescriptorPoolResetFlags.txt[]
-
-tname:VkDescriptorPoolResetFlags is a bitmask type for setting a mask, but
-is currently reserved for future use.
---
-
-
-[[descriptorsets-updates]]
-=== Descriptor Set Updates
-
-[open,refpage='vkUpdateDescriptorSets',desc='Update the contents of a descriptor set object',type='protos']
---
-Once allocated, descriptor sets can: be updated with a combination of write
-and copy operations.
-To update descriptor sets, call:
-
-include::{generated}/api/protos/vkUpdateDescriptorSets.txt[]
-
-  * pname:device is the logical device that updates the descriptor sets.
-  * pname:descriptorWriteCount is the number of elements in the
-    pname:pDescriptorWrites array.
-  * pname:pDescriptorWrites is a pointer to an array of
-    slink:VkWriteDescriptorSet structures describing the descriptor sets to
-    write to.
-  * pname:descriptorCopyCount is the number of elements in the
-    pname:pDescriptorCopies array.
-  * pname:pDescriptorCopies is a pointer to an array of
-    slink:VkCopyDescriptorSet structures describing the descriptor sets to
-    copy between.
-
-The operations described by pname:pDescriptorWrites are performed first,
-followed by the operations described by pname:pDescriptorCopies.
-Within each array, the operations are performed in the order they appear in
-the array.
-
-Each element in the pname:pDescriptorWrites array describes an operation
-updating the descriptor set using descriptors for resources specified in the
-structure.
-
-Each element in the pname:pDescriptorCopies array is a
-slink:VkCopyDescriptorSet structure describing an operation copying
-descriptors between sets.
-
-If the pname:dstSet member of any element of pname:pDescriptorWrites or
-pname:pDescriptorCopies is bound, accessed, or modified by any command that
-was recorded to a command buffer which is currently in the
-<<commandbuffers-lifecycle, recording or executable state>>,
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-and any of the descriptor bindings that are updated were not created with
-the ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT or
-ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT bits set,
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-that command buffer becomes <<commandbuffers-lifecycle, invalid>>.
-
-.Valid Usage
-****
-  * [[VUID-vkUpdateDescriptorSets-pDescriptorWrites-06236]]
-    For each element [eq]#i# where
-    pname:pDescriptorWrites[i].pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, elements of the
-    pname:pTexelBufferView member of pname:pDescriptorWrites[i] must: have
-    been created on pname:device
-  * [[VUID-vkUpdateDescriptorSets-pDescriptorWrites-06237]]
-    For each element [eq]#i# where
-    pname:pDescriptorWrites[i].pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the pname:buffer member
-    of any element of the pname:pBufferInfo member of
-    pname:pDescriptorWrites[i] must: have been created on pname:device
-  * [[VUID-vkUpdateDescriptorSets-pDescriptorWrites-06238]]
-    For each element [eq]#i# where
-    pname:pDescriptorWrites[i].pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_SAMPLER or
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and pname:dstSet was
-    not allocated with a layout that included immutable samplers for
-    pname:dstBinding with pname:descriptorType, the pname:sampler member of
-    any element of the pname:pImageInfo member of pname:pDescriptorWrites[i]
-    must: have been created on pname:device
-  * [[VUID-vkUpdateDescriptorSets-pDescriptorWrites-06239]]
-    For each element [eq]#i# where
-    pname:pDescriptorWrites[i].pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, or
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER the pname:imageView
-    member of any element of pname:pDescriptorWrites[i] must: have been
-    created on pname:device
-ifdef::VK_KHR_acceleration_structure[]
-  * [[VUID-vkUpdateDescriptorSets-pDescriptorWrites-06240]]
-    For each element [eq]#i# where
-    pname:pDescriptorWrites[i].pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, elements of the
-    pname:pAccelerationStructures member of a
-    slink:VkWriteDescriptorSetAccelerationStructureKHR structure in the
-    pname:pNext chain of pname:pDescriptorWrites[i] must: have been created
-    on pname:device
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_NV_ray_tracing[]
-  * [[VUID-vkUpdateDescriptorSets-pDescriptorWrites-06241]]
-    For each element [eq]#i# where
-    pname:pDescriptorWrites[i].pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, elements of the
-    pname:pAccelerationStructures member of a
-    slink:VkWriteDescriptorSetAccelerationStructureNV structure in the
-    pname:pNext chain of pname:pDescriptorWrites[i] must: have been created
-    on pname:device
-endif::VK_NV_ray_tracing[]
-ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * [[VUID-vkUpdateDescriptorSets-dstSet-00314]]
-    The pname:dstSet member of each element of pname:pDescriptorWrites or
-    pname:pDescriptorCopies must: not be used by any command that was
-    recorded to a command buffer which is in the <<commandbuffers-lifecycle,
-    pending state>>
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * [[VUID-vkUpdateDescriptorSets-None-03047]]
-    Descriptor bindings updated by this command which were created without
-    the ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT or
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT bits set
-    must: not be used by any command that was recorded to a command buffer
-    which is in the <<commandbuffers-lifecycle,pending state>>
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-****
-
-include::{generated}/validity/protos/vkUpdateDescriptorSets.txt[]
---
-
-[open,refpage='VkWriteDescriptorSet',desc='Structure specifying the parameters of a descriptor set write operation',type='structs']
---
-The sname:VkWriteDescriptorSet structure is defined as:
-
-include::{generated}/api/structs/VkWriteDescriptorSet.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:dstSet is the destination descriptor set to update.
-  * pname:dstBinding is the descriptor binding within that set.
-  * pname:dstArrayElement is the starting element in that array.
-ifdef::VK_EXT_inline_uniform_block[]
-    If the descriptor binding identified by pname:dstSet and
-    pname:dstBinding has a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
-    pname:dstArrayElement specifies the starting byte offset within the
-    binding.
-endif::VK_EXT_inline_uniform_block[]
-  * pname:descriptorCount is the number of descriptors to update.
-ifdef::VK_EXT_inline_uniform_block[]
-    If the descriptor binding identified by pname:dstSet and
-    pname:dstBinding has a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, then
-    pname:descriptorCount specifies the number of bytes to update.
-    Otherwise,
-endif::VK_EXT_inline_uniform_block[]
-    pname:descriptorCount is one of
-  ** the number of elements in pname:pImageInfo
-  ** the number of elements in pname:pBufferInfo
-  ** the number of elements in pname:pTexelBufferView
-ifdef::VK_EXT_inline_uniform_block[]
-  ** a value matching the pname:dataSize member of a
-     slink:VkWriteDescriptorSetInlineUniformBlockEXT structure in the
-     pname:pNext chain
-endif::VK_EXT_inline_uniform_block[]
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-  ** a value matching the pname:accelerationStructureCount of a
-     slink:VkWriteDescriptorSetAccelerationStructureKHR structure in the
-     pname:pNext chain
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-  * pname:descriptorType is a elink:VkDescriptorType specifying the type of
-    each descriptor in pname:pImageInfo, pname:pBufferInfo, or
-    pname:pTexelBufferView, as described below.
-ifdef::VK_VALVE_mutable_descriptor_type[]
-    If sname:VkDescriptorSetLayoutBinding for pname:dstSet at
-    pname:dstBinding is not equal to ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE,
-    pname:descriptorType must:
-endif::VK_VALVE_mutable_descriptor_type[]
-ifndef::VK_VALVE_mutable_descriptor_type[]
-    It must:
-endif::VK_VALVE_mutable_descriptor_type[]
-    be the same type as that specified in sname:VkDescriptorSetLayoutBinding
-    for pname:dstSet at pname:dstBinding.
-    The type of the descriptor also controls which array the descriptors are
-    taken from.
-  * pname:pImageInfo is a pointer to an array of slink:VkDescriptorImageInfo
-    structures or is ignored, as described below.
-  * pname:pBufferInfo is a pointer to an array of
-    slink:VkDescriptorBufferInfo structures or is ignored, as described
-    below.
-  * pname:pTexelBufferView is a pointer to an array of slink:VkBufferView
-    handles as described in the <<resources-buffer-views,Buffer Views>>
-    section or is ignored, as described below.
-
-Only one of pname:pImageInfo, pname:pBufferInfo, or pname:pTexelBufferView
-members is used according to the descriptor type specified in the
-pname:descriptorType member of the containing sname:VkWriteDescriptorSet
-structure,
-ifdef::VK_EXT_inline_uniform_block[]
-or none of them in case pname:descriptorType is
-ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, in which case the source
-data for the descriptor writes is taken from the
-slink:VkWriteDescriptorSetInlineUniformBlockEXT structure included in the
-pname:pNext chain of sname:VkWriteDescriptorSet,
-endif::VK_EXT_inline_uniform_block[]
-ifdef::VK_KHR_acceleration_structure[]
-or if pname:descriptorType is
-ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, in which case the
-source data for the descriptor writes is taken from the
-slink:VkWriteDescriptorSetAccelerationStructureKHR structure in the
-pname:pNext chain of sname:VkWriteDescriptorSet,
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_NV_ray_tracing[]
-or if pname:descriptorType is
-ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, in which case the source
-data for the descriptor writes is taken from the
-slink:VkWriteDescriptorSetAccelerationStructureNV structure in the
-pname:pNext chain of sname:VkWriteDescriptorSet,
-endif::VK_NV_ray_tracing[]
-as specified below.
-
-ifdef::VK_EXT_robustness2[]
-If the <<features-nullDescriptor,nullDescriptor>> feature is enabled, the
-buffer,
-ifdef::VK_KHR_acceleration_structure[]
-acceleration structure,
-endif::VK_KHR_acceleration_structure[]
-imageView, or bufferView can: be dlink:VK_NULL_HANDLE.
-Loads from a null descriptor return zero values and stores and atomics to a
-null descriptor are discarded.
-ifdef::VK_KHR_acceleration_structure[]
-A null acceleration structure descriptor results in the miss shader being
-invoked.
-endif::VK_KHR_acceleration_structure[]
-endif::VK_EXT_robustness2[]
-
-ifdef::VK_VALVE_mutable_descriptor_type[]
-If the destination descriptor is a mutable descriptor, the active descriptor
-type for the destination descriptor becomes pname:descriptorType.
-endif::VK_VALVE_mutable_descriptor_type[]
-
-[[descriptorsets-updates-consecutive, consecutive binding updates]]
-If the pname:dstBinding has fewer than pname:descriptorCount array elements
-remaining starting from pname:dstArrayElement, then the remainder will be
-used to update the subsequent binding - [eq]#pname:dstBinding+1# starting at
-array element zero.
-If a binding has a pname:descriptorCount of zero, it is skipped.
-This behavior applies recursively, with the update affecting consecutive
-bindings as needed to update all pname:descriptorCount descriptors.
-Consecutive bindings must: have identical elink:VkDescriptorType,
-tlink:VkShaderStageFlags,
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-elink:VkDescriptorBindingFlagBits,
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-and immutable samplers references.
-
-ifdef::VK_EXT_inline_uniform_block[]
-[NOTE]
-.Note
-====
-The same behavior applies to bindings with a descriptor type of
-ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT where
-pname:descriptorCount specifies the number of bytes to update while
-pname:dstArrayElement specifies the starting byte offset, thus in this case
-if the pname:dstBinding has a smaller byte size than the sum of
-pname:dstArrayElement and pname:descriptorCount, then the remainder will be
-used to update the subsequent binding - [eq]#pname:dstBinding+1# starting at
-offset zero.
-This falls out as a special case of the above rule.
-====
-endif::VK_EXT_inline_uniform_block[]
-
-.Valid Usage
-****
-  * [[VUID-VkWriteDescriptorSet-dstBinding-00315]]
-    pname:dstBinding must: be less than or equal to the maximum value of
-    pname:binding of all slink:VkDescriptorSetLayoutBinding structures
-    specified when pname:dstSet's descriptor set layout was created
-  * [[VUID-VkWriteDescriptorSet-dstBinding-00316]]
-    pname:dstBinding must: be a binding with a non-zero
-    pname:descriptorCount
-  * [[VUID-VkWriteDescriptorSet-descriptorCount-00317]]
-    All consecutive bindings updated via a single sname:VkWriteDescriptorSet
-    structure, except those with a pname:descriptorCount of zero, must: have
-    identical pname:descriptorType and pname:stageFlags
-  * [[VUID-VkWriteDescriptorSet-descriptorCount-00318]]
-    All consecutive bindings updated via a single sname:VkWriteDescriptorSet
-    structure, except those with a pname:descriptorCount of zero, must: all
-    either use immutable samplers or must: all not use immutable samplers
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00319]]
-    pname:descriptorType must: match the type of pname:dstBinding within
-    pname:dstSet
-  * [[VUID-VkWriteDescriptorSet-dstSet-00320]]
-    pname:dstSet must: be a valid slink:VkDescriptorSet handle
-  * [[VUID-VkWriteDescriptorSet-dstArrayElement-00321]]
-    The sum of pname:dstArrayElement and pname:descriptorCount must: be less
-    than or equal to the number of array elements in the descriptor set
-    binding specified by pname:dstBinding, and all applicable consecutive
-    bindings, as described by <<descriptorsets-updates-consecutive>>
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkWriteDescriptorSet-descriptorType-02219]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:dstArrayElement
-    must: be an integer multiple of `4`
-  * [[VUID-VkWriteDescriptorSet-descriptorType-02220]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:descriptorCount
-    must: be an integer multiple of `4`
-endif::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00322]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pname:pImageInfo must: be a
-    valid pointer to an array of pname:descriptorCount valid
-    sname:VkDescriptorImageInfo structures
-  * [[VUID-VkWriteDescriptorSet-descriptorType-02994]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
-    or ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, each element of
-    pname:pTexelBufferView must: be either a valid sname:VkBufferView handle
-    or dlink:VK_NULL_HANDLE
-  * [[VUID-VkWriteDescriptorSet-descriptorType-02995]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
-    or ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER and the
-    <<features-nullDescriptor,nullDescriptor>> feature is not enabled, each
-    element of pname:pTexelBufferView must: not be dlink:VK_NULL_HANDLE
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00324]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pname:pBufferInfo must:
-    be a valid pointer to an array of pname:descriptorCount valid
-    sname:VkDescriptorBufferInfo structures
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00325]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLER or
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and pname:dstSet was
-    not allocated with a layout that included immutable samplers for
-    pname:dstBinding with pname:descriptorType, the pname:sampler member of
-    each element of pname:pImageInfo must: be a valid sname:VkSampler object
-  * [[VUID-VkWriteDescriptorSet-descriptorType-02996]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the pname:imageView member of
-    each element of pname:pImageInfo must: be either a valid
-    sname:VkImageView handle or dlink:VK_NULL_HANDLE
-  * [[VUID-VkWriteDescriptorSet-descriptorType-02997]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT and the
-    <<features-nullDescriptor,nullDescriptor>> feature is not enabled, the
-    pname:imageView member of each element of pname:pImageInfo must: not be
-    dlink:VK_NULL_HANDLE
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkWriteDescriptorSet-descriptorType-02221]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, the pname:pNext chain
-    must: include a slink:VkWriteDescriptorSetInlineUniformBlockEXT
-    structure whose pname:dataSize member equals pname:descriptorCount
-endif::VK_EXT_inline_uniform_block[]
-ifdef::VK_KHR_acceleration_structure[]
-  * [[VUID-VkWriteDescriptorSet-descriptorType-02382]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, the pname:pNext
-    chain must: include a slink:VkWriteDescriptorSetAccelerationStructureKHR
-    structure whose pname:accelerationStructureCount member equals
-    pname:descriptorCount
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_NV_ray_tracing[]
-  * [[VUID-VkWriteDescriptorSet-descriptorType-03817]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, the pname:pNext
-    chain must: include a slink:VkWriteDescriptorSetAccelerationStructureNV
-    structure whose pname:accelerationStructureCount member equals
-    pname:descriptorCount
-endif::VK_NV_ray_tracing[]
-ifdef::VK_VULKAN_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkWriteDescriptorSet-descriptorType-01946]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, then
-    the pname:imageView member of each pname:pImageInfo element must: have
-    been created without a sname:VkSamplerYcbcrConversionInfo structure in
-    its pname:pNext chain
-  * [[VUID-VkWriteDescriptorSet-descriptorType-02738]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and if any element of
-    pname:pImageInfo has a pname:imageView member that was created with a
-    sname:VkSamplerYcbcrConversionInfo structure in its pname:pNext chain,
-    then pname:dstSet must: have been allocated with a layout that included
-    immutable samplers for pname:dstBinding, and the corresponding immutable
-    sampler must: have been created with an _identically defined_
-    sname:VkSamplerYcbcrConversionInfo object
-  * [[VUID-VkWriteDescriptorSet-descriptorType-01948]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and pname:dstSet was
-    allocated with a layout that included immutable samplers for
-    pname:dstBinding, then the pname:imageView member of each element of
-    pname:pImageInfo which corresponds to an immutable sampler that enables
-    <<samplers-YCbCr-conversion,sampler {YCbCr} conversion>> must: have been
-    created with a sname:VkSamplerYcbcrConversionInfo structure in its
-    pname:pNext chain with an _identically defined_
-    sname:VkSamplerYcbcrConversionInfo to the corresponding immutable
-    sampler
-endif::VK_VULKAN_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00327]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the pname:offset member
-    of each element of pname:pBufferInfo must: be a multiple of
-    sname:VkPhysicalDeviceLimits::pname:minUniformBufferOffsetAlignment
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00328]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the pname:offset member
-    of each element of pname:pBufferInfo must: be a multiple of
-    sname:VkPhysicalDeviceLimits::pname:minStorageBufferOffsetAlignment
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00329]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, and the pname:buffer
-    member of any element of pname:pBufferInfo is the handle of a non-sparse
-    buffer, then that buffer must: be bound completely and contiguously to a
-    single sname:VkDeviceMemory object
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00330]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the pname:buffer member
-    of each element of pname:pBufferInfo must: have been created with
-    ename:VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00331]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the pname:buffer member
-    of each element of pname:pBufferInfo must: have been created with
-    ename:VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00332]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the pname:range member
-    of each element of pname:pBufferInfo, or the effective range if
-    pname:range is ename:VK_WHOLE_SIZE, must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxUniformBufferRange
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00333]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the pname:range member
-    of each element of pname:pBufferInfo, or the effective range if
-    pname:range is ename:VK_WHOLE_SIZE, must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxStorageBufferRange
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00334]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, the sname:VkBuffer that
-    each element of pname:pTexelBufferView was created from must: have been
-    created with ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00335]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, the sname:VkBuffer that
-    each element of pname:pTexelBufferView was created from must: have been
-    created with ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00336]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the pname:imageView member of
-    each element of pname:pImageInfo must: have been created with the
-    identity swizzle
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00337]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE or
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, the pname:imageView
-    member of each element of pname:pImageInfo must: have been created with
-    ename:VK_IMAGE_USAGE_SAMPLED_BIT set
-  * [[VUID-VkWriteDescriptorSet-descriptorType-04149]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE the
-    pname:imageLayout member of each element of pname:pImageInfo must: be a
-    member of the list given in <<descriptorsets-sampledimage, Sampled
-    Image>>
-  * [[VUID-VkWriteDescriptorSet-descriptorType-04150]]
-    If pname:descriptorType is
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER the pname:imageLayout
-    member of each element of pname:pImageInfo must: be a member of the list
-    given in <<descriptorsets-combinedimagesampler, Combined Image Sampler>>
-  * [[VUID-VkWriteDescriptorSet-descriptorType-04151]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT the
-    pname:imageLayout member of each element of pname:pImageInfo must: be a
-    member of the list given in <<descriptorsets-inputattachment, Input
-    Attachment>>
-  * [[VUID-VkWriteDescriptorSet-descriptorType-04152]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE the
-    pname:imageLayout member of each element of pname:pImageInfo must: be a
-    member of the list given in <<descriptorsets-storageimage, Storage
-    Image>>
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00338]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
-    the pname:imageView member of each element of pname:pImageInfo must:
-    have been created with ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set
-  * [[VUID-VkWriteDescriptorSet-descriptorType-00339]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, the
-    pname:imageView member of each element of pname:pImageInfo must: have
-    been created with ename:VK_IMAGE_USAGE_STORAGE_BIT set
-  * [[VUID-VkWriteDescriptorSet-descriptorType-02752]]
-    If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLER, then
-    pname:dstSet must: not have been allocated with a layout that included
-    immutable samplers for pname:dstBinding
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkWriteDescriptorSet-dstSet-04611]]
-    If the sname:VkDescriptorSetLayoutBinding for pname:dstSet at
-    pname:dstBinding is ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the new
-    active descriptor type pname:descriptorType must: exist in the
-    corresponding pname:pMutableDescriptorTypeLists list for
-    pname:dstBinding
-endif::VK_VALVE_mutable_descriptor_type[]
-****
-
-include::{generated}/validity/structs/VkWriteDescriptorSet.txt[]
---
-
-[open,refpage='VkDescriptorType',desc='Specifies the type of a descriptor in a descriptor set',type='enums']
---
-The type of descriptors in a descriptor set is specified by
-slink:VkWriteDescriptorSet::pname:descriptorType, which must: be one of the
-values:
-
-include::{generated}/api/enums/VkDescriptorType.txt[]
-
-  * ename:VK_DESCRIPTOR_TYPE_SAMPLER specifies a <<descriptorsets-sampler,
-    sampler descriptor>>.
-  * ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER specifies a
-    <<descriptorsets-combinedimagesampler, combined image sampler
-    descriptor>>.
-  * ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE specifies a
-    <<descriptorsets-sampledimage, sampled image descriptor>>.
-  * ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE specifies a
-    <<descriptorsets-storageimage, storage image descriptor>>.
-  * ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER specifies a
-    <<descriptorsets-uniformtexelbuffer, uniform texel buffer descriptor>>.
-  * ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER specifies a
-    <<descriptorsets-storagetexelbuffer, storage texel buffer descriptor>>.
-  * ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER specifies a
-    <<descriptorsets-uniformbuffer, uniform buffer descriptor>>.
-  * ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER specifies a
-    <<descriptorsets-storagebuffer, storage buffer descriptor>>.
-  * ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC specifies a
-    <<descriptorsets-uniformbufferdynamic, dynamic uniform buffer
-    descriptor>>.
-  * ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC specifies a
-    <<descriptorsets-storagebufferdynamic, dynamic storage buffer
-    descriptor>>.
-  * ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT specifies an
-    <<descriptorsets-inputattachment, input attachment descriptor>>.
-ifdef::VK_EXT_inline_uniform_block[]
-  * ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT specifies an
-    <<descriptorsets-inlineuniformblock, inline uniform block>>.
-endif::VK_EXT_inline_uniform_block[]
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE specifies a
-    <<descriptorsets-mutable, descriptor of mutable type>>.
-endif::VK_VALVE_mutable_descriptor_type[]
-
-When a descriptor set is updated via elements of slink:VkWriteDescriptorSet,
-members of pname:pImageInfo, pname:pBufferInfo and pname:pTexelBufferView
-are only accessed by the implementation when they correspond to descriptor
-type being defined - otherwise they are ignored.
-The members accessed are as follows for each descriptor type:
-
-  * For ename:VK_DESCRIPTOR_TYPE_SAMPLER, only the pname:sampler member of
-    each element of slink:VkWriteDescriptorSet::pname:pImageInfo is
-    accessed.
-  * For ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, only the pname:imageView and
-    pname:imageLayout members of each element of
-    slink:VkWriteDescriptorSet::pname:pImageInfo are accessed.
-  * For ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, all members of each
-    element of slink:VkWriteDescriptorSet::pname:pImageInfo are accessed.
-  * For ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, all members of each
-    element of slink:VkWriteDescriptorSet::pname:pBufferInfo are accessed.
-  * For ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, each element of
-    slink:VkWriteDescriptorSet::pname:pTexelBufferView is accessed.
-
-ifdef::VK_EXT_inline_uniform_block[]
-When updating descriptors with a pname:descriptorType of
-ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, none of the
-pname:pImageInfo, pname:pBufferInfo, or pname:pTexelBufferView members are
-accessed, instead the source data of the descriptor update operation is
-taken from the slink:VkWriteDescriptorSetInlineUniformBlockEXT structure in
-the pname:pNext chain of sname:VkWriteDescriptorSet.
-endif::VK_EXT_inline_uniform_block[]
-ifdef::VK_KHR_acceleration_structure[]
-When updating descriptors with a pname:descriptorType of
-ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, none of the
-pname:pImageInfo, pname:pBufferInfo, or pname:pTexelBufferView members are
-accessed, instead the source data of the descriptor update operation is
-taken from the slink:VkWriteDescriptorSetAccelerationStructureKHR structure
-in the pname:pNext chain of sname:VkWriteDescriptorSet.
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_NV_ray_tracing[]
-When updating descriptors with a pname:descriptorType of
-ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, none of the
-pname:pImageInfo, pname:pBufferInfo, or pname:pTexelBufferView members are
-accessed, instead the source data of the descriptor update operation is
-taken from the slink:VkWriteDescriptorSetAccelerationStructureNV structure
-in the pname:pNext chain of sname:VkWriteDescriptorSet.
-endif::VK_NV_ray_tracing[]
---
-
-[open,refpage='VkDescriptorBufferInfo',desc='Structure specifying descriptor buffer information',type='structs']
---
-The sname:VkDescriptorBufferInfo structure is defined as:
-
-include::{generated}/api/structs/VkDescriptorBufferInfo.txt[]
-
-  * pname:buffer is
-ifdef::VK_EXT_robustness2[]
-dlink:VK_NULL_HANDLE or
-endif::VK_EXT_robustness2[]
-the buffer resource.
-  * pname:offset is the offset in bytes from the start of pname:buffer.
-    Access to buffer memory via this descriptor uses addressing that is
-    relative to this starting offset.
-  * pname:range is the size in bytes that is used for this descriptor
-    update, or ename:VK_WHOLE_SIZE to use the range from pname:offset to the
-    end of the buffer.
-
-[NOTE]
-.Note
-====
-When setting pname:range to ename:VK_WHOLE_SIZE, the effective range must:
-not be larger than the maximum range for the descriptor type
-(<<limits-maxUniformBufferRange, pname:maxUniformBufferRange>> or
-<<limits-maxStorageBufferRange, pname:maxStorageBufferRange>>).
-This means that ename:VK_WHOLE_SIZE is not typically useful in the common
-case where uniform buffer descriptors are suballocated from a buffer that is
-much larger than pname:maxUniformBufferRange.
-====
-
-For ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC and
-ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC descriptor types,
-pname:offset is the base offset from which the dynamic offset is applied and
-pname:range is the static size used for all dynamic offsets.
-
-.Valid Usage
-****
-  * [[VUID-VkDescriptorBufferInfo-offset-00340]]
-    pname:offset must: be less than the size of pname:buffer
-  * [[VUID-VkDescriptorBufferInfo-range-00341]]
-    If pname:range is not equal to ename:VK_WHOLE_SIZE, pname:range must: be
-    greater than `0`
-  * [[VUID-VkDescriptorBufferInfo-range-00342]]
-    If pname:range is not equal to ename:VK_WHOLE_SIZE, pname:range must: be
-    less than or equal to the size of pname:buffer minus pname:offset
-  * [[VUID-VkDescriptorBufferInfo-buffer-02998]]
-    If the <<features-nullDescriptor,nullDescriptor>> feature is not
-    enabled, pname:buffer must: not be dlink:VK_NULL_HANDLE
-ifdef::VK_EXT_robustness2[]
-  * [[VUID-VkDescriptorBufferInfo-buffer-02999]]
-    If pname:buffer is dlink:VK_NULL_HANDLE, pname:offset must: be zero and
-    pname:range must: be ename:VK_WHOLE_SIZE
-endif::VK_EXT_robustness2[]
-****
-
-include::{generated}/validity/structs/VkDescriptorBufferInfo.txt[]
---
-
-[open,refpage='VkDescriptorImageInfo',desc='Structure specifying descriptor image information',type='structs']
---
-The sname:VkDescriptorImageInfo structure is defined as:
-
-include::{generated}/api/structs/VkDescriptorImageInfo.txt[]
-
-  * pname:sampler is a sampler handle, and is used in descriptor updates for
-    types ename:VK_DESCRIPTOR_TYPE_SAMPLER and
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER if the binding being
-    updated does not use immutable samplers.
-  * pname:imageView is
-ifdef::VK_EXT_robustness2[]
-    dlink:VK_NULL_HANDLE or
-endif::VK_EXT_robustness2[]
-    an image view handle, and is used in descriptor updates for types
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT.
-  * pname:imageLayout is the layout that the image subresources accessible
-    from pname:imageView will be in at the time this descriptor is accessed.
-    pname:imageLayout is used in descriptor updates for types
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT.
-
-Members of sname:VkDescriptorImageInfo that are not used in an update (as
-described above) are ignored.
-
-.Valid Usage
-****
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-VkDescriptorImageInfo-imageView-00343]]
-    pname:imageView must: not be 2D or 2D array image view created from a 3D
-    image
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-VkDescriptorImageInfo-imageView-01976]]
-    If pname:imageView is created from a depth/stencil image, the
-    pname:aspectMask used to create the pname:imageView must: include either
-    ename:VK_IMAGE_ASPECT_DEPTH_BIT or ename:VK_IMAGE_ASPECT_STENCIL_BIT but
-    not both
-  * [[VUID-VkDescriptorImageInfo-imageLayout-00344]]
-    pname:imageLayout must: match the actual elink:VkImageLayout of each
-    subresource accessible from pname:imageView at the time this descriptor
-    is accessed as defined by the <<resources-image-layouts-matching-rule,
-    image layout matching rules>>
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkDescriptorImageInfo-sampler-01564]]
-    If pname:sampler is used and the elink:VkFormat of the image is a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar format>>, the
-    image must: have been created with
-    ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, and the pname:aspectMask of
-    the pname:imageView must: be ename:VK_IMAGE_ASPECT_PLANE_0_BIT,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT or (for three-plane formats only)
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_KHR_portability_subset[]
-  * [[VUID-VkDescriptorImageInfo-mutableComparisonSamplers-04450]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:mutableComparisonSamplers
-    is ename:VK_FALSE, then pname:sampler must: have been created with
-    slink:VkSamplerCreateInfo::pname:compareEnable set to ename:VK_FALSE
-endif::VK_KHR_portability_subset[]
-****
-
-
-include::{generated}/validity/structs/VkDescriptorImageInfo.txt[]
---
-
-ifdef::VK_EXT_inline_uniform_block[]
-[open,refpage='VkWriteDescriptorSetInlineUniformBlockEXT',desc='Structure specifying inline uniform block data',type='structs']
---
-If the pname:descriptorType member of slink:VkWriteDescriptorSet is
-ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then the data to write to
-the descriptor set is specified through a
-sname:VkWriteDescriptorSetInlineUniformBlockEXT structure included in the
-pname:pNext chain of sname:VkWriteDescriptorSet.
-
-The sname:VkWriteDescriptorSetInlineUniformBlockEXT structure is defined as:
-
-include::{generated}/api/structs/VkWriteDescriptorSetInlineUniformBlockEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:dataSize is the number of bytes of inline uniform block data
-    pointed to by pname:pData.
-  * pname:pData is a pointer to pname:dataSize number of bytes of data to
-    write to the inline uniform block.
-
-.Valid Usage
-****
-  * [[VUID-VkWriteDescriptorSetInlineUniformBlockEXT-dataSize-02222]]
-    pname:dataSize must: be an integer multiple of `4`
-****
-
-include::{generated}/validity/structs/VkWriteDescriptorSetInlineUniformBlockEXT.txt[]
---
-endif::VK_EXT_inline_uniform_block[]
-
-ifdef::VK_KHR_acceleration_structure[]
-[open,refpage='VkWriteDescriptorSetAccelerationStructureKHR',desc='Structure specifying acceleration structure descriptor information',type='structs']
---
-:refpage: VkWriteDescriptorSetAccelerationStructureKHR
-
-The sname:VkWriteDescriptorSetAccelerationStructureKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkWriteDescriptorSetAccelerationStructureKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:accelerationStructureCount is the number of elements in
-    pname:pAccelerationStructures.
-  * pname:pAccelerationStructures is a pointer to an array of
-    slink:VkAccelerationStructureKHR structures specifying the acceleration
-    structures to update.
-
-.Valid Usage
-****
-  * [[VUID-VkWriteDescriptorSetAccelerationStructureKHR-accelerationStructureCount-02236]]
-    pname:accelerationStructureCount must: be equal to pname:descriptorCount
-    in the extended structure
-  * [[VUID-VkWriteDescriptorSetAccelerationStructureKHR-pAccelerationStructures-03579]]
-    Each acceleration structure in pname:pAccelerationStructures must: have
-    been created with a pname:type of
-    ename:VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR or
-    ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR
-  * [[VUID-VkWriteDescriptorSetAccelerationStructureKHR-pAccelerationStructures-03580]]
-    If the <<features-nullDescriptor,nullDescriptor>> feature is not
-    enabled, each element of pname:pAccelerationStructures must: not be
-    dlink:VK_NULL_HANDLE
-****
-
-include::{generated}/validity/structs/VkWriteDescriptorSetAccelerationStructureKHR.txt[]
---
-endif::VK_KHR_acceleration_structure[]
-
-ifdef::VK_NV_ray_tracing[]
-[open,refpage='VkWriteDescriptorSetAccelerationStructureNV',desc='Structure specifying acceleration structure descriptor information',type='structs']
---
-:refpage: VkWriteDescriptorSetAccelerationStructureNV
-
-The sname:VkWriteDescriptorSetAccelerationStructureNV structure is defined
-as:
-
-include::{generated}/api/structs/VkWriteDescriptorSetAccelerationStructureNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:accelerationStructureCount is the number of elements in
-    pname:pAccelerationStructures.
-  * pname:pAccelerationStructures is a pointer to an array of
-    slink:VkAccelerationStructureNV structures specifying the acceleration
-    structures to update.
-
-.Valid Usage
-****
-  * [[VUID-VkWriteDescriptorSetAccelerationStructureNV-accelerationStructureCount-03747]]
-    pname:accelerationStructureCount must: be equal to pname:descriptorCount
-    in the extended structure
-  * [[VUID-VkWriteDescriptorSetAccelerationStructureNV-pAccelerationStructures-03748]]
-    Each acceleration structure in pname:pAccelerationStructures must: have
-    been created with ename:VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR
-  * [[VUID-VkWriteDescriptorSetAccelerationStructureNV-pAccelerationStructures-03749]]
-    If the <<features-nullDescriptor,nullDescriptor>> feature is not
-    enabled, each member of pname:pAccelerationStructures must: not be
-    dlink:VK_NULL_HANDLE
-****
-
-include::{generated}/validity/structs/VkWriteDescriptorSetAccelerationStructureNV.txt[]
---
-endif::VK_NV_ray_tracing[]
-
-[open,refpage='VkCopyDescriptorSet',desc='Structure specifying a copy descriptor set operation',type='structs']
---
-The sname:VkCopyDescriptorSet structure is defined as:
-
-include::{generated}/api/structs/VkCopyDescriptorSet.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcSet, pname:srcBinding, and pname:srcArrayElement are the source
-    set, binding, and array element, respectively.
-ifdef::VK_EXT_inline_uniform_block[]
-    If the descriptor binding identified by pname:srcSet and
-    pname:srcBinding has a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
-    pname:srcArrayElement specifies the starting byte offset within the
-    binding to copy from.
-endif::VK_EXT_inline_uniform_block[]
-  * pname:dstSet, pname:dstBinding, and pname:dstArrayElement are the
-    destination set, binding, and array element, respectively.
-ifdef::VK_EXT_inline_uniform_block[]
-    If the descriptor binding identified by pname:dstSet and
-    pname:dstBinding has a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
-    pname:dstArrayElement specifies the starting byte offset within the
-    binding to copy to.
-endif::VK_EXT_inline_uniform_block[]
-  * pname:descriptorCount is the number of descriptors to copy from the
-    source to destination.
-    If pname:descriptorCount is greater than the number of remaining array
-    elements in the source or destination binding, those affect consecutive
-    bindings in a manner similar to slink:VkWriteDescriptorSet above.
-ifdef::VK_EXT_inline_uniform_block[]
-    If the descriptor binding identified by pname:srcSet and
-    pname:srcBinding has a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then
-    pname:descriptorCount specifies the number of bytes to copy and the
-    remaining array elements in the source or destination binding refer to
-    the remaining number of bytes in those.
-endif::VK_EXT_inline_uniform_block[]
-
-ifdef::VK_VALVE_mutable_descriptor_type[]
-If the sname:VkDescriptorSetLayoutBinding for pname:dstBinding is
-ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE and pname:srcBinding is not
-ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the new active descriptor type
-becomes the descriptor type of pname:srcBinding.
-If both sname:VkDescriptorSetLayoutBinding for pname:srcBinding and
-pname:dstBinding are ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the active
-descriptor type in each source descriptor is copied into the corresponding
-destination descriptor.
-The active descriptor type can: be different for each source descriptor.
-
-[NOTE]
-.Note
-====
-The intention is that copies to and from mutable descriptors is a simple
-memcpy.
-Copies between non-mutable and mutable descriptors are expected to require
-one memcpy per descriptor to handle the difference in size, but this use
-case with more than one pname:descriptorCount is considered rare.
-====
-endif::VK_VALVE_mutable_descriptor_type[]
-
-.Valid Usage
-****
-  * [[VUID-VkCopyDescriptorSet-srcBinding-00345]]
-    pname:srcBinding must: be a valid binding within pname:srcSet
-  * [[VUID-VkCopyDescriptorSet-srcArrayElement-00346]]
-    The sum of pname:srcArrayElement and pname:descriptorCount must: be less
-    than or equal to the number of array elements in the descriptor set
-    binding specified by pname:srcBinding, and all applicable consecutive
-    bindings, as described by <<descriptorsets-updates-consecutive>>
-  * [[VUID-VkCopyDescriptorSet-dstBinding-00347]]
-    pname:dstBinding must: be a valid binding within pname:dstSet
-  * [[VUID-VkCopyDescriptorSet-dstArrayElement-00348]]
-    The sum of pname:dstArrayElement and pname:descriptorCount must: be less
-    than or equal to the number of array elements in the descriptor set
-    binding specified by pname:dstBinding, and all applicable consecutive
-    bindings, as described by <<descriptorsets-updates-consecutive>>
-  * [[VUID-VkCopyDescriptorSet-dstBinding-02632]]
-    The type of pname:dstBinding within pname:dstSet must: be equal to the
-    type of pname:srcBinding within pname:srcSet
-  * [[VUID-VkCopyDescriptorSet-srcSet-00349]]
-    If pname:srcSet is equal to pname:dstSet, then the source and
-    destination ranges of descriptors must: not overlap, where the ranges
-    may: include array elements from consecutive bindings as described by
-    <<descriptorsets-updates-consecutive>>
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkCopyDescriptorSet-srcBinding-02223]]
-    If the descriptor type of the descriptor set binding specified by
-    pname:srcBinding is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT,
-    pname:srcArrayElement must: be an integer multiple of `4`
-  * [[VUID-VkCopyDescriptorSet-dstBinding-02224]]
-    If the descriptor type of the descriptor set binding specified by
-    pname:dstBinding is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT,
-    pname:dstArrayElement must: be an integer multiple of `4`
-  * [[VUID-VkCopyDescriptorSet-srcBinding-02225]]
-    If the descriptor type of the descriptor set binding specified by either
-    pname:srcBinding or pname:dstBinding is
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:descriptorCount
-    must: be an integer multiple of `4`
-endif::VK_EXT_inline_uniform_block[]
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * [[VUID-VkCopyDescriptorSet-srcSet-01918]]
-    If pname:srcSet's layout was created with the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag
-    set, then pname:dstSet's layout must: also have been created with the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag
-    set
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkCopyDescriptorSet-srcSet-04885]]
-    If pname:srcSet's layout was created with neither
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT nor
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE flags
-    set, then pname:dstSet's layout must: have been created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag
-    set
-endif::VK_VALVE_mutable_descriptor_type[]
-ifndef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkCopyDescriptorSet-srcSet-04886]]
-    If pname:srcSet's layout was created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag
-    set, then pname:dstSet's layout must: also have been created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag
-    set
-endif::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkCopyDescriptorSet-srcSet-01920]]
-    If the descriptor pool from which pname:srcSet was allocated was created
-    with the ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set,
-    then the descriptor pool from which pname:dstSet was allocated must:
-    also have been created with the
-    ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkCopyDescriptorSet-srcSet-04887]]
-    If the descriptor pool from which pname:srcSet was allocated was created
-    with neither ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT nor
-    ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE flags set, then the
-    descriptor pool from which pname:dstSet was allocated must: have been
-    created without the
-    ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set
-endif::VK_VALVE_mutable_descriptor_type[]
-ifndef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkCopyDescriptorSet-srcSet-04888]]
-    If the descriptor pool from which pname:srcSet was allocated was created
-    without the ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag
-    set, then the descriptor pool from which pname:dstSet was allocated
-    must: also have been created without the
-    ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set
-endif::VK_VALVE_mutable_descriptor_type[]
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * [[VUID-VkCopyDescriptorSet-dstBinding-02753]]
-    If the descriptor type of the descriptor set binding specified by
-    pname:dstBinding is ename:VK_DESCRIPTOR_TYPE_SAMPLER, then pname:dstSet
-    must: not have been allocated with a layout that included immutable
-    samplers for pname:dstBinding
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkCopyDescriptorSet-dstSet-04612]]
-    If sname:VkDescriptorSetLayoutBinding for pname:dstSet at
-    pname:dstBinding is ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the new
-    active descriptor type must: exist in the corresponding
-    pname:pMutableDescriptorTypeLists list for pname:dstBinding if the new
-    active descriptor type is not ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE
-  * [[VUID-VkCopyDescriptorSet-srcSet-04613]]
-    If sname:VkDescriptorSetLayoutBinding for pname:srcSet at
-    pname:srcBinding is ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE and the
-    sname:VkDescriptorSetLayoutBinding for pname:dstSet at pname:dstBinding
-    is not ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the active descriptor
-    type for the source descriptor must: match the descriptor type of
-    pname:dstBinding
-  * [[VUID-VkCopyDescriptorSet-dstSet-04614]]
-    If sname:VkDescriptorSetLayoutBinding for pname:dstSet at
-    pname:dstBinding is ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, and the new
-    active descriptor type is ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE, the
-    pname:pMutableDescriptorTypeLists for pname:srcBinding and
-    pname:dstBinding must: match exactly
-endif::VK_VALVE_mutable_descriptor_type[]
-****
-
-include::{generated}/validity/structs/VkCopyDescriptorSet.txt[]
---
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_descriptor_update_template[]
-[[descriptorsets-updates-with-template]]
-=== Descriptor Update Templates
-
-[open,refpage='VkDescriptorUpdateTemplate',desc='Opaque handle to a descriptor update template',type='handles']
---
-A descriptor update template specifies a mapping from descriptor update
-information in host memory to descriptors in a descriptor set.
-It is designed to avoid passing redundant information to the driver when
-frequently updating the same set of descriptors in descriptor sets.
-
-Descriptor update template objects are represented by
-sname:VkDescriptorUpdateTemplate handles:
-
-include::{generated}/api/handles/VkDescriptorUpdateTemplate.txt[]
-
-ifdef::VK_KHR_descriptor_update_template[]
-or the equivalent
-
-include::{generated}/api/handles/VkDescriptorUpdateTemplateKHR.txt[]
-endif::VK_KHR_descriptor_update_template[]
---
-
-
-=== Descriptor Set Updates with Templates
-
-[open,refpage='vkCreateDescriptorUpdateTemplate',desc='Create a new descriptor update template',type='protos']
---
-Updating a large sname:VkDescriptorSet array can: be an expensive operation
-since an application must: specify one slink:VkWriteDescriptorSet structure
-for each descriptor or descriptor array to update, each of which
-re-specifies the same state when updating the same descriptor in multiple
-descriptor sets.
-For cases when an application wishes to update the same set of descriptors
-in multiple descriptor sets allocated using the same
-sname:VkDescriptorSetLayout, flink:vkUpdateDescriptorSetWithTemplate can: be
-used as a replacement for flink:vkUpdateDescriptorSets.
-
-sname:VkDescriptorUpdateTemplate allows implementations to convert a set of
-descriptor update operations on a single descriptor set to an internal
-format that, in conjunction with flink:vkUpdateDescriptorSetWithTemplate
-ifdef::VK_KHR_push_descriptor[]
-or flink:vkCmdPushDescriptorSetWithTemplateKHR
-endif::VK_KHR_push_descriptor[]
-, can: be more efficient compared to calling flink:vkUpdateDescriptorSets
-ifdef::VK_KHR_push_descriptor[]
-or flink:vkCmdPushDescriptorSetKHR
-endif::VK_KHR_push_descriptor[]
-.
-The descriptors themselves are not specified in the
-sname:VkDescriptorUpdateTemplate, rather, offsets into an application
-provided pointer to host memory are specified, which are combined with a
-pointer passed to flink:vkUpdateDescriptorSetWithTemplate
-ifdef::VK_KHR_push_descriptor[]
-or flink:vkCmdPushDescriptorSetWithTemplateKHR
-endif::VK_KHR_push_descriptor[]
-.
-This allows large batches of updates to be executed without having to
-convert application data structures into a strictly-defined Vulkan data
-structure.
-
-To create a descriptor update template, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkCreateDescriptorUpdateTemplate.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_descriptor_update_template[or the equivalent command]
-
-ifdef::VK_KHR_descriptor_update_template[]
-include::{generated}/api/protos/vkCreateDescriptorUpdateTemplateKHR.txt[]
-endif::VK_KHR_descriptor_update_template[]
-
-  * pname:device is the logical device that creates the descriptor update
-    template.
-  * pname:pCreateInfo is a pointer to a
-    slink:VkDescriptorUpdateTemplateCreateInfo structure specifying the set
-    of descriptors to update with a single call to
-ifdef::VK_KHR_push_descriptor[]
-    flink:vkCmdPushDescriptorSetWithTemplateKHR or
-endif::VK_KHR_push_descriptor[]
-    flink:vkUpdateDescriptorSetWithTemplate.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pDescriptorUpdateTemplate is a pointer to a
-    sname:VkDescriptorUpdateTemplate handle in which the resulting
-    descriptor update template object is returned.
-
-include::{generated}/validity/protos/vkCreateDescriptorUpdateTemplate.txt[]
---
-
-[open,refpage='VkDescriptorUpdateTemplateCreateInfo',desc='Structure specifying parameters of a newly created descriptor update template',type='structs']
---
-The slink:VkDescriptorUpdateTemplateCreateInfo structure is defined as:
-include::{generated}/api/structs/VkDescriptorUpdateTemplateCreateInfo.txt[]
-
-ifdef::VK_KHR_descriptor_update_template[]
-or the equivalent
-
-include::{generated}/api/structs/VkDescriptorUpdateTemplateCreateInfoKHR.txt[]
-endif::VK_KHR_descriptor_update_template[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:descriptorUpdateEntryCount is the number of elements in the
-    pname:pDescriptorUpdateEntries array.
-  * pname:pDescriptorUpdateEntries is a pointer to an array of
-    slink:VkDescriptorUpdateTemplateEntry structures describing the
-    descriptors to be updated by the descriptor update template.
-  * pname:templateType Specifies the type of the descriptor update template.
-    If set to ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET it
-    can: only be used to update descriptor sets with a fixed
-    pname:descriptorSetLayout.
-ifdef::VK_KHR_push_descriptor[]
-    If set to ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR
-    it can: only be used to push descriptor sets using the provided
-    pname:pipelineBindPoint, pname:pipelineLayout, and pname:set number.
-endif::VK_KHR_push_descriptor[]
-  * pname:descriptorSetLayout is the descriptor set layout used to build the
-    descriptor update template.
-    All descriptor sets which are going to be updated through the newly
-    created descriptor update template must: be created with a layout that
-    matches (is the same as, or defined identically to) this layout.
-    This parameter is ignored if pname:templateType is not
-    ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET.
-ifdef::VK_KHR_push_descriptor[]
-  * pname:pipelineBindPoint is a elink:VkPipelineBindPoint indicating the
-    type of the pipeline that will use the descriptors.
-    This parameter is ignored if pname:templateType is not
-    ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR
-  * pname:pipelineLayout is a slink:VkPipelineLayout object used to program
-    the bindings.
-    This parameter is ignored if pname:templateType is not
-    ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR
-  * pname:set is the set number of the descriptor set in the pipeline layout
-    that will be updated.
-    This parameter is ignored if pname:templateType is not
-    ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR
-endif::VK_KHR_push_descriptor[]
-ifndef::VK_KHR_push_descriptor[]
-  * pname:pipelineBindPoint is reserved for future use and is ignored
-  * pname:pipelineLayout is reserved for future use and is ignored
-  * pname:set is reserved for future use and is ignored
-endif::VK_KHR_push_descriptor[]
-
-.Valid Usage
-****
-  * [[VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350]]
-    If pname:templateType is
-    ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,
-    pname:descriptorSetLayout must: be a valid sname:VkDescriptorSetLayout
-    handle
-ifdef::VK_KHR_push_descriptor[]
-  * [[VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351]]
-    If pname:templateType is
-    ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR,
-    pname:pipelineBindPoint must: be a valid elink:VkPipelineBindPoint value
-  * [[VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352]]
-    If pname:templateType is
-    ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR,
-    pname:pipelineLayout must: be a valid sname:VkPipelineLayout handle
-  * [[VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353]]
-    If pname:templateType is
-    ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, pname:set
-    must: be the unique set number in the pipeline layout that uses a
-    descriptor set layout that was created with
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR
-endif::VK_KHR_push_descriptor[]
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-04615]]
-    If pname:templateType is
-    ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,
-    pname:descriptorSetLayout must: not contain a binding with type
-    ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE
-endif::VK_VALVE_mutable_descriptor_type[]
-****
-
-
-include::{generated}/validity/structs/VkDescriptorUpdateTemplateCreateInfo.txt[]
---
-
-[open,refpage='VkDescriptorUpdateTemplateCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkDescriptorUpdateTemplateCreateFlags.txt[]
-
-ifdef::VK_KHR_descriptor_update_template[]
-or the equivalent
-
-include::{generated}/api/flags/VkDescriptorUpdateTemplateCreateFlagsKHR.txt[]
-endif::VK_KHR_descriptor_update_template[]
-
-tname:VkDescriptorUpdateTemplateCreateFlags is a bitmask type for setting a
-mask, but is currently reserved for future use.
---
-
-[open,refpage='VkDescriptorUpdateTemplateType',desc='Indicates the valid usage of the descriptor update template',type='enums']
---
-The descriptor update template type is determined by the
-slink:VkDescriptorUpdateTemplateCreateInfo::pname:templateType property,
-which takes the following values:
-
-include::{generated}/api/enums/VkDescriptorUpdateTemplateType.txt[]
-
-ifdef::VK_KHR_descriptor_update_template[]
-or the equivalent
-
-include::{generated}/api/enums/VkDescriptorUpdateTemplateTypeKHR.txt[]
-endif::VK_KHR_descriptor_update_template[]
-
-  * ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET specifies that
-    the descriptor update template will be used for descriptor set updates
-    only.
-ifdef::VK_KHR_push_descriptor[]
-  * ename:VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR specifies
-    that the descriptor update template will be used for push descriptor
-    updates only.
-endif::VK_KHR_push_descriptor[]
---
-
-
-[open,refpage='VkDescriptorUpdateTemplateEntry',desc='Describes a single descriptor update of the descriptor update template',type='structs']
---
-The sname:VkDescriptorUpdateTemplateEntry structure is defined as:
-include::{generated}/api/structs/VkDescriptorUpdateTemplateEntry.txt[]
-
-ifdef::VK_KHR_descriptor_update_template[]
-or the equivalent
-
-include::{generated}/api/structs/VkDescriptorUpdateTemplateEntryKHR.txt[]
-endif::VK_KHR_descriptor_update_template[]
-
-  * pname:dstBinding is the descriptor binding to update when using this
-    descriptor update template.
-  * pname:dstArrayElement is the starting element in the array belonging to
-    pname:dstBinding.
-ifdef::VK_EXT_inline_uniform_block[]
-    If the descriptor binding identified by pname:dstBinding has a
-    descriptor type of ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
-    then pname:dstArrayElement specifies the starting byte offset to update.
-endif::VK_EXT_inline_uniform_block[]
-  * pname:descriptorCount is the number of descriptors to update.
-    If pname:descriptorCount is greater than the number of remaining array
-    elements in the destination binding, those affect consecutive bindings
-    in a manner similar to slink:VkWriteDescriptorSet above.
-ifdef::VK_EXT_inline_uniform_block[]
-    If the descriptor binding identified by pname:dstBinding has a
-    descriptor type of ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
-    then pname:descriptorCount specifies the number of bytes to update and
-    the remaining array elements in the destination binding refer to the
-    remaining number of bytes in it.
-endif::VK_EXT_inline_uniform_block[]
-  * pname:descriptorType is a elink:VkDescriptorType specifying the type of
-    the descriptor.
-  * pname:offset is the offset in bytes of the first binding in the raw data
-    structure.
-  * pname:stride is the stride in bytes between two consecutive array
-    elements of the descriptor update informations in the raw data
-    structure.
-    The actual pointer ptr for each array element j of update entry i is
-    computed using the following formula:
-+
-[source,c++]
-~~~~
-    const char *ptr = (const char *)pData + pDescriptorUpdateEntries[i].offset + j * pDescriptorUpdateEntries[i].stride
-~~~~
-+
-The stride is useful in case the bindings are stored in structs along with
-other data.
-ifdef::VK_EXT_inline_uniform_block[]
-If pname:descriptorType is ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
-then the value of pname:stride is ignored and the stride is assumed to be
-`1`, i.e. the descriptor update information for them is always specified as
-a contiguous range.
-endif::VK_EXT_inline_uniform_block[]
-
-.Valid Usage
-****
-  * [[VUID-VkDescriptorUpdateTemplateEntry-dstBinding-00354]]
-    pname:dstBinding must: be a valid binding in the descriptor set layout
-    implicitly specified when using a descriptor update template to update
-    descriptors
-  * [[VUID-VkDescriptorUpdateTemplateEntry-dstArrayElement-00355]]
-    pname:dstArrayElement and pname:descriptorCount must: be less than or
-    equal to the number of array elements in the descriptor set binding
-    implicitly specified when using a descriptor update template to update
-    descriptors, and all applicable consecutive bindings, as described by
-    <<descriptorsets-updates-consecutive>>
-ifdef::VK_EXT_inline_uniform_block[]
-  * [[VUID-VkDescriptorUpdateTemplateEntry-descriptor-02226]]
-    If pname:descriptor type is
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:dstArrayElement
-    must: be an integer multiple of `4`
-  * [[VUID-VkDescriptorUpdateTemplateEntry-descriptor-02227]]
-    If pname:descriptor type is
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, pname:descriptorCount
-    must: be an integer multiple of `4`
-endif::VK_EXT_inline_uniform_block[]
-****
-
-include::{generated}/validity/structs/VkDescriptorUpdateTemplateEntry.txt[]
---
-
-[open,refpage='vkDestroyDescriptorUpdateTemplate',desc='Destroy a descriptor update template object',type='protos']
---
-To destroy a descriptor update template, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkDestroyDescriptorUpdateTemplate.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_descriptor_update_template[or the equivalent command]
-
-ifdef::VK_KHR_descriptor_update_template[]
-include::{generated}/api/protos/vkDestroyDescriptorUpdateTemplateKHR.txt[]
-endif::VK_KHR_descriptor_update_template[]
-
-  * pname:device is the logical device that has been used to create the
-    descriptor update template
-  * pname:descriptorUpdateTemplate is the descriptor update template to
-    destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00356]]
-    If sname:VkAllocationCallbacks were provided when
-    pname:descriptorUpdateTemplate was created, a compatible set of
-    callbacks must: be provided here
-  * [[VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00357]]
-    If no sname:VkAllocationCallbacks were provided when
-    pname:descriptorUpdateTemplate was created, pname:pAllocator must: be
-    `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyDescriptorUpdateTemplate.txt[]
---
-
-[open,refpage='vkUpdateDescriptorSetWithTemplate',desc='Update the contents of a descriptor set object using an update template',type='protos']
---
-Once a sname:VkDescriptorUpdateTemplate has been created, descriptor sets
-can: be updated by calling:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkUpdateDescriptorSetWithTemplate.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_descriptor_update_template[or the equivalent command]
-
-ifdef::VK_KHR_descriptor_update_template[]
-include::{generated}/api/protos/vkUpdateDescriptorSetWithTemplateKHR.txt[]
-endif::VK_KHR_descriptor_update_template[]
-
-  * pname:device is the logical device that updates the descriptor set.
-  * pname:descriptorSet is the descriptor set to update
-  * pname:descriptorUpdateTemplate is a slink:VkDescriptorUpdateTemplate
-    object specifying the update mapping between pname:pData and the
-    descriptor set to update.
-  * pname:pData is a pointer to memory containing one or more
-    slink:VkDescriptorImageInfo, slink:VkDescriptorBufferInfo, or
-    slink:VkBufferView structures
-ifdef::VK_KHR_acceleration_structure[or slink:VkAccelerationStructureKHR]
-ifdef::VK_NV_ray_tracing[or slink:VkAccelerationStructureNV]
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[handles]
-    used to write the descriptors.
-
-.Valid Usage
-****
-  * [[VUID-vkUpdateDescriptorSetWithTemplate-pData-01685]]
-    pname:pData must: be a valid pointer to a memory containing one or more
-    valid instances of slink:VkDescriptorImageInfo,
-    slink:VkDescriptorBufferInfo, or slink:VkBufferView in a layout defined
-    by pname:descriptorUpdateTemplate when it was created with
-    flink:vkCreateDescriptorUpdateTemplate
-****
-
-include::{generated}/validity/protos/vkUpdateDescriptorSetWithTemplate.txt[]
-
-.API example
-[source,c++]
-~~~~
-struct AppBufferView {
-    VkBufferView bufferView;
-    uint32_t     applicationRelatedInformation;
-};
-
-struct AppDataStructure
-{
-    VkDescriptorImageInfo  imageInfo;          // a single image info
-    VkDescriptorBufferInfo bufferInfoArray[3]; // 3 buffer infos in an array
-    AppBufferView          bufferView[2];      // An application defined structure containing a bufferView
-    // ... some more application related data
-};
-
-const VkDescriptorUpdateTemplateEntry descriptorUpdateTemplateEntries[] =
-{
-    // binding to a single image descriptor
-    {
-        0,                                           // binding
-        0,                                           // dstArrayElement
-        1,                                           // descriptorCount
-        VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,   // descriptorType
-        offsetof(AppDataStructure, imageInfo),       // offset
-        0                                            // stride is not required if descriptorCount is 1
-    },
-
-    // binding to an array of buffer descriptors
-    {
-        1,                                           // binding
-        0,                                           // dstArrayElement
-        3,                                           // descriptorCount
-        VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,           // descriptorType
-        offsetof(AppDataStructure, bufferInfoArray), // offset
-        sizeof(VkDescriptorBufferInfo)               // stride, descriptor buffer infos are compact
-    },
-
-    // binding to an array of buffer views
-    {
-        2,                                           // binding
-        0,                                           // dstArrayElement
-        2,                                           // descriptorCount
-        VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,     // descriptorType
-        offsetof(AppDataStructure, bufferView) +
-          offsetof(AppBufferView, bufferView),       // offset
-        sizeof(AppBufferView)                        // stride, bufferViews do not have to be compact
-    },
-};
-
-// create a descriptor update template for descriptor set updates
-const VkDescriptorUpdateTemplateCreateInfo createInfo =
-{
-    VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO,  // sType
-    NULL,                                                      // pNext
-    0,                                                         // flags
-    3,                                                         // descriptorUpdateEntryCount
-    descriptorUpdateTemplateEntries,                           // pDescriptorUpdateEntries
-    VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET,         // templateType
-    myLayout,                                                  // descriptorSetLayout
-    0,                                                         // pipelineBindPoint, ignored by given templateType
-    0,                                                         // pipelineLayout, ignored by given templateType
-    0,                                                         // set, ignored by given templateType
-};
-
-VkDescriptorUpdateTemplate myDescriptorUpdateTemplate;
-myResult = vkCreateDescriptorUpdateTemplate(
-    myDevice,
-    &createInfo,
-    NULL,
-    &myDescriptorUpdateTemplate);
-
-AppDataStructure appData;
-
-// fill appData here or cache it in your engine
-vkUpdateDescriptorSetWithTemplate(myDevice, myDescriptorSet, myDescriptorUpdateTemplate, &appData);
-~~~~
---
-endif::VK_VERSION_1_1,VK_KHR_descriptor_update_template[]
-
-
-[[descriptorsets-binding]]
-=== Descriptor Set Binding
-
-[open,refpage='vkCmdBindDescriptorSets',desc='Binds descriptor sets to a command buffer',type='protos']
---
-To bind one or more descriptor sets to a command buffer, call:
-
-include::{generated}/api/protos/vkCmdBindDescriptorSets.txt[]
-
-  * pname:commandBuffer is the command buffer that the descriptor sets will
-    be bound to.
-  * pname:pipelineBindPoint is a elink:VkPipelineBindPoint indicating the
-    type of the pipeline that will use the descriptors.
-    There is a separate set of bind points for each pipeline type, so
-    binding one does not disturb the others.
-  * pname:layout is a slink:VkPipelineLayout object used to program the
-    bindings.
-  * pname:firstSet is the set number of the first descriptor set to be
-    bound.
-  * pname:descriptorSetCount is the number of elements in the
-    pname:pDescriptorSets array.
-  * pname:pDescriptorSets is a pointer to an array of handles to
-    slink:VkDescriptorSet objects describing the descriptor sets to bind to.
-  * pname:dynamicOffsetCount is the number of dynamic offsets in the
-    pname:pDynamicOffsets array.
-  * pname:pDynamicOffsets is a pointer to an array of code:uint32_t values
-    specifying dynamic offsets.
-
-fname:vkCmdBindDescriptorSets causes the sets numbered [pname:firstSet..
-pname:firstSet+pname:descriptorSetCount-1] to use the bindings stored in
-pname:pDescriptorSets[0..descriptorSetCount-1] for subsequent
-<<pipeline-bindpoint-commands, bound pipeline commands>> set by
-pname:pipelineBindPoint.
-Any bindings that were previously applied via these sets are no longer
-valid.
-
-Once bound, a descriptor set affects rendering of subsequent commands that
-interact with the given pipeline type in the command buffer until either a
-different set is bound to the same set number, or the set is disturbed as
-described in <<descriptorsets-compatibility, Pipeline Layout
-Compatibility>>.
-
-A compatible descriptor set must: be bound for all set numbers that any
-shaders in a pipeline access, at the time that a drawing or dispatching
-command is recorded to execute using that pipeline.
-However, if none of the shaders in a pipeline statically use any bindings
-with a particular set number, then no descriptor set need be bound for that
-set number, even if the pipeline layout includes a non-trivial descriptor
-set layout for that set number.
-
-[[descriptorsets-binding-dynamicoffsets]]
-If any of the sets being bound include dynamic uniform or storage buffers,
-then pname:pDynamicOffsets includes one element for each array element in
-each dynamic descriptor type binding in each set.
-Values are taken from pname:pDynamicOffsets in an order such that all
-entries for set N come before set N+1; within a set, entries are ordered by
-the binding numbers in the descriptor set layouts; and within a binding
-array, elements are in order.
-pname:dynamicOffsetCount must: equal the total number of dynamic descriptors
-in the sets being bound.
-
-The effective offset used for dynamic uniform and storage buffer bindings is
-the sum of the relative offset taken from pname:pDynamicOffsets, and the
-base address of the buffer plus base offset in the descriptor set.
-The range of the dynamic uniform and storage buffer bindings is the buffer
-range as specified in the descriptor set.
-
-Each of the pname:pDescriptorSets must: be compatible with the pipeline
-layout specified by pname:layout.
-The layout used to program the bindings must: also be compatible with the
-pipeline used in subsequent <<pipeline-bindpoint-commands, bound pipeline
-commands>> with that pipeline type, as defined in the
-<<descriptorsets-compatibility, Pipeline Layout Compatibility>> section.
-
-The descriptor set contents bound by a call to fname:vkCmdBindDescriptorSets
-may: be consumed at the following times:
-
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * For descriptor bindings created with the
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT bit set, the contents
-    may: be consumed when the command buffer is submitted to a queue, or
-    during shader execution of the resulting draws and dispatches, or any
-    time in between.
-    Otherwise,
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * during host execution of the command, or during shader execution of the
-    resulting draws and dispatches, or any time in between.
-
-Thus, the contents of a descriptor set binding must: not be altered
-(overwritten by an update command, or freed) between the first point in time
-that it may: be consumed, and when the command completes executing on the
-queue.
-
-The contents of pname:pDynamicOffsets are consumed immediately during
-execution of fname:vkCmdBindDescriptorSets.
-Once all pending uses have completed, it is legal to update and reuse a
-descriptor set.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBindDescriptorSets-pDescriptorSets-00358]]
-    Each element of pname:pDescriptorSets must: have been allocated with a
-    sname:VkDescriptorSetLayout that matches (is the same as, or identically
-    defined as) the sname:VkDescriptorSetLayout at set _n_ in pname:layout,
-    where _n_ is the sum of pname:firstSet and the index into
-    pname:pDescriptorSets
-  * [[VUID-vkCmdBindDescriptorSets-dynamicOffsetCount-00359]]
-    pname:dynamicOffsetCount must: be equal to the total number of dynamic
-    descriptors in pname:pDescriptorSets
-  * [[VUID-vkCmdBindDescriptorSets-firstSet-00360]]
-    The sum of pname:firstSet and pname:descriptorSetCount must: be less
-    than or equal to slink:VkPipelineLayoutCreateInfo::pname:setLayoutCount
-    provided when pname:layout was created
-  * [[VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361]]
-    pname:pipelineBindPoint must: be supported by the pname:commandBuffer's
-    parent sname:VkCommandPool's queue family
-  * [[VUID-vkCmdBindDescriptorSets-pDynamicOffsets-01971]]
-    Each element of pname:pDynamicOffsets which corresponds to a descriptor
-    binding with type ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC must:
-    be a multiple of
-    sname:VkPhysicalDeviceLimits::pname:minUniformBufferOffsetAlignment
-  * [[VUID-vkCmdBindDescriptorSets-pDynamicOffsets-01972]]
-    Each element of pname:pDynamicOffsets which corresponds to a descriptor
-    binding with type ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC must:
-    be a multiple of
-    sname:VkPhysicalDeviceLimits::pname:minStorageBufferOffsetAlignment
-  * [[VUID-vkCmdBindDescriptorSets-pDescriptorSets-01979]]
-    For each dynamic uniform or storage buffer binding in
-    pname:pDescriptorSets, the sum of the effective offset, as defined
-    above, and the range of the binding must: be less than or equal to the
-    size of the buffer
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * [[VUID-vkCmdBindDescriptorSets-pDescriptorSets-04616]]
-    Each element of pname:pDescriptorSets must: not have been allocated from
-    a sname:VkDescriptorPool with the
-    ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE flag set
-endif::VK_VALVE_mutable_descriptor_type[]
-****
-
-include::{generated}/validity/protos/vkCmdBindDescriptorSets.txt[]
---
-
-
-ifdef::VK_KHR_push_descriptor[]
-[[descriptorsets-push-descriptors]]
-=== Push Descriptor Updates
-
-[open,refpage='vkCmdPushDescriptorSetKHR',desc='Pushes descriptor updates into a command buffer',type='protos']
---
-In addition to allocating descriptor sets and binding them to a command
-buffer, an application can: record descriptor updates into the command
-buffer.
-
-To push descriptor updates into a command buffer, call:
-
-include::{generated}/api/protos/vkCmdPushDescriptorSetKHR.txt[]
-
-  * pname:commandBuffer is the command buffer that the descriptors will be
-    recorded in.
-  * pname:pipelineBindPoint is a elink:VkPipelineBindPoint indicating the
-    type of the pipeline that will use the descriptors.
-    There is a separate set of push descriptor bindings for each pipeline
-    type, so binding one does not disturb the others.
-  * pname:layout is a slink:VkPipelineLayout object used to program the
-    bindings.
-  * pname:set is the set number of the descriptor set in the pipeline layout
-    that will be updated.
-  * pname:descriptorWriteCount is the number of elements in the
-    pname:pDescriptorWrites array.
-  * pname:pDescriptorWrites is a pointer to an array of
-    slink:VkWriteDescriptorSet structures describing the descriptors to be
-    updated.
-
-_Push descriptors_ are a small bank of descriptors whose storage is
-internally managed by the command buffer rather than being written into a
-descriptor set and later bound to a command buffer.
-Push descriptors allow for incremental updates of descriptors without
-managing the lifetime of descriptor sets.
-
-When a command buffer begins recording, all push descriptors are undefined:.
-Push descriptors can: be updated incrementally and cause shaders to use the
-updated descriptors for subsequent <<pipeline-bindpoint-commands, bound
-pipeline commands>> with the pipeline type set by pname:pipelineBindPoint
-until the descriptor is overwritten, or else until the set is disturbed as
-described in <<descriptorsets-compatibility, Pipeline Layout
-Compatibility>>.
-When the set is disturbed or push descriptors with a different descriptor
-set layout are set, all push descriptors are undefined:.
-
-Push descriptors that are <<shaders-staticuse,statically used>> by a
-pipeline must: not be undefined: at the time that a drawing or dispatching
-command is recorded to execute using that pipeline.
-This includes immutable sampler descriptors, which must: be pushed before
-they are accessed by a pipeline (the immutable samplers are pushed, rather
-than the samplers in pname:pDescriptorWrites).
-Push descriptors that are not statically used can: remain undefined:.
-
-Push descriptors do not use dynamic offsets.
-Instead, the corresponding non-dynamic descriptor types can: be used and the
-pname:offset member of slink:VkDescriptorBufferInfo can: be changed each
-time the descriptor is written.
-
-Each element of pname:pDescriptorWrites is interpreted as in
-slink:VkWriteDescriptorSet, except the pname:dstSet member is ignored.
-
-To push an immutable sampler, use a slink:VkWriteDescriptorSet with
-pname:dstBinding and pname:dstArrayElement selecting the immutable sampler's
-binding.
-If the descriptor type is ename:VK_DESCRIPTOR_TYPE_SAMPLER, the
-pname:pImageInfo parameter is ignored and the immutable sampler is taken
-from the push descriptor set layout in the pipeline layout.
-If the descriptor type is ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-the pname:sampler member of the pname:pImageInfo parameter is ignored and
-the immutable sampler is taken from the push descriptor set layout in the
-pipeline layout.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363]]
-    pname:pipelineBindPoint must: be supported by the pname:commandBuffer's
-    parent sname:VkCommandPool's queue family
-  * [[VUID-vkCmdPushDescriptorSetKHR-set-00364]]
-    pname:set must: be less than
-    slink:VkPipelineLayoutCreateInfo::pname:setLayoutCount provided when
-    pname:layout was created
-  * [[VUID-vkCmdPushDescriptorSetKHR-set-00365]]
-    pname:set must: be the unique set number in the pipeline layout that
-    uses a descriptor set layout that was created with
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR
-****
-
-include::{generated}/validity/protos/vkCmdPushDescriptorSetKHR.txt[]
-
---
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_descriptor_update_template[]
-=== Push Descriptor Updates with Descriptor Update Templates
-
-[open,refpage='vkCmdPushDescriptorSetWithTemplateKHR',desc='Pushes descriptor updates into a command buffer using a descriptor update template',type='protos']
---
-It is also possible to use a descriptor update template to specify the push
-descriptors to update.
-To do so, call:
-
-include::{generated}/api/protos/vkCmdPushDescriptorSetWithTemplateKHR.txt[]
-
-  * pname:commandBuffer is the command buffer that the descriptors will be
-    recorded in.
-  * pname:descriptorUpdateTemplate is a descriptor update template defining
-    how to interpret the descriptor information in pname:pData.
-  * pname:layout is a slink:VkPipelineLayout object used to program the
-    bindings.
-    It must: be compatible with the layout used to create the
-    pname:descriptorUpdateTemplate handle.
-  * pname:set is the set number of the descriptor set in the pipeline layout
-    that will be updated.
-    This must: be the same number used to create the
-    pname:descriptorUpdateTemplate handle.
-  * pname:pData is a pointer to memory containing descriptors for the
-    templated update.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-00366]]
-    The pname:pipelineBindPoint specified during the creation of the
-    descriptor update template must: be supported by the
-    pname:commandBuffer's parent sname:VkCommandPool's queue family
-  * [[VUID-vkCmdPushDescriptorSetWithTemplateKHR-pData-01686]]
-    pname:pData must: be a valid pointer to a memory containing one or more
-    valid instances of slink:VkDescriptorImageInfo,
-    slink:VkDescriptorBufferInfo, or slink:VkBufferView in a layout defined
-    by pname:descriptorUpdateTemplate when it was created with
-    flink:vkCreateDescriptorUpdateTemplate
-****
-
-include::{generated}/validity/protos/vkCmdPushDescriptorSetWithTemplateKHR.txt[]
-
-.API example
-[source,c++]
-~~~~
-
-struct AppDataStructure
-{
-    VkDescriptorImageInfo  imageInfo;          // a single image info
-    // ... some more application related data
-};
-
-const VkDescriptorUpdateTemplateEntry descriptorUpdateTemplateEntries[] =
-{
-    // binding to a single image descriptor
-    {
-        0,                                           // binding
-        0,                                           // dstArrayElement
-        1,                                           // descriptorCount
-        VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,   // descriptorType
-        offsetof(AppDataStructure, imageInfo),       // offset
-        0                                            // stride is not required if descriptorCount is 1
-    }
-};
-
-// create a descriptor update template for push descriptor set updates
-const VkDescriptorUpdateTemplateCreateInfo createInfo =
-{
-    VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO,  // sType
-    NULL,                                                      // pNext
-    0,                                                         // flags
-    1,                                                         // descriptorUpdateEntryCount
-    descriptorUpdateTemplateEntries,                           // pDescriptorUpdateEntries
-    VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR,   // templateType
-    0,                                                         // descriptorSetLayout, ignored by given templateType
-    VK_PIPELINE_BIND_POINT_GRAPHICS,                           // pipelineBindPoint
-    myPipelineLayout,                                          // pipelineLayout
-    0,                                                         // set
-};
-
-VkDescriptorUpdateTemplate myDescriptorUpdateTemplate;
-myResult = vkCreateDescriptorUpdateTemplate(
-    myDevice,
-    &createInfo,
-    NULL,
-    &myDescriptorUpdateTemplate);
-
-AppDataStructure appData;
-// fill appData here or cache it in your engine
-vkCmdPushDescriptorSetWithTemplateKHR(myCmdBuffer, myDescriptorUpdateTemplate, myPipelineLayout, 0,&appData);
-~~~~
---
-endif::VK_VERSION_1_1,VK_KHR_descriptor_update_template[]
-endif::VK_KHR_push_descriptor[]
-
-
-[[descriptorsets-push-constants]]
-=== Push Constant Updates
-
-As described above in section <<descriptorsets-pipelinelayout, Pipeline
-Layouts>>, the pipeline layout defines shader push constants which are
-updated via Vulkan commands rather than via writes to memory or copy
-commands.
-
-[NOTE]
-.Note
-====
-Push constants represent a high speed path to modify constant data in
-pipelines that is expected to outperform memory-backed resource updates.
-====
-
-[open,refpage='vkCmdPushConstants',desc='Update the values of push constants',type='protos']
---
-To update push constants, call:
-
-include::{generated}/api/protos/vkCmdPushConstants.txt[]
-
-  * pname:commandBuffer is the command buffer in which the push constant
-    update will be recorded.
-  * pname:layout is the pipeline layout used to program the push constant
-    updates.
-  * pname:stageFlags is a bitmask of elink:VkShaderStageFlagBits specifying
-    the shader stages that will use the push constants in the updated range.
-  * pname:offset is the start offset of the push constant range to update,
-    in units of bytes.
-  * pname:size is the size of the push constant range to update, in units of
-    bytes.
-  * pname:pValues is a pointer to an array of pname:size bytes containing
-    the new push constant values.
-
-When a command buffer begins recording, all push constant values are
-undefined:.
-ifdef::VK_KHR_maintenance4[]
-Reads of undefined: push constant values by the executing shader return
-undefined: values.
-endif::VK_KHR_maintenance4[]
-
-Push constant values can: be updated incrementally, causing shader stages in
-pname:stageFlags to read the new data from pname:pValues for push constants
-modified by this command, while still reading the previous data for push
-constants not modified by this command.
-When a <<pipeline-bindpoint-commands, bound pipeline command>> is issued,
-the bound pipeline's layout must: be compatible with the layouts used to set
-the values of all push constants in the pipeline layout's push constant
-ranges, as described in <<descriptorsets-compatibility,Pipeline Layout
-Compatibility>>.
-Binding a pipeline with a layout that is not compatible with the push
-constant layout does not disturb the push constant values.
-
-[NOTE]
-.Note
-====
-As pname:stageFlags needs to include all flags the relevant push constant
-ranges were created with, any flags that are not supported by the queue
-family that the slink:VkCommandPool used to allocate pname:commandBuffer was
-created on are ignored.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkCmdPushConstants-offset-01795]]
-    For each byte in the range specified by pname:offset and pname:size and
-    for each shader stage in pname:stageFlags, there must: be a push
-    constant range in pname:layout that includes that byte and that stage
-  * [[VUID-vkCmdPushConstants-offset-01796]]
-    For each byte in the range specified by pname:offset and pname:size and
-    for each push constant range that overlaps that byte, pname:stageFlags
-    must: include all stages in that push constant range's
-    slink:VkPushConstantRange::pname:stageFlags
-  * [[VUID-vkCmdPushConstants-offset-00368]]
-    pname:offset must: be a multiple of `4`
-  * [[VUID-vkCmdPushConstants-size-00369]]
-    pname:size must: be a multiple of `4`
-  * [[VUID-vkCmdPushConstants-offset-00370]]
-    pname:offset must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxPushConstantsSize
-  * [[VUID-vkCmdPushConstants-size-00371]]
-    pname:size must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPushConstantsSize minus
-    pname:offset
-****
-
-include::{generated}/validity/protos/vkCmdPushConstants.txt[]
---
-
-
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-[[descriptorsets-physical-storage-buffer]]
-== Physical Storage Buffer Access
-
-[open,refpage='vkGetBufferDeviceAddress',desc='Query an address of a buffer',type='protos',alias='vkGetBufferDeviceAddressKHR']
---
-To query a 64-bit buffer device address value through which buffer memory
-can: be accessed in a shader, call:
-
-ifdef::VK_VERSION_1_2[]
-include::{generated}/api/protos/vkGetBufferDeviceAddress.txt[]
-endif::VK_VERSION_1_2[]
-
-ifdef::VK_VERSION_1_2+VK_KHR_buffer_device_address[or the equivalent command]
-
-ifdef::VK_KHR_buffer_device_address[]
-include::{generated}/api/protos/vkGetBufferDeviceAddressKHR.txt[]
-endif::VK_KHR_buffer_device_address[]
-
-// @Jon: 3-way conditional logic here is wrong
-
-ifdef::VK_EXT_buffer_device_address[]
-or the equivalent command
-
-include::{generated}/api/protos/vkGetBufferDeviceAddressEXT.txt[]
-endif::VK_EXT_buffer_device_address[]
-
-  * pname:device is the logical device that the buffer was created on.
-  * pname:pInfo is a pointer to a slink:VkBufferDeviceAddressInfo structure
-    specifying the buffer to retrieve an address for.
-
-The 64-bit return value is an address of the start of pname:pInfo->buffer.
-The address range starting at this value and whose size is the size of the
-buffer can: be used in a shader to access the memory bound to that buffer,
-using the
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-`SPV_KHR_physical_storage_buffer` extension
-ifdef::VK_EXT_buffer_device_address[or the equivalent]
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-ifdef::VK_EXT_buffer_device_address[]
-`SPV_EXT_physical_storage_buffer` extension
-endif::VK_EXT_buffer_device_address[]
-and the code:PhysicalStorageBuffer storage class.
-For example, this value can: be stored in a uniform buffer, and the shader
-can: read the value from the uniform buffer and use it to do a dependent
-read/write to this buffer.
-A value of zero is reserved as a "`null`" pointer and must: not be returned
-as a valid buffer device address.
-All loads, stores, and atomics in a shader through
-code:PhysicalStorageBuffer pointers must: access addresses in the address
-range of some buffer.
-
-If the buffer was created with a non-zero value of
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-slink:VkBufferOpaqueCaptureAddressCreateInfo::pname:opaqueCaptureAddress
-ifdef::VK_EXT_buffer_device_address[or]
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-ifdef::VK_EXT_buffer_device_address[]
-slink:VkBufferDeviceAddressCreateInfoEXT::pname:deviceAddress
-endif::VK_EXT_buffer_device_address[]
-the return value will be the same address that was returned at capture time.
-
-.Valid Usage
-****
-  * [[VUID-vkGetBufferDeviceAddress-bufferDeviceAddress-03324]]
-    The <<features-bufferDeviceAddress,bufferDeviceAddress>> or
-    <<features-bufferDeviceAddressEXT,sname:VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::pname:bufferDeviceAddress>>
-    feature must: be enabled
-  * [[VUID-vkGetBufferDeviceAddress-device-03325]]
-    If pname:device was created with multiple physical devices, then the
-    <<features-bufferDeviceAddressMultiDevice,bufferDeviceAddressMultiDevice>>
-    or
-    <<features-bufferDeviceAddressMultiDeviceEXT,sname:VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::pname:bufferDeviceAddressMultiDevice>>
-    feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkGetBufferDeviceAddress.txt[]
---
-
-[open,refpage='VkBufferDeviceAddressInfo',desc='Structure specifying the buffer to query an address for',type='structs',alias='VkBufferDeviceAddressInfoKHR,VkBufferDeviceAddressInfoEXT']
---
-The sname:VkBufferDeviceAddressInfo structure is defined as:
-
-include::{generated}/api/structs/VkBufferDeviceAddressInfo.txt[]
-
-ifdef::VK_KHR_buffer_device_address[]
-or the equivalent
-
-include::{generated}/api/structs/VkBufferDeviceAddressInfoKHR.txt[]
-endif::VK_KHR_buffer_device_address[]
-
-// @Jon: three-way conditional logic is broken
-ifdef::VK_EXT_buffer_device_address[]
-or the equivalent
-
-include::{generated}/api/structs/VkBufferDeviceAddressInfoEXT.txt[]
-endif::VK_EXT_buffer_device_address[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:buffer specifies the buffer whose address is being queried.
-
-.Valid Usage
-****
-  * [[VUID-VkBufferDeviceAddressInfo-buffer-02600]]
-    If pname:buffer is non-sparse and was not created with the
-    ename:VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT flag, then it
-    must: be bound completely and contiguously to a single
-    sname:VkDeviceMemory object
-  * [[VUID-VkBufferDeviceAddressInfo-buffer-02601]]
-    pname:buffer must: have been created with
-    ename:VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT
-****
-
-include::{generated}/validity/structs/VkBufferDeviceAddressInfo.txt[]
---
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-[open,refpage='vkGetBufferOpaqueCaptureAddress',desc='Query an opaque capture address of a buffer',type='protos',alias='vkGetBufferOpaqueCaptureAddressKHR']
---
-To query a 64-bit buffer opaque capture address, call:
-
-ifdef::VK_VERSION_1_2[]
-include::{generated}/api/protos/vkGetBufferOpaqueCaptureAddress.txt[]
-endif::VK_VERSION_1_2[]
-
-ifdef::VK_VERSION_1_2+VK_KHR_buffer_device_address[or the equivalent command]
-
-ifdef::VK_KHR_buffer_device_address[]
-include::{generated}/api/protos/vkGetBufferOpaqueCaptureAddressKHR.txt[]
-endif::VK_KHR_buffer_device_address[]
-
-  * pname:device is the logical device that the buffer was created on.
-  * pname:pInfo is a pointer to a slink:VkBufferDeviceAddressInfo structure
-    specifying the buffer to retrieve an address for.
-
-The 64-bit return value is an opaque capture address of the start of
-pname:pInfo->buffer.
-
-If the buffer was created with a non-zero value of
-slink:VkBufferOpaqueCaptureAddressCreateInfo::pname:opaqueCaptureAddress the
-return value must: be the same address.
-
-.Valid Usage
-****
-  * [[VUID-vkGetBufferOpaqueCaptureAddress-None-03326]]
-    The <<features-bufferDeviceAddress,bufferDeviceAddress>> feature must:
-    be enabled
-  * [[VUID-vkGetBufferOpaqueCaptureAddress-device-03327]]
-    If pname:device was created with multiple physical devices, then the
-    <<features-bufferDeviceAddressMultiDevice,bufferDeviceAddressMultiDevice>>
-    feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkGetBufferOpaqueCaptureAddress.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
diff --git a/registry/vulkan/chapters/devsandqueues.txt b/registry/vulkan/chapters/devsandqueues.txt
deleted file mode 100644
index 1051739..0000000
--- a/registry/vulkan/chapters/devsandqueues.txt
+++ /dev/null
@@ -1,2578 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[devsandqueues]]
-= Devices and Queues
-
-Once Vulkan is initialized, devices and queues are the primary objects used
-to interact with a Vulkan implementation.
-
-[open,refpage='VkPhysicalDevice',desc='Opaque handle to a physical device object',type='handles']
---
-Vulkan separates the concept of _physical_ and _logical_ devices.
-A physical device usually represents a single complete implementation of
-Vulkan (excluding instance-level functionality) available to the host, of
-which there are a finite number.
-A logical device represents an instance of that implementation with its own
-state and resources independent of other logical devices.
-
-Physical devices are represented by sname:VkPhysicalDevice handles:
-
-include::{generated}/api/handles/VkPhysicalDevice.txt[]
---
-
-
-[[devsandqueues-physical-device-enumeration]]
-== Physical Devices
-
-[open,refpage='vkEnumeratePhysicalDevices',desc='Enumerates the physical devices accessible to a Vulkan instance',type='protos']
---
-To retrieve a list of physical device objects representing the physical
-devices installed in the system, call:
-
-include::{generated}/api/protos/vkEnumeratePhysicalDevices.txt[]
-
-  * pname:instance is a handle to a Vulkan instance previously created with
-    flink:vkCreateInstance.
-  * pname:pPhysicalDeviceCount is a pointer to an integer related to the
-    number of physical devices available or queried, as described below.
-  * pname:pPhysicalDevices is either `NULL` or a pointer to an array of
-    sname:VkPhysicalDevice handles.
-
-If pname:pPhysicalDevices is `NULL`, then the number of physical devices
-available is returned in pname:pPhysicalDeviceCount.
-Otherwise, pname:pPhysicalDeviceCount must: point to a variable set by the
-user to the number of elements in the pname:pPhysicalDevices array, and on
-return the variable is overwritten with the number of handles actually
-written to pname:pPhysicalDevices.
-If pname:pPhysicalDeviceCount is less than the number of physical devices
-available, at most pname:pPhysicalDeviceCount structures will be written,
-and ename:VK_INCOMPLETE will be returned instead of ename:VK_SUCCESS, to
-indicate that not all the available physical devices were returned.
-
-include::{generated}/validity/protos/vkEnumeratePhysicalDevices.txt[]
---
-
-[open,refpage='vkGetPhysicalDeviceProperties',desc='Returns properties of a physical device',type='protos']
---
-To query general properties of physical devices once enumerated, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceProperties.txt[]
-
-  * pname:physicalDevice is the handle to the physical device whose
-    properties will be queried.
-  * pname:pProperties is a pointer to a slink:VkPhysicalDeviceProperties
-    structure in which properties are returned.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceProperties.txt[]
---
-
-[open,refpage='VkPhysicalDeviceProperties',desc='Structure specifying physical device properties',type='structs']
---
-The sname:VkPhysicalDeviceProperties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceProperties.txt[]
-
-  * pname:apiVersion is the version of Vulkan supported by the device,
-    encoded as described in <<extendingvulkan-coreversions-versionnumbers>>.
-  * pname:driverVersion is the vendor-specified version of the driver.
-  * pname:vendorID is a unique identifier for the _vendor_ (see below) of
-    the physical device.
-  * pname:deviceID is a unique identifier for the physical device among
-    devices available from the vendor.
-  * pname:deviceType is a elink:VkPhysicalDeviceType specifying the type of
-    device.
-  * pname:deviceName is an array of ename:VK_MAX_PHYSICAL_DEVICE_NAME_SIZE
-    code:char containing a null-terminated UTF-8 string which is the name of
-    the device.
-  * pname:pipelineCacheUUID is an array of ename:VK_UUID_SIZE code:uint8_t
-    values representing a universally unique identifier for the device.
-  * pname:limits is the slink:VkPhysicalDeviceLimits structure specifying
-    device-specific limits of the physical device.
-    See <<limits,Limits>> for details.
-  * pname:sparseProperties is the slink:VkPhysicalDeviceSparseProperties
-    structure specifying various sparse related properties of the physical
-    device.
-    See <<sparsememory-physicalprops,Sparse Properties>> for details.
-
-ifdef::VK_VERSION_1_1[]
-[NOTE]
-.Note
-====
-The value of pname:apiVersion may: be different than the version returned by
-flink:vkEnumerateInstanceVersion; either higher or lower.
-In such cases, the application must: not use functionality that exceeds the
-version of Vulkan associated with a given object.
-The pname:pApiVersion parameter returned by flink:vkEnumerateInstanceVersion
-is the version associated with a slink:VkInstance and its children, except
-for a slink:VkPhysicalDevice and its children.
-sname:VkPhysicalDeviceProperties::pname:apiVersion is the version associated
-with a slink:VkPhysicalDevice and its children.
-====
-endif::VK_VERSION_1_1[]
-
-[NOTE]
-.Note
-====
-The encoding of pname:driverVersion is implementation-defined.
-It may: not use the same encoding as pname:apiVersion.
-Applications should follow information from the _vendor_ on how to extract
-the version information from pname:driverVersion.
-====
-
-The pname:vendorID and pname:deviceID fields are provided to allow
-applications to adapt to device characteristics that are not adequately
-exposed by other Vulkan queries.
-
-[NOTE]
-.Note
-====
-These may: include performance profiles, hardware errata, or other
-characteristics.
-====
-
-The _vendor_ identified by pname:vendorID is the entity responsible for the
-most salient characteristics of the underlying implementation of the
-slink:VkPhysicalDevice being queried.
-
-[NOTE]
-.Note
-====
-For example, in the case of a discrete GPU implementation, this should: be
-the GPU chipset vendor.
-In the case of a hardware accelerator integrated into a system-on-chip
-(SoC), this should: be the supplier of the silicon IP used to create the
-accelerator.
-====
-
-If the vendor has a https://pcisig.com/membership/member-companies[PCI
-vendor ID], the low 16 bits of pname:vendorID must: contain that PCI vendor
-ID, and the remaining bits must: be set to zero.
-Otherwise, the value returned must: be a valid Khronos vendor ID, obtained
-as described in the <<vulkan-styleguide,Vulkan Documentation and Extensions:
-Procedures and Conventions>> document in the section "`Registering a Vendor
-ID with Khronos`".
-Khronos vendor IDs are allocated starting at 0x10000, to distinguish them
-from the PCI vendor ID namespace.
-Khronos vendor IDs are symbolically defined in the elink:VkVendorId type.
-
-The vendor is also responsible for the value returned in pname:deviceID.
-If the implementation is driven primarily by a https://pcisig.com/[PCI
-device] with a https://pcisig.com/[PCI device ID], the low 16 bits of
-pname:deviceID must: contain that PCI device ID, and the remaining bits
-must: be set to zero.
-Otherwise, the choice of what values to return may: be dictated by operating
-system or platform policies - but should: uniquely identify both the device
-version and any major configuration options (for example, core count in the
-case of multicore devices).
-
-[NOTE]
-.Note
-====
-The same device ID should: be used for all physical implementations of that
-device version and configuration.
-For example, all uses of a specific silicon IP GPU version and configuration
-should: use the same device ID, even if those uses occur in different SoCs.
-====
-
-include::{generated}/validity/structs/VkPhysicalDeviceProperties.txt[]
---
-
-[open,refpage='VkVendorId',desc='Khronos vendor IDs',type='enums']
---
-Khronos vendor IDs which may: be returned in
-slink:VkPhysicalDeviceProperties::pname:vendorID are:
-
-include::{generated}/api/enums/VkVendorId.txt[]
-
-[NOTE]
-.Note
-====
-Khronos vendor IDs may be allocated by vendors at any time.
-Only the latest canonical versions of this Specification, of the
-corresponding `vk.xml` API Registry, and of the corresponding
-`{core_header}` header file must: contain all reserved Khronos vendor IDs.
-
-Only Khronos vendor IDs are given symbolic names at present.
-PCI vendor IDs returned by the implementation can be looked up in the
-PCI-SIG database.
-====
---
-
-[open,refpage='VK_MAX_PHYSICAL_DEVICE_NAME_SIZE',desc='Length of a physical device name string',type='consts']
---
-ename:VK_MAX_PHYSICAL_DEVICE_NAME_SIZE is the length in code:char values of
-an array containing a physical device name string, as returned in
-slink:VkPhysicalDeviceProperties::deviceName.
-
-include::{generated}/api/enums/VK_MAX_PHYSICAL_DEVICE_NAME_SIZE.txt[]
---
-
-[open,refpage='VkPhysicalDeviceType',desc='Supported physical device types',type='enums']
---
-The physical device types which may: be returned in
-slink:VkPhysicalDeviceProperties::pname:deviceType are:
-
-include::{generated}/api/enums/VkPhysicalDeviceType.txt[]
-
-  * ename:VK_PHYSICAL_DEVICE_TYPE_OTHER - the device does not match any
-    other available types.
-  * ename:VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU - the device is typically
-    one embedded in or tightly coupled with the host.
-  * ename:VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU - the device is typically a
-    separate processor connected to the host via an interlink.
-  * ename:VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU - the device is typically a
-    virtual node in a virtualization environment.
-  * ename:VK_PHYSICAL_DEVICE_TYPE_CPU - the device is typically running on
-    the same processors as the host.
-
-The physical device type is advertised for informational purposes only, and
-does not directly affect the operation of the system.
-However, the device type may: correlate with other advertised properties or
-capabilities of the system, such as how many memory heaps there are.
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-[open,refpage='vkGetPhysicalDeviceProperties2',desc='Returns properties of a physical device',type='protos']
---
-To query general properties of physical devices once enumerated, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetPhysicalDeviceProperties2.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_get_physical_device_properties2[or the equivalent command]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-include::{generated}/api/protos/vkGetPhysicalDeviceProperties2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:physicalDevice is the handle to the physical device whose
-    properties will be queried.
-  * pname:pProperties is a pointer to a slink:VkPhysicalDeviceProperties2
-    structure in which properties are returned.
-
-Each structure in pname:pProperties and its pname:pNext chain contains
-members corresponding to implementation-dependent properties, behaviors, or
-limits.
-fname:vkGetPhysicalDeviceProperties2 fills in each member to specify the
-corresponding value for the implementation.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceProperties2.txt[]
---
-
-[open,refpage='VkPhysicalDeviceProperties2',desc='Structure specifying physical device properties',type='structs']
---
-The sname:VkPhysicalDeviceProperties2 structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceProperties2.txt[]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceProperties2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:properties is a slink:VkPhysicalDeviceProperties structure
-    describing properties of the physical device.
-    This structure is written with the same values as if it were written by
-    flink:vkGetPhysicalDeviceProperties.
-
-The pname:pNext chain of this structure is used to extend the structure with
-properties defined by extensions.
-
-include::{generated}/validity/structs/VkPhysicalDeviceProperties2.txt[]
---
-
-ifdef::VK_VERSION_1_2[]
-[open,refpage='VkPhysicalDeviceVulkan11Properties',desc='Structure specifying physical device properties for functionality promoted to Vulkan 1.1',type='structs']
---
-The sname:VkPhysicalDeviceVulkan11Properties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceVulkan11Properties.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-:anchor-prefix:
-include::{chapters}/devsandqueues.txt[tag=VK_KHR_external_memory_capabilities-properties]
-  * [[{anchor-prefix}limits-subgroup-size]] pname:subgroupSize is the
-    default number of invocations in each subgroup.
-    pname:subgroupSize is at least 1 if any of the physical device's queues
-    support ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT.
-    pname:subgroupSize is a power-of-two.
-  * [[{anchor-prefix}limits-subgroupSupportedStages]]
-    pname:subgroupSupportedStages is a bitfield of
-    elink:VkShaderStageFlagBits describing the shader stages that
-    <<shaders-group-operations, group operations>> with
-    <<shaders-scope-subgroup, subgroup scope>> are supported in.
-    pname:subgroupSupportedStages will have the
-    ename:VK_SHADER_STAGE_COMPUTE_BIT bit set if any of the physical
-    device's queues support ename:VK_QUEUE_COMPUTE_BIT.
-  * pname:subgroupSupportedOperations is a bitmask of
-    elink:VkSubgroupFeatureFlagBits specifying the sets of
-    <<shaders-group-operations, group operations>> with
-    <<shaders-scope-subgroup, subgroup scope>> supported on this device.
-    pname:subgroupSupportedOperations will have the
-    ename:VK_SUBGROUP_FEATURE_BASIC_BIT bit set if any of the physical
-    device's queues support ename:VK_QUEUE_GRAPHICS_BIT or
-    ename:VK_QUEUE_COMPUTE_BIT.
-  * [[{anchor-prefix}limits-subgroupQuadOperationsInAllStages]]
-    pname:subgroupQuadOperationsInAllStages is a boolean specifying whether
-    <<shaders-quad-operations,quad group operations>> are available in all
-    stages, or are restricted to fragment and compute stages.
-include::{chapters}/limits.txt[tag=VK_KHR_maintenance2-properties]
-include::{chapters}/limits.txt[tag=VK_KHR_multiview-properties]
-include::{chapters}/limits.txt[tag=VK_KHR_protected_memory-properties]
-include::{chapters}/limits.txt[tag=VK_KHR_maintenance3-properties]
-
-:refpage: VkPhysicalDeviceVulkan11Properties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-These properties correspond to Vulkan 1.1 functionality.
-
-The members of sname:VkPhysicalDeviceVulkan11Properties have the same values
-as the corresponding members of slink:VkPhysicalDeviceIDProperties,
-slink:VkPhysicalDeviceSubgroupProperties,
-slink:VkPhysicalDevicePointClippingProperties,
-slink:VkPhysicalDeviceMultiviewProperties,
-slink:VkPhysicalDeviceProtectedMemoryProperties, and
-slink:VkPhysicalDeviceMaintenance3Properties.
-
-include::{generated}/validity/structs/VkPhysicalDeviceVulkan11Properties.txt[]
---
-
-[open,refpage='VkPhysicalDeviceVulkan12Properties',desc='Structure specifying physical device properties for functionality promoted to Vulkan 1.2',type='structs']
---
-The sname:VkPhysicalDeviceVulkan12Properties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceVulkan12Properties.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-:anchor-prefix:
-include::{chapters}/devsandqueues.txt[tag=VK_KHR_driver_properties-properties]
-include::{chapters}/limits.txt[tag=VK_KHR_shader_float_controls-properties]
-include::{chapters}/limits.txt[tag=VK_EXT_descriptor_indexing-properties]
-include::{chapters}/limits.txt[tag=VK_KHR_depth_stencil_resolve-properties]
-include::{chapters}/limits.txt[tag=VK_EXT_sampler_filter_minmax-properties]
-include::{chapters}/limits.txt[tag=VK_KHR_timeline_semaphore-properties]
-  * [[limits-framebufferIntegerColorSampleCounts]]
-    pname:framebufferIntegerColorSampleCounts is a bitmask of
-    elink:VkSampleCountFlagBits indicating the color sample counts that are
-    supported for all framebuffer color attachments with integer formats.
-
-:refpage: VkPhysicalDeviceVulkan12Properties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-These properties correspond to Vulkan 1.2 functionality.
-
-The members of sname:VkPhysicalDeviceVulkan12Properties must: have the same
-values as the corresponding members of
-slink:VkPhysicalDeviceDriverProperties,
-slink:VkPhysicalDeviceFloatControlsProperties,
-slink:VkPhysicalDeviceDescriptorIndexingProperties,
-slink:VkPhysicalDeviceDepthStencilResolveProperties,
-slink:VkPhysicalDeviceSamplerFilterMinmaxProperties, and
-slink:VkPhysicalDeviceTimelineSemaphoreProperties.
-
-include::{generated}/validity/structs/VkPhysicalDeviceVulkan12Properties.txt[]
---
-endif::VK_VERSION_1_2[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory_capabilities,VK_KHR_external_semaphore_capabilities,VK_KHR_external_fence_capabilities[]
-[open,refpage='VkPhysicalDeviceIDProperties',desc='Structure specifying IDs related to the physical device',type='structs']
---
-The sname:VkPhysicalDeviceIDProperties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceIDProperties.txt[]
-
-ifdef::VK_KHR_external_memory_capabilities[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceIDPropertiesKHR.txt[]
-endif::VK_KHR_external_memory_capabilities[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_external_memory_capabilities-properties[]
-  * pname:deviceUUID is an array of ename:VK_UUID_SIZE code:uint8_t values
-    representing a universally unique identifier for the device.
-  * pname:driverUUID is an array of ename:VK_UUID_SIZE code:uint8_t values
-    representing a universally unique identifier for the driver build in use
-    by the device.
-  * pname:deviceLUID is an array of ename:VK_LUID_SIZE code:uint8_t values
-    representing a locally unique identifier for the device.
-  * pname:deviceNodeMask is a code:uint32_t bitfield identifying the node
-    within a linked device adapter corresponding to the device.
-  * pname:deviceLUIDValid is a boolean value that will be ename:VK_TRUE if
-    pname:deviceLUID contains a valid LUID and pname:deviceNodeMask contains
-    a valid node mask, and ename:VK_FALSE if they do not.
-// end::VK_KHR_external_memory_capabilities-properties[]
-
-:refpage: VkPhysicalDeviceIDProperties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-pname:deviceUUID must: be immutable for a given device across instances,
-processes, driver APIs, driver versions, and system reboots.
-
-Applications can: compare the pname:driverUUID value across instance and
-process boundaries, and can: make similar queries in external APIs to
-determine whether they are capable of sharing memory objects and resources
-using them with the device.
-
-pname:deviceUUID and/or pname:driverUUID must: be used to determine whether
-a particular external object can be shared between driver components, where
-such a restriction exists as defined in the compatibility table for the
-particular object type:
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory_capabilities[]
-  * <<external-memory-handle-types-compatibility,External memory handle
-    types compatibility>>
-endif::VK_VERSION_1_1,VK_KHR_external_memory_capabilities[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities[]
-  * <<external-semaphore-handle-types-compatibility,External semaphore
-    handle types compatibility>>
-endif::VK_VERSION_1_1,VK_KHR_external_semaphore_capabilities[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_fence_capabilities[]
-  * <<external-fence-handle-types-compatibility,External fence handle types
-    compatibility>>
-endif::VK_VERSION_1_1,VK_KHR_external_fence_capabilities[]
-
-If pname:deviceLUIDValid is ename:VK_FALSE, the values of pname:deviceLUID
-and pname:deviceNodeMask are undefined:.
-If pname:deviceLUIDValid is ename:VK_TRUE and Vulkan is running on the
-Windows operating system, the contents of pname:deviceLUID can: be cast to
-an code:LUID object and must: be equal to the locally unique identifier of a
-code:IDXGIAdapter1 object that corresponds to pname:physicalDevice.
-If pname:deviceLUIDValid is ename:VK_TRUE, pname:deviceNodeMask must:
-contain exactly one bit.
-If Vulkan is running on an operating system that supports the Direct3D 12
-API and pname:physicalDevice corresponds to an individual device in a linked
-device adapter, pname:deviceNodeMask identifies the Direct3D 12 node
-corresponding to pname:physicalDevice.
-Otherwise, pname:deviceNodeMask must: be `1`.
-
-[NOTE]
-.Note
-====
-Although they have identical descriptions,
-slink:VkPhysicalDeviceIDProperties::pname:deviceUUID may differ from
-slink:VkPhysicalDeviceProperties2::pname:pipelineCacheUUID.
-The former is intended to identify and correlate devices across API and
-driver boundaries, while the latter is used to identify a compatible device
-and driver combination to use when serializing and de-serializing pipeline
-state.
-
-Implementations should: return pname:deviceUUID values which are likely to
-be unique even in the presence of multiple Vulkan implementations (such as a
-GPU driver and a software renderer; two drivers for different GPUs; or the
-same Vulkan driver running on two logically different devices).
-
-Khronos' conformance testing can not guarantee that pname:deviceUUID values
-are actually unique, so implementors should make their own best efforts to
-ensure this.
-In particular, hard-coded pname:deviceUUID values, especially all-`0` bits,
-should: never be used.
-
-A combination of values unique to the vendor, the driver, and the hardware
-environment can be used to provide a pname:deviceUUID which is unique to a
-high degree of certainty.
-Some possible inputs to such a computation are:
-
-  * Information reported by flink:vkGetPhysicalDeviceProperties
-  * PCI device ID (if defined)
-  * PCI bus ID, or similar system configuration information.
-  * Driver binary checksums.
-====
-
-
-[NOTE]
-.Note
-====
-While slink:VkPhysicalDeviceIDProperties::pname:deviceUUID is specified to
-remain consistent across driver versions and system reboots, it is not
-intended to be usable as a serializable persistent identifier for a device.
-It may change when a device is physically added to, removed from, or moved
-to a different connector in a system while that system is powered down.
-Further, there is no reasonable way to verify with conformance testing that
-a given device retains the same UUID in a given system across all driver
-versions supported in that system.
-While implementations should make every effort to report consistent device
-UUIDs across driver versions, applications should avoid relying on the
-persistence of this value for uses other than identifying compatible devices
-for external object sharing purposes.
-====
-
-include::{generated}/validity/structs/VkPhysicalDeviceIDProperties.txt[]
---
-
-[open,refpage='VK_UUID_SIZE',desc='Length of a universally unique device or driver build identifier',type='consts']
---
-ename:VK_UUID_SIZE is the length in code:uint8_t values of an array
-containing a universally unique device or driver build identifier, as
-returned in slink:VkPhysicalDeviceIDProperties::deviceUUID and
-slink:VkPhysicalDeviceIDProperties::driverUUID.
-
-include::{generated}/api/enums/VK_UUID_SIZE.txt[]
---
-
-[open,refpage='VK_LUID_SIZE',desc='Length of a locally unique device identifier',type='consts']
---
-ename:VK_LUID_SIZE is the length in code:uint8_t values of an array
-containing a locally unique device identifier, as returned in
-slink:VkPhysicalDeviceIDProperties::deviceLUID.
-
-include::{generated}/api/enums/VK_LUID_SIZE.txt[]
-
-ifdef::VK_KHR_external_memory_capabilities,VK_KHR_external_semaphore_capabilities,VK_KHR_external_fence_capabilities[]
-or the equivalent
-
-include::{generated}/api/enums/VK_LUID_SIZE_KHR.txt[]
-endif::VK_KHR_external_memory_capabilities,VK_KHR_external_semaphore_capabilities,VK_KHR_external_fence_capabilities[]
---
-endif::VK_VERSION_1_1,VK_KHR_external_memory_capabilities,VK_KHR_external_semaphore_capabilities,VK_KHR_external_fence_capabilities[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_driver_properties[]
-[open,refpage='VkPhysicalDeviceDriverProperties',desc='Structure containing driver identification information',type='structs',alias='VkPhysicalDeviceDriverPropertiesKHR']
---
-The sname:VkPhysicalDeviceDriverProperties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceDriverProperties.txt[]
-
-ifdef::VK_KHR_driver_properties[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceDriverPropertiesKHR.txt[]
-endif::VK_KHR_driver_properties[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_driver_properties-properties[]
-  * pname:driverID is a unique identifier for the driver of the physical
-    device.
-  * pname:driverName is an array of ename:VK_MAX_DRIVER_NAME_SIZE code:char
-    containing a null-terminated UTF-8 string which is the name of the
-    driver.
-  * pname:driverInfo is an array of ename:VK_MAX_DRIVER_INFO_SIZE code:char
-    containing a null-terminated UTF-8 string with additional information
-    about the driver.
-  * pname:conformanceVersion is the version of the Vulkan conformance test
-    this driver is conformant against (see slink:VkConformanceVersion).
-// end::VK_KHR_driver_properties-properties[]
-
-:refpage: VkPhysicalDeviceDriverProperties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-These are properties of the driver corresponding to a physical device.
-
-pname:driverID must: be immutable for a given driver across instances,
-processes, driver versions, and system reboots.
-
-include::{generated}/validity/structs/VkPhysicalDeviceDriverProperties.txt[]
---
-
-[open,refpage='VkDriverId',desc='Khronos driver IDs',type='enums',alias='VkDriverIdKHR']
---
-Khronos driver IDs which may: be returned in
-slink:VkPhysicalDeviceDriverProperties::pname:driverID are:
-
-include::{generated}/api/enums/VkDriverId.txt[]
-
-ifdef::VK_KHR_driver_properties[]
-or the equivalent
-
-include::{generated}/api/enums/VkDriverIdKHR.txt[]
-endif::VK_KHR_driver_properties[]
-
-[NOTE]
-.Note
-====
-Khronos driver IDs may be allocated by vendors at any time.
-There may be multiple driver IDs for the same vendor, representing different
-drivers (for e.g. different platforms, proprietary or open source, etc.).
-Only the latest canonical versions of this Specification, of the
-corresponding `vk.xml` API Registry, and of the corresponding
-`{core_header}` header file must: contain all reserved Khronos driver IDs.
-
-Only driver IDs registered with Khronos are given symbolic names.
-There may: be unregistered driver IDs returned.
-====
---
-
-[open,refpage='VK_MAX_DRIVER_NAME_SIZE',desc='Maximum length of a physical device driver name string',type='consts']
---
-ename:VK_MAX_DRIVER_NAME_SIZE is the length in code:char values of an array
-containing a driver name string, as returned in
-slink:VkPhysicalDeviceDriverProperties::driverName.
-
-include::{generated}/api/enums/VK_MAX_DRIVER_NAME_SIZE.txt[]
-
-ifdef::VK_KHR_driver_properties[]
-or the equivalent
-
-include::{generated}/api/enums/VK_MAX_DRIVER_NAME_SIZE_KHR.txt[]
-endif::VK_KHR_driver_properties[]
---
-
-[open,refpage='VK_MAX_DRIVER_INFO_SIZE',desc='Length of a physical device driver information string',type='consts']
---
-ename:VK_MAX_DRIVER_INFO_SIZE is the length in code:char values of an array
-containing a driver information string, as returned in
-slink:VkPhysicalDeviceDriverProperties::driverInfo.
-
-include::{generated}/api/enums/VK_MAX_DRIVER_INFO_SIZE.txt[]
-
-ifdef::VK_KHR_driver_properties[]
-or the equivalent
-
-include::{generated}/api/enums/VK_MAX_DRIVER_INFO_SIZE_KHR.txt[]
-endif::VK_KHR_driver_properties[]
---
-
-[open,refpage='VkConformanceVersion',desc='Structure containing the conformance test suite version the implementation is compliant with',type='structs',alias='VkConformanceVersionKHR']
---
-The conformance test suite version an implementation is compliant with is
-described with the sname:VkConformanceVersion structure:
-
-include::{generated}/api/structs/VkConformanceVersion.txt[]
-
-ifdef::VK_KHR_driver_properties[]
-or the equivalent
-
-include::{generated}/api/structs/VkConformanceVersionKHR.txt[]
-endif::VK_KHR_driver_properties[]
-
-  * pname:major is the major version number of the conformance test suite.
-  * pname:minor is the minor version number of the conformance test suite.
-  * pname:subminor is the subminor version number of the conformance test
-    suite.
-  * pname:patch is the patch version number of the conformance test suite.
-
-include::{generated}/validity/structs/VkConformanceVersion.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_driver_properties[]
-
-ifdef::VK_EXT_pci_bus_info[]
-[open,refpage='VkPhysicalDevicePCIBusInfoPropertiesEXT',desc='Structure containing PCI bus information of a physical device',type='structs']
---
-The sname:VkPhysicalDevicePCIBusInfoPropertiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDevicePCIBusInfoPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pciDomain is the PCI bus domain.
-  * pname:pciBus is the PCI bus identifier.
-  * pname:pciDevice is the PCI device identifier.
-  * pname:pciFunction is the PCI device function identifier.
-
-:refpage: VkPhysicalDevicePCIBusInfoPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-These are properties of the PCI bus information of a physical device.
-
-include::{generated}/validity/structs/VkPhysicalDevicePCIBusInfoPropertiesEXT.txt[]
---
-endif::VK_EXT_pci_bus_info[]
-
-ifdef::VK_EXT_physical_device_drm[]
-[open,refpage='VkPhysicalDeviceDrmPropertiesEXT',desc='Structure containing DRM information of a physical device',type='structs']
---
-The sname:VkPhysicalDeviceDrmPropertiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceDrmPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:hasPrimary is a boolean indicating whether the physical device has
-    a DRM primary node.
-  * pname:hasRender is a boolean indicating whether the physical device has
-    a DRM render node.
-  * pname:primaryMajor is the DRM primary node major number, if any.
-  * pname:primaryMinor is the DRM primary node minor number, if any.
-  * pname:renderMajor is the DRM render node major number, if any.
-  * pname:renderMinor is the DRM render node minor number, if any.
-
-:refpage: VkPhysicalDeviceDrmPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-These are properties of the DRM information of a physical device.
-
-include::{generated}/validity/structs/VkPhysicalDeviceDrmPropertiesEXT.txt[]
---
-endif::VK_EXT_physical_device_drm[]
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-ifdef::VK_KHR_shader_integer_dot_product[]
-[open,refpage='VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR',desc='Structure containing information about integer dot product support for a physical device',type='structs']
---
-The sname:VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:integerDotProduct8BitUnsignedAccelerated is a boolean that will be
-    ename:VK_TRUE if the support for 8-bit unsigned dot product operations
-    using the code:OpUDotKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProduct8BitSignedAccelerated is a boolean that will be
-    ename:VK_TRUE if the support for 8-bit signed dot product operations
-    using the code:OpSDotKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProduct8BitMixedSignednessAccelerated is a boolean that
-    will be ename:VK_TRUE if the support for 8-bit mixed signedness dot
-    product operations using the code:OpSUDotKHR SPIR-V instruction is
-    accelerated <<devsandqueues-integer-dot-product-accelerated,as defined
-    below>>.
-  * pname:integerDotProduct4x8BitPackedUnsignedAccelerated is a boolean that
-    will be ename:VK_TRUE if the support for 8-bit unsigned dot product
-    operations from operands packed into 32-bit integers using the
-    code:OpUDotKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProduct4x8BitPackedSignedAccelerated is a boolean that
-    will be ename:VK_TRUE if the support for 8-bit signed dot product
-    operations from operands packed into 32-bit integers using the
-    code:OpSDotKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProduct4x8BitPackedMixedSignednessAccelerated is a
-    boolean that will be ename:VK_TRUE if the support for 8-bit mixed
-    signedness dot product operations from operands packed into 32-bit
-    integers using the code:OpSUDotKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProduct16BitUnsignedAccelerated is a boolean that will
-    be ename:VK_TRUE if the support for 16-bit unsigned dot product
-    operations using the code:OpUDotKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProduct16BitSignedAccelerated is a boolean that will be
-    ename:VK_TRUE if the support for 16-bit signed dot product operations
-    using the code:OpSDotKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProduct16BitMixedSignednessAccelerated is a boolean that
-    will be ename:VK_TRUE if the support for 16-bit mixed signedness dot
-    product operations using the code:OpSUDotKHR SPIR-V instruction is
-    accelerated <<devsandqueues-integer-dot-product-accelerated,as defined
-    below>>.
-  * pname:integerDotProduct32BitUnsignedAccelerated is a boolean that will
-    be ename:VK_TRUE if the support for 32-bit unsigned dot product
-    operations using the code:OpUDotKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProduct32BitSignedAccelerated is a boolean that will be
-    ename:VK_TRUE if the support for 32-bit signed dot product operations
-    using the code:OpSDotKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProduct32BitMixedSignednessAccelerated is a boolean that
-    will be ename:VK_TRUE if the support for 32-bit mixed signedness dot
-    product operations using the code:OpSUDotKHR SPIR-V instruction is
-    accelerated <<devsandqueues-integer-dot-product-accelerated,as defined
-    below>>.
-  * pname:integerDotProduct64BitUnsignedAccelerated is a boolean that will
-    be ename:VK_TRUE if the support for 64-bit unsigned dot product
-    operations using the code:OpUDotKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProduct64BitSignedAccelerated is a boolean that will be
-    ename:VK_TRUE if the support for 64-bit signed dot product operations
-    using the code:OpSDotKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProduct64BitMixedSignednessAccelerated is a boolean that
-    will be ename:VK_TRUE if the support for 64-bit mixed signedness dot
-    product operations using the code:OpSUDotKHR SPIR-V instruction is
-    accelerated <<devsandqueues-integer-dot-product-accelerated,as defined
-    below>>.
-  * pname:integerDotProductAccumulatingSaturating8BitUnsignedAccelerated is
-    a boolean that will be ename:VK_TRUE if the support for 8-bit unsigned
-    accumulating saturating dot product operations using the
-    code:OpUDotAccSatKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProductAccumulatingSaturating8BitSignedAccelerated is a
-    boolean that will be ename:VK_TRUE if the support for 8-bit signed
-    accumulating saturating dot product operations using the
-    code:OpSDotAccSatKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated
-    is a boolean that will be ename:VK_TRUE if the support for 8-bit mixed
-    signedness accumulating saturating dot product operations using the
-    code:OpSUDotAccSatKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated
-    is a boolean that will be ename:VK_TRUE if the support for 8-bit
-    unsigned accumulating saturating dot product operations from operands
-    packed into 32-bit integers using the code:OpUDotAccSatKHR SPIR-V
-    instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated
-    is a boolean that will be ename:VK_TRUE if the support for 8-bit signed
-    accumulating saturating dot product operations from operands packed into
-    32-bit integers using the code:OpSDotAccSatKHR SPIR-V instruction is
-    accelerated <<devsandqueues-integer-dot-product-accelerated,as defined
-    below>>.
-  * pname:integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated
-    is a boolean that will be ename:VK_TRUE if the support for 8-bit mixed
-    signedness accumulating saturating dot product operations from operands
-    packed into 32-bit integers using the code:OpSUDotAccSatKHR SPIR-V
-    instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProductAccumulatingSaturating16BitUnsignedAccelerated is
-    a boolean that will be ename:VK_TRUE if the support for 16-bit unsigned
-    accumulating saturating dot product operations using the
-    code:OpUDotAccSatKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProductAccumulatingSaturating16BitSignedAccelerated is a
-    boolean that will be ename:VK_TRUE if the support for 16-bit signed
-    accumulating saturating dot product operations using the
-    code:OpSDotAccSatKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated
-    is a boolean that will be ename:VK_TRUE if the support for 16-bit mixed
-    signedness accumulating saturating dot product operations using the
-    code:OpSUDotAccSatKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProductAccumulatingSaturating32BitUnsignedAccelerated is
-    a boolean that will be ename:VK_TRUE if the support for 32-bit unsigned
-    accumulating saturating dot product operations using the
-    code:OpUDotAccSatKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProductAccumulatingSaturating32BitSignedAccelerated is a
-    boolean that will be ename:VK_TRUE if the support for 32-bit signed
-    accumulating saturating dot product operations using the
-    code:OpSDotAccSatKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated
-    is a boolean that will be ename:VK_TRUE if the support for 32-bit mixed
-    signedness accumulating saturating dot product operations using the
-    code:OpSUDotAccSatKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProductAccumulatingSaturating64BitUnsignedAccelerated is
-    a boolean that will be ename:VK_TRUE if the support for 64-bit unsigned
-    accumulating saturating dot product operations using the
-    code:OpUDotAccSatKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProductAccumulatingSaturating64BitSignedAccelerated is a
-    boolean that will be ename:VK_TRUE if the support for 64-bit signed
-    accumulating saturating dot product operations using the
-    code:OpSDotAccSatKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-  * pname:integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated
-    is a boolean that will be ename:VK_TRUE if the support for 64-bit mixed
-    signedness accumulating saturating dot product operations using the
-    code:OpSUDotAccSatKHR SPIR-V instruction is accelerated
-    <<devsandqueues-integer-dot-product-accelerated,as defined below>>.
-
-:refpage: VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR
-include::{chapters}/limits.txt[tag=limits_desc]
-
-These are properties of the integer dot product acceleration information of
-a physical device.
-
-[[devsandqueues-integer-dot-product-accelerated]]
-[NOTE]
-.Note
-====
-A dot product operation is deemed accelerated if its implementation provides
-a performance advantage over application-provided code composed from
-elementary instructions and/or other dot product instructions, either
-because the implementation uses optimized machine code sequences whose
-generation from application-provided code cannot be guaranteed or because it
-uses hardware features that cannot otherwise be targeted from
-application-provided code.
-====
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR.txt[]
---
-endif::VK_KHR_shader_integer_dot_product[]
-
-[open,refpage='vkGetPhysicalDeviceQueueFamilyProperties',desc='Reports properties of the queues of the specified physical device',type='protos']
---
-To query properties of queues available on a physical device, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceQueueFamilyProperties.txt[]
-
-  * pname:physicalDevice is the handle to the physical device whose
-    properties will be queried.
-  * pname:pQueueFamilyPropertyCount is a pointer to an integer related to
-    the number of queue families available or queried, as described below.
-  * pname:pQueueFamilyProperties is either `NULL` or a pointer to an array
-    of slink:VkQueueFamilyProperties structures.
-
-If pname:pQueueFamilyProperties is `NULL`, then the number of queue families
-available is returned in pname:pQueueFamilyPropertyCount.
-Implementations must: support at least one queue family.
-Otherwise, pname:pQueueFamilyPropertyCount must: point to a variable set by
-the user to the number of elements in the pname:pQueueFamilyProperties
-array, and on return the variable is overwritten with the number of
-structures actually written to pname:pQueueFamilyProperties.
-If pname:pQueueFamilyPropertyCount is less than the number of queue families
-available, at most pname:pQueueFamilyPropertyCount structures will be
-written.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceQueueFamilyProperties.txt[]
---
-
-[open,refpage='VkQueueFamilyProperties',desc='Structure providing information about a queue family',type='structs']
---
-The sname:VkQueueFamilyProperties structure is defined as:
-
-include::{generated}/api/structs/VkQueueFamilyProperties.txt[]
-
-  * pname:queueFlags is a bitmask of elink:VkQueueFlagBits indicating
-    capabilities of the queues in this queue family.
-  * pname:queueCount is the unsigned integer count of queues in this queue
-    family.
-    Each queue family must: support at least one queue.
-  * pname:timestampValidBits is the unsigned integer count of meaningful
-    bits in the timestamps written via
-ifdef::VK_KHR_synchronization2[]
-    flink:vkCmdWriteTimestamp2KHR or
-endif::VK_KHR_synchronization2[]
-    flink:vkCmdWriteTimestamp.
-    The valid range for the count is 36..64 bits, or a value of 0,
-    indicating no support for timestamps.
-    Bits outside the valid range are guaranteed to be zeros.
-  * pname:minImageTransferGranularity is the minimum granularity supported
-    for image transfer operations on the queues in this queue family.
-
-The value returned in pname:minImageTransferGranularity has a unit of
-compressed texel blocks for images having a block-compressed format, and a
-unit of texels otherwise.
-
-Possible values of pname:minImageTransferGranularity are:
-
-  * [eq]#(0,0,0)# specifies that only whole mip levels must: be transferred
-    using the image transfer operations on the corresponding queues.
-    In this case, the following restrictions apply to all offset and extent
-    parameters of image transfer operations:
-  ** The pname:x, pname:y, and pname:z members of a slink:VkOffset3D
-     parameter must: always be zero.
-  ** The pname:width, pname:height, and pname:depth members of a
-     slink:VkExtent3D parameter must: always match the width, height, and
-     depth of the image subresource corresponding to the parameter,
-     respectively.
-  * [eq]#(A~x~, A~y~, A~z~)# where [eq]#A~x~#, [eq]#A~y~#, and [eq]#A~z~#
-    are all integer powers of two.
-    In this case the following restrictions apply to all image transfer
-    operations:
-  ** pname:x, pname:y, and pname:z of a slink:VkOffset3D parameter must: be
-     integer multiples of [eq]#A~x~#, [eq]#A~y~#, and [eq]#A~z~#,
-     respectively.
-  ** pname:width of a slink:VkExtent3D parameter must: be an integer
-     multiple of [eq]#A~x~#, or else [eq]#pname:x {plus} pname:width# must:
-     equal the width of the image subresource corresponding to the
-     parameter.
-  ** pname:height of a slink:VkExtent3D parameter must: be an integer
-     multiple of [eq]#A~y~#, or else [eq]#pname:y {plus} pname:height# must:
-     equal the height of the image subresource corresponding to the
-     parameter.
-  ** pname:depth of a slink:VkExtent3D parameter must: be an integer
-     multiple of [eq]#A~z~#, or else [eq]#pname:z {plus} pname:depth# must:
-     equal the depth of the image subresource corresponding to the
-     parameter.
-  ** If the format of the image corresponding to the parameters is one of
-     the block-compressed formats then for the purposes of the above
-     calculations the granularity must: be scaled up by the compressed texel
-     block dimensions.
-
-Queues supporting graphics and/or compute operations must: report
-[eq]#(1,1,1)# in pname:minImageTransferGranularity, meaning that there are
-no additional restrictions on the granularity of image transfer operations
-for these queues.
-Other queues supporting image transfer operations are only required: to
-support whole mip level transfers, thus pname:minImageTransferGranularity
-for queues belonging to such queue families may: be [eq]#(0,0,0)#.
-
-The <<memory-device,Device Memory>> section describes memory properties
-queried from the physical device.
-
-For physical device feature queries see the <<features, Features>> chapter.
-
-include::{generated}/validity/structs/VkQueueFamilyProperties.txt[]
---
-
-[open,refpage='VkQueueFlagBits',desc='Bitmask specifying capabilities of queues in a queue family',type='enums']
---
-Bits which may: be set in slink:VkQueueFamilyProperties::pname:queueFlags
-indicating capabilities of queues in a queue family are:
-
-include::{generated}/api/enums/VkQueueFlagBits.txt[]
-
-  * ename:VK_QUEUE_GRAPHICS_BIT specifies that queues in this queue family
-    support graphics operations.
-  * ename:VK_QUEUE_COMPUTE_BIT specifies that queues in this queue family
-    support compute operations.
-  * ename:VK_QUEUE_TRANSFER_BIT specifies that queues in this queue family
-    support transfer operations.
-  * ename:VK_QUEUE_SPARSE_BINDING_BIT specifies that queues in this queue
-    family support sparse memory management operations (see
-    <<sparsememory,Sparse Resources>>).
-    If any of the sparse resource features are enabled, then at least one
-    queue family must: support this bit.
-ifdef::VK_KHR_video_decode_queue[]
-  * ename:VK_QUEUE_VIDEO_DECODE_BIT_KHR specifies that queues in this queue
-    family support Video Decode operations.
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-  * ename:VK_QUEUE_VIDEO_ENCODE_BIT_KHR specifies that queues in this queue
-    family support Video Encode operations.
-endif::VK_KHR_video_encode_queue[]
-ifdef::VK_VERSION_1_1[]
-  * ename:VK_QUEUE_PROTECTED_BIT specifies that queues in this queue family
-    support the ename:VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT bit.
-    (see <<memory-protected-memory,Protected Memory>>).
-    If the physical device supports the pname:protectedMemory feature, at
-    least one of its queue families must: support this bit.
-endif::VK_VERSION_1_1[]
-
-If an implementation exposes any queue family that supports graphics
-operations, at least one queue family of at least one physical device
-exposed by the implementation must: support both graphics and compute
-operations.
-
-ifdef::VK_VERSION_1_1[]
-Furthermore, if the protected memory physical device feature is supported,
-then at least one queue family of at least one physical device exposed by
-the implementation must: support graphics operations, compute operations,
-and protected memory operations.
-endif::VK_VERSION_1_1[]
-
-[NOTE]
-.Note
-====
-All commands that are allowed on a queue that supports transfer operations
-are also allowed on a queue that supports either graphics or compute
-operations.
-Thus, if the capabilities of a queue family include
-ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT, then reporting
-the ename:VK_QUEUE_TRANSFER_BIT capability separately for that queue family
-is optional:.
-====
-
-For further details see <<devsandqueues-queues,Queues>>.
---
-
-[open,refpage='VkQueueFlags',desc='Bitmask of VkQueueFlagBits',type='flags']
---
-include::{generated}/api/flags/VkQueueFlags.txt[]
-
-tname:VkQueueFlags is a bitmask type for setting a mask of zero or more
-elink:VkQueueFlagBits.
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-[open,refpage='vkGetPhysicalDeviceQueueFamilyProperties2',desc='Reports properties of the queues of the specified physical device',type='protos']
---
-To query properties of queues available on a physical device, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetPhysicalDeviceQueueFamilyProperties2.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_get_physical_device_properties2[or the equivalent command]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-include::{generated}/api/protos/vkGetPhysicalDeviceQueueFamilyProperties2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:physicalDevice is the handle to the physical device whose
-    properties will be queried.
-  * pname:pQueueFamilyPropertyCount is a pointer to an integer related to
-    the number of queue families available or queried, as described in
-    flink:vkGetPhysicalDeviceQueueFamilyProperties.
-  * pname:pQueueFamilyProperties is either `NULL` or a pointer to an array
-    of slink:VkQueueFamilyProperties2 structures.
-
-fname:vkGetPhysicalDeviceQueueFamilyProperties2 behaves similarly to
-flink:vkGetPhysicalDeviceQueueFamilyProperties, with the ability to return
-extended information in a pname:pNext chain of output structures.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceQueueFamilyProperties2.txt[]
---
-
-[open,refpage='VkQueueFamilyProperties2',desc='Structure providing information about a queue family',type='structs']
---
-The sname:VkQueueFamilyProperties2 structure is defined as:
-
-include::{generated}/api/structs/VkQueueFamilyProperties2.txt[]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-or the equivalent
-
-include::{generated}/api/structs/VkQueueFamilyProperties2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:queueFamilyProperties is a slink:VkQueueFamilyProperties structure
-    which is populated with the same values as in
-    flink:vkGetPhysicalDeviceQueueFamilyProperties.
-
-include::{generated}/validity/structs/VkQueueFamilyProperties2.txt[]
---
-
-ifdef::VK_EXT_global_priority_query[]
-
-[open,refpage='VkQueueFamilyGlobalPriorityPropertiesEXT',desc='Return structure for queue family global priority information query',type='structs']
---
-
-The definition of slink:VkQueueFamilyGlobalPriorityPropertiesEXT is:
-
-include::{generated}/api/structs/VkQueueFamilyGlobalPriorityPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:priorityCount is the number of supported global queue priorities
-    in this queue family, and it must: be greater than 0.
-  * pname:priorities is an array of ename:VK_MAX_GLOBAL_PRIORITY_SIZE_EXT
-    elink:VkQueueGlobalPriorityEXT enums representing all supported global
-    queue priorities in this queue family.
-    The first pname:priorityCount elements of the array will be valid.
-
-The valid elements of pname:priorities must: not contain any duplicate
-values.
-
-The valid elements of pname:priorities must: be a continuous sequence of
-elink:VkQueueGlobalPriorityEXT enums in the ascending order.
-
-[NOTE]
-.Note
-====
-For example, returning pname:priorityCount as 3 with supported
-pname:priorities as ename:VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT,
-ename:VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT and
-ename:VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT is not allowed.
-====
-
-include::{generated}/validity/structs/VkQueueFamilyGlobalPriorityPropertiesEXT.txt[]
-
---
-
-endif::VK_EXT_global_priority_query[]
-
-ifdef::VK_NV_device_diagnostic_checkpoints[]
-include::VK_NV_device_diagnostic_checkpoints/queue_checkpoint_properties.txt[]
-endif::VK_NV_device_diagnostic_checkpoints[]
-
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-ifdef::VK_KHR_performance_query[]
-include::VK_KHR_performance_query/queuefamily.txt[]
-endif::VK_KHR_performance_query[]
-
-
-[[devsandqueues-devices]]
-== Devices
-
-Device objects represent logical connections to physical devices.
-Each device exposes a number of _queue families_ each having one or more
-_queues_.
-All queues in a queue family support the same operations.
-
-As described in <<devsandqueues-physical-device-enumeration,Physical
-Devices>>, a Vulkan application will first query for all physical devices in
-a system.
-Each physical device can: then be queried for its capabilities, including
-its queue and queue family properties.
-Once an acceptable physical device is identified, an application will create
-a corresponding logical device.
-The created logical device is then the primary interface to the physical
-device.
-
-How to enumerate the physical devices in a system and query those physical
-devices for their queue family properties is described in the
-<<devsandqueues-physical-device-enumeration, Physical Device Enumeration>>
-section above.
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group_creation[]
-
-A single logical device can: be created from multiple physical devices, if
-those physical devices belong to the same device group.
-A _device group_ is a set of physical devices that support accessing each
-other's memory and recording a single command buffer that can: be executed
-on all the physical devices.
-Device groups are enumerated by calling
-flink:vkEnumeratePhysicalDeviceGroups, and a logical device is created from
-a subset of the physical devices in a device group by passing the physical
-devices through slink:VkDeviceGroupDeviceCreateInfo.
-For two physical devices to be in the same device group, they must: support
-identical extensions, features, and properties.
-
-[NOTE]
-.Note
-====
-Physical devices in the same device group must: be so similar because there
-are no rules for how different features/properties would interact.
-They must: return the same values for nearly every invariant
-ftext:vkGetPhysicalDevice* feature, property, capability, etc., but could
-potentially differ for certain queries based on things like having a
-different display connected, or a different compositor.
-The specification does not attempt to enumerate which state is in each
-category, because such a list would quickly become out of date.
-====
-
-[open,refpage='vkEnumeratePhysicalDeviceGroups',desc='Enumerates groups of physical devices that can be used to create a single logical device',type='protos']
---
-To retrieve a list of the device groups present in the system, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkEnumeratePhysicalDeviceGroups.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_device_group_creation[or the equivalent command]
-
-ifdef::VK_KHR_device_group_creation[]
-include::{generated}/api/protos/vkEnumeratePhysicalDeviceGroupsKHR.txt[]
-endif::VK_KHR_device_group_creation[]
-
-  * pname:instance is a handle to a Vulkan instance previously created with
-    flink:vkCreateInstance.
-  * pname:pPhysicalDeviceGroupCount is a pointer to an integer related to
-    the number of device groups available or queried, as described below.
-  * pname:pPhysicalDeviceGroupProperties is either `NULL` or a pointer to an
-    array of slink:VkPhysicalDeviceGroupProperties structures.
-
-If pname:pPhysicalDeviceGroupProperties is `NULL`, then the number of device
-groups available is returned in pname:pPhysicalDeviceGroupCount.
-Otherwise, pname:pPhysicalDeviceGroupCount must: point to a variable set by
-the user to the number of elements in the
-pname:pPhysicalDeviceGroupProperties array, and on return the variable is
-overwritten with the number of structures actually written to
-pname:pPhysicalDeviceGroupProperties.
-If pname:pPhysicalDeviceGroupCount is less than the number of device groups
-available, at most pname:pPhysicalDeviceGroupCount structures will be
-written, and ename:VK_INCOMPLETE will be returned instead of
-ename:VK_SUCCESS, to indicate that not all the available device groups were
-returned.
-
-Every physical device must: be in exactly one device group.
-
-include::{generated}/validity/protos/vkEnumeratePhysicalDeviceGroups.txt[]
---
-
-[open,refpage='VkPhysicalDeviceGroupProperties',desc='Structure specifying physical device group properties',type='structs']
---
-The sname:VkPhysicalDeviceGroupProperties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceGroupProperties.txt[]
-
-ifdef::VK_KHR_device_group_creation[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceGroupPropertiesKHR.txt[]
-endif::VK_KHR_device_group_creation[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:physicalDeviceCount is the number of physical devices in the
-    group.
-  * pname:physicalDevices is an array of ename:VK_MAX_DEVICE_GROUP_SIZE
-    slink:VkPhysicalDevice handles representing all physical devices in the
-    group.
-    The first pname:physicalDeviceCount elements of the array will be valid.
-  * pname:subsetAllocation specifies whether logical devices created from
-    the group support allocating device memory on a subset of devices, via
-    the pname:deviceMask member of the slink:VkMemoryAllocateFlagsInfo.
-    If this is ename:VK_FALSE, then all device memory allocations are made
-    across all physical devices in the group.
-    If pname:physicalDeviceCount is `1`, then pname:subsetAllocation must:
-    be ename:VK_FALSE.
-
-include::{generated}/validity/structs/VkPhysicalDeviceGroupProperties.txt[]
---
-
-[open,refpage='VK_MAX_DEVICE_GROUP_SIZE',desc='Length of a physical device handle array',type='consts']
---
-ename:VK_MAX_DEVICE_GROUP_SIZE is the length of an array containing
-slink:VkPhysicalDevice handle values representing all physical devices in a
-group, as returned in
-slink:VkPhysicalDeviceGroupProperties::physicalDevices.
-
-include::{generated}/api/enums/VK_MAX_DEVICE_GROUP_SIZE.txt[]
-
-ifdef::VK_KHR_device_group_creation[]
-or the equivalent
-
-include::{generated}/api/enums/VK_MAX_DEVICE_GROUP_SIZE_KHR.txt[]
-endif::VK_KHR_device_group_creation[]
---
-endif::VK_VERSION_1_1,VK_KHR_device_group_creation[]
-
-
-[[devsandqueues-device-creation]]
-=== Device Creation
-
-[open,refpage='VkDevice',desc='Opaque handle to a device object',type='handles']
---
-Logical devices are represented by sname:VkDevice handles:
-
-include::{generated}/api/handles/VkDevice.txt[]
---
-
-[open,refpage='vkCreateDevice',desc='Create a new device instance',type='protos']
---
-A logical device is created as a _connection_ to a physical device.
-To create a logical device, call:
-
-include::{generated}/api/protos/vkCreateDevice.txt[]
-
-  * pname:physicalDevice must: be one of the device handles returned from a
-    call to fname:vkEnumeratePhysicalDevices (see
-    <<devsandqueues-physical-device-enumeration, Physical Device
-    Enumeration>>).
-  * pname:pCreateInfo is a pointer to a slink:VkDeviceCreateInfo structure
-    containing information about how to create the device.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pDevice is a pointer to a handle in which the created
-    slink:VkDevice is returned.
-
-fname:vkCreateDevice verifies that extensions and features requested in the
-pname:ppEnabledExtensionNames and pname:pEnabledFeatures members of
-pname:pCreateInfo, respectively, are supported by the implementation.
-If any requested extension is not supported, fname:vkCreateDevice must:
-return ename:VK_ERROR_EXTENSION_NOT_PRESENT.
-If any requested feature is not supported, fname:vkCreateDevice must: return
-ename:VK_ERROR_FEATURE_NOT_PRESENT.
-Support for extensions can: be checked before creating a device by querying
-flink:vkEnumerateDeviceExtensionProperties.
-Support for features can: similarly be checked by querying
-flink:vkGetPhysicalDeviceFeatures.
-
-After verifying and enabling the extensions the sname:VkDevice object is
-created and returned to the application.
-
-Multiple logical devices can: be created from the same physical device.
-Logical device creation may: fail due to lack of device-specific resources
-(in addition to other errors).
-If that occurs, fname:vkCreateDevice will return
-ename:VK_ERROR_TOO_MANY_OBJECTS.
-
-.Valid Usage
-****
-  * [[VUID-vkCreateDevice-ppEnabledExtensionNames-01387]]
-    All <<extendingvulkan-extensions-extensiondependencies, required device
-    extensions>> for each extension in the
-    slink:VkDeviceCreateInfo::pname:ppEnabledExtensionNames list must: also
-    be present in that list
-****
-
-include::{generated}/validity/protos/vkCreateDevice.txt[]
---
-
-[open,refpage='VkDeviceCreateInfo',desc='Structure specifying parameters of a newly created device',type='structs']
---
-The sname:VkDeviceCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkDeviceCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:queueCreateInfoCount is the unsigned integer size of the
-    pname:pQueueCreateInfos array.
-    Refer to the <<devsandqueues-queue-creation,Queue Creation>> section
-    below for further details.
-  * pname:pQueueCreateInfos is a pointer to an array of
-    slink:VkDeviceQueueCreateInfo structures describing the queues that are
-    requested to be created along with the logical device.
-    Refer to the <<devsandqueues-queue-creation,Queue Creation>> section
-    below for further details.
-  * pname:enabledLayerCount is deprecated and ignored.
-  * pname:ppEnabledLayerNames is deprecated and ignored.
-    See <<extendingvulkan-layers-devicelayerdeprecation>>.
-  * pname:enabledExtensionCount is the number of device extensions to
-    enable.
-  * pname:ppEnabledExtensionNames is a pointer to an array of
-    pname:enabledExtensionCount null-terminated UTF-8 strings containing the
-    names of extensions to enable for the created device.
-    See the <<extendingvulkan-extensions>> section for further details.
-  * pname:pEnabledFeatures is `NULL` or a pointer to a
-    slink:VkPhysicalDeviceFeatures structure containing boolean indicators
-    of all the features to be enabled.
-    Refer to the <<features,Features>> section for further details.
-
-.Valid Usage
-****
-ifndef::VK_VERSION_1_1[]
-  * [[VUID-VkDeviceCreateInfo-queueFamilyIndex-00372]]
-    The pname:queueFamilyIndex member of each element of
-    pname:pQueueCreateInfos must: be unique within pname:pQueueCreateInfos
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-VkDeviceCreateInfo-queueFamilyIndex-02802]]
-    The pname:queueFamilyIndex member of each element of
-    pname:pQueueCreateInfos must: be unique within pname:pQueueCreateInfos,
-    except that two members can share the same pname:queueFamilyIndex if one
-    is a protected-capable queue and one is not a protected-capable queue
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-  * [[VUID-VkDeviceCreateInfo-pNext-00373]]
-    If the pname:pNext chain includes a slink:VkPhysicalDeviceFeatures2
-    structure, then pname:pEnabledFeatures must: be `NULL`
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-ifdef::VK_AMD_negative_viewport_height[]
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-01840]]
-    pname:ppEnabledExtensionNames must: not contain
-    `apiext:VK_AMD_negative_viewport_height`
-endif::VK_VERSION_1_1[]
-ifndef::VK_VERSION_1_1[]
-ifdef::VK_KHR_maintenance1[]
-  * [[VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-00374]]
-    pname:ppEnabledExtensionNames must: not contain both
-    `apiext:VK_KHR_maintenance1` and
-    `apiext:VK_AMD_negative_viewport_height`
-endif::VK_KHR_maintenance1[]
-endif::VK_VERSION_1_1[]
-endif::VK_AMD_negative_viewport_height[]
-ifdef::VK_EXT_buffer_device_address+VK_KHR_buffer_device_address[]
-  * [[VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-03328]]
-    pname:ppEnabledExtensionNames must: not contain both
-    `apiext:VK_KHR_buffer_device_address` and
-    `apiext:VK_EXT_buffer_device_address`
-endif::VK_EXT_buffer_device_address+VK_KHR_buffer_device_address[]
-ifdef::VK_VERSION_1_2[]
-ifdef::VK_EXT_buffer_device_address[]
-  * [[VUID-VkDeviceCreateInfo-pNext-04748]]
-    if the pname:pNext chain includes a
-    slink:VkPhysicalDeviceVulkan12Features structure and
-    slink:VkPhysicalDeviceVulkan12Features::pname:bufferDeviceAddress is
-    ename:VK_TRUE, pname:ppEnabledExtensionNames must: not contain
-    `apiext:VK_EXT_buffer_device_address`
-endif::VK_EXT_buffer_device_address[]
-  * [[VUID-VkDeviceCreateInfo-pNext-02829]]
-    If the pname:pNext chain includes a
-    slink:VkPhysicalDeviceVulkan11Features structure, then it must: not
-    include a slink:VkPhysicalDevice16BitStorageFeatures,
-    slink:VkPhysicalDeviceMultiviewFeatures,
-    slink:VkPhysicalDeviceVariablePointersFeatures,
-    slink:VkPhysicalDeviceProtectedMemoryFeatures,
-    slink:VkPhysicalDeviceSamplerYcbcrConversionFeatures, or
-    slink:VkPhysicalDeviceShaderDrawParametersFeatures structure
-  * [[VUID-VkDeviceCreateInfo-pNext-02830]]
-    If the pname:pNext chain includes a
-    slink:VkPhysicalDeviceVulkan12Features structure, then it must: not
-    include a slink:VkPhysicalDevice8BitStorageFeatures,
-    slink:VkPhysicalDeviceShaderAtomicInt64Features,
-    slink:VkPhysicalDeviceShaderFloat16Int8Features,
-    slink:VkPhysicalDeviceDescriptorIndexingFeatures,
-    slink:VkPhysicalDeviceScalarBlockLayoutFeatures,
-    slink:VkPhysicalDeviceImagelessFramebufferFeatures,
-    slink:VkPhysicalDeviceUniformBufferStandardLayoutFeatures,
-    slink:VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures,
-    slink:VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures,
-    slink:VkPhysicalDeviceHostQueryResetFeatures,
-    slink:VkPhysicalDeviceTimelineSemaphoreFeatures,
-    slink:VkPhysicalDeviceBufferDeviceAddressFeatures, or
-    slink:VkPhysicalDeviceVulkanMemoryModelFeatures structure
-ifdef::VK_KHR_shader_draw_parameters[]
-  * [[VUID-VkDeviceCreateInfo-ppEnabledExtensions-04476]]
-    If pname:ppEnabledExtensions contains `"VK_KHR_shader_draw_parameters"`
-    and the pname:pNext chain includes a
-    slink:VkPhysicalDeviceVulkan11Features structure, then
-    sname:VkPhysicalDeviceVulkan11Features::pname:shaderDrawParameters must:
-    be ename:VK_TRUE
-endif::VK_KHR_shader_draw_parameters[]
-ifdef::VK_KHR_draw_indirect_count[]
-  * [[VUID-VkDeviceCreateInfo-ppEnabledExtensions-02831]]
-    If pname:ppEnabledExtensions contains `"VK_KHR_draw_indirect_count"` and
-    the pname:pNext chain includes a slink:VkPhysicalDeviceVulkan12Features
-    structure, then
-    sname:VkPhysicalDeviceVulkan12Features::pname:drawIndirectCount must: be
-    ename:VK_TRUE
-endif::VK_KHR_draw_indirect_count[]
-ifdef::VK_KHR_sampler_mirror_clamp_to_edge[]
-  * [[VUID-VkDeviceCreateInfo-ppEnabledExtensions-02832]]
-    If pname:ppEnabledExtensions contains
-    `"VK_KHR_sampler_mirror_clamp_to_edge"` and the pname:pNext chain
-    includes a slink:VkPhysicalDeviceVulkan12Features structure, then
-    sname:VkPhysicalDeviceVulkan12Features::pname:samplerMirrorClampToEdge
-    must: be ename:VK_TRUE
-endif::VK_KHR_sampler_mirror_clamp_to_edge[]
-ifdef::VK_EXT_descriptor_indexing[]
-  * [[VUID-VkDeviceCreateInfo-ppEnabledExtensions-02833]]
-    If pname:ppEnabledExtensions contains `"VK_EXT_descriptor_indexing"` and
-    the pname:pNext chain includes a slink:VkPhysicalDeviceVulkan12Features
-    structure, then
-    sname:VkPhysicalDeviceVulkan12Features::pname:descriptorIndexing must:
-    be ename:VK_TRUE
-endif::VK_EXT_descriptor_indexing[]
-ifdef::VK_EXT_sampler_filter_minmax[]
-  * [[VUID-VkDeviceCreateInfo-ppEnabledExtensions-02834]]
-    If pname:ppEnabledExtensions contains `"VK_EXT_sampler_filter_minmax"`
-    and the pname:pNext chain includes a
-    slink:VkPhysicalDeviceVulkan12Features structure, then
-    sname:VkPhysicalDeviceVulkan12Features::pname:samplerFilterMinmax must:
-    be ename:VK_TRUE
-endif::VK_EXT_sampler_filter_minmax[]
-ifdef::VK_EXT_shader_viewport_index_layer[]
-  * [[VUID-VkDeviceCreateInfo-ppEnabledExtensions-02835]]
-    If pname:ppEnabledExtensions contains
-    `"VK_EXT_shader_viewport_index_layer"` and the pname:pNext chain
-    includes a slink:VkPhysicalDeviceVulkan12Features structure, then
-    sname:VkPhysicalDeviceVulkan12Features::pname:shaderOutputViewportIndex
-    and sname:VkPhysicalDeviceVulkan12Features::pname:shaderOutputLayer
-    must: both be ename:VK_TRUE
-endif::VK_EXT_shader_viewport_index_layer[]
-endif::VK_VERSION_1_2[]
-ifdef::VK_KHR_portability_subset[]
-  * [[VUID-VkDeviceCreateInfo-pProperties-04451]]
-    If the `apiext:VK_KHR_portability_subset` extension is included in
-    pname:pProperties of flink:vkEnumerateDeviceExtensionProperties,
-    pname:ppEnabledExtensions must: include "VK_KHR_portability_subset"
-endif::VK_KHR_portability_subset[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  * [[VUID-VkDeviceCreateInfo-shadingRateImage-04478]]
-    If <<features-shadingRateImage,pname:shadingRateImage>> is enabled,
-    <<features-pipelineFragmentShadingRate,
-    pname:pipelineFragmentShadingRate>> must: not be enabled
-  * [[VUID-VkDeviceCreateInfo-shadingRateImage-04479]]
-    If <<features-shadingRateImage,pname:shadingRateImage>> is enabled,
-    <<features-primitiveFragmentShadingRate,
-    pname:primitiveFragmentShadingRate>> must: not be enabled
-  * [[VUID-VkDeviceCreateInfo-shadingRateImage-04480]]
-    If <<features-shadingRateImage,pname:shadingRateImage>> is enabled,
-    <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate>> must: not be enabled
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-ifdef::VK_KHR_fragment_shading_rate,VK_EXT_fragment_density_map[]
-  * [[VUID-VkDeviceCreateInfo-fragmentDensityMap-04481]]
-    If <<features-fragmentDensityMap,pname:fragmentDensityMap>> is enabled,
-    <<features-pipelineFragmentShadingRate,
-    pname:pipelineFragmentShadingRate>> must: not be enabled
-  * [[VUID-VkDeviceCreateInfo-fragmentDensityMap-04482]]
-    If <<features-fragmentDensityMap,pname:fragmentDensityMap>> is enabled,
-    <<features-primitiveFragmentShadingRate,
-    pname:primitiveFragmentShadingRate>> must: not be enabled
-  * [[VUID-VkDeviceCreateInfo-fragmentDensityMap-04483]]
-    If <<features-fragmentDensityMap,pname:fragmentDensityMap>> is enabled,
-    <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate>> must: not be enabled
-endif::VK_KHR_fragment_shading_rate,VK_EXT_fragment_density_map[]
-ifdef::VK_EXT_shader_image_atomic_int64[]
-  * [[VUID-VkDeviceCreateInfo-None-04896]]
-    If <<features-sparseImageInt64Atomics, pname:sparseImageInt64Atomics>>
-    is enabled, <<features-shaderImageInt64Atomics,
-    pname:shaderImageInt64Atomics>> must: be enabled
-endif::VK_EXT_shader_image_atomic_int64[]
-ifdef::VK_EXT_shader_atomic_float[]
-  * [[VUID-VkDeviceCreateInfo-None-04897]]
-    If <<features-sparseImageFloat32Atomics,
-    pname:sparseImageFloat32Atomics>> is enabled,
-    <<features-shaderImageFloat32Atomics, pname:shaderImageFloat32Atomics>>
-    must: be enabled
-  * [[VUID-VkDeviceCreateInfo-None-04898]]
-    If <<features-sparseImageFloat32AtomicAdd,
-    pname:sparseImageFloat32AtomicAdd>> is enabled,
-    <<features-shaderImageFloat32AtomicAdd,
-    pname:shaderImageFloat32AtomicAdd>> must: be enabled
-endif::VK_EXT_shader_atomic_float[]
-ifdef::VK_EXT_shader_atomic_float2[]
-  * [[VUID-VkDeviceCreateInfo-sparseImageFloat32AtomicMinMax-04975]]
-    If <<features-sparseImageFloat32AtomicMinMax,
-    pname:sparseImageFloat32AtomicMinMax>> is enabled,
-    <<features-shaderImageFloat32AtomicMinMax,
-    pname:shaderImageFloat32AtomicMinMax>> must: be enabled
-endif::VK_EXT_shader_atomic_float2[]
-****
-
-include::{generated}/validity/structs/VkDeviceCreateInfo.txt[]
---
-
-[open,refpage='VkDeviceCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkDeviceCreateFlags.txt[]
-
-tname:VkDeviceCreateFlags is a bitmask type for setting a mask, but is
-currently reserved for future use.
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group_creation[]
-[open,refpage='VkDeviceGroupDeviceCreateInfo',desc='Create a logical device from multiple physical devices',type='structs']
---
-A logical device can: be created that connects to one or more physical
-devices by adding a sname:VkDeviceGroupDeviceCreateInfo structure to the
-pname:pNext chain of slink:VkDeviceCreateInfo.
-The sname:VkDeviceGroupDeviceCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkDeviceGroupDeviceCreateInfo.txt[]
-
-ifdef::VK_KHR_device_group_creation[]
-or the equivalent
-
-include::{generated}/api/structs/VkDeviceGroupDeviceCreateInfoKHR.txt[]
-endif::VK_KHR_device_group_creation[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:physicalDeviceCount is the number of elements in the
-    pname:pPhysicalDevices array.
-  * pname:pPhysicalDevices is a pointer to an array of physical device
-    handles belonging to the same device group.
-
-The elements of the pname:pPhysicalDevices array are an ordered list of the
-physical devices that the logical device represents.
-These must: be a subset of a single device group, and need not be in the
-same order as they were enumerated.
-The order of the physical devices in the pname:pPhysicalDevices array
-determines the _device index_ of each physical device, with element [eq]#i#
-being assigned a device index of [eq]#i#.
-Certain commands and structures refer to one or more physical devices by
-using device indices or _device masks_ formed using device indices.
-
-A logical device created without using sname:VkDeviceGroupDeviceCreateInfo,
-or with pname:physicalDeviceCount equal to zero, is equivalent to a
-pname:physicalDeviceCount of one and pname:pPhysicalDevices pointing to the
-pname:physicalDevice parameter to flink:vkCreateDevice.
-In particular, the device index of that physical device is zero.
-
-.Valid Usage
-****
-  * [[VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00375]]
-    Each element of pname:pPhysicalDevices must: be unique
-  * [[VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00376]]
-    All elements of pname:pPhysicalDevices must: be in the same device group
-    as enumerated by flink:vkEnumeratePhysicalDeviceGroups
-  * [[VUID-VkDeviceGroupDeviceCreateInfo-physicalDeviceCount-00377]]
-    If pname:physicalDeviceCount is not `0`, the pname:physicalDevice
-    parameter of flink:vkCreateDevice must: be an element of
-    pname:pPhysicalDevices
-****
-
-include::{generated}/validity/structs/VkDeviceGroupDeviceCreateInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_device_group_creation[]
-
-ifdef::VK_AMD_memory_overallocation_behavior[]
-[open,refpage='VkDeviceMemoryOverallocationCreateInfoAMD',desc='Specify memory overallocation behavior for a Vulkan device',type='structs']
---
-To specify whether device memory allocation is allowed beyond the size
-reported by slink:VkPhysicalDeviceMemoryProperties, add a
-slink:VkDeviceMemoryOverallocationCreateInfoAMD structure to the pname:pNext
-chain of the slink:VkDeviceCreateInfo structure.
-If this structure is not specified, it is as if the
-ename:VK_MEMORY_OVERALLOCATION_BEHAVIOR_DEFAULT_AMD value is used.
-
-include::{generated}/api/structs/VkDeviceMemoryOverallocationCreateInfoAMD.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:overallocationBehavior is the desired overallocation behavior.
-
-include::{generated}/validity/structs/VkDeviceMemoryOverallocationCreateInfoAMD.txt[]
---
-
-[open,refpage='VkMemoryOverallocationBehaviorAMD',desc='Specify memory overallocation behavior',type='enums']
---
-Possible values for
-slink:VkDeviceMemoryOverallocationCreateInfoAMD::pname:overallocationBehavior
-include:
-
-include::{generated}/api/enums/VkMemoryOverallocationBehaviorAMD.txt[]
-
-  * ename:VK_MEMORY_OVERALLOCATION_BEHAVIOR_DEFAULT_AMD lets the
-    implementation decide if overallocation is allowed.
-  * ename:VK_MEMORY_OVERALLOCATION_BEHAVIOR_ALLOWED_AMD specifies
-    overallocation is allowed if platform permits.
-  * ename:VK_MEMORY_OVERALLOCATION_BEHAVIOR_DISALLOWED_AMD specifies the
-    application is not allowed to allocate device memory beyond the heap
-    sizes reported by slink:VkPhysicalDeviceMemoryProperties.
-    Allocations that are not explicitly made by the application within the
-    scope of the Vulkan instance are not accounted for.
---
-endif::VK_AMD_memory_overallocation_behavior[]
-
-ifdef::VK_NV_device_diagnostics_config[]
-[open,refpage='VkDeviceDiagnosticsConfigCreateInfoNV',desc='Specify diagnostics config for a Vulkan device',type='structs']
---
-When using the Nsight^(TM)^ Aftermath SDK, to configure how device crash
-dumps are created, add a slink:VkDeviceDiagnosticsConfigCreateInfoNV
-structure to the pname:pNext chain of the slink:VkDeviceCreateInfo
-structure.
-
-include::{generated}/api/structs/VkDeviceDiagnosticsConfigCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkDeviceDiagnosticsConfigFlagBitsNV
-    specifying addtional parameters for configuring diagnostic tools.
-
-include::{generated}/validity/structs/VkDeviceDiagnosticsConfigCreateInfoNV.txt[]
---
-
-[open,refpage='VkDeviceDiagnosticsConfigFlagBitsNV',desc='Bitmask specifying diagnostics flags',type='enums']
---
-Bits which can: be set in
-slink:VkDeviceDiagnosticsConfigCreateInfoNV::pname:flags include:
-
-include::{generated}/api/enums/VkDeviceDiagnosticsConfigFlagBitsNV.txt[]
-
-  * ename:VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_DEBUG_INFO_BIT_NV
-    enables the generation of debug information for shaders.
-  * ename:VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_RESOURCE_TRACKING_BIT_NV
-    enables driver side tracking of resources (images, buffers, etc.) used
-    to augment the device fault information.
-  * ename:VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_AUTOMATIC_CHECKPOINTS_BIT_NV
-    enables automatic insertion of <<device-diagnostic-checkpoints,
-    diagnostic checkpoints>> for draw calls, dispatches,
-ifdef::VK_NV_ray_tracing[]
-    trace rays,
-endif::VK_NV_ray_tracing[]
-    and copies.
-    The CPU call stack at the time of the command will be associated as the
-    marker data for the automatically inserted checkpoints.
---
-
-[open,refpage='VkDeviceDiagnosticsConfigFlagsNV',desc='Bitmask of VkDeviceDiagnosticsConfigFlagBitsNV',type='flags']
---
-include::{generated}/api/flags/VkDeviceDiagnosticsConfigFlagsNV.txt[]
-
-tname:VkDeviceDiagnosticsConfigFlagsNV is a bitmask type for setting a mask
-of zero or more elink:VkDeviceDiagnosticsConfigFlagBitsNV.
---
-endif::VK_NV_device_diagnostics_config[]
-
-ifdef::VK_EXT_device_memory_report[]
-[open,refpage='VkDeviceDeviceMemoryReportCreateInfoEXT',desc='Register device memory report callbacks for a Vulkan device',type='structs']
---
-To register callbacks for underlying device memory events of type
-elink:VkDeviceMemoryReportEventTypeEXT, add one or multiple
-slink:VkDeviceDeviceMemoryReportCreateInfoEXT structures to the pname:pNext
-chain of the slink:VkDeviceCreateInfo structure.
-
-include::{generated}/api/structs/VkDeviceDeviceMemoryReportCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is 0 and reserved for future use.
-  * pname:pfnUserCallback is the application callback function to call.
-  * pname:pUserData is user data to be passed to the callback.
-
-The callback may: be called from multiple threads simultaneously.
-
-The callback must: be called only once by the implementation when a
-elink:VkDeviceMemoryReportEventTypeEXT event occurs.
-
-[NOTE]
-.Note
-====
-The callback could be called from a background thread other than the thread
-calling the Vulkan commands.
-====
-
-include::{generated}/validity/structs/VkDeviceDeviceMemoryReportCreateInfoEXT.txt[]
---
-
-[open,refpage='PFN_vkDeviceMemoryReportCallbackEXT',desc='Application-defined device memory report callback function',type='funcpointers']
---
-The prototype for the
-slink:VkDeviceDeviceMemoryReportCreateInfoEXT::pname:pfnUserCallback
-function implemented by the application is:
-
-include::{generated}/api/funcpointers/PFN_vkDeviceMemoryReportCallbackEXT.txt[]
-
-  * pname:pCallbackData contains all the callback related data in the
-    slink:VkDeviceMemoryReportCallbackDataEXT structure.
-  * pname:pUserData is the user data provided when the
-    slink:VkDeviceDeviceMemoryReportCreateInfoEXT was created.
-
-The callback must: not make calls to any Vulkan commands.
---
-
-[open,refpage='VkDeviceMemoryReportCallbackDataEXT',desc='Structure specifying parameters returned to the callback',type='structs']
---
-The definition of sname:VkDeviceMemoryReportCallbackDataEXT is:
-
-include::{generated}/api/structs/VkDeviceMemoryReportCallbackDataEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is 0 and reserved for future use.
-  * pname:type is a elink:VkDeviceMemoryReportEventTypeEXT type specifying
-    the type of event reported in this
-    sname:VkDeviceMemoryReportCallbackDataEXT structure.
-  * pname:memoryObjectId is the unique id for the underlying memory object
-    as described below.
-  * pname:size is the size of the memory object in bytes.
-    If pname:type is ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT,
-    ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT or
-    ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT,
-    pname:size is a valid basetype:VkDeviceSize value.
-    Otherwise, pname:size is undefined:.
-  * pname:objectType is a elink:VkObjectType value specifying the type of
-    the object associated with this device memory report event.
-    If pname:type is ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT,
-    ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXT,
-    ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT,
-    ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_UNIMPORT_EXT or
-    ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT,
-    pname:objectType is a valid elink:VkObjectType enum.
-    Otherwise, pname:objectType is undefined:.
-  * pname:objectHandle is the object this device memory report event is
-    attributed to.
-    If pname:type is ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT,
-    ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXT,
-    ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT or
-    ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_UNIMPORT_EXT,
-    pname:objectHandle is a valid Vulkan handle of the type associated with
-    pname:objectType as defined in the <<debugging-object-types,
-    `VkObjectType` and Vulkan Handle Relationship>> table.
-    Otherwise, pname:objectHandle is undefined:.
-  * pname:heapIndex describes which memory heap this device memory
-    allocation is made from.
-    If pname:type is ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT
-    or ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT,
-    pname:heapIndex corresponds to one of the valid heaps from the
-    slink:VkPhysicalDeviceMemoryProperties structure.
-    Otherwise, pname:heapIndex is undefined:.
-
-pname:memoryObjectId is used to avoid double-counting on the same memory
-object.
-
-If an internally-allocated device memory object or a slink:VkDeviceMemory
-cannot: be exported, pname:memoryObjectId must: be unique in the
-slink:VkDevice.
-
-If an internally-allocated device memory object or a slink:VkDeviceMemory
-supports being exported, pname:memoryObjectId must: be unique system wide.
-
-If an internal device memory object or a slink:VkDeviceMemory is backed by
-an imported external memory object, pname:memoryObjectId must: be unique
-system wide.
-
-ifdef::implementation-guide[]
-.Implementor's Note
-****
-If the heap backing an internally-allocated device memory cannot: be used to
-back slink:VkDeviceMemory, implementations can: advertise that heap with no
-types.
-****
-endif::implementation-guide[]
-
-[NOTE]
-.Note
-====
-This structure should only be considered valid during the lifetime of the
-triggered callback.
-
-For ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT and
-ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT events,
-pname:objectHandle usually will not yet exist when the application or tool
-receives the callback.
-pname:objectHandle will only exist when the create or allocate call that
-triggered the event returns, and if the allocation or import ends up failing
-pname:objectHandle will not ever exist.
-====
-
-include::{generated}/validity/structs/VkDeviceMemoryReportCallbackDataEXT.txt[]
---
-
-[open,refpage='VkDeviceMemoryReportFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkDeviceMemoryReportFlagsEXT.txt[]
-
-tname:VkDeviceMemoryReportFlagsEXT is a bitmask type for setting a mask, but
-is currently reserved for future use.
---
-
-[open,refpage='VkDeviceMemoryReportEventTypeEXT',desc='Events that can occur on a device memory object',type='enums']
---
-Possible values of slink:VkDeviceMemoryReportCallbackDataEXT::pname:type,
-specifying event types which cause the device driver to call the callback,
-are:
-
-include::{generated}/api/enums/VkDeviceMemoryReportEventTypeEXT.txt[]
-
-  * ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT specifies this
-    event corresponds to the allocation of an internal device memory object
-    or a slink:VkDeviceMemory.
-  * ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXT specifies this event
-    corresponds to the deallocation of an internally-allocated device memory
-    object or a slink:VkDeviceMemory.
-  * ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT specifies this event
-    corresponds to the import of an external memory object.
-  * ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_UNIMPORT_EXT specifies this
-    event is the release of an imported external memory object.
-  * ename:VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT specifies
-    this event corresponds to the failed allocation of an internal device
-    memory object or a slink:VkDeviceMemory.
---
-endif::VK_EXT_device_memory_report[]
-
-ifdef::VK_EXT_private_data[]
-[open,refpage='VkDevicePrivateDataCreateInfoEXT',desc='Reserve private data slots',type='structs']
---
-To reserve private data storage slots, add a
-slink:VkDevicePrivateDataCreateInfoEXT structure to the pname:pNext chain of
-the slink:VkDeviceCreateInfo structure.
-Reserving slots in this manner is not strictly necessary, but doing so may:
-improve performance.
-
-include::{generated}/api/structs/VkDevicePrivateDataCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:privateDataSlotRequestCount is the amount of slots to reserve.
-
-include::{generated}/validity/structs/VkDevicePrivateDataCreateInfoEXT.txt[]
---
-endif::VK_EXT_private_data[]
-
-
-[[devsandqueues-use]]
-=== Device Use
-
-The following is a high-level list of sname:VkDevice uses along with
-references on where to find more information:
-
-  * Creation of queues.
-    See the <<devsandqueues-queues,Queues>> section below for further
-    details.
-  * Creation and tracking of various synchronization constructs.
-    See <<synchronization,Synchronization and Cache Control>> for further
-    details.
-  * Allocating, freeing, and managing memory.
-    See <<memory,Memory Allocation>> and <<resources,Resource Creation>> for
-    further details.
-  * Creation and destruction of command buffers and command buffer pools.
-    See <<commandbuffers,Command Buffers>> for further details.
-  * Creation, destruction, and management of graphics state.
-    See <<pipelines,Pipelines>> and <<descriptorsets,Resource Descriptors>>,
-    among others, for further details.
-
-
-[[devsandqueues-lost-device]]
-=== Lost Device
-
-A logical device may: become _lost_ for a number of implementation-specific
-reasons, indicating that pending and future command execution may: fail and
-cause resources and backing memory to become undefined:.
-
-[NOTE]
-.Note
-====
-Typical reasons for device loss will include things like execution timing
-out (to prevent denial of service), power management events, platform
-resource management, implementation errors.
-
-Applications not adhering to <<fundamentals-validusage, valid usage>> may
-also result in device loss being reported, however this is not guaranteed.
-Even if device loss is reported, the system may be in an unrecoverable
-state, and further usage of the API is still considered invalid.
-====
-
-When this happens, certain commands will return ename:VK_ERROR_DEVICE_LOST.
-After any such event, the logical device is considered _lost_.
-It is not possible to reset the logical device to a non-lost state, however
-the lost state is specific to a logical device (sname:VkDevice), and the
-corresponding physical device (sname:VkPhysicalDevice) may: be otherwise
-unaffected.
-
-In some cases, the physical device may: also be lost, and attempting to
-create a new logical device will fail, returning ename:VK_ERROR_DEVICE_LOST.
-This is usually indicative of a problem with the underlying implementation,
-or its connection to the host.
-If the physical device has not been lost, and a new logical device is
-successfully created from that physical device, it must: be in the non-lost
-state.
-
-[NOTE]
-.Note
-====
-Whilst logical device loss may: be recoverable, in the case of physical
-device loss, it is unlikely that an application will be able to recover
-unless additional, unaffected physical devices exist on the system.
-The error is largely informational and intended only to inform the user that
-a platform issue has occurred, and should: be investigated further.
-For example, underlying hardware may: have developed a fault or become
-physically disconnected from the rest of the system.
-In many cases, physical device loss may: cause other more serious issues
-such as the operating system crashing; in which case it may: not be reported
-via the Vulkan API.
-====
-
-When a device is lost, its child objects are not implicitly destroyed and
-their handles are still valid.
-Those objects must: still be destroyed before their parents or the device
-can: be destroyed (see the <<fundamentals-objectmodel-lifetime,Object
-Lifetime>> section).
-The host address space corresponding to device memory mapped using
-flink:vkMapMemory is still valid, and host memory accesses to these mapped
-regions are still valid, but the contents are undefined:.
-It is still legal to call any API command on the device and child objects.
-
-Once a device is lost, command execution may: fail, and commands that return
-a elink:VkResult may: return ename:VK_ERROR_DEVICE_LOST.
-Commands that do not allow runtime errors must: still operate correctly for
-valid usage and, if applicable, return valid data.
-
-Commands that wait indefinitely for device execution (namely
-flink:vkDeviceWaitIdle, flink:vkQueueWaitIdle, flink:vkWaitForFences
-ifdef::VK_KHR_swapchain[]
-or flink:vkAcquireNextImageKHR
-endif::VK_KHR_swapchain[]
-with a maximum pname:timeout, and flink:vkGetQueryPoolResults with the
-ename:VK_QUERY_RESULT_WAIT_BIT bit set in pname:flags) must: return in
-finite time even in the case of a lost device, and return either
-ename:VK_SUCCESS or ename:VK_ERROR_DEVICE_LOST.
-For any command that may: return ename:VK_ERROR_DEVICE_LOST, for the purpose
-of determining whether a command buffer is in the
-<<commandbuffers-lifecycle, pending state>>, or whether resources are
-considered in-use by the device, a return value of
-ename:VK_ERROR_DEVICE_LOST is equivalent to ename:VK_SUCCESS.
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-The content of any external memory objects that have been exported from or
-imported to a lost device become undefined:.
-Objects on other logical devices or in other APIs which are associated with
-the same underlying memory resource as the external memory objects on the
-lost device are unaffected other than their content becoming undefined:.
-The layout of subresources of images on other logical devices that are bound
-to sname:VkDeviceMemory objects associated with the same underlying memory
-resources as external memory objects on the lost device becomes
-ename:VK_IMAGE_LAYOUT_UNDEFINED.
-
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_semaphore[]
-
-The state of sname:VkSemaphore objects on other logical devices created by
-<<synchronization-semaphores-importing,importing a semaphore payload>> with
-temporary permanence which was exported from the lost device is undefined:.
-The state of sname:VkSemaphore objects on other logical devices that
-permanently share a semaphore payload with a sname:VkSemaphore object on the
-lost device is undefined:, and remains undefined: following any subsequent
-signal operations.
-Implementations must: ensure pending and subsequently submitted wait
-operations on such semaphores behave as defined in
-<<synchronization-semaphores-waiting-state,Semaphore State Requirements For
-Wait Operations>> for external semaphores not in a valid state for a wait
-operation.
-
-endif::VK_VERSION_1_1,VK_KHR_external_semaphore[]
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-TODO (piman) - I do not think we are very clear about what "`in-use by the
-device`" means.
-====
-endif::editing-notes[]
-
-
-[[devsandqueues-destruction]]
-=== Device Destruction
-
-[open,refpage='vkDestroyDevice',desc='Destroy a logical device',type='protos']
---
-To destroy a device, call:
-
-include::{generated}/api/protos/vkDestroyDevice.txt[]
-
-  * pname:device is the logical device to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-To ensure that no work is active on the device, flink:vkDeviceWaitIdle can:
-be used to gate the destruction of the device.
-Prior to destroying a device, an application is responsible for
-destroying/freeing any Vulkan objects that were created using that device as
-the first parameter of the corresponding ftext:vkCreate* or
-ftext:vkAllocate* command.
-
-[NOTE]
-.Note
-====
-The lifetime of each of these objects is bound by the lifetime of the
-sname:VkDevice object.
-Therefore, to avoid resource leaks, it is critical that an application
-explicitly free all of these resources prior to calling
-fname:vkDestroyDevice.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyDevice-device-00378]]
-    All child objects created on pname:device must: have been destroyed
-    prior to destroying pname:device
-  * [[VUID-vkDestroyDevice-device-00379]]
-    If sname:VkAllocationCallbacks were provided when pname:device was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyDevice-device-00380]]
-    If no sname:VkAllocationCallbacks were provided when pname:device was
-    created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyDevice.txt[]
---
-
-
-[[devsandqueues-queues]]
-== Queues
-
-
-[[devsandqueues-queueprops]]
-=== Queue Family Properties
-
-As discussed in the <<devsandqueues-physical-device-enumeration,Physical
-Device Enumeration>> section above, the
-flink:vkGetPhysicalDeviceQueueFamilyProperties command is used to retrieve
-details about the queue families and queues supported by a device.
-
-Each index in the pname:pQueueFamilyProperties array returned by
-flink:vkGetPhysicalDeviceQueueFamilyProperties describes a unique queue
-family on that physical device.
-These indices are used when creating queues, and they correspond directly
-with the pname:queueFamilyIndex that is passed to the flink:vkCreateDevice
-command via the slink:VkDeviceQueueCreateInfo structure as described in the
-<<devsandqueues-queue-creation,Queue Creation>> section below.
-
-Grouping of queue families within a physical device is
-implementation-dependent.
-
-[NOTE]
-.Note
-====
-The general expectation is that a physical device groups all queues of
-matching capabilities into a single family.
-However, while implementations should: do this, it is possible that a
-physical device may: return two separate queue families with the same
-capabilities.
-====
-
-Once an application has identified a physical device with the queue(s) that
-it desires to use, it will create those queues in conjunction with a logical
-device.
-This is described in the following section.
-
-
-[[devsandqueues-queue-creation]]
-=== Queue Creation
-
-[open,refpage='VkQueue',desc='Opaque handle to a queue object',type='handles']
---
-Creating a logical device also creates the queues associated with that
-device.
-The queues to create are described by a set of slink:VkDeviceQueueCreateInfo
-structures that are passed to flink:vkCreateDevice in
-pname:pQueueCreateInfos.
-
-Queues are represented by sname:VkQueue handles:
-
-include::{generated}/api/handles/VkQueue.txt[]
---
-
-[open,refpage='VkDeviceQueueCreateInfo',desc='Structure specifying parameters of a newly created device queue',type='structs']
---
-The sname:VkDeviceQueueCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkDeviceQueueCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-ifndef::VK_VERSION_1_1[]
-  * pname:flags is reserved for future use.
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1[]
-  * pname:flags is a bitmask indicating behavior of the queue.
-endif::VK_VERSION_1_1[]
-  * pname:queueFamilyIndex is an unsigned integer indicating the index of
-    the queue family in which to create the queue on this device.
-    This index corresponds to the index of an element of the
-    pname:pQueueFamilyProperties array that was returned by
-    fname:vkGetPhysicalDeviceQueueFamilyProperties.
-  * pname:queueCount is an unsigned integer specifying the number of queues
-    to create in the queue family indicated by pname:queueFamilyIndex.
-  * pname:pQueuePriorities is a pointer to an array of pname:queueCount
-    normalized floating point values, specifying priorities of work that
-    will be submitted to each created queue.
-    See <<devsandqueues-priority,Queue Priority>> for more information.
-
-.Valid Usage
-****
-  * [[VUID-VkDeviceQueueCreateInfo-queueFamilyIndex-00381]]
-    pname:queueFamilyIndex must: be less than
-    pname:pQueueFamilyPropertyCount returned by
-    fname:vkGetPhysicalDeviceQueueFamilyProperties
-  * [[VUID-VkDeviceQueueCreateInfo-queueCount-00382]]
-    pname:queueCount must: be less than or equal to the pname:queueCount
-    member of the sname:VkQueueFamilyProperties structure, as returned by
-    fname:vkGetPhysicalDeviceQueueFamilyProperties in the
-    pname:pQueueFamilyProperties[queueFamilyIndex]
-  * [[VUID-VkDeviceQueueCreateInfo-pQueuePriorities-00383]]
-    Each element of pname:pQueuePriorities must: be between `0.0` and `1.0`
-    inclusive
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-VkDeviceQueueCreateInfo-flags-02861]]
-    If the <<features-protectedMemory, protected memory>> feature is not
-    enabled, the ename:VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT bit of
-    pname:flags must: not be set
-  * [[VUID-VkDeviceQueueCreateInfo-flags-06449]]
-    If pname:flags includes ename:VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT,
-    pname:queueFamilyIndex must: be the index of a queue family that
-    includes the ename:VK_QUEUE_PROTECTED_BIT capability
-endif::VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/structs/VkDeviceQueueCreateInfo.txt[]
---
-
-ifdef::VK_VERSION_1_1[]
-[open,refpage='VkDeviceQueueCreateFlagBits',desc='Bitmask specifying behavior of the queue',type='enums']
---
-Bits which can: be set in slink:VkDeviceQueueCreateInfo::pname:flags to
-specify usage behavior of the queue are:
-
-include::{generated}/api/enums/VkDeviceQueueCreateFlagBits.txt[]
-
-  * ename:VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT specifies that the device
-    queue is a protected-capable queue.
---
-endif::VK_VERSION_1_1[]
-
-[open,refpage='VkDeviceQueueCreateFlags',desc='Bitmask of VkDeviceQueueCreateFlagBits',type='flags']
---
-include::{generated}/api/flags/VkDeviceQueueCreateFlags.txt[]
-
-ifndef::VK_VERSION_1_1[]
-tname:VkDeviceQueueCreateFlags is a bitmask type for setting a mask, but is
-currently reserved for future use.
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1[]
-tname:VkDeviceQueueCreateFlags is a bitmask type for setting a mask of zero
-or more elink:VkDeviceQueueCreateFlagBits.
-endif::VK_VERSION_1_1[]
---
-
-ifdef::VK_EXT_global_priority[]
-[open,refpage='VkDeviceQueueGlobalPriorityCreateInfoEXT',desc='Specify a system wide priority',type='structs']
---
-A queue can: be created with a system-wide priority by adding a
-sname:VkDeviceQueueGlobalPriorityCreateInfoEXT structure to the pname:pNext
-chain of slink:VkDeviceQueueCreateInfo.
-
-The sname:VkDeviceQueueGlobalPriorityCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkDeviceQueueGlobalPriorityCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:globalPriority is the system-wide priority associated to this
-    queue as specified by elink:VkQueueGlobalPriorityEXT
-
-A queue created without specifying
-sname:VkDeviceQueueGlobalPriorityCreateInfoEXT will default to
-ename:VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT.
-
-include::{generated}/validity/structs/VkDeviceQueueGlobalPriorityCreateInfoEXT.txt[]
---
-
-[open,refpage='VkQueueGlobalPriorityEXT',desc='Values specifying a system-wide queue priority',type='enums']
---
-Possible values of
-slink:VkDeviceQueueGlobalPriorityCreateInfoEXT::pname:globalPriority,
-specifying a system-wide priority level are:
-
-include::{generated}/api/enums/VkQueueGlobalPriorityEXT.txt[]
-
-Priority values are sorted in ascending order.
-A comparison operation on the enum values can be used to determine the
-priority order.
-
-  * ename:VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT is below the system default.
-    Useful for non-interactive tasks.
-  * ename:VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT is the system default
-    priority.
-  * ename:VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT is above the system default.
-  * ename:VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT is the highest priority.
-    Useful for critical tasks.
---
-
-Queues with higher system priority may: be allotted more processing time
-than queues with lower priority.
-An implementation may: allow a higher-priority queue to starve a
-lower-priority queue until the higher-priority queue has no further commands
-to execute.
-
-Priorities imply no ordering or scheduling constraints.
-
-No specific guarantees are made about higher priority queues receiving more
-processing time or better quality of service than lower priority queues.
-
-The global priority level of a queue takes precedence over the per-process
-queue priority (slink:VkDeviceQueueCreateInfo::pname:pQueuePriorities).
-
-Abuse of this feature may: result in starving the rest of the system of
-implementation resources.
-Therefore, the driver implementation may: deny requests to acquire a
-priority above the default priority
-(ename:VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT) if the caller does not have
-sufficient privileges.
-In this scenario ename:VK_ERROR_NOT_PERMITTED_EXT is returned.
-
-The driver implementation may: fail the queue allocation request if
-resources required to complete the operation have been exhausted (either by
-the same process or a different process).
-In this scenario ename:VK_ERROR_INITIALIZATION_FAILED is returned.
-
-ifdef::VK_EXT_global_priority_query[]
-If the <<features-globalPriorityQuery, pname:globalPriorityQuery>> feature
-is enabled and the requested global priority is not reported via
-slink:VkQueueFamilyGlobalPriorityPropertiesEXT, the driver implementation
-must: fail the queue creation.
-In this scenario, ename:VK_ERROR_INITIALIZATION_FAILED is returned.
-endif::VK_EXT_global_priority_query[]
-endif::VK_EXT_global_priority[]
-
-[open,refpage='vkGetDeviceQueue',desc='Get a queue handle from a device',type='protos']
---
-To retrieve a handle to a slink:VkQueue object, call:
-
-include::{generated}/api/protos/vkGetDeviceQueue.txt[]
-
-  * pname:device is the logical device that owns the queue.
-  * pname:queueFamilyIndex is the index of the queue family to which the
-    queue belongs.
-  * pname:queueIndex is the index within this queue family of the queue to
-    retrieve.
-  * pname:pQueue is a pointer to a slink:VkQueue object that will be filled
-    with the handle for the requested queue.
-
-ifdef::VK_VERSION_1_1[]
-fname:vkGetDeviceQueue must: only be used to get queues that were created
-with the pname:flags parameter of slink:VkDeviceQueueCreateInfo set to zero.
-To get queues that were created with a non-zero pname:flags parameter use
-flink:vkGetDeviceQueue2.
-endif::VK_VERSION_1_1[]
-
-.Valid Usage
-****
-  * [[VUID-vkGetDeviceQueue-queueFamilyIndex-00384]]
-    pname:queueFamilyIndex must: be one of the queue family indices
-    specified when pname:device was created, via the
-    slink:VkDeviceQueueCreateInfo structure
-  * [[VUID-vkGetDeviceQueue-queueIndex-00385]]
-    pname:queueIndex must: be less than the value of
-    slink:VkDeviceQueueCreateInfo::pname:queueCount for the queue family
-    indicated by pname:queueFamilyIndex when pname:device was created
-  * [[VUID-vkGetDeviceQueue-flags-01841]]
-    slink:VkDeviceQueueCreateInfo::pname:flags must: have been set to zero
-    when pname:device was created
-****
-
-include::{generated}/validity/protos/vkGetDeviceQueue.txt[]
---
-
-ifdef::VK_VERSION_1_1[]
-[open,refpage='vkGetDeviceQueue2',desc='Get a queue handle from a device',type='protos']
---
-To retrieve a handle to a slink:VkQueue object with specific
-tlink:VkDeviceQueueCreateFlags creation flags, call:
-
-include::{generated}/api/protos/vkGetDeviceQueue2.txt[]
-
-  * pname:device is the logical device that owns the queue.
-  * pname:pQueueInfo is a pointer to a slink:VkDeviceQueueInfo2 structure,
-    describing parameters of the device queue to be retrieved.
-  * pname:pQueue is a pointer to a slink:VkQueue object that will be filled
-    with the handle for the requested queue.
-
-include::{generated}/validity/protos/vkGetDeviceQueue2.txt[]
---
-
-[open,refpage='VkDeviceQueueInfo2',desc='Structure specifying the parameters used for device queue creation',type='structs']
---
-The sname:VkDeviceQueueInfo2 structure is defined as:
-
-include::{generated}/api/structs/VkDeviceQueueInfo2.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-    The pname:pNext chain of sname:VkDeviceQueueInfo2 can: be used to
-    provide additional device queue parameters to fname:vkGetDeviceQueue2.
-  * pname:flags is a tlink:VkDeviceQueueCreateFlags value indicating the
-    flags used to create the device queue.
-  * pname:queueFamilyIndex is the index of the queue family to which the
-    queue belongs.
-  * pname:queueIndex is the index within this queue family of the queue to
-    retrieve.
-
-The queue returned by fname:vkGetDeviceQueue2 must: have the same
-pname:flags value from this structure as that used at device creation time
-in a slink:VkDeviceQueueCreateInfo structure.
-If no matching pname:flags were specified at device creation time, then the
-handle returned in pname:pQueue must: be `NULL`.
-
-.Valid Usage
-****
-  * [[VUID-VkDeviceQueueInfo2-queueFamilyIndex-01842]]
-    pname:queueFamilyIndex must: be one of the queue family indices
-    specified when pname:device was created, via the
-    slink:VkDeviceQueueCreateInfo structure
-  * [[VUID-VkDeviceQueueInfo2-flags-06225]]
-    pname:flags must: be equal to slink:VkDeviceQueueCreateInfo::pname:flags
-    for a slink:VkDeviceQueueCreateInfo structure for the queue family
-    indicated by pname:queueFamilyIndex when pname:device was created
-  * [[VUID-VkDeviceQueueInfo2-queueIndex-01843]]
-    pname:queueIndex must: be less than
-    slink:VkDeviceQueueCreateInfo::pname:queueCount for the corresponding
-    queue family and flags indicated by pname:queueFamilyIndex and
-    pname:flags when pname:device was created
-****
-
-include::{generated}/validity/structs/VkDeviceQueueInfo2.txt[]
---
-endif::VK_VERSION_1_1[]
-
-
-[[devsandqueues-index]]
-=== Queue Family Index
-
-The queue family index is used in multiple places in Vulkan in order to tie
-operations to a specific family of queues.
-
-When retrieving a handle to the queue via fname:vkGetDeviceQueue, the queue
-family index is used to select which queue family to retrieve the
-sname:VkQueue handle from as described in the previous section.
-
-When creating a sname:VkCommandPool object (see
-<<commandbuffers-pools,Command Pools>>), a queue family index is specified
-in the slink:VkCommandPoolCreateInfo structure.
-Command buffers from this pool can: only be submitted on queues
-corresponding to this queue family.
-
-When creating sname:VkImage (see <<resources-images,Images>>) and
-sname:VkBuffer (see <<resources-buffers,Buffers>>) resources, a set of queue
-families is included in the slink:VkImageCreateInfo and
-slink:VkBufferCreateInfo structures to specify the queue families that can:
-access the resource.
-
-When inserting a slink:VkBufferMemoryBarrier or slink:VkImageMemoryBarrier
-(see <<synchronization-pipeline-barriers>>), a source and destination queue
-family index is specified to allow the ownership of a buffer or image to be
-transferred from one queue family to another.
-See the <<resources-sharing,Resource Sharing>> section for details.
-
-
-[[devsandqueues-priority]]
-=== Queue Priority
-
-Each queue is assigned a priority, as set in the
-slink:VkDeviceQueueCreateInfo structures when creating the device.
-The priority of each queue is a normalized floating point value between 0.0
-and 1.0, which is then translated to a discrete priority level by the
-implementation.
-Higher values indicate a higher priority, with 0.0 being the lowest priority
-and 1.0 being the highest.
-
-Within the same device, queues with higher priority may: be allotted more
-processing time than queues with lower priority.
-The implementation makes no guarantees with regards to ordering or
-scheduling among queues with the same priority, other than the constraints
-defined by any <<synchronization, explicit synchronization primitives>>.
-The implementation makes no guarantees with regards to queues across
-different devices.
-
-An implementation may: allow a higher-priority queue to starve a
-lower-priority queue on the same sname:VkDevice until the higher-priority
-queue has no further commands to execute.
-The relationship of queue priorities must: not cause queues on one
-sname:VkDevice to starve queues on another sname:VkDevice.
-
-No specific guarantees are made about higher priority queues receiving more
-processing time or better quality of service than lower priority queues.
-
-
-[[devsandqueues-submission]]
-=== Queue Submission
-
-Work is submitted to a queue via _queue submission_ commands such as
-ifdef::VK_KHR_synchronization2[]
-flink:vkQueueSubmit2KHR or
-endif::VK_KHR_synchronization2[]
-flink:vkQueueSubmit.
-Queue submission commands define a set of _queue operations_ to be executed
-by the underlying physical device, including synchronization with semaphores
-and fences.
-
-Submission commands take as parameters a target queue, zero or more
-_batches_ of work, and an optional: fence to signal upon completion.
-Each batch consists of three distinct parts:
-
-  . Zero or more semaphores to wait on before execution of the rest of the
-    batch.
-  ** If present, these describe a <<synchronization-semaphores-waiting,
-     semaphore wait operation>>.
-  . Zero or more work items to execute.
-  ** If present, these describe a _queue operation_ matching the work
-     described.
-  . Zero or more semaphores to signal upon completion of the work items.
-  ** If present, these describe a <<synchronization-semaphores-signaling,
-     semaphore signal operation>>.
-
-If a fence is present in a queue submission, it describes a
-<<synchronization-fences-signaling, fence signal operation>>.
-
-All work described by a queue submission command must: be submitted to the
-queue before the command returns.
-
-
-[[devsandqueues-sparsebinding]]
-==== Sparse Memory Binding
-
-In Vulkan it is possible to sparsely bind memory to buffers and images as
-described in the <<sparsememory,Sparse Resource>> chapter.
-Sparse memory binding is a queue operation.
-A queue whose flags include the ename:VK_QUEUE_SPARSE_BINDING_BIT must: be
-able to support the mapping of a virtual address to a physical address on
-the device.
-This causes an update to the page table mappings on the device.
-This update must: be synchronized on a queue to avoid corrupting page table
-mappings during execution of graphics commands.
-By binding the sparse memory resources on queues, all commands that are
-dependent on the updated bindings are synchronized to only execute after the
-binding is updated.
-See the <<synchronization,Synchronization and Cache Control>> chapter for
-how this synchronization is accomplished.
-
-
-[[devsandqueues-queuedestruction]]
-=== Queue Destruction
-
-Queues are created along with a logical device during fname:vkCreateDevice.
-All queues associated with a logical device are destroyed when
-fname:vkDestroyDevice is called on that device.
diff --git a/registry/vulkan/chapters/dispatch.txt b/registry/vulkan/chapters/dispatch.txt
deleted file mode 100644
index a5b247b..0000000
--- a/registry/vulkan/chapters/dispatch.txt
+++ /dev/null
@@ -1,229 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[dispatch]]
-= Dispatching Commands
-
-_Dispatching commands_ (commands with ftext:Dispatch in the name) provoke
-work in a compute pipeline.
-Dispatching commands are recorded into a command buffer and when executed by
-a queue, will produce work which executes according to the bound compute
-pipeline.
-A compute pipeline must: be bound to a command buffer before any dispatching
-commands are recorded in that command buffer.
-
-[open,refpage='vkCmdDispatch',desc='Dispatch compute work items',type='protos']
---
-:refpage: vkCmdDispatch
-
-To record a dispatch, call:
-
-include::{generated}/api/protos/vkCmdDispatch.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:groupCountX is the number of local workgroups to dispatch in the X
-    dimension.
-  * pname:groupCountY is the number of local workgroups to dispatch in the Y
-    dimension.
-  * pname:groupCountZ is the number of local workgroups to dispatch in the Z
-    dimension.
-
-When the command is executed, a global workgroup consisting of
-[eq]#pname:groupCountX {times} pname:groupCountY {times} pname:groupCountZ#
-local workgroups is assembled.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_dispatch_common.txt[]
-include::{chapters}/commonvalidity/draw_dispatch_nonindirect_common.txt[]
-  * [[VUID-vkCmdDispatch-groupCountX-00386]]
-    pname:groupCountX must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[0]
-  * [[VUID-vkCmdDispatch-groupCountY-00387]]
-    pname:groupCountY must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[1]
-  * [[VUID-vkCmdDispatch-groupCountZ-00388]]
-    pname:groupCountZ must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[2]
-****
-
-include::{generated}/validity/protos/vkCmdDispatch.txt[]
---
-
-[open,refpage='vkCmdDispatchIndirect',desc='Dispatch compute work items with indirect parameters',type='protos']
---
-:refpage: vkCmdDispatchIndirect
-
-To record an indirect dispatching command, call:
-
-include::{generated}/api/protos/vkCmdDispatchIndirect.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:buffer is the buffer containing dispatch parameters.
-  * pname:offset is the byte offset into pname:buffer where parameters
-    begin.
-
-fname:vkCmdDispatchIndirect behaves similarly to flink:vkCmdDispatch except
-that the parameters are read by the device from a buffer during execution.
-The parameters of the dispatch are encoded in a
-slink:VkDispatchIndirectCommand structure taken from pname:buffer starting
-at pname:offset.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_dispatch_common.txt[]
-include::{chapters}/commonvalidity/draw_dispatch_indirect_common.txt[]
-  * [[VUID-vkCmdDispatchIndirect-offset-00407]]
-    The sum of pname:offset and the size of sname:VkDispatchIndirectCommand
-    must: be less than or equal to the size of pname:buffer
-****
-
-include::{generated}/validity/protos/vkCmdDispatchIndirect.txt[]
---
-
-[open,refpage='VkDispatchIndirectCommand',desc='Structure specifying a indirect dispatching command',type='structs',xrefs='vkCmdDispatchIndirect']
---
-The sname:VkDispatchIndirectCommand structure is defined as:
-
-include::{generated}/api/structs/VkDispatchIndirectCommand.txt[]
-
-  * pname:x is the number of local workgroups to dispatch in the X
-    dimension.
-  * pname:y is the number of local workgroups to dispatch in the Y
-    dimension.
-  * pname:z is the number of local workgroups to dispatch in the Z
-    dimension.
-
-The members of sname:VkDispatchIndirectCommand have the same meaning as the
-corresponding parameters of flink:vkCmdDispatch.
-
-.Valid Usage
-****
-  * [[VUID-VkDispatchIndirectCommand-x-00417]]
-    pname:x must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[0]
-  * [[VUID-VkDispatchIndirectCommand-y-00418]]
-    pname:y must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[1]
-  * [[VUID-VkDispatchIndirectCommand-z-00419]]
-    pname:z must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[2]
-****
-
-include::{generated}/validity/structs/VkDispatchIndirectCommand.txt[]
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[open,refpage='vkCmdDispatchBase',desc='Dispatch compute work items with non-zero base values for the workgroup IDs',type='protos']
---
-:refpage: vkCmdDispatchBase
-
-To record a dispatch using non-zero base values for the components of
-code:WorkgroupId, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkCmdDispatchBase.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_device_group[or the equivalent command]
-
-ifdef::VK_KHR_device_group[]
-include::{generated}/api/protos/vkCmdDispatchBaseKHR.txt[]
-endif::VK_KHR_device_group[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:baseGroupX is the start value for the X component of
-    code:WorkgroupId.
-  * pname:baseGroupY is the start value for the Y component of
-    code:WorkgroupId.
-  * pname:baseGroupZ is the start value for the Z component of
-    code:WorkgroupId.
-  * pname:groupCountX is the number of local workgroups to dispatch in the X
-    dimension.
-  * pname:groupCountY is the number of local workgroups to dispatch in the Y
-    dimension.
-  * pname:groupCountZ is the number of local workgroups to dispatch in the Z
-    dimension.
-
-When the command is executed, a global workgroup consisting of
-[eq]#pname:groupCountX {times} pname:groupCountY {times} pname:groupCountZ#
-local workgroups is assembled, with code:WorkgroupId values ranging from
-[eq]#[ptext:baseGroup*, ptext:baseGroup* {plus} ptext:groupCount*)# in each
-component.
-flink:vkCmdDispatch is equivalent to
-`vkCmdDispatchBase(0,0,0,groupCountX,groupCountY,groupCountZ)`.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_dispatch_common.txt[]
-include::{chapters}/commonvalidity/draw_dispatch_nonindirect_common.txt[]
-  * [[VUID-vkCmdDispatchBase-baseGroupX-00421]]
-    pname:baseGroupX must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[0]
-  * [[VUID-vkCmdDispatchBase-baseGroupX-00422]]
-    pname:baseGroupY must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[1]
-  * [[VUID-vkCmdDispatchBase-baseGroupZ-00423]]
-    pname:baseGroupZ must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[2]
-  * [[VUID-vkCmdDispatchBase-groupCountX-00424]]
-    pname:groupCountX must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[0] minus
-    pname:baseGroupX
-  * [[VUID-vkCmdDispatchBase-groupCountY-00425]]
-    pname:groupCountY must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[1] minus
-    pname:baseGroupY
-  * [[VUID-vkCmdDispatchBase-groupCountZ-00426]]
-    pname:groupCountZ must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[2] minus
-    pname:baseGroupZ
-  * [[VUID-vkCmdDispatchBase-baseGroupX-00427]]
-    If any of pname:baseGroupX, pname:baseGroupY, or pname:baseGroupZ are
-    not zero, then the bound compute pipeline must: have been created with
-    the ename:VK_PIPELINE_CREATE_DISPATCH_BASE flag
-****
-
-include::{generated}/validity/protos/vkCmdDispatchBase.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-ifdef::VK_HUAWEI_subpass_shading[]
-[open,refpage='vkCmdSubpassShadingHUAWEI',desc='Dispatch compute work items',type='protos']
---
-:refpage: vkCmdSubpassShadingHUAWEI
-
-A subpass shading dispatches a compute pipeline work with the work dimension
-of render area of the calling subpass and work groups are partitioned by
-specified work group size.
-Subpass operations like subpassLoad and subpassLoadMS are allowed to be
-used.
-
-To record a subpass shading, call:
-
-include::{generated}/api/protos/vkCmdSubpassShadingHUAWEI.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-
-When the command is executed, a global workgroup consisting of ceil (render
-area size / local workgroup size) local workgroups is assembled.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_dispatch_common.txt[]
-  * [[VUID-vkCmdSubpassShadingHUAWEI-None-04931]]
-    This command must be called in a subpass with bind point
-    ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI.
-    No draw commands can be called in the same subpass.
-    Only one flink:vkCmdSubpassShadingHUAWEI command can be called in a
-    subpass
-****
-
-include::{generated}/validity/protos/vkCmdSubpassShadingHUAWEI.txt[]
---
-endif::VK_HUAWEI_subpass_shading[]
diff --git a/registry/vulkan/chapters/drawing.txt b/registry/vulkan/chapters/drawing.txt
deleted file mode 100644
index 1a348a5..0000000
--- a/registry/vulkan/chapters/drawing.txt
+++ /dev/null
@@ -1,1705 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[drawing]]
-= Drawing Commands
-
-_Drawing commands_ (commands with ftext:Draw in the name) provoke work in a
-graphics pipeline.
-Drawing commands are recorded into a command buffer and when executed by a
-queue, will produce work which executes according to the bound graphics
-pipeline.
-A graphics pipeline must: be bound to a command buffer before any drawing
-commands are recorded in that command buffer.
-
-[open,refpage='VkPipelineInputAssemblyStateCreateInfo',desc='Structure specifying parameters of a newly created pipeline input assembly state',type='structs']
---
-ifdef::VK_NV_mesh_shader[]
-Drawing can be achieved in two modes:
-
-  * <<drawing-mesh-shading,Programmable Mesh Shading>>, the mesh shader
-    assembles primitives, or
-  * <<drawing-primitive-shading,Programmable Primitive Shading>>, the input
-    primitives are assembled
-
-as follows.
-endif::VK_NV_mesh_shader[]
-
-Each draw is made up of zero or more vertices and zero or more instances,
-which are processed by the device and result in the assembly of primitives.
-Primitives are assembled according to the pname:pInputAssemblyState member
-of the slink:VkGraphicsPipelineCreateInfo structure, which is of type
-sname:VkPipelineInputAssemblyStateCreateInfo:
-
-include::{generated}/api/structs/VkPipelineInputAssemblyStateCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:topology is a elink:VkPrimitiveTopology defining the primitive
-    topology, as described below.
-  * pname:primitiveRestartEnable controls whether a special vertex index
-    value is treated as restarting the assembly of primitives.
-    This enable only applies to indexed draws (flink:vkCmdDrawIndexed,
-ifdef::VK_EXT_multi_draw[]
-    flink:vkCmdDrawMultiIndexedEXT,
-endif::VK_EXT_multi_draw[]
-    and flink:vkCmdDrawIndexedIndirect), and the special index value is
-    either 0xFFFFFFFF when the pname:indexType parameter of
-    fname:vkCmdBindIndexBuffer is equal to ename:VK_INDEX_TYPE_UINT32,
-ifdef::VK_EXT_index_type_uint8[]
-    0xFF when pname:indexType is equal to ename:VK_INDEX_TYPE_UINT8_EXT,
-endif::VK_EXT_index_type_uint8[]
-    or 0xFFFF when pname:indexType is equal to ename:VK_INDEX_TYPE_UINT16.
-ifndef::VK_EXT_primitive_topology_list_restart[]
-    Primitive restart is not allowed for "`list`" topologies.
-endif::VK_EXT_primitive_topology_list_restart[]
-ifdef::VK_EXT_primitive_topology_list_restart[]
-    Primitive restart is not allowed for "`list`" topologies, unless one of
-    the features
-    <<features-primitiveTopologyPatchListRestart,pname:primitiveTopologyPatchListRestart>>
-    (for ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST) or
-    <<features-primitiveTopologyListRestart,pname:primitiveTopologyListRestart>>
-    (for all other list topologies) is enabled.
-endif::VK_EXT_primitive_topology_list_restart[]
-
-Restarting the assembly of primitives discards the most recent index values
-if those elements formed an incomplete primitive, and restarts the primitive
-assembly using the subsequent indices, but only assembling the immediately
-following element through the end of the originally specified elements.
-The primitive restart index value comparison is performed before adding the
-pname:vertexOffset value to the index value.
-
-.Valid Usage
-****
-ifndef::VK_EXT_primitive_topology_list_restart[]
-  * [[VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428]]
-    If pname:topology is ename:VK_PRIMITIVE_TOPOLOGY_POINT_LIST,
-    ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST,
-    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
-    ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY,
-    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY or
-    ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, pname:primitiveRestartEnable
-    must: be ename:VK_FALSE
-endif::VK_EXT_primitive_topology_list_restart[]
-ifdef::VK_EXT_primitive_topology_list_restart[]
-  * [[VUID-VkPipelineInputAssemblyStateCreateInfo-topology-06252]]
-    If pname:topology is ename:VK_PRIMITIVE_TOPOLOGY_POINT_LIST,
-    ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST,
-    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
-    ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY or
-    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY, and
-    pname:primitiveRestartEnable is ename:VK_TRUE, the
-    <<features-primitiveTopologyListRestart,pname:primitiveTopologyListRestart>>
-    feature must: be enabled
-  * [[VUID-VkPipelineInputAssemblyStateCreateInfo-topology-06253]]
-    If pname:topology is ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, and
-    pname:primitiveRestartEnable is ename:VK_TRUE, the
-    <<features-primitiveTopologyPatchListRestart,pname:primitiveTopologyPatchListRestart>>
-    feature must: be enabled
-endif::VK_EXT_primitive_topology_list_restart[]
-  * [[VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00429]]
-    If the <<features-geometryShader,geometry shaders>> feature is not
-    enabled, pname:topology must: not be any of
-    ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY,
-    ename:VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY,
-    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY or
-    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY
-  * [[VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00430]]
-    If the <<features-tessellationShader,tessellation shaders>> feature is
-    not enabled, pname:topology must: not be
-    ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST
-ifdef::VK_KHR_portability_subset[]
-  * [[VUID-VkPipelineInputAssemblyStateCreateInfo-triangleFans-04452]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:triangleFans
-    is ename:VK_FALSE, pname:topology must: not be
-    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN
-endif::VK_KHR_portability_subset[]
-****
-
-include::{generated}/validity/structs/VkPipelineInputAssemblyStateCreateInfo.txt[]
---
-
-[open,refpage='VkPipelineInputAssemblyStateCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineInputAssemblyStateCreateFlags.txt[]
-
-tname:VkPipelineInputAssemblyStateCreateFlags is a bitmask type for setting
-a mask, but is currently reserved for future use.
---
-
-ifdef::VK_EXT_extended_dynamic_state2[]
-[open,refpage='vkCmdSetPrimitiveRestartEnableEXT',desc='Set primitive assembly restart state dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically control>> whether a special vertex
-index value is treated as restarting the assembly of primitives, call:
-
-include::{generated}/api/protos/vkCmdSetPrimitiveRestartEnableEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:primitiveRestartEnable controls whether a special vertex index
-    value is treated as restarting the assembly of primitives.
-    It behaves in the same way as
-    sname:VkPipelineInputAssemblyStateCreateInfo::pname:primitiveRestartEnable
-
-This command sets the primitive restart enable for subsequent drawing
-commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineInputAssemblyStateCreateInfo::pname:primitiveRestartEnable
-value used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetPrimitiveRestartEnableEXT-None-04866]]
-    The <<features-extendedDynamicState2, extendedDynamicState2>> feature
-    must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdSetPrimitiveRestartEnableEXT.txt[]
---
-endif::VK_EXT_extended_dynamic_state2[]
-
-
-[[drawing-primitive-topologies]]
-== Primitive Topologies
-
-_Primitive topology_ determines how consecutive vertices are organized into
-primitives, and determines the type of primitive that is used at the
-beginning of the graphics pipeline.
-The effective topology for later stages of the pipeline is altered by
-tessellation or geometry shading (if either is in use) and depends on the
-execution modes of those shaders.
-ifdef::VK_NV_mesh_shader[]
-In the case of mesh shading the only effective topology is defined by the
-execution mode of the mesh shader.
-endif::VK_NV_mesh_shader[]
-
-[open,refpage='VkPrimitiveTopology',desc='Supported primitive topologies',type='enums']
---
-The primitive topologies defined by elink:VkPrimitiveTopology are:
-
-include::{generated}/api/enums/VkPrimitiveTopology.txt[]
-
-  * ename:VK_PRIMITIVE_TOPOLOGY_POINT_LIST specifies a series of
-    <<drawing-point-lists,separate point primitives>>.
-  * ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST specifies a series of
-    <<drawing-line-lists,separate line primitives>>.
-  * ename:VK_PRIMITIVE_TOPOLOGY_LINE_STRIP specifies a series of
-    <<drawing-line-strips,connected line primitives>> with consecutive lines
-    sharing a vertex.
-  * ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST specifies a series of
-    <<drawing-triangle-lists,separate triangle primitives>>.
-  * ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP specifies a series of
-    <<drawing-triangle-strips,connected triangle primitives>> with
-    consecutive triangles sharing an edge.
-  * ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN specifies a series of
-    <<drawing-triangle-fans,connected triangle primitives>> with all
-    triangles sharing a common vertex.
-ifdef::VK_KHR_portability_subset[]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:triangleFans
-    is ename:VK_FALSE, then triangle fans are not supported by the
-    implementation, and ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN must: not
-    be used.
-endif::VK_KHR_portability_subset[]
-  * ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY specifies a series
-    of <<drawing-line-lists-with-adjacency,separate line primitives with
-    adjacency>>.
-  * ename:VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY specifies a series
-    of <<drawing-line-strips-with-adjacency,connected line primitives with
-    adjacency>>, with consecutive primitives sharing three vertices.
-  * ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY specifies a
-    series of <<drawing-triangle-lists-with-adjacency,separate triangle
-    primitives with adjacency>>.
-  * ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY specifies
-    <<drawing-triangle-strips-with-adjacency,connected triangle primitives
-    with adjacency>>, with consecutive triangles sharing an edge.
-  * ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST specifies
-    <<drawing-patch-lists,separate patch primitives>>.
-
-Each primitive topology, and its construction from a list of vertices, is
-described in detail below with a supporting diagram, according to the
-following key:
-
-[cols="1,2,9"]
-|====
-^.^| image:{images}/primitive_topology_key_vertex.svg[pdfwidth=6pt,align="center",opts="{imageopts}"]
-.^| Vertex
-| A point in 3-dimensional space.
-  Positions chosen within the diagrams are arbitrary and for
-  illustration only.
-
-^.^| image:{images}/primitive_topology_key_vertex_number.svg[pdfwidth=6pt,align="center",opts="{imageopts}"]
-.^| Vertex Number
-| Sequence position of a vertex within the provided vertex data.
-
-^.^| image:{images}/primitive_topology_key_provoking_vertex.svg[pdfwidth=30pt,align="center",opts="{imageopts}"]
-.^| Provoking Vertex
-| Provoking vertex within the main primitive.
-  The tail is angled towards the relevant primitive.
-  Used in <<vertexpostproc-flatshading, flat shading>>.
-
-^.^| image:{images}/primitive_topology_key_edge.svg[pdfwidth=30pt,align="center",opts="{imageopts}"]
-.^| Primitive Edge
-| An edge connecting the points of a main primitive.
-
-^.^| image:{images}/primitive_topology_key_adjacency_edge.svg[pdfwidth=30pt,align="center",opts="{imageopts}"]
-.^| Adjacency Edge
-| Points connected by these lines do not contribute to a main primitive,
-  and are only accessible in a <<geometry,geometry shader>>.
-
-^.^| image:{images}/primitive_topology_key_winding_order.svg[pdfwidth=30pt,align="center",opts="{imageopts}"]
-.^| Winding Order
-| The relative order in which vertices are defined within a primitive,
-  used in the <<primsrast-polygons-basic,facing determination>>.
-  This ordering has no specific start or end point.
-|====
-
-The diagrams are supported with mathematical definitions where the vertices
-([eq]#v#) and primitives ([eq]#p#) are numbered starting from [eq]#0#;
-[eq]#v~0~# is the first vertex in the provided data and [eq]#p~0~# is the
-first primitive in the set of primitives defined by the vertices and
-topology.
---
-
-ifdef::VK_EXT_extended_dynamic_state[]
-[open,refpage='vkCmdSetPrimitiveTopologyEXT',desc='Set primitive topology state dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> primitive topology, call:
-
-include::{generated}/api/protos/vkCmdSetPrimitiveTopologyEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:primitiveTopology specifies the primitive topology to use for
-    drawing.
-
-This command sets the primitive topology for subsequent drawing commands
-when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineInputAssemblyStateCreateInfo::pname:topology value used to
-create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetPrimitiveTopologyEXT-None-03347]]
-    The <<features-extendedDynamicState, extendedDynamicState>> feature
-    must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdSetPrimitiveTopologyEXT.txt[]
---
-
-
-[[drawing-primitive-topology-class]]
-=== Topology Class
-
-The primitive topologies are grouped into the following topology classes:
-
-[[topology-classes]]
-.Topology classes
-[options="header"]
-|===
-| Topology Class  | Primitive Topology
-| Point           | ename:VK_PRIMITIVE_TOPOLOGY_POINT_LIST
-| Line            | ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST,
-                    ename:VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,
-                    ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY,
-                    ename:VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY
-| Triangle        | ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
-                    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
-                    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN,
-                    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY,
-                    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY
-| Patch           | ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST
-|===
-endif::VK_EXT_extended_dynamic_state[]
-
-
-[[drawing-point-lists]]
-=== Point Lists
-
-When the topology is ename:VK_PRIMITIVE_TOPOLOGY_POINT_LIST, each
-consecutive vertex defines a single point primitive, according to the
-equation:
-
-  {empty}:: [eq]#p~i~ = {v~i~}#
-
-As there is only one vertex, that vertex is the provoking vertex.
-The number of primitives generated is equal to [eq]#pname:vertexCount#.
-
-image::{images}/primitive_topology_point_list.svg[align="center",opts="{imageopts}"]
-
-
-[[drawing-line-lists]]
-=== Line Lists
-
-When the primitive topology is ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST, each
-consecutive pair of vertices defines a single line primitive, according to
-the equation:
-
-  {empty}:: [eq]#p~i~ = {v~2i~, v~2i+1~}#
-
-The number of primitives generated is equal to
-[eq]#{lfloor}pname:vertexCount/2{rfloor}#.
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT, the
-endif::VK_EXT_provoking_vertex[]
-ifndef::VK_EXT_provoking_vertex[]
-The
-endif::VK_EXT_provoking_vertex[]
-provoking vertex for [eq]#p~i~# is [eq]#v~2i~#.
-
-image::{images}/primitive_topology_line_list.svg[align="center",opts="{imageopts}"]
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT, the provoking vertex for
-[eq]#p~i~# is [eq]#v~2i+1~#.
-
-image::{images}/primitive_topology_line_list_last.svg[align="center",opts="{imageopts}"]
-endif::VK_EXT_provoking_vertex[]
-
-
-[[drawing-line-strips]]
-=== Line Strips
-
-When the primitive topology is ename:VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, one
-line primitive is defined by each vertex and the following vertex, according
-to the equation:
-
-  {empty}:: [eq]#p~i~ = {v~i~, v~i+1~}#
-
-The number of primitives generated is equal to
-[eq]#max(0,pname:vertexCount-1)#.
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT, the
-endif::VK_EXT_provoking_vertex[]
-ifndef::VK_EXT_provoking_vertex[]
-The
-endif::VK_EXT_provoking_vertex[]
-provoking vertex for [eq]#p~i~# is [eq]#v~i~#.
-
-image::{images}/primitive_topology_line_strip.svg[align="center",opts="{imageopts}"]
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT, the provoking vertex for
-[eq]#p~i~# is [eq]#v~i+1~#.
-
-image::{images}/primitive_topology_line_strip_last.svg[align="center",opts="{imageopts}"]
-endif::VK_EXT_provoking_vertex[]
-
-
-[[drawing-triangle-lists]]
-=== Triangle Lists
-
-When the primitive topology is ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
-each consecutive set of three vertices defines a single triangle primitive,
-according to the equation:
-
-  {empty}:: [eq]#p~i~ = {v~3i~, v~3i+1~, v~3i+2~}#
-
-The number of primitives generated is equal to
-[eq]#{lfloor}pname:vertexCount/3{rfloor}#.
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT, the
-endif::VK_EXT_provoking_vertex[]
-ifndef::VK_EXT_provoking_vertex[]
-The
-endif::VK_EXT_provoking_vertex[]
-provoking vertex for [eq]#p~i~# is [eq]#v~3i~#.
-
-image::{images}/primitive_topology_triangle_list.svg[align="center",opts="{imageopts}"]
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT, the provoking vertex for
-[eq]#p~i~# is [eq]#v~3i+2~#.
-
-image::{images}/primitive_topology_triangle_list_last.svg[align="center",opts="{imageopts}"]
-endif::VK_EXT_provoking_vertex[]
-
-
-[[drawing-triangle-strips]]
-=== Triangle Strips
-
-When the primitive topology is ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
-one triangle primitive is defined by each vertex and the two vertices that
-follow it, according to the equation:
-
-  {empty}:: [eq]#p~i~ = {v~i~, v~i+(1+i%2)~, v~i+(2-i%2)~}#
-
-The number of primitives generated is equal to
-[eq]#max(0,pname:vertexCount-2)#.
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT, the
-endif::VK_EXT_provoking_vertex[]
-ifndef::VK_EXT_provoking_vertex[]
-The
-endif::VK_EXT_provoking_vertex[]
-provoking vertex for [eq]#p~i~# is [eq]#v~i~#.
-
-image::{images}/primitive_topology_triangle_strip.svg[align="center",opts="{imageopts}"]
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT, the provoking vertex for
-[eq]#p~i~# is [eq]#v~i+2~#.
-
-image::{images}/primitive_topology_triangle_strip_last.svg[align="center",opts="{imageopts}"]
-endif::VK_EXT_provoking_vertex[]
-
-[NOTE]
-.Note
-====
-The ordering of the vertices in each successive triangle is reversed, so
-that the winding order is consistent throughout the strip.
-====
-
-
-[[drawing-triangle-fans]]
-=== Triangle Fans
-
-When the primitive topology is ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN,
-triangle primitives are defined around a shared common vertex, according to
-the equation:
-
-  {empty}:: [eq]#p~i~ = {v~i+1~, v~i+2~, v~0~}#
-
-The number of primitives generated is equal to
-[eq]#max(0,pname:vertexCount-2)#.
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT, the
-endif::VK_EXT_provoking_vertex[]
-ifndef::VK_EXT_provoking_vertex[]
-The
-endif::VK_EXT_provoking_vertex[]
-provoking vertex for [eq]#p~i~# is [eq]#v~i+1~#.
-
-image::{images}/primitive_topology_triangle_fan.svg[align="center",opts="{imageopts}"]
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT, the provoking vertex for
-[eq]#p~i~# is [eq]#v~i+2~#.
-
-image::{images}/primitive_topology_triangle_fan_last.svg[align="center",opts="{imageopts}"]
-endif::VK_EXT_provoking_vertex[]
-
-ifdef::VK_KHR_portability_subset[]
-[NOTE]
-.Note
-====
-If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:triangleFans is
-ename:VK_FALSE, then triangle fans are not supported by the implementation,
-and ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN must: not be used.
-====
-endif::VK_KHR_portability_subset[]
-
-
-[[drawing-line-lists-with-adjacency]]
-=== Line Lists With Adjacency
-
-When the primitive topology is
-ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY, each consecutive set
-of four vertices defines a single line primitive with adjacency, according
-to the equation:
-
-  {empty}:: [eq]#p~i~ = {v~4i~, v~4i+1~, v~4i+2~,v~4i+3~}#
-
-A line primitive is described by the second and third vertices of the total
-primitive, with the remaining two vertices only accessible in a
-<<geometry,geometry shader>>.
-
-The number of primitives generated is equal to
-[eq]#{lfloor}pname:vertexCount/4{rfloor}#.
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT, the
-endif::VK_EXT_provoking_vertex[]
-ifndef::VK_EXT_provoking_vertex[]
-The
-endif::VK_EXT_provoking_vertex[]
-provoking vertex for [eq]#p~i~# is [eq]#v~4i+1~#.
-
-image::{images}/primitive_topology_line_list_with_adjacency.svg[align="center",opts="{imageopts}"]
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT, the provoking vertex for
-[eq]#p~i~# is [eq]#v~4i+2~#.
-
-image::{images}/primitive_topology_line_list_with_adjacency_last.svg[align="center",opts="{imageopts}"]
-endif::VK_EXT_provoking_vertex[]
-
-
-[[drawing-line-strips-with-adjacency]]
-=== Line Strips With Adjacency
-
-When the primitive topology is
-ename:VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY, one line primitive
-with adjacency is defined by each vertex and the following vertex, according
-to the equation:
-
-  {empty}:: [eq]#p~i~ = {v~i~, v~i+1~, v~i+2~, v~i+3~}#
-
-A line primitive is described by the second and third vertices of the total
-primitive, with the remaining two vertices only accessible in a
-<<geometry,geometry shader>>.
-
-The number of primitives generated is equal to
-[eq]#max(0,pname:vertexCount-3)#.
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT, the
-endif::VK_EXT_provoking_vertex[]
-ifndef::VK_EXT_provoking_vertex[]
-The
-endif::VK_EXT_provoking_vertex[]
-provoking vertex for [eq]#p~i~# is [eq]#v~i+1~#.
-
-image::{images}/primitive_topology_line_strip_with_adjacency.svg[align="center",opts="{imageopts}"]
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT, the provoking vertex for
-[eq]#p~i~# is [eq]#v~i+2~#.
-
-image::{images}/primitive_topology_line_strip_with_adjacency_last.svg[align="center",opts="{imageopts}"]
-endif::VK_EXT_provoking_vertex[]
-
-
-[[drawing-triangle-lists-with-adjacency]]
-=== Triangle Lists With Adjacency
-
-When the primitive topology is
-ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY, each consecutive
-set of six vertices defines a single triangle primitive with adjacency,
-according to the equations:
-
-  {empty}:: [eq]#p~i~ = {v~6i~, v~6i+1~, v~6i+2~, v~6i+3~, v~6i+4~,
-            v~6i+5~}#
-
-A triangle primitive is described by the first, third, and fifth vertices of
-the total primitive, with the remaining three vertices only accessible in a
-<<geometry,geometry shader>>.
-
-The number of primitives generated is equal to
-[eq]#{lfloor}pname:vertexCount/6{rfloor}#.
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT, the
-endif::VK_EXT_provoking_vertex[]
-ifndef::VK_EXT_provoking_vertex[]
-The
-endif::VK_EXT_provoking_vertex[]
-provoking vertex for [eq]#p~i~# is [eq]#v~6i~#.
-
-image::{images}/primitive_topology_triangle_list_with_adjacency.svg[align="center",opts="{imageopts}"]
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT, the provoking vertex for
-[eq]#p~i~# is [eq]#v~6i+4~#.
-
-image::{images}/primitive_topology_triangle_list_with_adjacency_last.svg[align="center",opts="{imageopts}"]
-endif::VK_EXT_provoking_vertex[]
-
-
-[[drawing-triangle-strips-with-adjacency]]
-=== Triangle Strips With Adjacency
-
-When the primitive topology is
-ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY, one triangle
-primitive with adjacency is defined by each vertex and the following 5
-vertices.
-
-The number of primitives generated, [eq]#n#, is equal to [eq]#{lfloor}max(0,
-pname:vertexCount - 4)/2{rfloor}#.
-
-If [eq]#n=1#, the primitive is defined as:
-
-  {empty}:: [eq]#p = {v~0~, v~1~, v~2~, v~5~, v~4~, v~3~}#
-
-If [eq]#n>1#, the total primitive consists of different vertices according
-to where it is in the strip:
-
-  {empty}:: [eq]#p~i~ = {v~2i~, v~2i+1~, v~2i+2~, v~2i+6~, v~2i+4~,
-            v~2i+3~}# when [eq]#i=0#
-  {empty}:: [eq]#p~i~ = {v~2i~, v~2i+3~, v~2i+4~, v~2i+6~, v~2i+2~,
-            v~2i-2~}# when [eq]#i>0#, [eq]#i<n-1#, and [eq]#i%2=1#
-  {empty}:: [eq]#p~i~ = {v~2i~, v~2i-2~, v~2i+2~, v~2i+6~, v~2i+4~,
-            v~2i+3~}# when [eq]#i>0#, [eq]#i<n-1#, and [eq]#i%2=0#
-  {empty}:: [eq]#p~i~ = {v~2i~, v~2i+3~, v~2i+4~, v~2i+5~, v~2i+2~,
-            v~2i-2~}# when [eq]#i=n-1# and [eq]#i%2=1#
-  {empty}:: [eq]#p~i~ = {v~2i~, v~2i-2~, v~2i+2~, v~2i+5~, v~2i+4~,
-            v~2i+3~}# when [eq]#i=n-1# and [eq]#i%2=0#
-
-A triangle primitive is described by the first, third, and fifth vertices of
-the total primitive in all cases, with the remaining three vertices only
-accessible in a <<geometry,geometry shader>>.
-
-[NOTE]
-.Note
-====
-The ordering of the vertices in each successive triangle is altered so that
-the winding order is consistent throughout the strip.
-====
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT, the
-endif::VK_EXT_provoking_vertex[]
-ifndef::VK_EXT_provoking_vertex[]
-The
-endif::VK_EXT_provoking_vertex[]
-provoking vertex for [eq]#p~i~# is always [eq]#v~2i~#.
-
-image::{images}/primitive_topology_triangle_strip_with_adjacency.svg[align="center",opts="{imageopts}"]
-
-ifdef::VK_EXT_provoking_vertex[]
-When the pname:provokingVertexMode is
-ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT, the provoking vertex for
-[eq]#p~i~# is always [eq]#v~2i+4~#.
-
-image::{images}/primitive_topology_triangle_strip_with_adjacency_last.svg[align="center",opts="{imageopts}"]
-endif::VK_EXT_provoking_vertex[]
-
-
-[[drawing-patch-lists]]
-=== Patch Lists
-
-When the primitive topology is ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, each
-consecutive set of [eq]#m# vertices defines a single patch primitive,
-according to the equation:
-
-  {empty}:: [eq]#p~i~ = {v~mi~, v~mi+1~, ..., v~mi+(m-2)~, v~mi+(m-1)~}#
-
-where [eq]#m# is equal to
-slink:VkPipelineTessellationStateCreateInfo::pname:patchControlPoints.
-
-Patch lists are never passed to <<vertexpostproc, vertex post-processing>>,
-and as such no provoking vertex is defined for patch primitives.
-The number of primitives generated is equal to
-[eq]#{lfloor}pname:vertexCount/m{rfloor}#.
-
-The vertices comprising a patch have no implied geometry, and are used as
-inputs to tessellation shaders and the fixed-function tessellator to
-generate new point, line, or triangle primitives.
-
-
-[[drawing-primitive-order]]
-== Primitive Order
-
-Primitives generated by <<drawing, drawing commands>> progress through the
-stages of the <<synchronization-pipeline-graphics, graphics pipeline>> in
-_primitive order_.
-Primitive order is initially determined in the following way:
-
-  . Submission order determines the initial ordering
-  . For indirect drawing commands, the order in which accessed instances of
-    the slink:VkDrawIndirectCommand are stored in pname:buffer, from lower
-    indirect buffer addresses to higher addresses.
-  . If a drawing command includes multiple instances, the order in which
-    instances are executed, from lower numbered instances to higher.
-  . The order in which primitives are specified by a drawing command:
-  ** For non-indexed draws, from vertices with a lower numbered
-     code:vertexIndex to a higher numbered code:vertexIndex.
-  ** For indexed draws, vertices sourced from a lower index buffer addresses
-     to higher addresses.
-ifdef::VK_NV_mesh_shader[]
-  ** For draws using mesh shaders, the order is provided by <<mesh-ordering,
-     mesh shading>>.
-endif::VK_NV_mesh_shader[]
-
-Within this order implementations further sort primitives:
-
-[start=5]
-  . If tessellation shading is active, by an implementation-dependent order
-    of new primitives generated by <<tessellation-primitive-order,
-    tessellation>>.
-  . If geometry shading is active, by the order new primitives are generated
-    by <<geometry-ordering, geometry shading>>.
-  . If the <<primsrast-polygonmode,polygon mode>> is not
-    ename:VK_POLYGON_MODE_FILL,
-ifdef::VK_NV_fill_rectangle[]
-    or ename:VK_POLYGON_MODE_FILL_RECTANGLE_NV,
-endif::VK_NV_fill_rectangle[]
-    by an implementation-dependent ordering of the new primitives generated
-    within the original primitive.
-
-Primitive order is later used to define <<primsrast-order, rasterization
-order>>, which determines the order in which fragments output results to a
-framebuffer.
-
-
-[[drawing-primitive-shading]]
-== Programmable Primitive Shading
-
-Once primitives are assembled, they proceed to the vertex shading stage of
-the pipeline.
-If the draw includes multiple instances, then the set of primitives is sent
-to the vertex shading stage multiple times, once for each instance.
-
-It is implementation-dependent whether vertex shading occurs on vertices
-that are discarded as part of incomplete primitives, but if it does occur
-then it operates as if they were vertices in complete primitives and such
-invocations can: have side effects.
-
-Vertex shading receives two per-vertex inputs from the primitive assembly
-stage - the code:vertexIndex and the code:instanceIndex.
-How these values are generated is defined below, with each command.
-
-Drawing commands fall roughly into two categories:
-
-  * Non-indexed drawing commands present a sequential code:vertexIndex to
-    the vertex shader.
-    The sequential index is generated automatically by the device (see
-    <<fxvertex,Fixed-Function Vertex Processing>> for details on both
-    specifying the vertex attributes indexed by code:vertexIndex, as well as
-    binding vertex buffers containing those attributes to a command buffer).
-    These commands are:
-  ** flink:vkCmdDraw
-  ** flink:vkCmdDrawIndirect
-ifdef::VK_VERSION_1_2[]
-  ** flink:vkCmdDrawIndirectCount
-endif::VK_VERSION_1_2[]
-ifdef::VK_KHR_draw_indirect_count[]
-  ** flink:vkCmdDrawIndirectCountKHR
-endif::VK_KHR_draw_indirect_count[]
-ifdef::VK_AMD_draw_indirect_count[]
-  ** flink:vkCmdDrawIndirectCountAMD
-endif::VK_AMD_draw_indirect_count[]
-ifdef::VK_EXT_multi_draw[]
-  ** flink:vkCmdDrawMultiEXT
-endif::VK_EXT_multi_draw[]
-  * Indexed drawing commands read index values from an _index buffer_ and
-    use this to compute the code:vertexIndex value for the vertex shader.
-    These commands are:
-  ** flink:vkCmdDrawIndexed
-  ** flink:vkCmdDrawIndexedIndirect
-ifdef::VK_VERSION_1_2[]
-  ** flink:vkCmdDrawIndexedIndirectCount
-endif::VK_VERSION_1_2[]
-ifdef::VK_KHR_draw_indirect_count[]
-  ** flink:vkCmdDrawIndexedIndirectCountKHR
-endif::VK_KHR_draw_indirect_count[]
-ifdef::VK_AMD_draw_indirect_count[]
-  ** flink:vkCmdDrawIndexedIndirectCountAMD
-endif::VK_AMD_draw_indirect_count[]
-ifdef::VK_EXT_multi_draw[]
-  ** flink:vkCmdDrawMultiIndexedEXT
-endif::VK_EXT_multi_draw[]
-
-
-[open,refpage='vkCmdBindIndexBuffer',desc='Bind an index buffer to a command buffer',type='protos']
---
-To bind an index buffer to a command buffer, call:
-
-include::{generated}/api/protos/vkCmdBindIndexBuffer.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:buffer is the buffer being bound.
-  * pname:offset is the starting offset in bytes within pname:buffer used in
-    index buffer address calculations.
-  * pname:indexType is a elink:VkIndexType value specifying the size of the
-    indices.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBindIndexBuffer-offset-00431]]
-    pname:offset must: be less than the size of pname:buffer
-  * [[VUID-vkCmdBindIndexBuffer-offset-00432]]
-    The sum of pname:offset and the address of the range of
-    sname:VkDeviceMemory object that is backing pname:buffer, must: be a
-    multiple of the type indicated by pname:indexType
-  * [[VUID-vkCmdBindIndexBuffer-buffer-00433]]
-    pname:buffer must: have been created with the
-    ename:VK_BUFFER_USAGE_INDEX_BUFFER_BIT flag
-  * [[VUID-vkCmdBindIndexBuffer-buffer-00434]]
-    If pname:buffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-  * [[VUID-vkCmdBindIndexBuffer-indexType-02507]]
-    pname:indexType must: not be ename:VK_INDEX_TYPE_NONE_KHR
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-ifdef::VK_EXT_index_type_uint8[]
-  * [[VUID-vkCmdBindIndexBuffer-indexType-02765]]
-    If pname:indexType is ename:VK_INDEX_TYPE_UINT8_EXT, the
-    <<features-indexTypeUint8,indexTypeUint8>> feature must: be enabled
-endif::VK_EXT_index_type_uint8[]
-****
-
-include::{generated}/validity/protos/vkCmdBindIndexBuffer.txt[]
---
-
-[open,refpage='VkIndexType',desc='Type of index buffer indices',type='enums']
---
-Possible values of flink:vkCmdBindIndexBuffer::pname:indexType, specifying
-the size of indices, are:
-
-include::{generated}/api/enums/VkIndexType.txt[]
-
-  * ename:VK_INDEX_TYPE_UINT16 specifies that indices are 16-bit unsigned
-    integer values.
-  * ename:VK_INDEX_TYPE_UINT32 specifies that indices are 32-bit unsigned
-    integer values.
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-  * ename:VK_INDEX_TYPE_NONE_KHR specifies that no indices are provided.
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-ifdef::VK_EXT_index_type_uint8[]
-  * ename:VK_INDEX_TYPE_UINT8_EXT specifies that indices are 8-bit unsigned
-    integer values.
-endif::VK_EXT_index_type_uint8[]
---
-
-The parameters for each drawing command are specified directly in the
-command or read from buffer memory, depending on the command.
-Drawing commands that source their parameters from buffer memory are known
-as _indirect_ drawing commands.
-
-All drawing commands interact with the <<features-robustBufferAccess, Robust
-Buffer Access>> feature.
-
-[open,refpage='vkCmdDraw',desc='Draw primitives',type='protos']
---
-:refpage: vkCmdDraw
-
-To record a non-indexed draw, call:
-
-include::{generated}/api/protos/vkCmdDraw.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:vertexCount is the number of vertices to draw.
-  * pname:instanceCount is the number of instances to draw.
-  * pname:firstVertex is the index of the first vertex to draw.
-  * pname:firstInstance is the instance ID of the first instance to draw.
-
-When the command is executed, primitives are assembled using the current
-primitive topology and pname:vertexCount consecutive vertex indices with the
-first code:vertexIndex value equal to pname:firstVertex.
-The primitives are drawn pname:instanceCount times with code:instanceIndex
-starting with pname:firstInstance and increasing sequentially for each
-instance.
-The assembled primitives execute the bound graphics pipeline.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_common.txt[]
-include::{chapters}/commonvalidity/draw_dispatch_nonindirect_common.txt[]
-include::{chapters}/commonvalidity/draw_vertex_binding.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdDraw.txt[]
---
-
-[open,refpage='vkCmdDrawIndexed',desc='Draw primitives with indexed vertices',type='protos']
---
-:refpage: vkCmdDrawIndexed
-
-To record an indexed draw, call:
-
-include::{generated}/api/protos/vkCmdDrawIndexed.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:indexCount is the number of vertices to draw.
-  * pname:instanceCount is the number of instances to draw.
-  * pname:firstIndex is the base index within the index buffer.
-  * pname:vertexOffset is the value added to the vertex index before
-    indexing into the vertex buffer.
-  * pname:firstInstance is the instance ID of the first instance to draw.
-
-When the command is executed, primitives are assembled using the current
-primitive topology and pname:indexCount vertices whose indices are retrieved
-from the index buffer.
-The index buffer is treated as an array of tightly packed unsigned integers
-of size defined by the flink:vkCmdBindIndexBuffer::pname:indexType parameter
-with which the buffer was bound.
-
-The first vertex index is at an offset of [eq]#pname:firstIndex {times}
-code:indexSize {plus} pname:offset# within the bound index buffer, where
-pname:offset is the offset specified by fname:vkCmdBindIndexBuffer and
-code:indexSize is the byte size of the type specified by pname:indexType.
-Subsequent index values are retrieved from consecutive locations in the
-index buffer.
-Indices are first compared to the primitive restart value, then zero
-extended to 32 bits (if the code:indexType is
-ifdef::VK_EXT_index_type_uint8[]
-ename:VK_INDEX_TYPE_UINT8_EXT or
-endif::VK_EXT_index_type_uint8[]
-ename:VK_INDEX_TYPE_UINT16) and have pname:vertexOffset added to them,
-before being supplied as the code:vertexIndex value.
-
-The primitives are drawn pname:instanceCount times with code:instanceIndex
-starting with pname:firstInstance and increasing sequentially for each
-instance.
-The assembled primitives execute the bound graphics pipeline.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_common.txt[]
-include::{chapters}/commonvalidity/draw_dispatch_nonindirect_common.txt[]
-include::{chapters}/commonvalidity/draw_vertex_binding.txt[]
-  * [[VUID-vkCmdDrawIndexed-firstIndex-04932]]
-    [eq]#(code:indexSize {times} (pname:firstIndex {plus} pname:indexCount)
-    {plus} pname:offset)# must: be less than or equal to the size of the
-    bound index buffer, with code:indexSize being based on the type
-    specified by pname:indexType, where the index buffer, pname:indexType,
-    and pname:offset are specified via fname:vkCmdBindIndexBuffer
-****
-
-include::{generated}/validity/protos/vkCmdDrawIndexed.txt[]
---
-
-ifdef::VK_EXT_multi_draw[]
-[open,refpage='vkCmdDrawMultiEXT',desc='Draw primitives',type='protos']
---
-:refpage: vkCmdDrawMultiEXT
-
-To record an ordered sequence of drawing operations which have no state
-changes between them, call:
-
-include::{generated}/api/protos/vkCmdDrawMultiEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:drawCount is the number of draws to execute, and can: be zero.
-  * pname:pVertexInfo is a pointer to an array of slink:VkMultiDrawInfoEXT
-    with vertex information to be drawn.
-  * pname:instanceCount is the number of instances to draw.
-  * pname:firstInstance is the instance ID of the first instance to draw.
-  * pname:stride is the byte stride between consecutive elements of
-    pname:pVertexInfo.
-
-pname:drawCount draws are executed with parameters taken from
-pname:pVertexInfo.
-The number of draw commands recorded is pname:drawCount, with each command
-reading, sequentially, a pname:firstVertex and a pname:vertexCount from
-pname:pVertexInfo.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_common.txt[]
-include::{chapters}/commonvalidity/draw_dispatch_nonindirect_common.txt[]
-include::{chapters}/commonvalidity/draw_vertex_binding.txt[]
-  * [[VUID-vkCmdDrawMultiEXT-None-04933]]
-    The <<features-multiDraw,multiDraw>> feature must: be enabled
-  * [[VUID-vkCmdDrawMultiEXT-drawCount-04934]]
-    pname:drawCount must: be less than
-    sname:VkPhysicalDeviceMultiDrawPropertiesEXT::pname:maxMultiDrawCount
-  * [[VUID-vkCmdDrawMultiEXT-drawCount-04935]]
-    If pname:drawCount is greater than zero, pname:pVertexInfo must: be a
-    valid pointer to memory containing one or more valid instances of
-    slink:VkMultiDrawInfoEXT structures
-  * [[VUID-vkCmdDrawMultiEXT-stride-04936]]
-    pname:stride must be a multiple of 4
-****
-
-include::{generated}/validity/protos/vkCmdDrawMultiEXT.txt[]
---
-
-[open,refpage='vkCmdDrawMultiIndexedEXT',desc='Draw primitives',type='protos']
---
-:refpage: vkCmdDrawMultiIndexedEXT
-
-To record an ordered sequence of indexed drawing operations which have no
-state changes between them, call:
-
-include::{generated}/api/protos/vkCmdDrawMultiIndexedEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:drawCount is the number of draws to execute, and can: be zero.
-  * pname:pIndexInfo is a pointer to an array of
-    slink:VkMultiDrawIndexedInfoEXT with index information to be drawn.
-  * pname:instanceCount is the number of instances to draw.
-  * pname:firstInstance is the instance ID of the first instance to draw.
-  * pname:stride is the byte stride between consecutive elements of
-    pname:pIndexInfo.
-  * pname:pVertexOffset is `NULL` or a pointer to the value added to the
-    vertex index before indexing into the vertex buffer.
-    When specified, sname:VkMultiDrawIndexedInfoEXT::pname:offset is
-    ignored.
-
-pname:drawCount indexed draws are executed with parameters taken from
-pname:pIndexInfo.
-The number of draw commands recorded is pname:drawCount, with each command
-reading, sequentially, a pname:firstIndex and an pname:indexCount from
-pname:pIndexInfo.
-If pname:pVertexOffset is `NULL`, a pname:vertexOffset is also read from
-pname:pIndexInfo, otherwise the value from dereferencing pname:pVertexOffset
-is used.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_common.txt[]
-include::{chapters}/commonvalidity/draw_dispatch_nonindirect_common.txt[]
-include::{chapters}/commonvalidity/draw_vertex_binding.txt[]
-  * [[VUID-vkCmdDrawMultiIndexedEXT-None-04937]]
-    The <<features-multiDraw,multiDraw>> feature must: be enabled
-  * [[VUID-vkCmdDrawMultiIndexedEXT-firstIndex-04938]]
-    [eq]#(code:indexSize {times} (pname:firstIndex {plus} pname:indexCount)
-    {plus} pname:offset)# must: be less than or equal to the size of the
-    bound index buffer, with code:indexSize being based on the type
-    specified by pname:indexType, where the index buffer, pname:indexType,
-    and pname:offset are specified via fname:vkCmdBindIndexBuffer
-  * [[VUID-vkCmdDrawMultiIndexedEXT-drawCount-04939]]
-    pname:drawCount must: be less than
-    sname:VkPhysicalDeviceMultiDrawPropertiesEXT::pname:maxMultiDrawCount
-  * [[VUID-vkCmdDrawMultiIndexedEXT-drawCount-04940]]
-    If pname:drawCount is greater than zero, pname:pIndexInfo must: be a
-    valid pointer to memory containing one or more valid instances of
-    slink:VkMultiDrawIndexedInfoEXT structures
-  * [[VUID-vkCmdDrawMultiIndexedEXT-stride-04941]]
-    pname:stride must be a multiple of 4
-****
-
-include::{generated}/validity/protos/vkCmdDrawMultiIndexedEXT.txt[]
---
-
-[open,refpage='VkMultiDrawInfoEXT',desc='Structure specifying a multi-draw command',type='structs',xrefs='vkCmdDrawMultiEXT']
---
-
-The sname:VkMultiDrawInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkMultiDrawInfoEXT.txt[]
-
-  * pname:firstVertex is the first vertex to draw.
-  * pname:vertexCount is the number of vertices to draw.
-
-The members of sname:VkMultiDrawInfoEXT have the same meaning as the
-pname:firstVertex and pname:vertexCount parameters in flink:vkCmdDraw.
-
-include::{generated}/validity/structs/VkMultiDrawInfoEXT.txt[]
-
---
-
-[open,refpage='VkMultiDrawIndexedInfoEXT',desc='Structure specifying a multi-draw command',type='structs',xrefs='vkCmdDrawMultiIndexedEXT']
---
-
-The sname:VkMultiDrawIndexedInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkMultiDrawIndexedInfoEXT.txt[]
-
-  * pname:firstIndex is the first index to draw.
-  * pname:indexCount is the number of vertices to draw.
-  * pname:vertexOffset is the value added to the vertex index before
-    indexing into the vertex buffer for indexed multidraws.
-
-The pname:firstIndex, pname:indexCount, and pname:vertexOffset members of
-sname:VkMultiDrawIndexedInfoEXT have the same meaning as the
-pname:firstIndex, pname:indexCount, and pname:vertexOffset parameters,
-respectively, of flink:vkCmdDrawIndexed.
-
-include::{generated}/validity/structs/VkMultiDrawIndexedInfoEXT.txt[]
-
---
-endif::VK_EXT_multi_draw[]
-
-[open,refpage='vkCmdDrawIndirect',desc='Draw primitives with indirect parameters',type='protos']
---
-:refpage: vkCmdDrawIndirect
-
-To record a non-indexed indirect drawing command, call:
-
-include::{generated}/api/protos/vkCmdDrawIndirect.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:buffer is the buffer containing draw parameters.
-  * pname:offset is the byte offset into pname:buffer where parameters
-    begin.
-  * pname:drawCount is the number of draws to execute, and can: be zero.
-  * pname:stride is the byte stride between successive sets of draw
-    parameters.
-
-fname:vkCmdDrawIndirect behaves similarly to flink:vkCmdDraw except that the
-parameters are read by the device from a buffer during execution.
-pname:drawCount draws are executed by the command, with parameters taken
-from pname:buffer starting at pname:offset and increasing by pname:stride
-bytes for each successive draw.
-The parameters of each draw are encoded in an array of
-slink:VkDrawIndirectCommand structures.
-If pname:drawCount is less than or equal to one, pname:stride is ignored.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_common.txt[]
-include::{chapters}/commonvalidity/draw_vertex_binding.txt[]
-include::{chapters}/commonvalidity/draw_dispatch_indirect_common.txt[]
-include::{chapters}/commonvalidity/draw_indirect_drawcount.txt[]
-  * [[VUID-vkCmdDrawIndirect-firstInstance-00478]]
-    If the <<features-drawIndirectFirstInstance,drawIndirectFirstInstance>>
-    feature is not enabled, all the pname:firstInstance members of the
-    sname:VkDrawIndirectCommand structures accessed by this command must: be
-    code:0
-  * [[VUID-vkCmdDrawIndirect-drawCount-00476]]
-    If pname:drawCount is greater than `1`, pname:stride must: be a multiple
-    of `4` and must: be greater than or equal to
-    code:sizeof(sname:VkDrawIndirectCommand)
-  * [[VUID-vkCmdDrawIndirect-drawCount-00487]]
-    If pname:drawCount is equal to `1`, [eq]#(pname:offset {plus}
-    code:sizeof(slink:VkDrawIndirectCommand))# must: be less than or equal
-    to the size of pname:buffer
-  * [[VUID-vkCmdDrawIndirect-drawCount-00488]]
-    If pname:drawCount is greater than `1`, [eq]#(pname:stride {times}
-    (pname:drawCount - 1) {plus} pname:offset {plus}
-    code:sizeof(slink:VkDrawIndirectCommand))# must: be less than or equal
-    to the size of pname:buffer
-****
-
-include::{generated}/validity/protos/vkCmdDrawIndirect.txt[]
---
-
-[open,refpage='VkDrawIndirectCommand',desc='Structure specifying a indirect drawing command',type='structs',xrefs='vkCmdDrawIndirect']
---
-The sname:VkDrawIndirectCommand structure is defined as:
-
-include::{generated}/api/structs/VkDrawIndirectCommand.txt[]
-
-  * pname:vertexCount is the number of vertices to draw.
-  * pname:instanceCount is the number of instances to draw.
-  * pname:firstVertex is the index of the first vertex to draw.
-  * pname:firstInstance is the instance ID of the first instance to draw.
-
-The members of sname:VkDrawIndirectCommand have the same meaning as the
-similarly named parameters of flink:vkCmdDraw.
-
-.Valid Usage
-****
-  * [[VUID-VkDrawIndirectCommand-None-00500]]
-    For a given vertex buffer binding, any attribute data fetched must: be
-    entirely contained within the corresponding vertex buffer binding, as
-    described in <<fxvertex-input>>
-  * [[VUID-VkDrawIndirectCommand-firstInstance-00501]]
-    If the <<features-drawIndirectFirstInstance,drawIndirectFirstInstance>>
-    feature is not enabled, pname:firstInstance must: be code:0
-****
-
-include::{generated}/validity/structs/VkDrawIndirectCommand.txt[]
-
---
-
-ifdef::VK_VERSION_1_2,VK_KHR_draw_indirect_count[]
-[open,refpage='vkCmdDrawIndirectCount',desc='Draw primitives with indirect parameters and draw count',type='protos',alias='vkCmdDrawIndirectCountKHR vkCmdDrawIndirectCountAMD']
---
-:refpage: vkCmdDrawIndirectCount
-
-To record a non-indexed draw call with a draw call count sourced from a
-buffer, call:
-
-ifdef::VK_VERSION_1_2[]
-include::{generated}/api/protos/vkCmdDrawIndirectCount.txt[]
-endif::VK_VERSION_1_2[]
-
-// Jon: conditional logic on connective clauses with 3 forms of the command including VK_VERSION_1_2 needs work.
-ifdef::VK_VERSION_1_2+VK_KHR_draw_indirect_count[or the equivalent command]
-
-ifdef::VK_KHR_draw_indirect_count[]
-include::{generated}/api/protos/vkCmdDrawIndirectCountKHR.txt[]
-endif::VK_KHR_draw_indirect_count[]
-
-ifdef::VK_KHR_draw_indirect_count+VK_AMD_draw_indirect_count[or the equivalent command]
-
-ifdef::VK_AMD_draw_indirect_count[]
-include::{generated}/api/protos/vkCmdDrawIndirectCountAMD.txt[]
-endif::VK_AMD_draw_indirect_count[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:buffer is the buffer containing draw parameters.
-  * pname:offset is the byte offset into pname:buffer where parameters
-    begin.
-  * pname:countBuffer is the buffer containing the draw count.
-  * pname:countBufferOffset is the byte offset into pname:countBuffer where
-    the draw count begins.
-  * pname:maxDrawCount specifies the maximum number of draws that will be
-    executed.
-    The actual number of executed draw calls is the minimum of the count
-    specified in pname:countBuffer and pname:maxDrawCount.
-  * pname:stride is the byte stride between successive sets of draw
-    parameters.
-
-fname:vkCmdDrawIndirectCount behaves similarly to flink:vkCmdDrawIndirect
-except that the draw count is read by the device from a buffer during
-execution.
-The command will read an unsigned 32-bit integer from pname:countBuffer
-located at pname:countBufferOffset and use this as the draw count.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_common.txt[]
-include::{chapters}/commonvalidity/draw_vertex_binding.txt[]
-include::{chapters}/commonvalidity/draw_dispatch_indirect_common.txt[]
-include::{chapters}/commonvalidity/draw_indirect_count_common.txt[]
-  * [[VUID-vkCmdDrawIndirectCount-stride-03110]]
-    pname:stride must: be a multiple of `4` and must: be greater than or
-    equal to sizeof(sname:VkDrawIndirectCommand)
-  * [[VUID-vkCmdDrawIndirectCount-maxDrawCount-03111]]
-    If pname:maxDrawCount is greater than or equal to `1`,
-    [eq]#(pname:stride {times} (pname:maxDrawCount - 1) {plus} pname:offset
-    {plus} sizeof(sname:VkDrawIndirectCommand))# must: be less than or equal
-    to the size of pname:buffer
-  * [[VUID-vkCmdDrawIndirectCount-countBuffer-03121]]
-    If the count stored in pname:countBuffer is equal to `1`,
-    [eq]#(pname:offset {plus} sizeof(sname:VkDrawIndirectCommand))# must: be
-    less than or equal to the size of pname:buffer
-  * [[VUID-vkCmdDrawIndirectCount-countBuffer-03122]]
-    If the count stored in pname:countBuffer is greater than `1`,
-    [eq]#(pname:stride {times} (pname:drawCount - 1) {plus} pname:offset
-    {plus} sizeof(sname:VkDrawIndirectCommand))# must: be less than or equal
-    to the size of pname:buffer
-****
-
-include::{generated}/validity/protos/vkCmdDrawIndirectCount.txt[]
-
---
-endif::VK_VERSION_1_2,VK_KHR_draw_indirect_count[]
-
-[open,refpage='vkCmdDrawIndexedIndirect',desc='Draw primitives with indirect parameters and indexed vertices',type='protos']
---
-:refpage: vkCmdDrawIndexedIndirect
-
-To record an indexed indirect drawing command, call:
-
-include::{generated}/api/protos/vkCmdDrawIndexedIndirect.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:buffer is the buffer containing draw parameters.
-  * pname:offset is the byte offset into pname:buffer where parameters
-    begin.
-  * pname:drawCount is the number of draws to execute, and can: be zero.
-  * pname:stride is the byte stride between successive sets of draw
-    parameters.
-
-fname:vkCmdDrawIndexedIndirect behaves similarly to flink:vkCmdDrawIndexed
-except that the parameters are read by the device from a buffer during
-execution.
-pname:drawCount draws are executed by the command, with parameters taken
-from pname:buffer starting at pname:offset and increasing by pname:stride
-bytes for each successive draw.
-The parameters of each draw are encoded in an array of
-slink:VkDrawIndexedIndirectCommand structures.
-If pname:drawCount is less than or equal to one, pname:stride is ignored.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_common.txt[]
-include::{chapters}/commonvalidity/draw_vertex_binding.txt[]
-include::{chapters}/commonvalidity/draw_dispatch_indirect_common.txt[]
-include::{chapters}/commonvalidity/draw_indirect_drawcount.txt[]
-  * [[VUID-vkCmdDrawIndexedIndirect-drawCount-00528]]
-    If pname:drawCount is greater than `1`, pname:stride must: be a multiple
-    of `4` and must: be greater than or equal to
-    code:sizeof(sname:VkDrawIndexedIndirectCommand)
-  * [[VUID-vkCmdDrawIndexedIndirect-firstInstance-00530]]
-    If the <<features-drawIndirectFirstInstance,drawIndirectFirstInstance>>
-    feature is not enabled, all the pname:firstInstance members of the
-    sname:VkDrawIndexedIndirectCommand structures accessed by this command
-    must: be code:0
-  * [[VUID-vkCmdDrawIndexedIndirect-drawCount-00539]]
-    If pname:drawCount is equal to `1`, [eq]#(pname:offset {plus}
-    code:sizeof(sname:VkDrawIndexedIndirectCommand))# must: be less than or
-    equal to the size of pname:buffer
-  * [[VUID-vkCmdDrawIndexedIndirect-drawCount-00540]]
-    If pname:drawCount is greater than `1`, [eq]#(pname:stride {times}
-    (pname:drawCount - 1) {plus} pname:offset {plus}
-    code:sizeof(sname:VkDrawIndexedIndirectCommand))# must: be less than or
-    equal to the size of pname:buffer
-****
-
-include::{generated}/validity/protos/vkCmdDrawIndexedIndirect.txt[]
---
-
-[open,refpage='VkDrawIndexedIndirectCommand',desc='Structure specifying a indexed indirect drawing command',type='structs',xrefs='vkCmdDrawIndexedIndirect']
---
-The sname:VkDrawIndexedIndirectCommand structure is defined as:
-
-include::{generated}/api/structs/VkDrawIndexedIndirectCommand.txt[]
-
-  * pname:indexCount is the number of vertices to draw.
-  * pname:instanceCount is the number of instances to draw.
-  * pname:firstIndex is the base index within the index buffer.
-  * pname:vertexOffset is the value added to the vertex index before
-    indexing into the vertex buffer.
-  * pname:firstInstance is the instance ID of the first instance to draw.
-
-The members of sname:VkDrawIndexedIndirectCommand have the same meaning as
-the similarly named parameters of flink:vkCmdDrawIndexed.
-
-.Valid Usage
-****
-  * [[VUID-VkDrawIndexedIndirectCommand-None-00552]]
-    For a given vertex buffer binding, any attribute data fetched must: be
-    entirely contained within the corresponding vertex buffer binding, as
-    described in <<fxvertex-input>>
-  * [[VUID-VkDrawIndexedIndirectCommand-indexSize-00553]]
-    [eq]#(code:indexSize {times} (pname:firstIndex {plus} pname:indexCount)
-    {plus} pname:offset)# must: be less than or equal to the size of the
-    bound index buffer, with code:indexSize being based on the type
-    specified by pname:indexType, where the index buffer, pname:indexType,
-    and pname:offset are specified via fname:vkCmdBindIndexBuffer
-  * [[VUID-VkDrawIndexedIndirectCommand-firstInstance-00554]]
-    If the <<features-drawIndirectFirstInstance,drawIndirectFirstInstance>>
-    feature is not enabled, pname:firstInstance must: be code:0
-****
-
-include::{generated}/validity/structs/VkDrawIndexedIndirectCommand.txt[]
---
-
-ifdef::VK_VERSION_1_2,VK_KHR_draw_indirect_count[]
-[open,refpage='vkCmdDrawIndexedIndirectCount',desc='Draw parameters with indirect parameters, indexed vertices, and draw count',type='protos',alias='vkCmdDrawIndexedIndirectCountKHR vkCmdDrawIndexedIndirectCountAMD']
---
-:refpage: vkCmdDrawIndexedIndirectCount
-
-To record an indexed draw call with a draw call count sourced from a buffer,
-call:
-
-ifdef::VK_VERSION_1_2[]
-include::{generated}/api/protos/vkCmdDrawIndexedIndirectCount.txt[]
-endif::VK_VERSION_1_2[]
-
-// Jon: conditional logic on connective clauses with 3 forms of the command including VK_VERSION_1_2 needs work.
-ifdef::VK_VERSION_1_2+VK_KHR_draw_indirect_count[or the equivalent command]
-
-ifdef::VK_KHR_draw_indirect_count[]
-include::{generated}/api/protos/vkCmdDrawIndexedIndirectCountKHR.txt[]
-endif::VK_KHR_draw_indirect_count[]
-
-ifdef::VK_KHR_draw_indirect_count+VK_AMD_draw_indirect_count[or the equivalent command]
-
-ifdef::VK_AMD_draw_indirect_count[]
-include::{generated}/api/protos/vkCmdDrawIndexedIndirectCountAMD.txt[]
-endif::VK_AMD_draw_indirect_count[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:buffer is the buffer containing draw parameters.
-  * pname:offset is the byte offset into pname:buffer where parameters
-    begin.
-  * pname:countBuffer is the buffer containing the draw count.
-  * pname:countBufferOffset is the byte offset into pname:countBuffer where
-    the draw count begins.
-  * pname:maxDrawCount specifies the maximum number of draws that will be
-    executed.
-    The actual number of executed draw calls is the minimum of the count
-    specified in pname:countBuffer and pname:maxDrawCount.
-  * pname:stride is the byte stride between successive sets of draw
-    parameters.
-
-fname:vkCmdDrawIndexedIndirectCount behaves similarly to
-flink:vkCmdDrawIndexedIndirect except that the draw count is read by the
-device from a buffer during execution.
-The command will read an unsigned 32-bit integer from pname:countBuffer
-located at pname:countBufferOffset and use this as the draw count.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_common.txt[]
-include::{chapters}/commonvalidity/draw_vertex_binding.txt[]
-include::{chapters}/commonvalidity/draw_dispatch_indirect_common.txt[]
-include::{chapters}/commonvalidity/draw_indirect_count_common.txt[]
-  * [[VUID-vkCmdDrawIndexedIndirectCount-stride-03142]]
-    pname:stride must: be a multiple of `4` and must: be greater than or
-    equal to sizeof(sname:VkDrawIndexedIndirectCommand)
-  * [[VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143]]
-    If pname:maxDrawCount is greater than or equal to `1`,
-    [eq]#(pname:stride {times} (pname:maxDrawCount - 1) {plus} pname:offset
-    {plus} sizeof(sname:VkDrawIndexedIndirectCommand))# must: be less than
-    or equal to the size of pname:buffer
-  * [[VUID-vkCmdDrawIndexedIndirectCount-countBuffer-03153]]
-    If count stored in pname:countBuffer is equal to `1`, [eq]#(pname:offset
-    {plus} sizeof(sname:VkDrawIndexedIndirectCommand))# must: be less than
-    or equal to the size of pname:buffer
-  * [[VUID-vkCmdDrawIndexedIndirectCount-countBuffer-03154]]
-    If count stored in pname:countBuffer is greater than `1`,
-    [eq]#(pname:stride {times} (pname:drawCount - 1) {plus} pname:offset
-    {plus} sizeof(sname:VkDrawIndexedIndirectCommand))# must: be less than
-    or equal to the size of pname:buffer
-****
-
-include::{generated}/validity/protos/vkCmdDrawIndexedIndirectCount.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_draw_indirect_count[]
-
-
-ifdef::VK_EXT_transform_feedback[]
-[[drawing-transform-feedback]]
-=== Drawing Transform Feedback
-
-It is possible to draw vertex data that was previously captured during
-active <<vertexpostproc-transform-feedback,transform feedback>> by binding
-one or more of the transform feedback buffers as vertex buffers.
-A pipeline barrier is required between using the buffers as transform
-feedback buffers and vertex buffers to ensure all writes to the transform
-feedback buffers are visible when the data is read as vertex attributes.
-The source access is ename:VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT and
-the destination access is ename:VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT for the
-pipeline stages ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT and
-ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT respectively.
-The value written to the counter buffer by
-flink:vkCmdEndTransformFeedbackEXT can: be used to determine the vertex
-count for the draw.
-A pipeline barrier is required between using the counter buffer for
-fname:vkCmdEndTransformFeedbackEXT and fname:vkCmdDrawIndirectByteCountEXT
-where the source access is
-ename:VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT and the destination
-access is ename:VK_ACCESS_INDIRECT_COMMAND_READ_BIT for the pipeline stages
-ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT and
-ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT respectively.
-
-[open,refpage='vkCmdDrawIndirectByteCountEXT',desc='Draw primitives with indirect parameters where the vertex count is derived from the counter byte value in the counter buffer',type='protos']
---
-:refpage: vkCmdDrawIndirectByteCountEXT
-
-To record a non-indexed draw call, where the vertex count is based on a byte
-count read from a buffer and the passed in vertex stride parameter, call:
-
-include::{generated}/api/protos/vkCmdDrawIndirectByteCountEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:instanceCount is the number of instances to draw.
-  * pname:firstInstance is the instance ID of the first instance to draw.
-  * pname:counterBuffer is the buffer handle from where the byte count is
-    read.
-  * pname:counterBufferOffset is the offset into the buffer used to read the
-    byte count, which is used to calculate the vertex count for this draw
-    call.
-  * pname:counterOffset is subtracted from the byte count read from the
-    pname:counterBuffer at the pname:counterBufferOffset
-  * pname:vertexStride is the stride in bytes between each element of the
-    vertex data that is used to calculate the vertex count from the counter
-    value.
-    This value is typically the same value that was used in the graphics
-    pipeline state when the transform feedback was captured as the
-    code:XfbStride.
-
-When the command is executed, primitives are assembled in the same way as
-done with flink:vkCmdDraw except the pname:vertexCount is calculated based
-on the byte count read from pname:counterBuffer at offset
-pname:counterBufferOffset.
-The assembled primitives execute the bound graphics pipeline.
-
-The effective pname:vertexCount is calculated as follows:
-
-[source,c]
-~~~~
-const uint32_t * counterBufferPtr = (const uint8_t *)counterBuffer.address + counterBufferOffset;
-vertexCount = floor(max(0, (*counterBufferPtr - counterOffset)) / vertexStride);
-~~~~
-
-The effective pname:firstVertex is zero.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/draw_common.txt[]
-include::{chapters}/commonvalidity/draw_vertex_binding.txt[]
-  * [[VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287]]
-    sname:VkPhysicalDeviceTransformFeedbackFeaturesEXT::pname:transformFeedback
-    must: be enabled
-  * [[VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288]]
-    The implementation must: support
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:transformFeedbackDraw
-  * [[VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289]]
-    pname:vertexStride must: be greater than 0 and less than or equal to
-    slink:VkPhysicalDeviceLimits::pname:maxTransformFeedbackBufferDataStride
-  * [[VUID-vkCmdDrawIndirectByteCountEXT-counterBuffer-04567]]
-    If pname:counterBuffer is non-sparse then it must: be bound completely
-    and contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-vkCmdDrawIndirectByteCountEXT-counterBuffer-02290]]
-    pname:counterBuffer must: have been created with the
-    ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set
-  * [[VUID-vkCmdDrawIndirectByteCountEXT-counterBufferOffset-04568]]
-    pname:counterBufferOffset must: be a multiple of `4`
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02646]]
-    pname:commandBuffer must: not be a protected command buffer
-endif::VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/protos/vkCmdDrawIndirectByteCountEXT.txt[]
---
-endif::VK_EXT_transform_feedback[]
-
-
-ifdef::VK_EXT_conditional_rendering[]
-[[drawing-conditional-rendering]]
-== Conditional Rendering
-
-Certain rendering commands can: be executed conditionally based on a value
-in buffer memory.
-These rendering commands are limited to <<drawing,drawing commands>>,
-<<dispatch,dispatching commands>>, and clearing attachments with
-flink:vkCmdClearAttachments within a conditional rendering block which is
-defined by commands flink:vkCmdBeginConditionalRenderingEXT and
-flink:vkCmdEndConditionalRenderingEXT.
-Other rendering commands remain unaffected by conditional rendering.
-
-[[active-conditional-rendering]]
-After beginning conditional rendering, it is considered _active_ within the
-command buffer it was called until it is ended with
-flink:vkCmdEndConditionalRenderingEXT.
-
-Conditional rendering must: begin and end in the same command buffer.
-When conditional rendering is active, a primary command buffer can: execute
-secondary command buffers if the <<features-inheritedConditionalRendering,
-inherited conditional rendering>> feature is enabled.
-For a secondary command buffer to be executed while conditional rendering is
-active in the primary command buffer, it must: set the
-pname:conditionalRenderingEnable flag of
-slink:VkCommandBufferInheritanceConditionalRenderingInfoEXT, as described in
-the <<commandbuffers-recording, Command Buffer Recording>> section.
-
-Conditional rendering must: also either begin and end inside the same
-subpass of a render pass instance, or must: both begin and end outside of a
-render pass instance (i.e. contain entire render pass instances).
-
-[open,refpage='vkCmdBeginConditionalRenderingEXT',desc='Define the beginning of a conditional rendering block',type='protos']
---
-To begin conditional rendering, call:
-
-include::{generated}/api/protos/vkCmdBeginConditionalRenderingEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which this command will
-    be recorded.
-  * pname:pConditionalRenderingBegin is a pointer to a
-    slink:VkConditionalRenderingBeginInfoEXT structure specifying parameters
-    of conditional rendering.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBeginConditionalRenderingEXT-None-01980]]
-    Conditional rendering must: not already be
-    <<active-conditional-rendering,active>>
-****
-
-include::{generated}/validity/protos/vkCmdBeginConditionalRenderingEXT.txt[]
---
-
-[open,refpage='VkConditionalRenderingBeginInfoEXT',desc='Structure specifying conditional rendering begin information',type='structs']
---
-The sname:VkConditionalRenderingBeginInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkConditionalRenderingBeginInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:buffer is a buffer containing the predicate for conditional
-    rendering.
-  * pname:offset is the byte offset into pname:buffer where the predicate is
-    located.
-  * pname:flags is a bitmask of tlink:VkConditionalRenderingFlagsEXT
-    specifying the behavior of conditional rendering.
-
-If the 32-bit value at pname:offset in pname:buffer memory is zero, then the
-rendering commands are discarded, otherwise they are executed as normal.
-If the value of the predicate in buffer memory changes while conditional
-rendering is active, the rendering commands may: be discarded in an
-implementation-dependent way.
-Some implementations may latch the value of the predicate upon beginning
-conditional rendering while others may read it before every rendering
-command.
-
-.Valid Usage
-****
-  * [[VUID-VkConditionalRenderingBeginInfoEXT-buffer-01981]]
-    If pname:buffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-VkConditionalRenderingBeginInfoEXT-buffer-01982]]
-    pname:buffer must: have been created with the
-    ename:VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT bit set
-  * [[VUID-VkConditionalRenderingBeginInfoEXT-offset-01983]]
-    pname:offset must: be less than the size of pname:buffer by at least 32
-    bits
-  * [[VUID-VkConditionalRenderingBeginInfoEXT-offset-01984]]
-    pname:offset must: be a multiple of 4
-****
-
-include::{generated}/validity/structs/VkConditionalRenderingBeginInfoEXT.txt[]
-
---
-
-[open,refpage='VkConditionalRenderingFlagBitsEXT',desc='Specify the behavior of conditional rendering',type='enums']
---
-Bits which can: be set in
-flink:vkCmdBeginConditionalRenderingEXT::pname:flags specifying the behavior
-of conditional rendering are:
-
-include::{generated}/api/enums/VkConditionalRenderingFlagBitsEXT.txt[]
-
-  * ename:VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT specifies the condition
-    used to determine whether to discard rendering commands or not.
-    That is, if the 32-bit predicate read from pname:buffer memory at
-    pname:offset is zero, the rendering commands are not discarded, and if
-    non zero, then they are discarded.
---
-
-[open,refpage='VkConditionalRenderingFlagsEXT',desc='Bitmask of VkConditionalRenderingFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkConditionalRenderingFlagsEXT.txt[]
-
-tname:VkConditionalRenderingFlagsEXT is a bitmask type for setting a mask of
-zero or more elink:VkConditionalRenderingFlagBitsEXT.
---
-
-[open,refpage='vkCmdEndConditionalRenderingEXT',desc='Define the end of a conditional rendering block',type='protos']
---
-To end conditional rendering, call:
-
-include::{generated}/api/protos/vkCmdEndConditionalRenderingEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which this command will
-    be recorded.
-
-Once ended, conditional rendering becomes inactive.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdEndConditionalRenderingEXT-None-01985]]
-    Conditional rendering must: be <<active-conditional-rendering,active>>
-  * [[VUID-vkCmdEndConditionalRenderingEXT-None-01986]]
-    If conditional rendering was made
-    <<active-conditional-rendering,active>> outside of a render pass
-    instance, it must: not be ended inside a render pass instance
-  * [[VUID-vkCmdEndConditionalRenderingEXT-None-01987]]
-    If conditional rendering was made
-    <<active-conditional-rendering,active>> within a subpass it must: be
-    ended in the same subpass
-****
-
-include::{generated}/validity/protos/vkCmdEndConditionalRenderingEXT.txt[]
---
-endif::VK_EXT_conditional_rendering[]
-
-ifdef::VK_NV_mesh_shader[]
-include::VK_NV_mesh_shader/drawing.txt[]
-endif::VK_NV_mesh_shader[]
diff --git a/registry/vulkan/chapters/extensions.txt b/registry/vulkan/chapters/extensions.txt
deleted file mode 100644
index 3145960..0000000
--- a/registry/vulkan/chapters/extensions.txt
+++ /dev/null
@@ -1,942 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[extendingvulkan]]
-= Extending Vulkan
-
-New functionality may: be added to Vulkan via either new extensions or new
-versions of the core, or new versions of an extension in some cases.
-
-This chapter describes how Vulkan is versioned, how compatibility is
-affected between different versions, and compatibility rules that are
-followed by the Vulkan Working Group.
-
-
-[[extendingvulkan-instanceanddevicefunctionality]]
-== Instance and Device Functionality
-
-Commands that enumerate instance properties, or that accept a
-slink:VkInstance object as a parameter, are considered instance-level
-functionality.
-Commands
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-that enumerate physical device properties, or
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-that accept a slink:VkDevice object or any of a device's child objects as a
-parameter, are considered device-level functionality.
-
-ifdef::VK_VERSION_1_1[]
-[NOTE]
-.Note
-====
-Applications usually interface to Vulkan using a loader that implements only
-instance-level functionality, passing device-level functionality to
-implementations of the full Vulkan API on the system.
-In some circumstances, as these may be implemented independently, it is
-possible that the loader and device implementations on a given installation
-will support different versions.
-To allow for this and call out when it happens, the Vulkan specification
-enumerates device and instance level functionality separately - they have
-<<extendingvulkan-coreversions-queryingversionsupport,independent version
-queries>>.
-====
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-[NOTE]
-.Note
-====
-Vulkan 1.0 initially specified new physical device enumeration functionality
-as instance-level, requiring it to be included in an instance extension.
-As the capabilities of device-level functionality require discovery via
-physical device enumeration, this led to the situation where many device
-extensions required an instance extension as well.
-To alleviate this extra work,
-`apiext:VK_KHR_get_physical_device_properties2` (and subsequently Vulkan
-1.1) redefined device-level functionality to include physical device
-enumeration.
-====
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-
-[[extendingvulkan-coreversions]]
-== Core Versions
-
-The Vulkan Specification is regularly updated with bug fixes and
-clarifications.
-Occasionally new functionality is added to the core and at some point it is
-expected that there will be a desire to perform a large, breaking change to
-the API.
-In order to indicate to developers how and when these changes are made to
-the specification, and to provide a way to identify each set of changes, the
-Vulkan API maintains a version number.
-
-
-[[extendingvulkan-coreversions-versionnumbers]]
-=== Version Numbers
-
-The Vulkan version number comprises four parts indicating the variant,
-major, minor and patch version of the Vulkan API Specification.
-
-The _variant_ indicates the variant of the Vulkan API supported by the
-implementation.
-This is always 0 for the Vulkan API.
-
-[NOTE]
-.Note
-====
-A non-zero variant indicates the API is a variant of the Vulkan API and
-applications will typically need to be modified to run against it.
-The variant field was a later addition to the version number, added in
-version 1.2.175 of the Specification.
-As Vulkan uses variant 0, this change is fully backwards compatible with the
-previous version number format for Vulkan implementations.
-New version number macros have been added for this change and the old macros
-deprecated.
-For existing applications using the older format and macros, an
-implementation with non-zero variant will decode as a very high Vulkan
-version.
-The high version number should be detectable by applications performing
-suitable version checking.
-====
-
-The _major version_ indicates a significant change in the API, which will
-encompass a wholly new version of the specification.
-
-The _minor version_ indicates the incorporation of new functionality into
-the core specification.
-
-The _patch version_ indicates bug fixes, clarifications, and language
-improvements have been incorporated into the specification.
-
-Compatibility guarantees made about versions of the API sharing any of the
-same version numbers are documented in
-<<extendingvulkan-compatibility-coreversions>>
-
-The version number is used in several places in the API.
-In each such use, the version numbers are packed into a 32-bit integer as
-follows:
-
-  * The variant is a 3-bit integer packed into bits 31-29.
-  * The major version is a 7-bit integer packed into bits 28-22.
-  * The minor version number is a 10-bit integer packed into bits 21-12.
-  * The patch version number is a 12-bit integer packed into bits 11-0.
-
-[open,refpage='VK_API_VERSION_VARIANT',desc='Extract API variant number',type='defines']
---
-dname:VK_API_VERSION_VARIANT extracts the API variant number from a packed
-version number:
-
-include::{generated}/api/defines/VK_API_VERSION_VARIANT.txt[]
---
-
-[open,refpage='VK_API_VERSION_MAJOR',desc='Extract API major version number',type='defines']
---
-dname:VK_API_VERSION_MAJOR extracts the API major version number from a
-packed version number:
-
-include::{generated}/api/defines/VK_API_VERSION_MAJOR.txt[]
---
-
-[open,refpage='VK_VERSION_MAJOR',desc='Extract API major version number',type='defines']
---
-dname:VK_VERSION_MAJOR extracts the API major version number from a packed
-version number:
-
-include::{generated}/api/defines/VK_VERSION_MAJOR.txt[]
---
-
-[open,refpage='VK_API_VERSION_MINOR',desc='Extract API minor version number',type='defines']
---
-dname:VK_API_VERSION_MINOR extracts the API minor version number from a
-packed version number:
-
-include::{generated}/api/defines/VK_API_VERSION_MINOR.txt[]
---
-
-[open,refpage='VK_VERSION_MINOR',desc='Extract API minor version number',type='defines']
---
-dname:VK_VERSION_MINOR extracts the API minor version number from a packed
-version number:
-
-include::{generated}/api/defines/VK_VERSION_MINOR.txt[]
---
-
-[open,refpage='VK_API_VERSION_PATCH',desc='Extract API patch version number',type='defines']
---
-dname:VK_API_VERSION_PATCH extracts the API patch version number from a
-packed version number:
-
-include::{generated}/api/defines/VK_API_VERSION_PATCH.txt[]
---
-
-[open,refpage='VK_VERSION_PATCH',desc='Extract API patch version number',type='defines']
---
-dname:VK_VERSION_PATCH extracts the API patch version number from a packed
-version number:
-
-include::{generated}/api/defines/VK_VERSION_PATCH.txt[]
---
-
-[open,refpage='VK_MAKE_API_VERSION',desc='Construct an API version number',type='defines',xrefs='VkApplicationInfo vkCreateInstance']
---
-dname:VK_MAKE_API_VERSION constructs an API version number.
-
-include::{generated}/api/defines/VK_MAKE_API_VERSION.txt[]
-
-  * pname:variant is the variant number.
-  * pname:major is the major version number.
-  * pname:minor is the minor version number.
-  * pname:patch is the patch version number.
---
-
-[open,refpage='VK_MAKE_VERSION',desc='Construct an API version number',type='defines',xrefs='VkApplicationInfo vkCreateInstance']
---
-dname:VK_MAKE_VERSION constructs an API version number.
-
-include::{generated}/api/defines/VK_MAKE_VERSION.txt[]
-
-  * pname:major is the major version number.
-  * pname:minor is the minor version number.
-  * pname:patch is the patch version number.
---
-
-[open,refpage='VK_API_VERSION_1_0',desc='Return API version number for Vulkan 1.0',type='defines',xrefs='vkCreateInstance vkGetPhysicalDeviceProperties']
---
-dname:VK_API_VERSION_1_0 returns the API version number for Vulkan 1.0.0.
-
-include::{generated}/api/defines/VK_API_VERSION_1_0.txt[]
---
-
-ifdef::VK_VERSION_1_1[]
-[open,refpage='VK_API_VERSION_1_1',desc='Return API version number for Vulkan 1.1',type='defines',xrefs='vkCreateInstance vkGetPhysicalDeviceProperties']
---
-dname:VK_API_VERSION_1_1 returns the API version number for Vulkan 1.1.0.
-
-include::{generated}/api/defines/VK_API_VERSION_1_1.txt[]
---
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_2[]
-[open,refpage='VK_API_VERSION_1_2',desc='Return API version number for Vulkan 1.2',type='defines',xrefs='vkCreateInstance vkGetPhysicalDeviceProperties']
---
-dname:VK_API_VERSION_1_2 returns the API version number for Vulkan 1.2.0.
-
-include::{generated}/api/defines/VK_API_VERSION_1_2.txt[]
---
-endif::VK_VERSION_1_2[]
-
-
-[[extendingvulkan-coreversions-queryingversionsupport]]
-=== Querying Version Support
-
-ifndef::VK_VERSION_1_1[]
-[NOTE]
-.Note
-====
-In Vulkan 1.0, there is no mechanism to detect the separate versions of
-<<extendingvulkan-instanceanddevicefunctionality,instance-level and
-device-level functionality>> supported.
-However, the fname:vkEnumerateInstanceVersion command was added in Vulkan
-1.1 to determine the supported version of instance-level functionality -
-querying for this function via flink:vkGetInstanceProcAddr will return
-`NULL` on implementations that only support Vulkan 1.0 functionality.
-For more information on this, please refer to the Vulkan 1.1 specification.
-====
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1[]
-The version of instance-level functionality can be queried by calling
-flink:vkEnumerateInstanceVersion.
-endif::VK_VERSION_1_1[]
-
-The version of device-level functionality can be queried by calling
-flink:vkGetPhysicalDeviceProperties
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-or flink:vkGetPhysicalDeviceProperties2,
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-and is returned in slink:VkPhysicalDeviceProperties::pname:apiVersion,
-encoded as described in <<extendingvulkan-coreversions-versionnumbers>>.
-
-
-[[extendingvulkan-layers]]
-== Layers
-
-When a layer is enabled, it inserts itself into the call chain for Vulkan
-commands the layer is interested in.
-Layers can: be used for a variety of tasks that extend the base behavior of
-Vulkan beyond what is required by the specification - such as call logging,
-tracing, validation, or providing additional extensions.
-
-[NOTE]
-.Note
-====
-For example, an implementation is not expected to check that the value of
-enums used by the application fall within allowed ranges.
-Instead, a validation layer would do those checks and flag issues.
-This avoids a performance penalty during production use of the application
-because those layers would not be enabled in production.
-====
-
-[NOTE]
-.Note
-====
-Vulkan layers may: wrap object handles (i.e. return a different handle value
-to the application than that generated by the implementation).
-This is generally discouraged, as it increases the probability of
-incompatibilities with new extensions.
-The validation layers wrap handles in order to track the proper use and
-destruction of each object.
-See the <<LoaderInterfaceArchitecture, "`Architecture of the Vulkan Loader
-Interfaces`">> document for additional information.
-====
-
-[open,refpage='vkEnumerateInstanceLayerProperties',desc='Returns up to requested number of global layer properties',type='protos']
---
-To query the available layers, call:
-
-include::{generated}/api/protos/vkEnumerateInstanceLayerProperties.txt[]
-
-  * pname:pPropertyCount is a pointer to an integer related to the number of
-    layer properties available or queried, as described below.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    slink:VkLayerProperties structures.
-
-If pname:pProperties is `NULL`, then the number of layer properties
-available is returned in pname:pPropertyCount.
-Otherwise, pname:pPropertyCount must: point to a variable set by the user to
-the number of elements in the pname:pProperties array, and on return the
-variable is overwritten with the number of structures actually written to
-pname:pProperties.
-If pname:pPropertyCount is less than the number of layer properties
-available, at most pname:pPropertyCount structures will be written, and
-ename:VK_INCOMPLETE will be returned instead of ename:VK_SUCCESS, to
-indicate that not all the available properties were returned.
-
-The list of available layers may change at any time due to actions outside
-of the Vulkan implementation, so two calls to
-fname:vkEnumerateInstanceLayerProperties with the same parameters may:
-return different results, or retrieve different pname:pPropertyCount values
-or pname:pProperties contents.
-Once an instance has been created, the layers enabled for that instance will
-continue to be enabled and valid for the lifetime of that instance, even if
-some of them become unavailable for future instances.
-
-include::{generated}/validity/protos/vkEnumerateInstanceLayerProperties.txt[]
---
-
-[open,refpage='VkLayerProperties',desc='Structure specifying layer properties',type='structs']
---
-The sname:VkLayerProperties structure is defined as:
-
-include::{generated}/api/structs/VkLayerProperties.txt[]
-
-  * pname:layerName is an array of ename:VK_MAX_EXTENSION_NAME_SIZE
-    code:char containing a null-terminated UTF-8 string which is the name of
-    the layer.
-    Use this name in the pname:ppEnabledLayerNames array passed in the
-    slink:VkInstanceCreateInfo structure to enable this layer for an
-    instance.
-  * pname:specVersion is the Vulkan version the layer was written to,
-    encoded as described in <<extendingvulkan-coreversions-versionnumbers>>.
-  * pname:implementationVersion is the version of this layer.
-    It is an integer, increasing with backward compatible changes.
-  * pname:description is an array of ename:VK_MAX_DESCRIPTION_SIZE code:char
-    containing a null-terminated UTF-8 string which provides additional
-    details that can: be used by the application to identify the layer.
-
-include::{generated}/validity/structs/VkLayerProperties.txt[]
---
-
-[open,refpage='VK_MAX_EXTENSION_NAME_SIZE',desc='Maximum length of a layer of extension name string',type='consts']
---
-ename:VK_MAX_EXTENSION_NAME_SIZE is the length in code:char values of an
-array containing a layer or extension name string, as returned in
-slink:VkLayerProperties::layerName,
-slink:VkExtensionProperties::extensionName, and other queries.
-
-include::{generated}/api/enums/VK_MAX_EXTENSION_NAME_SIZE.txt[]
---
-
-[open,refpage='VK_MAX_DESCRIPTION_SIZE',desc='Length of a driver name string',type='consts']
---
-ename:VK_MAX_DESCRIPTION_SIZE is the length in code:char values of an array
-containing a string with additional descriptive information about a query,
-as returned in slink:VkLayerProperties::description and other queries.
-
-include::{generated}/api/enums/VK_MAX_DESCRIPTION_SIZE.txt[]
---
-
-To enable a layer, the name of the layer should: be added to the
-pname:ppEnabledLayerNames member of slink:VkInstanceCreateInfo when creating
-a sname:VkInstance.
-
-Loader implementations may: provide mechanisms outside the Vulkan API for
-enabling specific layers.
-Layers enabled through such a mechanism are _implicitly enabled_, while
-layers enabled by including the layer name in the pname:ppEnabledLayerNames
-member of slink:VkInstanceCreateInfo are _explicitly enabled_.
-Implicitly enabled layers are loaded before explicitly enabled layers, such
-that implicitly enabled layers are closer to the application, and explicitly
-enabled layers are closer to the driver.
-Except where otherwise specified, implicitly enabled and explicitly enabled
-layers differ only in the way they are enabled, and the order in which they
-are loaded.
-Explicitly enabling a layer that is implicitly enabled results in this layer
-being loaded as an implicitly enabled layer; it has no additional effect.
-
-
-[[extendingvulkan-layers-devicelayerdeprecation]]
-=== Device Layer Deprecation
-
-Previous versions of this specification distinguished between instance and
-device layers.
-Instance layers were only able to intercept commands that operate on
-sname:VkInstance and sname:VkPhysicalDevice, except they were not able to
-intercept flink:vkCreateDevice.
-Device layers were enabled for individual devices when they were created,
-and could only intercept commands operating on that device or its child
-objects.
-
-Device-only layers are now deprecated, and this specification no longer
-distinguishes between instance and device layers.
-Layers are enabled during instance creation, and are able to intercept all
-commands operating on that instance or any of its child objects.
-At the time of deprecation there were no known device-only layers and no
-compelling reason to create one.
-
-In order to maintain compatibility with implementations released prior to
-device-layer deprecation, applications should: still enumerate and enable
-device layers.
-The behavior of fname:vkEnumerateDeviceLayerProperties and valid usage of
-the pname:ppEnabledLayerNames member of slink:VkDeviceCreateInfo maximizes
-compatibility with applications written to work with the previous
-requirements.
-
-[open,refpage='vkEnumerateDeviceLayerProperties',desc='Returns properties of available physical device layers',type='protos']
---
-To enumerate device layers, call:
-
-include::{generated}/api/protos/vkEnumerateDeviceLayerProperties.txt[]
-
-  * pname:pPropertyCount is a pointer to an integer related to the number of
-    layer properties available or queried.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    slink:VkLayerProperties structures.
-
-If pname:pProperties is `NULL`, then the number of layer properties
-available is returned in pname:pPropertyCount.
-Otherwise, pname:pPropertyCount must: point to a variable set by the user to
-the number of elements in the pname:pProperties array, and on return the
-variable is overwritten with the number of structures actually written to
-pname:pProperties.
-If pname:pPropertyCount is less than the number of layer properties
-available, at most pname:pPropertyCount structures will be written, and
-ename:VK_INCOMPLETE will be returned instead of ename:VK_SUCCESS, to
-indicate that not all the available properties were returned.
-
-The list of layers enumerated by fname:vkEnumerateDeviceLayerProperties
-must: be exactly the sequence of layers enabled for the instance.
-The members of sname:VkLayerProperties for each enumerated layer must: be
-the same as the properties when the layer was enumerated by
-fname:vkEnumerateInstanceLayerProperties.
-
-include::{generated}/validity/protos/vkEnumerateDeviceLayerProperties.txt[]
---
-
-The pname:ppEnabledLayerNames and pname:enabledLayerCount members of
-slink:VkDeviceCreateInfo are deprecated and their values must: be ignored by
-implementations.
-However, for compatibility, only an empty list of layers or a list that
-exactly matches the sequence enabled at instance creation time are valid,
-and validation layers should: issue diagnostics for other cases.
-
-Regardless of the enabled layer list provided in slink:VkDeviceCreateInfo,
-the sequence of layers active for a device will be exactly the sequence of
-layers enabled when the parent instance was created.
-
-
-[[extendingvulkan-extensions]]
-== Extensions
-
-Extensions may: define new Vulkan commands, structures, and enumerants.
-For compilation purposes, the interfaces defined by registered extensions,
-including new structures and enumerants as well as function pointer types
-for new commands, are defined in the Khronos-supplied `{core_header}`
-together with the core API.
-However, commands defined by extensions may: not be available for static
-linking - in which case function pointers to these commands should: be
-queried at runtime as described in <<initialization-functionpointers>>.
-Extensions may: be provided by layers as well as by a Vulkan implementation.
-
-Because extensions may: extend or change the behavior of the Vulkan API,
-extension authors should: add support for their extensions to the Khronos
-validation layers.
-This is especially important for new commands whose parameters have been
-wrapped by the validation layers.
-See the <<LoaderInterfaceArchitecture, "`Architecture of the Vulkan Loader
-Interfaces`">> document for additional information.
-
-[NOTE]
-.Note
-====
-To enable an instance extension, the name of the extension can: be added to
-the pname:ppEnabledExtensionNames member of slink:VkInstanceCreateInfo when
-creating a sname:VkInstance.
-
-To enable a device extension, the name of the extension can: be added to the
-pname:ppEnabledExtensionNames member of slink:VkDeviceCreateInfo when
-creating a sname:VkDevice.
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-Physical-Device-Level functionality does not have any enabling mechanism and
-can: be used as long as the slink:VkPhysicalDevice supports the device
-extension as determined by flink:vkEnumerateDeviceExtensionProperties.
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-Enabling an extension (with no further use of that extension) does not
-change the behavior of functionality exposed by the core Vulkan API or any
-other extension, other than making valid the use of the commands, enums and
-structures defined by that extension.
-
-Valid Usage sections for individual commands and structures do not currently
-contain which extensions have to be enabled in order to make their use
-valid, although they might do so in the future.
-It is defined only in the <<fundamentals-validusage-extensions>> section.
-====
-
-
-=== Instance Extensions
-
-Instance extensions add new
-<<extendingvulkan-instanceanddevicefunctionality,instance-level
-functionality>> to the API, outside of the core specification.
-
-[open,refpage='vkEnumerateInstanceExtensionProperties',desc='Returns up to requested number of global extension properties',type='protos']
---
-To query the available instance extensions, call:
-
-include::{generated}/api/protos/vkEnumerateInstanceExtensionProperties.txt[]
-
-  * pname:pLayerName is either `NULL` or a pointer to a null-terminated
-    UTF-8 string naming the layer to retrieve extensions from.
-  * pname:pPropertyCount is a pointer to an integer related to the number of
-    extension properties available or queried, as described below.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    slink:VkExtensionProperties structures.
-
-When pname:pLayerName parameter is `NULL`, only extensions provided by the
-Vulkan implementation or by implicitly enabled layers are returned.
-When pname:pLayerName is the name of a layer, the instance extensions
-provided by that layer are returned.
-
-If pname:pProperties is `NULL`, then the number of extensions properties
-available is returned in pname:pPropertyCount.
-Otherwise, pname:pPropertyCount must: point to a variable set by the user to
-the number of elements in the pname:pProperties array, and on return the
-variable is overwritten with the number of structures actually written to
-pname:pProperties.
-If pname:pPropertyCount is less than the number of extension properties
-available, at most pname:pPropertyCount structures will be written, and
-ename:VK_INCOMPLETE will be returned instead of ename:VK_SUCCESS, to
-indicate that not all the available properties were returned.
-
-Because the list of available layers may change externally between calls to
-flink:vkEnumerateInstanceExtensionProperties, two calls may retrieve
-different results if a pname:pLayerName is available in one call but not in
-another.
-The extensions supported by a layer may also change between two calls, e.g.
-if the layer implementation is replaced by a different version between those
-calls.
-
-Implementations must: not advertise any pair of extensions that cannot be
-enabled together due to behavioral differences, or any extension that cannot
-be enabled against the advertised version.
-
-include::{generated}/validity/protos/vkEnumerateInstanceExtensionProperties.txt[]
---
-
-
-=== Device Extensions
-
-Device extensions add new
-<<extendingvulkan-instanceanddevicefunctionality,device-level
-functionality>> to the API, outside of the core specification.
-
-[open,refpage='vkEnumerateDeviceExtensionProperties',desc='Returns properties of available physical device extensions',type='protos']
---
-To query the extensions available to a given physical device, call:
-
-include::{generated}/api/protos/vkEnumerateDeviceExtensionProperties.txt[]
-
-  * pname:physicalDevice is the physical device that will be queried.
-  * pname:pLayerName is either `NULL` or a pointer to a null-terminated
-    UTF-8 string naming the layer to retrieve extensions from.
-  * pname:pPropertyCount is a pointer to an integer related to the number of
-    extension properties available or queried, and is treated in the same
-    fashion as the
-    flink:vkEnumerateInstanceExtensionProperties::pname:pPropertyCount
-    parameter.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    slink:VkExtensionProperties structures.
-
-When pname:pLayerName parameter is `NULL`, only extensions provided by the
-Vulkan implementation or by implicitly enabled layers are returned.
-When pname:pLayerName is the name of a layer, the device extensions provided
-by that layer are returned.
-
-Implementations must: not advertise any pair of extensions that cannot be
-enabled together due to behavioral differences, or any extension that cannot
-be enabled against the advertised version.
-
-include::{generated}/validity/protos/vkEnumerateDeviceExtensionProperties.txt[]
---
-
-[open,refpage='VkExtensionProperties',desc='Structure specifying an extension properties',type='structs']
---
-The sname:VkExtensionProperties structure is defined as:
-
-include::{generated}/api/structs/VkExtensionProperties.txt[]
-
-  * pname:extensionName is an array of ename:VK_MAX_EXTENSION_NAME_SIZE
-    code:char containing a null-terminated UTF-8 string which is the name of
-    the extension.
-  * pname:specVersion is the version of this extension.
-    It is an integer, incremented with backward compatible changes.
-
-include::{generated}/validity/structs/VkExtensionProperties.txt[]
---
-
-
-[[extendingvulkan-extensions-extensiondependencies]]
-== Extension Dependencies
-
-Some extensions are dependent on other extensions, or on specific core API
-versions, to function.
-To enable extensions with dependencies, any _required extensions_ must: also
-be enabled through the same API mechanisms when creating an instance with
-flink:vkCreateInstance or a device with flink:vkCreateDevice.
-Each extension which has such dependencies documents them in the
-<<extensions, appendix summarizing that extension>>.
-
-If an extension is supported (as queried by
-flink:vkEnumerateInstanceExtensionProperties or
-flink:vkEnumerateDeviceExtensionProperties), then _required extensions_ of
-that extension must: also be supported for the same instance or physical
-device.
-
-Any device extension that has an instance extension dependency that is not
-enabled by flink:vkCreateInstance is considered to be unsupported, hence it
-must: not be returned by flink:vkEnumerateDeviceExtensionProperties for any
-slink:VkPhysicalDevice child of the instance.
-Instance extensions do not have dependencies on device extensions.
-
-If a required extension has been <<extendingvulkan-compatibility-promotion,
-promoted>> to another extension or to a core API version, then as a
-_general_ rule, the dependency is also satisfied by the promoted extension
-or core version.
-This will be true so long as any features required by the original extension
-are also required or enabled by the promoted extension or core version.
-However, in some cases an extension is promoted while making some of its
-features optional in the promoted extension or core version.
-In this case, the dependency may: not be satisfied.
-The only way to be certain is to look at the descriptions of the original
-dependency and the promoted version in the <<extensions, Layers &
-Extensions>> and <<versions, Core Revisions>> appendices.
-
-[NOTE]
-.Note
-====
-There is metadata in `vk.xml` describing some aspects of promotion,
-especially `requires`, `promotedto` and `deprecatedby` attributes of
-`<extension>` tags.
-However, the metadata does not yet fully describe this scenario.
-In the future, we may extend the XML schema to describe the full set of
-extensions and versions satisfying a dependency.
-====
-
-
-== Compatibility Guarantees (Informative)
-
-This section is marked as informal as there is no binding responsibility on
-implementations of the Vulkan API - these guarantees are however a contract
-between the Vulkan Working Group and developers using this Specification.
-
-
-[[extendingvulkan-compatibility-coreversions]]
-=== Core Versions
-
-Each of the <<extendingvulkan-coreversions,major, minor, and patch
-versions>> of the Vulkan specification provide different compatibility
-guarantees.
-
-
-==== Patch Versions
-
-A difference in the patch version indicates that a set of bug fixes or
-clarifications have been made to the Specification.
-Informative enums returned by Vulkan commands that will not affect the
-runtime behavior of a valid application may be added in a patch version
-(e.g. elink:VkVendorId).
-
-The specification's patch version is strictly increasing for a given major
-version of the specification; any change to a specification as described
-above will result in the patch version being increased by 1.
-Patch versions are applied to all minor versions, even if a given minor
-version is not affected by the provoking change.
-
-Specifications with different patch versions but the same major and minor
-version are _fully compatible_ with each other - such that a valid
-application written against one will work with an implementation of another.
-
-[NOTE]
-.Note
-====
-If a patch version includes a bug fix or clarification that could have a
-significant impact on developer expectations, these will be highlighted in
-the change log.
-Generally the Vulkan Working Group tries to avoid these kinds of changes,
-instead fixing them in either an extension or core version.
-====
-
-
-==== Minor Versions
-
-Changes in the minor version of the specification indicate that new
-functionality has been added to the core specification.
-This will usually include new interfaces in the header, and may: also
-include behavior changes and bug fixes.
-Core functionality may: be deprecated in a minor version, but will not be
-obsoleted or removed.
-
-The specification's minor version is strictly increasing for a given major
-version of the specification; any change to a specification as described
-above will result in the minor version being increased by 1.
-Changes that can be accommodated in a patch version will not increase the
-minor version.
-
-Specifications with a lower minor version are _backwards compatible_ with an
-implementation of a specification with a higher minor version for core
-functionality and extensions issued with the KHR vendor tag.
-Vendor and multi-vendor extensions are not guaranteed to remain functional
-across minor versions, though in general they are with few exceptions - see
-<<extendingvulkan-compatibility-obsoletion>> for more information.
-
-
-==== Major Versions
-
-A difference in the major version of specifications indicates a large set of
-changes which will likely include interface changes, behavioral changes,
-removal of <<extendingvulkan-compatibility-deprecation,deprecated
-functionality>>, and the modification, addition, or replacement of other
-functionality.
-
-The specification's major version is monotonically increasing; any change to
-the specification as described above will result in the major version being
-increased.
-Changes that can be accommodated in a patch or minor version will not
-increase the major version.
-
-The Vulkan Working Group intends to only issue a new major version of the
-Specification in order to realise significant improvements to the Vulkan API
-that will necessarily require breaking compatibility.
-
-A new major version will likely include a wholly new version of the
-specification to be issued - which could include an overhaul of the
-versioning semantics for the minor and patch versions.
-The patch and minor versions of a specification are therefore not meaningful
-across major versions.
-If a major version of the specification includes similar versioning
-semantics, it is expected that the patch and the minor version will be reset
-to 0 for that major version.
-
-
-[[extendingvulkan-compatibility-extensions]]
-=== Extensions
-
-A KHR extension must: be able to be enabled alongside any other KHR
-extension, and for any minor or patch version of the core Specification
-beyond the minimum version it requires.
-A multi-vendor extension should: be able to be enabled alongside any KHR
-extension or other multi-vendor extension, and for any minor or patch
-version of the core Specification beyond the minimum version it requires.
-A vendor extension should: be able to be enabled alongside any KHR
-extension, multi-vendor extension, or other vendor extension from the same
-vendor, and for any minor or patch version of the core Specification beyond
-the minimum version it requires.
-A vendor extension may: be able to be enabled alongside vendor extensions
-from another vendor.
-
-The one other exception to this is if a vendor or multi-vendor extension is
-<<extendingvulkan-compatibility-obsoletion, made obsolete>> by either a core
-version or another extension, which will be highlighted in the
-<<extensions,extension appendix>>.
-
-
-[[extendingvulkan-compatibility-promotion]]
-==== Promotion
-
-Extensions, or features of an extension, may: be promoted to a new
-<<versions,core version of the API>>, or a newer extension which an equal or
-greater number of implementors are in favour of.
-
-When extension functionality is promoted, minor changes may: be introduced,
-limited to the following:
-
-  * Naming
-  * Non-intrusive parameters changes
-  * <<features,Feature advertisement/enablement>>
-  * Combining structure parameters into larger structures
-  * Author ID suffixes changed or removed
-
-[NOTE]
-.Note
-====
-If extension functionality is promoted, there is no guarantee of direct
-compatibility, however it should require little effort to port code from the
-original feature to the promoted one.
-
-The Vulkan Working Group endeavours to ensure that larger changes are marked
-as either <<extendingvulkan-compatibility-deprecation, deprecated>> or
-<<extendingvulkan-compatibility-obsoletion, obsoleted>> as appropriate, and
-can do so retroactively if necessary.
-====
-
-Extensions that are promoted are listed as being promoted in their extension
-appendices, with reference to where they were promoted to.
-
-When an extension is promoted, any backwards compatibility aliases which
-exist in the extension will *not* be promoted.
-
-[NOTE]
-.Note
-====
-As a hypothetical example, if the `apiext:VK_KHR_surface` extension were
-promoted to part of a future core version, the
-ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR token defined by that extension
-would be promoted to etext:VK_COLOR_SPACE_SRGB_NONLINEAR.
-However, the ename:VK_COLORSPACE_SRGB_NONLINEAR_KHR token aliases
-ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR.
-The ename:VK_COLORSPACE_SRGB_NONLINEAR_KHR would not be promoted, because it
-is a backwards compatibility alias that exists only due to a naming mistake
-when the extension was initially published.
-====
-
-
-[[extendingvulkan-compatibility-deprecation]]
-==== Deprecation
-
-Extensions may: be marked as deprecated when the intended use cases either
-become irrelevant or can be solved in other ways.
-Generally, a new feature will become available to solve the use case in
-another extension or core version of the API, but it is not guaranteed.
-
-[NOTE]
-.Note
-====
-Features that are intended to replace deprecated functionality have no
-guarantees of compatibility, and applications may require drastic
-modification in order to make use of the new features.
-====
-
-Extensions that are deprecated are listed as being deprecated in their
-extension appendices, with an explanation of the deprecation and any
-features that are relevant.
-
-
-[[extendingvulkan-compatibility-obsoletion]]
-==== Obsoletion
-
-Occasionally, an extension will be marked as obsolete if a new version of
-the core API or a new extension is fundamentally incompatible with it.
-An obsoleted extension must: not be used with the extension or core version
-that obsoleted it.
-
-Extensions that are obsoleted are listed as being obsoleted in their
-extension appendices, with reference to what they were obsoleted by.
-
-
-[[extendingvulkan-compatibility-aliases]]
-==== Aliases
-
-When an extension is promoted or deprecated by a newer feature, some or all
-of its functionality may: be replicated into the newer feature.
-Rather than duplication of all the documentation and definitions, the
-specification instead identifies the identical commands and types as
-_aliases_ of one another.
-Each alias is mentioned together with the definition it aliases, with the
-older aliases marked as "`equivalents`".
-Each alias of the same command has identical behavior, and each alias of the
-same type has identical meaning - they can be used interchangeably in an
-application with no compatibility issues.
-
-[NOTE]
-.Note
-====
-For promoted types, the aliased extension type is semantically identical to
-the new core type.
-The C99 headers simply `typedef` the older aliases to the promoted types.
-
-For promoted command aliases, however, there are two separate entry point
-definitions, due to the fact that the C99 ABI has no way to alias command
-definitions without resorting to macros.
-Calling via either entry point definition will produce identical behavior
-within the bounds of the specification, and should still invoke the same
-entry point in the implementation.
-Debug tools may use separate entry points with different debug behavior; to
-write the appropriate command name to an output log, for instance.
-====
-
-
-[[extendingvulkan-compatibility-specialuse]]
-==== Special Use Extensions
-
-Some extensions exist only to support a specific purpose or specific class
-of application.
-These are referred to as "`special use extensions`".
-Use of these extensions in applications not meeting the special use criteria
-is not recommended.
-
-Special use cases are restricted, and only those defined below are used to
-describe extensions:
-
-// The attributes in the "Special Use" column are defined in
-// config/attribs.txt, and used in reference pages as well as here.
-// They define human-readable names for corresponding XML attribute values,
-// so specialuse="cadsupport" -> "CAD Support". They are used in the table
-// here and in the ExtensionMetaDocGenerator script that produces metadata
-// includes for extension appendices. When introducing a new special use,
-// the attribute and the table must both be extended.
-
-[[extendingvulkan-specialuse-table]]
-.Extension Special Use Cases
-[width="100%",options="header",cols="25%,15%,60%"]
-|====
-| Special Use    | XML Tag      | Full Description
-| {cadsupport}   | cadsupport
-    | Extension is intended to support specialized functionality used by
-      CAD/CAM applications.
-| {d3demulation} | d3demulation
-    | Extension is intended to support D3D emulation layers, and
-      applications ported from D3D, by adding functionality specific to D3D.
-| {devtools}     | devtools
-    | Extension is intended to support developer tools such as
-      capture-replay libraries.
-| {debugging}    | debugging
-    | Extension is intended for use by applications when debugging.
-| {glemulation}  | glemulation
-    | Extension is intended to support OpenGL and/or OpenGL ES emulation
-      layers, and applications ported from those APIs, by adding
-      functionality specific to those APIs.
-|====
-
-Special use extensions are identified in the metadata for each such
-extension in the <<extensions, Layers & Extensions>> appendix, using the
-name in the "`Special Use`" column above.
-
-Special use extensions are also identified in `vk.xml` with the short name
-in "`XML Tag`" column above, as described in the "`API Extensions
-(`extension` tag)`" section of the <<vulkan-registry, registry schema
-documentation>>.
-
diff --git a/registry/vulkan/chapters/features.txt b/registry/vulkan/chapters/features.txt
deleted file mode 100755
index 096264d..0000000
--- a/registry/vulkan/chapters/features.txt
+++ /dev/null
@@ -1,5061 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// This text fragment is used many times in the Features chapter.
-ifdef::hidden[]
-// tag::features[]
-If the sname:{refpage} structure is included in the pname:pNext chain of the
-slink:VkPhysicalDeviceFeatures2 structure passed to
-flink:vkGetPhysicalDeviceFeatures2, it is filled in to indicate whether each
-corresponding feature is supported.
-sname:{refpage} can: also be used in the pname:pNext chain of
-slink:VkDeviceCreateInfo to selectively enable these features.
-// end::features[]
-endif::hidden[]
-
-
-[[features]]
-= Features
-
-_Features_ describe functionality which is not supported on all
-implementations.
-Features are properties of the physical device.
-Features are optional:, and must: be explicitly enabled before use.
-Support for features is reported and enabled on a per-feature basis.
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-[NOTE]
-.Note
-====
-Features are reported via the basic slink:VkPhysicalDeviceFeatures
-structure, as well as the extensible structure
-sname:VkPhysicalDeviceFeatures2, which was added in the
-`apiext:VK_KHR_get_physical_device_properties2` extension and included in
-Vulkan 1.1.
-When new features are added in future Vulkan versions or extensions, each
-extension should: introduce one new feature structure, if needed.
-This structure can: be added to the pname:pNext chain of the
-sname:VkPhysicalDeviceFeatures2 structure.
-====
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-For convenience, new core versions of Vulkan may: introduce new unified
-feature structures for features promoted from extensions.
-At the same time, the extension's original feature structure (if any) is
-also promoted to the core API, and is an alias of the extension's structure.
-This results in multiple names for the same feature: in the original
-extension's feature structure and the promoted structure alias, in the
-unified feature structure.
-When a feature was implicitly supported and enabled in the extension, but an
-explicit name was added during promotion, then the extension itself acts as
-an alias for the feature as listed in the table below.
-
-All aliases of the same feature in the core API must: be reported
-consistently: either all must: be reported as supported, or none of them.
-When a promoted extension is available, any corresponding feature aliases
-must: be supported.
-
-[[features-extension-aliases]]
-.Extension Feature Aliases
-
-[width="100%",options="header"]
-|====
-| Extension                                 | Feature(s)
-ifdef::VK_VERSION_1_2[]
-ifdef::VK_KHR_shader_draw_parameters[]
-| `apiext:VK_KHR_shader_draw_parameters`       | <<features-shaderDrawParameters,pname:shaderDrawParameters>>
-endif::VK_KHR_shader_draw_parameters[]
-ifdef::VK_KHR_draw_indirect_count[]
-| `apiext:VK_KHR_draw_indirect_count`          | <<features-drawIndirectCount,pname:drawIndirectCount>>
-endif::VK_KHR_draw_indirect_count[]
-ifdef::VK_KHR_sampler_mirror_clamp_to_edge[]
-| `apiext:VK_KHR_sampler_mirror_clamp_to_edge` | <<features-samplerMirrorClampToEdge,pname:samplerMirrorClampToEdge>>
-endif::VK_KHR_sampler_mirror_clamp_to_edge[]
-ifdef::VK_EXT_descriptor_indexing[]
-| `apiext:VK_EXT_descriptor_indexing`          | <<features-descriptorIndexing,pname:descriptorIndexing>>
-endif::VK_EXT_descriptor_indexing[]
-ifdef::VK_EXT_sampler_filter_minmax[]
-| `apiext:VK_EXT_sampler_filter_minmax`        | <<features-samplerFilterMinmax,pname:samplerFilterMinmax>>
-endif::VK_EXT_sampler_filter_minmax[]
-ifdef::VK_EXT_shader_viewport_index_layer[]
-| `apiext:VK_EXT_shader_viewport_index_layer`  | <<features-shaderOutputViewportIndex,pname:shaderOutputViewportIndex>>, <<features-shaderOutputLayer,pname:shaderOutputLayer>>
-endif::VK_EXT_shader_viewport_index_layer[]
-endif::VK_VERSION_1_2[]
-|====
-
-[open,refpage='vkGetPhysicalDeviceFeatures',desc='Reports capabilities of a physical device',type='protos']
---
-To query supported features, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceFeatures.txt[]
-
-  * pname:physicalDevice is the physical device from which to query the
-    supported features.
-  * pname:pFeatures is a pointer to a slink:VkPhysicalDeviceFeatures
-    structure in which the physical device features are returned.
-    For each feature, a value of ename:VK_TRUE specifies that the feature is
-    supported on this physical device, and ename:VK_FALSE specifies that the
-    feature is not supported.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceFeatures.txt[]
---
-
-Fine-grained features used by a logical device must: be enabled at
-sname:VkDevice creation time.
-If a feature is enabled that the physical device does not support,
-sname:VkDevice creation will fail and return
-ename:VK_ERROR_FEATURE_NOT_PRESENT.
-
-The fine-grained features are enabled by passing a pointer to the
-sname:VkPhysicalDeviceFeatures structure via the pname:pEnabledFeatures
-member of the slink:VkDeviceCreateInfo structure that is passed into the
-fname:vkCreateDevice call.
-If a member of pname:pEnabledFeatures is set to ename:VK_TRUE or
-ename:VK_FALSE, then the device will be created with the indicated feature
-enabled or disabled, respectively.
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-Features can: also be enabled by using the slink:VkPhysicalDeviceFeatures2
-structure.
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-If an application wishes to enable all features supported by a device, it
-can: simply pass in the sname:VkPhysicalDeviceFeatures structure that was
-previously returned by fname:vkGetPhysicalDeviceFeatures.
-To disable an individual feature, the application can: set the desired
-member to ename:VK_FALSE in the same structure.
-Setting pname:pEnabledFeatures to `NULL`
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-and not including a slink:VkPhysicalDeviceFeatures2 in the pname:pNext chain
-of slink:VkDeviceCreateInfo
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-is equivalent to setting all members of the structure to ename:VK_FALSE.
-
-[NOTE]
-.Note
-====
-Some features, such as pname:robustBufferAccess, may: incur a runtime
-performance cost.
-Application writers should: carefully consider the implications of enabling
-all supported features.
-====
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-[open,refpage='vkGetPhysicalDeviceFeatures2',desc='Reports capabilities of a physical device',type='protos']
---
-To query supported features defined by the core or extensions, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetPhysicalDeviceFeatures2.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_get_physical_device_properties2[or the equivalent command]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-include::{generated}/api/protos/vkGetPhysicalDeviceFeatures2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:physicalDevice is the physical device from which to query the
-    supported features.
-  * pname:pFeatures is a pointer to a slink:VkPhysicalDeviceFeatures2
-    structure in which the physical device features are returned.
-
-Each structure in pname:pFeatures and its pname:pNext chain contains members
-corresponding to fine-grained features.
-fname:vkGetPhysicalDeviceFeatures2 writes each member to a boolean value
-indicating whether that feature is supported.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceFeatures2.txt[]
---
-
-[open,refpage='VkPhysicalDeviceFeatures2',desc='Structure describing the fine-grained features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceFeatures2 structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceFeatures2.txt[]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceFeatures2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:features is a slink:VkPhysicalDeviceFeatures structure describing
-    the fine-grained features of the Vulkan 1.0 API.
-
-The pname:pNext chain of this structure is used to extend the structure with
-features defined by extensions.
-This structure can: be used in flink:vkGetPhysicalDeviceFeatures2 or can: be
-included in the pname:pNext chain of a slink:VkDeviceCreateInfo structure,
-in which case it controls which features are enabled in the device in lieu
-of pname:pEnabledFeatures.
-
-include::{generated}/validity/structs/VkPhysicalDeviceFeatures2.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-[open,refpage='VkPhysicalDeviceFeatures',desc='Structure describing the fine-grained features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceFeatures structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceFeatures.txt[]
-
-This structure describes the following features:
-
-  * [[features-robustBufferAccess]] pname:robustBufferAccess specifies that
-    accesses to buffers are bounds-checked against the range of the buffer
-    descriptor (as determined by sname:VkDescriptorBufferInfo::pname:range,
-    slink:VkBufferViewCreateInfo::pname:range, or the size of the buffer).
-    Out of bounds accesses must: not cause application termination, and the
-    effects of shader loads, stores, and atomics must: conform to an
-    implementation-dependent behavior as described below.
-  ** A buffer access is considered to be out of bounds if any of the
-     following are true:
-  *** The pointer was formed by code:OpImageTexelPointer and the coordinate
-      is less than zero or greater than or equal to the number of whole
-      elements in the bound range.
-  *** The pointer was not formed by code:OpImageTexelPointer and the object
-      pointed to is not wholly contained within the bound range.
-ifdef::VK_VERSION_1_1,VK_KHR_variable_pointers[]
-      This includes accesses performed via _variable pointers_ where the
-      buffer descriptor being accessed cannot be statically determined.
-      Uninitialized pointers and pointers equal to code:OpConstantNull are
-      treated as pointing to a zero-sized object, so all accesses through
-      such pointers are considered to be out of bounds.
-endif::VK_VERSION_1_1,VK_KHR_variable_pointers[]
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-      Buffer accesses through buffer device addresses are not
-      bounds-checked.
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-ifdef::VK_NV_cooperative_matrix[]
-      If the
-      <<features-cooperativeMatrixRobustBufferAccess,pname:cooperativeMatrixRobustBufferAccess>>
-      feature is not enabled, then accesses using
-      code:OpCooperativeMatrixLoadNV and code:OpCooperativeMatrixStoreNV
-      may: not be bounds-checked.
-endif::VK_NV_cooperative_matrix[]
-+
-[NOTE]
-.Note
-====
-If a SPIR-V code:OpLoad instruction loads a structure and the tail end of
-the structure is out of bounds, then all members of the structure are
-considered out of bounds even if the members at the end are not statically
-used.
-====
-
-  *** If
-ifdef::VK_EXT_robustness2[]
-      <<features-robustBufferAccess2,pname:robustBufferAccess2>> is not
-      enabled and
-endif::VK_EXT_robustness2[]
-      any buffer access is determined to be out of bounds, then any other
-      access of the same type (load, store, or atomic) to the same buffer
-      that accesses an address less than 16 bytes away from the out of
-      bounds address may: also be considered out of bounds.
-  *** If the access is a load that reads from the same memory locations as a
-      prior store in the same shader invocation, with no other intervening
-      accesses to the same memory locations in that shader invocation, then
-      the result of the load may: be the value stored by the store
-      instruction, even if the access is out of bounds.
-      If the load is code:Volatile, then an out of bounds load must: return
-      the appropriate out of bounds value.
-ifdef::VK_EXT_robustness2[]
-  ** Accesses to descriptors written with a dlink:VK_NULL_HANDLE resource or
-     view are not considered to be out of bounds.
-     Instead, each type of descriptor access defines a specific behavior for
-     accesses to a null descriptor.
-endif::VK_EXT_robustness2[]
-  ** Out-of-bounds buffer loads will return any of the following values:
-ifdef::VK_EXT_robustness2[]
-  *** If the access is to a uniform buffer and
-      <<features-robustBufferAccess2,pname:robustBufferAccess2>> is enabled,
-      loads of offsets between the end of the descriptor range and the end
-      of the descriptor range rounded up to a multiple of
-      <<limits-robustUniformBufferAccessSizeAlignment,robustUniformBufferAccessSizeAlignment>>
-      bytes must: return either zero values or the contents of the memory at
-      the offset being loaded.
-      Loads of offsets past the descriptor range rounded up to a multiple of
-      <<limits-robustUniformBufferAccessSizeAlignment,robustUniformBufferAccessSizeAlignment>>
-      bytes must: return zero values.
-  *** If the access is to a storage buffer and
-      <<features-robustBufferAccess2,pname:robustBufferAccess2>> is enabled,
-      loads of offsets between the end of the descriptor range and the end
-      of the descriptor range rounded up to a multiple of
-      <<limits-robustStorageBufferAccessSizeAlignment,robustStorageBufferAccessSizeAlignment>>
-      bytes must: return either zero values or the contents of the memory at
-      the offset being loaded.
-      Loads of offsets past the descriptor range rounded up to a multiple of
-      <<limits-robustStorageBufferAccessSizeAlignment,robustStorageBufferAccessSizeAlignment>>
-      bytes must: return zero values.
-      Similarly, stores to addresses between the end of the descriptor range
-      and the end of the descriptor range rounded up to a multiple of
-      <<limits-robustStorageBufferAccessSizeAlignment,robustStorageBufferAccessSizeAlignment>>
-      bytes may: be discarded.
-  *** Non-atomic accesses to storage buffers that are a multiple of 32 bits
-      may: be decomposed into 32-bit accesses that are individually
-      bounds-checked.
-  *** If the access is to an index buffer and
-      <<features-robustBufferAccess2,pname:robustBufferAccess2>> is enabled,
-      zero values must: be returned.
-  *** If the access is to a uniform texel buffer or storage texel buffer and
-      <<features-robustBufferAccess2,pname:robustBufferAccess2>> is enabled,
-      zero values must: be returned, and then
-      <<textures-conversion-to-rgba,Conversion to RGBA>> is applied based on
-      the buffer view's format.
-endif::VK_EXT_robustness2[]
-  *** Values from anywhere within the memory range(s) bound to the buffer
-      (possibly including bytes of memory past the end of the buffer, up to
-      the end of the bound range).
-  *** Zero values, or [eq]#(0,0,0,x)# vectors for vector reads where x is a
-      valid value represented in the type of the vector components and may:
-      be any of:
-  **** 0, 1, or the maximum representable positive integer value, for signed
-       or unsigned integer components
-  **** 0.0 or 1.0, for floating-point components
-  ** Out-of-bounds writes may: modify values within the memory range(s)
-     bound to the buffer, but must: not modify any other memory.
-ifdef::VK_EXT_robustness2[]
-  *** If <<features-robustBufferAccess2,pname:robustBufferAccess2>> is
-      enabled, out of bounds writes must: not modify any memory.
-endif::VK_EXT_robustness2[]
-  ** Out-of-bounds atomics may: modify values within the memory range(s)
-     bound to the buffer, but must: not modify any other memory, and return
-     an undefined: value.
-ifdef::VK_EXT_robustness2[]
-  *** If <<features-robustBufferAccess2,pname:robustBufferAccess2>> is
-      enabled, out of bounds atomics must: not modify any memory, and return
-      an undefined: value.
-  ** If <<features-robustBufferAccess2,pname:robustBufferAccess2>> is
-     disabled, vertex
-endif::VK_EXT_robustness2[]
-ifndef::VK_EXT_robustness2[]
-  ** Vertex
-endif::VK_EXT_robustness2[]
-     input attributes are considered out of bounds if the offset of the
-     attribute in the bound vertex buffer range plus the size of the
-     attribute is greater than either:
-+
-  *** code:vertexBufferRangeSize, if [eq]#code:bindingStride == 0#; or
-  *** [eq]#(code:vertexBufferRangeSize - (code:vertexBufferRangeSize %
-      code:bindingStride))#
-+
-where code:vertexBufferRangeSize is the byte size of the memory range bound
-to the vertex buffer binding and code:bindingStride is the byte stride of
-the corresponding vertex input binding.
-Further, if any vertex input attribute using a specific vertex input binding
-is out of bounds, then all vertex input attributes using that vertex input
-binding for that vertex shader invocation are considered out of bounds.
-  *** If a vertex input attribute is out of bounds, it will be assigned one
-      of the following values:
-  **** Values from anywhere within the memory range(s) bound to the buffer,
-       converted according to the format of the attribute.
-  **** Zero values, format converted according to the format of the
-       attribute.
-  **** Zero values, or [eq]#(0,0,0,x)# vectors, as described above.
-ifdef::VK_EXT_robustness2[]
-  ** If <<features-robustBufferAccess2,pname:robustBufferAccess2>> is
-     enabled, vertex input attributes are considered out of bounds if the
-     offset of the attribute in the bound vertex buffer range plus the size
-     of the attribute is greater than the byte size of the memory range
-     bound to the vertex buffer binding.
-  *** If a vertex input attribute is out of bounds, the
-      <<fxvertex-input-extraction,raw data>> extracted are zero values, and
-      missing G, B, or A components are <<fxvertex-input-extraction,filled
-      with [eq]#(0,0,1)#>>.
-endif::VK_EXT_robustness2[]
-  ** If pname:robustBufferAccess is not enabled, applications must: not
-     perform out of bounds accesses.
-  * [[features-fullDrawIndexUint32]] pname:fullDrawIndexUint32 specifies the
-    full 32-bit range of indices is supported for indexed draw calls when
-    using a elink:VkIndexType of ename:VK_INDEX_TYPE_UINT32.
-    pname:maxDrawIndexedIndexValue is the maximum index value that may: be
-    used (aside from the primitive restart index, which is always 2^32^-1
-    when the elink:VkIndexType is ename:VK_INDEX_TYPE_UINT32).
-    If this feature is supported, pname:maxDrawIndexedIndexValue must: be
-    2^32^-1; otherwise it must: be no smaller than 2^24^-1.
-    See <<limits-maxDrawIndexedIndexValue,maxDrawIndexedIndexValue>>.
-  * [[features-imageCubeArray]] pname:imageCubeArray specifies whether image
-    views with a elink:VkImageViewType of
-    ename:VK_IMAGE_VIEW_TYPE_CUBE_ARRAY can: be created, and that the
-    corresponding code:SampledCubeArray and code:ImageCubeArray SPIR-V
-    capabilities can: be used in shader code.
-  * [[features-independentBlend]] pname:independentBlend specifies whether
-    the sname:VkPipelineColorBlendAttachmentState settings are controlled
-    independently per-attachment.
-    If this feature is not enabled, the
-    sname:VkPipelineColorBlendAttachmentState settings for all color
-    attachments must: be identical.
-    Otherwise, a different sname:VkPipelineColorBlendAttachmentState can: be
-    provided for each bound color attachment.
-  * [[features-geometryShader]] pname:geometryShader specifies whether
-    geometry shaders are supported.
-    If this feature is not enabled, the ename:VK_SHADER_STAGE_GEOMETRY_BIT
-    and ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT enum values must: not be
-    used.
-    This also specifies whether shader modules can: declare the
-    code:Geometry capability.
-  * [[features-tessellationShader]] pname:tessellationShader specifies
-    whether tessellation control and evaluation shaders are supported.
-    If this feature is not enabled, the
-    ename:VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
-    ename:VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
-    ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT,
-    ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, and
-    ename:VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO enum
-    values must: not be used.
-    This also specifies whether shader modules can: declare the
-    code:Tessellation capability.
-  * [[features-sampleRateShading]] pname:sampleRateShading specifies whether
-    <<primsrast-sampleshading,Sample Shading>> and multisample interpolation
-    are supported.
-    If this feature is not enabled, the pname:sampleShadingEnable member of
-    the slink:VkPipelineMultisampleStateCreateInfo structure must: be set to
-    ename:VK_FALSE and the pname:minSampleShading member is ignored.
-    This also specifies whether shader modules can: declare the
-    code:SampleRateShading capability.
-  * [[features-dualSrcBlend]] pname:dualSrcBlend specifies whether blend
-    operations which take two sources are supported.
-    If this feature is not enabled, the ename:VK_BLEND_FACTOR_SRC1_COLOR,
-    ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR,
-    ename:VK_BLEND_FACTOR_SRC1_ALPHA, and
-    ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA enum values must: not be used
-    as source or destination blending factors.
-    See <<framebuffer-dsb>>.
-  * [[features-logicOp]] pname:logicOp specifies whether logic operations
-    are supported.
-    If this feature is not enabled, the pname:logicOpEnable member of the
-    slink:VkPipelineColorBlendStateCreateInfo structure must: be set to
-    ename:VK_FALSE, and the pname:logicOp member is ignored.
-  * [[features-multiDrawIndirect]] pname:multiDrawIndirect specifies whether
-    multiple draw indirect is supported.
-    If this feature is not enabled, the pname:drawCount parameter to the
-    fname:vkCmdDrawIndirect and fname:vkCmdDrawIndexedIndirect commands
-    must: be 0 or 1.
-    The pname:maxDrawIndirectCount member of the
-    sname:VkPhysicalDeviceLimits structure must: also be 1 if this feature
-    is not supported.
-    See <<limits-maxDrawIndirectCount,maxDrawIndirectCount>>.
-  * [[features-drawIndirectFirstInstance]] pname:drawIndirectFirstInstance
-    specifies whether indirect drawing calls support the pname:firstInstance
-    parameter.
-    If this feature is not enabled, the pname:firstInstance member of all
-    sname:VkDrawIndirectCommand and sname:VkDrawIndexedIndirectCommand
-    structures that are provided to the fname:vkCmdDrawIndirect and
-    fname:vkCmdDrawIndexedIndirect commands must: be 0.
-  * [[features-depthClamp]] pname:depthClamp specifies whether depth
-    clamping is supported.
-    If this feature is not enabled, the pname:depthClampEnable member of the
-    slink:VkPipelineRasterizationStateCreateInfo structure must: be set to
-    ename:VK_FALSE.
-    Otherwise, setting pname:depthClampEnable to ename:VK_TRUE will enable
-    depth clamping.
-  * [[features-depthBiasClamp]] pname:depthBiasClamp specifies whether depth
-    bias clamping is supported.
-    If this feature is not enabled, the pname:depthBiasClamp member of the
-    slink:VkPipelineRasterizationStateCreateInfo structure must: be set to
-    0.0 unless the ename:VK_DYNAMIC_STATE_DEPTH_BIAS dynamic state is
-    enabled, and the pname:depthBiasClamp parameter to
-    fname:vkCmdSetDepthBias must: be set to 0.0.
-  * [[features-fillModeNonSolid]] pname:fillModeNonSolid specifies whether
-    point and wireframe fill modes are supported.
-    If this feature is not enabled, the ename:VK_POLYGON_MODE_POINT and
-    ename:VK_POLYGON_MODE_LINE enum values must: not be used.
-  * [[features-depthBounds]] pname:depthBounds specifies whether depth
-    bounds tests are supported.
-    If this feature is not enabled, the pname:depthBoundsTestEnable member
-    of the slink:VkPipelineDepthStencilStateCreateInfo structure must: be
-    set to ename:VK_FALSE.
-    When pname:depthBoundsTestEnable is set to ename:VK_FALSE, the
-    pname:minDepthBounds and pname:maxDepthBounds members of the
-    slink:VkPipelineDepthStencilStateCreateInfo structure are ignored.
-  * [[features-wideLines]] pname:wideLines specifies whether lines with
-    width other than 1.0 are supported.
-    If this feature is not enabled, the pname:lineWidth member of the
-    slink:VkPipelineRasterizationStateCreateInfo structure must: be set to
-    1.0 unless the ename:VK_DYNAMIC_STATE_LINE_WIDTH dynamic state is
-    enabled, and the pname:lineWidth parameter to fname:vkCmdSetLineWidth
-    must: be set to 1.0.
-    When this feature is supported, the range and granularity of supported
-    line widths are indicated by the pname:lineWidthRange and
-    pname:lineWidthGranularity members of the sname:VkPhysicalDeviceLimits
-    structure, respectively.
-  * [[features-largePoints]] pname:largePoints specifies whether points with
-    size greater than 1.0 are supported.
-    If this feature is not enabled, only a point size of 1.0 written by a
-    shader is supported.
-    The range and granularity of supported point sizes are indicated by the
-    pname:pointSizeRange and pname:pointSizeGranularity members of the
-    sname:VkPhysicalDeviceLimits structure, respectively.
-  * [[features-alphaToOne]] pname:alphaToOne specifies whether the
-    implementation is able to replace the alpha value of the fragment shader
-    color output in the <<fragops-covg, Multisample Coverage>> fragment
-    operation.
-    If this feature is not enabled, then the pname:alphaToOneEnable member
-    of the slink:VkPipelineMultisampleStateCreateInfo structure must: be set
-    to ename:VK_FALSE.
-    Otherwise setting pname:alphaToOneEnable to ename:VK_TRUE will enable
-    alpha-to-one behavior.
-  * [[features-multiViewport]] pname:multiViewport specifies whether more
-    than one viewport is supported.
-    If this feature is not enabled:
-  ** The pname:viewportCount and pname:scissorCount members of the
-     slink:VkPipelineViewportStateCreateInfo structure must: be set to 1.
-  ** The pname:firstViewport and pname:viewportCount parameters to the
-     fname:vkCmdSetViewport command must: be set to 0 and 1, respectively.
-  ** The pname:firstScissor and pname:scissorCount parameters to the
-     fname:vkCmdSetScissor command must: be set to 0 and 1, respectively.
-ifdef::VK_NV_scissor_exclusive[]
-  ** The pname:exclusiveScissorCount member of the
-     slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV structure
-     must: be set to 0 or 1.
-  ** The pname:firstExclusiveScissor and pname:exclusiveScissorCount
-     parameters to the fname:vkCmdSetExclusiveScissorNV command must: be set
-     to 0 and 1, respectively.
-endif::VK_NV_scissor_exclusive[]
-  * [[features-samplerAnisotropy]] pname:samplerAnisotropy specifies whether
-    anisotropic filtering is supported.
-    If this feature is not enabled, the pname:anisotropyEnable member of the
-    slink:VkSamplerCreateInfo structure must: be ename:VK_FALSE.
-  * [[features-textureCompressionETC2]] pname:textureCompressionETC2
-    specifies whether all of the ETC2 and EAC compressed texture formats are
-    supported.
-    If this feature is enabled, then the
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT,
-    ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT and
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT features must:
-    be supported in pname:optimalTilingFeatures for the following formats:
-+
-  ** ename:VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK
-  ** ename:VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK
-  ** ename:VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK
-  ** ename:VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK
-  ** ename:VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK
-  ** ename:VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK
-  ** ename:VK_FORMAT_EAC_R11_UNORM_BLOCK
-  ** ename:VK_FORMAT_EAC_R11_SNORM_BLOCK
-  ** ename:VK_FORMAT_EAC_R11G11_UNORM_BLOCK
-  ** ename:VK_FORMAT_EAC_R11G11_SNORM_BLOCK
-+
-To query for additional properties, or if the feature is not enabled,
-flink:vkGetPhysicalDeviceFormatProperties and
-flink:vkGetPhysicalDeviceImageFormatProperties can: be used to check for
-supported properties of individual formats as normal.
-
-  * [[features-textureCompressionASTC_LDR]] pname:textureCompressionASTC_LDR
-    specifies whether all of the ASTC LDR compressed texture formats are
-    supported.
-    If this feature is enabled, then the
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT,
-    ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT and
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT features must:
-    be supported in pname:optimalTilingFeatures for the following formats:
-+
-  ** ename:VK_FORMAT_ASTC_4x4_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_4x4_SRGB_BLOCK
-  ** ename:VK_FORMAT_ASTC_5x4_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_5x4_SRGB_BLOCK
-  ** ename:VK_FORMAT_ASTC_5x5_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_5x5_SRGB_BLOCK
-  ** ename:VK_FORMAT_ASTC_6x5_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_6x5_SRGB_BLOCK
-  ** ename:VK_FORMAT_ASTC_6x6_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_6x6_SRGB_BLOCK
-  ** ename:VK_FORMAT_ASTC_8x5_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_8x5_SRGB_BLOCK
-  ** ename:VK_FORMAT_ASTC_8x6_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_8x6_SRGB_BLOCK
-  ** ename:VK_FORMAT_ASTC_8x8_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_8x8_SRGB_BLOCK
-  ** ename:VK_FORMAT_ASTC_10x5_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_10x5_SRGB_BLOCK
-  ** ename:VK_FORMAT_ASTC_10x6_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_10x6_SRGB_BLOCK
-  ** ename:VK_FORMAT_ASTC_10x8_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_10x8_SRGB_BLOCK
-  ** ename:VK_FORMAT_ASTC_10x10_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_10x10_SRGB_BLOCK
-  ** ename:VK_FORMAT_ASTC_12x10_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_12x10_SRGB_BLOCK
-  ** ename:VK_FORMAT_ASTC_12x12_UNORM_BLOCK
-  ** ename:VK_FORMAT_ASTC_12x12_SRGB_BLOCK
-+
-To query for additional properties, or if the feature is not enabled,
-flink:vkGetPhysicalDeviceFormatProperties and
-flink:vkGetPhysicalDeviceImageFormatProperties can: be used to check for
-supported properties of individual formats as normal.
-
-  * [[features-textureCompressionBC]] pname:textureCompressionBC specifies
-    whether all of the BC compressed texture formats are supported.
-    If this feature is enabled, then the
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT,
-    ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT and
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT features must:
-    be supported in pname:optimalTilingFeatures for the following formats:
-+
-  ** ename:VK_FORMAT_BC1_RGB_UNORM_BLOCK
-  ** ename:VK_FORMAT_BC1_RGB_SRGB_BLOCK
-  ** ename:VK_FORMAT_BC1_RGBA_UNORM_BLOCK
-  ** ename:VK_FORMAT_BC1_RGBA_SRGB_BLOCK
-  ** ename:VK_FORMAT_BC2_UNORM_BLOCK
-  ** ename:VK_FORMAT_BC2_SRGB_BLOCK
-  ** ename:VK_FORMAT_BC3_UNORM_BLOCK
-  ** ename:VK_FORMAT_BC3_SRGB_BLOCK
-  ** ename:VK_FORMAT_BC4_UNORM_BLOCK
-  ** ename:VK_FORMAT_BC4_SNORM_BLOCK
-  ** ename:VK_FORMAT_BC5_UNORM_BLOCK
-  ** ename:VK_FORMAT_BC5_SNORM_BLOCK
-  ** ename:VK_FORMAT_BC6H_UFLOAT_BLOCK
-  ** ename:VK_FORMAT_BC6H_SFLOAT_BLOCK
-  ** ename:VK_FORMAT_BC7_UNORM_BLOCK
-  ** ename:VK_FORMAT_BC7_SRGB_BLOCK
-+
-To query for additional properties, or if the feature is not enabled,
-flink:vkGetPhysicalDeviceFormatProperties and
-flink:vkGetPhysicalDeviceImageFormatProperties can: be used to check for
-supported properties of individual formats as normal.
-
-  * [[features-occlusionQueryPrecise]] pname:occlusionQueryPrecise specifies
-    whether occlusion queries returning actual sample counts are supported.
-    Occlusion queries are created in a sname:VkQueryPool by specifying the
-    pname:queryType of ename:VK_QUERY_TYPE_OCCLUSION in the
-    slink:VkQueryPoolCreateInfo structure which is passed to
-    fname:vkCreateQueryPool.
-    If this feature is enabled, queries of this type can: enable
-    ename:VK_QUERY_CONTROL_PRECISE_BIT in the pname:flags parameter to
-    fname:vkCmdBeginQuery.
-    If this feature is not supported, the implementation supports only
-    boolean occlusion queries.
-    When any samples are passed, boolean queries will return a non-zero
-    result value, otherwise a result value of zero is returned.
-    When this feature is enabled and ename:VK_QUERY_CONTROL_PRECISE_BIT is
-    set, occlusion queries will report the actual number of samples passed.
-  * [[features-pipelineStatisticsQuery]] pname:pipelineStatisticsQuery
-    specifies whether the pipeline statistics queries are supported.
-    If this feature is not enabled, queries of type
-    ename:VK_QUERY_TYPE_PIPELINE_STATISTICS cannot: be created, and none of
-    the elink:VkQueryPipelineStatisticFlagBits bits can: be set in the
-    pname:pipelineStatistics member of the slink:VkQueryPoolCreateInfo
-    structure.
-  * [[features-vertexPipelineStoresAndAtomics]]
-    pname:vertexPipelineStoresAndAtomics specifies whether storage buffers
-    and images support stores and atomic operations in the vertex,
-    tessellation, and geometry shader stages.
-    If this feature is not enabled, all storage image, storage texel buffer,
-    and storage buffer variables used by these stages in shader modules
-    must: be decorated with the code:NonWritable decoration (or the
-    code:readonly memory qualifier in GLSL).
-  * [[features-fragmentStoresAndAtomics]] pname:fragmentStoresAndAtomics
-    specifies whether storage buffers and images support stores and atomic
-    operations in the fragment shader stage.
-    If this feature is not enabled, all storage image, storage texel buffer,
-    and storage buffer variables used by the fragment stage in shader
-    modules must: be decorated with the code:NonWritable decoration (or the
-    code:readonly memory qualifier in GLSL).
-  * [[features-shaderTessellationAndGeometryPointSize]]
-    pname:shaderTessellationAndGeometryPointSize specifies whether the
-    code:PointSize built-in decoration is available in the tessellation
-    control, tessellation evaluation, and geometry shader stages.
-    If this feature is not enabled, members decorated with the
-    code:PointSize built-in decoration must: not be read from or written to
-    and all points written from a tessellation or geometry shader will have
-    a size of 1.0.
-    This also specifies whether shader modules can: declare the
-    code:TessellationPointSize capability for tessellation control and
-    evaluation shaders, or if the shader modules can: declare the
-    code:GeometryPointSize capability for geometry shaders.
-    An implementation supporting this feature must: also support one or both
-    of the <<features-tessellationShader,pname:tessellationShader>> or
-    <<features-geometryShader,pname:geometryShader>> features.
-  * [[features-shaderImageGatherExtended]] pname:shaderImageGatherExtended
-    specifies whether the extended set of image gather instructions are
-    available in shader code.
-    If this feature is not enabled, the code:OpImage*Gather instructions do
-    not support the code:Offset and code:ConstOffsets operands.
-    This also specifies whether shader modules can: declare the
-    code:ImageGatherExtended capability.
-  * [[features-shaderStorageImageExtendedFormats]]
-    pname:shaderStorageImageExtendedFormats specifies whether all the
-    "`storage image extended formats`" below are supported; if this feature
-    is supported, then the ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT must:
-    be supported in pname:optimalTilingFeatures for the following formats:
-+
-  ** ename:VK_FORMAT_R16G16_SFLOAT
-  ** ename:VK_FORMAT_B10G11R11_UFLOAT_PACK32
-  ** ename:VK_FORMAT_R16_SFLOAT
-  ** ename:VK_FORMAT_R16G16B16A16_UNORM
-  ** ename:VK_FORMAT_A2B10G10R10_UNORM_PACK32
-  ** ename:VK_FORMAT_R16G16_UNORM
-  ** ename:VK_FORMAT_R8G8_UNORM
-  ** ename:VK_FORMAT_R16_UNORM
-  ** ename:VK_FORMAT_R8_UNORM
-  ** ename:VK_FORMAT_R16G16B16A16_SNORM
-  ** ename:VK_FORMAT_R16G16_SNORM
-  ** ename:VK_FORMAT_R8G8_SNORM
-  ** ename:VK_FORMAT_R16_SNORM
-  ** ename:VK_FORMAT_R8_SNORM
-  ** ename:VK_FORMAT_R16G16_SINT
-  ** ename:VK_FORMAT_R8G8_SINT
-  ** ename:VK_FORMAT_R16_SINT
-  ** ename:VK_FORMAT_R8_SINT
-  ** ename:VK_FORMAT_A2B10G10R10_UINT_PACK32
-  ** ename:VK_FORMAT_R16G16_UINT
-  ** ename:VK_FORMAT_R8G8_UINT
-  ** ename:VK_FORMAT_R16_UINT
-  ** ename:VK_FORMAT_R8_UINT
-+
-[NOTE]
-.Note
-====
-pname:shaderStorageImageExtendedFormats feature only adds a guarantee of
-format support, which is specified for the whole physical device.
-Therefore enabling or disabling the feature via flink:vkCreateDevice has no
-practical effect.
-
-To query for additional properties, or if the feature is not supported,
-flink:vkGetPhysicalDeviceFormatProperties and
-flink:vkGetPhysicalDeviceImageFormatProperties can: be used to check for
-supported properties of individual formats, as usual rules allow.
-
-ename:VK_FORMAT_R32G32_UINT, ename:VK_FORMAT_R32G32_SINT, and
-ename:VK_FORMAT_R32G32_SFLOAT from code:StorageImageExtendedFormats SPIR-V
-capability, are already covered by core Vulkan
-<<formats-mandatory-features-32bit,mandatory format support>>.
-====
-
-  * [[features-shaderStorageImageMultisample]]
-    pname:shaderStorageImageMultisample specifies whether multisampled
-    storage images are supported.
-    If this feature is not enabled, images that are created with a
-    pname:usage that includes ename:VK_IMAGE_USAGE_STORAGE_BIT must: be
-    created with pname:samples equal to ename:VK_SAMPLE_COUNT_1_BIT.
-    This also specifies whether shader modules can: declare the
-    code:StorageImageMultisample and code:ImageMSArray capabilities.
-  * [[features-shaderStorageImageReadWithoutFormat]]
-    pname:shaderStorageImageReadWithoutFormat specifies whether storage
-    images require a format qualifier to be specified when reading.
-ifdef::VK_KHR_format_feature_flags2[]
-    pname:shaderStorageImageReadWithoutFormat applies only to formats listed
-    in the <<formats-without-shader-storage-format,storage without format>>
-    list.
-endif::VK_KHR_format_feature_flags2[]
-  * [[features-shaderStorageImageWriteWithoutFormat]]
-    pname:shaderStorageImageWriteWithoutFormat specifies whether storage
-    images require a format qualifier to be specified when writing.
-ifdef::VK_KHR_format_feature_flags2[]
-    pname:shaderStorageImageWriteWithoutFormat applies only to formats
-    listed in the <<formats-without-shader-storage-format,storage without
-    format>> list.
-endif::VK_KHR_format_feature_flags2[]
-  * [[features-shaderUniformBufferArrayDynamicIndexing]]
-    pname:shaderUniformBufferArrayDynamicIndexing specifies whether arrays
-    of uniform buffers can: be indexed by _dynamically uniform_ integer
-    expressions in shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC must: be indexed only by
-    constant integral expressions when aggregated into arrays in shader
-    code.
-    This also specifies whether shader modules can: declare the
-    code:UniformBufferArrayDynamicIndexing capability.
-  * [[features-shaderSampledImageArrayDynamicIndexing]]
-    pname:shaderSampledImageArrayDynamicIndexing specifies whether arrays of
-    samplers or sampled images can: be indexed by dynamically uniform
-    integer expressions in shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, or
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE must: be indexed only by constant
-    integral expressions when aggregated into arrays in shader code.
-    This also specifies whether shader modules can: declare the
-    code:SampledImageArrayDynamicIndexing capability.
-  * [[features-shaderStorageBufferArrayDynamicIndexing]]
-    pname:shaderStorageBufferArrayDynamicIndexing specifies whether arrays
-    of storage buffers can: be indexed by dynamically uniform integer
-    expressions in shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC must: be indexed only by
-    constant integral expressions when aggregated into arrays in shader
-    code.
-    This also specifies whether shader modules can: declare the
-    code:StorageBufferArrayDynamicIndexing capability.
-  * [[features-shaderStorageImageArrayDynamicIndexing]]
-    pname:shaderStorageImageArrayDynamicIndexing specifies whether arrays of
-    storage images can: be indexed by dynamically uniform integer
-    expressions in shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE must: be indexed only by constant
-    integral expressions when aggregated into arrays in shader code.
-    This also specifies whether shader modules can: declare the
-    code:StorageImageArrayDynamicIndexing capability.
-  * [[features-shaderClipDistance]] pname:shaderClipDistance specifies
-    whether clip distances are supported in shader code.
-    If this feature is not enabled, any members decorated with the
-    code:ClipDistance built-in decoration must: not be read from or written
-    to in shader modules.
-    This also specifies whether shader modules can: declare the
-    code:ClipDistance capability.
-  * [[features-shaderCullDistance]] pname:shaderCullDistance specifies
-    whether cull distances are supported in shader code.
-    If this feature is not enabled, any members decorated with the
-    code:CullDistance built-in decoration must: not be read from or written
-    to in shader modules.
-    This also specifies whether shader modules can: declare the
-    code:CullDistance capability.
-  * [[features-shaderFloat64]] pname:shaderFloat64 specifies whether 64-bit
-    floats (doubles) are supported in shader code.
-    If this feature is not enabled, 64-bit floating-point types must: not be
-    used in shader code.
-    This also specifies whether shader modules can: declare the code:Float64
-    capability.
-    Declaring and using 64-bit floats is enabled for all storage classes
-    that SPIR-V allows with the code:Float64 capability.
-  * [[features-shaderInt64]] pname:shaderInt64 specifies whether 64-bit
-    integers (signed and unsigned) are supported in shader code.
-    If this feature is not enabled, 64-bit integer types must: not be used
-    in shader code.
-    This also specifies whether shader modules can: declare the code:Int64
-    capability.
-    Declaring and using 64-bit integers is enabled for all storage classes
-    that SPIR-V allows with the code:Int64 capability.
-  * [[features-shaderInt16]] pname:shaderInt16 specifies whether 16-bit
-    integers (signed and unsigned) are supported in shader code.
-    If this feature is not enabled, 16-bit integer types must: not be used
-    in shader code.
-    This also specifies whether shader modules can: declare the code:Int16
-    capability.
-    However, this only enables a subset of the storage classes that SPIR-V
-    allows for the code:Int16 SPIR-V capability: Declaring and using 16-bit
-    integers in the code:Private,
-ifndef::VK_KHR_workgroup_memory_explicit_layout[]
-    code:Workgroup,
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-ifdef::VK_KHR_workgroup_memory_explicit_layout[]
-    code:Workgroup (for non-Block variables),
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-    and code:Function storage classes is enabled, while declaring them in
-    the interface storage classes (e.g., code:UniformConstant, code:Uniform,
-    code:StorageBuffer, code:Input, code:Output, and code:PushConstant) is
-    not enabled.
-  * [[features-shaderResourceResidency]] pname:shaderResourceResidency
-    specifies whether image operations that return resource residency
-    information are supported in shader code.
-    If this feature is not enabled, the code:OpImageSparse* instructions
-    must: not be used in shader code.
-    This also specifies whether shader modules can: declare the
-    code:SparseResidency capability.
-    The feature requires at least one of the ptext:sparseResidency* features
-    to be supported.
-  * [[features-shaderResourceMinLod]] pname:shaderResourceMinLod specifies
-    whether image operations specifying the minimum resource LOD are
-    supported in shader code.
-    If this feature is not enabled, the code:MinLod image operand must: not
-    be used in shader code.
-    This also specifies whether shader modules can: declare the code:MinLod
-    capability.
-  * [[features-sparseBinding]] pname:sparseBinding specifies whether
-    resource memory can: be managed at opaque sparse block level instead of
-    at the object level.
-    If this feature is not enabled, resource memory must: be bound only on a
-    per-object basis using the fname:vkBindBufferMemory and
-    fname:vkBindImageMemory commands.
-    In this case, buffers and images must: not be created with
-    ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT and
-    ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT set in the pname:flags member
-    of the slink:VkBufferCreateInfo and slink:VkImageCreateInfo structures,
-    respectively.
-    Otherwise resource memory can: be managed as described in
-    <<sparsememory-sparseresourcefeatures,Sparse Resource Features>>.
-  * [[features-sparseResidencyBuffer]] pname:sparseResidencyBuffer specifies
-    whether the device can: access partially resident buffers.
-    If this feature is not enabled, buffers must: not be created with
-    ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT set in the pname:flags
-    member of the slink:VkBufferCreateInfo structure.
-  * [[features-sparseResidencyImage2D]] pname:sparseResidencyImage2D
-    specifies whether the device can: access partially resident 2D images
-    with 1 sample per pixel.
-    If this feature is not enabled, images with an pname:imageType of
-    ename:VK_IMAGE_TYPE_2D and pname:samples set to
-    ename:VK_SAMPLE_COUNT_1_BIT must: not be created with
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT set in the pname:flags member
-    of the slink:VkImageCreateInfo structure.
-  * [[features-sparseResidencyImage3D]] pname:sparseResidencyImage3D
-    specifies whether the device can: access partially resident 3D images.
-    If this feature is not enabled, images with an pname:imageType of
-    ename:VK_IMAGE_TYPE_3D must: not be created with
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT set in the pname:flags member
-    of the slink:VkImageCreateInfo structure.
-  * [[features-sparseResidency2Samples]] pname:sparseResidency2Samples
-    specifies whether the physical device can: access partially resident 2D
-    images with 2 samples per pixel.
-    If this feature is not enabled, images with an pname:imageType of
-    ename:VK_IMAGE_TYPE_2D and pname:samples set to
-    ename:VK_SAMPLE_COUNT_2_BIT must: not be created with
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT set in the pname:flags member
-    of the slink:VkImageCreateInfo structure.
-  * [[features-sparseResidency4Samples]] pname:sparseResidency4Samples
-    specifies whether the physical device can: access partially resident 2D
-    images with 4 samples per pixel.
-    If this feature is not enabled, images with an pname:imageType of
-    ename:VK_IMAGE_TYPE_2D and pname:samples set to
-    ename:VK_SAMPLE_COUNT_4_BIT must: not be created with
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT set in the pname:flags member
-    of the slink:VkImageCreateInfo structure.
-  * [[features-sparseResidency8Samples]] pname:sparseResidency8Samples
-    specifies whether the physical device can: access partially resident 2D
-    images with 8 samples per pixel.
-    If this feature is not enabled, images with an pname:imageType of
-    ename:VK_IMAGE_TYPE_2D and pname:samples set to
-    ename:VK_SAMPLE_COUNT_8_BIT must: not be created with
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT set in the pname:flags member
-    of the slink:VkImageCreateInfo structure.
-  * [[features-sparseResidency16Samples]] pname:sparseResidency16Samples
-    specifies whether the physical device can: access partially resident 2D
-    images with 16 samples per pixel.
-    If this feature is not enabled, images with an pname:imageType of
-    ename:VK_IMAGE_TYPE_2D and pname:samples set to
-    ename:VK_SAMPLE_COUNT_16_BIT must: not be created with
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT set in the pname:flags member
-    of the slink:VkImageCreateInfo structure.
-  * [[features-sparseResidencyAliased]] pname:sparseResidencyAliased
-    specifies whether the physical device can: correctly access data aliased
-    into multiple locations.
-    If this feature is not enabled, the
-    ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT and
-    ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT enum values must: not be used
-    in pname:flags members of the slink:VkBufferCreateInfo and
-    slink:VkImageCreateInfo structures, respectively.
-  * [[features-variableMultisampleRate]] pname:variableMultisampleRate
-    specifies whether all pipelines that will be bound to a command buffer
-    during a <<renderpass-noattachments, subpass which uses no attachments>>
-    must: have the same value for
-    slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples.
-    If set to ename:VK_TRUE, the implementation supports variable
-    multisample rates in a subpass which uses no attachments.
-    If set to ename:VK_FALSE, then all pipelines bound in such a subpass
-    must: have the same multisample rate.
-    This has no effect in situations where a subpass uses any attachments.
-  * [[features-inheritedQueries]] pname:inheritedQueries specifies whether a
-    secondary command buffer may: be executed while a query is active.
-
-include::{generated}/validity/structs/VkPhysicalDeviceFeatures.txt[]
---
-
-ifdef::VK_VERSION_1_2[]
-[open,refpage='VkPhysicalDeviceVulkan11Features',desc='Structure describing the Vulkan 1.1 features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceVulkan11Features structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceVulkan11Features.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-:anchor-prefix:
-include::{chapters}/features.txt[tag=VK_KHR_16bit_storage-features]
-include::{chapters}/features.txt[tag=VK_KHR_multiview-features]
-include::{chapters}/features.txt[tag=VK_KHR_variable_pointers-features]
-include::{chapters}/features.txt[tag=VK_KHR_protected_memory-features]
-include::{chapters}/features.txt[tag=VK_KHR_sampler_ycbcr_conversion-features]
-include::{chapters}/features.txt[tag=VK_KHR_shader_draw_parameters-features]
-
-:refpage: VkPhysicalDeviceVulkan11Features
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceVulkan11Features.txt[]
---
-
-[open,refpage='VkPhysicalDeviceVulkan12Features',desc='Structure describing the Vulkan 1.2 features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceVulkan12Features structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceVulkan12Features.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-:anchor-prefix:
-  * [[features-samplerMirrorClampToEdge]] pname:samplerMirrorClampToEdge
-    indicates whether the implementation supports the
-    ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE sampler address mode.
-    If this feature is not enabled, the
-    ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE sampler address mode
-    must: not be used.
-  * [[features-drawIndirectCount]] pname:drawIndirectCount indicates whether
-    the implementation supports the flink:vkCmdDrawIndirectCount and
-    flink:vkCmdDrawIndexedIndirectCount functions.
-    If this feature is not enabled, these functions must: not be used.
-include::{chapters}/features.txt[tag=VK_KHR_8bit_storage-features]
-include::{chapters}/features.txt[tag=VK_KHR_shader_atomic_int64-features]
-include::{chapters}/features.txt[tag=VK_KHR_shader_float16_int8-features]
-  * [[features-descriptorIndexing]] pname:descriptorIndexing indicates
-    whether the implementation supports the minimum set of descriptor
-    indexing features as described in the <<features-requirements,Feature
-    Requirements>> section.
-    Enabling the pname:descriptorIndexing member when flink:vkCreateDevice
-    is called does not imply the other minimum descriptor indexing features
-    are also enabled.
-    Those other descriptor indexing features must: be enabled individually
-    as needed by the application.
-include::{chapters}/features.txt[tag=VK_EXT_descriptor_indexing-features]
-  * [[features-samplerFilterMinmax]] pname:samplerFilterMinmax indicates
-    whether the implementation supports a minimum set of required formats
-    supporting min/max filtering as defined by the
-    <<limits-filterMinmaxSingleComponentFormats-minimum-requirements,pname:filterMinmaxSingleComponentFormats>>
-    property minimum requirements.
-    If this feature is not enabled, then no slink:VkSamplerCreateInfo
-    pname:pNext chain can include a slink:VkSamplerReductionModeCreateInfo
-    structure.
-include::{chapters}/features.txt[tag=VK_EXT_scalar_block_layout-features]
-include::{chapters}/features.txt[tag=VK_KHR_imageless_framebuffer-features]
-include::{chapters}/features.txt[tag=VK_KHR_uniform_buffer_standard_layout-features]
-include::{chapters}/features.txt[tag=VK_KHR_shader_subgroup_extended_types-features]
-include::{chapters}/features.txt[tag=VK_KHR_separate_depth_stencil_layouts-features]
-include::{chapters}/features.txt[tag=VK_EXT_host_query_reset-features]
-include::{chapters}/features.txt[tag=VK_KHR_timeline_semaphore-features]
-include::{chapters}/features.txt[tag=VK_EXT_buffer_device_address-features]
-include::{chapters}/features.txt[tag=VK_KHR_vulkan_memory_model-features]
-  * [[features-shaderOutputViewportIndex]] pname:shaderOutputViewportIndex
-    indicates whether the implementation supports the
-    code:ShaderViewportIndex SPIR-V capability enabling variables decorated
-    with the code:ViewportIndex built-in to be exported from vertex or
-    tessellation evaluation shaders.
-    If this feature is not enabled, the code:ViewportIndex built-in
-    decoration must: not be used on outputs in vertex or tessellation
-    evaluation shaders.
-  * [[features-shaderOutputLayer]] pname:shaderOutputLayer indicates whether
-    the implementation supports the code:ShaderLayer SPIR-V capability
-    enabling variables decorated with the code:Layer built-in to be exported
-    from vertex or tessellation evaluation shaders.
-    If this feature is not enabled, the code:Layer built-in decoration must:
-    not be used on outputs in vertex or tessellation evaluation shaders.
-  * [[features-subgroupBroadcastDynamicId]] If
-    pname:subgroupBroadcastDynamicId is ename:VK_TRUE, the "`Id`" operand of
-    code:OpGroupNonUniformBroadcast can: be dynamically uniform within a
-    subgroup, and the "`Index`" operand of
-    code:OpGroupNonUniformQuadBroadcast can: be dynamically uniform within
-    the derivative group.
-    If it is ename:VK_FALSE, these operands must: be constants.
-
-:refpage: VkPhysicalDeviceVulkan12Features
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceVulkan12Features.txt[]
---
-endif::VK_VERSION_1_2[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_variable_pointers[]
-[open,refpage='VkPhysicalDeviceVariablePointersFeatures',desc='Structure describing variable pointers features that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceVariablePointerFeatures VkPhysicalDeviceVariablePointersFeaturesKHR VkPhysicalDeviceVariablePointerFeaturesKHR']
---
-The sname:VkPhysicalDeviceVariablePointersFeatures structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceVariablePointersFeatures.txt[]
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/structs/VkPhysicalDeviceVariablePointerFeatures.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_KHR_variable_pointers[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceVariablePointersFeaturesKHR.txt[]
-
-include::{generated}/api/structs/VkPhysicalDeviceVariablePointerFeaturesKHR.txt[]
-endif::VK_KHR_variable_pointers[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_variable_pointers-features[]
-  * [[{anchor-prefix}features-variablePointersStorageBuffer]]
-    pname:variablePointersStorageBuffer specifies whether the implementation
-    supports the SPIR-V code:VariablePointersStorageBuffer capability.
-    When this feature is not enabled, shader modules must: not declare the
-    `SPV_KHR_variable_pointers` extension or the
-    code:VariablePointersStorageBuffer capability.
-  * [[{anchor-prefix}features-variablePointers]] pname:variablePointers
-    specifies whether the implementation supports the SPIR-V
-    code:VariablePointers capability.
-    When this feature is not enabled, shader modules must: not declare the
-    code:VariablePointers capability.
-// end::VK_KHR_variable_pointers-features[]
-
-:refpage: VkPhysicalDeviceVariablePointersFeatures
-include::{chapters}/features.txt[tag=features]
-
-.Valid Usage
-****
-  * [[VUID-VkPhysicalDeviceVariablePointersFeatures-variablePointers-01431]]
-    If pname:variablePointers is enabled then
-    pname:variablePointersStorageBuffer must: also be enabled
-****
-
-include::{generated}/validity/structs/VkPhysicalDeviceVariablePointersFeatures.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_variable_pointers[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-[open,refpage='VkPhysicalDeviceMultiviewFeatures',desc='Structure describing multiview features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceMultiviewFeatures structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMultiviewFeatures.txt[]
-
-ifdef::VK_KHR_multiview[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceMultiviewFeaturesKHR.txt[]
-endif::VK_KHR_multiview[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_multiview-features[]
-  * [[{anchor-prefix}features-multiview]] pname:multiview specifies whether
-    the implementation supports multiview rendering within a render pass.
-    If this feature is not enabled, the view mask of each subpass must:
-    always be zero.
-  * [[{anchor-prefix}features-multiview-gs]] pname:multiviewGeometryShader
-    specifies whether the implementation supports multiview rendering within
-    a render pass, with <<geometry,geometry shaders>>.
-    If this feature is not enabled, then a pipeline compiled against a
-    subpass with a non-zero view mask must: not include a geometry shader.
-  * [[{anchor-prefix}features-multiview-tess]]
-    pname:multiviewTessellationShader specifies whether the implementation
-    supports multiview rendering within a render pass, with
-    <<tessellation,tessellation shaders>>.
-    If this feature is not enabled, then a pipeline compiled against a
-    subpass with a non-zero view mask must: not include any tessellation
-    shaders.
-// end::VK_KHR_multiview-features[]
-
-:refpage: VkPhysicalDeviceMultiviewFeatures
-include::{chapters}/features.txt[tag=features]
-
-.Valid Usage
-****
-  * [[VUID-VkPhysicalDeviceMultiviewFeatures-multiviewGeometryShader-00580]]
-    If pname:multiviewGeometryShader is enabled then pname:multiview must:
-    also be enabled
-  * [[VUID-VkPhysicalDeviceMultiviewFeatures-multiviewTessellationShader-00581]]
-    If pname:multiviewTessellationShader is enabled then pname:multiview
-    must: also be enabled
-****
-
-include::{generated}/validity/structs/VkPhysicalDeviceMultiviewFeatures.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-ifdef::VK_EXT_shader_atomic_float[]
-[open,refpage='VkPhysicalDeviceShaderAtomicFloatFeaturesEXT',desc='Structure describing features supported by VK_EXT_shader_atomic_float',type='structs']
---
-The slink:VkPhysicalDeviceShaderAtomicFloatFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderAtomicFloatFeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// tag::VK_EXT_shader_atomic_float-features[]
-  * [[features-shaderBufferFloat32Atomics]] pname:shaderBufferFloat32Atomics
-    indicates whether shaders can: perform 32-bit floating-point load, store
-    and exchange atomic operations on storage buffers.
-  * [[features-shaderBufferFloat32AtomicAdd]]
-    pname:shaderBufferFloat32AtomicAdd indicates whether shaders can:
-    perform 32-bit floating-point add atomic operations on storage buffers.
-  * [[features-shaderBufferFloat64Atomics]] pname:shaderBufferFloat64Atomics
-    indicates whether shaders can: perform 64-bit floating-point load, store
-    and exchange atomic operations on storage buffers.
-  * [[features-shaderBufferFloat64AtomicAdd]]
-    pname:shaderBufferFloat64AtomicAdd indicates whether shaders can:
-    perform 64-bit floating-point add atomic operations on storage buffers.
-  * [[features-shaderSharedFloat32Atomics]] pname:shaderSharedFloat32Atomics
-    indicates whether shaders can: perform 32-bit floating-point load, store
-    and exchange atomic operations on shared memory.
-  * [[features-shaderSharedFloat32AtomicAdd]]
-    pname:shaderSharedFloat32AtomicAdd indicates whether shaders can:
-    perform 32-bit floating-point add atomic operations on shared memory.
-  * [[features-shaderSharedFloat64Atomics]] pname:shaderSharedFloat64Atomics
-    indicates whether shaders can: perform 64-bit floating-point load, store
-    and exchange atomic operations on shared memory.
-  * [[features-shaderSharedFloat64AtomicAdd]]
-    pname:shaderSharedFloat64AtomicAdd indicates whether shaders can:
-    perform 64-bit floating-point add atomic operations on shared memory.
-  * [[features-shaderImageFloat32Atomics]] pname:shaderImageFloat32Atomics
-    indicates whether shaders can: perform 32-bit floating-point load, store
-    and exchange atomic image operations.
-  * [[features-shaderImageFloat32AtomicAdd]]
-    pname:shaderImageFloat32AtomicAdd indicates whether shaders can: perform
-    32-bit floating-point add atomic image operations.
-  * [[features-sparseImageFloat32Atomics]] pname:sparseImageFloat32Atomics
-    indicates whether 32-bit floating-point load, store and exchange atomic
-    operations can: be used on sparse images.
-  * [[features-sparseImageFloat32AtomicAdd]]
-    pname:sparseImageFloat32AtomicAdd indicates whether 32-bit
-    floating-point add atomic operations can: be used on sparse images.
-// end::VK_EXT_shader_atomic_float-features[]
-
-:refpage: VkPhysicalDeviceShaderAtomicFloatFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderAtomicFloatFeaturesEXT.txt[]
---
-endif::VK_EXT_shader_atomic_float[]
-
-ifdef::VK_EXT_shader_atomic_float2[]
-[open,refpage='VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT',desc='Structure describing features supported by VK_EXT_shader_atomic_float2',type='structs']
---
-The slink:VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// tag::VK_EXT_shader_atomic_float2-features[]
-  * [[features-shaderBufferFloat16Atomics]] pname:shaderBufferFloat16Atomics
-    indicates whether shaders can: perform 16-bit floating-point load,
-    store, and exchange atomic operations on storage buffers.
-  * [[features-shaderBufferFloat16AtomicAdd]]
-    pname:shaderBufferFloat16AtomicAdd indicates whether shaders can:
-    perform 16-bit floating-point add atomic operations on storage buffers.
-  * [[features-shaderBufferFloat16AtomicMinMax]]
-    pname:shaderBufferFloat16AtomicMinMax indicates whether shaders can:
-    perform 16-bit floating-point min and max atomic operations on storage
-    buffers.
-  * [[features-shaderBufferFloat32AtomicMinMax]]
-    pname:shaderBufferFloat32AtomicMinMax indicates whether shaders can:
-    perform 32-bit floating-point min and max atomic operations on storage
-    buffers.
-  * [[features-shaderBufferFloat64AtomicMinMax]]
-    pname:shaderBufferFloat64AtomicMinMax indicates whether shaders can:
-    perform 64-bit floating-point min and max atomic operations on storage
-    buffers.
-  * [[features-shaderSharedFloat16Atomics]] pname:shaderSharedFloat16Atomics
-    indicates whether shaders can: perform 16-bit floating-point load, store
-    and exchange atomic operations on shared memory.
-  * [[features-shaderSharedFloat16AtomicAdd]]
-    pname:shaderSharedFloat16AtomicAdd indicates whether shaders can:
-    perform 16-bit floating-point add atomic operations on shared memory.
-  * [[features-shaderSharedFloat16AtomicMinMax]]
-    pname:shaderSharedFloat16AtomicMinMax indicates whether shaders can:
-    perform 16-bit floating-point min and max atomic operations on shared
-    memory.
-  * [[features-shaderSharedFloat32AtomicMinMax]]
-    pname:shaderSharedFloat32AtomicMinMax indicates whether shaders can:
-    perform 32-bit floating-point min and max atomic operations on shared
-    memory.
-  * [[features-shaderSharedFloat64AtomicMinMax]]
-    pname:shaderSharedFloat64AtomicMinMax indicates whether shaders can:
-    perform 64-bit floating-point min and max atomic operations on shared
-    memory.
-  * [[features-shaderImageFloat32AtomicMinMax]]
-    pname:shaderImageFloat32AtomicMinMax indicates whether shaders can:
-    perform 32-bit floating-point min and max atomic image operations.
-  * [[features-sparseImageFloat32AtomicMinMax]]
-    pname:sparseImageFloat32AtomicMinMax indicates whether 32-bit
-    floating-point min and max atomic operations can: be used on sparse
-    images.
-// end::VK_EXT_shader_atomic_float2-features[]
-
-:refpage: VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT.txt[]
---
-endif::VK_EXT_shader_atomic_float2[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_shader_atomic_int64[]
-[open,refpage='VkPhysicalDeviceShaderAtomicInt64Features',desc='Structure describing features supported by VK_KHR_shader_atomic_int64',type='structs',alias='VkPhysicalDeviceShaderAtomicInt64FeaturesKHR']
---
-The slink:VkPhysicalDeviceShaderAtomicInt64Features structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderAtomicInt64Features.txt[]
-
-ifdef::VK_KHR_shader_atomic_int64[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderAtomicInt64FeaturesKHR.txt[]
-endif::VK_KHR_shader_atomic_int64[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_shader_atomic_int64-features[]
-  * [[{anchor-prefix}features-shaderBufferInt64Atomics]]
-    pname:shaderBufferInt64Atomics indicates whether shaders can: perform
-    64-bit unsigned and signed integer atomic operations on buffers.
-  * [[{anchor-prefix}features-shaderSharedInt64Atomics]]
-    pname:shaderSharedInt64Atomics indicates whether shaders can: perform
-    64-bit unsigned and signed integer atomic operations on shared memory.
-// end::VK_KHR_shader_atomic_int64-features[]
-
-:refpage: VkPhysicalDeviceShaderAtomicInt64Features
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderAtomicInt64Features.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_shader_atomic_int64[]
-
-ifdef::VK_EXT_shader_image_atomic_int64[]
-[open,refpage='VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT',desc='Structure describing features supported by VK_EXT_shader_image_atomic_int64',type='structs']
---
-The slink:VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-shaderImageInt64Atomics]] pname:shaderImageInt64Atomics
-    indicates whether shaders can: support 64-bit unsigned and signed
-    integer atomic operations on images.
-  * [[features-sparseImageInt64Atomics]] pname:sparseImageInt64Atomics
-    indicates whether 64-bit integer atomics can: be used on sparse images.
-
-:refpage: VkPhysicalDeviceShaderAtomicInt64FeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT.txt[]
---
-endif::VK_EXT_shader_image_atomic_int64[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_8bit_storage[]
-[open,refpage='VkPhysicalDevice8BitStorageFeatures',desc='Structure describing features supported by VK_KHR_8bit_storage',type='structs',alias='VkPhysicalDevice8BitStorageFeaturesKHR']
---
-The slink:VkPhysicalDevice8BitStorageFeatures structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDevice8BitStorageFeatures.txt[]
-
-ifdef::VK_KHR_8bit_storage[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDevice8BitStorageFeaturesKHR.txt[]
-endif::VK_KHR_8bit_storage[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_8bit_storage-features[]
-  * [[{anchor-prefix}features-storageBuffer8BitAccess]]
-    pname:storageBuffer8BitAccess indicates whether objects in the
-    code:StorageBuffer,
-ifdef::VK_KHR_ray_tracing_pipeline[code:ShaderRecordBufferKHR,]
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-    or code:PhysicalStorageBuffer
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-    storage class with the code:Block decoration can: have 8-bit integer
-    members.
-    If this feature is not enabled, 8-bit integer members must: not be used
-    in such objects.
-    This also indicates whether shader modules can: declare the
-    code:StorageBuffer8BitAccess capability.
-  * [[{anchor-prefix}features-uniformAndStorageBuffer8BitAccess]]
-    pname:uniformAndStorageBuffer8BitAccess indicates whether objects in the
-    code:Uniform storage class with the code:Block decoration can: have
-    8-bit integer members.
-    If this feature is not enabled, 8-bit integer members must: not be used
-    in such objects.
-    This also indicates whether shader modules can: declare the
-    code:UniformAndStorageBuffer8BitAccess capability.
-  * [[{anchor-prefix}features-storagePushConstant8]]
-    pname:storagePushConstant8 indicates whether objects in the
-    code:PushConstant storage class can: have 8-bit integer members.
-    If this feature is not enabled, 8-bit integer members must: not be used
-    in such objects.
-    This also indicates whether shader modules can: declare the
-    code:StoragePushConstant8 capability.
-// end::VK_KHR_8bit_storage-features[]
-
-:refpage: VkPhysicalDevice8BitStorageFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDevice8BitStorageFeatures.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_8bit_storage[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-[open,refpage='VkPhysicalDevice16BitStorageFeatures',desc='Structure describing features supported by VK_KHR_16bit_storage',type='structs']
---
-The slink:VkPhysicalDevice16BitStorageFeatures structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDevice16BitStorageFeatures.txt[]
-
-ifdef::VK_KHR_16bit_storage[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDevice16BitStorageFeaturesKHR.txt[]
-endif::VK_KHR_16bit_storage[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_16bit_storage-features[]
-  * [[{anchor-prefix}features-storageBuffer16BitAccess]]
-    pname:storageBuffer16BitAccess specifies whether objects in the
-    code:StorageBuffer,
-ifdef::VK_KHR_ray_tracing_pipeline[code:ShaderRecordBufferKHR,]
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-    or code:PhysicalStorageBuffer
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-    storage class with the code:Block decoration can: have 16-bit integer
-    and 16-bit floating-point members.
-    If this feature is not enabled, 16-bit integer or 16-bit floating-point
-    members must: not be used in such objects.
-    This also specifies whether shader modules can: declare the
-    code:StorageBuffer16BitAccess capability.
-  * [[{anchor-prefix}features-uniformAndStorageBuffer16BitAccess]]
-    pname:uniformAndStorageBuffer16BitAccess specifies whether objects in
-    the code:Uniform storage class with the code:Block decoration can: have
-    16-bit integer and 16-bit floating-point members.
-    If this feature is not enabled, 16-bit integer or 16-bit floating-point
-    members must: not be used in such objects.
-    This also specifies whether shader modules can: declare the
-    code:UniformAndStorageBuffer16BitAccess capability.
-  * [[{anchor-prefix}features-storagePushConstant16]]
-    pname:storagePushConstant16 specifies whether objects in the
-    code:PushConstant storage class can: have 16-bit integer and 16-bit
-    floating-point members.
-    If this feature is not enabled, 16-bit integer or floating-point members
-    must: not be used in such objects.
-    This also specifies whether shader modules can: declare the
-    code:StoragePushConstant16 capability.
-  * [[{anchor-prefix}features-storageInputOutput16]]
-    pname:storageInputOutput16 specifies whether objects in the code:Input
-    and code:Output storage classes can: have 16-bit integer and 16-bit
-    floating-point members.
-    If this feature is not enabled, 16-bit integer or 16-bit floating-point
-    members must: not be used in such objects.
-    This also specifies whether shader modules can: declare the
-    code:StorageInputOutput16 capability.
-// end::VK_KHR_16bit_storage-features[]
-
-:refpage: VkPhysicalDevice16BitStorageFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDevice16BitStorageFeatures.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_shader_float16_int8[]
-[open,refpage='VkPhysicalDeviceShaderFloat16Int8Features',desc='Structure describing features supported by VK_KHR_shader_float16_int8',type='structs',alias='VkPhysicalDeviceShaderFloat16Int8FeaturesKHR VkPhysicalDeviceFloat16Int8FeaturesKHR']
---
-The sname:VkPhysicalDeviceShaderFloat16Int8Features structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderFloat16Int8Features.txt[]
-
-ifdef::VK_KHR_shader_float16_int8[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderFloat16Int8FeaturesKHR.txt[]
-
-include::{generated}/api/structs/VkPhysicalDeviceFloat16Int8FeaturesKHR.txt[]
-endif::VK_KHR_shader_float16_int8[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_shader_float16_int8-features[]
-  * [[{anchor-prefix}features-shaderFloat16]] pname:shaderFloat16 indicates
-    whether 16-bit floats (halfs) are supported in shader code.
-    This also indicates whether shader modules can: declare the code:Float16
-    capability.
-    However, this only enables a subset of the storage classes that SPIR-V
-    allows for the code:Float16 SPIR-V capability: Declaring and using
-    16-bit floats in the code:Private,
-ifndef::VK_KHR_workgroup_memory_explicit_layout[]
-    code:Workgroup,
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-ifdef::VK_KHR_workgroup_memory_explicit_layout[]
-    code:Workgroup (for non-Block variables),
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-    and code:Function storage classes is enabled, while declaring them in
-    the interface storage classes (e.g., code:UniformConstant, code:Uniform,
-    code:StorageBuffer, code:Input, code:Output, and code:PushConstant) is
-    not enabled.
-  * [[{anchor-prefix}features-shaderInt8]] pname:shaderInt8 indicates
-    whether 8-bit integers (signed and unsigned) are supported in shader
-    code.
-    This also indicates whether shader modules can: declare the code:Int8
-    capability.
-    However, this only enables a subset of the storage classes that SPIR-V
-    allows for the code:Int8 SPIR-V capability: Declaring and using 8-bit
-    integers in the code:Private,
-ifndef::VK_KHR_workgroup_memory_explicit_layout[]
-    code:Workgroup,
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-ifdef::VK_KHR_workgroup_memory_explicit_layout[]
-    code:Workgroup (for non-Block variables),
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-    and code:Function storage classes is enabled, while declaring them in
-    the interface storage classes (e.g., code:UniformConstant, code:Uniform,
-    code:StorageBuffer, code:Input, code:Output, and code:PushConstant) is
-    not enabled.
-// end::VK_KHR_shader_float16_int8-features[]
-
-:refpage: VkPhysicalDeviceShaderFloat16Int8Features
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderFloat16Int8Features.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_shader_float16_int8[]
-
-ifdef::VK_KHR_shader_clock[]
-[open,refpage='VkPhysicalDeviceShaderClockFeaturesKHR',desc='Structure describing features supported by VK_KHR_shader_clock',type='structs']
---
-The slink:VkPhysicalDeviceShaderClockFeaturesKHR structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderClockFeaturesKHR.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-shaderSubgroupClock]] pname:shaderSubgroupClock indicates
-    whether shaders can: perform code:Subgroup scoped clock reads.
-  * [[features-shaderDeviceClock]] pname:shaderDeviceClock indicates whether
-    shaders can: perform code:Device scoped clock reads.
-
-:refpage: VkPhysicalDeviceShaderClockFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderClockFeaturesKHR.txt[]
---
-endif::VK_KHR_shader_clock[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-[open,refpage='VkPhysicalDeviceSamplerYcbcrConversionFeatures',desc='Structure describing {YCbCr} conversion features that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR']
---
-The sname:VkPhysicalDeviceSamplerYcbcrConversionFeatures structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceSamplerYcbcrConversionFeatures.txt[]
-
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR.txt[]
-endif::VK_KHR_sampler_ycbcr_conversion[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_sampler_ycbcr_conversion-features[]
-  * [[{anchor-prefix}features-samplerYcbcrConversion]]
-    pname:samplerYcbcrConversion specifies whether the implementation
-    supports <<samplers-YCbCr-conversion,sampler {YCbCr} conversion>>.
-    If pname:samplerYcbcrConversion is ename:VK_FALSE, sampler {YCbCr}
-    conversion is not supported, and samplers using sampler {YCbCr}
-    conversion must: not be used.
-// end::VK_KHR_sampler_ycbcr_conversion-features[]
-
-:refpage: VkPhysicalDeviceSamplerYcbcrConversionFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceSamplerYcbcrConversionFeatures.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-ifdef::VK_VERSION_1_1[]
-[open,refpage='VkPhysicalDeviceProtectedMemoryFeatures',desc='Structure describing protected memory features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceProtectedMemoryFeatures structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceProtectedMemoryFeatures.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_protected_memory-features[]
-  * [[{anchor-prefix}features-protectedMemory]] pname:protectedMemory
-    specifies whether protected memory is supported.
-// end::VK_KHR_protected_memory-features[]
-
-:refpage: VkPhysicalDeviceProtectedMemoryFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceProtectedMemoryFeatures.txt[]
---
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_EXT_blend_operation_advanced[]
-[open,refpage='VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT',desc='Structure describing advanced blending features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-advancedBlendCoherentOperations]]
-    pname:advancedBlendCoherentOperations specifies whether blending using
-    <<framebuffer-blend-advanced,advanced blend operations>> is guaranteed
-    to execute atomically and in <<drawing-primitive-order, primitive
-    order>>.
-    If this is ename:VK_TRUE,
-    ename:VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT is treated the
-    same as ename:VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, and advanced blending
-    needs no additional synchronization over basic blending.
-    If this is ename:VK_FALSE, then memory dependencies are required to
-    guarantee order between two advanced blending operations that occur on
-    the same sample.
-
-:refpage: VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT.txt[]
---
-endif::VK_EXT_blend_operation_advanced[]
-
-ifdef::VK_EXT_conditional_rendering[]
-[open,refpage='VkPhysicalDeviceConditionalRenderingFeaturesEXT',desc='Structure describing if a secondary command buffer can be executed if conditional rendering is active in the primary command buffer',type='structs']
---
-The sname:VkPhysicalDeviceConditionalRenderingFeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceConditionalRenderingFeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-conditionalRendering]] pname:conditionalRendering specifies
-    whether conditional rendering is supported.
-  * [[features-inheritedConditionalRendering]]
-    pname:inheritedConditionalRendering specifies whether a secondary
-    command buffer can: be executed while conditional rendering is active in
-    the primary command buffer.
-
-:refpage: VkPhysicalDeviceConditionalRenderingFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceConditionalRenderingFeaturesEXT.txt[]
---
-endif::VK_EXT_conditional_rendering[]
-
-ifdef::VK_VERSION_1_1[]
-[open,refpage='VkPhysicalDeviceShaderDrawParametersFeatures',desc='Structure describing shader draw parameter features that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceShaderDrawParameterFeatures']
---
-The sname:VkPhysicalDeviceShaderDrawParametersFeatures structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderDrawParametersFeatures.txt[]
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderDrawParameterFeatures.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_shader_draw_parameters-features[]
-  * [[{anchor-prefix}features-shaderDrawParameters]]
-    pname:shaderDrawParameters specifies whether the implementation supports
-    the SPIR-V code:DrawParameters capability.
-    When this feature is not enabled, shader modules must: not declare the
-    `SPV_KHR_shader_draw_parameters` extension or the code:DrawParameters
-    capability.
-// end::VK_KHR_shader_draw_parameters-features[]
-
-:refpage: VkPhysicalDeviceShaderDrawParametersFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderDrawParametersFeatures.txt[]
---
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_NV_mesh_shader[]
-[open,refpage='VkPhysicalDeviceMeshShaderFeaturesNV',desc='Structure describing mesh shading features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceMeshShaderFeaturesNV structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMeshShaderFeaturesNV.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-taskShader]] pname:taskShader indicates whether the task
-    shader stage is supported.
-  * [[features-meshShader]] pname:meshShader indicates whether the mesh
-    shader stage is supported.
-
-:refpage: VkPhysicalDeviceMeshShaderFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceMeshShaderFeaturesNV.txt[]
---
-endif::VK_NV_mesh_shader[]
-
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-[open,refpage='VkPhysicalDeviceDescriptorIndexingFeatures',desc='Structure describing descriptor indexing features that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceDescriptorIndexingFeaturesEXT']
---
-The sname:VkPhysicalDeviceDescriptorIndexingFeatures structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceDescriptorIndexingFeatures.txt[]
-
-ifdef::VK_EXT_descriptor_indexing[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceDescriptorIndexingFeaturesEXT.txt[]
-endif::VK_EXT_descriptor_indexing[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_EXT_descriptor_indexing-features[]
-  * [[{anchor-prefix}features-shaderInputAttachmentArrayDynamicIndexing]]
-    pname:shaderInputAttachmentArrayDynamicIndexing indicates whether arrays
-    of input attachments can: be indexed by dynamically uniform integer
-    expressions in shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT must: be indexed only by
-    constant integral expressions when aggregated into arrays in shader
-    code.
-    This also indicates whether shader modules can: declare the
-    code:InputAttachmentArrayDynamicIndexing capability.
-  * [[{anchor-prefix}features-shaderUniformTexelBufferArrayDynamicIndexing]]
-    pname:shaderUniformTexelBufferArrayDynamicIndexing indicates whether
-    arrays of uniform texel buffers can: be indexed by dynamically uniform
-    integer expressions in shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER must: be indexed only by
-    constant integral expressions when aggregated into arrays in shader
-    code.
-    This also indicates whether shader modules can: declare the
-    code:UniformTexelBufferArrayDynamicIndexing capability.
-  * [[{anchor-prefix}features-shaderStorageTexelBufferArrayDynamicIndexing]]
-    pname:shaderStorageTexelBufferArrayDynamicIndexing indicates whether
-    arrays of storage texel buffers can: be indexed by dynamically uniform
-    integer expressions in shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER must: be indexed only by
-    constant integral expressions when aggregated into arrays in shader
-    code.
-    This also indicates whether shader modules can: declare the
-    code:StorageTexelBufferArrayDynamicIndexing capability.
-  * [[{anchor-prefix}features-shaderUniformBufferArrayNonUniformIndexing]]
-    pname:shaderUniformBufferArrayNonUniformIndexing indicates whether
-    arrays of uniform buffers can: be indexed by non-uniform integer
-    expressions in shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC must: not be indexed by
-    non-uniform integer expressions when aggregated into arrays in shader
-    code.
-    This also indicates whether shader modules can: declare the
-    code:UniformBufferArrayNonUniformIndexing capability.
-  * [[{anchor-prefix}features-shaderSampledImageArrayNonUniformIndexing]]
-    pname:shaderSampledImageArrayNonUniformIndexing indicates whether arrays
-    of samplers or sampled images can: be indexed by non-uniform integer
-    expressions in shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, or
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE must: not be indexed by
-    non-uniform integer expressions when aggregated into arrays in shader
-    code.
-    This also indicates whether shader modules can: declare the
-    code:SampledImageArrayNonUniformIndexing capability.
-  * [[{anchor-prefix}features-shaderStorageBufferArrayNonUniformIndexing]]
-    pname:shaderStorageBufferArrayNonUniformIndexing indicates whether
-    arrays of storage buffers can: be indexed by non-uniform integer
-    expressions in shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC must: not be indexed by
-    non-uniform integer expressions when aggregated into arrays in shader
-    code.
-    This also indicates whether shader modules can: declare the
-    code:StorageBufferArrayNonUniformIndexing capability.
-  * [[{anchor-prefix}features-shaderStorageImageArrayNonUniformIndexing]]
-    pname:shaderStorageImageArrayNonUniformIndexing indicates whether arrays
-    of storage images can: be indexed by non-uniform integer expressions in
-    shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE must: not be indexed by
-    non-uniform integer expressions when aggregated into arrays in shader
-    code.
-    This also indicates whether shader modules can: declare the
-    code:StorageImageArrayNonUniformIndexing capability.
-  * [[{anchor-prefix}features-shaderInputAttachmentArrayNonUniformIndexing]]
-    pname:shaderInputAttachmentArrayNonUniformIndexing indicates whether
-    arrays of input attachments can: be indexed by non-uniform integer
-    expressions in shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT must: not be indexed by
-    non-uniform integer expressions when aggregated into arrays in shader
-    code.
-    This also indicates whether shader modules can: declare the
-    code:InputAttachmentArrayNonUniformIndexing capability.
-  * [[{anchor-prefix}features-shaderUniformTexelBufferArrayNonUniformIndexing]]
-    pname:shaderUniformTexelBufferArrayNonUniformIndexing indicates whether
-    arrays of uniform texel buffers can: be indexed by non-uniform integer
-    expressions in shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER must: not be indexed by
-    non-uniform integer expressions when aggregated into arrays in shader
-    code.
-    This also indicates whether shader modules can: declare the
-    code:UniformTexelBufferArrayNonUniformIndexing capability.
-  * [[{anchor-prefix}features-shaderStorageTexelBufferArrayNonUniformIndexing]]
-    pname:shaderStorageTexelBufferArrayNonUniformIndexing indicates whether
-    arrays of storage texel buffers can: be indexed by non-uniform integer
-    expressions in shader code.
-    If this feature is not enabled, resources with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER must: not be indexed by
-    non-uniform integer expressions when aggregated into arrays in shader
-    code.
-    This also indicates whether shader modules can: declare the
-    code:StorageTexelBufferArrayNonUniformIndexing capability.
-  * [[{anchor-prefix}features-descriptorBindingUniformBufferUpdateAfterBind]]
-    pname:descriptorBindingUniformBufferUpdateAfterBind indicates whether
-    the implementation supports updating uniform buffer descriptors after a
-    set is bound.
-    If this feature is not enabled,
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT must: not be used with
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
-  * [[{anchor-prefix}features-descriptorBindingSampledImageUpdateAfterBind]]
-    pname:descriptorBindingSampledImageUpdateAfterBind indicates whether the
-    implementation supports updating sampled image descriptors after a set
-    is bound.
-    If this feature is not enabled,
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT must: not be used with
-    ename:VK_DESCRIPTOR_TYPE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, or
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
-  * [[{anchor-prefix}features-descriptorBindingStorageImageUpdateAfterBind]]
-    pname:descriptorBindingStorageImageUpdateAfterBind indicates whether the
-    implementation supports updating storage image descriptors after a set
-    is bound.
-    If this feature is not enabled,
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT must: not be used with
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE.
-  * [[{anchor-prefix}features-descriptorBindingStorageBufferUpdateAfterBind]]
-    pname:descriptorBindingStorageBufferUpdateAfterBind indicates whether
-    the implementation supports updating storage buffer descriptors after a
-    set is bound.
-    If this feature is not enabled,
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT must: not be used with
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER.
-  * [[{anchor-prefix}features-descriptorBindingUniformTexelBufferUpdateAfterBind]]
-    pname:descriptorBindingUniformTexelBufferUpdateAfterBind indicates
-    whether the implementation supports updating uniform texel buffer
-    descriptors after a set is bound.
-    If this feature is not enabled,
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT must: not be used with
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER.
-  * [[{anchor-prefix}features-descriptorBindingStorageTexelBufferUpdateAfterBind]]
-    pname:descriptorBindingStorageTexelBufferUpdateAfterBind indicates
-    whether the implementation supports updating storage texel buffer
-    descriptors after a set is bound.
-    If this feature is not enabled,
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT must: not be used with
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
-  * [[{anchor-prefix}features-descriptorBindingUpdateUnusedWhilePending]]
-    pname:descriptorBindingUpdateUnusedWhilePending indicates whether the
-    implementation supports updating descriptors while the set is in use.
-    If this feature is not enabled,
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT must: not be
-    used.
-  * [[{anchor-prefix}features-descriptorBindingPartiallyBound]]
-    pname:descriptorBindingPartiallyBound indicates whether the
-    implementation supports statically using a descriptor set binding in
-    which some descriptors are not valid.
-    If this feature is not enabled,
-    ename:VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT must: not be used.
-  * [[{anchor-prefix}features-descriptorBindingVariableDescriptorCount]]
-    pname:descriptorBindingVariableDescriptorCount indicates whether the
-    implementation supports descriptor sets with a variable-sized last
-    binding.
-    If this feature is not enabled,
-    ename:VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT must: not be
-    used.
-  * [[{anchor-prefix}features-runtimeDescriptorArray]]
-    pname:runtimeDescriptorArray indicates whether the implementation
-    supports the SPIR-V code:RuntimeDescriptorArray capability.
-    If this feature is not enabled, descriptors must: not be declared in
-    runtime arrays.
-// end::VK_EXT_descriptor_indexing-features[]
-
-:refpage: VkPhysicalDeviceDescriptorIndexingFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceDescriptorIndexingFeatures.txt[]
---
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-
-ifdef::VK_EXT_vertex_attribute_divisor[]
-[open,refpage='VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT',desc='Structure describing if fetching of vertex attribute may be repeated for instanced rendering',type='structs']
---
-The sname:VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-vertexAttributeInstanceRateDivisor]]
-    pname:vertexAttributeInstanceRateDivisor specifies whether vertex
-    attribute fetching may be repeated in case of instanced rendering.
-  * [[features-vertexAttributeInstanceRateZeroDivisor]]
-    pname:vertexAttributeInstanceRateZeroDivisor specifies whether a zero
-    value for sname:VkVertexInputBindingDivisorDescriptionEXT::pname:divisor
-    is supported.
-
-:refpage: VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT.txt[]
---
-endif::VK_EXT_vertex_attribute_divisor[]
-
-ifdef::VK_EXT_astc_decode_mode[]
-[open,refpage='VkPhysicalDeviceASTCDecodeFeaturesEXT',desc='Structure describing ASTC decode mode features',type='structs']
---
-The sname:VkPhysicalDeviceASTCDecodeFeaturesEXT structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceASTCDecodeFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-astc-decodeModeSharedExponent]]
-    pname:decodeModeSharedExponent indicates whether the implementation
-    supports decoding ASTC compressed formats to
-    ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 internal precision.
-
-:refpage: VkPhysicalDeviceASTCDecodeFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceASTCDecodeFeaturesEXT.txt[]
---
-endif::VK_EXT_astc_decode_mode[]
-
-ifdef::VK_EXT_transform_feedback[]
-[open,refpage='VkPhysicalDeviceTransformFeedbackFeaturesEXT',desc='Structure describing transform feedback features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceTransformFeedbackFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceTransformFeedbackFeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-transformFeedback]] pname:transformFeedback indicates whether
-    the implementation supports transform feedback and shader modules can:
-    declare the code:TransformFeedback capability.
-  * [[features-geometryStreams]] pname:geometryStreams indicates whether the
-    implementation supports the code:GeometryStreams SPIR-V capability.
-
-:refpage: VkPhysicalDeviceTransformFeedbackFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceTransformFeedbackFeaturesEXT.txt[]
---
-endif::VK_EXT_transform_feedback[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-[open,refpage='VkPhysicalDeviceVulkanMemoryModelFeatures',desc='Structure describing features supported by the memory model',type='structs']
---
-The sname:VkPhysicalDeviceVulkanMemoryModelFeatures structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceVulkanMemoryModelFeatures.txt[]
-
-ifdef::VK_KHR_vulkan_memory_model[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceVulkanMemoryModelFeaturesKHR.txt[]
-endif::VK_KHR_vulkan_memory_model[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_vulkan_memory_model-features[]
-  * [[{anchor-prefix}features-vulkanMemoryModel]] pname:vulkanMemoryModel
-    indicates whether the Vulkan Memory Model is supported, as defined in
-    <<memory-model,Vulkan Memory Model>>.
-    This also indicates whether shader modules can: declare the
-    code:VulkanMemoryModel capability.
-  * [[{anchor-prefix}features-vulkanMemoryModelDeviceScope]]
-    pname:vulkanMemoryModelDeviceScope indicates whether the Vulkan Memory
-    Model can use code:Device scope synchronization.
-    This also indicates whether shader modules can: declare the
-    code:VulkanMemoryModelDeviceScope capability.
-  * [[{anchor-prefix}features-vulkanMemoryModelAvailabilityVisibilityChains]]
-    pname:vulkanMemoryModelAvailabilityVisibilityChains indicates whether
-    the Vulkan Memory Model can use <<memory-model-availability-visibility,
-    availability and visibility chains>> with more than one element.
-// end::VK_KHR_vulkan_memory_model-features[]
-
-:refpage: VkPhysicalDeviceVulkanMemoryModelFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceVulkanMemoryModelFeatures.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-
-ifdef::VK_EXT_inline_uniform_block[]
-[open,refpage='VkPhysicalDeviceInlineUniformBlockFeaturesEXT',desc='Structure describing inline uniform block features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceInlineUniformBlockFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceInlineUniformBlockFeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-inlineUniformBlock]] pname:inlineUniformBlock indicates
-    whether the implementation supports inline uniform block descriptors.
-    If this feature is not enabled,
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT must: not be used.
-  * [[features-descriptorBindingInlineUniformBlockUpdateAfterBind]]
-    pname:descriptorBindingInlineUniformBlockUpdateAfterBind
-ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    is ename:VK_FALSE and reserved for future use.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    indicates whether the implementation supports updating inline uniform
-    block descriptors after a set is bound.
-    If this feature is not enabled,
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT must: not be used with
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-
-:refpage: VkPhysicalDeviceInlineUniformBlockFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceInlineUniformBlockFeaturesEXT.txt[]
---
-endif::VK_EXT_inline_uniform_block[]
-
-ifdef::VK_NV_representative_fragment_test[]
-[open,refpage='VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV',desc='Structure describing the representative fragment test features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-representativeFragmentTest]] pname:representativeFragmentTest
-    indicates whether the implementation supports the representative
-    fragment test.
-    See <<fragops-rep-frag-test, Representative Fragment Test>>.
-
-:refpage: VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV.txt[]
---
-endif::VK_NV_representative_fragment_test[]
-
-ifdef::VK_NV_scissor_exclusive[]
-[open,refpage='VkPhysicalDeviceExclusiveScissorFeaturesNV',desc='Structure describing exclusive scissor features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceExclusiveScissorFeaturesNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceExclusiveScissorFeaturesNV.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-exclusiveScissor]] pname:exclusiveScissor indicates that the
-    implementation supports the exclusive scissor test.
-
-See <<fragops-exclusive-scissor,Exclusive Scissor Test>> for more
-information.
-
-:refpage: VkPhysicalDeviceExclusiveScissorFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceExclusiveScissorFeaturesNV.txt[]
---
-endif::VK_NV_scissor_exclusive[]
-
-ifdef::VK_NV_corner_sampled_image[]
-[open,refpage='VkPhysicalDeviceCornerSampledImageFeaturesNV',desc='Structure describing corner sampled image features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceCornerSampledImageFeaturesNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceCornerSampledImageFeaturesNV.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-cornersampledimage]] pname:cornerSampledImage specifies
-    whether images can be created with a
-    slink:VkImageCreateInfo::pname:flags containing
-    ename:VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV.
-    See <<resources-images-corner-sampled,Corner-Sampled Images>>.
-
-:refpage: VkPhysicalDeviceCornerSampledImageFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceCornerSampledImageFeaturesNV.txt[]
---
-endif::VK_NV_corner_sampled_image[]
-
-ifdef::VK_NV_compute_shader_derivatives[]
-[open,refpage='VkPhysicalDeviceComputeShaderDerivativesFeaturesNV',desc='Structure describing compute shader derivative features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceComputeShaderDerivativesFeaturesNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceComputeShaderDerivativesFeaturesNV.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-computeDerivativeGroupQuads]]
-    pname:computeDerivativeGroupQuads indicates that the implementation
-    supports the code:ComputeDerivativeGroupQuadsNV SPIR-V capability.
-  * [[features-computeDerivativeGroupLinear]]
-    pname:computeDerivativeGroupLinear indicates that the implementation
-    supports the code:ComputeDerivativeGroupLinearNV SPIR-V capability.
-
-See <<shaders-scope-quad, Quad shader scope>> for more information.
-
-:refpage: VkPhysicalDeviceComputeShaderDerivativesFeaturesNVfeatures.
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceComputeShaderDerivativesFeaturesNV.txt[]
---
-endif::VK_NV_compute_shader_derivatives[]
-
-ifdef::VK_NV_fragment_shader_barycentric[]
-[open,refpage='VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV',desc='Structure describing barycentric support in fragment shaders that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-fragmentShaderBarycentric]] pname:fragmentShaderBarycentric
-    indicates that the implementation supports the code:BaryCoordNV and
-    code:BaryCoordNoPerspNV SPIR-V fragment shader built-ins and supports
-    the code:PerVertexNV SPIR-V decoration on fragment shader input
-    variables.
-
-See <<primsrast-barycentric,Barycentric Interpolation>> for more
-information.
-
-:refpage: VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV.txt[]
---
-endif::VK_NV_fragment_shader_barycentric[]
-
-ifdef::VK_NV_shader_image_footprint[]
-[open,refpage='VkPhysicalDeviceShaderImageFootprintFeaturesNV',desc='Structure describing shader image footprint features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceShaderImageFootprintFeaturesNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderImageFootprintFeaturesNV.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-imageFootprint]] pname:imageFootprint specifies whether the
-    implementation supports the code:ImageFootprintNV SPIR-V capability.
-
-See <<textures-footprint,Texel Footprint Evaluation>> for more information.
-
-:refpage: VkPhysicalDeviceShaderImageFootprintFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderImageFootprintFeaturesNV.txt[]
---
-endif::VK_NV_shader_image_footprint[]
-
-ifdef::VK_NV_shading_rate_image[]
-[open,refpage='VkPhysicalDeviceShadingRateImageFeaturesNV',desc='Structure describing shading rate image features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceShadingRateImageFeaturesNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShadingRateImageFeaturesNV.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-shadingRateImage]] pname:shadingRateImage indicates that the
-    implementation supports the use of a shading rate image to derive an
-    effective shading rate for fragment processing.
-    It also indicates that the implementation supports the
-    code:ShadingRateNV SPIR-V execution mode.
-  * [[features-shadingRateCoarseSampleOrder]]
-    pname:shadingRateCoarseSampleOrder indicates that the implementation
-    supports a user-configurable ordering of coverage samples in fragments
-    larger than one pixel.
-
-See <<primsrast-shading-rate-image, Shading Rate Image>> for more
-information.
-
-:refpage: VkPhysicalDeviceShadingRateImageFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShadingRateImageFeaturesNV.txt[]
---
-endif::VK_NV_shading_rate_image[]
-
-ifdef::VK_EXT_fragment_density_map[]
-[open,refpage='VkPhysicalDeviceFragmentDensityMapFeaturesEXT',desc='Structure describing fragment density map features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceFragmentDensityMapFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceFragmentDensityMapFeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-fragmentDensityMap]] pname:fragmentDensityMap specifies
-    whether the implementation supports render passes with a fragment
-    density map attachment.
-    If this feature is not enabled and the pname:pNext chain of
-    slink:VkRenderPassCreateInfo includes a
-    slink:VkRenderPassFragmentDensityMapCreateInfoEXT structure,
-    pname:fragmentDensityMapAttachment must: be ename:VK_ATTACHMENT_UNUSED.
-  * [[features-fragmentDensityMapDynamic]] pname:fragmentDensityMapDynamic
-    specifies whether the implementation supports dynamic fragment density
-    map image views.
-    If this feature is not enabled,
-    ename:VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT must:
-    not be included in slink:VkImageViewCreateInfo::pname:flags.
-  * [[features-fragmentDensityMapNonSubsampledImages]]
-    pname:fragmentDensityMapNonSubsampledImages specifies whether the
-    implementation supports regular non-subsampled image attachments with
-    fragment density map render passes.
-    If this feature is not enabled, render passes with a
-    <<renderpass-fragmentdensitymapattachment,fragment density map
-    attachment>> must: only have <<samplers-subsamplesampler,subsampled
-    attachments>> bound.
-
-:refpage: VkPhysicalDeviceFragmentDensityMapFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceFragmentDensityMapFeaturesEXT.txt[]
---
-endif::VK_EXT_fragment_density_map[]
-
-ifdef::VK_EXT_fragment_density_map2[]
-[open,refpage='VkPhysicalDeviceFragmentDensityMap2FeaturesEXT',desc='Structure describing additional fragment density map features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceFragmentDensityMap2FeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceFragmentDensityMap2FeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-fragmentDensityMapDeferred]] pname:fragmentDensityMapDeferred
-    specifies whether the implementation supports deferred reads of fragment
-    density map image views.
-    If this feature is not enabled,
-    ename:VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT must:
-    not be included in sname:VkImageViewCreateInfo::pname:flags.
-
-:refpage: VkPhysicalDeviceFragmentDensityMap2FeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceFragmentDensityMap2FeaturesEXT.txt[]
---
-endif::VK_EXT_fragment_density_map2[]
-
-ifdef::VK_HUAWEI_invocation_mask[]
-[open,refpage='VkPhysicalDeviceInvocationMaskFeaturesHUAWEI',desc='Structure describing invocation mask features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceInvocationMaskFeaturesHUAWEI structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceInvocationMaskFeaturesHUAWEI.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-invocationMask]] pname:invocationMask indicates that the
-    implementation supports the use of an invocation mask image to optimize
-    the ray dispatch.
-
-:refpage: VkPhysicalDeviceInvocationMaskFeaturesHUAWEI
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceInvocationMaskFeaturesHUAWEI.txt[]
---
-endif::VK_HUAWEI_invocation_mask[]
-
-ifdef::VK_VERSION_1_2,VK_EXT_scalar_block_layout[]
-[open,refpage='VkPhysicalDeviceScalarBlockLayoutFeatures',desc='Structure indicating support for scalar block layouts',type='structs',alias='VkPhysicalDeviceScalarBlockLayoutFeaturesEXT']
---
-The sname:VkPhysicalDeviceScalarBlockLayoutFeatures structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceScalarBlockLayoutFeatures.txt[]
-
-ifdef::VK_EXT_scalar_block_layout[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceScalarBlockLayoutFeaturesEXT.txt[]
-endif::VK_EXT_scalar_block_layout[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_EXT_scalar_block_layout-features[]
-  * [[{anchor-prefix}features-scalarBlockLayout]] pname:scalarBlockLayout
-    indicates that the implementation supports the layout of resource blocks
-    in shaders using <<interfaces-alignment-requirements, scalar
-    alignment>>.
-// end::VK_EXT_scalar_block_layout-features[]
-
-:refpage: VkPhysicalDeviceScalarBlockLayoutFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceScalarBlockLayoutFeatures.txt[]
---
-endif::VK_VERSION_1_2,VK_EXT_scalar_block_layout[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_uniform_buffer_standard_layout[]
-[open,refpage='VkPhysicalDeviceUniformBufferStandardLayoutFeatures',desc='Structure indicating support for std430-like packing in uniform buffers',type='structs',alias='VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR']
---
-The sname:VkPhysicalDeviceUniformBufferStandardLayoutFeatures structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceUniformBufferStandardLayoutFeatures.txt[]
-
-ifdef::VK_KHR_uniform_buffer_standard_layout[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR.txt[]
-endif::VK_KHR_uniform_buffer_standard_layout[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_uniform_buffer_standard_layout-features[]
-  * [[{anchor-prefix}features-uniformBufferStandardLayout]]
-    pname:uniformBufferStandardLayout indicates that the implementation
-    supports the same layouts for uniform buffers as for storage and other
-    kinds of buffers.
-    See <<interfaces-resources-standard-layout,Standard Buffer Layout>>.
-// end::VK_KHR_uniform_buffer_standard_layout-features[]
-
-:refpage: VkPhysicalDeviceUniformBufferStandardLayoutFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceUniformBufferStandardLayoutFeatures.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_uniform_buffer_standard_layout[]
-
-ifdef::VK_EXT_depth_clip_enable[]
-[open,refpage='VkPhysicalDeviceDepthClipEnableFeaturesEXT',desc='Structure indicating support for explicit enable of depth clip',type='structs']
---
-The sname:VkPhysicalDeviceDepthClipEnableFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceDepthClipEnableFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-depthClipEnable]] pname:depthClipEnable indicates that the
-    implementation supports setting the depth clipping operation explicitly
-    via the slink:VkPipelineRasterizationDepthClipStateCreateInfoEXT
-    pipeline state.
-    Otherwise depth clipping is only enabled when
-    slink:VkPipelineRasterizationStateCreateInfo::pname:depthClampEnable is
-    set to ename:VK_FALSE.
-
-:refpage: VkPhysicalDeviceDepthClipEnableFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceDepthClipEnableFeaturesEXT.txt[]
---
-endif::VK_EXT_depth_clip_enable[]
-
-ifdef::VK_EXT_memory_priority[]
-[open,refpage='VkPhysicalDeviceMemoryPriorityFeaturesEXT',desc='Structure describing memory priority features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceMemoryPriorityFeaturesEXT structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMemoryPriorityFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-memoryPriority]] pname:memoryPriority indicates that the
-    implementation supports memory priorities specified at memory allocation
-    time via slink:VkMemoryPriorityAllocateInfoEXT.
-
-:refpage: VkPhysicalDeviceMemoryPriorityFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceMemoryPriorityFeaturesEXT.txt[]
---
-endif::VK_EXT_memory_priority[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-[open,refpage='VkPhysicalDeviceBufferDeviceAddressFeatures',desc='Structure describing buffer address features that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceBufferDeviceAddressFeaturesKHR']
---
-The sname:VkPhysicalDeviceBufferDeviceAddressFeatures structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceBufferDeviceAddressFeatures.txt[]
-
-ifdef::VK_KHR_buffer_device_address[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceBufferDeviceAddressFeaturesKHR.txt[]
-endif::VK_KHR_buffer_device_address[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_EXT_buffer_device_address-features[]
-  * [[{anchor-prefix}features-bufferDeviceAddress]]
-    pname:bufferDeviceAddress indicates that the implementation supports
-    accessing buffer memory in shaders as storage buffers via an address
-    queried from flink:vkGetBufferDeviceAddress.
-  * [[{anchor-prefix}features-bufferDeviceAddressCaptureReplay]]
-    pname:bufferDeviceAddressCaptureReplay indicates that the implementation
-    supports saving and reusing buffer and device addresses, e.g. for trace
-    capture and replay.
-  * [[{anchor-prefix}features-bufferDeviceAddressMultiDevice]]
-    pname:bufferDeviceAddressMultiDevice indicates that the implementation
-    supports the pname:bufferDeviceAddress
-ifndef::VK_KHR_ray_tracing_pipeline+VK_KHR_ray_query[feature]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-ifndef::VK_KHR_ray_query[]
-    and pname:rayTracingPipeline features
-endif::VK_KHR_ray_query[]
-ifdef::VK_KHR_ray_query[]
-    , pname:rayTracingPipeline and pname:rayQuery features
-endif::VK_KHR_ray_query[]
-endif::VK_KHR_ray_tracing_pipeline[]
-ifndef::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_KHR_ray_query[]
-    and pname:rayQuery features
-endif::VK_KHR_ray_query[]
-endif::VK_KHR_ray_tracing_pipeline[]
-    for logical devices created with multiple physical devices.
-    If this feature is not supported, buffer
-ifdef::VK_KHR_acceleration_structure[]
-    and acceleration structure
-endif::VK_KHR_acceleration_structure[]
-    addresses must: not be queried on a logical device created with more
-    than one physical device.
-// end::VK_EXT_buffer_device_address-features[]
-
-[NOTE]
-.Note
-====
-pname:bufferDeviceAddressMultiDevice exists to allow certain legacy
-platforms to be able to support pname:bufferDeviceAddress without needing to
-support shared GPU virtual addresses for multi-device configurations.
-====
-
-See flink:vkGetBufferDeviceAddress for more information.
-
-:refpage: VkPhysicalDeviceBufferDeviceAddressFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceBufferDeviceAddressFeatures.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-
-ifdef::VK_EXT_buffer_device_address[]
-[open,refpage='VkPhysicalDeviceBufferDeviceAddressFeaturesEXT',desc='Structure describing buffer address features that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceBufferAddressFeaturesEXT']
---
-The sname:VkPhysicalDeviceBufferDeviceAddressFeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceBufferDeviceAddressFeaturesEXT.txt[]
-
-include::{generated}/api/structs/VkPhysicalDeviceBufferAddressFeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-bufferDeviceAddressEXT]] pname:bufferDeviceAddress indicates
-    that the implementation supports accessing buffer memory in shaders as
-    storage buffers via an address queried from
-    flink:vkGetBufferDeviceAddressEXT.
-  * [[features-bufferDeviceAddressCaptureReplayEXT]]
-    pname:bufferDeviceAddressCaptureReplay indicates that the implementation
-    supports saving and reusing buffer addresses, e.g. for trace capture and
-    replay.
-  * [[features-bufferDeviceAddressMultiDeviceEXT]]
-    pname:bufferDeviceAddressMultiDevice indicates that the implementation
-    supports the pname:bufferDeviceAddress feature for logical devices
-    created with multiple physical devices.
-    If this feature is not supported, buffer addresses must: not be queried
-    on a logical device created with more than one physical device.
-
-:refpage: VkPhysicalDeviceBufferDeviceAddressFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-[NOTE]
-.Note
-====
-The sname:VkPhysicalDeviceBufferDeviceAddressFeaturesEXT structure has the
-same members as the sname:VkPhysicalDeviceBufferDeviceAddressFeatures
-structure, but the functionality indicated by the members is expressed
-differently.
-The features indicated by the
-sname:VkPhysicalDeviceBufferDeviceAddressFeatures structure requires
-additional flags to be passed at memory allocation time, and the capture and
-replay mechanism is built around opaque capture addresses for buffer and
-memory objects.
-====
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-
-include::{generated}/validity/structs/VkPhysicalDeviceBufferDeviceAddressFeaturesEXT.txt[]
---
-endif::VK_EXT_buffer_device_address[]
-
-ifdef::VK_NV_dedicated_allocation_image_aliasing[]
-[open,refpage='VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV',desc='Structure describing dedicated allocation image aliasing features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV
-structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-dedicatedAllocationImageAliasing]]
-    pname:dedicatedAllocationImageAliasing indicates that the implementation
-    supports aliasing of compatible image objects on a dedicated allocation.
-
-:refpage: VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.txt[]
---
-endif::VK_NV_dedicated_allocation_image_aliasing[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-[open,refpage='VkPhysicalDeviceImagelessFramebufferFeatures',desc='Structure indicating support for imageless framebuffers',type='structs',alias='VkPhysicalDeviceImagelessFramebufferFeaturesKHR']
---
-The sname:VkPhysicalDeviceImagelessFramebufferFeatures structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceImagelessFramebufferFeatures.txt[]
-
-ifdef::VK_KHR_imageless_framebuffer[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceImagelessFramebufferFeaturesKHR.txt[]
-endif::VK_KHR_imageless_framebuffer[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_imageless_framebuffer-features[]
-  * [[{anchor-prefix}features-imagelessFramebuffer]]
-    pname:imagelessFramebuffer indicates that the implementation supports
-    specifying the image view for attachments at render pass begin time via
-    slink:VkRenderPassAttachmentBeginInfo.
-// end::VK_KHR_imageless_framebuffer-features[]
-
-:refpage: VkPhysicalDeviceImagelessFramebufferFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceImagelessFramebufferFeatures.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-
-ifdef::VK_EXT_fragment_shader_interlock[]
-[open,refpage='VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT',desc='Structure describing fragment shader interlock features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-fragmentShaderSampleInterlock]]
-    pname:fragmentShaderSampleInterlock indicates that the implementation
-    supports the code:FragmentShaderSampleInterlockEXT SPIR-V capability.
-  * [[features-fragmentShaderPixelInterlock]]
-    pname:fragmentShaderPixelInterlock indicates that the implementation
-    supports the code:FragmentShaderPixelInterlockEXT SPIR-V capability.
-  * [[features-fragmentShaderShadingRateInterlock]]
-    pname:fragmentShaderShadingRateInterlock indicates that the
-    implementation supports the code:FragmentShaderShadingRateInterlockEXT
-    SPIR-V capability.
-
-:refpage: VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT.txt[]
---
-endif::VK_EXT_fragment_shader_interlock[]
-
-ifdef::VK_NV_cooperative_matrix[]
-[open,refpage='VkPhysicalDeviceCooperativeMatrixFeaturesNV',desc='Structure describing cooperative matrix features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceCooperativeMatrixFeaturesNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceCooperativeMatrixFeaturesNV.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-cooperativeMatrix]] pname:cooperativeMatrix indicates that
-    the implementation supports the code:CooperativeMatrixNV SPIR-V
-    capability.
-  * [[features-cooperativeMatrixRobustBufferAccess]]
-    pname:cooperativeMatrixRobustBufferAccess indicates that the
-    implementation supports robust buffer access for SPIR-V
-    code:OpCooperativeMatrixLoadNV and code:OpCooperativeMatrixStoreNV
-    instructions.
-
-:refpage: VkPhysicalDeviceCooperativeMatrixFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceCooperativeMatrixFeaturesNV.txt[]
---
-endif::VK_NV_cooperative_matrix[]
-
-ifdef::VK_EXT_ycbcr_image_arrays[]
-[open,refpage='VkPhysicalDeviceYcbcrImageArraysFeaturesEXT',desc='Structure describing extended {YCbCr} image creation features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceYcbcrImageArraysFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceYcbcrImageArraysFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-ycbcrImageArrays]] pname:ycbcrImageArrays indicates that the
-    implementation supports creating images with a format that requires
-    <<formats-requiring-sampler-ycbcr-conversion, {YCbCr} conversion>> and
-    has multiple array layers.
-
-:refpage: VkPhysicalDeviceYcbcrImageArraysFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceYcbcrImageArraysFeaturesEXT.txt[]
---
-endif::VK_EXT_ycbcr_image_arrays[]
-
-ifdef::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_2,VK_KHR_shader_subgroup_extended_types[]
-[open,refpage='VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures',desc='Structure describing the extended types subgroups support feature for an implementation',type='structs',alias='VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR']
---
-The sname:VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures.txt[]
-
-ifdef::VK_KHR_shader_subgroup_extended_types[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR.txt[]
-endif::VK_KHR_shader_subgroup_extended_types[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_shader_subgroup_extended_types-features[]
-  * [[{anchor-prefix}features-subgroup-extended-types]]
-    pname:shaderSubgroupExtendedTypes is a boolean that specifies whether
-    subgroup operations can use 8-bit integer, 16-bit integer, 64-bit
-    integer, 16-bit floating-point, and vectors of these types in
-    <<shaders-group-operations,group operations>> with
-    <<shaders-scope-subgroup, subgroup scope>>, if the implementation
-    supports the types.
-// end::VK_KHR_shader_subgroup_extended_types-features[]
-
-:refpage: VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_shader_subgroup_extended_types[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_2,VK_EXT_host_query_reset[]
-[open,refpage='VkPhysicalDeviceHostQueryResetFeatures',desc='Structure describing whether queries can be reset from the host',type='structs',alias='VkPhysicalDeviceHostQueryResetFeaturesEXT']
---
-The sname:VkPhysicalDeviceHostQueryResetFeatures structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceHostQueryResetFeatures.txt[]
-
-ifdef::VK_EXT_host_query_reset[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceHostQueryResetFeaturesEXT.txt[]
-endif::VK_EXT_host_query_reset[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_EXT_host_query_reset-features[]
-  * [[{anchor-prefix}features-hostQueryReset]] pname:hostQueryReset
-    indicates that the implementation supports resetting queries from the
-    host with flink:vkResetQueryPool.
-// end::VK_EXT_host_query_reset-features[]
-
-:refpage: VkPhysicalDeviceHostQueryResetFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceHostQueryResetFeatures.txt[]
---
-endif::VK_VERSION_1_2,VK_EXT_host_query_reset[]
-
-ifdef::VK_INTEL_shader_integer_functions2[]
-[open,refpage='VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL',desc='Structure describing shader integer functions that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-shaderIntegerFunctions2]] pname:shaderIntegerFunctions2
-    indicates that the implementation supports the
-    code:IntegerFunctions2INTEL SPIR-V capability.
-
-:refpage: VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTELfeatures.
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.txt[]
---
-endif::VK_INTEL_shader_integer_functions2[]
-
-ifdef::VK_NV_coverage_reduction_mode[]
-[open,refpage='VkPhysicalDeviceCoverageReductionModeFeaturesNV',desc='Structure describing the coverage reduction mode features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceCoverageReductionModeFeaturesNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceCoverageReductionModeFeaturesNV.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-coverageReductionMode]] pname:coverageReductionMode indicates
-    whether the implementation supports coverage reduction modes.
-    See <<fragops-coverage-reduction, Coverage Reduction>>.
-
-:refpage: VkPhysicalDeviceCoverageReductionModeFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceCoverageReductionModeFeaturesNV.txt[]
---
-endif::VK_NV_coverage_reduction_mode[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-[open,refpage='VkPhysicalDeviceTimelineSemaphoreFeatures',desc='Structure describing timeline semaphore features that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceTimelineSemaphoreFeaturesKHR']
---
-The sname:VkPhysicalDeviceTimelineSemaphoreFeatures structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceTimelineSemaphoreFeatures.txt[]
-
-ifdef::VK_KHR_timeline_semaphore[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceTimelineSemaphoreFeaturesKHR.txt[]
-endif::VK_KHR_timeline_semaphore[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_timeline_semaphore-features[]
-  * [[{anchor-prefix}features-timelineSemaphore]] pname:timelineSemaphore
-    indicates whether semaphores created with a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_TIMELINE are supported.
-// end::VK_KHR_timeline_semaphore-features[]
-
-:refpage: VkPhysicalDeviceTimelineSemaphoreFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceTimelineSemaphoreFeatures.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-ifdef::VK_EXT_index_type_uint8[]
-[open,refpage='VkPhysicalDeviceIndexTypeUint8FeaturesEXT',desc='Structure describing whether uint8 index type can be used',type='structs']
---
-The sname:VkPhysicalDeviceIndexTypeUint8FeaturesEXT structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceIndexTypeUint8FeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-indexTypeUint8]] pname:indexTypeUint8 indicates that
-    ename:VK_INDEX_TYPE_UINT8_EXT can be used with
-    flink:vkCmdBindIndexBuffer.
-
-:refpage: VkPhysicalDeviceIndexTypeUint8FeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceIndexTypeUint8FeaturesEXT.txt[]
---
-endif::VK_EXT_index_type_uint8[]
-
-ifdef::VK_EXT_primitive_topology_list_restart[]
-[open,refpage='VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT',desc='Structure describing whether list type primitives can support primitive restart',type='structs']
---
-The sname:VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT structure
-is defined as:
-
-include::{generated}/api/structs/VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.txt[]
-
-The members of the
-sname:VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT structure
-describe the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-primitiveTopologyListRestart]]
-    pname:primitiveTopologyListRestart indicates that list type primitives,
-    ename:VK_PRIMITIVE_TOPOLOGY_POINT_LIST,
-    ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST,
-    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
-    ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY and
-    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY, can: use the
-    primitive restart index value in index buffers.
-  * [[features-primitiveTopologyPatchListRestart]]
-    pname:primitiveTopologyPatchListRestart indicates that the
-    ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST topology can: use the primitive
-    restart index value in index buffers.
-
-:refpage: VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.txt[]
---
-endif::VK_EXT_primitive_topology_list_restart[]
-
-ifdef::VK_NV_shader_sm_builtins[]
-[open,refpage='VkPhysicalDeviceShaderSMBuiltinsFeaturesNV',desc='Structure describing the shader SM Builtins features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceShaderSMBuiltinsFeaturesNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderSMBuiltinsFeaturesNV.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-shaderSMBuiltins]] pname:shaderSMBuiltins indicates whether
-    the implementation supports the SPIR-V code:ShaderSMBuiltinsNV
-    capability.
-
-:refpage: VkPhysicalDeviceShaderSMBuiltinsFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderSMBuiltinsFeaturesNV.txt[]
---
-endif::VK_NV_shader_sm_builtins[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-[open,refpage='VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures',desc='Structure describing whether the implementation can do depth and stencil image barriers separately',type='structs',alias='VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR']
---
-The sname:VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures.txt[]
-
-ifdef::VK_KHR_separate_depth_stencil_layouts[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR.txt[]
-endif::VK_KHR_separate_depth_stencil_layouts[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_separate_depth_stencil_layouts-features[]
-  * [[{anchor-prefix}features-separateDepthStencilLayouts]]
-    pname:separateDepthStencilLayouts indicates whether the implementation
-    supports a sname:VkImageMemoryBarrier for a depth/stencil image with
-    only one of ename:VK_IMAGE_ASPECT_DEPTH_BIT or
-    ename:VK_IMAGE_ASPECT_STENCIL_BIT set, and whether
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL can be used.
-// end::VK_KHR_separate_depth_stencil_layouts-features[]
-
-:refpage: VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-
-ifdef::VK_KHR_pipeline_executable_properties[]
-[open,refpage='VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR',desc='Structure describing whether pipeline executable properties are available',type='structs']
---
-The sname:VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR structure
-is defined as:
-
-include::{generated}/api/structs/VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-pipelineExecutableInfo]] pname:pipelineExecutableInfo
-    indicates that the implementation supports reporting properties and
-    statistics about the pipeline executables associated with a compiled
-    pipeline.
-
-:refpage: VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR.txt[]
---
-endif::VK_KHR_pipeline_executable_properties[]
-
-ifdef::VK_EXT_shader_demote_to_helper_invocation[]
-[open,refpage='VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT',desc='Structure describing the shader demote to helper invocations features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT
-structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-shaderDemoteToHelperInvocation]]
-    pname:shaderDemoteToHelperInvocation indicates whether the
-    implementation supports the SPIR-V code:DemoteToHelperInvocationEXT
-    capability.
-
-:refpage: VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.txt[]
---
-endif::VK_EXT_shader_demote_to_helper_invocation[]
-
-ifdef::VK_EXT_texel_buffer_alignment[]
-[open,refpage='VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT',desc='Structure describing the texel buffer alignment features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-texelBufferAlignment]] pname:texelBufferAlignment indicates
-    whether the implementation uses more specific alignment requirements
-    advertised in slink:VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT
-    rather than
-    slink:VkPhysicalDeviceLimits::pname:minTexelBufferOffsetAlignment.
-
-:refpage: VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT.txt[]
---
-endif::VK_EXT_texel_buffer_alignment[]
-
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-[open,refpage='VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT',desc='Structure describing ASTC HDR features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-textureCompressionASTC_HDR]] pname:textureCompressionASTC_HDR
-    indicates whether all of the ASTC HDR compressed texture formats are
-    supported.
-    If this feature is enabled, then the
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT,
-    ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT and
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT features must:
-    be supported in pname:optimalTilingFeatures for the following formats:
-+
-  ** ename:VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT
-  ** ename:VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT
-  ** ename:VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT
-  ** ename:VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT
-  ** ename:VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT
-  ** ename:VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT
-  ** ename:VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT
-  ** ename:VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT
-  ** ename:VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT
-  ** ename:VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT
-  ** ename:VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT
-  ** ename:VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT
-  ** ename:VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT
-  ** ename:VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT
-+
-To query for additional properties, or if the feature is not enabled,
-flink:vkGetPhysicalDeviceFormatProperties and
-flink:vkGetPhysicalDeviceImageFormatProperties can: be used to check for
-supported properties of individual formats as normal.
-
-:refpage: VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.txt[]
---
-endif::VK_EXT_texture_compression_astc_hdr[]
-
-ifdef::VK_EXT_line_rasterization[]
-[open,refpage='VkPhysicalDeviceLineRasterizationFeaturesEXT',desc='Structure describing the line rasterization features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceLineRasterizationFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceLineRasterizationFeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-rectangularLines]] pname:rectangularLines indicates whether
-    the implementation supports <<primsrast-lines,rectangular line
-    rasterization>>.
-  * [[features-bresenhamLines]] pname:bresenhamLines indicates whether the
-    implementation supports <<primsrast-lines-bresenham,Bresenham-style line
-    rasterization>>.
-  * [[features-smoothLines]] pname:smoothLines indicates whether the
-    implementation supports <<primsrast-lines-smooth,smooth line
-    rasterization>>.
-  * [[features-stippledRectangularLines]] pname:stippledRectangularLines
-    indicates whether the implementation supports
-    <<primsrast-lines-stipple,stippled line rasterization>> with
-    ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT lines, or with
-    ename:VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT lines if
-    slink:VkPhysicalDeviceLimits::pname:strictLines is ename:VK_TRUE.
-  * [[features-stippledBresenhamLines]] pname:stippledBresenhamLines
-    indicates whether the implementation supports
-    <<primsrast-lines-stipple,stippled line rasterization>> with
-    ename:VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT lines.
-  * [[features-stippledSmoothLines]] pname:stippledSmoothLines indicates
-    whether the implementation supports <<primsrast-lines-stipple,stippled
-    line rasterization>> with
-    ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT lines.
-
-:refpage: VkPhysicalDeviceLineRasterizationFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceLineRasterizationFeaturesEXT.txt[]
---
-endif::VK_EXT_line_rasterization[]
-
-ifdef::VK_EXT_subgroup_size_control[]
-[open,refpage='VkPhysicalDeviceSubgroupSizeControlFeaturesEXT',desc='Structure describing the subgroup size control features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceSubgroupSizeControlFeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceSubgroupSizeControlFeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-subgroupSizeControl]] pname:subgroupSizeControl indicates
-    whether the implementation supports controlling shader subgroup sizes
-    via the
-    ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
-    flag and the
-    slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure.
-  * [[features-computeFullSubgroups]] pname:computeFullSubgroups indicates
-    whether the implementation supports requiring full subgroups in compute
-    shaders via the
-    ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
-    flag.
-
-:refpage: VkPhysicalDeviceSubgroupSizeControlFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-[NOTE]
-.Note
-====
-The sname:VkPhysicalDeviceSubgroupSizeControlFeaturesEXT structure was added
-in version 2 of the `apiext:VK_EXT_subgroup_size_control` extension.
-Version 1 implementations of this extension will not fill out the features
-structure but applications may assume that both pname:subgroupSizeControl
-and pname:computeFullSubgroups are supported if the extension is supported.
-(See also the <<features-requirements, Feature Requirements>> section.)
-Applications are advised to add a
-sname:VkPhysicalDeviceSubgroupSizeControlFeaturesEXT structure to the
-pname:pNext chain of slink:VkDeviceCreateInfo to enable the features
-regardless of the version of the extension supported by the implementation.
-If the implementation only supports version 1, it will safely ignore the
-sname:VkPhysicalDeviceSubgroupSizeControlFeaturesEXT structure.
-====
-
-include::{generated}/validity/structs/VkPhysicalDeviceSubgroupSizeControlFeaturesEXT.txt[]
---
-endif::VK_EXT_subgroup_size_control[]
-
-ifdef::VK_AMD_device_coherent_memory[]
-[open,refpage='VkPhysicalDeviceCoherentMemoryFeaturesAMD',desc='Structure describing whether device coherent memory can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceCoherentMemoryFeaturesAMD structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceCoherentMemoryFeaturesAMD.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-deviceCoherentMemory]] pname:deviceCoherentMemory indicates
-    that the implementation supports <<VkMemoryPropertyFlagBits,device
-    coherent memory>>.
-
-:refpage: VkPhysicalDeviceCoherentMemoryFeaturesAMD
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceCoherentMemoryFeaturesAMD.txt[]
---
-endif::VK_AMD_device_coherent_memory[]
-
-ifdef::VK_KHR_acceleration_structure[]
-[open,refpage='VkPhysicalDeviceAccelerationStructureFeaturesKHR',desc='Structure describing the acceleration structure features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceAccelerationStructureFeaturesKHR structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceAccelerationStructureFeaturesKHR.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-accelerationStructure]] pname:accelerationStructure indicates
-    whether the implementation supports the acceleration structure
-    functionality.
-    See <<acceleration-structure,Acceleration Structures>>.
-  * [[features-accelerationStructureCaptureReplay]]
-    pname:accelerationStructureCaptureReplay indicates whether the
-    implementation supports saving and reusing acceleration structure device
-    addresses, e.g. for trace capture and replay.
-  * [[features-accelerationStructureIndirectBuild]]
-    pname:accelerationStructureIndirectBuild indicates whether the
-    implementation supports indirect acceleration structure build commands,
-    e.g. flink:vkCmdBuildAccelerationStructuresIndirectKHR.
-  * [[features-accelerationStructureHostCommands]]
-    pname:accelerationStructureHostCommands indicates whether the
-    implementation supports host side acceleration structure commands, e.g.
-    flink:vkBuildAccelerationStructuresKHR,
-    flink:vkCopyAccelerationStructureKHR,
-    flink:vkCopyAccelerationStructureToMemoryKHR,
-    flink:vkCopyMemoryToAccelerationStructureKHR,
-    flink:vkWriteAccelerationStructuresPropertiesKHR.
-  * [[features-descriptorBindingAccelerationStructureUpdateAfterBind]]
-    pname:descriptorBindingAccelerationStructureUpdateAfterBind indicates
-    whether the implementation supports updating acceleration structure
-    descriptors after a set is bound.
-    If this feature is not enabled,
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT must: not be used with
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR.
-
-:refpage: VkPhysicalDeviceAccelerationStructureFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceAccelerationStructureFeaturesKHR.txt[]
---
-endif::VK_KHR_acceleration_structure[]
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-[open,refpage='VkPhysicalDeviceRayTracingPipelineFeaturesKHR',desc='Structure describing the ray tracing features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceRayTracingPipelineFeaturesKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceRayTracingPipelineFeaturesKHR.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-rayTracingPipeline]] pname:rayTracingPipeline indicates
-    whether the implementation supports the ray tracing pipeline
-    functionality.
-    See <<ray-tracing,Ray Tracing>>.
-  * [[features-rayTracingPipelineShaderGroupHandleCaptureReplay]]
-    pname:rayTracingPipelineShaderGroupHandleCaptureReplay indicates whether
-    the implementation supports saving and reusing shader group handles,
-    e.g. for trace capture and replay.
-  * [[features-rayTracingPipelineShaderGroupHandleCaptureReplayMixed]]
-    pname:rayTracingPipelineShaderGroupHandleCaptureReplayMixed indicates
-    whether the implementation supports reuse of shader group handles being
-    arbitrarily mixed with creation of non-reused shader group handles.
-    If this is ename:VK_FALSE, all reused shader group handles must: be
-    specified before any non-reused handles may: be created.
-  * [[features-rayTracingPipelineTraceRaysIndirect]]
-    pname:rayTracingPipelineTraceRaysIndirect indicates whether the
-    implementation supports indirect ray tracing commands, e.g.
-    flink:vkCmdTraceRaysIndirectKHR.
-  * [[features-rayTraversalPrimitiveCulling]]
-    pname:rayTraversalPrimitiveCulling indicates whether the implementation
-    supports <<ray-traversal-culling-primitive, primitive culling during ray
-    traversal>>.
-
-:refpage: VkPhysicalDeviceRayTracingPipelineFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-.Valid Usage
-****
-  * [[VUID-VkPhysicalDeviceRayTracingPipelineFeaturesKHR-rayTracingPipelineShaderGroupHandleCaptureReplayMixed-03575]]
-    If pname:rayTracingPipelineShaderGroupHandleCaptureReplayMixed is
-    ename:VK_TRUE, pname:rayTracingPipelineShaderGroupHandleCaptureReplay
-    must: also be ename:VK_TRUE
-****
-
-include::{generated}/validity/structs/VkPhysicalDeviceRayTracingPipelineFeaturesKHR.txt[]
---
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_KHR_ray_query[]
-[open,refpage='VkPhysicalDeviceRayQueryFeaturesKHR',desc='Structure describing the ray query features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceRayQueryFeaturesKHR structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceRayQueryFeaturesKHR.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-rayQuery]] pname:rayQuery indicates whether the
-    implementation supports ray query (code:OpRayQueryProceedKHR)
-    functionality.
-
-:refpage: VkPhysicalDeviceRayQueryFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceRayQueryFeaturesKHR.txt[]
---
-endif::VK_KHR_ray_query[]
-
-ifdef::VK_EXT_extended_dynamic_state[]
-[open,refpage='VkPhysicalDeviceExtendedDynamicStateFeaturesEXT',desc='Structure describing what extended dynamic state can be used',type='structs']
---
-The sname:VkPhysicalDeviceExtendedDynamicStateFeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceExtendedDynamicStateFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-extendedDynamicState]] pname:extendedDynamicState indicates
-    that the implementation supports the following dynamic states:
-  ** ename:VK_DYNAMIC_STATE_CULL_MODE_EXT
-  ** ename:VK_DYNAMIC_STATE_FRONT_FACE_EXT
-  ** ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT
-  ** ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT
-  ** ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT
-  ** ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT
-  ** ename:VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT
-  ** ename:VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT
-  ** ename:VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT
-  ** ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT
-  ** ename:VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT
-  ** ename:VK_DYNAMIC_STATE_STENCIL_OP_EXT
-
-:refpage: VkPhysicalDeviceExtendedDynamicStateFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceExtendedDynamicStateFeaturesEXT.txt[]
---
-endif::VK_EXT_extended_dynamic_state[]
-
-ifdef::VK_EXT_extended_dynamic_state2[]
-[open,refpage='VkPhysicalDeviceExtendedDynamicState2FeaturesEXT',desc='Structure describing what extended dynamic state can be used',type='structs']
---
-The sname:VkPhysicalDeviceExtendedDynamicState2FeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceExtendedDynamicState2FeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-extendedDynamicState2]] pname:extendedDynamicState2 indicates
-    that the implementation supports the following dynamic states:
-  ** ename:VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT
-  ** ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT
-  ** ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT
-  * [[features-extendedDynamicState2LogicOp]]
-    pname:extendedDynamicState2LogicOp indicates that the implementation
-    supports the following dynamic state:
-  ** ename:VK_DYNAMIC_STATE_LOGIC_OP_EXT
-  * [[features-extendedDynamicState2PatchControlPoints]]
-    pname:extendedDynamicState2PatchControlPoints indicates that the
-    implementation supports the following dynamic state:
-  ** ename:VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT
-
-:refpage: VkPhysicalDeviceExtendedDynamicState2FeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceExtendedDynamicState2FeaturesEXT.txt[]
---
-endif::VK_EXT_extended_dynamic_state2[]
-
-ifdef::VK_NV_device_generated_commands[]
-[open,refpage='VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV',desc='Structure describing the device-generated commands features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-deviceGeneratedCommands]] pname:deviceGeneratedCommands
-    indicates whether the implementation supports functionality to generate
-    commands on the device.
-    See <<device-generated-commands,Device-Generated Commands>>.
-
-:refpage: VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV.txt[]
---
-endif::VK_NV_device_generated_commands[]
-
-ifdef::VK_NV_device_diagnostics_config[]
-[open,refpage='VkPhysicalDeviceDiagnosticsConfigFeaturesNV',desc='Structure describing the device-generated diagnostic configuration features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceDiagnosticsConfigFeaturesNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceDiagnosticsConfigFeaturesNV.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-diagnosticsConfig]] pname:diagnosticsConfig indicates whether
-    the implementation supports the ability to configure diagnostic tools.
-
-:refpage: VkPhysicalDeviceDiagnosticsConfigFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceDiagnosticsConfigFeaturesNV.txt[]
---
-endif::VK_NV_device_diagnostics_config[]
-
-ifdef::VK_EXT_device_memory_report[]
-[open,refpage='VkPhysicalDeviceDeviceMemoryReportFeaturesEXT',desc='Structure describing whether device memory report callback can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceDeviceMemoryReportFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceDeviceMemoryReportFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-deviceMemoryReport]] pname:deviceMemoryReport indicates
-    whether the implementation supports the ability to register device
-    memory report callbacks.
-
-:refpage: VkPhysicalDeviceDeviceMemoryReportFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceDeviceMemoryReportFeaturesEXT.txt[]
---
-endif::VK_EXT_device_memory_report[]
-
-ifdef::VK_EXT_global_priority_query[]
-[open,refpage='VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT',desc='Structure describing whether global priority query can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT.txt[]
-
-The members of the sname:VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT
-structure describe the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-globalPriorityQuery]] pname:globalPriorityQuery indicates
-    whether the implementation supports the ability to query global queue
-    priorities.
-
-:refpage: VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT.txt[]
---
-endif::VK_EXT_global_priority_query[]
-
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-[open,refpage='VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT',desc='Structure describing whether pipeline cache control can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT structure
-is defined as:
-
-include::{generated}/api/structs/VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-pipelineCreationCacheControl]]
-    pname:pipelineCreationCacheControl indicates that the implementation
-    supports:
-  ** The following can: be used in stext:Vk*PipelineCreateInfo::pname:flags:
-  *** ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT
-  *** ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT
-  ** The following can: be used in
-     slink:VkPipelineCacheCreateInfo::pname:flags:
-  *** ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT
-
-:refpage: VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT.txt[]
---
-endif::VK_EXT_pipeline_creation_cache_control[]
-
-ifdef::VK_KHR_zero_initialize_workgroup_memory[]
-[open,refpage='VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR',desc='Structure describing support for zero initialization of workgroup memory by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR structure
-is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-shaderZeroInitializeWorkgroupMemory]]
-    pname:shaderZeroInitializeWorkgroupMemory specifies whether the
-    implementation supports initializing a variable in Workgroup storage
-    class.
-
-:refpage: VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.txt[]
---
-endif::VK_KHR_zero_initialize_workgroup_memory[]
-
-ifdef::VK_EXT_private_data[]
-[open,refpage='VkPhysicalDevicePrivateDataFeaturesEXT',desc='Structure specifying physical device support',type='structs']
---
-
-The sname:VkPhysicalDevicePrivateDataFeaturesEXT structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDevicePrivateDataFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-privateData]] pname:privateData indicates whether the
-    implementation supports private data.
-    See <<private-data, Private Data>>.
-
-:refpage: VkPhysicalDevicePrivateDataFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDevicePrivateDataFeaturesEXT.txt[]
---
-endif::VK_EXT_private_data[]
-
-ifdef::VK_KHR_shader_subgroup_uniform_control_flow[]
-[open,refpage='VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR',desc='Structure describing support for shader subgroup uniform control flow by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR
-structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-shaderSubgroupUniformControlFlow]]
-    pname:shaderSubgroupUniformControlFlow specifies whether the
-    implementation supports the shader execution mode
-    code:SubgroupUniformControlFlowKHR
-
-:refpage: VkPhysicalDevicePrivateDataFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.txt[]
---
-endif::VK_KHR_shader_subgroup_uniform_control_flow[]
-
-ifdef::VK_EXT_robustness2[]
-[open,refpage='VkPhysicalDeviceRobustness2FeaturesEXT',desc='Structure describing the out-of-bounds behavior for an implementation',type='structs']
---
-The sname:VkPhysicalDeviceRobustness2FeaturesEXT structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceRobustness2FeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-robustBufferAccess2]] pname:robustBufferAccess2 indicates
-    whether buffer accesses are tightly bounds-checked against the range of
-    the descriptor.
-    Uniform buffers must: be bounds-checked to the range of the descriptor,
-    where the range is rounded up to a multiple of
-    <<limits-robustUniformBufferAccessSizeAlignment,robustUniformBufferAccessSizeAlignment>>.
-    Storage buffers must: be bounds-checked to the range of the descriptor,
-    where the range is rounded up to a multiple of
-    <<limits-robustStorageBufferAccessSizeAlignment,robustStorageBufferAccessSizeAlignment>>.
-    Out of bounds buffer loads will return zero values, and formatted loads
-    will have [eq]#(0,0,1)# values inserted for missing G, B, or A
-    components based on the format.
-  * [[features-robustImageAccess2]] pname:robustImageAccess2 indicates
-    whether image accesses are tightly bounds-checked against the dimensions
-    of the image view.
-    Out of bounds image loads will return zero values, with [eq]#(0,0,1)#
-    values <<textures-conversion-to-rgba,inserted for missing G, B, or A
-    components>> based on the format.
-  * [[features-nullDescriptor]] pname:nullDescriptor indicates whether
-    descriptors can: be written with a dlink:VK_NULL_HANDLE resource or
-    view, which are considered valid to access and act as if the descriptor
-    were bound to nothing.
-
-:refpage: VkPhysicalDeviceRobustness2FeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-.Valid Usage
-****
-  * [[VUID-VkPhysicalDeviceRobustness2FeaturesEXT-robustBufferAccess2-04000]]
-    If pname:robustBufferAccess2 is enabled then
-    <<features-robustBufferAccess, pname:robustBufferAccess>> must: also be
-    enabled
-****
-
-include::{generated}/validity/structs/VkPhysicalDeviceRobustness2FeaturesEXT.txt[]
---
-endif::VK_EXT_robustness2[]
-
-ifndef::VK_EXT_robustness2[]
-[[features-nullDescriptor]] nullDescriptor support requires the
-`apiext:VK_EXT_robustness2` extension.
-endif::VK_EXT_robustness2[]
-
-ifdef::VK_EXT_image_robustness[]
-[open,refpage='VkPhysicalDeviceImageRobustnessFeaturesEXT',desc='Structure describing the out-of-bounds behavior for an implementation',type='structs']
---
-The sname:VkPhysicalDeviceImageRobustnessFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceImageRobustnessFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-robustImageAccess]] pname:robustImageAccess indicates whether
-    image accesses are tightly bounds-checked against the dimensions of the
-    image view.
-    <<textures-input-validation,Invalid texels>> resulting from out of
-    bounds image loads will be replaced as described in
-    <<textures-texel-replacement,Texel Replacement>>, with either
-    [eq]#(0,0,1)# or [eq]#(0,0,0)# values inserted for missing G, B, or A
-    components based on the format.
-
-:refpage: VkPhysicalDeviceImageRobustnessFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceImageRobustnessFeaturesEXT.txt[]
---
-endif::VK_EXT_image_robustness[]
-
-ifdef::VK_KHR_shader_terminate_invocation[]
-[open,refpage='VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR',desc='Structure describing support for the SPIR-V code:SPV_KHR_terminate_invocation extension',type='structs']
---
-The sname:VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-shaderTerminateInvocation]] pname:shaderTerminateInvocation
-    specifies whether the implementation supports SPIR-V modules that use
-    the `SPV_KHR_terminate_invocation` extension.
-
-:refpage: VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR.txt[]
---
-endif::VK_KHR_shader_terminate_invocation[]
-
-ifdef::VK_EXT_custom_border_color[]
-[open,refpage='VkPhysicalDeviceCustomBorderColorFeaturesEXT',desc='Structure describing whether custom border colors can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceCustomBorderColorFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceCustomBorderColorFeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-customBorderColors]] pname:customBorderColors indicates that
-    the implementation supports providing a pname:borderColor value with one
-    of the following values at sampler creation time:
-  ** ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT
-  ** ename:VK_BORDER_COLOR_INT_CUSTOM_EXT
-  * [[features-customBorderColorWithoutFormat]]
-    pname:customBorderColorWithoutFormat indicates that explicit formats are
-    not required for custom border colors and the value of the pname:format
-    member of the slink:VkSamplerCustomBorderColorCreateInfoEXT structure
-    may: be ename:VK_FORMAT_UNDEFINED.
-    If this feature bit is not set, applications must: provide the
-    elink:VkFormat of the image view(s) being sampled by this sampler in the
-    pname:format member of the slink:VkSamplerCustomBorderColorCreateInfoEXT
-    structure.
-
-:refpage: VkPhysicalDeviceCustomBorderColorFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceCustomBorderColorFeaturesEXT.txt[]
---
-endif::VK_EXT_custom_border_color[]
-
-ifdef::VK_EXT_border_color_swizzle[]
-[open,refpage='VkPhysicalDeviceBorderColorSwizzleFeaturesEXT',desc='Structure describing whether samplers with custom border colors require the component swizzle specified in order to have defined behavior',type='structs']
---
-The sname:VkPhysicalDeviceBorderColorSwizzleFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceBorderColorSwizzleFeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-borderColorSwizzle]] pname:borderColorSwizzle indicates that
-    defined values are returned by sampled image operations when used with a
-    sampler that uses a ename:VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK,
-    ename:VK_BORDER_COLOR_INT_OPAQUE_BLACK,
-    ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT, or
-    ename:VK_BORDER_COLOR_INT_CUSTOM_EXT pname:borderColor and an image view
-    that uses a non-<<resources-image-views-identity-mappings,identity
-    component mapping>>, when either pname:borderColorSwizzleFromImage is
-    enabled or the slink:VkSamplerBorderColorComponentMappingCreateInfoEXT
-    is specified.
-  * [[features-borderColorSwizzleFromImage]]
-    pname:borderColorSwizzleFromImage indicates that the implementation will
-    return the correct border color values from sampled image operations
-    under the conditions expressed above, without the application having to
-    specify the border color component mapping when creating the sampler
-    object.
-    If this feature bit is not set, applications can: chain a
-    slink:VkSamplerBorderColorComponentMappingCreateInfoEXT structure when
-    creating samplers for use with image views that do not have an
-    <<resources-image-views-identity-mappings,identity swizzle>> and, when
-    those samplers are combined with image views using the same component
-    mapping, sampled image operations that use opaque black or custom border
-    colors will return the correct border color values.
-
-:refpage: VkPhysicalDeviceBorderColorSwizzleFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceBorderColorSwizzleFeaturesEXT.txt[]
---
-endif::VK_EXT_border_color_swizzle[]
-
-ifdef::VK_KHR_portability_subset[]
-[open,refpage='VkPhysicalDevicePortabilitySubsetFeaturesKHR',desc='Structure describing the features that may not be supported by an implementation of the Vulkan 1.0 Portability Subset',type='structs']
---
-The sname:VkPhysicalDevicePortabilitySubsetFeaturesKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDevicePortabilitySubsetFeaturesKHR.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-constantAlphaColorBlendFactors]]
-    pname:constantAlphaColorBlendFactors indicates whether this
-    implementation supports constant _alpha_ <<framebuffer-blendfactors>>
-    used as source or destination _color_ <<framebuffer-blending>>.
-  * [[features-events]] pname:events indicates whether this implementation
-    supports synchronization using <<synchronization-events>>.
-  * [[features-imageViewFormatReinterpretation]]
-    pname:imageViewFormatReinterpretation indicates whether this
-    implementation supports a sname:VkImageView being created with a texel
-    format containing a different number of components, or a different
-    number of bits in each component, than the texel format of the
-    underlying sname:VkImage.
-  * [[features-imageViewFormatSwizzle]] pname:imageViewFormatSwizzle
-    indicates whether this implementation supports remapping format
-    components using slink:VkImageViewCreateInfo::pname:components.
-  * [[features-imageView2DOn3DImage]] pname:imageView2DOn3DImage indicates
-    whether this implementation supports a sname:VkImage being created with
-    the ename:VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT flag set, permitting a
-    2D or 2D array image view to be created on a 3D sname:VkImage.
-  * [[features-multisampleArrayImage]] pname:multisampleArrayImage indicates
-    whether this implementation supports a sname:VkImage being created as a
-    2D array with multiple samples per texel.
-  * [[features-mutableComparisonSamplers]] pname:mutableComparisonSamplers
-    indicates whether this implementation allows descriptors with comparison
-    samplers to be <<descriptorsets-updates, updated>>.
-  * [[features-pointPolygons]] pname:pointPolygons indicates whether this
-    implementation supports <<primsrast>> using a _point_
-    <<primsrast-polygonmode>>.
-  * [[features-samplerMipLodBias]] pname:samplerMipLodBias indicates whether
-    this implementation supports setting a <<samplers-mipLodBias, mipmap LOD
-    bias value>> when <<samplers, creating a sampler>>.
-  * [[features-separateStencilMaskRef]] pname:separateStencilMaskRef
-    indicates whether this implementation supports separate front and back
-    <<fragops-stencil>> reference values.
-  * [[features-shaderSampleRateInterpolationFunctions]]
-    pname:shaderSampleRateInterpolationFunctions indicates whether this
-    implementation supports fragment shaders which use the
-    <<spirvenv-capabilities-table-InterpolationFunction,
-    code:InterpolationFunction>> capability and the extended instructions
-    `InterpolateAtCentroid`, `InterpolateAtOffset`, and
-    `InterpolateAtSample` from the `GLSL.std.450` extended instruction set.
-    This member is only meaningful if the
-    <<features-sampleRateShading,sampleRateShading>> feature is supported.
-  * [[features-tessellationIsolines]] pname:tessellationIsolines indicates
-    whether this implementation supports
-    <<tessellation-isoline-tessellation, isoline output>> from the
-    <<tessellation>> stage of a graphics pipeline.
-    This member is only meaningful if
-    <<features-tessellationShader,tessellation shaders>> are supported.
-  * [[features-tessellationPointMode]] pname:tessellationPointMode indicates
-    whether this implementation supports <<tessellation-point-mode, point
-    output>> from the <<tessellation>> stage of a graphics pipeline.
-    This member is only meaningful if
-    <<features-tessellationShader,tessellation shaders>> are supported.
-  * [[features-triangleFans]] pname:triangleFans indicates whether this
-    implementation supports <<drawing-triangle-fans>> primitive topology.
-  * [[features-vertexAttributeAccessBeyondStride]]
-    pname:vertexAttributeAccessBeyondStride indicates whether this
-    implementation supports accessing a vertex input attribute beyond the
-    stride of the corresponding vertex input binding.
-
-:refpage: VkPhysicalDevicePortabilitySubsetFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDevicePortabilitySubsetFeaturesKHR.txt[]
---
-endif::VK_KHR_portability_subset[]
-
-ifdef::VK_KHR_performance_query[]
-include::VK_KHR_performance_query/features.txt[]
-endif::VK_KHR_performance_query[]
-
-ifdef::VK_EXT_4444_formats[]
-[open,refpage='VkPhysicalDevice4444FormatsFeaturesEXT',desc='Structure describing additional 4444 formats supported by an implementation',type='structs']
---
-The sname:VkPhysicalDevice4444FormatsFeaturesEXT structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDevice4444FormatsFeaturesEXT.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-formatA4R4G4B4]] pname:formatA4R4G4B4 indicates that the
-    implementation must: support using a elink:VkFormat of
-    ename:VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT with at least the following
-    elink:VkFormatFeatureFlagBits:
-  ** ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
-  ** ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT
-  ** ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-  * [[features-formatA4B4G4R4]] pname:formatA4B4G4R4 indicates that the
-    implementation must: support using a elink:VkFormat of
-    ename:VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT with at least the following
-    elink:VkFormatFeatureFlagBits:
-  ** ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
-  ** ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT
-  ** ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-
-:refpage: VkPhysicalDevice4444FormatsFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDevice4444FormatsFeaturesEXT.txt[]
---
-endif::VK_EXT_4444_formats[]
-
-ifdef::VK_VALVE_mutable_descriptor_type[]
-[open,refpage='VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE',desc='Structure describing whether the mutable descriptor type is supported',type='structs']
---
-The sname:VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-mutableDescriptorType]] pname:mutableDescriptorType indicates
-    that the implementation must: support using the elink:VkDescriptorType
-    of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE with at least the following
-    descriptor types, where any combination of the types must: be supported:
-  ** ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
-  ** ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
-  ** ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
-  ** ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
-  ** ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
-  ** ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER
-
-  * Additionally, pname:mutableDescriptorType indicates that:
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  ** Non-uniform descriptor indexing must: be supported if all descriptor
-     types in a slink:VkMutableDescriptorTypeListVALVE for
-     ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE have the corresponding
-     non-uniform indexing features enabled in
-     slink:VkPhysicalDeviceDescriptorIndexingFeatures.
-  ** ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT with
-     pname:descriptorType of ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE relaxes
-     the list of required descriptor types to the descriptor types which
-     have the corresponding update-after-bind feature enabled in
-     slink:VkPhysicalDeviceDescriptorIndexingFeatures.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  ** Dynamically uniform descriptor indexing must: be supported if all
-     descriptor types in a slink:VkMutableDescriptorTypeListVALVE for
-     ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE have the corresponding dynamic
-     indexing features enabled.
-  ** ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE must: be
-     supported.
-  ** ename:VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE must: be supported.
-
-:refpage: VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE.txt[]
---
-endif::VK_VALVE_mutable_descriptor_type[]
-
-ifdef::VK_KHR_workgroup_memory_explicit_layout[]
-[open,refpage='VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR',desc='Structure describing the workgroup storage explicit layout features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR structure
-is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-workgroupMemoryExplicitLayout]]
-    pname:workgroupMemoryExplicitLayout indicates whether the implementation
-    supports the SPIR-V code:WorkgroupMemoryExplicitLayoutKHR capability.
-  * [[features-workgroupMemoryExplicitLayoutScalarBlockLayout]]
-    pname:workgroupMemoryExplicitLayoutScalarBlockLayout indicates whether
-    the implementation supports scalar alignment for laying out Workgroup
-    Blocks.
-  * [[features-workgroupMemoryExplicitLayout8BitAccess]]
-    pname:workgroupMemoryExplicitLayout8BitAccess indicates whether objects
-    in the code:Workgroup storage class with the code:Block decoration can:
-    have 8-bit integer members.
-    If this feature is not enabled, 8-bit integer members must: not be used
-    in such objects.
-    This also indicates whether shader modules can: declare the
-    code:WorkgroupMemoryExplicitLayout8BitAccessKHR capability.
-  * [[features-workgroupMemoryExplicitLayout16BitAccess]]
-    pname:workgroupMemoryExplicitLayout16BitAccess indicates whether objects
-    in the code:Workgroup storage class with the code:Block decoration can:
-    have 16-bit integer and 16-bit floating-point members.
-    If this feature is not enabled, 16-bit integer or 16-bit floating-point
-    members must: not be used in such objects.
-    This also indicates whether shader modules can: declare the
-    code:WorkgroupMemoryExplicitLayout16BitAccessKHR capability.
-
-:refpage: VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.txt[]
---
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-
-ifdef::VK_KHR_synchronization2[]
-[open,refpage='VkPhysicalDeviceSynchronization2FeaturesKHR',desc='Structure describing whether the implementation supports v2 synchronization commands',type='structs']
---
-The sname:VkPhysicalDeviceSynchronization2FeaturesKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceSynchronization2FeaturesKHR.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-synchronization2]] pname:synchronization2 indicates whether
-    the implementation supports the new set of synchronization commands
-    introduced in `apiext:VK_KHR_synchronization2`.
-
-:refpage: VkPhysicalDeviceSynchronization2FeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceSynchronization2FeaturesKHR.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-ifdef::VK_EXT_vertex_input_dynamic_state[]
-[open,refpage='VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT',desc='Structure describing whether the dynamic vertex input state can be used',type='structs']
---
-The sname:VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-vertexInputDynamicState]] pname:vertexInputDynamicState
-    indicates that the implementation supports the following dynamic states:
-  ** ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT
-
-:refpage: VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT.txt[]
---
-endif::VK_EXT_vertex_input_dynamic_state[]
-
-ifdef::VK_KHR_fragment_shading_rate[]
-[open,refpage='VkPhysicalDeviceFragmentShadingRateFeaturesKHR',desc='Structure indicating support for variable rate fragment shading',type='structs']
---
-The sname:VkPhysicalDeviceFragmentShadingRateFeaturesKHR structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceFragmentShadingRateFeaturesKHR.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-pipelineFragmentShadingRate]]
-    pname:pipelineFragmentShadingRate indicates that the implementation
-    supports the <<primsrast-fragment-shading-rate-pipeline, pipeline
-    fragment shading rate>>.
-  * [[features-primitiveFragmentShadingRate]]
-    pname:primitiveFragmentShadingRate indicates that the implementation
-    supports the <<primsrast-fragment-shading-rate-primitive, primitive
-    fragment shading rate>>.
-  * [[features-attachmentFragmentShadingRate]]
-    pname:attachmentFragmentShadingRate indicates that the implementation
-    supports the <<primsrast-fragment-shading-rate-attachment, attachment
-    fragment shading rate>>.
-
-:refpage: VkPhysicalDeviceFragmentShadingRateFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceFragmentShadingRateFeaturesKHR.txt[]
---
-endif::VK_KHR_fragment_shading_rate[]
-
-ifdef::VK_NV_fragment_shading_rate_enums[]
-[open,refpage='VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV',desc='Structure indicating support for fragment shading rate enums',type='structs']
---
-The sname:VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV.txt[]
-
-This structure describes the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-fragmentShadingRateEnums]] pname:fragmentShadingRateEnums
-    indicates that the implementation supports specifying fragment shading
-    rates using the ename:VkFragmentShadingRateNV enumerated type.
-  * [[features-supersampleFragmentShadingRates]]
-    pname:supersampleFragmentShadingRates indicates that the implementation
-    supports fragment shading rate enum values indicating more than one
-    invocation per fragment.
-  * [[features-noInvocationFragmentShadingRates]]
-    pname:noInvocationFragmentShadingRates indicates that the implementation
-    supports a fragment shading rate enum value indicating that no fragment
-    shaders should be invoked when that shading rate is used.
-
-:refpage: VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV.txt[]
---
-endif::VK_NV_fragment_shading_rate_enums[]
-
-ifdef::VK_NV_inherited_viewport_scissor[]
-[open,refpage='VkPhysicalDeviceInheritedViewportScissorFeaturesNV',desc='Structure describing the viewport scissor inheritance behavior for an implementation',type='structs']
---
-The sname:VkPhysicalDeviceInheritedViewportScissorFeaturesNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceInheritedViewportScissorFeaturesNV.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-    * [[features-inheritedViewportScissor2D]]
-      pname:inheritedViewportScissor2D indicates whether secondary command
-      buffers can inherit most of the dynamic state affected by
-ifdef::VK_EXT_extended_dynamic_state[]
-      ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT,
-      ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT,
-endif::VK_EXT_extended_dynamic_state[]
-ifdef::VK_EXT_discard_rectangles[]
-      ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT,
-endif::VK_EXT_discard_rectangles[]
-      ename:VK_DYNAMIC_STATE_VIEWPORT or ename:VK_DYNAMIC_STATE_SCISSOR,
-      from a primary command buffer.
-
-:refpage: VkPhysicalDeviceInheritedViewportScissorFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceInheritedViewportScissorFeaturesNV.txt[]
---
-endif::VK_NV_inherited_viewport_scissor[]
-
-ifdef::VK_EXT_ycbcr_2plane_444_formats[]
-[open,refpage='VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT',desc='Structure describing whether the implementation supports additional 2-plane 444 {YCbCr} formats',type='structs']
---
-The sname:VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-ycbcr2plane444Formats]] pname:ycbcr2plane444Formats indicates
-    that the implementation supports the following 2-plane 444 {YCbCr}
-    formats:
-    ** ename:VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT
-    ** ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT
-    ** ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT
-    ** ename:VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT
-
-:refpage: VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.txt[]
---
-endif::VK_EXT_ycbcr_2plane_444_formats[]
-
-ifdef::VK_EXT_color_write_enable[]
-[open,refpage='VkPhysicalDeviceColorWriteEnableFeaturesEXT',desc='Structure describing whether writes to color attachments can be enabled and disabled dynamically',type='structs']
---
-The sname:VkPhysicalDeviceColorWriteEnableFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceColorWriteEnableFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-colorWriteEnable]] pname:colorWriteEnable indicates that the
-    implementation supports the dynamic state
-    ename:VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT.
-
-:refpage: VkPhysicalDeviceColorWriteEnableFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceColorWriteEnableFeaturesEXT.txt[]
---
-endif::VK_EXT_color_write_enable[]
-
-ifdef::VK_EXT_provoking_vertex[]
-[open,refpage='VkPhysicalDeviceProvokingVertexFeaturesEXT',desc='Structure describing the provoking vertex features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceProvokingVertexFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceProvokingVertexFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-provokingVertexLast]] pname:provokingVertexLast indicates
-    whether the implementation supports the
-    ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT
-    <<VkProvokingVertexModeEXT,provoking vertex mode>> for flat shading.
-  * [[features-transformFeedbackPreservesProvokingVertex]]
-    pname:transformFeedbackPreservesProvokingVertex indicates that the order
-    of vertices within each primitive written by transform feedback will
-    preserve the provoking vertex.
-    This does not apply to triangle fan primitives when
-    <<limits-transformFeedbackPreservesTriangleFanProvokingVertex,pname:transformFeedbackPreservesTriangleFanProvokingVertex>>
-    is ename:VK_FALSE.
-    pname:transformFeedbackPreservesProvokingVertex must: be ename:VK_FALSE
-    when the apiext:VK_EXT_transform_feedback extension is not supported.
-
-:refpage: VkPhysicalDeviceProvokingVertexFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-ifdef::VK_EXT_transform_feedback[]
-When sname:VkPhysicalDeviceProvokingVertexFeaturesEXT is in the pname:pNext
-chain of slink:VkDeviceCreateInfo but the
-<<features-transformFeedback,transform feedback feature>> is not enabled,
-the value of pname:transformFeedbackPreservesProvokingVertex is ignored.
-endif::VK_EXT_transform_feedback[]
-
-include::{generated}/validity/structs/VkPhysicalDeviceProvokingVertexFeaturesEXT.txt[]
---
-endif::VK_EXT_provoking_vertex[]
-
-ifdef::VK_EXT_pageable_device_local_memory[]
-[open,refpage='VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT',desc='Structure describing whether the implementation supports pageable device-local memory',type='structs']
---
-The sname:VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-pageableDeviceLocalMemory]] pname:pageableDeviceLocalMemory
-    indicates that the implementation supports pageable device-local memory
-    and may: transparently move device-local memory allocations to
-    host-local memory to better share device-local memory with other
-    applications.
-
-:refpage: VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.txt[]
---
-endif::VK_EXT_pageable_device_local_memory[]
-
-ifdef::VK_EXT_multi_draw[]
-[open,refpage='VkPhysicalDeviceMultiDrawFeaturesEXT',desc='Structure describing whether the implementation supports multi draw functionality',type='structs']
---
-The sname:VkPhysicalDeviceMultiDrawFeaturesEXT structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMultiDrawFeaturesEXT.txt[]
-
-The members of the sname:VkPhysicalDeviceMultiDrawFeaturesEXT structure
-describe the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-multiDraw]] pname:multiDraw indicates that the implementation
-    supports flink:vkCmdDrawMultiEXT and flink:vkCmdDrawMultiIndexedEXT.
-
-:refpage: VkPhysicalDeviceMultiDrawFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceMultiDrawFeaturesEXT.txt[]
---
-endif::VK_EXT_multi_draw[]
-
-ifdef::VK_NV_ray_tracing_motion_blur[]
-[open,refpage='VkPhysicalDeviceRayTracingMotionBlurFeaturesNV',desc='Structure describing the ray tracing motion blur features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceRayTracingMotionBlurFeaturesNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceRayTracingMotionBlurFeaturesNV.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-rayTracingMotionBlur]] pname:rayTracingMotionBlur indicates
-    whether the implementation supports the motion blur feature.
-  * [[features-rayTracingMotionBlurPipelineTraceRaysIndirect]]
-    pname:rayTracingMotionBlurPipelineTraceRaysIndirect indicates whether
-    the implementation supports indirect ray tracing commands with the
-    motion blur feature enabled.
-
-:refpage: VkPhysicalDeviceRayTracingMotionBlurFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceRayTracingMotionBlurFeaturesNV.txt[]
---
-endif::VK_NV_ray_tracing_motion_blur[]
-
-ifdef::VK_HUAWEI_subpass_shading[]
-[open,refpage='VkPhysicalDeviceSubpassShadingFeaturesHUAWEI',desc='Structure describing whether subpass shading is enabled',type='structs']
---
-The sname:VkPhysicalDeviceSubpassShadingFeaturesHUAWEI structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceSubpassShadingFeaturesHUAWEI.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-subpassShading]] pname:subpassShading specifies whether
-    subpass shading is supported.
-
-:refpage: VkPhysicalDeviceSubpassShadingFeaturesHUAWEI
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceSubpassShadingFeaturesHUAWEI.txt[]
---
-endif::VK_HUAWEI_subpass_shading[]
-
-ifdef::VK_NV_external_memory_rdma[]
-[open,refpage='VkPhysicalDeviceExternalMemoryRDMAFeaturesNV',desc='Structure describing the external memory RDMA features supported by the implementation',type='structs']
---
-The sname:VkPhysicalDeviceExternalMemoryRDMAFeaturesNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceExternalMemoryRDMAFeaturesNV.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-externalMemoryRDMA]] pname:externalMemoryRDMA indicates
-    whether the implementation has support for the
-    ename:VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV memory property and the
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV external memory
-    handle type.
-
-:refpage: VkPhysicalDeviceExternalMemoryRDMAFeaturesNV
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceExternalMemoryRDMAFeaturesNV.txt[]
---
-endif::VK_NV_external_memory_rdma[]
-
-ifdef::VK_KHR_present_id[]
-[open,refpage='VkPhysicalDevicePresentIdFeaturesKHR',desc='Structure indicating support for present id',type='structs']
---
-The sname:VkPhysicalDevicePresentIdFeaturesKHR structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDevicePresentIdFeaturesKHR.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-presentId]] pname:presentId indicates that the implementation
-    supports specifying present ID values in the sname:VkPresentIdKHR
-    extension to the sname:VkPresentInfoKHR struct.
-
-:refpage: VkPhysicalDevicePresentIdFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDevicePresentIdFeaturesKHR.txt[]
---
-endif::VK_KHR_present_id[]
-
-ifdef::VK_KHR_present_wait[]
-[open,refpage='VkPhysicalDevicePresentWaitFeaturesKHR',desc='Structure indicating support for present wait',type='structs']
---
-The sname:VkPhysicalDevicePresentWaitFeaturesKHR structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDevicePresentWaitFeaturesKHR.txt[]
-
-This structure describes the following feature:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-presentWait]] pname:presentWait indicates that the
-    implementation supports fname:vkWaitForPresentKHR.
-
-:refpage: VkPhysicalDevicePresentWaitFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDevicePresentWaitFeaturesKHR.txt[]
---
-endif::VK_KHR_present_wait[]
-
-ifdef::VK_KHR_shader_integer_dot_product[]
-[open,refpage='VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR',desc='Structure describing integer dot product features that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR.txt[]
-
-The members of the sname:VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR
-structure describe the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-shaderIntegerDotProduct]] pname:shaderIntegerDotProduct
-    specifies whether shader modules can: declare the
-    code:DotProductInputAllKHR, code:DotProductInput4x8BitKHR,
-    code:DotProductInput4x8BitPackedKHR and code:DotProductKHR capabilities.
-
-:refpage: VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR.txt[]
---
-endif::VK_KHR_shader_integer_dot_product[]
-
-ifdef::VK_EXT_rgba10x6_formats[]
-[open,refpage='VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT',desc='Structure describing whether rendering to VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 formats can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT.txt[]
-
-The members of the sname:VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT
-structure describe the following features:
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-formatRgba10x6WithoutYCbCrSampler]]
-    pname:formatRgba10x6WithoutYCbCrSampler indicates that
-    ename:VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 can: be used with a
-    sname:VkImageView with pname:subresourceRange.aspectMask equal to
-    ename:VK_IMAGE_ASPECT_COLOR_BIT without a <<samplers-YCbCr-conversion,
-    sampler {YCbCr} conversion>> enabled.
-
-:refpage: VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT.txt[]
---
-endif::VK_EXT_rgba10x6_formats[]
-
-ifdef::VK_KHR_maintenance4[]
-[open,refpage='VkPhysicalDeviceMaintenance4FeaturesKHR',desc='Structure describing whether the implementation supports maintenance4 functionality',type='structs']
---
-The sname:VkPhysicalDeviceMaintenance4FeaturesKHR structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMaintenance4FeaturesKHR.txt[]
-
-This structure describes the following features:
-
-  * [[features-maintenance4]] pname:maintenance4 indicates that the
-    implementation supports the following:
-  ** The application may: destroy a slink:VkPipelineLayout object
-     immediately after using it to create another object.
-  ** code:LocalSizeId can: be used as an alternative to code:LocalSize to
-     specify the local workgroup size with specialization constants.
-  ** Images created with identical creation parameters will always have the
-     same alignment requirements.
-  ** The size memory requirement of a buffer or image is never greater than
-     that of another buffer or image created with a greater or equal size.
-  ** Push constants do not have to be initialized before they are
-     dynamically accessed.
-  ** The interface matching rules allow a larger output vector to match with
-     a smaller input vector, with additional values being discarded.
-
-:refpage: VkPhysicalDeviceMaintenance4FeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceMaintenance4FeaturesKHR.txt[]
---
-endif::VK_KHR_maintenance4[]
-
-ifdef::VK_KHR_dynamic_rendering[]
-[open,refpage='VkPhysicalDeviceDynamicRenderingFeaturesKHR',desc='Structure indicating support for dynamic render pass instances',type='structs']
---
-The sname:VkPhysicalDeviceDynamicRenderingFeaturesKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceDynamicRenderingFeaturesKHR.txt[]
-
-The members of the sname:VkPhysicalDeviceDynamicRenderingFeaturesKHR
-structure describe the following features:
-
-  * [[features-dynamicRendering]] pname:dynamicRendering specifies that the
-    implementation supports dynamic render pass instances using the
-    flink:vkCmdBeginRenderingKHR command.
-
-:refpage: VkPhysicalDeviceDynamicRenderingFeaturesKHR
-include::{chapters}/features.txt[tag=features]
-
-include::{generated}/validity/structs/VkPhysicalDeviceDynamicRenderingFeaturesKHR.txt[]
---
-endif::VK_KHR_dynamic_rendering[]
-
-
-[[features-requirements]]
-== Feature Requirements
-
-All Vulkan graphics implementations must: support the following features:
-
-ifdef::VK_KHR_portability_subset[]
-  * <<features-robustBufferAccess, pname:robustBufferAccess>>, unless the
-    `apiext:VK_KHR_portability_subset` extension is enabled.
-endif::VK_KHR_portability_subset[]
-ifndef::VK_KHR_portability_subset[]
-  * <<features-robustBufferAccess, pname:robustBufferAccess>>
-endif::VK_KHR_portability_subset[]
-ifdef::VK_VERSION_1_1[]
-  * <<features-multiview, pname:multiview>>, if Vulkan 1.1 is supported.
-ifdef::VK_KHR_shader_draw_parameters[]
-  * <<features-shaderDrawParameters,pname:shaderDrawParameters>>, if the
-    `apiext:VK_KHR_shader_draw_parameters` extension is supported.
-endif::VK_KHR_shader_draw_parameters[]
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_2,VK_KHR_uniform_buffer_standard_layout[]
-  * <<features-uniformBufferStandardLayout,pname:uniformBufferStandardLayout>>,
-    if Vulkan 1.2 or the `apiext:VK_KHR_uniform_buffer_standard_layout`
-    extension is supported.
-endif::VK_VERSION_1_2,VK_KHR_uniform_buffer_standard_layout[]
-ifdef::VK_KHR_variable_pointers[]
-  * <<features-variablePointersStorageBuffer,
-    pname:variablePointersStorageBuffer>>, if the
-    `apiext:VK_KHR_variable_pointers` extension is supported.
-endif::VK_KHR_variable_pointers[]
-ifdef::VK_KHR_8bit_storage[]
-  * <<features-storageBuffer8BitAccess, pname:storageBuffer8BitAccess>>, if
-    the `apiext:VK_KHR_8bit_storage` extension is supported.
-endif::VK_KHR_8bit_storage[]
-ifdef::VK_VERSION_1_2,VK_KHR_8bit_storage[]
-  * <<features-storageBuffer8BitAccess, pname:StorageBuffer8BitAccess>>, if
-    <<features-uniformAndStorageBuffer8BitAccess,
-    pname:uniformAndStorageBuffer8BitAccess>> is enabled.
-endif::VK_VERSION_1_2,VK_KHR_8bit_storage[]
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * If
-ifdef::VK_VERSION_1_2[the <<features-descriptorIndexing,descriptorIndexing>> feature is supported, or if]
-    the `apiext:VK_EXT_descriptor_indexing` extension is supported:
-  ** <<features-shaderSampledImageArrayDynamicIndexing,
-     pname:shaderSampledImageArrayDynamicIndexing>>
-  ** <<features-shaderStorageBufferArrayDynamicIndexing,
-     pname:shaderStorageBufferArrayDynamicIndexing>>
-  ** <<features-shaderUniformTexelBufferArrayDynamicIndexing,
-     pname:shaderUniformTexelBufferArrayDynamicIndexing>>
-  ** <<features-shaderStorageTexelBufferArrayDynamicIndexing,
-     pname:shaderStorageTexelBufferArrayDynamicIndexing>>
-  ** <<features-shaderSampledImageArrayNonUniformIndexing,
-     pname:shaderSampledImageArrayNonUniformIndexing>>
-  ** <<features-shaderStorageBufferArrayNonUniformIndexing,
-     pname:shaderStorageBufferArrayNonUniformIndexing>>
-  ** <<features-shaderUniformTexelBufferArrayNonUniformIndexing,
-     pname:shaderUniformTexelBufferArrayNonUniformIndexing>>
-  ** <<features-descriptorBindingSampledImageUpdateAfterBind,
-     pname:descriptorBindingSampledImageUpdateAfterBind>>
-  ** <<features-descriptorBindingStorageImageUpdateAfterBind,
-     pname:descriptorBindingStorageImageUpdateAfterBind>>
-  ** <<features-descriptorBindingStorageBufferUpdateAfterBind,
-     pname:descriptorBindingStorageBufferUpdateAfterBind>> (see also
-     <<limits-robustBufferAccessUpdateAfterBind,
-     pname:robustBufferAccessUpdateAfterBind>>)
-  ** <<features-descriptorBindingUniformTexelBufferUpdateAfterBind,
-     pname:descriptorBindingUniformTexelBufferUpdateAfterBind>> (see also
-     <<limits-robustBufferAccessUpdateAfterBind,
-     pname:robustBufferAccessUpdateAfterBind>>)
-  ** <<features-descriptorBindingStorageTexelBufferUpdateAfterBind,
-     pname:descriptorBindingStorageTexelBufferUpdateAfterBind>> (see also
-     <<limits-robustBufferAccessUpdateAfterBind,
-     pname:robustBufferAccessUpdateAfterBind>>)
-  ** <<features-descriptorBindingUpdateUnusedWhilePending,
-     pname:descriptorBindingUpdateUnusedWhilePending>>
-  ** <<features-descriptorBindingPartiallyBound,
-     pname:descriptorBindingPartiallyBound>>
-  ** <<features-runtimeDescriptorArray, pname:runtimeDescriptorArray>>
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_EXT_inline_uniform_block[]
-  * <<features-inlineUniformBlock,pname:inlineUniformBlock>>, if the
-    `apiext:VK_EXT_inline_uniform_block` extension is supported.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * <<features-descriptorBindingInlineUniformBlockUpdateAfterBind,
-    pname:descriptorBindingInlineUniformBlockUpdateAfterBind>>, if the
-    `apiext:VK_EXT_inline_uniform_block` extension is supported; and if
-ifdef::VK_VERSION_1_2[the <<features-descriptorIndexing,pname:descriptorIndexing>> feature is supported, or]
-    the `apiext:VK_EXT_descriptor_indexing` extension is supported.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-endif::VK_EXT_inline_uniform_block[]
-ifdef::VK_EXT_scalar_block_layout[]
-  * <<features-scalarBlockLayout,pname:scalarBlockLayout>>, if the
-    `apiext:VK_EXT_scalar_block_layout` extension is supported.
-endif::VK_EXT_scalar_block_layout[]
-ifdef::VK_VERSION_1_2[]
-  * <<features-subgroupBroadcastDynamicId,
-    pname:subgroupBroadcastDynamicId>>, if Vulkan 1.2 is supported.
-endif::VK_VERSION_1_2[]
-ifdef::VK_VERSION_1_2+VK_KHR_sampler_mirror_clamp_to_edge[]
-  * <<features-samplerMirrorClampToEdge, pname:samplerMirrorClampToEdge>>,
-    if the `apiext:VK_KHR_sampler_mirror_clamp_to_edge` extension is
-    supported.
-endif::VK_VERSION_1_2+VK_KHR_sampler_mirror_clamp_to_edge[]
-ifdef::VK_VERSION_1_2+VK_KHR_draw_indirect_count[]
-  * <<features-drawIndirectCount, pname:drawIndirectCount>>, if the
-    `apiext:VK_KHR_draw_indirect_count` extension is supported.
-endif::VK_VERSION_1_2+VK_KHR_draw_indirect_count[]
-ifdef::VK_VERSION_1_2+VK_EXT_sampler_filter_minmax[]
-  * <<features-samplerFilterMinmax, pname:samplerFilterMinmax>>, if the
-    `apiext:VK_EXT_sampler_filter_minmax` extension is supported.
-endif::VK_VERSION_1_2+VK_EXT_sampler_filter_minmax[]
-ifdef::VK_VERSION_1_2+VK_EXT_shader_viewport_index_layer[]
-  * <<features-shaderOutputViewportIndex, pname:shaderOutputViewportIndex>>,
-    if the `apiext:VK_EXT_shader_viewport_index_layer` extension is
-    supported.
-  * <<features-shaderOutputLayer, pname:shaderOutputLayer>>, if the
-    `apiext:VK_EXT_shader_viewport_index_layer` extension is supported.
-endif::VK_VERSION_1_2+VK_EXT_shader_viewport_index_layer[]
-ifdef::VK_EXT_subgroup_size_control[]
-  * <<features-subgroupSizeControl, pname:subgroupSizeControl>>, if the
-    `apiext:VK_EXT_subgroup_size_control` extension is supported.
-  * <<features-computeFullSubgroups, pname:computeFullSubgroups>>, if the
-    `apiext:VK_EXT_subgroup_size_control` extension is supported.
-endif::VK_EXT_subgroup_size_control[]
-ifdef::VK_EXT_device_memory_report[]
-  * <<features-deviceMemoryReport, pname:deviceMemoryReport>>, if the
-    `apiext:VK_EXT_device_memory_report` extension is supported.
-endif::VK_EXT_device_memory_report[]
-ifdef::VK_EXT_global_priority_query[]
-  * <<features-globalPriorityQuery, pname:globalPriorityQuery>>, if the
-    `apiext:VK_EXT_global_priority_query` extension is supported.
-endif::VK_EXT_global_priority_query[]
-ifdef::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-  * <<features-imagelessFramebuffer, pname:imagelessFramebuffer>>, if Vulkan
-    1.2 or the `apiext:VK_KHR_imageless_framebuffer` extension is supported.
-endif::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * <<features-separateDepthStencilLayouts,
-    pname:separateDepthStencilLayouts>>, if Vulkan 1.2 or the
-    `apiext:VK_KHR_separate_depth_stencil_layouts` extension is supported.
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-ifdef::VK_VERSION_1_2,VK_EXT_host_query_reset[]
-  * <<features-hostQueryReset, pname:hostQueryReset>>, if Vulkan 1.2 or the
-    `apiext:VK_EXT_host_query_reset` extension is supported.
-endif::VK_VERSION_1_2,VK_EXT_host_query_reset[]
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-  * <<features-timelineSemaphore, pname:timelineSemaphore>>, if Vulkan 1.2
-    or the `apiext:VK_KHR_timeline_semaphore` extension is supported.
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-ifdef::VK_KHR_acceleration_structure[]
-  * If the `apiext:VK_KHR_acceleration_structure` extension is supported:
-  ** <<features-accelerationStructure,pname:accelerationStructure>>
-  ** All the features required by
-ifdef::VK_VERSION_1_2[the <<features-descriptorIndexing,descriptorIndexing>> feature if Vulkan 1.2 is supported, or]
-     the `apiext:VK_EXT_descriptor_indexing` extension.
-  ** <<features-descriptorBindingAccelerationStructureUpdateAfterBind,
-     pname:descriptorBindingAccelerationStructureUpdateAfterBind>>
-  ** <<features-bufferDeviceAddress, pname:bufferDeviceAddress>> from
-ifdef::VK_VERSION_1_2[Vulkan 1.2 or]
-     the `apiext:VK_KHR_buffer_device_address` extension.
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  * If the `apiext:VK_KHR_ray_tracing_pipeline` extension is supported:
-  ** <<features-accelerationStructure,pname:accelerationStructure>> from
-     `apiext:VK_KHR_acceleration_structure`
-  ** <<features-rayTracingPipeline, pname:rayTracingPipeline>>
-  ** <<features-rayTracingPipelineTraceRaysIndirect,
-     pname:rayTracingPipelineTraceRaysIndirect>>
-  ** <<features-rayTraversalPrimitiveCulling,
-     pname:rayTraversalPrimitiveCulling>>, if <<features-rayQuery,
-     pname:rayQuery>> is supported from `apiext:VK_KHR_ray_query`
-  ** the `apiext:VK_KHR_pipeline_library` extension.
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_KHR_ray_query[]
-  * If the `apiext:VK_KHR_ray_query` extension is supported:
-  ** <<features-accelerationStructure,pname:accelerationStructure>> from
-     `apiext:VK_KHR_acceleration_structure`
-  ** <<features-rayQuery, pname:rayQuery>>
-endif::VK_KHR_ray_query[]
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-  * <<features-pipelineCreationCacheControl,
-    pname:pipelineCreationCacheControl>>, if the
-    `apiext:VK_EXT_pipeline_creation_cache_control` extension is supported.
-endif::VK_EXT_pipeline_creation_cache_control[]
-ifdef::VK_VERSION_1_2,VK_KHR_shader_subgroup_extended_types[]
-  * <<features-subgroup-extended-types, pname:shaderSubgroupExtendedTypes>>,
-    if Vulkan 1.2 or the `apiext:VK_KHR_shader_subgroup_extended_types`
-    extension is supported.
-endif::VK_VERSION_1_2,VK_KHR_shader_subgroup_extended_types[]
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-  * <<features-samplerYcbcrConversion, pname:samplerYcbcrConversion>>, if
-    the `apiext:VK_KHR_sampler_ycbcr_conversion` extension is supported.
-endif::VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_KHR_pipeline_executable_properties[]
-  * <<features-pipelineExecutableInfo, pname:pipelineExecutableInfo>>, if
-    the `apiext:VK_KHR_pipeline_executable_properties` extension is
-    supported.
-endif::VK_KHR_pipeline_executable_properties[]
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * <<features-textureCompressionASTC_HDR,
-    pname:textureCompressionASTC_HDR>>, if the
-    `apiext:VK_EXT_texture_compression_astc_hdr` extension is supported.
-endif::VK_EXT_texture_compression_astc_hdr[]
-ifdef::VK_EXT_depth_clip_enable[]
-  * <<features-depthClipEnable, pname:depthClipEnable>>, if the
-    `apiext:VK_EXT_depth_clip_enable` extension is supported.
-endif::VK_EXT_depth_clip_enable[]
-ifdef::VK_EXT_memory_priority[]
-  * <<features-memoryPriority, pname:memoryPriority>>, if the
-    `apiext:VK_EXT_memory_priority` extension is supported.
-endif::VK_EXT_memory_priority[]
-ifdef::VK_EXT_ycbcr_image_arrays[]
-  * <<features-ycbcrImageArrays, pname:ycbcrImageArrays>>, if the
-    `apiext:VK_EXT_ycbcr_image_arrays` extension is supported.
-endif::VK_EXT_ycbcr_image_arrays[]
-ifdef::VK_EXT_index_type_uint8[]
-  * <<features-indexTypeUint8, pname:indexTypeUint8>>, if the
-    `apiext:VK_EXT_index_type_uint8` extension is supported.
-endif::VK_EXT_index_type_uint8[]
-ifdef::VK_EXT_primitive_topology_list_restart[]
-  * <<features-primitiveTopologyListRestart,
-    pname:primitiveTopologyListRestart>>, if the
-    `apiext:VK_EXT_primitive_topology_list_restart` extension is supported.
-endif::VK_EXT_primitive_topology_list_restart[]
-ifdef::VK_EXT_shader_demote_to_helper_invocation[]
-  * <<features-shaderDemoteToHelperInvocation,
-    pname:shaderDemoteToHelperInvocation>>, if the
-    `apiext:VK_EXT_shader_demote_to_helper_invocation` extension is
-    supported.
-endif::VK_EXT_shader_demote_to_helper_invocation[]
-ifdef::VK_EXT_texel_buffer_alignment[]
-  * <<features-texelBufferAlignment, pname:texelBufferAlignment>>, if the
-    `apiext:VK_EXT_texel_buffer_alignment` extension is supported.
-endif::VK_EXT_texel_buffer_alignment[]
-ifdef::VK_KHR_vulkan_memory_model[]
-  * <<features-vulkanMemoryModel, pname:vulkanMemoryModel>>, if the
-    `apiext:VK_KHR_vulkan_memory_model` extension is supported.
-endif::VK_KHR_vulkan_memory_model[]
-ifdef::VK_KHR_buffer_device_address[]
-  * <<features-bufferDeviceAddress, pname:bufferDeviceAddress>>, if the
-    `apiext:VK_KHR_buffer_device_address` extension is supported.
-endif::VK_KHR_buffer_device_address[]
-ifdef::VK_KHR_performance_query[]
-  * <<VkPhysicalDevicePerformanceQueryFeaturesKHR,
-    pname:performanceCounterQueryPools>>, if the
-    `apiext:VK_KHR_performance_query` extension is supported.
-endif::VK_KHR_performance_query[]
-ifdef::VK_EXT_transform_feedback[]
-  * <<features-transformFeedback, pname:transformFeedback>>, if the
-    `apiext:VK_EXT_transform_feedback` extension is supported.
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_EXT_conditional_rendering[]
-  * <<features-conditionalRendering, pname:conditionalRendering>>, if the
-    `apiext:VK_EXT_conditional_rendering` extension is supported.
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_vertex_attribute_divisor[]
-  * <<features-vertexAttributeInstanceRateDivisor,
-    pname:vertexAttributeInstanceRateDivisor>>, if the
-    `apiext:VK_EXT_vertex_attribute_divisor` extension is supported.
-endif::VK_EXT_vertex_attribute_divisor[]
-ifdef::VK_EXT_fragment_density_map[]
-  * <<features-fragmentDensityMap, pname:fragmentDensityMap>>, if the
-    `apiext:VK_EXT_fragment_density_map` extension is supported.
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_KHR_shader_clock[]
-  * <<features-shaderSubgroupClock, pname:shaderSubgroupClock>>, if the
-    `apiext:VK_KHR_shader_clock` extension is supported.
-endif::VK_KHR_shader_clock[]
-ifdef::VK_KHR_shader_atomic_int64[]
-  * <<features-shaderBufferInt64Atomics, pname:shaderBufferInt64Atomics>>,
-    if the `apiext:VK_KHR_shader_atomic_int64` extension is supported.
-endif::VK_KHR_shader_atomic_int64[]
-ifdef::VK_VERSION_1_2,VK_KHR_shader_atomic_int64[]
-  * <<features-shaderInt64, pname:shaderInt64>>, if the
-    <<features-shaderSharedInt64Atomics, pname:shaderSharedInt64Atomics>> or
-    <<features-shaderBufferInt64Atomics, pname:shaderBufferInt64Atomics>>
-    features are supported.
-endif::VK_VERSION_1_2,VK_KHR_shader_atomic_int64[]
-ifdef::VK_KHR_shader_float16_int8[]
-  * <<features-shaderFloat16, pname:shaderFloat16>> or
-    <<features-shaderInt8, pname:shaderInt8>>, if the
-    `apiext:VK_KHR_shader_float16_int8` extension is supported.
-endif::VK_KHR_shader_float16_int8[]
-ifdef::VK_EXT_fragment_shader_interlock[]
-  * <<features-fragmentShaderSampleInterlock,
-    pname:fragmentShaderSampleInterlock>> or
-    <<features-fragmentShaderPixelInterlock,
-    pname:fragmentShaderPixelInterlock>> or
-    <<features-fragmentShaderShadingRateInterlock,
-    pname:fragmentShaderShadingRateInterlock>>, if the
-    `apiext:VK_EXT_fragment_shader_interlock` extension is supported.
-endif::VK_EXT_fragment_shader_interlock[]
-ifdef::VK_EXT_line_rasterization[]
-  * <<features-rectangularLines, pname:rectangularLines>> or
-    <<features-bresenhamLines, pname:bresenhamLines>> or
-    <<features-smoothLines, pname:smoothLines>> or
-    <<features-stippledRectangularLines, pname:stippledRectangularLines>> or
-    <<features-stippledBresenhamLines, pname:stippledBresenhamLines>> or
-    <<features-stippledSmoothLines, pname:stippledSmoothLines>>, if the
-    `apiext:VK_EXT_line_rasterization` extension is supported.
-endif::VK_EXT_line_rasterization[]
-ifdef::VK_KHR_16bit_storage[]
-  * <<features-storageBuffer16BitAccess, pname:storageBuffer16BitAccess>>,
-    if the `apiext:VK_KHR_16bit_storage` extension is supported.
-endif::VK_KHR_16bit_storage[]
-ifdef::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-  * <<features-storageBuffer16BitAccess, pname:storageBuffer16BitAccess>>,
-    if <<features-uniformAndStorageBuffer16BitAccess,
-    pname:uniformAndStorageBuffer16BitAccess>> is enabled.
-endif::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-ifdef::VK_EXT_image_robustness[]
-  * <<features-robustImageAccess, pname:robustImageAccess>>, if the
-    `apiext:VK_EXT_image_robustness` extension is supported.
-endif::VK_EXT_image_robustness[]
-ifdef::VK_EXT_4444_formats[]
-  * <<features-formatA4R4G4B4, pname:formatA4R4G4B4>>, if the
-    `apiext:VK_EXT_4444_formats` extension is supported.
-endif::VK_EXT_4444_formats[]
-ifdef::VK_VALVE_mutable_descriptor_type[]
-  * <<features-mutableDescriptorType, pname:mutableDescriptorType>>, if the
-    `apiext:VK_VALVE_mutable_descriptor_type` extension is supported.
-endif::VK_VALVE_mutable_descriptor_type[]
-ifdef::VK_EXT_shader_image_atomic_int64[]
-  * <<features-shaderInt64, pname:shaderInt64>> and
-    <<features-shaderImageInt64Atomics, pname:shaderImageInt64Atomics>>, if
-    the `apiext:VK_EXT_shader_image_atomic_int64` extension is supported.
-  * <<features-shaderImageInt64Atomics, pname:shaderImageInt64Atomics>>, if
-    the <<features-sparseImageInt64Atomics, pname:sparseImageInt64Atomics>>
-    feature is supported.
-endif::VK_EXT_shader_image_atomic_int64[]
-ifdef::VK_EXT_shader_atomic_float[]
-  * <<features-shaderImageFloat32Atomics, pname:shaderImageFloat32Atomics>>,
-    if the <<features-sparseImageFloat32Atomics,
-    pname:sparseImageFloat32Atomics>> feature is supported.
-  * <<features-shaderImageFloat32AtomicAdd,
-    pname:shaderImageFloat32AtomicAdd>>, if the
-    <<features-sparseImageFloat32AtomicAdd,
-    pname:sparseImageFloat32AtomicAdd>> feature is supported.
-endif::VK_EXT_shader_atomic_float[]
-ifdef::VK_KHR_fragment_shading_rate[]
-  * <<features-pipelineFragmentShadingRate,
-    pname:pipelineFragmentShadingRate>>, if the
-    `apiext:VK_KHR_fragment_shading_rate` extension is supported.
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_KHR_shader_terminate_invocation[]
-  * <<features-shaderTerminateInvocation, pname:shaderTerminateInvocation>>
-    if the `apiext:VK_KHR_shader_terminate_invocation` extension is
-    supported.
-endif::VK_KHR_shader_terminate_invocation[]
-ifdef::VK_KHR_zero_initialize_workgroup_memory[]
-  * <<features-shaderZeroInitializeWorkgroupMemory,
-    pname:shaderZeroInitializeWorkgroupMem>>, if the
-    `apiext:VK_KHR_zero_initialize_workgroup_memory` extension is supported.
-endif::VK_KHR_zero_initialize_workgroup_memory[]
-ifdef::VK_KHR_workgroup_memory_explicit_layout[]
-  * <<features-workgroupMemoryExplicitLayout,
-    pname:workgroupMemoryExplicitLayout>>, if the
-    `apiext:VK_KHR_workgroup_memory_explicit_layout` extension is supported.
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-ifdef::VK_EXT_vertex_input_dynamic_state[]
-  * <<features-vertexInputDynamicState, pname:vertexInputDynamicState>>, if
-    the `apiext:VK_EXT_vertex_input_dynamic_state` extension is supported.
-endif::VK_EXT_vertex_input_dynamic_state[]
-ifdef::VK_KHR_synchronization2[]
-  * <<features-synchronization2, pname:synchronization2>> if the
-    `apiext:VK_KHR_synchronization2` extension is supported.
-endif::VK_KHR_synchronization2[]
-ifdef::VK_EXT_provoking_vertex[]
-  * <<features-provokingVertexLast, pname:provokingVertexLast>>, if the
-    `apiext:VK_EXT_provoking_vertex` extension is supported.
-endif::VK_EXT_provoking_vertex[]
-ifdef::VK_KHR_shader_subgroup_uniform_control_flow[]
-  * <<features-shaderSubgroupUniformControlFlow,
-    pname:shaderSubgroupUniformControlFlow>>, if the
-    `apiext:VK_KHR_shader_subgroup_uniform_control_flow` extension is
-    supported.
-endif::VK_KHR_shader_subgroup_uniform_control_flow[]
-ifdef::VK_EXT_border_color_swizzle[]
-  * <<features-borderColorSwizzle, pname:borderColorSwizzle>> if the
-    apiext:VK_EXT_border_color_swizzle extension is supported.
-endif::VK_EXT_border_color_swizzle[]
-ifdef::VK_EXT_multi_draw[]
-  * <<features-multiDraw, pname:multiDraw>>, if the
-    `apiext:VK_EXT_multi_draw` extension is supported.
-endif::VK_EXT_multi_draw[]
-ifdef::VK_EXT_shader_atomic_float2[]
-  * <<features-shaderImageFloat32AtomicMinMax,
-    pname:shaderImageFloat32AtomicMinMax>>, if the
-    <<features-sparseImageFloat32AtomicMinMax,
-    pname:sparseImageFloat32AtomicMinMax>> feature is supported.
-endif::VK_EXT_shader_atomic_float2[]
-ifdef::VK_KHR_present_id[]
-  * <<features-presentId, pname:presentId>>, if the
-    `apiext:VK_KHR_present_id` extension is supported.
-endif::VK_KHR_present_id[]
-ifdef::VK_KHR_present_wait[]
-  * <<features-presentWait, pname:presentWait>>, if the
-    `apiext:VK_KHR_present_wait` extension is supported.
-endif::VK_KHR_present_wait[]
-ifdef::VK_KHR_shader_integer_dot_product[]
-  * <<features-shaderIntegerDotProduct, pname:shaderIntegerDotProduct>> if
-    the `apiext:VK_KHR_shader_integer_dot_product` extension is supported.
-endif::VK_KHR_shader_integer_dot_product[]
-ifdef::VK_KHR_maintenance4[]
-  * <<features-maintenance4, pname:maintenance4>>, if the
-    `apiext:VK_KHR_maintenance4` extension is supported.
-endif::VK_KHR_maintenance4[]
-
-All other features defined in the Specification are optional:.
diff --git a/registry/vulkan/chapters/formats.txt b/registry/vulkan/chapters/formats.txt
deleted file mode 100644
index 3b3c7a3..0000000
--- a/registry/vulkan/chapters/formats.txt
+++ /dev/null
@@ -1,4008 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[formats]]
-= Formats
-
-Supported buffer and image formats may: vary across implementations.
-A minimum set of format features are guaranteed, but others must: be
-explicitly queried before use to ensure they are supported by the
-implementation.
-
-The features for the set of formats (elink:VkFormat) supported by the
-implementation are queried individually using the
-flink:vkGetPhysicalDeviceFormatProperties command.
-
-
-[[formats-definition]]
-== Format Definition
-
-[open,refpage='VkFormat',desc='Available image formats',type='enums']
---
-The following image formats can: be passed to, and may: be returned from
-Vulkan commands.
-The memory required to store each format is discussed with that format, and
-also summarized in the <<texel-block-size, Representation and Texel Block
-Size>> section and the <<formats-compatibility, Compatible formats>> table.
-
-include::{generated}/api/enums/VkFormat.txt[]
-
-  * ename:VK_FORMAT_UNDEFINED specifies that the format is not specified.
-  * ename:VK_FORMAT_R4G4_UNORM_PACK8 specifies a two-component, 8-bit packed
-    unsigned normalized format that has a 4-bit R component in bits 4..7,
-    and a 4-bit G component in bits 0..3.
-  * ename:VK_FORMAT_R4G4B4A4_UNORM_PACK16 specifies a four-component, 16-bit
-    packed unsigned normalized format that has a 4-bit R component in bits
-    12..15, a 4-bit G component in bits 8..11, a 4-bit B component in bits
-    4..7, and a 4-bit A component in bits 0..3.
-  * ename:VK_FORMAT_B4G4R4A4_UNORM_PACK16 specifies a four-component, 16-bit
-    packed unsigned normalized format that has a 4-bit B component in bits
-    12..15, a 4-bit G component in bits 8..11, a 4-bit R component in bits
-    4..7, and a 4-bit A component in bits 0..3.
-ifdef::VK_EXT_4444_formats[]
-  * ename:VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT specifies a four-component,
-    16-bit packed unsigned normalized format that has a 4-bit A component in
-    bits 12..15, a 4-bit R component in bits 8..11, a 4-bit G component in
-    bits 4..7, and a 4-bit B component in bits 0..3.
-  * ename:VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT specifies a four-component,
-    16-bit packed unsigned normalized format that has a 4-bit A component in
-    bits 12..15, a 4-bit B component in bits 8..11, a 4-bit G component in
-    bits 4..7, and a 4-bit R component in bits 0..3.
-endif::VK_EXT_4444_formats[]
-  * ename:VK_FORMAT_R5G6B5_UNORM_PACK16 specifies a three-component, 16-bit
-    packed unsigned normalized format that has a 5-bit R component in bits
-    11..15, a 6-bit G component in bits 5..10, and a 5-bit B component in
-    bits 0..4.
-  * ename:VK_FORMAT_B5G6R5_UNORM_PACK16 specifies a three-component, 16-bit
-    packed unsigned normalized format that has a 5-bit B component in bits
-    11..15, a 6-bit G component in bits 5..10, and a 5-bit R component in
-    bits 0..4.
-  * ename:VK_FORMAT_R5G5B5A1_UNORM_PACK16 specifies a four-component, 16-bit
-    packed unsigned normalized format that has a 5-bit R component in bits
-    11..15, a 5-bit G component in bits 6..10, a 5-bit B component in bits
-    1..5, and a 1-bit A component in bit 0.
-  * ename:VK_FORMAT_B5G5R5A1_UNORM_PACK16 specifies a four-component, 16-bit
-    packed unsigned normalized format that has a 5-bit B component in bits
-    11..15, a 5-bit G component in bits 6..10, a 5-bit R component in bits
-    1..5, and a 1-bit A component in bit 0.
-  * ename:VK_FORMAT_A1R5G5B5_UNORM_PACK16 specifies a four-component, 16-bit
-    packed unsigned normalized format that has a 1-bit A component in bit
-    15, a 5-bit R component in bits 10..14, a 5-bit G component in bits
-    5..9, and a 5-bit B component in bits 0..4.
-  * ename:VK_FORMAT_R8_UNORM specifies a one-component, 8-bit unsigned
-    normalized format that has a single 8-bit R component.
-  * ename:VK_FORMAT_R8_SNORM specifies a one-component, 8-bit signed
-    normalized format that has a single 8-bit R component.
-  * ename:VK_FORMAT_R8_USCALED specifies a one-component, 8-bit unsigned
-    scaled integer format that has a single 8-bit R component.
-  * ename:VK_FORMAT_R8_SSCALED specifies a one-component, 8-bit signed
-    scaled integer format that has a single 8-bit R component.
-  * ename:VK_FORMAT_R8_UINT specifies a one-component, 8-bit unsigned
-    integer format that has a single 8-bit R component.
-  * ename:VK_FORMAT_R8_SINT specifies a one-component, 8-bit signed integer
-    format that has a single 8-bit R component.
-  * ename:VK_FORMAT_R8_SRGB specifies a one-component, 8-bit unsigned
-    normalized format that has a single 8-bit R component stored with sRGB
-    nonlinear encoding.
-  * ename:VK_FORMAT_R8G8_UNORM specifies a two-component, 16-bit unsigned
-    normalized format that has an 8-bit R component in byte 0, and an 8-bit
-    G component in byte 1.
-  * ename:VK_FORMAT_R8G8_SNORM specifies a two-component, 16-bit signed
-    normalized format that has an 8-bit R component in byte 0, and an 8-bit
-    G component in byte 1.
-  * ename:VK_FORMAT_R8G8_USCALED specifies a two-component, 16-bit unsigned
-    scaled integer format that has an 8-bit R component in byte 0, and an
-    8-bit G component in byte 1.
-  * ename:VK_FORMAT_R8G8_SSCALED specifies a two-component, 16-bit signed
-    scaled integer format that has an 8-bit R component in byte 0, and an
-    8-bit G component in byte 1.
-  * ename:VK_FORMAT_R8G8_UINT specifies a two-component, 16-bit unsigned
-    integer format that has an 8-bit R component in byte 0, and an 8-bit G
-    component in byte 1.
-  * ename:VK_FORMAT_R8G8_SINT specifies a two-component, 16-bit signed
-    integer format that has an 8-bit R component in byte 0, and an 8-bit G
-    component in byte 1.
-  * ename:VK_FORMAT_R8G8_SRGB specifies a two-component, 16-bit unsigned
-    normalized format that has an 8-bit R component stored with sRGB
-    nonlinear encoding in byte 0, and an 8-bit G component stored with sRGB
-    nonlinear encoding in byte 1.
-  * ename:VK_FORMAT_R8G8B8_UNORM specifies a three-component, 24-bit
-    unsigned normalized format that has an 8-bit R component in byte 0, an
-    8-bit G component in byte 1, and an 8-bit B component in byte 2.
-  * ename:VK_FORMAT_R8G8B8_SNORM specifies a three-component, 24-bit signed
-    normalized format that has an 8-bit R component in byte 0, an 8-bit G
-    component in byte 1, and an 8-bit B component in byte 2.
-  * ename:VK_FORMAT_R8G8B8_USCALED specifies a three-component, 24-bit
-    unsigned scaled format that has an 8-bit R component in byte 0, an 8-bit
-    G component in byte 1, and an 8-bit B component in byte 2.
-  * ename:VK_FORMAT_R8G8B8_SSCALED specifies a three-component, 24-bit
-    signed scaled format that has an 8-bit R component in byte 0, an 8-bit G
-    component in byte 1, and an 8-bit B component in byte 2.
-  * ename:VK_FORMAT_R8G8B8_UINT specifies a three-component, 24-bit unsigned
-    integer format that has an 8-bit R component in byte 0, an 8-bit G
-    component in byte 1, and an 8-bit B component in byte 2.
-  * ename:VK_FORMAT_R8G8B8_SINT specifies a three-component, 24-bit signed
-    integer format that has an 8-bit R component in byte 0, an 8-bit G
-    component in byte 1, and an 8-bit B component in byte 2.
-  * ename:VK_FORMAT_R8G8B8_SRGB specifies a three-component, 24-bit unsigned
-    normalized format that has an 8-bit R component stored with sRGB
-    nonlinear encoding in byte 0, an 8-bit G component stored with sRGB
-    nonlinear encoding in byte 1, and an 8-bit B component stored with sRGB
-    nonlinear encoding in byte 2.
-  * ename:VK_FORMAT_B8G8R8_UNORM specifies a three-component, 24-bit
-    unsigned normalized format that has an 8-bit B component in byte 0, an
-    8-bit G component in byte 1, and an 8-bit R component in byte 2.
-  * ename:VK_FORMAT_B8G8R8_SNORM specifies a three-component, 24-bit signed
-    normalized format that has an 8-bit B component in byte 0, an 8-bit G
-    component in byte 1, and an 8-bit R component in byte 2.
-  * ename:VK_FORMAT_B8G8R8_USCALED specifies a three-component, 24-bit
-    unsigned scaled format that has an 8-bit B component in byte 0, an 8-bit
-    G component in byte 1, and an 8-bit R component in byte 2.
-  * ename:VK_FORMAT_B8G8R8_SSCALED specifies a three-component, 24-bit
-    signed scaled format that has an 8-bit B component in byte 0, an 8-bit G
-    component in byte 1, and an 8-bit R component in byte 2.
-  * ename:VK_FORMAT_B8G8R8_UINT specifies a three-component, 24-bit unsigned
-    integer format that has an 8-bit B component in byte 0, an 8-bit G
-    component in byte 1, and an 8-bit R component in byte 2.
-  * ename:VK_FORMAT_B8G8R8_SINT specifies a three-component, 24-bit signed
-    integer format that has an 8-bit B component in byte 0, an 8-bit G
-    component in byte 1, and an 8-bit R component in byte 2.
-  * ename:VK_FORMAT_B8G8R8_SRGB specifies a three-component, 24-bit unsigned
-    normalized format that has an 8-bit B component stored with sRGB
-    nonlinear encoding in byte 0, an 8-bit G component stored with sRGB
-    nonlinear encoding in byte 1, and an 8-bit R component stored with sRGB
-    nonlinear encoding in byte 2.
-  * ename:VK_FORMAT_R8G8B8A8_UNORM specifies a four-component, 32-bit
-    unsigned normalized format that has an 8-bit R component in byte 0, an
-    8-bit G component in byte 1, an 8-bit B component in byte 2, and an
-    8-bit A component in byte 3.
-  * ename:VK_FORMAT_R8G8B8A8_SNORM specifies a four-component, 32-bit signed
-    normalized format that has an 8-bit R component in byte 0, an 8-bit G
-    component in byte 1, an 8-bit B component in byte 2, and an 8-bit A
-    component in byte 3.
-  * ename:VK_FORMAT_R8G8B8A8_USCALED specifies a four-component, 32-bit
-    unsigned scaled format that has an 8-bit R component in byte 0, an 8-bit
-    G component in byte 1, an 8-bit B component in byte 2, and an 8-bit A
-    component in byte 3.
-  * ename:VK_FORMAT_R8G8B8A8_SSCALED specifies a four-component, 32-bit
-    signed scaled format that has an 8-bit R component in byte 0, an 8-bit G
-    component in byte 1, an 8-bit B component in byte 2, and an 8-bit A
-    component in byte 3.
-  * ename:VK_FORMAT_R8G8B8A8_UINT specifies a four-component, 32-bit
-    unsigned integer format that has an 8-bit R component in byte 0, an
-    8-bit G component in byte 1, an 8-bit B component in byte 2, and an
-    8-bit A component in byte 3.
-  * ename:VK_FORMAT_R8G8B8A8_SINT specifies a four-component, 32-bit signed
-    integer format that has an 8-bit R component in byte 0, an 8-bit G
-    component in byte 1, an 8-bit B component in byte 2, and an 8-bit A
-    component in byte 3.
-  * ename:VK_FORMAT_R8G8B8A8_SRGB specifies a four-component, 32-bit
-    unsigned normalized format that has an 8-bit R component stored with
-    sRGB nonlinear encoding in byte 0, an 8-bit G component stored with sRGB
-    nonlinear encoding in byte 1, an 8-bit B component stored with sRGB
-    nonlinear encoding in byte 2, and an 8-bit A component in byte 3.
-  * ename:VK_FORMAT_B8G8R8A8_UNORM specifies a four-component, 32-bit
-    unsigned normalized format that has an 8-bit B component in byte 0, an
-    8-bit G component in byte 1, an 8-bit R component in byte 2, and an
-    8-bit A component in byte 3.
-  * ename:VK_FORMAT_B8G8R8A8_SNORM specifies a four-component, 32-bit signed
-    normalized format that has an 8-bit B component in byte 0, an 8-bit G
-    component in byte 1, an 8-bit R component in byte 2, and an 8-bit A
-    component in byte 3.
-  * ename:VK_FORMAT_B8G8R8A8_USCALED specifies a four-component, 32-bit
-    unsigned scaled format that has an 8-bit B component in byte 0, an 8-bit
-    G component in byte 1, an 8-bit R component in byte 2, and an 8-bit A
-    component in byte 3.
-  * ename:VK_FORMAT_B8G8R8A8_SSCALED specifies a four-component, 32-bit
-    signed scaled format that has an 8-bit B component in byte 0, an 8-bit G
-    component in byte 1, an 8-bit R component in byte 2, and an 8-bit A
-    component in byte 3.
-  * ename:VK_FORMAT_B8G8R8A8_UINT specifies a four-component, 32-bit
-    unsigned integer format that has an 8-bit B component in byte 0, an
-    8-bit G component in byte 1, an 8-bit R component in byte 2, and an
-    8-bit A component in byte 3.
-  * ename:VK_FORMAT_B8G8R8A8_SINT specifies a four-component, 32-bit signed
-    integer format that has an 8-bit B component in byte 0, an 8-bit G
-    component in byte 1, an 8-bit R component in byte 2, and an 8-bit A
-    component in byte 3.
-  * ename:VK_FORMAT_B8G8R8A8_SRGB specifies a four-component, 32-bit
-    unsigned normalized format that has an 8-bit B component stored with
-    sRGB nonlinear encoding in byte 0, an 8-bit G component stored with sRGB
-    nonlinear encoding in byte 1, an 8-bit R component stored with sRGB
-    nonlinear encoding in byte 2, and an 8-bit A component in byte 3.
-  * ename:VK_FORMAT_A8B8G8R8_UNORM_PACK32 specifies a four-component, 32-bit
-    packed unsigned normalized format that has an 8-bit A component in bits
-    24..31, an 8-bit B component in bits 16..23, an 8-bit G component in
-    bits 8..15, and an 8-bit R component in bits 0..7.
-  * ename:VK_FORMAT_A8B8G8R8_SNORM_PACK32 specifies a four-component, 32-bit
-    packed signed normalized format that has an 8-bit A component in bits
-    24..31, an 8-bit B component in bits 16..23, an 8-bit G component in
-    bits 8..15, and an 8-bit R component in bits 0..7.
-  * ename:VK_FORMAT_A8B8G8R8_USCALED_PACK32 specifies a four-component,
-    32-bit packed unsigned scaled integer format that has an 8-bit A
-    component in bits 24..31, an 8-bit B component in bits 16..23, an 8-bit
-    G component in bits 8..15, and an 8-bit R component in bits 0..7.
-  * ename:VK_FORMAT_A8B8G8R8_SSCALED_PACK32 specifies a four-component,
-    32-bit packed signed scaled integer format that has an 8-bit A component
-    in bits 24..31, an 8-bit B component in bits 16..23, an 8-bit G
-    component in bits 8..15, and an 8-bit R component in bits 0..7.
-  * ename:VK_FORMAT_A8B8G8R8_UINT_PACK32 specifies a four-component, 32-bit
-    packed unsigned integer format that has an 8-bit A component in bits
-    24..31, an 8-bit B component in bits 16..23, an 8-bit G component in
-    bits 8..15, and an 8-bit R component in bits 0..7.
-  * ename:VK_FORMAT_A8B8G8R8_SINT_PACK32 specifies a four-component, 32-bit
-    packed signed integer format that has an 8-bit A component in bits
-    24..31, an 8-bit B component in bits 16..23, an 8-bit G component in
-    bits 8..15, and an 8-bit R component in bits 0..7.
-  * ename:VK_FORMAT_A8B8G8R8_SRGB_PACK32 specifies a four-component, 32-bit
-    packed unsigned normalized format that has an 8-bit A component in bits
-    24..31, an 8-bit B component stored with sRGB nonlinear encoding in bits
-    16..23, an 8-bit G component stored with sRGB nonlinear encoding in bits
-    8..15, and an 8-bit R component stored with sRGB nonlinear encoding in
-    bits 0..7.
-  * ename:VK_FORMAT_A2R10G10B10_UNORM_PACK32 specifies a four-component,
-    32-bit packed unsigned normalized format that has a 2-bit A component in
-    bits 30..31, a 10-bit R component in bits 20..29, a 10-bit G component
-    in bits 10..19, and a 10-bit B component in bits 0..9.
-  * ename:VK_FORMAT_A2R10G10B10_SNORM_PACK32 specifies a four-component,
-    32-bit packed signed normalized format that has a 2-bit A component in
-    bits 30..31, a 10-bit R component in bits 20..29, a 10-bit G component
-    in bits 10..19, and a 10-bit B component in bits 0..9.
-  * ename:VK_FORMAT_A2R10G10B10_USCALED_PACK32 specifies a four-component,
-    32-bit packed unsigned scaled integer format that has a 2-bit A
-    component in bits 30..31, a 10-bit R component in bits 20..29, a 10-bit
-    G component in bits 10..19, and a 10-bit B component in bits 0..9.
-  * ename:VK_FORMAT_A2R10G10B10_SSCALED_PACK32 specifies a four-component,
-    32-bit packed signed scaled integer format that has a 2-bit A component
-    in bits 30..31, a 10-bit R component in bits 20..29, a 10-bit G
-    component in bits 10..19, and a 10-bit B component in bits 0..9.
-  * ename:VK_FORMAT_A2R10G10B10_UINT_PACK32 specifies a four-component,
-    32-bit packed unsigned integer format that has a 2-bit A component in
-    bits 30..31, a 10-bit R component in bits 20..29, a 10-bit G component
-    in bits 10..19, and a 10-bit B component in bits 0..9.
-  * ename:VK_FORMAT_A2R10G10B10_SINT_PACK32 specifies a four-component,
-    32-bit packed signed integer format that has a 2-bit A component in bits
-    30..31, a 10-bit R component in bits 20..29, a 10-bit G component in
-    bits 10..19, and a 10-bit B component in bits 0..9.
-  * ename:VK_FORMAT_A2B10G10R10_UNORM_PACK32 specifies a four-component,
-    32-bit packed unsigned normalized format that has a 2-bit A component in
-    bits 30..31, a 10-bit B component in bits 20..29, a 10-bit G component
-    in bits 10..19, and a 10-bit R component in bits 0..9.
-  * ename:VK_FORMAT_A2B10G10R10_SNORM_PACK32 specifies a four-component,
-    32-bit packed signed normalized format that has a 2-bit A component in
-    bits 30..31, a 10-bit B component in bits 20..29, a 10-bit G component
-    in bits 10..19, and a 10-bit R component in bits 0..9.
-  * ename:VK_FORMAT_A2B10G10R10_USCALED_PACK32 specifies a four-component,
-    32-bit packed unsigned scaled integer format that has a 2-bit A
-    component in bits 30..31, a 10-bit B component in bits 20..29, a 10-bit
-    G component in bits 10..19, and a 10-bit R component in bits 0..9.
-  * ename:VK_FORMAT_A2B10G10R10_SSCALED_PACK32 specifies a four-component,
-    32-bit packed signed scaled integer format that has a 2-bit A component
-    in bits 30..31, a 10-bit B component in bits 20..29, a 10-bit G
-    component in bits 10..19, and a 10-bit R component in bits 0..9.
-  * ename:VK_FORMAT_A2B10G10R10_UINT_PACK32 specifies a four-component,
-    32-bit packed unsigned integer format that has a 2-bit A component in
-    bits 30..31, a 10-bit B component in bits 20..29, a 10-bit G component
-    in bits 10..19, and a 10-bit R component in bits 0..9.
-  * ename:VK_FORMAT_A2B10G10R10_SINT_PACK32 specifies a four-component,
-    32-bit packed signed integer format that has a 2-bit A component in bits
-    30..31, a 10-bit B component in bits 20..29, a 10-bit G component in
-    bits 10..19, and a 10-bit R component in bits 0..9.
-  * ename:VK_FORMAT_R16_UNORM specifies a one-component, 16-bit unsigned
-    normalized format that has a single 16-bit R component.
-  * ename:VK_FORMAT_R16_SNORM specifies a one-component, 16-bit signed
-    normalized format that has a single 16-bit R component.
-  * ename:VK_FORMAT_R16_USCALED specifies a one-component, 16-bit unsigned
-    scaled integer format that has a single 16-bit R component.
-  * ename:VK_FORMAT_R16_SSCALED specifies a one-component, 16-bit signed
-    scaled integer format that has a single 16-bit R component.
-  * ename:VK_FORMAT_R16_UINT specifies a one-component, 16-bit unsigned
-    integer format that has a single 16-bit R component.
-  * ename:VK_FORMAT_R16_SINT specifies a one-component, 16-bit signed
-    integer format that has a single 16-bit R component.
-  * ename:VK_FORMAT_R16_SFLOAT specifies a one-component, 16-bit signed
-    floating-point format that has a single 16-bit R component.
-  * ename:VK_FORMAT_R16G16_UNORM specifies a two-component, 32-bit unsigned
-    normalized format that has a 16-bit R component in bytes 0..1, and a
-    16-bit G component in bytes 2..3.
-  * ename:VK_FORMAT_R16G16_SNORM specifies a two-component, 32-bit signed
-    normalized format that has a 16-bit R component in bytes 0..1, and a
-    16-bit G component in bytes 2..3.
-  * ename:VK_FORMAT_R16G16_USCALED specifies a two-component, 32-bit
-    unsigned scaled integer format that has a 16-bit R component in bytes
-    0..1, and a 16-bit G component in bytes 2..3.
-  * ename:VK_FORMAT_R16G16_SSCALED specifies a two-component, 32-bit signed
-    scaled integer format that has a 16-bit R component in bytes 0..1, and a
-    16-bit G component in bytes 2..3.
-  * ename:VK_FORMAT_R16G16_UINT specifies a two-component, 32-bit unsigned
-    integer format that has a 16-bit R component in bytes 0..1, and a 16-bit
-    G component in bytes 2..3.
-  * ename:VK_FORMAT_R16G16_SINT specifies a two-component, 32-bit signed
-    integer format that has a 16-bit R component in bytes 0..1, and a 16-bit
-    G component in bytes 2..3.
-  * ename:VK_FORMAT_R16G16_SFLOAT specifies a two-component, 32-bit signed
-    floating-point format that has a 16-bit R component in bytes 0..1, and a
-    16-bit G component in bytes 2..3.
-  * ename:VK_FORMAT_R16G16B16_UNORM specifies a three-component, 48-bit
-    unsigned normalized format that has a 16-bit R component in bytes 0..1,
-    a 16-bit G component in bytes 2..3, and a 16-bit B component in bytes
-    4..5.
-  * ename:VK_FORMAT_R16G16B16_SNORM specifies a three-component, 48-bit
-    signed normalized format that has a 16-bit R component in bytes 0..1, a
-    16-bit G component in bytes 2..3, and a 16-bit B component in bytes
-    4..5.
-  * ename:VK_FORMAT_R16G16B16_USCALED specifies a three-component, 48-bit
-    unsigned scaled integer format that has a 16-bit R component in bytes
-    0..1, a 16-bit G component in bytes 2..3, and a 16-bit B component in
-    bytes 4..5.
-  * ename:VK_FORMAT_R16G16B16_SSCALED specifies a three-component, 48-bit
-    signed scaled integer format that has a 16-bit R component in bytes
-    0..1, a 16-bit G component in bytes 2..3, and a 16-bit B component in
-    bytes 4..5.
-  * ename:VK_FORMAT_R16G16B16_UINT specifies a three-component, 48-bit
-    unsigned integer format that has a 16-bit R component in bytes 0..1, a
-    16-bit G component in bytes 2..3, and a 16-bit B component in bytes
-    4..5.
-  * ename:VK_FORMAT_R16G16B16_SINT specifies a three-component, 48-bit
-    signed integer format that has a 16-bit R component in bytes 0..1, a
-    16-bit G component in bytes 2..3, and a 16-bit B component in bytes
-    4..5.
-  * ename:VK_FORMAT_R16G16B16_SFLOAT specifies a three-component, 48-bit
-    signed floating-point format that has a 16-bit R component in bytes
-    0..1, a 16-bit G component in bytes 2..3, and a 16-bit B component in
-    bytes 4..5.
-  * ename:VK_FORMAT_R16G16B16A16_UNORM specifies a four-component, 64-bit
-    unsigned normalized format that has a 16-bit R component in bytes 0..1,
-    a 16-bit G component in bytes 2..3, a 16-bit B component in bytes 4..5,
-    and a 16-bit A component in bytes 6..7.
-  * ename:VK_FORMAT_R16G16B16A16_SNORM specifies a four-component, 64-bit
-    signed normalized format that has a 16-bit R component in bytes 0..1, a
-    16-bit G component in bytes 2..3, a 16-bit B component in bytes 4..5,
-    and a 16-bit A component in bytes 6..7.
-  * ename:VK_FORMAT_R16G16B16A16_USCALED specifies a four-component, 64-bit
-    unsigned scaled integer format that has a 16-bit R component in bytes
-    0..1, a 16-bit G component in bytes 2..3, a 16-bit B component in bytes
-    4..5, and a 16-bit A component in bytes 6..7.
-  * ename:VK_FORMAT_R16G16B16A16_SSCALED specifies a four-component, 64-bit
-    signed scaled integer format that has a 16-bit R component in bytes
-    0..1, a 16-bit G component in bytes 2..3, a 16-bit B component in bytes
-    4..5, and a 16-bit A component in bytes 6..7.
-  * ename:VK_FORMAT_R16G16B16A16_UINT specifies a four-component, 64-bit
-    unsigned integer format that has a 16-bit R component in bytes 0..1, a
-    16-bit G component in bytes 2..3, a 16-bit B component in bytes 4..5,
-    and a 16-bit A component in bytes 6..7.
-  * ename:VK_FORMAT_R16G16B16A16_SINT specifies a four-component, 64-bit
-    signed integer format that has a 16-bit R component in bytes 0..1, a
-    16-bit G component in bytes 2..3, a 16-bit B component in bytes 4..5,
-    and a 16-bit A component in bytes 6..7.
-  * ename:VK_FORMAT_R16G16B16A16_SFLOAT specifies a four-component, 64-bit
-    signed floating-point format that has a 16-bit R component in bytes
-    0..1, a 16-bit G component in bytes 2..3, a 16-bit B component in bytes
-    4..5, and a 16-bit A component in bytes 6..7.
-  * ename:VK_FORMAT_R32_UINT specifies a one-component, 32-bit unsigned
-    integer format that has a single 32-bit R component.
-  * ename:VK_FORMAT_R32_SINT specifies a one-component, 32-bit signed
-    integer format that has a single 32-bit R component.
-  * ename:VK_FORMAT_R32_SFLOAT specifies a one-component, 32-bit signed
-    floating-point format that has a single 32-bit R component.
-  * ename:VK_FORMAT_R32G32_UINT specifies a two-component, 64-bit unsigned
-    integer format that has a 32-bit R component in bytes 0..3, and a 32-bit
-    G component in bytes 4..7.
-  * ename:VK_FORMAT_R32G32_SINT specifies a two-component, 64-bit signed
-    integer format that has a 32-bit R component in bytes 0..3, and a 32-bit
-    G component in bytes 4..7.
-  * ename:VK_FORMAT_R32G32_SFLOAT specifies a two-component, 64-bit signed
-    floating-point format that has a 32-bit R component in bytes 0..3, and a
-    32-bit G component in bytes 4..7.
-  * ename:VK_FORMAT_R32G32B32_UINT specifies a three-component, 96-bit
-    unsigned integer format that has a 32-bit R component in bytes 0..3, a
-    32-bit G component in bytes 4..7, and a 32-bit B component in bytes
-    8..11.
-  * ename:VK_FORMAT_R32G32B32_SINT specifies a three-component, 96-bit
-    signed integer format that has a 32-bit R component in bytes 0..3, a
-    32-bit G component in bytes 4..7, and a 32-bit B component in bytes
-    8..11.
-  * ename:VK_FORMAT_R32G32B32_SFLOAT specifies a three-component, 96-bit
-    signed floating-point format that has a 32-bit R component in bytes
-    0..3, a 32-bit G component in bytes 4..7, and a 32-bit B component in
-    bytes 8..11.
-  * ename:VK_FORMAT_R32G32B32A32_UINT specifies a four-component, 128-bit
-    unsigned integer format that has a 32-bit R component in bytes 0..3, a
-    32-bit G component in bytes 4..7, a 32-bit B component in bytes 8..11,
-    and a 32-bit A component in bytes 12..15.
-  * ename:VK_FORMAT_R32G32B32A32_SINT specifies a four-component, 128-bit
-    signed integer format that has a 32-bit R component in bytes 0..3, a
-    32-bit G component in bytes 4..7, a 32-bit B component in bytes 8..11,
-    and a 32-bit A component in bytes 12..15.
-  * ename:VK_FORMAT_R32G32B32A32_SFLOAT specifies a four-component, 128-bit
-    signed floating-point format that has a 32-bit R component in bytes
-    0..3, a 32-bit G component in bytes 4..7, a 32-bit B component in bytes
-    8..11, and a 32-bit A component in bytes 12..15.
-  * ename:VK_FORMAT_R64_UINT specifies a one-component, 64-bit unsigned
-    integer format that has a single 64-bit R component.
-  * ename:VK_FORMAT_R64_SINT specifies a one-component, 64-bit signed
-    integer format that has a single 64-bit R component.
-  * ename:VK_FORMAT_R64_SFLOAT specifies a one-component, 64-bit signed
-    floating-point format that has a single 64-bit R component.
-  * ename:VK_FORMAT_R64G64_UINT specifies a two-component, 128-bit unsigned
-    integer format that has a 64-bit R component in bytes 0..7, and a 64-bit
-    G component in bytes 8..15.
-  * ename:VK_FORMAT_R64G64_SINT specifies a two-component, 128-bit signed
-    integer format that has a 64-bit R component in bytes 0..7, and a 64-bit
-    G component in bytes 8..15.
-  * ename:VK_FORMAT_R64G64_SFLOAT specifies a two-component, 128-bit signed
-    floating-point format that has a 64-bit R component in bytes 0..7, and a
-    64-bit G component in bytes 8..15.
-  * ename:VK_FORMAT_R64G64B64_UINT specifies a three-component, 192-bit
-    unsigned integer format that has a 64-bit R component in bytes 0..7, a
-    64-bit G component in bytes 8..15, and a 64-bit B component in bytes
-    16..23.
-  * ename:VK_FORMAT_R64G64B64_SINT specifies a three-component, 192-bit
-    signed integer format that has a 64-bit R component in bytes 0..7, a
-    64-bit G component in bytes 8..15, and a 64-bit B component in bytes
-    16..23.
-  * ename:VK_FORMAT_R64G64B64_SFLOAT specifies a three-component, 192-bit
-    signed floating-point format that has a 64-bit R component in bytes
-    0..7, a 64-bit G component in bytes 8..15, and a 64-bit B component in
-    bytes 16..23.
-  * ename:VK_FORMAT_R64G64B64A64_UINT specifies a four-component, 256-bit
-    unsigned integer format that has a 64-bit R component in bytes 0..7, a
-    64-bit G component in bytes 8..15, a 64-bit B component in bytes 16..23,
-    and a 64-bit A component in bytes 24..31.
-  * ename:VK_FORMAT_R64G64B64A64_SINT specifies a four-component, 256-bit
-    signed integer format that has a 64-bit R component in bytes 0..7, a
-    64-bit G component in bytes 8..15, a 64-bit B component in bytes 16..23,
-    and a 64-bit A component in bytes 24..31.
-  * ename:VK_FORMAT_R64G64B64A64_SFLOAT specifies a four-component, 256-bit
-    signed floating-point format that has a 64-bit R component in bytes
-    0..7, a 64-bit G component in bytes 8..15, a 64-bit B component in bytes
-    16..23, and a 64-bit A component in bytes 24..31.
-  * ename:VK_FORMAT_B10G11R11_UFLOAT_PACK32 specifies a three-component,
-    32-bit packed unsigned floating-point format that has a 10-bit B
-    component in bits 22..31, an 11-bit G component in bits 11..21, an
-    11-bit R component in bits 0..10.
-    See <<fundamentals-fp10>> and <<fundamentals-fp11>>.
-  * ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 specifies a three-component,
-    32-bit packed unsigned floating-point format that has a 5-bit shared
-    exponent in bits 27..31, a 9-bit B component mantissa in bits 18..26, a
-    9-bit G component mantissa in bits 9..17, and a 9-bit R component
-    mantissa in bits 0..8.
-  * ename:VK_FORMAT_D16_UNORM specifies a one-component, 16-bit unsigned
-    normalized format that has a single 16-bit depth component.
-  * ename:VK_FORMAT_X8_D24_UNORM_PACK32 specifies a two-component, 32-bit
-    format that has 24 unsigned normalized bits in the depth component and,
-    optionally:, 8 bits that are unused.
-  * ename:VK_FORMAT_D32_SFLOAT specifies a one-component, 32-bit signed
-    floating-point format that has 32 bits in the depth component.
-  * ename:VK_FORMAT_S8_UINT specifies a one-component, 8-bit unsigned
-    integer format that has 8 bits in the stencil component.
-  * ename:VK_FORMAT_D16_UNORM_S8_UINT specifies a two-component, 24-bit
-    format that has 16 unsigned normalized bits in the depth component and 8
-    unsigned integer bits in the stencil component.
-  * ename:VK_FORMAT_D24_UNORM_S8_UINT specifies a two-component, 32-bit
-    packed format that has 8 unsigned integer bits in the stencil component,
-    and 24 unsigned normalized bits in the depth component.
-  * ename:VK_FORMAT_D32_SFLOAT_S8_UINT specifies a two-component format that
-    has 32 signed float bits in the depth component and 8 unsigned integer
-    bits in the stencil component.
-    There are optionally: 24 bits that are unused.
-  * ename:VK_FORMAT_BC1_RGB_UNORM_BLOCK specifies a three-component,
-    block-compressed format where each 64-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized RGB texel data.
-    This format has no alpha and is considered opaque.
-  * ename:VK_FORMAT_BC1_RGB_SRGB_BLOCK specifies a three-component,
-    block-compressed format where each 64-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized RGB texel data with sRGB
-    nonlinear encoding.
-    This format has no alpha and is considered opaque.
-  * ename:VK_FORMAT_BC1_RGBA_UNORM_BLOCK specifies a four-component,
-    block-compressed format where each 64-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized RGB texel data, and
-    provides 1 bit of alpha.
-  * ename:VK_FORMAT_BC1_RGBA_SRGB_BLOCK specifies a four-component,
-    block-compressed format where each 64-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized RGB texel data with sRGB
-    nonlinear encoding, and provides 1 bit of alpha.
-  * ename:VK_FORMAT_BC2_UNORM_BLOCK specifies a four-component,
-    block-compressed format where each 128-bit compressed texel block
-    encodes a 4{times}4 rectangle of unsigned normalized RGBA texel data
-    with the first 64 bits encoding alpha values followed by 64 bits
-    encoding RGB values.
-  * ename:VK_FORMAT_BC2_SRGB_BLOCK specifies a four-component,
-    block-compressed format where each 128-bit compressed texel block
-    encodes a 4{times}4 rectangle of unsigned normalized RGBA texel data
-    with the first 64 bits encoding alpha values followed by 64 bits
-    encoding RGB values with sRGB nonlinear encoding.
-  * ename:VK_FORMAT_BC3_UNORM_BLOCK specifies a four-component,
-    block-compressed format where each 128-bit compressed texel block
-    encodes a 4{times}4 rectangle of unsigned normalized RGBA texel data
-    with the first 64 bits encoding alpha values followed by 64 bits
-    encoding RGB values.
-  * ename:VK_FORMAT_BC3_SRGB_BLOCK specifies a four-component,
-    block-compressed format where each 128-bit compressed texel block
-    encodes a 4{times}4 rectangle of unsigned normalized RGBA texel data
-    with the first 64 bits encoding alpha values followed by 64 bits
-    encoding RGB values with sRGB nonlinear encoding.
-  * ename:VK_FORMAT_BC4_UNORM_BLOCK specifies a one-component,
-    block-compressed format where each 64-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized red texel data.
-  * ename:VK_FORMAT_BC4_SNORM_BLOCK specifies a one-component,
-    block-compressed format where each 64-bit compressed texel block encodes
-    a 4{times}4 rectangle of signed normalized red texel data.
-  * ename:VK_FORMAT_BC5_UNORM_BLOCK specifies a two-component,
-    block-compressed format where each 128-bit compressed texel block
-    encodes a 4{times}4 rectangle of unsigned normalized RG texel data with
-    the first 64 bits encoding red values followed by 64 bits encoding green
-    values.
-  * ename:VK_FORMAT_BC5_SNORM_BLOCK specifies a two-component,
-    block-compressed format where each 128-bit compressed texel block
-    encodes a 4{times}4 rectangle of signed normalized RG texel data with
-    the first 64 bits encoding red values followed by 64 bits encoding green
-    values.
-  * ename:VK_FORMAT_BC6H_UFLOAT_BLOCK specifies a three-component,
-    block-compressed format where each 128-bit compressed texel block
-    encodes a 4{times}4 rectangle of unsigned floating-point RGB texel data.
-  * ename:VK_FORMAT_BC6H_SFLOAT_BLOCK specifies a three-component,
-    block-compressed format where each 128-bit compressed texel block
-    encodes a 4{times}4 rectangle of signed floating-point RGB texel data.
-  * ename:VK_FORMAT_BC7_UNORM_BLOCK specifies a four-component,
-    block-compressed format where each 128-bit compressed texel block
-    encodes a 4{times}4 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_BC7_SRGB_BLOCK specifies a four-component,
-    block-compressed format where each 128-bit compressed texel block
-    encodes a 4{times}4 rectangle of unsigned normalized RGBA texel data
-    with sRGB nonlinear encoding applied to the RGB components.
-  * ename:VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK specifies a three-component,
-    ETC2 compressed format where each 64-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized RGB texel data.
-    This format has no alpha and is considered opaque.
-  * ename:VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK specifies a three-component, ETC2
-    compressed format where each 64-bit compressed texel block encodes a
-    4{times}4 rectangle of unsigned normalized RGB texel data with sRGB
-    nonlinear encoding.
-    This format has no alpha and is considered opaque.
-  * ename:VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK specifies a four-component,
-    ETC2 compressed format where each 64-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized RGB texel data, and
-    provides 1 bit of alpha.
-  * ename:VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK specifies a four-component,
-    ETC2 compressed format where each 64-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized RGB texel data with sRGB
-    nonlinear encoding, and provides 1 bit of alpha.
-  * ename:VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK specifies a four-component,
-    ETC2 compressed format where each 128-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized RGBA texel data with the
-    first 64 bits encoding alpha values followed by 64 bits encoding RGB
-    values.
-  * ename:VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK specifies a four-component,
-    ETC2 compressed format where each 128-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized RGBA texel data with the
-    first 64 bits encoding alpha values followed by 64 bits encoding RGB
-    values with sRGB nonlinear encoding applied.
-  * ename:VK_FORMAT_EAC_R11_UNORM_BLOCK specifies a one-component, ETC2
-    compressed format where each 64-bit compressed texel block encodes a
-    4{times}4 rectangle of unsigned normalized red texel data.
-  * ename:VK_FORMAT_EAC_R11_SNORM_BLOCK specifies a one-component, ETC2
-    compressed format where each 64-bit compressed texel block encodes a
-    4{times}4 rectangle of signed normalized red texel data.
-  * ename:VK_FORMAT_EAC_R11G11_UNORM_BLOCK specifies a two-component, ETC2
-    compressed format where each 128-bit compressed texel block encodes a
-    4{times}4 rectangle of unsigned normalized RG texel data with the first
-    64 bits encoding red values followed by 64 bits encoding green values.
-  * ename:VK_FORMAT_EAC_R11G11_SNORM_BLOCK specifies a two-component, ETC2
-    compressed format where each 128-bit compressed texel block encodes a
-    4{times}4 rectangle of signed normalized RG texel data with the first 64
-    bits encoding red values followed by 64 bits encoding green values.
-  * ename:VK_FORMAT_ASTC_4x4_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    4{times}4 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_4x4_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    4{times}4 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 4{times}4 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_5x4_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    5{times}4 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_5x4_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    5{times}4 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 5{times}4 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_5x5_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    5{times}5 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_5x5_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    5{times}5 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 5{times}5 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_6x5_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    6{times}5 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_6x5_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    6{times}5 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 6{times}5 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_6x6_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    6{times}6 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_6x6_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    6{times}6 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 6{times}6 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_8x5_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes an
-    8{times}5 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_8x5_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes an
-    8{times}5 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 8{times}5 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_8x6_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes an
-    8{times}6 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_8x6_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes an
-    8{times}6 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 8{times}6 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_8x8_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes an
-    8{times}8 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_8x8_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes an
-    8{times}8 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 8{times}8 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_10x5_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    10{times}5 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_10x5_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    10{times}5 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 10{times}5 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_10x6_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    10{times}6 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_10x6_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    10{times}6 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 10{times}6 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_10x8_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    10{times}8 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_10x8_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    10{times}8 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 10{times}8 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_10x10_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    10{times}10 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_10x10_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    10{times}10 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 10{times}10 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_12x10_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    12{times}10 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_12x10_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    12{times}10 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 12{times}10 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_12x12_UNORM_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    12{times}12 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_ASTC_12x12_SRGB_BLOCK specifies a four-component, ASTC
-    compressed format where each 128-bit compressed texel block encodes a
-    12{times}12 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-  * ename:VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT specifies a four-component,
-    ASTC compressed format where each 128-bit compressed texel block encodes
-    a 12{times}12 rectangle of signed floating-point RGBA texel data.
-endif::VK_EXT_texture_compression_astc_hdr[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * ename:VK_FORMAT_G8B8G8R8_422_UNORM specifies a four-component, 32-bit
-    format containing a pair of G components, an R component, and a B
-    component, collectively encoding a 2{times}1 rectangle of unsigned
-    normalized RGB texel data.
-    One G value is present at each _i_ coordinate, with the B and R values
-    shared across both G values and thus recorded at half the horizontal
-    resolution of the image.
-    This format has an 8-bit G component for the even _i_ coordinate in byte
-    0, an 8-bit B component in byte 1, an 8-bit G component for the odd _i_
-    coordinate in byte 2, and an 8-bit R component in byte 3.
-    This format only supports images with a width that is a multiple of two.
-    For the purposes of the constraints on copy extents, this format is
-    treated as a compressed format with a 2{times}1 compressed texel block.
-  * ename:VK_FORMAT_B8G8R8G8_422_UNORM specifies a four-component, 32-bit
-    format containing a pair of G components, an R component, and a B
-    component, collectively encoding a 2{times}1 rectangle of unsigned
-    normalized RGB texel data.
-    One G value is present at each _i_ coordinate, with the B and R values
-    shared across both G values and thus recorded at half the horizontal
-    resolution of the image.
-    This format has an 8-bit B component in byte 0, an 8-bit G component for
-    the even _i_ coordinate in byte 1, an 8-bit R component in byte 2, and
-    an 8-bit G component for the odd _i_ coordinate in byte 3.
-    This format only supports images with a width that is a multiple of two.
-    For the purposes of the constraints on copy extents, this format is
-    treated as a compressed format with a 2{times}1 compressed texel block.
-  * ename:VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM specifies an unsigned
-    normalized _multi-planar format_ that has an 8-bit G component in plane
-    0, an 8-bit B component in plane 1, and an 8-bit R component in plane 2.
-    The horizontal and vertical dimensions of the R and B planes are halved
-    relative to the image dimensions, and each R and B component is shared
-    with the G components for which latexmath:[\left\lfloor i_G \times 0.5
-    \right\rfloor = i_B = i_R] and latexmath:[\left\lfloor j_G \times 0.5
-    \right\rfloor = j_B = j_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the B plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT for the R plane.
-    This format only supports images with a width and height that is a
-    multiple of two.
-  * ename:VK_FORMAT_G8_B8R8_2PLANE_420_UNORM specifies an unsigned
-    normalized _multi-planar format_ that has an 8-bit G component in plane
-    0, and a two-component, 16-bit BR plane 1 consisting of an 8-bit B
-    component in byte 0 and an 8-bit R component in byte 1.
-    The horizontal and vertical dimensions of the BR plane are halved
-    relative to the image dimensions, and each R and B value is shared with
-    the G components for which latexmath:[\left\lfloor i_G \times 0.5
-    \right\rfloor = i_B = i_R] and latexmath:[\left\lfloor j_G \times 0.5
-    \right\rfloor = j_B = j_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the BR plane.
-    This format only supports images with a width and height that is a
-    multiple of two.
-  * ename:VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM specifies an unsigned
-    normalized _multi-planar format_ that has an 8-bit G component in plane
-    0, an 8-bit B component in plane 1, and an 8-bit R component in plane 2.
-    The horizontal dimension of the R and B plane is halved relative to the
-    image dimensions, and each R and B value is shared with the G components
-    for which latexmath:[\left\lfloor i_G \times 0.5 \right\rfloor = i_B =
-    i_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the B plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT for the R plane.
-    This format only supports images with a width that is a multiple of two.
-  * ename:VK_FORMAT_G8_B8R8_2PLANE_422_UNORM specifies an unsigned
-    normalized _multi-planar format_ that has an 8-bit G component in plane
-    0, and a two-component, 16-bit BR plane 1 consisting of an 8-bit B
-    component in byte 0 and an 8-bit R component in byte 1.
-    The horizontal dimension of the BR plane is halved relative to the image
-    dimensions, and each R and B value is shared with the G components for
-    which latexmath:[\left\lfloor i_G \times 0.5 \right\rfloor = i_B = i_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the BR plane.
-    This format only supports images with a width that is a multiple of two.
-  * ename:VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM specifies an unsigned
-    normalized _multi-planar format_ that has an 8-bit G component in plane
-    0, an 8-bit B component in plane 1, and an 8-bit R component in plane 2.
-    Each plane has the same dimensions and each R, G and B component
-    contributes to a single texel.
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the B plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT for the R plane.
-  * ename:VK_FORMAT_R10X6_UNORM_PACK16 specifies a one-component, 16-bit
-    unsigned normalized format that has a single 10-bit R component in the
-    top 10 bits of a 16-bit word, with the bottom 6 bits unused.
-  * ename:VK_FORMAT_R10X6G10X6_UNORM_2PACK16 specifies a two-component,
-    32-bit unsigned normalized format that has a 10-bit R component in the
-    top 10 bits of the word in bytes 0..1, and a 10-bit G component in the
-    top 10 bits of the word in bytes 2..3, with the bottom 6 bits of each
-    word unused.
-  * ename:VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 specifies a
-    four-component, 64-bit unsigned normalized format that has a 10-bit R
-    component in the top 10 bits of the word in bytes 0..1, a 10-bit G
-    component in the top 10 bits of the word in bytes 2..3, a 10-bit B
-    component in the top 10 bits of the word in bytes 4..5, and a 10-bit A
-    component in the top 10 bits of the word in bytes 6..7, with the bottom
-    6 bits of each word unused.
-  * ename:VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16 specifies a
-    four-component, 64-bit format containing a pair of G components, an R
-    component, and a B component, collectively encoding a 2{times}1
-    rectangle of unsigned normalized RGB texel data.
-    One G value is present at each _i_ coordinate, with the B and R values
-    shared across both G values and thus recorded at half the horizontal
-    resolution of the image.
-    This format has a 10-bit G component for the even _i_ coordinate in the
-    top 10 bits of the word in bytes 0..1, a 10-bit B component in the top
-    10 bits of the word in bytes 2..3, a 10-bit G component for the odd _i_
-    coordinate in the top 10 bits of the word in bytes 4..5, and a 10-bit R
-    component in the top 10 bits of the word in bytes 6..7, with the bottom
-    6 bits of each word unused.
-    This format only supports images with a width that is a multiple of two.
-    For the purposes of the constraints on copy extents, this format is
-    treated as a compressed format with a 2{times}1 compressed texel block.
-  * ename:VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16 specifies a
-    four-component, 64-bit format containing a pair of G components, an R
-    component, and a B component, collectively encoding a 2{times}1
-    rectangle of unsigned normalized RGB texel data.
-    One G value is present at each _i_ coordinate, with the B and R values
-    shared across both G values and thus recorded at half the horizontal
-    resolution of the image.
-    This format has a 10-bit B component in the top 10 bits of the word in
-    bytes 0..1, a 10-bit G component for the even _i_ coordinate in the top
-    10 bits of the word in bytes 2..3, a 10-bit R component in the top 10
-    bits of the word in bytes 4..5, and a 10-bit G component for the odd _i_
-    coordinate in the top 10 bits of the word in bytes 6..7, with the bottom
-    6 bits of each word unused.
-    This format only supports images with a width that is a multiple of two.
-    For the purposes of the constraints on copy extents, this format is
-    treated as a compressed format with a 2{times}1 compressed texel block.
-  * ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16 specifies an
-    unsigned normalized _multi-planar format_ that has a 10-bit G component
-    in the top 10 bits of each 16-bit word of plane 0, a 10-bit B component
-    in the top 10 bits of each 16-bit word of plane 1, and a 10-bit R
-    component in the top 10 bits of each 16-bit word of plane 2, with the
-    bottom 6 bits of each word unused.
-    The horizontal and vertical dimensions of the R and B planes are halved
-    relative to the image dimensions, and each R and B component is shared
-    with the G components for which latexmath:[\left\lfloor i_G \times 0.5
-    \right\rfloor = i_B = i_R] and latexmath:[\left\lfloor j_G \times 0.5
-    \right\rfloor = j_B = j_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the B plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT for the R plane.
-    This format only supports images with a width and height that is a
-    multiple of two.
-  * ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16 specifies an
-    unsigned normalized _multi-planar format_ that has a 10-bit G component
-    in the top 10 bits of each 16-bit word of plane 0, and a two-component,
-    32-bit BR plane 1 consisting of a 10-bit B component in the top 10 bits
-    of the word in bytes 0..1, and a 10-bit R component in the top 10 bits
-    of the word in bytes 2..3, with the bottom 6 bits of each word unused.
-    The horizontal and vertical dimensions of the BR plane are halved
-    relative to the image dimensions, and each R and B value is shared with
-    the G components for which latexmath:[\left\lfloor i_G \times 0.5
-    \right\rfloor = i_B = i_R] and latexmath:[\left\lfloor j_G \times 0.5
-    \right\rfloor = j_B = j_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the BR plane.
-    This format only supports images with a width and height that is a
-    multiple of two.
-  * ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16 specifies an
-    unsigned normalized _multi-planar format_ that has a 10-bit G component
-    in the top 10 bits of each 16-bit word of plane 0, a 10-bit B component
-    in the top 10 bits of each 16-bit word of plane 1, and a 10-bit R
-    component in the top 10 bits of each 16-bit word of plane 2, with the
-    bottom 6 bits of each word unused.
-    The horizontal dimension of the R and B plane is halved relative to the
-    image dimensions, and each R and B value is shared with the G components
-    for which latexmath:[\left\lfloor i_G \times 0.5 \right\rfloor = i_B =
-    i_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the B plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT for the R plane.
-    This format only supports images with a width that is a multiple of two.
-  * ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16 specifies an
-    unsigned normalized _multi-planar format_ that has a 10-bit G component
-    in the top 10 bits of each 16-bit word of plane 0, and a two-component,
-    32-bit BR plane 1 consisting of a 10-bit B component in the top 10 bits
-    of the word in bytes 0..1, and a 10-bit R component in the top 10 bits
-    of the word in bytes 2..3, with the bottom 6 bits of each word unused.
-    The horizontal dimension of the BR plane is halved relative to the image
-    dimensions, and each R and B value is shared with the G components for
-    which latexmath:[\left\lfloor i_G \times 0.5 \right\rfloor = i_B = i_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the BR plane.
-    This format only supports images with a width that is a multiple of two.
-  * ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16 specifies an
-    unsigned normalized _multi-planar format_ that has a 10-bit G component
-    in the top 10 bits of each 16-bit word of plane 0, a 10-bit B component
-    in the top 10 bits of each 16-bit word of plane 1, and a 10-bit R
-    component in the top 10 bits of each 16-bit word of plane 2, with the
-    bottom 6 bits of each word unused.
-    Each plane has the same dimensions and each R, G and B component
-    contributes to a single texel.
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the B plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT for the R plane.
-  * ename:VK_FORMAT_R12X4_UNORM_PACK16 specifies a one-component, 16-bit
-    unsigned normalized format that has a single 12-bit R component in the
-    top 12 bits of a 16-bit word, with the bottom 4 bits unused.
-  * ename:VK_FORMAT_R12X4G12X4_UNORM_2PACK16 specifies a two-component,
-    32-bit unsigned normalized format that has a 12-bit R component in the
-    top 12 bits of the word in bytes 0..1, and a 12-bit G component in the
-    top 12 bits of the word in bytes 2..3, with the bottom 4 bits of each
-    word unused.
-  * ename:VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16 specifies a
-    four-component, 64-bit unsigned normalized format that has a 12-bit R
-    component in the top 12 bits of the word in bytes 0..1, a 12-bit G
-    component in the top 12 bits of the word in bytes 2..3, a 12-bit B
-    component in the top 12 bits of the word in bytes 4..5, and a 12-bit A
-    component in the top 12 bits of the word in bytes 6..7, with the bottom
-    4 bits of each word unused.
-  * ename:VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16 specifies a
-    four-component, 64-bit format containing a pair of G components, an R
-    component, and a B component, collectively encoding a 2{times}1
-    rectangle of unsigned normalized RGB texel data.
-    One G value is present at each _i_ coordinate, with the B and R values
-    shared across both G values and thus recorded at half the horizontal
-    resolution of the image.
-    This format has a 12-bit G component for the even _i_ coordinate in the
-    top 12 bits of the word in bytes 0..1, a 12-bit B component in the top
-    12 bits of the word in bytes 2..3, a 12-bit G component for the odd _i_
-    coordinate in the top 12 bits of the word in bytes 4..5, and a 12-bit R
-    component in the top 12 bits of the word in bytes 6..7, with the bottom
-    4 bits of each word unused.
-    This format only supports images with a width that is a multiple of two.
-    For the purposes of the constraints on copy extents, this format is
-    treated as a compressed format with a 2{times}1 compressed texel block.
-  * ename:VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16 specifies a
-    four-component, 64-bit format containing a pair of G components, an R
-    component, and a B component, collectively encoding a 2{times}1
-    rectangle of unsigned normalized RGB texel data.
-    One G value is present at each _i_ coordinate, with the B and R values
-    shared across both G values and thus recorded at half the horizontal
-    resolution of the image.
-    This format has a 12-bit B component in the top 12 bits of the word in
-    bytes 0..1, a 12-bit G component for the even _i_ coordinate in the top
-    12 bits of the word in bytes 2..3, a 12-bit R component in the top 12
-    bits of the word in bytes 4..5, and a 12-bit G component for the odd _i_
-    coordinate in the top 12 bits of the word in bytes 6..7, with the bottom
-    4 bits of each word unused.
-    This format only supports images with a width that is a multiple of two.
-    For the purposes of the constraints on copy extents, this format is
-    treated as a compressed format with a 2{times}1 compressed texel block.
-  * ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16 specifies an
-    unsigned normalized _multi-planar format_ that has a 12-bit G component
-    in the top 12 bits of each 16-bit word of plane 0, a 12-bit B component
-    in the top 12 bits of each 16-bit word of plane 1, and a 12-bit R
-    component in the top 12 bits of each 16-bit word of plane 2, with the
-    bottom 4 bits of each word unused.
-    The horizontal and vertical dimensions of the R and B planes are halved
-    relative to the image dimensions, and each R and B component is shared
-    with the G components for which latexmath:[\left\lfloor i_G \times 0.5
-    \right\rfloor = i_B = i_R] and latexmath:[\left\lfloor j_G \times 0.5
-    \right\rfloor = j_B = j_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the B plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT for the R plane.
-    This format only supports images with a width and height that is a
-    multiple of two.
-  * ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16 specifies an
-    unsigned normalized _multi-planar format_ that has a 12-bit G component
-    in the top 12 bits of each 16-bit word of plane 0, and a two-component,
-    32-bit BR plane 1 consisting of a 12-bit B component in the top 12 bits
-    of the word in bytes 0..1, and a 12-bit R component in the top 12 bits
-    of the word in bytes 2..3, with the bottom 4 bits of each word unused.
-    The horizontal and vertical dimensions of the BR plane are halved
-    relative to the image dimensions, and each R and B value is shared with
-    the G components for which latexmath:[\left\lfloor i_G \times 0.5
-    \right\rfloor = i_B = i_R] and latexmath:[\left\lfloor j_G \times 0.5
-    \right\rfloor = j_B = j_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the BR plane.
-    This format only supports images with a width and height that is a
-    multiple of two.
-  * ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16 specifies an
-    unsigned normalized _multi-planar format_ that has a 12-bit G component
-    in the top 12 bits of each 16-bit word of plane 0, a 12-bit B component
-    in the top 12 bits of each 16-bit word of plane 1, and a 12-bit R
-    component in the top 12 bits of each 16-bit word of plane 2, with the
-    bottom 4 bits of each word unused.
-    The horizontal dimension of the R and B plane is halved relative to the
-    image dimensions, and each R and B value is shared with the G components
-    for which latexmath:[\left\lfloor i_G \times 0.5 \right\rfloor = i_B =
-    i_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the B plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT for the R plane.
-    This format only supports images with a width that is a multiple of two.
-  * ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16 specifies an
-    unsigned normalized _multi-planar format_ that has a 12-bit G component
-    in the top 12 bits of each 16-bit word of plane 0, and a two-component,
-    32-bit BR plane 1 consisting of a 12-bit B component in the top 12 bits
-    of the word in bytes 0..1, and a 12-bit R component in the top 12 bits
-    of the word in bytes 2..3, with the bottom 4 bits of each word unused.
-    The horizontal dimension of the BR plane is halved relative to the image
-    dimensions, and each R and B value is shared with the G components for
-    which latexmath:[\left\lfloor i_G \times 0.5 \right\rfloor = i_B = i_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the BR plane.
-    This format only supports images with a width that is a multiple of two.
-  * ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16 specifies an
-    unsigned normalized _multi-planar format_ that has a 12-bit G component
-    in the top 12 bits of each 16-bit word of plane 0, a 12-bit B component
-    in the top 12 bits of each 16-bit word of plane 1, and a 12-bit R
-    component in the top 12 bits of each 16-bit word of plane 2, with the
-    bottom 4 bits of each word unused.
-    Each plane has the same dimensions and each R, G and B component
-    contributes to a single texel.
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the B plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT for the R plane.
-  * ename:VK_FORMAT_G16B16G16R16_422_UNORM specifies a four-component,
-    64-bit format containing a pair of G components, an R component, and a B
-    component, collectively encoding a 2{times}1 rectangle of unsigned
-    normalized RGB texel data.
-    One G value is present at each _i_ coordinate, with the B and R values
-    shared across both G values and thus recorded at half the horizontal
-    resolution of the image.
-    This format has a 16-bit G component for the even _i_ coordinate in the
-    word in bytes 0..1, a 16-bit B component in the word in bytes 2..3, a
-    16-bit G component for the odd _i_ coordinate in the word in bytes 4..5,
-    and a 16-bit R component in the word in bytes 6..7.
-    This format only supports images with a width that is a multiple of two.
-    For the purposes of the constraints on copy extents, this format is
-    treated as a compressed format with a 2{times}1 compressed texel block.
-  * ename:VK_FORMAT_B16G16R16G16_422_UNORM specifies a four-component,
-    64-bit format containing a pair of G components, an R component, and a B
-    component, collectively encoding a 2{times}1 rectangle of unsigned
-    normalized RGB texel data.
-    One G value is present at each _i_ coordinate, with the B and R values
-    shared across both G values and thus recorded at half the horizontal
-    resolution of the image.
-    This format has a 16-bit B component in the word in bytes 0..1, a 16-bit
-    G component for the even _i_ coordinate in the word in bytes 2..3, a
-    16-bit R component in the word in bytes 4..5, and a 16-bit G component
-    for the odd _i_ coordinate in the word in bytes 6..7.
-    This format only supports images with a width that is a multiple of two.
-    For the purposes of the constraints on copy extents, this format is
-    treated as a compressed format with a 2{times}1 compressed texel block.
-  * ename:VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM specifies an unsigned
-    normalized _multi-planar format_ that has a 16-bit G component in each
-    16-bit word of plane 0, a 16-bit B component in each 16-bit word of
-    plane 1, and a 16-bit R component in each 16-bit word of plane 2.
-    The horizontal and vertical dimensions of the R and B planes are halved
-    relative to the image dimensions, and each R and B component is shared
-    with the G components for which latexmath:[\left\lfloor i_G \times 0.5
-    \right\rfloor = i_B = i_R] and latexmath:[\left\lfloor j_G \times 0.5
-    \right\rfloor = j_B = j_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the B plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT for the R plane.
-    This format only supports images with a width and height that is a
-    multiple of two.
-  * ename:VK_FORMAT_G16_B16R16_2PLANE_420_UNORM specifies an unsigned
-    normalized _multi-planar format_ that has a 16-bit G component in each
-    16-bit word of plane 0, and a two-component, 32-bit BR plane 1
-    consisting of a 16-bit B component in the word in bytes 0..1, and a
-    16-bit R component in the word in bytes 2..3.
-    The horizontal and vertical dimensions of the BR plane are halved
-    relative to the image dimensions, and each R and B value is shared with
-    the G components for which latexmath:[\left\lfloor i_G \times 0.5
-    \right\rfloor = i_B = i_R] and latexmath:[\left\lfloor j_G \times 0.5
-    \right\rfloor = j_B = j_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the BR plane.
-    This format only supports images with a width and height that is a
-    multiple of two.
-  * ename:VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM specifies an unsigned
-    normalized _multi-planar format_ that has a 16-bit G component in each
-    16-bit word of plane 0, a 16-bit B component in each 16-bit word of
-    plane 1, and a 16-bit R component in each 16-bit word of plane 2.
-    The horizontal dimension of the R and B plane is halved relative to the
-    image dimensions, and each R and B value is shared with the G components
-    for which latexmath:[\left\lfloor i_G \times 0.5 \right\rfloor = i_B =
-    i_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the B plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT for the R plane.
-    This format only supports images with a width that is a multiple of two.
-  * ename:VK_FORMAT_G16_B16R16_2PLANE_422_UNORM specifies an unsigned
-    normalized _multi-planar format_ that has a 16-bit G component in each
-    16-bit word of plane 0, and a two-component, 32-bit BR plane 1
-    consisting of a 16-bit B component in the word in bytes 0..1, and a
-    16-bit R component in the word in bytes 2..3.
-    The horizontal dimension of the BR plane is halved relative to the image
-    dimensions, and each R and B value is shared with the G components for
-    which latexmath:[\left\lfloor i_G \times 0.5 \right\rfloor = i_B = i_R].
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the BR plane.
-    This format only supports images with a width that is a multiple of two.
-  * ename:VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM specifies an unsigned
-    normalized _multi-planar format_ that has a 16-bit G component in each
-    16-bit word of plane 0, a 16-bit B component in each 16-bit word of
-    plane 1, and a 16-bit R component in each 16-bit word of plane 2.
-    Each plane has the same dimensions and each R, G and B component
-    contributes to a single texel.
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the B plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT for the R plane.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_EXT_ycbcr_2plane_444_formats[]
-  * ename:VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT specifies an unsigned
-    normalized _multi-planar format_ that has an 8-bit G component in plane
-    0, and a two-component, 16-bit BR plane 1 consisting of an 8-bit B
-    component in byte 0 and an 8-bit R component in byte 1.
-    Both planes have the same dimensions and each R, G and B component
-    contributes to a single texel.
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the BR plane.
-  * ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT specifies
-    an unsigned normalized _multi-planar format_ that has a 10-bit G
-    component in the top 10 bits of each 16-bit word of plane 0, and a
-    two-component, 32-bit BR plane 1 consisting of a 10-bit B component in
-    the top 10 bits of the word in bytes 0..1, and a 10-bit R component in
-    the top 10 bits of the word in bytes 2..3, the bottom 6 bits of each
-    word unused.
-    Both planes have the same dimensions and each R, G and B component
-    contributes to a single texel.
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the BR plane.
-  * ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT specifies
-    an unsigned normalized _multi-planar format_ that has a 12-bit G
-    component in the top 12 bits of each 16-bit word of plane 0, and a
-    two-component, 32-bit BR plane 1 consisting of a 12-bit B component in
-    the top 12 bits of the word in bytes 0..1, and a 12-bit R component in
-    the top 12 bits of the word in bytes 2..3, the bottom 4 bits of each
-    word unused.
-    Both planes have the same dimensions and each R, G and B component
-    contributes to a single texel.
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the BR plane.
-  * ename:VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT specifies an unsigned
-    normalized _multi-planar format_ that has a 16-bit G component in each
-    16-bit word of plane 0, and a two-component, 32-bit BR plane 1
-    consisting of a 16-bit B component in the word in bytes 0..1, and a
-    16-bit R component in the word in bytes 2..3.
-    Both planes have the same dimensions and each R, G and B component
-    contributes to a single texel.
-    The location of each plane when this image is in linear layout can be
-    determined via flink:vkGetImageSubresourceLayout, using
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT for the G plane, and
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT for the BR plane.
-endif::VK_EXT_ycbcr_2plane_444_formats[]
-ifdef::VK_IMG_format_pvrtc[]
-  * ename:VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG specifies a four-component,
-    PVRTC compressed format where each 64-bit compressed texel block encodes
-    an 8{times}4 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG specifies a four-component,
-    PVRTC compressed format where each 64-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG specifies a four-component,
-    PVRTC compressed format where each 64-bit compressed texel block encodes
-    an 8{times}4 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG specifies a four-component,
-    PVRTC compressed format where each 64-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized RGBA texel data.
-  * ename:VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG specifies a four-component,
-    PVRTC compressed format where each 64-bit compressed texel block encodes
-    an 8{times}4 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-  * ename:VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG specifies a four-component,
-    PVRTC compressed format where each 64-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-  * ename:VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG specifies a four-component,
-    PVRTC compressed format where each 64-bit compressed texel block encodes
-    an 8{times}4 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-  * ename:VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG specifies a four-component,
-    PVRTC compressed format where each 64-bit compressed texel block encodes
-    a 4{times}4 rectangle of unsigned normalized RGBA texel data with sRGB
-    nonlinear encoding applied to the RGB components.
-endif::VK_IMG_format_pvrtc[]
-
---
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-[[formats-compatible-planes]]
-=== Compatible formats of planes of multi-planar formats
-
-Individual planes of multi-planar formats are _compatible_ with single-plane
-formats if they occupy the same number of bits per texel block.
-In the following table, individual planes of a _multi-planar_ format are
-compatible with the format listed against the relevant plane index for that
-multi-planar format, and any format compatible with the listed single-plane
-format according to <<formats-compatibility-classes, Format Compatibility
-Classes>>.
-
-.Plane Format Compatibility Table
-[width="95%",cols="1,6,3,3",options="header"]
-|====
-^| Plane ^| Compatible format for plane ^| Width relative to the width _w_ of the plane with the largest dimensions ^| Height relative to the height _h_ of the plane with the largest dimensions
-4+| *ename:VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM*
-^| 0     ^| ename:VK_FORMAT_R8_UNORM ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R8_UNORM ^| w/2 ^| h/2
-^| 2     ^| ename:VK_FORMAT_R8_UNORM ^| w/2 ^| h/2
-4+| *ename:VK_FORMAT_G8_B8R8_2PLANE_420_UNORM*
-^| 0     ^| ename:VK_FORMAT_R8_UNORM ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R8G8_UNORM ^| w/2 ^| h/2
-4+| *ename:VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM*
-^| 0     ^| ename:VK_FORMAT_R8_UNORM ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R8_UNORM ^| w/2 ^| h
-^| 2     ^| ename:VK_FORMAT_R8_UNORM ^| w/2 ^| h
-4+| *ename:VK_FORMAT_G8_B8R8_2PLANE_422_UNORM*
-^| 0     ^| ename:VK_FORMAT_R8_UNORM ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R8G8_UNORM ^| w/2 ^| h
-4+| *ename:VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM*
-^| 0     ^| ename:VK_FORMAT_R8_UNORM ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R8_UNORM ^| w ^| h
-^| 2     ^| ename:VK_FORMAT_R8_UNORM ^| w ^| h
-4+| *ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16*
-^| 0     ^| ename:VK_FORMAT_R10X6_UNORM_PACK16 ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R10X6_UNORM_PACK16 ^| w/2 ^| h/2
-^| 2     ^| ename:VK_FORMAT_R10X6_UNORM_PACK16 ^| w/2 ^| h/2
-4+| *ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16*
-^| 0     ^| ename:VK_FORMAT_R10X6_UNORM_PACK16 ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R10X6G10X6_UNORM_2PACK16 ^| w/2 ^| h/2
-4+| *ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16*
-^| 0     ^| ename:VK_FORMAT_R10X6_UNORM_PACK16 ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R10X6_UNORM_PACK16 ^| w/2 ^| h
-^| 2     ^| ename:VK_FORMAT_R10X6_UNORM_PACK16 ^| w/2 ^| h
-4+| *ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16*
-^| 0     ^| ename:VK_FORMAT_R10X6_UNORM_PACK16 ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R10X6G10X6_UNORM_2PACK16 ^| w/2 ^| h
-4+| *ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16*
-^| 0     ^| ename:VK_FORMAT_R10X6_UNORM_PACK16 ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R10X6_UNORM_PACK16 ^| w ^| h
-^| 2     ^| ename:VK_FORMAT_R10X6_UNORM_PACK16 ^| w ^| h
-4+| *ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16*
-^| 0     ^| ename:VK_FORMAT_R12X4_UNORM_PACK16 ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R12X4_UNORM_PACK16 ^| w/2 ^| h/2
-^| 2     ^| ename:VK_FORMAT_R12X4_UNORM_PACK16 ^| w/2 ^| h/2
-4+| *ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16*
-^| 0     ^| ename:VK_FORMAT_R12X4_UNORM_PACK16 ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R12X4G12X4_UNORM_2PACK16 ^| w/2 ^| h/2
-4+| *ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16*
-^| 0     ^| ename:VK_FORMAT_R12X4_UNORM_PACK16 ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R12X4_UNORM_PACK16 ^| w/2 ^| h
-^| 2     ^| ename:VK_FORMAT_R12X4_UNORM_PACK16 ^| w/2 ^| h
-4+| *ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16*
-^| 0     ^| ename:VK_FORMAT_R12X4_UNORM_PACK16 ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R12X4G12X4_UNORM_2PACK16 ^| w/2 ^| h
-4+| *ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16*
-^| 0     ^| ename:VK_FORMAT_R12X4_UNORM_PACK16 ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R12X4_UNORM_PACK16 ^| w ^| h
-^| 2     ^| ename:VK_FORMAT_R12X4_UNORM_PACK16 ^| w ^| h
-4+| *ename:VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM*
-^| 0     ^| ename:VK_FORMAT_R16_UNORM ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R16_UNORM ^| w/2 ^| h/2
-^| 2     ^| ename:VK_FORMAT_R16_UNORM ^| w/2 ^| h/2
-4+| *ename:VK_FORMAT_G16_B16R16_2PLANE_420_UNORM*
-^| 0     ^| ename:VK_FORMAT_R16_UNORM ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R16G16_UNORM ^| w/2 ^| h/2
-4+| *ename:VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM*
-^| 0     ^| ename:VK_FORMAT_R16_UNORM ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R16_UNORM ^| w/2 ^| h
-^| 2     ^| ename:VK_FORMAT_R16_UNORM ^| w/2 ^| h
-4+| *ename:VK_FORMAT_G16_B16R16_2PLANE_422_UNORM*
-^| 0     ^| ename:VK_FORMAT_R16_UNORM ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R16G16_UNORM ^| w/2 ^| h
-4+| *ename:VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM*
-^| 0     ^| ename:VK_FORMAT_R16_UNORM ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R16_UNORM ^| w ^| h
-^| 2     ^| ename:VK_FORMAT_R16_UNORM ^| w ^| h
-ifdef::VK_EXT_ycbcr_2plane_444_formats[]
-4+| *ename:VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT*
-^| 0     ^| ename:VK_FORMAT_R8_UNORM   ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R8G8_UNORM ^| w ^| h
-4+| *ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT*
-^| 0     ^| ename:VK_FORMAT_R10X6_UNORM_PACK16       ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R10X6G10X6_UNORM_2PACK16 ^| w ^| h
-4+| *ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT*
-^| 0     ^| ename:VK_FORMAT_R12X4_UNORM_PACK16       ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R12X4G12X4_UNORM_2PACK16 ^| w ^| h
-4+| *ename:VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT*
-^| 0     ^| ename:VK_FORMAT_R16_UNORM    ^| w ^| h
-^| 1     ^| ename:VK_FORMAT_R16G16_UNORM ^| w ^| h
-endif::VK_EXT_ycbcr_2plane_444_formats[]
-|====
-
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-
-[[formats-packed]]
-=== Packed Formats
-
-For the purposes of address alignment when accessing buffer memory
-containing vertex attribute or texel data, the following formats are
-considered _packed_ - components of the texels or attributes are stored in
-bitfields packed into one or more 8-, 16-, or 32-bit fundamental data type.
-
-  * <<formats-packed-8-bit,Packed into 8-bit data types>>:
-  ** ename:VK_FORMAT_R4G4_UNORM_PACK8
-  * <<formats-packed-16-bit,Packed into 16-bit data types>>:
-  ** ename:VK_FORMAT_R4G4B4A4_UNORM_PACK16
-  ** ename:VK_FORMAT_B4G4R4A4_UNORM_PACK16
-ifdef::VK_EXT_4444_formats[]
-  ** ename:VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT
-  ** ename:VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT
-endif::VK_EXT_4444_formats[]
-  ** ename:VK_FORMAT_R5G6B5_UNORM_PACK16
-  ** ename:VK_FORMAT_B5G6R5_UNORM_PACK16
-  ** ename:VK_FORMAT_R5G5B5A1_UNORM_PACK16
-  ** ename:VK_FORMAT_B5G5R5A1_UNORM_PACK16
-  ** ename:VK_FORMAT_A1R5G5B5_UNORM_PACK16
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  ** ename:VK_FORMAT_R10X6_UNORM_PACK16
-  ** ename:VK_FORMAT_R12X4_UNORM_PACK16
-  ** ename:VK_FORMAT_R10X6G10X6_UNORM_2PACK16
-  ** ename:VK_FORMAT_R12X4G12X4_UNORM_2PACK16
-  ** ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16
-  ** ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16
-  ** ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16
-  ** ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16
-  ** ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16
-  ** ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16
-  ** ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16
-  ** ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16
-  ** ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16
-  ** ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16
-  ** ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT
-  ** ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT
-  ** ename:VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16
-  ** ename:VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16
-  ** ename:VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16
-  ** ename:VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16
-  ** ename:VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16
-  ** ename:VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * <<formats-packed-32-bit,Packed into 32-bit data types>>:
-  ** ename:VK_FORMAT_A8B8G8R8_UNORM_PACK32
-  ** ename:VK_FORMAT_A8B8G8R8_SNORM_PACK32
-  ** ename:VK_FORMAT_A8B8G8R8_USCALED_PACK32
-  ** ename:VK_FORMAT_A8B8G8R8_SSCALED_PACK32
-  ** ename:VK_FORMAT_A8B8G8R8_UINT_PACK32
-  ** ename:VK_FORMAT_A8B8G8R8_SINT_PACK32
-  ** ename:VK_FORMAT_A8B8G8R8_SRGB_PACK32
-  ** ename:VK_FORMAT_A2R10G10B10_UNORM_PACK32
-  ** ename:VK_FORMAT_A2R10G10B10_SNORM_PACK32
-  ** ename:VK_FORMAT_A2R10G10B10_USCALED_PACK32
-  ** ename:VK_FORMAT_A2R10G10B10_SSCALED_PACK32
-  ** ename:VK_FORMAT_A2R10G10B10_UINT_PACK32
-  ** ename:VK_FORMAT_A2R10G10B10_SINT_PACK32
-  ** ename:VK_FORMAT_A2B10G10R10_UNORM_PACK32
-  ** ename:VK_FORMAT_A2B10G10R10_SNORM_PACK32
-  ** ename:VK_FORMAT_A2B10G10R10_USCALED_PACK32
-  ** ename:VK_FORMAT_A2B10G10R10_SSCALED_PACK32
-  ** ename:VK_FORMAT_A2B10G10R10_UINT_PACK32
-  ** ename:VK_FORMAT_A2B10G10R10_SINT_PACK32
-  ** ename:VK_FORMAT_B10G11R11_UFLOAT_PACK32
-  ** ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32
-  ** ename:VK_FORMAT_X8_D24_UNORM_PACK32
-
-
-=== Identification of Formats
-
-A "`format`" is represented by a single enum value.
-The name of a format is usually built up by using the following pattern:
-
-....
-    VK_FORMAT_{component-format|compression-scheme}_{numeric-format}
-....
-
-The component-format indicates either the size of the R, G, B, and A
-components (if they are present) in the case of a color format, or the size
-of the depth (D) and stencil (S) components (if they are present) in the
-case of a depth/stencil format (see below).
-An X indicates a component that is unused, but may: be present for padding.
-
-<<<
-
-[[formats-numericformat]]
-.Interpretation of Numeric Format
-[width="95%",cols="2,3,10",options="header"]
-|====
-| Numeric format | SPIR-V _Sampled Type_ | Description
-| etext:UNORM    | OpTypeFloat           | The components are unsigned normalized values in the range [eq]#[0,1]#
-| etext:SNORM    | OpTypeFloat           | The components are signed normalized values in the range [eq]#[-1,1]#
-| etext:USCALED  | OpTypeFloat           | The components are unsigned integer values that get converted to floating-point in the range [0,2^n^-1]
-| etext:SSCALED  | OpTypeFloat           | The components are signed integer values that get converted to floating-point in the range [-2^n-1^,2^n-1^-1]
-| etext:UINT     | OpTypeInt             | The components are unsigned integer values in the range [0,2^n^-1]
-| etext:SINT     | OpTypeInt             | The components are signed integer values in the range [-2^n-1^,2^n-1^-1]
-| etext:UFLOAT   | OpTypeFloat           | The components are unsigned floating-point numbers (used by packed, shared exponent, and some compressed formats)
-| etext:SFLOAT   | OpTypeFloat           | The components are signed floating-point numbers
-| etext:SRGB     | OpTypeFloat           | The R, G, and B components are unsigned normalized values that represent values using sRGB nonlinear encoding, while the A component (if one exists) is a regular unsigned normalized value
-3+| [eq]#n# is the number of bits in the component.
-|====
-
-The suffix etext:_PACKnn indicates that the format is packed into an
-underlying type with etext:nn bits.
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-The suffix etext:_mPACKnn is a short-hand that indicates that the format has
-etext:m groups of components (which may or may not be stored in separate
-_planes_) that are each packed into an underlying type with etext:nn bits.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-The suffix etext:_BLOCK indicates that the format is a block-compressed
-format, with the representation of multiple pixels encoded interdependently
-within a region.
-
-[[formats-compressionscheme]]
-.Interpretation of Compression Scheme
-[width="95%",cols="2,10",options="header"]
-|====
-| Compression scheme | Description
-| etext:BC           | Block Compression. See <<appendix-compressedtex-bc>>.
-| etext:ETC2         | Ericsson Texture Compression. See <<appendix-compressedtex-etc2>>.
-| etext:EAC          | ETC2 Alpha Compression. See <<appendix-compressedtex-etc2>>.
-| etext:ASTC         | Adaptive Scalable Texture Compression (LDR Profile). See <<appendix-compressedtex-astc>>.
-|====
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-For _multi-planar_ images, the components in separate _planes_ are separated
-by underscores, and the number of planes is indicated by the addition of a
-etext:_2PLANE or etext:_3PLANE suffix.
-Similarly, the separate aspects of depth-stencil formats are separated by
-underscores, although these are not considered separate planes.
-Formats are suffixed by etext:_422 to indicate that planes other than the
-first are reduced in size by a factor of two horizontally or that the R and
-B values appear at half the horizontal frequency of the G values, etext:_420
-to indicate that planes other than the first are reduced in size by a factor
-of two both horizontally and vertically, and etext:_444 for consistency to
-indicate that all three planes of a three-planar image are the same size.
-
-[NOTE]
-.Note
-====
-No common format has a single plane containing both R and B components but
-does not store these components at reduced horizontal resolution.
-====
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-
-[[texel-block-size]]
-=== Representation and Texel Block Size
-
-Color formats must: be represented in memory in exactly the form indicated
-by the format's name.
-This means that promoting one format to another with more bits per component
-and/or additional components must: not occur for color formats.
-Depth/stencil formats have more relaxed requirements as discussed
-<<formats-depth-stencil,below>>.
-
-Each format has a _texel block size_, the number of bytes used to store one
-_texel block_ (a single addressable element of an uncompressed image, or a
-single compressed block of a compressed image).
-The texel block size for each format is shown in the
-<<formats-compatibility, Compatible formats>> table.
-
-The representation of non-packed formats is that the first component
-specified in the name of the format is in the lowest memory addresses and
-the last component specified is in the highest memory addresses.
-See <<formats-non-packed,Byte mappings for non-packed/compressed color
-formats>>.
-The in-memory ordering of bytes within a component is determined by the host
-endianness.
-
-[[formats-non-packed]]
-.Byte mappings for non-packed/compressed color formats
-[options="header",cols="16*1,10",width="100%"]
-|====
->|0 >|1 >|2 >|3 >|4 >|5 >|6 >|7 >|8 >|9 >|10 >|11 >|12 >|13 >|14 >|15 ^| {leftarrow} Byte
-^|R 16+>s|etext:VK_FORMAT_R8_*
-^|R ^|G 15+>s|etext:VK_FORMAT_R8G8_*
-^|R ^|G ^|B 14+>s|etext:VK_FORMAT_R8G8B8_*
-^|B ^|G ^|R 14+>s|etext:VK_FORMAT_B8G8R8_*
-^|R ^|G ^|B ^|A 13+>s|etext:VK_FORMAT_R8G8B8A8_*
-^|B ^|G ^|R ^|A 13+>s|etext:VK_FORMAT_B8G8R8A8_*
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-^|G~0~ ^|B ^|G~1~ ^|R 13+>s|ename:VK_FORMAT_G8B8G8R8_422_UNORM
-^|B ^|G~0~ ^|R ^|G~1~ 13+>s|ename:VK_FORMAT_B8G8R8G8_422_UNORM
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-2+^|R 15+>s|etext:VK_FORMAT_R16_*
-2+^|R 2+^|G 13+>s|etext:VK_FORMAT_R16G16_*
-2+^|R 2+^|G 2+^|B 11+>s|etext:VK_FORMAT_R16G16B16_*
-2+^|R 2+^|G 2+^|B 2+^|A 9+>s|etext:VK_FORMAT_R16G16B16A16_*
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-2+^|G~0~ 2+^|B 2+^|G~1~ 2+^|R 9+>s|etext:VK_FORMAT_G10X6B10X6G10X6R10X6_4PACK16_422_UNORM
-etext:VK_FORMAT_G12X4B12X4G12X4R12X4_4PACK16_422_UNORM
-etext:VK_FORMAT_G16B16G16R16_UNORM
-2+^|B 2+^|G~0~ 2+^|R 2+^|G~1~ 9+>s|etext:VK_FORMAT_B10X6G10X6R10X6G10X6_4PACK16_422_UNORM
-etext:VK_FORMAT_B12X4G12X4R12X4G12X4_4PACK16_422_UNORM
-ename:VK_FORMAT_B16G16R16G16_422_UNORM
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-4+^|R 13+>s|etext:VK_FORMAT_R32_*
-4+^|R 4+^|G 9+>s|etext:VK_FORMAT_R32G32_*
-4+^|R 4+^|G 4+^|B 5+>s|etext:VK_FORMAT_R32G32B32_*
-4+^|R 4+^|G 4+^|B 4+^|A >s|etext:VK_FORMAT_R32G32B32A32_*
-8+^|R 9+>s|etext:VK_FORMAT_R64_*
-8+^|R 8+^|G >s|etext:VK_FORMAT_R64G64_*
-17+^s|etext:VK_FORMAT_R64G64B64_* as etext:VK_FORMAT_R64G64_* but with B in bytes 16-23
-17+^s|etext:VK_FORMAT_R64G64B64A64_* as etext:VK_FORMAT_R64G64B64_* but with A in bytes 24-31
-|====
-
-Packed formats store multiple components within one underlying type.
-The bit representation is that the first component specified in the name of
-the format is in the most-significant bits and the last component specified
-is in the least-significant bits of the underlying type.
-The in-memory ordering of bytes comprising the underlying type is determined
-by the host endianness.
-
-[[formats-packed-8-bit]]
-.Bit mappings for packed 8-bit formats
-[options="header",cols="8*1",width="100%"]
-|====
-8+^h| Bit
->|~7~ >|~6~ >|~5~ >|~4~ >|~3~ >|~2~ >|~1~ >|~0~
-8+^h| ename:VK_FORMAT_R4G4_UNORM_PACK8
-4+^s|R 4+^s|G
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-|====
-
-[[formats-packed-16-bit]]
-.Bit mappings for packed 16-bit formats
-[options="header",cols="16*1",width="100%"]
-|====
-16+^h| Bit
->|~15~ >|~14~ >|~13~ >|~12~ >|~11~ >|~10~ >|~9~ >|~8~ >|~7~ >|~6~ >|~5~ >|~4~ >|~3~ >|~2~ >|~1~ >|~0~
-16+^h|ename:VK_FORMAT_R4G4B4A4_UNORM_PACK16
-4+^s|R 4+^s|G 4+^s|B 4+^s|A
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-16+^h|ename:VK_FORMAT_B4G4R4A4_UNORM_PACK16
-4+^s|B 4+^s|G 4+^s|R 4+^s|A
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-ifdef::VK_EXT_4444_formats[]
-16+^h|ename:VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT
-4+^s|A 4+^s|R 4+^s|G 4+^s|B
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-16+^h|ename:VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT
-4+^s|A 4+^s|B 4+^s|G 4+^s|R
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-endif::VK_EXT_4444_formats[]
-16+^h|ename:VK_FORMAT_R5G6B5_UNORM_PACK16
-5+^s|R 6+^s|G 5+^s|B
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~5~ ^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-16+^h|ename:VK_FORMAT_B5G6R5_UNORM_PACK16
-5+^s|B 6+^s|G 5+^s|R
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~5~ ^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-16+^h|ename:VK_FORMAT_R5G5B5A1_UNORM_PACK16
-5+^s|R 5+^s|G 5+^s|B 1+^s|A
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~0~
-16+^h|ename:VK_FORMAT_B5G5R5A1_UNORM_PACK16
-5+^s|B 5+^s|G 5+^s|R 1+^s|A
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~0~
-16+^h|ename:VK_FORMAT_A1R5G5B5_UNORM_PACK16
-1+^s|A 5+^s|R 5+^s|G 5+^s|B
-^| ~0~
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-16+^h|ename:VK_FORMAT_R10X6_UNORM_PACK16
-10+^s|R 6+^s|X
-^| ~9~ ^| ~8~ ^| ~7~ ^| ~6~ ^| ~5~
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~5~ ^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-16+^h|ename:VK_FORMAT_R12X4_UNORM_PACK16
-12+^s|R 4+^s|X
-^| ~11~ ^| ~10~
-^| ~9~ ^| ~8~ ^| ~7~ ^| ~6~ ^| ~5~
-^| ~4~ ^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-^| ~3~ ^| ~2~ ^| ~1~ ^| ~0~
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-|====
-
-[[formats-packed-32-bit]]
-.Bit mappings for packed 32-bit formats
-[cols="32*1",options="header"]
-|====
-32+^h|Bit
->|~31~ >|~30~ >|~29~ >|~28~ >|~27~ >|~26~ >|~25~ >|~24~ >|~23~ >|~22~ >|~21~ >|~20~ >|~19~ >|~18~ >|~17~ >|~16~
->|~15~ >|~14~ >|~13~ >|~12~ >|~11~ >|~10~ >|~9~ >|~8~ >|~7~ >|~6~ >|~5~ >|~4~ >|~3~ >|~2~ >|~1~ >|~0~
-32+^h|etext:VK_FORMAT_A8B8G8R8_*_PACK32
-8+^s|A 8+^s|B 8+^s|G 8+^s|R
-^|~7~ ^|~6~ ^|~5~ ^|~4~
-^|~3~ ^|~2~ ^|~1~ ^|~0~
-^|~7~ ^|~6~ ^|~5~ ^|~4~
-^|~3~ ^|~2~ ^|~1~ ^|~0~
-^|~7~ ^|~6~ ^|~5~ ^|~4~
-^|~3~ ^|~2~ ^|~1~ ^|~0~
-^|~7~ ^|~6~ ^|~5~ ^|~4~
-^|~3~ ^|~2~ ^|~1~ ^|~0~
-32+^h|etext:VK_FORMAT_A2R10G10B10_*_PACK32
-2+^s|A 10+^s|R 10+^s|G 10+^s|B
-^|~1~ ^|~0~
-^|~9~ ^|~8~ ^|~7~ ^|~6~ ^|~5~
-^|~4~ ^|~3~ ^|~2~ ^|~1~ ^|~0~
-^|~9~ ^|~8~ ^|~7~ ^|~6~ ^|~5~
-^|~4~ ^|~3~ ^|~2~ ^|~1~ ^|~0~
-^|~9~ ^|~8~ ^|~7~ ^|~6~ ^|~5~
-^|~4~ ^|~3~ ^|~2~ ^|~1~ ^|~0~
-32+^h|etext:VK_FORMAT_A2B10G10R10_*_PACK32
-2+^s|A 10+^s|B 10+^s|G 10+^s|R
-^|~1~ ^|~0~
-^|~9~ ^|~8~ ^|~7~ ^|~6~ ^|~5~
-^|~4~ ^|~3~ ^|~2~ ^|~1~ ^|~0~
-^|~9~ ^|~8~ ^|~7~ ^|~6~ ^|~5~
-^|~4~ ^|~3~ ^|~2~ ^|~1~ ^|~0~
-^|~9~ ^|~8~ ^|~7~ ^|~6~ ^|~5~
-^|~4~ ^|~3~ ^|~2~ ^|~1~ ^|~0~
-32+^h|ename:VK_FORMAT_B10G11R11_UFLOAT_PACK32
-10+^s|B 11+^s|G 11+^s|R
-^|~9~ ^|~8~ ^|~7~ ^|~6~ ^|~5~
-^|~4~ ^|~3~ ^|~2~ ^|~1~ ^|~0~
-^|~10~ ^|~9~ ^|~8~ ^|~7~ ^|~6~ ^|~5~
-^|~4~ ^|~3~ ^|~2~ ^|~1~ ^|~0~
-^|~10~ ^|~9~ ^|~8~ ^|~7~ ^|~6~ ^|~5~
-^|~4~ ^|~3~ ^|~2~ ^|~1~ ^|~0~
-32+^h|ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32
-5+^s|E 9+^s|B 9+^s|G 9+^s|R
-^|~4~ ^|~3~ ^|~2~ ^|~1~ ^|~0~
-^|~8~ ^|~7~ ^|~6~ ^|~5~
-^|~4~ ^|~3~ ^|~2~ ^|~1~ ^|~0~
-^|~8~ ^|~7~ ^|~6~ ^|~5~
-^|~4~ ^|~3~ ^|~2~ ^|~1~ ^|~0~
-^|~8~ ^|~7~ ^|~6~ ^|~5~
-^|~4~ ^|~3~ ^|~2~ ^|~1~ ^|~0~
-32+^h|ename:VK_FORMAT_X8_D24_UNORM_PACK32
-8+^s|X 24+^s|D
-^|~7~ ^|~6~ ^|~5~ ^|~4~
-^|~3~ ^|~2~ ^|~1~ ^|~0~
-^|~23~ ^|~22~ ^|~21~ ^|~20~
-^|~19~ ^|~18~ ^|~17~ ^|~16~
-^|~15~ ^|~14~ ^|~13~ ^|~12~
-^|~11~ ^|~10~ ^|~9~ ^|~8~
-^|~7~ ^|~6~ ^|~5~ ^|~4~
-^|~3~ ^|~2~ ^|~1~ ^|~0~
-|====
-
-
-[[formats-depth-stencil]]
-=== Depth/Stencil Formats
-
-Depth/stencil formats are considered opaque and need not be stored in the
-exact number of bits per texel or component ordering indicated by the format
-enum.
-However, implementations must: not substitute a different depth or stencil
-precision than that described in the format (e.g. D16 must: not be
-implemented as D24 or D32).
-
-
-[[formats-compatibility-classes]]
-=== Format Compatibility Classes
-
-Uncompressed color formats are _compatible_ with each other if they occupy
-the same number of bits per texel block.
-Compressed color formats are compatible with each other if the only
-difference between them is the numerical type of the uncompressed pixels
-(e.g. signed vs. unsigned, or SRGB vs. UNORM encoding).
-Each depth/stencil format is only compatible with itself.
-In the <<formats-compatibility,following>> table, all the formats in the
-same row are compatible.
-
-
-[[formats-compatibility]]
-.Compatible Formats
-[width="90%",cols="4,10",options="header"]
-|====
-| Class, Texel Block Size, # Texels/Block | Formats
-| 8-bit +
-  Block size 1 byte +
-  1 texel/block
-                  | ename:VK_FORMAT_R4G4_UNORM_PACK8, +
-                    ename:VK_FORMAT_R8_UNORM, +
-                    ename:VK_FORMAT_R8_SNORM, +
-                    ename:VK_FORMAT_R8_USCALED, +
-                    ename:VK_FORMAT_R8_SSCALED, +
-                    ename:VK_FORMAT_R8_UINT, +
-                    ename:VK_FORMAT_R8_SINT, +
-                    ename:VK_FORMAT_R8_SRGB
-| 16-bit +
-  Block size 2 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_R4G4B4A4_UNORM_PACK16, +
-                    ename:VK_FORMAT_B4G4R4A4_UNORM_PACK16, +
-ifdef::VK_EXT_4444_formats[]
-                    ename:VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT, +
-                    ename:VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT, +
-endif::VK_EXT_4444_formats[]
-                    ename:VK_FORMAT_R5G6B5_UNORM_PACK16, +
-                    ename:VK_FORMAT_B5G6R5_UNORM_PACK16, +
-                    ename:VK_FORMAT_R5G5B5A1_UNORM_PACK16, +
-                    ename:VK_FORMAT_B5G5R5A1_UNORM_PACK16, +
-                    ename:VK_FORMAT_A1R5G5B5_UNORM_PACK16, +
-                    ename:VK_FORMAT_R8G8_UNORM, +
-                    ename:VK_FORMAT_R8G8_SNORM, +
-                    ename:VK_FORMAT_R8G8_USCALED, +
-                    ename:VK_FORMAT_R8G8_SSCALED, +
-                    ename:VK_FORMAT_R8G8_UINT, +
-                    ename:VK_FORMAT_R8G8_SINT, +
-                    ename:VK_FORMAT_R8G8_SRGB, +
-                    ename:VK_FORMAT_R16_UNORM, +
-                    ename:VK_FORMAT_R16_SNORM, +
-                    ename:VK_FORMAT_R16_USCALED, +
-                    ename:VK_FORMAT_R16_SSCALED, +
-                    ename:VK_FORMAT_R16_UINT, +
-                    ename:VK_FORMAT_R16_SINT, +
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-                    ename:VK_FORMAT_R16_SFLOAT
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-                    ename:VK_FORMAT_R16_SFLOAT, +
-                    ename:VK_FORMAT_R10X6_UNORM_PACK16, +
-                    ename:VK_FORMAT_R12X4_UNORM_PACK16
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-| 24-bit +
-  Block size 3 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_R8G8B8_UNORM, +
-                    ename:VK_FORMAT_R8G8B8_SNORM, +
-                    ename:VK_FORMAT_R8G8B8_USCALED, +
-                    ename:VK_FORMAT_R8G8B8_SSCALED, +
-                    ename:VK_FORMAT_R8G8B8_UINT, +
-                    ename:VK_FORMAT_R8G8B8_SINT, +
-                    ename:VK_FORMAT_R8G8B8_SRGB, +
-                    ename:VK_FORMAT_B8G8R8_UNORM, +
-                    ename:VK_FORMAT_B8G8R8_SNORM, +
-                    ename:VK_FORMAT_B8G8R8_USCALED, +
-                    ename:VK_FORMAT_B8G8R8_SSCALED, +
-                    ename:VK_FORMAT_B8G8R8_UINT, +
-                    ename:VK_FORMAT_B8G8R8_SINT, +
-                    ename:VK_FORMAT_B8G8R8_SRGB
-| 32-bit +
-  Block size 4 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_R8G8B8A8_UNORM, +
-                    ename:VK_FORMAT_R8G8B8A8_SNORM, +
-                    ename:VK_FORMAT_R8G8B8A8_USCALED, +
-                    ename:VK_FORMAT_R8G8B8A8_SSCALED, +
-                    ename:VK_FORMAT_R8G8B8A8_UINT, +
-                    ename:VK_FORMAT_R8G8B8A8_SINT, +
-                    ename:VK_FORMAT_R8G8B8A8_SRGB, +
-                    ename:VK_FORMAT_B8G8R8A8_UNORM, +
-                    ename:VK_FORMAT_B8G8R8A8_SNORM, +
-                    ename:VK_FORMAT_B8G8R8A8_USCALED, +
-                    ename:VK_FORMAT_B8G8R8A8_SSCALED, +
-                    ename:VK_FORMAT_B8G8R8A8_UINT, +
-                    ename:VK_FORMAT_B8G8R8A8_SINT, +
-                    ename:VK_FORMAT_B8G8R8A8_SRGB, +
-                    ename:VK_FORMAT_A8B8G8R8_UNORM_PACK32, +
-                    ename:VK_FORMAT_A8B8G8R8_SNORM_PACK32, +
-                    ename:VK_FORMAT_A8B8G8R8_USCALED_PACK32, +
-                    ename:VK_FORMAT_A8B8G8R8_SSCALED_PACK32, +
-                    ename:VK_FORMAT_A8B8G8R8_UINT_PACK32, +
-                    ename:VK_FORMAT_A8B8G8R8_SINT_PACK32, +
-                    ename:VK_FORMAT_A8B8G8R8_SRGB_PACK32, +
-                    ename:VK_FORMAT_A2R10G10B10_UNORM_PACK32, +
-                    ename:VK_FORMAT_A2R10G10B10_SNORM_PACK32, +
-                    ename:VK_FORMAT_A2R10G10B10_USCALED_PACK32, +
-                    ename:VK_FORMAT_A2R10G10B10_SSCALED_PACK32, +
-                    ename:VK_FORMAT_A2R10G10B10_UINT_PACK32, +
-                    ename:VK_FORMAT_A2R10G10B10_SINT_PACK32, +
-                    ename:VK_FORMAT_A2B10G10R10_UNORM_PACK32, +
-                    ename:VK_FORMAT_A2B10G10R10_SNORM_PACK32, +
-                    ename:VK_FORMAT_A2B10G10R10_USCALED_PACK32, +
-                    ename:VK_FORMAT_A2B10G10R10_SSCALED_PACK32, +
-                    ename:VK_FORMAT_A2B10G10R10_UINT_PACK32, +
-                    ename:VK_FORMAT_A2B10G10R10_SINT_PACK32, +
-                    ename:VK_FORMAT_R16G16_UNORM, +
-                    ename:VK_FORMAT_R16G16_SNORM, +
-                    ename:VK_FORMAT_R16G16_USCALED, +
-                    ename:VK_FORMAT_R16G16_SSCALED, +
-                    ename:VK_FORMAT_R16G16_UINT, +
-                    ename:VK_FORMAT_R16G16_SINT, +
-                    ename:VK_FORMAT_R16G16_SFLOAT, +
-                    ename:VK_FORMAT_R32_UINT, +
-                    ename:VK_FORMAT_R32_SINT, +
-                    ename:VK_FORMAT_R32_SFLOAT, +
-                    ename:VK_FORMAT_B10G11R11_UFLOAT_PACK32, +
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-                    ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-                    ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, +
-                    ename:VK_FORMAT_R10X6G10X6_UNORM_2PACK16, +
-                    ename:VK_FORMAT_R12X4G12X4_UNORM_2PACK16
-| 32-bit G8B8G8R8 +
-  Block size 4 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G8B8G8R8_422_UNORM
-| 32-bit B8G8R8G8 +
-  Block size 4 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_B8G8R8G8_422_UNORM
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-| 48-bit +
-  Block size 6 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_R16G16B16_UNORM, +
-                    ename:VK_FORMAT_R16G16B16_SNORM, +
-                    ename:VK_FORMAT_R16G16B16_USCALED, +
-                    ename:VK_FORMAT_R16G16B16_SSCALED, +
-                    ename:VK_FORMAT_R16G16B16_UINT, +
-                    ename:VK_FORMAT_R16G16B16_SINT, +
-                    ename:VK_FORMAT_R16G16B16_SFLOAT
-| 64-bit +
-  Block size 8 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_R16G16B16A16_UNORM, +
-                    ename:VK_FORMAT_R16G16B16A16_SNORM, +
-                    ename:VK_FORMAT_R16G16B16A16_USCALED, +
-                    ename:VK_FORMAT_R16G16B16A16_SSCALED, +
-                    ename:VK_FORMAT_R16G16B16A16_UINT, +
-                    ename:VK_FORMAT_R16G16B16A16_SINT, +
-                    ename:VK_FORMAT_R16G16B16A16_SFLOAT, +
-                    ename:VK_FORMAT_R32G32_UINT, +
-                    ename:VK_FORMAT_R32G32_SINT, +
-                    ename:VK_FORMAT_R32G32_SFLOAT, +
-                    ename:VK_FORMAT_R64_UINT, +
-                    ename:VK_FORMAT_R64_SINT, +
-                    ename:VK_FORMAT_R64_SFLOAT
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-| 64-bit R10G10B10A10 +
-  Block size 8 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16
-| 64-bit G10B10G10R10 +
-  Block size 8 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16
-| 64-bit B10G10R10G10 +
-  Block size 8 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16
-| 64-bit R12G12B12A12 +
-  Block size 8 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16
-| 64-bit G12B12G12R12 +
-  Block size 8 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16
-| 64-bit B12G12R12G12 +
-  Block size 8 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16
-| 64-bit G16B16G16R16 +
-  Block size 8 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G16B16G16R16_422_UNORM
-| 64-bit B16G16R16G16 +
-  Block size 8 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_B16G16R16G16_422_UNORM
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-| 96-bit +
-  Block size 12 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_R32G32B32_UINT, +
-                    ename:VK_FORMAT_R32G32B32_SINT, +
-                    ename:VK_FORMAT_R32G32B32_SFLOAT
-| 128-bit +
-  Block size 16 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_R32G32B32A32_UINT, +
-                    ename:VK_FORMAT_R32G32B32A32_SINT, +
-                    ename:VK_FORMAT_R32G32B32A32_SFLOAT, +
-                    ename:VK_FORMAT_R64G64_UINT, +
-                    ename:VK_FORMAT_R64G64_SINT, +
-                    ename:VK_FORMAT_R64G64_SFLOAT
-| 192-bit +
-  Block size 24 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_R64G64B64_UINT, +
-                    ename:VK_FORMAT_R64G64B64_SINT, +
-                    ename:VK_FORMAT_R64G64B64_SFLOAT
-| 256-bit +
-  Block size 32 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_R64G64B64A64_UINT, +
-                    ename:VK_FORMAT_R64G64B64A64_SINT, +
-                    ename:VK_FORMAT_R64G64B64A64_SFLOAT
-| BC1_RGB (64 bit) +
-  Block size 8 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_BC1_RGB_UNORM_BLOCK, +
-                    ename:VK_FORMAT_BC1_RGB_SRGB_BLOCK
-| BC1_RGBA (64 bit) +
-  Block size 8 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_BC1_RGBA_UNORM_BLOCK, +
-                    ename:VK_FORMAT_BC1_RGBA_SRGB_BLOCK
-| BC2 (128 bit) +
-  Block size 16 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_BC2_UNORM_BLOCK, +
-                    ename:VK_FORMAT_BC2_SRGB_BLOCK
-| BC3 (128 bit) +
-  Block size 16 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_BC3_UNORM_BLOCK, +
-                    ename:VK_FORMAT_BC3_SRGB_BLOCK
-| BC4 (64 bit) +
-  Block size 8 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_BC4_UNORM_BLOCK, +
-                    ename:VK_FORMAT_BC4_SNORM_BLOCK
-| BC5 (128 bit) +
-  Block size 16 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_BC5_UNORM_BLOCK, +
-                    ename:VK_FORMAT_BC5_SNORM_BLOCK
-| BC6H (128 bit) +
-  Block size 16 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_BC6H_UFLOAT_BLOCK, +
-                    ename:VK_FORMAT_BC6H_SFLOAT_BLOCK
-| BC7 (128 bit) +
-  Block size 16 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_BC7_UNORM_BLOCK, +
-                    ename:VK_FORMAT_BC7_SRGB_BLOCK
-| ETC2_RGB (64 bit) +
-  Block size 8 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, +
-                    ename:VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK
-| ETC2_RGBA (64 bit) +
-  Block size 8 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, +
-                    ename:VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK
-| ETC2_EAC_RGBA (64 bit) +
-  Block size 8 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, +
-                    ename:VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK
-| EAC_R (64 bit) +
-  Block size 8 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_EAC_R11_UNORM_BLOCK, +
-                    ename:VK_FORMAT_EAC_R11_SNORM_BLOCK
-| EAC_RG (128 bit) +
-  Block size 16 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_EAC_R11G11_UNORM_BLOCK, +
-                    ename:VK_FORMAT_EAC_R11G11_SNORM_BLOCK
-| ASTC_4x4 (128 bit) +
-  Block size 16 bytes +
-  16 texels/block
-                  | ename:VK_FORMAT_ASTC_4x4_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_4x4_SRGB_BLOCK
-| ASTC_5x4 (128 bit) +
-  Block size 16 bytes +
-  20 texels/block
-                  | ename:VK_FORMAT_ASTC_5x4_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_5x4_SRGB_BLOCK
-| ASTC_5x5 (128 bit) +
-  Block size 16 bytes +
-  25 texels/block
-                  | ename:VK_FORMAT_ASTC_5x5_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_5x5_SRGB_BLOCK
-| ASTC_6x5 (128 bit) +
-  Block size 16 bytes +
-  30 texels/block
-                  | ename:VK_FORMAT_ASTC_6x5_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_6x5_SRGB_BLOCK
-| ASTC_6x6 (128 bit) +
-  Block size 16 bytes +
-  36 texels/block
-                  | ename:VK_FORMAT_ASTC_6x6_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_6x6_SRGB_BLOCK
-| ASTC_8x5 (128 bit) +
-  Block size 16 bytes +
-  40 texels/block
-                  | ename:VK_FORMAT_ASTC_8x5_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_8x5_SRGB_BLOCK
-| ASTC_8x6 (128 bit) +
-  Block size 16 bytes +
-  48 texels/block
-                  | ename:VK_FORMAT_ASTC_8x6_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_8x6_SRGB_BLOCK
-| ASTC_8x8 (128 bit) +
-  Block size 16 bytes +
-  64 texels/block
-                  | ename:VK_FORMAT_ASTC_8x8_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_8x8_SRGB_BLOCK
-| ASTC_10x5 (128 bit) +
-  Block size 16 bytes +
-  50 texels/block
-                  | ename:VK_FORMAT_ASTC_10x5_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_10x5_SRGB_BLOCK
-| ASTC_10x6 (128 bit) +
-  Block size 16 bytes +
-  60 texels/block
-                  | ename:VK_FORMAT_ASTC_10x6_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_10x6_SRGB_BLOCK
-| ASTC_10x8 (128 bit) +
-  Block size 16 bytes +
-  80 texels/block
-                  | ename:VK_FORMAT_ASTC_10x8_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_10x8_SRGB_BLOCK
-| ASTC_10x10 (128 bit) +
-  Block size 16 bytes +
-  100 texels/block
-                  | ename:VK_FORMAT_ASTC_10x10_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_10x10_SRGB_BLOCK
-| ASTC_12x10 (128 bit) +
-  Block size 16 bytes +
-  120 texels/block
-                  | ename:VK_FORMAT_ASTC_12x10_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_12x10_SRGB_BLOCK
-| ASTC_12x12 (128 bit) +
-  Block size 16 bytes +
-  144 texels/block
-                  | ename:VK_FORMAT_ASTC_12x12_UNORM_BLOCK, +
-ifdef::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT, +
-endif::VK_EXT_texture_compression_astc_hdr[]
-                    ename:VK_FORMAT_ASTC_12x12_SRGB_BLOCK
-| D16 (16 bit) +
-  Block size 2 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_D16_UNORM
-| D24 (32 bit) +
-  Block size 4 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_X8_D24_UNORM_PACK32
-| D32 (32 bit) +
-  Block size 4 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_D32_SFLOAT
-| S8 (8 bit) +
-  Block size 1 byte +
-  1 texel/block
-                  | ename:VK_FORMAT_S8_UINT
-| D16S8 (24 bit) +
-  Block size 3 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_D16_UNORM_S8_UINT
-| D24S8 (32 bit) +
-  Block size 4 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_D24_UNORM_S8_UINT
-| D32S8 (40 bit) +
-  Block size 5 bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_D32_SFLOAT_S8_UINT
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-| 8-bit 3-plane 420 +
-  Block size (1,1,1) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM
-| 8-bit 2-plane 420 +
-  Block size (1,2) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G8_B8R8_2PLANE_420_UNORM
-| 8-bit 3-plane 422 +
-  Block size (1,1,1) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM
-| 8-bit 2-plane 422 +
-  Block size (1,2) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G8_B8R8_2PLANE_422_UNORM
-| 8-bit 3-plane 444 +
-  Block size (1,1,1) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM
-| 10-bit 3-plane 420 +
-  Block size (2,2,2) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16
-| 10-bit 2-plane 420 +
-  Block size (2,4) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16
-| 10-bit 3-plane 422 +
-  Block size (2,2,2) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16
-| 10-bit 2-plane 422 +
-  Block size (2,2) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16
-| 10-bit 3-plane 444 +
-  Block size (2,2,2) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16
-| 12-bit 3-plane 420 +
-  Block size (2,2,2) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16
-| 12-bit 2-plane 420 +
-  Block size (2,4) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16
-| 12-bit 3-plane 422 +
-  Block size (2,2,2) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16
-| 12-bit 2-plane 422 +
-  Block size (2,4) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16
-| 12-bit 3-plane 444 +
-  Block size (2,2,2) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16
-| 16-bit 3-plane 420 +
-  Block size (2,2,2) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM
-| 16-bit 2-plane 420 +
-  Block size (2,4) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G16_B16R16_2PLANE_420_UNORM
-| 16-bit 3-plane 422 +
-  Block size (2,2,2) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM
-| 16-bit 2-plane 422 +
-  Block size (2,4) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G16_B16R16_2PLANE_422_UNORM
-| 16-bit 3-plane 444 +
-  Block size (2,2,2) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM
-ifdef::VK_EXT_ycbcr_2plane_444_formats[]
-| 8-bit 2-plane 444 +
-  Block size (1,2) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT
-| 10-bit 2-plane 444 +
-  Block size (2,4) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT
-| 12-bit 2-plane 444 +
-  Block size (2,4) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT
-| 16-bit 2-plane 444 +
-  Block size (2,4) bytes +
-  1 texel/block
-                  | ename:VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT
-endif::VK_EXT_ycbcr_2plane_444_formats[]
-
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-|====
-
-
-[[formats-properties]]
-== Format Properties
-
-[open,refpage='vkGetPhysicalDeviceFormatProperties',desc='Lists physical device\'s format capabilities',type='protos']
---
-To query supported format features which are properties of the physical
-device, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceFormatProperties.txt[]
-
-  * pname:physicalDevice is the physical device from which to query the
-    format properties.
-  * pname:format is the format whose properties are queried.
-  * pname:pFormatProperties is a pointer to a slink:VkFormatProperties
-    structure in which physical device properties for pname:format are
-    returned.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceFormatProperties.txt[]
---
-
-[open,refpage='VkFormatProperties',desc='Structure specifying image format properties',type='structs']
---
-The sname:VkFormatProperties structure is defined as:
-
-include::{generated}/api/structs/VkFormatProperties.txt[]
-
-  * pname:linearTilingFeatures is a bitmask of elink:VkFormatFeatureFlagBits
-    specifying features supported by images created with a pname:tiling
-    parameter of ename:VK_IMAGE_TILING_LINEAR.
-  * pname:optimalTilingFeatures is a bitmask of
-    elink:VkFormatFeatureFlagBits specifying features supported by images
-    created with a pname:tiling parameter of ename:VK_IMAGE_TILING_OPTIMAL.
-  * pname:bufferFeatures is a bitmask of elink:VkFormatFeatureFlagBits
-    specifying features supported by buffers.
-
-[NOTE]
-.Note
-====
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-If no format feature flags are supported, then the only possible use would
-be image transfers - which alone are not useful.
-As such, if no format feature flags are supported, the format itself is not
-supported, and images of that format cannot be created.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-If no format feature flags are supported, the format itself is not
-supported, and images of that format cannot be created.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-====
-
-If pname:format is a block-compressed format, then pname:bufferFeatures
-must: not support any features for the format.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-If pname:format is not a multi-plane format then pname:linearTilingFeatures
-and pname:optimalTilingFeatures must: not contain
-ename:VK_FORMAT_FEATURE_DISJOINT_BIT.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-include::{generated}/validity/structs/VkFormatProperties.txt[]
---
-
-[open,refpage='VkFormatFeatureFlagBits',desc='Bitmask specifying features supported by a buffer',type='enums']
---
-Bits which can: be set in the slink:VkFormatProperties features
-pname:linearTilingFeatures, pname:optimalTilingFeatures,
-ifdef::VK_EXT_image_drm_format_modifier[]
-slink:VkDrmFormatModifierPropertiesEXT::pname:drmFormatModifierTilingFeatures,
-endif::VK_EXT_image_drm_format_modifier[]
-and pname:bufferFeatures are:
-
-include::{generated}/api/enums/VkFormatFeatureFlagBits.txt[]
-
-These values
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-ifdef::VK_KHR_format_feature_flags2[]
-all have the same meaning as the equivalently named values for
-tlink:VkFormatFeatureFlags2KHR and
-endif::VK_KHR_format_feature_flags2[]
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-may: be set in
-ifndef::VK_EXT_image_drm_format_modifier[]
-pname:linearTilingFeatures and pname:optimalTilingFeatures,
-endif::VK_EXT_image_drm_format_modifier[]
-ifdef::VK_EXT_image_drm_format_modifier[]
-pname:linearTilingFeatures, pname:optimalTilingFeatures, and
-slink:VkDrmFormatModifierPropertiesEXT::pname:drmFormatModifierTilingFeatures,
-endif::VK_EXT_image_drm_format_modifier[]
-specifying that the features are supported by <<VkImage,images>> or
-<<VkImageView,image views>>
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-or <<VkSamplerYcbcrConversion,sampler {YCbCr} conversion objects>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-created with the queried
-flink:vkGetPhysicalDeviceFormatProperties::pname:format:
-
-  * ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT specifies that an image view
-    can: be <<descriptorsets-sampledimage, sampled from>>.
-  * ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT specifies that an image view
-    can: be used as a <<descriptorsets-storageimage, storage image>>.
-  * ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT specifies that an image
-    view can: be used as storage image that supports atomic operations.
-  * ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT specifies that an image
-    view can: be used as a framebuffer color attachment and as an input
-    attachment.
-  * ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT specifies that an
-    image view can: be used as a framebuffer color attachment that supports
-    blending and as an input attachment.
-  * ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT specifies that an
-    image view can: be used as a framebuffer depth/stencil attachment and as
-    an input attachment.
-  * ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT specifies that an image can: be
-    used as pname:srcImage for the
-ifndef::VK_KHR_copy_commands2[]
-    fname:vkCmdBlitImage command.
-endif::VK_KHR_copy_commands2[]
-ifdef::VK_KHR_copy_commands2[]
-    fname:vkCmdBlitImage2KHR and fname:vkCmdBlitImage commands.
-endif::VK_KHR_copy_commands2[]
-  * ename:VK_FORMAT_FEATURE_BLIT_DST_BIT specifies that an image can: be
-    used as pname:dstImage for the
-ifndef::VK_KHR_copy_commands2[]
-    fname:vkCmdBlitImage command.
-endif::VK_KHR_copy_commands2[]
-ifdef::VK_KHR_copy_commands2[]
-    fname:vkCmdBlitImage2KHR and fname:vkCmdBlitImage commands.
-endif::VK_KHR_copy_commands2[]
-  * ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT specifies that
-    if ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT is also set, an image view
-    can: be used with a sampler that has either of pname:magFilter or
-    pname:minFilter set to ename:VK_FILTER_LINEAR, or pname:mipmapMode set
-    to ename:VK_SAMPLER_MIPMAP_MODE_LINEAR.
-    If ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT is also set, an image can be
-    used as the pname:srcImage to
-ifndef::VK_KHR_copy_commands2[]
-    fname:vkCmdBlitImage
-endif::VK_KHR_copy_commands2[]
-ifdef::VK_KHR_copy_commands2[]
-    fname:vkCmdBlitImage2KHR and fname:vkCmdBlitImage
-endif::VK_KHR_copy_commands2[]
-    with a pname:filter of ename:VK_FILTER_LINEAR.
-    This bit must: only be exposed for formats that also support the
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT or
-    ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT.
-+
-If the format being queried is a depth/stencil format, this bit only
-specifies that the depth aspect (not the stencil aspect) of an image of this
-format supports linear filtering, and that linear filtering of the depth
-aspect is supported whether depth compare is enabled in the sampler or not.
-Where depth comparison is supported it may: be linear filtered whether this
-bit is present or not, but where this bit is not present the filtered value
-may: be computed in an implementation-dependent manner which differs from
-the normal rules of linear filtering.
-The resulting value must: be in the range [eq]#[0,1]# and should: be
-proportional to, or a weighted average of, the number of comparison passes
-or failures.
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * ename:VK_FORMAT_FEATURE_TRANSFER_SRC_BIT specifies that an image can: be
-    used as a source image for <<copies, copy commands>>.
-  * ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT specifies that an image can: be
-    used as a destination image for <<copies, copy commands>> and <<clears,
-    clear commands>>.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-  * ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT specifies
-    sname:VkImage can: be used as a sampled image with a min or max
-    elink:VkSamplerReductionMode.
-    This bit must: only be exposed for formats that also support the
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT.
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-ifdef::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-  * ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT specifies
-    that sname:VkImage can: be used with a sampler that has either of
-    pname:magFilter or pname:minFilter set to ename:VK_FILTER_CUBIC_EXT, or
-    be the source image for a blit with pname:filter set to
-    ename:VK_FILTER_CUBIC_EXT.
-    This bit must: only be exposed for formats that also support the
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT.
-    If the format being queried is a depth/stencil format, this only
-    specifies that the depth aspect is cubic filterable.
-endif::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * ename:VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT specifies that an
-    application can: define a <<samplers-YCbCr-conversion,sampler {YCbCr}
-    conversion>> using this format as a source, and that an image of this
-    format can: be used with a slink:VkSamplerYcbcrConversionCreateInfo
-    pname:xChromaOffset and/or pname:yChromaOffset of
-    ename:VK_CHROMA_LOCATION_MIDPOINT.
-    Otherwise both pname:xChromaOffset and pname:yChromaOffset must: be
-    ename:VK_CHROMA_LOCATION_COSITED_EVEN.
-    If a format does not incorporate chroma downsampling (it is not a
-    "`422`" or "`420`" format) but the implementation supports sampler
-    {YCbCr} conversion for this format, the implementation must: set
-    ename:VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT.
-  * ename:VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT specifies that an
-    application can: define a <<samplers-YCbCr-conversion,sampler {YCbCr}
-    conversion>> using this format as a source, and that an image of this
-    format can: be used with a slink:VkSamplerYcbcrConversionCreateInfo
-    pname:xChromaOffset and/or pname:yChromaOffset of
-    ename:VK_CHROMA_LOCATION_COSITED_EVEN.
-    Otherwise both pname:xChromaOffset and pname:yChromaOffset must: be
-    ename:VK_CHROMA_LOCATION_MIDPOINT.
-    If neither ename:VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT nor
-    ename:VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT is set, the
-    application must: not define a <<samplers-YCbCr-conversion,sampler
-    {YCbCr} conversion>> using this format as a source.
-  * ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT
-    specifies that an application can: define a
-    <<samplers-YCbCr-conversion,sampler {YCbCr} conversion>> using this
-    format as a source with pname:chromaFilter set to
-    ename:VK_FILTER_LINEAR.
-  * ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT
-    specifies that the format can have different chroma, min, and mag
-    filters.
-  * ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT
-    specifies that reconstruction is explicit, as described in
-    <<textures-chroma-reconstruction>>.
-    If this bit is not present, reconstruction is implicit by default.
-  * ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT
-    specifies that reconstruction can: be forcibly made explicit by setting
-    slink:VkSamplerYcbcrConversionCreateInfo::pname:forceExplicitReconstruction
-    to ename:VK_TRUE.
-    If the format being queried supports
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT
-    it must: also support
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT.
-  * ename:VK_FORMAT_FEATURE_DISJOINT_BIT specifies that a multi-planar image
-    can: have the ename:VK_IMAGE_CREATE_DISJOINT_BIT set during image
-    creation.
-    An implementation must: not set ename:VK_FORMAT_FEATURE_DISJOINT_BIT for
-    _single-plane formats_.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_EXT_fragment_density_map[]
-  * ename:VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT specifies that an
-    image view can: be used as a
-    <<renderpass-fragmentdensitymapattachment,fragment density map
-    attachment>>.
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_KHR_fragment_shading_rate[]
-  * ename:VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-    specifies that an image view can: be used as a
-    <<primsrast-fragment-shading-rate-attachment, fragment shading rate
-    attachment>>.
-    An implementation must: not set this feature for formats with numeric
-    type other than etext:*UINT, or set it as a buffer feature.
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_KHR_video_decode_queue[]
-  * ename:VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR specifies that an
-    image view with this format can: be used as an output for
-    <<video-decode-operations,video decode operations>>
-  * ename:VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR specifies that an image
-    view with this format can: be used as a DPB for
-    <<video-decode-operations,video decode operations>>
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-  * ename:VK_FORMAT_FEATURE_VIDEO_ENCODE_INPUT_BIT_KHR specifies that an
-    image view with this format can: be used as an input to
-    <<video-encode-operations,video encode operations>>
-  * ename:VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR specifies that an image
-    view with this format can: be used as a DPB for
-    <<video-encode-operations,video encode operations>>
-endif::VK_KHR_video_encode_queue[]
-
-[[buffer-compatible-format-features]]
-
-The following bits may: be set in pname:bufferFeatures, specifying that the
-features are supported by <<VkBuffer,buffers>> or <<VkBufferView,buffer
-views>> created with the queried
-flink:vkGetPhysicalDeviceFormatProperties::pname:format:
-
-  * ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT specifies that the
-    format can: be used to create a buffer view that can: be bound to a
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER descriptor.
-  * ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT specifies that the
-    format can: be used to create a buffer view that can: be bound to a
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER descriptor.
-  * ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT specifies that
-    atomic operations are supported on
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER with this format.
-  * ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT specifies that the format can:
-    be used as a vertex attribute format
-    (sname:VkVertexInputAttributeDescription::pname:format).
-ifdef::VK_KHR_acceleration_structure[]
-  * ename:VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR
-    specifies that the format can: be used as the vertex format when
-    creating an <<acceleration-structure,acceleration structure>>
-    (sname:VkAccelerationStructureGeometryTrianglesDataKHR::pname:vertexFormat).
-    This format can: also be used as the vertex format in host memory when
-    doing <<host-acceleration-structure, host acceleration structure>>
-    builds.
-endif::VK_KHR_acceleration_structure[]
-
---
-
-[open,refpage='VkFormatFeatureFlags',desc='Bitmask of VkFormatFeatureFlagBits',type='flags']
---
-include::{generated}/api/flags/VkFormatFeatureFlags.txt[]
-
-tname:VkFormatFeatureFlags is a bitmask type for setting a mask of zero or
-more elink:VkFormatFeatureFlagBits.
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-[open,refpage='vkGetPhysicalDeviceFormatProperties2',desc='Lists physical device\'s format capabilities',type='protos']
---
-To query supported format features which are properties of the physical
-device, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetPhysicalDeviceFormatProperties2.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_get_physical_device_properties2[or the equivalent command]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-include::{generated}/api/protos/vkGetPhysicalDeviceFormatProperties2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:physicalDevice is the physical device from which to query the
-    format properties.
-  * pname:format is the format whose properties are queried.
-  * pname:pFormatProperties is a pointer to a slink:VkFormatProperties2
-    structure in which physical device properties for pname:format are
-    returned.
-
-fname:vkGetPhysicalDeviceFormatProperties2 behaves similarly to
-flink:vkGetPhysicalDeviceFormatProperties, with the ability to return
-extended information in a pname:pNext chain of output structures.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceFormatProperties2.txt[]
---
-
-[open,refpage='VkFormatProperties2',desc='Structure specifying image format properties',type='structs']
---
-The sname:VkFormatProperties2 structure is defined as:
-
-include::{generated}/api/structs/VkFormatProperties2.txt[]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-or the equivalent
-
-include::{generated}/api/structs/VkFormatProperties2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:formatProperties is a slink:VkFormatProperties structure
-    describing features supported by the requested format.
-
-include::{generated}/validity/structs/VkFormatProperties2.txt[]
---
-
-ifdef::VK_EXT_image_drm_format_modifier[]
-[open,refpage='VkDrmFormatModifierPropertiesListEXT',desc='Structure specifying the list of DRM format modifiers supported for a format',type='structs']
---
-To obtain the list of <<glossary-drm-format-modifier,Linux DRM format
-modifiers>> compatible with a elink:VkFormat, add a
-slink:VkDrmFormatModifierPropertiesListEXT structure to the pname:pNext
-chain of slink:VkFormatProperties2.
-
-The slink:VkDrmFormatModifierPropertiesListEXT structure is defined as:
-
-include::{generated}/api/structs/VkDrmFormatModifierPropertiesListEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:drmFormatModifierCount is an inout parameter related to the number
-    of modifiers compatible with the pname:format, as described below.
-  * pname:pDrmFormatModifierProperties is either `NULL` or a pointer to an
-    array of slink:VkDrmFormatModifierPropertiesEXT structures.
-
-If pname:pDrmFormatModifierProperties is `NULL`, then the function returns
-in pname:drmFormatModifierCount the number of modifiers compatible with the
-queried pname:format.
-Otherwise, the application must: set pname:drmFormatModifierCount to the
-length of the array pname:pDrmFormatModifierProperties; the function will
-write at most pname:drmFormatModifierCount elements to the array, and will
-return in pname:drmFormatModifierCount the number of elements written.
-
-Among the elements in array pname:pDrmFormatModifierProperties, each
-returned pname:drmFormatModifier must: be unique.
-
-include::{generated}/validity/structs/VkDrmFormatModifierPropertiesListEXT.txt[]
---
-
-[open,refpage='VkDrmFormatModifierPropertiesEXT',desc='Structure specifying properties of a format when combined with a DRM format modifier',type='structs']
---
-The slink:VkDrmFormatModifierPropertiesEXT structure describes properties of
-a elink:VkFormat when that format is combined with a
-<<glossary-drm-format-modifier,Linux DRM format modifier>>.
-These properties, like those of slink:VkFormatProperties2, are independent
-of any particular image.
-
-The slink:VkDrmFormatModifierPropertiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkDrmFormatModifierPropertiesEXT.txt[]
-
-  * pname:drmFormatModifier is a _Linux DRM format modifier_.
-  * pname:drmFormatModifierPlaneCount is the number of _memory planes_ in
-    any image created with pname:format and pname:drmFormatModifier.
-    An image's _memory planecount_ is distinct from its _format planecount_,
-    as explained below.
-  * pname:drmFormatModifierTilingFeatures is a bitmask of
-    elink:VkFormatFeatureFlagBits that are supported by any image created
-    with pname:format and pname:drmFormatModifier.
-
-The returned pname:drmFormatModifierTilingFeatures must: contain at least
-one bit.
-
-The implementation must: not return etext:DRM_FORMAT_MOD_INVALID in
-pname:drmFormatModifier.
-
-An image's _memory planecount_ (as returned by
-pname:drmFormatModifierPlaneCount) is distinct from its _format planecount_
-(in the sense of <<formats-requiring-sampler-ycbcr-conversion,multi-planar>>
-{YCbCr} formats).
-In tlink:VkImageAspectFlags, each
-`VK_IMAGE_ASPECT_MEMORY_PLANE__{ibit}__BIT_EXT` represents a _memory plane_
-and each `VK_IMAGE_ASPECT_PLANE__{ibit}__BIT` a _format plane_.
-
-An image's set of _format planes_ is an ordered partition of the image's
-*content* into separable groups of format components.
-The ordered partition is encoded in the name of each elink:VkFormat.
-For example, ename:VK_FORMAT_G8_B8R8_2PLANE_420_UNORM contains two _format
-planes_; the first plane contains the green component and the second plane
-contains the blue component and red component.
-If the format name does not contain `PLANE`, then the format contains a
-single plane; for example, ename:VK_FORMAT_R8G8B8A8_UNORM.
-Some commands, such as flink:vkCmdCopyBufferToImage, do not operate on all
-format components in the image, but instead operate only on the _format
-planes_ explicitly chosen by the application and operate on each _format
-plane_ independently.
-
-An image's set of _memory planes_ is an ordered partition of the image's
-*memory* rather than the image's *content*.
-Each _memory plane_ is a contiguous range of memory.
-The union of an image's _memory planes_ is not necessarily contiguous.
-
-If an image is <<glossary-linear-resource,linear>>, then the partition is
-the same for _memory planes_ and for _format planes_.
-Therefore, if the returned pname:drmFormatModifier is
-code:DRM_FORMAT_MOD_LINEAR, then pname:drmFormatModifierPlaneCount must:
-equal the _format planecount_, and pname:drmFormatModifierTilingFeatures
-must: be identical to the
-slink:VkFormatProperties2::pname:linearTilingFeatures returned in the same
-pname:pNext chain.
-
-If an image is <<glossary-linear-resource,non-linear>>, then the partition
-of the image's *memory* into _memory planes_ is implementation-specific and
-may: be unrelated to the partition of the image's *content* into _format
-planes_.
-For example, consider an image whose pname:format is
-ename:VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, pname:tiling is
-ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, whose pname:drmFormatModifier
-is not code:DRM_FORMAT_MOD_LINEAR, and pname:flags lacks
-ename:VK_IMAGE_CREATE_DISJOINT_BIT.
-The image has 3 _format planes_, and commands such
-flink:vkCmdCopyBufferToImage act on each _format plane_ independently as if
-the data of each _format plane_ were separable from the data of the other
-planes.
-In a straightforward implementation, the implementation may: store the
-image's content in 3 adjacent _memory planes_ where each _memory plane_
-corresponds exactly to a _format plane_.
-However, the implementation may: also store the image's content in a single
-_memory plane_ where all format components are combined using an
-implementation-private block-compressed format; or the implementation may:
-store the image's content in a collection of 7 adjacent _memory planes_
-using an implementation-private sharding technique.
-Because the image is non-linear and non-disjoint, the implementation has
-much freedom when choosing the image's placement in memory.
-
-The _memory planecount_ applies to function parameters and structures only
-when the API specifies an explicit requirement on
-pname:drmFormatModifierPlaneCount.
-In all other cases, the _memory planecount_ is ignored.
-
-include::{generated}/validity/structs/VkDrmFormatModifierPropertiesEXT.txt[]
---
-
-ifdef::VK_KHR_format_feature_flags2[]
-[open,refpage='VkDrmFormatModifierPropertiesList2EXT',desc='Structure specifying the list of DRM format modifiers supported for a format',type='structs']
---
-The list of <<glossary-drm-format-modifier,Linux DRM format modifiers>>
-compatible with a elink:VkFormat can: be obtained by adding a
-slink:VkDrmFormatModifierPropertiesList2EXT structure to the pname:pNext
-chain of slink:VkFormatProperties2.
-
-The slink:VkDrmFormatModifierPropertiesList2EXT structure is defined as:
-
-include::{generated}/api/structs/VkDrmFormatModifierPropertiesList2EXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:drmFormatModifierCount is an inout parameter related to the number
-    of modifiers compatible with the pname:format, as described below.
-  * pname:pDrmFormatModifierProperties is either `NULL` or a pointer to an
-    array of slink:VkDrmFormatModifierProperties2EXT structures.
-
-If pname:pDrmFormatModifierProperties is `NULL`, the number of modifiers
-compatible with the queried pname:format is returned in
-pname:drmFormatModifierCount.
-Otherwise, the application must: set pname:drmFormatModifierCount to the
-length of the array pname:pDrmFormatModifierProperties; the function will
-write at most pname:drmFormatModifierCount elements to the array, and will
-return in pname:drmFormatModifierCount the number of elements written.
-
-Among the elements in array pname:pDrmFormatModifierProperties, each
-returned pname:drmFormatModifier must: be unique.
-
-Among the elements in array pname:pDrmFormatModifierProperties, the bits
-reported in pname:drmFormatModifierTilingFeatures must: include the bits
-reported in the corresponding element of
-sname:VkDrmFormatModifierPropertiesListEXT::pname:pDrmFormatModifierProperties.
-
-include::{generated}/validity/structs/VkDrmFormatModifierPropertiesList2EXT.txt[]
---
-
-[open,refpage='VkDrmFormatModifierProperties2EXT',desc='Structure specifying properties of a format when combined with a DRM format modifier',type='structs']
---
-The slink:VkDrmFormatModifierProperties2EXT structure describes properties
-of a elink:VkFormat when that format is combined with a
-<<glossary-drm-format-modifier,Linux DRM format modifier>>.
-These properties, like those of slink:VkFormatProperties2, are independent
-of any particular image.
-
-The slink:VkDrmFormatModifierPropertiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkDrmFormatModifierProperties2EXT.txt[]
-
-  * pname:drmFormatModifier is a _Linux DRM format modifier_.
-  * pname:drmFormatModifierPlaneCount is the number of _memory planes_ in
-    any image created with pname:format and pname:drmFormatModifier.
-    An image's _memory planecount_ is distinct from its _format planecount_,
-    as explained below.
-  * pname:drmFormatModifierTilingFeatures is a bitmask of
-    elink:VkFormatFeatureFlagBits2KHR that are supported by any image
-    created with pname:format and pname:drmFormatModifier.
-include::{generated}/validity/structs/VkDrmFormatModifierProperties2EXT.txt[]
---
-endif::VK_KHR_format_feature_flags2[]
-endif::VK_EXT_image_drm_format_modifier[]
-
-ifdef::VK_KHR_format_feature_flags2[]
-[open,refpage='VkFormatProperties3KHR',desc='Structure specifying image format properties',type='structs']
---
-
-To query supported format extended features which are properties of the
-physical device, add slink:VkFormatProperties3KHR structure to the
-pname:pNext chain of slink:VkFormatProperties2.
-
-The slink:VkFormatProperties3KHR structure is defined as:
-
-include::{generated}/api/structs/VkFormatProperties3KHR.txt[]
-
-  * pname:linearTilingFeatures is a bitmask of
-    elink:VkFormatFeatureFlagBits2KHR specifying features supported by
-    images created with a pname:tiling parameter of
-    ename:VK_IMAGE_TILING_LINEAR.
-  * pname:optimalTilingFeatures is a bitmask of
-    elink:VkFormatFeatureFlagBits2KHR specifying features supported by
-    images created with a pname:tiling parameter of
-    ename:VK_IMAGE_TILING_OPTIMAL.
-  * pname:bufferFeatures is a bitmask of elink:VkFormatFeatureFlagBits2KHR
-    specifying features supported by buffers.
-
-The bits reported in pname:linearTilingFeatures, pname:optimalTilingFeatures
-and pname:bufferFeatures must: include the bits reported in the
-corresponding fields of sname:VkFormatProperties2::pname:formatProperties.
-
-include::{generated}/validity/structs/VkFormatProperties3KHR.txt[]
---
-
-[open,refpage='VkFormatFeatureFlagBits2KHR',desc='Bitmask specifying features supported by a buffer',type='enums']
---
-Bits which can: be set in the slink:VkFormatProperties3KHR features
-pname:linearTilingFeatures, pname:optimalTilingFeatures, and
-pname:bufferFeatures are:
-
-include::{generated}/api/enums/VkFormatFeatureFlagBits2KHR.txt[]
-
-The following bits may: be set in pname:linearTilingFeatures and
-pname:optimalTilingFeatures, specifying that the features are supported by
-<<VkImage,images>> or <<VkImageView,image views>>
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-or <<VkSamplerYcbcrConversion,sampler {YCbCr} conversion objects>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-created with the queried
-flink:vkGetPhysicalDeviceFormatProperties2::pname:format:
-
-  * ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR specifies that an image
-    view can: be <<descriptorsets-sampledimage, sampled from>>.
-  * ename:VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR specifies that an image
-    view can: be used as a <<descriptorsets-storageimage, storage image>>.
-  * ename:VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT_KHR specifies that an
-    image view can: be used as storage image that supports atomic
-    operations.
-  * ename:VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR specifies that an
-    image view can: be used as a framebuffer color attachment and as an
-    input attachment.
-  * ename:VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT_KHR specifies that
-    an image view can: be used as a framebuffer color attachment that
-    supports blending and as an input attachment.
-  * ename:VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR specifies
-    that an image view can: be used as a framebuffer depth/stencil
-    attachment and as an input attachment.
-  * ename:VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR specifies that an image can:
-    be used as pname:srcImage for the
-ifndef::VK_KHR_copy_commands2[]
-    fname:vkCmdBlitImage command.
-endif::VK_KHR_copy_commands2[]
-ifdef::VK_KHR_copy_commands2[]
-    fname:vkCmdBlitImage2KHR and fname:vkCmdBlitImage commands.
-endif::VK_KHR_copy_commands2[]
-  * ename:VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR specifies that an image can:
-    be used as pname:dstImage for the
-ifndef::VK_KHR_copy_commands2[]
-    fname:vkCmdBlitImage command.
-endif::VK_KHR_copy_commands2[]
-ifdef::VK_KHR_copy_commands2[]
-    fname:vkCmdBlitImage2KHR and fname:vkCmdBlitImage commands.
-endif::VK_KHR_copy_commands2[]
-  * ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT_KHR specifies
-    that if ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR is also set, an
-    image view can: be used with a sampler that has either of
-    pname:magFilter or pname:minFilter set to ename:VK_FILTER_LINEAR, or
-    pname:mipmapMode set to ename:VK_SAMPLER_MIPMAP_MODE_LINEAR.
-    If ename:VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR is also set, an image can
-    be used as the pname:srcImage to
-ifndef::VK_KHR_copy_commands2[]
-    fname:vkCmdBlitImage
-endif::VK_KHR_copy_commands2[]
-ifdef::VK_KHR_copy_commands2[]
-    fname:vkCmdBlitImage2KHR and fname:vkCmdBlitImage
-endif::VK_KHR_copy_commands2[]
-    with a pname:filter of ename:VK_FILTER_LINEAR.
-    This bit must: only be exposed for formats that also support the
-    ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR or
-    ename:VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR.
-+
-If the format being queried is a depth/stencil format, this bit only
-specifies that the depth aspect (not the stencil aspect) of an image of this
-format supports linear filtering.
-Where depth comparison is supported it may: be linear filtered whether this
-bit is present or not, but where this bit is not present the filtered value
-may: be computed in an implementation-dependent manner which differs from
-the normal rules of linear filtering.
-The resulting value must: be in the range [eq]#[0,1]# and should: be
-proportional to, or a weighted average of, the number of comparison passes
-or failures.
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * ename:VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR specifies that an image
-    can: be used as a source image for <<copies, copy commands>>.
-  * ename:VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR specifies that an image
-    can: be used as a destination image for <<copies, copy commands>> and
-    <<clears, clear commands>>.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-  * ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT_KHR specifies
-    sname:VkImage can: be used as a sampled image with a min or max
-    elink:VkSamplerReductionMode.
-    This bit must: only be exposed for formats that also support the
-    ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR.
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-ifdef::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-  * ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT specifies
-    that sname:VkImage can: be used with a sampler that has either of
-    pname:magFilter or pname:minFilter set to ename:VK_FILTER_CUBIC_EXT, or
-    be the source image for a blit with pname:filter set to
-    ename:VK_FILTER_CUBIC_EXT.
-    This bit must: only be exposed for formats that also support the
-    ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR.
-    If the format being queried is a depth/stencil format, this only
-    specifies that the depth aspect is cubic filterable.
-endif::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * ename:VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT_KHR specifies that
-    an application can: define a <<samplers-YCbCr-conversion,sampler {YCbCr}
-    conversion>> using this format as a source, and that an image of this
-    format can: be used with a slink:VkSamplerYcbcrConversionCreateInfo
-    pname:xChromaOffset and/or pname:yChromaOffset of
-    ename:VK_CHROMA_LOCATION_MIDPOINT.
-    Otherwise both pname:xChromaOffset and pname:yChromaOffset must: be
-    ename:VK_CHROMA_LOCATION_COSITED_EVEN.
-    If a format does not incorporate chroma downsampling (it is not a
-    "`422`" or "`420`" format) but the implementation supports sampler
-    {YCbCr} conversion for this format, the implementation must: set
-    ename:VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT_KHR.
-  * ename:VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT_KHR specifies that
-    an application can: define a <<samplers-YCbCr-conversion,sampler {YCbCr}
-    conversion>> using this format as a source, and that an image of this
-    format can: be used with a slink:VkSamplerYcbcrConversionCreateInfo
-    pname:xChromaOffset and/or pname:yChromaOffset of
-    ename:VK_CHROMA_LOCATION_COSITED_EVEN.
-    Otherwise both pname:xChromaOffset and pname:yChromaOffset must: be
-    ename:VK_CHROMA_LOCATION_MIDPOINT.
-    If neither ename:VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT_KHR nor
-    ename:VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT_KHR is set, the
-    application must: not define a <<samplers-YCbCr-conversion,sampler
-    {YCbCr} conversion>> using this format as a source.
-  * ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR
-    specifies that an application can: define a
-    <<samplers-YCbCr-conversion,sampler {YCbCr} conversion>> using this
-    format as a source with pname:chromaFilter set to
-    ename:VK_FILTER_LINEAR.
-  * ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR
-    specifies that the format can have different chroma, min, and mag
-    filters.
-  * ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT_KHR
-    specifies that reconstruction is explicit, as described in
-    <<textures-chroma-reconstruction>>.
-    If this bit is not present, reconstruction is implicit by default.
-  * ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT_KHR
-    specifies that reconstruction can: be forcibly made explicit by setting
-    slink:VkSamplerYcbcrConversionCreateInfo::pname:forceExplicitReconstruction
-    to ename:VK_TRUE.
-    If the format being queried supports
-    ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT_KHR
-    it must: also support
-    ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT_KHR.
-  * ename:VK_FORMAT_FEATURE_2_DISJOINT_BIT_KHR specifies that a multi-planar
-    image can: have the ename:VK_IMAGE_CREATE_DISJOINT_BIT set during image
-    creation.
-    An implementation must: not set
-    ename:VK_FORMAT_FEATURE_2_DISJOINT_BIT_KHR for _single-plane formats_.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_EXT_fragment_density_map[]
-  * ename:VK_FORMAT_FEATURE_2_FRAGMENT_DENSITY_MAP_BIT_EXT specifies that an
-    image view can: be used as a
-    <<renderpass-fragmentdensitymapattachment,fragment density map
-    attachment>>.
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_KHR_fragment_shading_rate[]
-  * ename:VK_FORMAT_FEATURE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-    specifies that an image view can: be used as a
-    <<primsrast-fragment-shading-rate-attachment, fragment shading rate
-    attachment>>.
-    An implementation must: not set this feature for formats with numeric
-    type other than etext:*UINT, or set it as a buffer feature.
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_KHR_video_decode_queue[]
-  * ename:VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR specifies that an
-    image view with this format can: be used as an output for
-    <<video-decode-operations,video decode operations>>
-  * ename:VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR specifies that an
-    image view with this format can: be used as a DPB for
-    <<video-decode-operations,video decode operations>>
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-  * ename:VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR specifies that an
-    image view with this format can: be used as an input to
-    <<video-encode-operations,video encode operations>>
-  * ename:VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR specifies that an
-    image view with this format can: be used as a DPB for
-    <<video-encode-operations,video encode operations>>
-endif::VK_KHR_video_encode_queue[]
-  * ename:VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR specifies
-    that image views created with this format can: be used as
-    <<descriptorsets-storageimage, storage images>> for read operations
-    without specifying a format.
-  * ename:VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR specifies
-    that image views created with this format can: be used as
-    <<descriptorsets-storageimage, storage images>> for write operations
-    without specifying a format.
-  * ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR
-    specifies that image views created with this format can: be used for
-    depth comparison performed by code:OpImage*Dref instructions.
-
-The following bits may: be set in pname:bufferFeatures, specifying that the
-features are supported by <<VkBuffer,buffers>> or <<VkBufferView,buffer
-views>> created with the queried
-flink:vkGetPhysicalDeviceFormatProperties2::pname:format:
-
-  * ename:VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR specifies that
-    the format can: be used to create a buffer view that can: be bound to a
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER descriptor.
-  * ename:VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT_KHR specifies that
-    the format can: be used to create a buffer view that can: be bound to a
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER descriptor.
-  * ename:VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT_KHR specifies
-    that atomic operations are supported on
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER with this format.
-  * ename:VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT_KHR specifies that the
-    format can: be used as a vertex attribute format
-    (sname:VkVertexInputAttributeDescription::pname:format).
-ifdef::VK_KHR_acceleration_structure[]
-  * ename:VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR
-    specifies that the format can: be used as the vertex format when
-    creating an <<acceleration-structure,acceleration structure>>
-    (sname:VkAccelerationStructureGeometryTrianglesDataKHR::pname:vertexFormat).
-    This format can: also be used as the vertex format in host memory when
-    doing <<host-acceleration-structure, host acceleration structure>>
-    builds.
-endif::VK_KHR_acceleration_structure[]
---
-
-[open,refpage='VkFormatFeatureFlags2KHR',desc='Bitmask of VkFormatFeatureFlagBits2KHR',type='flags']
---
-include::{generated}/api/flags/VkFormatFeatureFlags2KHR.txt[]
-
-tname:VkFormatFeatureFlags2KHR is a bitmask type for setting a mask of zero
-or more elink:VkFormatFeatureFlagBits2KHR.
---
-endif::VK_KHR_format_feature_flags2[]
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-
-[[potential-format-features]]
-=== Potential Format Features
-
-Some <<fundamentals-validusage,valid usage conditions>> depend on the format
-features supported by an slink:VkImage whose elink:VkImageTiling is unknown.
-In such cases the exact elink:VkFormatFeatureFlagBits supported by the
-slink:VkImage cannot be determined, so the valid usage conditions are
-expressed in terms of the _potential format features_ of the slink:VkImage
-format.
-
-The _potential format features_ of a elink:VkFormat are defined as follows:
-
-  * The union of elink:VkFormatFeatureFlagBits
-ifdef::VK_KHR_format_feature_flags2[]
-    and elink:VkFormatFeatureFlagBits2KHR,
-endif::VK_KHR_format_feature_flags2[]
-    supported when the elink:VkImageTiling is ename:VK_IMAGE_TILING_OPTIMAL
-ifdef::VK_EXT_image_drm_format_modifier[]
-    , ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,
-endif::VK_EXT_image_drm_format_modifier[]
-    or ename:VK_IMAGE_TILING_LINEAR
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-    if elink:VkFormat is not ename:VK_FORMAT_UNDEFINED
-  * slink:VkAndroidHardwareBufferFormatPropertiesANDROID::pname:formatFeatures
-ifdef::VK_KHR_format_feature_flags2[]
-    and
-    slink:VkAndroidHardwareBufferFormatProperties2ANDROID::pname:formatFeatures
-endif::VK_KHR_format_feature_flags2[]
-    of a valid external format if elink:VkFormat is
-    ename:VK_FORMAT_UNDEFINED
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-
-[[features-required-format-support]]
-== Required Format Support
-
-Implementations must: support at least the following set of features on the
-listed formats.
-For images, these features must: be supported for every elink:VkImageType
-(including arrayed and cube variants) unless otherwise noted.
-These features are supported on existing formats without needing to
-advertise an extension or needing to explicitly enable them.
-Support for additional functionality beyond the requirements listed here is
-queried using the flink:vkGetPhysicalDeviceFormatProperties command.
-
-[NOTE]
-.Note
-====
-Unless otherwise excluded below, the required formats are supported for all
-tlink:VkImageCreateFlags values as long as those flag values are otherwise
-allowed.
-====
-
-The following tables show which feature bits must: be supported for each
-format.
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-Formats that are required to support
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT must: also support
-ename:VK_FORMAT_FEATURE_TRANSFER_SRC_BIT and
-ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-
-.Key for format feature tables
-[width="70%",cols="1,10"]
-|====
-^|{sym1} | This feature must: be supported on the named format
-^|{sym2} | This feature must: be supported on at least some
-of the named formats, with more information in the table
-where the symbol appears
-^|{sym3} | This feature must: be supported with some caveats or
-preconditions, with more information in the table where the symbol appears
-|====
-
-.Feature bits in pname:optimalTilingFeatures
-[width="70%"]
-|====
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-|ename:VK_FORMAT_FEATURE_TRANSFER_SRC_BIT
-|ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-|ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
-|ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT
-|ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-|ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
-|ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT
-|ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
-|ename:VK_FORMAT_FEATURE_BLIT_DST_BIT
-|ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT
-|ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-|ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-|====
-
-.Feature bits in pname:bufferFeatures
-[width="70%"]
-|====
-|ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT
-|ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT
-|ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT
-|ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT
-|====
-
-<<<
-
-[[formats-mandatory-features-subbyte]]
-.Mandatory format support: sub-byte components
-[width="100%",cols="12,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1",options="unbreakable"]
-|====
-13+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT .14+^.^| {downarrow}
-12+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT        .13+^.^| {downarrow}
-11+>| ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT        .12+^.^| {downarrow}
-10+>| ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT               .11+^.^| {downarrow}
-9+>| ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT     .10+^.^| {downarrow}
-8+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT        .9+^.^| {downarrow}
-7+>| ename:VK_FORMAT_FEATURE_BLIT_DST_BIT                      .8+^.^| {downarrow}
-6+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT              .7+^.^| {downarrow}
-5+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT          .6+^.^| {downarrow}
-4+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT                 .5+^.^| {downarrow}
-3+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT   .4+^.^| {downarrow}
-2+>| ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT                      .3+^.^| {downarrow}
-1+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT                 .2+^.^| {downarrow}
-s| Format
-| ename:VK_FORMAT_UNDEFINED                  |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_R4G4_UNORM_PACK8           |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_R4G4B4A4_UNORM_PACK16      |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_B4G4R4A4_UNORM_PACK16      | {sym1} | {sym1} | {sym1} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_R5G6B5_UNORM_PACK16        | {sym1} | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |   |   |   |   |
-| ename:VK_FORMAT_B5G6R5_UNORM_PACK16        |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_R5G5B5A1_UNORM_PACK16      |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_B5G5R5A1_UNORM_PACK16      |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_A1R5G5B5_UNORM_PACK16      | {sym1} | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |   |   |   |   |
-ifdef::VK_EXT_4444_formats[]
-| ename:VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT      | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT      | {sym3} | {sym3} | {sym3} |   |   |   |   |   |   |   |   |   |
-14+| Format features marked {sym2} must: be supported for
-pname:optimalTilingFeatures if the sname:VkPhysicalDevice supports the
-slink:VkPhysicalDevice4444FormatsFeaturesEXT::pname:formatA4R4G4B4 feature.
-14+| Format features marked {sym3} must: be supported for
-pname:optimalTilingFeatures if the sname:VkPhysicalDevice supports the
-slink:VkPhysicalDevice4444FormatsFeaturesEXT::pname:formatA4B4G4R4 feature.
-endif::VK_EXT_4444_formats[]
-|====
-
-<<<
-
-[[formats-mandatory-features-2byte]]
-.Mandatory format support: 1-3 byte-sized components
-[width="100%",cols="12,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1",options="unbreakable"]
-|====
-13+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT .14+^.^| {downarrow}
-12+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT        .13+^.^| {downarrow}
-11+>| ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT        .12+^.^| {downarrow}
-10+>| ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT               .11+^.^| {downarrow}
-9+>| ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT     .10+^.^| {downarrow}
-8+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT        .9+^.^| {downarrow}
-7+>| ename:VK_FORMAT_FEATURE_BLIT_DST_BIT                      .8+^.^| {downarrow}
-6+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT              .7+^.^| {downarrow}
-5+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT          .6+^.^| {downarrow}
-4+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT                 .5+^.^| {downarrow}
-3+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT   .4+^.^| {downarrow}
-2+>| ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT                      .3+^.^| {downarrow}
-1+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT                 .2+^.^| {downarrow}
-s| Format
-| ename:VK_FORMAT_R8_UNORM                   | {sym1} | {sym1} | {sym1} | {sym3} |   | {sym1} | {sym1} | {sym1} |   | {sym1} | {sym1} |   |
-| ename:VK_FORMAT_R8_SNORM                   | {sym1} | {sym1} | {sym1} | {sym3} |   |        |        |        |   | {sym1} | {sym1} |   |
-| ename:VK_FORMAT_R8_USCALED                 |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R8_SSCALED                 |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R8_UINT                    | {sym1} | {sym1} |        | {sym3} |   | {sym1} | {sym1} |        |   | {sym1} | {sym1} |   |
-| ename:VK_FORMAT_R8_SINT                    | {sym1} | {sym1} |        | {sym3} |   | {sym1} | {sym1} |        |   | {sym1} | {sym1} |   |
-| ename:VK_FORMAT_R8_SRGB                    |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R8G8_UNORM                 | {sym1} | {sym1} | {sym1} | {sym3} |   | {sym1} | {sym1} | {sym1} |   | {sym1} | {sym1} |   |
-| ename:VK_FORMAT_R8G8_SNORM                 | {sym1} | {sym1} | {sym1} | {sym3} |   |        |        |        |   | {sym1} | {sym1} |   |
-| ename:VK_FORMAT_R8G8_USCALED               |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R8G8_SSCALED               |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R8G8_UINT                  | {sym1} | {sym1} |        | {sym3} |   | {sym1} | {sym1} |        |   | {sym1} | {sym1} |   |
-| ename:VK_FORMAT_R8G8_SINT                  | {sym1} | {sym1} |        | {sym3} |   | {sym1} | {sym1} |        |   | {sym1} | {sym1} |   |
-| ename:VK_FORMAT_R8G8_SRGB                  |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R8G8B8_UNORM               |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R8G8B8_SNORM               |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R8G8B8_USCALED             |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R8G8B8_SSCALED             |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R8G8B8_UINT                |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R8G8B8_SINT                |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R8G8B8_SRGB                |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_B8G8R8_UNORM               |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_B8G8R8_SNORM               |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_B8G8R8_USCALED             |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_B8G8R8_SSCALED             |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_B8G8R8_UINT                |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_B8G8R8_SINT                |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_B8G8R8_SRGB                |        |        |        |        |   |        |        |        |   |        |        |   |
-14+| Format features marked with {sym3} must: be supported for
-pname:optimalTilingFeatures if the sname:VkPhysicalDevice supports the
-<<features-shaderStorageImageExtendedFormats,
-pname:shaderStorageImageExtendedFormats>> feature.
-|====
-
-<<<
-
-[[formats-mandatory-features-4byte]]
-.Mandatory format support: 4 byte-sized components
-[width="100%",cols="12,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1",options="unbreakable"]
-|====
-13+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT .14+^.^| {downarrow}
-12+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT        .13+^.^| {downarrow}
-11+>| ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT        .12+^.^| {downarrow}
-10+>| ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT               .11+^.^| {downarrow}
-9+>| ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT     .10+^.^| {downarrow}
-8+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT        .9+^.^| {downarrow}
-7+>| ename:VK_FORMAT_FEATURE_BLIT_DST_BIT                      .8+^.^| {downarrow}
-6+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT              .7+^.^| {downarrow}
-5+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT          .6+^.^| {downarrow}
-4+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT                 .5+^.^| {downarrow}
-3+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT   .4+^.^| {downarrow}
-2+>| ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT                      .3+^.^| {downarrow}
-1+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT                 .2+^.^| {downarrow}
-s| Format
-| ename:VK_FORMAT_R8G8B8A8_UNORM             | {sym1} | {sym1} | {sym1} | {sym1} |   | {sym1} | {sym1} | {sym1} |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_R8G8B8A8_SNORM             | {sym1} | {sym1} | {sym1} | {sym1} |   |   |   |   |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_R8G8B8A8_USCALED           |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_R8G8B8A8_SSCALED           |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_R8G8B8A8_UINT              | {sym1} | {sym1} |   | {sym1} |   | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_R8G8B8A8_SINT              | {sym1} | {sym1} |   | {sym1} |   | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_R8G8B8A8_SRGB              | {sym1} | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |   |   |   |   |
-| ename:VK_FORMAT_B8G8R8A8_UNORM             | {sym1} | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |   | {sym1} | {sym1} |   |
-| ename:VK_FORMAT_B8G8R8A8_SNORM             |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_B8G8R8A8_USCALED           |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_B8G8R8A8_SSCALED           |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_B8G8R8A8_UINT              |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_B8G8R8A8_SINT              |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_B8G8R8A8_SRGB              | {sym1} | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |   |   |   |   |
-| ename:VK_FORMAT_A8B8G8R8_UNORM_PACK32      | {sym1} | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_A8B8G8R8_SNORM_PACK32      | {sym1} | {sym1} | {sym1} |   |   |   |   |   |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_A8B8G8R8_USCALED_PACK32    |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_A8B8G8R8_SSCALED_PACK32    |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_A8B8G8R8_UINT_PACK32       | {sym1} | {sym1} |   |   |   | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_A8B8G8R8_SINT_PACK32       | {sym1} | {sym1} |   |   |   | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_A8B8G8R8_SRGB_PACK32       | {sym1} | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |   |   |   |   |
-|====
-
-<<<
-
-[[formats-mandatory-features-10bit]]
-.Mandatory format support: 10- and 12-bit components
-[width="100%",cols="12,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1",options="unbreakable"]
-|====
-13+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT .14+^.^| {downarrow}
-12+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT        .13+^.^| {downarrow}
-11+>| ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT        .12+^.^| {downarrow}
-10+>| ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT               .11+^.^| {downarrow}
-9+>| ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT     .10+^.^| {downarrow}
-8+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT        .9+^.^| {downarrow}
-7+>| ename:VK_FORMAT_FEATURE_BLIT_DST_BIT                      .8+^.^| {downarrow}
-6+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT              .7+^.^| {downarrow}
-5+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT          .6+^.^| {downarrow}
-4+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT                 .5+^.^| {downarrow}
-3+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT   .4+^.^| {downarrow}
-2+>| ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT                      .3+^.^| {downarrow}
-1+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT                 .2+^.^| {downarrow}
-s| Format
-| ename:VK_FORMAT_A2R10G10B10_UNORM_PACK32   |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_A2R10G10B10_SNORM_PACK32   |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_A2R10G10B10_USCALED_PACK32 |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_A2R10G10B10_SSCALED_PACK32 |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_A2R10G10B10_UINT_PACK32    |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_A2R10G10B10_SINT_PACK32    |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_A2B10G10R10_UNORM_PACK32   | {sym1} | {sym1} | {sym1} | {sym3} |   | {sym1} | {sym1} | {sym1} |   | {sym1} | {sym1} |   |
-| ename:VK_FORMAT_A2B10G10R10_SNORM_PACK32   |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_A2B10G10R10_USCALED_PACK32 |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_A2B10G10R10_SSCALED_PACK32 |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_A2B10G10R10_UINT_PACK32    | {sym1} | {sym1} |        | {sym3} |   | {sym1} | {sym1} |        |   |        | {sym1} |   |
-| ename:VK_FORMAT_A2B10G10R10_SINT_PACK32    |        |        |        |        |   |        |        |        |   |        |        |   |
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-| ename:VK_FORMAT_R10X6_UNORM_PACK16         |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R10X6G10X6_UNORM_2PACK16   |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R12X4_UNORM_PACK16         |        |        |        |        |   |        |        |        |   |        |        |   |
-| ename:VK_FORMAT_R12X4G12X4_UNORM_2PACK16   |        |        |        |        |   |        |        |        |   |        |        |   |
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-14+| Format features marked with {sym3} must: be supported for
-pname:optimalTilingFeatures if the sname:VkPhysicalDevice supports the
-<<features-shaderStorageImageExtendedFormats,
-pname:shaderStorageImageExtendedFormats>> feature.
-|====
-
-<<<
-
-[[formats-mandatory-features-16bit]]
-.Mandatory format support: 16-bit components
-[width="100%",cols="12,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1",options="unbreakable"]
-|====
-13+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT .14+^.^| {downarrow}
-12+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT        .13+^.^| {downarrow}
-11+>| ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT        .12+^.^| {downarrow}
-10+>| ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT               .11+^.^| {downarrow}
-9+>| ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT     .10+^.^| {downarrow}
-8+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT        .9+^.^| {downarrow}
-7+>| ename:VK_FORMAT_FEATURE_BLIT_DST_BIT                      .8+^.^| {downarrow}
-6+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT              .7+^.^| {downarrow}
-5+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT          .6+^.^| {downarrow}
-4+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT                 .5+^.^| {downarrow}
-3+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT   .4+^.^| {downarrow}
-2+>| ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT                      .3+^.^| {downarrow}
-1+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT                 .2+^.^| {downarrow}
-s| Format
-| ename:VK_FORMAT_R16_UNORM                  |        |        |        | {sym3} |   |        |        |        |   | {sym1} |        |        |
-| ename:VK_FORMAT_R16_SNORM                  |        |        |        | {sym3} |   |        |        |        |   | {sym1} |        |        |
-| ename:VK_FORMAT_R16_USCALED                |        |        |        |        |   |        |        |        |   |        |        |        |
-| ename:VK_FORMAT_R16_SSCALED                |        |        |        |        |   |        |        |        |   |        |        |        |
-| ename:VK_FORMAT_R16_UINT                   | {sym1} | {sym1} |        | {sym3} |   | {sym1} | {sym1} |        |   | {sym1} | {sym1} |        |
-| ename:VK_FORMAT_R16_SINT                   | {sym1} | {sym1} |        | {sym3} |   | {sym1} | {sym1} |        |   | {sym1} | {sym1} |        |
-| ename:VK_FORMAT_R16_SFLOAT                 | {sym1} | {sym1} | {sym1} | {sym3} |   | {sym1} | {sym1} | {sym1} |   | {sym1} | {sym1} |        |
-| ename:VK_FORMAT_R16G16_UNORM               |        |        |        | {sym3} |   |        |        |        |   | {sym1} |        |        |
-| ename:VK_FORMAT_R16G16_SNORM               |        |        |        | {sym3} |   |        |        |        |   | {sym1} |        |        |
-| ename:VK_FORMAT_R16G16_USCALED             |        |        |        |        |   |        |        |        |   |        |        |        |
-| ename:VK_FORMAT_R16G16_SSCALED             |        |        |        |        |   |        |        |        |   |        |        |        |
-| ename:VK_FORMAT_R16G16_UINT                | {sym1} | {sym1} |        | {sym3} |   | {sym1} | {sym1} |        |   | {sym1} | {sym1} |        |
-| ename:VK_FORMAT_R16G16_SINT                | {sym1} | {sym1} |        | {sym3} |   | {sym1} | {sym1} |        |   | {sym1} | {sym1} |        |
-| ename:VK_FORMAT_R16G16_SFLOAT              | {sym1} | {sym1} | {sym1} | {sym3} |   | {sym1} | {sym1} | {sym1} |   | {sym1} | {sym1} |        |
-| ename:VK_FORMAT_R16G16B16_UNORM            |        |        |        |        |   |        |        |        |   |        |        |        |
-| ename:VK_FORMAT_R16G16B16_SNORM            |        |        |        |        |   |        |        |        |   |        |        |        |
-| ename:VK_FORMAT_R16G16B16_USCALED          |        |        |        |        |   |        |        |        |   |        |        |        |
-| ename:VK_FORMAT_R16G16B16_SSCALED          |        |        |        |        |   |        |        |        |   |        |        |        |
-| ename:VK_FORMAT_R16G16B16_UINT             |        |        |        |        |   |        |        |        |   |        |        |        |
-| ename:VK_FORMAT_R16G16B16_SINT             |        |        |        |        |   |        |        |        |   |        |        |        |
-| ename:VK_FORMAT_R16G16B16_SFLOAT           |        |        |        |        |   |        |        |        |   |        |        |        |
-| ename:VK_FORMAT_R16G16B16A16_UNORM         |        |        |        | {sym3} |   |        |        |        |   | {sym1} |        |        |
-| ename:VK_FORMAT_R16G16B16A16_SNORM         |        |        |        | {sym3} |   |        |        |        |   | {sym1} |        |        |
-| ename:VK_FORMAT_R16G16B16A16_USCALED       |        |        |        |        |   |        |        |        |   |        |        |        |
-| ename:VK_FORMAT_R16G16B16A16_SSCALED       |        |        |        |        |   |        |        |        |   |        |        |        |
-| ename:VK_FORMAT_R16G16B16A16_UINT          | {sym1} | {sym1} |        | {sym1} |   | {sym1} | {sym1} |        |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_R16G16B16A16_SINT          | {sym1} | {sym1} |        | {sym1} |   | {sym1} | {sym1} |        |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_R16G16B16A16_SFLOAT        | {sym1} | {sym1} | {sym1} | {sym1} |   | {sym1} | {sym1} | {sym1} |   | {sym1} | {sym1} | {sym1} |
-14+| Format features marked with {sym3} must: be supported for
-pname:optimalTilingFeatures if the sname:VkPhysicalDevice supports the
-<<features-shaderStorageImageExtendedFormats,
-pname:shaderStorageImageExtendedFormats>> feature.
-|====
-
-<<<
-
-[[formats-mandatory-features-32bit]]
-.Mandatory format support: 32-bit components
-[width="100%",cols="12,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1",options="unbreakable"]
-|====
-13+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT .14+^.^| {downarrow}
-12+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT        .13+^.^| {downarrow}
-11+>| ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT        .12+^.^| {downarrow}
-10+>| ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT               .11+^.^| {downarrow}
-9+>| ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT     .10+^.^| {downarrow}
-8+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT        .9+^.^| {downarrow}
-7+>| ename:VK_FORMAT_FEATURE_BLIT_DST_BIT                      .8+^.^| {downarrow}
-6+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT              .7+^.^| {downarrow}
-5+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT          .6+^.^| {downarrow}
-4+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT                 .5+^.^| {downarrow}
-3+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT   .4+^.^| {downarrow}
-2+>| ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT                      .3+^.^| {downarrow}
-1+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT                 .2+^.^| {downarrow}
-s| Format
-| ename:VK_FORMAT_R32_UINT                   | {sym1} | {sym1} |   | {sym1} | {sym1} | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} | {sym1}
-| ename:VK_FORMAT_R32_SINT                   | {sym1} | {sym1} |   | {sym1} | {sym1} | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} | {sym1}
-| ename:VK_FORMAT_R32_SFLOAT                 | {sym1} | {sym1} |   | {sym1} |   | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_R32G32_UINT                | {sym1} | {sym1} |   | {sym1} |   | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_R32G32_SINT                | {sym1} | {sym1} |   | {sym1} |   | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_R32G32_SFLOAT              | {sym1} | {sym1} |   | {sym1} |   | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_R32G32B32_UINT             |   |   |   |   |   |   |   |   |   | {sym1} |   |   |
-| ename:VK_FORMAT_R32G32B32_SINT             |   |   |   |   |   |   |   |   |   | {sym1} |   |   |
-| ename:VK_FORMAT_R32G32B32_SFLOAT           |   |   |   |   |   |   |   |   |   | {sym1} |   |   |
-| ename:VK_FORMAT_R32G32B32A32_UINT          | {sym1} | {sym1} |   | {sym1} |   | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_R32G32B32A32_SINT          | {sym1} | {sym1} |   | {sym1} |   | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |
-| ename:VK_FORMAT_R32G32B32A32_SFLOAT        | {sym1} | {sym1} |   | {sym1} |   | {sym1} | {sym1} |   |   | {sym1} | {sym1} | {sym1} |
-ifdef::VK_EXT_shader_atomic_float[]
-14+|
-If the <<features-shaderImageFloat32Atomics, pname:shaderImageFloat32Atomics>>
-or the <<features-shaderImageFloat32AtomicAdd, pname:shaderImageFloat32AtomicAdd>>
-ifdef::VK_EXT_shader_atomic_float2[]
-or the <<features-shaderImageFloat32AtomicMinMax, pname:shaderImageFloat32AtomicMinMax>>
-endif::VK_EXT_shader_atomic_float2[]
-feature is supported, ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT and
-ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT must: be advertised in
-pname:optimalTilingFeatures for ename:VK_FORMAT_R32_SFLOAT.
-endif::VK_EXT_shader_atomic_float[]
-|====
-
-<<<
-
-[[formats-mandatory-features-64bit]]
-.Mandatory format support: 64-bit/uneven components
-[width="100%",cols="12,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1",options="unbreakable"]
-|====
-13+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT .14+^.^| {downarrow}
-12+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT        .13+^.^| {downarrow}
-11+>| ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT        .12+^.^| {downarrow}
-10+>| ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT               .11+^.^| {downarrow}
-9+>| ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT     .10+^.^| {downarrow}
-8+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT        .9+^.^| {downarrow}
-7+>| ename:VK_FORMAT_FEATURE_BLIT_DST_BIT                      .8+^.^| {downarrow}
-6+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT              .7+^.^| {downarrow}
-5+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT          .6+^.^| {downarrow}
-4+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT                 .5+^.^| {downarrow}
-3+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT   .4+^.^| {downarrow}
-2+>| ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT                      .3+^.^| {downarrow}
-1+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT                 .2+^.^| {downarrow}
-s| Format
-| ename:VK_FORMAT_R64_UINT                   |        |        |
-|
-ifdef::VK_EXT_shader_image_atomic_int64[{sym2}]
-|
-ifdef::VK_EXT_shader_image_atomic_int64[{sym2}]
-                                                                                     |   |   |   |   |   |        |   |
-| ename:VK_FORMAT_R64_SINT                   |        |        |
-|
-ifdef::VK_EXT_shader_image_atomic_int64[{sym2}]
-|
-ifdef::VK_EXT_shader_image_atomic_int64[{sym2}]
-                                                                                     |   |   |   |   |   |        |   |
-| ename:VK_FORMAT_R64_SFLOAT                 |        |        |        |        |   |   |   |   |   |   |        |   |
-| ename:VK_FORMAT_R64G64_UINT                |        |        |        |        |   |   |   |   |   |   |        |   |
-| ename:VK_FORMAT_R64G64_SINT                |        |        |        |        |   |   |   |   |   |   |        |   |
-| ename:VK_FORMAT_R64G64_SFLOAT              |        |        |        |        |   |   |   |   |   |   |        |   |
-| ename:VK_FORMAT_R64G64B64_UINT             |        |        |        |        |   |   |   |   |   |   |        |   |
-| ename:VK_FORMAT_R64G64B64_SINT             |        |        |        |        |   |   |   |   |   |   |        |   |
-| ename:VK_FORMAT_R64G64B64_SFLOAT           |        |        |        |        |   |   |   |   |   |   |        |   |
-| ename:VK_FORMAT_R64G64B64A64_UINT          |        |        |        |        |   |   |   |   |   |   |        |   |
-| ename:VK_FORMAT_R64G64B64A64_SINT          |        |        |        |        |   |   |   |   |   |   |        |   |
-| ename:VK_FORMAT_R64G64B64A64_SFLOAT        |        |        |        |        |   |   |   |   |   |   |        |   |
-| ename:VK_FORMAT_B10G11R11_UFLOAT_PACK32    | {sym1} | {sym1} | {sym1} | {sym3} |   |   |   |   |   |   | {sym1} |   |
-| ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32     | {sym1} | {sym1} | {sym1} |        |   |   |   |   |   |   |        |   |
-14+| Format features marked with {sym3} must: be supported for
-pname:optimalTilingFeatures if the sname:VkPhysicalDevice supports the
-<<features-shaderStorageImageExtendedFormats,
-pname:shaderStorageImageExtendedFormats>> feature.
-ifdef::VK_EXT_shader_image_atomic_int64[]
-14+|
-If the <<features-shaderImageInt64Atomics, pname:shaderImageInt64Atomics>>
-feature is supported, ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT and
-ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT must: be advertised in
-pname:optimalTilingFeatures for both ename:VK_FORMAT_R64_UINT and
-ename:VK_FORMAT_R64_SINT.
-endif::VK_EXT_shader_image_atomic_int64[]
-|====
-
-<<<
-
-[[formats-mandatory-features-depth-stencil]]
-.Mandatory format support: depth/stencil with `VkImageType` ename:VK_IMAGE_TYPE_2D
-[width="100%",cols="12,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1",options="unbreakable"]
-|====
-13+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT .14+^.^| {downarrow}
-12+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT        .13+^.^| {downarrow}
-11+>| ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT        .12+^.^| {downarrow}
-10+>| ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT               .11+^.^| {downarrow}
-9+>| ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT     .10+^.^| {downarrow}
-8+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT        .9+^.^| {downarrow}
-7+>| ename:VK_FORMAT_FEATURE_BLIT_DST_BIT                      .8+^.^| {downarrow}
-6+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT              .7+^.^| {downarrow}
-5+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT          .6+^.^| {downarrow}
-4+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT                 .5+^.^| {downarrow}
-3+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT   .4+^.^| {downarrow}
-2+>| ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT                      .3+^.^| {downarrow}
-1+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT                 .2+^.^| {downarrow}
-s| Format
-| ename:VK_FORMAT_D16_UNORM                  | {sym1} | {sym1} |   |   |   |   |   |   | {sym1} |   |   |   |
-| ename:VK_FORMAT_X8_D24_UNORM_PACK32        |   |   |   |   |   |   |   |   | {sym2} |   |   |   |
-| ename:VK_FORMAT_D32_SFLOAT                 | {sym1} | {sym1} |   |   |   |   |   |   | {sym2} |   |   |   |
-| ename:VK_FORMAT_S8_UINT                    |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_D16_UNORM_S8_UINT          |   |   |   |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_D24_UNORM_S8_UINT          |   |   |   |   |   |   |   |   | {sym2} |   |   |   |
-| ename:VK_FORMAT_D32_SFLOAT_S8_UINT         |   |   |   |   |   |   |   |   | {sym2} |   |   |   |
-14+| ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT feature must: be
-supported for at least one of ename:VK_FORMAT_X8_D24_UNORM_PACK32 and
-ename:VK_FORMAT_D32_SFLOAT, and must: be supported for at least one of
-ename:VK_FORMAT_D24_UNORM_S8_UINT and ename:VK_FORMAT_D32_SFLOAT_S8_UINT.
-|====
-
-<<<
-
-[[formats-mandatory-features-bcn]]
-.Mandatory format support: BC compressed formats with `VkImageType` ename:VK_IMAGE_TYPE_2D and ename:VK_IMAGE_TYPE_3D
-[width="100%",cols="12,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1",options="unbreakable"]
-|====
-13+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT .14+^.^| {downarrow}
-12+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT        .13+^.^| {downarrow}
-11+>| ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT        .12+^.^| {downarrow}
-10+>| ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT               .11+^.^| {downarrow}
-9+>| ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT     .10+^.^| {downarrow}
-8+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT        .9+^.^| {downarrow}
-7+>| ename:VK_FORMAT_FEATURE_BLIT_DST_BIT                      .8+^.^| {downarrow}
-6+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT              .7+^.^| {downarrow}
-5+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT          .6+^.^| {downarrow}
-4+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT                 .5+^.^| {downarrow}
-3+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT   .4+^.^| {downarrow}
-2+>| ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT                      .3+^.^| {downarrow}
-1+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT                 .2+^.^| {downarrow}
-s| Format
-| ename:VK_FORMAT_BC1_RGB_UNORM_BLOCK        | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC1_RGB_SRGB_BLOCK         | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC1_RGBA_UNORM_BLOCK       | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC1_RGBA_SRGB_BLOCK        | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC2_UNORM_BLOCK            | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC2_SRGB_BLOCK             | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC3_UNORM_BLOCK            | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC3_SRGB_BLOCK             | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC4_UNORM_BLOCK            | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC4_SNORM_BLOCK            | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC5_UNORM_BLOCK            | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC5_SNORM_BLOCK            | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC6H_UFLOAT_BLOCK          | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC6H_SFLOAT_BLOCK          | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC7_UNORM_BLOCK            | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_BC7_SRGB_BLOCK             | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-14+| The ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT,
-ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT and
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT features must: be
-supported in pname:optimalTilingFeatures for all the formats in at least
-one of: this table, <<formats-mandatory-features-etc>>, or
-<<formats-mandatory-features-astc>>.
-|====
-
-<<<
-
-[[formats-mandatory-features-etc]]
-.Mandatory format support: ETC2 and EAC compressed formats with `VkImageType` ename:VK_IMAGE_TYPE_2D
-[width="100%",cols="12,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1",options="unbreakable"]
-|====
-13+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT .14+^.^| {downarrow}
-12+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT        .13+^.^| {downarrow}
-11+>| ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT        .12+^.^| {downarrow}
-10+>| ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT               .11+^.^| {downarrow}
-9+>| ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT     .10+^.^| {downarrow}
-8+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT        .9+^.^| {downarrow}
-7+>| ename:VK_FORMAT_FEATURE_BLIT_DST_BIT                      .8+^.^| {downarrow}
-6+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT              .7+^.^| {downarrow}
-5+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT          .6+^.^| {downarrow}
-4+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT                 .5+^.^| {downarrow}
-3+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT   .4+^.^| {downarrow}
-2+>| ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT                      .3+^.^| {downarrow}
-1+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT                 .2+^.^| {downarrow}
-s| Format
-| ename:VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK    | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK     | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK  | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK   | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK  | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK   | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_EAC_R11_UNORM_BLOCK        | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_EAC_R11_SNORM_BLOCK        | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_EAC_R11G11_UNORM_BLOCK     | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_EAC_R11G11_SNORM_BLOCK     | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-14+|The ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT,
-ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT and
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT features must: be
-supported in pname:optimalTilingFeatures for all the formats in at least
-one of: this table, <<formats-mandatory-features-bcn>>, or
-<<formats-mandatory-features-astc>>.
-|====
-
-<<<
-
-[[formats-mandatory-features-astc]]
-.Mandatory format support: ASTC LDR compressed formats with `VkImageType` ename:VK_IMAGE_TYPE_2D
-[width="100%",cols="12,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1",options="unbreakable"]
-|====
-13+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT .14+^.^| {downarrow}
-12+>| ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT        .13+^.^| {downarrow}
-11+>| ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT        .12+^.^| {downarrow}
-10+>| ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT               .11+^.^| {downarrow}
-9+>| ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT     .10+^.^| {downarrow}
-8+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT        .9+^.^| {downarrow}
-7+>| ename:VK_FORMAT_FEATURE_BLIT_DST_BIT                      .8+^.^| {downarrow}
-6+>| ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT              .7+^.^| {downarrow}
-5+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT          .6+^.^| {downarrow}
-4+>| ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT                 .5+^.^| {downarrow}
-3+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT   .4+^.^| {downarrow}
-2+>| ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT                      .3+^.^| {downarrow}
-1+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT                 .2+^.^| {downarrow}
-s| Format
-| ename:VK_FORMAT_ASTC_4x4_UNORM_BLOCK       | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_4x4_SRGB_BLOCK        | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_5x4_UNORM_BLOCK       | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_5x4_SRGB_BLOCK        | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_5x5_UNORM_BLOCK       | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_5x5_SRGB_BLOCK        | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_6x5_UNORM_BLOCK       | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_6x5_SRGB_BLOCK        | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_6x6_UNORM_BLOCK       | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_6x6_SRGB_BLOCK        | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_8x5_UNORM_BLOCK       | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_8x5_SRGB_BLOCK        | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_8x6_UNORM_BLOCK       | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_8x6_SRGB_BLOCK        | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_8x8_UNORM_BLOCK       | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_8x8_SRGB_BLOCK        | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_10x5_UNORM_BLOCK      | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_10x5_SRGB_BLOCK       | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_10x6_UNORM_BLOCK      | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_10x6_SRGB_BLOCK       | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_10x8_UNORM_BLOCK      | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_10x8_SRGB_BLOCK       | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_10x10_UNORM_BLOCK     | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_10x10_SRGB_BLOCK      | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_12x10_UNORM_BLOCK     | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_12x10_SRGB_BLOCK      | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_12x12_UNORM_BLOCK     | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-| ename:VK_FORMAT_ASTC_12x12_SRGB_BLOCK      | {sym2} | {sym2} | {sym2} |   |   |   |   |   |   |   |   |   |
-14+|The ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT,
-ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT and
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT features must: be
-supported in pname:optimalTilingFeatures for all the formats in at least
-one of: this table, <<formats-mandatory-features-bcn>>, or
-<<formats-mandatory-features-etc>>.
-|====
-
-ifdef::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-If cubic filtering is supported,
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT must: be
-supported for the following image view types:
-
-  * ename:VK_IMAGE_VIEW_TYPE_2D
-  * ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY
-
-for the following formats:
-
-  * ename:VK_FORMAT_R4G4_UNORM_PACK8
-  * ename:VK_FORMAT_R4G4B4A4_UNORM_PACK16
-  * ename:VK_FORMAT_B4G4R4A4_UNORM_PACK16
-  * ename:VK_FORMAT_R5G6B5_UNORM_PACK16
-  * ename:VK_FORMAT_B5G6R5_UNORM_PACK16
-  * ename:VK_FORMAT_R5G5B5A1_UNORM_PACK16
-  * ename:VK_FORMAT_B5G5R5A1_UNORM_PACK16
-  * ename:VK_FORMAT_A1R5G5B5_UNORM_PACK16
-  * ename:VK_FORMAT_R8_UNORM
-  * ename:VK_FORMAT_R8_SNORM
-  * ename:VK_FORMAT_R8_SRGB
-  * ename:VK_FORMAT_R8G8_UNORM
-  * ename:VK_FORMAT_R8G8_SNORM
-  * ename:VK_FORMAT_R8G8_SRGB
-  * ename:VK_FORMAT_R8G8B8_UNORM
-  * ename:VK_FORMAT_R8G8B8_SNORM
-  * ename:VK_FORMAT_R8G8B8_SRGB
-  * ename:VK_FORMAT_B8G8R8_UNORM
-  * ename:VK_FORMAT_B8G8R8_SNORM
-  * ename:VK_FORMAT_B8G8R8_SRGB
-  * ename:VK_FORMAT_R8G8B8A8_UNORM
-  * ename:VK_FORMAT_R8G8B8A8_SNORM
-  * ename:VK_FORMAT_R8G8B8A8_SRGB
-  * ename:VK_FORMAT_B8G8R8A8_UNORM
-  * ename:VK_FORMAT_B8G8R8A8_SNORM
-  * ename:VK_FORMAT_B8G8R8A8_SRGB
-  * ename:VK_FORMAT_A8B8G8R8_UNORM_PACK32
-  * ename:VK_FORMAT_A8B8G8R8_SNORM_PACK32
-  * ename:VK_FORMAT_A8B8G8R8_SRGB_PACK32
-
-If ETC compressed formats are supported,
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT must: be
-supported for the following image view types:
-
-  * ename:VK_IMAGE_VIEW_TYPE_2D
-  * ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY
-
-for the following additional formats:
-
-  * ename:VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK
-  * ename:VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK
-  * ename:VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK
-  * ename:VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK
-  * ename:VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK
-  * ename:VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK
-
-If cubic filtering is supported for any other formats, the following image
-view types must: be supported for those formats:
-
-  * ename:VK_IMAGE_VIEW_TYPE_2D
-  * ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY
-
-endif::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-To be used with sname:VkImageView with pname:subresourceRange.aspectMask
-equal to ename:VK_IMAGE_ASPECT_COLOR_BIT, <<samplers-YCbCr-conversion,
-sampler {YCbCr} conversion>> must: be enabled for the following formats:
-
-[[formats-requiring-sampler-ycbcr-conversion]]
-.Formats requiring sampler {YCbCr} conversion for ename:VK_IMAGE_ASPECT_COLOR_BIT image views
-[width="100%",cols="18,^3,^1,^1,^1,^1,^1,^1,^1,^1,^1,^1",options="unbreakable"]
-|====
-11+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT  .11+^.^| {downarrow}
-10+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT            .10+^.^| {downarrow}
-9+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT             .9+^.^| {downarrow}
-8+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT                              .8+^.^| {downarrow}
-7+>| ename:VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT         .7+^.^| {downarrow}
-6+>| ename:VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT          .6+^.^| {downarrow}
-5+>| ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT                    .5+^.^| {downarrow}
-4+>| ename:VK_FORMAT_FEATURE_TRANSFER_SRC_BIT                    .4+^.^| {downarrow}
-3+>| ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT                   .3+^.^| {downarrow}
-2+>| ename:VK_FORMAT_FEATURE_DISJOINT_BIT                        .2+^.^| {downarrow}
-s| Format                                                     s| Planes
-| ename:VK_FORMAT_G8B8G8R8_422_UNORM                           | 1 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_B8G8R8G8_422_UNORM                           | 1 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM                    | 3 |  | {sym2} | {sym2} | {sym2} | {sym2} | | | | |
-| ename:VK_FORMAT_G8_B8R8_2PLANE_420_UNORM                     | 2 |  | {sym2} | {sym2} | {sym2} | {sym2} | | | | |
-| ename:VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM                    | 3 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G8_B8R8_2PLANE_422_UNORM                     | 2 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM                    | 3 |  |        |        |        |        | | | | |
-ifdef::VK_EXT_rgba10x6_formats[]
-| ename:VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 {sym3}   | 1 |  |        |        |        |        | | | | |
-endif::VK_EXT_rgba10x6_formats[]
-ifndef::VK_EXT_rgba10x6_formats[]
- | ename:VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16           | 1 |  |        |        |        |        | | | | |
-endif::VK_EXT_rgba10x6_formats[]
-| ename:VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16       | 1 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16       | 1 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16   | 3 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16    | 2 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16   | 3 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16    | 2 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16   | 3 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16           | 1 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16       | 1 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16       | 1 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16   | 3 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16    | 2 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16   | 3 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16    | 2 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16   | 3 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G16B16G16R16_422_UNORM                       | 1 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_B16G16R16G16_422_UNORM                       | 1 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM                 | 3 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G16_B16R16_2PLANE_420_UNORM                  | 2 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM                 | 3 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G16_B16R16_2PLANE_422_UNORM                  | 2 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM                 | 3 |  |        |        |        |        | | | | |
-ifdef::VK_EXT_ycbcr_2plane_444_formats[]
-| ename:VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT                     | 2 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT    | 2 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT    | 2 |  |        |        |        |        | | | | |
-| ename:VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT                  | 2 |  |        |        |        |        | | | | |
-endif::VK_EXT_ycbcr_2plane_444_formats[]
-12+| Format features marked {sym2} must: be supported for
-pname:optimalTilingFeatures with elink:VkImageType
-ename:VK_IMAGE_TYPE_2D if the sname:VkPhysicalDevice supports the
-slink:VkPhysicalDeviceSamplerYcbcrConversionFeatures feature.
-ifdef::VK_EXT_rgba10x6_formats[]
-12+| Formats marked {sym3} do not require a sampler {YCbCr} conversion for
-ename:VK_IMAGE_ASPECT_COLOR_BIT image views if the
-slink:VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT::pname:formatRgba10x6WithoutYCbCrSampler
-feature is enabled.
-endif::VK_EXT_rgba10x6_formats[]
-|====
-
-Implementations are not required to support the
-ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT,
-ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or
-ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT tlink:VkImageCreateFlags for the
-above formats that require <<samplers-YCbCr-conversion,sampler {YCbCr}
-conversion>>.
-To determine whether the implementation supports sparse image creation flags
-with these formats use flink:vkGetPhysicalDeviceImageFormatProperties or
-flink:vkGetPhysicalDeviceImageFormatProperties2.
-
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-ifdef::VK_EXT_fragment_density_map[]
-ename:VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT must: be supported for
-the following formats if the <<features-fragmentDensityMap,fragment density
-map feature>> is enabled:
-
-  * ename:VK_FORMAT_R8G8_UNORM
-endif::VK_EXT_fragment_density_map[]
-
-ifdef::VK_KHR_acceleration_structure[]
-ename:VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR must:
-be supported in pname:bufferFeatures for the following formats if the
-<<features-accelerationStructure, pname:accelerationStructure>> feature is
-supported:
-
-  * ename:VK_FORMAT_R32G32_SFLOAT
-  * ename:VK_FORMAT_R32G32B32_SFLOAT
-  * ename:VK_FORMAT_R16G16_SFLOAT
-  * ename:VK_FORMAT_R16G16B16A16_SFLOAT
-  * ename:VK_FORMAT_R16G16_SNORM
-  * ename:VK_FORMAT_R16G16B16A16_SNORM
-endif::VK_KHR_acceleration_structure[]
-
-ifdef::VK_KHR_fragment_shading_rate[]
-ename:VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR must: be
-supported for the following formats if the
-<<features-attachmentFragmentShadingRate,
-pname:attachmentFragmentShadingRate feature>> is supported:
-
-  * ename:VK_FORMAT_R8_UINT
-endif::VK_KHR_fragment_shading_rate[]
-
-
-[[formats-without-shader-storage-format]]
-=== Formats without shader storage format
-
-The device-level features for using a storage image with an image format of
-code:Unknown,
-<<features-shaderStorageImageReadWithoutFormat,shaderStorageImageReadWithoutFormat>>
-and
-<<features-shaderStorageImageWriteWithoutFormat,shaderStorageImageWriteWithoutFormat>>,
-only apply to the following formats:
-
-  * ename:VK_FORMAT_R8G8B8A8_UNORM
-  * ename:VK_FORMAT_R8G8B8A8_SNORM
-  * ename:VK_FORMAT_R8G8B8A8_UINT
-  * ename:VK_FORMAT_R8G8B8A8_SINT
-  * ename:VK_FORMAT_R32_UINT
-  * ename:VK_FORMAT_R32_SINT
-  * ename:VK_FORMAT_R32_SFLOAT
-  * ename:VK_FORMAT_R32G32_UINT
-  * ename:VK_FORMAT_R32G32_SINT
-  * ename:VK_FORMAT_R32G32_SFLOAT
-  * ename:VK_FORMAT_R32G32B32A32_UINT
-  * ename:VK_FORMAT_R32G32B32A32_SINT
-  * ename:VK_FORMAT_R32G32B32A32_SFLOAT
-  * ename:VK_FORMAT_R16G16B16A16_UINT
-  * ename:VK_FORMAT_R16G16B16A16_SINT
-  * ename:VK_FORMAT_R16G16B16A16_SFLOAT
-  * ename:VK_FORMAT_R16G16_SFLOAT
-  * ename:VK_FORMAT_B10G11R11_UFLOAT_PACK32
-  * ename:VK_FORMAT_R16_SFLOAT
-  * ename:VK_FORMAT_R16G16B16A16_UNORM
-  * ename:VK_FORMAT_A2B10G10R10_UNORM_PACK32
-  * ename:VK_FORMAT_R16G16_UNORM
-  * ename:VK_FORMAT_R8G8_UNORM
-  * ename:VK_FORMAT_R16_UNORM
-  * ename:VK_FORMAT_R8_UNORM
-  * ename:VK_FORMAT_R16G16B16A16_SNORM
-  * ename:VK_FORMAT_R16G16_SNORM
-  * ename:VK_FORMAT_R8G8_SNORM
-  * ename:VK_FORMAT_R16_SNORM
-  * ename:VK_FORMAT_R8_SNORM
-  * ename:VK_FORMAT_R16G16_SINT
-  * ename:VK_FORMAT_R8G8_SINT
-  * ename:VK_FORMAT_R16_SINT
-  * ename:VK_FORMAT_R8_SINT
-  * ename:VK_FORMAT_A2B10G10R10_UINT_PACK32
-  * ename:VK_FORMAT_R16G16_UINT
-  * ename:VK_FORMAT_R8G8_UINT
-  * ename:VK_FORMAT_R16_UINT
-  * ename:VK_FORMAT_R8_UINT
-
-[NOTE]
-.Note
-====
-This list of formats is the union of required storage formats from
-<<features-required-format-support, Required Format Support>> section and
-formats listed in <<features-shaderStorageImageExtendedFormats,
-pname:shaderStorageImageExtendedFormats>>.
-====
-
-ifdef::VK_KHR_format_feature_flags2[]
-An implementation that supports ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
-for any format from the given list of formats and supports
-<<features-shaderStorageImageReadWithoutFormat,shaderStorageImageReadWithoutFormat>>
-must: support ename:VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR
-for that same format if the `apiext:VK_KHR_format_feature_flags2` extension
-is supported.
-
-An implementation that supports ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
-for any format from the given list of formats and supports
-<<features-shaderStorageImageWriteWithoutFormat,shaderStorageImageWriteWithoutFormat>>
-must: support ename:VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR
-for that same format if the `apiext:VK_KHR_format_feature_flags2` extension
-is supported.
-endif::VK_KHR_format_feature_flags2[]
-
-
-ifdef::VK_KHR_format_feature_flags2[]
-=== Depth comparison format support
-
-If the `apiext:VK_KHR_format_feature_flags2` extension is supported, a
-depth/stencil format with a depth component supporting
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT must: support
-ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR.
-
-endif::VK_KHR_format_feature_flags2[]
diff --git a/registry/vulkan/chapters/fragmentdensitymapops.txt b/registry/vulkan/chapters/fragmentdensitymapops.txt
deleted file mode 100644
index e8a5f4c..0000000
--- a/registry/vulkan/chapters/fragmentdensitymapops.txt
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[fragmentdensitymapops]]
-= Fragment Density Map Operations
-
-== Fragment Density Map Operations Overview
-
-When a fragment is generated in a render pass that has a fragment density
-map attachment, its area is determined by the properties of the local
-framebuffer region that the fragment occupies.
-The framebuffer is divided into a uniform grid of these local regions, and
-their fragment area property is derived from the density map with the
-following operations:
-
-  * <<fragmentdensitymap-fetch-density-value,Fetch density value>>
-  ** <<fragmentdensitymap-component-swizzle,Component swizzle>>
-  ** <<fragmentdensitymap-component-mapping,Component mapping>>
-  * <<fragmentdensitymap-conversion-to-fragment-area,Fragment area
-    conversion>>
-  ** <<fragmentdensitymap-fragment-area-filter,Fragment area filter>>
-  ** <<fragmentdensitymap-fragment-area-clamp,Fragment area clamp>>
-
-
-[[fragmentdensitymap-fetch-density-value]]
-== Fetch Density Value
-
-Each local framebuffer region at center coordinate [eq]#(x,y)# fetches a
-texel from the fragment density map at integer coordinates:
-
-  {empty}:: latexmath:[i =
-            \left\lfloor{\frac{x}{fragmentDensityTexelSize_{width}}}\right\rfloor]
-  {empty}:: latexmath:[j =
-            \left\lfloor{\frac{y}{fragmentDensityTexelSize_{height}}}\right\rfloor]
-
-Where the size of each region in the framebuffer is:
-
-  {empty}:: latexmath:[fragmentDensityTexelSize'_{width} =
-            {2^{\lceil{\log_2(\frac{framebuffer_{width}}{fragmentDensityMap_{width}})}\rceil}}]
-  {empty}:: latexmath:[fragmentDensityTexelSize'_{height} =
-            {2^{\lceil{\log_2(\frac{framebuffer_{height}}{fragmentDensityMap_{height}})}\rceil}}]
-
-This region is subject to the limits in
-sname:VkPhysicalDeviceFragmentDensityMapPropertiesEXT and therefore the
-final region size is clamped:
-
-  {empty}:: latexmath:[fragmentDensityTexelSize_{width} =
-            \mathbin{clamp}(fragmentDensityTexelSize'_{width},minFragmentDensityTexelSize_{width},maxFragmentDensityTexelSize_{width})]
-  {empty}:: latexmath:[fragmentDensityTexelSize_{height} =
-            \mathbin{clamp}(fragmentDensityTexelSize'_{height},minFragmentDensityTexelSize_{height},maxFragmentDensityTexelSize_{height})]
-
-When multiview is enabled for the render pass and the fragment density map
-attachment view was created with pname:layerCount greater than `1`, the
-density map layer that the texel is fetched from is:
-
-  {empty}:: latexmath:[layer = baseArrayLayer + ViewIndex]
-
-Otherwise:
-
-  {empty}:: latexmath:[layer = baseArrayLayer]
-
-The texel fetched from the density map at [eq]#(i,j,layer)# is next
-converted to density with the following operations.
-
-
-[[fragmentdensitymap-component-swizzle]]
-=== Component Swizzle
-
-The pname:components member of slink:VkImageViewCreateInfo is applied to the
-fetched texel as defined in <<textures-component-swizzle,Image component
-swizzle>>.
-
-
-[[fragmentdensitymap-component-mapping]]
-=== Component Mapping
-
-The swizzled texel's components are mapped to a density value:
-
-  {empty}:: latexmath:[densityValue_{xy} = (C'_{r},C'_{g})]
-
-
-[[fragmentdensitymap-conversion-to-fragment-area]]
-== Fragment Area Conversion
-
-Fragment area for the framebuffer region is undefined: if the density
-fetched is not a normalized floating-point value greater than `0.0`.
-Otherwise, the fetched fragment area for that region is derived as:
-
-  {empty}:: latexmath:[fragmentArea_{wh} = \frac{1.0}{densityValue_{xy}}]
-
-
-[[fragmentdensitymap-fragment-area-filter]]
-===  Fragment Area Filter
-
-Optionally, the implementation may: fetch additional density map texels in
-an implementation defined window around [eq]#(i,j)#.
-The texels follow the standard conversion steps up to and including
-<<fragmentdensitymap-conversion-to-fragment-area,fragment area conversion>>.
-
-A single fetched fragment area for the framebuffer region is chosen by the
-implementation and must: have an area between the _min_ and _max_ areas of
-the fetched set.
-
-
-[[fragmentdensitymap-fragment-area-clamp]]
-=== Fragment Area Clamp
-
-The implementation may: clamp the fetched fragment area to one that it
-supports.
-The clamped fragment area must: have a size less than or equal to the
-original fetched value.
-Implementations may: vary the supported set of fragment areas per
-framebuffer region.
-Fragment area [eq]#(1,1)# must: always be in the supported set.
-
-[NOTE]
-.Note
-====
-For example, if the fetched fragment area is [eq]#(1,4)# but the
-implementation only supports areas of [eq]#{(1,1),(2,2)}#, it could choose
-to clamp the area to [eq]#(2,2)# since it has the same size as [eq]#(1,4)#.
-While this would produce fragments that have lower quality strictly in the
-x-axis, the overall density is maintained.
-====
-
-The clamped fragment area is assigned to the corresponding framebuffer
-region.
diff --git a/registry/vulkan/chapters/fragops.txt b/registry/vulkan/chapters/fragops.txt
deleted file mode 100644
index 3d82836..0000000
--- a/registry/vulkan/chapters/fragops.txt
+++ /dev/null
@@ -1,1793 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[fragops]]
-= Fragment Operations
-
-Fragments produced by rasterization go through a number of operations to
-determine whether or how values produced by fragment shading are written to
-the framebuffer.
-
-The following fragment operations adhere to <<primsrast-order,rasterization
-order>>, and are typically performed in this order:
-
-ifdef::VK_EXT_discard_rectangles[]
-  . <<fragops-discard-rectangles,Discard rectangles test>>
-endif::VK_EXT_discard_rectangles[]
-  . <<fragops-scissor,Scissor test>>
-ifdef::VK_NV_scissor_exclusive[]
-  . <<fragops-exclusive-scissor,Exclusive scissor test>>
-endif::VK_NV_scissor_exclusive[]
-  . <<fragops-samplemask,Sample mask test>>
-  . Certain <<fragops-shader,Fragment shading>> operations:
-  ** <<fragops-shader-samplemask, Sample Mask Accesses>>
-  ** <<fragops-shader-depthreplacement, Depth Replacement>>
-ifdef::VK_EXT_shader_stencil_export[]
-  ** <<fragops-shader-stencilrefreplacement, Stencil Reference Replacement>>
-endif::VK_EXT_shader_stencil_export[]
-ifdef::VK_EXT_fragment_shader_interlock[]
-  ** <<fragops-shader-interlock, Interlocked Operations>>
-endif::VK_EXT_fragment_shader_interlock[]
-  . <<fragops-covg, Multisample coverage>>
-  . <<fragops-dbt, Depth bounds test>>
-  . <<fragops-stencil, Stencil test>>
-  . <<fragops-depth, Depth test>>
-ifdef::VK_NV_representative_fragment_test[]
-  . <<fragops-rep-frag-test, Representative fragment test>>
-endif::VK_NV_representative_fragment_test[]
-  . <<fragops-samplecount, Sample counting>>
-ifdef::VK_NV_fragment_coverage_to_color[]
-  . <<fragops-coverage-to-color, Coverage to color>>
-endif::VK_NV_fragment_coverage_to_color[]
-  . <<fragops-coverage-reduction, Coverage reduction>>
-ifdef::VK_NV_framebuffer_mixed_samples[]
-  . <<fragops-coverage-modulation, Coverage modulation>>
-endif::VK_NV_framebuffer_mixed_samples[]
-
-The <<primsrast-multisampling-coverage-mask, coverage mask>> generated by
-rasterization describes the initial coverage of each sample covered by the
-fragment.
-Fragment operations will update the coverage mask to add or subtract
-coverage where appropriate.
-If a fragment operation results in all bits of the coverage mask being `0`,
-the fragment is discarded, and no further operations are performed.
-Fragments can also be programmatically discarded in a fragment shader by
-executing one of
-
-ifdef::VK_KHR_shader_terminate_invocation[]
-  * code:OpTerminateInvocation
-endif::VK_KHR_shader_terminate_invocation[]
-ifdef::VK_EXT_shader_demote_to_helper_invocation[]
-  * code:OpDemoteToHelperInvocationEXT
-endif::VK_EXT_shader_demote_to_helper_invocation[]
-  * code:OpKill.
-
-When one of the fragment operations in this chapter is described as
-"`replacing`" a fragment shader output, that output is replaced
-unconditionally, even if no fragment shader previously wrote to that output.
-
-ifdef::VK_EXT_post_depth_coverage[]
-If the <<fragops-shader, fragment shader>> declares the
-code:PostDepthCoverage execution mode, the <<fragops-samplemask, sample mask
-test>> is instead performed after the <<fragops-depth, depth test>>.
-endif::VK_EXT_post_depth_coverage[]
-
-If the <<fragops-shader, fragment shader>> declares the
-code:EarlyFragmentTests execution mode, <<fragops-shader,fragment shading>>
-and <<fragops-covg, multisample coverage>> operations are instead performed
-after <<fragops-samplecount, sample counting>>.
-
-Once all fragment operations have completed, fragment shader outputs for
-covered color attachment samples pass through <<framebuffer, framebuffer
-operations>>.
-
-
-ifdef::VK_EXT_discard_rectangles[]
-[[fragops-discard-rectangles]]
-== Discard Rectangles Test
-
-The discard rectangle test compares the framebuffer coordinates
-[eq]#(x~f~,y~f~)# of each sample covered by a fragment against a set of
-_discard rectangles_.
-
-Each discard rectangle is defined by a slink:VkRect2D.
-These values are either set by the
-slink:VkPipelineDiscardRectangleStateCreateInfoEXT structure during pipeline
-creation, or dynamically by the flink:vkCmdSetDiscardRectangleEXT command.
-
-A given sample is considered inside a discard rectangle if the [eq]#x~f~# is
-in the range [eq]#[slink:VkRect2D::offset.x, slink:VkRect2D::offset.x {plus}
-slink:VkRect2D::extent.x)#, and [eq]#y~f~# is in the range
-[eq]#[slink:VkRect2D::offset.y, slink:VkRect2D::offset.y {plus}
-slink:VkRect2D::extent.y)#.
-If the test is set to be inclusive, samples that are not inside any of the
-discard rectangles will have their coverage set to `0`.
-If the test is set to be exclusive, samples that are inside any of the
-discard rectangles will have their coverage set to `0`.
-
-If no discard rectangles are specified, the coverage mask is unmodified by
-this operation.
-
-[open,refpage='VkPipelineDiscardRectangleStateCreateInfoEXT',desc='Structure specifying discard rectangle',type='structs']
---
-The sname:VkPipelineDiscardRectangleStateCreateInfoEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPipelineDiscardRectangleStateCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:discardRectangleMode is a elink:VkDiscardRectangleModeEXT value
-    determining whether the discard rectangle test is inclusive or
-    exclusive.
-  * pname:discardRectangleCount is the number of discard rectangles to use.
-  * pname:pDiscardRectangles is a pointer to an array of slink:VkRect2D
-    structures defining discard rectangles.
-
-If the ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT dynamic state is enabled
-for a pipeline, the pname:pDiscardRectangles member is ignored.
-
-When this structure is included in the pname:pNext chain of
-slink:VkGraphicsPipelineCreateInfo, it defines parameters of the discard
-rectangle test.
-If this structure is not included in the pname:pNext chain, it is equivalent
-to specifying this structure with a pname:discardRectangleCount of `0`.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleCount-00582]]
-    pname:discardRectangleCount must: be less than or equal to
-    sname:VkPhysicalDeviceDiscardRectanglePropertiesEXT::pname:maxDiscardRectangles
-****
-
-include::{generated}/validity/structs/VkPipelineDiscardRectangleStateCreateInfoEXT.txt[]
---
-
-[open,refpage='VkPipelineDiscardRectangleStateCreateFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineDiscardRectangleStateCreateFlagsEXT.txt[]
-
-tname:VkPipelineDiscardRectangleStateCreateFlagsEXT is a bitmask type for
-setting a mask, but is currently reserved for future use.
---
-
-[open,refpage='VkDiscardRectangleModeEXT',desc='Specify the discard rectangle mode',type='enums']
---
-ename:VkDiscardRectangleModeEXT values are:
-
-include::{generated}/api/enums/VkDiscardRectangleModeEXT.txt[]
-
-  * ename:VK_DISCARD_RECTANGLE_MODE_INCLUSIVE_EXT specifies that the discard
-    rectangle test is inclusive.
-  * ename:VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT specifies that the discard
-    rectangle test is exclusive.
---
-
-[open,refpage='vkCmdSetDiscardRectangleEXT',desc='Set discard rectangles dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the discard rectangles,
-call:
-
-include::{generated}/api/protos/vkCmdSetDiscardRectangleEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:firstDiscardRectangle is the index of the first discard rectangle
-    whose state is updated by the command.
-  * pname:discardRectangleCount is the number of discard rectangles whose
-    state are updated by the command.
-  * pname:pDiscardRectangles is a pointer to an array of slink:VkRect2D
-    structures specifying discard rectangles.
-
-The discard rectangle taken from element [eq]#i# of pname:pDiscardRectangles
-replace the current state for the discard rectangle at index
-[eq]#pname:firstDiscardRectangle {plus} i#, for [eq]#i# in [eq]#[0,
-pname:discardRectangleCount)#.
-
-This command sets the discard rectangles for subsequent drawing commands
-when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineDiscardRectangleStateCreateInfoEXT::pname:pDiscardRectangles
-values used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetDiscardRectangleEXT-firstDiscardRectangle-00585]]
-    The sum of pname:firstDiscardRectangle and pname:discardRectangleCount
-    must: be less than or equal to
-    slink:VkPhysicalDeviceDiscardRectanglePropertiesEXT::pname:maxDiscardRectangles
-  * [[VUID-vkCmdSetDiscardRectangleEXT-x-00587]]
-    The pname:x and pname:y member of pname:offset in each slink:VkRect2D
-    element of pname:pDiscardRectangles must: be greater than or equal to
-    `0`
-  * [[VUID-vkCmdSetDiscardRectangleEXT-offset-00588]]
-    Evaluation of [eq]#(pname:offset.x {plus} pname:extent.width)# in each
-    slink:VkRect2D element of pname:pDiscardRectangles must: not cause a
-    signed integer addition overflow
-  * [[VUID-vkCmdSetDiscardRectangleEXT-offset-00589]]
-    Evaluation of [eq]#(pname:offset.y {plus} pname:extent.height)# in each
-    slink:VkRect2D element of pname:pDiscardRectangles must: not cause a
-    signed integer addition overflow
-ifdef::VK_NV_inherited_viewport_scissor[]
-  * [[VUID-vkCmdSetDiscardRectangleEXT-viewportScissor2D-04788]]
-    If this command is recorded in a secondary command buffer with
-    slink:VkCommandBufferInheritanceViewportScissorInfoNV::pname:viewportScissor2D
-    enabled, then this function must: not be called
-endif::VK_NV_inherited_viewport_scissor[]
-****
-
-include::{generated}/validity/protos/vkCmdSetDiscardRectangleEXT.txt[]
---
-endif::VK_EXT_discard_rectangles[]
-
-
-[[fragops-scissor]]
-== Scissor Test
-
-The scissor test compares the framebuffer coordinates [eq]#(x~f~,y~f~)# of
-each sample covered by a fragment against a _scissor rectangle_ at the index
-equal to the fragment's <<interfaces-builtin-variables-viewportindex,
-code:ViewportIndex>>.
-
-Each scissor rectangle is defined by a slink:VkRect2D.
-These values are either set by the slink:VkPipelineViewportStateCreateInfo
-structure during pipeline creation, or dynamically by the
-flink:vkCmdSetScissor command.
-
-A given sample is considered inside a scissor rectangle if [eq]#x~f~# is in
-the range [eq]#[slink:VkRect2D::offset.x, slink:VkRect2D::offset.x {plus}
-slink:VkRect2D::extent.x)#, and [eq]#y~f~# is in the range
-[eq]#[slink:VkRect2D::offset.y, slink:VkRect2D::offset.y {plus}
-slink:VkRect2D::extent.y)#.
-Samples with coordinates outside the scissor rectangle at the corresponding
-code:ViewportIndex will have their coverage set to `0`.
-
-ifdef::VK_QCOM_render_pass_transform[]
-If a render pass transform is enabled, the (pname:offset.x and
-pname:offset.y) and (pname:extent.width and pname:extent.height) values are
-transformed as described in <<vertexpostproc-renderpass-transform, render
-pass transform>> before participating in the scissor test.
-endif::VK_QCOM_render_pass_transform[]
-
-[open,refpage='vkCmdSetScissor',desc='Set scissor rectangles dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the scissor rectangles,
-call:
-
-include::{generated}/api/protos/vkCmdSetScissor.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:firstScissor is the index of the first scissor whose state is
-    updated by the command.
-  * pname:scissorCount is the number of scissors whose rectangles are
-    updated by the command.
-  * pname:pScissors is a pointer to an array of slink:VkRect2D structures
-    defining scissor rectangles.
-
-The scissor rectangles taken from element [eq]#i# of pname:pScissors replace
-the current state for the scissor index [eq]#pname:firstScissor {plus} i#,
-for [eq]#i# in [eq]#[0, pname:scissorCount)#.
-
-This command sets the scissor rectangles for subsequent drawing commands
-when the graphics pipeline is created with ename:VK_DYNAMIC_STATE_SCISSOR
-set in slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineViewportStateCreateInfo::pname:pScissors values used to
-create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetScissor-firstScissor-00592]]
-    The sum of pname:firstScissor and pname:scissorCount must: be between
-    `1` and sname:VkPhysicalDeviceLimits::pname:maxViewports, inclusive
-  * [[VUID-vkCmdSetScissor-firstScissor-00593]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:firstScissor must: be `0`
-  * [[VUID-vkCmdSetScissor-scissorCount-00594]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:scissorCount must: be `1`
-  * [[VUID-vkCmdSetScissor-x-00595]]
-    The pname:x and pname:y members of pname:offset member of any element of
-    pname:pScissors must: be greater than or equal to `0`
-  * [[VUID-vkCmdSetScissor-offset-00596]]
-    Evaluation of [eq]#(pname:offset.x {plus} pname:extent.width)# must: not
-    cause a signed integer addition overflow for any element of
-    pname:pScissors
-  * [[VUID-vkCmdSetScissor-offset-00597]]
-    Evaluation of [eq]#(pname:offset.y {plus} pname:extent.height)# must:
-    not cause a signed integer addition overflow for any element of
-    pname:pScissors
-ifdef::VK_NV_inherited_viewport_scissor[]
-  * [[VUID-vkCmdSetScissor-viewportScissor2D-04789]]
-    If this command is recorded in a secondary command buffer with
-    slink:VkCommandBufferInheritanceViewportScissorInfoNV::pname:viewportScissor2D
-    enabled, then this function must: not be called
-endif::VK_NV_inherited_viewport_scissor[]
-****
-
-include::{generated}/validity/protos/vkCmdSetScissor.txt[]
---
-
-
-ifdef::VK_NV_scissor_exclusive[]
-[[fragops-exclusive-scissor]]
-== Exclusive Scissor Test
-
-The exclusive scissor test compares the framebuffer coordinates
-[eq]#(x~f~,y~f~)# of each sample covered by a fragment against an _exclusive
-scissor rectangle_ at the index equal to the fragment's
-<<interfaces-builtin-variables-viewportindex, code:ViewportIndex>>.
-
-Each exclusive scissor rectangle is defined by a slink:VkRect2D.
-These values are either set by the
-slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV structure during
-pipeline creation, or dynamically by the flink:vkCmdSetExclusiveScissorNV
-command.
-
-A given sample is considered inside an exclusive scissor rectangle if
-[eq]#x~f~# is in the range [eq]#[slink:VkRect2D::offset.x,
-slink:VkRect2D::offset.x {plus} slink:VkRect2D::extent.x)#, and [eq]#y~f~#
-is in the range [eq]#[slink:VkRect2D::offset.y, slink:VkRect2D::offset.y
-{plus} slink:VkRect2D::extent.y)#.
-Samples with coordinates inside the exclusive scissor rectangle at the
-corresponding code:ViewportIndex will have their coverage set to `0`.
-
-If no exclusive scissor rectangles are specified, the coverage mask is
-unmodified by this operation.
-
-[open,refpage='VkPipelineViewportExclusiveScissorStateCreateInfoNV',desc='Structure specifying parameters controlling exclusive scissor testing',type='structs']
---
-The sname:VkPipelineViewportExclusiveScissorStateCreateInfoNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPipelineViewportExclusiveScissorStateCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:exclusiveScissorCount is the number of exclusive scissor
-    rectangles.
-  * pname:pExclusiveScissors is a pointer to an array of slink:VkRect2D
-    structures defining exclusive scissor rectangles.
-
-If the ename:VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV dynamic state is enabled
-for a pipeline, the pname:pExclusiveScissors member is ignored.
-
-When this structure is included in the pname:pNext chain of
-slink:VkGraphicsPipelineCreateInfo, it defines parameters of the exclusive
-scissor test.
-If this structure is not included in the pname:pNext chain, it is equivalent
-to specifying this structure with a pname:exclusiveScissorCount of `0`.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:exclusiveScissorCount must: be `0` or `1`
-  * [[VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028]]
-    pname:exclusiveScissorCount must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxViewports
-  * [[VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029]]
-    pname:exclusiveScissorCount must: be `0` or greater than or equal to the
-    pname:viewportCount member of slink:VkPipelineViewportStateCreateInfo
-
-****
-include::{generated}/validity/structs/VkPipelineViewportExclusiveScissorStateCreateInfoNV.txt[]
---
-
-[open,refpage='vkCmdSetExclusiveScissorNV',desc='Set exclusive scissor rectangles dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the exclusive scissor
-rectangles, call:
-
-include::{generated}/api/protos/vkCmdSetExclusiveScissorNV.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:firstExclusiveScissor is the index of the first exclusive scissor
-    rectangle whose state is updated by the command.
-  * pname:exclusiveScissorCount is the number of exclusive scissor
-    rectangles updated by the command.
-  * pname:pExclusiveScissors is a pointer to an array of slink:VkRect2D
-    structures defining exclusive scissor rectangles.
-
-The scissor rectangles taken from element [eq]#i# of
-pname:pExclusiveScissors replace the current state for the scissor index
-[eq]#pname:firstExclusiveScissor {plus} i#, for [eq]#i# in [eq]#[0,
-pname:exclusiveScissorCount)#.
-
-This command sets the exclusive scissor rectangles for subsequent drawing
-commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV::pname:pExclusiveScissors
-values used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetExclusiveScissorNV-None-02031]]
-    The <<features-exclusiveScissor,exclusive scissor>> feature must: be
-    enabled
-  * [[VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02034]]
-    The sum of pname:firstExclusiveScissor and pname:exclusiveScissorCount
-    must: be between `1` and
-    sname:VkPhysicalDeviceLimits::pname:maxViewports, inclusive
-  * [[VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:firstExclusiveScissor must: be `0`
-  * [[VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:exclusiveScissorCount must: be `1`
-  * [[VUID-vkCmdSetExclusiveScissorNV-x-02037]]
-    The pname:x and pname:y members of pname:offset in each member of
-    pname:pExclusiveScissors must: be greater than or equal to `0`
-  * [[VUID-vkCmdSetExclusiveScissorNV-offset-02038]]
-    Evaluation of [eq]#(pname:offset.x {plus} pname:extent.width)# for each
-    member of pname:pExclusiveScissors must: not cause a signed integer
-    addition overflow
-  * [[VUID-vkCmdSetExclusiveScissorNV-offset-02039]]
-    Evaluation of [eq]#(pname:offset.y {plus} pname:extent.height)# for each
-    member of pname:pExclusiveScissors must: not cause a signed integer
-    addition overflow
-****
-
-include::{generated}/validity/protos/vkCmdSetExclusiveScissorNV.txt[]
---
-endif::VK_NV_scissor_exclusive[]
-
-
-[[fragops-samplemask]]
-== Sample Mask Test
-
-The sample mask test compares the <<primsrast-multisampling-coverage-mask,
-coverage mask>> for a fragment with the _sample mask_ defined by
-slink:VkPipelineMultisampleStateCreateInfo::pname:pSampleMask.
-
-Each bit of the coverage mask is associated with a sample index as described
-in the <<primsrast-multisampling-coverage-mask, rasterization chapter>>.
-If the bit in slink:VkPipelineMultisampleStateCreateInfo::pname:pSampleMask
-which is associated with that same sample index is set to `0`, the coverage
-mask bit is set to `0`.
-
-
-[[fragops-shader]]
-== Fragment Shading
-
-<<shaders-fragment, Fragment shaders>> are invoked for each fragment, or as
-<<shaders-helper-invocations, helper invocations>>.
-
-Most operations in the fragment shader are not performed in
-<<primsrast-order, rasterization order>>, with exceptions called out in the
-following sections.
-
-For fragment shaders invoked by fragments, the following rules apply:
-
-  * A fragment shader must: not be executed if a <<fragops, fragment
-    operation>> that executes before fragment shading discards the fragment.
-  * A fragment shader may: not be executed if:
-  ** An implementation determines that another fragment shader, invoked by a
-     subsequent primitive in <<drawing-primitive-order, primitive order>>,
-     overwrites all results computed by the shader (including writes to
-     storage resources).
-  ** Any other <<fragops, fragment operation>> discards the fragment, and
-     the shader does not write to any storage resources.
-  * Otherwise, at least one fragment shader must: be executed.
-  ** If <<primsrast-sampleshading,sample shading>> is enabled and multiple
-     invocations per fragment are required:, additional invocations must: be
-     executed as specified.
-ifdef::VK_NV_shading_rate_image[]
-  ** If a <<primsrast-shading-rate-image,shading rate image>> is used and
-     multiple invocations per fragment are required:, additional invocations
-     must: be executed as specified.
-endif::VK_NV_shading_rate_image[]
-  ** Each covered sample must: be included in at least one fragment shader
-     invocation.
-
-
-[NOTE]
-.Note
-====
-Multiple fragment shader invocations may be executed for the same fragment
-for any number of implementation-dependent reasons.
-When there is more than one fragment shader invocation per fragment, the
-association of samples to invocations is implementation-dependent.
-Stores and atomics performed by these additional invocations have the normal
-effect.
-
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-For example, if the subpass includes multiple views in its view mask, a
-fragment shader may be invoked separately for each view.
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-ifdef::VK_EXT_fragment_density_map[]
-Similarly, if the render pass has a fragment density map attachment, more
-than one fragment shader invocation may be invoked for each covered sample.
-Such additional invocations are only produced if
-sname:VkPhysicalDeviceFragmentDensityMapPropertiesEXT::pname:fragmentDensityInvocations
-is ename:VK_TRUE.
-Implementations may generate these additional fragment shader invocations in
-order to make transitions between fragment areas with different fragment
-densities more smooth.
-endif::VK_EXT_fragment_density_map[]
-====
-
-
-[[fragops-shader-samplemask]]
-=== Sample Mask
-
-Reading from the <<interfaces-builtin-variables-samplemask,
-code:SampleMask>> built-in in the code:Input storage class will return the
-coverage mask for the current fragment as calculated by fragment operations
-that executed prior to fragment shading.
-
-If <<primsrast-sampleshading, sample shading>> is enabled, fragment shaders
-will only see values of `1` for samples being shaded - other bits will be
-`0`.
-
-Each bit of the coverage mask is associated with a sample index as described
-in the <<primsrast-multisampling-coverage-mask, rasterization chapter>>.
-If the bit in code:SampleMask which is associated with that same sample
-index is set to `0`, that coverage mask bit is set to `0`.
-
-Values written to the <<interfaces-builtin-variables-samplemask,
-code:SampleMask>> built-in in the code:Output storage class will be used by
-the <<fragops-covg, multisample coverage>> operation, with the same encoding
-as the input built-in.
-
-
-[[fragops-shader-depthreplacement]]
-=== Depth Replacement
-
-Writing to the <<interfaces-builtin-variables-fragdepth,code:FragDepth>>
-built-in will replace the fragment's calculated depth values for each sample
-in the input code:SampleMask.
-<<fragops-depth, Depth testing>> performed after the fragment shader for
-this fragment will use this new value as [eq]#z~f~#.
-
-
-ifdef::VK_EXT_shader_stencil_export[]
-[[fragops-shader-stencilrefreplacement]]
-=== Stencil Reference Replacement
-
-Writing to the
-<<interfaces-builtin-variables-fragdepth,code:FragStencilRefEXT>> built-in
-will replace the fragment's stencil reference value for each sample in the
-input code:SampleMask.
-<<fragops-stencil, Stencil testing>> performed after the fragment shader for
-this fragment will use this new value as [eq]#s~r~#.
-endif::VK_EXT_shader_stencil_export[]
-
-
-ifdef::VK_EXT_fragment_shader_interlock[]
-[[fragops-shader-interlock]]
-=== Interlocked Operations
-
-code:OpBeginInvocationInterlockEXT and code:OpEndInvocationInterlockEXT
-define a section of a fragment shader which imposes additional ordering
-constraints on operations performed within them.
-These operations are defined as _interlocked operations_.
-How interlocked operations are ordered against other fragment shader
-invocations depends on the specified execution modes.
-
-ifdef::VK_NV_shading_rate_image,VK_KHR_fragment_shading_rate[]
-If the code:ShadingRateInterlockOrderedEXT execution mode is specified, any
-interlocked operations in a fragment shader must: happen before interlocked
-operations in fragment shader invocations that execute later in
-<<primsrast-order, rasterization order>> and cover at least one sample in
-the same fragment area, and must: happen after interlocked operations in a
-fragment shader that executes earlier in <<primsrast-order, rasterization
-order>> and cover at least one sample in the same fragment area.
-
-If the code:ShadingRateInterlockUnorderedEXT execution mode is specified,
-any interlocked operations in a fragment shader must: happen before or after
-interlocked operations in fragment shader invocations that execute earlier
-or later in <<primsrast-order, rasterization order>> and cover at least one
-sample in the same fragment area.
-endif::VK_NV_shading_rate_image,VK_KHR_fragment_shading_rate[]
-
-If the code:PixelInterlockOrderedEXT execution mode is specified, any
-interlocked operations in a fragment shader must: happen before interlocked
-operations in fragment shader invocations that execute later in
-<<primsrast-order, rasterization order>> and cover at least one sample in
-the same pixel, and must: happen after interlocked operations in a fragment
-shader that executes earlier in <<primsrast-order, rasterization order>> and
-cover at least one sample in the same pixel.
-
-If the code:PixelInterlockUnorderedEXT execution mode is specified, any
-interlocked operations in a fragment shader must: happen before or after
-interlocked operations in fragment shader invocations that execute earlier
-or later in <<primsrast-order, rasterization order>> and cover at least one
-sample in the same pixel.
-
-If the code:SampleInterlockOrderedEXT execution mode is specified, any
-interlocked operations in a fragment shader must: happen before interlocked
-operations in fragment shader invocations that execute later in
-<<primsrast-order, rasterization order>> and cover at least one of the same
-samples, and must: happen after interlocked operations in a fragment shader
-that executes earlier in <<primsrast-order, rasterization order>> and cover
-at least one of the same samples.
-
-If the code:SampleInterlockUnorderedEXT execution mode is specified, any
-interlocked operations in a fragment shader must: happen before or after
-interlocked operations in fragment shader invocations that execute earlier
-or later in <<primsrast-order, rasterization order>> and cover at least one
-of the same samples.
-endif::VK_EXT_fragment_shader_interlock[]
-
-
-[[fragops-covg]]
-== Multisample Coverage
-
-If a fragment shader is active and its entry point's interface includes a
-built-in output variable decorated with code:SampleMask,
-ifdef::VK_NV_sample_mask_override_coverage[]
-but not code:OverrideCoverageNV,
-endif::VK_NV_sample_mask_override_coverage[]
-the coverage mask is code:ANDed with the bits of the code:SampleMask
-built-in to generate a new coverage mask.
-ifdef::VK_NV_sample_mask_override_coverage[]
-If the code:SampleMask built-in is also decorated with
-code:OverrideCoverageNV, the coverage mask is replaced with the mask bits
-set in the shader.
-endif::VK_NV_sample_mask_override_coverage[]
-If <<primsrast-sampleshading,sample shading>> is enabled, bits written to
-code:SampleMask corresponding to samples that are not being shaded by the
-fragment shader invocation are ignored.
-If no fragment shader is active, or if the active fragment shader does not
-include code:SampleMask in its interface, the coverage mask is not modified.
-
-Next, the fragment alpha value and coverage mask are modified based on the
-ifdef::VK_EXT_line_rasterization[]
-line coverage factor if the pname:lineRasterizationMode member of the
-slink:VkPipelineRasterizationStateCreateInfo structure is
-ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT, and the
-endif::VK_EXT_line_rasterization[]
-pname:alphaToCoverageEnable and pname:alphaToOneEnable members of the
-slink:VkPipelineMultisampleStateCreateInfo structure.
-
-All alpha values in this section refer only to the alpha component of the
-fragment shader output that has a code:Location and code:Index decoration of
-zero (see the <<interfaces-fragmentoutput,Fragment Output Interface>>
-section).
-If that shader output has an integer or unsigned integer type, then these
-operations are skipped.
-
-ifdef::VK_EXT_line_rasterization[]
-If the pname:lineRasterizationMode member of the
-slink:VkPipelineRasterizationStateCreateInfo structure is
-ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT and the fragment
-came from a line segment, then the alpha value is replaced by multiplying it
-by the coverage factor for the fragment computed during
-<<primsrast-lines-smooth,smooth line rasterization>>.
-endif::VK_EXT_line_rasterization[]
-
-If pname:alphaToCoverageEnable is enabled, a temporary coverage mask is
-generated where each bit is determined by the fragment's alpha value, which
-is ANDed with the fragment coverage mask.
-
-No specific algorithm is specified for converting the alpha value to a
-temporary coverage mask.
-It is intended that the number of 1's in this value be proportional to the
-alpha value (clamped to [eq]#[0,1]#), with all 1's corresponding to a value
-of 1.0 and all 0's corresponding to 0.0.
-The algorithm may: be different at different framebuffer coordinates.
-
-[NOTE]
-.Note
-====
-Using different algorithms at different framebuffer coordinates may: help to
-avoid artifacts caused by regular coverage sample locations.
-====
-
-Finally, if pname:alphaToOneEnable is enabled, each alpha value is replaced
-by the maximum representable alpha value for fixed-point color buffers, or
-by 1.0 for floating-point buffers.
-Otherwise, the alpha values are not changed.
-
-
-[[fragops-ds-state]]
-== Depth and Stencil Operations
-
-Pipeline state controlling the <<fragops-dbt,depth bounds tests>>,
-<<fragops-stencil,stencil test>>, and <<fragops-depth,depth test>> is
-specified through the members of the
-sname:VkPipelineDepthStencilStateCreateInfo structure.
-
-[open,refpage='VkPipelineDepthStencilStateCreateInfo',desc='Structure specifying parameters of a newly created pipeline depth stencil state',type='structs']
---
-The sname:VkPipelineDepthStencilStateCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkPipelineDepthStencilStateCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:depthTestEnable controls whether <<fragops-depth,depth testing>>
-    is enabled.
-  * pname:depthWriteEnable controls whether <<fragops-depth-write,depth
-    writes>> are enabled when pname:depthTestEnable is ename:VK_TRUE.
-    Depth writes are always disabled when pname:depthTestEnable is
-    ename:VK_FALSE.
-  * pname:depthCompareOp is the comparison operator used in the
-    <<fragops-depth,depth test>>.
-  * pname:depthBoundsTestEnable controls whether <<fragops-dbt,depth bounds
-    testing>> is enabled.
-  * pname:stencilTestEnable controls whether <<fragops-stencil,stencil
-    testing>> is enabled.
-  * pname:front and pname:back control the parameters of the
-    <<fragops-stencil,stencil test>>.
-  * pname:minDepthBounds is the minimum depth bound used in the
-    <<fragops-dbt, depth bounds test>>.
-  * pname:maxDepthBounds is the maximum depth bound used in the
-    <<fragops-dbt, depth bounds test>>.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineDepthStencilStateCreateInfo-depthBoundsTestEnable-00598]]
-    If the <<features-depthBounds,depth bounds testing>> feature is not
-    enabled, pname:depthBoundsTestEnable must: be ename:VK_FALSE
-ifdef::VK_KHR_portability_subset[]
-  * [[VUID-VkPipelineDepthStencilStateCreateInfo-separateStencilMaskRef-04453]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:separateStencilMaskRef
-    is ename:VK_FALSE, and the value of
-    slink:VkPipelineDepthStencilStateCreateInfo::pname:stencilTestEnable is
-    ename:VK_TRUE, and the value of
-    slink:VkPipelineRasterizationStateCreateInfo::pname:cullMode is
-    ename:VK_CULL_MODE_NONE, the value of pname:reference in each of the
-    slink:VkStencilOpState structs in pname:front and pname:back must: be
-    the same
-endif::VK_KHR_portability_subset[]
-****
-
-include::{generated}/validity/structs/VkPipelineDepthStencilStateCreateInfo.txt[]
---
-
-[open,refpage='VkPipelineDepthStencilStateCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineDepthStencilStateCreateFlags.txt[]
-
-tname:VkPipelineDepthStencilStateCreateFlags is a bitmask type for setting a
-mask, but is currently reserved for future use.
---
-
-
-[[fragops-dbt]]
-== Depth Bounds Test
-
-The depth bounds test compares the depth value [eq]#z~a~# in the
-depth/stencil attachment at each sample's framebuffer coordinates
-[eq]#(x~f~,y~f~)# and <<primsrast-multisampling-coverage-mask, sample
-index>> [eq]#i# against a set of _depth bounds_.
-
-The depth bounds are determined by two floating point values defining a
-minimum (pname:minDepthBounds) and maximum (pname:maxDepthBounds) depth
-value.
-These values are either set by the
-slink:VkPipelineDepthStencilStateCreateInfo structure during pipeline
-creation, or dynamically by
-ifdef::VK_EXT_extended_dynamic_state[]
-flink:vkCmdSetDepthBoundsTestEnableEXT and
-endif::VK_EXT_extended_dynamic_state[]
-flink:vkCmdSetDepthBounds.
-
-A given sample is considered within the depth bounds if [eq]#z~a~# is in the
-range [eq]#[pname:minDepthBounds,pname:maxDepthBounds]#.
-Samples with depth attachment values outside of the depth bounds will have
-their coverage set to `0`.
-
-If the depth bounds test is disabled, or if there is no depth attachment,
-the coverage mask is unmodified by this operation.
-
-ifdef::VK_EXT_extended_dynamic_state[]
-[open,refpage='vkCmdSetDepthBoundsTestEnableEXT',desc='Set depth bounds test enable dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically enable or disable>> the depth
-bounds test, call:
-
-include::{generated}/api/protos/vkCmdSetDepthBoundsTestEnableEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:depthBoundsTestEnable specifies if the depth bounds test is
-    enabled.
-
-This command sets the depth bounds enable for subsequent drawing commands
-when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineDepthStencilStateCreateInfo::pname:depthBoundsTestEnable
-value used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetDepthBoundsTestEnableEXT-None-03349]]
-    The <<features-extendedDynamicState, extendedDynamicState>> feature
-    must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdSetDepthBoundsTestEnableEXT.txt[]
---
-endif::VK_EXT_extended_dynamic_state[]
-
-[open,refpage='vkCmdSetDepthBounds',desc='Set depth bounds range dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the depth bounds range,
-call:
-
-include::{generated}/api/protos/vkCmdSetDepthBounds.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:minDepthBounds is the minimum depth bound.
-  * pname:maxDepthBounds is the maximum depth bound.
-
-This command sets the depth bounds range for subsequent drawing commands
-when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineDepthStencilStateCreateInfo::pname:minDepthBounds and
-slink:VkPipelineDepthStencilStateCreateInfo::pname:maxDepthBounds values
-used to create the currently active pipeline.
-
-.Valid Usage
-****
-ifdef::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-vkCmdSetDepthBounds-minDepthBounds-00600]]
-    Unless the `apiext:VK_EXT_depth_range_unrestricted` extension is enabled
-    pname:minDepthBounds must: be between `0.0` and `1.0`, inclusive
-endif::VK_EXT_depth_range_unrestricted[]
-ifndef::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-vkCmdSetDepthBounds-minDepthBounds-02508]]
-    pname:minDepthBounds must: be between `0.0` and `1.0`, inclusive
-endif::VK_EXT_depth_range_unrestricted[]
-ifdef::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-vkCmdSetDepthBounds-maxDepthBounds-00601]]
-    Unless the `apiext:VK_EXT_depth_range_unrestricted` extension is enabled
-    pname:maxDepthBounds must: be between `0.0` and `1.0`, inclusive
-endif::VK_EXT_depth_range_unrestricted[]
-ifndef::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-vkCmdSetDepthBounds-maxDepthBounds-02509]]
-    pname:maxDepthBounds must: be between `0.0` and `1.0`, inclusive
-endif::VK_EXT_depth_range_unrestricted[]
-****
-
-include::{generated}/validity/protos/vkCmdSetDepthBounds.txt[]
---
-
-
-[[fragops-stencil]]
-== Stencil Test
-
-The stencil test compares the stencil attachment value [eq]#s~a~# in the
-depth/stencil attachment at each sample's framebuffer coordinates
-[eq]#(x~f~,y~f~)# and <<primsrast-multisampling-coverage-mask, sample
-index>> [eq]#i# against a _stencil reference value_.
-
-ifdef::VK_EXT_fragment_density_map[]
-If the render pass has a fragment density map attachment and the fragment
-covers multiple pixels, there is an implementation-dependent association of
-coverage samples to stencil attachment samples within the fragment.
-However, if all samples in the fragment are covered, and the stencil
-attachment value is updated as a result of this test, all stencil attachment
-samples will be updated.
-endif::VK_EXT_fragment_density_map[]
-
-If the stencil test is not enabled, as specified by
-ifdef::VK_EXT_extended_dynamic_state[]
-flink:vkCmdSetStencilTestEnableEXT or
-endif::VK_EXT_extended_dynamic_state[]
-slink:VkPipelineDepthStencilStateCreateInfo::pname:stencilTestEnable, or if
-there is no stencil attachment, the coverage mask is unmodified by this
-operation.
-
-The stencil test is controlled by one of two sets of stencil-related state,
-the front stencil state and the back stencil state.
-Stencil tests and writes use the back stencil state when processing
-fragments generated by <<primsrast-polygons-basic,back-facing>>
-<<primsrast-polygons,polygons>>, and the front stencil state when processing
-fragments generated by <<primsrast-polygons-basic,front-facing polygons>> or
-any other primitives.
-
-The comparison performed is based on the elink:VkCompareOp, compare mask
-[eq]#s~c~# , and stencil reference value [eq]#s~r~# of the relevant state
-set.
-The compare mask and stencil reference value are set by either the
-slink:VkPipelineDepthStencilStateCreateInfo structure during pipeline
-creation, or by the flink:vkCmdSetStencilCompareMask and
-flink:vkCmdSetStencilReference commands respectively.
-The compare operation is set by slink:VkStencilOpState::pname:compareOp
-during pipeline creation.
-
-The stencil reference and attachment values [eq]#s~r~# and [eq]#s~a~# are
-each independently combined with the compare mask [eq]#s~c~# using a logical
-code:AND operation to create masked reference and attachment values
-[eq]#s'~r~# and [eq]#s'~a~#.
-[eq]#s'~r~# and [eq]#s'~a~# are used as [eq]#A# and [eq]#B#, respectively,
-in the operation specified by elink:VkCompareOp.
-
-If the comparison evaluates to false, the coverage for the sample is set to
-`0`.
-
-A new stencil value [eq]#s~g~# is generated according to a stencil operation
-defined by elink:VkStencilOp parameters set by
-ifdef::VK_EXT_extended_dynamic_state[]
-flink:vkCmdSetStencilOpEXT or
-endif::VK_EXT_extended_dynamic_state[]
-slink:VkPipelineDepthStencilStateCreateInfo.
-If the stencil test fails, pname:failOp defines the stencil operation used.
-If the stencil test passes however, the stencil op used is based on the
-<<fragops-depth, depth test>> - if it passes,
-slink:VkPipelineDepthStencilStateCreateInfo::pname:passOp is used, otherwise
-slink:VkPipelineDepthStencilStateCreateInfo::pname:depthFailOp is used.
-
-The stencil attachment value [eq]#s~a~# is then updated with the generated
-stencil value [eq]#s~g~# according to the write mask [eq]#s~w~# defined by
-slink:VkPipelineDepthStencilStateCreateInfo::pname:writeMask as:
-
-  {empty}:: [eq]#s~a~ = (s~a~ & ¬s~w~) | (s~g~ & s~w~)#
-
-If there is no stencil attachment, no value is written.
-
-ifdef::VK_EXT_extended_dynamic_state[]
-
-[open,refpage='vkCmdSetStencilTestEnableEXT',desc='Set stencil test enable dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically enable or disable>> the stencil
-test, call:
-
-include::{generated}/api/protos/vkCmdSetStencilTestEnableEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:stencilTestEnable specifies if the stencil test is enabled.
-
-This command sets the stencil test enable for subsequent drawing commands
-when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineDepthStencilStateCreateInfo::pname:stencilTestEnable value
-used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetStencilTestEnableEXT-None-03350]]
-    The <<features-extendedDynamicState, extendedDynamicState>> feature
-    must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdSetStencilTestEnableEXT.txt[]
---
-
-[open,refpage='vkCmdSetStencilOpEXT',desc='Set stencil operation dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the stencil operation, call:
-
-include::{generated}/api/protos/vkCmdSetStencilOpEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:faceMask is a bitmask of elink:VkStencilFaceFlagBits specifying
-    the set of stencil state for which to update the stencil operation.
-  * pname:failOp is a elink:VkStencilOp value specifying the action
-    performed on samples that fail the stencil test.
-  * pname:passOp is a elink:VkStencilOp value specifying the action
-    performed on samples that pass both the depth and stencil tests.
-  * pname:depthFailOp is a elink:VkStencilOp value specifying the action
-    performed on samples that pass the stencil test and fail the depth test.
-  * pname:compareOp is a elink:VkCompareOp value specifying the comparison
-    operator used in the stencil test.
-
-This command sets the stencil operation for subsequent drawing commands when
-the graphics pipeline is created with ename:VK_DYNAMIC_STATE_STENCIL_OP_EXT
-set in slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the corresponding
-sname:VkPipelineDepthStencilStateCreateInfo::pname:failOp, pname:passOp,
-pname:depthFailOp, and pname:compareOp values used to create the currently
-active pipeline, for both front and back faces.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetStencilOpEXT-None-03351]]
-    The <<features-extendedDynamicState, extendedDynamicState>> feature
-    must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdSetStencilOpEXT.txt[]
---
-
-endif::VK_EXT_extended_dynamic_state[]
-
-[open,refpage='VkStencilOpState',desc='Structure specifying stencil operation state',type='structs']
---
-The sname:VkStencilOpState structure is defined as:
-
-include::{generated}/api/structs/VkStencilOpState.txt[]
-
-  * pname:failOp is a elink:VkStencilOp value specifying the action
-    performed on samples that fail the stencil test.
-  * pname:passOp is a elink:VkStencilOp value specifying the action
-    performed on samples that pass both the depth and stencil tests.
-  * pname:depthFailOp is a elink:VkStencilOp value specifying the action
-    performed on samples that pass the stencil test and fail the depth test.
-  * pname:compareOp is a elink:VkCompareOp value specifying the comparison
-    operator used in the stencil test.
-  * pname:compareMask selects the bits of the unsigned integer stencil
-    values participating in the stencil test.
-  * pname:writeMask selects the bits of the unsigned integer stencil values
-    updated by the stencil test in the stencil framebuffer attachment.
-  * pname:reference is an integer reference value that is used in the
-    unsigned stencil comparison.
-
-include::{generated}/validity/structs/VkStencilOpState.txt[]
---
-
-[open,refpage='vkCmdSetStencilCompareMask',desc='Set stencil compare mask dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the stencil compare mask
-call:
-
-include::{generated}/api/protos/vkCmdSetStencilCompareMask.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:faceMask is a bitmask of elink:VkStencilFaceFlagBits specifying
-    the set of stencil state for which to update the compare mask.
-  * pname:compareMask is the new value to use as the stencil compare mask.
-
-This command sets the stencil compare mask for subsequent drawing commands
-when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineDepthStencilStateCreateInfo::pname:compareMask value used to
-create the currently active pipeline, for both front and back faces.
-
-include::{generated}/validity/protos/vkCmdSetStencilCompareMask.txt[]
---
-
-[open,refpage='VkStencilFaceFlagBits',desc='Bitmask specifying sets of stencil state for which to update the compare mask',type='enums']
---
-ename:VkStencilFaceFlagBits values are:
-
-include::{generated}/api/enums/VkStencilFaceFlagBits.txt[]
-
-  * ename:VK_STENCIL_FACE_FRONT_BIT specifies that only the front set of
-    stencil state is updated.
-  * ename:VK_STENCIL_FACE_BACK_BIT specifies that only the back set of
-    stencil state is updated.
-  * ename:VK_STENCIL_FACE_FRONT_AND_BACK is the combination of
-    ename:VK_STENCIL_FACE_FRONT_BIT and ename:VK_STENCIL_FACE_BACK_BIT, and
-    specifies that both sets of stencil state are updated.
-
---
-
-[open,refpage='VkStencilFaceFlags',desc='Bitmask of VkStencilFaceFlagBits',type='flags']
---
-include::{generated}/api/flags/VkStencilFaceFlags.txt[]
-
-tname:VkStencilFaceFlags is a bitmask type for setting a mask of zero or
-more elink:VkStencilFaceFlagBits.
---
-
-[open,refpage='vkCmdSetStencilWriteMask',desc='Set stencil write mask dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the stencil write mask,
-call:
-
-include::{generated}/api/protos/vkCmdSetStencilWriteMask.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:faceMask is a bitmask of elink:VkStencilFaceFlagBits specifying
-    the set of stencil state for which to update the write mask, as
-    described above for flink:vkCmdSetStencilCompareMask.
-  * pname:writeMask is the new value to use as the stencil write mask.
-
-This command sets the stencil write mask for subsequent drawing commands
-when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_STENCIL_WRITE_MASK set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineDepthStencilStateCreateInfo::pname:writeMask value used to
-create the currently active pipeline, for both front and back faces.
-
-include::{generated}/validity/protos/vkCmdSetStencilWriteMask.txt[]
---
-
-[open,refpage='vkCmdSetStencilReference',desc='Set stencil reference value dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the stencil reference value,
-call:
-
-include::{generated}/api/protos/vkCmdSetStencilReference.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:faceMask is a bitmask of elink:VkStencilFaceFlagBits specifying
-    the set of stencil state for which to update the reference value, as
-    described above for flink:vkCmdSetStencilCompareMask.
-  * pname:reference is the new value to use as the stencil reference value.
-
-This command sets the stencil reference value for subsequent drawing
-commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_STENCIL_REFERENCE set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineDepthStencilStateCreateInfo::pname:reference value used to
-create the currently active pipeline, for both front and back faces.
-
-include::{generated}/validity/protos/vkCmdSetStencilReference.txt[]
---
-
-[open,refpage='VkCompareOp',desc='Stencil comparison function',type='enums']
---
-Possible values of slink:VkStencilOpState::pname:compareOp, specifying the
-stencil comparison function, are:
-
-include::{generated}/api/enums/VkCompareOp.txt[]
-
-  * ename:VK_COMPARE_OP_NEVER specifies that the test evaluates to false.
-  * ename:VK_COMPARE_OP_LESS specifies that the test evaluates [eq]#A < B#.
-  * ename:VK_COMPARE_OP_EQUAL specifies that the test evaluates [eq]#A = B#.
-  * ename:VK_COMPARE_OP_LESS_OR_EQUAL specifies that the test evaluates
-    [eq]#A {leq} B#.
-  * ename:VK_COMPARE_OP_GREATER specifies that the test evaluates [eq]#A >
-    B#.
-  * ename:VK_COMPARE_OP_NOT_EQUAL specifies that the test evaluates [eq]#A
-    {neq} B#.
-  * ename:VK_COMPARE_OP_GREATER_OR_EQUAL specifies that the test evaluates
-    [eq]#A {geq} B#.
-  * ename:VK_COMPARE_OP_ALWAYS specifies that the test evaluates to true.
---
-
-[open,refpage='VkStencilOp',desc='Stencil comparison function',type='enums']
---
-Possible values of the pname:failOp, pname:passOp, and pname:depthFailOp
-members of slink:VkStencilOpState, specifying what happens to the stored
-stencil value if this or certain subsequent tests fail or pass, are:
-
-include::{generated}/api/enums/VkStencilOp.txt[]
-
-  * ename:VK_STENCIL_OP_KEEP keeps the current value.
-  * ename:VK_STENCIL_OP_ZERO sets the value to 0.
-  * ename:VK_STENCIL_OP_REPLACE sets the value to pname:reference.
-  * ename:VK_STENCIL_OP_INCREMENT_AND_CLAMP increments the current value and
-    clamps to the maximum representable unsigned value.
-  * ename:VK_STENCIL_OP_DECREMENT_AND_CLAMP decrements the current value and
-    clamps to 0.
-  * ename:VK_STENCIL_OP_INVERT bitwise-inverts the current value.
-  * ename:VK_STENCIL_OP_INCREMENT_AND_WRAP increments the current value and
-    wraps to 0 when the maximum value would have been exceeded.
-  * ename:VK_STENCIL_OP_DECREMENT_AND_WRAP decrements the current value and
-    wraps to the maximum possible value when the value would go below 0.
-
-For purposes of increment and decrement, the stencil bits are considered as
-an unsigned integer.
---
-
-
-[[fragops-depth]]
-== Depth Test
-
-The depth test compares the depth value [eq]#z~a~# in the depth/stencil
-attachment at each sample's framebuffer coordinates [eq]#(x~f~,y~f~)# and
-<<primsrast-multisampling-coverage-mask, sample index>> [eq]#i# against the
-sample's depth value [eq]#z~f~#.
-If there is no depth attachment then the depth test is skipped.
-
-ifdef::VK_EXT_fragment_density_map[]
-If the render pass has a fragment density map attachment and the fragment
-covers multiple pixels, there is an implementation-dependent association of
-rasterization samples to depth attachment samples within the fragment.
-However, if all samples in the fragment are covered, and the depth
-attachment value is updated as a result of this test, all depth attachment
-samples will be updated.
-endif::VK_EXT_fragment_density_map[]
-
-The depth test occurs in three stages, as detailed in the following
-sections.
-
-=== Depth Clamping and Range Adjustment
-
-If slink:VkPipelineRasterizationStateCreateInfo::pname:depthClampEnable is
-enabled, before the sample's [eq]#z~f~# is compared to [eq]#z~a~#,
-[eq]#z~f~# is clamped to [eq]#[min(n,f),max(n,f)]#, where [eq]#n# and
-[eq]#f# are the pname:minDepth and pname:maxDepth depth range values of the
-viewport used by this fragment, respectively.
-
-If depth clamping is not enabled and [eq]#z~f~# is not in the range [eq]#[0,
-1]#
-ifdef::VK_EXT_depth_range_unrestricted[]
-and either apiext:VK_EXT_depth_range_unrestricted is not enabled, or the
-depth attachment has a fixed-point format,
-endif::VK_EXT_depth_range_unrestricted[]
-then [eq]#z~f~# is undefined: following this step.
-
-
-=== Depth Comparison
-
-If the depth test is not enabled, as specified by
-ifdef::VK_EXT_extended_dynamic_state[]
-flink:vkCmdSetDepthTestEnableEXT or
-endif::VK_EXT_extended_dynamic_state[]
-slink:VkPipelineDepthStencilStateCreateInfo::pname:depthTestEnable, then
-this step is skipped.
-
-The comparison performed is based on the elink:VkCompareOp, set by
-ifdef::VK_EXT_extended_dynamic_state[]
-flink:vkCmdSetDepthCompareOpEXT or
-endif::VK_EXT_extended_dynamic_state[]
-slink:VkPipelineDepthStencilStateCreateInfo::pname:depthCompareOp during
-pipeline creation.
-[eq]#z~f~# and [eq]#z~a~# are used as [eq]#A# and [eq]#B#, respectively, in
-the operation specified by the elink:VkCompareOp.
-
-If the comparison evaluates to false, the coverage for the sample is set to
-`0`.
-
-
-[[fragops-depth-write]]
-=== Depth Buffer Writes
-
-If depth writes are enabled, as specified by
-ifdef::VK_EXT_extended_dynamic_state[]
-flink:vkCmdSetDepthWriteEnableEXT or
-endif::VK_EXT_extended_dynamic_state[]
-slink:VkPipelineDepthStencilStateCreateInfo::pname:depthWriteEnable, and the
-comparison evaluated to true, the depth attachment value [eq]#z~a~# is set
-to the sample's depth value [eq]#z~f~#.
-If there is no depth attachment, no value is written.
-
-
-
-ifdef::VK_EXT_extended_dynamic_state[]
-[open,refpage='vkCmdSetDepthTestEnableEXT',desc='Set depth test enable dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically enable or disable>> the depth
-test, call:
-
-include::{generated}/api/protos/vkCmdSetDepthTestEnableEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:depthTestEnable specifies if the depth test is enabled.
-
-This command sets the depth test enable for subsequent drawing commands when
-the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineDepthStencilStateCreateInfo::pname:depthTestEnable value
-used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetDepthTestEnableEXT-None-03352]]
-    The <<features-extendedDynamicState, extendedDynamicState>> feature
-    must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdSetDepthTestEnableEXT.txt[]
---
-
-[open,refpage='vkCmdSetDepthCompareOpEXT',desc='Set depth comparison operator dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the depth compare operator,
-call:
-
-include::{generated}/api/protos/vkCmdSetDepthCompareOpEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:depthCompareOp specifies the depth comparison operator.
-
-This command sets the depth comparison operator for subsequent drawing
-commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineDepthStencilStateCreateInfo::pname:depthCompareOp value used
-to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetDepthCompareOpEXT-None-03353]]
-    The <<features-extendedDynamicState, extendedDynamicState>> feature
-    must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdSetDepthCompareOpEXT.txt[]
---
-
-[open,refpage='vkCmdSetDepthWriteEnableEXT',desc='Set depth write enable dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the depth write enable,
-call:
-
-include::{generated}/api/protos/vkCmdSetDepthWriteEnableEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:depthWriteEnable specifies if depth writes are enabled.
-
-This command sets the depth write enable for subsequent drawing commands
-when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineDepthStencilStateCreateInfo::pname:depthWriteEnable value
-used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetDepthWriteEnableEXT-None-03354]]
-    The <<features-extendedDynamicState, extendedDynamicState>> feature
-    must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdSetDepthWriteEnableEXT.txt[]
---
-endif::VK_EXT_extended_dynamic_state[]
-
-
-ifdef::VK_NV_representative_fragment_test[]
-[[fragops-rep-frag-test]]
-== Representative Fragment Test
-
-The representative fragment test allows implementations to reduce the amount
-of rasterization and fragment processing work performed for each point,
-line, or triangle primitive.
-For any primitive that produces one or more fragments that pass all prior
-early fragment tests, the implementation may: choose one or more
-"`representative`" fragments for processing and discard all other fragments.
-For draw calls rendering multiple points, lines, or triangles arranged in
-lists, strips, or fans, the representative fragment test is performed
-independently for each of those primitives.
-The set of fragments discarded by the representative fragment test is
-implementation-dependent.
-In some cases, the representative fragment test may not discard any
-fragments for a given primitive.
-
-[open,refpage='VkPipelineRepresentativeFragmentTestStateCreateInfoNV',desc='Structure specifying representative fragment test',type='structs']
---
-If the pname:pNext chain of slink:VkGraphicsPipelineCreateInfo includes a
-sname:VkPipelineRepresentativeFragmentTestStateCreateInfoNV structure, then
-that structure includes parameters that control the representative fragment
-test.
-
-The sname:VkPipelineRepresentativeFragmentTestStateCreateInfoNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPipelineRepresentativeFragmentTestStateCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:representativeFragmentTestEnable controls whether the
-    representative fragment test is enabled.
-
-If this structure is not included in the pname:pNext chain,
-pname:representativeFragmentTestEnable is considered to be ename:VK_FALSE,
-and the representative fragment test is disabled.
-
-If the active fragment shader specifies the code:EarlyFragmentTests
-execution mode, the representative fragment shader test has no effect, even
-if enabled.
-
-include::{generated}/validity/structs/VkPipelineRepresentativeFragmentTestStateCreateInfoNV.txt[]
---
-
-endif::VK_NV_representative_fragment_test[]
-
-
-[[fragops-samplecount]]
-== Sample Counting
-
-Occlusion queries use query pool entries to track the number of samples that
-pass all the per-fragment tests.
-The mechanism of collecting an occlusion query value is described in
-<<queries-occlusion,Occlusion Queries>>.
-
-The occlusion query sample counter increments by one for each sample with a
-coverage value of 1 in each fragment that survives all the per-fragment
-tests, including scissor,
-ifdef::VK_NV_scissor_exclusive[]
-exclusive scissor,
-endif::VK_NV_scissor_exclusive[]
-sample mask, alpha to coverage, stencil, and depth tests.
-
-
-ifdef::VK_NV_fragment_coverage_to_color[]
-[[fragops-coverage-to-color]]
-== Fragment Coverage To Color
-
-[open,refpage='VkPipelineCoverageToColorStateCreateInfoNV',desc='Structure specifying whether fragment coverage replaces a color',type='structs']
---
-The sname:VkPipelineCoverageToColorStateCreateInfoNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPipelineCoverageToColorStateCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:coverageToColorEnable controls whether the fragment coverage value
-    replaces a fragment color output.
-  * pname:coverageToColorLocation controls which fragment shader color
-    output value is replaced.
-
-If the pname:pNext chain of slink:VkPipelineMultisampleStateCreateInfo
-includes a sname:VkPipelineCoverageToColorStateCreateInfoNV structure, then
-that structure controls whether the fragment coverage is substituted for a
-fragment color output and, if so, which output is replaced.
-
-If pname:coverageToColorEnable is ename:VK_TRUE, the
-<<primsrast-multisampling-coverage-mask, coverage mask>> replaces the first
-component of the color value corresponding to the fragment shader output
-location with code:Location equal to pname:coverageToColorLocation and
-code:Index equal to zero.
-If the color attachment format has fewer bits than the coverage mask, the
-low bits of the sample coverage mask are taken without any clamping.
-If the color attachment format has more bits than the coverage mask, the
-high bits of the sample coverage mask are filled with zeros.
-
-If pname:coverageToColorEnable is ename:VK_FALSE, these operations are
-skipped.
-If this structure is not included in the pname:pNext chain, it is as if
-pname:coverageToColorEnable is ename:VK_FALSE.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineCoverageToColorStateCreateInfoNV-coverageToColorEnable-01404]]
-    If pname:coverageToColorEnable is ename:VK_TRUE, then the render pass
-    subpass indicated by
-    slink:VkGraphicsPipelineCreateInfo::pname:renderPass and
-    slink:VkGraphicsPipelineCreateInfo::pname:subpass must: have a color
-    attachment at the location selected by pname:coverageToColorLocation,
-    with a elink:VkFormat of ename:VK_FORMAT_R8_UINT,
-    ename:VK_FORMAT_R8_SINT, ename:VK_FORMAT_R16_UINT,
-    ename:VK_FORMAT_R16_SINT, ename:VK_FORMAT_R32_UINT, or
-    ename:VK_FORMAT_R32_SINT
-****
-
-include::{generated}/validity/structs/VkPipelineCoverageToColorStateCreateInfoNV.txt[]
---
-
-[open,refpage='VkPipelineCoverageToColorStateCreateFlagsNV',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineCoverageToColorStateCreateFlagsNV.txt[]
-
-tname:VkPipelineCoverageToColorStateCreateFlagsNV is a bitmask type for
-setting a mask, but is currently reserved for future use.
---
-endif::VK_NV_fragment_coverage_to_color[]
-
-
-[[fragops-coverage-reduction]]
-== Coverage Reduction
-
-Coverage reduction takes the coverage information for a fragment and
-converts that to a boolean coverage value for each color sample in each
-pixel covered by the fragment.
-
-
-=== Pixel Coverage
-
-Coverage for each pixel is first extracted from the total fragment coverage
-mask.
-This consists of pname:rasterizationSamples unique coverage samples for each
-pixel in the fragment area, each with a unique
-<<primsrast-multisampling-coverage-mask, sample index>>.
-If the fragment only contains a single pixel, coverage for the pixel is
-equivalent to the fragment coverage.
-
-ifdef::VK_EXT_fragment_density_map[]
-If the render pass has a fragment density map attachment and the fragment
-covers multiple pixels, pixel coverage is generated in an
-implementation-dependent manner.
-If all samples in the fragment are covered, all samples will be covered in
-each pixel coverage.
-endif::VK_EXT_fragment_density_map[]
-
-ifdef::VK_NV_shading_rate_image[]
-If a <<primsrast-shading-rate-image,shading rate image>> is used, and the
-fragment covers multiple pixels, each pixel's coverage consists of the
-coverage samples corresponding to that pixel, and each sample retains its
-unique <<primsrast-multisampling-coverage-mask, sample index [eq]#i#>>.
-endif::VK_NV_shading_rate_image[]
-
-ifdef::VK_KHR_fragment_shading_rate[]
-If the <<primsrast-fragment-shading-rate, fragment shading rate>> is set,
-and the fragment covers multiple pixels, each pixel's coverage consists of
-the coverage samples with a <<primsrast-multisampling-coverage-mask-vrfs,
-pixel index>> matching that pixel, and each sample retains its unique
-<<primsrast-multisampling-coverage-mask, sample index [eq]#i#>>.
-endif::VK_KHR_fragment_shading_rate[]
-
-=== Color Sample Coverage
-
-Once pixel coverage is determined, coverage for each individual color sample
-corresponding to that pixel is determined.
-
-ifdef::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples,VK_NV_coverage_reduction_mode[If the]
-ifndef::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples,VK_NV_coverage_reduction_mode[The]
-number of pname:rasterizationSamples is identical to the number of samples
-in the color attachments.
-A color sample is covered if the pixel coverage sample with the same
-<<primsrast-multisampling-coverage-mask, sample index>> [eq]#i# is covered.
-
-ifdef::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples,VK_NV_coverage_reduction_mode[]
-Otherwise, the coverage for each color sample is computed from the pixel
-coverage as follows.
-endif::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples,VK_NV_coverage_reduction_mode[]
-
-ifdef::VK_AMD_mixed_attachment_samples[]
-If the `apiext:VK_AMD_mixed_attachment_samples` extension is enabled, for
-color samples present in the color attachments, a color sample is covered if
-the pixel coverage sample with the same
-<<primsrast-multisampling-coverage-mask, sample index>> [eq]#i# is covered;
-additional pixel coverage samples are discarded.
-endif::VK_AMD_mixed_attachment_samples[]
-
-ifdef::VK_NV_framebuffer_mixed_samples[]
-
-ifndef::VK_NV_coverage_reduction_mode[]
-When the `apiext:VK_NV_framebuffer_mixed_samples` extension is enabled, if
-the pipeline's
-slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples is
-greater than the slink:VkAttachmentDescription::pname:samples of the color
-attachments in the subpass, each color sample will be associated with an
-implementation-dependent subset of samples in the pixel coverage.
-If any of those associated samples are covered, the color sample is covered.
-endif::VK_NV_coverage_reduction_mode[]
-
-ifdef::VK_NV_coverage_reduction_mode[]
-When the `apiext:VK_NV_coverage_reduction_mode` extension is enabled, the
-pipeline state controlling coverage reduction is specified through the
-members of the sname:VkPipelineCoverageReductionStateCreateInfoNV structure.
-
-[open,refpage='VkPipelineCoverageReductionStateCreateInfoNV',desc='Structure specifying parameters controlling coverage reduction',type='structs']
---
-The sname:VkPipelineCoverageReductionStateCreateInfoNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPipelineCoverageReductionStateCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:coverageReductionMode is a elink:VkCoverageReductionModeNV value
-    controlling how color sample coverage is generated from pixel coverage.
-
-If this structure is not included in the pname:pNext chain, or if the
-extension is not enabled, the default coverage reduction mode is inferred as
-follows:
-
-  * If the `apiext:VK_NV_framebuffer_mixed_samples` extension is enabled,
-    then it is as if the pname:coverageReductionMode is
-    ename:VK_COVERAGE_REDUCTION_MODE_MERGE_NV.
-  * If the `apiext:VK_AMD_mixed_attachment_samples` extension is enabled,
-    then it is as if the pname:coverageReductionMode is
-    ename:VK_COVERAGE_REDUCTION_MODE_TRUNCATE_NV.
-  * If both `apiext:VK_NV_framebuffer_mixed_samples` and
-    `apiext:VK_AMD_mixed_attachment_samples` are enabled, then the default
-    coverage reduction mode is implementation-dependent.
-
-include::{generated}/validity/structs/VkPipelineCoverageReductionStateCreateInfoNV.txt[]
---
-
-[open,refpage='VkPipelineCoverageReductionStateCreateFlagsNV',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineCoverageReductionStateCreateFlagsNV.txt[]
-
-tname:VkPipelineCoverageReductionStateCreateFlagsNV is a bitmask type for
-setting a mask, but is currently reserved for future use.
---
-
-[open,refpage='VkCoverageReductionModeNV',desc='Specify the coverage reduction mode',type='enums']
---
-Possible values of
-slink:VkPipelineCoverageReductionStateCreateInfoNV::pname:coverageReductionMode,
-specifying how color sample coverage is generated from pixel coverage, are:
-
-include::{generated}/api/enums/VkCoverageReductionModeNV.txt[]
-
-  * ename:VK_COVERAGE_REDUCTION_MODE_MERGE_NV specifies that each color
-    sample will be associated with an implementation-dependent subset of
-    samples in the pixel coverage.
-    If any of those associated samples are covered, the color sample is
-    covered.
-  * ename:VK_COVERAGE_REDUCTION_MODE_TRUNCATE_NV specifies that for color
-    samples present in the color attachments, a color sample is covered if
-    the pixel coverage sample with the same
-    <<primsrast-multisampling-coverage-mask, sample index>> [eq]#i# is
-    covered; other pixel coverage samples are discarded.
---
-
-[open,refpage='vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV',desc='Query supported sample count combinations',type='protos']
---
-To query the set of mixed sample combinations of coverage reduction mode,
-rasterization samples and color, depth, stencil attachment sample counts
-that are supported by a physical device, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV.txt[]
-
-  * pname:physicalDevice is the physical device from which to query the set
-    of combinations.
-  * pname:pCombinationCount is a pointer to an integer related to the number
-    of combinations available or queried, as described below.
-  * pname:pCombinations is either `NULL` or a pointer to an array of
-    slink:VkFramebufferMixedSamplesCombinationNV values, indicating the
-    supported combinations of coverage reduction mode, rasterization
-    samples, and color, depth, stencil attachment sample counts.
-
-If pname:pCombinations is `NULL`, then the number of supported combinations
-for the given pname:physicalDevice is returned in pname:pCombinationCount.
-Otherwise, pname:pCombinationCount must: point to a variable set by the user
-to the number of elements in the pname:pCombinations array, and on return
-the variable is overwritten with the number of values actually written to
-pname:pCombinations.
-If the value of pname:pCombinationCount is less than the number of
-combinations supported for the given pname:physicalDevice, at most
-pname:pCombinationCount values will be written to pname:pCombinations, and
-ename:VK_INCOMPLETE will be returned instead of ename:VK_SUCCESS, to
-indicate that not all the supported values were returned.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV.txt[]
---
-
-[open,refpage='VkFramebufferMixedSamplesCombinationNV',desc='Structure specifying a supported sample count combination',type='structs']
---
-The sname:VkFramebufferMixedSamplesCombinationNV structure is defined as:
-
-include::{generated}/api/structs/VkFramebufferMixedSamplesCombinationNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:coverageReductionMode is a elink:VkCoverageReductionModeNV value
-    specifying the coverage reduction mode.
-  * pname:rasterizationSamples is a elink:VkSampleCountFlagBits specifying
-    the number of rasterization samples in the supported combination.
-  * pname:depthStencilSamples specifies the number of samples in the depth
-    stencil attachment in the supported combination.
-    A value of 0 indicates the combination does not have a depth stencil
-    attachment.
-  * pname:colorSamples specifies the number of color samples in a color
-    attachment in the supported combination.
-    A value of 0 indicates the combination does not have a color attachment.
-
-include::{generated}/validity/structs/VkFramebufferMixedSamplesCombinationNV.txt[]
---
-endif::VK_NV_coverage_reduction_mode[]
-
-
-[[fragops-coverage-modulation]]
-=== Coverage Modulation
-
-[open,refpage='VkPipelineCoverageModulationStateCreateInfoNV',desc='Structure specifying parameters controlling coverage modulation',type='structs']
---
-As part of coverage reduction, fragment color values can: also be modulated
-(multiplied) by a value that is a function of fraction of covered
-rasterization samples associated with that color sample.
-
-Pipeline state controlling coverage modulation is specified through the
-members of the sname:VkPipelineCoverageModulationStateCreateInfoNV
-structure.
-
-The sname:VkPipelineCoverageModulationStateCreateInfoNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPipelineCoverageModulationStateCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:coverageModulationMode is a elink:VkCoverageModulationModeNV value
-    controlling which color components are modulated.
-  * pname:coverageModulationTableEnable controls whether the modulation
-    factor is looked up from a table in pname:pCoverageModulationTable.
-  * pname:coverageModulationTableCount is the number of elements in
-    pname:pCoverageModulationTable.
-  * pname:pCoverageModulationTable is a table of modulation factors
-    containing a value for each number of covered samples.
-
-If pname:coverageModulationTableEnable is ename:VK_FALSE, then for each
-color sample the associated bits of the pixel coverage are counted and
-divided by the number of associated bits to produce a modulation factor
-[eq]#R# in the range [eq]#(0,1]# (a value of zero would have been killed due
-to a color coverage of 0).
-Specifically:
-
-  * [eq]#N# = value of pname:rasterizationSamples
-  * [eq]#M# = value of slink:VkAttachmentDescription::pname:samples for any
-    color attachments
-  * [eq]#R = popcount(associated coverage bits) / (N / M)#
-
-If pname:coverageModulationTableEnable is ename:VK_TRUE, the value [eq]#R#
-is computed using a programmable lookup table.
-The lookup table has [eq]#N / M# elements, and the element of the table is
-selected by:
-
-  * [eq]#R = pname:pCoverageModulationTable[popcount(associated coverage
-    bits)-1]#
-
-Note that the table does not have an entry for [eq]#popcount(associated
-coverage bits) = 0#, because such samples would have been killed.
-
-The values of pname:pCoverageModulationTable may: be rounded to an
-implementation-dependent precision, which is at least as fine as [eq]#1 /
-N#, and clamped to [eq]#[0,1]#.
-
-For each color attachment with a floating point or normalized color format,
-each fragment output color value is replicated to [eq]#M# values which can:
-each be modulated (multiplied) by that color sample's associated value of
-[eq]#R#.
-Which components are modulated is controlled by
-pname:coverageModulationMode.
-
-If this structure is not included in the pname:pNext chain, it is as if
-pname:coverageModulationMode is ename:VK_COVERAGE_MODULATION_MODE_NONE_NV.
-
-ifdef::VK_NV_coverage_reduction_mode[]
-If the <<fragops-coverage-reduction, coverage reduction mode>> is
-ename:VK_COVERAGE_REDUCTION_MODE_TRUNCATE_NV, each color sample is
-associated with only a single coverage sample.
-In this case, it is as if pname:coverageModulationMode is
-ename:VK_COVERAGE_MODULATION_MODE_NONE_NV.
-endif::VK_NV_coverage_reduction_mode[]
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableEnable-01405]]
-    If pname:coverageModulationTableEnable is ename:VK_TRUE,
-    pname:coverageModulationTableCount must: be equal to the number of
-    rasterization samples divided by the number of color samples in the
-    subpass
-****
-
-include::{generated}/validity/structs/VkPipelineCoverageModulationStateCreateInfoNV.txt[]
---
-
-[open,refpage='VkPipelineCoverageModulationStateCreateFlagsNV',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineCoverageModulationStateCreateFlagsNV.txt[]
-
-tname:VkPipelineCoverageModulationStateCreateFlagsNV is a bitmask type for
-setting a mask, but is currently reserved for future use.
---
-
-[open,refpage='VkCoverageModulationModeNV',desc='Specify the coverage modulation mode',type='enums']
---
-Possible values of
-slink:VkPipelineCoverageModulationStateCreateInfoNV::pname:coverageModulationMode,
-specifying which color components are modulated, are:
-
-include::{generated}/api/enums/VkCoverageModulationModeNV.txt[]
-
-  * ename:VK_COVERAGE_MODULATION_MODE_NONE_NV specifies that no components
-    are multiplied by the modulation factor.
-  * ename:VK_COVERAGE_MODULATION_MODE_RGB_NV specifies that the red, green,
-    and blue components are multiplied by the modulation factor.
-  * ename:VK_COVERAGE_MODULATION_MODE_ALPHA_NV specifies that the alpha
-    component is multiplied by the modulation factor.
-  * ename:VK_COVERAGE_MODULATION_MODE_RGBA_NV specifies that all components
-    are multiplied by the modulation factor.
---
-
-endif::VK_NV_framebuffer_mixed_samples[]
diff --git a/registry/vulkan/chapters/framebuffer.txt b/registry/vulkan/chapters/framebuffer.txt
deleted file mode 100644
index c0f0820..0000000
--- a/registry/vulkan/chapters/framebuffer.txt
+++ /dev/null
@@ -1,705 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[framebuffer]]
-= The Framebuffer
-
-
-[[framebuffer-blending]]
-== Blending
-
-Blending combines the incoming _source_ fragment's R, G, B, and A values
-with the _destination_ R, G, B, and A values of each sample stored in the
-framebuffer at the fragment's [eq]#(x~f~,y~f~)# location.
-Blending is performed for each color sample covered by the fragment, rather
-than just once for each fragment.
-
-Source and destination values are combined according to the
-<<framebuffer-blendoperations,blend operation>>, quadruplets of source and
-destination weighting factors determined by the <<framebuffer-blendfactors,
-blend factors>>, and a <<framebuffer-blendconstants,blend constant>>, to
-obtain a new set of R, G, B, and A values, as described below.
-
-Blending is computed and applied separately to each color attachment used by
-the subpass, with separate controls for each attachment.
-
-Prior to performing the blend operation, signed and unsigned normalized
-fixed-point color components undergo an implied conversion to floating-point
-as specified by <<fundamentals-fixedfpconv,Conversion from Normalized
-Fixed-Point to Floating-Point>>.
-Blending computations are treated as if carried out in floating-point, and
-basic blend operations are performed with a precision and dynamic range no
-lower than that used to represent destination components.
-ifdef::VK_EXT_blend_operation_advanced[]
-<<framebuffer-blend-advanced,Advanced blending operations>> are performed
-with a precision and dynamic range no lower than the smaller of that used to
-represent destination components or that used to represent 16-bit
-floating-point values.
-endif::VK_EXT_blend_operation_advanced[]
-
-[NOTE]
-.Note
-====
-Blending is only defined for floating-point, UNORM, SNORM, and sRGB formats.
-Within those formats, the implementation may only support blending on some
-subset of them.
-Which formats support blending is indicated by
-ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT.
-====
-
-The pipeline blend state is included in the
-sname:VkPipelineColorBlendStateCreateInfo structure during graphics pipeline
-creation:
-
-[open,refpage='VkPipelineColorBlendStateCreateInfo',desc='Structure specifying parameters of a newly created pipeline color blend state',type='structs']
---
-The sname:VkPipelineColorBlendStateCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkPipelineColorBlendStateCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:logicOpEnable controls whether to apply <<framebuffer-logicop,
-    Logical Operations>>.
-  * pname:logicOp selects which logical operation to apply.
-  * pname:attachmentCount is the number of
-    sname:VkPipelineColorBlendAttachmentState elements in
-    pname:pAttachments.
-  * pname:pAttachments is a pointer to an array of per target attachment
-    states.
-  * pname:blendConstants is a pointer to an array of four values used as the
-    R, G, B, and A components of the blend constant that are used in
-    blending, depending on the <<framebuffer-blendfactors,blend factor>>.
-
-Each element of the pname:pAttachments array is a
-slink:VkPipelineColorBlendAttachmentState structure specifying per-target
-blending state for each individual color attachment.
-If the <<features-independentBlend,independent blending>> feature is not
-enabled on the device, all slink:VkPipelineColorBlendAttachmentState
-elements in the pname:pAttachments array must: be identical.
-
-The value of pname:attachmentCount must: be greater than the index of all
-color attachments that are not ename:VK_ATTACHMENT_UNUSED in
-sname:VkSubpassDescription::pname:pColorAttachments
-ifdef::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-or sname:VkSubpassDescription2::pname:pColorAttachments
-endif::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-for the subpass in which this pipeline is used.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605]]
-    If the <<features-independentBlend,independent blending>> feature is not
-    enabled, all elements of pname:pAttachments must: be identical
-  * [[VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00606]]
-    If the <<features-logicOp,logic operations>> feature is not enabled,
-    pname:logicOpEnable must: be ename:VK_FALSE
-  * [[VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00607]]
-    If pname:logicOpEnable is ename:VK_TRUE, pname:logicOp must: be a valid
-    elink:VkLogicOp value
-****
-
-include::{generated}/validity/structs/VkPipelineColorBlendStateCreateInfo.txt[]
---
-
-[open,refpage='VkPipelineColorBlendStateCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineColorBlendStateCreateFlags.txt[]
-
-tname:VkPipelineColorBlendStateCreateFlags is a bitmask type for setting a
-mask, but is currently reserved for future use.
---
-
-[open,refpage='VkPipelineColorBlendAttachmentState',desc='Structure specifying a pipeline color blend attachment state',type='structs']
---
-The sname:VkPipelineColorBlendAttachmentState structure is defined as:
-
-include::{generated}/api/structs/VkPipelineColorBlendAttachmentState.txt[]
-
-  * pname:blendEnable controls whether blending is enabled for the
-    corresponding color attachment.
-    If blending is not enabled, the source fragment's color for that
-    attachment is passed through unmodified.
-  * pname:srcColorBlendFactor selects which blend factor is used to
-    determine the source factors [eq]#(S~r~,S~g~,S~b~)#.
-  * pname:dstColorBlendFactor selects which blend factor is used to
-    determine the destination factors [eq]#(D~r~,D~g~,D~b~)#.
-  * pname:colorBlendOp selects which blend operation is used to calculate
-    the RGB values to write to the color attachment.
-  * pname:srcAlphaBlendFactor selects which blend factor is used to
-    determine the source factor [eq]#S~a~#.
-  * pname:dstAlphaBlendFactor selects which blend factor is used to
-    determine the destination factor [eq]#D~a~#.
-  * pname:alphaBlendOp selects which blend operation is use to calculate the
-    alpha values to write to the color attachment.
-  * pname:colorWriteMask is a bitmask of elink:VkColorComponentFlagBits
-    specifying which of the R, G, B, and/or A components are enabled for
-    writing, as described for the <<framebuffer-color-write-mask,Color Write
-    Mask>>.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineColorBlendAttachmentState-srcColorBlendFactor-00608]]
-    If the <<features-dualSrcBlend,dual source blending>> feature is not
-    enabled, pname:srcColorBlendFactor must: not be
-    ename:VK_BLEND_FACTOR_SRC1_COLOR,
-    ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR,
-    ename:VK_BLEND_FACTOR_SRC1_ALPHA, or
-    ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA
-  * [[VUID-VkPipelineColorBlendAttachmentState-dstColorBlendFactor-00609]]
-    If the <<features-dualSrcBlend,dual source blending>> feature is not
-    enabled, pname:dstColorBlendFactor must: not be
-    ename:VK_BLEND_FACTOR_SRC1_COLOR,
-    ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR,
-    ename:VK_BLEND_FACTOR_SRC1_ALPHA, or
-    ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA
-  * [[VUID-VkPipelineColorBlendAttachmentState-srcAlphaBlendFactor-00610]]
-    If the <<features-dualSrcBlend,dual source blending>> feature is not
-    enabled, pname:srcAlphaBlendFactor must: not be
-    ename:VK_BLEND_FACTOR_SRC1_COLOR,
-    ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR,
-    ename:VK_BLEND_FACTOR_SRC1_ALPHA, or
-    ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA
-  * [[VUID-VkPipelineColorBlendAttachmentState-dstAlphaBlendFactor-00611]]
-    If the <<features-dualSrcBlend,dual source blending>> feature is not
-    enabled, pname:dstAlphaBlendFactor must: not be
-    ename:VK_BLEND_FACTOR_SRC1_COLOR,
-    ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR,
-    ename:VK_BLEND_FACTOR_SRC1_ALPHA, or
-    ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA
-ifdef::VK_EXT_blend_operation_advanced[]
-  * [[VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-01406]]
-    If either of pname:colorBlendOp or pname:alphaBlendOp is an
-    <<framebuffer-blend-advanced,advanced blend operation>>, then
-    pname:colorBlendOp must: equal pname:alphaBlendOp
-  * [[VUID-VkPipelineColorBlendAttachmentState-advancedBlendIndependentBlend-01407]]
-    If
-    slink:VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::pname:advancedBlendIndependentBlend
-    is ename:VK_FALSE and pname:colorBlendOp is an
-    <<framebuffer-blend-advanced,advanced blend operation>>, then
-    pname:colorBlendOp must: be the same for all attachments
-  * [[VUID-VkPipelineColorBlendAttachmentState-advancedBlendIndependentBlend-01408]]
-    If
-    slink:VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::pname:advancedBlendIndependentBlend
-    is ename:VK_FALSE and pname:alphaBlendOp is an
-    <<framebuffer-blend-advanced,advanced blend operation>>, then
-    pname:alphaBlendOp must: be the same for all attachments
-  * [[VUID-VkPipelineColorBlendAttachmentState-advancedBlendAllOperations-01409]]
-    If
-    slink:VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::pname:advancedBlendAllOperations
-    is ename:VK_FALSE, then pname:colorBlendOp must: not be
-    ename:VK_BLEND_OP_ZERO_EXT, ename:VK_BLEND_OP_SRC_EXT,
-    ename:VK_BLEND_OP_DST_EXT, ename:VK_BLEND_OP_SRC_OVER_EXT,
-    ename:VK_BLEND_OP_DST_OVER_EXT, ename:VK_BLEND_OP_SRC_IN_EXT,
-    ename:VK_BLEND_OP_DST_IN_EXT, ename:VK_BLEND_OP_SRC_OUT_EXT,
-    ename:VK_BLEND_OP_DST_OUT_EXT, ename:VK_BLEND_OP_SRC_ATOP_EXT,
-    ename:VK_BLEND_OP_DST_ATOP_EXT, ename:VK_BLEND_OP_XOR_EXT,
-    ename:VK_BLEND_OP_INVERT_EXT, ename:VK_BLEND_OP_INVERT_RGB_EXT,
-    ename:VK_BLEND_OP_LINEARDODGE_EXT, ename:VK_BLEND_OP_LINEARBURN_EXT,
-    ename:VK_BLEND_OP_VIVIDLIGHT_EXT, ename:VK_BLEND_OP_LINEARLIGHT_EXT,
-    ename:VK_BLEND_OP_PINLIGHT_EXT, ename:VK_BLEND_OP_HARDMIX_EXT,
-    ename:VK_BLEND_OP_PLUS_EXT, ename:VK_BLEND_OP_PLUS_CLAMPED_EXT,
-    ename:VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT,
-    ename:VK_BLEND_OP_PLUS_DARKER_EXT, ename:VK_BLEND_OP_MINUS_EXT,
-    ename:VK_BLEND_OP_MINUS_CLAMPED_EXT, ename:VK_BLEND_OP_CONTRAST_EXT,
-    ename:VK_BLEND_OP_INVERT_OVG_EXT, ename:VK_BLEND_OP_RED_EXT,
-    ename:VK_BLEND_OP_GREEN_EXT, or ename:VK_BLEND_OP_BLUE_EXT
-  * [[VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-01410]]
-    If pname:colorBlendOp or pname:alphaBlendOp is an
-    <<framebuffer-blend-advanced,advanced blend operation>>, then
-    pname:colorAttachmentCount of the subpass this pipeline is compiled
-    against must: be less than or equal to
-    slink:VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::pname:advancedBlendMaxColorAttachments
-endif::VK_EXT_blend_operation_advanced[]
-ifdef::VK_KHR_portability_subset[]
-  * [[VUID-VkPipelineColorBlendAttachmentState-constantAlphaColorBlendFactors-04454]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:constantAlphaColorBlendFactors
-    is ename:VK_FALSE, pname:srcColorBlendFactor must: not be
-    ename:VK_BLEND_FACTOR_CONSTANT_ALPHA or
-    ename:VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA
-  * [[VUID-VkPipelineColorBlendAttachmentState-constantAlphaColorBlendFactors-04455]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:constantAlphaColorBlendFactors
-    is ename:VK_FALSE, pname:dstColorBlendFactor must: not be
-    ename:VK_BLEND_FACTOR_CONSTANT_ALPHA or
-    ename:VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA
-endif::VK_KHR_portability_subset[]
-****
-
-include::{generated}/validity/structs/VkPipelineColorBlendAttachmentState.txt[]
---
-
-
-[[framebuffer-blendfactors]]
-=== Blend Factors
-
-[open,refpage='VkBlendFactor',desc='Framebuffer blending factors',type='enums']
---
-The source and destination color and alpha blending factors are selected
-from the enum:
-
-include::{generated}/api/enums/VkBlendFactor.txt[]
-
-The semantics of the enum values are described in the table below:
-
-.Blend Factors
-[width="100%",options="header",align="center",cols="59%,28%,13%"]
-|====
-|elink:VkBlendFactor                            | RGB Blend Factors [eq]#(S~r~,S~g~,S~b~)# or [eq]#(D~r~,D~g~,D~b~)# | Alpha Blend Factor ([eq]#S~a~# or [eq]#D~a~#)
-|ename:VK_BLEND_FACTOR_ZERO                     | [eq]#(0,0,0)#                              | [eq]#0#
-|ename:VK_BLEND_FACTOR_ONE                      | [eq]#(1,1,1)#                              | [eq]#1#
-|ename:VK_BLEND_FACTOR_SRC_COLOR                | [eq]#(R~s0~,G~s0~,B~s0~)#                  | [eq]#A~s0~#
-|ename:VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR      | [eq]#(1-R~s0~,1-G~s0~,1-B~s0~)#            | [eq]#1-A~s0~#
-|ename:VK_BLEND_FACTOR_DST_COLOR                | [eq]#(R~d~,G~d~,B~d~)#                     | [eq]#A~d~#
-|ename:VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR      | [eq]#(1-R~d~,1-G~d~,1-B~d~)#               | [eq]#1-A~d~#
-|ename:VK_BLEND_FACTOR_SRC_ALPHA                | [eq]#(A~s0~,A~s0~,A~s0~)#                  | [eq]#A~s0~#
-|ename:VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA      | [eq]#(1-A~s0~,1-A~s0~,1-A~s0~)#            | [eq]#1-A~s0~#
-|ename:VK_BLEND_FACTOR_DST_ALPHA                | [eq]#(A~d~,A~d~,A~d~)#                     | [eq]#A~d~#
-|ename:VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA      | [eq]#(1-A~d~,1-A~d~,1-A~d~)#               | [eq]#1-A~d~#
-|ename:VK_BLEND_FACTOR_CONSTANT_COLOR           | [eq]#(R~c~,G~c~,B~c~)#                     | [eq]#A~c~#
-|ename:VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR | [eq]#(1-R~c~,1-G~c~,1-B~c~)#               | [eq]#1-A~c~#
-|ename:VK_BLEND_FACTOR_CONSTANT_ALPHA           | [eq]#(A~c~,A~c~,A~c~)#                     | [eq]#A~c~#
-|ename:VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA | [eq]#(1-A~c~,1-A~c~,1-A~c~)#               | [eq]#1-A~c~#
-|ename:VK_BLEND_FACTOR_SRC_ALPHA_SATURATE       | [eq]#(f,f,f)#; [eq]#f = min(A~s0~,1-A~d~)# | [eq]#1#
-|ename:VK_BLEND_FACTOR_SRC1_COLOR               | [eq]#(R~s1~,G~s1~,B~s1~)#                  | [eq]#A~s1~#
-|ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR     | [eq]#(1-R~s1~,1-G~s1~,1-B~s1~)#            | [eq]#1-A~s1~#
-|ename:VK_BLEND_FACTOR_SRC1_ALPHA               | [eq]#(A~s1~,A~s1~,A~s1~)#                  | [eq]#A~s1~#
-|ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA     | [eq]#(1-A~s1~,1-A~s1~,1-A~s1~)#            | [eq]#1-A~s1~#
-|====
-
-In this table, the following conventions are used:
-
-  * [eq]#R~s0~,G~s0~,B~s0~# and [eq]#A~s0~# represent the first source color
-    R, G, B, and A components, respectively, for the fragment output
-    location corresponding to the color attachment being blended.
-  * [eq]#R~s1~,G~s1~,B~s1~# and [eq]#A~s1~# represent the second source
-    color R, G, B, and A components, respectively, used in dual source
-    blending modes, for the fragment output location corresponding to the
-    color attachment being blended.
-  * [eq]#R~d~,G~d~,B~d~# and [eq]#A~d~# represent the R, G, B, and A
-    components of the destination color.
-    That is, the color currently in the corresponding color attachment for
-    this fragment/sample.
-  * [eq]#R~c~,G~c~,B~c~# and [eq]#A~c~# represent the blend constant R, G,
-    B, and A components, respectively.
---
-
-[open,refpage='vkCmdSetBlendConstants',desc='Set the values of blend constants',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set and change>> the blend
-constants, call:
-
-include::{generated}/api/protos/vkCmdSetBlendConstants.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:blendConstants is a pointer to an array of four values specifying
-    the [eq]#R~c~#, [eq]#G~c~#, [eq]#B~c~#, and [eq]#A~c~# components of the
-    blend constant color used in blending, depending on the
-    <<framebuffer-blendfactors,blend factor>>.
-
-[[framebuffer-blendconstants]]
-This command sets blend constants for subsequent drawing commands when the
-graphics pipeline is created with ename:VK_DYNAMIC_STATE_BLEND_CONSTANTS set
-in slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineColorBlendStateCreateInfo::pname:blendConstants values used
-to create the currently active pipeline.
-
-include::{generated}/validity/protos/vkCmdSetBlendConstants.txt[]
---
-
-
-[[framebuffer-dsb]]
-=== Dual-Source Blending
-
-Blend factors that use the secondary color input
-[eq]#(R~s1~,G~s1~,B~s1~,A~s1~)# (ename:VK_BLEND_FACTOR_SRC1_COLOR,
-ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR,
-ename:VK_BLEND_FACTOR_SRC1_ALPHA, and
-ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA) may: consume implementation
-resources that could otherwise be used for rendering to multiple color
-attachments.
-Therefore, the number of color attachments that can: be used in a
-framebuffer may: be lower when using dual-source blending.
-
-Dual-source blending is only supported if the
-<<features-dualSrcBlend,pname:dualSrcBlend>> feature is enabled.
-
-The maximum number of color attachments that can: be used in a subpass when
-using dual-source blending functions is implementation-dependent and is
-reported as the pname:maxFragmentDualSrcAttachments member of
-sname:VkPhysicalDeviceLimits.
-
-When using a fragment shader with dual-source blending functions, the color
-outputs are bound to the first and second inputs of the blender using the
-code:Index decoration, as described in <<interfaces-fragmentoutput,Fragment
-Output Interface>>.
-If the second color input to the blender is not written in the shader, or if
-no output is bound to the second input of a blender, the result of the
-blending operation is not defined.
-
-
-[[framebuffer-blendoperations]]
-=== Blend Operations
-
-[open,refpage='VkBlendOp',desc='Framebuffer blending operations',type='enums']
---
-Once the source and destination blend factors have been selected, they along
-with the source and destination components are passed to the blending
-operations.
-RGB and alpha components can: use different operations.
-Possible values of elink:VkBlendOp, specifying the operations, are:
-
-include::{generated}/api/enums/VkBlendOp.txt[]
-
-<<<
-
-The semantics of the basic blend operations are described in the table
-below:
-
-.Basic Blend Operations
-[width="100%",cols="45%,30%,25%",options="header",align="center"]
-|====
-|elink:VkBlendOp                             | RGB Components                    | Alpha Component
-
-|ename:VK_BLEND_OP_ADD
-| [eq]#R = R~s0~ {times} S~r~ {plus} R~d~ {times} D~r~# +
-  [eq]#G = G~s0~ {times} S~g~ {plus} G~d~ {times} D~g~# +
-  [eq]#B = B~s0~ {times} S~b~ {plus} B~d~ {times} D~b~#
-| [eq]#A = A~s0~ {times} S~a~ {plus} A~d~ {times} D~a~#
-
-|ename:VK_BLEND_OP_SUBTRACT
-| [eq]#R = R~s0~ {times} S~r~ - R~d~ {times} D~r~# +
-  [eq]#G = G~s0~ {times} S~g~ - G~d~ {times} D~g~# +
-  [eq]#B = B~s0~ {times} S~b~ - B~d~ {times} D~b~#
-| [eq]#A = A~s0~ {times} S~a~ - A~d~ {times} D~a~#
-
-|ename:VK_BLEND_OP_REVERSE_SUBTRACT
-| [eq]#R = R~d~ {times} D~r~ - R~s0~ {times} S~r~# +
-  [eq]#G = G~d~ {times} D~g~ - G~s0~ {times} S~g~# +
-  [eq]#B = B~d~ {times} D~b~ - B~s0~ {times} S~b~#
-| [eq]#A = A~d~ {times} D~a~ - A~s0~ {times} S~a~#
-
-|ename:VK_BLEND_OP_MIN
-| [eq]#R = min(R~s0~,R~d~)# +
-  [eq]#G = min(G~s0~,G~d~)# +
-  [eq]#B = min(B~s0~,B~d~)#
-| [eq]#A = min(A~s0~,A~d~)#
-
-|ename:VK_BLEND_OP_MAX
-| [eq]#R = max(R~s0~,R~d~)# +
-  [eq]#G = max(G~s0~,G~d~)# +
-  [eq]#B = max(B~s0~,B~d~)#
-| [eq]#A = max(A~s0~,A~d~)#
-|====
-
-In this table, the following conventions are used:
-
-  * [eq]#R~s0~, G~s0~, B~s0~# and [eq]#A~s0~# represent the first source
-    color R, G, B, and A components, respectively.
-  * [eq]#R~d~, G~d~, B~d~# and [eq]#A~d~# represent the R, G, B, and A
-    components of the destination color.
-    That is, the color currently in the corresponding color attachment for
-    this fragment/sample.
-  * [eq]#S~r~, S~g~, S~b~# and [eq]#S~a~# represent the source blend factor
-    R, G, B, and A components, respectively.
-  * [eq]#D~r~, D~g~, D~b~# and [eq]#D~a~# represent the destination blend
-    factor R, G, B, and A components, respectively.
-
-The blending operation produces a new set of values [eq]#R, G, B# and
-[eq]#A#, which are written to the framebuffer attachment.
-If blending is not enabled for this attachment, then [eq]#R, G, B# and
-[eq]#A# are assigned [eq]#R~s0~, G~s0~, B~s0~# and [eq]#A~s0~#,
-respectively.
-
-If the color attachment is fixed-point, the components of the source and
-destination values and blend factors are each clamped to [eq]#[0,1]# or
-[eq]#[-1,1]# respectively for an unsigned normalized or signed normalized
-color attachment prior to evaluating the blend operations.
-If the color attachment is floating-point, no clamping occurs.
---
-
-If the numeric format of a framebuffer attachment uses sRGB encoding, the R,
-G, and B destination color values (after conversion from fixed-point to
-floating-point) are considered to be encoded for the sRGB color space and
-hence are linearized prior to their use in blending.
-Each R, G, and B component is converted from nonlinear to linear as
-described in the "`sRGB EOTF`" section of the <<data-format,Khronos Data
-Format Specification>>.
-If the format is not sRGB, no linearization is performed.
-
-If the numeric format of a framebuffer attachment uses sRGB encoding, then
-the final R, G and B values are converted into the nonlinear sRGB
-representation before being written to the framebuffer attachment as
-described in the "`sRGB EOTF^&#160;-1^`" section of the Khronos Data Format
-Specification.
-
-If the numeric format of a framebuffer color attachment is not sRGB encoded
-then the resulting [eq]#c~s~# values for R, G and B are unmodified.
-The value of A is never sRGB encoded.
-That is, the alpha component is always stored in memory as linear.
-
-If the framebuffer color attachment is ename:VK_ATTACHMENT_UNUSED, no writes
-are performed through that attachment.
-Writes are not performed to framebuffer color attachments greater than or
-equal to the sname:VkSubpassDescription::pname:colorAttachmentCount
-ifdef::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-or sname:VkSubpassDescription2::pname:colorAttachmentCount
-endif::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-value.
-
-ifdef::VK_EXT_blend_operation_advanced[]
-include::VK_EXT_blend_operation_advanced/advanced_blend.txt[]
-endif::VK_EXT_blend_operation_advanced[]
-
-
-[[framebuffer-logicop]]
-== Logical Operations
-
-The application can: enable a _logical operation_ between the fragment's
-color values and the existing value in the framebuffer attachment.
-This logical operation is applied prior to updating the framebuffer
-attachment.
-Logical operations are applied only for signed and unsigned integer and
-normalized integer framebuffers.
-Logical operations are not applied to floating-point or sRGB format color
-attachments.
-
-[open,refpage='VkLogicOp',desc='Framebuffer logical operations',type='enums']
---
-Logical operations are controlled by the pname:logicOpEnable and
-pname:logicOp members of slink:VkPipelineColorBlendStateCreateInfo.
-ifdef::VK_EXT_extended_dynamic_state2[]
-It can also be controlled by flink:vkCmdSetLogicOpEXT if graphics pipeline
-is created with ename:VK_DYNAMIC_STATE_LOGIC_OP_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-endif::VK_EXT_extended_dynamic_state2[]
-If pname:logicOpEnable is ename:VK_TRUE, then a logical operation selected
-by pname:logicOp is applied between each color attachment and the fragment's
-corresponding output value, and blending of all attachments is treated as if
-it were disabled.
-Any attachments using color formats for which logical operations are not
-supported simply pass through the color values unmodified.
-The logical operation is applied independently for each of the red, green,
-blue, and alpha components.
-The pname:logicOp is selected from the following operations:
-
-include::{generated}/api/enums/VkLogicOp.txt[]
-
-<<<
-
-The logical operations supported by Vulkan are summarized in the following
-table in which
-
-  * [eq]#{lnot}# is bitwise invert,
-  * [eq]#{land}# is bitwise and,
-  * [eq]#{lor}# is bitwise or,
-  * [eq]#{oplus}# is bitwise exclusive or,
-  * [eq]#s# is the fragment's [eq]#R~s0~, G~s0~, B~s0~# or [eq]#A~s0~#
-    component value for the fragment output corresponding to the color
-    attachment being updated, and
-  * [eq]#d# is the color attachment's [eq]#R, G, B# or [eq]#A# component
-    value:
-
-.Logical Operations
-[width="75%",options="header",align="center"]
-|====
-|Mode                            | Operation
-|ename:VK_LOGIC_OP_CLEAR         | [eq]#0#
-|ename:VK_LOGIC_OP_AND           | [eq]#s {land} d#
-|ename:VK_LOGIC_OP_AND_REVERSE   | [eq]#s {land} {lnot} d#
-|ename:VK_LOGIC_OP_COPY          | [eq]#s#
-|ename:VK_LOGIC_OP_AND_INVERTED  | [eq]#{lnot} s {land} d#
-|ename:VK_LOGIC_OP_NO_OP         | [eq]#d#
-|ename:VK_LOGIC_OP_XOR           | [eq]#s {oplus} d#
-|ename:VK_LOGIC_OP_OR            | [eq]#s {lor} d#
-|ename:VK_LOGIC_OP_NOR           | [eq]#{lnot} (s {lor} d)#
-|ename:VK_LOGIC_OP_EQUIVALENT    | [eq]#{lnot} (s {oplus} d)#
-|ename:VK_LOGIC_OP_INVERT        | [eq]#{lnot} d#
-|ename:VK_LOGIC_OP_OR_REVERSE    | [eq]#s {lor} {lnot} d#
-|ename:VK_LOGIC_OP_COPY_INVERTED | [eq]#{lnot} s#
-|ename:VK_LOGIC_OP_OR_INVERTED   | [eq]#{lnot} s {lor} d#
-|ename:VK_LOGIC_OP_NAND          | [eq]#{lnot} (s {land} d)#
-|ename:VK_LOGIC_OP_SET           | all 1s
-|====
-
-The result of the logical operation is then written to the color attachment
-as controlled by the component write mask, described in
-<<framebuffer-blendoperations,Blend Operations>>.
---
-
-ifdef::VK_EXT_extended_dynamic_state2[]
-[open,refpage='vkCmdSetLogicOpEXT',desc='Select which logical operation to apply for blend state dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the logical operation to
-apply for blend state, call:
-
-include::{generated}/api/protos/vkCmdSetLogicOpEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:logicOp specifies the logical operation to apply for blend state.
-
-This command sets the logical operation for blend state for subsequent
-drawing commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_LOGIC_OP_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineColorBlendStateCreateInfo::pname:logicOp value used to
-create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetLogicOpEXT-None-04867]]
-    The <<features-extendedDynamicState2LogicOp,
-    extendedDynamicState2LogicOp>> feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdSetLogicOpEXT.txt[]
---
-endif::VK_EXT_extended_dynamic_state2[]
-
-
-[[framebuffer-color-write-mask]]
-== Color Write Mask
-
-[open,refpage='VkColorComponentFlagBits',desc='Bitmask controlling which components are written to the framebuffer',type='enums']
---
-Bits which can: be set in
-slink:VkPipelineColorBlendAttachmentState::pname:colorWriteMask to determine
-whether the final color values [eq]#R, G, B# and [eq]#A# are written to the
-framebuffer attachment are:
-
-include::{generated}/api/enums/VkColorComponentFlagBits.txt[]
-
-  * ename:VK_COLOR_COMPONENT_R_BIT specifies that the [eq]#R# value is
-    written to the color attachment for the appropriate sample.
-    Otherwise, the value in memory is unmodified.
-  * ename:VK_COLOR_COMPONENT_G_BIT specifies that the [eq]#G# value is
-    written to the color attachment for the appropriate sample.
-    Otherwise, the value in memory is unmodified.
-  * ename:VK_COLOR_COMPONENT_B_BIT specifies that the [eq]#B# value is
-    written to the color attachment for the appropriate sample.
-    Otherwise, the value in memory is unmodified.
-  * ename:VK_COLOR_COMPONENT_A_BIT specifies that the [eq]#A# value is
-    written to the color attachment for the appropriate sample.
-    Otherwise, the value in memory is unmodified.
-
-The color write mask operation is applied regardless of whether blending is
-enabled.
-
-ifdef::VK_EXT_color_write_enable[]
-The color write mask operation is applied only if
-<<framebuffer-color-write-enable,Color Write Enable>> is enabled for the
-respective attachment.
-Otherwise the color write mask is ignored and writes to all components of
-the attachment are disabled.
-endif::VK_EXT_color_write_enable[]
---
-
-[open,refpage='VkColorComponentFlags',desc='Bitmask of VkColorComponentFlagBits',type='flags']
---
-include::{generated}/api/flags/VkColorComponentFlags.txt[]
-
-tname:VkColorComponentFlags is a bitmask type for setting a mask of zero or
-more elink:VkColorComponentFlagBits.
---
-
-
-ifdef::VK_EXT_color_write_enable[]
-[[framebuffer-color-write-enable]]
-== Color Write Enable
-
-[open,refpage='VkPipelineColorWriteCreateInfoEXT',desc='Structure specifying color write state of a newly created pipeline',type='structs']
---
-The sname:VkPipelineColorWriteCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkPipelineColorWriteCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:attachmentCount is the number of basetype:VkBool32 elements in
-    pname:pColorWriteEnables.
-  * pname:pColorWriteEnables is a pointer to an array of per target
-    attachment boolean values specifying whether color writes are enabled
-    for the given attachment.
-
-When this structure is included in the pname:pNext chain of
-slink:VkPipelineColorBlendStateCreateInfo, it defines per-attachment color
-write state.
-If this structure is not included in the pname:pNext chain, it is equivalent
-to specifying this structure with pname:attachmentCount equal to the
-pname:attachmentCount member of slink:VkPipelineColorBlendStateCreateInfo,
-and pname:pColorWriteEnables pointing to an array of as many ename:VK_TRUE
-values.
-
-If the <<features-colorWriteEnable,colorWriteEnable>> feature is not enabled
-on the device, all basetype:VkBool32 elements in the
-pname:pColorWriteEnables array must: be ename:VK_TRUE.
-
-Color Write Enable interacts with the <<framebuffer-color-write-mask,Color
-Write Mask>> as follows:
-
-  * If pname:colorWriteEnable is ename:VK_TRUE, writes to the attachment are
-    determined by the pname:colorWriteMask.
-  * If pname:colorWriteEnable is ename:VK_FALSE, the pname:colorWriteMask is
-    ignored and writes to all components of the attachment are disabled.
-    This is equivalent to specifying a pname:colorWriteMask of 0.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineColorWriteCreateInfoEXT-pAttachments-04801]]
-    If the <<features-colorWriteEnable,colorWriteEnable>> feature is not
-    enabled, all elements of pname:pColorWriteEnables must: be ename:VK_TRUE
-  * [[VUID-VkPipelineColorWriteCreateInfoEXT-attachmentCount-04802]]
-    pname:attachmentCount must: be equal to the pname:attachmentCount member
-    of the sname:VkPipelineColorBlendStateCreateInfo structure specified
-    during pipeline creation
-****
-
-include::{generated}/validity/structs/VkPipelineColorWriteCreateInfoEXT.txt[]
---
-
-[open,refpage='vkCmdSetColorWriteEnableEXT',desc='Enable or disable writes to a color attachment dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically enable or disable>> writes to a
-color attachment, call:
-
-include::{generated}/api/protos/vkCmdSetColorWriteEnableEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:attachmentCount is the number of basetype:VkBool32 elements in
-    pname:pColorWriteEnables.
-  * pname:pColorWriteEnables is a pointer to an array of per target
-    attachment boolean values specifying whether color writes are enabled
-    for the given attachment.
-
-This command sets the color write enables for subsequent drawing commands
-when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineColorWriteCreateInfoEXT::pname:pColorWriteEnables values
-used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetColorWriteEnableEXT-None-04803]]
-    The <<features-colorWriteEnable, colorWriteEnable>> feature must: be
-    enabled
-  * [[VUID-vkCmdSetColorWriteEnableEXT-attachmentCount-04804]]
-    pname:attachmentCount must: be equal to the pname:attachmentCount member
-    of the sname:VkPipelineColorBlendStateCreateInfo structure specified
-    during pipeline creation
-****
-
-include::{generated}/validity/protos/vkCmdSetColorWriteEnableEXT.txt[]
---
-endif::VK_EXT_color_write_enable[]
diff --git a/registry/vulkan/chapters/fundamentals.txt b/registry/vulkan/chapters/fundamentals.txt
deleted file mode 100644
index ba072a8..0000000
--- a/registry/vulkan/chapters/fundamentals.txt
+++ /dev/null
@@ -1,1641 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[fundamentals]]
-= Fundamentals
-
-This chapter introduces fundamental concepts including the Vulkan
-architecture and execution model, API syntax, queues, pipeline
-configurations, numeric representation, state and state queries, and the
-different types of objects and shaders.
-It provides a framework for interpreting more specific descriptions of
-commands and behavior in the remainder of the Specification.
-
-
-[[fundamentals-host-environment]]
-== Host and Device Environment
-
-The Vulkan Specification assumes and requires: the following properties of
-the host environment with respect to Vulkan implementations:
-
-  * The host must: have runtime support for 8, 16, 32 and 64-bit signed and
-    unsigned twos-complement integers, all addressable at the granularity of
-    their size in bytes.
-  * The host must: have runtime support for 32- and 64-bit floating-point
-    types satisfying the range and precision constraints in the
-    <<fundamentals-floatingpoint,Floating Point Computation>> section.
-  * The representation and endianness of these types on the host must: match
-    the representation and endianness of the same types on every physical
-    device supported.
-
-[NOTE]
-.Note
-====
-Since a variety of data types and structures in Vulkan may: be accessible by
-both host and physical device operations, the implementation should: be able
-to access such data efficiently in both paths in order to facilitate writing
-portable and performant applications.
-====
-
-[[fundamentals-execmodel]]
-== Execution Model
-
-This section outlines the execution model of a Vulkan system.
-
-Vulkan exposes one or more _devices_, each of which exposes one or more
-_queues_ which may: process work asynchronously to one another.
-The set of queues supported by a device is partitioned into _families_.
-Each family supports one or more types of functionality and may: contain
-multiple queues with similar characteristics.
-Queues within a single family are considered _compatible_ with one another,
-and work produced for a family of queues can: be executed on any queue
-within that family.
-This specification defines the following types of functionality that queues
-may: support:
-ifdef::VK_KHR_video_decode_queue[]
-video decode,
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-video encode,
-endif::VK_KHR_video_encode_queue[]
-graphics, compute, transfer and sparse memory management.
-
-[NOTE]
-.Note
-====
-A single device may: report multiple similar queue families rather than, or
-as well as, reporting multiple members of one or more of those families.
-This indicates that while members of those families have similar
-capabilities, they are _not_ directly compatible with one another.
-====
-
-Device memory is explicitly managed by the application.
-Each device may: advertise one or more heaps, representing different areas
-of memory.
-Memory heaps are either device-local or host-local, but are always visible
-to the device.
-Further detail about memory heaps is exposed via memory types available on
-that heap.
-Examples of memory areas that may: be available on an implementation
-include:
-
-  * _device-local_ is memory that is physically connected to the device.
-  * _device-local, host visible_ is device-local memory that is visible to
-    the host.
-  * _host-local, host visible_ is memory that is local to the host and
-    visible to the device and host.
-
-On other architectures, there may: only be a single heap that can: be used
-for any purpose.
-
-
-[[fundamentals-queueoperation]]
-=== Queue Operation
-
-Vulkan queues provide an interface to the execution engines of a device.
-Commands for these execution engines are recorded into command buffers ahead
-of execution time, and then submitted to a queue for execution.
-Once submitted to a queue, command buffers will begin and complete execution
-without further application intervention, though the order of this execution
-is dependent on a number of <<synchronization, implicit and explicit
-ordering constraints>>.
-
-Work is submitted to queues using _queue submission commands_ that typically
-take the form ftext:vkQueue* (e.g. flink:vkQueueSubmit,
-flink:vkQueueBindSparse), and can: take a list of semaphores upon which to
-wait before work begins and a list of semaphores to signal once work has
-completed.
-The work itself, as well as signaling and waiting on the semaphores are all
-_queue operations_.
-Queue submission commands return control to the application once queue
-operations have been submitted - they do not wait for completion.
-
-There are no implicit ordering constraints between queue operations on
-different queues, or between queues and the host, so these may: operate in
-any order with respect to each other.
-Explicit ordering constraints between different queues or with the host can:
-be expressed with <<synchronization-semaphores,semaphores>> and
-<<synchronization-fences,fences>>.
-
-Command buffer submissions to a single queue respect
-<<synchronization-submission-order, submission order>> and other
-<<synchronization-implicit, implicit ordering guarantees>>, but otherwise
-may: overlap or execute out of order.
-Other types of batches and queue submissions against a single queue (e.g.
-<<sparsemem-memory-binding, sparse memory binding>>) have no implicit
-ordering constraints with any other queue submission or batch.
-Additional explicit ordering constraints between queue submissions and
-individual batches can be expressed with
-<<synchronization-semaphores,semaphores>> and
-<<synchronization-fences,fences>>.
-
-Before a fence or semaphore is signaled, it is guaranteed that any
-previously submitted queue operations have completed execution, and that
-memory writes from those queue operations are
-<<synchronization-dependencies-available-and-visible,available>> to future
-queue operations.
-Waiting on a signaled semaphore or fence guarantees that previous writes
-that are available are also
-<<synchronization-dependencies-available-and-visible,visible>> to subsequent
-commands.
-
-Command buffer boundaries, both between primary command buffers of the same
-or different batches or submissions as well as between primary and secondary
-command buffers, do not introduce any additional ordering constraints.
-In other words, submitting the set of command buffers (which can: include
-executing secondary command buffers) between any semaphore or fence
-operations execute the recorded commands as if they had all been recorded
-into a single primary command buffer, except that the current state is
-<<commandbuffers-statereset,reset>> on each boundary.
-Explicit ordering constraints can: be expressed with <<synchronization,
-explicit synchronization primitives>>.
-
-There are a few <<synchronization-implicit, implicit ordering guarantees>>
-between commands within a command buffer, but only covering a subset of
-execution.
-Additional explicit ordering constraints can be expressed with the various
-<<synchronization, explicit synchronization primitives>>.
-
-[NOTE]
-.Note
-====
-Implementations have significant freedom to overlap execution of work
-submitted to a queue, and this is common due to deep pipelining and
-parallelism in Vulkan devices.
-====
-
-[[fundamentals-queueoperation-command-types]]
-Commands recorded in command buffers either perform actions (draw, dispatch,
-clear, copy, query/timestamp operations, begin/end subpass operations), set
-state (bind pipelines, descriptor sets, and buffers, set dynamic state, push
-constants, set render pass/subpass state), or perform synchronization
-(set/wait events, pipeline barrier, render pass/subpass dependencies).
-Some commands perform more than one of these tasks.
-State setting commands update the _current state_ of the command buffer.
-Some commands that perform actions (e.g. draw/dispatch) do so based on the
-current state set cumulatively since the start of the command buffer.
-The work involved in performing action commands is often allowed to overlap
-or to be reordered, but doing so must: not alter the state to be used by
-each action command.
-In general, action commands are those commands that alter framebuffer
-attachments, read/write buffer or image memory, or write to query pools.
-
-Synchronization commands introduce explicit
-<<synchronization-dependencies,execution and memory dependencies>> between
-two sets of action commands, where the second set of commands depends on the
-first set of commands.
-These dependencies enforce both that the execution of certain
-<<synchronization-pipeline-stages, pipeline stages>> in the later set occurs
-after the execution of certain stages in the source set, and that the
-effects of <<synchronization-global-memory-barriers,memory accesses>>
-performed by certain pipeline stages occur in order and are visible to each
-other.
-When not enforced by an explicit dependency or <<synchronization-implicit,
-implicit ordering guarantees>>, action commands may: overlap execution or
-execute out of order, and may: not see the side effects of each other's
-memory accesses.
-
-
-[[fundamentals-objectmodel-overview]]
-== Object Model
-
-The devices, queues, and other entities in Vulkan are represented by Vulkan
-objects.
-At the API level, all objects are referred to by handles.
-There are two classes of handles, dispatchable and non-dispatchable.
-_Dispatchable_ handle types are a pointer to an opaque type.
-This pointer may: be used by layers as part of intercepting API commands,
-and thus each API command takes a dispatchable type as its first parameter.
-Each object of a dispatchable type must: have a unique handle value during
-its lifetime.
-
-_Non-dispatchable_ handle types are a 64-bit integer type whose meaning is
-implementation-dependent.
-ifdef::VK_EXT_private_data[]
-If the <<features-privateData,pname:privateData>> feature is enabled for a
-slink:VkDevice, each object of a non-dispatchable type created on that
-device must: have a handle value that is unique among objects created on
-that device, for the duration of the object's lifetime.
-Otherwise, non-dispatchable
-endif::VK_EXT_private_data[]
-ifndef::VK_EXT_private_data[Non-dispatchable]
-handles may: encode object information directly in the handle rather than
-acting as a reference to an underlying object, and thus may: not have unique
-handle values.
-If handle values are not unique, then destroying one such handle must: not
-cause identical handles of other types to become invalid, and must: not
-cause identical handles of the same type to become invalid if that handle
-value has been created more times than it has been destroyed.
-
-All objects created or allocated from a sname:VkDevice (i.e. with a
-sname:VkDevice as the first parameter) are private to that device, and must:
-not be used on other devices.
-
-
-[[fundamentals-objectmodel-lifetime]]
-=== Object Lifetime
-
-Objects are created or allocated by ftext:vkCreate* and ftext:vkAllocate*
-commands, respectively.
-Once an object is created or allocated, its "`structure`" is considered to
-be immutable, though the contents of certain object types is still free to
-change.
-Objects are destroyed or freed by ftext:vkDestroy* and ftext:vkFree*
-commands, respectively.
-
-Objects that are allocated (rather than created) take resources from an
-existing pool object or memory heap, and when freed return resources to that
-pool or heap.
-While object creation and destruction are generally expected to be
-low-frequency occurrences during runtime, allocating and freeing objects
-can: occur at high frequency.
-Pool objects help accommodate improved performance of the allocations and
-frees.
-
-It is an application's responsibility to track the lifetime of Vulkan
-objects, and not to destroy them while they are still in use.
-
-[[fundamentals-objectmodel-lifetime-acquire]]
-The ownership of application-owned memory is immediately acquired by any
-Vulkan command it is passed into.
-Ownership of such memory must: be released back to the application at the
-end of the duration of the command, so that the application can: alter or
-free this memory as soon as all the commands that acquired it have returned.
-
-The following object types are consumed when they are passed into a Vulkan
-command and not further accessed by the objects they are used to create.
-They must: not be destroyed in the duration of any API command they are
-passed into:
-
-  * sname:VkShaderModule
-  * sname:VkPipelineCache
-ifdef::VK_EXT_validation_cache[]
-  * sname:VkValidationCacheEXT
-endif::VK_EXT_validation_cache[]
-
-A sname:VkRenderPass
-ifdef::VK_KHR_maintenance4[]
-or sname:VkPipelineLayout
-endif::VK_KHR_maintenance4[]
-object passed as a parameter to create another object is not further
-accessed by that object after the duration of the command it is passed into.
-A sname:VkRenderPass used in a command buffer follows the rules described
-below.
-
-ifndef::VK_KHR_maintenance4[]
-A sname:VkPipelineLayout object must: not be destroyed while any command
-buffer that uses it is in the recording state.
-endif::VK_KHR_maintenance4[]
-
-sname:VkDescriptorSetLayout objects may: be accessed by commands that
-operate on descriptor sets allocated using that layout, and those descriptor
-sets must: not be updated with flink:vkUpdateDescriptorSets after the
-descriptor set layout has been destroyed.
-Otherwise, a sname:VkDescriptorSetLayout object passed as a parameter to
-create another object is not further accessed by that object after the
-duration of the command it is passed into.
-
-The application must: not destroy any other type of Vulkan object until all
-uses of that object by the device (such as via command buffer execution)
-have completed.
-
-[[fundamentals-objectmodel-lifetime-cmdbuffers]]
-The following Vulkan objects must: not be destroyed while any command
-buffers using the object are in the <<commandbuffers-lifecycle, pending
-state>>:
-
-  * sname:VkEvent
-  * sname:VkQueryPool
-  * sname:VkBuffer
-  * sname:VkBufferView
-  * sname:VkImage
-  * sname:VkImageView
-  * sname:VkPipeline
-  * sname:VkSampler
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * sname:VkSamplerYcbcrConversion
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * sname:VkDescriptorPool
-  * sname:VkFramebuffer
-  * sname:VkRenderPass
-  * sname:VkCommandBuffer
-  * sname:VkCommandPool
-  * sname:VkDeviceMemory
-  * sname:VkDescriptorSet
-ifdef::VK_NV_device_generated_commands[]
-  * sname:VkIndirectCommandsLayoutNV
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_NV_ray_tracing[]
-  * sname:VkAccelerationStructureNV
-endif::VK_NV_ray_tracing[]
-ifdef::VK_KHR_acceleration_structure[]
-  * sname:VkAccelerationStructureKHR
-endif::VK_KHR_acceleration_structure[]
-
-Destroying these objects will move any command buffers that are in the
-<<commandbuffers-lifecycle, recording or executable state>>, and are using
-those objects, to the <<commandbuffers-lifecycle, invalid state>>.
-
-The following Vulkan objects must: not be destroyed while any queue is
-executing commands that use the object:
-
-  * sname:VkFence
-  * sname:VkSemaphore
-  * sname:VkCommandBuffer
-  * sname:VkCommandPool
-
-In general, objects can: be destroyed or freed in any order, even if the
-object being freed is involved in the use of another object (e.g. use of a
-resource in a view, use of a view in a descriptor set,
-ifdef::VK_KHR_pipeline_library[]
-use of a <<pipeline-library,pipeline library>> in another pipeline,
-endif::VK_KHR_pipeline_library[]
-ifdef::VK_NV_device_generated_commands[]
-use of a <<graphics-shadergroups,referenced pipeline>> for additional
-graphics shader groups in another pipeline,
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_KHR_acceleration_structure[]
-use of a <<acceleration-structure-bottom-level, bottom level acceleration
-structure>> in an instance referenced by a
-<<acceleration-structure-top-level, top level acceleration structure>>,
-endif::VK_KHR_acceleration_structure[]
-use of an object in a command buffer, binding of a memory allocation to a
-resource), as long as any object that uses the freed object is not further
-used in any way except to be destroyed or to be reset in such a way that it
-no longer uses the other object (such as resetting a command buffer).
-If the object has been reset, then it can: be used as if it never used the
-freed object.
-An exception to this is when there is a parent/child relationship between
-objects.
-In this case, the application must: not destroy a parent object before its
-children, except when the parent is explicitly defined to free its children
-when it is destroyed (e.g. for pool objects, as defined below).
-
-sname:VkCommandPool objects are parents of sname:VkCommandBuffer objects.
-sname:VkDescriptorPool objects are parents of sname:VkDescriptorSet objects.
-sname:VkDevice objects are parents of many object types (all that take a
-sname:VkDevice as a parameter to their creation).
-
-The following Vulkan objects have specific restrictions for when they can:
-be destroyed:
-
-  * sname:VkQueue objects cannot: be explicitly destroyed.
-    Instead, they are implicitly destroyed when the sname:VkDevice object
-    they are retrieved from is destroyed.
-  * Destroying a pool object implicitly frees all objects allocated from
-    that pool.
-    Specifically, destroying sname:VkCommandPool frees all
-    sname:VkCommandBuffer objects that were allocated from it, and
-    destroying sname:VkDescriptorPool frees all sname:VkDescriptorSet
-    objects that were allocated from it.
-  * sname:VkDevice objects can: be destroyed when all sname:VkQueue objects
-    retrieved from them are idle, and all objects created from them have
-    been destroyed.
-    This includes the following objects:
-  ** sname:VkFence
-  ** sname:VkSemaphore
-  ** sname:VkEvent
-  ** sname:VkQueryPool
-  ** sname:VkBuffer
-  ** sname:VkBufferView
-  ** sname:VkImage
-  ** sname:VkImageView
-  ** sname:VkShaderModule
-  ** sname:VkPipelineCache
-  ** sname:VkPipeline
-  ** sname:VkPipelineLayout
-  ** sname:VkSampler
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  ** sname:VkSamplerYcbcrConversion
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  ** sname:VkDescriptorSetLayout
-  ** sname:VkDescriptorPool
-  ** sname:VkFramebuffer
-  ** sname:VkRenderPass
-  ** sname:VkCommandPool
-  ** sname:VkCommandBuffer
-  ** sname:VkDeviceMemory
-ifdef::VK_EXT_validation_cache[]
-  ** sname:VkValidationCacheEXT
-endif::VK_EXT_validation_cache[]
-ifdef::VK_NV_ray_tracing[]
-  ** sname:VkAccelerationStructureNV
-endif::VK_NV_ray_tracing[]
-ifdef::VK_KHR_acceleration_structure[]
-  ** sname:VkAccelerationStructureKHR
-endif::VK_KHR_acceleration_structure[]
-  * sname:VkPhysicalDevice objects cannot: be explicitly destroyed.
-    Instead, they are implicitly destroyed when the sname:VkInstance object
-    they are retrieved from is destroyed.
-  * sname:VkInstance objects can: be destroyed once all sname:VkDevice
-    objects created from any of its sname:VkPhysicalDevice objects have been
-    destroyed.
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory_capabilities,VK_KHR_external_semaphore_capabilities,VK_KHR_external_fence_capabilities[]
-[[fundamentals-objectmodel-external]]
-=== External Object Handles
-
-As defined above, the scope of object handles created or allocated from a
-sname:VkDevice is limited to that logical device.
-Objects which are not in scope are said to be external.
-To bring an external object into scope, an external handle must: be exported
-from the object in the source scope and imported into the destination scope.
-
-[NOTE]
-.Note
-====
-The scope of external handles and their associated resources may: vary
-according to their type, but they can: generally be shared across process
-and API boundaries.
-====
-endif::VK_VERSION_1_1,VK_KHR_external_memory_capabilities,VK_KHR_external_semaphore_capabilities,VK_KHR_external_fence_capabilities[]
-
-
-[[fundamentals-abi]]
-== Application Binary Interface
-
-The mechanism by which Vulkan is made available to applications is platform-
-or implementation- defined.
-On many platforms the C interface described in this Specification is
-provided by a shared library.
-Since shared libraries can be changed independently of the applications that
-use them, they present particular compatibility challenges, and this
-Specification places some requirements on them.
-
-Shared library implementations must: use the default Application Binary
-Interface (ABI) of the standard C compiler for the platform, or provide
-customized API headers that cause application code to use the
-implementation's non-default ABI.
-An ABI in this context means the size, alignment, and layout of C data
-types; the procedure calling convention; and the naming convention for
-shared library symbols corresponding to C functions.
-Customizing the calling convention for a platform is usually accomplished by
-defining <<boilerplate-platform-specific-calling-conventions,calling
-convention macros>> appropriately in `vk_platform.h`.
-
-On platforms where Vulkan is provided as a shared library, library symbols
-beginning with "`vk`" and followed by a digit or uppercase letter are
-reserved for use by the implementation.
-Applications which use Vulkan must: not provide definitions of these
-symbols.
-This allows the Vulkan shared library to be updated with additional symbols
-for new API versions or extensions without causing symbol conflicts with
-existing applications.
-
-Shared library implementations should: provide library symbols for commands
-in the highest version of this Specification they support, and for
-ifdef::VK_KHR_surface[]
-<<wsi,Window System Integration>>
-endif::VK_KHR_surface[]
-ifndef::VK_KHR_surface[]
-Window System Integration
-endif::VK_KHR_surface[]
-extensions relevant to the platform.
-They may: also provide library symbols for commands defined by additional
-extensions.
-
-[NOTE]
-.Note
-====
-These requirements and recommendations are intended to allow implementors to
-take advantage of platform-specific conventions for SDKs, ABIs, library
-versioning mechanisms, etc.
-while still minimizing the code changes necessary to port applications or
-libraries between platforms.
-Platform vendors, or providers of the _de facto_ standard Vulkan shared
-library for a platform, are encouraged to document what symbols the shared
-library provides and how it will be versioned when new symbols are added.
-
-Applications should: only rely on shared library symbols for commands in the
-minimum core version required by the application.
-flink:vkGetInstanceProcAddr and flink:vkGetDeviceProcAddr should: be used to
-obtain function pointers for commands in core versions beyond the
-application's minimum required version.
-====
-
-
-[[fundamentals-commandsyntax]]
-== Command Syntax and Duration
-
-The Specification describes Vulkan commands as functions or procedures using
-C99 syntax.
-Language bindings for other languages such as C++ and JavaScript may: allow
-for stricter parameter passing, or object-oriented interfaces.
-
-Vulkan uses the standard C types for the base type of scalar parameters
-(e.g. types from `<stdint.h>`), with exceptions described below, or
-elsewhere in the text when appropriate:
-
-[open,refpage='VkBool32',desc='Vulkan boolean type',type='basetypes',xrefs='VK_TRUE VK_FALSE']
---
-basetype:VkBool32 represents boolean `True` and `False` values, since C does
-not have a sufficiently portable built-in boolean type:
-
-include::{generated}/api/basetypes/VkBool32.txt[]
-
-ename:VK_TRUE represents a boolean *True* (unsigned integer 1) value, and
-ename:VK_FALSE a boolean *False* (unsigned integer 0) value.
-
-All values returned from a Vulkan implementation in a basetype:VkBool32 will
-be either ename:VK_TRUE or ename:VK_FALSE.
-
-Applications must: not pass any other values than ename:VK_TRUE or
-ename:VK_FALSE into a Vulkan implementation where a basetype:VkBool32 is
-expected.
---
-
-[open,refpage='VK_TRUE',desc='Boolean true value',type='consts',xrefs='VkBool32 VK_FALSE']
---
-ename:VK_TRUE is a constant representing a basetype:VkBool32 *True* value.
-
-include::{generated}/api/enums/VK_TRUE.txt[]
---
-
-[open,refpage='VK_FALSE',desc='Boolean false value',type='consts',xrefs='VkBool32 VK_TRUE']
---
-ename:VK_FALSE is a constant representing a basetype:VkBool32 *False* value.
-
-include::{generated}/api/enums/VK_FALSE.txt[]
---
-
-
-[open,refpage='VkDeviceSize',desc='Vulkan device memory size and offsets',type='basetypes']
---
-basetype:VkDeviceSize represents device memory size and offset values:
-
-include::{generated}/api/basetypes/VkDeviceSize.txt[]
---
-
-ifdef::VK_VERSION_1_0,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-[open,refpage='VkDeviceAddress',desc='Vulkan device address type',type='basetypes']
---
-basetype:VkDeviceAddress represents device buffer address values:
-
-include::{generated}/api/basetypes/VkDeviceAddress.txt[]
---
-endif::VK_VERSION_1_0,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-
-Commands that create Vulkan objects are of the form ftext:vkCreate* and take
-stext:Vk*CreateInfo structures with the parameters needed to create the
-object.
-These Vulkan objects are destroyed with commands of the form
-ftext:vkDestroy*.
-
-The last in-parameter to each command that creates or destroys a Vulkan
-object is pname:pAllocator.
-The pname:pAllocator parameter can: be set to a non-`NULL` value such that
-allocations for the given object are delegated to an application provided
-callback; refer to the <<memory-allocation,Memory Allocation>> chapter for
-further details.
-
-Commands that allocate Vulkan objects owned by pool objects are of the form
-ftext:vkAllocate*, and take stext:Vk*AllocateInfo structures.
-These Vulkan objects are freed with commands of the form ftext:vkFree*.
-These objects do not take allocators; if host memory is needed, they will
-use the allocator that was specified when their parent pool was created.
-
-Commands are recorded into a command buffer by calling API commands of the
-form ftext:vkCmd*.
-Each such command may: have different restrictions on where it can: be used:
-in a primary and/or secondary command buffer, inside and/or outside a render
-pass, and in one or more of the supported queue types.
-These restrictions are documented together with the definition of each such
-command.
-
-The _duration_ of a Vulkan command refers to the interval between calling
-the command and its return to the caller.
-
-
-[[fundamentals-commandsyntax-results-lifetime]]
-=== Lifetime of Retrieved Results
-
-Information is retrieved from the implementation with commands of the form
-ftext:vkGet* and ftext:vkEnumerate*.
-
-Unless otherwise specified for an individual command, the results are
-_invariant_; that is, they will remain unchanged when retrieved again by
-calling the same command with the same parameters, so long as those
-parameters themselves all remain valid.
-
-
-[[fundamentals-threadingbehavior]]
-== Threading Behavior
-
-Vulkan is intended to provide scalable performance when used on multiple
-host threads.
-All commands support being called concurrently from multiple threads, but
-certain parameters, or components of parameters are defined to be
-_externally synchronized_.
-This means that the caller must: guarantee that no more than one thread is
-using such a parameter at a given time.
-
-More precisely, Vulkan commands use simple stores to update the state of
-Vulkan objects.
-A parameter declared as externally synchronized may: have its contents
-updated at any time during the host execution of the command.
-If two commands operate on the same object and at least one of the commands
-declares the object to be externally synchronized, then the caller must:
-guarantee not only that the commands do not execute simultaneously, but also
-that the two commands are separated by an appropriate memory barrier (if
-needed).
-
-[NOTE]
-.Note
-====
-Memory barriers are particularly relevant for hosts based on the ARM CPU
-architecture, which is more weakly ordered than many developers are
-accustomed to from x86/x64 programming.
-Fortunately, most higher-level synchronization primitives (like the pthread
-library) perform memory barriers as a part of mutual exclusion, so mutexing
-Vulkan objects via these primitives will have the desired effect.
-====
-
-Similarly the application must: avoid any potential data hazard of
-application-owned memory that has its
-<<fundamentals-objectmodel-lifetime-acquire,ownership temporarily acquired>>
-by a Vulkan command.
-While the ownership of application-owned memory remains acquired by a
-command the implementation may: read the memory at any point, and it may:
-write non-code:const qualified memory at any point.
-Parameters referring to non-code:const qualified application-owned memory
-are not marked explicitly as _externally synchronized_ in the Specification.
-
-ifdef::VK_KHR_deferred_host_operations[]
-If an application is using <<deferred-host-operations, deferred host
-operations>> in a command, and that operation is successfully deferred,
-object parameters and application-owned memory passed to that command may:
-be accessed at any time until the deferred operation is complete.
-endif::VK_KHR_deferred_host_operations[]
-
-Many object types are _immutable_, meaning the objects cannot: change once
-they have been created.
-These types of objects never need external synchronization, except that they
-must: not be destroyed while they are in use on another thread.
-In certain special cases mutable object parameters are internally
-synchronized, making external synchronization unnecessary.
-Any command parameters that are not labeled as externally synchronized are
-either not mutated by the command or are internally synchronized.
-Additionally, certain objects related to a command's parameters (e.g.
-command pools and descriptor pools) may: be affected by a command, and must:
-also be externally synchronized.
-These implicit parameters are documented as described below.
-
-Parameters of commands that are externally synchronized are listed below.
-
-include::{generated}/hostsynctable/parameters.txt[]
-
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-For slink:VkPipelineCache objects created with pname:flags containing
-ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, the above
-table is extended with the pname:pipelineCache parameter to
-ftext:vkCreate*Pipelines being externally synchronized.
-endif::VK_EXT_pipeline_creation_cache_control[]
-
-There are also a few instances where a command can: take in a user allocated
-list whose contents are externally synchronized parameters.
-In these cases, the caller must: guarantee that at most one thread is using
-a given element within the list at a given time.
-These parameters are listed below.
-
-include::{generated}/hostsynctable/parameterlists.txt[]
-
-In addition, there are some implicit parameters that need to be externally
-synchronized.
-For example, all pname:commandBuffer parameters that need to be externally
-synchronized imply that the pname:commandPool that was passed in when
-creating that command buffer also needs to be externally synchronized.
-The implicit parameters and their associated object are listed below.
-
-include::{generated}/hostsynctable/implicit.txt[]
-
-
-[[fundamentals-validusage]]
-== Valid Usage
-
-// preserving old id for permalinking
-[[fundamentals-errors]]
-Valid usage defines a set of conditions which must: be met in order to
-achieve well-defined runtime behavior in an application.
-These conditions depend only on Vulkan state, and the parameters or objects
-whose usage is constrained by the condition.
-
-The core layer assumes applications are using the API correctly.
-Except as documented elsewhere in the Specification, the behavior of the
-core layer to an application using the API incorrectly is undefined:, and
-may: include program termination.
-However, implementations must: ensure that incorrect usage by an application
-does not affect the integrity of the operating system, the Vulkan
-implementation, or other Vulkan client applications in the system.
-In particular, any guarantees made by an operating system about whether
-memory from one process can: be visible to another process or not must: not
-be violated by a Vulkan implementation for *any memory allocation*.
-Vulkan implementations are not required: to make additional security or
-integrity guarantees beyond those provided by the OS unless explicitly
-directed by the application's use of a particular feature or extension.
-
-[NOTE]
-.Note
-====
-For instance, if an operating system guarantees that data in all its memory
-allocations are set to zero when newly allocated, the Vulkan implementation
-must: make the same guarantees for any allocations it controls (e.g.
-slink:VkDeviceMemory).
-
-Similarly, if an operating system guarantees that use-after-free of host
-allocations will not result in values written by another process becoming
-visible, the same guarantees must: be made by the Vulkan implementation for
-device memory.
-====
-
-ifdef::VK_VERSION_1_1[]
-If the <<features-protectedMemory, protected memory>> feature is supported,
-the implementation provides additional guarantees when invalid usage occurs
-to prevent values in protected memory from being accessed or inferred
-outside of protected operations, as described in
-<<memory-protected-access-rules>>.
-endif::VK_VERSION_1_1[]
-
-Some valid usage conditions have dependencies on runtime limits or feature
-availability.
-It is possible to validate these conditions against Vulkan's minimum
-supported values for these limits and features, or some subset of other
-known values.
-
-Valid usage conditions do not cover conditions where well-defined behavior
-(including returning an error code) exists.
-
-Valid usage conditions should: apply to the command or structure where
-complete information about the condition would be known during execution of
-an application.
-This is such that a validation layer or linter can: be written directly
-against these statements at the point they are specified.
-
-[NOTE]
-.Note
-====
-This does lead to some non-obvious places for valid usage statements.
-For instance, the valid values for a structure might depend on a separate
-value in the calling command.
-In this case, the structure itself will not reference this valid usage as it
-is impossible to determine validity from the structure that it is invalid -
-instead this valid usage would be attached to the calling command.
-
-Another example is draw state - the state setters are independent, and can
-cause a legitimately invalid state configuration between draw calls; so the
-valid usage statements are attached to the place where all state needs to be
-valid - at the drawing command.
-====
-
-Valid usage conditions are described in a block labelled "`Valid Usage`"
-following each command or structure they apply to.
-
-
-[[fundamentals-validation]]
-=== Usage Validation
-
-Vulkan is a layered API.
-The lowest layer is the core Vulkan layer, as defined by this Specification.
-The application can: use additional layers above the core for debugging,
-validation, and other purposes.
-
-One of the core principles of Vulkan is that building and submitting command
-buffers should: be highly efficient.
-Thus error checking and validation of state in the core layer is minimal,
-although more rigorous validation can: be enabled through the use of layers.
-
-Validation of correct API usage is left to validation layers.
-Applications should: be developed with validation layers enabled, to help
-catch and eliminate errors.
-Once validated, released applications should: not enable validation layers
-by default.
-
-
-[[fundamentals-implicit-validity]]
-=== Implicit Valid Usage
-
-Some valid usage conditions apply to all commands and structures in the API,
-unless explicitly denoted otherwise for a specific command or structure.
-These conditions are considered _implicit_, and are described in a block
-labelled "`Valid Usage (Implicit)`" following each command or structure they
-apply to.
-Implicit valid usage conditions are described in detail below.
-
-
-[[fundamentals-validusage-handles]]
-==== Valid Usage for Object Handles
-
-Any input parameter to a command that is an object handle must: be a valid
-object handle, unless otherwise specified.
-An object handle is valid if:
-
-  * It has been created or allocated by a previous, successful call to the
-    API.
-    Such calls are noted in the Specification.
-  * It has not been deleted or freed by a previous call to the API.
-    Such calls are noted in the Specification.
-  * Any objects used by that object, either as part of creation or
-    execution, must: also be valid.
-
-The reserved values dlink:VK_NULL_HANDLE and `NULL` can: be used in place of
-valid non-dispatchable handles and dispatchable handles, respectively, when
-_explicitly called out in the Specification_.
-Any command that creates an object successfully must: not return these
-values.
-It is valid to pass these values to ftext:vkDestroy* or ftext:vkFree*
-commands, which will silently ignore these values.
-
-
-[[fundamentals-validusage-pointers]]
-==== Valid Usage for Pointers
-
-Any parameter that is a pointer must: be a _valid pointer_ only if it is
-explicitly called out by a Valid Usage statement.
-
-A pointer is "`valid`" if it points at memory containing values of the
-number and type(s) expected by the command, and all fundamental types
-accessed through the pointer (e.g. as elements of an array or as members of
-a structure) satisfy the alignment requirements of the host processor.
-
-[[fundamentals-validusage-strings]]
-==== Valid Usage for Strings
-
-Any parameter that is a pointer to `char` must: be a finite sequence of
-values terminated by a null character, or if _explicitly called out in the
-Specification_, can: be `NULL`.
-
-
-[[fundamentals-validusage-enums]]
-==== Valid Usage for Enumerated Types
-
-Any parameter of an enumerated type must: be a valid enumerant for that
-type.
-A enumerant is valid if:
-
-  * The enumerant is defined as part of the enumerated type.
-  * The enumerant is not the special value (suffixed with
-    etext:_MAX_ENUM^1^) defined for the enumerated type.
-
-1::
-    This special value exists only to ensure that C `enum` types are 32 bits
-    in size.
-    It is not part of the API, and should: not be used by applications.
-
-Any enumerated type returned from a query command or otherwise output from
-Vulkan to the application must: not have a reserved value.
-Reserved values are values not defined by any extension for that enumerated
-type.
-
-[NOTE]
-.Note
-====
-This language is intended to accommodate cases such as "`hidden`" extensions
-known only to driver internals, or layers enabling extensions without
-knowledge of the application, without allowing return of values not defined
-by any extension.
-====
-
-[NOTE]
-.Note
-====
-Application developers are encouraged to be careful when using `switch`
-statements with Vulkan API enums.
-This is because new extensions can add new values to existing enums.
-Using a `default:` statement within a `switch` may avoid future compilation
-issues.
-
-ifdef::VK_VERSION_1_2[]
-This is particularly true for enums such as elink:VkDriverId, which may have
-values added that do not belong to a corresponding new extension.
-endif::VK_VERSION_1_2[]
-====
-
-
-[[fundamentals-validusage-flags]]
-==== Valid Usage for Flags
-
-[open,refpage='VkFlags',desc='Vulkan bitmasks',type='basetypes',xrefs='VkColorComponentFlags']
---
-A collection of flags is represented by a bitmask using the type
-basetype:VkFlags:
-
-include::{generated}/api/basetypes/VkFlags.txt[]
-
-Bitmasks are passed to many commands and structures to compactly represent
-options, but basetype:VkFlags is not used directly in the API.
-Instead, a etext:Vk*Flags type which is an alias of basetype:VkFlags, and
-whose name matches the corresponding etext:Vk*FlagBits that are valid for
-that type, is used.
-
-Any etext:Vk*Flags member or parameter used in the API as an input must: be
-a valid combination of bit flags.
-A valid combination is either zero or the bitwise OR of valid bit flags.
-A bit flag is valid if:
-
-  * The bit flag is defined as part of the etext:Vk*FlagBits type, where the
-    bits type is obtained by taking the flag type and replacing the trailing
-    etext:Flags with etext:FlagBits.
-    For example, a flag value of type tlink:VkColorComponentFlags must:
-    contain only bit flags defined by elink:VkColorComponentFlagBits.
-  * The flag is allowed in the context in which it is being used.
-    For example, in some cases, certain bit flags or combinations of bit
-    flags are mutually exclusive.
-
-Any etext:Vk*Flags member or parameter returned from a query command or
-otherwise output from Vulkan to the application may: contain bit flags
-undefined: in its corresponding etext:Vk*FlagBits type.
-An application cannot: rely on the state of these unspecified bits.
-
-Only the low-order 31 bits (bit positions zero through 30) are available for
-use as flag bits.
-
-[NOTE]
-.Note
-====
-This restriction is due to poorly defined behavior by C compilers given a C
-enumerant value of `0x80000000`.
-In some cases adding this enumerant value may increase the size of the
-underlying etext:Vk*FlagBits type, breaking the ABI.
-====
---
-
-
-
-[[fundamentals-validusage-sType]]
-==== Valid Usage for Structure Types
-
-Any parameter that is a structure containing a pname:sType member must: have
-a value of ptext:sType which is a valid elink:VkStructureType value matching
-the type of the structure.
-
-
-[[fundamentals-validusage-pNext]]
-==== Valid Usage for Structure Pointer Chains
-
-Any parameter that is a structure containing a `void*` ptext:pNext member
-must: have a value of pname:pNext that is either `NULL`, or is a pointer to
-a valid _extending structure_, containing ptext:sType and ptext:pNext
-members as described in the <<vulkan-styleguide,Vulkan Documentation and
-Extensions>> document in the section "`Extension Interactions`".
-The set of structures connected by ptext:pNext pointers is referred to as a
-_pname:pNext chain_.
-
-Each structure included in the pname:pNext chain must: be defined at runtime
-by either:
-
-  * a core version which is supported
-  * an extension which is enabled
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-  * a supported device extension in the case of physical-device-level
-functionality added by the device extension
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-Each type of extending structure must: not appear more than once in a
-ptext:pNext chain, including any
-<<extendingvulkan-compatibility-aliases,aliases>>.
-This general rule may be explicitly overridden for specific structures.
-
-Any component of the implementation (the loader, any enabled layers, and
-drivers) must: skip over, without processing (other than reading the
-pname:sType and pname:pNext members) any extending structures in the chain
-not defined by core versions or extensions supported by that component.
-
-As a convenience to implementations and layers needing to iterate through a
-structure pointer chain, the Vulkan API provides two _base structures_.
-These structures allow for some type safety, and can be used by Vulkan API
-functions that operate on generic inputs and outputs.
-
-[open,refpage='VkBaseInStructure',desc='Base structure for a read-only pointer chain',type='structs']
---
-The sname:VkBaseInStructure structure is defined as:
-
-include::{generated}/api/structs/VkBaseInStructure.txt[]
-
-  * pname:sType is the structure type of the structure being iterated
-    through.
-  * pname:pNext is `NULL` or a pointer to the next structure in a structure
-    chain.
-
-sname:VkBaseInStructure can be used to facilitate iterating through a
-read-only structure pointer chain.
---
-
-[open,refpage='VkBaseOutStructure',desc='Base structure for a read-only pointer chain',type='structs']
---
-The sname:VkBaseOutStructure structure is defined as:
-
-include::{generated}/api/structs/VkBaseOutStructure.txt[]
-
-  * pname:sType is the structure type of the structure being iterated
-    through.
-  * pname:pNext is `NULL` or a pointer to the next structure in a structure
-    chain.
-
-sname:VkBaseOutStructure can be used to facilitate iterating through a
-structure pointer chain that returns data back to the application.
---
-
-
-[[fundamentals-validusage-nested-structs]]
-==== Valid Usage for Nested Structures
-
-The above conditions also apply recursively to members of structures
-provided as input to a command, either as a direct argument to the command,
-or themselves a member of another structure.
-
-Specifics on valid usage of each command are covered in their individual
-sections.
-
-
-[[fundamentals-validusage-extensions]]
-==== Valid Usage for Extensions
-
-Instance-level functionality or behavior added by an <<extensions, instance
-extension>> to the API must: not be used unless that extension is supported
-by the instance as determined by
-flink:vkEnumerateInstanceExtensionProperties, and that extension is enabled
-in slink:VkInstanceCreateInfo.
-
-Physical-device-level functionality or behavior added by an <<extensions,
-instance extension>> to the API must: not be used unless that extension is
-supported by the instance as determined by
-flink:vkEnumerateInstanceExtensionProperties, and that extension is enabled
-in slink:VkInstanceCreateInfo.
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-Physical-device-level functionality or behavior added by a <<extensions,
-device extension>> to the API must: not be used unless the conditions
-described in <<initialization-phys-dev-extensions, Extending Physical Device
-Core Functionality>> are met.
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-Device functionality or behavior added by a <<extensions, device extension>>
-to the API must: not be used unless that extension is supported by the
-device as determined by flink:vkEnumerateDeviceExtensionProperties, and that
-extension is enabled in slink:VkDeviceCreateInfo.
-
-
-[[fundamentals-validusage-versions]]
-==== Valid Usage for Newer Core Versions
-
-ifdef::VK_VERSION_1_1[]
-
-Instance-level functionality or behavior added by a <<versions, new core
-version>> of the API must: not be used unless it is supported by the
-instance as determined by flink:vkEnumerateInstanceVersion and the specified
-version of slink:VkApplicationInfo::pname:apiVersion.
-
-endif::VK_VERSION_1_1[]
-
-Physical-device-level functionality or behavior added by a <<versions, new
-core version>> of the API must: not be used unless it is supported by the
-physical device as determined by
-slink:VkPhysicalDeviceProperties::pname:apiVersion and the specified version
-of slink:VkApplicationInfo::pname:apiVersion.
-
-Device-level functionality or behavior added by a <<versions, new core
-version>> of the API must: not be used unless it is supported by the device
-as determined by slink:VkPhysicalDeviceProperties::pname:apiVersion and the
-specified version of slink:VkApplicationInfo::pname:apiVersion.
-
-
-[[fundamentals-returncodes]]
-== `VkResult` Return Codes
-
-[open,refpage='VkResult',desc='Vulkan command return codes',type='enums']
---
-While the core Vulkan API is not designed to capture incorrect usage, some
-circumstances still require return codes.
-Commands in Vulkan return their status via return codes that are in one of
-two categories:
-
-  * Successful completion codes are returned when a command needs to
-    communicate success or status information.
-    All successful completion codes are non-negative values.
-  * Run time error codes are returned when a command needs to communicate a
-    failure that could only be detected at runtime.
-    All runtime error codes are negative values.
-
-All return codes in Vulkan are reported via elink:VkResult return values.
-The possible codes are:
-
-include::{generated}/api/enums/VkResult.txt[]
-
-[[fundamentals-successcodes]]
-.Success Codes
-  * ename:VK_SUCCESS Command successfully completed
-  * ename:VK_NOT_READY A fence or query has not yet completed
-  * ename:VK_TIMEOUT A wait operation has not completed in the specified
-    time
-  * ename:VK_EVENT_SET An event is signaled
-  * ename:VK_EVENT_RESET An event is unsignaled
-  * ename:VK_INCOMPLETE A return array was too small for the result
-ifdef::VK_KHR_swapchain[]
-  * ename:VK_SUBOPTIMAL_KHR A swapchain no longer matches the surface
-    properties exactly, but can: still be used to present to the surface
-    successfully.
-endif::VK_KHR_swapchain[]
-ifdef::VK_KHR_deferred_host_operations[]
-  * ename:VK_THREAD_IDLE_KHR A deferred operation is not complete but there
-    is currently no work for this thread to do at the time of this call.
-  * ename:VK_THREAD_DONE_KHR A deferred operation is not complete but there
-    is no work remaining to assign to additional threads.
-  * ename:VK_OPERATION_DEFERRED_KHR A deferred operation was requested and
-    at least some of the work was deferred.
-  * ename:VK_OPERATION_NOT_DEFERRED_KHR A deferred operation was requested
-    and no operations were deferred.
-endif::VK_KHR_deferred_host_operations[]
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-  * ename:VK_PIPELINE_COMPILE_REQUIRED_EXT A requested pipeline creation
-    would have required compilation, but the application requested
-    compilation to not be performed.
-endif::VK_EXT_pipeline_creation_cache_control[]
-
-[[fundamentals-errorcodes]]
-.Error codes
-  * ename:VK_ERROR_OUT_OF_HOST_MEMORY A host memory allocation has failed.
-  * ename:VK_ERROR_OUT_OF_DEVICE_MEMORY A device memory allocation has
-    failed.
-  * ename:VK_ERROR_INITIALIZATION_FAILED Initialization of an object could
-    not be completed for implementation-specific reasons.
-  * ename:VK_ERROR_DEVICE_LOST The logical or physical device has been lost.
-    See <<devsandqueues-lost-device,Lost Device>>
-  * ename:VK_ERROR_MEMORY_MAP_FAILED Mapping of a memory object has failed.
-  * ename:VK_ERROR_LAYER_NOT_PRESENT A requested layer is not present or
-    could not be loaded.
-  * ename:VK_ERROR_EXTENSION_NOT_PRESENT A requested extension is not
-    supported.
-  * ename:VK_ERROR_FEATURE_NOT_PRESENT A requested feature is not supported.
-  * ename:VK_ERROR_INCOMPATIBLE_DRIVER The requested version of Vulkan is
-    not supported by the driver or is otherwise incompatible for
-    implementation-specific reasons.
-  * ename:VK_ERROR_TOO_MANY_OBJECTS Too many objects of the type have
-    already been created.
-  * ename:VK_ERROR_FORMAT_NOT_SUPPORTED A requested format is not supported
-    on this device.
-  * ename:VK_ERROR_FRAGMENTED_POOL A pool allocation has failed due to
-    fragmentation of the pool's memory.
-    This must: only be returned if no attempt to allocate host or device
-    memory was made to accommodate the new allocation.
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-    This should: be returned in preference to
-    ename:VK_ERROR_OUT_OF_POOL_MEMORY, but only if the implementation is
-    certain that the pool allocation failure was due to fragmentation.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifdef::VK_KHR_surface[]
-  * ename:VK_ERROR_SURFACE_LOST_KHR A surface is no longer available.
-  * ename:VK_ERROR_NATIVE_WINDOW_IN_USE_KHR The requested window is already
-    in use by Vulkan or another API in a manner which prevents it from being
-    used again.
-endif::VK_KHR_surface[]
-ifdef::VK_KHR_swapchain[]
-  * ename:VK_ERROR_OUT_OF_DATE_KHR A surface has changed in such a way that
-    it is no longer compatible with the swapchain, and further presentation
-    requests using the swapchain will fail.
-    Applications must: query the new surface properties and recreate their
-    swapchain if they wish to continue presenting to the surface.
-endif::VK_KHR_swapchain[]
-ifdef::VK_KHR_display_swapchain[]
-  * ename:VK_ERROR_INCOMPATIBLE_DISPLAY_KHR The display used by a swapchain
-    does not use the same presentable image layout, or is incompatible in a
-    way that prevents sharing an image.
-endif::VK_KHR_display_swapchain[]
-ifdef::VK_NV_glsl_shader[]
-  * ename:VK_ERROR_INVALID_SHADER_NV One or more shaders failed to compile
-    or link.
-    More details are reported back to the application via
-    `apiext:VK_EXT_debug_report` if enabled.
-endif::VK_NV_glsl_shader[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * ename:VK_ERROR_OUT_OF_POOL_MEMORY A pool memory allocation has failed.
-    This must: only be returned if no attempt to allocate host or device
-    memory was made to accommodate the new allocation.
-    If the failure was definitely due to fragmentation of the pool,
-    ename:VK_ERROR_FRAGMENTED_POOL should: be returned instead.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory,VK_KHR_external_semaphore,VK_KHR_external_fence[]
-  * ename:VK_ERROR_INVALID_EXTERNAL_HANDLE An external handle is not a valid
-    handle of the specified type.
-endif::VK_VERSION_1_1,VK_KHR_external_memory,VK_KHR_external_semaphore,VK_KHR_external_fence[]
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * ename:VK_ERROR_FRAGMENTATION A descriptor pool creation has failed due
-    to fragmentation.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_EXT_buffer_device_address[]
-  * ename:VK_ERROR_INVALID_DEVICE_ADDRESS_EXT A buffer creation failed
-    because the requested address is not available.
-endif::VK_EXT_buffer_device_address[]
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-  * ename:VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS A buffer creation
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-    or memory allocation
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-    failed because the requested address is not available.
-ifdef::VK_KHR_ray_tracing_pipeline[]
-    A shader group handle assignment failed because the requested shader
-    group handle information is no longer valid.
-endif::VK_KHR_ray_tracing_pipeline[]
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-ifdef::VK_EXT_full_screen_exclusive[]
-  * ename:VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT An operation on a
-    swapchain created with
-    ename:VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT failed as it
-    did not have exlusive full-screen access.
-    This may: occur due to implementation-dependent reasons, outside of the
-    application's control.
-endif::VK_EXT_full_screen_exclusive[]
-  * ename:VK_ERROR_UNKNOWN An unknown error has occurred; either the
-    application has provided invalid input, or an implementation failure has
-    occurred.
-
-If a command returns a runtime error, unless otherwise specified any output
-parameters will have undefined: contents, except that if the output
-parameter is a structure with pname:sType and pname:pNext fields, those
-fields will be unmodified.
-Any structures chained from pname:pNext will also have undefined: contents,
-except that pname:sType and pname:pNext will be unmodified.
-
-etext:VK_ERROR_OUT_OF_*_MEMORY errors do not modify any currently existing
-Vulkan objects.
-Objects that have already been successfully created can: still be used by
-the application.
-
-[NOTE]
-.Note
-====
-As a general rule, ftext:Free, ftext:Release, and ftext:Reset commands do
-not return ename:VK_ERROR_OUT_OF_HOST_MEMORY, while any other command with a
-return code may: return it.
-Any exceptions from this rule are described for those commands.
-====
-
-ename:VK_ERROR_UNKNOWN will be returned by an implementation when an
-unexpected error occurs that cannot be attributed to valid behavior of the
-application and implementation.
-Under these conditions, it may: be returned from any command returning a
-elink:VkResult.
-
-[NOTE]
-.Note
-====
-ename:VK_ERROR_UNKNOWN is not expected to ever be returned if the
-application behavior is valid, and if the implementation is bug-free.
-If ename:VK_ERROR_UNKNOWN is received, the application should be checked
-against the latest validation layers to verify correct behavior as much as
-possible.
-If no issues are identified it could be an implementation issue, and the
-implementor should be contacted for support.
-====
-
-Performance-critical commands generally do not have return codes.
-If a runtime error occurs in such commands, the implementation will defer
-reporting the error until a specified point.
-For commands that record into command buffers (ftext:vkCmd*) runtime errors
-are reported by fname:vkEndCommandBuffer.
-
---
-
-
-[[fundamentals-numerics]]
-== Numeric Representation and Computation
-
-Implementations normally perform computations in floating-point, and must:
-meet the range and precision requirements defined under "`Floating-Point
-Computation`" below.
-
-These requirements only apply to computations performed in Vulkan operations
-outside of shader execution, such as texture image specification and
-sampling, and per-fragment operations.
-Range and precision requirements during shader execution differ and are
-specified by the <<spirvenv-precision-operation, Precision and Operation of
-SPIR-V Instructions>> section.
-
-In some cases, the representation and/or precision of operations is
-implicitly limited by the specified format of vertex or texel data consumed
-by Vulkan.
-Specific floating-point formats are described later in this section.
-
-
-[[fundamentals-floatingpoint]]
-=== Floating-Point Computation
-
-Most floating-point computation is performed in SPIR-V shader modules.
-The properties of computation within shaders are constrained as defined by
-the <<spirvenv-precision-operation, Precision and Operation of SPIR-V
-Instructions>> section.
-
-Some floating-point computation is performed outside of shaders, such as
-viewport and depth range calculations.
-For these computations, we do not specify how floating-point numbers are to
-be represented, or the details of how operations on them are performed, but
-only place minimal requirements on representation and precision as described
-in the remainder of this section.
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-(Jon, Bug 14966) This is a rat's nest of complexity, both in terms of
-describing/enumerating places such computation may: take place (other than
-"`not shader code`") and in how implementations may: do it.
-We have consciously deferred the resolution of this issue to post-1.0, and
-in the meantime, the following language inherited from the OpenGL
-Specification is inserted as a placeholder.
-Hopefully it can: be tightened up considerably.
-====
-endif::editing-notes[]
-
-We require simply that numbers`' floating-point parts contain enough bits
-and that their exponent fields are large enough so that individual results
-of floating-point operations are accurate to about 1 part in 10^5^.
-The maximum representable magnitude for all floating-point values must: be
-at least 2^32^.
-
-  {empty}:: [eq]#x {times} 0 = 0 {times} x = 0# for any non-infinite and
-            non-[eq]#NaN# [eq]#x#.
-  {empty}:: [eq]#1 {times} x = x {times} 1 = x#.
-  {empty}:: [eq]#x {plus} 0 = 0 {plus} x = x#.
-  {empty}:: [eq]#0^0^ = 1#.
-
-Occasionally, further requirements will be specified.
-Most single-precision floating-point formats meet these requirements.
-
-The special values [eq]#Inf# and [eq]#-Inf# encode values with magnitudes
-too large to be represented; the special value [eq]#NaN# encodes "`Not A
-Number`" values resulting from undefined: arithmetic operations such as
-[eq]#0 / 0#.
-Implementations may: support [eq]#Inf# and [eq]#NaN# in their floating-point
-computations.
-
-
-[[fundamentals-fp-conversion]]
-=== Floating-Point Format Conversions
-
-When a value is converted to a defined floating-point representation, finite
-values falling between two representable finite values are rounded to one or
-the other.
-The rounding mode is not defined.
-Finite values whose magnitude is larger than that of any representable
-finite value may be rounded either to the closest representable finite value
-or to the appropriately signed infinity.
-For unsigned destination formats any negative values are converted to zero.
-Positive infinity is converted to positive infinity; negative infinity is
-converted to negative infinity in signed formats and to zero in unsigned
-formats; and any [eq]#NaN# is converted to a [eq]#NaN#.
-
-
-[[fundamentals-fp16]]
-=== 16-Bit Floating-Point Numbers
-
-16-bit floating point numbers are defined in the "`16-bit floating point
-numbers`" section of the <<data-format,Khronos Data Format Specification>>.
-
-
-[[fundamentals-fp11]]
-=== Unsigned 11-Bit Floating-Point Numbers
-
-Unsigned 11-bit floating point numbers are defined in the "`Unsigned 11-bit
-floating point numbers`" section of the <<data-format,Khronos Data Format
-Specification>>.
-
-
-[[fundamentals-fp10]]
-=== Unsigned 10-Bit Floating-Point Numbers
-
-Unsigned 10-bit floating point numbers are defined in the "`Unsigned 10-bit
-floating point numbers`" section of the <<data-format,Khronos Data Format
-Specification>>.
-
-
-[[fundamentals-general]]
-=== General Requirements
-
-Any representable floating-point value in the appropriate format is legal as
-input to a Vulkan command that requires floating-point data.
-The result of providing a value that is not a floating-point number to such
-a command is unspecified, but must: not lead to Vulkan interruption or
-termination.
-For example, providing a negative zero (where applicable) or a denormalized
-number to a Vulkan command must: yield deterministic results, while
-providing a [eq]#NaN# or [eq]#Inf# yields unspecified results.
-
-Some calculations require division.
-In such cases (including implied divisions performed by vector
-normalization), division by zero produces an unspecified result but must:
-not lead to Vulkan interruption or termination.
-
-
-[[fundamentals-fixedconv]]
-== Fixed-Point Data Conversions
-
-When generic vertex attributes and pixel color or depth _components_ are
-represented as integers, they are often (but not always) considered to be
-_normalized_.
-Normalized integer values are treated specially when being converted to and
-from floating-point values, and are usually referred to as _normalized
-fixed-point_.
-
-In the remainder of this section, [eq]#b# denotes the bit width of the
-fixed-point integer representation.
-When the integer is one of the types defined by the API, [eq]#b# is the bit
-width of that type.
-When the integer comes from an <<resources-images,image>> containing color
-or depth component texels, [eq]#b# is the number of bits allocated to that
-component in its <<formats,specified image format>>.
-
-The signed and unsigned fixed-point representations are assumed to be
-[eq]#b#-bit binary two's-complement integers and binary unsigned integers,
-respectively.
-
-
-[[fundamentals-fixedfpconv]]
-=== Conversion from Normalized Fixed-Point to Floating-Point
-
-Unsigned normalized fixed-point integers represent numbers in the range
-[eq]#[0,1]#.
-The conversion from an unsigned normalized fixed-point value [eq]#c# to the
-corresponding floating-point value [eq]#f# is defined as
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = { c \over { 2^b - 1 } }
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-Signed normalized fixed-point integers represent numbers in the range
-[eq]#[-1,1]#.
-The conversion from a signed normalized fixed-point value [eq]#c# to the
-corresponding floating-point value [eq]#f# is performed using
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = \max\left( {c \over {2^{b-1} - 1}}, -1.0 \right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-Only the range [eq]#[-2^b-1^ {plus} 1, 2^b-1^ - 1]# is used to represent
-signed fixed-point values in the range [eq]#[-1,1]#.
-For example, if [eq]#b = 8#, then the integer value [eq]#-127# corresponds
-to [eq]#-1.0# and the value 127 corresponds to [eq]#1.0#.
-This equation is used everywhere that signed normalized fixed-point values
-are converted to floating-point.
-
-Note that while zero is exactly expressible in this representation, one
-value ([eq]#-128# in the example) is outside the representable range, and
-implementations must: clamp it to [eq]#-1.0#.
-Where the value is subject to further processing by the implementation, e.g.
-during texture filtering, values less than [eq]#-1.0# may: be used but the
-result must: be clamped before the value is returned to shaders.
-
-
-[[fundamentals-fpfixedconv]]
-=== Conversion from Floating-Point to Normalized Fixed-Point
-
-The conversion from a floating-point value [eq]#f# to the corresponding
-unsigned normalized fixed-point value [eq]#c# is defined by first clamping
-[eq]#f# to the range [eq]#[0,1]#, then computing
-
-  {empty}:: [eq]#c = convertFloatToUint(f {times} (2^b^ - 1), b)#
-
-where [eq]#convertFloatToUint(r,b)# returns one of the two unsigned binary
-integer values with exactly [eq]#b# bits which are closest to the
-floating-point value [eq]#r#.
-Implementations should: round to nearest.
-If [eq]#r# is equal to an integer, then that integer value must: be
-returned.
-In particular, if [eq]#f# is equal to 0.0 or 1.0, then [eq]#c# must: be
-assigned 0 or [eq]#2^b^ - 1#, respectively.
-
-The conversion from a floating-point value [eq]#f# to the corresponding
-signed normalized fixed-point value [eq]#c# is performed by clamping [eq]#f#
-to the range [eq]#[-1,1]#, then computing
-
-  {empty}:: [eq]#c = convertFloatToInt(f {times} (2^b-1^ - 1), b)#
-
-where [eq]#convertFloatToInt(r,b)# returns one of the two signed
-two's-complement binary integer values with exactly [eq]#b# bits which are
-closest to the floating-point value [eq]#r#.
-Implementations should: round to nearest.
-If [eq]#r# is equal to an integer, then that integer value must: be
-returned.
-In particular, if [eq]#f# is equal to -1.0, 0.0, or 1.0, then [eq]#c# must:
-be assigned [eq]#-(2^b-1^ - 1)#, 0, or [eq]#2^b-1^ - 1#, respectively.
-
-This equation is used everywhere that floating-point values are converted to
-signed normalized fixed-point.
-
-
-[[fundamentals-common-objects]]
-== Common Object Types
-
-Some types of Vulkan objects are used in many different structures and
-command parameters, and are described here.
-These types include _offsets_, _extents_, and _rectangles_.
-
-
-=== Offsets
-
-Offsets are used to describe a pixel location within an image or
-framebuffer, as an (x,y) location for two-dimensional images, or an (x,y,z)
-location for three-dimensional images.
-
-[open,refpage='VkOffset2D',desc='Structure specifying a two-dimensional offset',type='structs']
---
-A two-dimensional offset is defined by the structure:
-
-include::{generated}/api/structs/VkOffset2D.txt[]
-
-  * pname:x is the x offset.
-  * pname:y is the y offset.
-
-include::{generated}/validity/structs/VkOffset2D.txt[]
---
-
-[open,refpage='VkOffset3D',desc='Structure specifying a three-dimensional offset',type='structs']
---
-A three-dimensional offset is defined by the structure:
-
-include::{generated}/api/structs/VkOffset3D.txt[]
-
-  * pname:x is the x offset.
-  * pname:y is the y offset.
-  * pname:z is the z offset.
-
-include::{generated}/validity/structs/VkOffset3D.txt[]
---
-
-
-=== Extents
-
-Extents are used to describe the size of a rectangular region of pixels
-within an image or framebuffer, as (width,height) for two-dimensional
-images, or as (width,height,depth) for three-dimensional images.
-
-[open,refpage='VkExtent2D',desc='Structure specifying a two-dimensional extent',type='structs']
---
-A two-dimensional extent is defined by the structure:
-
-include::{generated}/api/structs/VkExtent2D.txt[]
-
-  * pname:width is the width of the extent.
-  * pname:height is the height of the extent.
-
-include::{generated}/validity/structs/VkExtent2D.txt[]
---
-
-[open,refpage='VkExtent3D',desc='Structure specifying a three-dimensional extent',type='structs']
---
-A three-dimensional extent is defined by the structure:
-
-include::{generated}/api/structs/VkExtent3D.txt[]
-
-  * pname:width is the width of the extent.
-  * pname:height is the height of the extent.
-  * pname:depth is the depth of the extent.
-
-include::{generated}/validity/structs/VkExtent3D.txt[]
---
-
-
-=== Rectangles
-
-[open,refpage='VkRect2D',desc='Structure specifying a two-dimensional subregion',type='structs']
---
-Rectangles are used to describe a specified rectangular region of pixels
-within an image or framebuffer.
-Rectangles include both an offset and an extent of the same dimensionality,
-as described above.
-Two-dimensional rectangles are defined by the structure
-
-include::{generated}/api/structs/VkRect2D.txt[]
-
-  * pname:offset is a slink:VkOffset2D specifying the rectangle offset.
-  * pname:extent is a slink:VkExtent2D specifying the rectangle extent.
-
-include::{generated}/validity/structs/VkRect2D.txt[]
---
-
-
-// VkStructureType is pretty long,
-// so keep it as a last chapter section for readability.
-=== Structure Types
-
-[open,refpage='VkStructureType',desc='Vulkan structure types (pname:sType)',type='enums']
---
-Each value corresponds to a particular structure with a pname:sType member
-with a matching name.
-As a general rule, the name of each elink:VkStructureType value is obtained
-by taking the name of the structure, stripping the leading etext:Vk,
-prefixing each capital letter with etext:_, converting the entire resulting
-string to upper case, and prefixing it with etext:VK_STRUCTURE_TYPE_.
-For example, structures of type slink:VkImageCreateInfo correspond to a
-elink:VkStructureType of ename:VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, and thus
-its pname:sType member must: equal that when it is passed to the API.
-
-The values ename:VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO and
-ename:VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO are reserved for internal
-use by the loader, and do not have corresponding Vulkan structures in this
-Specification.
-
-Structure types supported by the Vulkan API include:
-
-include::{generated}/api/enums/VkStructureType.txt[]
---
diff --git a/registry/vulkan/chapters/fxvertex.txt b/registry/vulkan/chapters/fxvertex.txt
deleted file mode 100644
index 9cecf97..0000000
--- a/registry/vulkan/chapters/fxvertex.txt
+++ /dev/null
@@ -1,925 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[fxvertex]]
-= Fixed-Function Vertex Processing
-
-Vertex fetching is controlled via configurable state, as a logically
-distinct graphics pipeline stage.
-
-
-[[fxvertex-attrib]]
-== Vertex Attributes
-
-Vertex shaders can: define input variables, which receive _vertex attribute_
-data transferred from one or more sname:VkBuffer(s) by drawing commands.
-Vertex shader input variables are bound to buffers via an indirect binding
-where the vertex shader associates a _vertex input attribute_ number with
-each variable, vertex input attributes are associated to _vertex input
-bindings_ on a per-pipeline basis, and vertex input bindings are associated
-with specific buffers on a per-draw basis via the
-fname:vkCmdBindVertexBuffers command.
-Vertex input attribute and vertex input binding descriptions also contain
-format information controlling how data is extracted from buffer memory and
-converted to the format expected by the vertex shader.
-
-There are sname:VkPhysicalDeviceLimits::pname:maxVertexInputAttributes
-number of vertex input attributes and
-sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings number of vertex
-input bindings (each referred to by zero-based indices), where there are at
-least as many vertex input attributes as there are vertex input bindings.
-Applications can: store multiple vertex input attributes interleaved in a
-single buffer, and use a single vertex input binding to access those
-attributes.
-
-In GLSL, vertex shaders associate input variables with a vertex input
-attribute number using the code:location layout qualifier.
-The code:component layout qualifier associates components of a vertex shader
-input variable with components of a vertex input attribute.
-
-.GLSL example
-[source,glsl]
----------------------------------------------------
-// Assign location M to variableName
-layout (location=M, component=2) in vec2 variableName;
-
-// Assign locations [N,N+L) to the array elements of variableNameArray
-layout (location=N) in vec4 variableNameArray[L];
----------------------------------------------------
-
-In SPIR-V, vertex shaders associate input variables with a vertex input
-attribute number using the code:Location decoration.
-The code:Component decoration associates components of a vertex shader input
-variable with components of a vertex input attribute.
-The code:Location and code:Component decorations are specified via the
-code:OpDecorate instruction.
-
-.SPIR-V example
-[source,spirv]
----------------------------------------------------
-               ...
-          %1 = OpExtInstImport "GLSL.std.450"
-               ...
-               OpName %9 "variableName"
-               OpName %15 "variableNameArray"
-               OpDecorate %18 BuiltIn VertexIndex
-               OpDecorate %19 BuiltIn InstanceIndex
-               OpDecorate %9 Location M
-               OpDecorate %9 Component 2
-               OpDecorate %15 Location N
-               ...
-          %2 = OpTypeVoid
-          %3 = OpTypeFunction %2
-          %6 = OpTypeFloat 32
-          %7 = OpTypeVector %6 2
-          %8 = OpTypePointer Input %7
-          %9 = OpVariable %8 Input
-         %10 = OpTypeVector %6 4
-         %11 = OpTypeInt 32 0
-         %12 = OpConstant %11 L
-         %13 = OpTypeArray %10 %12
-         %14 = OpTypePointer Input %13
-         %15 = OpVariable %14 Input
-               ...
----------------------------------------------------
-
-
-[[fxvertex-attrib-location]]
-=== Attribute Location and Component Assignment
-
-Vertex shaders allow code:Location and code:Component decorations on input
-variable declarations.
-The code:Location decoration specifies which vertex input attribute is used
-to read and interpret the data that a variable will consume.
-The code:Component decoration allows the location to be more finely
-specified for scalars and vectors, down to the individual components within
-a location that are consumed.
-The components within a location are 0, 1, 2, and 3.
-A variable starting at component N will consume components N, N+1, N+2, ...
-up through its size.
-For single precision types, it is invalid if the sequence of components gets
-larger than 3.
-
-When a vertex shader input variable declared using a 16- or 32-bit scalar or
-vector data type is assigned a location, its value(s) are taken from the
-components of the input attribute specified with the corresponding
-sname:VkVertexInputAttributeDescription::pname:location.
-The components used depend on the type of variable and the code:Component
-decoration specified in the variable declaration, as identified in
-<<fxvertex-attrib-components>>.
-Any 16-bit or 32-bit scalar or vector input will consume a single location.
-For 16-bit and 32-bit data types, missing components are filled in with
-default values as described <<fxvertex-input-extraction,below>>.
-
-
-[[fxvertex-attrib-components]]
-.Input attribute components accessed by 16-bit and 32-bit input variables
-[width="65%",cols="<5,<3,<3",options="header"]
-|====
-| 16-bit or 32-bit data type | code:Component decoration | Components consumed
-| scalar                     | 0 or unspecified             | (x, o, o, o)
-| scalar                     | 1                            | (o, y, o, o)
-| scalar                     | 2                            | (o, o, z, o)
-| scalar                     | 3                            | (o, o, o, w)
-| two-component vector       | 0 or unspecified             | (x, y, o, o)
-| two-component vector       | 1                            | (o, y, z, o)
-| two-component vector       | 2                            | (o, o, z, w)
-| three-component vector     | 0 or unspecified             | (x, y, z, o)
-| three-component vector     | 1                            | (o, y, z, w)
-| four-component vector      | 0 or unspecified             | (x, y, z, w)
-|====
-
-Components indicated by "`o`" are available for use by other input variables
-which are sourced from the same attribute, and if used, are either filled
-with the corresponding component from the input format (if present), or the
-default value.
-
-When a vertex shader input variable declared using a 32-bit floating point
-matrix type is assigned a location _i_, its values are taken from
-consecutive input attributes starting with the corresponding
-sname:VkVertexInputAttributeDescription::pname:location.
-Such matrices are treated as an array of column vectors with values taken
-from the input attributes identified in <<fxvertex-attrib-matrix>>.
-The sname:VkVertexInputAttributeDescription::pname:format must: be specified
-with a elink:VkFormat that corresponds to the appropriate type of column
-vector.
-The code:Component decoration must: not be used with matrix types.
-
-[[fxvertex-attrib-matrix]]
-.Input attributes accessed by 32-bit input matrix variables
-[width="100%",cols="<10%,<24%,<21%,<45%",options="header"]
-|====
-| Data type     | Column vector type        | Locations consumed    | Components consumed
-| mat2          | two-component vector      | i, i+1                | (x, y, o, o), (x, y, o, o)
-| mat2x3        | three-component vector    | i, i+1                | (x, y, z, o), (x, y, z, o)
-| mat2x4        | four-component vector     | i, i+1                | (x, y, z, w), (x, y, z, w)
-| mat3x2        | two-component vector      | i, i+1, i+2           | (x, y, o, o), (x, y, o, o), (x, y, o, o)
-| mat3          | three-component vector    | i, i+1, i+2           | (x, y, z, o), (x, y, z, o), (x, y, z, o)
-| mat3x4        | four-component vector     | i, i+1, i+2           | (x, y, z, w), (x, y, z, w), (x, y, z, w)
-| mat4x2        | two-component vector      | i, i+1, i+2, i+3      | (x, y, o, o), (x, y, o, o), (x, y, o, o), (x, y, o, o)
-| mat4x3        | three-component vector    | i, i+1, i+2, i+3      | (x, y, z, o), (x, y, z, o), (x, y, z, o), (x, y, z, o)
-| mat4          | four-component vector     | i, i+1, i+2, i+3      | (x, y, z, w), (x, y, z, w), (x, y, z, w), (x, y, z, w)
-|====
-
-Components indicated by "`o`" are available for use by other input variables
-which are sourced from the same attribute, and if used, are either filled
-with the corresponding component from the input (if present), or the default
-value.
-
-When a vertex shader input variable declared using a scalar or vector 64-bit
-data type is assigned a location _i_, its values are taken from consecutive
-input attributes starting with the corresponding
-sname:VkVertexInputAttributeDescription::pname:location.
-The locations and components used depend on the type of variable and the
-code:Component decoration specified in the variable declaration, as
-identified in <<fxvertex-attrib-double>>.
-For 64-bit data types, no default attribute values are provided.
-Input variables must: not use more components than provided by the
-attribute.
-Input attributes which have one- or two-component 64-bit formats will
-consume a single location.
-Input attributes which have three- or four-component 64-bit formats will
-consume two consecutive locations.
-A 64-bit scalar data type will consume two components, and a 64-bit
-two-component vector data type will consume all four components available
-within a location.
-A three- or four-component 64-bit data type must: not specify a component.
-A three-component 64-bit data type will consume all four components of the
-first location and components 0 and 1 of the second location.
-This leaves components 2 and 3 available for other component-qualified
-declarations.
-A four-component 64-bit data type will consume all four components of the
-first location and all four components of the second location.
-It is invalid for a scalar or two-component 64-bit data type to specify a
-component of 1 or 3.
-
-[[fxvertex-attrib-double]]
-.Input attribute locations and components accessed by 64-bit input variables
-[width="100%",cols="<18%,^12%,<25%,^14%,^18%,<13%",options="header"]
-|====
-^.^| Input format | Locations consumed
-        ^.^| 64-bit data type   |code:Location decoration |code:Component decoration ^| 32-bit components consumed
-| R64          | i
-        | scalar                  | i                         | 0 or unspecified           | (x, y, -, -)
-.3+<.^| R64G64 .3+^.^| i
-        | scalar                  | i                         | 0 or unspecified           | (x, y, o, o)
-        | scalar                  | i                         | 2                          | (o, o, z, w)
-        | two-component vector    | i                         | 0 or unspecified           | (x, y, z, w)
-.5+<.^| R64G64B64 .5+^.^| i, i+1
-        | scalar                  | i                         | 0 or unspecified           | (x, y, o, o), (o, o, -, -)
-        | scalar                  | i                         | 2                          | (o, o, z, w), (o, o, -, -)
-        | scalar                  | i+1                       | 0 or unspecified           | (o, o, o, o), (x, y, -, -)
-        | two-component vector    | i                         | 0 or unspecified           | (x, y, z, w), (o, o, -, -)
-        | three-component vector  | i                         | unspecified                | (x, y, z, w), (x, y, -, -)
-.8+<.^| R64G64B64A64 .8+^.^| i, i+1
-        | scalar                  | i                         | 0 or unspecified           | (x, y, o, o), (o, o, o, o)
-        | scalar                  | i                         | 2                          | (o, o, z, w), (o, o, o, o)
-        | scalar                  | i+1                       | 0 or unspecified           | (o, o, o, o), (x, y, o, o)
-        | scalar                  | i+1                       | 2                          | (o, o, o, o), (o, o, z, w)
-        | two-component vector    | i                         | 0 or unspecified           | (x, y, z, w), (o, o, o, o)
-        | two-component vector    | i+1                       | 0 or unspecified           | (o, o, o, o), (x, y, z, w)
-        | three-component vector  | i                         | unspecified                | (x, y, z, w), (x, y, o, o)
-        | four-component vector   | i                         | unspecified                | (x, y, z, w), (x, y, z, w)
-|====
-
-Components indicated by "`o`" are available for use by other input variables
-which are sourced from the same attribute.
-Components indicated by "`-`" are not available for input variables as there
-are no default values provided for 64-bit data types, and there is no data
-provided by the input format.
-
-When a vertex shader input variable declared using a 64-bit floating-point
-matrix type is assigned a location _i_, its values are taken from
-consecutive input attribute locations.
-Such matrices are treated as an array of column vectors with values taken
-from the input attributes as shown in <<fxvertex-attrib-double>>.
-Each column vector starts at the location immediately following the last
-location of the previous column vector.
-The number of attributes and components assigned to each matrix is
-determined by the matrix dimensions and ranges from two to eight locations.
-
-When a vertex shader input variable declared using an array type is assigned
-a location, its values are taken from consecutive input attributes starting
-with the corresponding
-sname:VkVertexInputAttributeDescription::pname:location.
-The number of attributes and components assigned to each element are
-determined according to the data type of the array elements and
-code:Component decoration (if any) specified in the declaration of the
-array, as described above.
-Each element of the array, in order, is assigned to consecutive locations,
-but all at the same specified component within each location.
-
-Only input variables declared with the data types and component decorations
-as specified above are supported.
-_Location aliasing_ is causing two variables to have the same location
-number.
-_Component aliasing_ is assigning the same (or overlapping) component number
-for two location aliases.
-Location aliasing is allowed only if it does not cause component aliasing.
-Further, when location aliasing, the aliases sharing the location must: all
-have the same SPIR-V floating-point component type or all have the same
-width integer-type components.
-
-
-[[fxvertex-input]]
-== Vertex Input Description
-
-Applications specify vertex input attribute and vertex input binding
-descriptions as part of graphics pipeline creation by setting the
-slink:VkGraphicsPipelineCreateInfo::pname:pVertexInputState pointer to a
-slink:VkPipelineVertexInputStateCreateInfo structure.
-ifdef::VK_EXT_vertex_input_dynamic_state[]
-Alternatively, if the graphics pipeline is created with the
-ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT dynamic state enabled, then the
-vertex input attribute and vertex input binding descriptions are specified
-dynamically with flink:vkCmdSetVertexInputEXT, and the
-slink:VkGraphicsPipelineCreateInfo::pname:pVertexInputState pointer is
-ignored.
-endif::VK_EXT_vertex_input_dynamic_state[]
-
-[open,refpage='VkPipelineVertexInputStateCreateInfo',desc='Structure specifying parameters of a newly created pipeline vertex input state',type='structs']
---
-The sname:VkPipelineVertexInputStateCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkPipelineVertexInputStateCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:vertexBindingDescriptionCount is the number of vertex binding
-    descriptions provided in pname:pVertexBindingDescriptions.
-  * pname:pVertexBindingDescriptions is a pointer to an array of
-    sname:VkVertexInputBindingDescription structures.
-  * pname:vertexAttributeDescriptionCount is the number of vertex attribute
-    descriptions provided in pname:pVertexAttributeDescriptions.
-  * pname:pVertexAttributeDescriptions is a pointer to an array of
-    sname:VkVertexInputAttributeDescription structures.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineVertexInputStateCreateInfo-vertexBindingDescriptionCount-00613]]
-    pname:vertexBindingDescriptionCount must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
-  * [[VUID-VkPipelineVertexInputStateCreateInfo-vertexAttributeDescriptionCount-00614]]
-    pname:vertexAttributeDescriptionCount must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputAttributes
-  * [[VUID-VkPipelineVertexInputStateCreateInfo-binding-00615]]
-    For every pname:binding specified by each element of
-    pname:pVertexAttributeDescriptions, a
-    sname:VkVertexInputBindingDescription must: exist in
-    pname:pVertexBindingDescriptions with the same value of pname:binding
-  * [[VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-00616]]
-    All elements of pname:pVertexBindingDescriptions must: describe distinct
-    binding numbers
-  * [[VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-00617]]
-    All elements of pname:pVertexAttributeDescriptions must: describe
-    distinct attribute locations
-****
-
-include::{generated}/validity/structs/VkPipelineVertexInputStateCreateInfo.txt[]
---
-
-[open,refpage='VkPipelineVertexInputStateCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineVertexInputStateCreateFlags.txt[]
-
-tname:VkPipelineVertexInputStateCreateFlags is a bitmask type for setting a
-mask, but is currently reserved for future use.
---
-
-[open,refpage='VkVertexInputBindingDescription',desc='Structure specifying vertex input binding description',type='structs']
---
-Each vertex input binding is specified by the
-sname:VkVertexInputBindingDescription structure, defined as:
-
-include::{generated}/api/structs/VkVertexInputBindingDescription.txt[]
-
-  * pname:binding is the binding number that this structure describes.
-  * pname:stride is the byte stride between consecutive elements within the
-    buffer.
-  * pname:inputRate is a elink:VkVertexInputRate value specifying whether
-    vertex attribute addressing is a function of the vertex index or of the
-    instance index.
-
-.Valid Usage
-****
-  * [[VUID-VkVertexInputBindingDescription-binding-00618]]
-    pname:binding must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
-  * [[VUID-VkVertexInputBindingDescription-stride-00619]]
-    pname:stride must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindingStride
-ifdef::VK_KHR_portability_subset[]
-  * [[VUID-VkVertexInputBindingDescription-stride-04456]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled,
-    pname:stride must: be a multiple of, and at least as large as,
-    slink:VkPhysicalDevicePortabilitySubsetPropertiesKHR::pname:minVertexInputBindingStrideAlignment
-endif::VK_KHR_portability_subset[]
-****
-
-include::{generated}/validity/structs/VkVertexInputBindingDescription.txt[]
---
-
-[open,refpage='VkVertexInputRate',desc='Specify rate at which vertex attributes are pulled from buffers',type='enums']
---
-Possible values of slink:VkVertexInputBindingDescription::pname:inputRate,
-specifying the rate at which vertex attributes are pulled from buffers, are:
-
-include::{generated}/api/enums/VkVertexInputRate.txt[]
-
-  * ename:VK_VERTEX_INPUT_RATE_VERTEX specifies that vertex attribute
-    addressing is a function of the vertex index.
-  * ename:VK_VERTEX_INPUT_RATE_INSTANCE specifies that vertex attribute
-    addressing is a function of the instance index.
---
-
-[open,refpage='VkVertexInputAttributeDescription',desc='Structure specifying vertex input attribute description',type='structs']
---
-Each vertex input attribute is specified by the
-sname:VkVertexInputAttributeDescription structure, defined as:
-
-include::{generated}/api/structs/VkVertexInputAttributeDescription.txt[]
-
-  * pname:location is the shader input location number for this attribute.
-  * pname:binding is the binding number which this attribute takes its data
-    from.
-  * pname:format is the size and type of the vertex attribute data.
-  * pname:offset is a byte offset of this attribute relative to the start of
-    an element in the vertex input binding.
-
-.Valid Usage
-****
-  * [[VUID-VkVertexInputAttributeDescription-location-00620]]
-    pname:location must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputAttributes
-  * [[VUID-VkVertexInputAttributeDescription-binding-00621]]
-    pname:binding must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
-  * [[VUID-VkVertexInputAttributeDescription-offset-00622]]
-    pname:offset must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputAttributeOffset
-  * [[VUID-VkVertexInputAttributeDescription-format-00623]]
-    pname:format must: be allowed as a vertex buffer format, as specified by
-    the ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT flag in
-    sname:VkFormatProperties::pname:bufferFeatures returned by
-    fname:vkGetPhysicalDeviceFormatProperties
-ifdef::VK_KHR_portability_subset[]
-  * [[VUID-VkVertexInputAttributeDescription-vertexAttributeAccessBeyondStride-04457]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:vertexAttributeAccessBeyondStride
-    is ename:VK_FALSE, the sum of pname:offset plus the size of the vertex
-    attribute data described by pname:format must: not be greater than
-    pname:stride in the slink:VkVertexInputBindingDescription referenced in
-    pname:binding
-endif::VK_KHR_portability_subset[]
-****
-
-include::{generated}/validity/structs/VkVertexInputAttributeDescription.txt[]
---
-
-ifdef::VK_EXT_vertex_input_dynamic_state[]
-[open,refpage='vkCmdSetVertexInputEXT',desc='Set the vertex input state dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the vertex input attribute
-and vertex input binding descriptions, call:
-
-include::{generated}/api/protos/vkCmdSetVertexInputEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:vertexBindingDescriptionCount is the number of vertex binding
-    descriptions provided in pname:pVertexBindingDescriptions.
-  * pname:pVertexBindingDescriptions is a pointer to an array of
-    sname:VkVertexInputBindingDescription2EXT structures.
-  * pname:vertexAttributeDescriptionCount is the number of vertex attribute
-    descriptions provided in pname:pVertexAttributeDescriptions.
-  * pname:pVertexAttributeDescriptions is a pointer to an array of
-    sname:VkVertexInputAttributeDescription2EXT structures.
-
-This command sets the vertex input attribute and vertex input binding
-descriptions state for subsequent drawing commands when the graphics
-pipeline is created with ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkGraphicsPipelineCreateInfo::pname:pVertexInputState values used to
-create the currently active pipeline.
-
-ifdef::VK_EXT_extended_dynamic_state[]
-If the bound pipeline state object was also created with the
-ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT dynamic state
-enabled, then flink:vkCmdBindVertexBuffers2EXT can be used instead of
-fname:vkCmdSetVertexInputEXT to dynamically set the stride.
-endif::VK_EXT_extended_dynamic_state[]
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetVertexInputEXT-None-04790]]
-    The <<features-vertexInputDynamicState, vertexInputDynamicState>>
-    feature must: be enabled
-  * [[VUID-vkCmdSetVertexInputEXT-vertexBindingDescriptionCount-04791]]
-    pname:vertexBindingDescriptionCount must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
-  * [[VUID-vkCmdSetVertexInputEXT-vertexAttributeDescriptionCount-04792]]
-    pname:vertexAttributeDescriptionCount must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputAttributes
-  * [[VUID-vkCmdSetVertexInputEXT-binding-04793]]
-    For every pname:binding specified by each element of
-    pname:pVertexAttributeDescriptions, a
-    sname:VkVertexInputBindingDescription2EXT must: exist in
-    pname:pVertexBindingDescriptions with the same value of pname:binding
-  * [[VUID-vkCmdSetVertexInputEXT-pVertexBindingDescriptions-04794]]
-    All elements of pname:pVertexBindingDescriptions must: describe distinct
-    binding numbers
-  * [[VUID-vkCmdSetVertexInputEXT-pVertexAttributeDescriptions-04795]]
-    All elements of pname:pVertexAttributeDescriptions must: describe
-    distinct attribute locations
-****
-
-include::{generated}/validity/protos/vkCmdSetVertexInputEXT.txt[]
---
-
-[open,refpage='VkVertexInputBindingDescription2EXT',desc='Structure specifying the extended vertex input binding description',type='structs']
---
-The sname:VkVertexInputBindingDescription2EXT structure is defined as:
-
-include::{generated}/api/structs/VkVertexInputBindingDescription2EXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:binding is the binding number that this structure describes.
-  * pname:stride is the byte stride between consecutive elements within the
-    buffer.
-  * pname:inputRate is a elink:VkVertexInputRate value specifying whether
-    vertex attribute addressing is a function of the vertex index or of the
-    instance index.
-ifdef::VK_EXT_vertex_attribute_divisor[]
-  * pname:divisor is the number of successive instances that will use the
-    same value of the vertex attribute when instanced rendering is enabled.
-    This member can: be set to a value other than `1` if the
-    <<features-vertexAttributeInstanceRateDivisor,
-    vertexAttributeInstanceRateDivisor>> feature is enabled.
-    For example, if the divisor is N, the same vertex attribute will be
-    applied to N successive instances before moving on to the next vertex
-    attribute.
-    The maximum value of pname:divisor is implementation-dependent and can
-    be queried using
-    sname:VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::pname:maxVertexAttribDivisor.
-    A value of `0` can: be used for the divisor if the
-    <<features-vertexAttributeInstanceRateZeroDivisor,pname:vertexAttributeInstanceRateZeroDivisor>>
-    feature is enabled.
-    In this case, the same vertex attribute will be applied to all
-    instances.
-endif::VK_EXT_vertex_attribute_divisor[]
-ifndef::VK_EXT_vertex_attribute_divisor[]
-  * pname:divisor must: be set to `1`
-endif::VK_EXT_vertex_attribute_divisor[]
-
-.Valid Usage
-****
-  * [[VUID-VkVertexInputBindingDescription2EXT-binding-04796]]
-    pname:binding must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
-  * [[VUID-VkVertexInputBindingDescription2EXT-stride-04797]]
-    pname:stride must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindingStride
-  * [[VUID-VkVertexInputBindingDescription2EXT-divisor-04798]]
-    If the <<features-vertexAttributeInstanceRateZeroDivisor,
-    vertexAttributeInstanceRateZeroDivisor>> feature is not enabled,
-    pname:divisor must: not be `0`
-  * [[VUID-VkVertexInputBindingDescription2EXT-divisor-04799]]
-    If the <<features-vertexAttributeInstanceRateDivisor,
-    vertexAttributeInstanceRateDivisor>> feature is not enabled,
-    pname:divisor must: be `1`
-  * [[VUID-VkVertexInputBindingDescription2EXT-divisor-06226]]
-    pname:divisor must: be a value between `0` and
-    sname:VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::pname:maxVertexAttribDivisor,
-    inclusive
-  * [[VUID-VkVertexInputBindingDescription2EXT-divisor-06227]]
-    If pname:divisor is not `1` then pname:inputRate must: be of type
-    ename:VK_VERTEX_INPUT_RATE_INSTANCE
-****
-
-include::{generated}/validity/structs/VkVertexInputBindingDescription2EXT.txt[]
---
-
-[open,refpage='VkVertexInputAttributeDescription2EXT',desc='Structure specifying the extended vertex input attribute description',type='structs']
---
-The sname:VkVertexInputAttributeDescription2EXT structure is defined as:
-
-include::{generated}/api/structs/VkVertexInputAttributeDescription2EXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:location is the shader input location number for this attribute.
-  * pname:binding is the binding number which this attribute takes its data
-    from.
-  * pname:format is the size and type of the vertex attribute data.
-  * pname:offset is a byte offset of this attribute relative to the start of
-    an element in the vertex input binding.
-
-.Valid Usage
-****
-  * [[VUID-VkVertexInputAttributeDescription2EXT-location-06228]]
-    pname:location must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputAttributes
-  * [[VUID-VkVertexInputAttributeDescription2EXT-binding-06229]]
-    pname:binding must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
-  * [[VUID-VkVertexInputAttributeDescription2EXT-offset-06230]]
-    pname:offset must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputAttributeOffset
-  * [[VUID-VkVertexInputAttributeDescription2EXT-format-04805]]
-    pname:format must: be allowed as a vertex buffer format, as specified by
-    the ename:VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT flag in
-    sname:VkFormatProperties::pname:bufferFeatures returned by
-    fname:vkGetPhysicalDeviceFormatProperties
-ifdef::VK_KHR_portability_subset[]
-  * [[VUID-VkVertexInputAttributeDescription2EXT-vertexAttributeAccessBeyondStride-04806]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:vertexAttributeAccessBeyondStride
-    is ename:VK_FALSE, the sum of pname:offset plus the size of the vertex
-    attribute data described by pname:format must: not be greater than
-    pname:stride in the slink:VkVertexInputBindingDescription2EXT referenced
-    in pname:binding
-endif::VK_KHR_portability_subset[]
-****
-
-include::{generated}/validity/structs/VkVertexInputAttributeDescription2EXT.txt[]
---
-endif::VK_EXT_vertex_input_dynamic_state[]
-
-[open,refpage='vkCmdBindVertexBuffers',desc='Bind vertex buffers to a command buffer',type='protos']
---
-To bind vertex buffers to a command buffer for use in subsequent drawing
-commands, call:
-
-include::{generated}/api/protos/vkCmdBindVertexBuffers.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:firstBinding is the index of the first vertex input binding whose
-    state is updated by the command.
-  * pname:bindingCount is the number of vertex input bindings whose state is
-    updated by the command.
-  * pname:pBuffers is a pointer to an array of buffer handles.
-  * pname:pOffsets is a pointer to an array of buffer offsets.
-
-The values taken from elements [eq]#i# of pname:pBuffers and pname:pOffsets
-replace the current state for the vertex input binding
-[eq]#pname:firstBinding {plus} i#, for [eq]#i# in [eq]#[0,
-pname:bindingCount)#.
-The vertex input binding is updated to start at the offset indicated by
-pname:pOffsets[i] from the start of the buffer pname:pBuffers[i].
-All vertex input attributes that use each of these bindings will use these
-updated addresses in their address calculations for subsequent drawing
-commands.
-ifdef::VK_EXT_robustness2[]
-If the <<features-nullDescriptor,nullDescriptor>> feature is enabled,
-elements of pname:pBuffers can: be dlink:VK_NULL_HANDLE, and can: be used by
-the vertex shader.
-If a vertex input attribute is bound to a vertex input binding that is
-dlink:VK_NULL_HANDLE, the values taken from memory are considered to be
-zero, and missing G, B, or A components are
-<<fxvertex-input-extraction,filled with [eq]#(0,0,1)#>>.
-endif::VK_EXT_robustness2[]
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBindVertexBuffers-firstBinding-00624]]
-    pname:firstBinding must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
-  * [[VUID-vkCmdBindVertexBuffers-firstBinding-00625]]
-    The sum of pname:firstBinding and pname:bindingCount must: be less than
-    or equal to sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
-  * [[VUID-vkCmdBindVertexBuffers-pOffsets-00626]]
-    All elements of pname:pOffsets must: be less than the size of the
-    corresponding element in pname:pBuffers
-  * [[VUID-vkCmdBindVertexBuffers-pBuffers-00627]]
-    All elements of pname:pBuffers must: have been created with the
-    ename:VK_BUFFER_USAGE_VERTEX_BUFFER_BIT flag
-  * [[VUID-vkCmdBindVertexBuffers-pBuffers-00628]]
-    Each element of pname:pBuffers that is non-sparse must: be bound
-    completely and contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-vkCmdBindVertexBuffers-pBuffers-04001]]
-    If the <<features-nullDescriptor,nullDescriptor>> feature is not
-    enabled, all elements of pname:pBuffers must: not be
-    dlink:VK_NULL_HANDLE
-ifdef::VK_EXT_robustness2[]
-  * [[VUID-vkCmdBindVertexBuffers-pBuffers-04002]]
-    If an element of pname:pBuffers is dlink:VK_NULL_HANDLE, then the
-    corresponding element of pname:pOffsets must: be zero
-endif::VK_EXT_robustness2[]
-****
-
-include::{generated}/validity/protos/vkCmdBindVertexBuffers.txt[]
---
-
-ifdef::VK_EXT_extended_dynamic_state[]
-[open,refpage='vkCmdBindVertexBuffers2EXT',desc='Bind vertex buffers to a command buffer and dynamically set strides',type='protos']
---
-Alternatively, to bind vertex buffers, along with their sizes and strides,
-to a command buffer for use in subsequent drawing commands, call:
-
-include::{generated}/api/protos/vkCmdBindVertexBuffers2EXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:firstBinding is the index of the first vertex input binding whose
-    state is updated by the command.
-  * pname:bindingCount is the number of vertex input bindings whose state is
-    updated by the command.
-  * pname:pBuffers is a pointer to an array of buffer handles.
-  * pname:pOffsets is a pointer to an array of buffer offsets.
-  * pname:pSizes is `NULL` or a pointer to an array of the size in bytes of
-    vertex data bound from pname:pBuffers.
-  * pname:pStrides is `NULL` or a pointer to an array of buffer strides.
-
-The values taken from elements [eq]#i# of pname:pBuffers and pname:pOffsets
-replace the current state for the vertex input binding
-[eq]#pname:firstBinding {plus} i#, for [eq]#i# in [eq]#[0,
-pname:bindingCount)#.
-The vertex input binding is updated to start at the offset indicated by
-pname:pOffsets[i] from the start of the buffer pname:pBuffers[i].
-If pname:pSizes is not `NULL` then pname:pSizes[i] specifies the bound size
-of the vertex buffer starting from the corresponding elements of
-pname:pBuffers[i] plus pname:pOffsets[i].
-All vertex input attributes that use each of these bindings will use these
-updated addresses in their address calculations for subsequent drawing
-commands.
-ifdef::VK_EXT_robustness2[]
-If the <<features-nullDescriptor,nullDescriptor>> feature is enabled,
-elements of pname:pBuffers can: be dlink:VK_NULL_HANDLE, and can: be used by
-the vertex shader.
-If a vertex input attribute is bound to a vertex input binding that is
-dlink:VK_NULL_HANDLE, the values taken from memory are considered to be
-zero, and missing G, B, or A components are
-<<fxvertex-input-extraction,filled with [eq]#(0,0,1)#>>.
-endif::VK_EXT_robustness2[]
-
-This command also <pipelines-dynamic-state, dynamically sets>> the byte
-strides between consecutive elements within buffer pname:pBuffers[i] to the
-corresponding pname:pStrides[i] value when the graphics pipeline is created
-with ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, strides are specified by the
-sname:VkVertexInputBindingDescription::pname:stride values used to create
-the currently active pipeline.
-
-ifdef::VK_EXT_vertex_input_dynamic_state[]
-If the bound pipeline state object was also created with the
-ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT dynamic state enabled then
-flink:vkCmdSetVertexInputEXT can: be used instead of
-fname:vkCmdBindVertexBuffers2EXT to set the stride.
-endif::VK_EXT_vertex_input_dynamic_state[]
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBindVertexBuffers2EXT-firstBinding-03355]]
-    pname:firstBinding must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
-  * [[VUID-vkCmdBindVertexBuffers2EXT-firstBinding-03356]]
-    The sum of pname:firstBinding and pname:bindingCount must: be less than
-    or equal to sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
-  * [[VUID-vkCmdBindVertexBuffers2EXT-pOffsets-03357]]
-    All elements of pname:pOffsets must: be less than the size of the
-    corresponding element in pname:pBuffers
-  * [[VUID-vkCmdBindVertexBuffers2EXT-pSizes-03358]]
-    If pname:pSizes is not `NULL`, all elements of pname:pOffsets plus
-    pname:pSizes must: be less than or equal to the size of the
-    corresponding element in pname:pBuffers
-  * [[VUID-vkCmdBindVertexBuffers2EXT-pBuffers-03359]]
-    All elements of pname:pBuffers must: have been created with the
-    ename:VK_BUFFER_USAGE_VERTEX_BUFFER_BIT flag
-  * [[VUID-vkCmdBindVertexBuffers2EXT-pBuffers-03360]]
-    Each element of pname:pBuffers that is non-sparse must: be bound
-    completely and contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-vkCmdBindVertexBuffers2EXT-pBuffers-04111]]
-    If the <<features-nullDescriptor,nullDescriptor>> feature is not
-    enabled, all elements of pname:pBuffers must: not be
-    dlink:VK_NULL_HANDLE
-ifdef::VK_EXT_robustness2[]
-  * [[VUID-vkCmdBindVertexBuffers2EXT-pBuffers-04112]]
-    If an element of pname:pBuffers is dlink:VK_NULL_HANDLE, then the
-    corresponding element of pname:pOffsets must: be zero
-endif::VK_EXT_robustness2[]
-  * [[VUID-vkCmdBindVertexBuffers2EXT-pStrides-03362]]
-    If pname:pStrides is not `NULL` each element of pname:pStrides must: be
-    less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindingStride
-  * [[VUID-vkCmdBindVertexBuffers2EXT-pStrides-06209]]
-    If pname:pStrides is not `NULL` each element of pname:pStrides must: 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
-    slink:VkVertexInputAttributeDescription::pname:offset plus
-    slink:VkVertexInputAttributeDescription::pname:format size
-****
-
-include::{generated}/validity/protos/vkCmdBindVertexBuffers2EXT.txt[]
---
-endif::VK_EXT_extended_dynamic_state[]
-
-
-ifdef::VK_EXT_vertex_attribute_divisor[]
-
-[[fxvertex-attribute_divisor]]
-== Vertex Attribute Divisor in Instanced Rendering
-
-[open,refpage='VkPipelineVertexInputDivisorStateCreateInfoEXT',desc='Structure specifying vertex attributes assignment during instanced rendering',type='structs']
---
-If
-<<features-vertexAttributeInstanceRateDivisor,pname:vertexAttributeInstanceRateDivisor>>
-feature is enabled and the pname:pNext chain of
-slink:VkPipelineVertexInputStateCreateInfo includes a
-sname:VkPipelineVertexInputDivisorStateCreateInfoEXT structure, then that
-structure controls how vertex attributes are assigned to an instance when
-instanced rendering is enabled.
-
-The sname:VkPipelineVertexInputDivisorStateCreateInfoEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPipelineVertexInputDivisorStateCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:vertexBindingDivisorCount is the number of elements in the
-    pname:pVertexBindingDivisors array.
-  * pname:pVertexBindingDivisors is a pointer to an array of
-    sname:VkVertexInputBindingDivisorDescriptionEXT structures, which
-    specifies the divisor value for each binding.
-
-include::{generated}/validity/structs/VkPipelineVertexInputDivisorStateCreateInfoEXT.txt[]
---
-
-[open,refpage='VkVertexInputBindingDivisorDescriptionEXT',desc='Structure specifying a divisor used in instanced rendering',type='structs']
---
-The individual divisor values per binding are specified using the
-sname:VkVertexInputBindingDivisorDescriptionEXT structure which is defined
-as:
-
-include::{generated}/api/structs/VkVertexInputBindingDivisorDescriptionEXT.txt[]
-
-  * pname:binding is the binding number for which the divisor is specified.
-  * pname:divisor is the number of successive instances that will use the
-    same value of the vertex attribute when instanced rendering is enabled.
-    For example, if the divisor is N, the same vertex attribute will be
-    applied to N successive instances before moving on to the next vertex
-    attribute.
-    The maximum value of pname:divisor is implementation-dependent and can
-    be queried using
-    sname:VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::pname:maxVertexAttribDivisor.
-    A value of `0` can: be used for the divisor if the
-    <<features-vertexAttributeInstanceRateZeroDivisor,pname:vertexAttributeInstanceRateZeroDivisor>>
-    feature is enabled.
-    In this case, the same vertex attribute will be applied to all
-    instances.
-
-If this structure is not used to define a divisor value for an attribute,
-then the divisor has a logical default value of 1.
-
-.Valid Usage
-****
-  * [[VUID-VkVertexInputBindingDivisorDescriptionEXT-binding-01869]]
-    pname:binding must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxVertexInputBindings
-  * [[VUID-VkVertexInputBindingDivisorDescriptionEXT-vertexAttributeInstanceRateZeroDivisor-02228]]
-    If the pname:vertexAttributeInstanceRateZeroDivisor feature is not
-    enabled, pname:divisor must: not be `0`
-  * [[VUID-VkVertexInputBindingDivisorDescriptionEXT-vertexAttributeInstanceRateDivisor-02229]]
-    If the pname:vertexAttributeInstanceRateDivisor feature is not enabled,
-    pname:divisor must: be `1`
-  * [[VUID-VkVertexInputBindingDivisorDescriptionEXT-divisor-01870]]
-    pname:divisor must: be a value between `0` and
-    sname:VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::pname:maxVertexAttribDivisor,
-    inclusive
-  * [[VUID-VkVertexInputBindingDivisorDescriptionEXT-inputRate-01871]]
-    slink:VkVertexInputBindingDescription::pname:inputRate must: be of type
-    ename:VK_VERTEX_INPUT_RATE_INSTANCE for this pname:binding
-****
-
-include::{generated}/validity/structs/VkVertexInputBindingDivisorDescriptionEXT.txt[]
---
-
-endif::VK_EXT_vertex_attribute_divisor[]
-
-[[fxvertex-input-address-calculation]]
-== Vertex Input Address Calculation
-The address of each attribute for each code:vertexIndex and
-code:instanceIndex is calculated as follows:
-
-  * Let code:attribDesc be the member of
-    slink:VkPipelineVertexInputStateCreateInfo::pname:pVertexAttributeDescriptions
-    with sname:VkVertexInputAttributeDescription::pname:location equal to
-    the vertex input attribute number.
-  * Let code:bindingDesc be the member of
-    slink:VkPipelineVertexInputStateCreateInfo::pname:pVertexBindingDescriptions
-    with sname:VkVertexInputAttributeDescription::pname:binding equal to
-    code:attribDesc.binding.
-  * Let code:vertexIndex be the index of the vertex within the draw (a value
-    between pname:firstVertex and pname:firstVertex+pname:vertexCount for
-    fname:vkCmdDraw, or a value taken from the index buffer for
-    fname:vkCmdDrawIndexed), and let code:instanceIndex be the instance
-    number of the draw (a value between pname:firstInstance and
-    pname:firstInstance+pname:instanceCount).
-ifdef::VK_EXT_vertex_attribute_divisor[]
-  * Let code:divisor be the member of
-    slink:VkPipelineVertexInputDivisorStateCreateInfoEXT::pname:pVertexBindingDivisors
-    with sname:VkVertexInputBindingDivisorDescriptionEXT::pname:binding
-    equal to code:attribDesc.binding.
-endif::VK_EXT_vertex_attribute_divisor[]
-
-[source,c]
----------------------------------------------------
-bufferBindingAddress = buffer[binding].baseAddress + offset[binding];
-
-if (bindingDesc.inputRate == VK_VERTEX_INPUT_RATE_VERTEX)
-    vertexOffset = vertexIndex * bindingDesc.stride;
-else
-ifndef::VK_EXT_vertex_attribute_divisor[]
-    vertexOffset = instanceIndex * bindingDesc.stride;
-endif::VK_EXT_vertex_attribute_divisor[]
-ifdef::VK_EXT_vertex_attribute_divisor[]
-    if (divisor == 0)
-        vertexOffset = firstInstance * bindingDesc.stride;
-    else
-        vertexOffset = (firstInstance + ((instanceIndex - firstInstance) / divisor)) * bindingDesc.stride;
-endif::VK_EXT_vertex_attribute_divisor[]
-
-attribAddress = bufferBindingAddress + vertexOffset + attribDesc.offset;
----------------------------------------------------
-
-[[fxvertex-input-extraction]]
-=== Vertex Input Extraction
-For each attribute, raw data is extracted starting at `attribAddress` and is
-converted from the sname:VkVertexInputAttributeDescription's pname:format to
-either floating-point, unsigned integer, or signed integer based on the base
-type of the format; the base type of the format must: match the base type of
-the input variable in the shader.
-The input variable in the shader must: be declared as a 64-bit data type if
-and only if pname:format is a 64-bit data type.
-If pname:format is a packed format, `attribAddress` must: be a multiple of
-the size in bytes of the whole attribute data type as described in
-<<formats-packed,Packed Formats>>.
-Otherwise, `attribAddress` must: be a multiple of the size in bytes of the
-component type indicated by pname:format (see <<formats,Formats>>).
-For attributes that are not 64-bit data types, each component is converted
-to the format of the input variable based on its type and size (as defined
-in the <<formats-definition,Format Definition>> section for each
-elink:VkFormat), using the appropriate equations in <<fundamentals-fp16,
-16-Bit Floating-Point Numbers>>, <<fundamentals-fp11,Unsigned 11-Bit
-Floating-Point Numbers>>, <<fundamentals-fp10,Unsigned 10-Bit Floating-Point
-Numbers>>, <<fundamentals-fixedconv,Fixed-Point Data Conversion>>, and
-<<textures-sexp-RGB,Shared Exponent to RGB>>.
-Signed integer components smaller than 32 bits are sign-extended.
-Attributes that are not 64-bit data types are expanded to four components in
-the same way as described in <<textures-conversion-to-rgba,conversion to
-RGBA>>.
-The number of components in the vertex shader input variable need not
-exactly match the number of components in the format.
-If the vertex shader has fewer components, the extra components are
-discarded.
diff --git a/registry/vulkan/chapters/geometry.txt b/registry/vulkan/chapters/geometry.txt
deleted file mode 100644
index c1f497d..0000000
--- a/registry/vulkan/chapters/geometry.txt
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[geometry]]
-= Geometry Shading
-
-The geometry shader operates on a group of vertices and their associated
-data assembled from a single input primitive, and emits zero or more output
-primitives and the group of vertices and their associated data required for
-each output primitive.
-Geometry shading is enabled when a geometry shader is included in the
-pipeline.
-
-
-[[geometry-input]]
-== Geometry Shader Input Primitives
-
-Each geometry shader invocation has access to all vertices in the primitive
-(and their associated data), which are presented to the shader as an array
-of inputs.
-
-The input primitive type expected by the geometry shader is specified with
-an code:OpExecutionMode instruction in the geometry shader, and must: match
-the incoming primitive type specified by either the pipeline's
-<<drawing-primitive-topologies, primitive topology>> if tessellation is
-inactive, or the <<tessellation, tessellation mode>> if tessellation is
-active, as follows:
-
-  * An input primitive type of code:InputPoints must: only be used with a
-    pipeline topology of ename:VK_PRIMITIVE_TOPOLOGY_POINT_LIST, or with a
-    tessellation shader that specifies code:PointMode.
-    The input arrays always contain one element, as described by the
-    <<drawing-point-lists, point list topology>> or
-    <<tessellation-point-mode, tessellation in point mode>>.
-  * An input primitive type of code:InputLines must: only be used with a
-    pipeline topology of ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST or
-    ename:VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, or with a tessellation shader
-    specifying code:IsoLines that does not specify code:PointMode.
-    The input arrays always contain two elements, as described by the
-    <<drawing-line-lists, line list topology>> or <<drawing-line-strips,
-    line strip topology>>, or by <<tessellation-isoline-tessellation,
-    isoline tessellation>>.
-  * An input primitive type of code:InputLinesAdjacency must: only be used
-    when tessellation is inactive, with a pipeline topology of
-    ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY or
-    ename:VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY.
-    The input arrays always contain four elements, as described by the
-    <<drawing-line-lists-with-adjacency, line list with adjacency topology>>
-    or <<drawing-line-strips-with-adjacency, line strip with adjacency
-    topology>>.
-  * An input primitive type of code:Triangles must: only be used with a
-    pipeline topology of ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
-    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, or
-    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN; or with a tessellation shader
-    specifying code:Quads or code:Triangles that does not specify
-    code:PointMode.
-    The input arrays always contain three elements, as described by the
-    <<drawing-triangle-lists, triangle list topology>>,
-    <<drawing-triangle-strips, triangle strip topology>>, or
-    <<drawing-triangle-fans, triangle fan topology>>, or by
-    <<tessellation-triangle-tessellation, triangle>> or
-    <<tessellation-quad-tessellation, quad tessellation>>.
-    Vertices may: be in a different absolute order to that specified by the
-    topology, but must: adhere to the specified winding order.
-  * An input primitive type of code:InputTrianglesAdjacency must: only be
-    used when tessellation is inactive, with a pipeline topology of
-    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY or
-    ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY.
-    The input arrays always contain six elements, as described by the
-    <<drawing-triangle-lists-with-adjacency, triangle list with adjacency
-    topology>> or <<drawing-triangle-strips-with-adjacency, triangle strip
-    with adjacency topology>>.
-    Vertices may: be in a different absolute order to that specified by the
-    topology, but must: adhere to the specified winding order, and the
-    vertices making up the main primitive must: still occur at the first,
-    third, and fifth index.
-
-[[geometry-output]]
-== Geometry Shader Output Primitives
-
-A geometry shader generates primitives in one of three output modes: points,
-line strips, or triangle strips.
-The primitive mode is specified in the shader using an code:OpExecutionMode
-instruction with the code:OutputPoints, code:OutputLineStrip or
-code:OutputTriangleStrip modes, respectively.
-Each geometry shader must: include exactly one output primitive mode.
-
-The vertices output by the geometry shader are assembled into points, lines,
-or triangles based on the output primitive type and the resulting primitives
-are then further processed as described in <<primsrast>>.
-If the number of vertices emitted by the geometry shader is not sufficient
-to produce a single primitive, vertices corresponding to incomplete
-primitives are not processed by subsequent pipeline stages.
-The number of vertices output by the geometry shader is limited to a maximum
-count specified in the shader.
-
-The maximum output vertex count is specified in the shader using an
-code:OpExecutionMode instruction with the mode set to code:OutputVertices
-and the maximum number of vertices that will be produced by the geometry
-shader specified as a literal.
-Each geometry shader must: specify a maximum output vertex count.
-
-
-[[geometry-invocations]]
-== Multiple Invocations of Geometry Shaders
-
-Geometry shaders can: be invoked more than one time for each input
-primitive.
-This is known as _geometry shader instancing_ and is requested by including
-an code:OpExecutionMode instruction with code:mode specified as
-code:Invocations and the number of invocations specified as an integer
-literal.
-
-In this mode, the geometry shader will execute at least [eq]#n# times for
-each input primitive, where [eq]#n# is the number of invocations specified
-in the code:OpExecutionMode instruction.
-The instance number is available to each invocation as a built-in input
-using code:InvocationId.
-
-
-[[geometry-ordering]]
-== Geometry Shader Primitive Ordering
-
-Limited guarantees are provided for the relative ordering of primitives
-produced by a geometry shader, as they pertain to <<drawing-primitive-order,
-primitive order>>.
-
-  * For instanced geometry shaders, the output primitives generated from
-    each input primitive are passed to subsequent pipeline stages using the
-    invocation number to order the primitives, from least to greatest.
-  * All output primitives generated from a given input primitive are passed
-    to subsequent pipeline stages before any output primitives generated
-    from subsequent input primitives.
-
-
-ifdef::VK_NV_geometry_shader_passthrough[]
-[[geometry-passthrough]]
-== Geometry Shader Passthrough
-
-A geometry shader that uses the code:PassthroughNV decoration on a variable
-in its input interface is considered a _passthrough geometry shader_.
-Output primitives in a passthrough geometry shader must: have the same
-topology as the input primitive and are not produced by emitting vertices.
-The vertices of the output primitive have two different types of attributes,
-per-vertex and per-primitive.
-Geometry shader input variables with code:PassthroughNV decoration are
-considered to produce per-vertex outputs, where values for each output
-vertex are copied from the corresponding input vertex.
-Any built-in or user-defined geometry shader outputs are considered
-per-primitive in a passthrough geometry shader, where a single output value
-is copied to all output vertices.
-
-The remainder of this section details the usage of the code:PassthroughNV
-decoration and modifications to the interface matching rules when using
-passthrough geometry shaders.
-
-
-[[geometry-passthrough-passthrough]]
-=== code:PassthroughNV Decoration
-
-Decorating a geometry shader input variable with the code:PassthroughNV
-decoration indicates that values of this input are copied through to the
-corresponding vertex of the output primitive.
-Input variables and block members which do not have the code:PassthroughNV
-decoration are consumed by the geometry shader without being passed through
-to subsequent stages.
-
-The code:PassthroughNV decoration must: only be used within a geometry
-shader.
-
-Any variable decorated with code:PassthroughNV must: be declared using the
-code:Input storage class.
-
-The code:PassthroughNV decoration must: not be used with any of:
-
-  * an input primitive type other than code:InputPoints, code:InputLines, or
-    code:Triangles, as specified by the mode for code:OpExecutionMode.
-  * an invocation count other than one, as specified by the code:Invocations
-    mode for code:OpExecutionMode.
-  * an code:OpEntryPoint which statically uses the code:OpEmitVertex or
-    code:OpEndPrimitive instructions.
-  * a variable decorated with the code:InvocationId built-in decoration.
-  * a variable decorated with the code:PrimitiveId built-in decoration that
-    is declared using the code:Input storage class.
-
-
-[[geometry-passthrough-interface]]
-=== Passthrough Interface Matching
-
-When a passthrough geometry shader is in use, the
-<<interfaces-iointerfaces-matching,Interface Matching>> rules involving the
-geometry shader input and output interfaces operate as described in this
-section.
-
-For the purposes of matching passthrough geometry shader inputs with outputs
-of the previous pipeline stages, the code:PassthroughNV decoration is
-ignored.
-
-For the purposes of matching the outputs of the geometry shader with
-subsequent pipeline stages, each input variable with the code:PassthroughNV
-decoration is considered to add an equivalent output variable with the same
-type, decoration (other than code:PassthroughNV), number, and declaration
-order on the output interface.
-The output variable declaration corresponding to an input variable decorated
-with code:PassthroughNV will be identical to the input declaration, except
-that the outermost array dimension of such variables is removed.
-The output block declaration corresponding to an input block decorated with
-code:PassthroughNV or having members decorated with code:PassthroughNV will
-be identical to the input declaration, except that the outermost array
-dimension of such declaration is removed.
-
-If an input block is decorated with code:PassthroughNV, the equivalent
-output block contains all the members of the input block.
-Otherwise, the equivalent output block contains only those input block
-members decorated with code:PassthroughNV.
-All members of the corresponding output block are assigned code:Location and
-code:Component decorations identical to those assigned to the corresponding
-input block members.
-
-Output variables and blocks generated from inputs decorated with
-code:PassthroughNV will only exist for the purposes of interface matching;
-these declarations are not available to geometry shader code or listed in
-the module interface.
-
-For the purposes of component counting, passthrough geometry shaders count
-all statically used input variable components declared with the
-code:PassthroughNV decoration as output components as well, since their
-values will be copied to the output primitive produced by the geometry
-shader.
-
-endif::VK_NV_geometry_shader_passthrough[]
-
-
diff --git a/registry/vulkan/chapters/initialization.txt b/registry/vulkan/chapters/initialization.txt
deleted file mode 100644
index 59cd710..0000000
--- a/registry/vulkan/chapters/initialization.txt
+++ /dev/null
@@ -1,504 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[initialization]]
-= Initialization
-
-Before using Vulkan, an application must: initialize it by loading the
-Vulkan commands, and creating a sname:VkInstance object.
-
-
-[[initialization-functionpointers]]
-== Command Function Pointers
-
-Vulkan commands are not necessarily exposed by static linking on a platform.
-Commands to query function pointers for Vulkan commands are described below.
-
-[NOTE]
-.Note
-====
-When extensions are <<extendingvulkan-compatibility-promotion,promoted>> or
-otherwise incorporated into another extension or Vulkan core version,
-command <<extendingvulkan-compatibility-aliases,aliases>> may be included.
-Whilst the behavior of each command alias is identical, the behavior of
-retrieving each alias's function pointer is not.
-A function pointer for a given alias can only be retrieved if the extension
-or version that introduced that alias is supported and enabled, irrespective
-of whether any other alias is available.
-====
-
-[open,refpage='vkGetInstanceProcAddr',desc='Return a function pointer for a command',type='protos',xrefs='PFN_vkVoidFunction']
---
-Function pointers for all Vulkan commands can: be obtained with the command:
-
-include::{generated}/api/protos/vkGetInstanceProcAddr.txt[]
-
-  * pname:instance is the instance that the function pointer will be
-    compatible with, or `NULL` for commands not dependent on any instance.
-  * pname:pName is the name of the command to obtain.
-
-fname:vkGetInstanceProcAddr itself is obtained in a platform- and loader-
-specific manner.
-Typically, the loader library will export this command as a function symbol,
-so applications can: link against the loader library, or load it dynamically
-and look up the symbol using platform-specific APIs.
-
-The table below defines the various use cases for
-fname:vkGetInstanceProcAddr and expected return value ("`fp`" is "`function
-pointer`") for each case.
-A valid returned function pointer ("`fp`") must: not be `NULL`.
-
-The returned function pointer is of type tlink:PFN_vkVoidFunction, and must:
-be cast to the type of the command being queried before use.
-
-.fname:vkGetInstanceProcAddr behavior
-[width="80%",options="header"]
-|====
-| pname:instance   | pname:pName                                  | return value
-| *^1^             | `NULL`                                       | undefined:
-| invalid non-`NULL` instance | *^1^                              | undefined:
-ifdef::VK_VERSION_1_2[]
-| `NULL`           | flink:vkGetInstanceProcAddr                  | fp^5^
-endif::VK_VERSION_1_2[]
-| `NULL`           | _global command_^2^                          | fp
-| instance         | core _dispatchable command_                  | fp^3^
-| instance         | enabled instance extension dispatchable command for pname:instance    | fp^3^
-| instance         | available device extension^4^ dispatchable command for pname:instance | fp^3^
-2+|  any other case, not covered above                            | `NULL`
-|====
-
-1::
-    "*" means any representable value for the parameter (including valid
-    values, invalid values, and `NULL`).
-
-2::
-    The global commands are:
-ifdef::VK_VERSION_1_1[flink:vkEnumerateInstanceVersion,]
-    flink:vkEnumerateInstanceExtensionProperties,
-    flink:vkEnumerateInstanceLayerProperties, and flink:vkCreateInstance.
-    Dispatchable commands are all other commands which are not global.
-
-3::
-    The returned function pointer must: only be called with a dispatchable
-    object (the first parameter) that is pname:instance or a child of
-    pname:instance, e.g. slink:VkInstance, slink:VkPhysicalDevice,
-    slink:VkDevice, slink:VkQueue, or slink:VkCommandBuffer.
-
-4::
-    An "`available device extension`" is a device extension supported by any
-    physical device enumerated by pname:instance.
-
-ifdef::VK_VERSION_1_2[]
-5::
-    Starting with Vulkan 1.2, fname:vkGetInstanceProcAddr can resolve itself
-    with a `NULL` instance pointer.
-endif::VK_VERSION_1_2[]
-
-include::{generated}/validity/protos/vkGetInstanceProcAddr.txt[]
---
-
-[open,refpage='vkGetDeviceProcAddr',desc='Return a function pointer for a command',type='protos',xrefs='PFN_vkVoidFunction']
---
-In order to support systems with multiple Vulkan implementations, the
-function pointers returned by fname:vkGetInstanceProcAddr may: point to
-dispatch code that calls a different real implementation for different
-slink:VkDevice objects or their child objects.
-The overhead of the internal dispatch for slink:VkDevice objects can be
-avoided by obtaining device-specific function pointers for any commands that
-use a device or device-child object as their dispatchable object.
-Such function pointers can: be obtained with the command:
-
-include::{generated}/api/protos/vkGetDeviceProcAddr.txt[]
-
-The table below defines the various use cases for fname:vkGetDeviceProcAddr
-and expected return value ("`fp`" is "`function pointer`") for each case.
-A valid returned function pointer ("`fp`") must: not be `NULL`.
-
-The returned function pointer is of type tlink:PFN_vkVoidFunction, and must:
-be cast to the type of the command being queried before use.
-The function pointer must: only be called with a dispatchable object (the
-first parameter) that is pname:device or a child of pname:device.
-
-.fname:vkGetDeviceProcAddr behavior
-[width="80%",options="header"]
-|====
-| pname:device   | pname:pName                      | return value
-| `NULL`         | *^1^                             | undefined:
-| invalid device | *^1^                             | undefined:
-| device         | `NULL`                           | undefined:
-| device         | core device-level dispatchable command^2^ | fp^3^
-| device         | enabled extension device-level dispatchable command^2^ | fp^3^
-2+| any other case, not covered above               | `NULL`
-|====
-
-1::
-    "*" means any representable value for the parameter (including valid
-    values, invalid values, and `NULL`).
-
-2::
-    In this function, device-level excludes all physical-device-level
-    commands.
-
-3::
-    The returned function pointer must: only be called with a dispatchable
-    object (the first parameter) that is pname:device or a child of
-    pname:device e.g. slink:VkDevice, slink:VkQueue, or
-    slink:VkCommandBuffer.
-
-include::{generated}/validity/protos/vkGetDeviceProcAddr.txt[]
---
-
-[open,refpage='PFN_vkVoidFunction',desc='Placeholder function pointer type returned by queries',type='funcpointers',xrefs='vkGetDeviceProcAddr vkGetInstanceProcAddr']
---
-The definition of tlink:PFN_vkVoidFunction is:
-
-include::{generated}/api/funcpointers/PFN_vkVoidFunction.txt[]
---
-
-
-ifdef::VK_VERSION_1_1[]
-=== Extending Physical Device Core Functionality
-
-New core physical-device-level functionality can: be used when the
-physical-device version is greater than or equal to the version of Vulkan
-that added the new functionality.
-The Vulkan version supported by a physical device can: be obtained by
-calling flink:vkGetPhysicalDeviceProperties.
-endif::VK_VERSION_1_1[]
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-[[initialization-phys-dev-extensions]]
-=== Extending Physical Device From Device Extensions
-
-When the `apiext:VK_KHR_get_physical_device_properties2` extension is
-enabled,
-ifdef::VK_VERSION_1_1[]
-or when both the instance and the physical-device versions are at least 1.1,
-endif::VK_VERSION_1_1[]
-physical-device-level functionality of a device extension can: be used with
-a physical device if the corresponding extension is enumerated by
-flink:vkEnumerateDeviceExtensionProperties for that physical device, even
-before a logical device has been created.
-
-To obtain a function pointer for a physical-device-level command from a
-device extension, an application can: use flink:vkGetInstanceProcAddr.
-This function pointer may: point to dispatch code, which calls a different
-real implementation for different sname:VkPhysicalDevice objects.
-Applications must: not use a slink:VkPhysicalDevice in any command added by
-an extension or core version that is not supported by that physical device.
-
-Device extensions may: define structures that can: be added to the
-ptext:pNext chain of physical-device-level commands.
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-
-[[initialization-instances]]
-== Instances
-
-[open,refpage='VkInstance',desc='Opaque handle to an instance object',type='handles']
---
-There is no global state in Vulkan and all per-application state is stored
-in a sname:VkInstance object.
-Creating a sname:VkInstance object initializes the Vulkan library and allows
-the application to pass information about itself to the implementation.
-
-Instances are represented by sname:VkInstance handles:
-
-include::{generated}/api/handles/VkInstance.txt[]
---
-
-ifdef::VK_VERSION_1_1[]
-[open,refpage='vkEnumerateInstanceVersion',desc='Query instance-level version before instance creation',type='protos']
---
-To query the version of instance-level functionality supported by the
-implementation, call:
-
-include::{generated}/api/protos/vkEnumerateInstanceVersion.txt[]
-
-  * pname:pApiVersion is a pointer to a code:uint32_t, which is the version
-    of Vulkan supported by instance-level functionality, encoded as
-    described in <<extendingvulkan-coreversions-versionnumbers>>.
-
-[NOTE]
-.Note
-====
-The intended behaviour of flink:vkEnumerateInstanceVersion is that an
-implementation should: not need to perform memory allocations and should:
-unconditionally return ename:VK_SUCCESS.
-The loader, and any enabled layers, may: return
-ename:VK_ERROR_OUT_OF_HOST_MEMORY in the case of a failed memory allocation.
-====
-
-include::{generated}/validity/protos/vkEnumerateInstanceVersion.txt[]
---
-endif::VK_VERSION_1_1[]
-
-[open,refpage='vkCreateInstance',desc='Create a new Vulkan instance',type='protos']
---
-To create an instance object, call:
-
-include::{generated}/api/protos/vkCreateInstance.txt[]
-
-  * pname:pCreateInfo is a pointer to a slink:VkInstanceCreateInfo structure
-    controlling creation of the instance.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pInstance points a slink:VkInstance handle in which the resulting
-    instance is returned.
-
-fname:vkCreateInstance verifies that the requested layers exist.
-If not, fname:vkCreateInstance will return ename:VK_ERROR_LAYER_NOT_PRESENT.
-Next fname:vkCreateInstance verifies that the requested extensions are
-supported (e.g. in the implementation or in any enabled instance layer) and
-if any requested extension is not supported, fname:vkCreateInstance must:
-return ename:VK_ERROR_EXTENSION_NOT_PRESENT.
-After verifying and enabling the instance layers and extensions the
-sname:VkInstance object is created and returned to the application.
-If a requested extension is only supported by a layer, both the layer and
-the extension need to be specified at fname:vkCreateInstance time for the
-creation to succeed.
-
-.Valid Usage
-****
-  * [[VUID-vkCreateInstance-ppEnabledExtensionNames-01388]]
-    All <<extendingvulkan-extensions-extensiondependencies, required
-    extensions>> for each extension in the
-    slink:VkInstanceCreateInfo::pname:ppEnabledExtensionNames list must:
-    also be present in that list
-****
-
-include::{generated}/validity/protos/vkCreateInstance.txt[]
---
-
-[open,refpage='VkInstanceCreateInfo',desc='Structure specifying parameters of a newly created instance',type='structs']
---
-The sname:VkInstanceCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkInstanceCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:pApplicationInfo is `NULL` or a pointer to a
-    sname:VkApplicationInfo structure.
-    If not `NULL`, this information helps implementations recognize behavior
-    inherent to classes of applications.
-    slink:VkApplicationInfo is defined in detail below.
-  * pname:enabledLayerCount is the number of global layers to enable.
-  * pname:ppEnabledLayerNames is a pointer to an array of
-    pname:enabledLayerCount null-terminated UTF-8 strings containing the
-    names of layers to enable for the created instance.
-    The layers are loaded in the order they are listed in this array, with
-    the first array element being the closest to the application, and the
-    last array element being the closest to the driver.
-    See the <<extendingvulkan-layers>> section for further details.
-  * pname:enabledExtensionCount is the number of global extensions to
-    enable.
-  * pname:ppEnabledExtensionNames is a pointer to an array of
-    pname:enabledExtensionCount null-terminated UTF-8 strings containing the
-    names of extensions to enable.
-
-ifdef::VK_EXT_debug_report,VK_EXT_debug_utils[]
-To capture events that occur while creating or destroying an instance, an
-application can link a
-ifdef::VK_EXT_debug_report[]
-slink:VkDebugReportCallbackCreateInfoEXT structure
-ifdef::VK_EXT_debug_utils[]
-or a
-endif::VK_EXT_debug_utils[]
-endif::VK_EXT_debug_report[]
-ifdef::VK_EXT_debug_utils[]
-slink:VkDebugUtilsMessengerCreateInfoEXT structure
-endif::VK_EXT_debug_utils[]
-to the pname:pNext element of the sname:VkInstanceCreateInfo structure given
-to fname:vkCreateInstance.
-This callback is only valid for the duration of the flink:vkCreateInstance
-and the flink:vkDestroyInstance call.
-Use
-ifdef::VK_EXT_debug_report[]
-flink:vkCreateDebugReportCallbackEXT
-ifdef::VK_EXT_debug_utils[]
-or
-endif::VK_EXT_debug_utils[]
-endif::VK_EXT_debug_report[]
-ifdef::VK_EXT_debug_utils[]
-flink:vkCreateDebugUtilsMessengerEXT
-endif::VK_EXT_debug_utils[]
-to create persistent callback objects.
-
-.Valid Usage
-****
-ifdef::VK_EXT_debug_report[]
-  * [[VUID-VkInstanceCreateInfo-pNext-04925]]
-    If the pname:pNext chain of sname:VkInstanceCreateInfo includes a
-    sname:VkDebugReportCallbackCreateInfoEXT structure, the list of enabled
-    extensions in pname:ppEnabledExtensionNames must: contain
-    apiext:VK_EXT_debug_report
-endif::VK_EXT_debug_report[]
-ifdef::VK_EXT_debug_utils[]
-  * [[VUID-VkInstanceCreateInfo-pNext-04926]]
-    If the pname:pNext chain of sname:VkInstanceCreateInfo includes a
-    sname:VkDebugUtilsMessengerCreateInfoEXT structure, the list of enabled
-    extensions in pname:ppEnabledExtensionNames must: contain
-    apiext:VK_EXT_debug_utils
-endif::VK_EXT_debug_utils[]
-****
-endif::VK_EXT_debug_report,VK_EXT_debug_utils[]
-
-include::{generated}/validity/structs/VkInstanceCreateInfo.txt[]
---
-
-[open,refpage='VkInstanceCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkInstanceCreateFlags.txt[]
-
-tname:VkInstanceCreateFlags is a bitmask type for setting a mask, but is
-currently reserved for future use.
---
-
-ifdef::VK_EXT_validation_flags[]
-include::VK_EXT_validation_flags.txt[]
-endif::VK_EXT_validation_flags[]
-
-ifdef::VK_EXT_validation_features[]
-include::VK_EXT_validation_features.txt[]
-endif::VK_EXT_validation_features[]
-
-[open,refpage='VkApplicationInfo',desc='Structure specifying application information',type='structs']
---
-The sname:VkApplicationInfo structure is defined as:
-
-include::{generated}/api/structs/VkApplicationInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pApplicationName is `NULL` or is a pointer to a null-terminated
-    UTF-8 string containing the name of the application.
-  * pname:applicationVersion is an unsigned integer variable containing the
-    developer-supplied version number of the application.
-  * pname:pEngineName is `NULL` or is a pointer to a null-terminated UTF-8
-    string containing the name of the engine (if any) used to create the
-    application.
-  * pname:engineVersion is an unsigned integer variable containing the
-    developer-supplied version number of the engine used to create the
-    application.
-ifndef::VK_VERSION_1_1[]
-  * pname:apiVersion is the version of the Vulkan API against which the
-    application expects to run, encoded as described in
-    <<extendingvulkan-coreversions-versionnumbers>>.
-    If pname:apiVersion is 0 the implementation must: ignore it, otherwise
-    if the implementation does not support the requested pname:apiVersion,
-    or an effective substitute for pname:apiVersion, it must: return
-    ename:VK_ERROR_INCOMPATIBLE_DRIVER.
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1[]
-  * pname:apiVersion must: be the highest version of Vulkan that the
-    application is designed to use, encoded as described in
-    <<extendingvulkan-coreversions-versionnumbers>>.
-endif::VK_VERSION_1_1[]
-    The patch version number specified in pname:apiVersion is ignored when
-    creating an instance object.
-    Only the major and minor versions of the instance must: match those
-    requested in pname:apiVersion.
-
-ifdef::VK_VERSION_1_1[]
-Vulkan 1.0 implementations were required to return
-ename:VK_ERROR_INCOMPATIBLE_DRIVER if pname:apiVersion was larger than 1.0.
-Implementations that support Vulkan 1.1 or later must: not return
-ename:VK_ERROR_INCOMPATIBLE_DRIVER for any value of pname:apiVersion.
-
-[NOTE]
-.Note
-====
-Because Vulkan 1.0 implementations may: fail with
-ename:VK_ERROR_INCOMPATIBLE_DRIVER, applications should: determine the
-version of Vulkan available before calling flink:vkCreateInstance.
-If the flink:vkGetInstanceProcAddr returns `NULL` for
-flink:vkEnumerateInstanceVersion, it is a Vulkan 1.0 implementation.
-Otherwise, the application can: call flink:vkEnumerateInstanceVersion to
-determine the version of Vulkan.
-====
-
-As long as the instance supports at least Vulkan 1.1, an application can:
-use different versions of Vulkan with an instance than it does with a device
-or physical device.
-
-[NOTE]
-.Note
-====
-The Khronos validation layers will treat pname:apiVersion as the highest API
-version the application targets, and will validate API usage against the
-minimum of that version and the implementation version (instance or device,
-depending on context).
-If an application tries to use functionality from a greater version than
-this, a validation error will be triggered.
-
-For example, if the instance supports Vulkan 1.1 and three physical devices
-support Vulkan 1.0, Vulkan 1.1, and Vulkan 1.2, respectively, and if the
-application sets pname:apiVersion to 1.2, the application can: use the
-following versions of Vulkan:
-
-  * Vulkan 1.0 can: be used with the instance and with all physical devices.
-  * Vulkan 1.1 can: be used with the instance and with the physical devices
-    that support Vulkan 1.1 and Vulkan 1.2.
-  * Vulkan 1.2 can: be used with the physical device that supports Vulkan
-    1.2.
-
-If we modify the above example so that the application sets pname:apiVersion
-to 1.1, then the application must: not use Vulkan 1.2 functionality on the
-physical device that supports Vulkan 1.2.
-====
-
-Implicit layers must: be disabled if they do not support a version at least
-as high as pname:apiVersion.
-See the <<LoaderInterfaceArchitecture, "`Architecture of the Vulkan Loader
-Interfaces`">> document for additional information.
-
-[NOTE]
-.Note
-====
-Providing a `NULL` slink:VkInstanceCreateInfo::pname:pApplicationInfo or
-providing an pname:apiVersion of 0 is equivalent to providing an
-pname:apiVersion of `VK_MAKE_API_VERSION(0,1,0,0)`.
-====
-endif::VK_VERSION_1_1[]
-
-.Valid Usage
-****
-  * [[VUID-VkApplicationInfo-apiVersion-04010]]
-    If pname:apiVersion is not `0`, then it must: be greater than or equal
-    to dlink:VK_API_VERSION_1_0
-****
-
-include::{generated}/validity/structs/VkApplicationInfo.txt[]
---
-
-[open,refpage='vkDestroyInstance',desc='Destroy an instance of Vulkan',type='protos']
---
-To destroy an instance, call:
-
-include::{generated}/api/protos/vkDestroyInstance.txt[]
-
-  * pname:instance is the handle of the instance to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyInstance-instance-00629]]
-    All child objects created using pname:instance must: have been destroyed
-    prior to destroying pname:instance
-  * [[VUID-vkDestroyInstance-instance-00630]]
-    If sname:VkAllocationCallbacks were provided when pname:instance was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyInstance-instance-00631]]
-    If no sname:VkAllocationCallbacks were provided when pname:instance was
-    created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyInstance.txt[]
---
diff --git a/registry/vulkan/chapters/interfaces.txt b/registry/vulkan/chapters/interfaces.txt
deleted file mode 100755
index 2b8ba40..0000000
--- a/registry/vulkan/chapters/interfaces.txt
+++ /dev/null
@@ -1,4401 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[interfaces]]
-= Shader Interfaces
-
-When a pipeline is created, the set of shaders specified in the
-corresponding stext:Vk*PipelineCreateInfo structure are implicitly linked at
-a number of different interfaces.
-
-  * <<interfaces-iointerfaces,Shader Input and Output Interface>>
-  * <<interfaces-vertexinput,Vertex Input Interface>>
-  * <<interfaces-fragmentoutput,Fragment Output Interface>>
-  * <<interfaces-inputattachment,Fragment Input Attachment Interface>>
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-  * <<interfaces-raypipeline, Ray Tracing Pipeline Interface>>
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-  * <<interfaces-resources,Shader Resource Interface>>
-
-Interface definitions make use of the following SPIR-V decorations:
-
-  * code:DescriptorSet and code:Binding
-  * code:Location, code:Component, and code:Index
-  * code:Flat, code:NoPerspective, code:Centroid, and code:Sample
-  * code:Block and code:BufferBlock
-  * code:InputAttachmentIndex
-  * code:Offset, code:ArrayStride, and code:MatrixStride
-  * code:BuiltIn
-ifdef::VK_NV_geometry_shader_passthrough[]
-  * <<geometry-passthrough-passthrough,code:PassthroughNV>>
-endif::VK_NV_geometry_shader_passthrough[]
-
-
-This specification describes valid uses for Vulkan of these decorations.
-Any other use of one of these decorations is invalid, with the exception
-that, when using SPIR-V versions 1.4 and earlier: code:Block,
-code:BufferBlock, code:Offset, code:ArrayStride, and code:MatrixStride can
-also decorate types and type members used by variables in the Private and
-Function storage classes.
-
-[NOTE]
-.Note
-====
-In this chapter, there are references to SPIR-V terms such as the
-code:MeshNV execution model.
-These terms will appear even in a build of the specification which does not
-support any extensions.
-This is as intended, since these terms appear in the unified SPIR-V
-specification without such qualifiers.
-====
-
-
-[[interfaces-iointerfaces]]
-== Shader Input and Output Interfaces
-
-When multiple stages are present in a pipeline, the outputs of one stage
-form an interface with the inputs of the next stage.
-When such an interface involves a shader, shader outputs are matched against
-the inputs of the next stage, and shader inputs are matched against the
-outputs of the previous stage.
-
-All the variables forming the shader input and output _interfaces_ are
-listed as operands to the code:OpEntryPoint instruction and are declared
-with the code:Input or code:Output storage classes, respectively, in the
-SPIR-V module.
-These generally form the interfaces between consecutive shader stages,
-regardless of any non-shader stages between the consecutive shader stages.
-
-There are two classes of variables that can: be matched between shader
-stages, built-in variables and user-defined variables.
-Each class has a different set of matching criteria.
-
-code:Output variables of a shader stage have undefined: values until the
-shader writes to them or uses the code:Initializer operand when declaring
-the variable.
-
-
-[[interfaces-iointerfaces-builtin]]
-=== Built-in Interface Block
-
-Shader <<interfaces-builtin-variables,built-in>> variables meeting the
-following requirements define the _built-in interface block_.
-They must:
-
-  * be explicitly declared (there are no implicit built-ins),
-  * be identified with a code:BuiltIn decoration,
-  * form object types as described in the
-    <<interfaces-builtin-variables,Built-in Variables>> section, and
-  * be declared in a block whose top-level members are the built-ins.
-
-There must: be no more than one built-in interface block per shader per
-interface.
-
-Built-ins must: not have any code:Location or code:Component decorations.
-
-
-[[interfaces-iointerfaces-user]]
-=== User-defined Variable Interface
-
-The non-built-in variables listed by code:OpEntryPoint with the code:Input
-or code:Output storage class form the _user-defined variable interface_.
-These must: have SPIR-V numerical types or, recursively, composite types of
-such types.
-ifdef::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-By default, the components of such types have a width of 32 or 64 bits.
-If an implementation supports
-<<features-storageInputOutput16,storageInputOutput16>>, components can: also
-have a width of 16 bits.
-endif::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-These variables must: be identified with a code:Location decoration and can:
-also be identified with a code:Component decoration.
-
-
-[[interfaces-iointerfaces-matching]]
-=== Interface Matching
-
-An output variable, block, or structure member in a given shader stage has
-an interface match with an input variable, block, or structure member in a
-subsequent shader stage if they both adhere to the following conditions:
-
-  * They have equivalent decorations, other than:
-  ** <<shaders-interpolation-decorations,Interpolation decorations>>
-ifdef::VK_EXT_transform_feedback[]
-  ** code:XfbBuffer, code:XfbStride, code:Offset, and code:Stream
-endif::VK_EXT_transform_feedback[]
-  ** one is not decorated with code:Component and the other is declared with
-     a code:Component of `0`
-  * Their types match as follows:
-  ** if the input is declared in a tessellation control or geometry shader
-     as an code:OpTypeArray with an code:Element code:Type equivalent to the
-     code:OpType* declaration of the output, and neither is a structure
-     member; or
-ifdef::VK_KHR_maintenance4[]
-  ** if the <<features-maintenance4, pname:maintenance4>> feature is
-     enabled, they are declared as code:OpTypeVector variables, and the
-     output has a code:Component code:Count value higher than that of the
-     input but the same code:Component code:Type; or
-endif::VK_KHR_maintenance4[]
-ifdef::VK_NV_mesh_shader[]
-  ** if the output is declared in a mesh shader as an code:OpTypeArray with
-     an code:Element code:Type equivalent to the code:OpType* declaration of
-     the input, and neither is a structure member; or
-endif::VK_NV_mesh_shader[]
-  ** if in any other case they are declared with an equivalent code:OpType*
-     declaration.
-  * If both are structures and every member has an interface match.
-
-[NOTE]
-.Note
-====
-The word "structure" above refers to both variables that have an
-code:OpTypeStruct type and interface blocks (which are also declared as
-code:OpTypeStruct).
-====
-
-All input variables and blocks must: have an interface match in the
-preceding shader stage, except for built-in variables in fragment shaders.
-Shaders can: declare and write to output variables that are not declared or
-read by the subsequent stage.
-
-ifdef::VK_NV_geometry_shader_passthrough[]
-Matching rules for _passthrough geometry shaders_ are slightly different and
-are described in the <<geometry-passthrough-interface,Passthrough Interface
-Matching>> section.
-endif::VK_NV_geometry_shader_passthrough[]
-
-The value of an input variable is undefined: if the preceding stage does not
-write to a matching output variable, as described above.
-
-
-[[interfaces-iointerfaces-locations]]
-=== Location Assignment
-
-This section describes location assignments for user-defined variables and
-how many locations are consumed by a given user-variable type.
-<<interfaces-iointerfaces-matching, As mentioned above>>, some inputs and
-outputs have an additional level of arrayness relative to other shader
-inputs and outputs.
-This outer array level is removed from the type before considering how many
-locations the type consumes.
-
-The code:Location value specifies an interface slot comprised of a 32-bit
-four-component vector conveyed between stages.
-The code:Component specifies
-<<interfaces-iointerfaces-components,components>> within these vector
-locations.
-Only types with widths of
-ifdef::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-16,
-endif::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-32 or 64 are supported in shader interfaces.
-
-Inputs and outputs of the following types consume a single interface
-location:
-
-ifdef::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-  * 16-bit scalar and vector types, and
-endif::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-  * 32-bit scalar and vector types, and
-  * 64-bit scalar and 2-component vector types.
-
-64-bit three- and four-component vectors consume two consecutive locations.
-
-If a declared input or output is an array of size _n_ and each element takes
-_m_ locations, it will be assigned _m_ {times} _n_ consecutive locations
-starting with the location specified.
-
-If the declared input or output is an _n_ {times} _m_
-ifdef::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-16-,
-endif::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-32- or 64-bit matrix, it will be assigned multiple locations starting with
-the location specified.
-The number of locations assigned for each matrix will be the same as for an
-_n_-element array of _m_-component vectors.
-
-An code:OpVariable with a structure type that is not a block must: be
-decorated with a code:Location.
-
-When an code:OpVariable with a structure type (either block or non-block) is
-decorated with a code:Location, the members in the structure type must: not
-be decorated with a code:Location.
-The code:OpVariable's members are assigned consecutive locations in
-declaration order, starting from the first member, which is assigned the
-location decoration from the code:OpVariable.
-
-When a block-type code:OpVariable is declared without a code:Location
-decoration, each member in its structure type must: be decorated with a
-code:Location.
-Types nested deeper than the top-level members must: not have code:Location
-decorations.
-
-The locations consumed by block and structure members are determined by
-applying the rules above in a depth-first traversal of the instantiated
-members as though the structure or block member were declared as an input or
-output variable of the same type.
-
-Any two inputs listed as operands on the same code:OpEntryPoint must: not be
-assigned the same location, either explicitly or implicitly.
-Any two outputs listed as operands on the same code:OpEntryPoint must: not
-be assigned the same location, either explicitly or implicitly.
-
-The number of input and output locations available for a shader input or
-output interface are limited, and dependent on the shader stage as described
-in <<interfaces-iointerfaces-limits>>.
-All variables in both the <<interfaces-builtin-variables,built-in interface
-block>> and the <<interfaces-iointerfaces-user,user-defined variable
-interface>> count against these limits.
-Each effective code:Location must: have a value less than the number of
-locations available for the given interface, as specified in the "Locations
-Available" column in <<interfaces-iointerfaces-limits>>.
-
-
-[[interfaces-iointerfaces-limits]]
-.Shader Input and Output Locations
-[width="90%",cols="<6,<13",options="header"]
-|====
-| Shader Interface              | Locations Available
-| vertex input                  | pname:maxVertexInputAttributes
-| vertex output                 | pname:maxVertexOutputComponents / 4
-| tessellation control input    | pname:maxTessellationControlPerVertexInputComponents / 4
-| tessellation control output   | pname:maxTessellationControlPerVertexOutputComponents / 4
-| tessellation evaluation input | pname:maxTessellationEvaluationInputComponents / 4
-| tessellation evaluation output| pname:maxTessellationEvaluationOutputComponents / 4
-| geometry input                | pname:maxGeometryInputComponents / 4
-| geometry output               | pname:maxGeometryOutputComponents / 4
-| fragment input                | pname:maxFragmentInputComponents / 4
-| fragment output               | pname:maxFragmentOutputAttachments
-ifdef::VK_NV_mesh_shader[]
-// we forgot to add maxMeshOutputComponents
-| mesh output                   | pname:maxFragmentInputComponents / 4
-endif::VK_NV_mesh_shader[]
-|====
-
-
-[[interfaces-iointerfaces-components]]
-=== Component Assignment
-
-The code:Component decoration allows the code:Location to be more finely
-specified for scalars and vectors, down to the individual components within
-a location that are consumed.
-The components within a location are 0, 1, 2, and 3.
-A variable or block member starting at component N will consume components
-N, N+1, N+2, ...
-up through its size.
-ifdef::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-For 16-, and 32-bit types,
-endif::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-ifndef::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-For single precision types,
-endif::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-it is invalid if this sequence of components gets larger than 3.
-A scalar 64-bit type will consume two of these components in sequence, and a
-two-component 64-bit vector type will consume all four components available
-within a location.
-A three- or four-component 64-bit vector type must: not specify a
-code:Component decoration.
-A three-component 64-bit vector type will consume all four components of the
-first location and components 0 and 1 of the second location.
-This leaves components 2 and 3 available for other component-qualified
-declarations.
-
-A scalar or two-component 64-bit data type must: not specify a
-code:Component decoration of 1 or 3.
-A code:Component decoration must: not be specified for any type that is not
-a scalar or vector.
-
-
-[[interfaces-vertexinput]]
-== Vertex Input Interface
-
-When the vertex stage is present in a pipeline, the vertex shader input
-variables form an interface with the vertex input attributes.
-The vertex shader input variables are matched by the code:Location and
-code:Component decorations to the vertex input attributes specified in the
-pname:pVertexInputState member of the slink:VkGraphicsPipelineCreateInfo
-structure.
-
-The vertex shader input variables listed by code:OpEntryPoint with the
-code:Input storage class form the _vertex input interface_.
-These variables must: be identified with a code:Location decoration and can:
-also be identified with a code:Component decoration.
-
-For the purposes of interface matching: variables declared without a
-code:Component decoration are considered to have a code:Component decoration
-of zero.
-The number of available vertex input locations is given by the
-pname:maxVertexInputAttributes member of the sname:VkPhysicalDeviceLimits
-structure.
-
-See <<fxvertex-attrib-location>> for details.
-
-All vertex shader inputs declared as above must: have a corresponding
-attribute and binding in the pipeline.
-
-
-[[interfaces-fragmentoutput]]
-== Fragment Output Interface
-
-When the fragment stage is present in a pipeline, the fragment shader
-outputs form an interface with the output attachments defined by a
-<<renderpass, render pass instance>>.
-The fragment shader output variables are matched by the code:Location and
-code:Component decorations to specified color attachments.
-
-The fragment shader output variables listed by code:OpEntryPoint with the
-code:Output storage class form the _fragment output interface_.
-These variables must: be identified with a code:Location decoration.
-They can: also be identified with a code:Component decoration and/or an
-code:Index decoration.
-For the purposes of interface matching: variables declared without a
-code:Component decoration are considered to have a code:Component decoration
-of zero, and variables declared without an code:Index decoration are
-considered to have an code:Index decoration of zero.
-
-A fragment shader output variable identified with a code:Location decoration
-of _i_ is associated with
-ifdef::VK_KHR_dynamic_rendering[]
-the element of slink:VkRenderingInfoKHR::pname:pColorAttachments with a
-pname:location equal to _i_.
-When using render pass objects, it is associated with
-endif::VK_KHR_dynamic_rendering[]
-the color attachment indicated by pname:pColorAttachments[_i_].
-Values are written to those attachments after passing through the blending
-unit as described in <<framebuffer-blending>>, if enabled.
-Locations are consumed as described in
-<<interfaces-iointerfaces-locations,Location Assignment>>.
-The number of available fragment output locations is given by the
-pname:maxFragmentOutputAttachments member of the
-sname:VkPhysicalDeviceLimits structure.
-
-Components of the output variables are assigned as described in
-<<interfaces-iointerfaces-components,Component Assignment>>.
-Output components identified as 0, 1, 2, and 3 will be directed to the R, G,
-B, and A inputs to the blending unit, respectively, or to the output
-attachment if blending is disabled.
-If two variables are placed within the same location, they must: have the
-same underlying type (floating-point or integer).
-The input values to blending or color attachment writes are undefined: for
-components which do not correspond to a fragment shader output.
-
-Fragment outputs identified with an code:Index of zero are directed to the
-first input of the blending unit associated with the corresponding
-code:Location.
-Outputs identified with an code:Index of one are directed to the second
-input of the corresponding blending unit.
-
-No _component aliasing_ of output variables is allowed, that is there must:
-not be two output variables which have the same location, component, and
-index, either explicitly declared or implied.
-
-Output values written by a fragment shader must: be declared with either
-code:OpTypeFloat or code:OpTypeInt, and a code:Width of 32.
-ifdef::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-If pname:storageInputOutput16 is supported, output values written by a
-fragment shader can: be also declared with either code:OpTypeFloat or
-code:OpTypeInt and a code:Width of 16.
-endif::VK_VERSION_1_1,VK_KHR_16bit_storage[]
-Composites of these types are also permitted.
-If the color attachment has a signed or unsigned normalized fixed-point
-format, color values are assumed to be floating-point and are converted to
-fixed-point as described in <<fundamentals-fpfixedconv>>; If the color
-attachment has an integer format, color values are assumed to be integers
-and converted to the bit-depth of the target.
-Any value that cannot be represented in the attachment's format is
-undefined:.
-For any other attachment format no conversion is performed.
-If the type of the values written by the fragment shader do not match the
-format of the corresponding color attachment, the resulting values are
-undefined: for those components.
-
-
-[[interfaces-inputattachment]]
-== Fragment Input Attachment Interface
-
-When a fragment stage is present in a pipeline, the fragment shader subpass
-inputs form an interface with the input attachments of the current subpass.
-The fragment shader subpass input variables are matched by
-code:InputAttachmentIndex decorations to the input attachments specified in
-the pname:pInputAttachments array of the slink:VkSubpassDescription
-structure describing the subpass that the fragment shader is executed in.
-
-The fragment shader subpass input variables with the code:UniformConstant
-storage class and a decoration of code:InputAttachmentIndex that are
-statically used by code:OpEntryPoint form the _fragment input attachment
-interface_.
-These variables must: be declared with a type of code:OpTypeImage, a
-code:Dim operand of code:SubpassData, an code:Arrayed operand of 0, and a
-code:Sampled operand of 2.
-The code:MS operand of the code:OpTypeImage must: be 0 if the pname:samples
-field of the corresponding slink:VkAttachmentDescription is
-ename:VK_SAMPLE_COUNT_1_BIT and 1 otherwise.
-
-A subpass input variable identified with an code:InputAttachmentIndex
-decoration of _i_ reads from the input attachment indicated by
-pname:pInputAttachments[_i_] member of sname:VkSubpassDescription.
-If the subpass input variable is declared as an array of size N, it consumes
-N consecutive input attachments, starting with the index specified.
-There must: not be more than one input variable with the same
-code:InputAttachmentIndex whether explicitly declared or implied by an array
-declaration.
-The number of available input attachment indices is given by the
-pname:maxPerStageDescriptorInputAttachments member of the
-sname:VkPhysicalDeviceLimits structure.
-
-Variables identified with the code:InputAttachmentIndex must: only be used
-by a fragment stage.
-The basic data type (floating-point, integer, unsigned integer) of the
-subpass input must: match the basic format of the corresponding input
-attachment, or the values of subpass loads from these variables are
-undefined:.
-
-See <<descriptorsets-inputattachment>> for more details.
-
-
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-[[interfaces-raypipeline]]
-== Ray Tracing Pipeline Interface
-
-Ray tracing pipelines may: have more stages than other pipelines with
-multiple instances of each stage and more dynamic interactions between the
-stages, but still have interface structures that obey the same general rules
-as interfaces between shader stages in other pipelines.
-The three types of inter-stage interface variables for ray tracing pipelines
-are:
-
- * Ray payloads which contain data tracked for the entire lifetime of the
-   ray.
- * Hit attributes which contain data about a specific hit for the duration
-   of its processing.
- * Callable data for passing data into and out of a callable shader.
-
-Ray payloads and callable data are used in explicit shader call
-instructions, so they have an incoming variant to distinguish the parameter
-passed to the invocation from any other payloads or data being used by
-subsequent shader call instructions.
-
-An interface structure used between stages must: match between the stages
-using it.
-Specifically:
-
- * The hit attribute structure read in an any-hit or closest hit shader
-   must: be the same structure as the hit attribute structure written in the
-   corresponding intersection shader in the same hit group.
- * The incoming callable data for a callable shader must: be the same
-   structure as the callable data referenced by the execute callable
-   instruction in the calling shader.
- * The ray payload for a shader invoked by a ray tracing command must: be
-   the same structure for all shader stages using the payload for that ray.
-
-Any shader with an incoming ray payload, incoming callable data, or hit
-attribute must: only declare one variable of that type.
-
-.Ray Pipeline Shader Interface
-[width="90%",options="header"]
-|====
-| Shader Stage    | Ray Payload | Incoming Ray Payload | Hit Attribute | Callable Data | Incoming Callable Data
-| Ray Generation  | r/w         |                      |               | r/w           |
-| Intersection    |             |                      | r/w           |               |
-| Any-Hit         |             | r/w                  | r             |               |
-| Closest Hit     | r/w         | r/w                  | r             | r/w           |
-| Miss            | r/w         | r/w                  |               | r/w           |
-| Callable        |             |                      |               | r/w           | r/w
-|====
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-
-
-[[interfaces-resources]]
-== Shader Resource Interface
-
-When a shader stage accesses buffer or image resources, as described in the
-<<descriptorsets,Resource Descriptors>> section, the shader resource
-variables must: be matched with the <<descriptorsets-pipelinelayout,pipeline
-layout>> that is provided at pipeline creation time.
-
-The set of shader variables that form the _shader resource interface_ for a
-stage are the variables statically used by that stage's code:OpEntryPoint
-with a storage class of code:Uniform, code:UniformConstant,
-ifdef::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-code:StorageBuffer,
-endif::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-or code:PushConstant.
-For the fragment shader, this includes the <<interfaces-inputattachment,
-fragment input attachment interface>>.
-
-The shader resource interface consists of two sub-interfaces: the push
-constant interface and the descriptor set interface.
-
-
-[[interfaces-resources-pushconst]]
-=== Push Constant Interface
-
-The shader variables defined with a storage class of code:PushConstant that
-are statically used by the shader entry points for the pipeline define the
-_push constant interface_.
-They must: be:
-
-  * typed as code:OpTypeStruct,
-  * identified with a code:Block decoration, and
-  * laid out explicitly using the code:Offset, code:ArrayStride, and
-    code:MatrixStride decorations as specified in
-    <<interfaces-resources-layout,Offset and Stride Assignment>>.
-
-There must: be no more than one push constant block statically used per
-shader entry point.
-
-Each statically used member of a push constant block must: be placed at an
-code:Offset such that the entire member is entirely contained within the
-slink:VkPushConstantRange for each code:OpEntryPoint that uses it, and the
-pname:stageFlags for that range must: specify the appropriate
-elink:VkShaderStageFlagBits for that stage.
-The code:Offset decoration for any member of a push constant block must: not
-cause the space required for that member to extend outside the range
-[eq]#[0, pname:maxPushConstantsSize)#.
-
-Any member of a push constant block that is declared as an array must: only
-be accessed with _dynamically uniform_ indices.
-
-
-[[interfaces-resources-descset]]
-=== Descriptor Set Interface
-
-The _descriptor set interface_ is comprised of the shader variables with the
-storage class of
-ifdef::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-code:StorageBuffer,
-endif::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-code:Uniform or code:UniformConstant (including the variables in the
-<<interfaces-inputattachment,fragment input attachment interface>>) that are
-statically used by the shader entry points for the pipeline.
-
-These variables must: have code:DescriptorSet and code:Binding decorations
-specified, which are assigned and matched with the
-sname:VkDescriptorSetLayout objects in the pipeline layout as described in
-<<interfaces-resources-setandbinding,DescriptorSet and Binding Assignment>>.
-
-The code:Image code:Format of an code:OpTypeImage declaration must: not be
-*Unknown*, for variables which are used for code:OpImageRead,
-code:OpImageSparseRead, or code:OpImageWrite operations, except under the
-following conditions:
-
-  * For code:OpImageWrite, if the image format is listed in the
-    <<formats-without-shader-storage-format,storage without format>> list
-    and if the pname:shaderStorageImageWriteWithoutFormat feature is enabled
-    and the shader module declares the code:StorageImageWriteWithoutFormat
-    capability.
-ifdef::VK_KHR_format_feature_flags2[]
-  * For code:OpImageWrite, if the image format supports
-    ename:VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR and the
-    shader module declares the code:StorageImageWriteWithoutFormat
-    capability.
-endif::VK_KHR_format_feature_flags2[]
-  * For code:OpImageRead or code:OpImageSparseRead, if the image format is
-    listed in the <<formats-without-shader-storage-format,storage without
-    format>> list and if the pname:shaderStorageImageReadWithoutFormat
-    feature is enabled and the shader module declares the
-    code:StorageImageReadWithoutFormat capability.
-ifdef::VK_KHR_format_feature_flags2[]
-  * For code:OpImageRead or code:OpImageSparseRead, if the image format
-    supports ename:VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR
-    and the shader module declares the code:StorageImageReadWithoutFormat
-    capability.
-endif::VK_KHR_format_feature_flags2[]
-  * For code:OpImageRead, if code:Dim is code:SubpassData (indicating a read
-    from an input attachment).
-
-The code:Image code:Format of an code:OpTypeImage declaration must: not be
-*Unknown*, for variables which are used for code:OpAtomic* operations.
-
-Variables identified with the code:Uniform storage class are used to access
-transparent buffer backed resources.
-Such variables must: be:
-
-  * typed as code:OpTypeStruct, or an array of this type,
-  * identified with a code:Block or code:BufferBlock decoration, and
-  * laid out explicitly using the code:Offset, code:ArrayStride, and
-    code:MatrixStride decorations as specified in
-    <<interfaces-resources-layout,Offset and Stride Assignment>>.
-
-ifdef::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-Variables identified with the code:StorageBuffer storage class are used to
-access transparent buffer backed resources.
-Such variables must: be:
-
-  * typed as code:OpTypeStruct, or an array of this type,
-  * identified with a code:Block decoration, and
-  * laid out explicitly using the code:Offset, code:ArrayStride, and
-    code:MatrixStride decorations as specified in
-    <<interfaces-resources-layout,Offset and Stride Assignment>>.
-endif::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-
-ifndef::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-The code:Offset decoration for any variable in a code:Block must: not cause
-the space required for that variable to extend outside the range [eq]#[0,
-pname:maxUniformBufferRange)#.
-The code:Offset decoration for any variable in a code:BufferBlock must: not
-cause the space required for that variable to extend outside the range
-[eq]#[0, pname:maxStorageBufferRange)#.
-endif::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-The code:Offset decoration for any member of a code:Block-decorated variable
-in the code:Uniform storage class must: not cause the space required for
-that variable to extend outside the range [eq]#[0,
-pname:maxUniformBufferRange)#.
-The code:Offset decoration for any member of a code:Block-decorated variable
-in the code:StorageBuffer storage class must: not cause the space required
-for that variable to extend outside the range [eq]#[0,
-pname:maxStorageBufferRange)#.
-endif::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-
-ifdef::VK_EXT_inline_uniform_block[]
-Variables identified with the code:Uniform storage class can: also be used
-to access transparent descriptor set backed resources when the variable is
-assigned to a descriptor set layout binding with a pname:descriptorType of
-ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT.
-In this case the variable must: be typed as code:OpTypeStruct and cannot: be
-aggregated into arrays of that type.
-Further, the code:Offset decoration for any member of such a variable must:
-not cause the space required for that variable to extend outside the range
-[eq]#[0,pname:maxInlineUniformBlockSize)#.
-endif::VK_EXT_inline_uniform_block[]
-
-Variables identified with a storage class of code:UniformConstant and a
-decoration of code:InputAttachmentIndex must: be declared as described in
-<<interfaces-inputattachment,Fragment Input Attachment Interface>>.
-
-SPIR-V variables decorated with a descriptor set and binding that identify a
-<<descriptorsets-combinedimagesampler, combined image sampler descriptor>>
-can: have a type of code:OpTypeImage, code:OpTypeSampler (code:Sampled=1),
-or code:OpTypeSampledImage.
-
-Arrays of any of these types can: be indexed with _constant integral
-expressions_.
-The following features must: be enabled and capabilities must: be declared
-in order to index such arrays with dynamically uniform or non-uniform
-indices:
-
-  * Storage images (except storage texel buffers and input attachments):
-  ** Dynamically uniform: pname:shaderStorageImageArrayDynamicIndexing and
-     code:StorageImageArrayDynamicIndexing
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  ** Non-uniform: pname:shaderStorageImageArrayNonUniformIndexing and
-     code:StorageImageArrayNonUniformIndexing
-  * Storage texel buffers:
-  ** Dynamically uniform: pname:shaderStorageTexelBufferArrayDynamicIndexing
-     and code:StorageTexelBufferArrayDynamicIndexing
-  ** Non-uniform: pname:shaderStorageTexelBufferArrayNonUniformIndexing and
-     code:StorageTexelBufferArrayNonUniformIndexing
-  * Input attachments:
-  ** Dynamically uniform: pname:shaderInputAttachmentArrayDynamicIndexing
-     and code:InputAttachmentArrayDynamicIndexing
-  ** Non-uniform: pname:shaderInputAttachmentArrayNonUniformIndexing and
-     code:InputAttachmentArrayNonUniformIndexing
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * Sampled images (except uniform texel buffers), samplers and combined
-    image samplers:
-  ** Dynamically uniform: pname:shaderSampledImageArrayDynamicIndexing and
-     code:SampledImageArrayDynamicIndexing
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  ** Non-uniform: pname:shaderSampledImageArrayNonUniformIndexing and
-     code:SampledImageArrayNonUniformIndexing
-  * Uniform texel buffers:
-  ** Dynamically uniform: pname:shaderUniformTexelBufferArrayDynamicIndexing
-     and code:UniformTexelBufferArrayDynamicIndexing
-  ** Non-uniform: pname:shaderUniformTexelBufferArrayNonUniformIndexing and
-     code:UniformTexelBufferArrayNonUniformIndexing
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * Uniform buffers:
-  ** Dynamically uniform: pname:shaderUniformBufferArrayDynamicIndexing and
-     code:UniformBufferArrayDynamicIndexing
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  ** Non-uniform: pname:shaderUniformBufferArrayNonUniformIndexing and
-     code:UniformBufferArrayNonUniformIndexing
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * Storage buffers:
-  ** Dynamically uniform: pname:shaderStorageBufferArrayDynamicIndexing and
-     code:StorageBufferArrayDynamicIndexing
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  ** Non-uniform: pname:shaderStorageBufferArrayNonUniformIndexing and
-     code:StorageBufferArrayNonUniformIndexing
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-  * Acceleration structures:
-  ** Dynamically uniform: Always supported.
-  ** Non-uniform: Always supported.
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-If an instruction loads from or stores to a resource (including atomics and
-image instructions) and the resource descriptor being accessed is not
-dynamically uniform, then the corresponding non-uniform indexing feature
-must: be enabled and the capability must: be declared.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-If an instruction loads from or stores to a resource (including atomics and
-image instructions) and the resource descriptor being accessed is loaded
-from an array element with a non-constant index, then the corresponding
-dynamic
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or non-uniform
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-indexing feature must: be enabled and the capability must: be declared.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-If the combined image sampler enables sampler {YCbCr}
-ifndef::VK_EXT_fragment_density_map[]
-conversion,
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_EXT_fragment_density_map[]
-conversion or samples a <<samplers-subsamplesampler,subsampled image>>,
-endif::VK_EXT_fragment_density_map[]
-it must: be indexed only by constant integral expressions when aggregated
-into arrays in shader code, irrespective of the
-pname:shaderSampledImageArrayDynamicIndexing feature.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_EXT_fragment_density_map[]
-If the combined image sampler samples a
-<<samplers-subsamplesampler,subsampled image>>, it must: be indexed only by
-constant integral expressions when aggregated into arrays in shader code,
-irrespective of the pname:shaderSampledImageArrayDynamicIndexing feature.
-endif::VK_EXT_fragment_density_map[]
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-[[interfaces-resources-correspondence]]
-.Shader Resource and Descriptor Type Correspondence
-[width="90%",cols="<1,<2",options="header"]
-|====
-| Resource type          | Descriptor Type
-| sampler                | ename:VK_DESCRIPTOR_TYPE_SAMPLER or
-                           ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
-| sampled image          | ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE or
-                           ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
-| storage image          | ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
-| combined image sampler | ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
-| uniform texel buffer   | ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
-| storage texel buffer   | ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
-| uniform buffer         | ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
-                           ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC
-| storage buffer         | ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
-                           ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC
-| input attachment       | ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
-ifdef::VK_EXT_inline_uniform_block[]
-| inline uniform block   | ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
-endif::VK_EXT_inline_uniform_block[]
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-| acceleration structure |
-ifdef::VK_KHR_acceleration_structure[ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR]
-ifdef::VK_NV_ray_tracing+VK_KHR_acceleration_structure[or]
-ifdef::VK_NV_ray_tracing[ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV]
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-|====
-
-[[interfaces-resources-storage-class-correspondence]]
-.Shader Resource and Storage Class Correspondence
-[width="100%",cols="<21%,<22%,<27%,<30%",options="header"]
-|====
-| Resource type   | Storage Class | Type^1^ | Decoration(s)^2^
-| sampler
-        | code:UniformConstant | code:OpTypeSampler |
-| sampled image
-        | code:UniformConstant | code:OpTypeImage (code:Sampled=1)|
-| storage image
-        | code:UniformConstant | code:OpTypeImage (code:Sampled=2) |
-| combined image sampler
-        | code:UniformConstant | code:OpTypeSampledImage +
-                                 code:OpTypeImage (code:Sampled=1) +
-                                 code:OpTypeSampler |
-| uniform texel buffer
-        | code:UniformConstant | code:OpTypeImage (code:Dim=code:Buffer, code:Sampled=1) |
-| storage texel buffer
-        | code:UniformConstant | code:OpTypeImage (code:Dim=code:Buffer, code:Sampled=2) |
-| uniform buffer
-        | code:Uniform         | code:OpTypeStruct
-        | code:Block, code:Offset, (code:ArrayStride), (code:MatrixStride)
-ifndef::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-| storage buffer
-        | code:Uniform         | code:OpTypeStruct
-        | code:BufferBlock, code:Offset, (code:ArrayStride), (code:MatrixStride)
-endif::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-ifdef::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-.2+<.^| storage buffer
-        | code:Uniform         .2+<.^| code:OpTypeStruct
-        | code:BufferBlock, code:Offset, (code:ArrayStride), (code:MatrixStride)
-        | code:StorageBuffer | code:Block, code:Offset, (code:ArrayStride), (code:MatrixStride)
-endif::VK_VERSION_1_1,VK_KHR_storage_buffer_storage_class[]
-| input attachment
-        | code:UniformConstant | code:OpTypeImage (code:Dim=code:SubpassData, code:Sampled=2)
-        | code:InputAttachmentIndex
-ifdef::VK_EXT_inline_uniform_block[]
-| inline uniform block
-        | code:Uniform | code:OpTypeStruct
-        | code:Block, code:Offset, (code:ArrayStride), (code:MatrixStride)
-endif::VK_EXT_inline_uniform_block[]
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-| acceleration structure
-        | code:UniformConstant | code:OpTypeAccelerationStructureKHR |
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-|====
-
-1::
-    Where code:OpTypeImage is referenced, the code:Dim values code:Buffer
-    and code:Subpassdata are only accepted where they are specifically
-    referenced.
-    They do not correspond to resource types where a generic
-    code:OpTypeImage is specified.
-2::
-    In addition to code:DescriptorSet and code:Binding.
-
-
-[[interfaces-resources-setandbinding]]
-=== DescriptorSet and Binding Assignment
-
-A variable decorated with a code:DescriptorSet decoration of [eq]#s# and a
-code:Binding decoration of [eq]#b# indicates that this variable is
-associated with the slink:VkDescriptorSetLayoutBinding that has a
-pname:binding equal to [eq]#b# in pname:pSetLayouts[_s_] that was specified
-in slink:VkPipelineLayoutCreateInfo.
-
-code:DescriptorSet decoration values must: be between zero and
-pname:maxBoundDescriptorSets minus one, inclusive.
-code:Binding decoration values can: be any 32-bit unsigned integer value, as
-described in <<descriptorsets-setlayout>>.
-Each descriptor set has its own binding name space.
-
-If the code:Binding decoration is used with an array, the entire array is
-assigned that binding value.
-The array must: be a single-dimensional array and size of the array must: be
-no larger than the number of descriptors in the binding.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-If the array is runtime-sized, then array elements greater than or equal to
-the size of that binding in the bound descriptor set must: not be used.
-If the array is runtime-sized, the pname:runtimeDescriptorArray feature
-must: be enabled and the code:RuntimeDescriptorArray capability must: be
-declared.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-The array must: not be runtime-sized.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-The index of each element of the array is referred to as the _arrayElement_.
-For the purposes of interface matching and descriptor set
-<<descriptorsets-updates,operations>>, if a resource variable is not an
-array, it is treated as if it has an arrayElement of zero.
-
-There is a limit on the number of resources of each type that can: be
-accessed by a pipeline stage as shown in
-<<interfaces-resources-limits,Shader Resource Limits>>.
-The "`Resources Per Stage`" column gives the limit on the number each type
-of resource that can: be statically used for an entry point in any given
-stage in a pipeline.
-The "`Resource Types`" column lists which resource types are counted against
-the limit.
-Some resource types count against multiple limits.
-ifdef::VK_VALVE_mutable_descriptor_type[]
-The ename:VK_DESCRIPTOR_TYPE_MUTABLE_VALVE descriptor type counts as one
-individual resource and one for every unique resource limit per descriptor
-set type that is present in the associated binding's
-slink:VkMutableDescriptorTypeListVALVE.
-If multiple descriptor types in slink:VkMutableDescriptorTypeListVALVE map
-to the same resource limit, only one descriptor is consumed for purposes of
-computing resource limits.
-endif::VK_VALVE_mutable_descriptor_type[]
-
-The pipeline layout may: include descriptor sets and bindings which are not
-referenced by any variables statically used by the entry points for the
-shader stages in the binding's pname:stageFlags.
-
-However, if a variable assigned to a given code:DescriptorSet and
-code:Binding is statically used by the entry point for a shader stage, the
-pipeline layout must: contain a descriptor set layout binding in that
-descriptor set layout and for that binding number, and that binding's
-pname:stageFlags must: include the appropriate elink:VkShaderStageFlagBits
-for that stage.
-The variable must: be of a valid resource type determined by its SPIR-V type
-and storage class, as defined in
-<<interfaces-resources-storage-class-correspondence,Shader Resource and
-Storage Class Correspondence>>.
-The descriptor set layout binding must: be of a corresponding descriptor
-type, as defined in <<interfaces-resources-correspondence,Shader Resource
-and Descriptor Type Correspondence>>.
-
-[NOTE]
-.Note
-====
-There are no limits on the number of shader variables that can have
-overlapping set and binding values in a shader; but which resources are
-<<shaders-staticuse,statically used>> has an impact.
-If any shader variable identifying a resource is
-<<shaders-staticuse,statically used>> in a shader, then the underlying
-descriptor bound at the declared set and binding must
-<<interfaces-resources-correspondence,support the declared type in the
-shader>> when the shader executes.
-
-If multiple shader variables are declared with the same set and binding
-values, and with the same underlying descriptor type, they can all be
-statically used within the same shader.
-However, accesses are not automatically synchronized, and code:Aliased
-decorations should be used to avoid data hazards (see
-https://www.khronos.org/registry/spir-v/specs/unified1/SPIRV.html#_a_id_aliasingsection_a_aliasing[section
-2.18.2 Aliasing in the SPIR-V specification]).
-
-If multiple shader variables with the same set and binding values are
-declared in a single shader, but with different declared types, where any of
-those are not supported by the relevant bound descriptor, that shader can
-only be executed if the variables with the unsupported type are not
-statically used.
-
-A noteworthy example of using multiple statically-used shader variables
-sharing the same descriptor set and binding values is a descriptor of type
-ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER that has multiple
-corresponding shader variables in the code:UniformConstant storage class,
-where some could be code:OpTypeImage (code:Sampled=1), some could be
-code:OpTypeSampler, and some could be code:OpTypeSampledImage.
-====
-
-[[interfaces-resources-limits]]
-.Shader Resource Limits
-[width="80%",cols="<35,<23",options="header"]
-|====
-| Resources per Stage                   | Resource Types
-.2+<.^| pname:maxPerStageDescriptorSamplers
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxPerStageDescriptorUpdateAfterBindSamplers
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | sampler           | combined image sampler
-.3+<.^| pname:maxPerStageDescriptorSampledImages
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxPerStageDescriptorUpdateAfterBindSampledImages
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | sampled image     | combined image sampler | uniform texel buffer
-.2+<.^| pname:maxPerStageDescriptorStorageImages
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxPerStageDescriptorUpdateAfterBindStorageImages
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | storage image     | storage texel buffer
-.2+<.^| pname:maxPerStageDescriptorUniformBuffers
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxPerStageDescriptorUpdateAfterBindUniformBuffers
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | uniform buffer    | uniform buffer dynamic
-.2+<.^| pname:maxPerStageDescriptorStorageBuffers
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxPerStageDescriptorUpdateAfterBindStorageBuffers
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | storage buffer    | storage buffer dynamic
-| pname:maxPerStageDescriptorInputAttachments
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxPerStageDescriptorUpdateAfterBindInputAttachments
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | input attachment^1^
-ifdef::VK_EXT_inline_uniform_block[]
-| pname:maxPerStageDescriptorInlineUniformBlocks
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-or pname:maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-            | inline uniform block
-endif::VK_EXT_inline_uniform_block[]
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-|
-ifdef::VK_NV_ray_tracing[sname:VkPhysicalDeviceRayTracingPropertiesNV ::pname:maxDescriptorSetAccelerationStructures]
-ifdef::VK_NV_ray_tracing+VK_KHR_acceleration_structure[or]
-ifdef::VK_KHR_acceleration_structure[]
-pname:maxPerStageDescriptorAccelerationStructures or
-pname:maxPerStageDescriptorUpdateAfterBindAccelerationStructures
-endif::VK_KHR_acceleration_structure[]
-            | acceleration structure
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-|====
-
-1::
-    Input attachments can: only be used in the fragment shader stage
-
-
-[[interfaces-resources-layout]]
-=== Offset and Stride Assignment
-
-Certain objects must: be explicitly laid out using the code:Offset,
-code:ArrayStride, and code:MatrixStride, as described in
-https://www.khronos.org/registry/spir-v/specs/unified1/SPIRV.html#ShaderValidation[SPIR-V
-explicit layout validation rules].
-All such layouts also must: conform to the following requirements.
-
-[NOTE]
-.Note
-====
-The numeric order of code:Offset decorations does not need to follow member
-declaration order.
-====
-
-
-[[interfaces-alignment-requirements]]
-*Alignment Requirements*
-
-There are different alignment requirements depending on the specific
-resources and on the features enabled on the device.
-
-The _scalar alignment_ of the type of an code:OpTypeStruct member is defined
-recursively as follows:
-
-  * A scalar of size [eq]#N# has a scalar alignment of [eq]#N#.
-  * A vector or matrix type has a scalar alignment equal to that of its
-    component type.
-  * An array type has a scalar alignment equal to that of its element type.
-  * A structure has a scalar alignment equal to the largest scalar alignment
-    of any of its members.
-
-The _base alignment_ of the type of an code:OpTypeStruct member is defined
-recursively as follows:
-
-  * A scalar has a base alignment equal to its scalar alignment.
-  * A two-component vector has a base alignment equal to twice its scalar
-    alignment.
-  * A three- or four-component vector has a base alignment equal to four
-    times its scalar alignment.
-  * An array has a base alignment equal to the base alignment of its element
-    type.
-  * A structure has a base alignment equal to the largest base alignment of
-    any of its members.
-    An empty structure has a base alignment equal to the size of the
-    smallest scalar type permitted by the capabilities declared in the
-    SPIR-V module.
-    (e.g., for a 1 byte aligned empty struct in the code:StorageBuffer
-    storage class, code:StorageBuffer8BitAccess or
-    code:UniformAndStorageBuffer8BitAccess must: be declared in the SPIR-V
-    module.)
-  * A row-major matrix of [eq]#C# columns has a base alignment equal to the
-    base alignment of a vector of [eq]#C# matrix components.
-  * A column-major matrix has a base alignment equal to the base alignment
-    of the matrix column type.
-
-The _extended alignment_ of the type of an code:OpTypeStruct member is
-similarly defined as follows:
-
-  * A scalar, vector or matrix type has an extended alignment equal to its
-    base alignment.
-  * An array or structure type has an extended alignment equal to the
-    largest extended alignment of any of its members, rounded up to a
-    multiple of 16.
-
-ifdef::VK_VERSION_1_1,VK_KHR_relaxed_block_layout[]
-
-A member is defined to _improperly straddle_ if either of the following are
-true:
-
-  * It is a vector with total size less than or equal to 16 bytes, and has
-    code:Offset decorations placing its first byte at [eq]#F# and its last
-    byte at [eq]#L#, where [eq]#floor(F / 16) != floor(L / 16)#.
-  * It is a vector with total size greater than 16 bytes and has its
-    code:Offset decorations placing its first byte at a non-integer multiple
-    of 16.
-
-endif::VK_VERSION_1_1,VK_KHR_relaxed_block_layout[]
-
-[[interfaces-resources-standard-layout]]
-*Standard Buffer Layout*
-
-Every member of an code:OpTypeStruct that is required to be explicitly laid
-out must: be aligned according to the first matching rule as follows.
-If the struct is contained in pointer types of multiple storage classes, it
-must: satisfy the requirements for every storage class used to reference it.
-
-ifdef::VK_VERSION_1_2,VK_EXT_scalar_block_layout[]
-. If the code:scalarBlockLayout feature is enabled on the device and the
-  storage class is code:Uniform, code:StorageBuffer,
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-  code:PhysicalStorageBuffer,
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  code:ShaderRecordBufferKHR,
-endif::VK_KHR_ray_tracing_pipeline[]
-  or code:PushConstant then every member must: be aligned according to its
-  scalar alignment.
-endif::VK_VERSION_1_2,VK_EXT_scalar_block_layout[]
-ifdef::VK_KHR_workgroup_memory_explicit_layout[]
-. If the code:workgroupMemoryExplicitLayoutScalarBlockLayout feature is
-  enabled on the device and the storage class is code:Workgroup then every
-  member must: be aligned according to its scalar alignment.
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-ifdef::VK_VERSION_1_1,VK_KHR_relaxed_block_layout[]
-. All vectors must: be aligned according to their scalar alignment.
-endif::VK_VERSION_1_1,VK_KHR_relaxed_block_layout[]
-ifdef::VK_VERSION_1_2,VK_KHR_uniform_buffer_standard_layout[]
-. If the pname:uniformBufferStandardLayout feature is not enabled on the
-  device, then any
-endif::VK_VERSION_1_2,VK_KHR_uniform_buffer_standard_layout[]
-ifndef::VK_VERSION_1_2,VK_KHR_uniform_buffer_standard_layout[]
-. Any
-endif::VK_VERSION_1_2,VK_KHR_uniform_buffer_standard_layout[]
-  member of an code:OpTypeStruct with a storage class of code:Uniform and a
-  decoration of code:Block must: be aligned according to its extended
-  alignment.
-. Every other member must: be aligned according to its base alignment.
-
-ifdef::VK_VERSION_1_2,VK_EXT_scalar_block_layout[]
-[NOTE]
-.Note
-====
-Even if scalar alignment is supported, it is generally more performant to
-use the _base alignment_.
-====
-endif::VK_VERSION_1_2,VK_EXT_scalar_block_layout[]
-
-The memory layout must: obey the following rules:
-
-  * The code:Offset decoration of any member must: be a multiple of its
-    alignment.
-  * Any code:ArrayStride or code:MatrixStride decoration must: be a multiple
-    of the alignment of the array or matrix as defined above.
-
-ifdef::VK_VERSION_1_2,VK_EXT_scalar_block_layout,VK_KHR_workgroup_memory_explicit_layout[]
-If one of the conditions below applies
-
-ifdef::VK_VERSION_1_2,VK_EXT_scalar_block_layout[]
-  * The storage class is code:Uniform, code:StorageBuffer,
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-    code:PhysicalStorageBuffer,
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  code:ShaderRecordBufferKHR,
-endif::VK_KHR_ray_tracing_pipeline[]
-    or code:PushConstant, and the code:scalarBlockLayout feature is not
-    enabled on the device.
-endif::VK_VERSION_1_2,VK_EXT_scalar_block_layout[]
-ifdef::VK_KHR_workgroup_memory_explicit_layout[]
-  * The storage class is code:Workgroup, and either the struct member is not
-    part of a code:Block or the
-    code:workgroupMemoryExplicitLayoutScalarBlockLayout feature is not
-    enabled on the device.
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-  * The storage class is any other storage class.
-
-the memory layout must: also obey the following rules:
-endif::VK_VERSION_1_2,VK_EXT_scalar_block_layout,VK_KHR_workgroup_memory_explicit_layout[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_relaxed_block_layout[]
-  * Vectors must: not improperly straddle, as defined above.
-endif::VK_VERSION_1_1,VK_KHR_relaxed_block_layout[]
-  * The code:Offset decoration of a member must: not place it between the
-    end of a structure or an array and the next multiple of the alignment of
-    that structure or array.
-
-[NOTE]
-.Note
-====
-The *std430 layout* in GLSL satisfies these rules for types using the base
-alignment.
-The *std140 layout* satisfies the rules for types using the extended
-alignment.
-====
-
-
-[[interfaces-builtin-variables]]
-== Built-In Variables
-
-Built-in variables are accessed in shaders by declaring a variable decorated
-with a code:BuiltIn SPIR-V decoration.
-The meaning of each code:BuiltIn decoration is as follows.
-In the remainder of this section, the name of a built-in is used
-interchangeably with a term equivalent to a variable decorated with that
-particular built-in.
-Built-ins that represent integer values can: be declared as either signed or
-unsigned 32-bit integers.
-
-<<interfaces-iointerfaces-matching, As mentioned above>>, some inputs and
-outputs have an additional level of arrayness relative to other shader
-inputs and outputs.
-This level of arrayness is not included in the type descriptions below, but
-must be included when declaring the built-in.
-
-ifdef::VK_NV_fragment_shader_barycentric[]
-[[interfaces-builtin-variables-barycoordnv]]
-[open,refpage='BaryCoordNV',desc='Barycentric coordinates of a fragment',type='builtins']
---
-:refpage: BaryCoordNV
-
-code:BaryCoordNV::
-
-The code:BaryCoordNV decoration can: be used to decorate a fragment shader
-input variable.
-This variable will contain a three-component floating-point vector with
-barycentric weights that indicate the location of the fragment relative to
-the screen-space locations of vertices of its primitive, obtained using
-perspective interpolation.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-BaryCoordNV-04154]]
-    The code:BaryCoordNV decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-BaryCoordNV-04155]]
-    The variable decorated with code:BaryCoordNV must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-BaryCoordNV-04156]]
-    The variable decorated with code:BaryCoordNV must: be declared as a
-    three-component vector of 32-bit floating-point values
-****
---
-endif::VK_NV_fragment_shader_barycentric[]
-
-ifdef::VK_AMD_shader_explicit_vertex_parameter[]
-[open,refpage='BaryCoordNoPerspAMD',desc='Barycentric coordinates of a fragment center in screen-space',type='builtins']
---
-:refpage: BaryCoordNoPerspAMD
-
-code:BaryCoordNoPerspAMD::
-
-The code:BaryCoordNoPerspAMD decoration can: be used to decorate a fragment
-shader input variable.
-This variable will contain the (I,J) pair of the barycentric coordinates
-corresponding to the fragment evaluated using linear interpolation at the
-fragment's center.
-The K coordinate of the barycentric coordinates can: be derived given the
-identity I {plus} J {plus} K = 1.0.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-BaryCoordNoPerspAMD-04157]]
-    The code:BaryCoordNoPerspAMD decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-BaryCoordNoPerspAMD-04158]]
-    The variable decorated with code:BaryCoordNoPerspAMD must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-BaryCoordNoPerspAMD-04159]]
-    The variable decorated with code:BaryCoordNoPerspAMD must: be declared
-    as a two-component vector of 32-bit floating-point values
-****
---
-endif::VK_AMD_shader_explicit_vertex_parameter[]
-
-ifdef::VK_NV_fragment_shader_barycentric[]
-[[interfaces-builtin-variables-barycoordnoperspnv]]
-[open,refpage='BaryCoordNoPerspNV',desc='Barycentric coordinates of a fragment in screen-space',type='builtins']
---
-:refpage: BaryCoordNoPerspNV
-
-code:BaryCoordNoPerspNV::
-
-The code:BaryCoordNoPerspNV decoration can: be used to decorate a fragment
-shader input variable.
-This variable will contain a three-component floating-point vector with
-barycentric weights that indicate the location of the fragment relative to
-the screen-space locations of vertices of its primitive, obtained using
-linear interpolation.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-BaryCoordNoPerspNV-04160]]
-    The code:BaryCoordNoPerspNV decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-BaryCoordNoPerspNV-04161]]
-    The variable decorated with code:BaryCoordNoPerspNV must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-BaryCoordNoPerspNV-04162]]
-    The variable decorated with code:BaryCoordNoPerspNV must: be declared as
-    a three-component vector of 32-bit floating-point values
-****
---
-endif::VK_NV_fragment_shader_barycentric[]
-
-ifdef::VK_AMD_shader_explicit_vertex_parameter[]
-[open,refpage='BaryCoordNoPerspCentroidAMD',desc='Barycentric coordinates of a fragment centroid in screen-space',type='builtins']
---
-:refpage: BaryCoordNoPerspCentroidAMD
-
-code:BaryCoordNoPerspCentroidAMD::
-
-The code:BaryCoordNoPerspCentroidAMD decoration can: be used to decorate a
-fragment shader input variable.
-This variable will contain the (I,J) pair of the barycentric coordinates
-corresponding to the fragment evaluated using linear interpolation at the
-centroid.
-The K coordinate of the barycentric coordinates can: be derived given the
-identity I {plus} J {plus} K = 1.0.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-BaryCoordNoPerspCentroidAMD-04163]]
-    The code:BaryCoordNoPerspCentroidAMD decoration must: be used only
-    within the code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-BaryCoordNoPerspCentroidAMD-04164]]
-    The variable decorated with code:BaryCoordNoPerspCentroidAMD must: be
-    declared using the code:Input {StorageClass}
-  * [[VUID-{refpage}-BaryCoordNoPerspCentroidAMD-04165]]
-    The variable decorated with code:BaryCoordNoPerspCentroidAMD must: be
-    declared as a three-component vector of 32-bit floating-point values
-****
---
-
-[open,refpage='BaryCoordNoPerspSampleAMD',desc='Barycentric coordinates of a sample center in screen-space',type='builtins']
---
-:refpage: BaryCoordNoPerspSampleAMD
-
-code:BaryCoordNoPerspSampleAMD::
-
-The code:BaryCoordNoPerspSampleAMD decoration can: be used to decorate a
-fragment shader input variable.
-This variable will contain the (I,J) pair of the barycentric coordinates
-corresponding to the fragment evaluated using linear interpolation at each
-covered sample.
-The K coordinate of the barycentric coordinates can: be derived given the
-identity I {plus} J {plus} K = 1.0.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-BaryCoordNoPerspSampleAMD-04166]]
-    The code:BaryCoordNoPerspSampleAMD decoration must: be used only within
-    the code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-BaryCoordNoPerspSampleAMD-04167]]
-    The variable decorated with code:BaryCoordNoPerspSampleAMD must: be
-    declared using the code:Input {StorageClass}
-  * [[VUID-{refpage}-BaryCoordNoPerspSampleAMD-04168]]
-    The variable decorated with code:BaryCoordNoPerspSampleAMD must: be
-    declared as a two-component vector of 32-bit floating-point values
-****
---
-
-[open,refpage='BaryCoordPullModelAMD',desc='Inverse barycentric coordinates of a fragment center',type='builtins']
---
-:refpage: BaryCoordPullModelAMD
-
-code:BaryCoordPullModelAMD::
-
-The code:BaryCoordPullModelAMD decoration can: be used to decorate a
-fragment shader input variable.
-This variable will contain (1/W, 1/I, 1/J) evaluated at the fragment center
-and can: be used to calculate gradients and then interpolate I, J, and W at
-any desired sample location.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-BaryCoordPullModelAMD-04169]]
-    The code:BaryCoordPullModelAMD decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-BaryCoordPullModelAMD-04170]]
-    The variable decorated with code:BaryCoordPullModelAMD must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-BaryCoordPullModelAMD-04171]]
-    The variable decorated with code:BaryCoordPullModelAMD must: be declared
-    as a three-component vector of 32-bit floating-point values
-****
---
-
-[open,refpage='BaryCoordSmoothAMD',desc='Barycentric coordinates of a fragment center',type='builtins']
---
-:refpage: BaryCoordSmoothAMD
-
-code:BaryCoordSmoothAMD::
-
-The code:BaryCoordSmoothAMD decoration can: be used to decorate a fragment
-shader input variable.
-This variable will contain the (I,J) pair of the barycentric coordinates
-corresponding to the fragment evaluated using perspective interpolation at
-the fragment's center.
-The K coordinate of the barycentric coordinates can: be derived given the
-identity I {plus} J {plus} K = 1.0.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-BaryCoordSmoothAMD-04172]]
-    The code:BaryCoordSmoothAMD decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-BaryCoordSmoothAMD-04173]]
-    The variable decorated with code:BaryCoordSmoothAMD must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-BaryCoordSmoothAMD-04174]]
-    The variable decorated with code:BaryCoordSmoothAMD must: be declared as
-    a two-component vector of 32-bit floating-point values
-****
---
-
-[open,refpage='BaryCoordSmoothCentroidAMD',desc='Barycentric coordinates of a fragment centroid',type='builtins']
---
-:refpage: BaryCoordSmoothCentroidAMD
-
-code:BaryCoordSmoothCentroidAMD::
-
-The code:BaryCoordSmoothCentroidAMD decoration can: be used to decorate a
-fragment shader input variable.
-This variable will contain the (I,J) pair of the barycentric coordinates
-corresponding to the fragment evaluated using perspective interpolation at
-the centroid.
-The K coordinate of the barycentric coordinates can: be derived given the
-identity I {plus} J {plus} K = 1.0.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-BaryCoordSmoothCentroidAMD-04175]]
-    The code:BaryCoordSmoothCentroidAMD decoration must: be used only within
-    the code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-BaryCoordSmoothCentroidAMD-04176]]
-    The variable decorated with code:BaryCoordSmoothCentroidAMD must: be
-    declared using the code:Input {StorageClass}
-  * [[VUID-{refpage}-BaryCoordSmoothCentroidAMD-04177]]
-    The variable decorated with code:BaryCoordSmoothCentroidAMD must: be
-    declared as a two-component vector of 32-bit floating-point values
-****
---
-
-[open,refpage='BaryCoordSmoothSampleAMD',desc='Barycentric coordinates of a sample center',type='builtins']
---
-:refpage: BaryCoordSmoothSampleAMD
-
-code:BaryCoordSmoothSampleAMD::
-
-The code:BaryCoordSmoothSampleAMD decoration can: be used to decorate a
-fragment shader input variable.
-This variable will contain the (I,J) pair of the barycentric coordinates
-corresponding to the fragment evaluated using perspective interpolation at
-each covered sample.
-The K coordinate of the barycentric coordinates can: be derived given the
-identity I {plus} J {plus} K = 1.0.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-BaryCoordSmoothSampleAMD-04178]]
-    The code:BaryCoordSmoothSampleAMD decoration must: be used only within
-    the code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-BaryCoordSmoothSampleAMD-04179]]
-    The variable decorated with code:BaryCoordSmoothSampleAMD must: be
-    declared using the code:Input {StorageClass}
-  * [[VUID-{refpage}-BaryCoordSmoothSampleAMD-04180]]
-    The variable decorated with code:BaryCoordSmoothSampleAMD must: be
-    declared as a two-component vector of 32-bit floating-point values
-****
---
-endif::VK_AMD_shader_explicit_vertex_parameter[]
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_shader_draw_parameters[]
-[[interfaces-builtin-variables-baseinstance]]
-[open,refpage='BaseInstance',desc='First instance being rendered',type='builtins']
---
-:refpage: BaseInstance
-
-code:BaseInstance::
-
-Decorating a variable with the code:BaseInstance built-in will make that
-variable contain the integer value corresponding to the first instance that
-was passed to the command that invoked the current vertex shader invocation.
-code:BaseInstance is the pname:firstInstance parameter to a _direct drawing
-command_ or the pname:firstInstance member of a structure consumed by an
-_indirect drawing command_.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-BaseInstance-04181]]
-    The code:BaseInstance decoration must: be used only within the
-    code:Vertex {ExecutionModel}
-  * [[VUID-{refpage}-BaseInstance-04182]]
-    The variable decorated with code:BaseInstance must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-BaseInstance-04183]]
-    The variable decorated with code:BaseInstance must: be declared as a
-    scalar 32-bit integer value
-****
---
-
-[[interfaces-builtin-variables-basevertex]]
-[open,refpage='BaseVertex',desc='First vertex being rendered',type='builtins']
---
-:refpage: BaseVertex
-
-code:BaseVertex::
-
-Decorating a variable with the code:BaseVertex built-in will make that
-variable contain the integer value corresponding to the first vertex or
-vertex offset that was passed to the command that invoked the current vertex
-shader invocation.
-For _non-indexed drawing commands_, this variable is the pname:firstVertex
-parameter to a _direct drawing command_ or the pname:firstVertex member of
-the structure consumed by an _indirect drawing command_.
-For _indexed drawing commands_, this variable is the pname:vertexOffset
-parameter to a _direct drawing command_ or the pname:vertexOffset member of
-the structure consumed by an _indirect drawing command_.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-BaseVertex-04184]]
-    The code:BaseVertex decoration must: be used only within the code:Vertex
-    {ExecutionModel}
-  * [[VUID-{refpage}-BaseVertex-04185]]
-    The variable decorated with code:BaseVertex must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-BaseVertex-04186]]
-    The variable decorated with code:BaseVertex must: be declared as a
-    scalar 32-bit integer value
-****
---
-endif::VK_VERSION_1_1,VK_KHR_shader_draw_parameters[]
-
-[open,refpage='ClipDistance',desc='Application-specified clip distances',type='builtins']
---
-:refpage: ClipDistance
-
-code:ClipDistance::
-
-Decorating a variable with the code:ClipDistance built-in decoration will
-make that variable contain the mechanism for controlling user clipping.
-code:ClipDistance is an array such that the i^th^ element of the array
-specifies the clip distance for plane i.
-A clip distance of 0 means the vertex is on the plane, a positive distance
-means the vertex is inside the clip half-space, and a negative distance
-means the vertex is outside the clip half-space.
-
-[NOTE]
-.Note
-====
-The array variable decorated with code:ClipDistance is explicitly sized by
-the shader.
-====
-
-[NOTE]
-.Note
-====
-In the last <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization
-shader stage>>, these values will be linearly interpolated across the
-primitive and the portion of the primitive with interpolated distances less
-than 0 will be considered outside the clip volume.
-If code:ClipDistance is then used by a fragment shader, code:ClipDistance
-contains these linearly interpolated values.
-====
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-ClipDistance-04187]]
-    The code:ClipDistance decoration must: be used only within the
-    code:MeshNV, code:Vertex, code:Fragment, code:TessellationControl,
-    code:TessellationEvaluation, or code:Geometry {ExecutionModel}
-  * [[VUID-{refpage}-ClipDistance-04188]]
-    The variable decorated with code:ClipDistance within the code:MeshNV or
-    code:Vertex {ExecutionModel} must: be declared using the code:Output
-    {StorageClass}
-  * [[VUID-{refpage}-ClipDistance-04189]]
-    The variable decorated with code:ClipDistance within the code:Fragment
-    {ExecutionModel} must: be declared using the code:Input {StorageClass}
-  * [[VUID-{refpage}-ClipDistance-04190]]
-    The variable decorated with code:ClipDistance within the
-    code:TessellationControl, code:TessellationEvaluation, or code:Geometry
-    {ExecutionModel} must: not be declared in a {StorageClass} other than
-    code:Input or code:Output
-  * [[VUID-{refpage}-ClipDistance-04191]]
-    The variable decorated with code:ClipDistance must: be declared as an
-    array of 32-bit floating-point values
-****
---
-
-ifdef::VK_NV_mesh_shader[]
-[[interfaces-builtin-variables-clipdistancepv]]
-[open,refpage='ClipDistancePerViewNV',desc='Application-specified clip distances per view',type='builtins']
---
-:refpage: ClipDistancePerViewNV
-
-code:ClipDistancePerViewNV::
-
-Decorating a variable with the code:ClipDistancePerViewNV built-in
-decoration will make that variable contain the per-view clip distances.
-The per-view clip distances have the same semantics as code:ClipDistance.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-ClipDistancePerViewNV-04192]]
-    The code:ClipDistancePerViewNV decoration must: be used only within the
-    code:MeshNV {ExecutionModel}
-  * [[VUID-{refpage}-ClipDistancePerViewNV-04193]]
-    The variable decorated with code:ClipDistancePerViewNV must: be declared
-    using the code:Output {StorageClass}
-  * [[VUID-{refpage}-ClipDistancePerViewNV-04194]]
-    The variable decorated with code:ClipDistancePerViewNV must: also be
-    decorated with the code:PerViewNV decoration
-  * [[VUID-{refpage}-ClipDistancePerViewNV-04195]]
-    The variable decorated with code:ClipDistancePerViewNV must: be declared
-    as a two-dimensional array of 32-bit floating-point values
-****
---
-endif::VK_NV_mesh_shader[]
-
-[open,refpage='CullDistance',desc='Application-specified cull distances',type='builtins']
---
-:refpage: CullDistance
-
-code:CullDistance::
-
-Decorating a variable with the code:CullDistance built-in decoration will
-make that variable contain the mechanism for controlling user culling.
-If any member of this array is assigned a negative value for all vertices
-belonging to a primitive, then the primitive is discarded before
-rasterization.
-
-[NOTE]
-.Note
-====
-In fragment shaders, the values of the code:CullDistance array are linearly
-interpolated across each primitive.
-====
-
-[NOTE]
-.Note
-====
-If code:CullDistance decorates an input variable, that variable will contain
-the corresponding value from the code:CullDistance decorated output variable
-from the previous shader stage.
-====
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-CullDistance-04196]]
-    The code:CullDistance decoration must: be used only within the
-    code:MeshNV, code:Vertex, code:Fragment, code:TessellationControl,
-    code:TessellationEvaluation, or code:Geometry {ExecutionModel}
-  * [[VUID-{refpage}-CullDistance-04197]]
-    The variable decorated with code:CullDistance within the code:MeshNV or
-    code:Vertex {ExecutionModel} must: be declared using the code:Output
-    {StorageClass}
-  * [[VUID-{refpage}-CullDistance-04198]]
-    The variable decorated with code:CullDistance within the code:Fragment
-    {ExecutionModel} must: be declared using the code:Input {StorageClass}
-  * [[VUID-{refpage}-CullDistance-04199]]
-    The variable decorated with code:CullDistance within the
-    code:TessellationControl, code:TessellationEvaluation, or code:Geometry
-    {ExecutionModel} must: not be declared using a {StorageClass} other than
-    code:Input or code:Output
-  * [[VUID-{refpage}-CullDistance-04200]]
-    The variable decorated with code:CullDistance must: be declared as an
-    array of 32-bit floating-point values
-****
---
-
-ifdef::VK_NV_mesh_shader[]
-[[interfaces-builtin-variables-culldistancepv]]
-[open,refpage='CullDistancePerViewNV',desc='Application-specified cull distances per view',type='builtins']
---
-:refpage: CullDistancePerViewNV
-
-code:CullDistancePerViewNV::
-
-Decorating a variable with the code:CullDistancePerViewNV built-in
-decoration will make that variable contain the per-view cull distances.
-The per-view cull distances have the same semantics as code:CullDistance.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-CullDistancePerViewNV-04201]]
-    The code:CullDistancePerViewNV decoration must: be used only within the
-    code:MeshNV {ExecutionModel}
-  * [[VUID-{refpage}-CullDistancePerViewNV-04202]]
-    The variable decorated with code:CullDistancePerViewNV must: be declared
-    using the code:Output {StorageClass}
-  * [[VUID-{refpage}-CullDistancePerViewNV-04203]]
-    The variable decorated with code:CullDistancePerViewNV must: also be
-    decorated with the code:PerViewNV decoration
-  * [[VUID-{refpage}-CullDistancePerViewNV-04204]]
-    The variable decorated with code:CullDistancePerViewNV must: be declared
-    as a two-dimensional array of 32-bit floating-point values
-****
---
-endif::VK_NV_mesh_shader[]
-
-ifdef::VK_NV_ray_tracing_motion_blur[]
-[[interfaces-builtin-variables-currentraytime]]
-[open,refpage='CurrentRayTimeNV',desc='Time value of a ray intersection',type='builtins']
---
-:refpage: CurrentRayTimeNV
-
-code:CurrentRayTimeNV::
-
-A variable decorated with the code:CurrentRayTimeNV decoration contains the
-time value passed in to code:OpTraceRayMotionNV which called this shader.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-CurrentRayTimeNV-04942]]
-    The code:CurrentRayTimeNV decoration must: be used only within the
-    code:IntersectionKHR, code:AnyHitKHR, code:ClosestHitKHR, or
-    code:MissKHR {ExecutionModel}
-  * [[VUID-{refpage}-CurrentRayTimeNV-04943]]
-    The variable decorated with code:CurrentRayTimeNV must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-CurrentRayTimeNV-04944]]
-    The variable decorated with code:CurrentRayTimeNV must: be declared as a
-    scalar 32-bit floating-point value
-****
---
-endif::VK_NV_ray_tracing_motion_blur[]
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[[interfaces-builtin-variables-deviceindex]]
-[open,refpage='DeviceIndex',desc='Index of the device executing the shader',type='builtins']
---
-:refpage: DeviceIndex
-
-code:DeviceIndex::
-
-The code:DeviceIndex decoration can: be applied to a shader input which will
-be filled with the device index of the physical device that is executing the
-current shader invocation.
-This value will be in the range latexmath:[[0,max(1,physicalDeviceCount))],
-where physicalDeviceCount is the pname:physicalDeviceCount member of
-slink:VkDeviceGroupDeviceCreateInfo.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-DeviceIndex-04205]]
-    The variable decorated with code:DeviceIndex must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-DeviceIndex-04206]]
-    The variable decorated with code:DeviceIndex must: be declared as a
-    scalar 32-bit integer value
-****
---
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_shader_draw_parameters[]
-[[interfaces-builtin-variables-drawindex]]
-[open,refpage='DrawIndex',desc='Index of the current draw',type='builtins']
---
-:refpage: DrawIndex
-
-code:DrawIndex::
-
-Decorating a variable with the code:DrawIndex built-in will make that
-variable contain the integer value corresponding to the zero-based index of
-the drawing command that invoked the current
-ifdef::VK_NV_mesh_shader[]
-task, mesh, or
-endif::VK_NV_mesh_shader[]
-vertex shader invocation.
-For _indirect drawing commands_, code:DrawIndex begins at zero and
-increments by one for each drawing command executed.
-The number of drawing commands is given by the pname:drawCount parameter.
-For _direct drawing commands_,
-ifdef::VK_EXT_multi_draw[]
-if flink:vkCmdDrawMultiEXT or flink:vkCmdDrawMultiIndexedEXT is used, this
-variable contains the integer value corresponding to the zero-based index of
-the draw command.
-Otherwise
-endif::VK_EXT_multi_draw[]
-code:DrawIndex is always zero.
-code:DrawIndex is dynamically uniform.
-
-ifdef::VK_NV_mesh_shader[]
-When task or mesh shaders are used, only the first active stage will have
-proper access to the variable.
-The value read by other stages is undefined:.
-endif::VK_NV_mesh_shader[]
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-DrawIndex-04207]]
-    The code:DrawIndex decoration must: be used only within the code:Vertex,
-    code:MeshNV, or code:TaskNV {ExecutionModel}
-  * [[VUID-{refpage}-DrawIndex-04208]]
-    The variable decorated with code:DrawIndex must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-DrawIndex-04209]]
-    The variable decorated with code:DrawIndex must: be declared as a scalar
-    32-bit integer value
-****
---
-endif::VK_VERSION_1_1,VK_KHR_shader_draw_parameters[]
-
-[open,refpage='FragCoord',desc='Screen-space coordinate of the fragment center',type='builtins']
---
-:refpage: FragCoord
-
-code:FragCoord::
-
-Decorating a variable with the code:FragCoord built-in decoration will make
-that variable contain the framebuffer coordinate
-latexmath:[(x,y,z,\frac{1}{w})] of the fragment being processed.
-The [eq]#(x,y)# coordinate [eq]#(0,0)# is the upper left corner of the upper
-left pixel in the framebuffer.
-+
-When <<primsrast-sampleshading,Sample Shading>> is enabled, the [eq]#x# and
-[eq]#y# components of code:FragCoord reflect the location of one of the
-samples corresponding to the shader invocation.
-+
-Otherwise, the [eq]#x# and [eq]#y# components of code:FragCoord reflect the
-location of the center of the fragment.
-+
-The [eq]#z# component of code:FragCoord is the interpolated depth value of
-the primitive.
-+
-The [eq]#w# component is the interpolated latexmath:[\frac{1}{w}].
-+
-The code:Centroid interpolation decoration is ignored, but allowed, on
-code:FragCoord.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-FragCoord-04210]]
-    The code:FragCoord decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-FragCoord-04211]]
-    The variable decorated with code:FragCoord must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-FragCoord-04212]]
-    The variable decorated with code:FragCoord must: be declared as a
-    four-component vector of 32-bit floating-point values
-****
---
-
-[[interfaces-builtin-variables-fragdepth]]
-[open,refpage='FragDepth',desc='Application-specified depth for depth testing',type='builtins']
---
-:refpage: FragDepth
-
-code:FragDepth::
-
-To have a shader supply a fragment-depth value, the shader must: declare the
-code:DepthReplacing execution mode.
-Such a shader's fragment-depth value will come from the variable decorated
-with the code:FragDepth built-in decoration.
-+
-This value will be used for any subsequent depth testing performed by the
-implementation or writes to the depth attachment.
-See <<fragops-shader-depthreplacement, fragment shader depth replacement>>
-for details.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-FragDepth-04213]]
-    The code:FragDepth decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-FragDepth-04214]]
-    The variable decorated with code:FragDepth must: be declared using the
-    code:Output {StorageClass}
-  * [[VUID-{refpage}-FragDepth-04215]]
-    The variable decorated with code:FragDepth must: be declared as a scalar
-    32-bit floating-point value
-  * [[VUID-{refpage}-FragDepth-04216]]
-    If the shader dynamically writes to the variable decorated with
-    code:FragDepth, the code:DepthReplacing {ExecutionMode} must: be
-    declared
-****
---
-
-ifdef::VK_EXT_fragment_density_map[]
-[[interfaces-builtin-variables-fraginvocationcount]]
-[open,refpage='FragInvocationCountEXT',desc='Number of fragment shader invocations for a fragment',type='builtins']
---
-:refpage: FragInvocationCountEXT
-
-code:FragInvocationCountEXT::
-
-Decorating a variable with the code:FragInvocationCountEXT built-in
-decoration will make that variable contain the maximum number of fragment
-shader invocations for the fragment, as determined by
-pname:minSampleShading.
-+
-If <<primsrast-sampleshading,Sample Shading>> is not enabled,
-code:FragInvocationCountEXT will be filled with a value of 1.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-FragInvocationCountEXT-04217]]
-    The code:FragInvocationCountEXT decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-FragInvocationCountEXT-04218]]
-    The variable decorated with code:FragInvocationCountEXT must: be
-    declared using the code:Input {StorageClass}
-  * [[VUID-{refpage}-FragInvocationCountEXT-04219]]
-    The variable decorated with code:FragInvocationCountEXT must: be
-    declared as a scalar 32-bit integer value
-****
---
-endif::VK_EXT_fragment_density_map[]
-
-ifdef::VK_EXT_fragment_density_map[]
-[[interfaces-builtin-variables-fragsize]]
-[open,refpage='FragSizeEXT',desc='Size of the screen-space area covered by the fragment',type='builtins']
---
-:refpage: FragSizeEXT
-
-code:FragSizeEXT::
-
-Decorating a variable with the code:FragSizeEXT built-in decoration will
-make that variable contain the dimensions in pixels of the
-<<glossary-fragment-area,area>> that the fragment covers for that
-invocation.
-+
-If fragment density map is not enabled, code:FragSizeEXT will be filled with
-a value of [eq]#(1,1)#.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-FragSizeEXT-04220]]
-    The code:FragSizeEXT decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-FragSizeEXT-04221]]
-    The variable decorated with code:FragSizeEXT must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-FragSizeEXT-04222]]
-    The variable decorated with code:FragSizeEXT must: be declared as a
-    two-component vector of 32-bit integer values
-****
---
-endif::VK_EXT_fragment_density_map[]
-
-ifdef::VK_EXT_shader_stencil_export[]
-[[interfaces-builtin-variables-fragstencilref]]
-[open,refpage='FragStencilRefEXT',desc='Application-specified stencil reference value used in stencil tests',type='builtins']
---
-:refpage: FragStencilRefEXT
-
-code:FragStencilRefEXT::
-
-Decorating a variable with the code:FragStencilRefEXT built-in decoration
-will make that variable contain the new stencil reference value for all
-samples covered by the fragment.
-This value will be used as the stencil reference value used in stencil
-testing.
-+
-To write to code:FragStencilRefEXT, a shader must: declare the
-code:StencilRefReplacingEXT execution mode.
-If a shader declares the code:StencilRefReplacingEXT execution mode and
-there is an execution path through the shader that does not set
-code:FragStencilRefEXT, then the fragment's stencil reference value is
-undefined: for executions of the shader that take that path.
-+
-Only the least significant *s* bits of the integer value of the variable
-decorated with code:FragStencilRefEXT are considered for stencil testing,
-where *s* is the number of bits in the stencil framebuffer attachment, and
-higher order bits are discarded.
-+
-See <<fragops-shader-stencilrefreplacement, fragment shader stencil
-reference replacement>> for more details.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-FragStencilRefEXT-04223]]
-    The code:FragStencilRefEXT decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-FragStencilRefEXT-04224]]
-    The variable decorated with code:FragStencilRefEXT must: be declared
-    using the code:Output {StorageClass}
-  * [[VUID-{refpage}-FragStencilRefEXT-04225]]
-    The variable decorated with code:FragStencilRefEXT must: be declared as
-    a scalar integer value
-****
---
-endif::VK_EXT_shader_stencil_export[]
-
-ifdef::VK_NV_shading_rate_image[]
-[open,refpage='FragmentSizeNV',desc='Size of the screen-space area covered by the fragment',type='builtins']
---
-:refpage: FragmentSizeNV
-
-code:FragmentSizeNV::
-
-Decorating a variable with the code:FragmentSizeNV built-in decoration will
-make that variable contain the width and height of the fragment.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-FragmentSizeNV-04226]]
-    The code:FragmentSizeNV decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-FragmentSizeNV-04227]]
-    The variable decorated with code:FragmentSizeNV must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-FragmentSizeNV-04228]]
-    The variable decorated with code:FragmentSizeNV must: be declared as a
-    two-component vector of 32-bit integer values
-****
---
-endif::VK_NV_shading_rate_image[]
-
-
-[open,refpage='FrontFacing',desc='Front face determination of a fragment',type='builtins']
---
-:refpage: FrontFacing
-
-code:FrontFacing::
-
-Decorating a variable with the code:FrontFacing built-in decoration will
-make that variable contain whether the fragment is front or back facing.
-This variable is non-zero if the current fragment is considered to be part
-of a <<primsrast-polygons-basic,front-facing>> polygon primitive or of a
-non-polygon primitive and is zero if the fragment is considered to be part
-of a back-facing polygon primitive.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-FrontFacing-04229]]
-    The code:FrontFacing decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-FrontFacing-04230]]
-    The variable decorated with code:FrontFacing must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-FrontFacing-04231]]
-    The variable decorated with code:FrontFacing must: be declared as a
-    boolean value
-****
---
-
-ifdef::VK_EXT_conservative_rasterization[]
-[open,refpage='FullyCoveredEXT',desc='Indication of whether a fragment is fully covered',type='builtins']
---
-:refpage: FullyCoveredEXT
-
-code:FullyCoveredEXT::
-
-Decorating a variable with the code:FullyCoveredEXT built-in decoration will
-make that variable indicate whether the <<glossary-fragment-area,fragment
-area>> is fully covered by the generating primitive.
-This variable is non-zero if conservative rasterization is enabled and the
-current fragment area is fully covered by the generating primitive, and is
-zero if the fragment is not covered or partially covered, or conservative
-rasterization is disabled.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-FullyCoveredEXT-04232]]
-    The code:FullyCoveredEXT decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-FullyCoveredEXT-04233]]
-    The variable decorated with code:FullyCoveredEXT must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-FullyCoveredEXT-04234]]
-    The variable decorated with code:FullyCoveredEXT must: be declared as a
-    boolean value
-ifdef::VK_EXT_post_depth_coverage[]
-  * [[VUID-{refpage}-conservativeRasterizationPostDepthCoverage-04235]]
-    If
-    sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:conservativeRasterizationPostDepthCoverage
-    is not supported the code:PostDepthCoverage {ExecutionMode} must: not be
-    declared, when a variable with the code:FullyCoveredEXT decoration is
-    declared
-endif::VK_EXT_post_depth_coverage[]
-****
---
-endif::VK_EXT_conservative_rasterization[]
-
-[open,refpage='GlobalInvocationId',desc='Global invocation ID',type='builtins']
---
-:refpage: GlobalInvocationId
-
-code:GlobalInvocationId::
-
-Decorating a variable with the code:GlobalInvocationId built-in decoration
-will make that variable contain the location of the current invocation
-within the global workgroup.
-Each component is equal to the index of the local workgroup multiplied by
-the size of the local workgroup plus code:LocalInvocationId.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-GlobalInvocationId-04236]]
-    The code:GlobalInvocationId decoration must: be used only within the
-    code:GLCompute, code:MeshNV, or code:TaskNV {ExecutionModel}
-  * [[VUID-{refpage}-GlobalInvocationId-04237]]
-    The variable decorated with code:GlobalInvocationId must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-GlobalInvocationId-04238]]
-    The variable decorated with code:GlobalInvocationId must: be declared as
-    a three-component vector of 32-bit integer values
-****
---
-
-[open,refpage='HelperInvocation',desc='Indication of whether a fragment shader is a helper invocation',type='builtins']
---
-:refpage: HelperInvocation
-
-code:HelperInvocation::
-
-Decorating a variable with the code:HelperInvocation built-in decoration
-will make that variable contain whether the current invocation is a helper
-invocation.
-This variable is non-zero if the current fragment being shaded is a helper
-invocation and zero otherwise.
-A helper invocation is an invocation of the shader that is produced to
-satisfy internal requirements such as the generation of derivatives.
-
-[NOTE]
-.Note
-====
-It is very likely that a helper invocation will have a value of
-code:SampleMask fragment shader input value that is zero.
-====
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-HelperInvocation-04239]]
-    The code:HelperInvocation decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-HelperInvocation-04240]]
-    The variable decorated with code:HelperInvocation must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-HelperInvocation-04241]]
-    The variable decorated with code:HelperInvocation must: be declared as a
-    boolean value
-****
---
-
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-[[interfaces-builtin-variables-hitkind]]
-[open,refpage='HitKindKHR',desc='Kind of hit that triggered an any-hit or closest hit ray shader',type='builtins']
---
-:refpage: HitKindKHR
-
-code:HitKindKHR::
-
-A variable decorated with the code:HitKindKHR decoration will describe the
-intersection that triggered the execution of the current shader.
-The values are determined by the intersection shader.
-For user-defined intersection shaders this is the value that was passed to
-the "`Hit Kind`" operand of code:OpReportIntersectionKHR.
-For triangle intersection candidates, this will be one of
-code:HitKindFrontFacingTriangleKHR or code:HitKindBackFacingTriangleKHR.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-HitKindKHR-04242]]
-    The code:HitKindKHR decoration must: be used only within the
-    code:AnyHitKHR or code:ClosestHitKHR {ExecutionModel}
-  * [[VUID-{refpage}-HitKindKHR-04243]]
-    The variable decorated with code:HitKindKHR must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-HitKindKHR-04244]]
-    The variable decorated with code:HitKindKHR must: be declared as a
-    scalar 32-bit integer value
-****
---
-
-ifdef::VK_NV_ray_tracing[]
-[[interfaces-builtin-variables-hitt]]
-[open,refpage='HitTNV',desc='T value of a ray intersection',type='builtins']
---
-:refpage: HitTNV
-
-code:HitTNV::
-
-A variable decorated with the code:HitTNV decoration is equivalent to a
-variable decorated with the code:RayTmaxKHR decoration.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-HitTNV-04245]]
-    The code:HitTNV decoration must: be used only within the code:AnyHitNV
-    or code:ClosestHitNV {ExecutionModel}
-  * [[VUID-{refpage}-HitTNV-04246]]
-    The variable decorated with code:HitTNV must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-HitTNV-04247]]
-    The variable decorated with code:HitTNV must: be declared as a scalar
-    32-bit floating-point value
-****
---
-endif::VK_NV_ray_tracing[]
-
-[[interfaces-builtin-variables-incomingrayflags]]
-[open,refpage='IncomingRayFlagsKHR',desc='Flags used to trace a ray',type='builtins']
---
-:refpage: IncomingRayFlagsKHR
-
-code:IncomingRayFlagsKHR::
-
-A variable with the code:IncomingRayFlagsKHR decoration will contain the ray
-flags passed in to the trace call that invoked this particular shader.
-Setting pipeline flags on the raytracing pipeline must: not cause any
-corresponding flags to be set in variables with this decoration.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-IncomingRayFlagsKHR-04248]]
-    The code:IncomingRayFlagsKHR decoration must: be used only within the
-    code:IntersectionKHR, code:AnyHitKHR, code:ClosestHitKHR, or
-    code:MissKHR {ExecutionModel}
-  * [[VUID-{refpage}-IncomingRayFlagsKHR-04249]]
-    The variable decorated with code:IncomingRayFlagsKHR must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-IncomingRayFlagsKHR-04250]]
-    The variable decorated with code:IncomingRayFlagsKHR must: be declared
-    as a scalar 32-bit integer value
-****
---
-
-[[interfaces-builtin-variables-instancecustomindex]]
-[open,refpage='InstanceCustomIndexKHR',desc='Custom index associated with an intersected instance',type='builtins']
---
-:refpage: InstanceCustomIndexKHR
-
-code:InstanceCustomIndexKHR::
-
-A variable decorated with the code:InstanceCustomIndexKHR decoration will
-contain the application-defined value of the instance that intersects the
-current ray.
-This variable contains the value that was specified in
-slink:VkAccelerationStructureInstanceKHR::pname:instanceCustomIndex for the
-current acceleration structure instance in the lower 24 bits and the upper 8
-bits will be zero.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-InstanceCustomIndexKHR-04251]]
-    The code:InstanceCustomIndexKHR decoration must: be used only within the
-    code:IntersectionKHR, code:AnyHitKHR, or code:ClosestHitKHR
-    {ExecutionModel}
-  * [[VUID-{refpage}-InstanceCustomIndexKHR-04252]]
-    The variable decorated with code:InstanceCustomIndexKHR must: be
-    declared using the code:Input {StorageClass}
-  * [[VUID-{refpage}-InstanceCustomIndexKHR-04253]]
-    The variable decorated with code:InstanceCustomIndexKHR must: be
-    declared as a scalar 32-bit integer value
-****
---
-
-[[interfaces-builtin-variables-instanceid]]
-[open,refpage='InstanceId',desc='Id associated with an intersected instance',type='builtins']
---
-:refpage: InstanceId
-
-code:InstanceId::
-
-Decorating a variable in an intersection, any-hit, or closest hit shader
-with the code:InstanceId decoration will make that variable contain the
-index of the instance that intersects the current ray.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-InstanceId-04254]]
-    The code:InstanceId decoration must: be used only within the
-    code:IntersectionKHR, code:AnyHitKHR, or code:ClosestHitKHR
-    {ExecutionModel}
-  * [[VUID-{refpage}-InstanceId-04255]]
-    The variable decorated with code:InstanceId must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-InstanceId-04256]]
-    The variable decorated with code:InstanceId must: be declared as a
-    scalar 32-bit integer value
-****
---
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-
-[open,refpage='InvocationId',desc='Invocation ID in a geometry or tessellation control shader',type='builtins']
---
-:refpage: InvocationId
-
-code:InvocationId::
-
-Decorating a variable with the code:InvocationId built-in decoration will
-make that variable contain the index of the current shader invocation in a
-geometry shader, or the index of the output patch vertex in a tessellation
-control shader.
-+
-In a geometry shader, the index of the current shader invocation ranges from
-zero to the number of <<geometry-invocations,instances>> declared in the
-shader minus one.
-If the instance count of the geometry shader is one or is not specified,
-then code:InvocationId will be zero.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-InvocationId-04257]]
-    The code:InvocationId decoration must: be used only within the
-    code:TessellationControl or code:Geometry {ExecutionModel}
-  * [[VUID-{refpage}-InvocationId-04258]]
-    The variable decorated with code:InvocationId must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-InvocationId-04259]]
-    The variable decorated with code:InvocationId must: be declared as a
-    scalar 32-bit integer value
-****
---
-
-ifdef::VK_NV_shading_rate_image[]
-[open,refpage='InvocationsPerPixelNV',desc='Number of fragment shader invocations for the current pixel',type='builtins']
---
-:refpage: InvocationsPerPixelNV
-
-code:InvocationsPerPixelNV::
-
-Decorating a variable with the code:InvocationsPerPixelNV built-in
-decoration will make that variable contain the maximum number of fragment
-shader invocations per pixel, as derived from the effective shading rate for
-the fragment.
-If a primitive does not fully cover a pixel, the number of fragment shader
-invocations for that pixel may: be less than the value of
-code:InvocationsPerPixelNV.
-If the shading rate indicates a fragment covering multiple pixels, then
-code:InvocationsPerPixelNV will be one.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-InvocationsPerPixelNV-04260]]
-    The code:InvocationsPerPixelNV decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-InvocationsPerPixelNV-04261]]
-    The variable decorated with code:InvocationsPerPixelNV must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-InvocationsPerPixelNV-04262]]
-    The variable decorated with code:InvocationsPerPixelNV must: be declared
-    as a scalar 32-bit integer value
-****
---
-endif::VK_NV_shading_rate_image[]
-
-[open,refpage='InstanceIndex',desc='Index of an instance',type='builtins']
---
-:refpage: InstanceIndex
-
-code:InstanceIndex::
-
-Decorating a variable in a vertex shader with the code:InstanceIndex
-built-in decoration will make that variable contain the index of the
-instance that is being processed by the current vertex shader invocation.
-code:InstanceIndex begins at the pname:firstInstance parameter to
-flink:vkCmdDraw or flink:vkCmdDrawIndexed or at the pname:firstInstance
-member of a structure consumed by flink:vkCmdDrawIndirect or
-flink:vkCmdDrawIndexedIndirect.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-InstanceIndex-04263]]
-    The code:InstanceIndex decoration must: be used only within the
-    code:Vertex {ExecutionModel}
-  * [[VUID-{refpage}-InstanceIndex-04264]]
-    The variable decorated with code:InstanceIndex must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-InstanceIndex-04265]]
-    The variable decorated with code:InstanceIndex must: be declared as a
-    scalar 32-bit integer value
-****
---
-
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-[[interfaces-builtin-variables-launchid]]
-[open,refpage='LaunchIdKHR',desc='Launch Id for ray shaders',type='builtins']
---
-:refpage: LaunchIdKHR
-
-code:LaunchIdKHR::
-
-A variable decorated with the code:LaunchIdKHR decoration will specify the
-index of the work item being processed.
-One work item is generated for each of the pname:width {times} pname:height
-{times} pname:depth items dispatched by a flink:vkCmdTraceRaysKHR command.
-All shader invocations inherit the same value for variables decorated with
-code:LaunchIdKHR.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-LaunchIdKHR-04266]]
-    The code:LaunchIdKHR decoration must: be used only within the
-    code:RayGenerationKHR, code:IntersectionKHR, code:AnyHitKHR,
-    code:ClosestHitKHR, code:MissKHR, or code:CallableKHR {ExecutionModel}
-  * [[VUID-{refpage}-LaunchIdKHR-04267]]
-    The variable decorated with code:LaunchIdKHR must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-LaunchIdKHR-04268]]
-    The variable decorated with code:LaunchIdKHR must: be declared as a
-    three-component vector of 32-bit integer values
-****
---
-
-[[interfaces-builtin-variables-launchsize]]
-[open,refpage='LaunchSizeKHR',desc='Launch dimensions for ray shaders',type='builtins']
---
-:refpage: LaunchSizeKHR
-
-code:LaunchSizeKHR::
-
-A variable decorated with the code:LaunchSizeKHR decoration will contain the
-pname:width, pname:height, and pname:depth dimensions passed to the
-flink:vkCmdTraceRaysKHR command that initiated this shader execution.
-The pname:width is in the first component, the pname:height is in the second
-component, and the pname:depth is in the third component.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-LaunchSizeKHR-04269]]
-    The code:LaunchSizeKHR decoration must: be used only within the
-    code:RayGenerationKHR, code:IntersectionKHR, code:AnyHitKHR,
-    code:ClosestHitKHR, code:MissKHR, or code:CallableKHR {ExecutionModel}
-  * [[VUID-{refpage}-LaunchSizeKHR-04270]]
-    The variable decorated with code:LaunchSizeKHR must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-LaunchSizeKHR-04271]]
-    The variable decorated with code:LaunchSizeKHR must: be declared as a
-    three-component vector of 32-bit integer values
-****
---
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-
-[[interfaces-builtin-variables-layer]]
-[open,refpage='Layer',desc='Layer index for layered rendering',type='builtins']
---
-:refpage: Layer
-
-code:Layer::
-
-Decorating a variable with the code:Layer built-in decoration will make that
-variable contain the select layer of a multi-layer framebuffer attachment.
-+
-In a
-ifdef::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer,VK_NV_viewport_array2[]
-ifdef::VK_NV_mesh_shader[]
-mesh,
-endif::VK_NV_mesh_shader[]
-vertex, tessellation evaluation, or
-endif::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer,VK_NV_viewport_array2[]
-geometry shader, any variable decorated with code:Layer can be written with
-the framebuffer layer index to which the primitive produced by that shader
-will be directed.
-ifdef::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer,VK_NV_viewport_array2[]
-+
-The last active
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> (in pipeline order) controls the code:Layer that is used.
-Outputs in previous shader stages are not used, even if the last stage fails
-to write the code:Layer.
-endif::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer,VK_NV_viewport_array2[]
-+
-If the last active
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> shader entry point's interface does not include a variable decorated
-with code:Layer, then the first layer is used.
-If a <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> shader entry point's interface includes a variable decorated with
-code:Layer, it must: write the same value to code:Layer for all output
-vertices of a given primitive.
-If the code:Layer value is less than 0 or greater than or equal to the
-number of layers in the framebuffer, then primitives may: still be
-rasterized, fragment shaders may: be executed, and the framebuffer values
-for all layers are undefined:.
-+
-ifdef::VK_NV_viewport_array2[]
-If a variable with the code:Layer decoration is also decorated with
-code:ViewportRelativeNV, then the code:ViewportIndex is added to the layer
-that is used for rendering and that is made available in the fragment
-shader.
-If the shader writes to a variable decorated code:ViewportMaskNV, then the
-layer selected has a different value for each viewport a primitive is
-rendered to.
-endif::VK_NV_viewport_array2[]
-+
-In a fragment shader, a variable decorated with code:Layer contains the
-layer index of the primitive that the fragment invocation belongs to.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-Layer-04272]]
-    The code:Layer decoration must: be used only within the code:MeshNV,
-    code:Vertex, code:TessellationEvaluation, code:Geometry, or
-    code:Fragment {ExecutionModel}
-ifdef::VK_VERSION_1_2[]
-  * [[VUID-{refpage}-Layer-04273]]
-    If the <<features-shaderOutputLayer,shaderOutputLayer>> feature is not
-    enabled then the code:Layer decoration must: be used only within the
-    code:Geometry or code:Fragment {ExecutionModel}
-endif::VK_VERSION_1_2[]
-  * [[VUID-{refpage}-Layer-04274]]
-    The variable decorated with code:Layer within the code:MeshNV,
-    code:Vertex, code:TessellationEvaluation, or code:Geometry
-    {ExecutionModel} must: be declared using the code:Output {StorageClass}
-  * [[VUID-{refpage}-Layer-04275]]
-    The variable decorated with code:Layer within the code:Fragment
-    {ExecutionModel} must: be declared using the code:Input {StorageClass}
-  * [[VUID-{refpage}-Layer-04276]]
-    The variable decorated with code:Layer must: be declared as a scalar
-    32-bit integer value
-****
---
-
-ifdef::VK_NV_mesh_shader[]
-[[interfaces-builtin-variables-layerpv]]
-[open,refpage='LayerPerViewNV',desc='Layer index per view for layered rendering',type='builtins']
---
-:refpage: LayerPerViewNV
-
-code:LayerPerViewNV::
-
-Decorating a variable with the code:LayerPerViewNV built-in decoration will
-make that variable contain the per-view layer information.
-The per-view layer has the same semantics as code:Layer, for each view.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-LayerPerViewNV-04277]]
-    The code:LayerPerViewNV decoration must: be used only within the
-    code:MeshNV {ExecutionModel}
-  * [[VUID-{refpage}-LayerPerViewNV-04278]]
-    The variable decorated with code:LayerPerViewNV must: be declared using
-    the code:Output {StorageClass}
-  * [[VUID-{refpage}-LayerPerViewNV-04279]]
-    The variable decorated with code:LayerPerViewNV must: also be decorated
-    with the code:PerViewNV decoration
-  * [[VUID-{refpage}-LayerPerViewNV-04280]]
-    The variable decorated with code:LayerPerViewNV must: be declared as an
-    array of scalar 32-bit integer values
-****
---
-endif::VK_NV_mesh_shader[]
-
-[open,refpage='LocalInvocationId',desc='Local invocation ID',type='builtins']
---
-:refpage: LocalInvocationId
-
-code:LocalInvocationId::
-
-Decorating a variable with the code:LocalInvocationId built-in decoration
-will make that variable contain the location of the current
-ifdef::VK_NV_mesh_shader[]
-task, mesh, or
-endif::VK_NV_mesh_shader[]
-compute shader invocation within the local workgroup.
-Each component ranges from zero through to the size of the workgroup in that
-dimension minus one.
-
-[NOTE]
-.Note
-====
-If the size of the workgroup in a particular dimension is one, then the
-code:LocalInvocationId in that dimension will be zero.
-If the workgroup is effectively two-dimensional, then
-code:LocalInvocationId.z will be zero.
-If the workgroup is effectively one-dimensional, then both
-code:LocalInvocationId.y and code:LocalInvocationId.z will be zero.
-====
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-LocalInvocationId-04281]]
-    The code:LocalInvocationId decoration must: be used only within the
-    code:GLCompute, code:MeshNV, or code:TaskNV {ExecutionModel}
-  * [[VUID-{refpage}-LocalInvocationId-04282]]
-    The variable decorated with code:LocalInvocationId must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-LocalInvocationId-04283]]
-    The variable decorated with code:LocalInvocationId must: be declared as
-    a three-component vector of 32-bit integer values
-****
---
-
-[open,refpage='LocalInvocationIndex',desc='Linear local invocation index',type='builtins']
---
-:refpage: LocalInvocationIndex
-
-code:LocalInvocationIndex::
-
-Decorating a variable with the code:LocalInvocationIndex built-in decoration
-will make that variable contain a one-dimensional representation of
-code:LocalInvocationId.
-This is computed as:
-+
-[source,c++]
-----
-LocalInvocationIndex =
-    LocalInvocationId.z * WorkgroupSize.x * WorkgroupSize.y +
-    LocalInvocationId.y * WorkgroupSize.x +
-    LocalInvocationId.x;
-----
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-LocalInvocationIndex-04284]]
-    The code:LocalInvocationIndex decoration must: be used only within the
-    code:GLCompute, code:MeshNV, or code:TaskNV {ExecutionModel}
-  * [[VUID-{refpage}-LocalInvocationIndex-04285]]
-    The variable decorated with code:LocalInvocationIndex must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-LocalInvocationIndex-04286]]
-    The variable decorated with code:LocalInvocationIndex must: be declared
-    as a scalar 32-bit integer value
-****
---
-
-ifdef::VK_NV_mesh_shader[]
-[[interfaces-builtin-variables-meshviewcount]]
-[open,refpage='MeshViewCountNV',desc='Number of views processed by a mesh or task shader',type='builtins']
---
-:refpage: MeshViewCountNV
-
-code:MeshViewCountNV::
-
-Decorating a variable with the code:MeshViewCountNV built-in decoration will
-make that variable contain the number of views processed by the current mesh
-or task shader invocations.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-MeshViewCountNV-04287]]
-    The code:MeshViewCountNV decoration must: be used only within the
-    code:MeshNV or code:TaskNV {ExecutionModel}
-  * [[VUID-{refpage}-MeshViewCountNV-04288]]
-    The variable decorated with code:MeshViewCountNV must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-MeshViewCountNV-04289]]
-    The variable decorated with code:MeshViewCountNV must: be declared as a
-    scalar 32-bit integer value
-****
---
-
-[[interfaces-builtin-variables-meshviewindices]]
-[open,refpage='MeshViewIndicesNV',desc='Indices of views processed by a mesh or task shader',type='builtins']
---
-:refpage: MeshViewIndicesNV
-
-code:MeshViewIndicesNV::
-
-Decorating a variable with the code:MeshViewIndicesNV built-in decoration
-will make that variable contain the mesh view indices.
-The mesh view indices is an array of values where each element holds the
-view number of one of the views being processed by the current mesh or task
-shader invocations.
-The values of array elements with indices greater than or equal to
-code:MeshViewCountNV are undefined:.
-If the value of code:MeshViewIndicesNV[i] is [eq]#j#, then any outputs
-decorated with code:PerViewNV will take on the value of array element
-[eq]#i# when processing primitives for view index [eq]#j#.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-MeshViewIndicesNV-04290]]
-    The code:MeshViewIndicesNV decoration must: be used only within the
-    code:MeshNV or code:TaskNV {ExecutionModel}
-  * [[VUID-{refpage}-MeshViewIndicesNV-04291]]
-    The variable decorated with code:MeshViewIndicesNV must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-MeshViewIndicesNV-04292]]
-    The variable decorated with code:MeshViewIndicesNV must: be declared as
-    an array of scalar 32-bit integer values
-****
---
-endif::VK_NV_mesh_shader[]
-
-ifdef::VK_VERSION_1_1[]
-[open,refpage='NumSubgroups',desc='Number of subgroups in a workgroup',type='builtins']
---
-:refpage: NumSubgroups
-
-code:NumSubgroups::
-
-Decorating a variable with the code:NumSubgroups built-in decoration will
-make that variable contain the number of subgroups in the local workgroup.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-NumSubgroups-04293]]
-    The code:NumSubgroups decoration must: be used only within the
-    code:GLCompute, code:MeshNV, or code:TaskNV {ExecutionModel}
-  * [[VUID-{refpage}-NumSubgroups-04294]]
-    The variable decorated with code:NumSubgroups must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-NumSubgroups-04295]]
-    The variable decorated with code:NumSubgroups must: be declared as a
-    scalar 32-bit integer value
-****
---
-endif::VK_VERSION_1_1[]
-
-[open,refpage='NumWorkgroups',desc='Number of workgroups in a dispatch',type='builtins']
---
-:refpage: NumWorkgroups
-
-code:NumWorkgroups::
-
-Decorating a variable with the code:NumWorkgroups built-in decoration will
-make that variable contain the number of local workgroups that are part of
-the dispatch that the invocation belongs to.
-Each component is equal to the values of the workgroup count parameters
-passed into the dispatching commands.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-NumWorkgroups-04296]]
-    The code:NumWorkgroups decoration must: be used only within the
-    code:GLCompute {ExecutionModel}
-  * [[VUID-{refpage}-NumWorkgroups-04297]]
-    The variable decorated with code:NumWorkgroups must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-NumWorkgroups-04298]]
-    The variable decorated with code:NumWorkgroups must: be declared as a
-    three-component vector of 32-bit integer values
-****
---
-
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-[[interfaces-builtin-variables-objectraydirection]]
-[open,refpage='ObjectRayDirectionKHR',desc='Ray direction in object space',type='builtins']
---
-:refpage: ObjectRayDirectionKHR
-
-code:ObjectRayDirectionKHR::
-
-A variable decorated with the code:ObjectRayDirectionKHR decoration will
-specify the direction of the ray being processed, in object space.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-ObjectRayDirectionKHR-04299]]
-    The code:ObjectRayDirectionKHR decoration must: be used only within the
-    code:IntersectionKHR, code:AnyHitKHR, or code:ClosestHitKHR
-    {ExecutionModel}
-  * [[VUID-{refpage}-ObjectRayDirectionKHR-04300]]
-    The variable decorated with code:ObjectRayDirectionKHR must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-ObjectRayDirectionKHR-04301]]
-    The variable decorated with code:ObjectRayDirectionKHR must: be declared
-    as a three-component vector of 32-bit floating-point values
-****
---
-
-[[interfaces-builtin-variables-objectrayorigin]]
-[open,refpage='ObjectRayOriginKHR',desc='Ray origin in object space',type='builtins']
---
-:refpage: ObjectRayOriginKHR
-
-code:ObjectRayOriginKHR::
-
-A variable decorated with the code:ObjectRayOriginKHR decoration will
-specify the origin of the ray being processed, in object space.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-ObjectRayOriginKHR-04302]]
-    The code:ObjectRayOriginKHR decoration must: be used only within the
-    code:IntersectionKHR, code:AnyHitKHR, or code:ClosestHitKHR
-    {ExecutionModel}
-  * [[VUID-{refpage}-ObjectRayOriginKHR-04303]]
-    The variable decorated with code:ObjectRayOriginKHR must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-ObjectRayOriginKHR-04304]]
-    The variable decorated with code:ObjectRayOriginKHR must: be declared as
-    a three-component vector of 32-bit floating-point values
-****
---
-
-[[interfaces-builtin-variables-objecttoworld]]
-[open,refpage='ObjectToWorldKHR',desc='Transformation matrix from object to world space',type='builtins']
---
-:refpage: ObjectToWorldKHR
-
-code:ObjectToWorldKHR::
-
-A variable decorated with the code:ObjectToWorldKHR decoration will contain
-the current object-to-world transformation matrix, which is determined by
-the instance of the current intersection.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-ObjectToWorldKHR-04305]]
-    The code:ObjectToWorldKHR decoration must: be used only within the
-    code:IntersectionKHR, code:AnyHitKHR, or code:ClosestHitKHR
-    {ExecutionModel}
-  * [[VUID-{refpage}-ObjectToWorldKHR-04306]]
-    The variable decorated with code:ObjectToWorldKHR must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-ObjectToWorldKHR-04307]]
-    The variable decorated with code:ObjectToWorldKHR must: be declared as a
-    matrix with four columns of three-component vectors of 32-bit
-    floating-point values
-****
---
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-
-[open,refpage='PatchVertices',desc='Number of vertices in an input patch',type='builtins']
---
-:refpage: PatchVertices
-
-code:PatchVertices::
-
-Decorating a variable with the code:PatchVertices built-in decoration will
-make that variable contain the number of vertices in the input patch being
-processed by the shader.
-In a Tessellation Control Shader, this is the same as the
-name:patchControlPoints member of
-slink:VkPipelineTessellationStateCreateInfo.
-In a Tessellation Evaluation Shader, code:PatchVertices is equal to the
-tessellation control output patch size.
-When the same shader is used in different pipelines where the patch sizes
-are configured differently, the value of the code:PatchVertices variable
-will also differ.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-PatchVertices-04308]]
-    The code:PatchVertices decoration must: be used only within the
-    code:TessellationControl or code:TessellationEvaluation {ExecutionModel}
-  * [[VUID-{refpage}-PatchVertices-04309]]
-    The variable decorated with code:PatchVertices must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-PatchVertices-04310]]
-    The variable decorated with code:PatchVertices must: be declared as a
-    scalar 32-bit integer value
-****
---
-
-[open,refpage='PointCoord',desc='Fragment coordinates in screen-space within a point primitive',type='builtins']
---
-:refpage: PointCoord
-
-code:PointCoord::
-
-Decorating a variable with the code:PointCoord built-in decoration will make
-that variable contain the coordinate of the current fragment within the
-point being rasterized, normalized to the size of the point with origin in
-the upper left corner of the point, as described in
-<<primsrast-points-basic,Basic Point Rasterization>>.
-If the primitive the fragment shader invocation belongs to is not a point,
-then the variable decorated with code:PointCoord contains an undefined:
-value.
-
-[NOTE]
-.Note
-====
-Depending on how the point is rasterized, code:PointCoord may: never reach
-[eq]#(0,0)# or [eq]#(1,1)#.
-====
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-PointCoord-04311]]
-    The code:PointCoord decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-PointCoord-04312]]
-    The variable decorated with code:PointCoord must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-PointCoord-04313]]
-    The variable decorated with code:PointCoord must: be declared as a
-    two-component vector of 32-bit floating-point values
-****
---
-
-[open,refpage='PointSize',desc='Size of a point primitive',type='builtins']
---
-:refpage: PointSize
-
-code:PointSize::
-
-Decorating a variable with the code:PointSize built-in decoration will make
-that variable contain the size of point primitives.
-The value written to the variable decorated with code:PointSize by the last
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> in the pipeline is used as the framebuffer-space size of points
-produced by rasterization.
-
-[NOTE]
-.Note
-====
-When code:PointSize decorates a variable in the code:Input {StorageClass},
-it contains the data written to the output variable decorated with
-code:PointSize from the previous shader stage.
-====
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-PointSize-04314]]
-    The code:PointSize decoration must: be used only within the code:MeshNV,
-    code:Vertex, code:TessellationControl, code:TessellationEvaluation, or
-    code:Geometry {ExecutionModel}
-  * [[VUID-{refpage}-PointSize-04315]]
-    The variable decorated with code:PointSize within the code:MeshNV or
-    code:Vertex {ExecutionModel} must: be declared using the code:Output
-    {StorageClass}
-  * [[VUID-{refpage}-PointSize-04316]]
-    The variable decorated with code:PointSize within the
-    code:TessellationControl, code:TessellationEvaluation, or code:Geometry
-    {ExecutionModel} must: not be declared using a {StorageClass} other than
-    code:Input or code:Output
-  * [[VUID-{refpage}-PointSize-04317]]
-    The variable decorated with code:PointSize must: be declared as a scalar
-    32-bit floating-point value
-****
---
-
-[open,refpage='Position',desc='Vertex position',type='builtins']
---
-:refpage: Position
-
-code:Position::
-
-Decorating a variable with the code:Position built-in decoration will make
-that variable contain the position of the current vertex.
-In the last <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization
-shader stage>>, the value of the variable decorated with code:Position is
-used in subsequent primitive assembly, clipping, and rasterization
-operations.
-
-[NOTE]
-.Note
-====
-When code:Position decorates a variable in the code:Input {StorageClass}, it
-contains the data written to the output variable decorated with
-code:Position from the previous shader stage.
-====
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-Position-04318]]
-    The code:Position decoration must: be used only within the code:MeshNV,
-    code:Vertex, code:TessellationControl, code:TessellationEvaluation, or
-    code:Geometry {ExecutionModel}
-  * [[VUID-{refpage}-Position-04319]]
-    The variable decorated with code:Position within code:MeshNV or
-    code:Vertex {ExecutionModel} must: be declared using the code:Output
-    {StorageClass}
-  * [[VUID-{refpage}-Position-04320]]
-    The variable decorated with code:Position within
-    code:TessellationControl, code:TessellationEvaluation, or code:Geometry
-    {ExecutionModel} must: not be declared using a {StorageClass} other than
-    code:Input or code:Output
-  * [[VUID-{refpage}-Position-04321]]
-    The variable decorated with code:Position must: be declared as a
-    four-component vector of 32-bit floating-point values
-****
---
-
-ifdef::VK_NVX_multiview_per_view_attributes[]
-[[interfaces-builtin-variables-positionperview]]
-[open,refpage='PositionPerViewNV',desc='Vertex position per view',type='builtins']
---
-:refpage: PositionPerViewNV
-
-code:PositionPerViewNV::
-
-Decorating a variable with the code:PositionPerViewNV built-in decoration
-will make that variable contain the position of the current vertex, for each
-view.
-+
-Elements of the array correspond to views in a multiview subpass, and those
-elements corresponding to views in the view mask of the subpass the shader
-is compiled against will be used as the position value for those views.
-For the final
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> in the pipeline, values written to an output variable decorated with
-code:PositionPerViewNV are used in subsequent primitive assembly, clipping,
-and rasterization operations, as with code:Position.
-code:PositionPerViewNV output in an earlier
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> is available as an input in the subsequent
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>>.
-+
-If a shader is compiled against a subpass that has the
-ename:VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX bit set, then
-the position values for each view must: not differ in any component other
-than the X component.
-If the values do differ, one will be chosen in an implementation-dependent
-manner.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-PositionPerViewNV-04322]]
-    The code:PositionPerViewNV decoration must: be used only within the
-    code:MeshNV, code:Vertex, code:TessellationControl,
-    code:TessellationEvaluation, or code:Geometry {ExecutionModel}
-  * [[VUID-{refpage}-PositionPerViewNV-04323]]
-    The variable decorated with code:PositionPerViewNV within the
-    code:Vertex, or code:MeshNV {ExecutionModel} must: be declared using the
-    code:Output {StorageClass}
-  * [[VUID-{refpage}-PositionPerViewNV-04324]]
-    The variable decorated with code:PositionPerViewNV within the
-    code:TessellationControl, code:TessellationEvaluation, or code:Geometry
-    {ExecutionModel} must: not be declared using a {StorageClass} other than
-    code:Input or code:Output
-  * [[VUID-{refpage}-PositionPerViewNV-04325]]
-    The variable decorated with code:PositionPerViewNV must: be declared as
-    an array of four-component vector of 32-bit floating-point values with
-    at least as many elements as the maximum view in the subpass's view mask
-    plus one
-  * [[VUID-{refpage}-PositionPerViewNV-04326]]
-    The array variable decorated with code:PositionPerViewNV must: only be
-    indexed by a constant or specialization constant
-****
---
-endif::VK_NVX_multiview_per_view_attributes[]
-
-ifdef::VK_NV_mesh_shader[]
-[[interfaces-builtin-variables-primitivecount]]
-[open,refpage='PrimitiveCountNV',desc='Number of primitives output by a mesh shader',type='builtins']
---
-:refpage: PrimitiveCountNV
-
-code:PrimitiveCountNV::
-+
-Decorating a variable with the code:PrimitiveCountNV decoration will make
-that variable contain the primitive count.
-The primitive count specifies the number of primitives in the output mesh
-produced by the mesh shader that will be processed by subsequent pipeline
-stages.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-PrimitiveCountNV-04327]]
-    The code:PrimitiveCountNV decoration must: be used only within the
-    code:MeshNV {ExecutionModel}
-  * [[VUID-{refpage}-PrimitiveCountNV-04328]]
-    The variable decorated with code:PrimitiveCountNV must: be declared
-    using the code:Output {StorageClass}
-  * [[VUID-{refpage}-PrimitiveCountNV-04329]]
-    The variable decorated with code:PrimitiveCountNV must: be declared as a
-    scalar 32-bit integer value
-****
---
-endif::VK_NV_mesh_shader[]
-
-[open,refpage='PrimitiveId',desc='Primitive ID',type='builtins']
---
-:refpage: PrimitiveId
-
-code:PrimitiveId::
-
-Decorating a variable with the code:PrimitiveId built-in decoration will
-make that variable contain the index of the current primitive.
-+
-The index of the first primitive generated by a drawing command is zero, and
-the index is incremented after every individual point, line, or triangle
-primitive is processed.
-+
-For triangles drawn as points or line segments (see <<primsrast-polygonmode,
-Polygon Mode>>), the primitive index is incremented only once, even if
-multiple points or lines are eventually drawn.
-+
-Variables decorated with code:PrimitiveId are reset to zero between each
-instance drawn.
-+
-Restarting a primitive topology using primitive restart has no effect on the
-value of variables decorated with code:PrimitiveId.
-+
-In tessellation control and tessellation evaluation shaders, it will contain
-the index of the patch within the current set of rendering primitives that
-corresponds to the shader invocation.
-+
-In a geometry shader, it will contain the number of primitives presented as
-input to the shader since the current set of rendering primitives was
-started.
-+
-In a fragment shader, it will contain the primitive index written by the
-ifdef::VK_NV_mesh_shader[]
-mesh shader if a mesh shader is present, or the primitive index written by
-the
-endif::VK_NV_mesh_shader[]
-geometry shader if a geometry shader is present, or with the value that
-would have been presented as input to the geometry shader had it been
-present.
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-+
-In an intersection, any-hit, or closest hit shader, it will contain the
-index within the geometry of the triangle or bounding box being processed.
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-
-[NOTE]
-.Note
-====
-When the code:PrimitiveId decoration is applied to an output variable in the
-ifdef::VK_NV_mesh_shader[]
-mesh shader or
-endif::VK_NV_mesh_shader[]
-geometry shader, the resulting value is seen through the code:PrimitiveId
-decorated input variable in the fragment shader.
-
-The fragment shader using code:PrimitiveId will need to declare either the
-ifdef::VK_NV_mesh_shader[code:MeshShadingNV,]
-code:Geometry or code:Tessellation capability to satisfy the requirement
-SPIR-V has to use code:PrimitiveId.
-====
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-PrimitiveId-04330]]
-    The code:PrimitiveId decoration must: be used only within the
-    code:MeshNV, code:IntersectionKHR, code:AnyHitKHR, code:ClosestHitKHR,
-    code:TessellationControl, code:TessellationEvaluation, code:Geometry, or
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-Fragment-04331]]
-    If pipeline contains both the code:Fragment and code:Geometry
-    {ExecutionModel} and a variable decorated with code:PrimitiveId is read
-    from code:Fragment shader, then the code:Geometry shader must: write to
-    the output variables decorated with code:PrimitiveId in all execution
-    paths
-  * [[VUID-{refpage}-Fragment-04332]]
-    If pipeline contains both the code:Fragment and code:MeshNV
-    {ExecutionModel} and a variable decorated with code:PrimitiveId is read
-    from code:Fragment shader, then the code:MeshNV shader must: write to
-    the output variables decorated with code:PrimitiveId in all execution
-    paths
-  * [[VUID-{refpage}-Fragment-04333]]
-    If code:Fragment {ExecutionModel} contains a variable decorated with
-    code:PrimitiveId, then either the code:MeshShadingNV, code:Geometry or
-    code:Tessellation capability must: also be declared
-  * [[VUID-{refpage}-PrimitiveId-04334]]
-    The variable decorated with code:PrimitiveId within the
-    code:TessellationControl, code:TessellationEvaluation, code:Fragment,
-    code:IntersectionKHR, code:AnyHitKHR, or code:ClosestHitKHR
-    {ExecutionModel} must: be declared using the code:Input {StorageClass}
-  * [[VUID-{refpage}-PrimitiveId-04335]]
-    The variable decorated with code:PrimitiveId within the code:Geometry
-    {ExecutionModel} must: be declared using the code:Input or code:Output
-    {StorageClass}
-  * [[VUID-{refpage}-PrimitiveId-04336]]
-    The variable decorated with code:PrimitiveId within the code:MeshNV
-    {ExecutionModel} must: be declared using the code:Output {StorageClass}
-  * [[VUID-{refpage}-PrimitiveId-04337]]
-    The variable decorated with code:PrimitiveId must: be declared as a
-    scalar 32-bit integer value
-****
---
-
-ifdef::VK_NV_mesh_shader[]
-[[interfaces-builtin-variables-primitiveindices]]
-[open,refpage='PrimitiveIndicesNV',desc='Indices of primitives in a mesh shader',type='builtins']
---
-:refpage: PrimitiveIndicesNV
-
-code:PrimitiveIndicesNV::
-+
-Decorating a variable with the code:PrimitiveIndicesNV decoration will make
-that variable contain the output array of vertex index values.
-Depending on the output primitive type declared using the execution mode,
-the indices are split into groups of one (code:OutputPoints), two
-(code:OutputLinesNV), or three (code:OutputTriangles) indices and each group
-generates a primitive.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-PrimitiveIndicesNV-04338]]
-    The code:PrimitiveIndicesNV decoration must: be used only within the
-    code:MeshNV {ExecutionModel}
-  * [[VUID-{refpage}-PrimitiveIndicesNV-04339]]
-    The variable decorated with code:PrimitiveIndicesNV must: be declared
-    using the code:Output {StorageClass}
-  * [[VUID-{refpage}-PrimitiveIndicesNV-04340]]
-    The variable decorated with code:PrimitiveIndicesNV must: be declared as
-    an array of scalar 32-bit integer values
-  * [[VUID-{refpage}-PrimitiveIndicesNV-04341]]
-    All index values of the array decorated with code:PrimitiveIndicesNV
-    must: be in the range [eq]#[0, N-1]#, where [eq]#N# is the value
-    specified by the code:OutputVertices {ExecutionMode}
-  * [[VUID-{refpage}-OutputPoints-04342]]
-    If the {ExecutionMode} is code:OutputPoints, then the array decorated
-    with code:PrimitiveIndicesNV must be the size of the value specified by
-    code:OutputPrimitivesNV
-  * [[VUID-{refpage}-OutputLinesNV-04343]]
-    If the {ExecutionMode} is code:OutputLinesNV, then the array decorated
-    with code:PrimitiveIndicesNV must be the size of two times the value
-    specified by code:OutputPrimitivesNV
-  * [[VUID-{refpage}-OutputTrianglesNV-04344]]
-    If the {ExecutionMode} is code:OutputTrianglesNV, then the array
-    decorated with code:PrimitiveIndicesNV must be the size of three times
-    the value specified by code:OutputPrimitivesNV
-****
---
-endif::VK_NV_mesh_shader[]
-
-ifdef::VK_KHR_fragment_shading_rate[]
-[[interfaces-builtin-variables-primitiveshadingrate]]
-[open,refpage='PrimitiveShadingRateKHR',desc='Primitive contribution to fragment shading rate',type='builtins']
---
-:refpage: PrimitiveShadingRateKHR
-
-code:PrimitiveShadingRateKHR::
-
-Decorating a variable with the code:PrimitiveShadingRateKHR built-in
-decoration will make that variable contain the
-<<primsrast-fragment-shading-rate-primitive, primitive fragment shading
-rate>>.
-+
-The value written to the variable decorated with
-code:PrimitiveShadingRateKHR by the last
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> in the pipeline is used as the
-<<primsrast-fragment-shading-rate-primitive, primitive fragment shading
-rate>>.
-Outputs in previous shader stages are ignored.
-+
-If the last active
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> shader entry point's interface does not include a variable decorated
-with code:PrimitiveShadingRateKHR, then it is as if the shader specified a
-fragment shading rate value of 0, indicating a horizontal and vertical rate
-of 1 pixel.
-+
-If a shader has code:PrimitiveShadingRateKHR in the output interface and
-there is an execution path through the shader that does not write to it, its
-value is undefined: for executions of the shader that take that path.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-PrimitiveShadingRateKHR-04484]]
-    The code:PrimitiveShadingRateKHR decoration must: be used only within
-    the code:MeshNV, code:Vertex, or code:Geometry {ExecutionModel}
-  * [[VUID-{refpage}-PrimitiveShadingRateKHR-04485]]
-    The variable decorated with code:PrimitiveShadingRateKHR must: be
-    declared using the code:Output {StorageClass}
-  * [[VUID-{refpage}-PrimitiveShadingRateKHR-04486]]
-    The variable decorated with code:PrimitiveShadingRateKHR must: be
-    declared as a scalar 32-bit integer value
-  * [[VUID-{refpage}-PrimitiveShadingRateKHR-04487]]
-    The value written to code:PrimitiveShadingRateKHR must: include no more
-    than one of code:Vertical2Pixels and code:Vertical4Pixels
-  * [[VUID-{refpage}-PrimitiveShadingRateKHR-04488]]
-    The value written to code:PrimitiveShadingRateKHR must: include no more
-    than one of code:Horizontal2Pixels and code:Horizontal4Pixels
-  * [[VUID-{refpage}-PrimitiveShadingRateKHR-04489]]
-    The value written to code:PrimitiveShadingRateKHR must: not have any
-    bits set other than those defined by *Fragment Shading Rate Flags*
-    enumerants in the SPIR-V specification
-****
---
-endif::VK_KHR_fragment_shading_rate[]
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-[[interfaces-builtin-variables-raygeometryindex]]
-[open,refpage='RayGeometryIndexKHR',desc='Geometry index in a ray shader',type='builtins']
---
-:refpage: RayGeometryIndexKHR
-
-code:RayGeometryIndexKHR::
-
-A variable decorated with the code:RayGeometryIndexKHR decoration will
-contain the <<acceleration-structure-geometry-index, geometry index>> for
-the acceleration structure geometry currently being shaded.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-RayGeometryIndexKHR-04345]]
-    The code:RayGeometryIndexKHR decoration must: be used only within the
-    code:IntersectionKHR, code:AnyHitKHR, or code:ClosestHitKHR
-    {ExecutionModel}
-  * [[VUID-{refpage}-RayGeometryIndexKHR-04346]]
-    The variable decorated with code:RayGeometryIndexKHR must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-RayGeometryIndexKHR-04347]]
-    The variable decorated with code:RayGeometryIndexKHR must: be declared
-    as a scalar 32-bit integer value
-****
---
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-[[interfaces-builtin-variables-raytmax]]
-[open,refpage='RayTmaxKHR',desc='Maximum T value of a ray',type='builtins']
---
-:refpage: RayTmaxKHR
-
-code:RayTmaxKHR::
-
-A variable decorated with the code:RayTmaxKHR decoration will contain the
-parametric [eq]#t~max~# value of the ray being processed.
-The value is independent of the space in which the ray origin and direction
-exist.
-The value is initialized to the parameter passed into code:OpTraceRayKHR.
-+
-The [eq]#t~max~# value changes throughout the lifetime of the ray that
-produced the intersection.
-In the closest hit shader, the value reflects the closest distance to the
-intersected primitive.
-In the any-hit shader, it reflects the distance to the primitive currently
-being intersected.
-In the intersection shader, it reflects the distance to the closest
-primitive intersected so far or the initial value.
-The value can change in the intersection shader after calling
-code:OpReportIntersectionKHR if the corresponding any-hit shader does not
-ignore the intersection.
-In a miss shader, the value is identical to the parameter passed into
-code:OpTraceRayKHR.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-RayTmaxKHR-04348]]
-    The code:RayTmaxKHR decoration must: be used only within the
-    code:IntersectionKHR, code:AnyHitKHR, code:ClosestHitKHR, or
-    code:MissKHR {ExecutionModel}
-  * [[VUID-{refpage}-RayTmaxKHR-04349]]
-    The variable decorated with code:RayTmaxKHR must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-RayTmaxKHR-04350]]
-    The variable decorated with code:RayTmaxKHR must: be declared as a
-    scalar 32-bit floating-point value
-****
---
-
-[[interfaces-builtin-variables-raytmin]]
-[open,refpage='RayTminKHR',desc='Minimum T value of a ray',type='builtins']
---
-:refpage: RayTminKHR
-
-code:RayTminKHR::
-
-A variable decorated with the code:RayTminKHR decoration will contain the
-parametric [eq]#t~min~# value of the ray being processed.
-The value is independent of the space in which the ray origin and direction
-exist.
-The value is given by the parameter passed into code:OpTraceRayKHR.
-+
-The [eq]#t~min~# value remains constant for the duration of the ray query.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-RayTminKHR-04351]]
-    The code:RayTminKHR decoration must: be used only within the
-    code:IntersectionKHR, code:AnyHitKHR, code:ClosestHitKHR, or
-    code:MissKHR {ExecutionModel}
-  * [[VUID-{refpage}-RayTminKHR-04352]]
-    The variable decorated with code:RayTminKHR must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-RayTminKHR-04353]]
-    The variable decorated with code:RayTminKHR must: be declared as a
-    scalar 32-bit floating-point value
-****
---
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-
-[open,refpage='SampleId',desc='Sample ID within a fragment',type='builtins']
---
-:refpage: SampleId
-
-code:SampleId::
-
-Decorating a variable with the code:SampleId built-in decoration will make
-that variable contain the <<primsrast-multisampling-coverage-mask, coverage
-index>> for the current fragment shader invocation.
-code:SampleId ranges from zero to the number of samples in the framebuffer
-minus one.
-If a fragment shader entry point's interface includes an input variable
-decorated with code:SampleId, <<primsrast-sampleshading,Sample Shading>> is
-considered enabled with a pname:minSampleShading value of 1.0.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-SampleId-04354]]
-    The code:SampleId decoration must: be used only within the code:Fragment
-    {ExecutionModel}
-  * [[VUID-{refpage}-SampleId-04355]]
-    The variable decorated with code:SampleId must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-SampleId-04356]]
-    The variable decorated with code:SampleId must: be declared as a scalar
-    32-bit integer value
-****
---
-
-[[interfaces-builtin-variables-samplemask]]
-[open,refpage='SampleMask',desc='Coverage mask for a fragment shader invocation',type='builtins']
---
-:refpage: SampleMask
-
-code:SampleMask::
-
-Decorating a variable with the code:SampleMask built-in decoration will make
-any variable contain the <<fragops-shader-samplemask, sample mask>> for the
-current fragment shader invocation.
-+
-A variable in the code:Input storage class decorated with code:SampleMask
-will contain a bitmask of the set of samples covered by the primitive
-generating the fragment during rasterization.
-It has a sample bit set if and only if the sample is considered covered for
-this fragment shader invocation.
-code:SampleMask[] is an array of integers.
-Bits are mapped to samples in a manner where bit B of mask M
-(`SampleMask[M]`) corresponds to sample [eq]#32 {times} M {plus} B#.
-+
-A variable in the code:Output storage class decorated with code:SampleMask
-is an array of integers forming a bit array in a manner similar to an input
-variable decorated with code:SampleMask, but where each bit represents
-coverage as computed by the shader.
-This computed code:SampleMask is combined with the generated coverage mask
-in the <<fragops-covg, multisample coverage>> operation.
-+
-Variables decorated with code:SampleMask must: be either an unsized array,
-or explicitly sized to be no larger than the implementation-dependent
-maximum sample-mask (as an array of 32-bit elements), determined by the
-maximum number of samples.
-+
-If a fragment shader entry point's interface includes an output variable
-decorated with code:SampleMask, the sample mask will be undefined: for any
-array elements of any fragment shader invocations that fail to assign a
-value.
-If a fragment shader entry point's interface does not include an output
-variable decorated with code:SampleMask, the sample mask has no effect on
-the processing of a fragment.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-SampleMask-04357]]
-    The code:SampleMask decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-SampleMask-04358]]
-    The variable decorated with code:SampleMask must: be declared using the
-    code:Input or code:Output {StorageClass}
-  * [[VUID-{refpage}-SampleMask-04359]]
-    The variable decorated with code:SampleMask must: be declared as an
-    array of 32-bit integer values
-****
---
-
-[open,refpage='SamplePosition',desc='Position of a shaded sample',type='builtins']
---
-:refpage: SamplePosition
-
-code:SamplePosition::
-
-Decorating a variable with the code:SamplePosition built-in decoration will
-make that variable contain the sub-pixel position of the sample being
-shaded.
-The top left of the pixel is considered to be at coordinate [eq]#(0,0)# and
-the bottom right of the pixel is considered to be at coordinate [eq]#(1,1)#.
-ifdef::VK_EXT_fragment_density_map[]
-// Markup here is weird. To get all these paragraphs indented properly for
-// the keyword, the '+' connector must be *inside* ifdefs w/o blank lines.
-+
-If the render pass has a fragment density map attachment, the variable will
-instead contain the sub-fragment position of the sample being shaded.
-The top left of the fragment is considered to be at coordinate [eq]#(0,0)#
-and the bottom right of the fragment is considered to be at coordinate
-[eq]#(1,1)# for any fragment area.
-endif::VK_EXT_fragment_density_map[]
-+
-If a fragment shader entry point's interface includes an input variable
-decorated with code:SamplePosition, <<primsrast-sampleshading,Sample
-Shading>> is considered enabled with a pname:minSampleShading value of 1.0.
-ifdef::VK_EXT_sample_locations[]
-+
-If the current pipeline uses <<primsrast-samplelocations, custom sample
-locations>> the value of any variable decorated with the code:SamplePosition
-built-in decoration is undefined:.
-endif::VK_EXT_sample_locations[]
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-SamplePosition-04360]]
-    The code:SamplePosition decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-SamplePosition-04361]]
-    The variable decorated with code:SamplePosition must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-SamplePosition-04362]]
-    The variable decorated with code:SamplePosition must: be declared as a
-    two-component vector of 32-bit floating-point values
-****
---
-
-ifdef::VK_KHR_fragment_shading_rate[]
-[open,refpage='ShadingRateKHR',desc='Shading rate of a fragment',type='builtins']
---
-:refpage: ShadingRateKHR
-
-code:ShadingRateKHR::
-
-Decorating a variable with the code:ShadingRateKHR built-in decoration will
-make that variable contain the <<primsrast-fragment-shading-rate, fragment
-shading rate>> for the current fragment invocation.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-ShadingRateKHR-04490]]
-    The code:ShadingRateKHR decoration must: be used only within the
-    code:Fragment {ExecutionModel}
-  * [[VUID-{refpage}-ShadingRateKHR-04491]]
-    The variable decorated with code:ShadingRateKHR must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-ShadingRateKHR-04492]]
-    The variable decorated with code:ShadingRateKHR must: be declared as a
-    scalar 32-bit integer value
-****
---
-endif::VK_KHR_fragment_shading_rate[]
-
-ifdef::VK_NV_shader_sm_builtins[]
-[[interfaces-builtin-variables-smcountnv]]
-[open,refpage='SMCountNV',desc='Number of SMs on the device',type='builtins']
---
-:refpage: SMCountNV
-
-code:SMCountNV::
-
-Decorating a variable with the code:SMCountNV built-in decoration will make
-that variable contain the number of SMs on the device.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-SMCountNV-04363]]
-    The variable decorated with code:SMCountNV must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-SMCountNV-04364]]
-    The variable decorated with code:SMCountNV must: be declared as a scalar
-    32-bit integer value
-****
---
-
-[[interfaces-builtin-variables-smidnv]]
-[open,refpage='SMIDNV',desc='SM ID on which a shader invocation is running',type='builtins']
---
-:refpage: SMIDNV
-
-code:SMIDNV::
-
-Decorating a variable with the code:SMIDNV built-in decoration will make
-that variable contain the ID of the SM on which the current shader
-invocation is running.
-This variable is in the range [eq]#[0, code:SMCountNV-1]#.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-SMIDNV-04365]]
-    The variable decorated with code:SMIDNV must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-SMIDNV-04366]]
-    The variable decorated with code:SMIDNV must: be declared as a scalar
-    32-bit integer value
-****
---
-endif::VK_NV_shader_sm_builtins[]
-
-ifdef::VK_VERSION_1_1[]
-[open,refpage='SubgroupId',desc='Subgroup ID ',type='builtins']
---
-:refpage: SubgroupId
-
-code:SubgroupId::
-+
-Decorating a variable with the code:SubgroupId built-in decoration will make
-that variable contain the index of the subgroup within the local workgroup.
-This variable is in range [0, code:NumSubgroups-1].
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-SubgroupId-04367]]
-    The code:SubgroupId decoration must: be used only within the
-    code:GLCompute, code:MeshNV, or code:TaskNV {ExecutionModel}
-  * [[VUID-{refpage}-SubgroupId-04368]]
-    The variable decorated with code:SubgroupId must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-SubgroupId-04369]]
-    The variable decorated with code:SubgroupId must: be declared as a
-    scalar 32-bit integer value
-****
---
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1,VK_EXT_shader_subgroup_ballot[]
-[[interfaces-builtin-variables-sgeq]]
-[open,refpage='SubgroupEqMask',desc='Mask of shader invocations in a subgroup with the same subgroup local invocation ID',type='builtins']
---
-:refpage: SubgroupEqMask
-
-code:SubgroupEqMask::
-+
-Decorating a variable with the code:SubgroupEqMask builtin decoration will
-make that variable contain the _subgroup mask_ of the current subgroup
-invocation.
-The bit corresponding to the code:SubgroupLocalInvocationId is set in the
-variable decorated with code:SubgroupEqMask.
-All other bits are set to zero.
-+
-code:SubgroupEqMaskKHR is an alias of code:SubgroupEqMask.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-SubgroupEqMask-04370]]
-    The variable decorated with code:SubgroupEqMask must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-SubgroupEqMask-04371]]
-    The variable decorated with code:SubgroupEqMask must: be declared as a
-    four-component vector of 32-bit integer values
-****
---
-
-[[interfaces-builtin-variables-sgge]]
-[open,refpage='SubgroupGeMask',desc='Mask of shader invocations in a subgroup with the same or higher subgroup local invocation ID',type='builtins']
---
-:refpage: SubgroupGeMask
-
-code:SubgroupGeMask::
-+
-Decorating a variable with the code:SubgroupGeMask builtin decoration will
-make that variable contain the _subgroup mask_ of the current subgroup
-invocation.
-The bits corresponding to the invocations greater than or equal to
-code:SubgroupLocalInvocationId through code:SubgroupSize-1 are set in the
-variable decorated with code:SubgroupGeMask.
-All other bits are set to zero.
-+
-code:SubgroupGeMaskKHR is an alias of code:SubgroupGeMask.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-SubgroupGeMask-04372]]
-    The variable decorated with code:SubgroupGeMask must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-SubgroupGeMask-04373]]
-    The variable decorated with code:SubgroupGeMask must: be declared as a
-    four-component vector of 32-bit integer values
-****
---
-
-[[interfaces-builtin-variables-sggt]]
-[open,refpage='SubgroupGtMask',desc='Mask of shader invocations in a subgroup with a higher subgroup local invocation ID',type='builtins']
---
-:refpage: SubgroupGtMask
-
-code:SubgroupGtMask::
-+
-Decorating a variable with the code:SubgroupGtMask builtin decoration will
-make that variable contain the _subgroup mask_ of the current subgroup
-invocation.
-The bits corresponding to the invocations greater than
-code:SubgroupLocalInvocationId through code:SubgroupSize-1 are set in the
-variable decorated with code:SubgroupGtMask.
-All other bits are set to zero.
-+
-code:SubgroupGtMaskKHR is an alias of code:SubgroupGtMask.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-SubgroupGtMask-04374]]
-    The variable decorated with code:SubgroupGtMask must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-SubgroupGtMask-04375]]
-    The variable decorated with code:SubgroupGtMask must: be declared as a
-    four-component vector of 32-bit integer values
-****
---
-
-[[interfaces-builtin-variables-sgle]]
-[open,refpage='SubgroupLeMask',desc='Mask of shader invocations in a subgroup with the same or lower subgroup local invocation ID',type='builtins']
---
-:refpage: SubgroupLeMask
-
-code:SubgroupLeMask::
-+
-Decorating a variable with the code:SubgroupLeMask builtin decoration will
-make that variable contain the _subgroup mask_ of the current subgroup
-invocation.
-The bits corresponding to the invocations less than or equal to
-code:SubgroupLocalInvocationId are set in the variable decorated with
-code:SubgroupLeMask.
-All other bits are set to zero.
-+
-code:SubgroupLeMaskKHR is an alias of code:SubgroupLeMask.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-SubgroupLeMask-04376]]
-    The variable decorated with code:SubgroupLeMask must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-SubgroupLeMask-04377]]
-    The variable decorated with code:SubgroupLeMask must: be declared as a
-    four-component vector of 32-bit integer values
-****
---
-
-[[interfaces-builtin-variables-sglt]]
-[open,refpage='SubgroupLtMask',desc='Mask of shader invocations in a subgroup with a lower subgroup local invocation ID',type='builtins']
---
-:refpage: SubgroupLtMask
-
-code:SubgroupLtMask::
-+
-Decorating a variable with the code:SubgroupLtMask builtin decoration will
-make that variable contain the _subgroup mask_ of the current subgroup
-invocation.
-The bits corresponding to the invocations less than
-code:SubgroupLocalInvocationId are set in the variable decorated with
-code:SubgroupLtMask.
-All other bits are set to zero.
-+
-code:SubgroupLtMaskKHR is an alias of code:SubgroupLtMask.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-SubgroupLtMask-04378]]
-    The variable decorated with code:SubgroupLtMask must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-SubgroupLtMask-04379]]
-    The variable decorated with code:SubgroupLtMask must: be declared as a
-    four-component vector of 32-bit integer values
-****
---
-
-[[interfaces-builtin-variables-sgli]]
-[open,refpage='SubgroupLocalInvocationId',desc='ID of the invocation within a subgroup',type='builtins']
---
-:refpage: SubgroupLocalInvocationId
-
-code:SubgroupLocalInvocationId::
-+
-Decorating a variable with the code:SubgroupLocalInvocationId builtin
-decoration will make that variable contain the index of the invocation
-within the subgroup.
-This variable is in range [0,code:SubgroupSize-1].
-
-[NOTE]
-.Note
-====
-There is no direct relationship between code:SubgroupLocalInvocationId and
-code:LocalInvocationId or code:LocalInvocationIndex.
-ifdef::VK_EXT_subgroup_size_control[]
-If the pipeline was created with
-ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT,
-applications can compute their own local invocation index to serve the same
-purpose:
-
-[eq]#index = code:SubgroupLocalInvocationId + code:SubgroupId *
-code:SubgroupSize#
-
-If full subgroups are not enabled, some subgroups may be dispatched with
-inactive invocations that do not correspond to a local workgroup invocation,
-making the value of [eq]#index# unreliable.
-endif::VK_EXT_subgroup_size_control[]
-====
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-SubgroupLocalInvocationId-04380]]
-    The variable decorated with code:SubgroupLocalInvocationId must: be
-    declared using the code:Input {StorageClass}
-  * [[VUID-{refpage}-SubgroupLocalInvocationId-04381]]
-    The variable decorated with code:SubgroupLocalInvocationId must: be
-    declared as a scalar 32-bit integer value
-****
---
-
-[[interfaces-builtin-variables-sgs]]
-[open,refpage='SubgroupSize',desc='Size of a subgroup',type='builtins']
---
-:refpage: SubgroupSize
-
-code:SubgroupSize::
-+
-Decorating a variable with the code:SubgroupSize builtin decoration will
-make that variable contain the implementation-dependent
-<<limits-subgroup-size,number of invocations in a subgroup>>.
-This value must: be a power-of-two integer.
-+
-ifdef::VK_EXT_subgroup_size_control[]
-If the pipeline was created with the
-ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
-flag set, the code:SubgroupSize decorated variable will contain the subgroup
-size for each subgroup that gets dispatched.
-This value must: be between <<limits-min-subgroup-size,minSubgroupSize>> and
-<<limits-max-subgroup-size,maxSubgroupSize>> and must: be uniform with
-<<shaders-scope-subgroup, subgroup scope>>.
-The value may: vary across a single draw call, and for fragment shaders may:
-vary across a single primitive.
-In compute dispatches, code:SubgroupSize must: be uniform with
-<<shaders-scope-command, command scope>>.
-+
-If the pipeline was created with a chained
-slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure, the
-code:SubgroupSize decorated variable will match
-<<pipelines-required-subgroup-size, pname:requiredSubgroupSize>>.
-+
-If the pipeline was not created with the
-ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
-flag set and no slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT
-structure was chained, the
-endif::VK_EXT_subgroup_size_control[]
-ifndef::VK_EXT_subgroup_size_control[]
-The
-endif::VK_EXT_subgroup_size_control[]
-variable decorated with code:SubgroupSize will match <<limits-subgroup-size,
-pname:subgroupSize>>.
-+
-The maximum number of invocations that an implementation can support per
-subgroup is 128.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-SubgroupSize-04382]]
-    The variable decorated with code:SubgroupSize must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-SubgroupSize-04383]]
-    The variable decorated with code:SubgroupSize must: be declared as a
-    scalar 32-bit integer value
-****
---
-endif::VK_VERSION_1_1,VK_EXT_shader_subgroup_ballot[]
-
-ifdef::VK_NV_mesh_shader[]
-[[interfaces-builtin-variables-taskcount]]
-[open,refpage='TaskCountNV',desc='Number of mesh shader workgroups that will be generated',type='builtins']
---
-:refpage: TaskCountNV
-
-code:TaskCountNV::
-+
-Decorating a variable with the code:TaskCountNV decoration will make that
-variable contain the task count.
-The task count specifies the number of subsequent mesh shader workgroups
-that get generated upon completion of the task shader.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-TaskCountNV-04384]]
-    The code:TaskCountNV decoration must: be used only within the
-    code:TaskNV {ExecutionModel}
-  * [[VUID-{refpage}-TaskCountNV-04385]]
-    The variable decorated with code:TaskCountNV must: be declared using the
-    code:Output {StorageClass}
-  * [[VUID-{refpage}-TaskCountNV-04386]]
-    The variable decorated with code:TaskCountNV must: be declared as a
-    scalar 32-bit integer value
-****
---
-endif::VK_NV_mesh_shader[]
-
-[open,refpage='TessCoord',desc='Barycentric coordinate of a tessellated vertex within a patch',type='builtins']
---
-:refpage: TessCoord
-
-code:TessCoord::
-
-Decorating a variable with the code:TessCoord built-in decoration will make
-that variable contain the three-dimensional [eq]#(u,v,w)# barycentric
-coordinate of the tessellated vertex within the patch.
-[eq]#u#, [eq]#v#, and [eq]#w# are in the range [eq]#[0,1]# and vary linearly
-across the primitive being subdivided.
-For the tessellation modes of code:Quads or code:IsoLines, the third
-component is always zero.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-TessCoord-04387]]
-    The code:TessCoord decoration must: be used only within the
-    code:TessellationEvaluation {ExecutionModel}
-  * [[VUID-{refpage}-TessCoord-04388]]
-    The variable decorated with code:TessCoord must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-TessCoord-04389]]
-    The variable decorated with code:TessCoord must: be declared as a
-    three-component vector of 32-bit floating-point values
-****
---
-
-[open,refpage='TessLevelOuter',desc='Outer tessellation levels',type='builtins']
---
-:refpage: TessLevelOuter
-
-code:TessLevelOuter::
-
-Decorating a variable with the code:TessLevelOuter built-in decoration will
-make that variable contain the outer tessellation levels for the current
-patch.
-+
-In tessellation control shaders, the variable decorated with
-code:TessLevelOuter can: be written to, which controls the tessellation
-factors for the resulting patch.
-These values are used by the tessellator to control primitive tessellation
-and can: be read by tessellation evaluation shaders.
-+
-In tessellation evaluation shaders, the variable decorated with
-code:TessLevelOuter can: read the values written by the tessellation control
-shader.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-TessLevelOuter-04390]]
-    The code:TessLevelOuter decoration must: be used only within the
-    code:TessellationControl or code:TessellationEvaluation {ExecutionModel}
-  * [[VUID-{refpage}-TessLevelOuter-04391]]
-    The variable decorated with code:TessLevelOuter within the
-    code:TessellationControl {ExecutionModel} must: be declared using the
-    code:Output {StorageClass}
-  * [[VUID-{refpage}-TessLevelOuter-04392]]
-    The variable decorated with code:TessLevelOuter within the
-    code:TessellationEvaluation {ExecutionModel} must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-TessLevelOuter-04393]]
-    The variable decorated with code:TessLevelOuter must: be declared as an
-    array of size four, containing 32-bit floating-point values
-****
---
-
-[open,refpage='TessLevelInner',desc='Inner tessellation levels',type='builtins']
---
-:refpage: TessLevelInner
-
-code:TessLevelInner::
-
-Decorating a variable with the code:TessLevelInner built-in decoration will
-make that variable contain the inner tessellation levels for the current
-patch.
-+
-In tessellation control shaders, the variable decorated with
-code:TessLevelInner can: be written to, which controls the tessellation
-factors for the resulting patch.
-These values are used by the tessellator to control primitive tessellation
-and can: be read by tessellation evaluation shaders.
-+
-In tessellation evaluation shaders, the variable decorated with
-code:TessLevelInner can: read the values written by the tessellation control
-shader.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-TessLevelInner-04394]]
-    The code:TessLevelInner decoration must: be used only within the
-    code:TessellationControl or code:TessellationEvaluation {ExecutionModel}
-  * [[VUID-{refpage}-TessLevelInner-04395]]
-    The variable decorated with code:TessLevelInner within the
-    code:TessellationControl {ExecutionModel} must: be declared using the
-    code:Output {StorageClass}
-  * [[VUID-{refpage}-TessLevelInner-04396]]
-    The variable decorated with code:TessLevelInner within the
-    code:TessellationEvaluation {ExecutionModel} must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-TessLevelInner-04397]]
-    The variable decorated with code:TessLevelInner must: be declared as an
-    array of size two, containing 32-bit floating-point values
-****
---
-
-[open,refpage='VertexIndex',desc='Vertex index of a shader invocation',type='builtins']
---
-:refpage: VertexIndex
-
-code:VertexIndex::
-
-Decorating a variable with the code:VertexIndex built-in decoration will
-make that variable contain the index of the vertex that is being processed
-by the current vertex shader invocation.
-For non-indexed draws, this variable begins at the pname:firstVertex
-parameter to flink:vkCmdDraw or the pname:firstVertex member of a structure
-consumed by flink:vkCmdDrawIndirect and increments by one for each vertex in
-the draw.
-For indexed draws, its value is the content of the index buffer for the
-vertex plus the pname:vertexOffset parameter to flink:vkCmdDrawIndexed or
-the pname:vertexOffset member of the structure consumed by
-flink:vkCmdDrawIndexedIndirect.
-
-[NOTE]
-.Note
-====
-code:VertexIndex starts at the same starting value for each instance.
-====
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-VertexIndex-04398]]
-    The code:VertexIndex decoration must: be used only within the
-    code:Vertex {ExecutionModel}
-  * [[VUID-{refpage}-VertexIndex-04399]]
-    The variable decorated with code:VertexIndex must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-VertexIndex-04400]]
-    The variable decorated with code:VertexIndex must: be declared as a
-    scalar 32-bit integer value
-****
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-[[interfaces-builtin-variables-viewindex]]
-[open,refpage='ViewIndex',desc='View index of a shader invocation',type='builtins']
---
-:refpage: ViewIndex
-
-code:ViewIndex::
-
-The code:ViewIndex decoration can: be applied to a shader input which will
-be filled with the index of the view that is being processed by the current
-shader invocation.
-+
-If multiview is enabled in the render pass, this value will be one of the
-bits set in the view mask of the subpass the pipeline is compiled against.
-If multiview is not enabled in the render pass, this value will be zero.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-ViewIndex-04401]]
-    The code:ViewIndex decoration must: not be used within the
-    code:GLCompute {ExecutionModel}
-  * [[VUID-{refpage}-ViewIndex-04402]]
-    The variable decorated with code:ViewIndex must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-ViewIndex-04403]]
-    The variable decorated with code:ViewIndex must: be declared as a scalar
-    32-bit integer value
-****
---
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-[[interfaces-builtin-variables-viewportindex]]
-[open,refpage='ViewportIndex',desc='Viewport index used',type='builtins']
---
-:refpage: ViewportIndex
-
-code:ViewportIndex::
-
-Decorating a variable with the code:ViewportIndex built-in decoration will
-make that variable contain the index of the viewport.
-+
-In a
-ifdef::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer,VK_NV_viewport_array2[]
-ifdef::VK_NV_mesh_shader[]
-mesh,
-endif::VK_NV_mesh_shader[]
-vertex, tessellation evaluation, or
-endif::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer,VK_NV_viewport_array2[]
-geometry shader, the variable decorated with code:ViewportIndex can be
-written to with the viewport index to which the primitive produced by that
-shader will be directed.
-+
-The selected viewport index is used to select the
-ifndef::VK_NV_scissor_exclusive[]
-viewport transform and
-endif::VK_NV_scissor_exclusive[]
-ifdef::VK_NV_scissor_exclusive[]
-viewport transform, scissor rectangle, and exclusive
-endif::VK_NV_scissor_exclusive[]
-scissor rectangle.
-ifdef::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer,VK_NV_viewport_array2[]
-+
-The last active
-_<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>>_ (in pipeline order) controls the code:ViewportIndex that is used.
-Outputs in previous shader stages are not used, even if the last stage fails
-to write the code:ViewportIndex.
-endif::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer,VK_NV_viewport_array2[]
-+
-If the last active
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> shader entry point's interface does not include a variable decorated
-with code:ViewportIndex, then the first viewport is used.
-If a <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> shader entry point's interface includes a variable decorated with
-code:ViewportIndex, it must: write the same value to code:ViewportIndex for
-all output vertices of a given primitive.
-+
-In a fragment shader, the variable decorated with code:ViewportIndex
-contains the viewport index of the primitive that the fragment invocation
-belongs to.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-ViewportIndex-04404]]
-    The code:ViewportIndex decoration must: be used only within the
-    code:MeshNV, code:Vertex, code:TessellationEvaluation, code:Geometry, or
-    code:Fragment {ExecutionModel}
-ifdef::VK_VERSION_1_2[]
-  * [[VUID-{refpage}-ViewportIndex-04405]]
-    If the <<features-shaderOutputViewportIndex,shaderOutputViewportIndex>>
-    feature is not enabled then the code:ViewportIndex decoration must: be
-    used only within the code:Geometry or code:Fragment {ExecutionModel}
-endif::VK_VERSION_1_2[]
-  * [[VUID-{refpage}-ViewportIndex-04406]]
-    The variable decorated with code:ViewportIndex within the code:MeshNV,
-    code:Vertex, code:TessellationEvaluation, or code:Geometry
-    {ExecutionModel} must: be declared using the code:Output {StorageClass}
-  * [[VUID-{refpage}-ViewportIndex-04407]]
-    The variable decorated with code:ViewportIndex within the code:Fragment
-    {ExecutionModel} must: be declared using the code:Input {StorageClass}
-  * [[VUID-{refpage}-ViewportIndex-04408]]
-    The variable decorated with code:ViewportIndex must: be declared as a
-    scalar 32-bit integer value
-****
---
-
-ifdef::VK_NV_viewport_array2[]
-[[interfaces-builtin-variables-viewportmask]]
-[open,refpage='ViewportMaskNV',desc='Mask of the viewports used',type='builtins']
---
-:refpage: ViewportMaskNV
-
-code:ViewportMaskNV::
-
-Decorating a variable with the code:ViewportMaskNV built-in decoration will
-make that variable contain the viewport mask.
-+
-In a
-ifdef::VK_NV_mesh_shader[]
-mesh,
-endif::VK_NV_mesh_shader[]
-vertex, tessellation evaluation, or geometry shader, the variable decorated
-with code:ViewportMaskNV can be written to with the mask of which viewports
-the primitive produced by that shader will directed.
-+
-The code:ViewportMaskNV variable must: be an array that has
-[eq]#{lceil}(sname:VkPhysicalDeviceLimits::pname:maxViewports / 32){rceil}#
-elements.
-When a shader writes to this variable, bit B of element M controls whether a
-primitive is emitted to viewport [eq]#32 {times} M {plus} B#.
-The viewports indicated by the mask are used to select the
-ifndef::VK_NV_scissor_exclusive[]
-viewport transform and
-endif::VK_NV_scissor_exclusive[]
-ifdef::VK_NV_scissor_exclusive[]
-viewport transform, scissor rectangle, and exclusive
-endif::VK_NV_scissor_exclusive[]
-scissor rectangle that a primitive will be transformed by.
-+
-The last active
-_<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>>_ (in pipeline order) controls the code:ViewportMaskNV that is used.
-Outputs in previous shader stages are not used, even if the last stage fails
-to write the code:ViewportMaskNV.
-When code:ViewportMaskNV is written by the final
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>>, any variable decorated with code:ViewportIndex in the fragment
-shader will have the index of the viewport that was used in generating that
-fragment.
-+
-If a <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> shader entry point's interface includes a variable decorated with
-code:ViewportMaskNV, it must: write the same value to code:ViewportMaskNV
-for all output vertices of a given primitive.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-ViewportMaskNV-04409]]
-    The code:ViewportMaskNV decoration must: be used only within the
-    code:Vertex, code:MeshNV, code:TessellationEvaluation, or code:Geometry
-    {ExecutionModel}
-  * [[VUID-{refpage}-ViewportMaskNV-04410]]
-    The variable decorated with code:ViewportMaskNV must: be declared using
-    the code:Output {StorageClass}
-  * [[VUID-{refpage}-ViewportMaskNV-04411]]
-    The variable decorated with code:ViewportMaskNV must: be declared as an
-    array of 32-bit integer values
-****
---
-endif::VK_NV_viewport_array2[]
-
-ifdef::VK_NVX_multiview_per_view_attributes+VK_NV_viewport_array2[]
-[[interfaces-builtin-variables-viewportmaskperview]]
-[open,refpage='ViewportMaskPerViewNV',desc='Mask of viewports broadcast to per view',type='builtins']
---
-:refpage: ViewportMaskPerViewNV
-
-code:ViewportMaskPerViewNV::
-
-Decorating a variable with the code:ViewportMaskPerViewNV built-in
-decoration will make that variable contain the mask of viewports primitives
-are broadcast to, for each view.
-+
-The value written to an element of code:ViewportMaskPerViewNV in the last
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> is a bitmask indicating which viewports the primitive will be
-directed to.
-The primitive will be broadcast to the viewport corresponding to each
-non-zero bit of the bitmask, and that viewport index is used to select the
-ifndef::VK_NV_scissor_exclusive[]
-viewport transform and
-endif::VK_NV_scissor_exclusive[]
-ifdef::VK_NV_scissor_exclusive[]
-viewport transform, scissor rectangle, and exclusive
-endif::VK_NV_scissor_exclusive[]
-scissor rectangle, for each view.
-The same values must: be written to all vertices in a given primitive, or
-else the set of viewports used for that primitive is undefined:.
-+
-Elements of the array correspond to views in a multiview subpass, and those
-elements corresponding to views in the view mask of the subpass the shader
-is compiled against will be used as the viewport mask value for those views.
-code:ViewportMaskPerViewNV output in an earlier
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> is not available as an input in the subsequent
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>>.
-+
-Although code:ViewportMaskNV is an array, code:ViewportMaskPerViewNV is not
-a two-dimensional array.
-Instead, code:ViewportMaskPerViewNV is limited to 32 viewports.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-ViewportMaskPerViewNV-04412]]
-    The code:ViewportMaskPerViewNV decoration must: be used only within the
-    code:Vertex, code:MeshNV, code:TessellationControl,
-    code:TessellationEvaluation, or code:Geometry {ExecutionModel}
-  * [[VUID-{refpage}-ViewportMaskPerViewNV-04413]]
-    The variable decorated with code:ViewportMaskPerViewNV must: be declared
-    using the code:Output {StorageClass}
-  * [[VUID-{refpage}-ViewportMaskPerViewNV-04414]]
-    The variable decorated with code:ViewportMaskPerViewNV must: be declared
-    as an array of 32-bit integer values
-  * [[VUID-{refpage}-ViewportMaskPerViewNV-04415]]
-    The array decorated with code:ViewportMaskPerViewNV must: be a size less
-    than or equal to 32
-  * [[VUID-{refpage}-ViewportMaskPerViewNV-04416]]
-    The array decorated with code:ViewportMaskPerViewNV must: be a size
-    greater than the maximum view in the subpass's view mask
-  * [[VUID-{refpage}-ViewportMaskPerViewNV-04417]]
-    The array variable decorated with code:ViewportMaskPerViewNV must: only
-    be indexed by a constant or specialization constant
-****
---
-endif::VK_NVX_multiview_per_view_attributes+VK_NV_viewport_array2[]
-
-ifdef::VK_NV_shader_sm_builtins[]
-[[interfaces-builtin-variables-warpspersmnv]]
-[open,refpage='WarpsPerSMNV',desc='Number of warps per SM',type='builtins']
---
-:refpage: WarpsPerSMNV
-
-code:WarpsPerSMNV::
-
-Decorating a variable with the code:WarpsPerSMNV built-in decoration will
-make that variable contain the maximum number of warps executing on a SM.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-WarpsPerSMNV-04418]]
-    The variable decorated with code:WarpsPerSMNV must: be declared using
-    the code:Input {StorageClass}
-  * [[VUID-{refpage}-WarpsPerSMNV-04419]]
-    The variable decorated with code:WarpsPerSMNV must: be declared as a
-    scalar 32-bit integer value
-****
---
-
-[[interfaces-builtin-variables-warpidnv]]
-[open,refpage='WarpIDNV',desc='Warp ID within an SM of a shader invocation',type='builtins']
---
-:refpage: WarpIDNV
-
-code:WarpIDNV::
-
-Decorating a variable with the code:WarpIDNV built-in decoration will make
-that variable contain the ID of the warp on a SM on which the current shader
-invocation is running.
-This variable is in the range [eq]#[0, code:WarpsPerSMNV-1]#.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-WarpIDNV-04420]]
-    The variable decorated with code:WarpIDNV must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-WarpIDNV-04421]]
-    The variable decorated with code:WarpIDNV must: be declared as a scalar
-    32-bit integer value
-****
---
-endif::VK_NV_shader_sm_builtins[]
-
-[open,refpage='WorkgroupId',desc='Workgroup ID of a shader',type='builtins']
---
-:refpage: WorkgroupId
-
-code:WorkgroupId::
-
-Decorating a variable with the code:WorkgroupId built-in decoration will
-make that variable contain the global workgroup that the current invocation
-is a member of.
-Each component ranges from a base value to a [eq]#base {plus} count# value,
-based on the parameters passed into the dispatching commands.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-WorkgroupId-04422]]
-    The code:WorkgroupId decoration must: be used only within the
-    code:GLCompute, code:MeshNV, or code:TaskNV {ExecutionModel}
-  * [[VUID-{refpage}-WorkgroupId-04423]]
-    The variable decorated with code:WorkgroupId must: be declared using the
-    code:Input {StorageClass}
-  * [[VUID-{refpage}-WorkgroupId-04424]]
-    The variable decorated with code:WorkgroupId must: be declared as a
-    three-component vector of 32-bit integer values
-****
---
-
-[open,refpage='WorkgroupSize',desc='Size of a workgroup',type='builtins']
---
-:refpage: WorkgroupSize
-
-code:WorkgroupSize::
-
-Decorating an object with the code:WorkgroupSize built-in decoration will
-make that object contain the dimensions of a local workgroup.
-If an object is decorated with the code:WorkgroupSize decoration, this takes
-precedence over any code:LocalSize
-ifdef::VK_KHR_maintenance4[or code:LocalSizeId]
-execution mode.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-WorkgroupSize-04425]]
-    The code:WorkgroupSize decoration must: be used only within the
-    code:GLCompute, code:MeshNV, or code:TaskNV {ExecutionModel}
-  * [[VUID-{refpage}-WorkgroupSize-04426]]
-    The variable decorated with code:WorkgroupSize must: be a specialization
-    constant or a constant
-  * [[VUID-{refpage}-WorkgroupSize-04427]]
-    The variable decorated with code:WorkgroupSize must: be declared as a
-    three-component vector of 32-bit integer values
-****
---
-
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-[[interfaces-builtin-variables-worldraydirection]]
-[open,refpage='WorldRayDirectionKHR',desc='Ray direction in world space',type='builtins']
---
-:refpage: WorldRayDirectionKHR
-
-code:WorldRayDirectionKHR::
-
-A variable decorated with the code:WorldRayDirectionKHR decoration will
-specify the direction of the ray being processed, in world space.
-The value is given by the parameter passed into code:OpTraceRayKHR.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-WorldRayDirectionKHR-04428]]
-    The code:WorldRayDirectionKHR decoration must: be used only within the
-    code:IntersectionKHR, code:AnyHitKHR, code:ClosestHitKHR, or
-    code:MissKHR {ExecutionModel}
-  * [[VUID-{refpage}-WorldRayDirectionKHR-04429]]
-    The variable decorated with code:WorldRayDirectionKHR must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-WorldRayDirectionKHR-04430]]
-    The variable decorated with code:WorldRayDirectionKHR must: be declared
-    as a three-component vector of 32-bit floating-point values
-****
---
-
-[[interfaces-builtin-variables-worldrayorigin]]
-[open,refpage='WorldRayOriginKHR',desc='Ray origin in world space',type='builtins']
---
-:refpage: WorldRayOriginKHR
-
-code:WorldRayOriginKHR::
-
-A variable decorated with the code:WorldRayOriginKHR decoration will specify
-the origin of the ray being processed, in world space.
-The value is given by the parameter passed into code:OpTraceRayKHR.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-WorldRayOriginKHR-04431]]
-    The code:WorldRayOriginKHR decoration must: be used only within the
-    code:IntersectionKHR, code:AnyHitKHR, code:ClosestHitKHR, or
-    code:MissKHR {ExecutionModel}
-  * [[VUID-{refpage}-WorldRayOriginKHR-04432]]
-    The variable decorated with code:WorldRayOriginKHR must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-WorldRayOriginKHR-04433]]
-    The variable decorated with code:WorldRayOriginKHR must: be declared as
-    a three-component vector of 32-bit floating-point values
-****
---
-
-[[interfaces-builtin-variables-worldtoobject]]
-[open,refpage='WorldToObjectKHR',desc='Transformation matrix from world to object space',type='builtins']
---
-:refpage: WorldToObjectKHR
-
-code:WorldToObjectKHR::
-
-A variable decorated with the code:WorldToObjectKHR decoration will contain
-the current world-to-object transformation matrix, which is determined by
-the instance of the current intersection.
-
-.Valid Usage
-****
-  * [[VUID-{refpage}-WorldToObjectKHR-04434]]
-    The code:WorldToObjectKHR decoration must: be used only within the
-    code:IntersectionKHR, code:AnyHitKHR, or code:ClosestHitKHR
-    {ExecutionModel}
-  * [[VUID-{refpage}-WorldToObjectKHR-04435]]
-    The variable decorated with code:WorldToObjectKHR must: be declared
-    using the code:Input {StorageClass}
-  * [[VUID-{refpage}-WorldToObjectKHR-04436]]
-    The variable decorated with code:WorldToObjectKHR must: be declared as a
-    matrix with four columns of three-component vectors of 32-bit
-    floating-point values
-****
---
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
diff --git a/registry/vulkan/chapters/introduction.txt b/registry/vulkan/chapters/introduction.txt
deleted file mode 100644
index a7e2e1b..0000000
--- a/registry/vulkan/chapters/introduction.txt
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-
-[[introduction]]
-= Introduction
-
-This document, referred to as the "`Vulkan Specification`" or just the
-"`Specification`" hereafter, describes the Vulkan Application Programming
-Interface (API).
-Vulkan is a http://www.open-std.org/jtc1/sc22/wg14/www/standards[C99] API
-designed for explicit control of low-level graphics and compute
-functionality.
-
-The canonical version of the Specification is available in the official
-https://www.khronos.org/registry/vulkan/[Vulkan Registry]
-(https://www.khronos.org/registry/vulkan/).
-The source files used to generate the Vulkan specification are stored in the
-https://github.com/KhronosGroup/Vulkan-Docs[Vulkan Documentation Repository]
-(https://github.com/KhronosGroup/Vulkan-Docs).
-The source repository additionally has a public issue tracker and allows the
-submission of pull requests that improve the specification.
-
-
-[[introduction-conventions]]
-== Document Conventions
-
-The Vulkan specification is intended for use by both implementors of the API
-and application developers seeking to make use of the API, forming a
-contract between these parties.
-Specification text may address either party; typically the intended audience
-can be inferred from context, though some sections are defined to address
-only one of these parties.
-(For example, <<fundamentals-validusage>> sections only address application
-developers).
-Any requirements, prohibitions, recommendations or options defined by
-<<introduction-normative-terminology, normative terminology>> are imposed
-only on the audience of that text.
-
-[NOTE]
-.Note
-====
-Structure and enumerated types defined in extensions that were promoted to
-core in a later version of Vulkan are now defined in terms of the equivalent
-Vulkan core interfaces.
-This affects the Vulkan Specification, the Vulkan header files, and the
-corresponding XML Registry.
-====
-
-
-[[introduction-informative-language]]
-=== Informative Language
-
-Some language in the specification is purely informative, intended to give
-background or suggestions to implementors or developers.
-
-If an entire chapter or section contains only informative language, its
-title will be suffixed with "`(Informative)`".
-
-All NOTEs are implicitly informative.
-
-
-[[introduction-normative-terminology]]
-=== Normative Terminology
-
-Within this specification, the key words *must*, *required*, *should*,
-*recommended*, *may*, and *optional* are to be interpreted as described in
-https://www.ietf.org/rfc/rfc2119.txt[RFC 2119 - Key words for use in RFCs to
-Indicate Requirement Levels] (https://www.ietf.org/rfc/rfc2119.txt).
-The additional key word *optionally* is an alternate form of *optional*, for
-use where grammatically appropriate.
-
-These key words are highlighted in the specification for clarity.
-In text addressing application developers, their use expresses requirements
-that apply to application behavior.
-In text addressing implementors, their use expresses requirements that apply
-to implementations.
-
-In text addressing application developers, the additional key words *can*
-and *cannot* are to be interpreted as describing the capabilities of an
-application, as follows:
-
-*can*::
-This word means that the application is able to perform the action
-described.
-
-*cannot*::
-This word means that the API and/or the execution environment provide no
-mechanism through which the application can express or accomplish the action
-described.
-
-These key words are never used in text addressing implementors.
-
-[NOTE]
-.Note
-==================
-There is an important distinction between *cannot* and *must not*, as used
-in this Specification.
-*Cannot* means something the application literally is unable to express or
-accomplish through the API, while *must not* means something that the
-application is capable of expressing through the API, but that the
-consequences of doing so are undefined: and potentially unrecoverable for
-the implementation (see <<fundamentals-validusage>>).
-==================
-
-Unless otherwise noted in the section heading, all sections and appendices
-in this document are normative.
-
-
-[[introduction-technical-terminology]]
-=== Technical Terminology
-
-The Vulkan Specification makes use of common engineering and graphics terms
-such as *Pipeline*, *Shader*, and *Host* to identify and describe Vulkan API
-constructs and their attributes, states, and behaviors.
-The <<glossary,Glossary>> defines the basic meanings of these terms in the
-context of the Specification.
-The Specification text provides fuller definitions of the terms and may
-elaborate, extend, or clarify the <<glossary,Glossary>> definitions.
-When a term defined in the <<glossary,Glossary>> is used in normative
-language within the Specification, the definitions within the Specification
-govern and supersede any meanings the terms may have in other technical
-contexts (i.e. outside the Specification).
-
-
-[[introduction-normative-references]]
-=== Normative References
-
-References to external documents are considered normative references if the
-Specification uses any of the normative terms defined in
-<<introduction-normative-terminology>> to refer to them or their
-requirements, either as a whole or in part.
-
-The following documents are referenced by normative sections of the
-specification:
-
-[[ieee-754]]
-IEEE.
-August, 2008.
-_IEEE Standard for Floating-Point Arithmetic_.
-IEEE Std 754-2008.
-https://dx.doi.org/10.1109/IEEESTD.2008.4610935 .
-
-[[data-format]] Andrew Garrard.
-_Khronos Data Format Specification, version 1.3_.
-https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html .
-
-[[spirv-extended]] John Kessenich.
-_SPIR-V Extended Instructions for GLSL, Version 1.00_ (February 10, 2016).
-https://www.khronos.org/registry/spir-v/ .
-
-[[spirv-spec]] John Kessenich, Boaz Ouriel, and Raun Krisch.
-_SPIR-V Specification, Version 1.5, Revision 3, Unified_ (April 24, 2020).
-https://www.khronos.org/registry/spir-v/ .
-
-[[vulkan-registry]] Jon Leech.
-_The Khronos Vulkan API Registry_.
-https://www.khronos.org/registry/vulkan/specs/1.2/registry.html .
-
-[[vulkan-styleguide]] Jon Leech and Tobias Hector.
-_Vulkan Documentation and Extensions: Procedures and Conventions_.
-https://www.khronos.org/registry/vulkan/specs/1.2/styleguide.html .
-
-[[LoaderInterfaceArchitecture]]
-_Architecture of the Vulkan Loader Interfaces_ (October, 2021).
-https://github.com/KhronosGroup/Vulkan-Loader/blob/master/docs/LoaderInterfaceArchitecture.md
-.
-
diff --git a/registry/vulkan/chapters/limits.txt b/registry/vulkan/chapters/limits.txt
deleted file mode 100644
index 2682910..0000000
--- a/registry/vulkan/chapters/limits.txt
+++ /dev/null
@@ -1,3873 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// This text fragment is used many times in the Devices and Queues, and
-// Limits chapters for different behavior, property, and limit queries.
-ifdef::hidden[]
-// tag::limits_desc[]
-If the sname:{refpage} structure is included in the pname:pNext chain of the
-slink:VkPhysicalDeviceProperties2 structure passed to
-flink:vkGetPhysicalDeviceProperties2, it is filled in with each
-corresponding implementation-dependent property.
-// end::limits_desc[]
-endif::hidden[]
-
-
-[[limits]]
-= Limits
-
-_Limits_ are implementation-dependent minimums, maximums, and other device
-characteristics that an application may: need to be aware of.
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-[NOTE]
-.Note
-====
-Limits are reported via the basic slink:VkPhysicalDeviceLimits structure as
-well as the extensible structure sname:VkPhysicalDeviceProperties2, which
-was added in `apiext:VK_KHR_get_physical_device_properties2` and included in
-Vulkan 1.1.
-When limits are added in future Vulkan versions or extensions, each
-extension should: introduce one new limit structure, if needed.
-This structure can: be added to the pname:pNext chain of the
-sname:VkPhysicalDeviceProperties2 structure.
-====
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-[open,refpage='VkPhysicalDeviceLimits',desc='Structure reporting implementation-dependent physical device limits',type='structs']
---
-The sname:VkPhysicalDeviceLimits structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceLimits.txt[]
-
-The sname:VkPhysicalDeviceLimits are properties of the physical device.
-These are available in the pname:limits member of the
-slink:VkPhysicalDeviceProperties structure which is returned from
-flink:vkGetPhysicalDeviceProperties.
-
-  * [[limits-maxImageDimension1D]] pname:maxImageDimension1D is the largest
-    dimension (pname:width) that is guaranteed to be supported for all
-    images created with an pname:imageType of ename:VK_IMAGE_TYPE_1D.
-    Some combinations of image parameters (format, usage, etc.) may: allow
-    support for larger dimensions, which can: be queried using
-    flink:vkGetPhysicalDeviceImageFormatProperties.
-  * [[limits-maxImageDimension2D]] pname:maxImageDimension2D is the largest
-    dimension (pname:width or pname:height) that is guaranteed to be
-    supported for all images created with an pname:imageType of
-    ename:VK_IMAGE_TYPE_2D and without
-    ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT set in pname:flags.
-    Some combinations of image parameters (format, usage, etc.) may: allow
-    support for larger dimensions, which can: be queried using
-    flink:vkGetPhysicalDeviceImageFormatProperties.
-  * [[limits-maxImageDimension3D]] pname:maxImageDimension3D is the largest
-    dimension (pname:width, pname:height, or pname:depth) that is guaranteed
-    to be supported for all images created with an pname:imageType of
-    ename:VK_IMAGE_TYPE_3D.
-    Some combinations of image parameters (format, usage, etc.) may: allow
-    support for larger dimensions, which can: be queried using
-    flink:vkGetPhysicalDeviceImageFormatProperties.
-  * [[limits-maxImageDimensionCube]] pname:maxImageDimensionCube is the
-    largest dimension (pname:width or pname:height) that is guaranteed to be
-    supported for all images created with an pname:imageType of
-    ename:VK_IMAGE_TYPE_2D and with
-    ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT set in pname:flags.
-    Some combinations of image parameters (format, usage, etc.) may: allow
-    support for larger dimensions, which can: be queried using
-    flink:vkGetPhysicalDeviceImageFormatProperties.
-  * [[limits-maxImageArrayLayers]] pname:maxImageArrayLayers is the maximum
-    number of layers (pname:arrayLayers) for an image.
-  * [[limits-maxTexelBufferElements]] pname:maxTexelBufferElements is the
-    maximum number of addressable texels for a buffer view created on a
-    buffer which was created with the
-    ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or
-    ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set in the pname:usage
-    member of the slink:VkBufferCreateInfo structure.
-  * [[limits-maxUniformBufferRange]] pname:maxUniformBufferRange is the
-    maximum value that can: be specified in the pname:range member of a
-    slink:VkDescriptorBufferInfo structure passed to
-    flink:vkUpdateDescriptorSets for descriptors of type
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC.
-  * [[limits-maxStorageBufferRange]] pname:maxStorageBufferRange is the
-    maximum value that can: be specified in the pname:range member of a
-    slink:VkDescriptorBufferInfo structure passed to
-    flink:vkUpdateDescriptorSets for descriptors of type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC.
-  * [[limits-maxPushConstantsSize]] pname:maxPushConstantsSize is the
-    maximum size, in bytes, of the pool of push constant memory.
-    For each of the push constant ranges indicated by the
-    pname:pPushConstantRanges member of the slink:VkPipelineLayoutCreateInfo
-    structure, [eq]#(pname:offset {plus} pname:size)# must: be less than or
-    equal to this limit.
-  * [[limits-maxMemoryAllocationCount]] pname:maxMemoryAllocationCount is
-    the maximum number of device memory allocations, as created by
-    flink:vkAllocateMemory, which can: simultaneously exist.
-  * [[limits-maxSamplerAllocationCount]] pname:maxSamplerAllocationCount is
-    the maximum number of sampler objects, as created by
-    flink:vkCreateSampler, which can: simultaneously exist on a device.
-  * [[limits-bufferImageGranularity]] pname:bufferImageGranularity is the
-    granularity, in bytes, at which buffer or linear image resources, and
-    optimal image resources can: be bound to adjacent offsets in the same
-    sname:VkDeviceMemory object without aliasing.
-    See <<resources-bufferimagegranularity,Buffer-Image Granularity>> for
-    more details.
-  * [[limits-sparseAddressSpaceSize]] pname:sparseAddressSpaceSize is the
-    total amount of address space available, in bytes, for sparse memory
-    resources.
-    This is an upper bound on the sum of the sizes of all sparse resources,
-    regardless of whether any memory is bound to them.
-  * [[limits-maxBoundDescriptorSets]] pname:maxBoundDescriptorSets is the
-    maximum number of descriptor sets that can: be simultaneously used by a
-    pipeline.
-    All code:DescriptorSet decorations in shader modules must: have a value
-    less than pname:maxBoundDescriptorSets.
-    See <<descriptorsets-sets>>.
-  * [[limits-maxPerStageDescriptorSamplers]]
-    pname:maxPerStageDescriptorSamplers is the maximum number of samplers
-    that can: be accessible to a single shader stage in a pipeline layout.
-    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_SAMPLER or
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER count against this
-    limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    A descriptor is accessible to a shader stage when the pname:stageFlags
-    member of the sname:VkDescriptorSetLayoutBinding structure has the bit
-    for that shader stage set.
-    See <<descriptorsets-sampler>> and
-    <<descriptorsets-combinedimagesampler>>.
-  * [[limits-maxPerStageDescriptorUniformBuffers]]
-    pname:maxPerStageDescriptorUniformBuffers is the maximum number of
-    uniform buffers that can: be accessible to a single shader stage in a
-    pipeline layout.
-    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC count against this
-    limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    A descriptor is accessible to a shader stage when the pname:stageFlags
-    member of the sname:VkDescriptorSetLayoutBinding structure has the bit
-    for that shader stage set.
-    See <<descriptorsets-uniformbuffer>> and
-    <<descriptorsets-uniformbufferdynamic>>.
-  * [[limits-maxPerStageDescriptorStorageBuffers]]
-    pname:maxPerStageDescriptorStorageBuffers is the maximum number of
-    storage buffers that can: be accessible to a single shader stage in a
-    pipeline layout.
-    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC count against this
-    limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    A descriptor is accessible to a pipeline shader stage when the
-    pname:stageFlags member of the sname:VkDescriptorSetLayoutBinding
-    structure has the bit for that shader stage set.
-    See <<descriptorsets-storagebuffer>> and
-    <<descriptorsets-storagebufferdynamic>>.
-  * [[limits-maxPerStageDescriptorSampledImages]]
-    pname:maxPerStageDescriptorSampledImages is the maximum number of
-    sampled images that can: be accessible to a single shader stage in a
-    pipeline layout.
-    Descriptors with a type of
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, or
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER count against this limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    A descriptor is accessible to a pipeline shader stage when the
-    pname:stageFlags member of the sname:VkDescriptorSetLayoutBinding
-    structure has the bit for that shader stage set.
-    See <<descriptorsets-combinedimagesampler>>,
-    <<descriptorsets-sampledimage>>, and
-    <<descriptorsets-uniformtexelbuffer>>.
-  * [[limits-maxPerStageDescriptorStorageImages]]
-    pname:maxPerStageDescriptorStorageImages is the maximum number of
-    storage images that can: be accessible to a single shader stage in a
-    pipeline layout.
-    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER count against this limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    A descriptor is accessible to a pipeline shader stage when the
-    pname:stageFlags member of the sname:VkDescriptorSetLayoutBinding
-    structure has the bit for that shader stage set.
-    See <<descriptorsets-storageimage>>, and
-    <<descriptorsets-storagetexelbuffer>>.
-  * [[limits-maxPerStageDescriptorInputAttachments]]
-    pname:maxPerStageDescriptorInputAttachments is the maximum number of
-    input attachments that can: be accessible to a single shader stage in a
-    pipeline layout.
-    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
-    count against this limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    A descriptor is accessible to a pipeline shader stage when the
-    pname:stageFlags member of the sname:VkDescriptorSetLayoutBinding
-    structure has the bit for that shader stage set.
-    These are only supported for the fragment stage.
-    See <<descriptorsets-inputattachment>>.
-  * [[limits-maxPerStageResources]] pname:maxPerStageResources is the
-    maximum number of resources that can: be accessible to a single shader
-    stage in a pipeline layout.
-    Descriptors with a type of
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, or
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT count against this limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    For the fragment shader stage the framebuffer color attachments also
-    count against this limit.
-  * [[limits-maxDescriptorSetSamplers]] pname:maxDescriptorSetSamplers is
-    the maximum number of samplers that can: be included in a pipeline
-    layout.
-    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_SAMPLER or
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER count against this
-    limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    See <<descriptorsets-sampler>> and
-    <<descriptorsets-combinedimagesampler>>.
-  * [[limits-maxDescriptorSetUniformBuffers]]
-    pname:maxDescriptorSetUniformBuffers is the maximum number of uniform
-    buffers that can: be included in a pipeline layout.
-    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC count against this
-    limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    See <<descriptorsets-uniformbuffer>> and
-    <<descriptorsets-uniformbufferdynamic>>.
-  * [[limits-maxDescriptorSetUniformBuffersDynamic]]
-    pname:maxDescriptorSetUniformBuffersDynamic is the maximum number of
-    dynamic uniform buffers that can: be included in a pipeline layout.
-    Descriptors with a type of
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC count against this
-    limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    See <<descriptorsets-uniformbufferdynamic>>.
-  * [[limits-maxDescriptorSetStorageBuffers]]
-    pname:maxDescriptorSetStorageBuffers is the maximum number of storage
-    buffers that can: be included in a pipeline layout.
-    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC count against this
-    limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    See <<descriptorsets-storagebuffer>> and
-    <<descriptorsets-storagebufferdynamic>>.
-  * [[limits-maxDescriptorSetStorageBuffersDynamic]]
-    pname:maxDescriptorSetStorageBuffersDynamic is the maximum number of
-    dynamic storage buffers that can: be included in a pipeline layout.
-    Descriptors with a type of
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC count against this
-    limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    See <<descriptorsets-storagebufferdynamic>>.
-  * [[limits-maxDescriptorSetSampledImages]]
-    pname:maxDescriptorSetSampledImages is the maximum number of sampled
-    images that can: be included in a pipeline layout.
-    Descriptors with a type of
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, or
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER count against this limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    See <<descriptorsets-combinedimagesampler>>,
-    <<descriptorsets-sampledimage>>, and
-    <<descriptorsets-uniformtexelbuffer>>.
-  * [[limits-maxDescriptorSetStorageImages]]
-    pname:maxDescriptorSetStorageImages is the maximum number of storage
-    images that can: be included in a pipeline layout.
-    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER count against this limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    See <<descriptorsets-storageimage>>, and
-    <<descriptorsets-storagetexelbuffer>>.
-  * [[limits-maxDescriptorSetInputAttachments]]
-    pname:maxDescriptorSetInputAttachments is the maximum number of input
-    attachments that can: be included in a pipeline layout.
-    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
-    count against this limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptors in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    See <<descriptorsets-inputattachment>>.
-  * [[limits-maxVertexInputAttributes]] pname:maxVertexInputAttributes is
-    the maximum number of vertex input attributes that can: be specified for
-    a graphics pipeline.
-    These are described in the array of
-    sname:VkVertexInputAttributeDescription structures that are provided at
-    graphics pipeline creation time via the
-    pname:pVertexAttributeDescriptions member of the
-    slink:VkPipelineVertexInputStateCreateInfo structure.
-    See <<fxvertex-attrib>> and <<fxvertex-input>>.
-  * [[limits-maxVertexInputBindings]] pname:maxVertexInputBindings is the
-    maximum number of vertex buffers that can: be specified for providing
-    vertex attributes to a graphics pipeline.
-    These are described in the array of
-    sname:VkVertexInputBindingDescription structures that are provided at
-    graphics pipeline creation time via the pname:pVertexBindingDescriptions
-    member of the slink:VkPipelineVertexInputStateCreateInfo structure.
-    The pname:binding member of sname:VkVertexInputBindingDescription must:
-    be less than this limit.
-    See <<fxvertex-input>>.
-  * [[limits-maxVertexInputAttributeOffset]]
-    pname:maxVertexInputAttributeOffset is the maximum vertex input
-    attribute offset that can: be added to the vertex input binding stride.
-    The pname:offset member of the sname:VkVertexInputAttributeDescription
-    structure must: be less than or equal to this limit.
-    See <<fxvertex-input>>.
-  * [[limits-maxVertexInputBindingStride]] pname:maxVertexInputBindingStride
-    is the maximum vertex input binding stride that can: be specified in a
-    vertex input binding.
-    The pname:stride member of the sname:VkVertexInputBindingDescription
-    structure must: be less than or equal to this limit.
-    See <<fxvertex-input>>.
-  * [[limits-maxVertexOutputComponents]] pname:maxVertexOutputComponents is
-    the maximum number of components of output variables which can: be
-    output by a vertex shader.
-    See <<shaders-vertex>>.
-  * [[limits-maxTessellationGenerationLevel]]
-    pname:maxTessellationGenerationLevel is the maximum tessellation
-    generation level supported by the fixed-function tessellation primitive
-    generator.
-    See <<tessellation>>.
-  * [[limits-maxTessellationPatchSize]] pname:maxTessellationPatchSize is
-    the maximum patch size, in vertices, of patches that can: be processed
-    by the tessellation control shader and tessellation primitive generator.
-    The pname:patchControlPoints member of the
-    slink:VkPipelineTessellationStateCreateInfo structure specified at
-    pipeline creation time and the value provided in the code:OutputVertices
-    execution mode of shader modules must: be less than or equal to this
-    limit.
-    See <<tessellation>>.
-  * [[limits-maxTessellationControlPerVertexInputComponents]]
-    pname:maxTessellationControlPerVertexInputComponents is the maximum
-    number of components of input variables which can: be provided as
-    per-vertex inputs to the tessellation control shader stage.
-  * [[limits-maxTessellationControlPerVertexOutputComponents]]
-    pname:maxTessellationControlPerVertexOutputComponents is the maximum
-    number of components of per-vertex output variables which can: be output
-    from the tessellation control shader stage.
-  * [[limits-maxTessellationControlPerPatchOutputComponents]]
-    pname:maxTessellationControlPerPatchOutputComponents is the maximum
-    number of components of per-patch output variables which can: be output
-    from the tessellation control shader stage.
-  * [[limits-maxTessellationControlTotalOutputComponents]]
-    pname:maxTessellationControlTotalOutputComponents is the maximum total
-    number of components of per-vertex and per-patch output variables which
-    can: be output from the tessellation control shader stage.
-  * [[limits-maxTessellationEvaluationInputComponents]]
-    pname:maxTessellationEvaluationInputComponents is the maximum number of
-    components of input variables which can: be provided as per-vertex
-    inputs to the tessellation evaluation shader stage.
-  * [[limits-maxTessellationEvaluationOutputComponents]]
-    pname:maxTessellationEvaluationOutputComponents is the maximum number of
-    components of per-vertex output variables which can: be output from the
-    tessellation evaluation shader stage.
-  * [[limits-maxGeometryShaderInvocations]]
-    pname:maxGeometryShaderInvocations is the maximum invocation count
-    supported for instanced geometry shaders.
-    The value provided in the code:Invocations execution mode of shader
-    modules must: be less than or equal to this limit.
-    See <<geometry>>.
-  * [[limits-maxGeometryInputComponents]] pname:maxGeometryInputComponents
-    is the maximum number of components of input variables which can: be
-    provided as inputs to the geometry shader stage.
-  * [[limits-maxGeometryOutputComponents]] pname:maxGeometryOutputComponents
-    is the maximum number of components of output variables which can: be
-    output from the geometry shader stage.
-  * [[limits-maxGeometryOutputVertices]] pname:maxGeometryOutputVertices is
-    the maximum number of vertices which can: be emitted by any geometry
-    shader.
-  * [[limits-maxGeometryTotalOutputComponents]]
-    pname:maxGeometryTotalOutputComponents is the maximum total number of
-    components of output variables, across all emitted vertices, which can:
-    be output from the geometry shader stage.
-  * [[limits-maxFragmentInputComponents]] pname:maxFragmentInputComponents
-    is the maximum number of components of input variables which can: be
-    provided as inputs to the fragment shader stage.
-  * [[limits-maxFragmentOutputAttachments]]
-    pname:maxFragmentOutputAttachments is the maximum number of output
-    attachments which can: be written to by the fragment shader stage.
-  * [[limits-maxFragmentDualSrcAttachments]]
-    pname:maxFragmentDualSrcAttachments is the maximum number of output
-    attachments which can: be written to by the fragment shader stage when
-    blending is enabled and one of the dual source blend modes is in use.
-    See <<framebuffer-dsb>> and <<features-dualSrcBlend,dualSrcBlend>>.
-  * [[limits-maxFragmentCombinedOutputResources]]
-    pname:maxFragmentCombinedOutputResources is the total number of storage
-    buffers, storage images, and output code:Location decorated color
-    attachments (described in <<interfaces-fragmentoutput, Fragment Output
-    Interface>>) which can: be used in the fragment shader stage.
-  * [[limits-maxComputeSharedMemorySize]] pname:maxComputeSharedMemorySize
-    is the maximum total storage size, in bytes, available for variables
-    declared with the code:Workgroup storage class in shader modules (or
-    with the code:shared storage qualifier in GLSL) in the compute shader
-    stage.
-ifdef::VK_KHR_workgroup_memory_explicit_layout[]
-    When variables declared with the code:Workgroup storage class are
-    explicitly laid out (hence they are also decorated with code:Block), the
-    amount of storage consumed is the size of the largest Block variable,
-    not counting any padding at the end.
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-    The amount of storage consumed by the
-ifdef::VK_KHR_workgroup_memory_explicit_layout[]
-    non-Block
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-    variables declared with the code:Workgroup storage class is
-    implementation-dependent.
-    However, the amount of storage consumed may not exceed the largest block
-    size that would be obtained if all active
-ifdef::VK_KHR_workgroup_memory_explicit_layout[]
-    non-Block
-endif::VK_KHR_workgroup_memory_explicit_layout[]
-    variables declared with code:Workgroup storage class were assigned
-    offsets in an arbitrary order by successively taking the smallest valid
-    offset according to the <<interfaces-resources-standard-layout,Standard
-    Storage Buffer Layout>> rules.
-    (This is equivalent to using the GLSL std430 layout rules.)
-  * [[limits-maxComputeWorkGroupCount]] pname:maxComputeWorkGroupCount[3] is
-    the maximum number of local workgroups that can: be dispatched by a
-    single dispatching command.
-    These three values represent the maximum number of local workgroups for
-    the X, Y, and Z dimensions, respectively.
-    The workgroup count parameters to the dispatching commands must: be less
-    than or equal to the corresponding limit.
-    See <<dispatch>>.
-  * [[limits-maxComputeWorkGroupInvocations]]
-    pname:maxComputeWorkGroupInvocations is the maximum total number of
-    compute shader invocations in a single local workgroup.
-    The product of the X, Y, and Z sizes, as specified by the code:LocalSize
-ifdef::VK_KHR_maintenance4[or code:LocalSizeId]
-    execution mode in shader modules or by the object decorated by the
-    code:WorkgroupSize decoration, must: be less than or equal to this
-    limit.
-  * [[limits-maxComputeWorkGroupSize]] pname:maxComputeWorkGroupSize[3] is
-    the maximum size of a local compute workgroup, per dimension.
-    These three values represent the maximum local workgroup size in the X,
-    Y, and Z dimensions, respectively.
-    The pname:x, pname:y, and pname:z sizes, as specified by the
-    code:LocalSize
-ifdef::VK_KHR_maintenance4[or code:LocalSizeId]
-    execution mode or by the object decorated by the code:WorkgroupSize
-    decoration in shader modules, must: be less than or equal to the
-    corresponding limit.
-  * [[limits-subPixelPrecisionBits]] pname:subPixelPrecisionBits is the
-    number of bits of subpixel precision in framebuffer coordinates
-    [eq]#x~f~# and [eq]#y~f~#.
-    See <<primsrast>>.
-  * [[limits-subTexelPrecisionBits]] pname:subTexelPrecisionBits is the
-    number of bits of precision in the division along an axis of an image
-    used for minification and magnification filters.
-    [eq]#2^pname:subTexelPrecisionBits^# is the actual number of divisions
-    along each axis of the image represented.
-    Sub-texel values calculated during image sampling will snap to these
-    locations when generating the filtered results.
-  * [[limits-mipmapPrecisionBits]] pname:mipmapPrecisionBits is the number
-    of bits of division that the LOD calculation for mipmap fetching get
-    snapped to when determining the contribution from each mip level to the
-    mip filtered results.
-    [eq]#2^pname:mipmapPrecisionBits^# is the actual number of divisions.
-  * [[limits-maxDrawIndexedIndexValue]] pname:maxDrawIndexedIndexValue is
-    the maximum index value that can: be used for indexed draw calls when
-    using 32-bit indices.
-    This excludes the primitive restart index value of 0xFFFFFFFF.
-    See <<features-fullDrawIndexUint32,fullDrawIndexUint32>>.
-  * [[limits-maxDrawIndirectCount]] pname:maxDrawIndirectCount is the
-    maximum draw count that is supported for indirect draw calls.
-    See <<features-multiDrawIndirect,multiDrawIndirect>>.
-  * [[limits-maxSamplerLodBias]] pname:maxSamplerLodBias is the maximum
-    absolute sampler LOD bias.
-    The sum of the pname:mipLodBias member of the slink:VkSamplerCreateInfo
-    structure and the code:Bias operand of image sampling operations in
-    shader modules (or 0 if no code:Bias operand is provided to an image
-    sampling operation) are clamped to the range
-    [eq]#[-pname:maxSamplerLodBias,+pname:maxSamplerLodBias]#.
-    See <<samplers-mipLodBias>>.
-  * [[limits-maxSamplerAnisotropy]] pname:maxSamplerAnisotropy is the
-    maximum degree of sampler anisotropy.
-    The maximum degree of anisotropic filtering used for an image sampling
-    operation is the minimum of the pname:maxAnisotropy member of the
-    slink:VkSamplerCreateInfo structure and this limit.
-    See <<samplers-maxAnisotropy>>.
-  * [[limits-maxViewports]] pname:maxViewports is the maximum number of
-    active viewports.
-    The pname:viewportCount member of the
-    slink:VkPipelineViewportStateCreateInfo structure that is provided at
-    pipeline creation must: be less than or equal to this limit.
-  * [[limits-maxViewportDimensions]] pname:maxViewportDimensions[2] are the
-    maximum viewport dimensions in the X (width) and Y (height) dimensions,
-    respectively.
-    The maximum viewport dimensions must: be greater than or equal to the
-    largest image which can: be created and used as a framebuffer
-    attachment.
-    See <<vertexpostproc-viewport,Controlling the Viewport>>.
-  * [[limits-viewportboundsrange]] pname:viewportBoundsRange[2] is the
-    [eq]#[minimum, maximum]# range that the corners of a viewport must: be
-    contained in.
-    This range must: be at least [eq]#[-2 {times} pname:size, 2 {times}
-    pname:size - 1]#, where [eq]#pname:size =
-    max(pname:maxViewportDimensions[0], pname:maxViewportDimensions[1])#.
-    See <<vertexpostproc-viewport,Controlling the Viewport>>.
-+
-[NOTE]
-.Note
-====
-The intent of the pname:viewportBoundsRange limit is to allow a maximum
-sized viewport to be arbitrarily shifted relative to the output target as
-long as at least some portion intersects.
-This would give a bounds limit of [eq]#[-pname:size {plus} 1, 2 {times}
-pname:size - 1]# which would allow all possible non-empty-set intersections
-of the output target and the viewport.
-Since these numbers are typically powers of two, picking the signed number
-range using the smallest possible number of bits ends up with the specified
-range.
-====
-  * [[limits-viewportSubPixelBits]] pname:viewportSubPixelBits is the number
-    of bits of subpixel precision for viewport bounds.
-    The subpixel precision that floating-point viewport bounds are
-    interpreted at is given by this limit.
-  * [[limits-minMemoryMapAlignment]] pname:minMemoryMapAlignment is the
-    minimum required: alignment, in bytes, of host visible memory
-    allocations within the host address space.
-    When mapping a memory allocation with flink:vkMapMemory, subtracting
-    pname:offset bytes from the returned pointer will always produce an
-    integer multiple of this limit.
-    See <<memory-device-hostaccess>>.
-  * [[limits-minTexelBufferOffsetAlignment]]
-    pname:minTexelBufferOffsetAlignment is the minimum required: alignment,
-    in bytes, for the pname:offset member of the
-    slink:VkBufferViewCreateInfo structure for texel buffers.
-ifdef::VK_EXT_texel_buffer_alignment[]
-    If <<features-texelBufferAlignment,texelBufferAlignment>> is enabled,
-    this limit is equivalent to the maximum of the
-    <<limits-uniformTexelBufferOffsetAlignmentBytes,
-    pname:uniformTexelBufferOffsetAlignmentBytes>> and
-    <<limits-storageTexelBufferOffsetAlignmentBytes,
-    pname:storageTexelBufferOffsetAlignmentBytes>> members of
-    slink:VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT, but smaller
-    alignment is optionally: allowed by
-    <<limits-storageTexelBufferOffsetSingleTexelAlignment,
-    pname:storageTexelBufferOffsetSingleTexelAlignment>> and
-    <<limits-uniformTexelBufferOffsetSingleTexelAlignment,
-    pname:uniformTexelBufferOffsetSingleTexelAlignment>>.
-    If <<features-texelBufferAlignment,texelBufferAlignment>> is not
-    enabled,
-endif::VK_EXT_texel_buffer_alignment[]
-    slink:VkBufferViewCreateInfo::pname:offset must: be a multiple of this
-    value.
-  * [[limits-minUniformBufferOffsetAlignment]]
-    pname:minUniformBufferOffsetAlignment is the minimum required:
-    alignment, in bytes, for the pname:offset member of the
-    sname:VkDescriptorBufferInfo structure for uniform buffers.
-    When a descriptor of type ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC is updated, the
-    pname:offset must: be an integer multiple of this limit.
-    Similarly, dynamic offsets for uniform buffers must: be multiples of
-    this limit.
-  * [[limits-minStorageBufferOffsetAlignment]]
-    pname:minStorageBufferOffsetAlignment is the minimum required:
-    alignment, in bytes, for the pname:offset member of the
-    sname:VkDescriptorBufferInfo structure for storage buffers.
-    When a descriptor of type ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC is updated, the
-    pname:offset must: be an integer multiple of this limit.
-    Similarly, dynamic offsets for storage buffers must: be multiples of
-    this limit.
-  * [[limits-minTexelOffset]] pname:minTexelOffset is the minimum offset
-    value for the code:ConstOffset image operand of any of the
-    code:OpImageSample* or code:OpImageFetch* image instructions.
-  * [[limits-maxTexelOffset]] pname:maxTexelOffset is the maximum offset
-    value for the code:ConstOffset image operand of any of the
-    code:OpImageSample* or code:OpImageFetch* image instructions.
-  * [[limits-minTexelGatherOffset]] pname:minTexelGatherOffset is the
-    minimum offset value for the code:Offset, code:ConstOffset, or
-    code:ConstOffsets image operands of any of the code:OpImage*Gather image
-    instructions.
-  * [[limits-maxTexelGatherOffset]] pname:maxTexelGatherOffset is the
-    maximum offset value for the code:Offset, code:ConstOffset, or
-    code:ConstOffsets image operands of any of the code:OpImage*Gather image
-    instructions.
-  * [[limits-minInterpolationOffset]] pname:minInterpolationOffset is the
-    base minimum (inclusive) negative offset value for the code:Offset
-    operand of the code:InterpolateAtOffset extended instruction.
-  * [[limits-maxInterpolationOffset]] pname:maxInterpolationOffset is the
-    base maximum (inclusive) positive offset value for the code:Offset
-    operand of the code:InterpolateAtOffset extended instruction.
-  * [[limits-subPixelInterpolationOffsetBits]]
-    pname:subPixelInterpolationOffsetBits is the number of fractional bits
-    that the code:x and code:y offsets to the code:InterpolateAtOffset
-    extended instruction may: be rounded to as fixed-point values.
-  * [[limits-maxFramebufferWidth]] pname:maxFramebufferWidth is the maximum
-    width for a framebuffer.
-    The pname:width member of the slink:VkFramebufferCreateInfo structure
-    must: be less than or equal to this limit.
-  * [[limits-maxFramebufferHeight]] pname:maxFramebufferHeight is the
-    maximum height for a framebuffer.
-    The pname:height member of the slink:VkFramebufferCreateInfo structure
-    must: be less than or equal to this limit.
-  * [[limits-maxFramebufferLayers]] pname:maxFramebufferLayers is the
-    maximum layer count for a layered framebuffer.
-    The pname:layers member of the slink:VkFramebufferCreateInfo structure
-    must: be less than or equal to this limit.
-  * [[limits-framebufferColorSampleCounts]]
-    pname:framebufferColorSampleCounts is a bitmask^1^ of
-    elink:VkSampleCountFlagBits indicating the color sample counts that are
-    supported for all framebuffer color attachments with floating- or
-    fixed-point formats.
-ifndef::VK_VERSION_1_2[]
-    There is no limit that specifies the color sample counts that are
-    supported for all color attachments with integer formats.
-endif::VK_VERSION_1_2[]
-ifdef::VK_VERSION_1_2[]
-    For color attachments with integer formats, see
-    <<limits-framebufferIntegerColorSampleCounts,
-    pname:framebufferIntegerColorSampleCounts>>.
-endif::VK_VERSION_1_2[]
-  * [[limits-framebufferDepthSampleCounts]]
-    pname:framebufferDepthSampleCounts is a bitmask^1^ of
-    elink:VkSampleCountFlagBits indicating the supported depth sample counts
-    for all framebuffer depth/stencil attachments, when the format includes
-    a depth component.
-  * [[limits-framebufferStencilSampleCounts]]
-    pname:framebufferStencilSampleCounts is a bitmask^1^ of
-    elink:VkSampleCountFlagBits indicating the supported stencil sample
-    counts for all framebuffer depth/stencil attachments, when the format
-    includes a stencil component.
-  * [[limits-framebufferNoAttachmentsSampleCounts]]
-    pname:framebufferNoAttachmentsSampleCounts is a bitmask^1^ of
-    elink:VkSampleCountFlagBits indicating the supported sample counts for a
-    <<renderpass-noattachments, subpass which uses no attachments>>.
-  * [[limits-maxColorAttachments]] pname:maxColorAttachments is the maximum
-    number of color attachments that can: be used by a subpass in a render
-    pass.
-    The pname:colorAttachmentCount member of the sname:VkSubpassDescription
-ifdef::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-    or sname:VkSubpassDescription2
-endif::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-    structure must: be less than or equal to this limit.
-  * [[limits-sampledImageColorSampleCounts]]
-    pname:sampledImageColorSampleCounts is a bitmask^1^ of
-    elink:VkSampleCountFlagBits indicating the sample counts supported for
-    all 2D images created with ename:VK_IMAGE_TILING_OPTIMAL, pname:usage
-    containing ename:VK_IMAGE_USAGE_SAMPLED_BIT, and a non-integer color
-    format.
-  * [[limits-sampledImageIntegerSampleCounts]]
-    pname:sampledImageIntegerSampleCounts is a bitmask^1^ of
-    elink:VkSampleCountFlagBits indicating the sample counts supported for
-    all 2D images created with ename:VK_IMAGE_TILING_OPTIMAL, pname:usage
-    containing ename:VK_IMAGE_USAGE_SAMPLED_BIT, and an integer color
-    format.
-  * [[limits-sampledImageDepthSampleCounts]]
-    pname:sampledImageDepthSampleCounts is a bitmask^1^ of
-    elink:VkSampleCountFlagBits indicating the sample counts supported for
-    all 2D images created with ename:VK_IMAGE_TILING_OPTIMAL, pname:usage
-    containing ename:VK_IMAGE_USAGE_SAMPLED_BIT, and a depth format.
-  * [[limits-sampledImageStencilSampleCounts]]
-    pname:sampledImageStencilSampleCounts is a bitmask^1^ of
-    elink:VkSampleCountFlagBits indicating the sample counts supported for
-    all 2D images created with ename:VK_IMAGE_TILING_OPTIMAL, pname:usage
-    containing ename:VK_IMAGE_USAGE_SAMPLED_BIT, and a stencil format.
-  * [[limits-storageImageSampleCounts]] pname:storageImageSampleCounts is a
-    bitmask^1^ of elink:VkSampleCountFlagBits indicating the sample counts
-    supported for all 2D images created with ename:VK_IMAGE_TILING_OPTIMAL,
-    and pname:usage containing ename:VK_IMAGE_USAGE_STORAGE_BIT.
-  * [[limits-maxSampleMaskWords]] pname:maxSampleMaskWords is the maximum
-    number of array elements of a variable decorated with the
-    code:SampleMask built-in decoration.
-  * [[limits-timestampComputeAndGraphics]] pname:timestampComputeAndGraphics
-    specifies support for timestamps on all graphics and compute queues.
-    If this limit is set to ename:VK_TRUE, all queues that advertise the
-    ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT in the
-    sname:VkQueueFamilyProperties::pname:queueFlags support
-    sname:VkQueueFamilyProperties::pname:timestampValidBits of at least 36.
-    See <<queries-timestamps, Timestamp Queries>>.
-  * [[limits-timestampPeriod]] pname:timestampPeriod is the number of
-    nanoseconds required: for a timestamp query to be incremented by 1.
-    See <<queries-timestamps, Timestamp Queries>>.
-  * [[limits-maxClipDistances]] pname:maxClipDistances is the maximum number
-    of clip distances that can: be used in a single shader stage.
-    The size of any array declared with the code:ClipDistance built-in
-    decoration in a shader module must: be less than or equal to this limit.
-  * [[limits-maxCullDistances]] pname:maxCullDistances is the maximum number
-    of cull distances that can: be used in a single shader stage.
-    The size of any array declared with the code:CullDistance built-in
-    decoration in a shader module must: be less than or equal to this limit.
-  * [[limits-maxCombinedClipAndCullDistances]]
-    pname:maxCombinedClipAndCullDistances is the maximum combined number of
-    clip and cull distances that can: be used in a single shader stage.
-    The sum of the sizes of any pair of arrays declared with the
-    code:ClipDistance and code:CullDistance built-in decoration used by a
-    single shader stage in a shader module must: be less than or equal to
-    this limit.
-  * [[limits-discreteQueuePriorities]] pname:discreteQueuePriorities is the
-    number of discrete priorities that can: be assigned to a queue based on
-    the value of each member of
-    slink:VkDeviceQueueCreateInfo::pname:pQueuePriorities.
-    This must: be at least 2, and levels must: be spread evenly over the
-    range, with at least one level at 1.0, and another at 0.0.
-    See <<devsandqueues-priority>>.
-  * [[limits-pointSizeRange]] pname:pointSizeRange[2] is the range
-    [eq]#[pname:minimum,pname:maximum]# of supported sizes for points.
-    Values written to variables decorated with the code:PointSize built-in
-    decoration are clamped to this range.
-  * [[limits-lineWidthRange]] pname:lineWidthRange[2] is the range
-    [eq]#[pname:minimum,pname:maximum]# of supported widths for lines.
-    Values specified by the pname:lineWidth member of the
-    slink:VkPipelineRasterizationStateCreateInfo or the pname:lineWidth
-    parameter to fname:vkCmdSetLineWidth are clamped to this range.
-  * [[limits-pointSizeGranularity]] pname:pointSizeGranularity is the
-    granularity of supported point sizes.
-    Not all point sizes in the range defined by pname:pointSizeRange are
-    supported.
-    This limit specifies the granularity (or increment) between successive
-    supported point sizes.
-  * [[limits-lineWidthGranularity]] pname:lineWidthGranularity is the
-    granularity of supported line widths.
-    Not all line widths in the range defined by pname:lineWidthRange are
-    supported.
-    This limit specifies the granularity (or increment) between successive
-    supported line widths.
-  * [[limits-strictLines]] pname:strictLines specifies whether lines are
-    rasterized according to the preferred method of rasterization.
-    If set to ename:VK_FALSE, lines may: be rasterized under a relaxed set
-    of rules.
-    If set to ename:VK_TRUE, lines are rasterized as per the strict
-    definition.
-    See <<primsrast-lines-basic,Basic Line Segment Rasterization>>.
-  * [[limits-standardSampleLocations]] pname:standardSampleLocations
-    specifies whether rasterization uses the standard sample locations as
-    documented in <<primsrast-multisampling,Multisampling>>.
-    If set to ename:VK_TRUE, the implementation uses the documented sample
-    locations.
-    If set to ename:VK_FALSE, the implementation may: use different sample
-    locations.
-  * [[limits-optimalBufferCopyOffsetAlignment]]
-    pname:optimalBufferCopyOffsetAlignment is the optimal buffer offset
-    alignment in bytes for
-ifndef::VK_KHR_copy_commands2[]
-    flink:vkCmdCopyBufferToImage and flink:vkCmdCopyImageToBuffer.
-endif::VK_KHR_copy_commands2[]
-ifdef::VK_KHR_copy_commands2[]
-    flink:vkCmdCopyBufferToImage2KHR, flink:vkCmdCopyBufferToImage,
-    flink:vkCmdCopyImageToBuffer2KHR, and flink:vkCmdCopyImageToBuffer.
-endif::VK_KHR_copy_commands2[]
-    The per texel alignment requirements are enforced, but applications
-    should: use the optimal alignment for optimal performance and power use.
-  * [[limits-optimalBufferCopyRowPitchAlignment]]
-    pname:optimalBufferCopyRowPitchAlignment is the optimal buffer row pitch
-    alignment in bytes for
-ifndef::VK_KHR_copy_commands2[]
-    flink:vkCmdCopyBufferToImage and flink:vkCmdCopyImageToBuffer.
-endif::VK_KHR_copy_commands2[]
-ifdef::VK_KHR_copy_commands2[]
-    flink:vkCmdCopyBufferToImage2KHR, flink:vkCmdCopyBufferToImage,
-    flink:vkCmdCopyImageToBuffer2KHR, and flink:vkCmdCopyImageToBuffer.
-endif::VK_KHR_copy_commands2[]
-    Row pitch is the number of bytes between texels with the same X
-    coordinate in adjacent rows (Y coordinates differ by one).
-    The per texel alignment requirements are enforced, but applications
-    should: use the optimal alignment for optimal performance and power use.
-  * [[limits-nonCoherentAtomSize]] pname:nonCoherentAtomSize is the size and
-    alignment in bytes that bounds concurrent access to
-    <<memory-device-hostaccess, host-mapped device memory>>.
-
-1::
-    For all bitmasks of elink:VkSampleCountFlagBits, the sample count limits
-    defined above represent the minimum supported sample counts for each
-    image type.
-    Individual images may: support additional sample counts, which are
-    queried using flink:vkGetPhysicalDeviceImageFormatProperties as
-    described in <<features-supported-sample-counts, Supported Sample
-    Counts>>.
-
-include::{generated}/validity/structs/VkPhysicalDeviceLimits.txt[]
---
-
-
-[open,refpage='VkSampleCountFlagBits',desc='Bitmask specifying sample counts supported for an image used for storage operations',type='enums']
---
-Bits which may: be set in the sample count limits returned by
-slink:VkPhysicalDeviceLimits, as well as in other queries and structures
-representing image sample counts, are:
-
-include::{generated}/api/enums/VkSampleCountFlagBits.txt[]
-
-  * ename:VK_SAMPLE_COUNT_1_BIT specifies an image with one sample per
-    pixel.
-  * ename:VK_SAMPLE_COUNT_2_BIT specifies an image with 2 samples per pixel.
-  * ename:VK_SAMPLE_COUNT_4_BIT specifies an image with 4 samples per pixel.
-  * ename:VK_SAMPLE_COUNT_8_BIT specifies an image with 8 samples per pixel.
-  * ename:VK_SAMPLE_COUNT_16_BIT specifies an image with 16 samples per
-    pixel.
-  * ename:VK_SAMPLE_COUNT_32_BIT specifies an image with 32 samples per
-    pixel.
-  * ename:VK_SAMPLE_COUNT_64_BIT specifies an image with 64 samples per
-    pixel.
---
-
-[open,refpage='VkSampleCountFlags',desc='Bitmask of VkSampleCountFlagBits',type='flags']
---
-include::{generated}/api/flags/VkSampleCountFlags.txt[]
-
-tname:VkSampleCountFlags is a bitmask type for setting a mask of zero or
-more elink:VkSampleCountFlagBits.
---
-
-ifdef::VK_KHR_push_descriptor[]
-[open,refpage='VkPhysicalDevicePushDescriptorPropertiesKHR',desc='Structure describing push descriptor limits that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDevicePushDescriptorPropertiesKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDevicePushDescriptorPropertiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-maxPushDescriptors]] pname:maxPushDescriptors is the maximum
-    number of descriptors that can: be used in a descriptor set created with
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR set.
-
-:refpage: VkPhysicalDevicePushDescriptorPropertiesKHR
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDevicePushDescriptorPropertiesKHR.txt[]
---
-endif::VK_KHR_push_descriptor[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-[open,refpage='VkPhysicalDeviceMultiviewProperties',desc='Structure describing multiview limits that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceMultiviewProperties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMultiviewProperties.txt[]
-
-ifdef::VK_KHR_multiview[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceMultiviewPropertiesKHR.txt[]
-endif::VK_KHR_multiview[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_multiview-properties[]
-  * [[{anchor-prefix}limits-maxMultiviewViewCount]]
-    pname:maxMultiviewViewCount is one greater than the maximum view index
-    that can: be used in a subpass.
-  * [[{anchor-prefix}limits-maxMultiviewInstanceIndex]]
-    pname:maxMultiviewInstanceIndex is the maximum valid value of instance
-    index allowed to be generated by a drawing command recorded within a
-    subpass of a multiview render pass instance.
-// end::VK_KHR_multiview-properties[]
-
-:refpage: VkPhysicalDeviceMultiviewProperties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceMultiviewProperties.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-[open,refpage='VkPhysicalDeviceFloatControlsProperties',desc='Structure describing properties supported by VK_KHR_shader_float_controls',type='structs',alias='VkPhysicalDeviceFloatControlsPropertiesKHR']
---
-The sname:VkPhysicalDeviceFloatControlsProperties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceFloatControlsProperties.txt[]
-
-ifdef::VK_KHR_shader_float_controls[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceFloatControlsPropertiesKHR.txt[]
-endif::VK_KHR_shader_float_controls[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_shader_float_controls-properties[]
-  * [[{anchor-prefix}features-denormBehaviorIndependence]]
-    pname:denormBehaviorIndependence is a
-    elink:VkShaderFloatControlsIndependence value indicating whether, and
-    how, denorm behavior can be set independently for different bit widths.
-  * [[{anchor-prefix}features-roundingModeIndependence]]
-    pname:roundingModeIndependence is a
-    elink:VkShaderFloatControlsIndependence value indicating whether, and
-    how, rounding modes can be set independently for different bit widths.
-  * [[{anchor-prefix}limits-shaderSignedZeroInfNanPreserveFloat16]]
-    pname:shaderSignedZeroInfNanPreserveFloat16 is a boolean value
-    indicating whether sign of a zero, [eq]##Nan##s and
-    latexmath:[\pm\infty] can: be preserved in 16-bit floating-point
-    computations.
-    It also indicates whether the code:SignedZeroInfNanPreserve execution
-    mode can: be used for 16-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderSignedZeroInfNanPreserveFloat32]]
-    pname:shaderSignedZeroInfNanPreserveFloat32 is a boolean value
-    indicating whether sign of a zero, [eq]##Nan##s and
-    latexmath:[\pm\infty] can: be preserved in 32-bit floating-point
-    computations.
-    It also indicates whether the code:SignedZeroInfNanPreserve execution
-    mode can: be used for 32-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderSignedZeroInfNanPreserveFloat64]]
-    pname:shaderSignedZeroInfNanPreserveFloat64 is a boolean value
-    indicating whether sign of a zero, [eq]##Nan##s and
-    latexmath:[\pm\infty] can: be preserved in 64-bit floating-point
-    computations.
-    It also indicates whether the code:SignedZeroInfNanPreserve execution
-    mode can: be used for 64-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderDenormPreserveFloat16]]
-    pname:shaderDenormPreserveFloat16 is a boolean value indicating whether
-    denormals can: be preserved in 16-bit floating-point computations.
-    It also indicates whether the code:DenormPreserve execution mode can: be
-    used for 16-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderDenormPreserveFloat32]]
-    pname:shaderDenormPreserveFloat32 is a boolean value indicating whether
-    denormals can: be preserved in 32-bit floating-point computations.
-    It also indicates whether the code:DenormPreserve execution mode can: be
-    used for 32-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderDenormPreserveFloat64]]
-    pname:shaderDenormPreserveFloat64 is a boolean value indicating whether
-    denormals can: be preserved in 64-bit floating-point computations.
-    It also indicates whether the code:DenormPreserve execution mode can: be
-    used for 64-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderDenormFlushToZeroFloat16]]
-    pname:shaderDenormFlushToZeroFloat16 is a boolean value indicating
-    whether denormals can: be flushed to zero in 16-bit floating-point
-    computations.
-    It also indicates whether the code:DenormFlushToZero execution mode can:
-    be used for 16-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderDenormFlushToZeroFloat32]]
-    pname:shaderDenormFlushToZeroFloat32 is a boolean value indicating
-    whether denormals can: be flushed to zero in 32-bit floating-point
-    computations.
-    It also indicates whether the code:DenormFlushToZero execution mode can:
-    be used for 32-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderDenormFlushToZeroFloat64]]
-    pname:shaderDenormFlushToZeroFloat64 is a boolean value indicating
-    whether denormals can: be flushed to zero in 64-bit floating-point
-    computations.
-    It also indicates whether the code:DenormFlushToZero execution mode can:
-    be used for 64-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderRoundingModeRTEFloat16]]
-    pname:shaderRoundingModeRTEFloat16 is a boolean value indicating whether
-    an implementation supports the round-to-nearest-even rounding mode for
-    16-bit floating-point arithmetic and conversion instructions.
-    It also indicates whether the code:RoundingModeRTE execution mode can:
-    be used for 16-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderRoundingModeRTEFloat32]]
-    pname:shaderRoundingModeRTEFloat32 is a boolean value indicating whether
-    an implementation supports the round-to-nearest-even rounding mode for
-    32-bit floating-point arithmetic and conversion instructions.
-    It also indicates whether the code:RoundingModeRTE execution mode can:
-    be used for 32-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderRoundingModeRTEFloat64]]
-    pname:shaderRoundingModeRTEFloat64 is a boolean value indicating whether
-    an implementation supports the round-to-nearest-even rounding mode for
-    64-bit floating-point arithmetic and conversion instructions.
-    It also indicates whether the code:RoundingModeRTE execution mode can:
-    be used for 64-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderRoundingModeRTZFloat16]]
-    pname:shaderRoundingModeRTZFloat16 is a boolean value indicating whether
-    an implementation supports the round-towards-zero rounding mode for
-    16-bit floating-point arithmetic and conversion instructions.
-    It also indicates whether the code:RoundingModeRTZ execution mode can:
-    be used for 16-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderRoundingModeRTZFloat32]]
-    pname:shaderRoundingModeRTZFloat32 is a boolean value indicating whether
-    an implementation supports the round-towards-zero rounding mode for
-    32-bit floating-point arithmetic and conversion instructions.
-    It also indicates whether the code:RoundingModeRTZ execution mode can:
-    be used for 32-bit floating-point types.
-  * [[{anchor-prefix}limits-shaderRoundingModeRTZFloat64]]
-    pname:shaderRoundingModeRTZFloat64 is a boolean value indicating whether
-    an implementation supports the round-towards-zero rounding mode for
-    64-bit floating-point arithmetic and conversion instructions.
-    It also indicates whether the code:RoundingModeRTZ execution mode can:
-    be used for 64-bit floating-point types.
-// end::VK_KHR_shader_float_controls-properties[]
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-Implementations may not be able to control behavior of denorms for
-floating-point atomics.
-This needs to be taken into account when such atomics will be added to
-Vulkan.
-====
-endif::editing-notes[]
-
-:refpage: VkPhysicalDeviceFloatControlsProperties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceFloatControlsProperties.txt[]
---
-
-[open,refpage='VkShaderFloatControlsIndependence',desc='Bitmask specifying whether, and how, shader float controls can be set separately',type='enums',alias='VkShaderFloatControlsIndependenceKHR']
---
-Values which may: be returned in the pname:denormBehaviorIndependence and
-pname:roundingModeIndependence fields of
-sname:VkPhysicalDeviceFloatControlsProperties are:
-
-include::{generated}/api/enums/VkShaderFloatControlsIndependence.txt[]
-
-ifdef::VK_KHR_shader_float_controls[]
-or the equivalent
-
-include::{generated}/api/enums/VkShaderFloatControlsIndependenceKHR.txt[]
-endif::VK_KHR_shader_float_controls[]
-
-  * ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY specifies that
-    shader float controls for 32-bit floating point can: be set
-    independently; other bit widths must: be set identically to each other.
-  * ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL specifies that shader
-    float controls for all bit widths can: be set independently.
-  * ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE specifies that shader
-    float controls for all bit widths must: be set identically.
---
-endif::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
-
-ifdef::VK_EXT_discard_rectangles[]
-[open,refpage='VkPhysicalDeviceDiscardRectanglePropertiesEXT',desc='Structure describing discard rectangle limits that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceDiscardRectanglePropertiesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceDiscardRectanglePropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-maxDiscardRectangles]] pname:maxDiscardRectangles is the
-    maximum number of active discard rectangles that can: be specified.
-
-:refpage: VkPhysicalDeviceDiscardRectanglePropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceDiscardRectanglePropertiesEXT.txt[]
---
-endif::VK_EXT_discard_rectangles[]
-
-ifdef::VK_EXT_sample_locations[]
-[open,refpage='VkPhysicalDeviceSampleLocationsPropertiesEXT',desc='Structure describing sample location limits that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceSampleLocationsPropertiesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceSampleLocationsPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-sampleLocationSampleCounts]] pname:sampleLocationSampleCounts
-    is a bitmask of elink:VkSampleCountFlagBits indicating the sample counts
-    supporting custom sample locations.
-  * [[limits-maxSampleLocationGridSize]] pname:maxSampleLocationGridSize is
-    the maximum size of the pixel grid in which sample locations can: vary
-    that is supported for all sample counts in
-    pname:sampleLocationSampleCounts.
-  * [[limits-sampleLocationCoordinateRange]]
-    pname:sampleLocationCoordinateRange[2] is the range of supported sample
-    location coordinates.
-  * [[limits-sampleLocationSubPixelBits]] pname:sampleLocationSubPixelBits
-    is the number of bits of subpixel precision for sample locations.
-  * [[limits-variableSampleLocations]] pname:variableSampleLocations
-    specifies whether the sample locations used by all pipelines that will
-    be bound to a command buffer during a subpass must: match.
-    If set to ename:VK_TRUE, the implementation supports variable sample
-    locations in a subpass.
-    If set to ename:VK_FALSE, then the sample locations must: stay constant
-    in each subpass.
-
-:refpage: VkPhysicalDeviceSampleLocationsPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceSampleLocationsPropertiesEXT.txt[]
---
-endif::VK_EXT_sample_locations[]
-
-ifdef::VK_EXT_external_memory_host[]
-[open,refpage='VkPhysicalDeviceExternalMemoryHostPropertiesEXT',desc='Structure describing external memory host pointer limits that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceExternalMemoryHostPropertiesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceExternalMemoryHostPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-minImportedHostPointerAlignment]]
-    pname:minImportedHostPointerAlignment is the minimum required:
-    alignment, in bytes, for the base address and size of host pointers that
-    can: be imported to a Vulkan memory object.
-    The value must: be a power of two.
-
-:refpage: VkPhysicalDeviceExternalMemoryHostPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceExternalMemoryHostPropertiesEXT.txt[]
---
-endif::VK_EXT_external_memory_host[]
-
-ifdef::VK_NVX_multiview_per_view_attributes[]
-[open,refpage='VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX',desc='Structure describing multiview limits that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX structure
-is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-perViewPositionAllComponents]]
-    pname:perViewPositionAllComponents is ename:VK_TRUE if the
-    implementation supports per-view position values that differ in
-    components other than the X component.
-
-:refpage: VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.txt[]
---
-endif::VK_NVX_multiview_per_view_attributes[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-[open,refpage='VkPhysicalDevicePointClippingProperties',desc='Structure describing the point clipping behavior supported by an implementation',type='structs']
---
-The sname:VkPhysicalDevicePointClippingProperties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDevicePointClippingProperties.txt[]
-
-ifdef::VK_KHR_maintenance2[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDevicePointClippingPropertiesKHR.txt[]
-endif::VK_KHR_maintenance2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_maintenance2-properties[]
-  * [[{anchor-prefix}limits-pointClipping]] pname:pointClippingBehavior is a
-    elink:VkPointClippingBehavior value specifying the point clipping
-    behavior supported by the implementation.
-// end::VK_KHR_maintenance2-properties[]
-
-:refpage: VkPhysicalDevicePointClippingProperties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDevicePointClippingProperties.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-
-ifdef::VK_VERSION_1_1[]
-[open,refpage='VkPhysicalDeviceSubgroupProperties',desc='Structure describing subgroup support for an implementation',type='structs']
---
-The sname:VkPhysicalDeviceSubgroupProperties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceSubgroupProperties.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_subgroup-properties[]
-  * [[{anchor-prefix}limits-subgroup-size]] pname:subgroupSize is the
-    default number of invocations in each subgroup.
-    pname:subgroupSize is at least 1 if any of the physical device's queues
-    support ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT.
-    pname:subgroupSize is a power-of-two.
-  * [[limits-subgroup-supportedStages]] pname:supportedStages is a bitfield
-    of elink:VkShaderStageFlagBits describing the shader stages that
-    <<shaders-group-operations, group operations>> with
-    <<shaders-scope-subgroup, subgroup scope>> are supported in.
-    pname:supportedStages will have the ename:VK_SHADER_STAGE_COMPUTE_BIT
-    bit set if any of the physical device's queues support
-    ename:VK_QUEUE_COMPUTE_BIT.
-  * [[limits-subgroupSupportedOperations]] pname:supportedOperations is a
-    bitmask of elink:VkSubgroupFeatureFlagBits specifying the sets of
-    <<shaders-group-operations, group operations>> with
-    <<shaders-scope-subgroup, subgroup scope>> supported on this device.
-    pname:supportedOperations will have the
-    ename:VK_SUBGROUP_FEATURE_BASIC_BIT bit set if any of the physical
-    device's queues support ename:VK_QUEUE_GRAPHICS_BIT or
-    ename:VK_QUEUE_COMPUTE_BIT.
-  * [[limits-subgroup-quadOperationsInAllStages]]
-    pname:quadOperationsInAllStages is a boolean specifying whether
-    <<shaders-quad-operations,quad group operations>> are available in all
-    stages, or are restricted to fragment and compute stages.
-// end::VK_KHR_subgroup-properties[]
-
-:refpage: VkPhysicalDeviceSubgroupProperties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-If pname:supportedOperations includes <<features-subgroup-quad,
-ename:VK_SUBGROUP_FEATURE_QUAD_BIT,>>
-ifdef::VK_KHR_shader_subgroup_uniform_control_flow[]
-or <<features-shaderSubgroupUniformControlFlow,
-pname:shaderSubgroupUniformControlFlow>> is enabled,
-endif::VK_KHR_shader_subgroup_uniform_control_flow[]
-pname:subgroupSize must: be greater than or equal to 4.
-
-include::{generated}/validity/structs/VkPhysicalDeviceSubgroupProperties.txt[]
---
-
-[open,refpage='VkSubgroupFeatureFlagBits',desc='Bitmask describing what group operations are supported with subgroup scope',type='enums']
---
-Bits which can: be set in
-slink:VkPhysicalDeviceSubgroupProperties::pname:supportedOperations
-ifdef::VK_VERSION_1_2[]
-and
-slink:VkPhysicalDeviceVulkan11Properties::pname:subgroupSupportedOperations
-endif::VK_VERSION_1_2[]
-to specify supported <<shaders-group-operations, group operations>> with
-<<shaders-scope-subgroup, subgroup scope>> are:
-
-include::{generated}/api/enums/VkSubgroupFeatureFlagBits.txt[]
-
-  * [[features-subgroup-basic]] ename:VK_SUBGROUP_FEATURE_BASIC_BIT
-    specifies the device will accept SPIR-V shader modules containing the
-    code:GroupNonUniform capability.
-  * [[features-subgroup-vote]] ename:VK_SUBGROUP_FEATURE_VOTE_BIT specifies
-    the device will accept SPIR-V shader modules containing the
-    code:GroupNonUniformVote capability.
-  * [[features-subgroup-arithmetic]]
-    ename:VK_SUBGROUP_FEATURE_ARITHMETIC_BIT specifies the device will
-    accept SPIR-V shader modules containing the
-    code:GroupNonUniformArithmetic capability.
-  * [[features-subgroup-ballot]] ename:VK_SUBGROUP_FEATURE_BALLOT_BIT
-    specifies the device will accept SPIR-V shader modules containing the
-    code:GroupNonUniformBallot capability.
-  * [[features-subgroup-shuffle]] ename:VK_SUBGROUP_FEATURE_SHUFFLE_BIT
-    specifies the device will accept SPIR-V shader modules containing the
-    code:GroupNonUniformShuffle capability.
-  * [[features-subgroup-shuffle-relative]]
-    ename:VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT specifies the device will
-    accept SPIR-V shader modules containing the
-    code:GroupNonUniformShuffleRelative capability.
-  * [[features-subgroup-clustered]] ename:VK_SUBGROUP_FEATURE_CLUSTERED_BIT
-    specifies the device will accept SPIR-V shader modules containing the
-    code:GroupNonUniformClustered capability.
-  * [[features-subgroup-quad]] ename:VK_SUBGROUP_FEATURE_QUAD_BIT specifies
-    the device will accept SPIR-V shader modules containing the
-    code:GroupNonUniformQuad capability.
-ifdef::VK_NV_shader_subgroup_partitioned[]
-  * [[features-subgroup-partitioned]]
-    ename:VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV specifies the device will
-    accept SPIR-V shader modules containing the
-    code:GroupNonUniformPartitionedNV capability.
-endif::VK_NV_shader_subgroup_partitioned[]
---
-
-[open,refpage='VkSubgroupFeatureFlags',desc='Bitmask of VkSubgroupFeatureFlagBits',type='flags']
---
-include::{generated}/api/flags/VkSubgroupFeatureFlags.txt[]
-
-tname:VkSubgroupFeatureFlags is a bitmask type for setting a mask of zero or
-more elink:VkSubgroupFeatureFlagBits.
---
-
-ifdef::VK_EXT_subgroup_size_control[]
-[open,refpage='VkPhysicalDeviceSubgroupSizeControlPropertiesEXT',desc='Structure describing the control subgroup size properties of an implementation',type='structs']
---
-The sname:VkPhysicalDeviceSubgroupSizeControlPropertiesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceSubgroupSizeControlPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-min-subgroup-size]] pname:minSubgroupSize is the minimum
-    subgroup size supported by this device.
-    pname:minSubgroupSize is at least one if any of the physical device's
-    queues support ename:VK_QUEUE_GRAPHICS_BIT or
-    ename:VK_QUEUE_COMPUTE_BIT.
-    pname:minSubgroupSize is a power-of-two.
-    pname:minSubgroupSize is less than or equal to pname:maxSubgroupSize.
-    pname:minSubgroupSize is less than or equal to
-    <<limits-subgroup-size,subgroupSize>>.
-  * [[limits-max-subgroup-size]] pname:maxSubgroupSize is the maximum
-    subgroup size supported by this device.
-    pname:maxSubgroupSize is at least one if any of the physical device's
-    queues support ename:VK_QUEUE_GRAPHICS_BIT or
-    ename:VK_QUEUE_COMPUTE_BIT.
-    pname:maxSubgroupSize is a power-of-two.
-    pname:maxSubgroupSize is greater than or equal to pname:minSubgroupSize.
-    pname:maxSubgroupSize is greater than or equal to
-    <<limits-subgroup-size,subgroupSize>>.
-  * [[limits-max-subgroups-per-workgroup]]
-    pname:maxComputeWorkgroupSubgroups is the maximum number of subgroups
-    supported by the implementation within a workgroup.
-  * [[limits-required-subgroup-size-stages]]
-    pname:requiredSubgroupSizeStages is a bitfield of what shader stages
-    support having a required subgroup size specified.
-
-:refpage: VkPhysicalDeviceSubgroupSizeControlPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-If slink:VkPhysicalDeviceSubgroupProperties::pname:supportedOperations
-includes <<features-subgroup-quad, ename:VK_SUBGROUP_FEATURE_QUAD_BIT>>,
-pname:minSubgroupSize must: be greater than or equal to 4.
-
-include::{generated}/validity/structs/VkPhysicalDeviceSubgroupSizeControlPropertiesEXT.txt[]
---
-endif::VK_EXT_subgroup_size_control[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_EXT_blend_operation_advanced[]
-[open,refpage='VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT',desc='Structure describing advanced blending limits that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-advancedBlendMaxColorAttachments]]
-    pname:advancedBlendMaxColorAttachments is one greater than the highest
-    color attachment index that can: be used in a subpass, for a pipeline
-    that uses an <<framebuffer-blend-advanced,advanced blend operation>>.
-  * [[limits-advancedBlendIndependentBlend]]
-    pname:advancedBlendIndependentBlend specifies whether advanced blend
-    operations can: vary per-attachment.
-  * [[limits-advancedBlendNonPremultipliedSrcColor]]
-    pname:advancedBlendNonPremultipliedSrcColor specifies whether the source
-    color can: be treated as non-premultiplied.
-    If this is ename:VK_FALSE, then
-    slink:VkPipelineColorBlendAdvancedStateCreateInfoEXT::pname:srcPremultiplied
-    must: be ename:VK_TRUE.
-  * [[limits-advancedBlendNonPremultipliedDstColor]]
-    pname:advancedBlendNonPremultipliedDstColor specifies whether the
-    destination color can: be treated as non-premultiplied.
-    If this is ename:VK_FALSE, then
-    slink:VkPipelineColorBlendAdvancedStateCreateInfoEXT::pname:dstPremultiplied
-    must: be ename:VK_TRUE.
-  * [[limits-advancedBlendCorrelatedOverlap]]
-    pname:advancedBlendCorrelatedOverlap specifies whether the overlap mode
-    can: be treated as correlated.
-    If this is ename:VK_FALSE, then
-    slink:VkPipelineColorBlendAdvancedStateCreateInfoEXT::pname:blendOverlap
-    must: be ename:VK_BLEND_OVERLAP_UNCORRELATED_EXT.
-  * [[limits-advancedBlendAllOperations]] pname:advancedBlendAllOperations
-    specifies whether all advanced blend operation enums are supported.
-    See the valid usage of slink:VkPipelineColorBlendAttachmentState.
-
-:refpage: VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT.txt[]
---
-endif::VK_EXT_blend_operation_advanced[]
-
-ifdef::VK_EXT_vertex_attribute_divisor[]
-[open,refpage='VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT',desc='Structure describing max value of vertex attribute divisor that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-maxVertexAttribDivisor]] pname:maxVertexAttribDivisor is the
-    maximum value of the number of instances that will repeat the value of
-    vertex attribute data when instanced rendering is enabled.
-
-:refpage: VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT.txt[]
---
-endif::VK_EXT_vertex_attribute_divisor[]
-
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-[open,refpage='VkPhysicalDeviceSamplerFilterMinmaxProperties',desc='Structure describing sampler filter minmax limits that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT']
---
-The sname:VkPhysicalDeviceSamplerFilterMinmaxProperties structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceSamplerFilterMinmaxProperties.txt[]
-
-ifdef::VK_EXT_sampler_filter_minmax[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT.txt[]
-endif::VK_EXT_sampler_filter_minmax[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_EXT_sampler_filter_minmax-properties[]
-  * [[{anchor-prefix}limits-filterMinmaxSingleComponentFormats]]
-    pname:filterMinmaxSingleComponentFormats is a boolean value indicating
-    whether a minimum set of required formats support min/max filtering.
-  * [[{anchor-prefix}limits-filterMinmaxImageComponentMapping]]
-    pname:filterMinmaxImageComponentMapping is a boolean value indicating
-    whether the implementation supports non-identity component mapping of
-    the image when doing min/max filtering.
-// end::VK_EXT_sampler_filter_minmax-properties[]
-
-:refpage: VkPhysicalDeviceSamplerFilterMinmaxProperties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-[[limits-filterMinmaxSingleComponentFormats-minimum-requirements]]
-If pname:filterMinmaxSingleComponentFormats is ename:VK_TRUE, the following
-formats must: support the
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT feature with
-ename:VK_IMAGE_TILING_OPTIMAL, if they support
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT:
-
-  * ename:VK_FORMAT_R8_UNORM
-  * ename:VK_FORMAT_R8_SNORM
-  * ename:VK_FORMAT_R16_UNORM
-  * ename:VK_FORMAT_R16_SNORM
-  * ename:VK_FORMAT_R16_SFLOAT
-  * ename:VK_FORMAT_R32_SFLOAT
-  * ename:VK_FORMAT_D16_UNORM
-  * ename:VK_FORMAT_X8_D24_UNORM_PACK32
-  * ename:VK_FORMAT_D32_SFLOAT
-  * ename:VK_FORMAT_D16_UNORM_S8_UINT
-  * ename:VK_FORMAT_D24_UNORM_S8_UINT
-  * ename:VK_FORMAT_D32_SFLOAT_S8_UINT
-
-If the format is a depth/stencil format, this bit only specifies that the
-depth aspect (not the stencil aspect) of an image of this format supports
-min/max filtering, and that min/max filtering of the depth aspect is
-supported when depth compare is disabled in the sampler.
-
-If pname:filterMinmaxImageComponentMapping is ename:VK_FALSE the component
-mapping of the image view used with min/max filtering must: have been
-created with the pname:r component set to the
-<<resources-image-views-identity-mappings,identity swizzle>>.
-Only the pname:r component of the sampled image value is defined and the
-other component values are undefined:.
-If pname:filterMinmaxImageComponentMapping is ename:VK_TRUE this restriction
-does not apply and image component mapping works as normal.
-
-include::{generated}/validity/structs/VkPhysicalDeviceSamplerFilterMinmaxProperties.txt[]
---
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-
-ifdef::VK_VERSION_1_1[]
-[open,refpage='VkPhysicalDeviceProtectedMemoryProperties',desc='Structure describing protected memory properties that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceProtectedMemoryProperties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceProtectedMemoryProperties.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_protected_memory-properties[]
-  * [[{anchor-prefix}limits-protectedNoFault]] pname:protectedNoFault
-    specifies how an implementation behaves when an application attempts to
-    write to unprotected memory in a protected queue operation, read from
-    protected memory in an unprotected queue operation, or perform a query
-    in a protected queue operation.
-    If this limit is ename:VK_TRUE, such writes will be discarded or have
-    undefined: values written, reads and queries will return undefined:
-    values.
-    If this limit is ename:VK_FALSE, applications must: not perform these
-    operations.
-    See <<memory-protected-access-rules>> for more information.
-// end::VK_KHR_protected_memory-properties[]
-
-:refpage: VkPhysicalDeviceProtectedMemoryProperties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceProtectedMemoryProperties.txt[]
---
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance3[]
-[open,refpage='VkPhysicalDeviceMaintenance3Properties',desc='Structure describing descriptor set properties',type='structs']
---
-The sname:VkPhysicalDeviceMaintenance3Properties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMaintenance3Properties.txt[]
-
-ifdef::VK_KHR_maintenance3[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceMaintenance3PropertiesKHR.txt[]
-endif::VK_KHR_maintenance3[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_maintenance3-properties[]
-  * [[{anchor-prefix}limits-maxPerSetDescriptors]]
-    pname:maxPerSetDescriptors is a maximum number of descriptors (summed
-    over all descriptor types) in a single descriptor set that is guaranteed
-    to satisfy any implementation-dependent constraints on the size of a
-    descriptor set itself.
-    Applications can: query whether a descriptor set that goes beyond this
-    limit is supported using flink:vkGetDescriptorSetLayoutSupport.
-  * [[{anchor-prefix}limits-maxMemoryAllocationSize]]
-    pname:maxMemoryAllocationSize is the maximum size of a memory allocation
-    that can: be created, even if there is more space available in the heap.
-// end::VK_KHR_maintenance3-properties[]
-
-:refpage: VkPhysicalDeviceMaintenance3Properties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceMaintenance3Properties.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_maintenance3[]
-
-ifdef::VK_KHR_maintenance4[]
-[open,refpage='VkPhysicalDeviceMaintenance4PropertiesKHR',desc='Structure describing various implementation-defined properties introduced with VK_KHR_maintenance4',type='structs']
---
-The sname:VkPhysicalDeviceMaintenance4PropertiesKHR structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMaintenance4PropertiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-maxBufferSize]] pname:maxBufferSize is the maximum size
-    sname:VkBuffer that can: be created.
-
-:refpage: VkPhysicalDeviceMaintenance4PropertiesKHR
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceMaintenance4PropertiesKHR.txt[]
---
-endif::VK_KHR_maintenance4[]
-
-ifdef::VK_NV_mesh_shader[]
-[open,refpage='VkPhysicalDeviceMeshShaderPropertiesNV',desc='Structure describing mesh shading properties',type='structs']
---
-The sname:VkPhysicalDeviceMeshShaderPropertiesNV structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMeshShaderPropertiesNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxDrawMeshTasksCount is the maximum number of local workgroups
-    that can: be launched by a single draw mesh tasks command.
-    See <<drawing-mesh-shading>>.
-  * pname:maxTaskWorkGroupInvocations is the maximum total number of task
-    shader invocations in a single local workgroup.
-    The product of the X, Y, and Z sizes, as specified by the code:LocalSize
-ifdef::VK_KHR_maintenance4[or code:LocalSizeId]
-    execution mode in shader modules or by the object decorated by the
-    code:WorkgroupSize decoration, must: be less than or equal to this
-    limit.
-  * pname:maxTaskWorkGroupSize[3] is the maximum size of a local task
-    workgroup.
-    These three values represent the maximum local workgroup size in the X,
-    Y, and Z dimensions, respectively.
-    The pname:x, pname:y, and pname:z sizes, as specified by the
-    code:LocalSize
-ifdef::VK_KHR_maintenance4[or code:LocalSizeId]
-    execution mode or by the object decorated by the code:WorkgroupSize
-    decoration in shader modules, must: be less than or equal to the
-    corresponding limit.
-  * pname:maxTaskTotalMemorySize is the maximum number of bytes that the
-    task shader can use in total for shared and output memory combined.
-  * pname:maxTaskOutputCount is the maximum number of output tasks a single
-    task shader workgroup can emit.
-  * pname:maxMeshWorkGroupInvocations is the maximum total number of mesh
-    shader invocations in a single local workgroup.
-    The product of the X, Y, and Z sizes, as specified by the code:LocalSize
-ifdef::VK_KHR_maintenance4[or code:LocalSizeId]
-    execution mode in shader modules or by the object decorated by the
-    code:WorkgroupSize decoration, must: be less than or equal to this
-    limit.
-  * pname:maxMeshWorkGroupSize[3] is the maximum size of a local mesh
-    workgroup.
-    These three values represent the maximum local workgroup size in the X,
-    Y, and Z dimensions, respectively.
-    The pname:x, pname:y, and pname:z sizes, as specified by the
-    code:LocalSize
-ifdef::VK_KHR_maintenance4[or code:LocalSizeId]
-    execution mode or by the object decorated by the code:WorkgroupSize
-    decoration in shader modules, must: be less than or equal to the
-    corresponding limit.
-  * pname:maxMeshTotalMemorySize is the maximum number of bytes that the
-    mesh shader can use in total for shared and output memory combined.
-  * pname:maxMeshOutputVertices is the maximum number of vertices a mesh
-    shader output can store.
-  * pname:maxMeshOutputPrimitives is the maximum number of primitives a mesh
-    shader output can store.
-  * pname:maxMeshMultiviewViewCount is the maximum number of multi-view
-    views a mesh shader can use.
-  * pname:meshOutputPerVertexGranularity is the granularity with which mesh
-    vertex outputs are allocated.
-    The value can be used to compute the memory size used by the mesh
-    shader, which must be less than or equal to
-    pname:maxMeshTotalMemorySize.
-  * pname:meshOutputPerPrimitiveGranularity is the granularity with which
-    mesh outputs qualified as per-primitive are allocated.
-    The value can be used to compute the memory size used by the mesh
-    shader, which must be less than or equal to
-    pname:maxMeshTotalMemorySize.
-
-:refpage: VkPhysicalDeviceMeshShaderPropertiesNV
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceMeshShaderPropertiesNV.txt[]
---
-endif::VK_NV_mesh_shader[]
-
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-[open,refpage='VkPhysicalDeviceDescriptorIndexingProperties',desc='Structure describing descriptor indexing properties that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceDescriptorIndexingPropertiesEXT']
---
-The sname:VkPhysicalDeviceDescriptorIndexingProperties structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceDescriptorIndexingProperties.txt[]
-
-ifdef::VK_EXT_descriptor_indexing[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceDescriptorIndexingPropertiesEXT.txt[]
-endif::VK_EXT_descriptor_indexing[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_EXT_descriptor_indexing-properties[]
-  * [[{anchor-prefix}limits-maxUpdateAfterBindDescriptorsInAllPools]]
-    pname:maxUpdateAfterBindDescriptorsInAllPools is the maximum number of
-    descriptors (summed over all descriptor types) that can: be created
-    across all pools that are created with the
-    ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT bit set.
-    Pool creation may: fail when this limit is exceeded, or when the space
-    this limit represents is unable to satisfy a pool creation due to
-    fragmentation.
-  * [[{anchor-prefix}limits-shaderUniformBufferArrayNonUniformIndexingNative]]
-    pname:shaderUniformBufferArrayNonUniformIndexingNative is a boolean
-    value indicating whether uniform buffer descriptors natively support
-    nonuniform indexing.
-    If this is ename:VK_FALSE, then a single dynamic instance of an
-    instruction that nonuniformly indexes an array of uniform buffers may:
-    execute multiple times in order to access all the descriptors.
-  * [[{anchor-prefix}limits-shaderSampledImageArrayNonUniformIndexingNative]]
-    pname:shaderSampledImageArrayNonUniformIndexingNative is a boolean value
-    indicating whether sampler and image descriptors natively support
-    nonuniform indexing.
-    If this is ename:VK_FALSE, then a single dynamic instance of an
-    instruction that nonuniformly indexes an array of samplers or images
-    may: execute multiple times in order to access all the descriptors.
-  * [[{anchor-prefix}limits-shaderStorageBufferArrayNonUniformIndexingNative]]
-    pname:shaderStorageBufferArrayNonUniformIndexingNative is a boolean
-    value indicating whether storage buffer descriptors natively support
-    nonuniform indexing.
-    If this is ename:VK_FALSE, then a single dynamic instance of an
-    instruction that nonuniformly indexes an array of storage buffers may:
-    execute multiple times in order to access all the descriptors.
-  * [[{anchor-prefix}limits-shaderStorageImageArrayNonUniformIndexingNative]]
-    pname:shaderStorageImageArrayNonUniformIndexingNative is a boolean value
-    indicating whether storage image descriptors natively support nonuniform
-    indexing.
-    If this is ename:VK_FALSE, then a single dynamic instance of an
-    instruction that nonuniformly indexes an array of storage images may:
-    execute multiple times in order to access all the descriptors.
-  * [[{anchor-prefix}limits-shaderInputAttachmentArrayNonUniformIndexingNative]]
-    pname:shaderInputAttachmentArrayNonUniformIndexingNative is a boolean
-    value indicating whether input attachment descriptors natively support
-    nonuniform indexing.
-    If this is ename:VK_FALSE, then a single dynamic instance of an
-    instruction that nonuniformly indexes an array of input attachments may:
-    execute multiple times in order to access all the descriptors.
-  * [[{anchor-prefix}limits-robustBufferAccessUpdateAfterBind]]
-    pname:robustBufferAccessUpdateAfterBind is a boolean value indicating
-    whether <<features-robustBufferAccess, pname:robustBufferAccess>> can:
-    be enabled in a device simultaneously with
-    pname:descriptorBindingUniformBufferUpdateAfterBind,
-    pname:descriptorBindingStorageBufferUpdateAfterBind,
-    pname:descriptorBindingUniformTexelBufferUpdateAfterBind, and/or
-    pname:descriptorBindingStorageTexelBufferUpdateAfterBind.
-    If this is ename:VK_FALSE, then either pname:robustBufferAccess must: be
-    disabled or all of these update-after-bind features must: be disabled.
-  * [[{anchor-prefix}limits-quadDivergentImplicitLod]]
-    pname:quadDivergentImplicitLod is a boolean value indicating whether
-    implicit level of detail calculations for image operations have
-    well-defined results when the image and/or sampler objects used for the
-    instruction are not uniform within a quad.
-    See <<textures-derivative-image-operations,Derivative Image
-    Operations>>.
-  * [[{anchor-prefix}limits-maxPerStageDescriptorUpdateAfterBindSamplers]]
-    pname:maxPerStageDescriptorUpdateAfterBindSamplers is similar to
-    pname:maxPerStageDescriptorSamplers but counts descriptors from
-    descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[{anchor-prefix}limits-maxPerStageDescriptorUpdateAfterBindUniformBuffers]]
-    pname:maxPerStageDescriptorUpdateAfterBindUniformBuffers is similar to
-    pname:maxPerStageDescriptorUniformBuffers but counts descriptors from
-    descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[{anchor-prefix}limits-maxPerStageDescriptorUpdateAfterBindStorageBuffers]]
-    pname:maxPerStageDescriptorUpdateAfterBindStorageBuffers is similar to
-    pname:maxPerStageDescriptorStorageBuffers but counts descriptors from
-    descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[{anchor-prefix}limits-maxPerStageDescriptorUpdateAfterBindSampledImages]]
-    pname:maxPerStageDescriptorUpdateAfterBindSampledImages is similar to
-    pname:maxPerStageDescriptorSampledImages but counts descriptors from
-    descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[{anchor-prefix}limits-maxPerStageDescriptorUpdateAfterBindStorageImages]]
-    pname:maxPerStageDescriptorUpdateAfterBindStorageImages is similar to
-    pname:maxPerStageDescriptorStorageImages but counts descriptors from
-    descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[{anchor-prefix}limits-maxPerStageDescriptorUpdateAfterBindInputAttachments]]
-    pname:maxPerStageDescriptorUpdateAfterBindInputAttachments is similar to
-    pname:maxPerStageDescriptorInputAttachments but counts descriptors from
-    descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[{anchor-prefix}limits-maxPerStageUpdateAfterBindResources]]
-    pname:maxPerStageUpdateAfterBindResources is similar to
-    pname:maxPerStageResources but counts descriptors from descriptor sets
-    created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindSamplers]]
-    pname:maxDescriptorSetUpdateAfterBindSamplers is similar to
-    pname:maxDescriptorSetSamplers but counts descriptors from descriptor
-    sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindUniformBuffers]]
-    pname:maxDescriptorSetUpdateAfterBindUniformBuffers is similar to
-    pname:maxDescriptorSetUniformBuffers but counts descriptors from
-    descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindUniformBuffersDynamic]]
-    pname:maxDescriptorSetUpdateAfterBindUniformBuffersDynamic is similar to
-    pname:maxDescriptorSetUniformBuffersDynamic but counts descriptors from
-    descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-    While an application can: allocate dynamic uniform buffer descriptors
-    from a pool created with the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,
-    bindings for these descriptors must: not be present in any descriptor
-    set layout that includes bindings created with
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT.
-  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindStorageBuffers]]
-    pname:maxDescriptorSetUpdateAfterBindStorageBuffers is similar to
-    pname:maxDescriptorSetStorageBuffers but counts descriptors from
-    descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindStorageBuffersDynamic]]
-    pname:maxDescriptorSetUpdateAfterBindStorageBuffersDynamic is similar to
-    pname:maxDescriptorSetStorageBuffersDynamic but counts descriptors from
-    descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-    While an application can: allocate dynamic storage buffer descriptors
-    from a pool created with the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,
-    bindings for these descriptors must: not be present in any descriptor
-    set layout that includes bindings created with
-    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT.
-  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindSampledImages]]
-    pname:maxDescriptorSetUpdateAfterBindSampledImages is similar to
-    pname:maxDescriptorSetSampledImages but counts descriptors from
-    descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindStorageImages]]
-    pname:maxDescriptorSetUpdateAfterBindStorageImages is similar to
-    pname:maxDescriptorSetStorageImages but counts descriptors from
-    descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindInputAttachments]]
-    pname:maxDescriptorSetUpdateAfterBindInputAttachments is similar to
-    pname:maxDescriptorSetInputAttachments but counts descriptors from
-    descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-// end::VK_EXT_descriptor_indexing-properties[]
-
-:refpage: VkPhysicalDeviceDescriptorIndexingProperties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceDescriptorIndexingProperties.txt[]
---
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-
-ifdef::VK_EXT_inline_uniform_block[]
-[open,refpage='VkPhysicalDeviceInlineUniformBlockPropertiesEXT',desc='Structure describing inline uniform block properties that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceInlineUniformBlockPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-maxInlineUniformBlockSize]] pname:maxInlineUniformBlockSize is
-    the maximum size in bytes of an <<descriptorsets-inlineuniformblock,
-    inline uniform block>> binding.
-  * [[limits-maxPerStageDescriptorInlineUniformBlocks]]
-    pname:maxPerStageDescriptorInlineUniformBlock is the maximum number of
-    inline uniform block bindings that can: be accessible to a single shader
-    stage in a pipeline layout.
-    Descriptor bindings with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT count against this
-    limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptor bindings in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * [[limits-maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks]]
-    pname:maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks
-ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    equals pname:maxPerStageDescriptorInlineUniformBlocks and is reserved
-    for future use.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    is similar to pname:maxPerStageDescriptorInlineUniformBlocks but counts
-    descriptor bindings from descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * [[limits-maxDescriptorSetInlineUniformBlocks]]
-    pname:maxDescriptorSetInlineUniformBlocks is the maximum number of
-    inline uniform block bindings that can: be included in descriptor
-    bindings in a pipeline layout across all pipeline shader stages and
-    descriptor set numbers.
-    Descriptor bindings with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT count against this
-    limit.
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    Only descriptor bindings in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-  * [[limits-maxDescriptorSetUpdateAfterBindInlineUniformBlocks]]
-    pname:maxDescriptorSetUpdateAfterBindInlineUniformBlocks
-ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    equals pname:maxDescriptorSetInlineUniformBlocks and is reserved for
-    future use.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-    is similar to pname:maxDescriptorSetInlineUniformBlocks but counts
-    descriptor bindings from descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-
-:refpage: VkPhysicalDeviceInlineUniformBlockPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceInlineUniformBlockPropertiesEXT.txt[]
---
-endif::VK_EXT_inline_uniform_block[]
-
-ifdef::VK_EXT_conservative_rasterization[]
-[open,refpage='VkPhysicalDeviceConservativeRasterizationPropertiesEXT',desc='Structure describing conservative raster properties that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT structure
-is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceConservativeRasterizationPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-primitiveOverestimationSize]] pname:primitiveOverestimationSize
-    is the size in pixels the generating primitive is increased at each of
-    its edges during conservative rasterization overestimation mode.
-    Even with a size of 0.0, conservative rasterization overestimation rules
-    still apply and if any part of the pixel rectangle is covered by the
-    generating primitive, fragments are generated for the entire pixel.
-    However implementations may: make the pixel coverage area even more
-    conservative by increasing the size of the generating primitive.
-  * [[limits-maxExtraPrimitiveOverestimationSize]]
-    pname:maxExtraPrimitiveOverestimationSize is the maximum size in pixels
-    of extra overestimation the implementation supports in the pipeline
-    state.
-    A value of 0.0 means the implementation does not support any additional
-    overestimation of the generating primitive during conservative
-    rasterization.
-    A value above 0.0 allows the application to further increase the size of
-    the generating primitive during conservative rasterization
-    overestimation.
-  * [[limits-extraPrimitiveOverestimationSizeGranularity]]
-    pname:extraPrimitiveOverestimationSizeGranularity is the granularity of
-    extra overestimation that can be specified in the pipeline state between
-    0.0 and pname:maxExtraPrimitiveOverestimationSize inclusive.
-    A value of 0.0 means the implementation can use the smallest
-    representable non-zero value in the screen space pixel fixed-point grid.
-  * [[limits-primitiveUnderestimation]] pname:primitiveUnderestimation is
-    ename:VK_TRUE if the implementation supports the
-    ename:VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT conservative
-    rasterization mode in addition to
-    ename:VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT.
-    Otherwise the implementation only supports
-    ename:VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT.
-  * [[limits-conservativePointAndLineRasterization]]
-    pname:conservativePointAndLineRasterization is ename:VK_TRUE if the
-    implementation supports conservative rasterization of point and line
-    primitives as well as triangle primitives.
-    Otherwise the implementation only supports triangle primitives.
-  * [[limits-degenerateTrianglesRasterized]]
-    pname:degenerateTrianglesRasterized is ename:VK_FALSE if the
-    implementation culls primitives generated from triangles that become
-    zero area after they are quantized to the fixed-point rasterization
-    pixel grid.
-    pname:degenerateTrianglesRasterized is ename:VK_TRUE if these primitives
-    are not culled and the provoking vertex attributes and depth value are
-    used for the fragments.
-    The primitive area calculation is done on the primitive generated from
-    the clipped triangle if applicable.
-    Zero area primitives are backfacing and the application can: enable
-    backface culling if desired.
-  * [[limits-degenerateLinesRasterized]] pname:degenerateLinesRasterized is
-    ename:VK_FALSE if the implementation culls lines that become zero length
-    after they are quantized to the fixed-point rasterization pixel grid.
-    pname:degenerateLinesRasterized is ename:VK_TRUE if zero length lines
-    are not culled and the provoking vertex attributes and depth value are
-    used for the fragments.
-  * [[limits-fullyCoveredFragmentShaderInputVariable]]
-    pname:fullyCoveredFragmentShaderInputVariable is ename:VK_TRUE if the
-    implementation supports the SPIR-V builtin fragment shader input
-    variable code:FullyCoveredEXT which specifies that conservative
-    rasterization is enabled and the fragment area is fully covered by the
-    generating primitive.
-  * [[limits-conservativeRasterizationPostDepthCoverage]]
-ifdef::VK_EXT_post_depth_coverage[]
-    pname:conservativeRasterizationPostDepthCoverage is ename:VK_TRUE if the
-    implementation supports conservative rasterization with the
-    code:PostDepthCoverage execution mode enabled.
-    Otherwise the code:PostDepthCoverage execution mode must: not be used
-    when conservative rasterization is enabled.
-endif::VK_EXT_post_depth_coverage[]
-ifndef::VK_EXT_post_depth_coverage[]
-    pname:conservativeRasterizationPostDepthCoverage must: be
-    ename:VK_FALSE.
-endif::VK_EXT_post_depth_coverage[]
-
-:refpage: VkPhysicalDeviceConservativeRasterizationPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceConservativeRasterizationPropertiesEXT.txt[]
---
-endif::VK_EXT_conservative_rasterization[]
-
-ifdef::VK_EXT_fragment_density_map[]
-[open,refpage='VkPhysicalDeviceFragmentDensityMapPropertiesEXT',desc='Structure describing fragment density map properties that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceFragmentDensityMapPropertiesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceFragmentDensityMapPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-minfragmentdensitytexelsize]] pname:minFragmentDensityTexelSize
-    is the minimum <<glossary-fragment-density-texel-size,fragment density
-    texel size>>.
-  * [[limits-maxfragmentdensitytexelsize]] pname:maxFragmentDensityTexelSize
-    is the maximum fragment density texel size.
-  * [[limits-fragmentdensityinvocations]] pname:fragmentDensityInvocations
-    specifies whether the implementation may: invoke additional fragment
-    shader invocations for each covered sample.
-
-:refpage: VkPhysicalDeviceFragmentDensityMapPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceFragmentDensityMapPropertiesEXT.txt[]
---
-endif::VK_EXT_fragment_density_map[]
-
-ifdef::VK_EXT_fragment_density_map2[]
-[open,refpage='VkPhysicalDeviceFragmentDensityMap2PropertiesEXT',desc='Structure describing additional fragment density map properties that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceFragmentDensityMap2PropertiesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceFragmentDensityMap2PropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-subsampledLoads]] pname:subsampledLoads specifies if performing
-    image data read with load operations on subsampled attachments will be
-    resampled to the fragment density of the render pass
-  * [[limits-subsampledCoarseReconstructionEarlyAccess]]
-    pname:subsampledCoarseReconstructionEarlyAccess specifies if performing
-    image data read with samplers created with pname:flags containing
-    ename:VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT in
-    fragment shader will trigger additional reads during
-    ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
-  * [[limits-maxSubsampledArrayLayers]] pname:maxSubsampledArrayLayers is
-    the maximum number of slink:VkImageView array layers for usages
-    supporting subsampled samplers
-  * [[limits-maxDescriptorSetSubsampledSamplers]]
-    pname:maxDescriptorSetSubsampledSamplers is the maximum number of
-    subsampled samplers that can: be included in a slink:VkPipelineLayout
-
-:refpage: VkPhysicalDeviceFragmentDensityMap2PropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceFragmentDensityMap2PropertiesEXT.txt[]
---
-endif::VK_EXT_fragment_density_map2[]
-
-ifdef::VK_AMD_shader_core_properties[]
-[open,refpage='VkPhysicalDeviceShaderCorePropertiesAMD',desc='Structure describing shader core properties that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceShaderCorePropertiesAMD structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderCorePropertiesAMD.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-shaderEngineCount]] pname:shaderEngineCount is an unsigned
-    integer value indicating the number of shader engines found inside the
-    shader core of the physical device.
-  * [[limits-shaderArraysPerEngineCount]] pname:shaderArraysPerEngineCount
-    is an unsigned integer value indicating the number of shader arrays
-    inside a shader engine.
-    Each shader array has its own scan converter, set of compute units, and
-    a render back end (color and depth buffers).
-    Shader arrays within a shader engine share shader processor input (wave
-    launcher) and shader export (export buffer) units.
-    Currently, a shader engine can have one or two shader arrays.
-  * [[limits-computeUnitsPerShaderArray]] pname:computeUnitsPerShaderArray
-    is an unsigned integer value indicating the physical number of compute
-    units within a shader array.
-    The active number of compute units in a shader array may: be lower.
-    A compute unit houses a set of SIMDs along with a sequencer module and a
-    local data store.
-  * [[limits-simdPerComputeUnit]] pname:simdPerComputeUnit is an unsigned
-    integer value indicating the number of SIMDs inside a compute unit.
-    Each SIMD processes a single instruction at a time.
-  * [[limits-wavefrontSize]] pname:wavefrontSize is an unsigned integer
-    value indicating the maximum size of a subgroup.
-  * [[limits-sgprsPerSimd]] pname:sgprsPerSimd is an unsigned integer value
-    indicating the number of physical Scalar General Purpose Registers
-    (SGPRs) per SIMD.
-  * [[limits-minSgprAllocation]] pname:minSgprAllocation is an unsigned
-    integer value indicating the minimum number of SGPRs allocated for a
-    wave.
-  * [[limits-maxSgprAllocation]] pname:maxSgprAllocation is an unsigned
-    integer value indicating the maximum number of SGPRs allocated for a
-    wave.
-  * [[limits-sgprAllocationGranularity]] pname:sgprAllocationGranularity is
-    an unsigned integer value indicating the granularity of SGPR allocation
-    for a wave.
-  * [[limits-vgprsPerSimd]] pname:vgprsPerSimd is an unsigned integer value
-    indicating the number of physical Vector General Purpose Registers
-    (VGPRs) per SIMD.
-  * [[limits-minVgprAllocation]] pname:minVgprAllocation is an unsigned
-    integer value indicating the minimum number of VGPRs allocated for a
-    wave.
-  * [[limits-maxVgprAllocation]] pname:maxVgprAllocation is an unsigned
-    integer value indicating the maximum number of VGPRs allocated for a
-    wave.
-  * [[limits-vgprAllocationGranularity]] pname:vgprAllocationGranularity is
-    an unsigned integer value indicating the granularity of VGPR allocation
-    for a wave.
-
-:refpage: VkPhysicalDeviceShaderCorePropertiesAMD
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderCorePropertiesAMD.txt[]
---
-endif::VK_AMD_shader_core_properties[]
-
-ifdef::VK_AMD_shader_core_properties2[]
-[open,refpage='VkPhysicalDeviceShaderCoreProperties2AMD',desc='Structure describing shader core properties that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceShaderCoreProperties2AMD structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderCoreProperties2AMD.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[features-shaderCoreFeatures]] pname:shaderCoreFeatures is a bitmask of
-    elink:VkShaderCorePropertiesFlagBitsAMD indicating the set of features
-    supported by the shader core.
-  * [[limits-activeComputeUnitCount]] pname:activeComputeUnitCount is an
-    unsigned integer value indicating the number of compute units that have
-    been enabled.
-
-:refpage: VkPhysicalDeviceShaderCoreProperties2AMD
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderCoreProperties2AMD.txt[]
---
-
-[open,refpage='VkShaderCorePropertiesFlagBitsAMD',desc='Bitmask specifying shader core properties',type='enums',xrefs='VkPhysicalDeviceShaderCoreProperties2AMD VkShaderCorePropertiesFlagsAMD']
---
-Bits for this type may: be defined by future extensions, or new versions of
-the `apiext:VK_AMD_shader_core_properties2` extension.
-Possible values of the pname:flags member of
-tlink:VkShaderCorePropertiesFlagsAMD are:
-
-include::{generated}/api/enums/VkShaderCorePropertiesFlagBitsAMD.txt[]
---
-
-[open,refpage='VkShaderCorePropertiesFlagsAMD',desc='Bitmask of VkShaderCorePropertiesFlagBitsAMD',type='flags',xrefs='VkPhysicalDeviceShaderCoreProperties2AMD VkShaderCorePropertiesFlagBitsAMD']
---
-include::{generated}/api/flags/VkShaderCorePropertiesFlagsAMD.txt[]
-
-tname:VkShaderCorePropertiesFlagsAMD is a bitmask type for providing zero or
-more elink:VkShaderCorePropertiesFlagBitsAMD.
---
-endif::VK_AMD_shader_core_properties2[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-[open,refpage='VkPhysicalDeviceDepthStencilResolveProperties',desc='Structure describing depth/stencil resolve properties that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceDepthStencilResolvePropertiesKHR']
---
-The sname:VkPhysicalDeviceDepthStencilResolveProperties structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceDepthStencilResolveProperties.txt[]
-
-ifdef::VK_KHR_depth_stencil_resolve[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceDepthStencilResolvePropertiesKHR.txt[]
-endif::VK_KHR_depth_stencil_resolve[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_depth_stencil_resolve-properties[]
-  * [[{anchor-prefix}features-depthResolveModes]]
-    pname:supportedDepthResolveModes is a bitmask of
-    elink:VkResolveModeFlagBits indicating the set of supported depth
-    resolve modes.
-    ename:VK_RESOLVE_MODE_SAMPLE_ZERO_BIT must: be included in the set but
-    implementations may: support additional modes.
-  * [[{anchor-prefix}features-stencilResolveModes]]
-    pname:supportedStencilResolveModes is a bitmask of
-    elink:VkResolveModeFlagBits indicating the set of supported stencil
-    resolve modes.
-    ename:VK_RESOLVE_MODE_SAMPLE_ZERO_BIT must: be included in the set but
-    implementations may: support additional modes.
-    ename:VK_RESOLVE_MODE_AVERAGE_BIT must: not be included in the set.
-  * [[{anchor-prefix}features-independentResolveNone]]
-    pname:independentResolveNone is ename:VK_TRUE if the implementation
-    supports setting the depth and stencil resolve modes to different values
-    when one of those modes is ename:VK_RESOLVE_MODE_NONE.
-    Otherwise the implementation only supports setting both modes to the
-    same value.
-  * [[{anchor-prefix}features-independentResolve]] pname:independentResolve
-    is ename:VK_TRUE if the implementation supports all combinations of the
-    supported depth and stencil resolve modes, including setting either
-    depth or stencil resolve mode to ename:VK_RESOLVE_MODE_NONE.
-    An implementation that supports pname:independentResolve must: also
-    support pname:independentResolveNone.
-// end::VK_KHR_depth_stencil_resolve-properties[]
-
-:refpage: VkPhysicalDeviceDepthStencilResolveProperties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceDepthStencilResolveProperties.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-
-ifdef::VK_KHR_performance_query[]
-include::VK_KHR_performance_query/props.txt[]
-endif::VK_KHR_performance_query[]
-
-ifdef::VK_NV_shading_rate_image[]
-[open,refpage='VkPhysicalDeviceShadingRateImagePropertiesNV',desc='Structure describing shading rate image limits that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceShadingRateImagePropertiesNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShadingRateImagePropertiesNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-shading-rate-texel-size]] pname:shadingRateTexelSize indicates
-    the width and height of the portion of the framebuffer corresponding to
-    each texel in the shading rate image.
-  * [[limits-shading-rate-palette-size]] pname:shadingRatePaletteSize
-    indicates the maximum number of palette entries supported for the
-    shading rate image.
-  * [[limits-shading-rate-max-coarse-samples]]
-    pname:shadingRateMaxCoarseSamples specifies the maximum number of
-    coverage samples supported in a single fragment.
-    If the product of the fragment size derived from the base shading rate
-    and the number of coverage samples per pixel exceeds this limit, the
-    final shading rate will be adjusted so that its product does not exceed
-    the limit.
-
-:refpage: VkPhysicalDeviceShadingRateImagePropertiesNV
-include::{chapters}/limits.txt[tag=limits_desc]
-
-These properties are related to the <<primsrast-shading-rate-image, shading
-rate image>> feature.
-
-include::{generated}/validity/structs/VkPhysicalDeviceShadingRateImagePropertiesNV.txt[]
---
-endif::VK_NV_shading_rate_image[]
-
-ifdef::VK_EXT_transform_feedback[]
-[open,refpage='VkPhysicalDeviceTransformFeedbackPropertiesEXT',desc='Structure describing transform feedback properties that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceTransformFeedbackPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-maxTransformFeedbackStreams]] pname:maxTransformFeedbackStreams
-    is the maximum number of vertex streams that can be output from geometry
-    shaders declared with the code:GeometryStreams capability.
-    If the implementation does not support
-    sname:VkPhysicalDeviceTransformFeedbackFeaturesEXT::pname:geometryStreams
-    then pname:maxTransformFeedbackStreams must: be set to `1`.
-  * [[limits-maxTransformFeedbackBuffers]] pname:maxTransformFeedbackBuffers
-    is the maximum number of transform feedback buffers that can be bound
-    for capturing shader outputs from the last
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stage>>.
-  * [[limits-maxTransformFeedbackBufferSize]]
-    pname:maxTransformFeedbackBufferSize is the maximum size that can be
-    specified when binding a buffer for transform feedback in
-    flink:vkCmdBindTransformFeedbackBuffersEXT.
-  * [[limits-maxTransformFeedbackStreamDataSize]]
-    pname:maxTransformFeedbackStreamDataSize is the maximum amount of data
-    in bytes for each vertex that captured to one or more transform feedback
-    buffers associated with a specific vertex stream.
-  * [[limits-maxTransformFeedbackBufferDataSize]]
-    pname:maxTransformFeedbackBufferDataSize is the maximum amount of data
-    in bytes for each vertex that can be captured to a specific transform
-    feedback buffer.
-  * [[limits-maxTransformFeedbackBufferDataStride]]
-    pname:maxTransformFeedbackBufferDataStride is the maximum stride between
-    each capture of vertex data to the buffer.
-  * [[limits-transformFeedbackQueries]] pname:transformFeedbackQueries is
-    ename:VK_TRUE if the implementation supports the
-    ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT query type.
-    pname:transformFeedbackQueries is ename:VK_FALSE if queries of this type
-    cannot: be created.
-  * [[limits-transformFeedbackStreamsLinesTriangles]]
-    pname:transformFeedbackStreamsLinesTriangles is ename:VK_TRUE if the
-    implementation supports the geometry shader code:OpExecutionMode of
-    code:OutputLineStrip and code:OutputTriangleStrip in addition to
-    code:OutputPoints when more than one vertex stream is output.
-    If pname:transformFeedbackStreamsLinesTriangles is ename:VK_FALSE the
-    implementation only supports an code:OpExecutionMode of
-    code:OutputPoints when more than one vertex stream is output from the
-    geometry shader.
-  * [[limits-transformFeedbackRasterizationStreamSelect]]
-    pname:transformFeedbackRasterizationStreamSelect is ename:VK_TRUE if the
-    implementation supports the code:GeometryStreams SPIR-V capability and
-    the application can use
-    slink:VkPipelineRasterizationStateStreamCreateInfoEXT to modify which
-    vertex stream output is used for rasterization.
-    Otherwise vertex stream `0` must: always be used for rasterization.
-  * [[limits-transformFeedbackDraw]] pname:transformFeedbackDraw is
-    ename:VK_TRUE if the implementation supports the
-    flink:vkCmdDrawIndirectByteCountEXT function otherwise the function
-    must: not be called.
-
-:refpage: VkPhysicalDeviceTransformFeedbackPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceTransformFeedbackPropertiesEXT.txt[]
---
-endif::VK_EXT_transform_feedback[]
-
-ifdef::VK_NV_ray_tracing[]
-[open,refpage='VkPhysicalDeviceRayTracingPropertiesNV',desc='Properties of the physical device for ray tracing',type='structs']
---
-The sname:VkPhysicalDeviceRayTracingPropertiesNV structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceRayTracingPropertiesNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:shaderGroupHandleSize is the size in bytes of the shader header.
-  * [[limits-maxRecursionDepth]] pname:maxRecursionDepth is the maximum
-    number of levels of recursion allowed in a trace command.
-  * pname:maxShaderGroupStride is the maximum stride in bytes allowed
-    between shader groups in the shader binding table.
-  * pname:shaderGroupBaseAlignment is the required: alignment in bytes for
-    the base of the shader binding table.
-  * pname:maxGeometryCount is the maximum number of geometries in the bottom
-    level acceleration structure.
-  * pname:maxInstanceCount is the maximum number of instances in the top
-    level acceleration structure.
-  * pname:maxTriangleCount is the maximum number of triangles in all
-    geometries in the bottom level acceleration structure.
-  * pname:maxDescriptorSetAccelerationStructures is the maximum number of
-    acceleration structure descriptors that are allowed in a descriptor set.
-
-:refpage: VkPhysicalDeviceRayTracingPropertiesNV
-include::{chapters}/limits.txt[tag=limits_desc]
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-Limits specified by this structure must: match those specified with the same
-name in slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR and
-slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-include::{generated}/validity/structs/VkPhysicalDeviceRayTracingPropertiesNV.txt[]
---
-endif::VK_NV_ray_tracing[]
-
-ifdef::VK_KHR_acceleration_structure[]
-[open,refpage='VkPhysicalDeviceAccelerationStructurePropertiesKHR',desc='Properties of the physical device for acceleration structure',type='structs']
---
-The sname:VkPhysicalDeviceAccelerationStructurePropertiesKHR structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceAccelerationStructurePropertiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxGeometryCount is the maximum number of geometries in the bottom
-    level acceleration structure.
-  * pname:maxInstanceCount is the maximum number of instances in the top
-    level acceleration structure.
-  * pname:maxPrimitiveCount is the maximum number of triangles or AABBs in
-    all geometries in the bottom level acceleration structure.
-  * [[limits-maxPerStageDescriptorAccelerationStructures]]
-    pname:maxPerStageDescriptorAccelerationStructures is the maximum number
-    of acceleration structure bindings that can: be accessible to a single
-    shader stage in a pipeline layout.
-    Descriptor bindings with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR count against this
-    limit.
-    Only descriptor bindings in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-  * [[limits-maxPerStageDescriptorUpdateAfterBindAccelerationStructures]]
-    pname:maxPerStageDescriptorUpdateAfterBindAccelerationStructures is
-    similar to pname:maxPerStageDescriptorAccelerationStructures but counts
-    descriptor bindings from descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[limits-maxDescriptorSetAccelerationStructures]]
-    pname:maxDescriptorSetAccelerationStructures is the maximum number of
-    acceleration structure descriptors that can: be included in descriptor
-    bindings in a pipeline layout across all pipeline shader stages and
-    descriptor set numbers.
-    Descriptor bindings with a descriptor type of
-    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR count against this
-    limit.
-    Only descriptor bindings in descriptor set layouts created without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
-    count against this limit.
-  * [[limits-maxDescriptorSetUpdateAfterBindAccelerationStructures]]
-    pname:maxDescriptorSetUpdateAfterBindAccelerationStructures is similar
-    to pname:maxDescriptorSetAccelerationStructures but counts descriptor
-    bindings from descriptor sets created with or without the
-    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
-    set.
-  * [[limits-minAccelerationStructureScratchOffsetAlignment]]
-    pname:minAccelerationStructureScratchOffsetAlignment is the minimum
-    required: alignment, in bytes, for scratch data passed in to an
-    acceleration structure build command.
-
-:refpage: VkPhysicalDeviceAccelerationStructurePropertiesKHR
-include::{chapters}/limits.txt[tag=limits_desc]
-
-ifdef::VK_NV_ray_tracing[]
-Limits specified by this structure must: match those specified with the same
-name in slink:VkPhysicalDeviceRayTracingPropertiesNV.
-endif::VK_NV_ray_tracing[]
-
-include::{generated}/validity/structs/VkPhysicalDeviceAccelerationStructurePropertiesKHR.txt[]
---
-endif::VK_KHR_acceleration_structure[]
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-[open,refpage='VkPhysicalDeviceRayTracingPipelinePropertiesKHR',desc='Properties of the physical device for ray tracing',type='structs']
---
-The sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceRayTracingPipelinePropertiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:shaderGroupHandleSize is the size in bytes of the shader header.
-  * [[limits-maxRayRecursionDepth]] pname:maxRayRecursionDepth is the
-    maximum number of levels of ray recursion allowed in a trace command.
-  * pname:maxShaderGroupStride is the maximum stride in bytes allowed
-    between shader groups in the shader binding table.
-  * pname:shaderGroupBaseAlignment is the required: alignment in bytes for
-    the base of the shader binding table.
-  * pname:shaderGroupHandleCaptureReplaySize is the number of bytes for the
-    information required to do capture and replay for shader group handles.
-  * pname:maxRayDispatchInvocationCount is the maximum number of ray
-    generation shader invocations which may: be produced by a single
-    flink:vkCmdTraceRaysIndirectKHR or flink:vkCmdTraceRaysKHR command.
-  * pname:shaderGroupHandleAlignment is the required: alignment in bytes for
-    each shader binding table entry.
-  * pname:maxRayHitAttributeSize is the maximum size in bytes for a ray
-    attribute structure
-
-:refpage: VkPhysicalDeviceRayTracingPipelinePropertiesKHR
-include::{chapters}/limits.txt[tag=limits_desc]
-
-ifdef::VK_NV_ray_tracing[]
-Limits specified by this structure must: match those specified with the same
-name in slink:VkPhysicalDeviceRayTracingPropertiesNV.
-endif::VK_NV_ray_tracing[]
-
-include::{generated}/validity/structs/VkPhysicalDeviceRayTracingPipelinePropertiesKHR.txt[]
---
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_NV_cooperative_matrix[]
-[open,refpage='VkPhysicalDeviceCooperativeMatrixPropertiesNV',desc='Structure describing cooperative matrix properties supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceCooperativeMatrixPropertiesNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceCooperativeMatrixPropertiesNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-cooperativeMatrixSupportedStages]]
-    pname:cooperativeMatrixSupportedStages is a bitfield of
-    elink:VkShaderStageFlagBits describing the shader stages that
-    cooperative matrix instructions are supported in.
-    pname:cooperativeMatrixSupportedStages will have the
-    ename:VK_SHADER_STAGE_COMPUTE_BIT bit set if any of the physical
-    device's queues support ename:VK_QUEUE_COMPUTE_BIT.
-
-:refpage: VkPhysicalDeviceCooperativeMatrixPropertiesNV
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceCooperativeMatrixPropertiesNV.txt[]
---
-endif::VK_NV_cooperative_matrix[]
-
-ifdef::VK_NV_shader_sm_builtins[]
-[open,refpage='VkPhysicalDeviceShaderSMBuiltinsPropertiesNV',desc='Structure describing shader SM Builtins properties supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceShaderSMBuiltinsPropertiesNV structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceShaderSMBuiltinsPropertiesNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-shaderSMCount]] pname:shaderSMCount is the number of SMs on the
-    device.
-  * [[limits-shaderWarpsPerSM]] pname:shaderWarpsPerSM is the maximum number
-    of simultaneously executing warps on an SM.
-
-:refpage: VkPhysicalDeviceShaderSMBuiltinsPropertiesNV
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceShaderSMBuiltinsPropertiesNV.txt[]
---
-endif::VK_NV_shader_sm_builtins[]
-
-ifdef::VK_EXT_texel_buffer_alignment[]
-[open,refpage='VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT',desc='Structure describing the texel buffer alignment requirements supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-storageTexelBufferOffsetAlignmentBytes]]
-    pname:storageTexelBufferOffsetAlignmentBytes is a byte alignment that is
-    sufficient for a storage texel buffer of any format.
-  * [[limits-storageTexelBufferOffsetSingleTexelAlignment]]
-    pname:storageTexelBufferOffsetSingleTexelAlignment indicates whether
-    single texel alignment is sufficient for a storage texel buffer of any
-    format.
-  * [[limits-uniformTexelBufferOffsetAlignmentBytes]]
-    pname:uniformTexelBufferOffsetAlignmentBytes is a byte alignment that is
-    sufficient for a uniform texel buffer of any format.
-  * [[limits-uniformTexelBufferOffsetSingleTexelAlignment]]
-    pname:uniformTexelBufferOffsetSingleTexelAlignment indicates whether
-    single texel alignment is sufficient for a uniform texel buffer of any
-    format.
-
-:refpage: VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-If the single texel alignment property is ename:VK_FALSE, then the buffer
-view's offset must: be aligned to the corresponding byte alignment value.
-If the single texel alignment property is ename:VK_TRUE, then the buffer
-view's offset must: be aligned to the lesser of the corresponding byte
-alignment value or the size of a single texel, based on
-slink:VkBufferViewCreateInfo::pname:format.
-If the size of a single texel is a multiple of three bytes, then the size of
-a single component of the format is used instead.
-
-These limits must: not advertise a larger alignment than the
-<<limits-required,required>> maximum minimum value of
-slink:VkPhysicalDeviceLimits::pname:minTexelBufferOffsetAlignment, for any
-format that supports use as a texel buffer.
-
-include::{generated}/validity/structs/VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT.txt[]
---
-endif::VK_EXT_texel_buffer_alignment[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-[open,refpage='VkPhysicalDeviceTimelineSemaphoreProperties',desc='Structure describing timeline semaphore properties that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceTimelineSemaphorePropertiesKHR']
---
-The sname:VkPhysicalDeviceTimelineSemaphoreProperties structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceTimelineSemaphoreProperties.txt[]
-
-ifdef::VK_KHR_timeline_semaphore[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceTimelineSemaphorePropertiesKHR.txt[]
-endif::VK_KHR_timeline_semaphore[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-// Must have preceding whitespace
-ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
-ifndef::VK_VERSION_1_2[:anchor-prefix:]
-// tag::VK_KHR_timeline_semaphore-properties[]
-  * [[{anchor-prefix}limits-maxTimelineSemaphoreValueDifference]]
-    pname:maxTimelineSemaphoreValueDifference indicates the maximum
-    difference allowed by the implementation between the current value of a
-    timeline semaphore and any pending signal or wait operations.
-// end::VK_KHR_timeline_semaphore-properties[]
-
-:refpage: VkPhysicalDeviceTimelineSemaphoreProperties
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceTimelineSemaphoreProperties.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-ifdef::VK_EXT_line_rasterization[]
-[open,refpage='VkPhysicalDeviceLineRasterizationPropertiesEXT',desc='Structure describing line rasterization properties supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceLineRasterizationPropertiesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceLineRasterizationPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-lineSubPixelPrecisionBits]] pname:lineSubPixelPrecisionBits is
-    the number of bits of subpixel precision in framebuffer coordinates
-    [eq]#x~f~# and [eq]#y~f~# when rasterizing <<primsrast-lines,line
-    segments>>.
-
-:refpage: VkPhysicalDeviceLineRasterizationPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceLineRasterizationPropertiesEXT.txt[]
---
-endif::VK_EXT_line_rasterization[]
-
-ifdef::VK_EXT_robustness2[]
-[open,refpage='VkPhysicalDeviceRobustness2PropertiesEXT',desc='Structure describing robust buffer access properties supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceRobustness2PropertiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceRobustness2PropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-robustStorageBufferAccessSizeAlignment]]
-    pname:robustStorageBufferAccessSizeAlignment is the number of bytes that
-    the range of a storage buffer descriptor is rounded up to when used for
-    bounds-checking when
-    <<features-robustBufferAccess2,pname:robustBufferAccess2>> is enabled.
-    This value is either 1 or 4.
-  * [[limits-robustUniformBufferAccessSizeAlignment]]
-    pname:robustUniformBufferAccessSizeAlignment is the number of bytes that
-    the range of a uniform buffer descriptor is rounded up to when used for
-    bounds-checking when
-    <<features-robustBufferAccess2,pname:robustBufferAccess2>> is enabled.
-    This value is a power of two in the range [1, 256].
-
-:refpage: VkPhysicalDeviceRobustness2PropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceRobustness2PropertiesEXT.txt[]
---
-endif::VK_EXT_robustness2[]
-
-ifdef::VK_NV_device_generated_commands[]
-[open,refpage='VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV',desc='Structure describing push descriptor limits that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxGraphicsShaderGroupCount is the maximum number of shader groups
-    in slink:VkGraphicsPipelineShaderGroupsCreateInfoNV.
-  * pname:maxIndirectSequenceCount is the maximum number of sequences in
-    slink:VkGeneratedCommandsInfoNV and in
-    slink:VkGeneratedCommandsMemoryRequirementsInfoNV.
-  * pname:maxIndirectCommandsLayoutTokenCount is the maximum number of
-    tokens in slink:VkIndirectCommandsLayoutCreateInfoNV.
-  * pname:maxIndirectCommandsStreamCount is the maximum number of streams in
-    slink:VkIndirectCommandsLayoutCreateInfoNV.
-  * pname:maxIndirectCommandsTokenOffset is the maximum offset in
-    sname:VkIndirectCommandsLayoutTokenNV.
-  * pname:maxIndirectCommandsStreamStride is the maximum stream stride in
-    slink:VkIndirectCommandsLayoutCreateInfoNV.
-  * pname:minSequenceCountBufferOffsetAlignment is the minimum alignment for
-    memory addresses which can: be used in sname:VkGeneratedCommandsInfoNV.
-  * pname:minSequenceIndexBufferOffsetAlignment is the minimum alignment for
-    memory addresses which can: be used in sname:VkGeneratedCommandsInfoNV.
-  * pname:minIndirectCommandsBufferOffsetAlignment is the minimum alignment
-    for memory addresses used in sname:VkIndirectCommandsStreamNV, and as
-    preprocess buffer in sname:VkGeneratedCommandsInfoNV.
-
-:refpage: VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV.txt[]
---
-
-endif::VK_NV_device_generated_commands[]
-
-ifdef::VK_KHR_portability_subset[]
-[open,refpage='VkPhysicalDevicePortabilitySubsetPropertiesKHR',desc='Structure describing additional properties supported by a portable implementation',type='structs']
---
-The sname:VkPhysicalDevicePortabilitySubsetPropertiesKHR structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDevicePortabilitySubsetPropertiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-minVertexInputBindingStrideAlignment]]
-    pname:minVertexInputBindingStrideAlignment indicates the minimum
-    alignment for vertex input strides.
-    slink:VkVertexInputBindingDescription::pname:stride must: be a multiple
-    of, and at least as large as, this value.
-
-:refpage: VkPhysicalDevicePortabilitySubsetPropertiesKHR
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDevicePortabilitySubsetPropertiesKHR.txt[]
---
-endif::VK_KHR_portability_subset[]
-
-
-ifdef::VK_KHR_fragment_shading_rate[]
-[open,refpage='VkPhysicalDeviceFragmentShadingRatePropertiesKHR',desc='Structure describing variable fragment shading rate limits that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceFragmentShadingRatePropertiesKHR structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceFragmentShadingRatePropertiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-minFragmentShadingRateAttachmentTexelSize]]
-    pname:minFragmentShadingRateAttachmentTexelSize indicates minimum
-    supported width and height of the portion of the framebuffer
-    corresponding to each texel in a fragment shading rate attachment.
-    Each value must: be less than or equal to the values in
-    pname:maxFragmentShadingRateAttachmentTexelSize.
-    Each value must: be a power-of-two.
-    It must: be [eq]#(0,0)# if the <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate>> feature is not supported.
-  * [[limits-maxFragmentShadingRateAttachmentTexelSize]]
-    pname:maxFragmentShadingRateAttachmentTexelSize indicates maximum
-    supported width and height of the portion of the framebuffer
-    corresponding to each texel in a fragment shading rate attachment.
-    Each value must: be greater than or equal to the values in
-    pname:minFragmentShadingRateAttachmentTexelSize.
-    Each value must: be a power-of-two.
-    It must: be [eq]#(0,0)# if the <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate>> feature is not supported.
-  * [[limits-maxFragmentShadingRateAttachmentTexelSizeAspectRatio]]
-    pname:maxFragmentShadingRateAttachmentTexelSizeAspectRatio indicates the
-    maximum ratio between the width and height of the portion of the
-    framebuffer corresponding to each texel in a fragment shading rate
-    attachment.
-    pname:maxFragmentShadingRateAttachmentTexelSizeAspectRatio must: be a
-    power-of-two value, and must: be less than or equal to
-    [eq]#max(pname:maxFragmentShadingRateAttachmentTexelSize.width /
-    pname:minFragmentShadingRateAttachmentTexelSize.height,
-    pname:maxFragmentShadingRateAttachmentTexelSize.height /
-    pname:minFragmentShadingRateAttachmentTexelSize.width)#.
-    It must: be 0 if the <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate>> feature is not supported.
-  * [[limits-primitiveFragmentShadingRateWithMultipleViewports]]
-    pname:primitiveFragmentShadingRateWithMultipleViewports specifies
-    whether the <<primsrast-fragment-shading-rate-primitive,primitive
-    fragment shading rate>> can: be used when multiple viewports are used.
-    If this value is ename:VK_FALSE, only a single viewport must: be used,
-    and applications must: not write to the
-ifdef::VK_NV_viewport_array2[]
-    code:ViewportMaskNV or
-endif::VK_NV_viewport_array2[]
-    code:ViewportIndex built-in when setting code:PrimitiveShadingRateKHR.
-    It must: be ename:VK_FALSE if
-ifdef::VK_VERSION_1_2[]
-    the <<features-shaderOutputViewportIndex,
-    pname:shaderOutputViewportIndex>> feature,
-endif::VK_VERSION_1_2[]
-ifdef::VK_EXT_shader_viewport_index_layer[]
-    the `apiext:VK_EXT_shader_viewport_index_layer` extension,
-endif::VK_EXT_shader_viewport_index_layer[]
-ifdef::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer[or]
-    the <<features-geometryShader, pname:geometryShader>> feature is not
-    supported, or if the <<features-primitiveFragmentShadingRate,
-    pname:primitiveFragmentShadingRate>> feature is not supported.
-  * [[limits-layeredShadingRateAttachments]]
-    pname:layeredShadingRateAttachments specifies whether a shading rate
-    attachment image view can: be created with multiple layers.
-    If this value is ename:VK_FALSE, when creating an image view with a
-    pname:usage that includes
-    ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,
-    pname:layerCount must: be `1`.
-    It must: be ename:VK_FALSE if
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-    the <<features-multiview,pname:multiview>> feature,
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifdef::VK_VERSION_1_2[]
-    the <<features-shaderOutputViewportIndex,
-    pname:shaderOutputViewportIndex>> feature,
-endif::VK_VERSION_1_2[]
-ifdef::VK_EXT_shader_viewport_index_layer[]
-    the `apiext:VK_EXT_shader_viewport_index_layer` extension,
-endif::VK_EXT_shader_viewport_index_layer[]
-ifdef::VK_VERSION_1_1,VK_KHR_multiview,VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer[or]
-    the <<features-geometryShader, pname:geometryShader>> feature is not
-    supported, or if the <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate>> feature is not supported.
-  * [[limits-fragmentShadingRateNonTrivialCombinerOps]]
-    pname:fragmentShadingRateNonTrivialCombinerOps specifies whether
-    elink:VkFragmentShadingRateCombinerOpKHR enums other than
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR or
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR can: be used.
-    It must: be ename:VK_FALSE unless either the
-    <<features-primitiveFragmentShadingRate,
-    pname:primitiveFragmentShadingRate>> or
-    <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate>> feature is supported.
-  * [[limits-maxFragmentSize]] pname:maxFragmentSize indicates the maximum
-    supported width and height of a fragment.
-    Its pname:width and pname:height members must: both be power-of-two
-    values.
-    This limit is purely informational, and is not validated.
-  * [[limits-maxFragmentSizeAspectRatio]] pname:maxFragmentSizeAspectRatio
-    indicates the maximum ratio between the width and height of a fragment.
-    pname:maxFragmentSizeAspectRatio must: be a power-of-two value, and
-    must: be less than or equal to the maximum of the pname:width and
-    pname:height members of pname:maxFragmentSize.
-    This limit is purely informational, and is not validated.
-  * [[limits-maxFragmentShadingRateCoverageSamples]]
-    pname:maxFragmentShadingRateCoverageSamples specifies the maximum number
-    of coverage samples supported in a single fragment.
-    pname:maxFragmentShadingRateCoverageSamples must: be less than or equal
-    to the product of the pname:width and pname:height members of
-    pname:maxFragmentSize, and the sample count reported by
-    pname:maxFragmentShadingRateRasterizationSamples.
-    pname:maxFragmentShadingRateCoverageSamples must: be less than or equal
-    to [eq]#pname:maxSampleMaskWords {times} 32# if
-    pname:fragmentShadingRateWithShaderSampleMask is supported.
-    This limit is purely informational, and is not validated.
-  * [[limits-maxFragmentShadingRateRasterizationSamples]]
-    pname:maxFragmentShadingRateRasterizationSamples is a
-    elink:VkSampleCountFlagBits value specifying the maximum sample rate
-    supported when a fragment covers multiple pixels.
-    This limit is purely informational, and is not validated.
-  * [[limits-fragmentShadingRateWithShaderDepthStencilWrites]]
-    pname:fragmentShadingRateWithShaderDepthStencilWrites specifies whether
-    the implementation supports writing code:FragDepth
-ifdef::VK_EXT_shader_stencil_export[]
-    or code:FragStencilRefEXT
-endif::VK_EXT_shader_stencil_export[]
-    from a fragment shader for multi-pixel fragments.
-    If this value is ename:VK_FALSE, writing to those built-ins will clamp
-    the fragment shading rate to [eq]#(1,1)#.
-  * [[limits-fragmentShadingRateWithSampleMask]]
-    pname:fragmentShadingRateWithSampleMask specifies whether the the
-    implementation supports setting valid bits of
-    slink:VkPipelineMultisampleStateCreateInfo::pname:pSampleMask to `0` for
-    multi-pixel fragments.
-    If this value is ename:VK_FALSE, zeroing valid bits in the sample mask
-    will clamp the fragment shading rate to [eq]#(1,1)#.
-  * [[limits-fragmentShadingRateWithShaderSampleMask]]
-    pname:fragmentShadingRateWithShaderSampleMask specifies whether the
-    implementation supports reading or writing code:SampleMask for
-    multi-pixel fragments.
-    If this value is ename:VK_FALSE, using that built-in will clamp the
-    fragment shading rate to [eq]#(1,1)#.
-  * [[limits-fragmentShadingRateWithConservativeRasterization]]
-    pname:fragmentShadingRateWithConservativeRasterization
-ifndef::VK_EXT_conservative_rasterization[]
-    is reserved for future use.
-endif::VK_EXT_conservative_rasterization[]
-ifdef::VK_EXT_conservative_rasterization[]
-    specifies whether <<primsrast-conservativeraster, conservative
-    rasterization>> is supported for multi-pixel fragments.
-    It must: be ename:VK_FALSE if `apiext:VK_EXT_conservative_rasterization`
-    is not supported.
-    If this value is ename:VK_FALSE, using <<primsrast-conservativeraster,
-    conservative rasterization>> will clamp the fragment shading rate to
-    [eq]#(1,1)#.
-endif::VK_EXT_conservative_rasterization[]
-  * [[limits-fragmentShadingRateWithFragmentShaderInterlock]]
-    pname:fragmentShadingRateWithFragmentShaderInterlock
-ifndef::VK_EXT_fragment_shader_interlock[]
-    is reserved for future use.
-endif::VK_EXT_fragment_shader_interlock[]
-ifdef::VK_EXT_fragment_shader_interlock[]
-    specifies whether <<fragops-shader-interlock, fragment shader
-    interlock>> is supported for multi-pixel fragments.
-    It must: be ename:VK_FALSE if `apiext:VK_EXT_fragment_shader_interlock`
-    is not supported.
-    If this value is ename:VK_FALSE, using <<fragops-shader-interlock,
-    fragment shader interlock>> will clamp the fragment shading rate to
-    [eq]#(1,1)#.
-endif::VK_EXT_fragment_shader_interlock[]
-  * [[limits-fragmentShadingRateWithCustomSampleLocations]]
-    pname:fragmentShadingRateWithCustomSampleLocations
-ifndef::VK_EXT_sample_locations[]
-    is reserved for future use.
-endif::VK_EXT_sample_locations[]
-ifdef::VK_EXT_sample_locations[]
-    specifies whether <<primsrast-samplelocations, custom sample locations>>
-    are supported for multi-pixel fragments.
-    It must: be ename:VK_FALSE if `apiext:VK_EXT_sample_locations` is not
-    supported.
-    If this value is ename:VK_FALSE, using <<primsrast-samplelocations,
-    custom sample locations>> will clamp the fragment shading rate to
-    [eq]#(1,1)#.
-endif::VK_EXT_sample_locations[]
-  * [[limits-fragmentShadingRateStrictMultiplyCombiner]]
-    pname:fragmentShadingRateStrictMultiplyCombiner specifies whether
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR accurately performs a
-    multiplication or not.
-    Implementations where this value is ename:VK_FALSE will instead combine
-    rates with an addition.
-    If pname:fragmentShadingRateNonTrivialCombinerOps is ename:VK_FALSE,
-    implementations must: report this as ename:VK_FALSE.
-    If pname:fragmentShadingRateNonTrivialCombinerOps is ename:VK_TRUE,
-    implementations should: report this as ename:VK_TRUE.
-
-[NOTE]
-.Note
-====
-Multiplication of the combiner rates using the fragment width/height in
-linear space is equivalent to an addition of those values in log2 space.
-Some implementations inadvertently implemented an addition in linear space
-due to unclear requirements originating outside of this specification.
-This resulted in <<limits-fragmentShadingRateStrictMultiplyCombiner,
-pname:fragmentShadingRateStrictMultiplyCombiner>> being added.
-Fortunately, this only affects situations where a rate of 1 in either
-dimension is combined with another rate of 1.
-All other combinations result in the exact same result as if multiplication
-was performed in linear space due to the clamping logic, and the fact that
-both the sum and product of 2 and 2 are equal.
-In many cases, this limit will not affect the correct operation of
-applications.
-====
-
-:refpage: VkPhysicalDeviceFragmentShadingRatePropertiesKHR
-include::{chapters}/limits.txt[tag=limits_desc]
-
-These properties are related to <<primsrast-fragment-shading-rate, fragment
-shading rates>>.
-
-include::{generated}/validity/structs/VkPhysicalDeviceFragmentShadingRatePropertiesKHR.txt[]
---
-endif::VK_KHR_fragment_shading_rate[]
-
-ifdef::VK_NV_fragment_shading_rate_enums[]
-[open,refpage='VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV',desc='Structure describing fragment shading rate limits that can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-maxFragmentShadingRateInvocationCount]]
-    pname:maxFragmentShadingRateInvocationCount is a
-    elink:VkSampleCountFlagBits value indicating the maximum number of
-    fragment shader invocations per fragment supported in pipeline,
-    primitive, and attachment fragment shading rates.
-
-:refpage: VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV
-include::{chapters}/limits.txt[tag=limits_desc]
-
-These properties are related to <<primsrast-fragment-shading-rate, fragment
-shading rates>>.
-
-include::{generated}/validity/structs/VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV.txt[]
---
-endif::VK_NV_fragment_shading_rate_enums[]
-
-ifdef::VK_EXT_custom_border_color[]
-[open,refpage='VkPhysicalDeviceCustomBorderColorPropertiesEXT',desc='Structure describing whether custom border colors can be supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceCustomBorderColorPropertiesEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceCustomBorderColorPropertiesEXT.txt[]
-
-  * [[limits-maxCustomBorderColorSamplers]]
-    pname:maxCustomBorderColorSamplers indicates the maximum number of
-    samplers with custom border colors which can: simultaneously exist on a
-    device.
-
-:refpage: VkPhysicalDeviceCustomBorderColorPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceCustomBorderColorPropertiesEXT.txt[]
---
-endif::VK_EXT_custom_border_color[]
-
-ifdef::VK_EXT_provoking_vertex[]
-[open,refpage='VkPhysicalDeviceProvokingVertexPropertiesEXT',desc='Structure describing provoking vertex properties supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceProvokingVertexPropertiesEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPhysicalDeviceProvokingVertexPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-provokingVertexModePerPipeline]]
-    pname:provokingVertexModePerPipeline indicates whether the
-    implementation supports graphics pipelines with different provoking
-    vertex modes within the same render pass instance.
-  * [[limits-transformFeedbackPreservesTriangleFanProvokingVertex]]
-    pname:transformFeedbackPreservesTriangleFanProvokingVertex indicates
-    whether the implementation can preserve the provoking vertex order when
-    writing triangle fan vertices to transform feedback.
-
-:refpage: VkPhysicalDeviceProvokingVertexPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceProvokingVertexPropertiesEXT.txt[]
---
-endif::VK_EXT_provoking_vertex[]
-
-ifdef::VK_HUAWEI_subpass_shading[]
-[open,refpage='VkPhysicalDeviceSubpassShadingPropertiesHUAWEI',desc='Structure describing subpass shading properties supported by an implementation',type='structs']
---
-The sname:VkPhysicalDeviceSubpassShadingPropertiesHUAWEI structure is
-defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceSubpassShadingPropertiesHUAWEI.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[limits-maxSubpassShadingWorkgroupSizeAspectRatio]]
-    pname:maxSubpassShadingWorkgroupSizeAspectRatio indicates the maximum
-    ratio between the width and height of the portion of the subpass shading
-    shader workgroup size.
-    pname:maxSubpassShadingWorkgroupSizeAspectRatio must: be a power-of-two
-    value, and must: be less than or equal to max(code:WorkgroupSize.x /
-    code:WorkgroupSize.y, code:WorkgroupSize.y / code:WorkgroupSize.x).
-
-:refpage: VkPhysicalDeviceSubpassShadingPropertiesHUAWEI
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceSubpassShadingPropertiesHUAWEI.txt[]
---
-endif::VK_HUAWEI_subpass_shading[]
-
-ifdef::VK_EXT_multi_draw[]
-
-[open,refpage='VkPhysicalDeviceMultiDrawPropertiesEXT',desc='Structure describing multidraw limits of an implementation',type='structs']
---
-The sname:VkPhysicalDeviceMultiDrawPropertiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMultiDrawPropertiesEXT.txt[]
-
-The members of the sname:VkPhysicalDeviceMultiDrawPropertiesEXT structure
-describe the following features:
-
-  * [[limits-maxMultiDrawCount]] pname:maxMultiDrawCount indicates the
-    maximum number of draw calls which can: be batched into a single
-    multidraw.
-
-:refpage: VkPhysicalDeviceMultiDrawPropertiesPropertiesEXT
-include::{chapters}/limits.txt[tag=limits_desc]
-
-include::{generated}/validity/structs/VkPhysicalDeviceMultiDrawPropertiesEXT.txt[]
---
-
-endif::VK_EXT_multi_draw[]
-
-[[limits-minmax]]
-== Limit Requirements
-
-The following table specifies the required: minimum/maximum for all Vulkan
-graphics implementations.
-Where a limit corresponds to a fine-grained device feature which is
-optional:, the feature name is listed with two required: limits, one when
-the feature is supported and one when it is not supported.
-If an implementation supports a feature, the limits reported are the same
-whether or not the feature is enabled.
-
-[[limits-types]]
-.Required Limit Types
-[width="100%",cols="<20%,<50%,<30%",options="header"]
-|====
-| Type                     | Limit                                      | Feature
-| code:uint32_t            | pname:maxImageDimension1D                  | -
-| code:uint32_t            | pname:maxImageDimension2D                  | -
-| code:uint32_t            | pname:maxImageDimension3D                  | -
-| code:uint32_t            | pname:maxImageDimensionCube                | -
-| code:uint32_t            | pname:maxImageArrayLayers                  | -
-| code:uint32_t            | pname:maxTexelBufferElements               | -
-| code:uint32_t            | pname:maxUniformBufferRange                | -
-| code:uint32_t            | pname:maxStorageBufferRange                | -
-| code:uint32_t            | pname:maxPushConstantsSize                 | -
-| code:uint32_t            | pname:maxMemoryAllocationCount             | -
-| code:uint32_t            | pname:maxSamplerAllocationCount            | -
-| basetype:VkDeviceSize    | pname:bufferImageGranularity               | -
-| basetype:VkDeviceSize    | pname:sparseAddressSpaceSize               | pname:sparseBinding
-| code:uint32_t            | pname:maxBoundDescriptorSets               | -
-| code:uint32_t            | pname:maxPerStageDescriptorSamplers        | -
-| code:uint32_t            | pname:maxPerStageDescriptorUniformBuffers  | -
-| code:uint32_t            | pname:maxPerStageDescriptorStorageBuffers  | -
-| code:uint32_t            | pname:maxPerStageDescriptorSampledImages   | -
-| code:uint32_t            | pname:maxPerStageDescriptorStorageImages   | -
-| code:uint32_t            | pname:maxPerStageDescriptorInputAttachments| -
-| code:uint32_t            | pname:maxPerStageResources                 | -
-| code:uint32_t            | pname:maxDescriptorSetSamplers             | -
-| code:uint32_t            | pname:maxDescriptorSetUniformBuffers       | -
-| code:uint32_t            | pname:maxDescriptorSetUniformBuffersDynamic| -
-| code:uint32_t            | pname:maxDescriptorSetStorageBuffers       | -
-| code:uint32_t            | pname:maxDescriptorSetStorageBuffersDynamic| -
-| code:uint32_t            | pname:maxDescriptorSetSampledImages        | -
-| code:uint32_t            | pname:maxDescriptorSetStorageImages        | -
-| code:uint32_t            | pname:maxDescriptorSetInputAttachments     | -
-| code:uint32_t            | pname:maxVertexInputAttributes             | -
-| code:uint32_t            | pname:maxVertexInputBindings               | -
-| code:uint32_t            | pname:maxVertexInputAttributeOffset        | -
-| code:uint32_t            | pname:maxVertexInputBindingStride          | -
-| code:uint32_t            | pname:maxVertexOutputComponents            | -
-| code:uint32_t            | pname:maxTessellationGenerationLevel       | pname:tessellationShader
-| code:uint32_t            | pname:maxTessellationPatchSize             | pname:tessellationShader
-| code:uint32_t            | pname:maxTessellationControlPerVertexInputComponents  | pname:tessellationShader
-| code:uint32_t            | pname:maxTessellationControlPerVertexOutputComponents | pname:tessellationShader
-| code:uint32_t            | pname:maxTessellationControlPerPatchOutputComponents  | pname:tessellationShader
-| code:uint32_t            | pname:maxTessellationControlTotalOutputComponents     | pname:tessellationShader
-| code:uint32_t            | pname:maxTessellationEvaluationInputComponents        | pname:tessellationShader
-| code:uint32_t            | pname:maxTessellationEvaluationOutputComponents       | pname:tessellationShader
-| code:uint32_t            | pname:maxGeometryShaderInvocations         | pname:geometryShader
-| code:uint32_t            | pname:maxGeometryInputComponents           | pname:geometryShader
-| code:uint32_t            | pname:maxGeometryOutputComponents          | pname:geometryShader
-| code:uint32_t            | pname:maxGeometryOutputVertices            | pname:geometryShader
-| code:uint32_t            | pname:maxGeometryTotalOutputComponents     | pname:geometryShader
-| code:uint32_t            | pname:maxFragmentInputComponents           | -
-| code:uint32_t            | pname:maxFragmentOutputAttachments         | -
-| code:uint32_t            | pname:maxFragmentDualSrcAttachments        | pname:dualSrcBlend
-| code:uint32_t            | pname:maxFragmentCombinedOutputResources   | -
-| code:uint32_t            | pname:maxComputeSharedMemorySize           | -
-| 3 {times} code:uint32_t  | pname:maxComputeWorkGroupCount             | -
-| code:uint32_t            | pname:maxComputeWorkGroupInvocations       | -
-| 3 {times} code:uint32_t  | pname:maxComputeWorkGroupSize              | -
-| code:uint32_t            | pname:subPixelPrecisionBits                | -
-| code:uint32_t            | pname:subTexelPrecisionBits                | -
-| code:uint32_t            | pname:mipmapPrecisionBits                  | -
-| code:uint32_t            | pname:maxDrawIndexedIndexValue             | pname:fullDrawIndexUint32
-| code:uint32_t            | pname:maxDrawIndirectCount                 | pname:multiDrawIndirect
-| code:float               | pname:maxSamplerLodBias                    | -
-| code:float               | pname:maxSamplerAnisotropy                 | pname:samplerAnisotropy
-| code:uint32_t            | pname:maxViewports                         | pname:multiViewport
-| 2 {times} code:uint32_t  | pname:maxViewportDimensions                | -
-| 2 {times} code:float     | pname:viewportBoundsRange                  | -
-| code:uint32_t            | pname:viewportSubPixelBits                 | -
-| code:size_t              | pname:minMemoryMapAlignment                | -
-| basetype:VkDeviceSize    | pname:minTexelBufferOffsetAlignment        | -
-| basetype:VkDeviceSize    | pname:minUniformBufferOffsetAlignment      | -
-| basetype:VkDeviceSize    | pname:minStorageBufferOffsetAlignment      | -
-| code:int32_t             | pname:minTexelOffset                       | -
-| code:uint32_t            | pname:maxTexelOffset                       | -
-| code:int32_t             | pname:minTexelGatherOffset                 | pname:shaderImageGatherExtended
-| code:uint32_t            | pname:maxTexelGatherOffset                 | pname:shaderImageGatherExtended
-| code:float               | pname:minInterpolationOffset               | pname:sampleRateShading
-| code:float               | pname:maxInterpolationOffset               | pname:sampleRateShading
-| code:uint32_t            | pname:subPixelInterpolationOffsetBits      | pname:sampleRateShading
-| code:uint32_t            | pname:maxFramebufferWidth                  | -
-| code:uint32_t            | pname:maxFramebufferHeight                 | -
-| code:uint32_t            | pname:maxFramebufferLayers                 | -
-| tlink:VkSampleCountFlags | pname:framebufferColorSampleCounts         | -
-ifdef::VK_VERSION_1_2[]
-| tlink:VkSampleCountFlags | pname:framebufferIntegerColorSampleCounts  | -
-endif::VK_VERSION_1_2[]
-| tlink:VkSampleCountFlags | pname:framebufferDepthSampleCounts         | -
-| tlink:VkSampleCountFlags | pname:framebufferStencilSampleCounts       | -
-| tlink:VkSampleCountFlags | pname:framebufferNoAttachmentsSampleCounts | -
-| code:uint32_t            | pname:maxColorAttachments                  | -
-| tlink:VkSampleCountFlags | pname:sampledImageColorSampleCounts        | -
-| tlink:VkSampleCountFlags | pname:sampledImageIntegerSampleCounts      | -
-| tlink:VkSampleCountFlags | pname:sampledImageDepthSampleCounts        | -
-| tlink:VkSampleCountFlags | pname:sampledImageStencilSampleCounts      | -
-| tlink:VkSampleCountFlags | pname:storageImageSampleCounts             | pname:shaderStorageImageMultisample
-| code:uint32_t            | pname:maxSampleMaskWords                   | -
-| basetype:VkBool32        | pname:timestampComputeAndGraphics          | -
-| code:float               | pname:timestampPeriod                      | -
-| code:uint32_t            | pname:maxClipDistances                     | pname:shaderClipDistance
-| code:uint32_t            | pname:maxCullDistances                     | pname:shaderCullDistance
-| code:uint32_t            | pname:maxCombinedClipAndCullDistances      | pname:shaderCullDistance
-| code:uint32_t            | pname:discreteQueuePriorities              | -
-| 2 {times} code:float     | pname:pointSizeRange                       | pname:largePoints
-| 2 {times} code:float     | pname:lineWidthRange                       | pname:wideLines
-| code:float               | pname:pointSizeGranularity                 | pname:largePoints
-| code:float               | pname:lineWidthGranularity                 | pname:wideLines
-| basetype:VkBool32        | pname:strictLines                          | -
-| basetype:VkBool32        | pname:standardSampleLocations              | -
-| basetype:VkDeviceSize    | pname:optimalBufferCopyOffsetAlignment     | -
-| basetype:VkDeviceSize    | pname:optimalBufferCopyRowPitchAlignment   | -
-| basetype:VkDeviceSize    | pname:nonCoherentAtomSize                  | -
-ifdef::VK_EXT_discard_rectangles[]
-| code:uint32_t            | pname:maxDiscardRectangles                 | `apiext:VK_EXT_discard_rectangles`
-endif::VK_EXT_discard_rectangles[]
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-| basetype:VkBool32        | pname:filterMinmaxSingleComponentFormats   |
-ifdef::VK_VERSION_1_2[`<<features-samplerFilterMinmax,pname:samplerFilterMinmax>>` ]
-ifdef::VK_EXT_sampler_filter_minmax[`apiext:VK_EXT_sampler_filter_minmax`]
-| basetype:VkBool32        | pname:filterMinmaxImageComponentMapping    |
-ifdef::VK_VERSION_1_2[`<<features-samplerFilterMinmax,pname:samplerFilterMinmax>>` ]
-ifdef::VK_EXT_sampler_filter_minmax[`apiext:VK_EXT_sampler_filter_minmax`]
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-ifdef::VK_KHR_maintenance4[]
-| basetype:VkDeviceSize    | pname:maxBufferSize                        | `<<features-maintenance4,pname:maintenance4>>`
-endif::VK_KHR_maintenance4[]
-ifdef::VK_EXT_conservative_rasterization[]
-| code:float           | pname:primitiveOverestimationSize                 | `apiext:VK_EXT_conservative_rasterization`
-| basetype:VkBool32        | pname:maxExtraPrimitiveOverestimationSize         | `apiext:VK_EXT_conservative_rasterization`
-| code:float           | pname:extraPrimitiveOverestimationSizeGranularity | `apiext:VK_EXT_conservative_rasterization`
-| basetype:VkBool32        | pname:degenerateTriangleRasterized                | `apiext:VK_EXT_conservative_rasterization`
-| code:float           | pname:degenerateLinesRasterized                   | `apiext:VK_EXT_conservative_rasterization`
-| basetype:VkBool32        | pname:fullyCoveredFragmentShaderInputVariable     | `apiext:VK_EXT_conservative_rasterization`
-| basetype:VkBool32        | pname:conservativeRasterizationPostDepthCoverage  | `apiext:VK_EXT_conservative_rasterization`
-endif::VK_EXT_conservative_rasterization[]
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-| code:uint32_t     | pname:maxUpdateAfterBindDescriptorsInAllPools             | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| basetype:VkBool32 | pname:shaderUniformBufferArrayNonUniformIndexingNative    | -
-| basetype:VkBool32 | pname:shaderSampledImageArrayNonUniformIndexingNative     | -
-| basetype:VkBool32 | pname:shaderStorageBufferArrayNonUniformIndexingNative    | -
-| basetype:VkBool32 | pname:shaderStorageImageArrayNonUniformIndexingNative     | -
-| basetype:VkBool32 | pname:shaderInputAttachmentArrayNonUniformIndexingNative  | -
-| code:uint32_t     | pname:maxPerStageDescriptorUpdateAfterBindSamplers        | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxPerStageDescriptorUpdateAfterBindUniformBuffers  | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxPerStageDescriptorUpdateAfterBindStorageBuffers  | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxPerStageDescriptorUpdateAfterBindSampledImages   | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxPerStageDescriptorUpdateAfterBindStorageImages   | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxPerStageDescriptorUpdateAfterBindInputAttachments| `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxPerStageUpdateAfterBindResources                 | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindSamplers             | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindUniformBuffers       | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindUniformBuffersDynamic| `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindStorageBuffers       | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindStorageBuffersDynamic| `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindSampledImages        | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindStorageImages        | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindInputAttachments     | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_EXT_vertex_attribute_divisor[]
-| code:uint32_t            | pname:maxVertexAttribDivisor               | `apiext:VK_EXT_vertex_attribute_divisor`
-endif::VK_EXT_vertex_attribute_divisor[]
-ifdef::VK_NV_mesh_shader[]
-| code:uint32_t            | pname:maxDrawMeshTasksCount               | `apiext:VK_NV_mesh_shader`
-| code:uint32_t            | pname:maxTaskWorkGroupInvocations         | `apiext:VK_NV_mesh_shader`
-| code:uint32_t            | pname:maxTaskWorkGroupSize                | `apiext:VK_NV_mesh_shader`
-| code:uint32_t            | pname:maxTaskTotalMemorySize              | `apiext:VK_NV_mesh_shader`
-| code:uint32_t            | pname:maxTaskOutputCount                  | `apiext:VK_NV_mesh_shader`
-| code:uint32_t            | pname:maxMeshWorkGroupInvocations         | `apiext:VK_NV_mesh_shader`
-| code:uint32_t            | pname:maxMeshWorkGroupSize                | `apiext:VK_NV_mesh_shader`
-| code:uint32_t            | pname:maxMeshTotalMemorySize              | `apiext:VK_NV_mesh_shader`
-| code:uint32_t            | pname:maxMeshOutputVertices               | `apiext:VK_NV_mesh_shader`
-| code:uint32_t            | pname:maxMeshOutputPrimitives             | `apiext:VK_NV_mesh_shader`
-| code:uint32_t            | pname:maxMeshMultiviewViewCount           | `apiext:VK_NV_mesh_shader`
-| code:uint32_t            | pname:meshOutputPerVertexGranularity      | `apiext:VK_NV_mesh_shader`
-| code:uint32_t            | pname:meshOutputPerPrimitiveGranularity   | `apiext:VK_NV_mesh_shader`
-endif::VK_NV_mesh_shader[]
-ifdef::VK_EXT_transform_feedback[]
-| code:uint32_t            | pname:maxTransformFeedbackStreams                 | `apiext:VK_EXT_transform_feedback`
-| code:uint32_t            | pname:maxTransformFeedbackBuffers                 | `apiext:VK_EXT_transform_feedback`
-| basetype:VkDeviceSize    | pname:maxTransformFeedbackBufferSize              | `apiext:VK_EXT_transform_feedback`
-| code:uint32_t            | pname:maxTransformFeedbackStreamDataSize          | `apiext:VK_EXT_transform_feedback`
-| code:uint32_t            | pname:maxTransformFeedbackBufferDataSize          | `apiext:VK_EXT_transform_feedback`
-| code:uint32_t            | pname:maxTransformFeedbackBufferDataStride        | `apiext:VK_EXT_transform_feedback`
-| basetype:VkBool32        | pname:transformFeedbackQueries                    | `apiext:VK_EXT_transform_feedback`
-| basetype:VkBool32        | pname:transformFeedbackStreamsLinesTriangles      | `apiext:VK_EXT_transform_feedback`
-| basetype:VkBool32        | pname:transformFeedbackRasterizationStreamSelect  | `apiext:VK_EXT_transform_feedback`
-| basetype:VkBool32        | pname:transformFeedbackDraw                       | `apiext:VK_EXT_transform_feedback`
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_EXT_fragment_density_map[]
-| slink:VkExtent2D         | pname:minFragmentDensityTexelSize         | `apiext:VK_EXT_fragment_density_map`
-| slink:VkExtent2D         | pname:maxFragmentDensityTexelSize         | `apiext:VK_EXT_fragment_density_map`
-| basetype:VkBool32        | pname:fragmentDensityInvocations          | `apiext:VK_EXT_fragment_density_map`
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_EXT_fragment_density_map2[]
-| basetype:VkBool32        | pname:subsampledLoads                           | `apiext:VK_EXT_fragment_density_map2`
-| basetype:VkBool32        | pname:subsampledCoarseReconstructionEarlyAccess | `apiext:VK_EXT_fragment_density_map2`
-| code:uint32_t            | pname:maxSubsampledArrayLayers                  | `apiext:VK_EXT_fragment_density_map2`
-| code:uint32_t            | pname:maxDescriptorSetSubsampledSamplers        | `apiext:VK_EXT_fragment_density_map2`
-endif::VK_EXT_fragment_density_map2[]
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-| code:uint32_t            | pname:maxGeometryCount                         | `apiext:VK_NV_ray_tracing`, `apiext:VK_KHR_acceleration_structure`
-| code:uint32_t            | pname:maxInstanceCount                         | `apiext:VK_NV_ray_tracing`, `apiext:VK_KHR_acceleration_structure`
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-| code:uint32_t            | pname:shaderGroupHandleSize                    | `apiext:VK_NV_ray_tracing`, `apiext:VK_KHR_ray_tracing_pipeline`
-| code:uint32_t            | pname:maxShaderGroupStride                     | `apiext:VK_NV_ray_tracing`, `apiext:VK_KHR_ray_tracing_pipeline`
-| code:uint32_t            | pname:shaderGroupBaseAlignment                 | `apiext:VK_NV_ray_tracing`, `apiext:VK_KHR_ray_tracing_pipeline`
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_NV_ray_tracing[]
-| code:uint32_t            | pname:maxRecursionDepth                        | `apiext:VK_NV_ray_tracing`
-| code:uint32_t            | pname:maxTriangleCount                         | `apiext:VK_NV_ray_tracing`
-endif::VK_NV_ray_tracing[]
-ifdef::VK_KHR_acceleration_structure[]
-| code:uint32_t            | pname:maxPerStageDescriptorAccelerationStructures
-                                                                            | `apiext:VK_KHR_acceleration_structure`
-| code:uint32_t            | pname:maxPerStageDescriptorUpdateAfterBindAccelerationStructures
-                                                                            | `apiext:VK_KHR_acceleration_structure`
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-| code:uint32_t            | pname:maxDescriptorSetAccelerationStructures   | `apiext:VK_NV_ray_tracing`, `apiext:VK_KHR_acceleration_structure`
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-ifdef::VK_KHR_acceleration_structure[]
-| code:uint32_t            | pname:maxDescriptorSetUpdateAfterBindAccelerationStructures
-                                                                            | `apiext:VK_KHR_acceleration_structure`
-| code:uint32_t            | pname:minAccelerationStructureScratchOffsetAlignment
-                                                                            | `apiext:VK_KHR_acceleration_structure`
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-| code:uint32_t            | pname:maxRayRecursionDepth                     | `apiext:VK_KHR_ray_tracing_pipeline`
-| code:uint32_t            | pname:shaderGroupHandleCaptureReplaySize       | `apiext:VK_KHR_ray_tracing_pipeline`
-| code:uint32_t            | pname:maxRayDispatchInvocationCount            | `apiext:VK_KHR_ray_tracing_pipeline`
-| code:uint32_t            | pname:shaderGroupHandleAlignment               | `apiext:VK_KHR_ray_tracing_pipeline`
-| code:uint32_t            | pname:maxRayHitAttributeSize                   | `apiext:VK_KHR_ray_tracing_pipeline`
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-| code:uint64_t            | pname:maxTimelineSemaphoreValueDifference      | `<<features-timelineSemaphore,pname:timelineSemaphore>>`
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-ifdef::VK_EXT_line_rasterization[]
-| code:uint32_t            | pname:lineSubPixelPrecisionBits                | `apiext:VK_EXT_line_rasterization`
-endif::VK_EXT_line_rasterization[]
-ifdef::VK_EXT_custom_border_color[]
-| code:uint32_t            | pname:maxCustomBorderColorSamplers             | `apiext:VK_EXT_custom_border_color`
-endif::VK_EXT_custom_border_color[]
-ifdef::VK_EXT_robustness2[]
-| basetype:VkDeviceSize    | pname:robustStorageBufferAccessSizeAlignment   | `apiext:VK_EXT_robustness2`
-| basetype:VkDeviceSize    | pname:robustUniformBufferAccessSizeAlignment   | `apiext:VK_EXT_robustness2`
-endif::VK_EXT_robustness2[]
-ifdef::VK_KHR_fragment_shading_rate[]
-| 2 {times} code:uint32_t       | pname:minFragmentShadingRateAttachmentTexelSize           | `<<features-attachmentFragmentShadingRate,pname:attachmentFragmentShadingRate>>`
-| 2 {times} code:uint32_t       | pname:maxFragmentShadingRateAttachmentTexelSize           | `<<features-attachmentFragmentShadingRate,pname:attachmentFragmentShadingRate>>`
-| code:uint32_t                 | pname:maxFragmentShadingRateAttachmentTexelSizeAspectRatio | `<<features-attachmentFragmentShadingRate,pname:attachmentFragmentShadingRate>>`
-| basetype:VkBool32             | pname:primitiveFragmentShadingRateWithMultipleViewports   | `<<features-primitiveFragmentShadingRate,pname:primitiveFragmentShadingRate>>`
-| basetype:VkBool32             | pname:layeredShadingRateAttachments                       | `<<features-attachmentFragmentShadingRate,pname:attachmentFragmentShadingRate>>`
-| basetype:VkBool32             | pname:fragmentShadingRateNonTrivialCombinerOps            | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
-| 2 {times} code:uint32_t       | pname:maxFragmentSize                                     | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
-| code:uint32_t                 | pname:maxFragmentSizeAspectRatio                          | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
-| code:uint32_t                 | pname:maxFragmentShadingRateCoverageSamples               | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
-| elink:VkSampleCountFlagBits   | pname:maxFragmentShadingRateRasterizationSamples          | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
-| basetype:VkBool32             | pname:fragmentShadingRateWithShaderDepthStencilWrites     | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
-| basetype:VkBool32             | pname:fragmentShadingRateWithSampleMask                   | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
-| basetype:VkBool32             | pname:fragmentShadingRateWithShaderSampleMask             | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
-| basetype:VkBool32             | pname:fragmentShadingRateWithConservativeRasterization    | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
-| basetype:VkBool32             | pname:fragmentShadingRateWithFragmentShaderInterlock      | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
-| basetype:VkBool32             | pname:fragmentShadingRateWithCustomSampleLocations        | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
-| basetype:VkBool32             | pname:fragmentShadingRateStrictMultiplyCombiner           | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_NV_fragment_shading_rate_enums[]
-| elink:VkSampleCountFlagBits   | pname:maxFragmentShadingRateInvocationCount               | `<<features-supersampleFragmentShadingRates,pname:supersampleFragmentShadingRates>>`
-endif::VK_NV_fragment_shading_rate_enums[]
-ifdef::VK_HUAWEI_subpass_shading[]
-| code:uint32_t                 | pname:maxSubpassShadingWorkgroupSizeAspectRatio | `<<features-subpassShading,pname:subpassShading>>`
-endif::VK_HUAWEI_subpass_shading[]
-|====
-
-[[limits-required]]
-.Required Limits
-[width="100%",cols="<35,<9,<14,<11",options="header"]
-|====
-| Limit | Unsupported Limit | Supported Limit | Limit Type^1^
-| pname:maxImageDimension1D                  | - | 4096    | min
-| pname:maxImageDimension2D                  | - | 4096    | min
-| pname:maxImageDimension3D                  | - | 256     | min
-| pname:maxImageDimensionCube                | - | 4096    | min
-| pname:maxImageArrayLayers                  | - | 256     | min
-| pname:maxTexelBufferElements               | - | 65536   | min
-| pname:maxUniformBufferRange                | - | 16384   | min
-| pname:maxStorageBufferRange                | - | 2^27^   | min
-| pname:maxPushConstantsSize                 | - | 128     | min
-| pname:maxMemoryAllocationCount             | - | 4096    | min
-| pname:maxSamplerAllocationCount            | - | 4000    | min
-| pname:bufferImageGranularity               | - | 131072  | max
-| pname:sparseAddressSpaceSize               | 0 | 2^31^   | min
-| pname:maxBoundDescriptorSets               | - | 4       | min
-| pname:maxPerStageDescriptorSamplers        | - | 16      | min
-| pname:maxPerStageDescriptorUniformBuffers  | - | 12      | min
-| pname:maxPerStageDescriptorStorageBuffers  | - | 4       | min
-| pname:maxPerStageDescriptorSampledImages   | - | 16      | min
-| pname:maxPerStageDescriptorStorageImages   | - | 4       | min
-| pname:maxPerStageDescriptorInputAttachments| - | 4       | min
-| pname:maxPerStageResources                 | - | 128 ^2^ | min
-| pname:maxDescriptorSetSamplers             | - | 96 ^8^  | min, _n_ {times} PerStage
-| pname:maxDescriptorSetUniformBuffers       | - | 72 ^8^  | min, _n_ {times} PerStage
-| pname:maxDescriptorSetUniformBuffersDynamic| - | 8       | min
-| pname:maxDescriptorSetStorageBuffers       | - | 24 ^8^  | min, _n_ {times} PerStage
-| pname:maxDescriptorSetStorageBuffersDynamic| - | 4       | min
-| pname:maxDescriptorSetSampledImages        | - | 96 ^8^  | min, _n_ {times} PerStage
-| pname:maxDescriptorSetStorageImages        | - | 24 ^8^  | min, _n_ {times} PerStage
-| pname:maxDescriptorSetInputAttachments     | - | 4       | min
-| pname:maxVertexInputAttributes             | - | 16      | min
-ifndef::VK_KHR_portability_subset[]
-| pname:maxVertexInputBindings               | - | 16      | min
-endif::VK_KHR_portability_subset[]
-ifdef::VK_KHR_portability_subset[]
-| pname:maxVertexInputBindings               | - | 16 ^10^ | min
-endif::VK_KHR_portability_subset[]
-| pname:maxVertexInputAttributeOffset        | - | 2047    | min
-| pname:maxVertexInputBindingStride          | - | 2048    | min
-| pname:maxVertexOutputComponents            | - | 64      | min
-| pname:maxTessellationGenerationLevel       | 0 | 64      | min
-| pname:maxTessellationPatchSize             | 0 | 32      | min
-| pname:maxTessellationControlPerVertexInputComponents  | 0 |64 | min
-| pname:maxTessellationControlPerVertexOutputComponents | 0 |64 | min
-| pname:maxTessellationControlPerPatchOutputComponents  | 0 |120 | min
-| pname:maxTessellationControlTotalOutputComponents     | 0 |2048 | min
-| pname:maxTessellationEvaluationInputComponents        | 0 |64 | min
-| pname:maxTessellationEvaluationOutputComponents       | 0 |64 | min
-| pname:maxGeometryShaderInvocations         | 0 | 32      | min
-| pname:maxGeometryInputComponents           | 0 | 64      | min
-| pname:maxGeometryOutputComponents          | 0 | 64      | min
-| pname:maxGeometryOutputVertices            | 0 | 256     | min
-| pname:maxGeometryTotalOutputComponents     | 0 | 1024    | min
-| pname:maxFragmentInputComponents           | - | 64      | min
-| pname:maxFragmentOutputAttachments         | - | 4       | min
-| pname:maxFragmentDualSrcAttachments        | 0 | 1       | min
-| pname:maxFragmentCombinedOutputResources   | - | 4       | min
-| pname:maxComputeSharedMemorySize           | - | 16384   | min
-| pname:maxComputeWorkGroupCount             | - | (65535,65535,65535) | min
-| pname:maxComputeWorkGroupInvocations       | - | 128     | min
-| pname:maxComputeWorkGroupSize              | - | (128,128,64) | min
-| pname:subPixelPrecisionBits                | - | 4       | min
-| pname:subTexelPrecisionBits                | - | 4       | min
-| pname:mipmapPrecisionBits                  | - | 4       | min
-| pname:maxDrawIndexedIndexValue             | 2^24^-1 | 2^32^-1 | min
-| pname:maxDrawIndirectCount                 | 1 | 2^16^-1 | min
-| pname:maxSamplerLodBias                    | - | 2       | min
-| pname:maxSamplerAnisotropy                 | 1 | 16      | min
-| pname:maxViewports                         | 1 | 16      | min
-| pname:maxViewportDimensions                | - | (4096,4096) ^3^  | min
-| pname:viewportBoundsRange                  | - | (-8192,8191) ^4^ | (max,min)
-| pname:viewportSubPixelBits                 | - | 0   | min
-| pname:minMemoryMapAlignment                | - | 64  | min
-| pname:minTexelBufferOffsetAlignment        | - | 256 | max
-| pname:minUniformBufferOffsetAlignment      | - | 256 | max
-| pname:minStorageBufferOffsetAlignment      | - | 256 | max
-| pname:minTexelOffset                       | - | -8  | max
-| pname:maxTexelOffset                       | - | 7   | min
-| pname:minTexelGatherOffset                 | 0 | -8  | max
-| pname:maxTexelGatherOffset                 | 0 | 7   | min
-| pname:minInterpolationOffset               |0.0| -0.5 ^5^ | max
-| pname:maxInterpolationOffset               |0.0| 0.5 - (1 ULP) ^5^ | min
-| pname:subPixelInterpolationOffsetBits      | 0 | 4 ^5^ | min
-| pname:maxFramebufferWidth                  | - | 4096  | min
-| pname:maxFramebufferHeight                 | - | 4096  | min
-| pname:maxFramebufferLayers                 | - | 256   | min
-| pname:framebufferColorSampleCounts         | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
-ifdef::VK_VERSION_1_2[]
-| pname:framebufferIntegerColorSampleCounts  | - | (ename:VK_SAMPLE_COUNT_1_BIT)                                | min
-endif::VK_VERSION_1_2[]
-| pname:framebufferDepthSampleCounts         | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
-| pname:framebufferStencilSampleCounts       | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
-| pname:framebufferNoAttachmentsSampleCounts | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
-| pname:maxColorAttachments                  | - | 4     | min
-| pname:sampledImageColorSampleCounts        | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
-| pname:sampledImageIntegerSampleCounts      | - | ename:VK_SAMPLE_COUNT_1_BIT                                  | min
-| pname:sampledImageDepthSampleCounts        | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
-| pname:sampledImageStencilSampleCounts      | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
-| pname:storageImageSampleCounts             | ename:VK_SAMPLE_COUNT_1_BIT | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
-| pname:maxSampleMaskWords                   | - | 1     | min
-| pname:timestampComputeAndGraphics          | - | -     |implementation-dependent
-| pname:timestampPeriod                      | - | -     |duration
-| pname:maxClipDistances                     | 0 | 8     | min
-| pname:maxCullDistances                     | 0 | 8     | min
-| pname:maxCombinedClipAndCullDistances      | 0 | 8     | min
-| pname:discreteQueuePriorities              | - | 2     | min
-| pname:pointSizeRange                       | (1.0,1.0) | (1.0,64.0 - ULP)^6^| (max,min)
-| pname:lineWidthRange                       | (1.0,1.0) | (1.0,8.0 - ULP)^7^ | (max,min)
-| pname:pointSizeGranularity                 |  0.0 | 1.0 ^6^ | max, fixed point increment
-| pname:lineWidthGranularity                 |  0.0 | 1.0 ^7^ | max, fixed point increment
-| pname:strictLines                          | - | -   | implementation-dependent
-| pname:standardSampleLocations              | - | -   | implementation-dependent
-| pname:optimalBufferCopyOffsetAlignment     | - | -   | recommendation
-| pname:optimalBufferCopyRowPitchAlignment   | - | -   | recommendation
-| pname:nonCoherentAtomSize                  | - | 256 | max
-ifdef::VK_KHR_push_descriptor[]
-| pname:maxPushDescriptors                   | - | 32  | min
-endif::VK_KHR_push_descriptor[]
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-| pname:maxMultiviewViewCount                | - |  6  | min
-| pname:maxMultiviewInstanceIndex            | - |  2^27^-1  | min
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifdef::VK_EXT_discard_rectangles[]
-| pname:maxDiscardRectangles                 | 0 | 4   | min
-endif::VK_EXT_discard_rectangles[]
-ifdef::VK_EXT_sample_locations[]
-| pname:sampleLocationSampleCounts           | - | ename:VK_SAMPLE_COUNT_4_BIT | min
-| pname:maxSampleLocationGridSize            | - | (1,1) | min
-| pname:sampleLocationCoordinateRange        | - | (0.0, 0.9375) | (max,min)
-| pname:sampleLocationSubPixelBits           | - | 4   | min
-| pname:variableSampleLocations              | - |false| implementation-dependent
-endif::VK_EXT_sample_locations[]
-ifdef::VK_EXT_external_memory_host[]
-| pname:minImportedHostPointerAlignment      | - | 65536 | max
-endif::VK_EXT_external_memory_host[]
-ifdef::VK_NVX_multiview_per_view_attributes[]
-| pname:perViewPositionAllComponents         | - | -   | implementation-dependent
-endif::VK_NVX_multiview_per_view_attributes[]
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-| pname:filterMinmaxSingleComponentFormats   | - | -   | implementation-dependent
-| pname:filterMinmaxImageComponentMapping    | - | -   | implementation-dependent
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-ifdef::VK_EXT_blend_operation_advanced[]
-| pname:advancedBlendMaxColorAttachments        | - | 1   | min
-| pname:advancedBlendIndependentBlend           | - |false| implementation-dependent
-| pname:advancedBlendNonPremultipliedSrcColor   | - |false| implementation-dependent
-| pname:advancedBlendNonPremultipliedDstColor   | - |false| implementation-dependent
-| pname:advancedBlendCorrelatedOverlap          | - |false| implementation-dependent
-| pname:advancedBlendAllOperations              | - |false| implementation-dependent
-endif::VK_EXT_blend_operation_advanced[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance3[]
-| pname:maxPerSetDescriptors                                | - |1024 | min
-| pname:maxMemoryAllocationSize                             | - | 2^30^ | min
-endif::VK_VERSION_1_1,VK_KHR_maintenance3[]
-ifdef::VK_KHR_maintenance4[]
-| pname:maxBufferSize                                       | - | 2^30^ | min
-endif::VK_KHR_maintenance4[]
-ifdef::VK_EXT_conservative_rasterization[]
-| pname:primitiveOverestimationSize                 | - |0.0   | min
-| pname:maxExtraPrimitiveOverestimationSize         | - |0.0   | min
-| pname:extraPrimitiveOverestimationSizeGranularity | - |0.0   | min
-| pname:primitiveUnderestimation                    | - |false | implementation-dependent
-| pname:conservativePointAndLineRasterization       | - |false | implementation-dependent
-| pname:degenerateTrianglesRasterized               | - |false | implementation-dependent
-| pname:degenerateLinesRasterized                   | - |false | implementation-dependent
-| pname:fullyCoveredFragmentShaderInputVariable     | - |false | implementation-dependent
-| pname:conservativeRasterizationPostDepthCoverage  | - |false | implementation-dependent
-endif::VK_EXT_conservative_rasterization[]
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-| pname:maxUpdateAfterBindDescriptorsInAllPools             | 0 |500000| min
-| pname:shaderUniformBufferArrayNonUniformIndexingNative    | - |false| implementation-dependent
-| pname:shaderSampledImageArrayNonUniformIndexingNative     | - |false| implementation-dependent
-| pname:shaderStorageBufferArrayNonUniformIndexingNative    | - |false| implementation-dependent
-| pname:shaderStorageImageArrayNonUniformIndexingNative     | - |false| implementation-dependent
-| pname:shaderInputAttachmentArrayNonUniformIndexingNative  | - |false| implementation-dependent
-| pname:maxPerStageDescriptorUpdateAfterBindSamplers        | 0^9^ |500000 ^9^ | min
-| pname:maxPerStageDescriptorUpdateAfterBindUniformBuffers  | 0^9^ |12 ^9^ | min
-| pname:maxPerStageDescriptorUpdateAfterBindStorageBuffers  | 0^9^ |500000 ^9^ | min
-| pname:maxPerStageDescriptorUpdateAfterBindSampledImages   | 0^9^ |500000 ^9^ | min
-| pname:maxPerStageDescriptorUpdateAfterBindStorageImages   | 0^9^ |500000 ^9^ | min
-| pname:maxPerStageDescriptorUpdateAfterBindInputAttachments| 0^9^ |4 ^9^ | min
-| pname:maxPerStageUpdateAfterBindResources                 | 0^9^ |500000 ^9^ | min
-| pname:maxDescriptorSetUpdateAfterBindSamplers             | 0^9^ |500000 ^9^ | min
-| pname:maxDescriptorSetUpdateAfterBindUniformBuffers       | 0^9^ |72 ^8^ ^9^ | min, _n_ {times} PerStage
-| pname:maxDescriptorSetUpdateAfterBindUniformBuffersDynamic| 0^9^ |8 ^9^ | min
-| pname:maxDescriptorSetUpdateAfterBindStorageBuffers       | 0^9^ |500000 ^9^ | min
-| pname:maxDescriptorSetUpdateAfterBindStorageBuffersDynamic| 0^9^ |4 ^9^ | min
-| pname:maxDescriptorSetUpdateAfterBindSampledImages        | 0^9^ |500000 ^9^ | min
-| pname:maxDescriptorSetUpdateAfterBindStorageImages        | 0^9^ |500000 ^9^ | min
-| pname:maxDescriptorSetUpdateAfterBindInputAttachments     | 0^9^ |4 ^9^ | min
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-ifdef::VK_EXT_inline_uniform_block[]
-| pname:maxInlineUniformBlockSize                               | - | 256   | min
-| pname:maxPerStageDescriptorInlineUniformBlocks                | - | 4     | min
-| pname:maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks | - | 4     | min
-| pname:maxDescriptorSetInlineUniformBlocks                     | - | 4     | min
-| pname:maxDescriptorSetUpdateAfterBindInlineUniformBlocks      | - | 4     | min
-endif::VK_EXT_inline_uniform_block[]
-ifdef::VK_EXT_vertex_attribute_divisor[]
-| pname:maxVertexAttribDivisor               | - | 2^16^-1   | min
-endif::VK_EXT_vertex_attribute_divisor[]
-ifdef::VK_NV_mesh_shader[]
-| pname:maxDrawMeshTasksCount                | - | 2^16^-1   | min
-| pname:maxTaskWorkGroupInvocations          | - | 32        | min
-| pname:maxTaskWorkGroupSize                 | - | (32,1,1)  | min
-| pname:maxTaskTotalMemorySize               | - | 16384     | min
-| pname:maxTaskOutputCount                   | - | 2^16^-1   | min
-| pname:maxMeshWorkGroupInvocations          | - | 32        | min
-| pname:maxMeshWorkGroupSize                 | - | (32,1,1)  | min
-| pname:maxMeshTotalMemorySize               | - | 16384     | min
-| pname:maxMeshOutputVertices                | - | 256       | min
-| pname:maxMeshOutputPrimitives              | - | 256       | min
-| pname:maxMeshMultiviewViewCount            | - | 1         | min
-| pname:meshOutputPerVertexGranularity       | - | -         | implementation-dependent
-| pname:meshOutputPerPrimitiveGranularity    | - | -         | implementation-dependent
-endif::VK_NV_mesh_shader[]
-ifdef::VK_EXT_transform_feedback[]
-| pname:maxTransformFeedbackStreams                         | - | 1         | min
-| pname:maxTransformFeedbackBuffers                         | - | 1         | min
-| pname:maxTransformFeedbackBufferSize                      | - | 2^27^     | min
-| pname:maxTransformFeedbackStreamDataSize                  | - | 512       | min
-| pname:maxTransformFeedbackBufferDataSize                  | - | 512       | min
-| pname:maxTransformFeedbackBufferDataStride                | - | 512       | min
-| pname:transformFeedbackQueries                            | - | false     | implementation-dependent
-| pname:transformFeedbackStreamsLinesTriangles              | - | false     | implementation-dependent
-| pname:transformFeedbackRasterizationStreamSelect          | - | false     | implementation-dependent
-| pname:transformFeedbackDraw                               | - | false     | implementation-dependent
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_EXT_fragment_density_map[]
-| pname:minFragmentDensityTexelSize          | - | (1,1)  | min
-| pname:maxFragmentDensityTexelSize          | - | (1,1)  | min
-| pname:fragmentDensityInvocations           | - |  -     | implementation-dependent
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_EXT_fragment_density_map2[]
-| pname:subsampledLoads                           | true  | false | implementation-dependent
-| pname:subsampledCoarseReconstructionEarlyAccess | false | false | implementation-dependent
-| pname:maxSubsampledArrayLayers                  | 2     | 2     | min
-| pname:maxDescriptorSetSubsampledSamplers        | 1     | 1     | min
-endif::VK_EXT_fragment_density_map2[]
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_NV_ray_tracing[]
-| slink:VkPhysicalDeviceRayTracingPropertiesNV::pname:shaderGroupHandleSize | - | 16      | min
-| slink:VkPhysicalDeviceRayTracingPropertiesNV::pname:maxRecursionDepth     | - | 31      | min
-endif::VK_NV_ray_tracing[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-| slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupHandleSize | - | 32      | exact
-| slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:maxRayRecursionDepth  | - | 1       | min
-endif::VK_KHR_ray_tracing_pipeline[]
-| pname:maxShaderGroupStride                     | - | 4096    | min
-| pname:shaderGroupBaseAlignment                 | - | 64      | max
-| pname:maxGeometryCount                         | - | 2^24^-1 | min
-| pname:maxInstanceCount                         | - | 2^24^-1 | min
-ifdef::VK_NV_ray_tracing[]
-| pname:maxTriangleCount                         | - | 2^29^-1 | min
-endif::VK_NV_ray_tracing[]
-ifdef::VK_KHR_acceleration_structure[]
-| pname:maxPrimitiveCount                        | - | 2^29^-1 | min
-| pname:maxPerStageDescriptorAccelerationStructures                 | - | 16         | min
-| pname:maxPerStageDescriptorUpdateAfterBindAccelerationStructures  | - | 500000 ^9^ | min
-endif::VK_KHR_acceleration_structure[]
-| pname:maxDescriptorSetAccelerationStructures                      | - | 16         | min
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_KHR_acceleration_structure[]
-| pname:maxDescriptorSetUpdateAfterBindAccelerationStructures       | - | 500000 ^9^ | min
-| pname:minAccelerationStructureScratchOffsetAlignment              | - | 256        | max
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-| pname:shaderGroupHandleCaptureReplaySize              | - | 64  | max
-| pname:maxRayDispatchInvocationCount                   | - | 2^30^ | min
-| pname:shaderGroupHandleAlignment                      | - | 32  | max
-| pname:maxRayHitAttributeSize                          | - | 32  | min
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-| pname:maxTimelineSemaphoreValueDifference      | - | 2^31^-1 | min
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-ifdef::VK_EXT_line_rasterization[]
-| pname:lineSubPixelPrecisionBits                | - | 4    | min
-endif::VK_EXT_line_rasterization[]
-ifdef::VK_NV_device_generated_commands[]
-| pname:maxGraphicsShaderGroupCount               | - | 2^12^   | min
-| pname:maxIndirectSequenceCount                  | - | 2^20^   | min
-| pname:maxIndirectCommandsTokenCount             | - | 16     | min
-| pname:maxIndirectCommandsStreamCount            | - | 16     | min
-| pname:maxIndirectCommandsTokenOffset            | - | 2047   | min
-| pname:maxIndirectCommandsStreamStride           | - | 2048   | min
-| pname:minSequencesCountBufferOffsetAlignment    | - | 256    | max
-| pname:minSequencesIndexBufferOffsetAlignment    | - | 256    | max
-| pname:minIndirectCommandsBufferOffsetAlignment  | - | 256    | max
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_EXT_custom_border_color[]
-| pname:maxCustomBorderColorSamplers              | - | 32    | min
-endif::VK_EXT_custom_border_color[]
-ifdef::VK_EXT_robustness2[]
-| pname:robustStorageBufferAccessSizeAlignment   | - | 4    | max
-| pname:robustUniformBufferAccessSizeAlignment   | - | 256  | max
-endif::VK_EXT_robustness2[]
-ifdef::VK_KHR_fragment_shading_rate[]
-| pname:minFragmentShadingRateAttachmentTexelSize           | (0,0) | (32,32) | max
-| pname:maxFragmentShadingRateAttachmentTexelSize           | (0,0) | (8,8)   | min
-| pname:maxFragmentShadingRateAttachmentTexelSizeAspectRatio |  0   |   1     | min
-| pname:primitiveFragmentShadingRateWithMultipleViewports   | false | false   | implementation-dependent
-| pname:layeredShadingRateAttachments                       | false | false   | implementation-dependent
-| pname:fragmentShadingRateNonTrivialCombinerOps            |   -   | false   | implementation-dependent
-| pname:maxFragmentSize                                     |   -   | (2,2)   | min
-| pname:maxFragmentSizeAspectRatio                          |   -   | 2       | min
-| pname:maxFragmentShadingRateCoverageSamples               |   -   | 16      | min
-| pname:maxFragmentShadingRateRasterizationSamples          |   -   | ename:VK_SAMPLE_COUNT_4_BIT      | min
-| pname:fragmentShadingRateWithShaderDepthStencilWrites     |   -   | false   | implementation-dependent
-| pname:fragmentShadingRateWithSampleMask                   |   -   | false   | implementation-dependent
-| pname:fragmentShadingRateWithShaderSampleMask             |   -   | false   | implementation-dependent
-| pname:fragmentShadingRateWithConservativeRasterization    |   -   | false   | implementation-dependent
-| pname:fragmentShadingRateWithFragmentShaderInterlock      |   -   | false   | implementation-dependent
-| pname:fragmentShadingRateWithCustomSampleLocations        |   -   | false   | implementation-dependent
-| pname:fragmentShadingRateStrictMultiplyCombiner           |   -   | false   | implementation-dependent
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_NV_fragment_shading_rate_enums[]
-| pname:maxFragmentShadingRateInvocationCount               | - | ename:VK_SAMPLE_COUNT_4_BIT | min
-endif::VK_NV_fragment_shading_rate_enums[]
-ifdef::VK_HUAWEI_subpass_shading[]
-| pname:maxSubpassShadingWorkgroupSizeAspectRatio |  0   |   1     | min
-endif::VK_HUAWEI_subpass_shading[]
-ifdef::VK_EXT_multi_draw[]
-| pname:maxMultiDrawCount               | - | 1024 | min
-endif::VK_EXT_multi_draw[]
-|====
-
-1::
-    The *Limit Type* column specifies the limit is either the minimum limit
-    all implementations must: support, the maximum limit all implementations
-    must: support, or the exact value all implementations must: support.
-    For bitmasks a minimum limit is the least bits all implementations must:
-    set, but they may: have additional bits set beyond this minimum.
-
-2::
-    The pname:maxPerStageResources must: be at least the smallest of the
-    following:
-+
-  * the sum of the pname:maxPerStageDescriptorUniformBuffers,
-    pname:maxPerStageDescriptorStorageBuffers,
-    pname:maxPerStageDescriptorSampledImages,
-    pname:maxPerStageDescriptorStorageImages,
-    pname:maxPerStageDescriptorInputAttachments, pname:maxColorAttachments
-    limits, or
-  * 128.
-+
-It may: not be possible to reach this limit in every stage.
-
-3::
-    See <<limits-maxViewportDimensions,pname:maxViewportDimensions>> for the
-    required: relationship to other limits.
-
-4::
-    See <<limits-viewportboundsrange,pname:viewportBoundsRange>> for the
-    required: relationship to other limits.
-
-5::
-    The values pname:minInterpolationOffset and pname:maxInterpolationOffset
-    describe the closed interval of supported interpolation offsets:
-    [pname:minInterpolationOffset, pname:maxInterpolationOffset].
-    The ULP is determined by pname:subPixelInterpolationOffsetBits.
-    If pname:subPixelInterpolationOffsetBits is 4, this provides increments
-    of (1/2^4^) = 0.0625, and thus the range of supported interpolation
-    offsets would be [eq]#[-0.5, 0.4375]#.
-
-6::
-    The point size ULP is determined by pname:pointSizeGranularity.
-    If the pname:pointSizeGranularity is 0.125, the range of supported point
-    sizes must: be at least [1.0, 63.875].
-
-7::
-    The line width ULP is determined by pname:lineWidthGranularity.
-    If the pname:lineWidthGranularity is 0.0625, the range of supported line
-    widths must: be at least [1.0, 7.9375].
-
-8::
-    The minimum ptext:maxDescriptorSet* limit is _n_ times the corresponding
-    _specification_ minimum ptext:maxPerStageDescriptor* limit, where _n_ is
-    the number of shader stages supported by the slink:VkPhysicalDevice.
-    If all shader stages are supported, _n_ = 6 (vertex, tessellation
-    control, tessellation evaluation, geometry, fragment, compute).
-
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-9::
-    The ptext:UpdateAfterBind descriptor limits must: each be greater than
-    or equal to the corresponding ptext:non-UpdateAfterBind limit.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-
-ifdef::VK_KHR_portability_subset[]
-10::
-     If the `apiext:VK_KHR_portability_subset` extension is enabled, the
-     required minimum value of pname:maxVertexInputBindings is code:8.
-endif::VK_KHR_portability_subset[]
-
-
-ifdef::VK_EXT_sample_locations[]
-
-[[limits-multisample]]
-== Additional Multisampling Capabilities
-
-[open,refpage='vkGetPhysicalDeviceMultisamplePropertiesEXT',desc='Report sample count specific multisampling capabilities of a physical device',type='protos']
---
-To query additional multisampling capabilities which may: be supported for a
-specific sample count, beyond the minimum capabilities described for
-<<limits, Limits>> above, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceMultisamplePropertiesEXT.txt[]
-
-  * pname:physicalDevice is the physical device from which to query the
-    additional multisampling capabilities.
-  * pname:samples is a elink:VkSampleCountFlagBits value specifying the
-    sample count to query capabilities for.
-  * pname:pMultisampleProperties is a pointer to a
-    slink:VkMultisamplePropertiesEXT structure in which information about
-    additional multisampling capabilities specific to the sample count is
-    returned.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceMultisamplePropertiesEXT.txt[]
---
-
-[open,refpage='VkMultisamplePropertiesEXT',desc='Structure returning information about sample count specific additional multisampling capabilities',type='structs']
---
-The sname:VkMultisamplePropertiesEXT structure is defined as
-
-include::{generated}/api/structs/VkMultisamplePropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxSampleLocationGridSize is the maximum size of the pixel grid in
-    which sample locations can: vary.
-
-include::{generated}/validity/structs/VkMultisamplePropertiesEXT.txt[]
---
-
-If the sample count for which additional multisampling capabilities are
-requested using fname:vkGetPhysicalDeviceMultisamplePropertiesEXT is set
-in sname:VkPhysicalDeviceSampleLocationsPropertiesEXT::
-<<limits-sampleLocationSampleCounts, pname:sampleLocationSampleCounts>> the
-pname:width and pname:height members of
-sname:VkMultisamplePropertiesEXT::pname:maxSampleLocationGridSize must: be
-greater than or equal to the corresponding members of
-sname:VkPhysicalDeviceSampleLocationsPropertiesEXT::
-<<limits-maxSampleLocationGridSize,pname:maxSampleLocationGridSize>>,
-respectively, otherwise both members must: be `0`.
-endif::VK_EXT_sample_locations[]
-
-// If you are adding a new features structure, it must be placed at the end
-// of the previous section (immediately before [[limits-multisample]]).
diff --git a/registry/vulkan/chapters/memory.txt b/registry/vulkan/chapters/memory.txt
deleted file mode 100644
index 91a85a6..0000000
--- a/registry/vulkan/chapters/memory.txt
+++ /dev/null
@@ -1,3864 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[memory]]
-= Memory Allocation
-
-Vulkan memory is broken up into two categories, _host memory_ and _device
-memory_.
-
-
-[[memory-host]]
-== Host Memory
-
-Host memory is memory needed by the Vulkan implementation for
-non-device-visible storage.
-
-[NOTE]
-.Note
-====
-This memory may: be used to store the implementation's representation and
-state of Vulkan objects.
-====
-
-[[memory-allocation]]
-Vulkan provides applications the opportunity to perform host memory
-allocations on behalf of the Vulkan implementation.
-If this feature is not used, the implementation will perform its own memory
-allocations.
-Since most memory allocations are off the critical path, this is not meant
-as a performance feature.
-Rather, this can: be useful for certain embedded systems, for debugging
-purposes (e.g. putting a guard page after all host allocations), or for
-memory allocation logging.
-
-[open,refpage='VkAllocationCallbacks',desc='Structure containing callback function pointers for memory allocation',type='structs']
---
-Allocators are provided by the application as a pointer to a
-sname:VkAllocationCallbacks structure:
-
-include::{generated}/api/structs/VkAllocationCallbacks.txt[]
-
-  * pname:pUserData is a value to be interpreted by the implementation of
-    the callbacks.
-    When any of the callbacks in sname:VkAllocationCallbacks are called, the
-    Vulkan implementation will pass this value as the first parameter to the
-    callback.
-    This value can: vary each time an allocator is passed into a command,
-    even when the same object takes an allocator in multiple commands.
-  * pname:pfnAllocation is a tlink:PFN_vkAllocationFunction pointer to an
-    application-defined memory allocation function.
-  * pname:pfnReallocation is a tlink:PFN_vkReallocationFunction pointer to
-    an application-defined memory reallocation function.
-  * pname:pfnFree is a tlink:PFN_vkFreeFunction pointer to an
-    application-defined memory free function.
-  * pname:pfnInternalAllocation is a
-    tlink:PFN_vkInternalAllocationNotification pointer to an
-    application-defined function that is called by the implementation when
-    the implementation makes internal allocations.
-  * pname:pfnInternalFree is a tlink:PFN_vkInternalFreeNotification pointer
-    to an application-defined function that is called by the implementation
-    when the implementation frees internal allocations.
-
-.Valid Usage
-****
-  * [[VUID-VkAllocationCallbacks-pfnAllocation-00632]]
-    pname:pfnAllocation must: be a valid pointer to a valid user-defined
-    tlink:PFN_vkAllocationFunction
-  * [[VUID-VkAllocationCallbacks-pfnReallocation-00633]]
-    pname:pfnReallocation must: be a valid pointer to a valid user-defined
-    tlink:PFN_vkReallocationFunction
-  * [[VUID-VkAllocationCallbacks-pfnFree-00634]]
-    pname:pfnFree must: be a valid pointer to a valid user-defined
-    tlink:PFN_vkFreeFunction
-  * [[VUID-VkAllocationCallbacks-pfnInternalAllocation-00635]]
-    If either of pname:pfnInternalAllocation or pname:pfnInternalFree is not
-    `NULL`, both must: be valid callbacks
-****
-
-include::{generated}/validity/structs/VkAllocationCallbacks.txt[]
---
-
-[open,refpage='PFN_vkAllocationFunction',desc='Application-defined memory allocation function',type='funcpointers',xrefs='VkAllocationCallbacks']
---
-The type of pname:pfnAllocation is:
-
-include::{generated}/api/funcpointers/PFN_vkAllocationFunction.txt[]
-
-  * pname:pUserData is the value specified for
-    slink:VkAllocationCallbacks::pname:pUserData in the allocator specified
-    by the application.
-  * pname:size is the size in bytes of the requested allocation.
-  * pname:alignment is the requested alignment of the allocation in bytes
-    and must: be a power of two.
-  * pname:allocationScope is a elink:VkSystemAllocationScope value
-    specifying the allocation scope of the lifetime of the allocation, as
-    described <<memory-host-allocation-scope,here>>.
-
-[[vkAllocationFunction_return_rules]]
-If pname:pfnAllocation is unable to allocate the requested memory, it must:
-return `NULL`.
-If the allocation was successful, it must: return a valid pointer to memory
-allocation containing at least pname:size bytes, and with the pointer value
-being a multiple of pname:alignment.
-
-[NOTE]
-.Note
-====
-Correct Vulkan operation cannot: be assumed if the application does not
-follow these rules.
-
-For example, pname:pfnAllocation (or pname:pfnReallocation) could cause
-termination of running Vulkan instance(s) on a failed allocation for
-debugging purposes, either directly or indirectly.
-In these circumstances, it cannot: be assumed that any part of any affected
-slink:VkInstance objects are going to operate correctly (even
-flink:vkDestroyInstance), and the application must: ensure it cleans up
-properly via other means (e.g. process termination).
-====
-
-If pname:pfnAllocation returns `NULL`, and if the implementation is unable
-to continue correct processing of the current command without the requested
-allocation, it must: treat this as a runtime error, and generate
-ename:VK_ERROR_OUT_OF_HOST_MEMORY at the appropriate time for the command in
-which the condition was detected, as described in <<fundamentals-errorcodes,
-Return Codes>>.
-
-If the implementation is able to continue correct processing of the current
-command without the requested allocation, then it may: do so, and must: not
-generate ename:VK_ERROR_OUT_OF_HOST_MEMORY as a result of this failed
-allocation.
---
-
-[open,refpage='PFN_vkReallocationFunction',desc='Application-defined memory reallocation function',type='funcpointers',xrefs='VkAllocationCallbacks']
---
-The type of pname:pfnReallocation is:
-
-include::{generated}/api/funcpointers/PFN_vkReallocationFunction.txt[]
-
-  * pname:pUserData is the value specified for
-    slink:VkAllocationCallbacks::pname:pUserData in the allocator specified
-    by the application.
-  * pname:pOriginal must: be either `NULL` or a pointer previously returned
-    by pname:pfnReallocation or pname:pfnAllocation of a compatible
-    allocator.
-  * pname:size is the size in bytes of the requested allocation.
-  * pname:alignment is the requested alignment of the allocation in bytes
-    and must: be a power of two.
-  * pname:allocationScope is a elink:VkSystemAllocationScope value
-    specifying the allocation scope of the lifetime of the allocation, as
-    described <<memory-host-allocation-scope,here>>.
-
-pname:pfnReallocation must: return an allocation with enough space for
-pname:size bytes, and the contents of the original allocation from bytes
-zero to [eq]#min(original size, new size) - 1# must: be preserved in the
-returned allocation.
-If pname:size is larger than the old size, the contents of the additional
-space are undefined:.
-If satisfying these requirements involves creating a new allocation, then
-the old allocation should: be freed.
-
-If pname:pOriginal is `NULL`, then pname:pfnReallocation must: behave
-equivalently to a call to tlink:PFN_vkAllocationFunction with the same
-parameter values (without pname:pOriginal).
-
-If pname:size is zero, then pname:pfnReallocation must: behave equivalently
-to a call to tlink:PFN_vkFreeFunction with the same pname:pUserData
-parameter value, and pname:pMemory equal to pname:pOriginal.
-
-If pname:pOriginal is non-`NULL`, the implementation must: ensure that
-pname:alignment is equal to the pname:alignment used to originally allocate
-pname:pOriginal.
-
-If this function fails and pname:pOriginal is non-`NULL` the application
-must: not free the old allocation.
-
-pname:pfnReallocation must: follow the same
-<<vkAllocationFunction_return_rules, rules for return values as
-tname:PFN_vkAllocationFunction>>.
---
-
-[open,refpage='PFN_vkFreeFunction',desc='Application-defined memory free function',type='funcpointers',xrefs='VkAllocationCallbacks']
---
-The type of pname:pfnFree is:
-
-include::{generated}/api/funcpointers/PFN_vkFreeFunction.txt[]
-
-  * pname:pUserData is the value specified for
-    slink:VkAllocationCallbacks::pname:pUserData in the allocator specified
-    by the application.
-  * pname:pMemory is the allocation to be freed.
-
-pname:pMemory may: be `NULL`, which the callback must: handle safely.
-If pname:pMemory is non-`NULL`, it must: be a pointer previously allocated
-by pname:pfnAllocation or pname:pfnReallocation.
-The application should: free this memory.
---
-
-[open,refpage='PFN_vkInternalAllocationNotification',desc='Application-defined memory allocation notification function',type='funcpointers',xrefs='VkAllocationCallbacks']
---
-The type of pname:pfnInternalAllocation is:
-
-include::{generated}/api/funcpointers/PFN_vkInternalAllocationNotification.txt[]
-
-  * pname:pUserData is the value specified for
-    slink:VkAllocationCallbacks::pname:pUserData in the allocator specified
-    by the application.
-  * pname:size is the requested size of an allocation.
-  * pname:allocationType is a elink:VkInternalAllocationType value
-    specifying the requested type of an allocation.
-  * pname:allocationScope is a elink:VkSystemAllocationScope value
-    specifying the allocation scope of the lifetime of the allocation, as
-    described <<memory-host-allocation-scope,here>>.
-
-This is a purely informational callback.
---
-
-[open,refpage='PFN_vkInternalFreeNotification',desc='Application-defined memory free notification function',type='funcpointers',xrefs='VkAllocationCallbacks']
---
-The type of pname:pfnInternalFree is:
-
-include::{generated}/api/funcpointers/PFN_vkInternalFreeNotification.txt[]
-
-  * pname:pUserData is the value specified for
-    slink:VkAllocationCallbacks::pname:pUserData in the allocator specified
-    by the application.
-  * pname:size is the requested size of an allocation.
-  * pname:allocationType is a elink:VkInternalAllocationType value
-    specifying the requested type of an allocation.
-  * pname:allocationScope is a elink:VkSystemAllocationScope value
-    specifying the allocation scope of the lifetime of the allocation, as
-    described <<memory-host-allocation-scope,here>>.
---
-
-[open,refpage='VkSystemAllocationScope',desc='Allocation scope',type='enums',xrefs='VkAllocationCallbacks']
---
-[[memory-host-allocation-scope]]
-Each allocation has an _allocation scope_ defining its lifetime and which
-object it is associated with.
-Possible values passed to the pname:allocationScope parameter of the
-callback functions specified by slink:VkAllocationCallbacks, indicating the
-allocation scope, are:
-
-include::{generated}/api/enums/VkSystemAllocationScope.txt[]
-
-  * ename:VK_SYSTEM_ALLOCATION_SCOPE_COMMAND specifies that the allocation
-    is scoped to the duration of the Vulkan command.
-  * ename:VK_SYSTEM_ALLOCATION_SCOPE_OBJECT specifies that the allocation is
-    scoped to the lifetime of the Vulkan object that is being created or
-    used.
-  * ename:VK_SYSTEM_ALLOCATION_SCOPE_CACHE specifies that the allocation is
-    scoped to the lifetime of a sname:VkPipelineCache
-ifdef::VK_EXT_validation_cache[]
-    or sname:VkValidationCacheEXT
-endif::VK_EXT_validation_cache[]
-    object.
-  * ename:VK_SYSTEM_ALLOCATION_SCOPE_DEVICE specifies that the allocation is
-    scoped to the lifetime of the Vulkan device.
-  * ename:VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE specifies that the allocation
-    is scoped to the lifetime of the Vulkan instance.
-
-Most Vulkan commands operate on a single object, or there is a sole object
-that is being created or manipulated.
-When an allocation uses an allocation scope of
-ename:VK_SYSTEM_ALLOCATION_SCOPE_OBJECT or
-ename:VK_SYSTEM_ALLOCATION_SCOPE_CACHE, the allocation is scoped to the
-object being created or manipulated.
-
-When an implementation requires host memory, it will make callbacks to the
-application using the most specific allocator and allocation scope
-available:
-
-  * If an allocation is scoped to the duration of a command, the allocator
-    will use the ename:VK_SYSTEM_ALLOCATION_SCOPE_COMMAND allocation scope.
-    The most specific allocator available is used: if the object being
-    created or manipulated has an allocator, that object's allocator will be
-    used, else if the parent sname:VkDevice has an allocator it will be
-    used, else if the parent sname:VkInstance has an allocator it will be
-    used.
-    Else,
-  * If an allocation is associated with a
-ifdef::VK_EXT_validation_cache[]
-    sname:VkValidationCacheEXT or
-endif::VK_EXT_validation_cache[]
-    sname:VkPipelineCache object, the allocator will use the
-    ename:VK_SYSTEM_ALLOCATION_SCOPE_CACHE allocation scope.
-    The most specific allocator available is used (cache, else device, else
-    instance).
-    Else,
-  * If an allocation is scoped to the lifetime of an object, that object is
-    being created or manipulated by the command, and that object's type is
-    not sname:VkDevice or sname:VkInstance, the allocator will use an
-    allocation scope of ename:VK_SYSTEM_ALLOCATION_SCOPE_OBJECT.
-    The most specific allocator available is used (object, else device, else
-    instance).
-    Else,
-  * If an allocation is scoped to the lifetime of a device, the allocator
-    will use an allocation scope of ename:VK_SYSTEM_ALLOCATION_SCOPE_DEVICE.
-    The most specific allocator available is used (device, else instance).
-    Else,
-  * If the allocation is scoped to the lifetime of an instance and the
-    instance has an allocator, its allocator will be used with an allocation
-    scope of ename:VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE.
-  * Otherwise an implementation will allocate memory through an alternative
-    mechanism that is unspecified.
-
---
-
-Objects that are allocated from pools do not specify their own allocator.
-When an implementation requires host memory for such an object, that memory
-is sourced from the object's parent pool's allocator.
-
-The application is not expected to handle allocating memory that is intended
-for execution by the host due to the complexities of differing security
-implementations across multiple platforms.
-The implementation will allocate such memory internally and invoke an
-application provided informational callback when these _internal
-allocations_ are allocated and freed.
-Upon allocation of executable memory, pname:pfnInternalAllocation will be
-called.
-Upon freeing executable memory, pname:pfnInternalFree will be called.
-An implementation will only call an informational callback for executable
-memory allocations and frees.
-
-[open,refpage='VkInternalAllocationType',desc='Allocation type',type='enums',xrefs='PFN_vkInternalAllocationNotification PFN_vkInternalFreeNotification']
---
-The pname:allocationType parameter to the pname:pfnInternalAllocation and
-pname:pfnInternalFree functions may: be one of the following values:
-
-include::{generated}/api/enums/VkInternalAllocationType.txt[]
-
-  * ename:VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE specifies that the
-    allocation is intended for execution by the host.
---
-
-An implementation must: only make calls into an application-provided
-allocator during the execution of an API command.
-An implementation must: only make calls into an application-provided
-allocator from the same thread that called the provoking API command.
-The implementation should: not synchronize calls to any of the callbacks.
-If synchronization is needed, the callbacks must: provide it themselves.
-The informational callbacks are subject to the same restrictions as the
-allocation callbacks.
-
-If an implementation intends to make calls through a
-sname:VkAllocationCallbacks structure between the time a ftext:vkCreate*
-command returns and the time a corresponding ftext:vkDestroy* command
-begins, that implementation must: save a copy of the allocator before the
-ftext:vkCreate* command returns.
-The callback functions and any data structures they rely upon must: remain
-valid for the lifetime of the object they are associated with.
-
-If an allocator is provided to a ftext:vkCreate* command, a _compatible_
-allocator must: be provided to the corresponding ftext:vkDestroy* command.
-Two sname:VkAllocationCallbacks structures are compatible if memory
-allocated with pname:pfnAllocation or pname:pfnReallocation in each can: be
-freed with pname:pfnReallocation or pname:pfnFree in the other.
-An allocator must: not be provided to a ftext:vkDestroy* command if an
-allocator was not provided to the corresponding ftext:vkCreate* command.
-
-If a non-`NULL` allocator is used, the pname:pfnAllocation,
-pname:pfnReallocation and pname:pfnFree members must: be non-`NULL` and
-point to valid implementations of the callbacks.
-An application can: choose to not provide informational callbacks by setting
-both pname:pfnInternalAllocation and pname:pfnInternalFree to `NULL`.
-pname:pfnInternalAllocation and pname:pfnInternalFree must: either both be
-`NULL` or both be non-`NULL`.
-
-If pname:pfnAllocation or pname:pfnReallocation fail, the implementation
-may: fail object creation and/or generate a
-ename:VK_ERROR_OUT_OF_HOST_MEMORY error, as appropriate.
-
-Allocation callbacks must: not call any Vulkan commands.
-
-The following sets of rules define when an implementation is permitted to
-call the allocator callbacks.
-
-pname:pfnAllocation or pname:pfnReallocation may: be called in the following
-situations:
-
-  * Allocations scoped to a sname:VkDevice or sname:VkInstance may: be
-    allocated from any API command.
-  * Allocations scoped to a command may: be allocated from any API command.
-  * Allocations scoped to a sname:VkPipelineCache may: only be allocated
-    from:
-  ** fname:vkCreatePipelineCache
-  ** fname:vkMergePipelineCaches for pname:dstCache
-  ** fname:vkCreateGraphicsPipelines for pname:pipelineCache
-  ** fname:vkCreateComputePipelines for pname:pipelineCache
-ifdef::VK_EXT_validation_cache[]
-  * Allocations scoped to a sname:VkValidationCacheEXT may: only be
-    allocated from:
-  ** fname:vkCreateValidationCacheEXT
-  ** fname:vkMergeValidationCachesEXT for pname:dstCache
-  ** fname:vkCreateShaderModule for pname:validationCache in
-     slink:VkShaderModuleValidationCacheCreateInfoEXT
-endif::VK_EXT_validation_cache[]
-  * Allocations scoped to a sname:VkDescriptorPool may: only be allocated
-    from:
-  ** any command that takes the pool as a direct argument
-  ** fname:vkAllocateDescriptorSets for the pname:descriptorPool member of
-     its pname:pAllocateInfo parameter
-  ** fname:vkCreateDescriptorPool
-  * Allocations scoped to a sname:VkCommandPool may: only be allocated from:
-  ** any command that takes the pool as a direct argument
-  ** fname:vkCreateCommandPool
-  ** fname:vkAllocateCommandBuffers for the pname:commandPool member of its
-     pname:pAllocateInfo parameter
-  ** any ftext:vkCmd* command whose pname:commandBuffer was allocated from
-     that sname:VkCommandPool
-  * Allocations scoped to any other object may: only be allocated in that
-    object's ftext:vkCreate* command.
-
-pname:pfnFree, or pname:pfnReallocation with zero pname:size, may: be called
-in the following situations:
-
-  * Allocations scoped to a sname:VkDevice or sname:VkInstance may: be freed
-    from any API command.
-  * Allocations scoped to a command must: be freed by any API command which
-    allocates such memory.
-  * Allocations scoped to a sname:VkPipelineCache may: be freed from
-    fname:vkDestroyPipelineCache.
-ifdef::VK_EXT_validation_cache[]
-  * Allocations scoped to a sname:VkValidationCacheEXT may: be freed from
-    fname:vkDestroyValidationCacheEXT.
-endif::VK_EXT_validation_cache[]
-  * Allocations scoped to a sname:VkDescriptorPool may: be freed from
-  ** any command that takes the pool as a direct argument
-  * Allocations scoped to a sname:VkCommandPool may: be freed from:
-  ** any command that takes the pool as a direct argument
-  ** fname:vkResetCommandBuffer whose pname:commandBuffer was allocated from
-     that sname:VkCommandPool
-  * Allocations scoped to any other object may: be freed in that object's
-    ftext:vkDestroy* command.
-  * Any command that allocates host memory may: also free host memory of the
-    same scope.
-
-
-[[memory-device]]
-== Device Memory
-
-_Device memory_ is memory that is visible to the device -- for example the
-contents of the image or buffer objects, which can: be natively used by the
-device.
-
-[[memory-device-properties]]
-=== Device Memory Properties
-
-Memory properties of a physical device describe the memory heaps and memory
-types available.
-
-[open,refpage='vkGetPhysicalDeviceMemoryProperties',desc='Reports memory information for the specified physical device',type='protos']
---
-To query memory properties, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceMemoryProperties.txt[]
-
-  * pname:physicalDevice is the handle to the device to query.
-  * pname:pMemoryProperties is a pointer to a
-    slink:VkPhysicalDeviceMemoryProperties structure in which the properties
-    are returned.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceMemoryProperties.txt[]
---
-
-[open,refpage='VkPhysicalDeviceMemoryProperties',desc='Structure specifying physical device memory properties',type='structs']
---
-The sname:VkPhysicalDeviceMemoryProperties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMemoryProperties.txt[]
-
-  * pname:memoryTypeCount is the number of valid elements in the
-    pname:memoryTypes array.
-  * pname:memoryTypes is an array of ename:VK_MAX_MEMORY_TYPES
-    slink:VkMemoryType structures describing the _memory types_ that can: be
-    used to access memory allocated from the heaps specified by
-    pname:memoryHeaps.
-  * pname:memoryHeapCount is the number of valid elements in the
-    pname:memoryHeaps array.
-  * pname:memoryHeaps is an array of ename:VK_MAX_MEMORY_HEAPS
-    slink:VkMemoryHeap structures describing the _memory heaps_ from which
-    memory can: be allocated.
-
-The sname:VkPhysicalDeviceMemoryProperties structure describes a number of
-_memory heaps_ as well as a number of _memory types_ that can: be used to
-access memory allocated in those heaps.
-Each heap describes a memory resource of a particular size, and each memory
-type describes a set of memory properties (e.g. host cached vs uncached)
-that can: be used with a given memory heap.
-Allocations using a particular memory type will consume resources from the
-heap indicated by that memory type's heap index.
-More than one memory type may: share each heap, and the heaps and memory
-types provide a mechanism to advertise an accurate size of the physical
-memory resources while allowing the memory to be used with a variety of
-different properties.
-
-The number of memory heaps is given by pname:memoryHeapCount and is less
-than or equal to ename:VK_MAX_MEMORY_HEAPS.
-Each heap is described by an element of the pname:memoryHeaps array as a
-slink:VkMemoryHeap structure.
-The number of memory types available across all memory heaps is given by
-pname:memoryTypeCount and is less than or equal to
-ename:VK_MAX_MEMORY_TYPES.
-Each memory type is described by an element of the pname:memoryTypes array
-as a slink:VkMemoryType structure.
-
-At least one heap must: include ename:VK_MEMORY_HEAP_DEVICE_LOCAL_BIT in
-slink:VkMemoryHeap::pname:flags.
-If there are multiple heaps that all have similar performance
-characteristics, they may: all include
-ename:VK_MEMORY_HEAP_DEVICE_LOCAL_BIT.
-In a unified memory architecture (UMA) system there is often only a single
-memory heap which is considered to be equally "`local`" to the host and to
-the device, and such an implementation must: advertise the heap as
-device-local.
-
-[[memory-device-bitmask-list]]
-Each memory type returned by flink:vkGetPhysicalDeviceMemoryProperties must:
-have its pname:propertyFlags set to one of the following values:
-
-  * 0
-  * ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
-  * ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_CACHED_BIT
-  * ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_CACHED_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
-  * ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
-  * ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
-  * ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_CACHED_BIT
-  * ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_CACHED_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
-  * ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | +
-    ename:VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT
-ifdef::VK_VERSION_1_1[]
-  * ename:VK_MEMORY_PROPERTY_PROTECTED_BIT
-  * ename:VK_MEMORY_PROPERTY_PROTECTED_BIT |
-    ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
-endif::VK_VERSION_1_1[]
-ifdef::VK_AMD_device_coherent_memory[]
-  * ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD
-  * ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_CACHED_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD
-  * ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD
-  * ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD
-  * ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_CACHED_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD
-  * ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD
-  * ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_CACHED_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD
-  * ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD
-  * ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD
-  * ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_CACHED_BIT | +
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD | +
-    ename:VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD
-endif::VK_AMD_device_coherent_memory[]
-ifdef::VK_NV_external_memory_rdma[]
-  * ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | +
-    ename:VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV
-endif::VK_NV_external_memory_rdma[]
-
-There must: be at least one memory type with both the
-ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT and
-ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT bits set in its
-pname:propertyFlags.
-There must: be at least one memory type with the
-ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT bit set in its
-pname:propertyFlags.
-ifdef::VK_AMD_device_coherent_memory[]
-If the <<features-deviceCoherentMemory, pname:deviceCoherentMemory>> feature
-is enabled, there must: be at least one memory type with the
-ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD bit set in its
-pname:propertyFlags.
-endif::VK_AMD_device_coherent_memory[]
-
-For each pair of elements *X* and *Y* returned in pname:memoryTypes, *X*
-must: be placed at a lower index position than *Y* if:
-
-  * the set of bit flags returned in the pname:propertyFlags member of *X*
-    is a strict subset of the set of bit flags returned in the
-    pname:propertyFlags member of *Y*; or
-  * the pname:propertyFlags members of *X* and *Y* are equal, and *X*
-    belongs to a memory heap with greater performance (as determined in an
-    implementation-specific manner)
-ifdef::VK_AMD_device_coherent_memory[]
-    ; or
-  * the pname:propertyFlags members of *Y* includes
-    ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD or
-    ename:VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD and *X* does not
-endif::VK_AMD_device_coherent_memory[]
-
-[NOTE]
-.Note
-====
-There is no ordering requirement between *X* and *Y* elements for the case
-their pname:propertyFlags members are not in a subset relation.
-That potentially allows more than one possible way to order the same set of
-memory types.
-Notice that the <<memory-device-bitmask-list,list of all allowed memory
-property flag combinations>> is written in a valid order.
-But if instead ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT was before
-ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
-ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, the list would still be in a
-valid order.
-ifdef::VK_AMD_device_coherent_memory[]
-
-There may be a performance penalty for using device coherent or uncached
-device memory types, and using these accidentally is undesirable.
-In order to avoid this, memory types with these properties always appear at
-the end of the list; but are subject to the same rules otherwise.
-endif::VK_AMD_device_coherent_memory[]
-====
-
-This ordering requirement enables applications to use a simple search loop
-to select the desired memory type along the lines of:
-
-[source,c++]
-~~~~
-// Find a memory in `memoryTypeBitsRequirement` that includes all of `requiredProperties`
-int32_t findProperties(const VkPhysicalDeviceMemoryProperties* pMemoryProperties,
-                       uint32_t memoryTypeBitsRequirement,
-                       VkMemoryPropertyFlags requiredProperties) {
-    const uint32_t memoryCount = pMemoryProperties->memoryTypeCount;
-    for (uint32_t memoryIndex = 0; memoryIndex < memoryCount; ++memoryIndex) {
-        const uint32_t memoryTypeBits = (1 << memoryIndex);
-        const bool isRequiredMemoryType = memoryTypeBitsRequirement & memoryTypeBits;
-
-        const VkMemoryPropertyFlags properties =
-            pMemoryProperties->memoryTypes[memoryIndex].propertyFlags;
-        const bool hasRequiredProperties =
-            (properties & requiredProperties) == requiredProperties;
-
-        if (isRequiredMemoryType && hasRequiredProperties)
-            return static_cast<int32_t>(memoryIndex);
-    }
-
-    // failed to find memory type
-    return -1;
-}
-
-// Try to find an optimal memory type, or if it does not exist try fallback memory type
-// `device` is the VkDevice
-// `image` is the VkImage that requires memory to be bound
-// `memoryProperties` properties as returned by vkGetPhysicalDeviceMemoryProperties
-// `requiredProperties` are the property flags that must be present
-// `optimalProperties` are the property flags that are preferred by the application
-VkMemoryRequirements memoryRequirements;
-vkGetImageMemoryRequirements(device, image, &memoryRequirements);
-int32_t memoryType =
-    findProperties(&memoryProperties, memoryRequirements.memoryTypeBits, optimalProperties);
-if (memoryType == -1) // not found; try fallback properties
-    memoryType =
-        findProperties(&memoryProperties, memoryRequirements.memoryTypeBits, requiredProperties);
-~~~~
-
-include::{generated}/validity/structs/VkPhysicalDeviceMemoryProperties.txt[]
---
-
-[open,refpage='VK_MAX_MEMORY_TYPES',desc='Length of an array of memory types',type='consts']
---
-ename:VK_MAX_MEMORY_TYPES is the length of an array of slink:VkMemoryType
-structures describing memory types, as returned in
-slink:VkPhysicalDeviceMemoryProperties::memoryTypes.
-
-include::{generated}/api/enums/VK_MAX_MEMORY_TYPES.txt[]
---
-
-[open,refpage='VK_MAX_MEMORY_HEAPS',desc='Length of an array of memory heaps',type='consts']
---
-ename:VK_MAX_MEMORY_HEAPS is the length of an array of slink:VkMemoryHeap
-structures describing memory heaps, as returned in
-slink:VkPhysicalDeviceMemoryProperties::memoryHeaps.
-
-include::{generated}/api/enums/VK_MAX_MEMORY_HEAPS.txt[]
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-[open,refpage='vkGetPhysicalDeviceMemoryProperties2',desc='Reports memory information for the specified physical device',type='protos']
---
-To query memory properties, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetPhysicalDeviceMemoryProperties2.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_get_physical_device_properties2[or the equivalent command]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-include::{generated}/api/protos/vkGetPhysicalDeviceMemoryProperties2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:physicalDevice is the handle to the device to query.
-  * pname:pMemoryProperties is a pointer to a
-    slink:VkPhysicalDeviceMemoryProperties2 structure in which the
-    properties are returned.
-
-fname:vkGetPhysicalDeviceMemoryProperties2 behaves similarly to
-flink:vkGetPhysicalDeviceMemoryProperties, with the ability to return
-extended information in a pname:pNext chain of output structures.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceMemoryProperties2.txt[]
---
-
-[open,refpage='VkPhysicalDeviceMemoryProperties2',desc='Structure specifying physical device memory properties',type='structs']
---
-The sname:VkPhysicalDeviceMemoryProperties2 structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMemoryProperties2.txt[]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceMemoryProperties2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memoryProperties is a slink:VkPhysicalDeviceMemoryProperties
-    structure which is populated with the same values as in
-    flink:vkGetPhysicalDeviceMemoryProperties.
-
-include::{generated}/validity/structs/VkPhysicalDeviceMemoryProperties2.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-[open,refpage='VkMemoryHeap',desc='Structure specifying a memory heap',type='structs']
---
-The sname:VkMemoryHeap structure is defined as:
-
-include::{generated}/api/structs/VkMemoryHeap.txt[]
-
-  * pname:size is the total memory size in bytes in the heap.
-  * pname:flags is a bitmask of elink:VkMemoryHeapFlagBits specifying
-    attribute flags for the heap.
-
-include::{generated}/validity/structs/VkMemoryHeap.txt[]
---
-
-[open,refpage='VkMemoryHeapFlagBits',desc='Bitmask specifying attribute flags for a heap',type='enums']
---
-Bits which may: be set in slink:VkMemoryHeap::pname:flags, indicating
-attribute flags for the heap, are:
-
-include::{generated}/api/enums/VkMemoryHeapFlagBits.txt[]
-
-  * ename:VK_MEMORY_HEAP_DEVICE_LOCAL_BIT specifies that the heap
-    corresponds to device-local memory.
-    Device-local memory may: have different performance characteristics than
-    host-local memory, and may: support different memory property flags.
-ifdef::VK_VERSION_1_1,VK_KHR_device_group_creation[]
-  * ename:VK_MEMORY_HEAP_MULTI_INSTANCE_BIT specifies that in a logical
-    device representing more than one physical device, there is a
-    per-physical device instance of the heap memory.
-    By default, an allocation from such a heap will be replicated to each
-    physical device's instance of the heap.
-endif::VK_VERSION_1_1,VK_KHR_device_group_creation[]
---
-
-[open,refpage='VkMemoryHeapFlags',desc='Bitmask of VkMemoryHeapFlagBits',type='flags']
---
-include::{generated}/api/flags/VkMemoryHeapFlags.txt[]
-
-tname:VkMemoryHeapFlags is a bitmask type for setting a mask of zero or more
-elink:VkMemoryHeapFlagBits.
---
-
-[open,refpage='VkMemoryType',desc='Structure specifying memory type',type='structs']
---
-The sname:VkMemoryType structure is defined as:
-
-include::{generated}/api/structs/VkMemoryType.txt[]
-
-  * pname:heapIndex describes which memory heap this memory type corresponds
-    to, and must: be less than pname:memoryHeapCount from the
-    slink:VkPhysicalDeviceMemoryProperties structure.
-  * pname:propertyFlags is a bitmask of elink:VkMemoryPropertyFlagBits of
-    properties for this memory type.
-
-include::{generated}/validity/structs/VkMemoryType.txt[]
---
-
-[open,refpage='VkMemoryPropertyFlagBits',desc='Bitmask specifying properties for a memory type',type='enums']
---
-Bits which may: be set in slink:VkMemoryType::pname:propertyFlags,
-indicating properties of a memory heap, are:
-
-include::{generated}/api/enums/VkMemoryPropertyFlagBits.txt[]
-
-  * ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT bit specifies that memory
-    allocated with this type is the most efficient for device access.
-    This property will be set if and only if the memory type belongs to a
-    heap with the ename:VK_MEMORY_HEAP_DEVICE_LOCAL_BIT set.
-  * ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT bit specifies that memory
-    allocated with this type can: be mapped for host access using
-    flink:vkMapMemory.
-  * ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT bit specifies that the host
-    cache management commands flink:vkFlushMappedMemoryRanges and
-    flink:vkInvalidateMappedMemoryRanges are not needed to flush host writes
-    to the device or make device writes visible to the host, respectively.
-  * ename:VK_MEMORY_PROPERTY_HOST_CACHED_BIT bit specifies that memory
-    allocated with this type is cached on the host.
-    Host memory accesses to uncached memory are slower than to cached
-    memory, however uncached memory is always host coherent.
-  * ename:VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT bit specifies that the
-    memory type only allows device access to the memory.
-    Memory types must: not have both
-    ename:VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT and
-    ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set.
-    Additionally, the object's backing memory may: be provided by the
-    implementation lazily as specified in <<memory-device-lazy_allocation,
-    Lazily Allocated Memory>>.
-ifdef::VK_VERSION_1_1[]
-  * ename:VK_MEMORY_PROPERTY_PROTECTED_BIT bit specifies that the memory
-    type only allows device access to the memory, and allows protected queue
-    operations to access the memory.
-    Memory types must: not have ename:VK_MEMORY_PROPERTY_PROTECTED_BIT set
-    and any of ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT set, or
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT set, or
-    ename:VK_MEMORY_PROPERTY_HOST_CACHED_BIT set.
-endif::VK_VERSION_1_1[]
-ifdef::VK_AMD_device_coherent_memory[]
-  * ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD bit specifies that
-    device accesses to allocations of this memory type are automatically
-    made available and visible.
-  * ename:VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD bit specifies that
-    memory allocated with this type is not cached on the device.
-    Uncached device memory is always device coherent.
-endif::VK_AMD_device_coherent_memory[]
-ifdef::VK_NV_external_memory_rdma[]
-  * ename:VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV bit specifies that external
-    devices can access this memory directly.
-endif::VK_NV_external_memory_rdma[]
-
-ifdef::VK_AMD_device_coherent_memory[]
-For any memory allocated with both the
-ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT and the
-ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD, host or device accesses
-also perform automatic memory domain transfer operations, such that writes
-are always automatically available and visible to both host and device
-memory domains.
-
-[NOTE]
-.Note
-====
-Device coherence is a useful property for certain debugging use cases (e.g.
-crash analysis, where performing separate coherence actions could mean
-values are not reported correctly).
-However, device coherent accesses may be slower than equivalent accesses
-without device coherence, particularly if they are also device uncached.
-For device uncached memory in particular, repeated accesses to the same or
-neighbouring memory locations over a short time period (e.g. within a frame)
-may be slower than it would be for the equivalent cached memory type.
-As such, it is generally inadvisable to use device coherent or device
-uncached memory except when really needed.
-====
-endif::VK_AMD_device_coherent_memory[]
---
-
-[open,refpage='VkMemoryPropertyFlags',desc='Bitmask of VkMemoryPropertyFlagBits',type='flags']
---
-include::{generated}/api/flags/VkMemoryPropertyFlags.txt[]
-
-tname:VkMemoryPropertyFlags is a bitmask type for setting a mask of zero or
-more elink:VkMemoryPropertyFlagBits.
---
-
-ifdef::VK_EXT_memory_budget[]
-[open,refpage='VkPhysicalDeviceMemoryBudgetPropertiesEXT',desc='Structure specifying physical device memory budget and usage',type='structs']
---
-If the sname:VkPhysicalDeviceMemoryBudgetPropertiesEXT structure is included
-in the pname:pNext chain of slink:VkPhysicalDeviceMemoryProperties2, it is
-filled with the current memory budgets and usages.
-
-The sname:VkPhysicalDeviceMemoryBudgetPropertiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceMemoryBudgetPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:heapBudget is an array of ename:VK_MAX_MEMORY_HEAPS
-    basetype:VkDeviceSize values in which memory budgets are returned, with
-    one element for each memory heap.
-    A heap's budget is a rough estimate of how much memory the process can:
-    allocate from that heap before allocations may: fail or cause
-    performance degradation.
-    The budget includes any currently allocated device memory.
-  * pname:heapUsage is an array of ename:VK_MAX_MEMORY_HEAPS
-    basetype:VkDeviceSize values in which memory usages are returned, with
-    one element for each memory heap.
-    A heap's usage is an estimate of how much memory the process is
-    currently using in that heap.
-
-The values returned in this structure are not invariant.
-The pname:heapBudget and pname:heapUsage values must: be zero for array
-elements greater than or equal to
-slink:VkPhysicalDeviceMemoryProperties::pname:memoryHeapCount.
-The pname:heapBudget value must: be non-zero for array elements less than
-slink:VkPhysicalDeviceMemoryProperties::pname:memoryHeapCount.
-The pname:heapBudget value must: be less than or equal to
-slink:VkMemoryHeap::pname:size for each heap.
-
-include::{generated}/validity/structs/VkPhysicalDeviceMemoryBudgetPropertiesEXT.txt[]
---
-endif::VK_EXT_memory_budget[]
-
-[[memory-device-objects]]
-=== Device Memory Objects
-
-[open,refpage='VkDeviceMemory',desc='Opaque handle to a device memory object',type='handles']
---
-A Vulkan device operates on data in device memory via memory objects that
-are represented in the API by a sname:VkDeviceMemory handle:
-
-include::{generated}/api/handles/VkDeviceMemory.txt[]
---
-
-=== Device Memory Allocation
-
-[open,refpage='vkAllocateMemory',desc='Allocate device memory',type='protos']
---
-To allocate memory objects, call:
-
-include::{generated}/api/protos/vkAllocateMemory.txt[]
-
-  * pname:device is the logical device that owns the memory.
-  * pname:pAllocateInfo is a pointer to a slink:VkMemoryAllocateInfo
-    structure describing parameters of the allocation.
-    A successfully returned allocation must: use the requested parameters --
-    no substitution is permitted by the implementation.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pMemory is a pointer to a slink:VkDeviceMemory handle in which
-    information about the allocated memory is returned.
-
-Allocations returned by fname:vkAllocateMemory are guaranteed to meet any
-alignment requirement of the implementation.
-For example, if an implementation requires 128 byte alignment for images and
-64 byte alignment for buffers, the device memory returned through this
-mechanism would be 128-byte aligned.
-This ensures that applications can: correctly suballocate objects of
-different types (with potentially different alignment requirements) in the
-same memory object.
-
-ifndef::VK_VERSION_1_1[]
-When memory is allocated, its contents are undefined:.
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1[]
-When memory is allocated, its contents are undefined: with the following
-constraint:
-
-  * The contents of unprotected memory must: not be a function of the
-    contents of data protected memory objects, even if those memory objects
-    were previously freed.
-
-[NOTE]
-.Note
-====
-The contents of memory allocated by one application should: not be a
-function of data from protected memory objects of another application, even
-if those memory objects were previously freed.
-====
-endif::VK_VERSION_1_1[]
-
-The maximum number of valid memory allocations that can: exist
-simultaneously within a slink:VkDevice may: be restricted by implementation-
-or platform-dependent limits.
-The <<limits-maxMemoryAllocationCount,pname:maxMemoryAllocationCount>>
-feature describes the number of allocations that can: exist simultaneously
-before encountering these internal limits.
-
-[NOTE]
-.Note
-====
-For historical reasons, if pname:maxMemoryAllocationCount is exceeded, some
-implementations may return ename:VK_ERROR_TOO_MANY_OBJECTS.
-Exceeding this limit will result in undefined: behavior, and an application
-should not rely on the use of the returned error code in order to identify
-when the limit is reached.
-====
-
-[NOTE]
-.Note
-====
-Many protected memory implementations involve complex hardware and system
-software support, and often have additional and much lower limits on the
-number of simultaneous protected memory allocations (from memory types with
-the ename:VK_MEMORY_PROPERTY_PROTECTED_BIT property) than for non-protected
-memory allocations.
-These limits can be system-wide, and depend on a variety of factors outside
-of the Vulkan implementation, so can't be queried in Vulkan.
-Applications should: use as few allocations as possible from such memory
-types by suballocating aggressively, and be prepared for allocation failure
-even when there is apparently plenty of capacity remaining in the memory
-heap.
-As a guideline, the Vulkan conformance test suite requires that at least 80
-minimum-size allocations can exist concurrently when no other uses of
-protected memory are active in the system.
-====
-
-Some platforms may: have a limit on the maximum size of a single allocation.
-For example, certain systems may: fail to create allocations with a size
-greater than or equal to 4GB.
-Such a limit is implementation-dependent, and if such a failure occurs then
-the error ename:VK_ERROR_OUT_OF_DEVICE_MEMORY must: be returned.
-ifdef::VK_KHR_maintenance3[]
-This limit is advertised in
-slink:VkPhysicalDeviceMaintenance3Properties::pname:maxMemoryAllocationSize.
-endif::VK_KHR_maintenance3[]
-
-ifdef::VK_AMD_memory_overallocation_behavior[]
-
-The cumulative memory size allocated to a heap can: be limited by the size
-of the specified heap.
-In such cases, allocated memory is tracked on a per-device and per-heap
-basis.
-Some platforms allow overallocation into other heaps.
-The overallocation behavior can: be specified through the
-`apiext:VK_AMD_memory_overallocation_behavior` extension.
-
-endif::VK_AMD_memory_overallocation_behavior[]
-
-ifdef::VK_EXT_pageable_device_local_memory[]
-
-If the
-slink:VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT::pname:pageableDeviceLocalMemory
-feature is enabled, memory allocations made from a heap that includes
-ename:VK_MEMORY_HEAP_DEVICE_LOCAL_BIT in slink:VkMemoryHeap::pname:flags
-may: be transparently moved to host-local memory allowing multiple
-applications to share device-local memory.
-If there is no space left in device-local memory when this new allocation is
-made, other allocations may: be moved out transparently to make room.
-The operating system will determine which allocations to move to
-device-local memory or host-local memory based on platform-specific
-criteria.
-To help the operating system make good choices, the application should: set
-the appropriate memory priority with slink:VkMemoryPriorityAllocateInfoEXT
-and adjust it as necessary with flink:vkSetDeviceMemoryPriorityEXT.
-Higher priority allocations will moved to device-local memory first.
-
-Memory allocations made on heaps without the
-ename:VK_MEMORY_HEAP_DEVICE_LOCAL_BIT property will not be transparently
-promoted to device-local memory by the operating system.
-
-endif::VK_EXT_pageable_device_local_memory[]
-
-.Valid Usage
-****
-  * [[VUID-vkAllocateMemory-pAllocateInfo-01713]]
-    pname:pAllocateInfo->allocationSize must: be less than or equal to
-    slink:VkPhysicalDeviceMemoryProperties::pname:memoryHeaps[`memindex`].pname:size
-    where `memindex` =
-    slink:VkPhysicalDeviceMemoryProperties::pname:memoryTypes[pname:pAllocateInfo->memoryTypeIndex].pname:heapIndex
-    as returned by flink:vkGetPhysicalDeviceMemoryProperties for the
-    slink:VkPhysicalDevice that pname:device was created from
-  * [[VUID-vkAllocateMemory-pAllocateInfo-01714]]
-    pname:pAllocateInfo->memoryTypeIndex must: be less than
-    slink:VkPhysicalDeviceMemoryProperties::pname:memoryTypeCount as
-    returned by flink:vkGetPhysicalDeviceMemoryProperties for the
-    slink:VkPhysicalDevice that pname:device was created from
-ifdef::VK_AMD_device_coherent_memory[]
-  * [[VUID-vkAllocateMemory-deviceCoherentMemory-02790]]
-    If the <<features-deviceCoherentMemory,pname:deviceCoherentMemory>>
-    feature is not enabled, pname:pAllocateInfo->memoryTypeIndex must: not
-    identify a memory type supporting
-    ename:VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD
-endif::VK_AMD_device_coherent_memory[]
-  * [[VUID-vkAllocateMemory-maxMemoryAllocationCount-04101]]
-    There must: be less than
-    sname:VkPhysicalDeviceLimits::pname:maxMemoryAllocationCount device
-    memory allocations currently allocated on the device
-****
-
-include::{generated}/validity/protos/vkAllocateMemory.txt[]
---
-
-[open,refpage='VkMemoryAllocateInfo',desc='Structure containing parameters of a memory allocation',type='structs']
---
-The sname:VkMemoryAllocateInfo structure is defined as:
-
-include::{generated}/api/structs/VkMemoryAllocateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:allocationSize is the size of the allocation in bytes.
-  * pname:memoryTypeIndex is an index identifying a memory type from the
-    pname:memoryTypes array of the slink:VkPhysicalDeviceMemoryProperties
-    structure.
-
-The internal data of an allocated device memory object must: include a
-reference to implementation-specific resources, referred to as the memory
-object's _payload_.
-ifdef::VK_KHR_external_memory_win32,VK_KHR_external_memory_fd,VK_EXT_external_memory_host,VK_ANDROID_external_memory_android_hardware_buffer[]
-Applications can: also import and export that internal data to and from
-device memory objects to share data between Vulkan instances and other
-compatible APIs.
-A sname:VkMemoryAllocateInfo structure defines a memory import operation if
-its pname:pNext chain includes one of the following structures:
-
-ifdef::VK_KHR_external_memory_win32[]
-  * slink:VkImportMemoryWin32HandleInfoKHR with a non-zero pname:handleType
-    value
-endif::VK_KHR_external_memory_win32[]
-ifdef::VK_KHR_external_memory_fd[]
-  * slink:VkImportMemoryFdInfoKHR with a non-zero pname:handleType value
-endif::VK_KHR_external_memory_fd[]
-ifdef::VK_EXT_external_memory_host[]
-  * slink:VkImportMemoryHostPointerInfoEXT with a non-zero pname:handleType
-    value
-endif::VK_EXT_external_memory_host[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * slink:VkImportAndroidHardwareBufferInfoANDROID with a non-`NULL`
-    pname:buffer value
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_FUCHSIA_external_memory[]
-  * slink:VkImportMemoryZirconHandleInfoFUCHSIA with a non-zero
-    pname:handleType value
-endif::VK_FUCHSIA_external_memory[]
-ifdef::VK_FUCHSIA_buffer_collection[]
-  * slink:VkImportMemoryBufferCollectionFUCHSIA
-endif::VK_FUCHSIA_buffer_collection[]
-
-ifdef::VK_KHR_external_memory_win32[]
-If the parameters define an import operation and the external handle type is
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT,
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT, or
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT,
-pname:allocationSize is ignored.
-The implementation must: query the size of these allocations from the OS.
-endif::VK_KHR_external_memory_win32[]
-
-Whether device memory objects constructed via a memory import operation hold
-a reference to their payload depends on the properties of the handle type
-used to perform the import, as defined below for each valid handle type.
-Importing memory must: not modify the content of the memory.
-Implementations must: ensure that importing memory does not enable the
-importing Vulkan instance to access any memory or resources in other Vulkan
-instances other than that corresponding to the memory object imported.
-Implementations must: also ensure accessing imported memory which has not
-been initialized does not allow the importing Vulkan instance to obtain data
-from the exporting Vulkan instance or vice-versa.
-
-[NOTE]
-.Note
-====
-How exported and imported memory is isolated is left to the implementation,
-but applications should be aware that such isolation may: prevent
-implementations from placing multiple exportable memory objects in the same
-physical or virtual page.
-Hence, applications should: avoid creating many small external memory
-objects whenever possible.
-====
-
-Importing memory must: not increase overall heap usage within a system.
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance3,VK_EXT_memory_budget[]
-However, it must: affect the following per-process values:
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance3[]
-  * slink:VkPhysicalDeviceMaintenance3Properties::pname:maxMemoryAllocationCount
-endif::VK_VERSION_1_1,VK_KHR_maintenance3[]
-ifdef::VK_EXT_memory_budget[]
-  * slink:VkPhysicalDeviceMemoryBudgetPropertiesEXT::pname:heapUsage
-endif::VK_EXT_memory_budget[]
-endif::VK_VERSION_1_1,VK_KHR_maintenance3,VK_EXT_memory_budget[]
-
-When performing a memory import operation, it is the responsibility of the
-application to ensure the external handles and their associated payloads
-meet all valid usage requirements.
-However, implementations must: perform sufficient validation of external
-handles and payloads to ensure that the operation results in a valid memory
-object which will not cause program termination, device loss, queue stalls,
-or corruption of other resources when used as allowed according to its
-allocation parameters.
-If the external handle provided does not meet these requirements, the
-implementation must: fail the memory import operation with the error code
-ename:VK_ERROR_INVALID_EXTERNAL_HANDLE.
-
-endif::VK_KHR_external_memory_win32,VK_KHR_external_memory_fd,VK_EXT_external_memory_host,VK_ANDROID_external_memory_android_hardware_buffer[]
-
-.Valid Usage
-****
-ifndef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkMemoryAllocateInfo-allocationSize-00638]]
-    pname:allocationSize must: be greater than `0`
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_FUCHSIA_buffer_collection[]
-  * [[VUID-VkMemoryAllocateInfo-buffer-06380]]
-    If the parameters define an import operation from an
-    slink:VkBufferCollectionFUCHSIA, and
-    slink:VkMemoryDedicatedAllocateInfo::pname:buffer is present and
-    non-NULL, slink:VkImportMemoryBufferCollectionFUCHSIA::pname:collection
-    and slink:VkImportMemoryBufferCollectionFUCHSIA::pname:index must match
-    slink:VkBufferCollectionBufferCreateInfoFUCHSIA::pname:collection and
-    slink:VkBufferCollectionBufferCreateInfoFUCHSIA::pname:index,
-    respectively, of the slink:VkBufferCollectionBufferCreateInfoFUCHSIA
-    structure used to create the
-    slink:VkMemoryDedicatedAllocateInfo::pname:buffer
-  * [[VUID-VkMemoryAllocateInfo-image-06381]]
-    If the parameters define an import operation from an
-    slink:VkBufferCollectionFUCHSIA, and
-    slink:VkMemoryDedicatedAllocateInfo::pname:image is present and
-    non-NULL, slink:VkImportMemoryBufferCollectionFUCHSIA::pname:collection
-    and slink:VkImportMemoryBufferCollectionFUCHSIA::pname:index must match
-    slink:VkBufferCollectionImageCreateInfoFUCHSIA::pname:collection and
-    slink:VkBufferCollectionImageCreateInfoFUCHSIA::pname:index,
-    respectively, of the slink:VkBufferCollectionImageCreateInfoFUCHSIA
-    structure used to create the
-    slink:VkMemoryDedicatedAllocateInfo::pname:image
-  * [[VUID-VkMemoryAllocateInfo-allocationSize-06382]]
-    If the parameters define an import operation from an
-    slink:VkBufferCollectionFUCHSIA, pname:allocationSize must: match
-    slink:VkMemoryRequirements::pname:size value retrieved by
-    flink:vkGetImageMemoryRequirements or
-    flink:vkGetBufferMemoryRequirements for image-based or buffer-based
-    collections respectively
-  * [[VUID-VkMemoryAllocateInfo-pNext-06383]]
-    If the parameters define an import operation from an
-    slink:VkBufferCollectionFUCHSIA, the pname:pNext chain must: include a
-    slink:VkMemoryDedicatedAllocateInfo structure with either its
-    pname:image or pname:buffer field set to a value other than
-    dlink:VK_NULL_HANDLE.
-  * [[VUID-VkMemoryAllocateInfo-image-06384]]
-    If the parameters define an import operation from an
-    slink:VkBufferCollectionFUCHSIA and
-    slink:VkMemoryDedicatedAllocateInfo::pname:image is not
-    dlink:VK_NULL_HANDLE, the pname:image must: be created with a
-    slink:VkBufferCollectionImageCreateInfoFUCHSIA structure chained to its
-    slink:VkImageCreateInfo::pname:pNext pointer
-  * [[VUID-VkMemoryAllocateInfo-buffer-06385]]
-    If the parameters define an import operation from an
-    slink:VkBufferCollectionFUCHSIA and
-    slink:VkMemoryDedicatedAllocateInfo::pname:buffer is not
-    dlink:VK_NULL_HANDLE, the pname:buffer must: be created with a
-    slink:VkBufferCollectionBufferCreateInfoFUCHSIA structure chained to its
-    slink:VkBufferCreateInfo::pname:pNext pointer
-  * [[VUID-VkMemoryAllocateInfo-memoryTypeIndex-06386]]
-    If the parameters define an import operation from an
-    slink:VkBufferCollectionFUCHSIA, pname:memoryTypeIndex must: be from
-    slink:VkBufferCollectionPropertiesFUCHSIA as retrieved by
-    flink:vkGetBufferCollectionPropertiesFUCHSIA.
-endif::VK_FUCHSIA_buffer_collection[]
-ifdef::VK_KHR_external_memory[]
-ifdef::VK_KHR_dedicated_allocation,VK_NV_dedicated_allocation[]
-  * [[VUID-VkMemoryAllocateInfo-pNext-00639]]
-    If the pname:pNext chain includes a sname:VkExportMemoryAllocateInfo
-    structure, and any of the handle types specified in
-    sname:VkExportMemoryAllocateInfo::pname:handleTypes require a dedicated
-    allocation, as reported by
-    flink:vkGetPhysicalDeviceImageFormatProperties2 in
-    sname:VkExternalImageFormatProperties::pname:externalMemoryProperties.externalMemoryFeatures
-    or
-    sname:VkExternalBufferProperties::pname:externalMemoryProperties.externalMemoryFeatures,
-    the pname:pNext chain must: include a
-    sname:VkMemoryDedicatedAllocateInfo or
-    sname:VkDedicatedAllocationMemoryAllocateInfoNV structure with either
-    its pname:image or pname:buffer member set to a value other than
-    dlink:VK_NULL_HANDLE
-endif::VK_KHR_dedicated_allocation,VK_NV_dedicated_allocation[]
-endif::VK_KHR_external_memory[]
-ifdef::VK_KHR_external_memory[]
-ifdef::VK_NV_external_memory[]
-  * [[VUID-VkMemoryAllocateInfo-pNext-00640]]
-    If the pname:pNext chain includes a slink:VkExportMemoryAllocateInfo
-    structure, it must: not include a slink:VkExportMemoryAllocateInfoNV or
-    slink:VkExportMemoryWin32HandleInfoNV structure
-endif::VK_NV_external_memory[]
-endif::VK_KHR_external_memory[]
-ifdef::VK_KHR_external_memory_win32+VK_NV_external_memory_win32[]
-  * [[VUID-VkMemoryAllocateInfo-pNext-00641]]
-    If the pname:pNext chain includes a
-    slink:VkImportMemoryWin32HandleInfoKHR structure, it must: not include a
-    slink:VkImportMemoryWin32HandleInfoNV structure
-endif::VK_KHR_external_memory_win32+VK_NV_external_memory_win32[]
-ifdef::VK_KHR_external_memory_fd[]
-  * [[VUID-VkMemoryAllocateInfo-allocationSize-01742]]
-    If the parameters define an import operation, the external handle
-    specified was created by the Vulkan API, and the external handle type is
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, then the values of
-    pname:allocationSize and pname:memoryTypeIndex must: match those
-    specified when the payload being imported was created
-endif::VK_KHR_external_memory_fd[]
-ifdef::VK_KHR_external_memory+VK_KHR_device_group[]
-  * [[VUID-VkMemoryAllocateInfo-None-00643]]
-    If the parameters define an import operation and the external handle
-    specified was created by the Vulkan API, the device mask specified by
-    slink:VkMemoryAllocateFlagsInfo must: match that specified when the
-    payload being imported was allocated
-  * [[VUID-VkMemoryAllocateInfo-None-00644]]
-    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 flink:vkAllocateMemory must:
-    match the list of physical devices that comprise the logical device on
-    which the payload was originally allocated
-endif::VK_KHR_external_memory+VK_KHR_device_group[]
-ifdef::VK_KHR_external_memory_win32[]
-  * [[VUID-VkMemoryAllocateInfo-memoryTypeIndex-00645]]
-    If the parameters define an import operation and the external handle is
-    an NT handle or a global share handle created outside of the Vulkan API,
-    the value of pname:memoryTypeIndex must: be one of those returned by
-    flink:vkGetMemoryWin32HandlePropertiesKHR
-  * [[VUID-VkMemoryAllocateInfo-allocationSize-01743]]
-    If the parameters define an import operation, the external handle was
-    created by the Vulkan API, and the external handle type is
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT or
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, then the
-    values of pname:allocationSize and pname:memoryTypeIndex must: match
-    those specified when the payload being imported was created
-  * [[VUID-VkMemoryAllocateInfo-allocationSize-00647]]
-    If the parameters define an import operation and the external handle
-    type is ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT,
-    pname:allocationSize must: match the size specified when creating the
-    Direct3D 12 heap from which the payload was extracted
-endif::VK_KHR_external_memory_win32[]
-ifdef::VK_KHR_external_memory_fd[]
-  * [[VUID-VkMemoryAllocateInfo-memoryTypeIndex-00648]]
-    If the parameters define an import operation and the external handle is
-    a POSIX file descriptor created outside of the Vulkan API, the value of
-    pname:memoryTypeIndex must: be one of those returned by
-    flink:vkGetMemoryFdPropertiesKHR
-endif::VK_KHR_external_memory_fd[]
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-VkMemoryAllocateInfo-memoryTypeIndex-01872]]
-    If the protected memory feature is not enabled, the
-    sname:VkMemoryAllocateInfo::pname:memoryTypeIndex must: not indicate a
-    memory type that reports ename:VK_MEMORY_PROPERTY_PROTECTED_BIT
-endif::VK_VERSION_1_1[]
-ifdef::VK_EXT_external_memory_host[]
-  * [[VUID-VkMemoryAllocateInfo-memoryTypeIndex-01744]]
-    If the parameters define an import operation and the external handle is
-    a host pointer, the value of pname:memoryTypeIndex must: be one of those
-    returned by flink:vkGetMemoryHostPointerPropertiesEXT
-  * [[VUID-VkMemoryAllocateInfo-allocationSize-01745]]
-    If the parameters define an import operation and the external handle is
-    a host pointer, pname:allocationSize must: be an integer multiple of
-    sname:VkPhysicalDeviceExternalMemoryHostPropertiesEXT::pname:minImportedHostPointerAlignment
-ifdef::VK_NV_dedicated_allocation[]
-  * [[VUID-VkMemoryAllocateInfo-pNext-02805]]
-    If the parameters define an import operation and the external handle is
-    a host pointer, the pname:pNext chain must: not include a
-    slink:VkDedicatedAllocationMemoryAllocateInfoNV structure with either
-    its pname:image or pname:buffer field set to a value other than
-    dlink:VK_NULL_HANDLE
-endif::VK_NV_dedicated_allocation[]
-ifdef::VK_KHR_dedicated_allocation[]
-  * [[VUID-VkMemoryAllocateInfo-pNext-02806]]
-    If the parameters define an import operation and the external handle is
-    a host pointer, the pname:pNext chain must: not include a
-    slink:VkMemoryDedicatedAllocateInfo structure with either its
-    pname:image or pname:buffer field set to a value other than
-    dlink:VK_NULL_HANDLE
-endif::VK_KHR_dedicated_allocation[]
-endif::VK_EXT_external_memory_host[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkMemoryAllocateInfo-allocationSize-02383]]
-    If the parameters define an import operation and the external handle
-    type is
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID,
-    pname:allocationSize must: be the size returned by
-    flink:vkGetAndroidHardwareBufferPropertiesANDROID for the Android
-    hardware buffer
-  * [[VUID-VkMemoryAllocateInfo-pNext-02384]]
-    If the parameters define an import operation and the external handle
-    type is
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID,
-    and the pname:pNext chain does not include a
-    slink:VkMemoryDedicatedAllocateInfo structure or
-    slink:VkMemoryDedicatedAllocateInfo::pname:image is
-    dlink:VK_NULL_HANDLE, the Android hardware buffer must: have a
-    code:AHardwareBuffer_Desc::code:format of
-    code:AHARDWAREBUFFER_FORMAT_BLOB and a
-    code:AHardwareBuffer_Desc::code:usage that includes
-    code:AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER
-  * [[VUID-VkMemoryAllocateInfo-memoryTypeIndex-02385]]
-    If the parameters define an import operation and the external handle
-    type is
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID,
-    pname:memoryTypeIndex must: be one of those returned by
-    flink:vkGetAndroidHardwareBufferPropertiesANDROID for the Android
-    hardware buffer
-  * [[VUID-VkMemoryAllocateInfo-pNext-01874]]
-    If the parameters do not define an import operation, and the pname:pNext
-    chain includes a sname:VkExportMemoryAllocateInfo structure with
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID
-    included in its pname:handleTypes member, and the pname:pNext chain
-    includes a slink:VkMemoryDedicatedAllocateInfo structure with
-    pname:image not equal to dlink:VK_NULL_HANDLE, then pname:allocationSize
-    must: be `0`, otherwise pname:allocationSize must: be greater than `0`
-  * [[VUID-VkMemoryAllocateInfo-pNext-02386]]
-    If the parameters define an import operation, the external handle is an
-    Android hardware buffer, and the pname:pNext chain includes a
-    slink:VkMemoryDedicatedAllocateInfo with pname:image that is not
-    dlink:VK_NULL_HANDLE, the Android hardware buffer's
-    basetype:AHardwareBuffer::code:usage must: include at least one of
-    code:AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER or
-    code:AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE
-  * [[VUID-VkMemoryAllocateInfo-pNext-02387]]
-    If the parameters define an import operation, the external handle is an
-    Android hardware buffer, and the pname:pNext chain includes a
-    slink:VkMemoryDedicatedAllocateInfo with pname:image that is not
-    dlink:VK_NULL_HANDLE, the format of pname:image must: be
-    ename:VK_FORMAT_UNDEFINED or the format returned by
-    flink:vkGetAndroidHardwareBufferPropertiesANDROID in
-    slink:VkAndroidHardwareBufferFormatPropertiesANDROID::pname:format for
-    the Android hardware buffer
-  * [[VUID-VkMemoryAllocateInfo-pNext-02388]]
-    If the parameters define an import operation, the external handle is an
-    Android hardware buffer, and the pname:pNext chain includes a
-    slink:VkMemoryDedicatedAllocateInfo structure with pname:image that is
-    not dlink:VK_NULL_HANDLE, the width, height, and array layer dimensions
-    of pname:image and the Android hardware buffer's
-    code:AHardwareBuffer_Desc must: be identical
-  * [[VUID-VkMemoryAllocateInfo-pNext-02389]]
-    If the parameters define an import operation, the external handle is an
-    Android hardware buffer, and the pname:pNext chain includes a
-    slink:VkMemoryDedicatedAllocateInfo structure with pname:image that is
-    not dlink:VK_NULL_HANDLE, and the Android hardware buffer's
-    basetype:AHardwareBuffer::code:usage includes
-    code:AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE, the pname:image must:
-    have a complete mipmap chain
-  * [[VUID-VkMemoryAllocateInfo-pNext-02586]]
-    If the parameters define an import operation, the external handle is an
-    Android hardware buffer, and the pname:pNext chain includes a
-    slink:VkMemoryDedicatedAllocateInfo structure with pname:image that is
-    not dlink:VK_NULL_HANDLE, and the Android hardware buffer's
-    basetype:AHardwareBuffer::code:usage does not include
-    code:AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE, the pname:image must:
-    have exactly one mipmap level
-  * [[VUID-VkMemoryAllocateInfo-pNext-02390]]
-    If the parameters define an import operation, the external handle is an
-    Android hardware buffer, and the pname:pNext chain includes a
-    slink:VkMemoryDedicatedAllocateInfo structure with pname:image that is
-    not dlink:VK_NULL_HANDLE, each bit set in the usage of pname:image must:
-    be listed in
-    <<memory-external-android-hardware-buffer-usage,AHardwareBuffer Usage
-    Equivalence>>, and if there is a corresponding
-    code:AHARDWAREBUFFER_USAGE bit listed that bit must: be included in the
-    Android hardware buffer's code:AHardwareBuffer_Desc::code:usage
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-  * [[VUID-VkMemoryAllocateInfo-opaqueCaptureAddress-03329]]
-    If
-    slink:VkMemoryOpaqueCaptureAddressAllocateInfo::pname:opaqueCaptureAddress
-    is not zero, sname:VkMemoryAllocateFlagsInfo::pname:flags must: include
-    ename:VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT
-  * [[VUID-VkMemoryAllocateInfo-flags-03330]]
-    If sname:VkMemoryAllocateFlagsInfo::pname:flags includes
-    ename:VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT, the
-    <<features-bufferDeviceAddressCaptureReplay,bufferDeviceAddressCaptureReplay>>
-    feature must: be enabled
-  * [[VUID-VkMemoryAllocateInfo-flags-03331]]
-    If sname:VkMemoryAllocateFlagsInfo::pname:flags includes
-    ename:VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT, the
-    <<features-bufferDeviceAddress,bufferDeviceAddress>> feature must: be
-    enabled
-ifdef::VK_EXT_external_memory_host[]
-  * [[VUID-VkMemoryAllocateInfo-pNext-03332]]
-    If the pname:pNext chain includes a
-    sname:VkImportMemoryHostPointerInfoEXT structure,
-    slink:VkMemoryOpaqueCaptureAddressAllocateInfo::pname:opaqueCaptureAddress
-    must: be zero
-endif::VK_EXT_external_memory_host[]
-  * [[VUID-VkMemoryAllocateInfo-opaqueCaptureAddress-03333]]
-    If the parameters define an import operation,
-    slink:VkMemoryOpaqueCaptureAddressAllocateInfo::pname:opaqueCaptureAddress
-    must: be zero
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-ifdef::VK_FUCHSIA_external_memory[]
-  * [[VUID-VkMemoryAllocateInfo-None-04749]]
-    If the parameters define an import operation and the external handle
-    type is ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA, the
-    value of sname:memoryTypeIndex must: be an index identifying a memory
-    type from the sname:memoryTypeBits field of the
-    slink:VkMemoryZirconHandlePropertiesFUCHSIA structure populated by a
-    call to flink:vkGetMemoryZirconHandlePropertiesFUCHSIA
-  * [[VUID-VkMemoryAllocateInfo-allocationSize-04750]]
-    If the parameters define an import operation and the external handle
-    type is ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA, the
-    value of pname:allocationSize must: be greater than `0` and must: be
-    less than or equal to the size of the VMO as determined by
-    code:zx_vmo_get_size(pname:handle) where pname:handle is the VMO handle
-    to the imported external memory
-endif::VK_FUCHSIA_external_memory[]
-****
-
-include::{generated}/validity/structs/VkMemoryAllocateInfo.txt[]
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
-[open,refpage='VkMemoryDedicatedAllocateInfo',desc='Specify a dedicated memory allocation resource',type='structs']
---
-If the pname:pNext chain includes a sname:VkMemoryDedicatedAllocateInfo
-structure, then that structure includes a handle of the sole buffer or image
-resource that the memory can: be bound to.
-
-The sname:VkMemoryDedicatedAllocateInfo structure is defined as:
-
-include::{generated}/api/structs/VkMemoryDedicatedAllocateInfo.txt[]
-
-ifdef::VK_KHR_dedicated_allocation[]
-or the equivalent
-
-include::{generated}/api/structs/VkMemoryDedicatedAllocateInfoKHR.txt[]
-endif::VK_KHR_dedicated_allocation[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:image is dlink:VK_NULL_HANDLE or a handle of an image which this
-    memory will be bound to.
-  * pname:buffer is dlink:VK_NULL_HANDLE or a handle of a buffer which this
-    memory will be bound to.
-
-.Valid Usage
-****
-  * [[VUID-VkMemoryDedicatedAllocateInfo-image-01432]]
-    At least one of pname:image and pname:buffer must: be
-    dlink:VK_NULL_HANDLE
-ifndef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkMemoryDedicatedAllocateInfo-image-01433]]
-    If pname:image is not dlink:VK_NULL_HANDLE,
-    sname:VkMemoryAllocateInfo::pname:allocationSize must: equal the
-    sname:VkMemoryRequirements::pname:size of the image
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkMemoryDedicatedAllocateInfo-image-02964]]
-    If pname:image is not dlink:VK_NULL_HANDLE and the memory is not an
-    imported Android Hardware Buffer,
-    sname:VkMemoryAllocateInfo::pname:allocationSize must: equal the
-    sname:VkMemoryRequirements::pname:size of the image
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkMemoryDedicatedAllocateInfo-image-01434]]
-    If pname:image is not dlink:VK_NULL_HANDLE, pname:image must: have been
-    created without ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT set in
-    slink:VkImageCreateInfo::pname:flags
-ifndef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkMemoryDedicatedAllocateInfo-buffer-01435]]
-    If pname:buffer is not dlink:VK_NULL_HANDLE,
-    sname:VkMemoryAllocateInfo::pname:allocationSize must: equal the
-    sname:VkMemoryRequirements::pname:size of the buffer
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkMemoryDedicatedAllocateInfo-buffer-02965]]
-    If pname:buffer is not dlink:VK_NULL_HANDLE and the memory is not an
-    imported Android Hardware Buffer,
-    sname:VkMemoryAllocateInfo::pname:allocationSize must: equal the
-    sname:VkMemoryRequirements::pname:size of the buffer
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkMemoryDedicatedAllocateInfo-buffer-01436]]
-    If pname:buffer is not dlink:VK_NULL_HANDLE, pname:buffer must: have
-    been created without ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT set in
-    slink:VkBufferCreateInfo::pname:flags
-ifdef::VK_KHR_external_memory_win32[]
-  * [[VUID-VkMemoryDedicatedAllocateInfo-image-01876]]
-    If pname:image is not dlink:VK_NULL_HANDLE and
-    slink:VkMemoryAllocateInfo defines a memory import operation with handle
-    type ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT,
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT,
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT,
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, or
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, and the
-    external handle was created by the Vulkan API, then the memory being
-    imported must: also be a dedicated image allocation and pname:image must
-    be identical to the image associated with the imported memory
-  * [[VUID-VkMemoryDedicatedAllocateInfo-buffer-01877]]
-    If pname:buffer is not dlink:VK_NULL_HANDLE and
-    slink:VkMemoryAllocateInfo defines a memory import operation with handle
-    type ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT,
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT,
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT,
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, or
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, and the
-    external handle was created by the Vulkan API, then the memory being
-    imported must: also be a dedicated buffer allocation and pname:buffer
-    must: be identical to the buffer associated with the imported memory
-endif::VK_KHR_external_memory_win32[]
-ifdef::VK_KHR_external_memory_fd[]
-  * [[VUID-VkMemoryDedicatedAllocateInfo-image-01878]]
-    If pname:image is not dlink:VK_NULL_HANDLE and
-    slink:VkMemoryAllocateInfo defines a memory import operation with handle
-    type ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, the memory
-    being imported must: also be a dedicated image allocation and
-    pname:image must: be identical to the image associated with the imported
-    memory
-  * [[VUID-VkMemoryDedicatedAllocateInfo-buffer-01879]]
-    If pname:buffer is not dlink:VK_NULL_HANDLE and
-    slink:VkMemoryAllocateInfo defines a memory import operation with handle
-    type ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, the memory
-    being imported must: also be a dedicated buffer allocation and
-    pname:buffer must: be identical to the buffer associated with the
-    imported memory
-endif::VK_KHR_external_memory_fd[]
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkMemoryDedicatedAllocateInfo-image-01797]]
-    If pname:image is not dlink:VK_NULL_HANDLE, pname:image must: not have
-    been created with ename:VK_IMAGE_CREATE_DISJOINT_BIT set in
-    slink:VkImageCreateInfo::pname:flags
-endif::VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_FUCHSIA_external_memory[]
-  * [[VUID-VkMemoryDedicatedAllocateInfo-image-04751]]
-    If pname:image is not dlink:VK_NULL_HANDLE and
-    slink:VkMemoryAllocateInfo defines a memory import operation with handle
-    type ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA, the
-    memory being imported must: also be a dedicated image allocation and
-    pname:image must: be identical to the image associated with the imported
-    memory
-  * [[VUID-VkMemoryDedicatedAllocateInfo-buffer-04752]]
-    If pname:buffer is not dlink:VK_NULL_HANDLE and
-    slink:VkMemoryAllocateInfo defines a memory import operation with handle
-    type ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA, the
-    memory being imported must: also be a dedicated buffer allocation and
-    pname:buffer must: be identical to the buffer associated with the
-    imported memory
-endif::VK_FUCHSIA_external_memory[]
-****
-
-include::{generated}/validity/structs/VkMemoryDedicatedAllocateInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
-
-ifdef::VK_NV_dedicated_allocation[]
-[open,refpage='VkDedicatedAllocationMemoryAllocateInfoNV',desc='Specify a dedicated memory allocation resource',type='structs']
---
-If the pname:pNext chain includes a
-sname:VkDedicatedAllocationMemoryAllocateInfoNV structure, then that
-structure includes a handle of the sole buffer or image resource that the
-memory can: be bound to.
-
-The sname:VkDedicatedAllocationMemoryAllocateInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkDedicatedAllocationMemoryAllocateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:image is dlink:VK_NULL_HANDLE or a handle of an image which this
-    memory will be bound to.
-  * pname:buffer is dlink:VK_NULL_HANDLE or a handle of a buffer which this
-    memory will be bound to.
-
-.Valid Usage
-****
-  * [[VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00649]]
-    At least one of pname:image and pname:buffer must: be
-    dlink:VK_NULL_HANDLE
-  * [[VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00650]]
-    If pname:image is not dlink:VK_NULL_HANDLE, the image must: have been
-    created with
-    slink:VkDedicatedAllocationImageCreateInfoNV::pname:dedicatedAllocation
-    equal to ename:VK_TRUE
-  * [[VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00651]]
-    If pname:buffer is not dlink:VK_NULL_HANDLE, the buffer must: have been
-    created with
-    slink:VkDedicatedAllocationBufferCreateInfoNV::pname:dedicatedAllocation
-    equal to ename:VK_TRUE
-  * [[VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00652]]
-    If pname:image is not dlink:VK_NULL_HANDLE,
-    sname:VkMemoryAllocateInfo::pname:allocationSize must: equal the
-    sname:VkMemoryRequirements::pname:size of the image
-  * [[VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00653]]
-    If pname:buffer is not dlink:VK_NULL_HANDLE,
-    sname:VkMemoryAllocateInfo::pname:allocationSize must: equal the
-    sname:VkMemoryRequirements::pname:size of the buffer
-ifdef::VK_KHR_external_memory_win32,VK_KHR_external_memory_fd[]
-  * [[VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00654]]
-    If pname:image is not dlink:VK_NULL_HANDLE and
-    slink:VkMemoryAllocateInfo defines a memory import operation, the memory
-    being imported must: also be a dedicated image allocation and
-    pname:image must: be identical to the image associated with the imported
-    memory
-  * [[VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00655]]
-    If pname:buffer is not dlink:VK_NULL_HANDLE and
-    slink:VkMemoryAllocateInfo defines a memory import operation, the memory
-    being imported must: also be a dedicated buffer allocation and
-    pname:buffer must: be identical to the buffer associated with the
-    imported memory
-endif::VK_KHR_external_memory_win32,VK_KHR_external_memory_fd[]
-****
-
-include::{generated}/validity/structs/VkDedicatedAllocationMemoryAllocateInfoNV.txt[]
---
-endif::VK_NV_dedicated_allocation[]
-
-ifdef::VK_EXT_memory_priority[]
-[open,refpage='VkMemoryPriorityAllocateInfoEXT',desc='Specify a memory allocation priority',type='structs']
---
-If the pname:pNext chain includes a sname:VkMemoryPriorityAllocateInfoEXT
-structure, then that structure includes a priority for the memory.
-
-The sname:VkMemoryPriorityAllocateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkMemoryPriorityAllocateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:priority is 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.
-
-Memory allocations with higher priority may: be more likely to stay in
-device-local memory when the system is under memory pressure.
-
-If this structure is not included, it is as if the pname:priority value were
-`0.5`.
-
-.Valid Usage
-****
-  * [[VUID-VkMemoryPriorityAllocateInfoEXT-priority-02602]]
-    pname:priority must: be between `0` and `1`, inclusive
-****
-
-include::{generated}/validity/structs/VkMemoryPriorityAllocateInfoEXT.txt[]
---
-endif::VK_EXT_memory_priority[]
-
-ifdef::VK_EXT_pageable_device_local_memory[]
-[open,refpage='vkSetDeviceMemoryPriorityEXT',desc='Change a memory allocation priority',type='protos']
---
-
-To modify the priority of an existing memory allocation, call:
-
-include::{generated}/api/protos/vkSetDeviceMemoryPriorityEXT.txt[]
-
-  * pname:device is the logical device that owns the memory.
-  * pname:memory is the slink:VkDeviceMemory object to which the new
-    priority will be applied.
-  * pname:priority is 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.
-
-Memory allocations with higher priority may: be more likely to stay in
-device-local memory when the system is under memory pressure.
-
-.Valid Usage
-****
-  * [[VUID-vkSetDeviceMemoryPriorityEXT-priority-06258]]
-    pname:priority must: be between `0` and `1`, inclusive
-****
-
-include::{generated}/validity/protos/vkSetDeviceMemoryPriorityEXT.txt[]
---
-endif::VK_EXT_pageable_device_local_memory[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-[open,refpage='VkExportMemoryAllocateInfo',desc='Specify exportable handle types for a device memory object',type='structs']
---
-When allocating memory whose payload may: be exported to another process or
-Vulkan instance, add a slink:VkExportMemoryAllocateInfo structure to the
-pname:pNext chain of the slink:VkMemoryAllocateInfo structure, specifying
-the handle types that may: be exported.
-
-The slink:VkExportMemoryAllocateInfo structure is defined as:
-
-include::{generated}/api/structs/VkExportMemoryAllocateInfo.txt[]
-
-ifdef::VK_KHR_external_memory[]
-or the equivalent
-
-include::{generated}/api/structs/VkExportMemoryAllocateInfoKHR.txt[]
-endif::VK_KHR_external_memory[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleTypes is a bitmask of
-    elink:VkExternalMemoryHandleTypeFlagBits specifying one or more memory
-    handle types the application can: export from the resulting allocation.
-    The application can: request multiple handle types for the same
-    allocation.
-
-.Valid Usage
-****
-  * [[VUID-VkExportMemoryAllocateInfo-handleTypes-00656]]
-    The bits in pname:handleTypes must: be supported and compatible, as
-    reported by slink:VkExternalImageFormatProperties or
-    slink:VkExternalBufferProperties
-****
-
-include::{generated}/validity/structs/VkExportMemoryAllocateInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-ifdef::VK_NV_external_memory[]
-include::VK_NV_external_memory/allocate_memory.txt[]
-endif::VK_NV_external_memory[]
-
-ifdef::VK_KHR_external_memory_win32,VK_NV_external_memory_win32[]
-=== Win32 External Memory
-endif::VK_KHR_external_memory_win32,VK_NV_external_memory_win32[]
-
-ifdef::VK_KHR_external_memory_win32[]
-[open,refpage='VkExportMemoryWin32HandleInfoKHR',desc='Structure specifying additional attributes of Windows handles exported from a memory',type='structs']
---
-To specify additional attributes of NT handles exported from a memory
-object, add a slink:VkExportMemoryWin32HandleInfoKHR structure to the
-pname:pNext chain of the slink:VkMemoryAllocateInfo structure.
-The sname:VkExportMemoryWin32HandleInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkExportMemoryWin32HandleInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pAttributes is a pointer to a Windows code:SECURITY_ATTRIBUTES
-    structure specifying security attributes of the handle.
-  * pname:dwAccess is a code:DWORD specifying access rights of the handle.
-  * pname:name is a null-terminated UTF-16 string to associate with the
-    payload referenced by NT handles exported from the created memory.
-
-If slink:VkExportMemoryAllocateInfo is not included in the same pname:pNext
-chain, this structure is ignored.
-
-If slink:VkExportMemoryAllocateInfo is included in the pname:pNext chain of
-slink:VkMemoryAllocateInfo with a Windows pname:handleType, but either
-sname:VkExportMemoryWin32HandleInfoKHR is not included in the pname:pNext
-chain, or if it is but pname:pAttributes is set to `NULL`, default security
-descriptor values will be used, and child processes created by the
-application will not inherit the handle, as described in the MSDN
-documentation for "`Synchronization Object Security and Access Rights`"^1^.
-Further, if the structure is not present, the access rights used depend on
-the handle type.
-
-For handles of the following types:
-
-  * ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT
-
-The implementation must: ensure the access rights allow read and write
-access to the memory.
-
-1::
-    https://docs.microsoft.com/en-us/windows/win32/sync/synchronization-object-security-and-access-rights
-
-.Valid Usage
-****
-  * [[VUID-VkExportMemoryWin32HandleInfoKHR-handleTypes-00657]]
-    If slink:VkExportMemoryAllocateInfo::pname:handleTypes does not include
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, a
-    sname:VkExportMemoryWin32HandleInfoKHR structure must: not be included
-    in the pname:pNext chain of slink:VkMemoryAllocateInfo
-****
-
-include::{generated}/validity/structs/VkExportMemoryWin32HandleInfoKHR.txt[]
---
-
-[open,refpage='VkImportMemoryWin32HandleInfoKHR',desc='Import Win32 memory created on the same physical device',type='structs']
---
-To import memory from a Windows handle, add a
-slink:VkImportMemoryWin32HandleInfoKHR structure to the pname:pNext chain of
-the slink:VkMemoryAllocateInfo structure.
-
-The sname:VkImportMemoryWin32HandleInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkImportMemoryWin32HandleInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value
-    specifying the type of pname:handle or pname:name.
-  * pname:handle is `NULL` or the external handle to import.
-  * pname:name is `NULL` or a null-terminated UTF-16 string naming the
-    payload to import.
-
-Importing memory object payloads from Windows handles does not transfer
-ownership of the handle to the Vulkan implementation.
-For handle types defined as NT handles, the application must: release handle
-ownership using the code:CloseHandle system call when the handle is no
-longer needed.
-For handle types defined as NT handles, the imported memory object holds a
-reference to its payload.
-
-[NOTE]
-.Note
-====
-Non-NT handle import operations do not add a reference to their associated
-payload.
-If the original object owning the payload is destroyed, all resources and
-handles sharing that payload will become invalid.
-====
-
-Applications can: import the same payload into multiple instances of Vulkan,
-into the same instance from which it was exported, and multiple times into a
-given Vulkan instance.
-In all cases, each import operation must: create a distinct
-sname:VkDeviceMemory object.
-
-.Valid Usage
-****
-  * [[VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00658]]
-    If pname:handleType is not `0`, it must: be supported for import, as
-    reported by slink:VkExternalImageFormatProperties or
-    slink:VkExternalBufferProperties
-  * [[VUID-VkImportMemoryWin32HandleInfoKHR-handle-00659]]
-    The memory from which pname:handle was exported, or the memory named by
-    pname:name must: have been created on the same underlying physical
-    device as pname:device
-  * [[VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00660]]
-    If pname:handleType is not `0`, it must: be defined as an NT handle or a
-    global share handle
-  * [[VUID-VkImportMemoryWin32HandleInfoKHR-handleType-01439]]
-    If pname:handleType is not
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT,
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT,
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, or
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, pname:name
-    must: be `NULL`
-  * [[VUID-VkImportMemoryWin32HandleInfoKHR-handleType-01440]]
-    If pname:handleType is not `0` and pname:handle is `NULL`, pname:name
-    must: name a valid memory resource of the type specified by
-    pname:handleType
-  * [[VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00661]]
-    If pname:handleType is not `0` and pname:name is `NULL`, pname:handle
-    must: be a valid handle of the type specified by pname:handleType
-  * [[VUID-VkImportMemoryWin32HandleInfoKHR-handle-01441]]
-    if pname:handle is not `NULL`, pname:name must: be `NULL`
-  * [[VUID-VkImportMemoryWin32HandleInfoKHR-handle-01518]]
-    If pname:handle is not `NULL`, it must: obey any requirements listed for
-    pname:handleType in
-    <<external-memory-handle-types-compatibility,external memory handle
-    types compatibility>>
-  * [[VUID-VkImportMemoryWin32HandleInfoKHR-name-01519]]
-    If pname:name is not `NULL`, it must: obey any requirements listed for
-    pname:handleType in
-    <<external-memory-handle-types-compatibility,external memory handle
-    types compatibility>>
-****
-
-include::{generated}/validity/structs/VkImportMemoryWin32HandleInfoKHR.txt[]
---
-
-[open,refpage='vkGetMemoryWin32HandleKHR',desc='Get a Windows HANDLE for a memory object',type='protos']
---
-To export a Windows handle representing the payload of a Vulkan device
-memory object, call:
-
-include::{generated}/api/protos/vkGetMemoryWin32HandleKHR.txt[]
-
-  * pname:device is the logical device that created the device memory being
-    exported.
-  * pname:pGetWin32HandleInfo is a pointer to a
-    slink:VkMemoryGetWin32HandleInfoKHR structure containing parameters of
-    the export operation.
-  * pname:pHandle will return the Windows handle representing the payload of
-    the device memory object.
-
-For handle types defined as NT handles, the handles returned by
-fname:vkGetMemoryWin32HandleKHR are owned by the application and hold a
-reference to their payload.
-To avoid leaking resources, the application must: release ownership of them
-using the code:CloseHandle system call when they are no longer needed.
-
-[NOTE]
-.Note
-====
-Non-NT handle types do not add a reference to their associated payload.
-If the original object owning the payload is destroyed, all resources and
-handles sharing that payload will become invalid.
-====
-
-include::{generated}/validity/protos/vkGetMemoryWin32HandleKHR.txt[]
---
-
-[open,refpage='VkMemoryGetWin32HandleInfoKHR',desc='Structure describing a Win32 handle semaphore export operation',type='structs']
---
-The sname:VkMemoryGetWin32HandleInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkMemoryGetWin32HandleInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memory is the memory object from which the handle will be
-    exported.
-  * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value
-    specifying the type of handle requested.
-
-The properties of the handle returned depend on the value of
-pname:handleType.
-See elink:VkExternalMemoryHandleTypeFlagBits for a description of the
-properties of the defined external memory handle types.
-
-.Valid Usage
-****
-  * [[VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00662]]
-    pname:handleType must: have been included in
-    slink:VkExportMemoryAllocateInfo::pname:handleTypes when pname:memory
-    was created
-  * [[VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00663]]
-    If pname:handleType is defined as an NT handle,
-    flink:vkGetMemoryWin32HandleKHR must: be called no more than once for
-    each valid unique combination of pname:memory and pname:handleType
-  * [[VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00664]]
-    pname:handleType must: be defined as an NT handle or a global share
-    handle
-****
-
-include::{generated}/validity/structs/VkMemoryGetWin32HandleInfoKHR.txt[]
---
-
-[open,refpage='vkGetMemoryWin32HandlePropertiesKHR',desc='Get Properties of External Memory Win32 Handles',type='protos']
---
-Windows memory handles compatible with Vulkan may: also be created by
-non-Vulkan APIs using methods beyond the scope of this specification.
-To determine the correct parameters to use when importing such handles,
-call:
-
-include::{generated}/api/protos/vkGetMemoryWin32HandlePropertiesKHR.txt[]
-
-  * pname:device is the logical device that will be importing pname:handle.
-  * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value
-    specifying the type of the handle pname:handle.
-  * pname:handle is the handle which will be imported.
-  * pname:pMemoryWin32HandleProperties is a pointer to a
-    slink:VkMemoryWin32HandlePropertiesKHR structure in which properties of
-    pname:handle are returned.
-
-.Valid Usage
-****
-  * [[VUID-vkGetMemoryWin32HandlePropertiesKHR-handle-00665]]
-    pname:handle must: be an external memory handle created outside of the
-    Vulkan API
-  * [[VUID-vkGetMemoryWin32HandlePropertiesKHR-handleType-00666]]
-    pname:handleType must: not be one of the handle types defined as opaque
-****
-
-include::{generated}/validity/protos/vkGetMemoryWin32HandlePropertiesKHR.txt[]
---
-
-[open,refpage='VkMemoryWin32HandlePropertiesKHR',desc='Properties of External Memory Windows Handles',type='structs']
---
-The sname:VkMemoryWin32HandlePropertiesKHR structure returned is defined as:
-
-include::{generated}/api/structs/VkMemoryWin32HandlePropertiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memoryTypeBits is a bitmask containing one bit set for every
-    memory type which the specified windows handle can: be imported as.
-
-include::{generated}/validity/structs/VkMemoryWin32HandlePropertiesKHR.txt[]
---
-endif::VK_KHR_external_memory_win32[]
-
-ifdef::VK_NV_external_memory_win32[]
-include::VK_NV_external_memory_win32/handle_permissions.txt[]
-
-include::VK_NV_external_memory_win32/import_memory_win32.txt[]
-
-include::VK_NV_external_memory_win32/get_handle_win32.txt[]
-endif::VK_NV_external_memory_win32[]
-
-ifdef::VK_KHR_external_memory_fd[]
-=== File Descriptor External Memory
-
-[open,refpage='VkImportMemoryFdInfoKHR',desc='Import memory created on the same physical device from a file descriptor',type='structs']
---
-To import memory from a POSIX file descriptor handle, add a
-slink:VkImportMemoryFdInfoKHR structure to the pname:pNext chain of the
-slink:VkMemoryAllocateInfo structure.
-The sname:VkImportMemoryFdInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkImportMemoryFdInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value
-    specifying the handle type of pname:fd.
-  * pname:fd is the external handle to import.
-
-Importing memory from a file descriptor transfers ownership of the file
-descriptor from the application to the Vulkan implementation.
-The application must: not perform any operations on the file descriptor
-after a successful import.
-The imported memory object holds a reference to its payload.
-
-Applications can: import the same payload into multiple instances of Vulkan,
-into the same instance from which it was exported, and multiple times into a
-given Vulkan instance.
-In all cases, each import operation must: create a distinct
-sname:VkDeviceMemory object.
-
-.Valid Usage
-****
-  * [[VUID-VkImportMemoryFdInfoKHR-handleType-00667]]
-    If pname:handleType is not `0`, it must: be supported for import, as
-    reported by slink:VkExternalImageFormatProperties or
-    slink:VkExternalBufferProperties
-  * [[VUID-VkImportMemoryFdInfoKHR-fd-00668]]
-    The memory from which pname:fd was exported must: have been created on
-    the same underlying physical device as pname:device
-  * [[VUID-VkImportMemoryFdInfoKHR-handleType-00669]]
-    If pname:handleType is not `0`, it must: be
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT or
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT
-  * [[VUID-VkImportMemoryFdInfoKHR-handleType-00670]]
-    If pname:handleType is not `0`, pname:fd must: be a valid handle of the
-    type specified by pname:handleType
-  * [[VUID-VkImportMemoryFdInfoKHR-fd-01746]]
-    The memory represented by pname:fd must: have been created from a
-    physical device and driver that is compatible with pname:device and
-    pname:handleType, as described in
-    <<external-memory-handle-types-compatibility>>
-  * [[VUID-VkImportMemoryFdInfoKHR-fd-01520]]
-    pname:fd must: obey any requirements listed for pname:handleType in
-    <<external-memory-handle-types-compatibility,external memory handle
-    types compatibility>>
-****
-
-include::{generated}/validity/structs/VkImportMemoryFdInfoKHR.txt[]
---
-
-[open,refpage='vkGetMemoryFdKHR',desc='Get a POSIX file descriptor for a memory object',type='protos']
---
-To export a POSIX file descriptor referencing the payload of a Vulkan device
-memory object, call:
-
-include::{generated}/api/protos/vkGetMemoryFdKHR.txt[]
-
-  * pname:device is the logical device that created the device memory being
-    exported.
-  * pname:pGetFdInfo is a pointer to a slink:VkMemoryGetFdInfoKHR structure
-    containing parameters of the export operation.
-  * pname:pFd will return a file descriptor referencing the payload of the
-    device memory object.
-
-Each call to fname:vkGetMemoryFdKHR must: create a new file descriptor
-holding a reference to the memory object's payload and transfer ownership of
-the file descriptor to the application.
-To avoid leaking resources, the application must: release ownership of the
-file descriptor using the code:close system call when it is no longer
-needed, or by importing a Vulkan memory object from it.
-Where supported by the operating system, the implementation must: set the
-file descriptor to be closed automatically when an code:execve system call
-is made.
-
-include::{generated}/validity/protos/vkGetMemoryFdKHR.txt[]
---
-
-[open,refpage='VkMemoryGetFdInfoKHR',desc='Structure describing a POSIX FD semaphore export operation',type='structs']
---
-The sname:VkMemoryGetFdInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkMemoryGetFdInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memory is the memory object from which the handle will be
-    exported.
-  * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value
-    specifying the type of handle requested.
-
-The properties of the file descriptor exported depend on the value of
-pname:handleType.
-See elink:VkExternalMemoryHandleTypeFlagBits for a description of the
-properties of the defined external memory handle types.
-
-ifdef::VK_EXT_external_memory_dma_buf[]
-[NOTE]
-.Note
-====
-The size of the exported file may: be larger than the size requested by
-slink:VkMemoryAllocateInfo::pname:allocationSize.
-If pname:handleType is ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
-then the application can: query the file's actual size with
-link:https://man7.org/linux/man-pages/man2/lseek.2.html[`lseek`].
-====
-endif::VK_EXT_external_memory_dma_buf[]
-
-.Valid Usage
-****
-  * [[VUID-VkMemoryGetFdInfoKHR-handleType-00671]]
-    pname:handleType must: have been included in
-    slink:VkExportMemoryAllocateInfo::pname:handleTypes when pname:memory
-    was created
-  * [[VUID-VkMemoryGetFdInfoKHR-handleType-00672]]
-    pname:handleType must: be
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT or
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT
-****
-
-include::{generated}/validity/structs/VkMemoryGetFdInfoKHR.txt[]
---
-
-[open,refpage='vkGetMemoryFdPropertiesKHR',desc='Get Properties of External Memory File Descriptors',type='protos']
---
-POSIX file descriptor memory handles compatible with Vulkan may: also be
-created by non-Vulkan APIs using methods beyond the scope of this
-specification.
-To determine the correct parameters to use when importing such handles,
-call:
-
-include::{generated}/api/protos/vkGetMemoryFdPropertiesKHR.txt[]
-
-  * pname:device is the logical device that will be importing pname:fd.
-  * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value
-    specifying the type of the handle pname:fd.
-  * pname:fd is the handle which will be imported.
-  * pname:pMemoryFdProperties is a pointer to a
-    slink:VkMemoryFdPropertiesKHR structure in which the properties of the
-    handle pname:fd are returned.
-
-.Valid Usage
-****
-  * [[VUID-vkGetMemoryFdPropertiesKHR-fd-00673]]
-    pname:fd must: be an external memory handle created outside of the
-    Vulkan API
-  * [[VUID-vkGetMemoryFdPropertiesKHR-handleType-00674]]
-    pname:handleType must: not be
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT
-****
-
-include::{generated}/validity/protos/vkGetMemoryFdPropertiesKHR.txt[]
---
-
-[open,refpage='VkMemoryFdPropertiesKHR',desc='Properties of External Memory File Descriptors',type='structs']
---
-The sname:VkMemoryFdPropertiesKHR structure returned is defined as:
-
-include::{generated}/api/structs/VkMemoryFdPropertiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memoryTypeBits is a bitmask containing one bit set for every
-    memory type which the specified file descriptor can: be imported as.
-
-include::{generated}/validity/structs/VkMemoryFdPropertiesKHR.txt[]
---
-endif::VK_KHR_external_memory_fd[]
-
-ifdef::VK_EXT_external_memory_host[]
-=== Host External Memory
-
-[open,refpage='VkImportMemoryHostPointerInfoEXT',desc='Import memory from a host pointer',type='structs']
---
-To import memory from a host pointer, add a
-slink:VkImportMemoryHostPointerInfoEXT structure to the pname:pNext chain of
-the slink:VkMemoryAllocateInfo structure.
-The sname:VkImportMemoryHostPointerInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkImportMemoryHostPointerInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value
-    specifying the handle type.
-  * pname:pHostPointer is the host pointer to import from.
-
-Importing memory from a host pointer shares ownership of the memory between
-the host and the Vulkan implementation.
-The application can: continue to access the memory through the host pointer
-but it is the application's responsibility to synchronize device and
-non-device access to the payload as defined in
-<<memory-device-hostaccess,Host Access to Device Memory Objects>>.
-
-Applications can: import the same payload into multiple instances of Vulkan
-and multiple times into a given Vulkan instance.
-However, implementations may: fail to import the same payload multiple times
-into a given physical device due to platform constraints.
-
-Importing memory from a particular host pointer may: not be possible due to
-additional platform-specific restrictions beyond the scope of this
-specification in which case the implementation must: fail the memory import
-operation with the error code ename:VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR.
-
-Whether device memory objects imported from a host pointer hold a reference
-to their payload is undefined:.
-As such, the application must: ensure that the imported memory range remains
-valid and accessible for the lifetime of the imported memory object.
-
-.Valid Usage
-****
-  * [[VUID-VkImportMemoryHostPointerInfoEXT-handleType-01747]]
-    If pname:handleType is not `0`, it must: be supported for import, as
-    reported in slink:VkExternalMemoryProperties
-  * [[VUID-VkImportMemoryHostPointerInfoEXT-handleType-01748]]
-    If pname:handleType is not `0`, it must: be
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT or
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT
-  * [[VUID-VkImportMemoryHostPointerInfoEXT-pHostPointer-01749]]
-    pname:pHostPointer must: be a pointer aligned to an integer multiple of
-    sname:VkPhysicalDeviceExternalMemoryHostPropertiesEXT::pname:minImportedHostPointerAlignment
-  * [[VUID-VkImportMemoryHostPointerInfoEXT-handleType-01750]]
-    If pname:handleType is
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT,
-    pname:pHostPointer must: be a pointer to pname:allocationSize number of
-    bytes of host memory, where pname:allocationSize is the member of the
-    sname:VkMemoryAllocateInfo structure this structure is chained to
-  * [[VUID-VkImportMemoryHostPointerInfoEXT-handleType-01751]]
-    If pname:handleType is
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT,
-    pname:pHostPointer must: be a pointer to pname:allocationSize number of
-    bytes of host mapped foreign memory, where pname:allocationSize is the
-    member of the sname:VkMemoryAllocateInfo structure this structure is
-    chained to
-****
-
-include::{generated}/validity/structs/VkImportMemoryHostPointerInfoEXT.txt[]
---
-
-[open,refpage='vkGetMemoryHostPointerPropertiesEXT',desc='Get properties of external memory host pointer',type='protos']
---
-To determine the correct parameters to use when importing host pointers,
-call:
-
-include::{generated}/api/protos/vkGetMemoryHostPointerPropertiesEXT.txt[]
-
-  * pname:device is the logical device that will be importing
-    pname:pHostPointer.
-  * pname:handleType is a elink:VkExternalMemoryHandleTypeFlagBits value
-    specifying the type of the handle pname:pHostPointer.
-  * pname:pHostPointer is the host pointer to import from.
-  * pname:pMemoryHostPointerProperties is a pointer to a
-    slink:VkMemoryHostPointerPropertiesEXT structure in which the host
-    pointer properties are returned.
-
-.Valid Usage
-****
-  * [[VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01752]]
-    pname:handleType must: be
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT or
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT
-  * [[VUID-vkGetMemoryHostPointerPropertiesEXT-pHostPointer-01753]]
-    pname:pHostPointer must: be a pointer aligned to an integer multiple of
-    sname:VkPhysicalDeviceExternalMemoryHostPropertiesEXT::pname:minImportedHostPointerAlignment
-  * [[VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01754]]
-    If pname:handleType is
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT,
-    pname:pHostPointer must: be a pointer to host memory
-  * [[VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01755]]
-    If pname:handleType is
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT,
-    pname:pHostPointer must: be a pointer to host mapped foreign memory
-****
-
-include::{generated}/validity/protos/vkGetMemoryHostPointerPropertiesEXT.txt[]
---
-
-[open,refpage='VkMemoryHostPointerPropertiesEXT',desc='Properties of external memory host pointer',type='structs']
---
-The sname:VkMemoryHostPointerPropertiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkMemoryHostPointerPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memoryTypeBits is a bitmask containing one bit set for every
-    memory type which the specified host pointer can: be imported as.
-
-The value returned by pname:memoryTypeBits must: only include bits that
-identify memory types which are host visible.
-
-include::{generated}/validity/structs/VkMemoryHostPointerPropertiesEXT.txt[]
---
-
-endif::VK_EXT_external_memory_host[]
-
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-=== Android Hardware Buffer External Memory
-
-[open,refpage='VkImportAndroidHardwareBufferInfoANDROID',desc='Import memory from an Android hardware buffer',type='structs']
---
-To import memory created outside of the current Vulkan instance from an
-Android hardware buffer, add a
-sname:VkImportAndroidHardwareBufferInfoANDROID structure to the pname:pNext
-chain of the slink:VkMemoryAllocateInfo structure.
-The sname:VkImportAndroidHardwareBufferInfoANDROID structure is defined as:
-
-include::{generated}/api/structs/VkImportAndroidHardwareBufferInfoANDROID.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:buffer is the Android hardware buffer to import.
-
-If the flink:vkAllocateMemory command succeeds, the implementation must:
-acquire a reference to the imported hardware buffer, which it must: release
-when the device memory object is freed.
-If the command fails, the implementation must: not retain a reference.
-
-.Valid Usage
-****
-  * [[VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01880]]
-    If pname:buffer is not `NULL`, Android hardware buffers must: be
-    supported for import, as reported by
-    slink:VkExternalImageFormatProperties or
-    slink:VkExternalBufferProperties
-  * [[VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01881]]
-    If pname:buffer is not `NULL`, it must: be a valid Android hardware
-    buffer object with code:AHardwareBuffer_Desc::code:usage compatible with
-    Vulkan as described in <<memory-external-android-hardware-buffer,Android
-    Hardware Buffers>>
-****
-
-include::{generated}/validity/structs/VkImportAndroidHardwareBufferInfoANDROID.txt[]
---
-
-[open,refpage='vkGetMemoryAndroidHardwareBufferANDROID',desc='Get an Android hardware buffer for a memory object',type='protos']
---
-To export an Android hardware buffer referencing the payload of a Vulkan
-device memory object, call:
-
-include::{generated}/api/protos/vkGetMemoryAndroidHardwareBufferANDROID.txt[]
-
-  * pname:device is the logical device that created the device memory being
-    exported.
-  * pname:pInfo is a pointer to a
-    slink:VkMemoryGetAndroidHardwareBufferInfoANDROID structure containing
-    parameters of the export operation.
-  * pname:pBuffer will return an Android hardware buffer referencing the
-    payload of the device memory object.
-
-Each call to fname:vkGetMemoryAndroidHardwareBufferANDROID must: return an
-Android hardware buffer with a new reference acquired in addition to the
-reference held by the slink:VkDeviceMemory.
-To avoid leaking resources, the application must: release the reference by
-calling code:AHardwareBuffer_release when it is no longer needed.
-When called with the same handle in
-slink:VkMemoryGetAndroidHardwareBufferInfoANDROID::pname:memory,
-fname:vkGetMemoryAndroidHardwareBufferANDROID must: return the same Android
-hardware buffer object.
-If the device memory was created by importing an Android hardware buffer,
-fname:vkGetMemoryAndroidHardwareBufferANDROID must: return that same Android
-hardware buffer object.
-
-include::{generated}/validity/protos/vkGetMemoryAndroidHardwareBufferANDROID.txt[]
---
-
-[open,refpage='VkMemoryGetAndroidHardwareBufferInfoANDROID',desc='Structure describing an Android hardware buffer memory export operation',type='structs']
---
-The sname:VkMemoryGetAndroidHardwareBufferInfoANDROID structure is defined
-as:
-
-include::{generated}/api/structs/VkMemoryGetAndroidHardwareBufferInfoANDROID.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memory is the memory object from which the Android hardware buffer
-    will be exported.
-
-.Valid Usage
-****
-  * [[VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-handleTypes-01882]]
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID
-    must: have been included in
-    slink:VkExportMemoryAllocateInfo::pname:handleTypes when pname:memory
-    was created
-  * [[VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-pNext-01883]]
-    If the pname:pNext chain of the slink:VkMemoryAllocateInfo used to
-    allocate pname:memory included a slink:VkMemoryDedicatedAllocateInfo
-    with non-`NULL` pname:image member, then that pname:image must: already
-    be bound to pname:memory
-****
-
-include::{generated}/validity/structs/VkMemoryGetAndroidHardwareBufferInfoANDROID.txt[]
---
-
-[open,refpage='vkGetAndroidHardwareBufferPropertiesANDROID',desc='Get Properties of External Memory Android Hardware Buffers',type='protos']
---
-To determine the memory parameters to use when importing an Android hardware
-buffer, call:
-
-include::{generated}/api/protos/vkGetAndroidHardwareBufferPropertiesANDROID.txt[]
-
-  * pname:device is the logical device that will be importing pname:buffer.
-  * pname:buffer is the Android hardware buffer which will be imported.
-  * pname:pProperties is a pointer to a
-    slink:VkAndroidHardwareBufferPropertiesANDROID structure in which the
-    properties of pname:buffer are returned.
-
-.Valid Usage
-****
-  * [[VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-01884]]
-    pname:buffer must: be a valid Android hardware buffer object with at
-    least one of the code:AHARDWAREBUFFER_USAGE_GPU_* flags in its
-    code:AHardwareBuffer_Desc::code:usage
-****
-
-include::{generated}/validity/protos/vkGetAndroidHardwareBufferPropertiesANDROID.txt[]
---
-
-[open,refpage='VkAndroidHardwareBufferPropertiesANDROID',desc='Properties of External Memory Android Hardware Buffers',type='structs']
---
-The sname:VkAndroidHardwareBufferPropertiesANDROID structure returned is
-defined as:
-
-include::{generated}/api/structs/VkAndroidHardwareBufferPropertiesANDROID.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:allocationSize is the size of the external memory
-  * pname:memoryTypeBits is a bitmask containing one bit set for every
-    memory type which the specified Android hardware buffer can: be imported
-    as.
-
-include::{generated}/validity/structs/VkAndroidHardwareBufferPropertiesANDROID.txt[]
---
-
-[open,refpage='VkAndroidHardwareBufferFormatPropertiesANDROID',desc='Structure describing the image format properties of an Android hardware buffer',type='structs']
---
-To obtain format properties of an Android hardware buffer, include a
-sname:VkAndroidHardwareBufferFormatPropertiesANDROID structure in the
-pname:pNext chain of the slink:VkAndroidHardwareBufferPropertiesANDROID
-structure passed to flink:vkGetAndroidHardwareBufferPropertiesANDROID.
-This structure is defined as:
-
-include::{generated}/api/structs/VkAndroidHardwareBufferFormatPropertiesANDROID.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:format is the Vulkan format corresponding to the Android hardware
-    buffer's format, or ename:VK_FORMAT_UNDEFINED if there is not an
-    equivalent Vulkan format.
-  * pname:externalFormat is an implementation-defined external format
-    identifier for use with slink:VkExternalFormatANDROID.
-    It must: not be zero.
-  * pname:formatFeatures describes the capabilities of this external format
-    when used with an image bound to memory imported from pname:buffer.
-  * pname:samplerYcbcrConversionComponents is the component swizzle that
-    should: be used in slink:VkSamplerYcbcrConversionCreateInfo.
-  * pname:suggestedYcbcrModel is a suggested color model to use in the
-    slink:VkSamplerYcbcrConversionCreateInfo.
-  * pname:suggestedYcbcrRange is a suggested numerical value range to use in
-    slink:VkSamplerYcbcrConversionCreateInfo.
-  * pname:suggestedXChromaOffset is a suggested X chroma offset to use in
-    slink:VkSamplerYcbcrConversionCreateInfo.
-  * pname:suggestedYChromaOffset is a suggested Y chroma offset to use in
-    slink:VkSamplerYcbcrConversionCreateInfo.
-
-If the Android hardware buffer has one of the formats listed in the
-<<memory-external-android-hardware-buffer-formats,Format Equivalence
-table>>, then pname:format must: have the equivalent Vulkan format listed in
-the table.
-Otherwise, pname:format may: be ename:VK_FORMAT_UNDEFINED, indicating the
-Android hardware buffer can: only be used with an external format.
-
-The pname:formatFeatures member must: include
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT and at least one of
-ename:VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT or
-ename:VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT, and should: include
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT and
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT.
-
-[NOTE]
-.Note
-====
-The pname:formatFeatures member only indicates the features available when
-using an
-<<memory-external-android-hardware-buffer-external-formats,external-format
-image>> created from the Android hardware buffer.
-Images from Android hardware buffers with a format other than
-ename:VK_FORMAT_UNDEFINED are subject to the format capabilities obtained
-from flink:vkGetPhysicalDeviceFormatProperties2, and
-flink:vkGetPhysicalDeviceImageFormatProperties2 with appropriate parameters.
-These sets of features are independent of each other, e.g. the external
-format will support sampler {YCbCr} conversion even if the non-external
-format does not, and writing to non-external format images is possible but
-writing to external format images is not.
-====
-
-Android hardware buffers with the same external format must: have the same
-support for ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT,
-ename:VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT,
-ename:VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT,
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT,
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT,
-and
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT.
-in pname:formatFeatures.
-Other format features may: differ between Android hardware buffers that have
-the same external format.
-This allows applications to use the same slink:VkSamplerYcbcrConversion
-object (and samplers and pipelines created from them) for any Android
-hardware buffers that have the same external format.
-
-If pname:format is not ename:VK_FORMAT_UNDEFINED, then the value of
-pname:samplerYcbcrConversionComponents must: be valid when used as the
-pname:components member of slink:VkSamplerYcbcrConversionCreateInfo with
-that format.
-If pname:format is ename:VK_FORMAT_UNDEFINED, all members of
-pname:samplerYcbcrConversionComponents must: be the
-<<resources-image-views-identity-mappings,identity swizzle>>.
-
-Implementations may: not always be able to determine the color model,
-numerical range, or chroma offsets of the image contents, so the values in
-sname:VkAndroidHardwareBufferFormatPropertiesANDROID are only suggestions.
-Applications should: treat these values as sensible defaults to use in the
-absence of more reliable information obtained through some other means.
-If the underlying physical device is also usable via OpenGL ES with the
-https://www.khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image_external.txt[`GL_OES_EGL_image_external`]
-extension, the implementation should: suggest values that will produce
-similar sampled values as would be obtained by sampling the same external
-image via code:samplerExternalOES in OpenGL ES using equivalent sampler
-parameters.
-
-[NOTE]
-.Note
-====
-Since
-https://www.khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image_external.txt[`GL_OES_EGL_image_external`]
-does not require the same sampling and conversion calculations as Vulkan
-does, achieving identical results between APIs may: not be possible on some
-implementations.
-====
-
-include::{generated}/validity/structs/VkAndroidHardwareBufferFormatPropertiesANDROID.txt[]
---
-
-ifdef::VK_KHR_format_feature_flags2[]
-[open,refpage='VkAndroidHardwareBufferFormatProperties2ANDROID',desc='Structure describing the image format properties of an Android hardware buffer',type='structs']
---
-The format properties of an Android hardware buffer can: be obtained by
-including a sname:VkAndroidHardwareBufferFormatProperties2ANDROID structure
-in the pname:pNext chain of the
-slink:VkAndroidHardwareBufferPropertiesANDROID structure passed to
-flink:vkGetAndroidHardwareBufferPropertiesANDROID.
-This structure is defined as:
-
-include::{generated}/api/structs/VkAndroidHardwareBufferFormatProperties2ANDROID.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:format is the Vulkan format corresponding to the Android hardware
-    buffer's format, or ename:VK_FORMAT_UNDEFINED if there is not an
-    equivalent Vulkan format.
-  * pname:externalFormat is an implementation-defined external format
-    identifier for use with slink:VkExternalFormatANDROID.
-    It must: not be zero.
-  * pname:formatFeatures describes the capabilities of this external format
-    when used with an image bound to memory imported from pname:buffer.
-  * pname:samplerYcbcrConversionComponents is the component swizzle that
-    should: be used in slink:VkSamplerYcbcrConversionCreateInfo.
-  * pname:suggestedYcbcrModel is a suggested color model to use in the
-    slink:VkSamplerYcbcrConversionCreateInfo.
-  * pname:suggestedYcbcrRange is a suggested numerical value range to use in
-    slink:VkSamplerYcbcrConversionCreateInfo.
-  * pname:suggestedXChromaOffset is a suggested X chroma offset to use in
-    slink:VkSamplerYcbcrConversionCreateInfo.
-  * pname:suggestedYChromaOffset is a suggested Y chroma offset to use in
-    slink:VkSamplerYcbcrConversionCreateInfo.
-
-The bits reported in pname:formatFeatures must: include the bits reported in
-the corresponding fields of
-sname:VkAndroidHardwareBufferFormatPropertiesANDROID::pname:formatFeatures.
-
-include::{generated}/validity/structs/VkAndroidHardwareBufferFormatProperties2ANDROID.txt[]
---
-endif::VK_KHR_format_feature_flags2[]
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-
-ifdef::VK_NV_external_memory_rdma[]
-[open,refpage='vkGetMemoryRemoteAddressNV',desc='Get an address for a memory object accessible by remote devices',type='protos']
---
-To export an address representing the payload of a Vulkan device memory
-object accessible by remote devices, call:
-
-include::{generated}/api/protos/vkGetMemoryRemoteAddressNV.txt[]
-
-  * pname:device is the logical device that created the device memory being
-    exported.
-  * pname:pMemoryGetRemoteAddressInfo is a pointer to a
-    slink:VkMemoryGetRemoteAddressInfoNV structure containing parameters of
-    the export operation.
-  * pname:pAddress will return the address representing the payload of the
-    device memory object.
-
-More communication may be required between the kernel-mode drivers of the
-devices involved.
-This information is out of scope of this documentation and should be
-requested from the vendors of the devices.
-
-include::{generated}/validity/protos/vkGetMemoryRemoteAddressNV.txt[]
---
-
-[open,refpage='VkMemoryGetRemoteAddressInfoNV',desc='Structure describing a remote accessible address export operation',type='structs']
---
-The sname:VkMemoryGetRemoteAddressInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkMemoryGetRemoteAddressInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memory is the memory object from which the remote accessible
-    address will be exported.
-  * pname:handleType is the type of handle requested.
-
-.Valid Usage
-****
-  * [[VUID-VkMemoryGetRemoteAddressInfoNV-handleType-04966]]
-    pname:handleType must: have been included in
-    slink:VkExportMemoryAllocateInfo::pname:handleTypes when pname:memory
-    was created
-****
-
-include::{generated}/validity/structs/VkMemoryGetRemoteAddressInfoNV.txt[]
---
-endif::VK_NV_external_memory_rdma[]
-
-ifdef::VK_FUCHSIA_external_memory[]
-include::VK_FUCHSIA_external_memory/device_memory.txt[]
-endif::VK_FUCHSIA_external_memory[]
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-=== Device Group Memory Allocations
-
-[open,refpage='VkMemoryAllocateFlagsInfo',desc='Structure controlling how many instances of memory will be allocated',type='structs']
---
-If the pname:pNext chain of slink:VkMemoryAllocateInfo includes a
-sname:VkMemoryAllocateFlagsInfo structure, then that structure includes
-flags and a device mask controlling how many instances of the memory will be
-allocated.
-
-The sname:VkMemoryAllocateFlagsInfo structure is defined as:
-
-include::{generated}/api/structs/VkMemoryAllocateFlagsInfo.txt[]
-
-ifdef::VK_KHR_device_group[]
-or the equivalent
-
-include::{generated}/api/structs/VkMemoryAllocateFlagsInfoKHR.txt[]
-endif::VK_KHR_device_group[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkMemoryAllocateFlagBits controlling
-    the allocation.
-  * pname:deviceMask is a mask of physical devices in the logical device,
-    indicating that memory must: be allocated on each device in the mask, if
-    ename:VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT is set in pname:flags.
-
-If ename:VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT is not set, the number of
-instances allocated depends on whether
-ename:VK_MEMORY_HEAP_MULTI_INSTANCE_BIT is set in the memory heap.
-If ename:VK_MEMORY_HEAP_MULTI_INSTANCE_BIT is set, then memory is allocated
-for every physical device in the logical device (as if pname:deviceMask has
-bits set for all device indices).
-If ename:VK_MEMORY_HEAP_MULTI_INSTANCE_BIT is not set, then a single
-instance of memory is allocated (as if pname:deviceMask is set to one).
-
-On some implementations, allocations from a multi-instance heap may: consume
-memory on all physical devices even if the pname:deviceMask excludes some
-devices.
-If slink:VkPhysicalDeviceGroupProperties::pname:subsetAllocation is
-ename:VK_TRUE, then memory is only consumed for the devices in the device
-mask.
-
-[NOTE]
-.Note
-====
-In practice, most allocations on a multi-instance heap will be allocated
-across all physical devices.
-Unicast allocation support is an optional optimization for a minority of
-allocations.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkMemoryAllocateFlagsInfo-deviceMask-00675]]
-    If ename:VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT is set, pname:deviceMask
-    must: be a valid device mask
-  * [[VUID-VkMemoryAllocateFlagsInfo-deviceMask-00676]]
-    If ename:VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT is set, pname:deviceMask
-    must: not be zero
-****
-
-include::{generated}/validity/structs/VkMemoryAllocateFlagsInfo.txt[]
---
-
-[open,refpage='VkMemoryAllocateFlagBits',desc='Bitmask specifying flags for a device memory allocation',type='enums']
---
-Bits which can: be set in slink:VkMemoryAllocateFlagsInfo::pname:flags,
-controlling device memory allocation, are:
-
-include::{generated}/api/enums/VkMemoryAllocateFlagBits.txt[]
-
-ifdef::VK_KHR_device_group[]
-or the equivalent
-
-include::{generated}/api/enums/VkMemoryAllocateFlagBitsKHR.txt[]
-endif::VK_KHR_device_group[]
-
-  * ename:VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT specifies that memory will be
-    allocated for the devices in
-    slink:VkMemoryAllocateFlagsInfo::pname:deviceMask.
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-  * ename:VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT specifies that the memory
-    can: be attached to a buffer object created with the
-    ename:VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT bit set in pname:usage,
-    and that the memory handle can: be used to retrieve an opaque address
-    via flink:vkGetDeviceMemoryOpaqueCaptureAddress.
-  * ename:VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT specifies
-    that the memory's address can: be saved and reused on a subsequent run
-    (e.g. for trace capture and replay), see
-    slink:VkBufferOpaqueCaptureAddressCreateInfo for more detail.
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
---
-
-[open,refpage='VkMemoryAllocateFlags',desc='Bitmask of VkMemoryAllocateFlagBits',type='flags']
---
-include::{generated}/api/flags/VkMemoryAllocateFlags.txt[]
-
-ifdef::VK_KHR_device_group[]
-or the equivalent
-
-include::{generated}/api/flags/VkMemoryAllocateFlagsKHR.txt[]
-endif::VK_KHR_device_group[]
-
-tname:VkMemoryAllocateFlags is a bitmask type for setting a mask of zero or
-more elink:VkMemoryAllocateFlagBits.
---
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-=== Opaque Capture Address Allocation
-
-[open,refpage='VkMemoryOpaqueCaptureAddressAllocateInfo',desc='Request a specific address for a memory allocation',type='structs',alias='VkMemoryOpaqueCaptureAddressAllocateInfoKHR']
---
-To request a specific device address for a memory allocation, add a
-slink:VkMemoryOpaqueCaptureAddressAllocateInfo structure to the pname:pNext
-chain of the slink:VkMemoryAllocateInfo structure.
-The sname:VkMemoryOpaqueCaptureAddressAllocateInfo structure is defined as:
-
-include::{generated}/api/structs/VkMemoryOpaqueCaptureAddressAllocateInfo.txt[]
-
-ifdef::VK_KHR_buffer_device_address[]
-or the equivalent
-
-include::{generated}/api/structs/VkMemoryOpaqueCaptureAddressAllocateInfoKHR.txt[]
-endif::VK_KHR_buffer_device_address[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:opaqueCaptureAddress is the opaque capture address requested for
-    the memory allocation.
-
-If pname:opaqueCaptureAddress is zero, no specific address is requested.
-
-If pname:opaqueCaptureAddress is not zero, it should: be an address
-retrieved from flink:vkGetDeviceMemoryOpaqueCaptureAddress on an identically
-created memory allocation on the same implementation.
-
-[NOTE]
-.Note
-====
-In most cases, it is expected that a non-zero pname:opaqueAddress is an
-address retrieved from flink:vkGetDeviceMemoryOpaqueCaptureAddress on an
-identically created memory allocation.
-If this is not the case, it is likely that
-ename:VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS errors will occur.
-
-This is, however, not a strict requirement because trace capture/replay
-tools may need to adjust memory allocation parameters for imported memory.
-====
-
-If this structure is not present, it is as if pname:opaqueCaptureAddress is
-zero.
-
-include::{generated}/validity/structs/VkMemoryOpaqueCaptureAddressAllocateInfo.txt[]
---
-
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-
-
-=== Freeing Device Memory
-
-[open,refpage='vkFreeMemory',desc='Free device memory',type='protos']
---
-To free a memory object, call:
-
-include::{generated}/api/protos/vkFreeMemory.txt[]
-
-  * pname:device is the logical device that owns the memory.
-  * pname:memory is the slink:VkDeviceMemory object to be freed.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-Before freeing a memory object, an application must: ensure the memory
-object is no longer in use by the device -- for example by command buffers
-in the _pending state_.
-Memory can: be freed whilst still bound to resources, but those resources
-must: not be used afterwards.
-Freeing a memory object releases the reference it held, if any, to its
-payload.
-If there are still any bound images or buffers, the memory object's payload
-may: not be immediately released by the implementation, but must: be
-released by the time all bound images and buffers have been destroyed.
-Once all references to a payload are released, it is returned to the heap
-from which it was allocated.
-
-How memory objects are bound to Images and Buffers is described in detail in
-the <<resources-association, Resource Memory Association>> section.
-
-If a memory object is mapped at the time it is freed, it is implicitly
-unmapped.
-
-[NOTE]
-.Note
-====
-As described <<memory-device-unmap-does-not-flush, below>>, host writes are
-not implicitly flushed when the memory object is unmapped, but the
-implementation must: guarantee that writes that have not been flushed do not
-affect any other memory.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkFreeMemory-memory-00677]]
-    All submitted commands that refer to pname:memory (via images or
-    buffers) must: have completed execution
-****
-
-include::{generated}/validity/protos/vkFreeMemory.txt[]
---
-
-
-[[memory-device-hostaccess]]
-=== Host Access to Device Memory Objects
-
-Memory objects created with flink:vkAllocateMemory are not directly host
-accessible.
-
-Memory objects created with the memory property
-ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT are considered _mappable_.
-Memory objects must: be mappable in order to be successfully mapped on the
-host.
-
-[open,refpage='vkMapMemory',desc='Map a memory object into application address space',type='protos']
---
-To retrieve a host virtual address pointer to a region of a mappable memory
-object, call:
-
-include::{generated}/api/protos/vkMapMemory.txt[]
-
-  * pname:device is the logical device that owns the memory.
-  * pname:memory is the slink:VkDeviceMemory object to be mapped.
-  * pname:offset is a zero-based byte offset from the beginning of the
-    memory object.
-  * pname:size is the size of the memory range to map, or
-    ename:VK_WHOLE_SIZE to map from pname:offset to the end of the
-    allocation.
-  * pname:flags is reserved for future use.
-  * pname:ppData is a pointer to a `void *` variable in which is returned a
-    host-accessible pointer to the beginning of the mapped range.
-    This pointer minus pname:offset must: be aligned to at least
-    slink:VkPhysicalDeviceLimits::pname:minMemoryMapAlignment.
-
-After a successful call to fname:vkMapMemory the memory object pname:memory
-is considered to be currently _host mapped_.
-
-[NOTE]
-.Note
-====
-It is an application error to call fname:vkMapMemory on a memory object that
-is already _host mapped_.
-====
-
-[NOTE]
-.Note
-====
-fname:vkMapMemory will fail if the implementation is unable to allocate an
-appropriately sized contiguous virtual address range, e.g. due to virtual
-address space fragmentation or platform limits.
-In such cases, fname:vkMapMemory must: return
-ename:VK_ERROR_MEMORY_MAP_FAILED.
-The application can: improve the likelihood of success by reducing the size
-of the mapped range and/or removing unneeded mappings using
-flink:vkUnmapMemory.
-====
-
-[[memory-device-hostaccess-hazards]]
-fname:vkMapMemory does not check whether the device memory is currently in
-use before returning the host-accessible pointer.
-The application must: guarantee that any previously submitted command that
-writes to this range has completed before the host reads from or writes to
-that range, and that any previously submitted command that reads from that
-range has completed before the host writes to that region (see
-<<synchronization-submission-host-writes, here>> for details on fulfilling
-such a guarantee).
-If the device memory was allocated without the
-ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT set, these guarantees must: be
-made for an extended range: the application must: round down the start of
-the range to the nearest multiple of
-slink:VkPhysicalDeviceLimits::pname:nonCoherentAtomSize, and round the end
-of the range up to the nearest multiple of
-slink:VkPhysicalDeviceLimits::pname:nonCoherentAtomSize.
-
-While a range of device memory is host mapped, the application is
-responsible for synchronizing both device and host access to that memory
-range.
-
-[NOTE]
-.Note
-====
-It is important for the application developer to become meticulously
-familiar with all of the mechanisms described in the chapter on
-<<synchronization, Synchronization and Cache Control>> as they are crucial
-to maintaining memory access ordering.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkMapMemory-memory-00678]]
-    pname:memory must: not be currently host mapped
-  * [[VUID-vkMapMemory-offset-00679]]
-    pname:offset must: be less than the size of pname:memory
-  * [[VUID-vkMapMemory-size-00680]]
-    If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:size must: be
-    greater than `0`
-  * [[VUID-vkMapMemory-size-00681]]
-    If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:size must: be
-    less than or equal to the size of the pname:memory minus pname:offset
-  * [[VUID-vkMapMemory-memory-00682]]
-    pname:memory must: have been created with a memory type that reports
-    ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
-ifdef::VK_KHR_device_group[]
-  * [[VUID-vkMapMemory-memory-00683]]
-    pname:memory must: not have been allocated with multiple instances
-endif::VK_KHR_device_group[]
-****
-
-include::{generated}/validity/protos/vkMapMemory.txt[]
---
-
-[open,refpage='VkMemoryMapFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkMemoryMapFlags.txt[]
-
-tname:VkMemoryMapFlags is a bitmask type for setting a mask, but is
-currently reserved for future use.
---
-
-Two commands are provided to enable applications to work with non-coherent
-memory allocations: fname:vkFlushMappedMemoryRanges and
-fname:vkInvalidateMappedMemoryRanges.
-
-[NOTE]
-.Note
-====
-If the memory object was created with the
-ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT set,
-fname:vkFlushMappedMemoryRanges and fname:vkInvalidateMappedMemoryRanges are
-unnecessary and may: have a performance cost.
-However, <<synchronization-dependencies-available-and-visible, availability
-and visibility operations>> still need to be managed on the device.
-See the description of <<synchronization-host-access-types, host access
-types>> for more information.
-====
-
-ifdef::VK_EXT_external_memory_host[]
-[NOTE]
-.Note
-====
-While memory objects imported from a handle type of
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT or
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT are
-inherently mapped to host address space, they are not considered to be host
-mapped device memory unless they are explicitly host mapped using
-flink:vkMapMemory.
-That means flushing or invalidating host caches with respect to host
-accesses performed on such memory through the original host pointer
-specified at import time is the responsibility of the application and must:
-be performed with appropriate synchronization primitives provided by the
-platform which are outside the scope of Vulkan.
-fname:vkFlushMappedMemoryRanges and fname:vkInvalidateMappedMemoryRanges,
-however, can: still be used on such memory objects to synchronize host
-accesses performed through the host pointer of the host mapped device memory
-range returned by flink:vkMapMemory.
-====
-endif::VK_EXT_external_memory_host[]
-
-[open,refpage='vkFlushMappedMemoryRanges',desc='Flush mapped memory ranges',type='protos']
---
-To flush ranges of non-coherent memory from the host caches, call:
-
-include::{generated}/api/protos/vkFlushMappedMemoryRanges.txt[]
-
-  * pname:device is the logical device that owns the memory ranges.
-  * pname:memoryRangeCount is the length of the pname:pMemoryRanges array.
-  * pname:pMemoryRanges is a pointer to an array of
-    slink:VkMappedMemoryRange structures describing the memory ranges to
-    flush.
-
-fname:vkFlushMappedMemoryRanges guarantees that host writes to the memory
-ranges described by pname:pMemoryRanges are made available to the host
-memory domain, such that they can: be made available to the device memory
-domain via <<synchronization-dependencies-available-and-visible, memory
-domain operations>> using the ename:VK_ACCESS_HOST_WRITE_BIT
-<<synchronization-access-types,access type>>.
-
-Within each range described by pname:pMemoryRanges, each set of
-pname:nonCoherentAtomSize bytes in that range is flushed if any byte in that
-set has been written by the host since it was first host mapped, or the last
-time it was flushed.
-If pname:pMemoryRanges includes sets of pname:nonCoherentAtomSize bytes
-where no bytes have been written by the host, those bytes must: not be
-flushed.
-
-[[memory-device-unmap-does-not-flush]]
-Unmapping non-coherent memory does not implicitly flush the host mapped
-memory, and host writes that have not been flushed may: not ever be visible
-to the device.
-However, implementations must: ensure that writes that have not been flushed
-do not become visible to any other memory.
-
-[NOTE]
-.Note
-====
-The above guarantee avoids a potential memory corruption in scenarios where
-host writes to a mapped memory object have not been flushed before the
-memory is unmapped (or freed), and the virtual address range is subsequently
-reused for a different mapping (or memory allocation).
-====
-
-include::{generated}/validity/protos/vkFlushMappedMemoryRanges.txt[]
---
-
-[open,refpage='vkInvalidateMappedMemoryRanges',desc='Invalidate ranges of mapped memory objects',type='protos']
---
-To invalidate ranges of non-coherent memory from the host caches, call:
-
-include::{generated}/api/protos/vkInvalidateMappedMemoryRanges.txt[]
-
-  * pname:device is the logical device that owns the memory ranges.
-  * pname:memoryRangeCount is the length of the pname:pMemoryRanges array.
-  * pname:pMemoryRanges is a pointer to an array of
-    slink:VkMappedMemoryRange structures describing the memory ranges to
-    invalidate.
-
-fname:vkInvalidateMappedMemoryRanges guarantees that device writes to the
-memory ranges described by pname:pMemoryRanges, which have been made
-available to the host memory domain using the ename:VK_ACCESS_HOST_WRITE_BIT
-and ename:VK_ACCESS_HOST_READ_BIT <<synchronization-access-types, access
-types>>, are made visible to the host.
-If a range of non-coherent memory is written by the host and then
-invalidated without first being flushed, its contents are undefined:.
-
-Within each range described by pname:pMemoryRanges, each set of
-pname:nonCoherentAtomSize bytes in that range is invalidated if any byte in
-that set has been written by the device since it was first host mapped, or
-the last time it was invalidated.
-
-[NOTE]
-.Note
-====
-Mapping non-coherent memory does not implicitly invalidate that memory.
-====
-
-include::{generated}/validity/protos/vkInvalidateMappedMemoryRanges.txt[]
---
-
-[open,refpage='VkMappedMemoryRange',desc='Structure specifying a mapped memory range',type='structs']
---
-The sname:VkMappedMemoryRange structure is defined as:
-
-include::{generated}/api/structs/VkMappedMemoryRange.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memory is the memory object to which this range belongs.
-  * pname:offset is the zero-based byte offset from the beginning of the
-    memory object.
-  * pname:size is either the size of range, or ename:VK_WHOLE_SIZE to affect
-    the range from pname:offset to the end of the current mapping of the
-    allocation.
-
-.Valid Usage
-****
-  * [[VUID-VkMappedMemoryRange-memory-00684]]
-    pname:memory must: be currently host mapped
-  * [[VUID-VkMappedMemoryRange-size-00685]]
-    If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:offset and
-    pname:size must: specify a range contained within the currently mapped
-    range of pname:memory
-  * [[VUID-VkMappedMemoryRange-size-00686]]
-    If pname:size is equal to ename:VK_WHOLE_SIZE, pname:offset must: be
-    within the currently mapped range of pname:memory
-  * [[VUID-VkMappedMemoryRange-offset-00687]]
-    pname:offset must: be a multiple of
-    slink:VkPhysicalDeviceLimits::pname:nonCoherentAtomSize
-  * [[VUID-VkMappedMemoryRange-size-01389]]
-    If pname:size is equal to ename:VK_WHOLE_SIZE, the end of the current
-    mapping of pname:memory must: either be a multiple of
-    slink:VkPhysicalDeviceLimits::pname:nonCoherentAtomSize bytes from the
-    beginning of the memory object, or be equal to the end of the memory
-    object
-  * [[VUID-VkMappedMemoryRange-size-01390]]
-    If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:size must:
-    either be a multiple of
-    slink:VkPhysicalDeviceLimits::pname:nonCoherentAtomSize, or pname:offset
-    plus pname:size must: equal the size of pname:memory
-****
-
-include::{generated}/validity/structs/VkMappedMemoryRange.txt[]
---
-
-
-[open,refpage='vkUnmapMemory',desc='Unmap a previously mapped memory object',type='protos']
---
-To unmap a memory object once host access to it is no longer needed by the
-application, call:
-
-include::{generated}/api/protos/vkUnmapMemory.txt[]
-
-  * pname:device is the logical device that owns the memory.
-  * pname:memory is the memory object to be unmapped.
-
-.Valid Usage
-****
-  * [[VUID-vkUnmapMemory-memory-00689]]
-    pname:memory must: be currently host mapped
-****
-
-include::{generated}/validity/protos/vkUnmapMemory.txt[]
---
-
-
-[[memory-device-lazy_allocation]]
-=== Lazily Allocated Memory
-
-If the memory object is allocated from a heap with the
-ename:VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT bit set, that object's backing
-memory may: be provided by the implementation lazily.
-The actual committed size of the memory may: initially be as small as zero
-(or as large as the requested size), and monotonically increases as
-additional memory is needed.
-
-A memory type with this flag set is only allowed to be bound to a
-sname:VkImage whose usage flags include
-ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT.
-
-[NOTE]
-.Note
-====
-Using lazily allocated memory objects for framebuffer attachments that are
-not needed once a render pass instance has completed may: allow some
-implementations to never allocate memory for such attachments.
-====
-
-[open,refpage='vkGetDeviceMemoryCommitment',desc='Query the current commitment for a VkDeviceMemory',type='protos']
---
-To determine the amount of lazily-allocated memory that is currently
-committed for a memory object, call:
-
-include::{generated}/api/protos/vkGetDeviceMemoryCommitment.txt[]
-
-  * pname:device is the logical device that owns the memory.
-  * pname:memory is the memory object being queried.
-  * pname:pCommittedMemoryInBytes is a pointer to a basetype:VkDeviceSize
-    value in which the number of bytes currently committed is returned, on
-    success.
-
-The implementation may: update the commitment at any time, and the value
-returned by this query may: be out of date.
-
-The implementation guarantees to allocate any committed memory from the
-pname:heapIndex indicated by the memory type that the memory object was
-created with.
-
-.Valid Usage
-****
-  * [[VUID-vkGetDeviceMemoryCommitment-memory-00690]]
-    pname:memory must: have been created with a memory type that reports
-    ename:VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT
-****
-
-include::{generated}/validity/protos/vkGetDeviceMemoryCommitment.txt[]
---
-
-
-ifdef::VK_VERSION_1_1[]
-[[memory-protected-memory]]
-=== Protected Memory
-
-_Protected memory_ divides device memory into protected device memory and
-unprotected device memory.
-
-Protected memory adds the following concepts:
-
-  * Memory:
-  ** Unprotected device memory, which can: be visible to the device and can:
-     be visible to the host
-  ** Protected device memory, which can: be visible to the device but must:
-     not be visible to the host
-  * Resources:
-  ** Unprotected images and unprotected buffers, to which unprotected memory
-     can: be bound
-  ** Protected images and protected buffers, to which protected memory can:
-     be bound
-  * Command buffers:
-  ** Unprotected command buffers, which can: be submitted to a device queue
-     to execute unprotected queue operations
-  ** Protected command buffers, which can: be submitted to a
-     protected-capable device queue to execute protected queue operations
-  * Device queues:
-  ** Unprotected device queues, to which unprotected command buffers can: be
-     submitted
-  ** Protected-capable device queues, to which unprotected command buffers
-     or protected command buffers can: be submitted
-  * Queue submissions
-  ** Unprotected queue submissions, through which unprotected command
-     buffers can: be submitted
-  ** Protected queue submissions, through which protected command buffers
-     can: be submitted
-  * Queue operations
-  ** Unprotected queue operations
-  ** Protected queue operations
-
-[[memory-protected-access-rules]]
-==== Protected Memory Access Rules
-
-If slink:VkPhysicalDeviceProtectedMemoryProperties::pname:protectedNoFault
-is ename:VK_FALSE, applications must: not perform any of the following
-operations:
-
-  * Write to unprotected memory within protected queue operations.
-  * Access protected memory within protected queue operations other than in
-    framebuffer-space pipeline stages, the compute shader stage, or the
-    transfer stage.
-  * Perform a query within protected queue operations.
-
-If slink:VkPhysicalDeviceProtectedMemoryProperties::pname:protectedNoFault
-is ename:VK_TRUE, these operations are valid, but reads will return
-undefined: values, and writes will either be dropped or store undefined:
-values.
-
-Additionally, indirect operations must: not be performed within protected
-queue operations.
-
-Whether these operations are valid or not, or if any other invalid usage is
-performed, the implementation must: guarantee that:
-
-  * Protected device memory must: never be visible to the host.
-  * Values written to unprotected device memory must: not be a function of
-    values from protected memory.
-endif::VK_VERSION_1_1[]
-
-
-ifdef::VK_KHR_external_memory_capabilities+VK_ANDROID_external_memory_android_hardware_buffer[]
-[[memory-external-handle-types]]
-=== External Memory Handle Types
-
-
-[[memory-external-android-hardware-buffer]]
-==== Android Hardware Buffer
-
-Android's NDK defines basetype:AHardwareBuffer objects, which represent
-device memory that is shareable across processes and that can: be accessed
-by a variety of media APIs and the hardware used to implement them.
-These Android hardware buffer objects may: be imported into
-slink:VkDeviceMemory objects for access via Vulkan, or exported from Vulkan.
-An slink:VkImage or slink:VkBuffer can: be bound to the imported or exported
-slink:VkDeviceMemory object if it is created with
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID.
-
-[open,refpage='AHardwareBuffer',desc='Android hardware buffer type',type='basetypes']
---
-To remove an unnecessary compile-time dependency, an incomplete type
-definition of basetype:AHardwareBuffer is provided in the Vulkan headers:
-
-include::{generated}/api/basetypes/AHardwareBuffer.txt[]
-
-The actual basetype:AHardwareBuffer type is defined in Android NDK headers.
---
-
-[NOTE]
-.Note
-====
-The NDK format, usage, and size/dimensions of an basetype:AHardwareBuffer
-object can be obtained with the code:AHardwareBuffer_describe function.
-While Android hardware buffers can be imported to or exported from Vulkan
-without using that function, valid usage and implementation behavior is
-defined in terms of the code:AHardwareBuffer_Desc properties it returns.
-====
-
-Android hardware buffer objects are reference-counted using Android NDK
-functions outside of the scope of this specification.
-A slink:VkDeviceMemory imported from an Android hardware buffer or that can:
-be exported to an Android hardware buffer must: acquire a reference to its
-basetype:AHardwareBuffer object, and must: release this reference when the
-device memory is freed.
-During the host execution of a Vulkan command that has an Android hardware
-buffer as a parameter (including indirect parameters via pname:pNext
-chains), the application must: not decrement the Android hardware buffer's
-reference count to zero.
-
-Android hardware buffers can: be mapped and unmapped for CPU access using
-the NDK functions.
-These lock and unlock APIs are considered to acquire and release ownership
-of the Android hardware buffer, and applications must: follow the rules
-described in <<resources-external-sharing,External Resource Sharing>> to
-transfer ownership between the Vulkan instance and these native APIs.
-
-Android hardware buffers can: be shared with external APIs and Vulkan
-instances on the same device, and also with foreign devices.
-When transferring ownership of the Android hardware buffer, the external and
-foreign special queue families described in
-<<synchronization-queue-transfers>> are not identical.
-All APIs which produce or consume Android hardware buffers are considered to
-use foreign devices, except OpenGL ES contexts and Vulkan logical devices
-that have matching device and driver UUIDs.
-Implementations may: treat a transfer to or from the foreign queue family as
-if it were a transfer to or from the external queue family when the Android
-hardware buffer's usage only permits it to be used on the same physical
-device.
-
-
-[[memory-external-android-hardware-buffer-optimal-usages]]
-===== Android Hardware Buffer Optimal Usages =====
-
-Vulkan buffer and image usage flags do not correspond exactly to Android
-hardware buffer usage flags.
-When allocating Android hardware buffers with non-Vulkan APIs, if any
-code:AHARDWAREBUFFER_USAGE_GPU_* usage bits are included, by default the
-allocator must: allocate the memory in such a way that it supports Vulkan
-usages and creation flags in the
-<<memory-external-android-hardware-buffer-usage, usage equivalence table>>
-which do not have Android hardware buffer equivalents.
-
-An slink:VkAndroidHardwareBufferUsageANDROID structure can: be included in
-the pname:pNext chain of a slink:VkImageFormatProperties2 structure passed
-to flink:vkGetPhysicalDeviceImageFormatProperties2 to obtain optimal Android
-hardware buffer usage flags for specific Vulkan resource creation
-parameters.
-Some usage flags returned by these commands are required: based on the input
-parameters, but additional vendor-specific usage flags
-(code:AHARDWAREBUFFER_USAGE_VENDOR_*) may: also be returned.
-Any Android hardware buffer allocated with these vendor-specific usage flags
-and imported to Vulkan must: only be bound to resources created with
-parameters that are a subset of the parameters used to obtain the Android
-hardware buffer usage, since the memory may: have been allocated in a way
-incompatible with other parameters.
-If an Android hardware buffer is successfully allocated with additional
-non-vendor-specific usage flags in addition to the recommended usage, it
-must: support being used in the same ways as an Android hardware buffer
-allocated with only the recommended usage, and also in ways indicated by the
-additional usage.
-
-[[memory-external-android-hardware-buffer-external-formats]]
-===== Android Hardware Buffer External Formats =====
-
-Android hardware buffers may: represent images using implementation-specific
-formats, layouts, color models, etc., which do not have Vulkan equivalents.
-Such _external formats_ are commonly used by external image sources such as
-video decoders or cameras.
-Vulkan can: import Android hardware buffers that have external formats, but
-since the image contents are in an undiscoverable and possibly proprietary
-representation, images with external formats must: only be used as sampled
-images, must: only be sampled with a sampler that has {YCbCr} conversion
-enabled, and must: have optimal tiling.
-
-Images that will be backed by an Android hardware buffer can: use an
-external format by setting slink:VkImageCreateInfo::pname:format to
-ename:VK_FORMAT_UNDEFINED and including a slink:VkExternalFormatANDROID
-structure in the pname:pNext chain.
-Images can: be created with an external format even if the Android hardware
-buffer has a format which has an
-<<memory-external-android-hardware-buffer-formats,equivalent Vulkan format>>
-to enable consistent handling of images from sources that might use either
-category of format.
-However, all images created with an external format are subject to the valid
-usage requirements associated with external formats, even if the Android
-hardware buffer's format has a Vulkan equivalent.
-The external format of an Android hardware buffer can: be obtained by
-passing a slink:VkAndroidHardwareBufferFormatPropertiesANDROID structure to
-flink:vkGetAndroidHardwareBufferPropertiesANDROID.
-
-[[memory-external-android-hardware-buffer-image-resources]]
-===== Android Hardware Buffer Image Resources
-
-Android hardware buffers have intrinsic width, height, format, and usage
-properties, so Vulkan images bound to memory imported from an Android
-hardware buffer must: use dedicated allocations:
-sname:VkMemoryDedicatedRequirements::pname:requiresDedicatedAllocation must:
-be ename:VK_TRUE for images created with
-slink:VkExternalMemoryImageCreateInfo::pname:handleTypes that includes
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID.
-When creating an image that will be bound to an imported Android hardware
-buffer, the image creation parameters must: be equivalent to the
-basetype:AHardwareBuffer properties as described by the valid usage of
-slink:VkMemoryAllocateInfo.
-Similarly, device memory allocated for a dedicated image must: not be
-exported to an Android hardware buffer until it has been bound to that
-image, and the implementation must: return an Android hardware buffer with
-properties derived from the image:
-
-  * The code:width and code:height members of code:AHardwareBuffer_Desc
-    must: be the same as the pname:width and pname:height members of
-    slink:VkImageCreateInfo::pname:extent, respectively.
-  * The code:layers member of code:AHardwareBuffer_Desc must: be the same as
-    the pname:arrayLayers member of slink:VkImageCreateInfo.
-  * The code:format member of code:AHardwareBuffer_Desc must: be equivalent
-    to slink:VkImageCreateInfo::pname:format as defined by
-    <<memory-external-android-hardware-buffer-formats,AHardwareBuffer Format
-    Equivalence>>.
-  * The code:usage member of code:AHardwareBuffer_Desc must: include bits
-    corresponding to bits included in slink:VkImageCreateInfo::pname:usage
-    and slink:VkImageCreateInfo::pname:flags where such a correspondence
-    exists according to
-    <<memory-external-android-hardware-buffer-usage,AHardwareBuffer Usage
-    Equivalence>>.
-    It may: also include additional usage bits, including vendor-specific
-    usages.
-    Presence of vendor usage bits may: make the Android hardware buffer only
-    usable in ways indicated by the image creation parameters, even when
-    used outside Vulkan, in a similar way that allocating the Android
-    hardware buffer with usage returned in
-    slink:VkAndroidHardwareBufferUsageANDROID does.
-
-Implementations may: support fewer combinations of image creation parameters
-for images with Android hardware buffer external handle type than for
-non-external images.
-Support for a given set of parameters can: be determined by passing
-slink:VkExternalImageFormatProperties to
-flink:vkGetPhysicalDeviceImageFormatProperties2 with pname:handleType set to
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID.
-Any Android hardware buffer successfully allocated outside Vulkan with usage
-that includes code:AHARDWAREBUFFER_USAGE_GPU_* must: be supported when using
-equivalent Vulkan image parameters.
-If a given choice of image parameters are supported for import, they can:
-also be used to create an image and memory that will be exported to an
-Android hardware buffer.
-
-[[memory-external-android-hardware-buffer-formats]]
-.AHardwareBuffer Format Equivalence
-[width="100%",options="header"]
-|====
-| AHardwareBuffer Format                         | Vulkan Format
-| code:AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM     | ename:VK_FORMAT_R8G8B8A8_UNORM
-| code:AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM ^1^ | ename:VK_FORMAT_R8G8B8A8_UNORM
-| code:AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM       | ename:VK_FORMAT_R8G8B8_UNORM
-| code:AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM       | ename:VK_FORMAT_R5G6B5_UNORM_PACK16
-| code:AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT | ename:VK_FORMAT_R16G16B16A16_SFLOAT
-| code:AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM  | ename:VK_FORMAT_A2B10G10R10_UNORM_PACK32
-| code:AHARDWAREBUFFER_FORMAT_D16_UNORM          | ename:VK_FORMAT_D16_UNORM
-| code:AHARDWAREBUFFER_FORMAT_D24_UNORM          | ename:VK_FORMAT_X8_D24_UNORM_PACK32
-| code:AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT  | ename:VK_FORMAT_D24_UNORM_S8_UINT
-| code:AHARDWAREBUFFER_FORMAT_D32_FLOAT          | ename:VK_FORMAT_D32_SFLOAT
-| code:AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT  | ename:VK_FORMAT_D32_SFLOAT_S8_UINT
-| code:AHARDWAREBUFFER_FORMAT_S8_UINT            | ename:VK_FORMAT_S8_UINT
-|====
-
-[[memory-external-android-hardware-buffer-usage]]
-.AHardwareBuffer Usage Equivalence
-[width="100%",options="header"]
-|====
-| AHardwareBuffer Usage                          | Vulkan Usage or Creation Flag
-| None                                           | ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT
-| None                                           | ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT
-| code:AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE   | ename:VK_IMAGE_USAGE_SAMPLED_BIT
-| code:AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE   | ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
-| code:AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER ^3^ | ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
-| code:AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER ^3^ | ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-| code:AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP        | ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
-| code:AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE | None ^2^
-ifdef::VK_VERSION_1_1[]
-| code:AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT   | ename:VK_IMAGE_CREATE_PROTECTED_BIT
-endif::VK_VERSION_1_1[]
-| None                                           | ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
-| None                                           | ename:VK_IMAGE_CREATE_EXTENDED_USAGE_BIT
-|====
-
-1::
-    Vulkan does not differentiate between
-    code:AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM and
-    code:AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM: they both behave as
-    ename:VK_FORMAT_R8G8B8A8_UNORM.
-    After an external entity writes to a
-    code:AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM Android hardware buffer, the
-    values read by Vulkan from the X/A component are undefined:.
-    To emulate the traditional behavior of the X component during sampling
-    or blending, applications should: use ename:VK_COMPONENT_SWIZZLE_ONE in
-    image view component mappings and ename:VK_BLEND_FACTOR_ONE in color
-    blend factors.
-    There is no way to avoid copying these undefined: values when copying
-    from such an image to another image or buffer.
-
-2::
-    The code:AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE flag does not
-    correspond to a Vulkan image usage or creation flag.
-    Instead, its presence indicates that the Android hardware buffer
-    contains a complete mipmap chain, and its absence indicates that the
-    Android hardware buffer contains only a single mip level.
-
-3::
-    Only image usages valid for the format are valid.
-    It would be invalid to take a Android Hardware Buffer with a format of
-    code:AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM that has a
-    code:AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER usage and try to create an
-    image with ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT.
-
-ifdef::VK_VERSION_1_2,VK_KHR_image_format_list[]
-[NOTE]
-.Note
-====
-When using ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT with Android hardware
-buffer images, applications should: use slink:VkImageFormatListCreateInfo to
-inform the implementation which view formats will be used with the image.
-For some common sets of format, this allows some implementations to provide
-significantly better performance when accessing the image via Vulkan.
-====
-endif::VK_VERSION_1_2,VK_KHR_image_format_list[]
-
-[[memory-external-android-hardware-buffer-buffer-resources]]
-===== Android Hardware Buffer Buffer Resources
-
-Android hardware buffers with a format of code:AHARDWAREBUFFER_FORMAT_BLOB
-and usage that includes code:AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER can: be
-used as the backing store for slink:VkBuffer objects.
-Such Android hardware buffers have a size in bytes specified by their
-code:width; code:height and code:layers are both `1`.
-
-Unlike images, buffer resources backed by Android hardware buffers do not
-require dedicated allocations.
-
-Exported basetype:AHardwareBuffer objects that do not have dedicated images
-must: have a format of code:AHARDWAREBUFFER_FORMAT_BLOB, usage must: include
-code:AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER, code:width must: equal the
-device memory allocation size, and code:height and code:layers must: be `1`.
-endif::VK_KHR_external_memory_capabilities+VK_ANDROID_external_memory_android_hardware_buffer[]
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[[memory-peer-memory-features]]
-=== Peer Memory Features
-
-[open,refpage='vkGetDeviceGroupPeerMemoryFeatures',desc='Query supported peer memory features of a device',type='protos']
---
-_Peer memory_ is memory that is allocated for a given physical device and
-then bound to a resource and accessed by a different physical device, in a
-logical device that represents multiple physical devices.
-Some ways of reading and writing peer memory may: not be supported by a
-device.
-
-To determine how peer memory can: be accessed, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetDeviceGroupPeerMemoryFeatures.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_device_group[or the equivalent command]
-
-ifdef::VK_KHR_device_group[]
-include::{generated}/api/protos/vkGetDeviceGroupPeerMemoryFeaturesKHR.txt[]
-endif::VK_KHR_device_group[]
-
-  * pname:device is the logical device that owns the memory.
-  * pname:heapIndex is the index of the memory heap from which the memory is
-    allocated.
-  * pname:localDeviceIndex is the device index of the physical device that
-    performs the memory access.
-  * pname:remoteDeviceIndex is the device index of the physical device that
-    the memory is allocated for.
-  * pname:pPeerMemoryFeatures is a pointer to a
-    tlink:VkPeerMemoryFeatureFlags bitmask indicating which types of memory
-    accesses are supported for the combination of heap, local, and remote
-    devices.
-
-.Valid Usage
-****
-  * [[VUID-vkGetDeviceGroupPeerMemoryFeatures-heapIndex-00691]]
-    pname:heapIndex must: be less than pname:memoryHeapCount
-  * [[VUID-vkGetDeviceGroupPeerMemoryFeatures-localDeviceIndex-00692]]
-    pname:localDeviceIndex must: be a valid device index
-  * [[VUID-vkGetDeviceGroupPeerMemoryFeatures-remoteDeviceIndex-00693]]
-    pname:remoteDeviceIndex must: be a valid device index
-  * [[VUID-vkGetDeviceGroupPeerMemoryFeatures-localDeviceIndex-00694]]
-    pname:localDeviceIndex must: not equal pname:remoteDeviceIndex
-****
-
-include::{generated}/validity/protos/vkGetDeviceGroupPeerMemoryFeatures.txt[]
---
-
-[open,refpage='VkPeerMemoryFeatureFlagBits',desc='Bitmask specifying supported peer memory features',type='enums']
---
-Bits which may: be set in the value returned for
-flink:vkGetDeviceGroupPeerMemoryFeatures::pname:pPeerMemoryFeatures,
-indicating the supported peer memory features, are:
-
-include::{generated}/api/enums/VkPeerMemoryFeatureFlagBits.txt[]
-
-ifdef::VK_KHR_device_group[]
-or the equivalent
-
-include::{generated}/api/enums/VkPeerMemoryFeatureFlagBitsKHR.txt[]
-endif::VK_KHR_device_group[]
-
-  * ename:VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT specifies that the memory can:
-    be accessed as the source of any ftext:vkCmdCopy* command.
-  * ename:VK_PEER_MEMORY_FEATURE_COPY_DST_BIT specifies that the memory can:
-    be accessed as the destination of any ftext:vkCmdCopy* command.
-  * ename:VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT specifies that the memory
-    can: be read as any memory access type.
-  * ename:VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT specifies that the memory
-    can: be written as any memory access type.
-    Shader atomics are considered to be writes.
-
-[NOTE]
-.Note
-====
-The peer memory features of a memory heap also apply to any accesses that
-may: be performed during <<synchronization-image-layout-transitions, image
-layout transitions>>.
-====
-
-ename:VK_PEER_MEMORY_FEATURE_COPY_DST_BIT must: be supported for all host
-local heaps and for at least one device-local memory heap.
-
-If a device does not support a peer memory feature, it is still valid to use
-a resource that includes both local and peer memory bindings with the
-corresponding access type as long as only the local bindings are actually
-accessed.
-For example, an application doing split-frame rendering would use
-framebuffer attachments that include both local and peer memory bindings,
-but would scissor the rendering to only update local memory.
---
-
-[open,refpage='VkPeerMemoryFeatureFlags',desc='Bitmask of VkPeerMemoryFeatureFlagBits',type='flags']
---
-include::{generated}/api/flags/VkPeerMemoryFeatureFlags.txt[]
-
-ifdef::VK_KHR_device_group[]
-or the equivalent
-
-include::{generated}/api/flags/VkPeerMemoryFeatureFlagsKHR.txt[]
-endif::VK_KHR_device_group[]
-
-tname:VkPeerMemoryFeatureFlags is a bitmask type for setting a mask of zero
-or more elink:VkPeerMemoryFeatureFlagBits.
---
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-=== Opaque Capture Address Query
-
-[open,refpage='vkGetDeviceMemoryOpaqueCaptureAddress',desc='Query an opaque capture address of a memory object',type='protos',alias='vkGetDeviceMemoryOpaqueCaptureAddressKHR']
---
-To query a 64-bit opaque capture address value from a memory object, call:
-
-ifdef::VK_VERSION_1_2[]
-include::{generated}/api/protos/vkGetDeviceMemoryOpaqueCaptureAddress.txt[]
-endif::VK_VERSION_1_2[]
-
-ifdef::VK_VERSION_1_2+VK_KHR_buffer_device_address[or the equivalent command]
-
-ifdef::VK_KHR_buffer_device_address[]
-include::{generated}/api/protos/vkGetDeviceMemoryOpaqueCaptureAddressKHR.txt[]
-endif::VK_KHR_buffer_device_address[]
-
-  * pname:device is the logical device that the memory object was allocated
-    on.
-  * pname:pInfo is a pointer to a
-    slink:VkDeviceMemoryOpaqueCaptureAddressInfo structure specifying the
-    memory object to retrieve an address for.
-
-The 64-bit return value is an opaque address representing the start of
-pname:pInfo->memory.
-
-If the memory object was allocated with a non-zero value of
-slink:VkMemoryOpaqueCaptureAddressAllocateInfo::pname:opaqueCaptureAddress,
-the return value must: be the same address.
-
-[NOTE]
-.Note
-====
-The expected usage for these opaque addresses is only for trace
-capture/replay tools to store these addresses in a trace and subsequently
-specify them during replay.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkGetDeviceMemoryOpaqueCaptureAddress-None-03334]]
-    The <<features-bufferDeviceAddress,bufferDeviceAddress>> feature must:
-    be enabled
-  * [[VUID-vkGetDeviceMemoryOpaqueCaptureAddress-device-03335]]
-    If pname:device was created with multiple physical devices, then the
-    <<features-bufferDeviceAddressMultiDevice,bufferDeviceAddressMultiDevice>>
-    feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkGetDeviceMemoryOpaqueCaptureAddress.txt[]
---
-
-[open,refpage='VkDeviceMemoryOpaqueCaptureAddressInfo',desc='Structure specifying the memory object to query an address for',type='structs',alias='VkDeviceMemoryOpaqueCaptureAddressInfoKHR']
---
-The sname:VkDeviceMemoryOpaqueCaptureAddressInfo structure is defined as:
-
-include::{generated}/api/structs/VkDeviceMemoryOpaqueCaptureAddressInfo.txt[]
-
-ifdef::VK_KHR_buffer_device_address[]
-or the equivalent
-
-include::{generated}/api/structs/VkDeviceMemoryOpaqueCaptureAddressInfoKHR.txt[]
-endif::VK_KHR_buffer_device_address[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memory specifies the memory whose address is being queried.
-
-.Valid Usage
-****
-  * [[VUID-VkDeviceMemoryOpaqueCaptureAddressInfo-memory-03336]]
-    pname:memory must: have been allocated with
-    ename:VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT
-****
-
-include::{generated}/validity/structs/VkDeviceMemoryOpaqueCaptureAddressInfo.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
diff --git a/registry/vulkan/chapters/pipelines.txt b/registry/vulkan/chapters/pipelines.txt
deleted file mode 100644
index 13cd79a..0000000
--- a/registry/vulkan/chapters/pipelines.txt
+++ /dev/null
@@ -1,4569 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[pipelines]]
-= Pipelines
-
-The following <<pipelines-block-diagram,figure>> shows a block diagram of
-the Vulkan pipelines.
-Some Vulkan commands specify geometric objects to be drawn or computational
-work to be performed, while others specify state controlling how objects are
-handled by the various pipeline stages, or control data transfer between
-memory organized as images and buffers.
-Commands are effectively sent through a processing pipeline, either a
-_graphics pipeline_,
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-a _ray tracing pipeline_,
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-or a _compute pipeline_.
-
-ifdef::VK_NV_mesh_shader[]
-The graphics pipeline can be operated in two modes, as either _primitive
-shading_ or _mesh shading_ pipeline.
-
-*Primitive Shading*
-
-endif::VK_NV_mesh_shader[]
-
-The first stage of the <<pipelines-graphics,graphics pipeline>>
-(<<drawing,Input Assembler>>) assembles vertices to form geometric
-primitives such as points, lines, and triangles, based on a requested
-primitive topology.
-In the next stage (<<shaders-vertex,Vertex Shader>>) vertices can: be
-transformed, computing positions and attributes for each vertex.
-If <<tessellation,tessellation>> and/or <<geometry,geometry>> shaders are
-supported, they can: then generate multiple primitives from a single input
-primitive, possibly changing the primitive topology or generating additional
-attribute data in the process.
-
-ifdef::VK_NV_mesh_shader[]
-*Mesh Shading*
-
-When using the <<mesh,_mesh shading_>> pipeline input primitives are not
-assembled implicitly, but explicitly through the (<<shaders-mesh,Mesh
-Shader>>).
-The work on the mesh pipeline is initiated by the application
-<<drawing-mesh-shading,drawing>> a set of mesh tasks.
-
-If an optional (<<shaders-task,Task Shader>>) is active, each task triggers
-the execution of a task shader workgroup that will generate a new set of
-tasks upon completion.
-Each of these spawned tasks, or each of the original dispatched tasks if no
-task shader is present, triggers the execution of a mesh shader workgroup
-that produces an output mesh with a variable-sized number of primitives
-assembled from vertices stored in the output mesh.
-
-*Common*
-endif::VK_NV_mesh_shader[]
-
-The final resulting primitives are <<vertexpostproc-clipping,clipped>> to a
-clip volume in preparation for the next stage, <<primsrast,Rasterization>>.
-The rasterizer produces a series of _fragments_ associated with a region of
-the framebuffer, from a two-dimensional description of a point, line
-segment, or triangle.
-These fragments are processed by <<fragops,fragment operations>> to
-determine whether generated values will be written to the framebuffer.
-<<fragops-shader, Fragment shading>> determines the values to be written to
-the framebuffer attachments.
-Framebuffer operations then read and write the color and depth/stencil
-attachments of the framebuffer for a given subpass of a <<renderpass,render
-pass instance>>.
-The attachments can: be used as input attachments in the fragment shader in
-a later subpass of the same render pass.
-
-The <<pipelines-compute,compute pipeline>> is a separate pipeline from the
-graphics pipeline, which operates on one-, two-, or three-dimensional
-workgroups which can: read from and write to buffer and image memory.
-
-This ordering is meant only as a tool for describing Vulkan, not as a strict
-rule of how Vulkan is implemented, and we present it only as a means to
-organize the various operations of the pipelines.
-Actual ordering guarantees between pipeline stages are explained in detail
-in the <<synchronization-pipeline-stages-order, synchronization chapter>>.
-
-[[pipelines-block-diagram]]
-ifndef::VK_NV_mesh_shader[]
-image::{images}/pipeline.svg[title="Block diagram of the Vulkan pipeline",align="center",opts="{imageopts}"]
-endif::VK_NV_mesh_shader[]
-ifdef::VK_NV_mesh_shader[]
-image::{images}/pipelinemesh.svg[title="Block diagram of the Vulkan pipeline",align="center",opts="{imageopts}"]
-endif::VK_NV_mesh_shader[]
-
-Each pipeline is controlled by a monolithic object created from a
-description of all of the shader stages and any relevant fixed-function
-stages.
-<<interfaces,Linking>> the whole pipeline together allows the optimization
-of shaders based on their input/outputs and eliminates expensive draw time
-state validation.
-
-A pipeline object is bound to the current state using
-flink:vkCmdBindPipeline.
-Any pipeline object state that is specified as <<pipelines-dynamic-state,
-dynamic>> is not applied to the current state when the pipeline object is
-bound, but is instead set by dynamic state setting commands.
-
-No state, including dynamic state, is inherited from one command buffer to
-another.
-
-
-[open,refpage='VkPipeline',desc='Opaque handle to a pipeline object',type='handles']
---
-Compute,
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-ray tracing,
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-and graphics pipelines are each represented by sname:VkPipeline handles:
-
-include::{generated}/api/handles/VkPipeline.txt[]
---
-
-
-[[pipelines-compute]]
-== Compute Pipelines
-
-Compute pipelines consist of a single static compute shader stage and the
-pipeline layout.
-
-The compute pipeline represents a compute shader and is created by calling
-fname:vkCreateComputePipelines with pname:module and pname:pName selecting
-an entry point from a shader module, where that entry point defines a valid
-compute shader, in the slink:VkPipelineShaderStageCreateInfo structure
-contained within the slink:VkComputePipelineCreateInfo structure.
-
-[open,refpage='vkCreateComputePipelines',desc='Creates a new compute pipeline object',type='protos']
---
-To create compute pipelines, call:
-
-include::{generated}/api/protos/vkCreateComputePipelines.txt[]
-
-  * pname:device is the logical device that creates the compute pipelines.
-  * pname:pipelineCache is either dlink:VK_NULL_HANDLE, indicating that
-    pipeline caching is disabled; or the handle of a valid
-    <<pipelines-cache,pipeline cache>> object, in which case use of that
-    cache is enabled for the duration of the command.
-  * pname:createInfoCount is the length of the pname:pCreateInfos and
-    pname:pPipelines arrays.
-  * pname:pCreateInfos is a pointer to an array of
-    slink:VkComputePipelineCreateInfo structures.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pPipelines is a pointer to an array of slink:VkPipeline handles in
-    which the resulting compute pipeline objects are returned.
-ifdef::editing-notes[]
-+
-[NOTE]
-.editing-note
-====
-TODO (Jon) - Should we say something like "`the i'th element of the
-pname:pPipelines array is created based on the corresponding element of the
-pname:pCreateInfos array`"? Also for flink:vkCreateGraphicsPipelines below.
-====
-endif::editing-notes[]
-
-.Valid Usage
-****
-  * [[VUID-vkCreateComputePipelines-flags-00695]]
-    If the pname:flags member of any element of pname:pCreateInfos contains
-    the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the
-    pname:basePipelineIndex member of that same element is not `-1`,
-    pname:basePipelineIndex must: be less than the index into
-    pname:pCreateInfos that corresponds to that element
-  * [[VUID-vkCreateComputePipelines-flags-00696]]
-    If the pname:flags member of any element of pname:pCreateInfos contains
-    the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, the base pipeline
-    must: have been created with the
-    ename:VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-  * [[VUID-vkCreateComputePipelines-pipelineCache-02873]]
-    If pname:pipelineCache was created with
-    ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, host
-    access to pname:pipelineCache must: be
-    <<fundamentals-threadingbehavior,externally synchronized>>
-endif::VK_EXT_pipeline_creation_cache_control[]
-****
-
-include::{generated}/validity/protos/vkCreateComputePipelines.txt[]
---
-
-[open,refpage='VkComputePipelineCreateInfo',desc='Structure specifying parameters of a newly created compute pipeline',type='structs']
---
-The sname:VkComputePipelineCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkComputePipelineCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkPipelineCreateFlagBits specifying
-    how the pipeline will be generated.
-  * pname:stage is a slink:VkPipelineShaderStageCreateInfo structure
-    describing the compute shader.
-  * pname:layout is the description of binding locations used by both the
-    pipeline and descriptor sets used with the pipeline.
-  * pname:basePipelineHandle is a pipeline to derive from
-  * pname:basePipelineIndex is an index into the pname:pCreateInfos
-    parameter to use as a pipeline to derive from
-
-The parameters pname:basePipelineHandle and pname:basePipelineIndex are
-described in more detail in <<pipelines-pipeline-derivatives,Pipeline
-Derivatives>>.
-
-.Valid Usage
-****
-  * [[VUID-VkComputePipelineCreateInfo-flags-00697]]
-    If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
-    flag, and pname:basePipelineIndex is -1, pname:basePipelineHandle must:
-    be a valid handle to a compute sname:VkPipeline
-  * [[VUID-VkComputePipelineCreateInfo-flags-00698]]
-    If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
-    flag, and pname:basePipelineHandle is dlink:VK_NULL_HANDLE,
-    pname:basePipelineIndex must: be a valid index into the calling
-    command's pname:pCreateInfos parameter
-  * [[VUID-VkComputePipelineCreateInfo-flags-00699]]
-    If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
-    flag, and pname:basePipelineIndex is not -1, pname:basePipelineHandle
-    must: be dlink:VK_NULL_HANDLE
-  * [[VUID-VkComputePipelineCreateInfo-flags-00700]]
-    If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
-    flag, and pname:basePipelineHandle is not dlink:VK_NULL_HANDLE,
-    pname:basePipelineIndex must: be -1
-  * [[VUID-VkComputePipelineCreateInfo-stage-00701]]
-    The pname:stage member of pname:stage must: be
-    ename:VK_SHADER_STAGE_COMPUTE_BIT
-  * [[VUID-VkComputePipelineCreateInfo-stage-00702]]
-    The shader code for the entry point identified by pname:stage and the
-    rest of the state identified by this structure must: adhere to the
-    pipeline linking rules described in the <<interfaces,Shader Interfaces>>
-    chapter
-  * [[VUID-VkComputePipelineCreateInfo-layout-00703]]
-    pname:layout must: be
-    <<descriptorsets-pipelinelayout-consistency,consistent>> with the layout
-    of the compute shader specified in pname:stage
-  * [[VUID-VkComputePipelineCreateInfo-layout-01687]]
-    The number of resources in pname:layout accessible to the compute shader
-    stage must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageResources
-ifdef::VK_KHR_pipeline_library[]
-  * [[VUID-VkComputePipelineCreateInfo-flags-03364]]
-    pname:flags must: not include ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
-endif::VK_KHR_pipeline_library[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  * [[VUID-VkComputePipelineCreateInfo-flags-03365]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR
-  * [[VUID-VkComputePipelineCreateInfo-flags-03366]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR
-  * [[VUID-VkComputePipelineCreateInfo-flags-03367]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR
-  * [[VUID-VkComputePipelineCreateInfo-flags-03368]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR
-  * [[VUID-VkComputePipelineCreateInfo-flags-03369]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR
-  * [[VUID-VkComputePipelineCreateInfo-flags-03370]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR
-  * [[VUID-VkComputePipelineCreateInfo-flags-03576]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_NV_ray_tracing_motion_blur[]
-  * [[VUID-VkComputePipelineCreateInfo-flags-04945]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV
-endif::VK_NV_ray_tracing_motion_blur[]
-ifdef::VK_NV_device_generated_commands[]
-  * [[VUID-VkComputePipelineCreateInfo-flags-02874]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-  * [[VUID-VkComputePipelineCreateInfo-pipelineCreationCacheControl-02875]]
-    If the <<features-pipelineCreationCacheControl,
-    pname:pipelineCreationCacheControl>> feature is not enabled, pname:flags
-    must: not include
-    ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or
-    ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT
-endif::VK_EXT_pipeline_creation_cache_control[]
-****
-
-include::{generated}/validity/structs/VkComputePipelineCreateInfo.txt[]
---
-
-[open,refpage='VkPipelineShaderStageCreateInfo',desc='Structure specifying parameters of a newly created pipeline shader stage',type='structs']
---
-The sname:VkPipelineShaderStageCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkPipelineShaderStageCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkPipelineShaderStageCreateFlagBits
-    specifying how the pipeline shader stage will be generated.
-  * pname:stage is a elink:VkShaderStageFlagBits value specifying a single
-    pipeline stage.
-  * pname:module is a slink:VkShaderModule object containing the shader for
-    this stage.
-  * pname:pName is a pointer to a null-terminated UTF-8 string specifying
-    the entry point name of the shader for this stage.
-  * pname:pSpecializationInfo is a pointer to a slink:VkSpecializationInfo
-    structure, as described in
-    <<pipelines-specialization-constants,Specialization Constants>>, or
-    `NULL`.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-00704]]
-    If the <<features-geometryShader,geometry shaders>> feature is not
-    enabled, pname:stage must: not be ename:VK_SHADER_STAGE_GEOMETRY_BIT
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-00705]]
-    If the <<features-tessellationShader,tessellation shaders>> feature is
-    not enabled, pname:stage must: not be
-    ename:VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT or
-    ename:VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT
-ifdef::VK_NV_mesh_shader[]
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-02091]]
-    If the <<features-meshShader,mesh shader>> feature is not enabled,
-    pname:stage must: not be ename:VK_SHADER_STAGE_MESH_BIT_NV
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-02092]]
-    If the <<features-taskShader,task shader>> feature is not enabled,
-    pname:stage must: not be ename:VK_SHADER_STAGE_TASK_BIT_NV
-endif::VK_NV_mesh_shader[]
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-00706]]
-    pname:stage must: not be ename:VK_SHADER_STAGE_ALL_GRAPHICS, or
-    ename:VK_SHADER_STAGE_ALL
-  * [[VUID-VkPipelineShaderStageCreateInfo-pName-00707]]
-    pname:pName must: be the name of an code:OpEntryPoint in pname:module
-    with an execution model that matches pname:stage
-  * [[VUID-VkPipelineShaderStageCreateInfo-maxClipDistances-00708]]
-    If the identified entry point includes any variable in its interface
-    that is declared with the code:ClipDistance code:BuiltIn decoration,
-    that variable must: not have an array size greater than
-    sname:VkPhysicalDeviceLimits::pname:maxClipDistances
-  * [[VUID-VkPipelineShaderStageCreateInfo-maxCullDistances-00709]]
-    If the identified entry point includes any variable in its interface
-    that is declared with the code:CullDistance code:BuiltIn decoration,
-    that variable must: not have an array size greater than
-    sname:VkPhysicalDeviceLimits::pname:maxCullDistances
-  * [[VUID-VkPipelineShaderStageCreateInfo-maxCombinedClipAndCullDistances-00710]]
-    If the identified entry point includes any variables in its interface
-    that are declared with the code:ClipDistance or code:CullDistance
-    code:BuiltIn decoration, those variables must: not have array sizes
-    which sum to more than
-    sname:VkPhysicalDeviceLimits::pname:maxCombinedClipAndCullDistances
-  * [[VUID-VkPipelineShaderStageCreateInfo-maxSampleMaskWords-00711]]
-    If the identified entry point includes any variable in its interface
-    that is declared with the code:SampleMask code:BuiltIn decoration, that
-    variable must: not have an array size greater than
-    sname:VkPhysicalDeviceLimits::pname:maxSampleMaskWords
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-00712]]
-    If pname:stage is ename:VK_SHADER_STAGE_VERTEX_BIT, the identified entry
-    point must: not include any input variable in its interface that is
-    decorated with code:CullDistance
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-00713]]
-    If pname:stage is ename:VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT or
-    ename:VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, and the identified
-    entry point has an code:OpExecutionMode instruction that specifies a
-    patch size with code:OutputVertices, the patch size must: be greater
-    than `0` and less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxTessellationPatchSize
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-00714]]
-    If pname:stage is ename:VK_SHADER_STAGE_GEOMETRY_BIT, the identified
-    entry point must: have an code:OpExecutionMode instruction that
-    specifies a maximum output vertex count that is greater than `0` and
-    less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxGeometryOutputVertices
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-00715]]
-    If pname:stage is ename:VK_SHADER_STAGE_GEOMETRY_BIT, the identified
-    entry point must: have an code:OpExecutionMode instruction that
-    specifies an invocation count that is greater than `0` and less than or
-    equal to
-    sname:VkPhysicalDeviceLimits::pname:maxGeometryShaderInvocations
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-02596]]
-    If pname:stage is a
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stage>>, and the identified entry point writes to code:Layer for any
-    primitive, it must: write the same value to code:Layer for all vertices
-    of a given primitive
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-02597]]
-    If pname:stage is a
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stage>>, and the identified entry point writes to code:ViewportIndex for
-    any primitive, it must: write the same value to code:ViewportIndex for
-    all vertices of a given primitive
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-00718]]
-    If pname:stage is ename:VK_SHADER_STAGE_FRAGMENT_BIT, the identified
-    entry point must: not include any output variables in its interface
-    decorated with code:CullDistance
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-00719]]
-    If pname:stage is ename:VK_SHADER_STAGE_FRAGMENT_BIT, and the identified
-    entry point writes to code:FragDepth in any execution path, it must:
-    write to code:FragDepth in all execution paths
-ifdef::VK_EXT_shader_stencil_export[]
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-01511]]
-    If pname:stage is ename:VK_SHADER_STAGE_FRAGMENT_BIT, and the identified
-    entry point writes to code:FragStencilRefEXT in any execution path, it
-    must: write to code:FragStencilRefEXT in all execution paths
-endif::VK_EXT_shader_stencil_export[]
-ifdef::VK_NV_mesh_shader[]
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-02093]]
-    If pname:stage is ename:VK_SHADER_STAGE_MESH_BIT_NV, the identified
-    entry point must: have an code:OpExecutionMode instruction that
-    specifies a maximum output vertex count, code:OutputVertices, that is
-    greater than `0` and less than or equal to
-    sname:VkPhysicalDeviceMeshShaderPropertiesNV::pname:maxMeshOutputVertices
-  * [[VUID-VkPipelineShaderStageCreateInfo-stage-02094]]
-    If pname:stage is ename:VK_SHADER_STAGE_MESH_BIT_NV, the identified
-    entry point must: have an code:OpExecutionMode instruction that
-    specifies a maximum output primitive count, code:OutputPrimitivesNV,
-    that is greater than `0` and less than or equal to
-    sname:VkPhysicalDeviceMeshShaderPropertiesNV::pname:maxMeshOutputPrimitives
-endif::VK_NV_mesh_shader[]
-ifdef::VK_EXT_subgroup_size_control[]
-  * [[VUID-VkPipelineShaderStageCreateInfo-flags-02784]]
-    If pname:flags has the
-    ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
-    flag set, the <<features-subgroupSizeControl,
-    pname:subgroupSizeControl>> feature must: be enabled
-  * [[VUID-VkPipelineShaderStageCreateInfo-flags-02785]]
-    If pname:flags has the
-    ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
-    flag set, the <<features-computeFullSubgroups,
-    pname:computeFullSubgroups>> feature must: be enabled
-  * [[VUID-VkPipelineShaderStageCreateInfo-pNext-02754]]
-    If a slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT
-    structure is included in the pname:pNext chain, pname:flags must: not
-    have the
-    ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
-    flag set
-  * [[VUID-VkPipelineShaderStageCreateInfo-pNext-02755]]
-    If a slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT
-    structure is included in the pname:pNext chain, the
-    <<features-subgroupSizeControl, pname:subgroupSizeControl>> feature
-    must: be enabled, and pname:stage must: be a valid bit specified in
-    <<limits-required-subgroup-size-stages,
-    pname:requiredSubgroupSizeStages>>
-  * [[VUID-VkPipelineShaderStageCreateInfo-pNext-02756]]
-    If a slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT
-    structure is included in the pname:pNext chain and pname:stage is
-    ename:VK_SHADER_STAGE_COMPUTE_BIT, the local workgroup size of the
-    shader must: be less than or equal to the product of
-    slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT::pname:requiredSubgroupSize
-    and
-    <<limits-max-subgroups-per-workgroup,pname:maxComputeWorkgroupSubgroups>>
-  * [[VUID-VkPipelineShaderStageCreateInfo-pNext-02757]]
-    If a slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT
-    structure is included in the pname:pNext chain, and pname:flags has the
-    ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
-    flag set, the local workgroup size in the X dimension of the pipeline
-    must: be a multiple of
-    slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT::pname:requiredSubgroupSize
-  * [[VUID-VkPipelineShaderStageCreateInfo-flags-02758]]
-    If pname:flags has both the
-    ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT and
-    ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
-    flags set, the local workgroup size in the X dimension of the pipeline
-    must: be a multiple of
-    <<limits-max-subgroup-size,pname:maxSubgroupSize>>
-  * [[VUID-VkPipelineShaderStageCreateInfo-flags-02759]]
-    If pname:flags has the
-    ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
-    flag set and pname:flags does not have the
-    ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
-    flag set and no
-    slink:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure
-    is included in the pname:pNext chain, the local workgroup size in the X
-    dimension of the pipeline must: be a multiple of
-    <<limits-subgroup-size,pname:subgroupSize>>
-endif::VK_EXT_subgroup_size_control[]
-  * [[VUID-VkPipelineShaderStageCreateInfo-module-04145]]
-    The SPIR-V code that was used to create pname:module must: be valid as
-    described by the <<spirv-spec,Khronos SPIR-V Specification>> after
-    applying the specializations provided in pname:pSpecializationInfo, if
-    any, and then converting all specialization constants into fixed
-    constants
-****
-
-include::{generated}/validity/structs/VkPipelineShaderStageCreateInfo.txt[]
---
-
-[open,refpage='VkPipelineShaderStageCreateFlags',desc='Bitmask of VkPipelineShaderStageCreateFlagBits',type='flags']
---
-include::{generated}/api/flags/VkPipelineShaderStageCreateFlags.txt[]
-
-tname:VkPipelineShaderStageCreateFlags is a bitmask type for setting a mask
-of zero or more elink:VkPipelineShaderStageCreateFlagBits.
---
-
-[open,refpage='VkPipelineShaderStageCreateFlagBits',desc='Bitmask controlling how a pipeline shader stage is created',type='enums']
---
-Possible values of the pname:flags member of
-slink:VkPipelineShaderStageCreateInfo specifying how a pipeline shader stage
-is created, are:
-
-include::{generated}/api/enums/VkPipelineShaderStageCreateFlagBits.txt[]
-
-ifdef::VK_EXT_subgroup_size_control[]
-  * ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
-    specifies that the
-    <<interfaces-builtin-variables-sgs,code:SubgroupSize>> may: vary in the
-    shader stage.
-  * ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
-    specifies that the subgroup sizes must: be launched with all invocations
-    active in the compute stage.
-
-[NOTE]
-.Note
-====
-If ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
-and ename:VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT are
-specified and <<limits-max-subgroup-size,pname:minSubgroupSize>> does not
-equal <<limits-max-subgroup-size,pname:maxSubgroupSize>> and no
-<<pipelines-required-subgroup-size, required subgroup size>> is specified,
-then the only way to guarantee that the 'X' dimension of the local workgroup
-size is a multiple of <<interfaces-builtin-variables-sgs,code:SubgroupSize>>
-is to make it a multiple of pname:maxSubgroupSize.
-Under these conditions, you are guaranteed full subgroups but not any
-particular subgroup size.
-====
-
-endif::VK_EXT_subgroup_size_control[]
---
-
-[open,refpage='VkShaderStageFlagBits',desc='Bitmask specifying a pipeline stage',type='enums']
---
-Commands and structures which need to specify one or more shader stages do
-so using a bitmask whose bits correspond to stages.
-Bits which can: be set to specify shader stages are:
-
-include::{generated}/api/enums/VkShaderStageFlagBits.txt[]
-
-  * ename:VK_SHADER_STAGE_VERTEX_BIT specifies the vertex stage.
-  * ename:VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT specifies the
-    tessellation control stage.
-  * ename:VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT specifies the
-    tessellation evaluation stage.
-  * ename:VK_SHADER_STAGE_GEOMETRY_BIT specifies the geometry stage.
-  * ename:VK_SHADER_STAGE_FRAGMENT_BIT specifies the fragment stage.
-  * ename:VK_SHADER_STAGE_COMPUTE_BIT specifies the compute stage.
-  * ename:VK_SHADER_STAGE_ALL_GRAPHICS is a combination of bits used as
-    shorthand to specify all graphics stages defined above (excluding the
-    compute stage).
-  * ename:VK_SHADER_STAGE_ALL is a combination of bits used as shorthand to
-    specify all shader stages supported by the device, including all
-    additional stages which are introduced by extensions.
-ifdef::VK_NV_mesh_shader[]
-  * ename:VK_SHADER_STAGE_TASK_BIT_NV specifies the task stage.
-  * ename:VK_SHADER_STAGE_MESH_BIT_NV specifies the mesh stage.
-endif::VK_NV_mesh_shader[]
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-  * ename:VK_SHADER_STAGE_RAYGEN_BIT_KHR specifies the ray generation stage.
-  * ename:VK_SHADER_STAGE_ANY_HIT_BIT_KHR specifies the any-hit stage.
-  * ename:VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR specifies the closest hit
-    stage.
-  * ename:VK_SHADER_STAGE_MISS_BIT_KHR specifies the miss stage.
-  * ename:VK_SHADER_STAGE_INTERSECTION_BIT_KHR specifies the intersection
-    stage.
-  * ename:VK_SHADER_STAGE_CALLABLE_BIT_KHR specifies the callable stage.
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-
-[NOTE]
-.Note
-====
-ename:VK_SHADER_STAGE_ALL_GRAPHICS only includes the original five graphics
-stages included in Vulkan 1.0, and not any stages added by extensions.
-Thus, it may not have the desired effect in all cases.
-====
---
-
-[open,refpage='VkShaderStageFlags',desc='Bitmask of VkShaderStageFlagBits',type='flags']
---
-include::{generated}/api/flags/VkShaderStageFlags.txt[]
-
-tname:VkShaderStageFlags is a bitmask type for setting a mask of zero or
-more elink:VkShaderStageFlagBits.
---
-
-ifdef::VK_EXT_subgroup_size_control[]
-[open,refpage='VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT',desc='Structure specifying the required subgroup size of a newly created pipeline shader stage',type='structs']
---
-The sname:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure
-is defined as:
-
-include::{generated}/api/structs/VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * [[pipelines-required-subgroup-size]] pname:requiredSubgroupSize is an
-    unsigned integer value that specifies the required subgroup size for the
-    newly created pipeline shader stage.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02760]]
-    pname:requiredSubgroupSize must: be a power-of-two integer
-  * [[VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02761]]
-    pname:requiredSubgroupSize must: be greater or equal to
-    <<limits-min-subgroup-size,minSubgroupSize>>
-  * [[VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02762]]
-    pname:requiredSubgroupSize must: be less than or equal to
-    <<limits-max-subgroup-size,maxSubgroupSize>>
-****
-
-
-If a sname:VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure
-is included in the pname:pNext chain of
-slink:VkPipelineShaderStageCreateInfo, it specifies that the pipeline shader
-stage being compiled has a required subgroup size.
-
-include::{generated}/validity/structs/VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT.txt[]
---
-endif::VK_EXT_subgroup_size_control[]
-
-ifdef::VK_HUAWEI_subpass_shading[]
-[open,refpage='VkSubpassShadingPipelineCreateInfoHUAWEI',desc='Structure specifying parameters of a newly created subpass shading pipeline',type='structs']
---
-A subpass shading pipeline is a compute pipeline which must: be called only
-in a subpass of a render pass with work dimensions specified by render area
-size.
-The subpass shading pipeline shader is a compute shader allowed to access
-input attachments specified in the calling subpass.
-To create a subpass shading pipeline, call flink:vkCreateComputePipelines
-with slink:VkSubpassShadingPipelineCreateInfoHUAWEI in the pname:pNext chain
-of slink:VkComputePipelineCreateInfo.
-
-The sname:VkSubpassShadingPipelineCreateInfoHUAWEI structure is defined as:
-
-include::{generated}/api/structs/VkSubpassShadingPipelineCreateInfoHUAWEI.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:renderPass is a handle to a render pass object describing the
-    environment in which the pipeline will be used.
-    The pipeline must: only be used with a render pass instance compatible
-    with the one provided.
-    See <<renderpass-compatibility,Render Pass Compatibility>> for more
-    information.
-  * pname:subpass is the index of the subpass in the render pass where this
-    pipeline will be used.
-
-.Valid Usage
-****
-  * [[VUID-VkSubpassShadingPipelineCreateInfoHUAWEI-subpass-04946]]
-    pname:subpass must: be created with
-    ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI bind point
-****
-
-include::{generated}/validity/structs/VkSubpassShadingPipelineCreateInfoHUAWEI.txt[]
---
-
-[open,refpage='vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI',desc='Query maximum supported subpass shading workgroup size for a give render pass',type='protos']
---
-A subpass shading pipeline's workgroup size is a 2D vector with number of
-power-of-two in width and height.
-The maximum number of width and height is implementation dependent, and may:
-vary for different formats and sample counts of attachments in a render
-pass.
-
-To query the maximum workgroup size, call:
-
-include::{generated}/api/protos/vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI.txt[]
-
-  * pname:device is a handle to a local device object that was used to
-    create the given render pass.
-  * pname:renderPass is a handle to a render pass object describing the
-    environment in which the pipeline will be used.
-    The pipeline must: only be used with a render pass instance compatible
-    with the one provided.
-    See <<renderpass-compatibility,Render Pass Compatibility>> for more
-    information.
-  * pname:pMaxWorkgroupSize is a pointer to a slink:VkExtent2D structure.
-
-include::{generated}/validity/protos/vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI.txt[]
---
-endif::VK_HUAWEI_subpass_shading[]
-
-
-[[pipelines-graphics]]
-== Graphics Pipelines
-
-Graphics pipelines consist of multiple shader stages, multiple
-fixed-function pipeline stages, and a pipeline layout.
-
-[open,refpage='vkCreateGraphicsPipelines',desc='Create graphics pipelines',type='protos']
---
-To create graphics pipelines, call:
-
-include::{generated}/api/protos/vkCreateGraphicsPipelines.txt[]
-
-  * pname:device is the logical device that creates the graphics pipelines.
-  * pname:pipelineCache is either dlink:VK_NULL_HANDLE, indicating that
-    pipeline caching is disabled; or the handle of a valid
-    <<pipelines-cache,pipeline cache>> object, in which case use of that
-    cache is enabled for the duration of the command.
-  * pname:createInfoCount is the length of the pname:pCreateInfos and
-    pname:pPipelines arrays.
-  * pname:pCreateInfos is a pointer to an array of
-    slink:VkGraphicsPipelineCreateInfo structures.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pPipelines is a pointer to an array of slink:VkPipeline handles in
-    which the resulting graphics pipeline objects are returned.
-
-The slink:VkGraphicsPipelineCreateInfo structure includes an array of
-slink:VkPipelineShaderStageCreateInfo structures for each of the desired
-active shader stages, as well as creation information for all relevant
-fixed-function stages, and a pipeline layout.
-
-.Valid Usage
-****
-  * [[VUID-vkCreateGraphicsPipelines-flags-00720]]
-    If the pname:flags member of any element of pname:pCreateInfos contains
-    the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the
-    pname:basePipelineIndex member of that same element is not `-1`,
-    pname:basePipelineIndex must: be less than the index into
-    pname:pCreateInfos that corresponds to that element
-  * [[VUID-vkCreateGraphicsPipelines-flags-00721]]
-    If the pname:flags member of any element of pname:pCreateInfos contains
-    the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, the base pipeline
-    must: have been created with the
-    ename:VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-  * [[VUID-vkCreateGraphicsPipelines-pipelineCache-02876]]
-    If pname:pipelineCache was created with
-    ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, host
-    access to pname:pipelineCache must: be
-    <<fundamentals-threadingbehavior,externally synchronized>>
-endif::VK_EXT_pipeline_creation_cache_control[]
-****
-
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-[NOTE]
-.Note
-====
-An implicit cache may be provided by the implementation or a layer.
-For this reason, it is still valid to set
-ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT on
-pname:flags for any element of pname:pCreateInfos while passing
-dlink:VK_NULL_HANDLE for pname:pipelineCache.
-====
-endif::VK_EXT_pipeline_creation_cache_control[]
-
-include::{generated}/validity/protos/vkCreateGraphicsPipelines.txt[]
---
-
-[open,refpage='VkGraphicsPipelineCreateInfo',desc='Structure specifying parameters of a newly created graphics pipeline',type='structs']
---
-The sname:VkGraphicsPipelineCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkGraphicsPipelineCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkPipelineCreateFlagBits specifying
-    how the pipeline will be generated.
-  * pname:stageCount is the number of entries in the pname:pStages array.
-  * pname:pStages is a pointer to an array of pname:stageCount
-    slink:VkPipelineShaderStageCreateInfo structures describing the set of
-    the shader stages to be included in the graphics pipeline.
-  * pname:pVertexInputState is a pointer to a
-    slink:VkPipelineVertexInputStateCreateInfo structure.
-ifdef::VK_NV_mesh_shader[]
-    It is ignored if the pipeline includes a mesh shader stage.
-endif::VK_NV_mesh_shader[]
-ifdef::VK_EXT_vertex_input_dynamic_state[]
-    It is ignored if the pipeline is created with the
-    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT dynamic state set.
-endif::VK_EXT_vertex_input_dynamic_state[]
-  * pname:pInputAssemblyState is a pointer to a
-    slink:VkPipelineInputAssemblyStateCreateInfo structure which determines
-    input assembly behavior, as described in <<drawing, Drawing Commands>>.
-ifdef::VK_NV_mesh_shader[]
-    It is ignored if the pipeline includes a mesh shader stage.
-endif::VK_NV_mesh_shader[]
-  * pname:pTessellationState is a pointer to a
-    slink:VkPipelineTessellationStateCreateInfo structure, and is ignored if
-    the pipeline does not include a tessellation control shader stage and
-    tessellation evaluation shader stage.
-  * pname:pViewportState is a pointer to a
-    slink:VkPipelineViewportStateCreateInfo structure, and is ignored if the
-    pipeline has rasterization disabled.
-  * pname:pRasterizationState is a pointer to a
-    slink:VkPipelineRasterizationStateCreateInfo structure.
-  * pname:pMultisampleState is a pointer to a
-    slink:VkPipelineMultisampleStateCreateInfo structure, and is ignored if
-    the pipeline has rasterization disabled.
-  * pname:pDepthStencilState is a pointer to a
-    slink:VkPipelineDepthStencilStateCreateInfo structure, and is ignored if
-    the pipeline has rasterization disabled or if no depth/stencil
-    attachment is used.
-  * pname:pColorBlendState is a pointer to a
-    slink:VkPipelineColorBlendStateCreateInfo structure, and is ignored if
-    the pipeline has rasterization disabled or if no color attachments are
-    used.
-  * pname:pDynamicState is a pointer to a
-    slink:VkPipelineDynamicStateCreateInfo structure, and is used to
-    indicate which properties of the pipeline state object are dynamic and
-    can: be changed independently of the pipeline state.
-    This can: be `NULL`, which means no state in the pipeline is considered
-    dynamic.
-  * pname:layout is the description of binding locations used by both the
-    pipeline and descriptor sets used with the pipeline.
-  * pname:renderPass is a handle to a render pass object describing the
-    environment in which the pipeline will be used.
-    The pipeline must: only be used with a render pass instance compatible
-    with the one provided.
-    See <<renderpass-compatibility,Render Pass Compatibility>> for more
-    information.
-  * pname:subpass is the index of the subpass in the render pass where this
-    pipeline will be used.
-  * pname:basePipelineHandle is a pipeline to derive from.
-  * pname:basePipelineIndex is an index into the pname:pCreateInfos
-    parameter to use as a pipeline to derive from.
-
-The parameters pname:basePipelineHandle and pname:basePipelineIndex are
-described in more detail in <<pipelines-pipeline-derivatives,Pipeline
-Derivatives>>.
-
-ifdef::VK_NV_glsl_shader[]
-If any shader stage fails to compile,
-ifdef::VK_EXT_debug_report[]
-the compile log will be reported back to the application, and
-endif::VK_EXT_debug_report[]
-ename:VK_ERROR_INVALID_SHADER_NV will be generated.
-endif::VK_NV_glsl_shader[]
-
-[[pipeline-graphics-subsets]]
-The state required for a graphics pipeline is divided into
-<<pipeline-graphics-subsets-vertex-input, vertex input state>>,
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-state>>, <<pipeline-graphics-subsets-fragment-shader,fragment shader
-state>>, and <<pipeline-graphics-subsets-fragment-output,fragment output
-state>>.
-
-[[pipeline-graphics-subsets-vertex-input]]
-Vertex input state is defined by:
-
-  * slink:VkPipelineVertexInputStateCreateInfo
-  * slink:VkPipelineInputAssemblyStateCreateInfo
-
-[[pipeline-graphics-subsets-pre-rasterization]]
-Pre-rasterization shader state is defined by:
-
-  * slink:VkPipelineShaderStageCreateInfo entries for:
-  ** Vertex shaders
-  ** Tessellation control shaders
-  ** Tessellation evaluation shaders
-  ** Geometry shaders
-ifdef::VK_NV_mesh_shader[]
-  ** Task shaders
-  ** Mesh shaders
-endif::VK_NV_mesh_shader[]
-  * Within the slink:VkPipelineLayout, all bindings that affect the
-    specified shader stages
-  * slink:VkPipelineViewportStateCreateInfo
-  * slink:VkPipelineRasterizationStateCreateInfo
-  * slink:VkPipelineTessellationStateCreateInfo if tessellation stages are
-    included.
-  * slink:VkRenderPass and pname:subpass parameter
-ifdef::VK_EXT_discard_rectangles[]
-  * slink:VkPipelineDiscardRectangleStateCreateInfoEXT
-endif::VK_EXT_discard_rectangles[]
-ifdef::VK_KHR_fragment_shading_rate[]
-  * slink:VkPipelineFragmentShadingRateStateCreateInfoKHR
-ifdef::VK_NV_fragment_shading_rate_enums[]
-  * slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV
-endif::VK_NV_fragment_shading_rate_enums[]
-endif::VK_KHR_fragment_shading_rate[]
-
-[[pipeline-graphics-subsets-fragment-shader]]
-Fragment shader state is defined by:
-
-  * A slink:VkPipelineShaderStageCreateInfo entry for the fragment shader
-  * Within the slink:VkPipelineLayout, all bindings that affect the fragment
-    shader
-  * slink:VkPipelineMultisampleStateCreateInfo
-  * slink:VkPipelineDepthStencilStateCreateInfo
-  * slink:VkRenderPass and pname:subpass parameter
-ifdef::VK_KHR_fragment_shading_rate[]
-  * slink:VkPipelineFragmentShadingRateStateCreateInfoKHR
-ifdef::VK_NV_fragment_shading_rate_enums[]
-  * slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV
-endif::VK_NV_fragment_shading_rate_enums[]
-endif::VK_KHR_fragment_shading_rate[]
-
-[[pipeline-graphics-subsets-fragment-output]]
-Fragment output state is defined by:
-
-  * slink:VkPipelineColorBlendStateCreateInfo
-  * The pname:alphaToCoverageEnable and pname:alphaToOneEnable members of
-    slink:VkPipelineMultisampleStateCreateInfo.
-  * slink:VkRenderPass and pname:subpass parameter
-
-[[pipeline-graphics-subsets-complete]]
-A complete graphics pipeline always includes
-<<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-state>>, with other subsets included depending on that state.
-If the <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization
-shader state>> includes a vertex shader, then
-<<pipeline-graphics-subsets-vertex-input, vertex input state>> is included
-in a complete graphics pipeline.
-If the value of
-slink:VkPipelineRasterizationStateCreateInfo::pname:rasterizerDiscardEnable
-in the <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization
-shader state>> is ename:VK_FALSE
-ifdef::VK_EXT_extended_dynamic_state2[]
-or the ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT dynamic state is
-enabled
-endif::VK_EXT_extended_dynamic_state2[]
-<<pipeline-graphics-subsets-fragment-shader, fragment shader state>> and
-<<pipeline-graphics-subsets-fragment-output, fragment output interface
-state>> is included in a complete graphics pipeline.
-
-Pipelines must: be created with a complete set of pipeline state.
-
-.Valid Usage
-****
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-00722]]
-    If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
-    flag, and pname:basePipelineIndex is -1, pname:basePipelineHandle must:
-    be a valid handle to a graphics sname:VkPipeline
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-00723]]
-    If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
-    flag, and pname:basePipelineHandle is dlink:VK_NULL_HANDLE,
-    pname:basePipelineIndex must: be a valid index into the calling
-    command's pname:pCreateInfos parameter
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-00724]]
-    If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
-    flag, and pname:basePipelineIndex is not -1, pname:basePipelineHandle
-    must: be dlink:VK_NULL_HANDLE
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-00725]]
-    If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT
-    flag, and pname:basePipelineHandle is not dlink:VK_NULL_HANDLE,
-    pname:basePipelineIndex must: be -1
-  * [[VUID-VkGraphicsPipelineCreateInfo-stage-00726]]
-    The pname:stage member of each element of pname:pStages must: be unique
-ifndef::VK_NV_mesh_shader[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-stage-00727]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> the pname:stage member of one element of pname:pStages must: be
-    ename:VK_SHADER_STAGE_VERTEX_BIT
-endif::VK_NV_mesh_shader[]
-ifdef::VK_NV_mesh_shader[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-02095]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> the geometric shader stages provided in pname:pStages must: be
-    either from the mesh shading pipeline (pname:stage is
-    ename:VK_SHADER_STAGE_TASK_BIT_NV or ename:VK_SHADER_STAGE_MESH_BIT_NV)
-    or from the primitive shading pipeline (pname:stage is
-    ename:VK_SHADER_STAGE_VERTEX_BIT,
-    ename:VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
-    ename:VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, or
-    ename:VK_SHADER_STAGE_GEOMETRY_BIT)
-  * [[VUID-VkGraphicsPipelineCreateInfo-stage-02096]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> the pname:stage member of one element of pname:pStages must: be
-    either ename:VK_SHADER_STAGE_VERTEX_BIT or
-    ename:VK_SHADER_STAGE_MESH_BIT_NV
-endif::VK_NV_mesh_shader[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-stage-00728]]
-    The pname:stage member of each element of pname:pStages must: not be
-    ename:VK_SHADER_STAGE_COMPUTE_BIT
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00729]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and pname:pStages includes a tessellation control shader stage,
-    it must: include a tessellation evaluation shader stage
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00730]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and pname:pStages includes a tessellation evaluation shader
-    stage, it must: include a tessellation control shader stage
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00731]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and pname:pStages includes a tessellation control shader stage
-    and a tessellation evaluation shader stage, pname:pTessellationState
-    must: be a valid pointer to a valid
-    slink:VkPipelineTessellationStateCreateInfo structure
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00732]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and pname:pStages includes tessellation shader stages, the
-    shader code of at least one stage must: contain an code:OpExecutionMode
-    instruction that specifies the type of subdivision in the pipeline
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00733]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and pname:pStages includes tessellation shader stages, and the
-    shader code of both stages contain an code:OpExecutionMode instruction
-    that specifies the type of subdivision in the pipeline, they must: both
-    specify the same subdivision mode
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00734]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and pname:pStages includes tessellation shader stages, the
-    shader code of at least one stage must: contain an code:OpExecutionMode
-    instruction that specifies the output patch size in the pipeline
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00735]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and pname:pStages includes tessellation shader stages, and the
-    shader code of both contain an code:OpExecutionMode instruction that
-    specifies the out patch size in the pipeline, they must: both specify
-    the same patch size
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00736]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and pname:pStages includes tessellation shader stages, the
-    pname:topology member of pname:pInputAssembly must: be
-    ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST
-  * [[VUID-VkGraphicsPipelineCreateInfo-topology-00737]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and the pname:topology member of pname:pInputAssembly is
-    ename:VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, pname:pStages must: include
-    tessellation shader stages
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00738]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and pname:pStages includes a geometry shader stage, and does not
-    include any tessellation shader stages, its shader code must: contain an
-    code:OpExecutionMode instruction that specifies an input primitive type
-    that is <<shaders-geometry-execution, compatible>> with the primitive
-    topology specified in pname:pInputAssembly
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00739]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and pname:pStages includes a geometry shader stage, and also
-    includes tessellation shader stages, its shader code must: contain an
-    code:OpExecutionMode instruction that specifies an input primitive type
-    that is <<shaders-geometry-execution, compatible>> with the primitive
-    topology that is output by the tessellation stages
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00740]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>>, it includes both a fragment shader and a geometry shader, and
-    the fragment shader code reads from an input variable that is decorated
-    with code:PrimitiveId, then the geometry shader code must: write to a
-    matching output variable, decorated with code:PrimitiveId, in all
-    execution paths
-ifdef::VK_NV_mesh_shader[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-PrimitiveId-06264]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, it includes a mesh shader and the fragment shader code reads
-    from an input variable that is decorated with code:PrimitiveId, then the
-    mesh shader code must: write to a matching output variable, decorated
-    with code:PrimitiveId, in all execution paths
-endif::VK_NV_mesh_shader[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06038]]
-    If pname:renderPass is not dlink:VK_NULL_HANDLE and the pipeline is
-    being created with <<pipeline-graphics-subsets-fragment-shader, fragment
-    shader state>> the fragment shader must: not read from any input
-    attachment that is defined as ename:VK_ATTACHMENT_UNUSED in
-    pname:subpass
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-00742]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and multiple pre-rasterization shader stages are included in
-    pname:pStages, the shader code for the entry points identified by those
-    pname:pStages and the rest of the state identified by this structure
-    must: adhere to the pipeline linking rules described in the
-    <<interfaces,Shader Interfaces>> chapter
-  * [[VUID-VkGraphicsPipelineCreateInfo-None-04889]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>>, the fragment shader and last
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stage>> and any relevant state must: adhere to the pipeline linking
-    rules described in the <<interfaces,Shader Interfaces>> chapter
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06039]]
-    If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being
-    created with <<pipeline-graphics-subsets-fragment-shader, fragment
-    shader state>>, and pname:subpass uses a depth/stencil attachment in
-    pname:renderPass with a read-only layout for the depth aspect in the
-    slink:VkAttachmentReference defined by pname:subpass, the
-    pname:depthWriteEnable member of pname:pDepthStencilState must: be
-    ename:VK_FALSE
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06040]]
-    If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being
-    created with <<pipeline-graphics-subsets-fragment-shader, fragment
-    shader state>>, and pname:subpass uses a depth/stencil attachment in
-    pname:renderPass with a read-only layout for the stencil aspect in the
-    slink:VkAttachmentReference defined by pname:subpass, the pname:failOp,
-    pname:passOp and pname:depthFailOp members of each of the pname:front
-    and pname:back members of pname:pDepthStencilState must: be
-    ename:VK_STENCIL_OP_KEEP
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06041]]
-    If pname:renderPass is not dlink:VK_NULL_HANDLE, and the pipeline is
-    being created with <<pipeline-graphics-subsets-fragment-output, fragment
-    output interface state>>, then for each color attachment in the subpass,
-    if the <<potential-format-features,potential format features>> of the
-    format of the corresponding attachment description do not contain
-    ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT, then the
-    pname:blendEnable member of the corresponding element of the
-    pname:pAttachments member of pname:pColorBlendState must: be
-    ename:VK_FALSE
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06042]]
-    If pname:renderPass is not dlink:VK_NULL_HANDLE, and the pipeline is
-    being created with <<pipeline-graphics-subsets-fragment-output, fragment
-    output interface state>>, and the subpass uses color attachments, the
-    pname:attachmentCount member of pname:pColorBlendState must: be equal to
-    the pname:colorAttachmentCount used to create pname:subpass
-ifndef::VK_EXT_extended_dynamic_state[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00747]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and no element of the pname:pDynamicStates member of
-    pname:pDynamicState is ename:VK_DYNAMIC_STATE_VIEWPORT, the
-    pname:pViewports member of pname:pViewportState must: be a valid pointer
-    to an array of pname:pViewportState->viewportCount valid
-    sname:VkViewport structures
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00748]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and no element of the pname:pDynamicStates member of
-    pname:pDynamicState is ename:VK_DYNAMIC_STATE_SCISSOR, the
-    pname:pScissors member of pname:pViewportState must: be a valid pointer
-    to an array of pname:pViewportState->scissorCount sname:VkRect2D
-    structures
-endif::VK_EXT_extended_dynamic_state[]
-ifdef::VK_EXT_extended_dynamic_state[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04130]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and no element of the pname:pDynamicStates member of
-    pname:pDynamicState is ename:VK_DYNAMIC_STATE_VIEWPORT or
-    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT, the pname:pViewports
-    member of pname:pViewportState must: be a valid pointer to an array of
-    pname:pViewportState->viewportCount valid sname:VkViewport structures
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04131]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and no element of the pname:pDynamicStates member of
-    pname:pDynamicState is ename:VK_DYNAMIC_STATE_SCISSOR or
-    ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT, the pname:pScissors
-    member of pname:pViewportState must: be a valid pointer to an array of
-    pname:pViewportState->scissorCount sname:VkRect2D structures
-endif::VK_EXT_extended_dynamic_state[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00749]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and the wide lines feature is not enabled, and no element of
-    the pname:pDynamicStates member of pname:pDynamicState is
-    ename:VK_DYNAMIC_STATE_LINE_WIDTH, the pname:lineWidth member of
-    pname:pRasterizationState must: be `1.0`
-  * [[VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00750]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and the pname:rasterizerDiscardEnable member of
-    pname:pRasterizationState is ename:VK_FALSE, pname:pViewportState must:
-    be a valid pointer to a valid slink:VkPipelineViewportStateCreateInfo
-    structure
-ifdef::VK_EXT_extended_dynamic_state2[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pViewportState-04892]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and the graphics pipeline state was created with the
-    ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT dynamic state
-    enabled, pname:pViewportState must: be a valid pointer to a valid
-    slink:VkPipelineViewportStateCreateInfo structure
-endif::VK_EXT_extended_dynamic_state2[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00751]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
-    pname:pMultisampleState must: be a valid pointer to a valid
-    slink:VkPipelineMultisampleStateCreateInfo structure
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06043]]
-    If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being
-    created with <<pipeline-graphics-subsets-fragment-shader, fragment
-    shader state>>, and pname:subpass uses a depth/stencil attachment,
-    pname:pDepthStencilState must: be a valid pointer to a valid
-    slink:VkPipelineDepthStencilStateCreateInfo structure
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06044]]
-    If pname:renderPass is not dlink:VK_NULL_HANDLE, the pipeline is being
-    created with <<pipeline-graphics-subsets-fragment-output, fragment
-    output interface state>>, and pname:subpass uses color attachments,
-    pname:pColorBlendState must: be a valid pointer to a valid
-    slink:VkPipelineColorBlendStateCreateInfo structure
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06045]]
-    If pname:renderPass is not dlink:VK_NULL_HANDLE and the pipeline is
-    being created with <<pipeline-graphics-subsets-fragment-output, fragment
-    output interface state>>, pname:pColorBlendState->attachmentCount must:
-    be greater than the index of all color attachments that are not
-    ename:VK_ATTACHMENT_UNUSED for the pname:subpass index in
-    pname:renderPass
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00754]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, the depth bias clamping feature is not enabled, no element of
-    the pname:pDynamicStates member of pname:pDynamicState is
-    ename:VK_DYNAMIC_STATE_DEPTH_BIAS, and the pname:depthBiasEnable member
-    of pname:pRasterizationState is ename:VK_TRUE, the pname:depthBiasClamp
-    member of pname:pRasterizationState must: be `0.0`
-ifndef::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00755]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
-    and no element of the pname:pDynamicStates member of pname:pDynamicState
-    is ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS, and the
-    pname:depthBoundsTestEnable member of pname:pDepthStencilState is
-    ename:VK_TRUE, the pname:minDepthBounds and pname:maxDepthBounds members
-    of pname:pDepthStencilState must: be between `0.0` and `1.0`, inclusive
-endif::VK_EXT_depth_range_unrestricted[]
-ifdef::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-02510]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
-    and the `apiext:VK_EXT_depth_range_unrestricted` extension is not
-    enabled and no element of the pname:pDynamicStates member of
-    pname:pDynamicState is ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS, and the
-    pname:depthBoundsTestEnable member of pname:pDepthStencilState is
-    ename:VK_TRUE, the pname:minDepthBounds and pname:maxDepthBounds members
-    of pname:pDepthStencilState must: be between `0.0` and `1.0`, inclusive
-endif::VK_EXT_depth_range_unrestricted[]
-ifdef::VK_EXT_sample_locations[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01521]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
-    and no element of the pname:pDynamicStates member of pname:pDynamicState
-    is ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the
-    pname:sampleLocationsEnable member of a
-    slink:VkPipelineSampleLocationsStateCreateInfoEXT structure included in
-    the pname:pNext chain of pname:pMultisampleState is ename:VK_TRUE,
-    pname:sampleLocationsInfo.sampleLocationGridSize.width must: evenly
-    divide
-    slink:VkMultisamplePropertiesEXT::pname:sampleLocationGridSize.width as
-    returned by flink:vkGetPhysicalDeviceMultisamplePropertiesEXT with a
-    pname:samples parameter equaling pname:rasterizationSamples
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
-    and no element of the pname:pDynamicStates member of pname:pDynamicState
-    is ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the
-    pname:sampleLocationsEnable member of a
-    slink:VkPipelineSampleLocationsStateCreateInfoEXT structure included in
-    the pname:pNext chain of pname:pMultisampleState is ename:VK_TRUE,
-    pname:sampleLocationsInfo.sampleLocationGridSize.height must: evenly
-    divide
-    slink:VkMultisamplePropertiesEXT::pname:sampleLocationGridSize.height as
-    returned by flink:vkGetPhysicalDeviceMultisamplePropertiesEXT with a
-    pname:samples parameter equaling pname:rasterizationSamples
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01523]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
-    and no element of the pname:pDynamicStates member of pname:pDynamicState
-    is ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the
-    pname:sampleLocationsEnable member of a
-    slink:VkPipelineSampleLocationsStateCreateInfoEXT structure included in
-    the pname:pNext chain of pname:pMultisampleState is ename:VK_TRUE,
-    pname:sampleLocationsInfo.sampleLocationsPerPixel must: equal
-    pname:rasterizationSamples
-  * [[VUID-VkGraphicsPipelineCreateInfo-sampleLocationsEnable-01524]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
-    and the pname:sampleLocationsEnable member of a
-    slink:VkPipelineSampleLocationsStateCreateInfoEXT structure included in
-    the pname:pNext chain of pname:pMultisampleState is ename:VK_TRUE, the
-    fragment shader code must: not statically use the extended instruction
-    code:InterpolateAtSample
-endif::VK_EXT_sample_locations[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-layout-00756]]
-    pname:layout must: be
-    <<descriptorsets-pipelinelayout-consistency,consistent>> with all
-    shaders specified in pname:pStages
-  * [[VUID-VkGraphicsPipelineCreateInfo-subpass-00757]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
-    and neither the `apiext:VK_AMD_mixed_attachment_samples` nor the
-    `apiext:VK_NV_framebuffer_mixed_samples` extensions are enabled, and if
-    pname:subpass uses color and/or depth/stencil attachments, then the
-    pname:rasterizationSamples member of pname:pMultisampleState must: be
-    the same as the sample count for those subpass attachments
-ifdef::VK_AMD_mixed_attachment_samples[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-subpass-01505]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
-    and the `apiext:VK_AMD_mixed_attachment_samples` extension is enabled,
-    and if pname:subpass uses color and/or depth/stencil attachments, then
-    the pname:rasterizationSamples member of pname:pMultisampleState must:
-    equal the maximum of the sample counts of those subpass attachments
-endif::VK_AMD_mixed_attachment_samples[]
-ifdef::VK_NV_framebuffer_mixed_samples[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-subpass-01411]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
-    and the `apiext:VK_NV_framebuffer_mixed_samples` extension is enabled,
-    and if pname:subpass has a depth/stencil attachment and depth test,
-    stencil test, or depth bounds test are enabled, then the
-    pname:rasterizationSamples member of pname:pMultisampleState must: be
-    the same as the sample count of the depth/stencil attachment
-  * [[VUID-VkGraphicsPipelineCreateInfo-subpass-01412]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
-    and the `apiext:VK_NV_framebuffer_mixed_samples` extension is enabled,
-    and if pname:subpass has any color attachments, then the
-    pname:rasterizationSamples member of pname:pMultisampleState must: be
-    greater than or equal to the sample count for those subpass attachments
-endif::VK_NV_framebuffer_mixed_samples[]
-ifdef::VK_NV_coverage_reduction_mode[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-coverageReductionMode-02722]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
-    and the `apiext:VK_NV_coverage_reduction_mode` extension is enabled, the
-    coverage reduction mode specified by
-    slink:VkPipelineCoverageReductionStateCreateInfoNV::pname:coverageReductionMode,
-    the pname:rasterizationSamples member of pname:pMultisampleState and the
-    sample counts for the color and depth/stencil attachments (if the
-    subpass has them) must: be a valid combination returned by
-    fname:vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV
-endif::VK_NV_coverage_reduction_mode[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-subpass-00758]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>> and
-    pname:subpass does not use any color and/or depth/stencil attachments,
-    then the pname:rasterizationSamples member of pname:pMultisampleState
-    must: follow the rules for a <<renderpass-noattachments, zero-attachment
-    subpass>>
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06046]]
-    If pname:renderPass is a valid renderPass, pname:subpass must: be a
-    valid subpass within pname:renderPass
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06047]]
-    If pname:renderPass is a valid renderPass, the pipeline is being created
-    with <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization
-    shader state>>, and the pname:renderPass has multiview enabled and
-    pname:subpass has more than one bit set in the view mask and
-    pname:multiviewTessellationShader is not enabled, then pname:pStages
-    must: not include tessellation shaders
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06048]]
-    If pname:renderPass is a valid renderPass, the pipeline is being created
-    with <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization
-    shader state>>, and the pname:renderPass has multiview enabled and
-    pname:subpass has more than one bit set in the view mask and
-    pname:multiviewGeometryShader is not enabled, then pname:pStages must:
-    not include a geometry shader
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06049]]
-    If pname:renderPass is a valid renderPass, the pipeline is being created
-    with <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization
-    shader state>>, and the pname:renderPass has multiview enabled and
-    pname:subpass has more than one bit set in the view mask, shaders in the
-    pipeline must: not write to the code:Layer built-in output
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06050]]
-    If pname:renderPass is a valid renderPass and the pipeline is being
-    created with <<pipeline-graphics-subsets-pre-rasterization,
-    pre-rasterization shader state>>, and the pname:renderPass has multiview
-    enabled, then all shaders must: not include variables decorated with the
-    code:Layer built-in decoration in their interfaces
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-00764]]
-    pname:flags must: not contain the ename:VK_PIPELINE_CREATE_DISPATCH_BASE
-    flag
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2,VK_KHR_create_renderpass2[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-01565]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>> and
-    an input attachment was referenced by an pname:aspectMask at
-    pname:renderPass creation time, the fragment shader must: only read from
-    the aspects that were specified for that input attachment
-endif::VK_VERSION_1_1,VK_KHR_maintenance2,VK_KHR_create_renderpass2[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-layout-01688]]
-    The number of resources in pname:layout accessible to each shader stage
-    that is used by the pipeline must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxPerStageResources
-ifdef::VK_NV_clip_space_w_scaling[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and no element of the pname:pDynamicStates member of
-    pname:pDynamicState is ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV, and
-    the pname:viewportWScalingEnable member of a
-    slink:VkPipelineViewportWScalingStateCreateInfoNV structure, included in
-    the pname:pNext chain of pname:pViewportState, is ename:VK_TRUE, the
-    pname:pViewportWScalings member of the
-    slink:VkPipelineViewportWScalingStateCreateInfoNV must: be a pointer to
-    an array of
-    slink:VkPipelineViewportWScalingStateCreateInfoNV::pname:viewportCount
-    valid slink:VkViewportWScalingNV structures
-endif::VK_NV_clip_space_w_scaling[]
-ifdef::VK_NV_scissor_exclusive[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and no element of the pname:pDynamicStates member of
-    pname:pDynamicState is ename:VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV, and
-    if pname:pViewportState->pNext chain includes a
-    slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV structure, and
-    if its pname:exclusiveScissorCount member is not `0`, then its
-    pname:pExclusiveScissors member must: be a valid pointer to an array of
-    pname:exclusiveScissorCount slink:VkRect2D structures
-endif::VK_NV_scissor_exclusive[]
-ifdef::VK_NV_shading_rate_image[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04057]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and no element of the pname:pDynamicStates member of
-    pname:pDynamicState is
-    ename:VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV, and if
-    pname:pViewportState->pNext chain includes a
-    slink:VkPipelineViewportShadingRateImageStateCreateInfoNV structure,
-    then its pname:pShadingRatePalettes member must: be a valid pointer to
-    an array of pname:viewportCount valid slink:VkShadingRatePaletteNV
-    structures
-endif::VK_NV_shading_rate_image[]
-ifdef::VK_EXT_discard_rectangles[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04058]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and no element of the pname:pDynamicStates member of
-    pname:pDynamicState is ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT, and
-    if pname:pNext chain includes a
-    slink:VkPipelineDiscardRectangleStateCreateInfoEXT structure, and if its
-    pname:discardRectangleCount member is not `0`, then its
-    pname:pDiscardRectangles member must: be a valid pointer to an array of
-    pname:discardRectangleCount slink:VkRect2D structures
-endif::VK_EXT_discard_rectangles[]
-ifndef::VK_EXT_vertex_input_dynamic_state[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-02097]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-vertex-input, vertex input state>>,
-    pname:pVertexInputState must: be a valid pointer to a valid
-    slink:VkPipelineVertexInputStateCreateInfo structure
-endif::VK_EXT_vertex_input_dynamic_state[]
-ifndef::VK_EXT_vertex_input_dynamic_state[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pVertexInputState-04910]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-vertex-input, vertex input state>>, and
-    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT is not set,
-    pname:pVertexInputState must: be a valid pointer to a valid
-    slink:VkPipelineVertexInputStateCreateInfo structure
-endif::VK_EXT_vertex_input_dynamic_state[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-02098]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-vertex-input, vertex input state>>,
-    pname:pInputAssemblyState must: be a valid pointer to a valid
-    slink:VkPipelineInputAssemblyStateCreateInfo structure
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-02317]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, the code:Xfb execution mode can: be specified by no more than
-    one shader stage in pname:pStages
-  * [[VUID-VkGraphicsPipelineCreateInfo-pStages-02318]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and any shader stage in pname:pStages specifies code:Xfb
-    execution mode it must: be the last
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stage>>
-  * [[VUID-VkGraphicsPipelineCreateInfo-rasterizationStream-02319]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and a
-    slink:VkPipelineRasterizationStateStreamCreateInfoEXT::pname:rasterizationStream
-    value other than zero is specified, all variables in the output
-    interface of the entry point being compiled decorated with
-    code:Position, code:PointSize, code:ClipDistance, or code:CullDistance
-    must: be decorated with identical code:Stream values that match the
-    pname:rasterizationStream
-  * [[VUID-VkGraphicsPipelineCreateInfo-rasterizationStream-02320]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and
-    slink:VkPipelineRasterizationStateStreamCreateInfoEXT::pname:rasterizationStream
-    is zero, or not specified, all variables in the output interface of the
-    entry point being compiled decorated with code:Position, code:PointSize,
-    code:ClipDistance, or code:CullDistance must: be decorated with a
-    code:Stream value of zero, or must: not specify the code:Stream
-    decoration
-  * [[VUID-VkGraphicsPipelineCreateInfo-geometryStreams-02321]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and the last
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stage>> is a geometry shader, and that geometry shader uses the
-    code:GeometryStreams capability, then
-    sname:VkPhysicalDeviceTransformFeedbackFeaturesEXT::pname:geometryStreams
-    feature must: be enabled
-ifdef::VK_NV_mesh_shader[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-None-02322]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and there are any mesh shader stages in the pipeline there
-    must: not be any shader stage in the pipeline with a code:Xfb execution
-    mode
-endif::VK_NV_mesh_shader[]
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_EXT_line_rasterization[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-lineRasterizationMode-02766]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and at least one of <<pipeline-graphics-subsets-fragment-output,
-    fragment output interface state>> or
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>>,
-    the pname:lineRasterizationMode member of a
-    slink:VkPipelineRasterizationLineStateCreateInfoEXT structure included
-    in the pname:pNext chain of pname:pRasterizationState is
-    ename:VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT or
-    ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT, then the
-    pname:alphaToCoverageEnable, pname:alphaToOneEnable, and
-    pname:sampleShadingEnable members of pname:pMultisampleState must: all
-    be ename:VK_FALSE
-  * [[VUID-VkGraphicsPipelineCreateInfo-stippledLineEnable-02767]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, the pname:stippledLineEnable member of
-    slink:VkPipelineRasterizationLineStateCreateInfoEXT is ename:VK_TRUE,
-    and no element of the pname:pDynamicStates member of pname:pDynamicState
-    is ename:VK_DYNAMIC_STATE_LINE_STIPPLE_EXT, then the
-    pname:lineStippleFactor member of
-    slink:VkPipelineRasterizationLineStateCreateInfoEXT must: be in the
-    range [eq]#[1,256]#
-endif::VK_EXT_line_rasterization[]
-ifdef::VK_KHR_pipeline_library[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-03371]]
-    pname:flags must: not include ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
-endif::VK_KHR_pipeline_library[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-03372]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-03373]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-03374]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-03375]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-03376]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-03377]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-03577]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_NV_ray_tracing_motion_blur[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-04947]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV
-endif::VK_NV_ray_tracing_motion_blur[]
-ifdef::VK_EXT_extended_dynamic_state[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03378]]
-    If the <<features-extendedDynamicState, extendedDynamicState>> feature
-    is not enabled, there must: be no element of the pname:pDynamicStates
-    member of pname:pDynamicState set to
-    ename:VK_DYNAMIC_STATE_CULL_MODE_EXT,
-    ename:VK_DYNAMIC_STATE_FRONT_FACE_EXT,
-    ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT,
-    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT,
-    ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT,
-    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT,
-    ename:VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT,
-    ename:VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT,
-    ename:VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT,
-    ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT,
-    ename:VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT, or
-    ename:VK_DYNAMIC_STATE_STENCIL_OP_EXT
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03379]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT is included
-    in the pname:pDynamicStates array then pname:viewportCount must: be zero
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03380]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT is included
-    in the pname:pDynamicStates array then pname:scissorCount must: be zero
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04132]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT is included
-    in the pname:pDynamicStates array then ename:VK_DYNAMIC_STATE_VIEWPORT
-    must: not be present
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04133]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>>, and ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT is included
-    in the pname:pDynamicStates array then ename:VK_DYNAMIC_STATE_SCISSOR
-    must: not be present
-endif::VK_EXT_extended_dynamic_state[]
-ifdef::VK_EXT_extended_dynamic_state2[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04868]]
-    If the <<features-extendedDynamicState2, extendedDynamicState2>> feature
-    is not enabled, there must: be no element of the pname:pDynamicStates
-    member of pname:pDynamicState set to
-    ename:VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT,
-    ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT, or
-    ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04869]]
-    If the <<features-extendedDynamicState2LogicOp,
-    extendedDynamicState2LogicOp>> feature is not enabled, there must: be no
-    element of the pname:pDynamicStates member of pname:pDynamicState set to
-    ename:VK_DYNAMIC_STATE_LOGIC_OP_EXT
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04870]]
-    If the <<features-extendedDynamicState2PatchControlPoints,
-    extendedDynamicState2PatchControlPoints>> feature is not enabled, there
-    must: be no element of the pname:pDynamicStates member of
-    pname:pDynamicState set to
-    ename:VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT
-endif::VK_EXT_extended_dynamic_state2[]
-ifdef::VK_NV_device_generated_commands[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-02877]]
-    If pname:flags includes
-    ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV, then the
-    <<features-deviceGeneratedCommands,
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
-    feature must: be enabled
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-02966]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and pname:flags includes
-    ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV, then all stages must:
-    not specify code:Xfb execution mode
-endif::VK_EXT_transform_feedback[]
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pipelineCreationCacheControl-02878]]
-    If the <<features-pipelineCreationCacheControl,
-    pname:pipelineCreationCacheControl>> feature is not enabled, pname:flags
-    must: not include
-    ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or
-    ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT
-endif::VK_EXT_pipeline_creation_cache_control[]
-ifdef::VK_KHR_fragment_shading_rate[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04494]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
-    included in pname:pDynamicState->pDynamicStates,
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.width
-    must: be greater than or equal to `1`
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04495]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
-    included in pname:pDynamicState->pDynamicStates,
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.height
-    must: be greater than or equal to `1`
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04496]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
-    included in pname:pDynamicState->pDynamicStates,
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.width
-    must: be a power-of-two value
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04497]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
-    included in pname:pDynamicState->pDynamicStates,
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.height
-    must: be a power-of-two value
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04498]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
-    included in pname:pDynamicState->pDynamicStates,
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.width
-    must: be less than or equal to `4`
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04499]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
-    included in pname:pDynamicState->pDynamicStates,
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.height
-    must: be less than or equal to `4`
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04500]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
-    included in pname:pDynamicState->pDynamicStates, and the
-    <<features-pipelineFragmentShadingRate,
-    pname:pipelineFragmentShadingRate feature>> is not enabled,
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.width
-    and
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:fragmentSize.height
-    must: both be equal to `1`
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04501]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
-    included in pname:pDynamicState->pDynamicStates, and the
-    <<features-primitiveFragmentShadingRate,
-    pname:primitiveFragmentShadingRate feature>> is not enabled,
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:combinerOps[0]
-    must: be ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04502]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>> and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
-    included in pname:pDynamicState->pDynamicStates, and the
-    <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate feature>> is not enabled,
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:combinerOps[1]
-    must: be ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR
-ifdef::VK_EXT_extended_dynamic_state[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-primitiveFragmentShadingRateWithMultipleViewports-04503]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and the
-    <<limits-primitiveFragmentShadingRateWithMultipleViewports,
-    pname:primitiveFragmentShadingRateWithMultipleViewports>> limit is not
-    supported, ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT is not
-    included in pname:pDynamicState->pDynamicStates, and
-    slink:VkPipelineViewportStateCreateInfo::pname:viewportCount is greater
-    than `1`, entry points specified in pname:pStages must: not write to the
-    code:PrimitiveShadingRateKHR built-in
-endif::VK_EXT_extended_dynamic_state[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-primitiveFragmentShadingRateWithMultipleViewports-04504]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and the
-    <<limits-primitiveFragmentShadingRateWithMultipleViewports,
-    pname:primitiveFragmentShadingRateWithMultipleViewports>> limit is not
-    supported, and entry points specified in pname:pStages write to the
-    code:ViewportIndex built-in, they must: not also write to the
-    code:PrimitiveShadingRateKHR built-in
-ifdef::VK_NV_viewport_array2[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-primitiveFragmentShadingRateWithMultipleViewports-04505]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and the
-    <<limits-primitiveFragmentShadingRateWithMultipleViewports,
-    pname:primitiveFragmentShadingRateWithMultipleViewports>> limit is not
-    supported, and entry points specified in pname:pStages write to the
-    code:ViewportMaskNV built-in, they must: not also write to the
-    code:PrimitiveShadingRateKHR built-in
-endif::VK_NV_viewport_array2[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-fragmentShadingRateNonTrivialCombinerOps-04506]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>>, the <<limits-fragmentShadingRateNonTrivialCombinerOps,
-    pname:fragmentShadingRateNonTrivialCombinerOps>> limit is not supported,
-    and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not included in
-    pname:pDynamicState->pDynamicStates, elements of
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR::pname:combinerOps
-    must: be ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR or
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_NV_fragment_shading_rate_enums[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04569]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>>, and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
-    included in pname:pDynamicState->pDynamicStates, and the
-    <<features-fragmentShadingRateEnums, pname:fragmentShadingRateEnums
-    feature>> is not enabled,
-    slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:shadingRateType
-    must: be equal to ename:VK_FRAGMENT_SHADING_RATE_TYPE_FRAGMENT_SIZE_NV
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04570]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>>, and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
-    included in pname:pDynamicState->pDynamicStates, and the
-    <<features-pipelineFragmentShadingRate,
-    pname:pipelineFragmentShadingRate feature>> is not enabled,
-    slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:shadingRate
-    must: be equal to
-    ename:VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04571]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>>, and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
-    included in pname:pDynamicState->pDynamicStates, and the
-    <<features-primitiveFragmentShadingRate,
-    pname:primitiveFragmentShadingRate feature>> is not enabled,
-    slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:combinerOps[0]
-    must: be ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicState-04572]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>>, and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not
-    included in pname:pDynamicState->pDynamicStates, and the
-    <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate feature>> is not enabled,
-    slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:combinerOps[1]
-    must: be ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR
-  * [[VUID-VkGraphicsPipelineCreateInfo-fragmentShadingRateNonTrivialCombinerOps-04573]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>>, and the <<limits-fragmentShadingRateNonTrivialCombinerOps,
-    pname:fragmentShadingRateNonTrivialCombinerOps>> limit is not supported
-    and ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR is not included in
-    pname:pDynamicState->pDynamicStates, elements of
-    slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:combinerOps
-    must: be ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR or
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR
-  * [[VUID-VkGraphicsPipelineCreateInfo-None-04574]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>>, and the <<features-supersampleFragmentShadingRates,
-    supersampleFragmentShadingRates feature>> is not enabled,
-    slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:shadingRate
-    must: not be equal to
-    ename:VK_FRAGMENT_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV,
-    ename:VK_FRAGMENT_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV,
-    ename:VK_FRAGMENT_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV, or
-    ename:VK_FRAGMENT_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV
-  * [[VUID-VkGraphicsPipelineCreateInfo-None-04575]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> or <<pipeline-graphics-subsets-fragment-shader, fragment shader
-    state>>, and the <<features-noInvocationFragmentShadingRates,
-    noInvocationFragmentShadingRates feature>> is not enabled,
-    slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV::pname:shadingRate
-    must: not be equal to ename:VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV
-endif::VK_NV_fragment_shading_rate_enums[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03578]]
-    All elements of the pname:pDynamicStates member of pname:pDynamicState
-    must: not be ename:VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_EXT_vertex_input_dynamic_state[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04807]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-pre-rasterization, pre-rasterization shader
-    state>> and the <<features-vertexInputDynamicState,
-    vertexInputDynamicState>> feature is not enabled, there must: be no
-    element of the pname:pDynamicStates member of pname:pDynamicState set to
-    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT
-endif::VK_EXT_vertex_input_dynamic_state[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-None-04893]]
-    The pipeline must: be created with a
-    <<pipeline-graphics-subsets-complete, complete set of state>>
-ifdef::VK_EXT_color_write_enable[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04800]]
-    If the <<features-colorWriteEnable, colorWriteEnable>> feature is not
-    enabled, there must: be no element of the pname:pDynamicStates member of
-    pname:pDynamicState set to ename:VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT
-endif::VK_EXT_color_write_enable[]
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-rasterizationSamples-04899]]
-    If the pipeline is being created with fragment shader state, and the
-    apiext:VK_QCOM_render_pass_shader_resolve extension is enabled, and if
-    subpass has any input attachments, and if the subpass description
-    contains ename:VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM, then the
-    sample count of the input attachments must: equal
-    pname:rasterizationSamples
-  * [[VUID-VkGraphicsPipelineCreateInfo-sampleShadingEnable-04900]]
-    If the pipeline is being created with fragment shader state, and the
-    apiext:VK_QCOM_render_pass_shader_resolve extension is enabled, and if
-    the subpass description contains
-    ename:VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM, then
-    pname:sampleShadingEnable must: be false
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-04901]]
-    If pname:flags includes
-    ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, then the subpass
-    must: be the last subpass in a subpass dependency chain
-  * [[VUID-VkGraphicsPipelineCreateInfo-flags-04902]]
-    If pname:flags includes
-    ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, and if
-    pname:pResolveAttachments is not `NULL`, then each resolve attachment
-    must: be ename:VK_ATTACHMENT_UNUSED
-endif::VK_QCOM_render_pass_shader_resolve[]
-ifndef::VK_KHR_dynamic_rendering[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06051]]
-    pname:renderPass must: not be dlink:VK_NULL_HANDLE
-endif::VK_KHR_dynamic_rendering[]
-ifdef::VK_KHR_dynamic_rendering[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-dynamicRendering-06052]]
-    If the <<features-dynamicRendering,pname:dynamicRendering>> feature is
-    not enabled, pname:renderPass must: not be dlink:VK_NULL_HANDLE
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06053]]
-    If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being
-    created with <<pipeline-graphics-subsets-fragment-shader, fragment
-    shader state>>, and either of
-    slink:VkPipelineRenderingCreateInfoKHR::depthAttachmentFormat or
-    slink:VkPipelineRenderingCreateInfoKHR::stencilAttachmentFormat are not
-    ename:VK_FORMAT_UNDEFINED, pname:pDepthStencilState must: be a valid
-    pointer to a valid slink:VkPipelineDepthStencilStateCreateInfo structure
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06054]]
-    If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being
-    created with <<pipeline-graphics-subsets-fragment-output, fragment
-    output interface state>>, and
-    slink:VkPipelineRenderingCreateInfoKHR::colorAttachmentCount is not
-    equal to `0`, pname:pColorBlendState must: be a valid pointer to a valid
-    slink:VkPipelineColorBlendStateCreateInfo structure
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06055]]
-    If pname:renderPass is dlink:VK_NULL_HANDLE and the pipeline is being
-    created with <<pipeline-graphics-subsets-fragment-output, fragment
-    output interface state>>, pname:pColorBlendState->attachmentCount must:
-    be equal to slink:VkPipelineRenderingCreateInfoKHR::colorAttachmentCount
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06056]]
-    If pname:renderPass is dlink:VK_NULL_HANDLE and the pipeline is being
-    created with <<pipeline-graphics-subsets-fragment-shader, fragment
-    shader state>> the fragment shader must: not read from any input
-    attachment
-ifdef::VK_KHR_multiview,VK_VERSION_1_1[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06057]]
-    If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being
-    created with <<pipeline-graphics-subsets-pre-rasterization,
-    pre-rasterization shader state>>, the pname:viewMask member of a
-    slink:VkPipelineRenderingCreateInfoKHR structure included in the
-    pname:pNext chain is not `0`, and the
-    <<features-multiview-tess,pname:multiviewTessellationShader>> feature is
-    not enabled, then pname:pStages must: not include tessellation shaders
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06058]]
-    If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being
-    created with <<pipeline-graphics-subsets-pre-rasterization,
-    pre-rasterization shader state>>, the pname:viewMask member of a
-    slink:VkPipelineRenderingCreateInfoKHR structure included in the
-    pname:pNext chain is not `0`, and the
-    <<features-multiview-gs,pname:multiviewGeometryShader>> feature is not
-    enabled, then pname:pStages must: not include a geometry shader
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06059]]
-    If pname:renderPass is dlink:VK_NULL_HANDLE, the pipeline is being
-    created with <<pipeline-graphics-subsets-pre-rasterization,
-    pre-rasterization shader state>>, and the pname:viewMask member of a
-    slink:VkPipelineRenderingCreateInfoKHR structure included in the
-    pname:pNext chain is not `0`, shaders in pname:pStages must: not include
-    variables decorated with the code:Layer built-in decoration in their
-    interfaces
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06060]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-output, fragment output interface
-    state>> and pname:renderPass is dlink:VK_NULL_HANDLE,
-    pname:pColorBlendState->attachmentCount must: be equal to the
-    pname:colorAttachmentCount member of the
-    slink:VkPipelineRenderingCreateInfoKHR structure included in the
-    pname:pNext chain
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06061]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-shader, fragment shader state>> and
-    pname:renderPass is dlink:VK_NULL_HANDLE, fragment shaders in
-    pname:pStages must: not include the code:InputAttachment capability
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06062]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-output, fragment output interface
-    state>> and pname:renderPass is dlink:VK_NULL_HANDLE, for each color
-    attachment format defined by the pname:pColorAttachmentFormats member of
-    slink:VkPipelineRenderingCreateInfoKHR, if its
-    <<potential-format-features,potential format features>> do not contain
-    ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT, then the
-    pname:blendEnable member of the corresponding element of the
-    pname:pAttachments member of pname:pColorBlendState must: be
-    ename:VK_FALSE
-endif::VK_KHR_multiview,VK_VERSION_1_1[]
-ifdef::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
-  * [[VUID-VkGraphicsPipelineCreateInfo-renderPass-06063]]
-    If the pipeline is being created with
-    <<pipeline-graphics-subsets-fragment-output, fragment output interface
-    state>> and pname:renderPass is dlink:VK_NULL_HANDLE, if the pname:pNext
-    chain includes slink:VkAttachmentSampleCountInfoAMD or
-    sname:VkAttachmentSampleCountInfoNV, the pname:colorAttachmentCount
-    member of that structure must: be equal to the value of
-    slink:VkPipelineRenderingCreateInfoKHR::pname:colorAttachmentCount
-endif::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
-endif::VK_KHR_dynamic_rendering[]
-****
-
-include::{generated}/validity/structs/VkGraphicsPipelineCreateInfo.txt[]
---
-
-ifdef::VK_KHR_dynamic_rendering[]
-[open,refpage='VkPipelineRenderingCreateInfoKHR',desc='Structure specifying attachment formats',type='structs']
---
-The sname:VkPipelineRenderingCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkPipelineRenderingCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:viewMask is the viewMask used for rendering.
-  * pname:colorAttachmentCount is the number of entries in
-    pname:pColorAttachmentFormats
-  * pname:pColorAttachmentFormats is an array of elink:VkFormat values
-    defining the format of color attachments used in this pipeline.
-  * pname:depthAttachmentFormat is a elink:VkFormat value defining the
-    format of the depth attachment used in this pipeline.
-  * pname:stencilAttachmentFormat is a elink:VkFormat value defining the
-    format of the stencil attachment used in this pipeline.
-
-When a pipeline is created without a slink:VkRenderPass, if this structure
-is present in the pname:pNext chain of slink:VkGraphicsPipelineCreateInfo,
-it specifies the view mask and format of attachments used for rendering.
-If this structure is not specified, and the pipeline does not include a
-slink:VkRenderPass, pname:viewMask and pname:colorAttachmentCount are `0`,
-and pname:depthAttachmentFormat and pname:stencilAttachmentFormat are
-ename:VK_FORMAT_UNDEFINED.
-If a graphics pipeline is created with a valid slink:VkRenderPass,
-parameters of this structure are ignored.
-
-If pname:depthAttachmentFormat, pname:stencilAttachmentFormat, or any
-element of pname:pColorAttachmentFormats is ename:VK_FORMAT_UNDEFINED, it
-indicates that the corresponding attachment is unused within the render
-pass.
-Valid formats indicate that an attachment can: be used - but it is still
-valid to set the attachment to `NULL` when beginning rendering.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineRenderingCreateInfoKHR-pColorAttachmentFormats-06064]]
-    If any element of pname:pColorAttachmentFormats is not
-    ename:VK_FORMAT_UNDEFINED, it must: be a format with
-    <<potential-format-features, potential format features>> that include
-    ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
-  * [[VUID-VkPipelineRenderingCreateInfoKHR-depthAttachmentFormat-06065]]
-    If pname:depthAttachmentFormat is not ename:VK_FORMAT_UNDEFINED, it
-    must: be a format with <<potential-format-features, potential format
-    features>> that include
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkPipelineRenderingCreateInfoKHR-stencilAttachmentFormat-06164]]
-    If pname:stencilAttachmentFormat is not ename:VK_FORMAT_UNDEFINED, it
-    must: be a format with <<potential-format-features, potential format
-    features>> that include
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkPipelineRenderingCreateInfoKHR-depthAttachmentFormat-06165]]
-    If pname:depthAttachmentFormat is not ename:VK_FORMAT_UNDEFINED and
-    pname:stencilAttachmentFormat is not ename:VK_FORMAT_UNDEFINED,
-    pname:depthAttachmentFormat must: equal pname:stencilAttachmentFormat
-  * [[VUID-VkPipelineRenderingCreateInfoKHR-multiview-06066]]
-    If the <<features-multiview,pname:multiview>> feature is not enabled,
-    pname:viewMask must: be `0`
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkPipelineRenderingCreateInfoKHR-viewMask-06067]]
-    The index of the most significant bit in pname:viewMask must: be less
-    than <<limits-maxMultiviewViewCount,pname:maxMultiviewViewCount>>
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-****
-
-include::{generated}/validity/structs/VkPipelineRenderingCreateInfoKHR.txt[]
---
-endif::VK_KHR_dynamic_rendering[]
-
-[open,refpage='VkPipelineCreateFlagBits',desc='Bitmask controlling how a pipeline is created',type='enums']
---
-Possible values of the pname:flags member of
-slink:VkGraphicsPipelineCreateInfo,
-ifdef::VK_KHR_ray_tracing_pipeline[slink:VkRayTracingPipelineCreateInfoKHR,]
-ifdef::VK_NV_ray_tracing[slink:VkRayTracingPipelineCreateInfoNV,]
-and slink:VkComputePipelineCreateInfo, specifying how a pipeline is created,
-are:
-
-include::{generated}/api/enums/VkPipelineCreateFlagBits.txt[]
-
-  * ename:VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT specifies that the
-    created pipeline will not be optimized.
-    Using this flag may: reduce the time taken to create the pipeline.
-  * ename:VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT specifies that the
-    pipeline to be created is allowed to be the parent of a pipeline that
-    will be created in a subsequent pipeline creation call.
-  * ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT specifies that the pipeline to
-    be created will be a child of a previously created parent pipeline.
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * ename:VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT specifies that
-    any shader input variables decorated as code:ViewIndex will be assigned
-    values as if they were decorated as code:DeviceIndex.
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-  * ename:VK_PIPELINE_CREATE_DISPATCH_BASE specifies that a compute pipeline
-    can: be used with flink:vkCmdDispatchBase with a non-zero base
-    workgroup.
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_NV_ray_tracing[]
-  * ename:VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV specifies that a pipeline
-    is created with all shaders in the deferred state.
-    Before using the pipeline the application must: call
-    flink:vkCompileDeferredNV exactly once on each shader in the pipeline
-    before using the pipeline.
-endif::VK_NV_ray_tracing[]
-ifdef::VK_KHR_pipeline_executable_properties[]
-  * ename:VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR specifies that the
-    shader compiler should capture statistics for the pipeline executables
-    produced by the compile process which can: later be retrieved by calling
-    flink:vkGetPipelineExecutableStatisticsKHR.
-    Enabling this flag must: not affect the final compiled pipeline but may:
-    disable pipeline caching or otherwise affect pipeline creation time.
-  * ename:VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR
-    specifies that the shader compiler should capture the internal
-    representations of pipeline executables produced by the compile process
-    which can: later be retrieved by calling
-    flink:vkGetPipelineExecutableInternalRepresentationsKHR.
-    Enabling this flag must: not affect the final compiled pipeline but may:
-    disable pipeline caching or otherwise affect pipeline creation time.
-endif::VK_KHR_pipeline_executable_properties[]
-ifdef::VK_KHR_pipeline_library[]
-  * ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR specifies that the pipeline
-    cannot: be used directly, and instead defines a _pipeline library_ that
-    can: be combined with other pipelines using the
-    slink:VkPipelineLibraryCreateInfoKHR structure.
-ifdef::VK_KHR_ray_tracing_pipeline[]
-    This is available in ray tracing pipelines.
-endif::VK_KHR_ray_tracing_pipeline[]
-endif::VK_KHR_pipeline_library[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  * ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR
-    specifies that an any-hit shader will always be present when an any-hit
-    shader would be executed.
-    A NULL any-hit shader is an any-hit shader which is effectively
-    ename:VK_SHADER_UNUSED_KHR, such as from a shader group consisting
-    entirely of zeros.
-  * ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR
-    specifies that a closest hit shader will always be present when a
-    closest hit shader would be executed.
-    A NULL closest hit shader is a closest hit shader which is effectively
-    ename:VK_SHADER_UNUSED_KHR, such as from a shader group consisting
-    entirely of zeros.
-  * ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR
-    specifies that a miss shader will always be present when a miss shader
-    would be executed.
-    A NULL miss shader is a miss shader which is effectively
-    ename:VK_SHADER_UNUSED_KHR, such as from a shader group consisting
-    entirely of zeros.
-  * ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR
-    specifies that an intersection shader will always be present when an
-    intersection shader would be executed.
-    A NULL intersection shader is an intersection shader which is
-    effectively ename:VK_SHADER_UNUSED_KHR, such as from a shader group
-    consisting entirely of zeros.
-  * ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR specifies
-    that triangle primitives will be skipped during traversal using
-    code:OpTraceRayKHR.
-  * ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR specifies that
-    AABB primitives will be skipped during traversal using
-    code:OpTraceRayKHR.
-  * ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
-    specifies that the shader group handles can: be saved and reused on a
-    subsequent run (e.g. for trace capture and replay).
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_NV_device_generated_commands[]
-  * ename:VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV specifies that the
-    pipeline can be used in combination with <<device-generated-commands>>.
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-  * ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT
-    specifies that pipeline creation will fail if a compile is required for
-    creation of a valid slink:VkPipeline object;
-    ename:VK_PIPELINE_COMPILE_REQUIRED_EXT will be returned by pipeline
-    creation, and the slink:VkPipeline will be set to dlink:VK_NULL_HANDLE.
-  * When creating multiple pipelines,
-    ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT specifies that
-    control will be returned to the application on failure of the
-    corresponding pipeline rather than continuing to create additional
-    pipelines.
-endif::VK_EXT_pipeline_creation_cache_control[]
-ifdef::VK_NV_ray_tracing_motion_blur[]
-  * ename:VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV specifies that
-    the pipeline is allowed to use code:OpTraceRayMotionNV.
-endif::VK_NV_ray_tracing_motion_blur[]
-ifdef::VK_KHR_dynamic_rendering[]
-ifdef::VK_KHR_fragment_shading_rate[]
-  * ename:VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-    specifies that the pipeline will be used with a fragment shading rate
-    attachment.
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_EXT_fragment_density_map[]
-  * ename:VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT
-    specifies that the pipeline will be used with a fragment density map
-    attachment.
-endif::VK_EXT_fragment_density_map[]
-endif::VK_KHR_dynamic_rendering[]
-
-It is valid to set both ename:VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT and
-ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT.
-This allows a pipeline to be both a parent and possibly a child in a
-pipeline hierarchy.
-See <<pipelines-pipeline-derivatives,Pipeline Derivatives>> for more
-information.
---
-
-[open,refpage='VkPipelineCreateFlags',desc='Bitmask of VkPipelineCreateFlagBits',type='flags']
---
-include::{generated}/api/flags/VkPipelineCreateFlags.txt[]
-
-tname:VkPipelineCreateFlags is a bitmask type for setting a mask of zero or
-more elink:VkPipelineCreateFlagBits.
---
-
-[open,refpage='VkPipelineDynamicStateCreateInfo',desc='Structure specifying parameters of a newly created pipeline dynamic state',type='structs']
---
-The sname:VkPipelineDynamicStateCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkPipelineDynamicStateCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:dynamicStateCount is the number of elements in the
-    pname:pDynamicStates array.
-  * pname:pDynamicStates is a pointer to an array of elink:VkDynamicState
-    values specifying which pieces of pipeline state will use the values
-    from dynamic state commands rather than from pipeline state creation
-    information.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442]]
-    Each element of pname:pDynamicStates must: be unique
-****
-
-include::{generated}/validity/structs/VkPipelineDynamicStateCreateInfo.txt[]
---
-
-[open,refpage='VkPipelineDynamicStateCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineDynamicStateCreateFlags.txt[]
-
-tname:VkPipelineDynamicStateCreateFlags is a bitmask type for setting a
-mask, but is currently reserved for future use.
---
-
-[open,refpage='VkDynamicState',desc='Indicate which dynamic state is taken from dynamic state commands',type='enums']
---
-The source of different pieces of dynamic state is specified by the
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates property of the
-currently active pipeline, each of whose elements must: be one of the
-values:
-
-include::{generated}/api/enums/VkDynamicState.txt[]
-
-  * ename:VK_DYNAMIC_STATE_VIEWPORT specifies that the pname:pViewports
-    state in slink:VkPipelineViewportStateCreateInfo will be ignored and
-    must: be set dynamically with flink:vkCmdSetViewport before any drawing
-    commands.
-    The number of viewports used by a pipeline is still specified by the
-    pname:viewportCount member of slink:VkPipelineViewportStateCreateInfo.
-  * ename:VK_DYNAMIC_STATE_SCISSOR specifies that the pname:pScissors state
-    in slink:VkPipelineViewportStateCreateInfo will be ignored and must: be
-    set dynamically with flink:vkCmdSetScissor before any drawing commands.
-    The number of scissor rectangles used by a pipeline is still specified
-    by the pname:scissorCount member of
-    slink:VkPipelineViewportStateCreateInfo.
-  * ename:VK_DYNAMIC_STATE_LINE_WIDTH specifies that the pname:lineWidth
-    state in slink:VkPipelineRasterizationStateCreateInfo will be ignored
-    and must: be set dynamically with flink:vkCmdSetLineWidth before any
-    drawing commands that generate line primitives for the rasterizer.
-  * ename:VK_DYNAMIC_STATE_DEPTH_BIAS specifies that the
-    pname:depthBiasConstantFactor, pname:depthBiasClamp and
-    pname:depthBiasSlopeFactor states in
-    slink:VkPipelineRasterizationStateCreateInfo will be ignored and must:
-    be set dynamically with flink:vkCmdSetDepthBias before any draws are
-    performed with pname:depthBiasEnable in
-    slink:VkPipelineRasterizationStateCreateInfo set to ename:VK_TRUE.
-  * ename:VK_DYNAMIC_STATE_BLEND_CONSTANTS specifies that the
-    pname:blendConstants state in slink:VkPipelineColorBlendStateCreateInfo
-    will be ignored and must: be set dynamically with
-    flink:vkCmdSetBlendConstants before any draws are performed with a
-    pipeline state with sname:VkPipelineColorBlendAttachmentState member
-    pname:blendEnable set to ename:VK_TRUE and any of the blend functions
-    using a constant blend color.
-  * ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS specifies that the
-    pname:minDepthBounds and pname:maxDepthBounds states of
-    slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be
-    set dynamically with flink:vkCmdSetDepthBounds before any draws are
-    performed with a pipeline state with
-    slink:VkPipelineDepthStencilStateCreateInfo member
-    pname:depthBoundsTestEnable set to ename:VK_TRUE.
-  * ename:VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK specifies that the
-    pname:compareMask state in slink:VkPipelineDepthStencilStateCreateInfo
-    for both pname:front and pname:back will be ignored and must: be set
-    dynamically with flink:vkCmdSetStencilCompareMask before any draws are
-    performed with a pipeline state with
-    slink:VkPipelineDepthStencilStateCreateInfo member
-    pname:stencilTestEnable set to ename:VK_TRUE
-  * ename:VK_DYNAMIC_STATE_STENCIL_WRITE_MASK specifies that the
-    pname:writeMask state in slink:VkPipelineDepthStencilStateCreateInfo for
-    both pname:front and pname:back will be ignored and must: be set
-    dynamically with flink:vkCmdSetStencilWriteMask before any draws are
-    performed with a pipeline state with
-    slink:VkPipelineDepthStencilStateCreateInfo member
-    pname:stencilTestEnable set to ename:VK_TRUE
-  * ename:VK_DYNAMIC_STATE_STENCIL_REFERENCE specifies that the
-    pname:reference state in slink:VkPipelineDepthStencilStateCreateInfo for
-    both pname:front and pname:back will be ignored and must: be set
-    dynamically with flink:vkCmdSetStencilReference before any draws are
-    performed with a pipeline state with
-    slink:VkPipelineDepthStencilStateCreateInfo member
-    pname:stencilTestEnable set to ename:VK_TRUE
-ifdef::VK_NV_clip_space_w_scaling[]
-  * ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV specifies that the
-    pname:pViewportScalings state in
-    slink:VkPipelineViewportWScalingStateCreateInfoNV will be ignored and
-    must: be set dynamically with flink:vkCmdSetViewportWScalingNV before
-    any draws are performed with a pipeline state with
-    slink:VkPipelineViewportWScalingStateCreateInfoNV member
-    pname:viewportScalingEnable set to ename:VK_TRUE
-endif::VK_NV_clip_space_w_scaling[]
-ifdef::VK_EXT_discard_rectangles[]
-  * ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT specifies that the
-    pname:pDiscardRectangles state in
-    slink:VkPipelineDiscardRectangleStateCreateInfoEXT will be ignored and
-    must: be set dynamically with flink:vkCmdSetDiscardRectangleEXT before
-    any draw or clear commands.
-    The elink:VkDiscardRectangleModeEXT and the number of active discard
-    rectangles is still specified by the pname:discardRectangleMode and
-    pname:discardRectangleCount members of
-    slink:VkPipelineDiscardRectangleStateCreateInfoEXT.
-endif::VK_EXT_discard_rectangles[]
-ifdef::VK_EXT_sample_locations[]
-  * ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT specifies that the
-    pname:sampleLocationsInfo state in
-    slink:VkPipelineSampleLocationsStateCreateInfoEXT will be ignored and
-    must: be set dynamically with flink:vkCmdSetSampleLocationsEXT before
-    any draw or clear commands.
-    Enabling custom sample locations is still indicated by the
-    pname:sampleLocationsEnable member of
-    slink:VkPipelineSampleLocationsStateCreateInfoEXT.
-endif::VK_EXT_sample_locations[]
-ifdef::VK_NV_scissor_exclusive[]
-  * ename:VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV specifies that the
-    pname:pExclusiveScissors state in
-    slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV will be
-    ignored and must: be set dynamically with
-    flink:vkCmdSetExclusiveScissorNV before any drawing commands.
-    The number of exclusive scissor rectangles used by a pipeline is still
-    specified by the pname:exclusiveScissorCount member of
-    slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV.
-endif::VK_NV_scissor_exclusive[]
-ifdef::VK_NV_shading_rate_image[]
-  * ename:VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV specifies that
-    the pname:pShadingRatePalettes state in
-    slink:VkPipelineViewportShadingRateImageStateCreateInfoNV will be
-    ignored and must: be set dynamically with
-    flink:vkCmdSetViewportShadingRatePaletteNV before any drawing commands.
-  * ename:VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV specifies that
-    the coarse sample order state in
-    slink:VkPipelineViewportCoarseSampleOrderStateCreateInfoNV will be
-    ignored and must: be set dynamically with
-    flink:vkCmdSetCoarseSampleOrderNV before any drawing commands.
-endif::VK_NV_shading_rate_image[]
-ifdef::VK_EXT_line_rasterization[]
-  * ename:VK_DYNAMIC_STATE_LINE_STIPPLE_EXT specifies that the
-    pname:lineStippleFactor and pname:lineStipplePattern state in
-    slink:VkPipelineRasterizationLineStateCreateInfoEXT will be ignored and
-    must: be set dynamically with flink:vkCmdSetLineStippleEXT before any
-    draws are performed with a pipeline state with
-    slink:VkPipelineRasterizationLineStateCreateInfoEXT member
-    pname:stippledLineEnable set to ename:VK_TRUE.
-endif::VK_EXT_line_rasterization[]
-ifdef::VK_EXT_extended_dynamic_state[]
-  * ename:VK_DYNAMIC_STATE_CULL_MODE_EXT specifies that the pname:cullMode
-    state in slink:VkPipelineRasterizationStateCreateInfo will be ignored
-    and must: be set dynamically with flink:vkCmdSetCullModeEXT before any
-    drawing commands.
-  * ename:VK_DYNAMIC_STATE_FRONT_FACE_EXT specifies that the pname:frontFace
-    state in slink:VkPipelineRasterizationStateCreateInfo will be ignored
-    and must: be set dynamically with flink:vkCmdSetFrontFaceEXT before any
-    drawing commands.
-  * ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT specifies that the
-    pname:topology state in slink:VkPipelineInputAssemblyStateCreateInfo
-    only specifies the <<drawing-primitive-topology-class, topology class>>,
-    and the specific topology order and adjacency must: be set dynamically
-    with flink:vkCmdSetPrimitiveTopologyEXT before any drawing commands.
-  * ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT specifies that the
-    pname:viewportCount and pname:pViewports state in
-    slink:VkPipelineViewportStateCreateInfo will be ignored and must: be set
-    dynamically with flink:vkCmdSetViewportWithCountEXT before any draw
-    call.
-  * ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT specifies that the
-    pname:scissorCount and pname:pScissors state in
-    slink:VkPipelineViewportStateCreateInfo will be ignored and must: be set
-    dynamically with flink:vkCmdSetScissorWithCountEXT before any draw call.
-  * ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT specifies that
-    the pname:stride state in slink:VkVertexInputBindingDescription will be
-    ignored and must: be set dynamically with
-    flink:vkCmdBindVertexBuffers2EXT before any draw call.
-  * ename:VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT specifies that the
-    pname:depthTestEnable state in
-    slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be
-    set dynamically with flink:vkCmdSetDepthTestEnableEXT before any draw
-    call.
-  * ename:VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT specifies that the
-    pname:depthWriteEnable state in
-    slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be
-    set dynamically with flink:vkCmdSetDepthWriteEnableEXT before any draw
-    call.
-  * ename:VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT specifies that the
-    pname:depthCompareOp state in
-    slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be
-    set dynamically with flink:vkCmdSetDepthCompareOpEXT before any draw
-    call.
-  * ename:VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT specifies that the
-    pname:depthBoundsTestEnable state in
-    slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be
-    set dynamically with flink:vkCmdSetDepthBoundsTestEnableEXT before any
-    draw call.
-  * ename:VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT specifies that the
-    pname:stencilTestEnable state in
-    slink:VkPipelineDepthStencilStateCreateInfo will be ignored and must: be
-    set dynamically with flink:vkCmdSetStencilTestEnableEXT before any draw
-    call.
-  * ename:VK_DYNAMIC_STATE_STENCIL_OP_EXT specifies that the pname:failOp,
-    pname:passOp, pname:depthFailOp, and pname:compareOp states in
-    sname:VkPipelineDepthStencilStateCreateInfo for both pname:front and
-    pname:back will be ignored and must: be set dynamically with
-    flink:vkCmdSetStencilOpEXT before any draws are performed with a
-    pipeline state with sname:VkPipelineDepthStencilStateCreateInfo member
-    pname:stencilTestEnable set to ename:VK_TRUE
-endif::VK_EXT_extended_dynamic_state[]
-ifdef::VK_EXT_extended_dynamic_state2[]
-  * ename:VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT specifies that the
-    pname:patchControlPoints state in
-    slink:VkPipelineTessellationStateCreateInfo will be ignored and must: be
-    set dynamically with flink:vkCmdSetPatchControlPointsEXT before any
-    drawing commands.
-  * ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT specifies that the
-    pname:rasterizerDiscardEnable state in
-    slink:VkPipelineRasterizationStateCreateInfo will be ignored and must:
-    be set dynamically with flink:vkCmdSetRasterizerDiscardEnableEXT before
-    any drawing commands.
-  * ename:VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT specifies that the
-    pname:depthBiasEnable state in
-    slink:VkPipelineRasterizationStateCreateInfo will be ignored and must:
-    be set dynamically with flink:vkCmdSetDepthBiasEnableEXT before any
-    drawing commands.
-  * ename:VK_DYNAMIC_STATE_LOGIC_OP_EXT specifies that the pname:logicOp
-    state in slink:VkPipelineColorBlendStateCreateInfo will be ignored and
-    must: be set dynamically with flink:vkCmdSetLogicOpEXT before any
-    drawing commands.
-  * ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT specifies that the
-    pname:primitiveRestartEnable state in
-    slink:VkPipelineInputAssemblyStateCreateInfo will be ignored and must:
-    be set dynamically with flink:vkCmdSetPrimitiveRestartEnableEXT before
-    any drawing commands.
-endif::VK_EXT_extended_dynamic_state2[]
-ifdef::VK_KHR_fragment_shading_rate[]
-  * ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR specifies that state in
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR
-ifdef::VK_NV_fragment_shading_rate_enums[]
-    and slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV
-endif::VK_NV_fragment_shading_rate_enums[]
-    will be ignored and must: be set dynamically with
-    flink:vkCmdSetFragmentShadingRateKHR
-ifdef::VK_NV_fragment_shading_rate_enums[]
-    or flink:vkCmdSetFragmentShadingRateEnumNV
-endif::VK_NV_fragment_shading_rate_enums[]
-    before any drawing commands.
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  * ename:VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR specifies
-    that the default stack size computation for the pipeline will be ignored
-    and must: be set dynamically with
-    flink:vkCmdSetRayTracingPipelineStackSizeKHR before any ray tracing
-    calls are performed.
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_EXT_vertex_input_dynamic_state[]
-  * ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT specifies that the
-    pname:pVertexInputState state will be ignored and must: be set
-    dynamically with flink:vkCmdSetVertexInputEXT before any drawing
-    commands
-endif::VK_EXT_vertex_input_dynamic_state[]
-ifdef::VK_EXT_color_write_enable[]
-  * ename:VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT specifies that the
-    pname:pColorWriteEnables state in
-    slink:VkPipelineColorWriteCreateInfoEXT will be ignored and must: be set
-    dynamically with flink:vkCmdSetColorWriteEnableEXT before any draw call.
-endif::VK_EXT_color_write_enable[]
---
-
-
-=== Valid Combinations of Stages for Graphics Pipelines
-
-ifdef::VK_NV_mesh_shader[]
-The geometric primitive processing can either be handled on a per primitive
-basis by the vertex, tessellation, and geometry shader stages, or on a per
-mesh basis using task and mesh shader stages.
-If the pipeline includes a mesh shader stage, it uses the mesh pipeline,
-otherwise it uses the primitive pipeline.
-
-If a task shader is omitted, the task shading stage is skipped.
-endif::VK_NV_mesh_shader[]
-
-If tessellation shader stages are omitted, the tessellation shading and
-fixed-function stages of the pipeline are skipped.
-
-If a geometry shader is omitted, the geometry shading stage is skipped.
-
-If a fragment shader is omitted, fragment color outputs have undefined:
-values, and the fragment depth value is unmodified.
-This can: be useful for depth-only rendering.
-
-Presence of a shader stage in a pipeline is indicated by including a valid
-slink:VkPipelineShaderStageCreateInfo with pname:module and pname:pName
-selecting an entry point from a shader module, where that entry point is
-valid for the stage specified by pname:stage.
-
-Presence of some of the fixed-function stages in the pipeline is implicitly
-derived from enabled shaders and provided state.
-For example, the fixed-function tessellator is always present when the
-pipeline has valid Tessellation Control and Tessellation Evaluation shaders.
-
-.For example:
-  * Depth/stencil-only rendering in a subpass with no color attachments
-  ** Active Pipeline Shader Stages
-  *** Vertex Shader
-  ** Required: Fixed-Function Pipeline Stages
-  *** slink:VkPipelineVertexInputStateCreateInfo
-  *** slink:VkPipelineInputAssemblyStateCreateInfo
-  *** slink:VkPipelineViewportStateCreateInfo
-  *** slink:VkPipelineRasterizationStateCreateInfo
-  *** slink:VkPipelineMultisampleStateCreateInfo
-  *** slink:VkPipelineDepthStencilStateCreateInfo
-  * Color-only rendering in a subpass with no depth/stencil attachment
-  ** Active Pipeline Shader Stages
-  *** Vertex Shader
-  *** Fragment Shader
-  ** Required: Fixed-Function Pipeline Stages
-  *** slink:VkPipelineVertexInputStateCreateInfo
-  *** slink:VkPipelineInputAssemblyStateCreateInfo
-  *** slink:VkPipelineViewportStateCreateInfo
-  *** slink:VkPipelineRasterizationStateCreateInfo
-  *** slink:VkPipelineMultisampleStateCreateInfo
-  *** slink:VkPipelineColorBlendStateCreateInfo
-  * Rendering pipeline with tessellation and geometry shaders
-  ** Active Pipeline Shader Stages
-  *** Vertex Shader
-  *** Tessellation Control Shader
-  *** Tessellation Evaluation Shader
-  *** Geometry Shader
-  *** Fragment Shader
-  ** Required: Fixed-Function Pipeline Stages
-  *** slink:VkPipelineVertexInputStateCreateInfo
-  *** slink:VkPipelineInputAssemblyStateCreateInfo
-  *** slink:VkPipelineTessellationStateCreateInfo
-  *** slink:VkPipelineViewportStateCreateInfo
-  *** slink:VkPipelineRasterizationStateCreateInfo
-  *** slink:VkPipelineMultisampleStateCreateInfo
-  *** slink:VkPipelineDepthStencilStateCreateInfo
-  *** slink:VkPipelineColorBlendStateCreateInfo
-ifdef::VK_NV_mesh_shader[]
-  * Rendering pipeline with task and mesh shaders
-  ** Active Pipeline Shader Stages
-  *** Task Shader
-  *** Mesh Shader
-  *** Fragment Shader
-  ** Required: Fixed-Function Pipeline Stages
-  *** slink:VkPipelineViewportStateCreateInfo
-  *** slink:VkPipelineRasterizationStateCreateInfo
-  *** slink:VkPipelineMultisampleStateCreateInfo
-  *** slink:VkPipelineDepthStencilStateCreateInfo
-  *** slink:VkPipelineColorBlendStateCreateInfo
-endif::VK_NV_mesh_shader[]
-
-
-ifdef::VK_NV_device_generated_commands[]
-[[graphics-shadergroups]]
-=== Graphics Pipeline Shader Groups
-
-Graphics pipelines can contain multiple shader groups that can be bound
-individually.
-Each shader group behaves as if it was a pipeline using the shader group's
-state.
-When the pipeline is bound by regular means, it behaves as if the state of
-group `0` is active, use flink:vkCmdBindPipelineShaderGroupNV to bind an
-invidual shader group.
-
-The primary purpose of shader groups is allowing the device to bind
-different pipeline state using <<device-generated-commands>>.
-
-[open,refpage='VkGraphicsPipelineShaderGroupsCreateInfoNV',desc='Structure specifying parameters of a newly created multi shader group pipeline',type='structs']
---
-The sname:VkGraphicsPipelineShaderGroupsCreateInfoNV structure is defined
-as:
-
-include::{generated}/api/structs/VkGraphicsPipelineShaderGroupsCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:groupCount is the number of elements in the pname:pGroups array.
-  * pname:pGroups is a pointer to an array of
-    slink:VkGraphicsShaderGroupCreateInfoNV structures specifying which
-    state of the original slink:VkGraphicsPipelineCreateInfo each shader
-    group overrides.
-  * pname:pipelineCount is the number of elements in the pname:pPipelines
-    array.
-  * pname:pPipelines is a pointer to an array of graphics sname:VkPipeline
-    structures which are referenced within the created pipeline, including
-    all their shader groups.
-
-When referencing shader groups by index, groups defined in the referenced
-pipelines are treated as if they were defined as additional entries in
-pname:pGroups.
-They are appended in the order they appear in the pname:pPipelines array and
-in the pname:pGroups array when those pipelines were defined.
-
-The application must: maintain the lifetime of all such referenced pipelines
-based on the pipelines that make use of them.
-
-.Valid Usage
-****
-  * [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-02879]]
-    pname:groupCount must: be at least `1` and as maximum
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxGraphicsShaderGroupCount
-  * [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-02880]]
-    The sum of pname:groupCount including those groups added from referenced
-    pname:pPipelines must: also be as maximum
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::pname:maxGraphicsShaderGroupCount
-  * [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02881]]
-    The state of the first element of pname:pGroups must: match its
-    equivalent within the parent's slink:VkGraphicsPipelineCreateInfo
-  * [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02882]]
-    Each element of pname:pGroups must: in combination with the rest of the
-    pipeline state yield a valid state configuration
-ifndef::VK_NV_mesh_shader[]
-  * [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02883]]
-    All elements of pname:pGroups must: use the same shader stage
-    combinations
-endif::VK_NV_mesh_shader[]
-ifdef::VK_NV_mesh_shader[]
-  * [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02884]]
-    All elements of pname:pGroups must: use the same shader stage
-    combinations unless any mesh shader stage is used, then either
-    combination of task and mesh or just mesh shader is valid
-  * [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02885]]
-    Mesh and regular primitive shading stages cannot be mixed across
-    pname:pGroups
-endif::VK_NV_mesh_shader[]
-  * [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pPipelines-02886]]
-    Each element of pname:pPipelines must: have been created with identical
-    state to the pipeline currently created except the state that can be
-    overridden by slink:VkGraphicsShaderGroupCreateInfoNV
-  * [[VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-deviceGeneratedCommands-02887]]
-    The <<features-deviceGeneratedCommands,
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
-    feature must: be enabled
-****
-
-include::{generated}/validity/structs/VkGraphicsPipelineShaderGroupsCreateInfoNV.txt[]
---
-
-[open,refpage='VkGraphicsShaderGroupCreateInfoNV',desc='Structure specifying override parameters for each shader group',type='structs']
---
-The sname:VkGraphicsShaderGroupCreateInfoNV structure provides the state
-overrides for each shader group.
-Each shader group behaves like a pipeline that was created from its state as
-well as the remaining parent's state.
-It is defined as:
-
-include::{generated}/api/structs/VkGraphicsShaderGroupCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:stageCount is the number of entries in the pname:pStages array.
-  * pname:pStages is a pointer to an array
-    slink:VkPipelineShaderStageCreateInfo structures specifying the set of
-    the shader stages to be included in this shader group.
-  * pname:pVertexInputState is a pointer to a
-    slink:VkPipelineVertexInputStateCreateInfo structure.
-  * pname:pTessellationState is a pointer to a
-    slink:VkPipelineTessellationStateCreateInfo structure, and is ignored if
-    the shader group does not include a tessellation control shader stage
-    and tessellation evaluation shader stage.
-
-.Valid Usage
-****
-  * [[VUID-VkGraphicsShaderGroupCreateInfoNV-stageCount-02888]]
-    For pname:stageCount, the same restrictions as in
-    slink:VkGraphicsPipelineCreateInfo::pname:stageCount apply
-  * [[VUID-VkGraphicsShaderGroupCreateInfoNV-pStages-02889]]
-    For pname:pStages, the same restrictions as in
-    slink:VkGraphicsPipelineCreateInfo::pname:pStages apply
-  * [[VUID-VkGraphicsShaderGroupCreateInfoNV-pVertexInputState-02890]]
-    For pname:pVertexInputState, the same restrictions as in
-    slink:VkGraphicsPipelineCreateInfo::pname:pVertexInputState apply
-  * [[VUID-VkGraphicsShaderGroupCreateInfoNV-pTessellationState-02891]]
-    For pname:pTessellationState, the same restrictions as in
-    slink:VkGraphicsPipelineCreateInfo::pname:pTessellationState apply
-****
-
-include::{generated}/validity/structs/VkGraphicsShaderGroupCreateInfoNV.txt[]
---
-endif::VK_NV_device_generated_commands[]
-
-
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-[[pipelines-ray-tracing]]
-== Ray Tracing Pipelines
-
-Ray tracing pipelines consist of multiple shader stages, fixed-function
-traversal stages, and a pipeline layout.
-
-[open,refpage='VK_SHADER_UNUSED_KHR',desc='Sentinel for an unused shader index',type='consts',alias='VK_SHADER_UNUSED_NV']
---
-ename:VK_SHADER_UNUSED_KHR is a special shader index used to indicate that a
-ray generation, miss, or callable shader member is not used.
-
-include::{generated}/api/enums/VK_SHADER_UNUSED_KHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/enums/VK_SHADER_UNUSED_NV.txt[]
-endif::VK_NV_ray_tracing[]
---
-
-ifdef::VK_NV_ray_tracing[]
-[open,refpage='vkCreateRayTracingPipelinesNV',desc='Creates a new ray tracing pipeline object',type='protos']
---
-:refpage: vkCreateRayTracingPipelinesNV
-
-To create ray tracing pipelines, call:
-
-include::{generated}/api/protos/vkCreateRayTracingPipelinesNV.txt[]
-
-  * pname:device is the logical device that creates the ray tracing
-    pipelines.
-  * pname:pipelineCache is either dlink:VK_NULL_HANDLE, indicating that
-    pipeline caching is disabled, or the handle of a valid
-    <<pipelines-cache,pipeline cache>> object, in which case use of that
-    cache is enabled for the duration of the command.
-  * pname:createInfoCount is the length of the pname:pCreateInfos and
-    pname:pPipelines arrays.
-  * pname:pCreateInfos is a pointer to an array of
-    slink:VkRayTracingPipelineCreateInfoNV structures.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pPipelines is a pointer to an array in which the resulting ray
-    tracing pipeline objects are returned.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/create_ray_tracing_pipelines_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCreateRayTracingPipelinesNV.txt[]
---
-endif::VK_NV_ray_tracing[]
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-[open,refpage='vkCreateRayTracingPipelinesKHR',desc='Creates a new ray tracing pipeline object',type='protos']
---
-:refpage: vkCreateRayTracingPipelinesKHR
-
-To create ray tracing pipelines, call:
-
-include::{generated}/api/protos/vkCreateRayTracingPipelinesKHR.txt[]
-
-  * pname:device is the logical device that creates the ray tracing
-    pipelines.
-  * pname:deferredOperation is dlink:VK_NULL_HANDLE or the handle of a valid
-    slink:VkDeferredOperationKHR <<deferred-host-operations-requesting,
-    request deferral>> object for this command.
-  * pname:pipelineCache is either dlink:VK_NULL_HANDLE, indicating that
-    pipeline caching is disabled, or the handle of a valid
-    <<pipelines-cache,pipeline cache>> object, in which case use of that
-    cache is enabled for the duration of the command.
-  * pname:createInfoCount is the length of the pname:pCreateInfos and
-    pname:pPipelines arrays.
-  * pname:pCreateInfos is a pointer to an array of
-    slink:VkRayTracingPipelineCreateInfoKHR structures.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pPipelines is a pointer to an array in which the resulting ray
-    tracing pipeline objects are returned.
-
-The ename:VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS error is returned if the
-implementation is unable to re-use the shader group handles provided in
-slink:VkRayTracingShaderGroupCreateInfoKHR::pname:pShaderGroupCaptureReplayHandle
-when
-slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplay
-is enabled.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/create_ray_tracing_pipelines_common.txt[]
-include::{chapters}/commonvalidity/deferred_operations_common.txt[]
-  * [[VUID-vkCreateRayTracingPipelinesKHR-rayTracingPipeline-03586]]
-    The <<features-rayTracingPipeline, pname:rayTracingPipeline>> feature
-    must: be enabled
-ifdef::VK_EXT_pipeline_creation_cache_control+VK_KHR_deferred_host_operations[]
-  * [[VUID-vkCreateRayTracingPipelinesKHR-deferredOperation-03587]]
-    If pname:deferredOperation is not dlink:VK_NULL_HANDLE, the pname:flags
-    member of elements of pname:pCreateInfos must: not include
-    ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT
-endif::VK_EXT_pipeline_creation_cache_control+VK_KHR_deferred_host_operations[]
-****
-
-include::{generated}/validity/protos/vkCreateRayTracingPipelinesKHR.txt[]
---
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_NV_ray_tracing[]
-[open,refpage='VkRayTracingPipelineCreateInfoNV',desc='Structure specifying parameters of a newly created ray tracing pipeline',type='structs']
---
-:refpage: VkRayTracingPipelineCreateInfoNV
-
-The sname:VkRayTracingPipelineCreateInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkRayTracingPipelineCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkPipelineCreateFlagBits specifying
-    how the pipeline will be generated.
-  * pname:stageCount is the number of entries in the pname:pStages array.
-  * pname:pStages is a pointer to an array of
-    slink:VkPipelineShaderStageCreateInfo structures specifying the set of
-    the shader stages to be included in the ray tracing pipeline.
-  * pname:groupCount is the number of entries in the pname:pGroups array.
-  * pname:pGroups is a pointer to an array of
-    slink:VkRayTracingShaderGroupCreateInfoNV structures describing the set
-    of the shader stages to be included in each shader group in the ray
-    tracing pipeline.
-  * pname:maxRecursionDepth is the <<ray-tracing-recursion-depth, maximum
-    recursion depth>> of shaders executed by this pipeline.
-  * pname:layout is the description of binding locations used by both the
-    pipeline and descriptor sets used with the pipeline.
-  * pname:basePipelineHandle is a pipeline to derive from.
-  * pname:basePipelineIndex is an index into the pname:pCreateInfos
-    parameter to use as a pipeline to derive from.
-
-The parameters pname:basePipelineHandle and pname:basePipelineIndex are
-described in more detail in <<pipelines-pipeline-derivatives,Pipeline
-Derivatives>>.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/ray_tracing_pipeline_create_info_common.txt[]
-  * [[VUID-VkRayTracingPipelineCreateInfoNV-stage-06232]]
-    The pname:stage member of at least one element of pname:pStages must: be
-    ename:VK_SHADER_STAGE_RAYGEN_BIT_KHR
-ifdef::VK_KHR_pipeline_library[]
-  * [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03456]]
-    pname:flags must: not include ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
-endif::VK_KHR_pipeline_library[]
-  * [[VUID-VkRayTracingPipelineCreateInfoNV-maxRecursionDepth-03457]]
-    pname:maxRecursionDepth must: be less than or equal to
-    slink:VkPhysicalDeviceRayTracingPropertiesNV::pname:maxRecursionDepth
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  * [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03458]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR
-  * [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03459]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR
-  * [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03460]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR
-  * [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03461]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR
-  * [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03462]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR
-  * [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03463]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR
-  * [[VUID-VkRayTracingPipelineCreateInfoNV-flags-03588]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_NV_ray_tracing_motion_blur[]
-  * [[VUID-VkRayTracingPipelineCreateInfoNV-flags-04948]]
-    pname:flags must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV
-endif::VK_NV_ray_tracing_motion_blur[]
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-  * [[VUID-VkRayTracingPipelineCreateInfoNV-flags-02957]]
-    pname:flags must: not include both
-    ename:VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV and
-    ename:VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT at
-    the same time
-endif::VK_EXT_pipeline_creation_cache_control[]
-****
-
-include::{generated}/validity/structs/VkRayTracingPipelineCreateInfoNV.txt[]
---
-endif::VK_NV_ray_tracing[]
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-[open,refpage='VkRayTracingPipelineCreateInfoKHR',desc='Structure specifying parameters of a newly created ray tracing pipeline',type='structs']
---
-:refpage: VkRayTracingPipelineCreateInfoKHR
-
-The sname:VkRayTracingPipelineCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkRayTracingPipelineCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkPipelineCreateFlagBits specifying
-    how the pipeline will be generated.
-  * pname:stageCount is the number of entries in the pname:pStages array.
-  * pname:pStages is a pointer to an array of pname:stageCount
-    slink:VkPipelineShaderStageCreateInfo structures describing the set of
-    the shader stages to be included in the ray tracing pipeline.
-  * pname:groupCount is the number of entries in the pname:pGroups array.
-  * pname:pGroups is a pointer to an array of pname:groupCount
-    slink:VkRayTracingShaderGroupCreateInfoKHR structures describing the set
-    of the shader stages to be included in each shader group in the ray
-    tracing pipeline.
-  * pname:maxPipelineRayRecursionDepth is the <<ray-tracing-recursion-depth,
-    maximum recursion depth>> of shaders executed by this pipeline.
-  * pname:pLibraryInfo is a pointer to a
-    slink:VkPipelineLibraryCreateInfoKHR structure defining pipeline
-    libraries to include.
-  * pname:pLibraryInterface is a pointer to a
-    slink:VkRayTracingPipelineInterfaceCreateInfoKHR structure defining
-    additional information when using pipeline libraries.
-  * pname:pDynamicState is a pointer to a
-    slink:VkPipelineDynamicStateCreateInfo structure, and is used to
-    indicate which properties of the pipeline state object are dynamic and
-    can: be changed independently of the pipeline state.
-    This can: be `NULL`, which means no state in the pipeline is considered
-    dynamic.
-  * pname:layout is the description of binding locations used by both the
-    pipeline and descriptor sets used with the pipeline.
-  * pname:basePipelineHandle is a pipeline to derive from.
-  * pname:basePipelineIndex is an index into the pname:pCreateInfos
-    parameter to use as a pipeline to derive from.
-
-The parameters pname:basePipelineHandle and pname:basePipelineIndex are
-described in more detail in <<pipelines-pipeline-derivatives,Pipeline
-Derivatives>>.
-
-ifdef::VK_KHR_pipeline_library[]
-When ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR is specified, this pipeline
-defines a _pipeline library_ which cannot: be bound as a ray tracing
-pipeline directly.
-Instead, pipeline libraries define common shaders and shader groups which
-can: be included in future pipeline creation.
-
-If pipeline libraries are included in pname:pLibraryInfo, shaders defined in
-those libraries are treated as if they were defined as additional entries in
-pname:pStages, appended in the order they appear in the pname:pLibraries
-array and in the pname:pStages array when those libraries were defined.
-
-When referencing shader groups in order to obtain a shader group handle,
-groups defined in those libraries are treated as if they were defined as
-additional entries in pname:pGroups, appended in the order they appear in
-the pname:pLibraries array and in the pname:pGroups array when those
-libraries were defined.
-The shaders these groups reference are set when the pipeline library is
-created, referencing those specified in the pipeline library, not in the
-pipeline that includes it.
-endif::VK_KHR_pipeline_library[]
-
-The default stack size for a pipeline if
-ename:VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR is not provided
-is computed as described in <<ray-tracing-pipeline-stack, Ray Tracing
-Pipeline Stack>>.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/ray_tracing_pipeline_create_info_common.txt[]
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-stage-03425]]
-    If pname:flags does not include
-    ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR, the pname:stage member of at
-    least one element of pname:pStages, including those implicitly added by
-    pname:pLibraryInfo, must: be ename:VK_SHADER_STAGE_RAYGEN_BIT_KHR
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-maxPipelineRayRecursionDepth-03589]]
-    pname:maxPipelineRayRecursionDepth must: be less than or equal to
-    slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:maxRayRecursionDepth
-ifdef::VK_KHR_pipeline_library[]
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-03465]]
-    If pname:flags includes ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR,
-    pname:pLibraryInterface must: not be `NULL`
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03590]]
-    If pname:pLibraryInfo is not `NULL` and its pname:libraryCount member is
-    greater than `0`, its pname:pLibraryInterface member must: not be `NULL`
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03591]]
-    Each element of pname:pLibraryInfo->pLibraries must: have been created
-    with the value of pname:maxPipelineRayRecursionDepth equal to that in
-    this pipeline
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03592]]
-    If pname:pLibraryInfo is not `NULL`, each element of its
-    pname:pLibraries member must: have been created with a pname:layout that
-    is compatible with the pname:layout in this pipeline
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03593]]
-    If pname:pLibraryInfo is not `NULL`, each element of its
-    pname:pLibraries member must: have been created with values of the
-    pname:maxPipelineRayPayloadSize and pname:maxPipelineRayHitAttributeSize
-    members of pname:pLibraryInterface equal to those in this pipeline
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-03594]]
-    If pname:flags includes
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR,
-    each element of pname:pLibraryInfo->pLibraries must: have been created
-    with the
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
-    bit set
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-04718]]
-    If pname:flags includes
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR, each element of
-    pname:pLibraryInfo->pLibraries must: have been created with the
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR bit set
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-04719]]
-    If pname:flags includes
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR, each
-    element of pname:pLibraryInfo->pLibraries must: have been created with
-    the ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR bit set
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-04720]]
-    If pname:flags includes
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR,
-    each element of pname:pLibraryInfo->pLibraries must: have been created
-    with the
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR bit
-    set
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-04721]]
-    If pname:flags includes
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR,
-    each element of pname:pLibraryInfo->pLibraries must: have been created
-    with the
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR
-    bit set
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-04722]]
-    If pname:flags includes
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR,
-    each element of pname:pLibraryInfo->pLibraries must: have been created
-    with the
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR
-    bit set
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-04723]]
-    If pname:flags includes
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR, each
-    element of pname:pLibraryInfo->pLibraries must: have been created with
-    the ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR
-    bit set
-endif::VK_KHR_pipeline_library[]
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03595]]
-    If the `apiext:VK_KHR_pipeline_library` extension is not enabled,
-    pname:pLibraryInfo and pname:pLibraryInterface must: be `NULL`
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-03470]]
-    If pname:flags includes
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR,
-    for any element of pname:pGroups with a pname:type of
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR or
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, the
-    pname:anyHitShader of that element must: not be
-    ename:VK_SHADER_UNUSED_KHR
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-03471]]
-    If pname:flags includes
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR,
-    for any element of pname:pGroups with a pname:type of
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR or
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, the
-    pname:closestHitShader of that element must: not be
-    ename:VK_SHADER_UNUSED_KHR
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-rayTraversalPrimitiveCulling-03596]]
-    If the <<features-rayTraversalPrimitiveCulling,
-    pname:rayTraversalPrimitiveCulling>> feature is not enabled, pname:flags
-    must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-rayTraversalPrimitiveCulling-03597]]
-    If the <<features-rayTraversalPrimitiveCulling,
-    pname:rayTraversalPrimitiveCulling>> feature is not enabled, pname:flags
-    must: not include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-flags-03598]]
-    If pname:flags includes
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR,
-    <<features-rayTracingPipelineShaderGroupHandleCaptureReplay,
-    pname:rayTracingPipelineShaderGroupHandleCaptureReplay>> must: be
-    enabled
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-rayTracingPipelineShaderGroupHandleCaptureReplay-03599]]
-    If
-    slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplay
-    is ename:VK_TRUE and the pname:pShaderGroupCaptureReplayHandle member of
-    any element of pname:pGroups is not `NULL`, pname:flags must: include
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03600]]
-    If pname:pLibraryInfo is not `NULL` and its pname:libraryCount is `0`,
-    pname:stageCount must: not be `0`
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInfo-03601]]
-    If pname:pLibraryInfo is not `NULL` and its pname:libraryCount is `0`,
-    pname:groupCount must: not be `0`
-  * [[VUID-VkRayTracingPipelineCreateInfoKHR-pDynamicStates-03602]]
-    Any element of the pname:pDynamicStates member of pname:pDynamicState
-    must: be ename:VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR
-****
-
-include::{generated}/validity/structs/VkRayTracingPipelineCreateInfoKHR.txt[]
---
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_NV_ray_tracing[]
-[open,refpage='VkRayTracingShaderGroupCreateInfoNV',desc='Structure specifying shaders in a shader group',type='structs']
---
-:refpage: VkRayTracingShaderGroupCreateInfoNV
-
-The sname:VkRayTracingShaderGroupCreateInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkRayTracingShaderGroupCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:type is the type of hit group specified in this structure.
-  * pname:generalShader is the index of the ray generation, miss, or
-    callable shader from
-    slink:VkRayTracingPipelineCreateInfoNV::pname:pStages in the group if
-    the shader group has pname:type of
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV, and
-    ename:VK_SHADER_UNUSED_NV otherwise.
-  * pname:closestHitShader is the optional index of the closest hit shader
-    from slink:VkRayTracingPipelineCreateInfoNV::pname:pStages in the group
-    if the shader group has pname:type of
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV or
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV, and
-    ename:VK_SHADER_UNUSED_NV otherwise.
-  * pname:anyHitShader is the optional index of the any-hit shader from
-    slink:VkRayTracingPipelineCreateInfoNV::pname:pStages in the group if
-    the shader group has pname:type of
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV or
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV, and
-    ename:VK_SHADER_UNUSED_NV otherwise.
-  * pname:intersectionShader is the index of the intersection shader from
-    slink:VkRayTracingPipelineCreateInfoNV::pname:pStages in the group if
-    the shader group has pname:type of
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV, and
-    ename:VK_SHADER_UNUSED_NV otherwise.
-
-.Valid Usage
-****
-  * [[VUID-VkRayTracingShaderGroupCreateInfoNV-type-02413]]
-    If pname:type is ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV then
-    pname:generalShader must: be a valid index into
-    slink:VkRayTracingPipelineCreateInfoNV::pname:pStages referring to a
-    shader of ename:VK_SHADER_STAGE_RAYGEN_BIT_NV,
-    ename:VK_SHADER_STAGE_MISS_BIT_NV, or
-    ename:VK_SHADER_STAGE_CALLABLE_BIT_NV
-  * [[VUID-VkRayTracingShaderGroupCreateInfoNV-type-02414]]
-    If pname:type is ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV then
-    pname:closestHitShader, pname:anyHitShader, and pname:intersectionShader
-    must: be ename:VK_SHADER_UNUSED_NV
-  * [[VUID-VkRayTracingShaderGroupCreateInfoNV-type-02415]]
-    If pname:type is
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV then
-    pname:intersectionShader must: be a valid index into
-    slink:VkRayTracingPipelineCreateInfoNV::pname:pStages referring to a
-    shader of ename:VK_SHADER_STAGE_INTERSECTION_BIT_NV
-  * [[VUID-VkRayTracingShaderGroupCreateInfoNV-type-02416]]
-    If pname:type is
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV then
-    pname:intersectionShader must: be ename:VK_SHADER_UNUSED_NV
-  * [[VUID-VkRayTracingShaderGroupCreateInfoNV-closestHitShader-02417]]
-    pname:closestHitShader must: be either ename:VK_SHADER_UNUSED_NV or a
-    valid index into slink:VkRayTracingPipelineCreateInfoNV::pname:pStages
-    referring to a shader of ename:VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV
-  * [[VUID-VkRayTracingShaderGroupCreateInfoNV-anyHitShader-02418]]
-    pname:anyHitShader must: be either ename:VK_SHADER_UNUSED_NV or a valid
-    index into slink:VkRayTracingPipelineCreateInfoNV::pname:pStages
-    referring to a shader of ename:VK_SHADER_STAGE_ANY_HIT_BIT_NV
-****
-
-include::{generated}/validity/structs/VkRayTracingShaderGroupCreateInfoNV.txt[]
---
-
-endif::VK_NV_ray_tracing[]
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-[open,refpage='VkRayTracingShaderGroupCreateInfoKHR',desc='Structure specifying shaders in a shader group',type='structs']
---
-:refpage: VkRayTracingShaderGroupCreateInfoKHR
-
-The sname:VkRayTracingShaderGroupCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkRayTracingShaderGroupCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:type is the type of hit group specified in this structure.
-  * pname:generalShader is the index of the ray generation, miss, or
-    callable shader from
-    slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages in the group if
-    the shader group has pname:type of
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR, and
-    ename:VK_SHADER_UNUSED_KHR otherwise.
-  * pname:closestHitShader is the optional index of the closest hit shader
-    from slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages in the group
-    if the shader group has pname:type of
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR or
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, and
-    ename:VK_SHADER_UNUSED_KHR otherwise.
-  * pname:anyHitShader is the optional index of the any-hit shader from
-    slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages in the group if
-    the shader group has pname:type of
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR or
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, and
-    ename:VK_SHADER_UNUSED_KHR otherwise.
-  * pname:intersectionShader is the index of the intersection shader from
-    slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages in the group if
-    the shader group has pname:type of
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, and
-    ename:VK_SHADER_UNUSED_KHR otherwise.
-  * pname:pShaderGroupCaptureReplayHandle is `NULL` or a pointer to replay
-    information for this shader group.
-    Ignored if
-    slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplay
-    is ename:VK_FALSE.
-
-.Valid Usage
-****
-  * [[VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03474]]
-    If pname:type is ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR then
-    pname:generalShader must: be a valid index into
-    slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages referring to a
-    shader of ename:VK_SHADER_STAGE_RAYGEN_BIT_KHR,
-    ename:VK_SHADER_STAGE_MISS_BIT_KHR, or
-    ename:VK_SHADER_STAGE_CALLABLE_BIT_KHR
-  * [[VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03475]]
-    If pname:type is ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR then
-    pname:closestHitShader, pname:anyHitShader, and pname:intersectionShader
-    must: be ename:VK_SHADER_UNUSED_KHR
-  * [[VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03476]]
-    If pname:type is
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR then
-    pname:intersectionShader must: be a valid index into
-    slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages referring to a
-    shader of ename:VK_SHADER_STAGE_INTERSECTION_BIT_KHR
-  * [[VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03477]]
-    If pname:type is
-    ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR then
-    pname:intersectionShader must: be ename:VK_SHADER_UNUSED_KHR
-  * [[VUID-VkRayTracingShaderGroupCreateInfoKHR-closestHitShader-03478]]
-    pname:closestHitShader must: be either ename:VK_SHADER_UNUSED_KHR or a
-    valid index into slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages
-    referring to a shader of ename:VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR
-  * [[VUID-VkRayTracingShaderGroupCreateInfoKHR-anyHitShader-03479]]
-    pname:anyHitShader must: be either ename:VK_SHADER_UNUSED_KHR or a valid
-    index into slink:VkRayTracingPipelineCreateInfoKHR::pname:pStages
-    referring to a shader of ename:VK_SHADER_STAGE_ANY_HIT_BIT_KHR
-  * [[VUID-VkRayTracingShaderGroupCreateInfoKHR-rayTracingPipelineShaderGroupHandleCaptureReplayMixed-03603]]
-    If
-    slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplayMixed
-    is ename:VK_FALSE then pname:pShaderGroupCaptureReplayHandle must: not
-    be provided if it has not been provided on a previous call to ray
-    tracing pipeline creation
-  * [[VUID-VkRayTracingShaderGroupCreateInfoKHR-rayTracingPipelineShaderGroupHandleCaptureReplayMixed-03604]]
-    If
-    slink:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplayMixed
-    is ename:VK_FALSE then the caller must: guarantee that no ray tracing
-    pipeline creation commands with pname:pShaderGroupCaptureReplayHandle
-    provided execute simultaneously with ray tracing pipeline creation
-    commands without pname:pShaderGroupCaptureReplayHandle provided
-****
-
-include::{generated}/validity/structs/VkRayTracingShaderGroupCreateInfoKHR.txt[]
---
-endif::VK_KHR_ray_tracing_pipeline[]
-
-[open,refpage='VkRayTracingShaderGroupTypeKHR',desc='Shader group types',type='enums',alias='VkRayTracingShaderGroupTypeNV']
---
-:refpage: VkRayTracingShaderGroupTypeKHR
-
-Possible values of pname:type in sname:VkRayTracingShaderGroupCreateInfoKHR
-are:
-
-include::{generated}/api/enums/VkRayTracingShaderGroupTypeKHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/enums/VkRayTracingShaderGroupTypeNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-  * ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR indicates a shader
-    group with a single ename:VK_SHADER_STAGE_RAYGEN_BIT_KHR,
-    ename:VK_SHADER_STAGE_MISS_BIT_KHR, or
-    ename:VK_SHADER_STAGE_CALLABLE_BIT_KHR shader in it.
-  * ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR specifies
-    a shader group that only hits triangles and must: not contain an
-    intersection shader, only closest hit and any-hit shaders.
-  * ename:VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR
-    specifies a shader group that only intersects with custom geometry and
-    must: contain an intersection shader and may: contain closest hit and
-    any-hit shaders.
-
-[NOTE]
-.Note
-====
-For current group types, the hit group type could be inferred from the
-presence or absence of the intersection shader, but we provide the type
-explicitly for future hit groups that do not have that property.
-====
---
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-[open,refpage='VkRayTracingPipelineInterfaceCreateInfoKHR',desc='Structure specifying additional interface information when using libraries',type='structs']
---
-:refpage: VkRayTracingPipelineInterfaceCreateInfoKHR
-
-The sname:VkRayTracingPipelineInterfaceCreateInfoKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkRayTracingPipelineInterfaceCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxPipelineRayPayloadSize is the maximum payload size in bytes
-    used by any shader in the pipeline.
-  * pname:maxPipelineRayHitAttributeSize is the maximum attribute structure
-    size in bytes used by any shader in the pipeline.
-
-pname:maxPipelineRayPayloadSize is calculated as the maximum number of bytes
-used by any block declared in the code:RayPayloadKHR or
-code:IncomingRayPayloadKHR storage classes.
-pname:maxPipelineRayHitAttributeSize is calculated as the maximum number of
-bytes used by any block declared in the code:HitAttributeKHR storage class.
-As variables in these storage classes do not have explicit offsets, the size
-should be calculated as if each variable has a
-<<interfaces-alignment-requirements, scalar alignment>> equal to the largest
-scalar alignment of any of the block's members.
-
-[NOTE]
-.Note
-====
-There is no explicit upper limit for pname:maxPipelineRayPayloadSize, but in
-practice it should be kept as small as possible.
-Similar to invocation local memory, it must be allocated for each shader
-invocation and for devices which support many simultaneous invocations, this
-storage can rapidly be exhausted, resulting in failure.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkRayTracingPipelineInterfaceCreateInfoKHR-maxPipelineRayHitAttributeSize-03605]]
-    pname:maxPipelineRayHitAttributeSize must: be less than or equal to
-    slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:maxRayHitAttributeSize
-****
-
-include::{generated}/validity/structs/VkRayTracingPipelineInterfaceCreateInfoKHR.txt[]
---
-endif::VK_KHR_ray_tracing_pipeline[]
-
-[open,refpage='vkGetRayTracingShaderGroupHandlesKHR',desc='Query ray tracing pipeline shader group handles',type='protos',alias='vkGetRayTracingShaderGroupHandlesNV']
---
-:refpage: vkGetRayTracingShaderGroupHandlesKHR
-
-To query the opaque handles of shaders in the ray tracing pipeline, call:
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-include::{generated}/api/protos/vkGetRayTracingShaderGroupHandlesKHR.txt[]
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_KHR_ray_tracing_pipeline+VK_NV_ray_tracing[or the equivalent command]
-
-ifdef::VK_NV_ray_tracing[]
-include::{generated}/api/protos/vkGetRayTracingShaderGroupHandlesNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-  * pname:device is the logical device containing the ray tracing pipeline.
-  * pname:pipeline is the ray tracing pipeline object containing the
-    shaders.
-  * pname:firstGroup is the index of the first group to retrieve a handle
-    for from the
-ifdef::VK_KHR_ray_tracing_pipeline[]
-slink:VkRayTracingPipelineCreateInfoKHR::pname:pGroups
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_KHR_ray_tracing_pipeline+VK_NV_ray_tracing[or]
-ifdef::VK_NV_ray_tracing[]
-slink:VkRayTracingPipelineCreateInfoNV::pname:pGroups
-endif::VK_NV_ray_tracing[]
-    array.
-  * pname:groupCount is the number of shader handles to retrieve.
-  * pname:dataSize is the size in bytes of the buffer pointed to by
-    pname:pData.
-  * pname:pData is a pointer to a user-allocated buffer where the results
-    will be written.
-
-.Valid Usage
-****
-  * [[VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-04619]]
-    pname:pipeline must: be a ray tracing pipeline
-  * [[VUID-vkGetRayTracingShaderGroupHandlesKHR-firstGroup-04050]]
-    pname:firstGroup must: be less than the number of shader groups in
-    pname:pipeline
-  * [[VUID-vkGetRayTracingShaderGroupHandlesKHR-firstGroup-02419]]
-    The sum of pname:firstGroup and pname:groupCount must: be less than or
-    equal to the number of shader groups in pname:pipeline
-  * [[VUID-vkGetRayTracingShaderGroupHandlesKHR-dataSize-02420]]
-    pname:dataSize must: be at least
-    [eq]#slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupHandleSize
-    {times} pname:groupCount#
-ifdef::VK_KHR_pipeline_library[]
-  * [[VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-03482]]
-    pname:pipeline must: have not been created with
-    ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
-endif::VK_KHR_pipeline_library[]
-****
-
-include::{generated}/validity/protos/vkGetRayTracingShaderGroupHandlesKHR.txt[]
---
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-[open,refpage='vkGetRayTracingCaptureReplayShaderGroupHandlesKHR',desc='Query ray tracing capture replay pipeline shader group handles',type='protos']
---
-:refpage: vkGetRayTracingCaptureReplayShaderGroupHandlesKHR
-
-To query the optional capture handle information of shaders in the ray
-tracing pipeline, call:
-
-include::{generated}/api/protos/vkGetRayTracingCaptureReplayShaderGroupHandlesKHR.txt[]
-
-  * pname:device is the logical device containing the ray tracing pipeline.
-  * pname:pipeline is the ray tracing pipeline object containing the
-    shaders.
-  * pname:firstGroup is the index of the first group to retrieve a handle
-    for from the slink:VkRayTracingPipelineCreateInfoKHR::pname:pGroups
-    array.
-  * pname:groupCount is the number of shader handles to retrieve.
-  * pname:dataSize is the size in bytes of the buffer pointed to by
-    pname:pData.
-  * pname:pData is a pointer to a user-allocated buffer where the results
-    will be written.
-
-.Valid Usage
-****
-  * [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-04620]]
-    pname:pipeline must: be a ray tracing pipeline
-  * [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-04051]]
-    pname:firstGroup must: be less than the number of shader groups in
-    pname:pipeline
-  * [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-03483]]
-    The sum of pname:firstGroup and pname:groupCount must: be less than or
-    equal to the number of shader groups in pname:pipeline
-  * [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-03484]]
-    pname:dataSize must: be at least
-    [eq]#slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupHandleCaptureReplaySize
-    {times} pname:groupCount#
-  * [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-rayTracingPipelineShaderGroupHandleCaptureReplay-03606]]
-    sname:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineShaderGroupHandleCaptureReplay
-    must: be enabled to call this function
-  * [[VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-03607]]
-    pname:pipeline must: have been created with a pname:flags that included
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR
-****
-
-include::{generated}/validity/protos/vkGetRayTracingCaptureReplayShaderGroupHandlesKHR.txt[]
---
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_NV_ray_tracing[]
-Ray tracing pipelines can: contain more shaders than a graphics or compute
-pipeline, so to allow parallel compilation of shaders within a pipeline, an
-application can: choose to defer compilation until a later point in time.
-
-[open,refpage='vkCompileDeferredNV',desc='Deferred compilation of shaders',type='protos']
---
-:refpage: vkCompileDeferredNV
-
-To compile a deferred shader in a pipeline call:
-
-include::{generated}/api/protos/vkCompileDeferredNV.txt[]
-
-  * pname:device is the logical device containing the ray tracing pipeline.
-  * pname:pipeline is the ray tracing pipeline object containing the
-    shaders.
-  * pname:shader is the index of the shader to compile.
-
-.Valid Usage
-****
-  * [[VUID-vkCompileDeferredNV-pipeline-04621]]
-    pname:pipeline must: be a ray tracing pipeline
-  * [[VUID-vkCompileDeferredNV-pipeline-02237]]
-    pname:pipeline must: have been created with
-    ename:VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV
-  * [[VUID-vkCompileDeferredNV-shader-02238]]
-    pname:shader must: not have been called as a deferred compile before
-****
-
-include::{generated}/validity/protos/vkCompileDeferredNV.txt[]
---
-endif::VK_NV_ray_tracing[]
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-[open,refpage='vkGetRayTracingShaderGroupStackSizeKHR',desc='Query ray tracing pipeline shader group shader stack size',type='protos']
---
-To query the pipeline stack size of shaders in a shader group in the ray
-tracing pipeline, call:
-
-include::{generated}/api/protos/vkGetRayTracingShaderGroupStackSizeKHR.txt[]
-
-  * pname:device is the logical device containing the ray tracing pipeline.
-  * pname:pipeline is the ray tracing pipeline object containing the shaders
-    groups.
-  * pname:group is the index of the shader group to query.
-  * pname:groupShader is the type of shader from the group to query.
-
-The return value is the ray tracing pipeline stack size in bytes for the
-specified shader as called from the specified shader group.
-
-.Valid Usage
-****
-  * [[VUID-vkGetRayTracingShaderGroupStackSizeKHR-pipeline-04622]]
-    pname:pipeline must: be a ray tracing pipeline
-  * [[VUID-vkGetRayTracingShaderGroupStackSizeKHR-group-03608]]
-    The value of pname:group must be less than the number of shader groups
-    in pname:pipeline
-  * [[VUID-vkGetRayTracingShaderGroupStackSizeKHR-groupShader-03609]]
-    The shader identified by pname:groupShader in pname:group must: not be
-    ename:VK_SHADER_UNUSED_KHR
-****
-
-include::{generated}/validity/protos/vkGetRayTracingShaderGroupStackSizeKHR.txt[]
---
-
-[open,refpage='VkShaderGroupShaderKHR',desc='Shader group shaders',type='enums']
---
-Possible values of pname:groupShader in
-flink:vkGetRayTracingShaderGroupStackSizeKHR are:
-
-include::{generated}/api/enums/VkShaderGroupShaderKHR.txt[]
-
-  * ename:VK_SHADER_GROUP_SHADER_GENERAL_KHR uses the shader specified in
-    the group with
-    slink:VkRayTracingShaderGroupCreateInfoKHR::pname:generalShader
-  * ename:VK_SHADER_GROUP_SHADER_CLOSEST_HIT_KHR uses the shader specified
-    in the group with
-    slink:VkRayTracingShaderGroupCreateInfoKHR::pname:closestHitShader
-  * ename:VK_SHADER_GROUP_SHADER_ANY_HIT_KHR uses the shader specified in
-    the group with
-    slink:VkRayTracingShaderGroupCreateInfoKHR::pname:anyHitShader
-  * ename:VK_SHADER_GROUP_SHADER_INTERSECTION_KHR uses the shader specified
-    in the group with
-    slink:VkRayTracingShaderGroupCreateInfoKHR::pname:intersectionShader
---
-
-
-[open,refpage='vkCmdSetRayTracingPipelineStackSizeKHR',desc='Set the stack size dynamically for a ray tracing pipeline',type='protos']
---
-:refpage: vkCmdSetRayTracingPipelineStackSizeKHR
-
-To <<pipelines-dynamic-state, dynamically set>> the stack size for a ray
-tracing pipeline, call:
-
-include::{generated}/api/protos/vkCmdSetRayTracingPipelineStackSizeKHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pipelineStackSize is the stack size to use for subsequent ray
-    tracing trace commands.
-
-This command sets the stack size for subsequent ray tracing commands when
-the ray tracing pipeline is created with
-ename:VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, the stack size is computed as described in
-<<ray-tracing-pipeline-stack, Ray Tracing Pipeline Stack>>.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetRayTracingPipelineStackSizeKHR-pipelineStackSize-03610]]
-    pname:pipelineStackSize must: be large enough for any dynamic execution
-    through the shaders in the ray tracing pipeline used by a subsequent
-    trace call
-****
-include::{generated}/validity/protos/vkCmdSetRayTracingPipelineStackSizeKHR.txt[]
---
-endif::VK_KHR_ray_tracing_pipeline[]
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-
-
-[[pipelines-destruction]]
-== Pipeline Destruction
-
-[open,refpage='vkDestroyPipeline',desc='Destroy a pipeline object',type='protos']
---
-To destroy a pipeline, call:
-
-include::{generated}/api/protos/vkDestroyPipeline.txt[]
-
-  * pname:device is the logical device that destroys the pipeline.
-  * pname:pipeline is the handle of the pipeline to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyPipeline-pipeline-00765]]
-    All submitted commands that refer to pname:pipeline must: have completed
-    execution
-  * [[VUID-vkDestroyPipeline-pipeline-00766]]
-    If sname:VkAllocationCallbacks were provided when pname:pipeline was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyPipeline-pipeline-00767]]
-    If no sname:VkAllocationCallbacks were provided when pname:pipeline was
-    created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyPipeline.txt[]
---
-
-
-[[pipelines-multiple]]
-== Multiple Pipeline Creation
-
-Multiple pipelines can: be created simultaneously by passing an array of
-slink:VkGraphicsPipelineCreateInfo,
-ifdef::VK_KHR_ray_tracing_pipeline[slink:VkRayTracingPipelineCreateInfoKHR,]
-ifdef::VK_NV_ray_tracing[slink:VkRayTracingPipelineCreateInfoNV,]
-or slink:VkComputePipelineCreateInfo structures into the
-flink:vkCreateGraphicsPipelines,
-ifdef::VK_KHR_ray_tracing_pipeline[flink:vkCreateRayTracingPipelinesKHR,]
-ifdef::VK_NV_ray_tracing[flink:vkCreateRayTracingPipelinesNV,]
-and flink:vkCreateComputePipelines commands, respectively.
-Applications can: group together similar pipelines to be created in a single
-call, and implementations are encouraged to look for reuse opportunities
-within a group-create.
-
-When an application attempts to create many pipelines in a single command,
-it is possible that some subset may: fail creation.
-In that case, the corresponding entries in the pname:pPipelines output array
-will be filled with dlink:VK_NULL_HANDLE values.
-If any pipeline fails creation despite valid arguments (for example, due to
-out of memory errors), the elink:VkResult code returned by
-ftext:vkCreate*Pipelines will indicate why.
-The implementation will attempt to create all pipelines, and only return
-dlink:VK_NULL_HANDLE values for those that actually failed.
-
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-If creation fails for a pipeline that had
-ename:VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT set, pipelines at
-an index in the pname:pPipelines array greater than or equal to that of the
-failing pipeline must: be set to dlink:VK_NULL_HANDLE.
-endif::VK_EXT_pipeline_creation_cache_control[]
-
-[[pipelines-pipeline-derivatives]]
-== Pipeline Derivatives
-
-A pipeline derivative is a child pipeline created from a parent pipeline,
-where the child and parent are expected to have much commonality.
-The goal of derivative pipelines is that they be cheaper to create using the
-parent as a starting point, and that it be more efficient (on either host or
-device) to switch/bind between children of the same parent.
-
-A derivative pipeline is created by setting the
-ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag in the
-stext:Vk*PipelineCreateInfo structure.
-If this is set, then exactly one of pname:basePipelineHandle or
-pname:basePipelineIndex members of the structure must: have a valid
-handle/index, and specifies the parent pipeline.
-If pname:basePipelineHandle is used, the parent pipeline must: have already
-been created.
-If pname:basePipelineIndex is used, then the parent is being created in the
-same command.
-dlink:VK_NULL_HANDLE acts as the invalid handle for
-pname:basePipelineHandle, and -1 is the invalid index for
-pname:basePipelineIndex.
-If pname:basePipelineIndex is used, the base pipeline must: appear earlier
-in the array.
-The base pipeline must: have been created with the
-ename:VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set.
-
-
-[[pipelines-cache]]
-== Pipeline Cache
-
-[open,refpage='VkPipelineCache',desc='Opaque handle to a pipeline cache object',type='handles']
---
-Pipeline cache objects allow the result of pipeline construction to be
-reused between pipelines and between runs of an application.
-Reuse between pipelines is achieved by passing the same pipeline cache
-object when creating multiple related pipelines.
-Reuse across runs of an application is achieved by retrieving pipeline cache
-contents in one run of an application, saving the contents, and using them
-to preinitialize a pipeline cache on a subsequent run.
-The contents of the pipeline cache objects are managed by the
-implementation.
-Applications can: manage the host memory consumed by a pipeline cache object
-and control the amount of data retrieved from a pipeline cache object.
-
-Pipeline cache objects are represented by sname:VkPipelineCache handles:
-
-include::{generated}/api/handles/VkPipelineCache.txt[]
---
-
-[[pipelines-cache-create]]
-=== Creating a Pipeline Cache
-
-[open,refpage='vkCreatePipelineCache',desc='Creates a new pipeline cache',type='protos']
---
-To create pipeline cache objects, call:
-
-include::{generated}/api/protos/vkCreatePipelineCache.txt[]
-
-  * pname:device is the logical device that creates the pipeline cache
-    object.
-  * pname:pCreateInfo is a pointer to a slink:VkPipelineCacheCreateInfo
-    structure containing initial parameters for the pipeline cache object.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pPipelineCache is a pointer to a slink:VkPipelineCache handle in
-    which the resulting pipeline cache object is returned.
-
-[NOTE]
-.Note
-====
-Applications can: track and manage the total host memory size of a pipeline
-cache object using the pname:pAllocator.
-Applications can: limit the amount of data retrieved from a pipeline cache
-object in fname:vkGetPipelineCacheData.
-Implementations should: not internally limit the total number of entries
-added to a pipeline cache object or the total host memory consumed.
-====
-
-Once created, a pipeline cache can: be passed to the
-flink:vkCreateGraphicsPipelines
-ifdef::VK_KHR_ray_tracing_pipeline[flink:vkCreateRayTracingPipelinesKHR,]
-ifdef::VK_NV_ray_tracing[flink:vkCreateRayTracingPipelinesNV,]
-and flink:vkCreateComputePipelines commands.
-If the pipeline cache passed into these commands is not
-dlink:VK_NULL_HANDLE, the implementation will query it for possible reuse
-opportunities and update it with new content.
-The use of the pipeline cache object in these commands is internally
-synchronized, and the same pipeline cache object can: be used in multiple
-threads simultaneously.
-
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-If pname:flags of pname:pCreateInfo includes
-ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, all commands
-that modify the returned pipeline cache object must: be
-<<fundamentals-threadingbehavior,externally synchronized>>.
-endif::VK_EXT_pipeline_creation_cache_control[]
-
-[NOTE]
-.Note
-====
-Implementations should: make every effort to limit any critical sections to
-the actual accesses to the cache, which is expected to be significantly
-shorter than the duration of the ftext:vkCreate*Pipelines commands.
-====
-
-include::{generated}/validity/protos/vkCreatePipelineCache.txt[]
---
-
-[open,refpage='VkPipelineCacheCreateInfo',desc='Structure specifying parameters of a newly created pipeline cache',type='structs']
---
-The sname:VkPipelineCacheCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkPipelineCacheCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-  * pname:flags is a bitmask of elink:VkPipelineCacheCreateFlagBits
-    specifying the behavior of the pipeline cache.
-endif::VK_EXT_pipeline_creation_cache_control[]
-ifndef::VK_EXT_pipeline_creation_cache_control[]
-  * pname:flags is reserved for future use.
-endif::VK_EXT_pipeline_creation_cache_control[]
-  * pname:initialDataSize is the number of bytes in pname:pInitialData.
-    If pname:initialDataSize is zero, the pipeline cache will initially be
-    empty.
-  * pname:pInitialData is a pointer to previously retrieved pipeline cache
-    data.
-    If the pipeline cache data is incompatible (as defined below) with the
-    device, the pipeline cache will be initially empty.
-    If pname:initialDataSize is zero, pname:pInitialData is ignored.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineCacheCreateInfo-initialDataSize-00768]]
-    If pname:initialDataSize is not `0`, it must: be equal to the size of
-    pname:pInitialData, as returned by fname:vkGetPipelineCacheData when
-    pname:pInitialData was originally retrieved
-  * [[VUID-VkPipelineCacheCreateInfo-initialDataSize-00769]]
-    If pname:initialDataSize is not `0`, pname:pInitialData must: have been
-    retrieved from a previous call to fname:vkGetPipelineCacheData
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-  * [[VUID-VkPipelineCacheCreateInfo-pipelineCreationCacheControl-02892]]
-    If the <<features-pipelineCreationCacheControl,
-    pname:pipelineCreationCacheControl>> feature is not enabled, pname:flags
-    must: not include
-    ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT
-endif::VK_EXT_pipeline_creation_cache_control[]
-****
-
-include::{generated}/validity/structs/VkPipelineCacheCreateInfo.txt[]
---
-
-[open,refpage='VkPipelineCacheCreateFlags', desc='Bitmask of VkPipelineCreateFlagBits', type='flags']
---
-include::{generated}/api/flags/VkPipelineCacheCreateFlags.txt[]
-
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-tname:VkPipelineCacheCreateFlags is a bitmask type for setting a mask of
-zero or more elink:VkPipelineCacheCreateFlagBits.
-endif::VK_EXT_pipeline_creation_cache_control[]
-ifndef::VK_EXT_pipeline_creation_cache_control[]
-tname:VkPipelineCacheCreateFlags is a bitmask type for setting a mask, but
-is currently reserved for future use.
-endif::VK_EXT_pipeline_creation_cache_control[]
---
-
-ifdef::VK_EXT_pipeline_creation_cache_control[]
-[open,refpage='VkPipelineCacheCreateFlagBits',desc='Bitmask specifying the behavior of the pipeline cache',type='enums']
---
-Possible values of the pname:flags member of
-slink:VkPipelineCacheCreateInfo, specifying the behavior of the pipeline
-cache, are:
-
-include::{generated}/api/enums/VkPipelineCacheCreateFlagBits.txt[]
-
-  * ename:VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT specifies
-    that all commands that modify the created slink:VkPipelineCache will be
-    <<fundamentals-threadingbehavior,externally synchronized>>.
-    When set, the implementation may: skip any unnecessary processing needed
-    to support simultaneous modification from multiple threads where
-    allowed.
---
-endif::VK_EXT_pipeline_creation_cache_control[]
-
-
-[[pipelines-cache-merge]]
-=== Merging Pipeline Caches
-
-[open,refpage='vkMergePipelineCaches',desc='Combine the data stores of pipeline caches',type='protos']
---
-Pipeline cache objects can: be merged using the command:
-
-include::{generated}/api/protos/vkMergePipelineCaches.txt[]
-
-  * pname:device is the logical device that owns the pipeline cache objects.
-  * pname:dstCache is the handle of the pipeline cache to merge results
-    into.
-  * pname:srcCacheCount is the length of the pname:pSrcCaches array.
-  * pname:pSrcCaches is a pointer to an array of pipeline cache handles,
-    which will be merged into pname:dstCache.
-    The previous contents of pname:dstCache are included after the merge.
-
-[NOTE]
-.Note
-====
-The details of the merge operation are implementation-dependent, but
-implementations should: merge the contents of the specified pipelines and
-prune duplicate entries.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkMergePipelineCaches-dstCache-00770]]
-    pname:dstCache must: not appear in the list of source caches
-****
-
-include::{generated}/validity/protos/vkMergePipelineCaches.txt[]
---
-
-[[pipelines-cache-retrieval]]
-=== Retrieving Pipeline Cache Data
-
-[open,refpage='vkGetPipelineCacheData',desc='Get the data store from a pipeline cache',type='protos']
---
-Data can: be retrieved from a pipeline cache object using the command:
-
-include::{generated}/api/protos/vkGetPipelineCacheData.txt[]
-
-  * pname:device is the logical device that owns the pipeline cache.
-  * pname:pipelineCache is the pipeline cache to retrieve data from.
-  * pname:pDataSize is a pointer to a code:size_t value related to the
-    amount of data in the pipeline cache, as described below.
-  * pname:pData is either `NULL` or a pointer to a buffer.
-
-If pname:pData is `NULL`, then the maximum size of the data that can: be
-retrieved from the pipeline cache, in bytes, is returned in pname:pDataSize.
-Otherwise, pname:pDataSize must: point to a variable set by the user to the
-size of the buffer, in bytes, pointed to by pname:pData, and on return the
-variable is overwritten with the amount of data actually written to
-pname:pData.
-If pname:pDataSize is less than the maximum size that can: be retrieved by
-the pipeline cache, at most pname:pDataSize bytes will be written to
-pname:pData, and ename:VK_INCOMPLETE will be returned instead of
-ename:VK_SUCCESS, to indicate that not all of the pipeline cache was
-returned.
-
-Any data written to pname:pData is valid and can: be provided as the
-pname:pInitialData member of the slink:VkPipelineCacheCreateInfo structure
-passed to fname:vkCreatePipelineCache.
-
-Two calls to fname:vkGetPipelineCacheData with the same parameters must:
-retrieve the same data unless a command that modifies the contents of the
-cache is called between them.
-
-The initial bytes written to pname:pData must: be a header as described in
-the <<pipelines-cache-header, Pipeline Cache Header>> section.
-
-If pname:pDataSize is less than what is necessary to store this header,
-nothing will be written to pname:pData and zero will be written to
-pname:pDataSize.
-
-include::{generated}/validity/protos/vkGetPipelineCacheData.txt[]
---
-
-[[pipelines-cache-header]]
-=== Pipeline Cache Header
-
-Applications can: store the data retrieved from the pipeline cache, and use
-these data, possibly in a future run of the application, to populate new
-pipeline cache objects.
-The results of pipeline compiles, however, may: depend on the vendor ID,
-device ID, driver version, and other details of the device.
-To enable applications to detect when previously retrieved data is
-incompatible with the device, the pipeline cache data must: begin with a
-valid pipeline cache header.
-
-[open,refpage='VkPipelineCacheHeaderVersionOne',desc='Structure describing the layout of the pipeline cache header',type='structs']
---
-Version one of the pipeline cache header is defined as:
-
-include::{generated}/api/structs/VkPipelineCacheHeaderVersionOne.txt[]
-
-  * pname:headerSize is the length in bytes of the pipeline cache header.
-  * pname:headerVersion is a elink:VkPipelineCacheHeaderVersion enum value
-    specifying the version of the header.
-    A consumer of the pipeline cache should: use the cache version to
-    interpret the remainder of the cache header.
-  * pname:vendorID is the sname:VkPhysicalDeviceProperties::pname:vendorID
-    of the implementation.
-  * pname:deviceID is the sname:VkPhysicalDeviceProperties::pname:deviceID
-    of the implementation.
-  * pname:pipelineCacheUUID is the
-    sname:VkPhysicalDeviceProperties::pname:pipelineCacheUUID of the
-    implementation.
-
-Unlike most structures declared by the Vulkan API, all fields of this
-structure are written with the least significant byte first, regardless of
-host byte-order.
-
-The C language specification does not define the packing of structure
-members.
-This layout assumes tight structure member packing, with members laid out in
-the order listed in the structure, and the intended size of the structure is
-32 bytes.
-If a compiler produces code that diverges from that pattern, applications
-must: employ another method to set values at the correct offsets.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineCacheHeaderVersionOne-headerSize-04967]]
-    pname:headerSize must: be 32
-  * [[VUID-VkPipelineCacheHeaderVersionOne-headerVersion-04968]]
-    pname:headerVersion must: be ename:VK_PIPELINE_CACHE_HEADER_VERSION_ONE
-****
-
-include::{generated}/validity/structs/VkPipelineCacheHeaderVersionOne.txt[]
---
-
-
-[open,refpage='VkPipelineCacheHeaderVersion',desc='Encode pipeline cache version',type='enums',xrefs='vkCreatePipelineCache vkGetPipelineCacheData']
---
-Possible values of the pname:headerVersion value of the pipeline cache
-header are:
-
-include::{generated}/api/enums/VkPipelineCacheHeaderVersion.txt[]
-
-  * ename:VK_PIPELINE_CACHE_HEADER_VERSION_ONE specifies version one of the
-    pipeline cache.
---
-
-[[pipelines-cache-destroy]]
-=== Destroying a Pipeline Cache
-
-[open,refpage='vkDestroyPipelineCache',desc='Destroy a pipeline cache object',type='protos']
---
-To destroy a pipeline cache, call:
-
-include::{generated}/api/protos/vkDestroyPipelineCache.txt[]
-
-  * pname:device is the logical device that destroys the pipeline cache
-    object.
-  * pname:pipelineCache is the handle of the pipeline cache to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyPipelineCache-pipelineCache-00771]]
-    If sname:VkAllocationCallbacks were provided when pname:pipelineCache
-    was created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyPipelineCache-pipelineCache-00772]]
-    If no sname:VkAllocationCallbacks were provided when pname:pipelineCache
-    was created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyPipelineCache.txt[]
---
-
-
-[[pipelines-specialization-constants]]
-== Specialization Constants
-
-Specialization constants are a mechanism whereby constants in a SPIR-V
-module can: have their constant value specified at the time the
-sname:VkPipeline is created.
-This allows a SPIR-V module to have constants that can: be modified while
-executing an application that uses the Vulkan API.
-
-[NOTE]
-.Note
-====
-Specialization constants are useful to allow a compute shader to have its
-local workgroup size changed at runtime by the user, for example.
-====
-
-Each slink:VkPipelineShaderStageCreateInfo structure contains a
-pname:pSpecializationInfo member, which can: be `NULL` to indicate no
-specialization constants, or point to a sname:VkSpecializationInfo
-structure.
-
-[open,refpage='VkSpecializationInfo',desc='Structure specifying specialization information',type='structs']
---
-The sname:VkSpecializationInfo structure is defined as:
-
-include::{generated}/api/structs/VkSpecializationInfo.txt[]
-
-  * pname:mapEntryCount is the number of entries in the pname:pMapEntries
-    array.
-  * pname:pMapEntries is a pointer to an array of
-    sname:VkSpecializationMapEntry structures which map constant IDs to
-    offsets in pname:pData.
-  * pname:dataSize is the byte size of the pname:pData buffer.
-  * pname:pData contains the actual constant values to specialize with.
-
-.Valid Usage
-****
-  * [[VUID-VkSpecializationInfo-offset-00773]]
-    The pname:offset member of each element of pname:pMapEntries must: be
-    less than pname:dataSize
-  * [[VUID-VkSpecializationInfo-pMapEntries-00774]]
-    The pname:size member of each element of pname:pMapEntries must: be less
-    than or equal to pname:dataSize minus pname:offset
-  * [[VUID-VkSpecializationInfo-constantID-04911]]
-    The pname:constantID value of each element of pname:pMapEntries must: be
-    unique within pname:pMapEntries
-****
-
-include::{generated}/validity/structs/VkSpecializationInfo.txt[]
---
-
-[open,refpage='VkSpecializationMapEntry',desc='Structure specifying a specialization map entry',type='structs']
---
-The sname:VkSpecializationMapEntry structure is defined as:
-
-include::{generated}/api/structs/VkSpecializationMapEntry.txt[]
-
-  * pname:constantID is the ID of the specialization constant in SPIR-V.
-  * pname:offset is the byte offset of the specialization constant value
-    within the supplied data buffer.
-  * pname:size is the byte size of the specialization constant value within
-    the supplied data buffer.
-
-If a pname:constantID value is not a specialization constant ID used in the
-shader, that map entry does not affect the behavior of the pipeline.
-
-.Valid Usage
-****
-  * [[VUID-VkSpecializationMapEntry-constantID-00776]]
-    For a pname:constantID specialization constant declared in a shader,
-    pname:size must: match the byte size of the pname:constantID.
-    If the specialization constant is of type code:boolean, pname:size must:
-    be the byte size of basetype:VkBool32
-****
-
-include::{generated}/validity/structs/VkSpecializationMapEntry.txt[]
---
-
-In human readable SPIR-V:
-
-[source,glsl]
----------------------------------------------------
-OpDecorate %x SpecId 13 ; decorate .x component of WorkgroupSize with ID 13
-OpDecorate %y SpecId 42 ; decorate .y component of WorkgroupSize with ID 42
-OpDecorate %z SpecId 3  ; decorate .z component of WorkgroupSize with ID 3
-OpDecorate %wgsize BuiltIn WorkgroupSize ; decorate WorkgroupSize onto constant
-%i32 = OpTypeInt 32 0 ; declare an unsigned 32-bit type
-%uvec3 = OpTypeVector %i32 3 ; declare a 3 element vector type of unsigned 32-bit
-%x = OpSpecConstant %i32 1 ; declare the .x component of WorkgroupSize
-%y = OpSpecConstant %i32 1 ; declare the .y component of WorkgroupSize
-%z = OpSpecConstant %i32 1 ; declare the .z component of WorkgroupSize
-%wgsize = OpSpecConstantComposite %uvec3 %x %y %z ; declare WorkgroupSize
----------------------------------------------------
-
-From the above we have three specialization constants, one for each of the
-x, y & z elements of the WorkgroupSize vector.
-
-Now to specialize the above via the specialization constants mechanism:
-
-[source,c++]
----------------------------------------------------
-const VkSpecializationMapEntry entries[] =
-{
-    {
-        13,                             // constantID
-        0 * sizeof(uint32_t),           // offset
-        sizeof(uint32_t)                // size
-    },
-    {
-        42,                             // constantID
-        1 * sizeof(uint32_t),           // offset
-        sizeof(uint32_t)                // size
-    },
-    {
-        3,                              // constantID
-        2 * sizeof(uint32_t),           // offset
-        sizeof(uint32_t)                // size
-    }
-};
-
-const uint32_t data[] = { 16, 8, 4 }; // our workgroup size is 16x8x4
-
-const VkSpecializationInfo info =
-{
-    3,                                  // mapEntryCount
-    entries,                            // pMapEntries
-    3 * sizeof(uint32_t),               // dataSize
-    data,                               // pData
-};
----------------------------------------------------
-
-Then when calling flink:vkCreateComputePipelines, and passing the
-sname:VkSpecializationInfo we defined as the pname:pSpecializationInfo
-parameter of slink:VkPipelineShaderStageCreateInfo, we will create a compute
-pipeline with the runtime specified local workgroup size.
-
-Another example would be that an application has a SPIR-V module that has
-some platform-dependent constants they wish to use.
-
-In human readable SPIR-V:
-
-// [source,glsl]
-[source,glsl]
----------------------------------------------------
-OpDecorate %1 SpecId 0  ; decorate our signed 32-bit integer constant
-OpDecorate %2 SpecId 12 ; decorate our 32-bit floating-point constant
-%i32 = OpTypeInt 32 1   ; declare a signed 32-bit type
-%float = OpTypeFloat 32 ; declare a 32-bit floating-point type
-%1 = OpSpecConstant %i32 -1 ; some signed 32-bit integer constant
-%2 = OpSpecConstant %float 0.5 ; some 32-bit floating-point constant
----------------------------------------------------
-
-From the above we have two specialization constants, one is a signed 32-bit
-integer and the second is a 32-bit floating-point value.
-
-Now to specialize the above via the specialization constants mechanism:
-
-[source,c++]
----------------------------------------------------
-struct SpecializationData {
-    int32_t data0;
-    float data1;
-};
-
-const VkSpecializationMapEntry entries[] =
-{
-    {
-        0,                                    // constantID
-        offsetof(SpecializationData, data0),  // offset
-        sizeof(SpecializationData::data0)     // size
-    },
-    {
-        12,                                   // constantID
-        offsetof(SpecializationData, data1),  // offset
-        sizeof(SpecializationData::data1)     // size
-    }
-};
-
-SpecializationData data;
-data.data0 = -42;    // set the data for the 32-bit integer
-data.data1 = 42.0f;  // set the data for the 32-bit floating-point
-
-const VkSpecializationInfo info =
-{
-    2,                                  // mapEntryCount
-    entries,                            // pMapEntries
-    sizeof(data),                       // dataSize
-    &data,                              // pData
-};
----------------------------------------------------
-
-It is legal for a SPIR-V module with specializations to be compiled into a
-pipeline where no specialization information was provided.
-SPIR-V specialization constants contain default values such that if a
-specialization is not provided, the default value will be used.
-In the examples above, it would be valid for an application to only
-specialize some of the specialization constants within the SPIR-V module,
-and let the other constants use their default values encoded within the
-OpSpecConstant declarations.
-
-
-ifdef::VK_KHR_pipeline_library[]
-[[pipeline-library]]
-== Pipeline Libraries
-
-A pipeline library is a special pipeline that was created using the
-ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR and cannot be bound, instead it
-defines a set of pipeline state which can be linked into other pipelines.
-ifdef::VK_KHR_ray_tracing_pipeline[]
-For ray tracing pipelines this includes shaders and shader groups.
-endif::VK_KHR_ray_tracing_pipeline[]
-The application must: maintain the lifetime of a pipeline library based on
-the pipelines that link with it.
-A pipeline library is considered in-use, as long as one of the linking
-pipelines is in-use.
-
-This linkage is achieved by using the following structure within the
-appropriate creation mechanisms:
-
-[open,refpage='VkPipelineLibraryCreateInfoKHR',desc='Structure specifying pipeline libraries to use when creating a pipeline',type='structs']
---
-The sname:VkPipelineLibraryCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkPipelineLibraryCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:libraryCount is the number of pipeline libraries in
-    pname:pLibraries.
-  * pname:pLibraries is a pointer to an array of slink:VkPipeline structures
-    specifying pipeline libraries to use when creating a pipeline.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-03381]]
-    Each element of pname:pLibraries must: have been created with
-    ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR
-****
-
-include::{generated}/validity/structs/VkPipelineLibraryCreateInfoKHR.txt[]
---
-endif::VK_KHR_pipeline_library[]
-
-
-[[pipelines-binding]]
-== Pipeline Binding
-
-[open,refpage='vkCmdBindPipeline',desc='Bind a pipeline object to a command buffer',type='protos']
---
-Once a pipeline has been created, it can: be bound to the command buffer
-using the command:
-
-include::{generated}/api/protos/vkCmdBindPipeline.txt[]
-
-  * pname:commandBuffer is the command buffer that the pipeline will be
-    bound to.
-  * pname:pipelineBindPoint is a elink:VkPipelineBindPoint value specifying
-    to which bind point the pipeline is bound.
-    Binding one does not disturb the others.
-  * pname:pipeline is the pipeline to be bound.
-
-[[pipeline-bindpoint-commands]]
-Once bound, a pipeline binding affects subsequent commands that interact
-with the given pipeline type in the command buffer until a different
-pipeline of the same type is bound to the bind point.
-Commands that do not interact with the given pipeline type must: not be
-affected by the pipeline state.
-
-  * The pipeline bound to ename:VK_PIPELINE_BIND_POINT_COMPUTE controls the
-    behavior of all <<dispatch, dispatching commands>>.
-  * The pipeline bound to ename:VK_PIPELINE_BIND_POINT_GRAPHICS controls the
-    behavior of all <<drawing, drawing commands>>.
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-  * The pipeline bound to ename:VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR
-    controls the behavior of flink:vkCmdTraceRaysKHR and
-    flink:vkCmdTraceRaysIndirectKHR.
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_HUAWEI_subpass_shading[]
-  * The pipeline bound to
-    ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI controls the
-    behavior of flink:vkCmdSubpassShadingHUAWEI.
-endif::VK_HUAWEI_subpass_shading[]
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBindPipeline-pipelineBindPoint-00777]]
-    If pname:pipelineBindPoint is ename:VK_PIPELINE_BIND_POINT_COMPUTE, the
-    sname:VkCommandPool that pname:commandBuffer was allocated from must:
-    support compute operations
-  * [[VUID-vkCmdBindPipeline-pipelineBindPoint-00778]]
-    If pname:pipelineBindPoint is ename:VK_PIPELINE_BIND_POINT_GRAPHICS, the
-    sname:VkCommandPool that pname:commandBuffer was allocated from must:
-    support graphics operations
-  * [[VUID-vkCmdBindPipeline-pipelineBindPoint-00779]]
-    If pname:pipelineBindPoint is ename:VK_PIPELINE_BIND_POINT_COMPUTE,
-    pname:pipeline must: be a compute pipeline
-  * [[VUID-vkCmdBindPipeline-pipelineBindPoint-00780]]
-    If pname:pipelineBindPoint is ename:VK_PIPELINE_BIND_POINT_GRAPHICS,
-    pname:pipeline must: be a graphics pipeline
-  * [[VUID-vkCmdBindPipeline-pipeline-00781]]
-    If the <<features-variableMultisampleRate,variable multisample rate>>
-    feature is not supported, pname:pipeline is a graphics pipeline, the
-    current subpass <<renderpass-noattachments, uses no attachments>>, and
-    this is not the first call to this function with a graphics pipeline
-    after transitioning to the current subpass, then the sample count
-    specified by this pipeline must: match that set in the previous pipeline
-ifdef::VK_EXT_sample_locations[]
-  * [[VUID-vkCmdBindPipeline-variableSampleLocations-01525]]
-    If
-    slink:VkPhysicalDeviceSampleLocationsPropertiesEXT::pname:variableSampleLocations
-    is ename:VK_FALSE, and pname:pipeline is a graphics pipeline created
-    with a slink:VkPipelineSampleLocationsStateCreateInfoEXT structure
-    having its pname:sampleLocationsEnable member set to ename:VK_TRUE but
-    without ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT enabled then the
-    current render pass instance must: have been begun by specifying a
-    slink:VkRenderPassSampleLocationsBeginInfoEXT structure whose
-    pname:pPostSubpassSampleLocations member contains an element with a
-    pname:subpassIndex matching the current subpass index and the
-    pname:sampleLocationsInfo member of that element must: match the
-    pname:sampleLocationsInfo specified in
-    slink:VkPipelineSampleLocationsStateCreateInfoEXT when the pipeline was
-    created
-endif::VK_EXT_sample_locations[]
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-vkCmdBindPipeline-None-02323]]
-    This command must: not be recorded when transform feedback is active
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-  * [[VUID-vkCmdBindPipeline-pipelineBindPoint-02391]]
-    If pname:pipelineBindPoint is
-    ename:VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, the sname:VkCommandPool
-    that pname:commandBuffer was allocated from must: support compute
-    operations
-  * [[VUID-vkCmdBindPipeline-pipelineBindPoint-02392]]
-    If pname:pipelineBindPoint is
-    ename:VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, pname:pipeline must: be a
-    ray tracing pipeline
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_KHR_pipeline_library[]
-  * [[VUID-vkCmdBindPipeline-pipeline-03382]]
-    pname:pipeline must: not have been created with
-    ename:VK_PIPELINE_CREATE_LIBRARY_BIT_KHR set
-endif::VK_KHR_pipeline_library[]
-ifdef::VK_NV_inherited_viewport_scissor[]
-  * [[VUID-vkCmdBindPipeline-commandBuffer-04808]]
-    If pname:commandBuffer is a secondary command buffer with
-    slink:VkCommandBufferInheritanceViewportScissorInfoNV::pname:viewportScissor2D
-    enabled and pname:pipelineBindPoint is
-    ename:VK_PIPELINE_BIND_POINT_GRAPHICS, then the pname:pipeline must:
-    have been created with ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT or
-    ename:VK_DYNAMIC_STATE_VIEWPORT, and
-    ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT or
-    ename:VK_DYNAMIC_STATE_SCISSOR enabled
-endif::VK_NV_inherited_viewport_scissor[]
-ifdef::VK_NV_inherited_viewport_scissor,VK_EXT_discard_rectangles[]
-  * [[VUID-vkCmdBindPipeline-commandBuffer-04809]]
-    If pname:commandBuffer is a secondary command buffer with
-    slink:VkCommandBufferInheritanceViewportScissorInfoNV::pname:viewportScissor2D
-    enabled and pname:pipelineBindPoint is
-    ename:VK_PIPELINE_BIND_POINT_GRAPHICS and pname:pipeline was created
-    with slink:VkPipelineDiscardRectangleStateCreateInfoEXT structure and
-    its pname:discardRectangleCount member is not `0`, then the pipeline
-    must: have been created with
-    ename:VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT enabled
-endif::VK_NV_inherited_viewport_scissor,VK_EXT_discard_rectangles[]
-ifdef::VK_EXT_provoking_vertex[]
-  * [[VUID-vkCmdBindPipeline-pipelineBindPoint-04881]]
-    If pname:pipelineBindPoint is ename:VK_PIPELINE_BIND_POINT_GRAPHICS and
-    the
-    <<limits-provokingVertexModePerPipeline,provokingVertexModePerPipeline>>
-    limit is ename:VK_FALSE, then pipeline's
-    slink:VkPipelineRasterizationProvokingVertexStateCreateInfoEXT::pname:provokingVertexMode
-    must: be the same as that of any other pipelines previously bound to
-    this bind point within the current render pass instance, including any
-    pipeline already bound when beginning the render pass instance
-endif::VK_EXT_provoking_vertex[]
-ifdef::VK_HUAWEI_subpass_shading[]
-  * [[VUID-vkCmdBindPipeline-pipelineBindPoint-04949]]
-    If pname:pipelineBindPoint is
-    ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI, the
-    sname:VkCommandPool that pname:commandBuffer was allocated from must:
-    support compute operations
-  * [[VUID-vkCmdBindPipeline-pipelineBindPoint-04950]]
-    If pname:pipelineBindPoint is
-    ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI, pname:pipeline
-    must: be a subpass shading pipeline
-endif::VK_HUAWEI_subpass_shading[]
-ifdef::VK_KHR_dynamic_rendering[]
-  * [[VUID-vkCmdBindPipeline-pipeline-06195]]
-    If pname:pipeline is a graphics pipeline, this command has been called
-    inside a render pass instance started with flink:vkCmdBeginRenderingKHR,
-    and commands using the previously bound graphics pipeline have been
-    recorded within the render pass instance, then the value of
-    slink:VkPipelineRenderingCreateInfoKHR::pname:colorAttachmentCount
-    specified by this pipeline must: match that set in the previous pipeline
-  * [[VUID-vkCmdBindPipeline-pipeline-06196]]
-    If pname:pipeline is a graphics pipeline, this command has been called
-    inside a render pass instance started with flink:vkCmdBeginRenderingKHR,
-    and commands using the previously bound graphics pipeline have been
-    recorded within the render pass instance, then the elements of
-    slink:VkPipelineRenderingCreateInfoKHR::pname:pColorAttachmentFormats
-    specified by this pipeline must: match that set in the previous pipeline
-  * [[VUID-vkCmdBindPipeline-pipeline-06197]]
-    If pname:pipeline is a graphics pipeline, this command has been called
-    inside a render pass instance started with flink:vkCmdBeginRenderingKHR,
-    and commands using the previously bound graphics pipeline have been
-    recorded within the render pass instance, then the value of
-    slink:VkPipelineRenderingCreateInfoKHR::pname:depthAttachmentFormat
-    specified by this pipeline must: match that set in the previous pipeline
-  * [[VUID-vkCmdBindPipeline-pipeline-06194]]
-    If pname:pipeline is a graphics pipeline, this command has been called
-    inside a render pass instance started with flink:vkCmdBeginRenderingKHR,
-    and commands using the previously bound graphics pipeline have been
-    recorded within the render pass instance, then the value of
-    slink:VkPipelineRenderingCreateInfoKHR::pname:stencilAttachmentFormat
-    specified by this pipeline must: match that set in the previous pipeline
-endif::VK_KHR_dynamic_rendering[]
-****
-
-include::{generated}/validity/protos/vkCmdBindPipeline.txt[]
---
-
-[open,refpage='VkPipelineBindPoint',desc='Specify the bind point of a pipeline object to a command buffer',type='enums']
---
-Possible values of flink:vkCmdBindPipeline::pname:pipelineBindPoint,
-specifying the bind point of a pipeline object, are:
-
-include::{generated}/api/enums/VkPipelineBindPoint.txt[]
-
-  * ename:VK_PIPELINE_BIND_POINT_COMPUTE specifies binding as a compute
-    pipeline.
-  * ename:VK_PIPELINE_BIND_POINT_GRAPHICS specifies binding as a graphics
-    pipeline.
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-  * ename:VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR specifies binding as a ray
-    tracing pipeline.
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_HUAWEI_subpass_shading[]
-  * ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI specifies binding as
-    a subpass shading pipeline.
-endif::VK_HUAWEI_subpass_shading[]
---
-
-ifdef::VK_NV_device_generated_commands[]
-[open,refpage='vkCmdBindPipelineShaderGroupNV',desc='Bind a pipeline object's shader group to a command buffer',type='protos']
---
-For pipelines that were created with the support of multiple shader groups
-(see <<graphics-shadergroups,Graphics Pipeline Shader Groups>>), the regular
-fname:vkCmdBindPipeline command will bind Shader Group `0`.
-To explicitly bind a shader group use:
-
-include::{generated}/api/protos/vkCmdBindPipelineShaderGroupNV.txt[]
-
-  * pname:commandBuffer is the command buffer that the pipeline will be
-    bound to.
-  * pname:pipelineBindPoint is a elink:VkPipelineBindPoint value specifying
-    the bind point to which the pipeline will be bound.
-  * pname:pipeline is the pipeline to be bound.
-  * pname:groupIndex is the shader group to be bound.
-
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBindPipelineShaderGroupNV-groupIndex-02893]]
-    pname:groupIndex must: be `0` or less than the effective
-    slink:VkGraphicsPipelineShaderGroupsCreateInfoNV::pname:groupCount
-    including the referenced pipelines
-  * [[VUID-vkCmdBindPipelineShaderGroupNV-pipelineBindPoint-02894]]
-    The pname:pipelineBindPoint must: be
-    ename:VK_PIPELINE_BIND_POINT_GRAPHICS
-  * [[VUID-vkCmdBindPipelineShaderGroupNV-groupIndex-02895]]
-    The same restrictions as flink:vkCmdBindPipeline apply as if the bound
-    pipeline was created only with the Shader Group from the
-    pname:groupIndex information
-  * [[VUID-vkCmdBindPipelineShaderGroupNV-deviceGeneratedCommands-02896]]
-    The <<features-deviceGeneratedCommands,
-    sname:VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::pname:deviceGeneratedCommands>>
-    feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdBindPipelineShaderGroupNV.txt[]
---
-endif::VK_NV_device_generated_commands[]
-
-
-[[pipelines-dynamic-state]]
-== Dynamic State
-
-When a pipeline object is bound, any pipeline object state that is not
-specified as dynamic is applied to the command buffer state.
-Pipeline object state that is specified as dynamic is not applied to the
-command buffer state at this time.
-Instead, dynamic state can: be modified at any time and persists for the
-lifetime of the command buffer, or until modified by another dynamic state
-setting command or another pipeline bind.
-
-When a pipeline object is bound, the following applies to each state
-parameter:
-
-  * If the state is not specified as dynamic in the new pipeline object,
-    then that command buffer state is overwritten by the state in the new
-    pipeline object.
-    Before any draw or dispatch call with this pipeline there must: not have
-    been any calls to any of the corresponding dynamic state setting
-    commands after this pipeline was bound
-  * If the state is specified as dynamic in the new pipeline object, then
-    that command buffer state is not disturbed.
-    Before any draw or dispatch call with this pipeline there must: have
-    been at least one call to each of the corresponding dynamic state
-    setting commands since the command buffer recording was begun, or the
-    last bound pipeline object with that state specified as static,
-    whichever was the latter
-
-Dynamic state that does not affect the result of operations can: be left
-undefined:.
-
-[NOTE]
-.Note
-====
-For example, if blending is disabled by the pipeline object state then the
-dynamic color blend constants do not need to be specified in the command
-buffer, even if this state is specified as dynamic in the pipeline object.
-====
-
-ifdef::VK_AMD_shader_info,VK_KHR_pipeline_executable_properties[]
-[[pipelines-shader-information]]
-== Pipeline Shader Information
-endif::VK_AMD_shader_info,VK_KHR_pipeline_executable_properties[]
-
-ifdef::VK_KHR_pipeline_executable_properties[]
-include::VK_KHR_pipeline_executable_properties/pipelines.txt[]
-endif::VK_KHR_pipeline_executable_properties[]
-
-ifdef::VK_AMD_shader_info[]
-include::VK_AMD_shader_info.txt[]
-endif::VK_AMD_shader_info[]
-
-// These includes have their own section headers
-
-ifdef::VK_AMD_pipeline_compiler_control[]
-include::VK_AMD_pipeline_compiler_control.txt[]
-endif::VK_AMD_pipeline_compiler_control[]
-
-ifdef::VK_EXT_pipeline_creation_feedback[]
-include::VK_EXT_pipeline_creation_feedback/pipelines.txt[]
-endif::VK_EXT_pipeline_creation_feedback[]
diff --git a/registry/vulkan/chapters/primsrast.txt b/registry/vulkan/chapters/primsrast.txt
deleted file mode 100644
index eef2402..0000000
--- a/registry/vulkan/chapters/primsrast.txt
+++ /dev/null
@@ -1,3610 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[primsrast]]
-= Rasterization
-
-Rasterization is the process by which a primitive is converted to a
-two-dimensional image.
-Each discrete location of this image contains associated data such as depth,
-color, or other attributes.
-
-Rasterizing a primitive begins by determining which squares of an integer
-grid in framebuffer coordinates are occupied by the primitive, and assigning
-one or more depth values to each such square.
-This process is described below for points, lines, and polygons.
-
-A grid square, including its [eq]#(x,y)# framebuffer coordinates, [eq]#z#
-(depth), and associated data added by fragment shaders, is called a
-fragment.
-A fragment is located by its upper left corner, which lies on integer grid
-coordinates.
-
-Rasterization operations also refer to a fragment's sample locations, which
-are offset by fractional values from its upper left corner.
-The rasterization rules for points, lines, and triangles involve testing
-whether each sample location is inside the primitive.
-Fragments need not actually be square, and rasterization rules are not
-affected by the aspect ratio of fragments.
-Display of non-square grids, however, will cause rasterized points and line
-segments to appear fatter in one direction than the other.
-
-We assume that fragments are square, since it simplifies antialiasing and
-texturing.
-After rasterization, fragments are processed by <<fragops, fragment
-operations>>.
-
-Several factors affect rasterization, including the members of
-slink:VkPipelineRasterizationStateCreateInfo and
-slink:VkPipelineMultisampleStateCreateInfo.
-
-[open,refpage='VkPipelineRasterizationStateCreateInfo',desc='Structure specifying parameters of a newly created pipeline rasterization state',type='structs']
---
-The sname:VkPipelineRasterizationStateCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkPipelineRasterizationStateCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:depthClampEnable controls whether to clamp the fragment's depth
-    values as described in <<fragops-depth,Depth Test>>.
-ifdef::VK_EXT_depth_clip_enable[]
-    If the pipeline is not created with
-    slink:VkPipelineRasterizationDepthClipStateCreateInfoEXT present then
-    enabling depth clamp will also disable clipping primitives to the z
-    planes of the frustrum as described in <<vertexpostproc-clipping,
-    Primitive Clipping>>.
-    Otherwise depth clipping is controlled by the state set in
-    slink:VkPipelineRasterizationDepthClipStateCreateInfoEXT.
-endif::VK_EXT_depth_clip_enable[]
-ifndef::VK_EXT_depth_clip_enable[]
-    Enabling depth clamp will also disable clipping primitives to the z
-    planes of the frustrum as described in <<vertexpostproc-clipping,
-    Primitive Clipping>>.
-endif::VK_EXT_depth_clip_enable[]
-  * pname:rasterizerDiscardEnable controls whether primitives are discarded
-    immediately before the rasterization stage.
-  * pname:polygonMode is the triangle rendering mode.
-    See elink:VkPolygonMode.
-  * pname:cullMode is the triangle facing direction used for primitive
-    culling.
-    See elink:VkCullModeFlagBits.
-  * pname:frontFace is a elink:VkFrontFace value specifying the front-facing
-    triangle orientation to be used for culling.
-  * pname:depthBiasEnable controls whether to bias fragment depth values.
-  * pname:depthBiasConstantFactor is a scalar factor controlling the
-    constant depth value added to each fragment.
-  * pname:depthBiasClamp is the maximum (or minimum) depth bias of a
-    fragment.
-  * pname:depthBiasSlopeFactor is a scalar factor applied to a fragment's
-    slope in depth bias calculations.
-  * pname:lineWidth is the width of rasterized line segments.
-
-ifdef::VK_AMD_rasterization_order[]
-The application can: also add a
-sname:VkPipelineRasterizationStateRasterizationOrderAMD structure to the
-pname:pNext chain of a slink:VkPipelineRasterizationStateCreateInfo
-structure.
-This structure enables selecting the rasterization order to use when
-rendering with the corresponding graphics pipeline as described in
-<<primsrast-order, Rasterization Order>>.
-endif::VK_AMD_rasterization_order[]
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineRasterizationStateCreateInfo-depthClampEnable-00782]]
-    If the <<features-depthClamp,depth clamping>> feature is not enabled,
-    pname:depthClampEnable must: be ename:VK_FALSE
-ifndef::VK_NV_fill_rectangle[]
-  * [[VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01413]]
-    If the <<features-fillModeNonSolid,non-solid fill modes>> feature is not
-    enabled, pname:polygonMode must: be ename:VK_POLYGON_MODE_FILL
-endif::VK_NV_fill_rectangle[]
-ifdef::VK_NV_fill_rectangle[]
-  * [[VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01507]]
-    If the <<features-fillModeNonSolid,non-solid fill modes>> feature is not
-    enabled, pname:polygonMode must: be ename:VK_POLYGON_MODE_FILL or
-    ename:VK_POLYGON_MODE_FILL_RECTANGLE_NV
-  * [[VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01414]]
-    If the `apiext:VK_NV_fill_rectangle` extension is not enabled,
-    pname:polygonMode must: not be ename:VK_POLYGON_MODE_FILL_RECTANGLE_NV
-endif::VK_NV_fill_rectangle[]
-ifdef::VK_KHR_portability_subset[]
-  * [[VUID-VkPipelineRasterizationStateCreateInfo-pointPolygons-04458]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:pointPolygons
-    is ename:VK_FALSE, and pname:rasterizerDiscardEnable is ename:VK_FALSE,
-    pname:polygonMode must: not be ename:VK_POLYGON_MODE_POINT
-endif::VK_KHR_portability_subset[]
-****
-
-include::{generated}/validity/structs/VkPipelineRasterizationStateCreateInfo.txt[]
---
-
-[open,refpage='VkPipelineRasterizationStateCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineRasterizationStateCreateFlags.txt[]
-
-tname:VkPipelineRasterizationStateCreateFlags is a bitmask type for setting
-a mask, but is currently reserved for future use.
---
-
-ifdef::VK_EXT_depth_clip_enable[]
-[open,refpage='VkPipelineRasterizationDepthClipStateCreateInfoEXT',desc='Structure specifying depth clipping state',type='structs']
---
-If the pname:pNext chain of slink:VkPipelineRasterizationStateCreateInfo
-includes a sname:VkPipelineRasterizationDepthClipStateCreateInfoEXT
-structure, then that structure controls whether depth clipping is enabled or
-disabled.
-
-The sname:VkPipelineRasterizationDepthClipStateCreateInfoEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPipelineRasterizationDepthClipStateCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:depthClipEnable controls whether depth clipping is enabled as
-    described in <<vertexpostproc-clipping, Primitive Clipping>>.
-
-include::{generated}/validity/structs/VkPipelineRasterizationDepthClipStateCreateInfoEXT.txt[]
---
-
-[open,refpage='VkPipelineRasterizationDepthClipStateCreateFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineRasterizationDepthClipStateCreateFlagsEXT.txt[]
-
-tname:VkPipelineRasterizationDepthClipStateCreateFlagsEXT is a bitmask type
-for setting a mask, but is currently reserved for future use.
---
-endif::VK_EXT_depth_clip_enable[]
-
-[open,refpage='VkPipelineMultisampleStateCreateInfo',desc='Structure specifying parameters of a newly created pipeline multisample state',type='structs']
---
-The sname:VkPipelineMultisampleStateCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkPipelineMultisampleStateCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:rasterizationSamples is a elink:VkSampleCountFlagBits value
-    specifying the number of samples used in rasterization.
-  * pname:sampleShadingEnable can: be used to enable
-    <<primsrast-sampleshading,Sample Shading>>.
-  * pname:minSampleShading specifies a minimum fraction of sample shading if
-    pname:sampleShadingEnable is set to ename:VK_TRUE.
-  * pname:pSampleMask is a pointer to an array of basetype:VkSampleMask
-    values used in the <<fragops-samplemask,sample mask test>>.
-  * pname:alphaToCoverageEnable controls whether a temporary coverage value
-    is generated based on the alpha component of the fragment's first color
-    output as specified in the <<fragops-covg,Multisample Coverage>>
-    section.
-  * pname:alphaToOneEnable controls whether the alpha component of the
-    fragment's first color output is replaced with one as described in
-    <<fragops-covg,Multisample Coverage>>.
-
-Each bit in the sample mask is associated with a unique
-<<primsrast-multisampling-coverage-mask, sample index>> as defined for the
-<<primsrast-multisampling-coverage-mask, coverage mask>>.
-Each bit [eq]#b# for mask word [eq]#w# in the sample mask corresponds to
-sample index [eq]#i#, where [eq]#i = 32 {times} w {plus} b#.
-pname:pSampleMask has a length equal to [eq]#{lceil}
-pname:rasterizationSamples / 32 {rceil}# words.
-
-If pname:pSampleMask is `NULL`, it is treated as if the mask has all bits
-set to `1`.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineMultisampleStateCreateInfo-sampleShadingEnable-00784]]
-    If the <<features-sampleRateShading,sample rate shading>> feature is not
-    enabled, pname:sampleShadingEnable must: be ename:VK_FALSE
-  * [[VUID-VkPipelineMultisampleStateCreateInfo-alphaToOneEnable-00785]]
-    If the <<features-alphaToOne,alpha to one>> feature is not enabled,
-    pname:alphaToOneEnable must: be ename:VK_FALSE
-  * [[VUID-VkPipelineMultisampleStateCreateInfo-minSampleShading-00786]]
-    pname:minSampleShading must: be in the range [eq]#[0,1]#
-ifdef::VK_NV_framebuffer_mixed_samples[]
-  * [[VUID-VkPipelineMultisampleStateCreateInfo-rasterizationSamples-01415]]
-    If the `apiext:VK_NV_framebuffer_mixed_samples` extension is enabled,
-    and if the subpass has any color attachments and
-    pname:rasterizationSamples is greater than the number of color samples,
-    then pname:sampleShadingEnable must: be ename:VK_FALSE
-endif::VK_NV_framebuffer_mixed_samples[]
-****
-
-include::{generated}/validity/structs/VkPipelineMultisampleStateCreateInfo.txt[]
---
-
-[open,refpage='VkPipelineMultisampleStateCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineMultisampleStateCreateFlags.txt[]
-
-tname:VkPipelineMultisampleStateCreateFlags is a bitmask type for setting a
-mask, but is currently reserved for future use.
---
-
-[open,refpage='VkSampleMask',desc='Mask of sample coverage information',type='basetypes',xrefs='VkPipelineMultisampleStateCreateInfo']
---
-The elements of the sample mask array are of type basetype:VkSampleMask,
-each representing 32 bits of coverage information:
-
-include::{generated}/api/basetypes/VkSampleMask.txt[]
---
-
-Rasterization only generates fragments which cover one or more pixels inside
-the framebuffer.
-Pixels outside the framebuffer are never considered covered in the fragment.
-Fragments which would be produced by application of any of the primitive
-rasterization rules described below but which lie outside the framebuffer
-are not produced, nor are they processed by any later stage of the pipeline,
-including any of the <<fragops, fragment operations>>.
-
-Surviving fragments are processed by fragment shaders.
-Fragment shaders determine associated data for fragments, and can: also
-modify or replace their assigned depth values.
-
-
-[[primsrast-discard]]
-== Discarding Primitives Before Rasterization
-
-Primitives are discarded before rasterization if the
-pname:rasterizerDiscardEnable member of
-slink:VkPipelineRasterizationStateCreateInfo is enabled.
-When enabled, primitives are discarded after they are processed by the last
-active shader stage in the pipeline before rasterization.
-
-ifdef::VK_EXT_extended_dynamic_state2[]
-[open,refpage='vkCmdSetRasterizerDiscardEnableEXT',desc='Control whether primitives are discarded before the rasterization stage dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically enable>> whether primitives are
-discarded before the rasterization stage, call:
-
-include::{generated}/api/protos/vkCmdSetRasterizerDiscardEnableEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:rasterizerDiscardEnable controls whether primitives are discarded
-    immediately before the rasterization stage.
-
-This command sets the discard enable for subsequent drawing commands when
-the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineRasterizationStateCreateInfo::pname:rasterizerDiscardEnable
-value used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetRasterizerDiscardEnableEXT-None-04871]]
-    The <<features-extendedDynamicState2, extendedDynamicState2>> feature
-    must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdSetRasterizerDiscardEnableEXT.txt[]
---
-endif::VK_EXT_extended_dynamic_state2[]
-
-
-ifdef::VK_EXT_transform_feedback[]
-[[primsrast-stream]]
-== Controlling the Vertex Stream Used for Rasterization
-
-By default vertex data output from the last
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> are directed to vertex stream zero.
-Geometry shaders can: emit primitives to multiple independent vertex
-streams.
-Each vertex emitted by the geometry shader is directed at one of the vertex
-streams.
-As vertices are received on each vertex stream, they are arranged into
-primitives of the type specified by the geometry shader output primitive
-type.
-The shading language instructions code:OpEndPrimitive and
-code:OpEndStreamPrimitive can: be used to end the primitive being assembled
-on a given vertex stream and start a new empty primitive of the same type.
-An implementation supports up to
-sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackStreams
-streams, which is at least 1.
-The individual streams are numbered 0 through
-pname:maxTransformFeedbackStreams minus 1.
-There is no requirement on the order of the streams to which vertices are
-emitted, and the number of vertices emitted to each vertex stream can: be
-completely independent, subject only to the
-sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackStreamDataSize
-and
-sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackBufferDataSize
-limits.
-The primitives output from all vertex streams are passed to the transform
-feedback stage to be captured to transform feedback buffers in the manner
-specified by the last
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> shader's code:XfbBuffer, code:XfbStride, and code:Offsets
-decorations on the output interface variables in the graphics pipeline.
-To use a vertex stream other than zero, or to use multiple streams, the
-code:GeometryStreams capability must: be specified.
-
-By default, the primitives output from vertex stream zero are rasterized.
-If the implementation supports the
-slink:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:transformFeedbackRasterizationStreamSelect
-property it is possible to rasterize a vertex stream other than zero.
-
-By default, geometry shaders that emit vertices to multiple vertex streams
-are limited to using only the code:OutputPoints output primitive type.
-If the implementation supports the
-slink:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:transformFeedbackStreamsLinesTriangles
-property it is possible to emit code:OutputLineStrip or
-code:OutputTriangleStrip in addition to code:OutputPoints.
-
-[open,refpage='VkPipelineRasterizationStateStreamCreateInfoEXT',desc='Structure defining the geometry stream used for rasterization',type='structs']
---
-The vertex stream used for rasterization is specified by adding a
-sname:VkPipelineRasterizationStateStreamCreateInfoEXT structure to the
-pname:pNext chain of a slink:VkPipelineRasterizationStateCreateInfo
-structure.
-
-The sname:VkPipelineRasterizationStateStreamCreateInfoEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkPipelineRasterizationStateStreamCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:rasterizationStream is the vertex stream selected for
-    rasterization.
-
-If this structure is not present, pname:rasterizationStream is assumed to be
-zero.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-geometryStreams-02324]]
-    sname:VkPhysicalDeviceTransformFeedbackFeaturesEXT::pname:geometryStreams
-    must: be enabled
-  * [[VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-rasterizationStream-02325]]
-    pname:rasterizationStream must: be less than
-    slink:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackStreams
-  * [[VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-rasterizationStream-02326]]
-    pname:rasterizationStream must: be zero if
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:transformFeedbackRasterizationStreamSelect
-    is ename:VK_FALSE
-****
-
-include::{generated}/validity/structs/VkPipelineRasterizationStateStreamCreateInfoEXT.txt[]
---
-
-[open,refpage='VkPipelineRasterizationStateStreamCreateFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineRasterizationStateStreamCreateFlagsEXT.txt[]
-
-tname:VkPipelineRasterizationStateStreamCreateFlagsEXT is a bitmask type for
-setting a mask, but is currently reserved for future use.
---
-endif::VK_EXT_transform_feedback[]
-
-
-[[primsrast-order]]
-== Rasterization Order
-
-Within a subpass of a <<renderpass,render pass instance>>, for a given
-(x,y,layer,sample) sample location, the following operations are guaranteed
-to execute in _rasterization order_, for each separate primitive that
-includes that sample location:
-
-  . <<fragops, Fragment operations>>, in the order defined
-  . <<framebuffer-blending, Blending>>, <<framebuffer-logicop, logic
-    operations>>, and color writes
-
-Execution of these operations for each primitive in a subpass occurs in
-ifndef::VK_AMD_rasterization_order[]
-<<drawing-primitive-order, primitive order>>.
-endif::VK_AMD_rasterization_order[]
-ifdef::VK_AMD_rasterization_order[]
-an order determined by the application.
-
-[open,refpage='VkPipelineRasterizationStateRasterizationOrderAMD',desc='Structure defining rasterization order for a graphics pipeline',type='structs']
---
-The rasterization order to use for a graphics pipeline is specified by
-adding a sname:VkPipelineRasterizationStateRasterizationOrderAMD structure
-to the pname:pNext chain of a slink:VkPipelineRasterizationStateCreateInfo
-structure.
-
-The sname:VkPipelineRasterizationStateRasterizationOrderAMD structure is
-defined as:
-
-include::{generated}/api/structs/VkPipelineRasterizationStateRasterizationOrderAMD.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:rasterizationOrder is a elink:VkRasterizationOrderAMD value
-    specifying the primitive rasterization order to use.
-
-include::{generated}/validity/structs/VkPipelineRasterizationStateRasterizationOrderAMD.txt[]
-
-If the `apiext:VK_AMD_rasterization_order` device extension is not enabled
-or the application does not request a particular rasterization order through
-specifying a sname:VkPipelineRasterizationStateRasterizationOrderAMD
-structure then the rasterization order used by the graphics pipeline
-defaults to ename:VK_RASTERIZATION_ORDER_STRICT_AMD.
---
-
-[open,refpage='VkRasterizationOrderAMD',desc='Specify rasterization order for a graphics pipeline',type='enums']
---
-Possible values of
-slink:VkPipelineRasterizationStateRasterizationOrderAMD::pname:rasterizationOrder,
-specifying the primitive rasterization order, are:
-
-include::{generated}/api/enums/VkRasterizationOrderAMD.txt[]
-
-  * ename:VK_RASTERIZATION_ORDER_STRICT_AMD specifies that operations for
-    each primitive in a subpass must: occur in <<drawing-primitive-order,
-    primitive order>>.
-  * ename:VK_RASTERIZATION_ORDER_RELAXED_AMD specifies that operations for
-    each primitive in a subpass may: not occur in <<drawing-primitive-order,
-    primitive order>>.
---
-endif::VK_AMD_rasterization_order[]
-
-
-[[primsrast-multisampling]]
-== Multisampling
-
-Multisampling is a mechanism to antialias all Vulkan primitives: points,
-lines, and polygons.
-The technique is to sample all primitives multiple times at each pixel.
-Each sample in each framebuffer attachment has storage for a color, depth,
-and/or stencil value, such that per-fragment operations apply to each sample
-independently.
-The color sample values can: be later _resolved_ to a single color (see
-<<copies-resolve,Resolving Multisample Images>> and the <<renderpass,Render
-Pass>> chapter for more details on how to resolve multisample images to
-non-multisample images).
-
-Vulkan defines rasterization rules for single-sample modes in a way that is
-equivalent to a multisample mode with a single sample in the center of each
-fragment.
-
-Each fragment includes a <<primsrast-multisampling-coverage-mask, coverage
-mask>> with a single bit for each sample in the fragment, and a number of
-depth values and associated data for each sample.
-An implementation may: choose to assign the same associated data to more
-than one sample.
-The location for evaluating such associated data may: be anywhere within the
-fragment area including the fragment's center location [eq]#(x~f~,y~f~)# or
-any of the sample locations.
-When pname:rasterizationSamples is ename:VK_SAMPLE_COUNT_1_BIT, the
-fragment's center location must: be used.
-The different associated data values need not all be evaluated at the same
-location.
-
-It is understood that each pixel has pname:rasterizationSamples locations
-associated with it.
-These locations are exact positions, rather than regions or areas, and each
-is referred to as a sample point.
-The sample points associated with a pixel must: be located inside or on the
-boundary of the unit square that is considered to bound the pixel.
-Furthermore, the relative locations of sample points may: be identical for
-each pixel in the framebuffer, or they may: differ.
-
-ifdef::VK_EXT_fragment_density_map[]
-If the render pass has a fragment density map attachment, each fragment only
-has pname:rasterizationSamples locations associated with it regardless of
-how many pixels are covered in the fragment area.
-Fragment sample locations are defined as if the fragment had an area of
-[eq]#(1,1)# and its sample points must: be located within these bounds.
-Their actual location in the framebuffer is calculated by scaling the sample
-location by the fragment area.
-Attachments with storage for multiple samples per pixel are located at the
-pixel sample locations.
-Otherwise, the fragment's sample locations are generally used for evaluation
-of associated data and fragment operations.
-endif::VK_EXT_fragment_density_map[]
-
-If the current pipeline includes a fragment shader with one or more
-variables in its interface decorated with code:Sample and code:Input, the
-data associated with those variables will be assigned independently for each
-sample.
-The values for each sample must: be evaluated at the location of the sample.
-The data associated with any other variables not decorated with code:Sample
-and code:Input need not be evaluated independently for each sample.
-
-[[primsrast-multisampling-coverage-mask]]
-A _coverage mask_ is generated for each fragment, based on which samples
-within that fragment are determined to be within the area of the primitive
-that generated the fragment.
-
-Single pixel fragments
-ifdef::VK_EXT_fragment_density_map[]
-and multi-pixel fragments defined by a
-<<renderpass-fragmentdensitymapattachment, fragment density map>>
-endif::VK_EXT_fragment_density_map[]
-have one set of samples.
-ifdef::VK_NV_shading_rate_image[]
-Multi-pixel fragments defined by a <<primsrast-shading-rate-image, shading
-rate image>> have one set of samples per pixel.
-endif::VK_NV_shading_rate_image[]
-ifdef::VK_KHR_fragment_shading_rate[]
-Multi-pixel fragments defined by setting the
-<<primsrast-fragment-shading-rate, fragment shading rate>> have one set of
-samples per pixel.
-endif::VK_KHR_fragment_shading_rate[]
-Each set of samples has a number of samples determined by
-slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples.
-Each sample in a set is assigned a unique _sample index_ [eq]#i# in the
-range [eq]#[0, pname:rasterizationSamples)#.
-
-Each sample in a fragment is also assigned a unique _coverage index_ [eq]#j#
-in the range [eq]#[0, n {times} pname:rasterizationSamples)#, where [eq]#n#
-is the number of sets in the fragment.
-If the fragment contains a single set of samples, the _coverage index_ is
-always equal to the _sample index_.
-ifdef::VK_NV_shading_rate_image[]
-If a <<primsrast-shading-rate-image,shading rate image>> is used and a
-fragment covers multiple pixels, the coverage index is determined as defined
-by slink:VkPipelineViewportCoarseSampleOrderStateCreateInfoNV or
-flink:vkCmdSetCoarseSampleOrderNV.
-endif::VK_NV_shading_rate_image[]
-
-ifdef::VK_KHR_fragment_shading_rate[]
-[[primsrast-multisampling-coverage-mask-vrfs]]
-If the <<primsrast-fragment-shading-rate, fragment shading rate>> is set,
-the coverage index [eq]#j# is determined as a function of the _pixel index_
-[eq]#p#, the _sample index_ [eq]#i#, and the number of rasterization samples
-[eq]#r# as:
-
-  {empty}:: [eq]#j = i + r {times} ((f~w~ * f~h~) - 1 - p)#
-
-where the pixel index [eq]#p# is determined as a function of the pixel's
-framebuffer location [eq]#(x,y)# and the fragment size [eq]#(f~w~,f~h~)#:
-
-  {empty}:: [eq]#p~x~ = x % f~w~#
-  {empty}:: [eq]#p~y~ = y % f~h~#
-  {empty}:: [eq]#p = p~x~ + (p~y~ * f~w~)#
-
-The table below illustrates the pixel index for multi-pixel fragments:
-
-.Pixel indices - 1 wide
-[align="center"]
-|====
-| 1x1 | 1x2 | 1x4
-
-.>| image:{images}/pixel_index_1x1.svg[pdfwidth=90pt,opts="{imageopts}"]
-.>| image:{images}/pixel_index_1x2.svg[pdfwidth=90pt,align="center",opts="{imageopts}"]
-.>| image:{images}/pixel_index_1x4.svg[pdfwidth=90pt,align="center",opts="{imageopts}"]
-|====
-
-.Pixel indices - 2 wide
-[align="center"]
-|====
-| 2x1 | 2x2 | 2x4
-
-.>| image:{images}/pixel_index_2x1.svg[pdfwidth=90pt,align="center",opts="{imageopts}"]
-.>| image:{images}/pixel_index_2x2.svg[pdfwidth=90pt,align="center",opts="{imageopts}"]
-.>| image:{images}/pixel_index_2x4.svg[pdfwidth=90pt,align="center",opts="{imageopts}"]
-|====
-
-.Pixel indices - 4 wide
-[align="center"]
-|====
-| 4x1 | 4x2 | 4x4
-
-.>| image:{images}/pixel_index_4x1.svg[pdfwidth=90pt,align="center",opts="{imageopts}"]
-.>| image:{images}/pixel_index_4x2.svg[pdfwidth=90pt,align="center",opts="{imageopts}"]
-.>| image:{images}/pixel_index_4x4.svg[pdfwidth=90pt,align="center",opts="{imageopts}"]
-|====
-endif::VK_KHR_fragment_shading_rate[]
-
-The coverage mask includes [eq]#B# bits packed into [eq]#W# words, defined
-as:
-
-  {empty}:: [eq]#B = n {times} pname:rasterizationSamples#
-  {empty}:: [eq]#W = {lceil}B/32{rceil}#
-
-Bit [eq]#b# in coverage mask word [eq]#w# is `1` if the sample with coverage
-index [eq]#j = 32*w + b# is covered, and `0` otherwise.
-
-If the pname:standardSampleLocations member of slink:VkPhysicalDeviceLimits
-is ename:VK_TRUE, then the sample counts ename:VK_SAMPLE_COUNT_1_BIT,
-ename:VK_SAMPLE_COUNT_2_BIT, ename:VK_SAMPLE_COUNT_4_BIT,
-ename:VK_SAMPLE_COUNT_8_BIT, and ename:VK_SAMPLE_COUNT_16_BIT have sample
-locations as listed in the following table, with the [eq]##i##th entry in
-the table corresponding to sample index [eq]#i#.
-ename:VK_SAMPLE_COUNT_32_BIT and ename:VK_SAMPLE_COUNT_64_BIT do not have
-standard sample locations.
-Locations are defined relative to an origin in the upper left corner of the
-fragment.
-
-<<<
-
-.Standard sample locations
-[options="header",align="center"]
-|====
-| Sample count 2+| Sample Locations
-|ename:VK_SAMPLE_COUNT_1_BIT
-    | [eq]#(0.5,0.5)#
-    | image:{images}/sample_count_1.svg[pdfwidth=90pt,align="center",opts="{imageopts}"]
-|ename:VK_SAMPLE_COUNT_2_BIT
-    | [eq]#(0.75,0.75)# +
-      [eq]#(0.25,0.25)#
-    | image:{images}/sample_count_2.svg[pdfwidth=90pt,align="center",opts="{imageopts}"]
-|ename:VK_SAMPLE_COUNT_4_BIT
-    | [eq]#(0.375, 0.125)# +
-      [eq]#(0.875, 0.375)# +
-      [eq]#(0.125, 0.625)# +
-      [eq]#(0.625, 0.875)#
-    | image:{images}/sample_count_4.svg[pdfwidth=90pt,align="center",opts="{imageopts}"]
-|ename:VK_SAMPLE_COUNT_8_BIT
-    | [eq]#(0.5625, 0.3125)# +
-      [eq]#(0.4375, 0.6875)# +
-      [eq]#(0.8125, 0.5625)# +
-      [eq]#(0.3125, 0.1875)# +
-      [eq]#(0.1875, 0.8125)# +
-      [eq]#(0.0625, 0.4375)# +
-      [eq]#(0.6875, 0.9375)# +
-      [eq]#(0.9375, 0.0625)#
-    | image:{images}/sample_count_8.svg[pdfwidth=90pt,align="center",opts="{imageopts}"]
-|ename:VK_SAMPLE_COUNT_16_BIT
-    | [eq]#(0.5625, 0.5625)# +
-      [eq]#(0.4375, 0.3125)# +
-      [eq]#(0.3125, 0.625)# +
-      [eq]#(0.75,   0.4375)# +
-      [eq]#(0.1875, 0.375)# +
-      [eq]#(0.625,  0.8125)# +
-      [eq]#(0.8125, 0.6875)# +
-      [eq]#(0.6875, 0.1875)# +
-      [eq]#(0.375,  0.875)# +
-      [eq]#(0.5,    0.0625)# +
-      [eq]#(0.25,   0.125)# +
-      [eq]#(0.125,  0.75)# +
-      [eq]#(0.0,    0.5)# +
-      [eq]#(0.9375, 0.25)# +
-      [eq]#(0.875,  0.9375)# +
-      [eq]#(0.0625, 0.0)#
-    | image:{images}/sample_count_16.svg[pdfwidth=90pt,align="center",opts="{imageopts}"]
-|====
-
-ifdef::VK_AMD_shader_fragment_mask[]
-Color images created with multiple samples per pixel use a compression
-technique where there are two arrays of data associated with each pixel.
-The first array contains one element per sample where each element stores an
-index to the second array defining the _fragment mask_ of the pixel.
-The second array contains one element per _color fragment_ and each element
-stores a unique color value in the format of the image.
-With this compression technique it is not always necessary to actually use
-unique storage locations for each color sample: when multiple samples share
-the same color value the fragment mask may: have two samples referring to
-the same color fragment.
-The number of color fragments is determined by the pname:samples member of
-the slink:VkImageCreateInfo structure used to create the image.
-The `apiext:VK_AMD_shader_fragment_mask` device extension provides shader
-instructions enabling the application to get direct access to the fragment
-mask and the individual color fragment values.
-
-[[vk-amd-shader-fragment-mask-diagram]]
-image::{images}/fragment_mask.svg[align="center",title="Fragment Mask",align="center",opts="{imageopts}"]
-
-endif::VK_AMD_shader_fragment_mask[]
-
-
-ifdef::VK_EXT_sample_locations[]
-[[primsrast-samplelocations]]
-== Custom Sample Locations
-
-[open,refpage='VkPipelineSampleLocationsStateCreateInfoEXT',desc='Structure specifying sample locations for a pipeline',type='structs']
---
-Applications can: also control the sample locations used for rasterization.
-
-If the pname:pNext chain of the slink:VkPipelineMultisampleStateCreateInfo
-structure specified at pipeline creation time includes a
-sname:VkPipelineSampleLocationsStateCreateInfoEXT structure, then that
-structure controls the sample locations used when rasterizing primitives
-with the pipeline.
-
-The sname:VkPipelineSampleLocationsStateCreateInfoEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPipelineSampleLocationsStateCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:sampleLocationsEnable controls whether custom sample locations are
-    used.
-    If pname:sampleLocationsEnable is ename:VK_FALSE, the default sample
-    locations are used and the values specified in pname:sampleLocationsInfo
-    are ignored.
-  * pname:sampleLocationsInfo is the sample locations to use during
-    rasterization if pname:sampleLocationsEnable is ename:VK_TRUE and the
-    graphics pipeline is not created with
-    ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT.
-
-include::{generated}/validity/structs/VkPipelineSampleLocationsStateCreateInfoEXT.txt[]
---
-
-[open,refpage='VkSampleLocationsInfoEXT',desc='Structure specifying a set of sample locations',type='structs']
---
-The sname:VkSampleLocationsInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkSampleLocationsInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:sampleLocationsPerPixel is a elink:VkSampleCountFlagBits value
-    specifying the number of sample locations per pixel.
-  * pname:sampleLocationGridSize is the size of the sample location grid to
-    select custom sample locations for.
-  * pname:sampleLocationsCount is the number of sample locations in
-    pname:pSampleLocations.
-  * pname:pSampleLocations is a pointer to an array of
-    pname:sampleLocationsCount slink:VkSampleLocationEXT structures.
-
-This structure can: be used either to specify the sample locations to be
-used for rendering or to specify the set of sample locations an image
-subresource has been last rendered with for the purposes of layout
-transitions of depth/stencil images created with
-ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT.
-
-The sample locations in pname:pSampleLocations specify
-pname:sampleLocationsPerPixel number of sample locations for each pixel in
-the grid of the size specified in pname:sampleLocationGridSize.
-The sample location for sample [eq]#i# at the pixel grid location
-[eq]#(x,y)# is taken from [eq]#pname:pSampleLocations[(x {plus} y {times}
-pname:sampleLocationGridSize.width) {times} pname:sampleLocationsPerPixel
-{plus} i]#.
-
-ifdef::VK_EXT_fragment_density_map[]
-If the render pass has a fragment density map, the implementation will
-choose the sample locations for the fragment and the contents of
-pname:pSampleLocations may: be ignored.
-endif::VK_EXT_fragment_density_map[]
-
-.Valid Usage
-****
-  * [[VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-01526]]
-    pname:sampleLocationsPerPixel must: be a bit value that is set in
-    slink:VkPhysicalDeviceSampleLocationsPropertiesEXT::pname:sampleLocationSampleCounts
-  * [[VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527]]
-    pname:sampleLocationsCount must: equal
-    [eq]#pname:sampleLocationsPerPixel {times}
-    pname:sampleLocationGridSize.width {times}
-    pname:sampleLocationGridSize.height#
-****
-
-include::{generated}/validity/structs/VkSampleLocationsInfoEXT.txt[]
---
-
-[open,refpage='VkSampleLocationEXT',desc='Structure specifying the coordinates of a sample location',type='structs']
---
-The sname:VkSampleLocationEXT structure is defined as:
-
-include::{generated}/api/structs/VkSampleLocationEXT.txt[]
-
-  * pname:x is the horizontal coordinate of the sample's location.
-  * pname:y is the vertical coordinate of the sample's location.
-
-The domain space of the sample location coordinates has an upper-left origin
-within the pixel in framebuffer space.
-
-The values specified in a sname:VkSampleLocationEXT structure are always
-clamped to the implementation-dependent sample location coordinate range
-[eq]#[pname:sampleLocationCoordinateRange[0],pname:sampleLocationCoordinateRange[1]]#
-that can: be queried using
-slink:VkPhysicalDeviceSampleLocationsPropertiesEXT.
-
-include::{generated}/validity/structs/VkSampleLocationEXT.txt[]
---
-
-[open,refpage='vkCmdSetSampleLocationsEXT',desc='Set sample locations dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the sample locations used
-for rasterization, call:
-
-include::{generated}/api/protos/vkCmdSetSampleLocationsEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pSampleLocationsInfo is the sample locations state to set.
-
-This command sets the custom sample locations for subsequent drawing
-commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates, and when the
-slink:VkPipelineSampleLocationsStateCreateInfoEXT::pname:sampleLocationsEnable
-property of the bound graphics pipeline is ename:VK_TRUE.
-Otherwise, this state is specified by the
-slink:VkPipelineSampleLocationsStateCreateInfoEXT::pname:sampleLocationsInfo
-values used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529]]
-    The pname:sampleLocationsPerPixel member of pname:pSampleLocationsInfo
-    must: equal the pname:rasterizationSamples member of the
-    slink:VkPipelineMultisampleStateCreateInfo structure the bound graphics
-    pipeline has been created with
-  * [[VUID-vkCmdSetSampleLocationsEXT-variableSampleLocations-01530]]
-    If
-    slink:VkPhysicalDeviceSampleLocationsPropertiesEXT::pname:variableSampleLocations
-    is ename:VK_FALSE then the current render pass must: have been begun by
-    specifying a slink:VkRenderPassSampleLocationsBeginInfoEXT structure
-    whose pname:pPostSubpassSampleLocations member contains an element with
-    a pname:subpassIndex matching the current subpass index and the
-    pname:sampleLocationsInfo member of that element must: match the sample
-    locations state pointed to by pname:pSampleLocationsInfo
-****
-
-include::{generated}/validity/protos/vkCmdSetSampleLocationsEXT.txt[]
---
-endif::VK_EXT_sample_locations[]
-
-
-ifdef::VK_KHR_fragment_shading_rate[]
-[[primsrast-fragment-shading-rate]]
-== Fragment Shading Rates
-
-The features advertised by
-slink:VkPhysicalDeviceFragmentShadingRateFeaturesKHR allow an application to
-control the <<glossary-shading-rate, shading rate>> of a given fragment
-shader invocation.
-
-The fragment shading rate strongly interacts with <<primsrast-multisampling,
-Multisampling>>, and the set of available rates for an implementation may:
-be restricted by sample rate.
-
-[open,refpage='vkGetPhysicalDeviceFragmentShadingRatesKHR',desc='Get available shading rates for a physical device',type='protos']
---
-To query available shading rates, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceFragmentShadingRatesKHR.txt[]
-
-  * pname:physicalDevice is the handle to the physical device whose
-    properties will be queried.
-  * pname:pFragmentShadingRateCount is a pointer to an integer related to
-    the number of fragment shading rates available or queried, as described
-    below.
-  * pname:pFragmentShadingRates is either `NULL` or a pointer to an array of
-    slink:VkPhysicalDeviceFragmentShadingRateKHR structures.
-
-If pname:pFragmentShadingRates is `NULL`, then the number of fragment
-shading rates available is returned in pname:pFragmentShadingRateCount.
-Otherwise, pname:pFragmentShadingRateCount must: point to a variable set by
-the user to the number of elements in the pname:pFragmentShadingRates array,
-and on return the variable is overwritten with the number of structures
-actually written to pname:pFragmentShadingRates.
-If pname:pFragmentShadingRateCount is less than the number of fragment
-shading rates available, at most pname:pFragmentShadingRateCount structures
-will be written, and ename:VK_INCOMPLETE will be returned instead of
-ename:VK_SUCCESS, to indicate that not all the available fragment shading
-rates were returned.
-
-The returned array of fragment shading rates must: be ordered from largest
-pname:fragmentSize.width value to smallest, and each set of fragment shading
-rates with the same pname:fragmentSize.width value must: be ordered from
-largest pname:fragmentSize.height to smallest.
-Any two entries in the array must: not have the same pname:fragmentSize
-values.
-
-For any entry in the array, the following rules also apply:
-
-  * The value of pname:fragmentSize.width must: be less than or equal to
-    <<limits-maxFragmentSize,pname:maxFragmentSize.width>>.
-  * The value of pname:fragmentSize.width must: be greater than or equal to
-    `1`.
-  * The value of pname:fragmentSize.width must: be a power-of-two.
-  * The value of pname:fragmentSize.height must: be less than or equal to
-    <<limits-maxFragmentSize,pname:maxFragmentSize.height>>.
-  * The value of pname:fragmentSize.height must: be greater than or equal to
-    `1`.
-  * The value of pname:fragmentSize.height must: be a power-of-two.
-  * The highest sample count in pname:sampleCounts must: be less than or
-    equal to <<limits-maxFragmentShadingRateRasterizationSamples,
-    pname:maxFragmentShadingRateRasterizationSamples>>.
-  * The product of pname:fragmentSize.width, pname:fragmentSize.height, and
-    the highest sample count in pname:sampleCounts must: be less than or
-    equal to <<limits-maxFragmentShadingRateCoverageSamples,
-    pname:maxFragmentShadingRateCoverageSamples>>.
-
-Implementations must: support at least the following shading rates:
-
-[options="autowidth"]
-|===
-| pname:sampleCounts | pname:fragmentSize
-
-| ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT | {2,2}
-| ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT | {2,1}
-| ~0                                                         | {1,1}
-|===
-
-If <<limits-framebufferColorSampleCounts,
-pname:framebufferColorSampleCounts>>, includes ename:VK_SAMPLE_COUNT_2_BIT,
-the required rates must: also include ename:VK_SAMPLE_COUNT_2_BIT.
-
-[NOTE]
-.Note
-====
-Including the {1,1} fragment size is done for completeness; it has no actual
-effect on the support of rendering without setting the fragment size.
-All sample counts
-ifdef::VK_QCOM_render_pass_transform[]
-and render pass transforms
-endif::VK_QCOM_render_pass_transform[]
-are supported for this rate.
-====
-
-ifdef::VK_QCOM_render_pass_transform[]
-The returned set of fragment shading rates must: be returned in the native
-(rotated) coordinate system.
-For rasterization using render pass pname:transform not equal to
-ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, the application must: transform
-the returned fragment shading rates into the current (unrotated) coordinate
-system to get the supported rates for that transform.
-
-[NOTE]
-.Note
-====
-For example, consider an implementation returning support for 4x2, but not
-2x4 in the set of supported fragment shading rates.
-This means that for transforms ename:VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR
-and ename:VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR, 2x4 is a supported rate,
-but 4x2 is an unsupported rate.
-====
-endif::VK_QCOM_render_pass_transform[]
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceFragmentShadingRatesKHR.txt[]
---
-
-[open,refpage='VkPhysicalDeviceFragmentShadingRateKHR',desc='Structure returning information about sample count specific additional multisampling capabilities',type='structs']
---
-The sname:VkPhysicalDeviceFragmentShadingRateKHR structure is defined as
-
-include::{generated}/api/structs/VkPhysicalDeviceFragmentShadingRateKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:sampleCounts is a bitmask of sample counts for which the shading
-    rate described by pname:fragmentSize is supported.
-  * pname:fragmentSize is a slink:VkExtent2D describing the width and height
-    of a supported shading rate.
-
-include::{generated}/validity/structs/VkPhysicalDeviceFragmentShadingRateKHR.txt[]
---
-
-Fragment shading rates can: be set at three points, with the three rates
-combined to determine the final shading rate.
-
-
-[[primsrast-fragment-shading-rate-pipeline]]
-=== Pipeline Fragment Shading Rate
-
-The _pipeline fragment shading rate_ can: be set on a per-draw basis by
-either setting the rate in a graphics pipeline, or dynamically via
-flink:vkCmdSetFragmentShadingRateKHR.
-
-[open,refpage='VkPipelineFragmentShadingRateStateCreateInfoKHR',desc='Structure specifying parameters controlling the fragment shading rate',type='structs']
---
-The sname:VkPipelineFragmentShadingRateStateCreateInfoKHR structure is
-defined as:
-
-include::{generated}/api/structs/VkPipelineFragmentShadingRateStateCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:fragmentSize specifies a slink:VkExtent2D structure containing the
-    fragment size used to define the pipeline fragment shading rate for
-    drawing commands using this pipeline.
-  * pname:combinerOps specifies a elink:VkFragmentShadingRateCombinerOpKHR
-    value determining how the
-    <<primsrast-fragment-shading-rate-pipeline,pipeline>>,
-    <<primsrast-fragment-shading-rate-primitive,primitive>>, and
-    <<primsrast-fragment-shading-rate-attachment,attachment shading rates>>
-    are <<primsrast-fragment-shading-rate-combining,combined>> for fragments
-    generated by drawing commands using the created pipeline.
-
-If the pname:pNext chain of slink:VkGraphicsPipelineCreateInfo includes a
-sname:VkPipelineFragmentShadingRateStateCreateInfoKHR structure, then that
-structure includes parameters that control the pipeline fragment shading
-rate.
-
-If this structure is not present, pname:fragmentSize is considered to be
-equal to [eq]#(1,1)#, and both elements of pname:combinerOps are considered
-to be equal to ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR.
-
-include::{generated}/validity/structs/VkPipelineFragmentShadingRateStateCreateInfoKHR.txt[]
---
-
-[open,refpage='vkCmdSetFragmentShadingRateKHR',desc='Set pipeline fragment shading rate and combiner operation dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the pipeline fragment
-shading rate and combiner operation, call:
-
-include::{generated}/api/protos/vkCmdSetFragmentShadingRateKHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pFragmentSize specifies the pipeline fragment shading rate for
-    subsequent drawing commands.
-  * pname:combinerOps specifies a elink:VkFragmentShadingRateCombinerOpKHR
-    determining how the
-    <<primsrast-fragment-shading-rate-pipeline,pipeline>>,
-    <<primsrast-fragment-shading-rate-primitive,primitive>>, and
-    <<primsrast-fragment-shading-rate-attachment,attachment shading rates>>
-    are <<primsrast-fragment-shading-rate-combining,combined>> for fragments
-    generated by subsequent drawing commands.
-
-This command sets the pipeline fragment shading rate and combiner operation
-for subsequent drawing commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineFragmentShadingRateStateCreateInfoKHR values used to create
-the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507]]
-    If <<features-pipelineFragmentShadingRate,
-    pname:pipelineFragmentShadingRate>> is not enabled,
-    pname:pFragmentSize->width must: be `1`
-  * [[VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508]]
-    If <<features-pipelineFragmentShadingRate,
-    pname:pipelineFragmentShadingRate>> is not enabled,
-    pname:pFragmentSize->height must: be `1`
-  * [[VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509]]
-    One of <<features-pipelineFragmentShadingRate,
-    pname:pipelineFragmentShadingRate>>,
-    <<features-primitiveFragmentShadingRate,
-    pname:primitiveFragmentShadingRate>>, or
-    <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate>> must: be enabled
-  * [[VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510]]
-    If the <<features-primitiveFragmentShadingRate,
-    pname:primitiveFragmentShadingRate feature>> is not enabled,
-    pname:combinerOps[0] must: be
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR
-  * [[VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511]]
-    If the <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate feature>> is not enabled,
-    pname:combinerOps[1] must: be
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR
-  * [[VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512]]
-    If the <<limits-fragmentShadingRateNonTrivialCombinerOps,
-    pname:fragmentSizeNonTrivialCombinerOps>> limit is not supported,
-    elements of pname:combinerOps must: be either
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR or
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR
-  * [[VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513]]
-    pname:pFragmentSize->width must: be greater than or equal to `1`
-  * [[VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514]]
-    pname:pFragmentSize->height must: be greater than or equal to `1`
-  * [[VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515]]
-    pname:pFragmentSize->width must: be a power-of-two value
-  * [[VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516]]
-    pname:pFragmentSize->height must: be a power-of-two value
-  * [[VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517]]
-    pname:pFragmentSize->width must: be less than or equal to `4`
-  * [[VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518]]
-    pname:pFragmentSize->height must: be less than or equal to `4`
-****
-
-include::{generated}/validity/protos/vkCmdSetFragmentShadingRateKHR.txt[]
---
-
-
-[[primsrast-fragment-shading-rate-primitive]]
-=== Primitive Fragment Shading Rate
-
-The _primitive fragment shading rate_ can: be set via the
-<<interfaces-builtin-variables-primitiveshadingrate,
-code:PrimitiveShadingRateKHR>> built-in in the last active
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>>.
-The rate associated with a given primitive is sourced from the value written
-to code:PrimitiveShadingRateKHR by that primitive's
-<<vertexpostproc-flatshading,provoking vertex>>.
-
-
-[[primsrast-fragment-shading-rate-attachment]]
-=== Attachment Fragment Shading Rate
-
-The _attachment shading rate_ can: be set by including
-slink:VkFragmentShadingRateAttachmentInfoKHR in a subpass to define a
-_fragment shading rate attachment_.
-Each pixel in the framebuffer is assigned an attachment fragment shading
-rate by the corresponding texel in the fragment shading rate attachment,
-according to:
-
-  {empty}:: [eq]#x' = floor(x / region~x~)#
-  {empty}:: [eq]#y' = floor(y / region~y~)#
-
-where [eq]#x'# and [eq]#y'# are the coordinates of a texel in the fragment
-shading rate attachment, [eq]#x# and [eq]#y# are the coordinates of the
-pixel in the framebuffer, and [eq]#region~x~# and [eq]#region~y~# are the
-size of the region each texel corresponds to, as defined by the
-pname:shadingRateAttachmentTexelSize member of
-slink:VkFragmentShadingRateAttachmentInfoKHR.
-
-If <<VkRenderPassMultiviewCreateInfo, multiview is enabled>> and the shading
-rate attachment has multiple layers, the shading rate attachment texel is
-selected from the layer determined by the
-<<interfaces-builtin-variables-viewindex,code:ViewIndex>> built-in.
-If <<VkRenderPassMultiviewCreateInfo, multiview is disabled>>, and both the
-shading rate attachment and the framebuffer have multiple layers, the
-shading rate attachment texel is selected from the layer determined by the
-<<interfaces-builtin-variables-layer,code:Layer>> built-in.
-Otherwise, the texel is unconditionally selected from the first layer of the
-attachment.
-
-The fragment size is encoded into the first component of the identified
-texel as follows:
-
-  {empty}:: [eq]#size~w~ = 2^((texel/4)&3)^#
-  {empty}:: [eq]#size~h~ = 2^(texel&3)^#
-
-where [eq]#texel# is the value in the first component of the identified
-texel, and [eq]#size~w~# and [eq]#size~h~# are the width and height of the
-fragment size, decoded from the texel.
-
-If no fragment shading rate attachment is specified, this size is calculated
-as [eq]#size~w~ = size~h~ = 1#.
-Applications must: not specify a width or height greater than 4 by this
-method.
-
-The _Fragment Shading Rate_ enumeration in SPIR-V adheres to the above
-encoding.
-
-
-[[primsrast-fragment-shading-rate-combining]]
-=== Combining the Fragment Shading Rates
-
-The final rate ([eq]#C~xy~'#) used for fragment shading must: be one of the
-rates returned by flink:vkGetPhysicalDeviceFragmentShadingRatesKHR for the
-sample count
-ifdef::VK_QCOM_render_pass_transform[]
-and render pass transform
-endif::VK_QCOM_render_pass_transform[]
-used by rasterization.
-
-If any of the following conditions are met, [eq]#C~xy~'# must: be set to
-[eq]#{1,1}#:
-
-  * If <<primsrast-sampleshading,Sample Shading>> is enabled.
-  * The <<limits-fragmentShadingRateWithSampleMask,
-    pname:fragmentShadingRateWithSampleMask>> limit is not supported, and
-    slink:VkPipelineMultisampleStateCreateInfo::pname:pSampleMask contains a
-    zero value in any bit used by fragment operations.
-  * The <<limits-fragmentShadingRateWithShaderSampleMask,
-    pname:fragmentShadingRateWithShaderSampleMask>> is not supported, and
-    the fragment shader has code:SampleMask in the input or output
-    interface.
-  * The <<limits-fragmentShadingRateWithShaderDepthStencilWrites,
-    pname:fragmentShadingRateWithShaderDepthStencilWrites>> limit is not
-    supported, and the fragment shader declares the code:FragDepth
-ifdef::VK_EXT_shader_stencil_export[]
-    or code:FragStencilRefEXT
-endif::VK_EXT_shader_stencil_export[]
-    built-in.
-ifdef::VK_EXT_conservative_rasterization[]
-  * The <<limits-fragmentShadingRateWithConservativeRasterization,
-    pname:fragmentShadingRateWithConservativeRasterization>> limit is not
-    supported, and
-    slink:VkPipelineRasterizationConservativeStateCreateInfoEXT::pname:conservativeRasterizationMode
-    is not ename:VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT.
-endif::VK_EXT_conservative_rasterization[]
-ifdef::VK_EXT_fragment_shader_interlock[]
-  * The <<limits-fragmentShadingRateWithFragmentShaderInterlock,
-    pname:fragmentShadingRateWithFragmentShaderInterlock>> limit is not
-    supported, and the fragment shader declares any of the
-    <<fragops-shader-interlock, fragment shader interlock>> execution modes.
-endif::VK_EXT_fragment_shader_interlock[]
-ifdef::VK_EXT_sample_locations[]
-  * The <<limits-fragmentShadingRateWithCustomSampleLocations,
-    pname:fragmentShadingRateWithCustomSampleLocations>> limit is not
-    supported, and
-    slink:VkPipelineSampleLocationsStateCreateInfoEXT::pname:sampleLocationsEnable
-    is ename:VK_TRUE.
-endif::VK_EXT_sample_locations[]
-
-Otherwise, each of the specified shading rates are combined and then used to
-derive the value of [eq]#C~xy~'#.
-As there are three ways to specify shading rates, two combiner operations
-are specified - between the
-<<primsrast-fragment-shading-rate-pipeline,pipeline>> and
-<<primsrast-fragment-shading-rate-primitive,primitive>> shading rates, and
-between the result of that and the
-<<primsrast-fragment-shading-rate-attachment,attachment shading rate>>.
-
-[open,refpage='VkFragmentShadingRateCombinerOpKHR',desc='Control how fragment shading rates are combined',type='enums']
---
-The equation used for each combiner operation is defined by
-ename:VkFragmentShadingRateCombinerOpKHR:
-
-include::{generated}/api/enums/VkFragmentShadingRateCombinerOpKHR.txt[]
-
-  * ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR specifies a combiner
-    operation of [eq]#combine(A~xy~,B~xy~) = A~xy~#.
-  * ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR specifies a
-    combiner operation of [eq]#combine(A~xy~,B~xy~) = B~xy~#.
-  * ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MIN_KHR specifies a combiner
-    operation of [eq]#combine(A~xy~,B~xy~) = min(A~xy~,B~xy~)#.
-  * ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MAX_KHR specifies a combiner
-    operation of [eq]#combine(A~xy~,B~xy~) = max(A~xy~,B~xy~)#.
-  * ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR specifies a combiner
-    operation of [eq]#combine(A~xy~,B~xy~) = A~xy~*B~xy~#.
-
-where [eq]#combine(A~xy~,B~xy~)# is the combine operation, and [eq]#A~xy~#
-and [eq]#B~xy~# are the inputs to the operation.
-
-If <<limits-fragmentShadingRateStrictMultiplyCombiner,
-pname:fragmentShadingRateStrictMultiplyCombiner>> is ename:VK_FALSE, using
-ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR with values of 1 for both
-A and B in the same dimension results in the value 2 being produced for that
-dimension.
-See the definition of <<limits-fragmentShadingRateStrictMultiplyCombiner,
-pname:fragmentShadingRateStrictMultiplyCombiner>> for more information.
-
-These operations are performed in a component-wise fashion.
---
-
-This is used to generate a combined fragment area using the equation:
-
-  {empty}:: [eq]#C~xy~ = combine(A~xy~,B~xy~)#
-
-where [eq]#C~xy~# is the combined fragment area result, and [eq]#A~xy~# and
-[eq]#B~xy~# are the fragment areas of the fragment shading rates being
-combined.
-
-Two combine operations are performed, first with [eq]#A~xy~# equal to the
-<<primsrast-fragment-shading-rate-pipeline,pipeline fragment shading rate>>
-and [eq]#B~xy~# equal to the <<primsrast-fragment-shading-rate-primitive,
-primitive fragment shading rate>>, with the [eq]#combine()# operation
-selected by combinerOps[0].
-A second combination is then performed, with [eq]#A~xy~# equal to the result
-of the first combination and [eq]#B~xy~# equal to the
-<<primsrast-fragment-shading-rate-attachment, attachment fragment shading
-rate>>, with the [eq]#combine()# operation selected by combinerOps[1].
-The result of the second combination is used as the final fragment shading
-rate, reported via the <<interfaces-builtin-variables-primitiveshadingrate,
-code:ShadingRateKHR built-in>>.
-
-Implementations may: clamp the [eq]#C~xy~# result of each combiner operation
-separately, or only after the second combiner operation.
-
-If the final combined rate is one of the rates returned by
-flink:vkGetPhysicalDeviceFragmentShadingRatesKHR for the sample count
-ifdef::VK_QCOM_render_pass_transform[]
-and render pass transform
-endif::VK_QCOM_render_pass_transform[]
-used by rasterization, [eq]#C~xy~' = C~xy~#.
-Otherwise, [eq]#C~xy~'# is selected from the rates returned by
-flink:vkGetPhysicalDeviceFragmentShadingRatesKHR for the sample count
-ifdef::VK_QCOM_render_pass_transform[]
-and render pass transform
-endif::VK_QCOM_render_pass_transform[]
-used by rasterization.
-From this list of supported rates, the following steps are applied in order,
-to select a single value:
-
-  . Keep only rates where [eq]#C~x~' {leq} C~x~# and [eq]#C~y~' {leq} C~y~#.
-  ** Implementations may: also keep rates where [eq]#C~x~' {leq} C~y~# and
-     [eq]#C~y~' {leq} C~x~#.
-  . Keep only rates with the highest area ([eq]#C~x~' {times} C~y~'#).
-  . Keep only rates with the lowest aspect ratio ([eq]#C~x~' {plus} C~y~'#).
-  . In cases where a wide (e.g. 4x1) and tall (e.g. 1x4) rate remain, the
-    implementation may: choose either rate.
-    However, it must: choose this rate consistently for the same shading
-    rates,
-ifdef::VK_QCOM_render_pass_transform[]
-    render pass transform,
-endif::VK_QCOM_render_pass_transform[]
-    and combiner operations for the lifetime of the slink:VkDevice.
-endif::VK_KHR_fragment_shading_rate[]
-
-
-ifdef::VK_NV_fragment_shading_rate_enums[]
-=== Extended Fragment Shading Rates
-
-The features advertised by
-slink:VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV provide support for
-additional fragment shading rates beyond those specifying one fragment
-shader invocation covering all pixels in a fragment whose size is indicated
-by the fragment shading rate.
-
-[open,refpage='VkFragmentShadingRateNV',desc='Enumeration with fragment shading rates',type='enums']
---
-If the pname:fragmentShadingRateEnums feature is enabled, fragment shading
-rates may be specified using the elink:VkFragmentShadingRateNV enumerated
-type defined as:
-
-include::{generated}/api/enums/VkFragmentShadingRateNV.txt[]
-
-  * ename:VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV specifies a
-    fragment size of 1x1 pixels.
-  * ename:VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV specifies
-    a fragment size of 1x2 pixels.
-  * ename:VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV specifies
-    a fragment size of 2x1 pixels.
-  * ename:VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV specifies
-    a fragment size of 2x2 pixels.
-  * ename:VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV specifies
-    a fragment size of 2x4 pixels.
-  * ename:VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV specifies
-    a fragment size of 4x2 pixels.
-  * ename:VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV specifies
-    a fragment size of 4x4 pixels.
-  * ename:VK_FRAGMENT_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV specifies a
-    fragment size of 1x1 pixels, with two fragment shader invocations per
-    fragment.
-  * ename:VK_FRAGMENT_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV specifies a
-    fragment size of 1x1 pixels, with four fragment shader invocations per
-    fragment.
-  * ename:VK_FRAGMENT_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV specifies a
-    fragment size of 1x1 pixels, with eight fragment shader invocations per
-    fragment.
-  * ename:VK_FRAGMENT_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV specifies a
-    fragment size of 1x1 pixels, with sixteen fragment shader invocations
-    per fragment.
-  * ename:VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV specifies that any
-    portions of a primitive that use that shading rate should be discarded
-    without invoking any fragment shader.
-
-To use the shading rates
-ename:VK_FRAGMENT_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV,
-ename:VK_FRAGMENT_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV,
-ename:VK_FRAGMENT_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV, and
-ename:VK_FRAGMENT_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV as a pipeline,
-primitive, or attachment shading rate, the
-pname:supersampleFragmentShadingRates feature must: be enabled.
-To use the shading rate ename:VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV as
-a pipeline, primitive, or attachment shading rate, the
-pname:noInvocationFragmentShadingRates feature must: be enabled.
---
-
-When using fragment shading rate enums, the pipeline fragment shading rate
-can: be set on a per-draw basis by either setting the rate in a graphics
-pipeline, or dynamically via flink:vkCmdSetFragmentShadingRateEnumNV.
-
-[open,refpage='VkPipelineFragmentShadingRateEnumStateCreateInfoNV',desc='Structure specifying parameters controlling the fragment shading rate using rate enums',type='structs']
---
-The sname:VkPipelineFragmentShadingRateEnumStateCreateInfoNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPipelineFragmentShadingRateEnumStateCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:shadingRateType specifies a elink:VkFragmentShadingRateTypeNV
-    value indicating whether fragment shading rates are specified using
-    fragment sizes or elink:VkFragmentShadingRateNV enums.
-  * pname:shadingRate specifies a elink:VkFragmentShadingRateNV value
-    indicating the pipeline fragment shading rate.
-  * pname:combinerOps specifies elink:VkFragmentShadingRateCombinerOpKHR
-    values determining how the
-    <<primsrast-fragment-shading-rate-pipeline,pipeline>>,
-    <<primsrast-fragment-shading-rate-primitive,primitive>>, and
-    <<primsrast-fragment-shading-rate-attachment,attachment shading rates>>
-    are <<primsrast-fragment-shading-rate-combining,combined>> for fragments
-    generated by drawing commands using the created pipeline.
-
-If the pname:pNext chain of slink:VkGraphicsPipelineCreateInfo includes a
-sname:VkPipelineFragmentShadingRateEnumStateCreateInfoNV structure, then
-that structure includes parameters that control the pipeline fragment
-shading rate.
-
-If this structure is not present, pname:shadingRateType is considered to be
-equal to ename:VK_FRAGMENT_SHADING_RATE_TYPE_FRAGMENT_SIZE_NV,
-pname:shadingRate is considered to be equal to
-ename:VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV, and both elements
-of pname:combinerOps are considered to be equal to
-ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR.
-
-include::{generated}/validity/structs/VkPipelineFragmentShadingRateEnumStateCreateInfoNV.txt[]
---
-
-[open,refpage='VkFragmentShadingRateTypeNV',desc='Enumeration with fragment shading rate types',type='enums']
---
-The elink:VkFragmentShadingRateTypeNV enumerated type specifies whether a
-graphics pipeline gets its pipeline fragment shading rates and combiners
-from the slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV structure
-or the slink:VkPipelineFragmentShadingRateStateCreateInfoKHR structure.
-
-include::{generated}/api/enums/VkFragmentShadingRateTypeNV.txt[]
-
-  * ename:VK_FRAGMENT_SHADING_RATE_TYPE_FRAGMENT_SIZE_NV specifies that a
-    graphics pipeline should obtain its pipeline fragment shading rate and
-    shading rate combiner state from the
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR structure and that
-    any state specified by the
-    slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV structure
-    should be ignored.
-  * ename:VK_FRAGMENT_SHADING_RATE_TYPE_ENUMS_NV specifies that a graphics
-    pipeline should obtain its pipeline fragment shading rate and shading
-    rate combiner state from the
-    slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV structure and
-    that any state specified by the
-    slink:VkPipelineFragmentShadingRateStateCreateInfoKHR structure should
-    be ignored.
---
-
-[open,refpage='vkCmdSetFragmentShadingRateEnumNV',desc='Set pipeline fragment shading rate dynamically for a command buffer using enums',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the pipeline fragment
-shading rate and combiner operation, call:
-
-include::{generated}/api/protos/vkCmdSetFragmentShadingRateEnumNV.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:shadingRate specifies a elink:VkFragmentShadingRateNV enum
-    indicating the pipeline fragment shading rate for subsequent drawing
-    commands.
-  * pname:combinerOps specifies a elink:VkFragmentShadingRateCombinerOpKHR
-    determining how the
-    <<primsrast-fragment-shading-rate-pipeline,pipeline>>,
-    <<primsrast-fragment-shading-rate-primitive,primitive>>, and
-    <<primsrast-fragment-shading-rate-attachment,attachment shading rates>>
-    are <<primsrast-fragment-shading-rate-combining,combined>> for fragments
-    generated by subsequent drawing commands.
-
-This command sets the pipeline fragment shading rate and combiner operation
-for subsequent drawing commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineFragmentShadingRateEnumStateCreateInfoNV values used to
-create the currently active pipeline.
-
-[NOTE]
-.Note
-====
-This command allows specifying additional shading rates beyond those
-supported by flink:vkCmdSetFragmentShadingRateKHR.
-For more information, refer to the
-`apiext:VK_NV_fragment_shading_rate_enums` appendix.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetFragmentShadingRateEnumNV-pipelineFragmentShadingRate-04576]]
-    If <<features-pipelineFragmentShadingRate,
-    pname:pipelineFragmentShadingRate>> is not enabled, pname:shadingRate
-    must: be ename:VK_FRAGMENT_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV
-  * [[VUID-vkCmdSetFragmentShadingRateEnumNV-supersampleFragmentShadingRates-04577]]
-    If <<features-supersampleFragmentShadingRates,
-    pname:supersampleFragmentShadingRates>> is not enabled,
-    pname:shadingRate must: not be
-    ename:VK_FRAGMENT_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV,
-    ename:VK_FRAGMENT_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV,
-    ename:VK_FRAGMENT_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV, or
-    ename:VK_FRAGMENT_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV
-  * [[VUID-vkCmdSetFragmentShadingRateEnumNV-noInvocationFragmentShadingRates-04578]]
-    If <<features-noInvocationFragmentShadingRates,
-    pname:noInvocationFragmentShadingRates>> is not enabled,
-    pname:shadingRate must: not be
-    ename:VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV
-  * [[VUID-vkCmdSetFragmentShadingRateEnumNV-fragmentShadingRateEnums-04579]]
-    <<features-fragmentShadingRateEnums,pname:fragmentShadingRateEnums>>
-    must: be enabled
-  * [[VUID-vkCmdSetFragmentShadingRateEnumNV-pipelineFragmentShadingRate-04580]]
-    One of <<features-pipelineFragmentShadingRate,
-    pname:pipelineFragmentShadingRate>>,
-    <<features-primitiveFragmentShadingRate,
-    pname:primitiveFragmentShadingRate>>, or
-    <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate>> must: be enabled
-  * [[VUID-vkCmdSetFragmentShadingRateEnumNV-primitiveFragmentShadingRate-04581]]
-    If the <<features-primitiveFragmentShadingRate,
-    pname:primitiveFragmentShadingRate feature>> is not enabled,
-    pname:combinerOps[0] must: be
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR
-  * [[VUID-vkCmdSetFragmentShadingRateEnumNV-attachmentFragmentShadingRate-04582]]
-    If the <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate feature>> is not enabled,
-    pname:combinerOps[1] must: be
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR
-  * [[VUID-vkCmdSetFragmentShadingRateEnumNV-fragmentSizeNonTrivialCombinerOps-04583]]
-    If the <<limits-fragmentShadingRateNonTrivialCombinerOps,
-    pname:fragmentSizeNonTrivialCombinerOps>> limit is not supported,
-    elements of pname:combinerOps must: be either
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR or
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR
-****
-
-include::{generated}/validity/protos/vkCmdSetFragmentShadingRateEnumNV.txt[]
---
-
-When the <<features-supersampleFragmentShadingRates,
-pname:supersampleFragmentShadingRates>> or
-<<features-noInvocationFragmentShadingRates,
-pname:noInvocationFragmentShadingRates>> features are enabled, the behavior
-of the <<primsrast-fragment-shading-rate-combining,shading rate combiner
-operations>> is extended to support the shading rates enabled by those
-features.
-Primitive and attachment shading rate values are interpreted as
-elink:VkFragmentShadingRateNV values and the behavior of the combiners is
-modified as follows:
-
-  * For ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MIN_KHR,
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MAX_KHR, and
-    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR, if either
-    [eq]#A~xy~# or [eq]#B~xy~# is
-    ename:VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV,
-    [eq]#combine(A~xy~,B~xy~)# produces a shading rate of
-    ename:VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV, regardless of the
-    other input shading rate.
-  * For ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MIN_KHR,
-    [eq]#combine(A~xy~,B~xy~)# produces a shading rate whose fragment size
-    is the smaller of the fragment sizes of [eq]#A~xy~# and [eq]#B~xy~# and
-    whose invocation count is the larger of the invocation counts of
-    [eq]#A~xy~# and [eq]#B~xy~#.
-  * For ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MAX_KHR,
-    [eq]#combine(A~xy~,B~xy~)# produces a shading rate whose fragment size
-    is the larger of the fragment sizes of [eq]#A~xy~# and [eq]#B~xy~# and
-    whose invocation count is the smaller of the invocation counts of
-    [eq]#A~xy~# and [eq]#B~xy~#.
-  * For ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR,
-    [eq]#combine(A~xy~,B~xy~)# produces a shading rate whose fragment size
-    and invocation count is the product of the fragment sizes and invocation
-    counts, respectively, of [eq]#A~xy~# and [eq]#B~xy~#.
-    If the resulting shading rate has both multiple pixels and multiple
-    invocations per fragment, an implementation may: adjust the shading rate
-    by reducing both the pixel and invocation counts.
-
-If the final shading rate from the combiners is
-ename:VK_FRAGMENT_SHADING_RATE_NO_INVOCATIONS_NV, no fragments will be
-generated for any portion of a primitive using that shading rate.
-
-If the final shading rate from the combiners specifies multiple fragment
-shader invocations per fragment, the fragment will be processed with
-multiple unique samples as in <<primsrast-sampleshading, sample shading>>,
-where the total number the total number of invocations is taken from the
-shading rate and then clamped to the value of code:totalSamples used by
-sample shading and to the value of
-<<limits-maxFragmentShadingRateInvocationCount,
-pname:maxFragmentShadingRateInvocationCount>>.
-
-endif::VK_NV_fragment_shading_rate_enums[]
-
-
-ifdef::VK_NV_shading_rate_image[]
-[[primsrast-shading-rate-image]]
-== Shading Rate Image
-
-The <<features-shadingRateImage, shading rate image>> feature allows
-pipelines to use a <<glossary-shading-rate-image,shading rate image>> to
-control the <<glossary-fragment-area, fragment area>> and the minimum number
-of fragment shader invocations launched for each fragment.
-When the shading rate image is enabled, the rasterizer determines a base
-<<glossary-shading-rate,shading rate>> for each region of the framebuffer
-covered by a primitive by fetching a value from the shading rate image and
-translating it to a shading rate using a per-viewport shading rate palette.
-This base shading rate is then adjusted to derive a final shading rate.
-The final shading rate specifies the fragment area and fragment shader
-invocation count to use for fragments generated in the region.
-
-[open,refpage='VkPipelineViewportShadingRateImageStateCreateInfoNV',desc='Structure specifying parameters controlling shading rate image usage',type='structs']
---
-If the pname:pNext chain of slink:VkPipelineViewportStateCreateInfo includes
-a sname:VkPipelineViewportShadingRateImageStateCreateInfoNV structure, then
-that structure includes parameters that control the shading rate.
-
-The sname:VkPipelineViewportShadingRateImageStateCreateInfoNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPipelineViewportShadingRateImageStateCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:shadingRateImageEnable specifies whether shading rate image and
-    palettes are used during rasterization.
-  * pname:viewportCount specifies the number of per-viewport palettes used
-    to translate values stored in shading rate images.
-  * pname:pShadingRatePalettes is a pointer to an array of
-    slink:VkShadingRatePaletteNV structures defining the palette for each
-    viewport.
-    If the shading rate palette state is dynamic, this member is ignored.
-
-If this structure is not present, pname:shadingRateImageEnable is considered
-to be ename:VK_FALSE, and the shading rate image and palettes are not used.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-viewportCount-02054]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:viewportCount must: be `0` or `1`
-  * [[VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-viewportCount-02055]]
-    pname:viewportCount must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxViewports
-  * [[VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-shadingRateImageEnable-02056]]
-    If pname:shadingRateImageEnable is ename:VK_TRUE, pname:viewportCount
-    must: be greater or equal to the pname:viewportCount member of
-    slink:VkPipelineViewportStateCreateInfo
-****
-include::{generated}/validity/structs/VkPipelineViewportShadingRateImageStateCreateInfoNV.txt[]
---
-
-[open,refpage='vkCmdBindShadingRateImageNV',desc='Bind a shading rate image on a command buffer',type='protos']
---
-When shading rate image usage is enabled in the bound pipeline, the pipeline
-uses a shading rate image specified by the command:
-
-include::{generated}/api/protos/vkCmdBindShadingRateImageNV.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:imageView is an image view handle specifying the shading rate
-    image.
-    pname:imageView may: be set to dlink:VK_NULL_HANDLE, which is equivalent
-    to specifying a view of an image filled with zero values.
-  * pname:imageLayout is the layout that the image subresources accessible
-    from pname:imageView will be in when the shading rate image is accessed.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBindShadingRateImageNV-None-02058]]
-    The <<features-shadingRateImage,shading rate image>> feature must: be
-    enabled
-  * [[VUID-vkCmdBindShadingRateImageNV-imageView-02059]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, it must: be a valid
-    slink:VkImageView handle of type ename:VK_IMAGE_VIEW_TYPE_2D or
-    ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY
-  * [[VUID-vkCmdBindShadingRateImageNV-imageView-02060]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, it must: have a format
-    of ename:VK_FORMAT_R8_UINT
-  * [[VUID-vkCmdBindShadingRateImageNV-imageView-02061]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, it must: have been
-    created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV
-  * [[VUID-vkCmdBindShadingRateImageNV-imageView-02062]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, pname:imageLayout must:
-    match the actual elink:VkImageLayout of each subresource accessible from
-    pname:imageView at the time the subresource is accessed
-  * [[VUID-vkCmdBindShadingRateImageNV-imageLayout-02063]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, pname:imageLayout must:
-    be ename:VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV or
-    ename:VK_IMAGE_LAYOUT_GENERAL
-****
-
-include::{generated}/validity/protos/vkCmdBindShadingRateImageNV.txt[]
---
-
-When the shading rate image is enabled in the current pipeline, rasterizing
-a primitive covering the pixel with coordinates (_x_,_y_) will fetch a
-shading rate index value from the shading rate image bound by
-fname:vkCmdBindShadingRateImageNV.
-If the shading rate image view has a type of ename:VK_IMAGE_VIEW_TYPE_2D,
-the lookup will use texel coordinates (_u_,_v_) where latexmath:[u =
-\left\lfloor \frac{x}{twidth} \right\rfloor], latexmath:[v = \left\lfloor
-\frac{y}{theight} \right\rfloor], and latexmath:[twidth] and
-latexmath:[theight] are the width and height of the implementation-dependent
-<<limits-shading-rate-texel-size, shading rate texel size>>.
-If the shading rate image view has a type of
-ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY, the lookup will use texel coordinates
-(_u_,_v_) to extract a texel from the layer _l_, where _l_ is the layer of
-the framebuffer being rendered to.
-If _l_ is greater than or equal to the number of layers in the image view,
-layer zero will be used.
-
-If the bound shading rate image view is not dlink:VK_NULL_HANDLE and
-contains a texel with coordinates (_u_,_v_) in layer _l_ (if applicable),
-the single unsigned integer component for that texel will be used as the
-shading rate index.
-If the (_u_,_v_) coordinate is outside the extents of the subresource used
-by the shading rate image view, or if the image view is
-dlink:VK_NULL_HANDLE, the shading rate index is zero.
-If the shading rate image view has multiple mipmap levels, the base level
-identified by sname:VkImageSubresourceRange::pname:baseMipLevel will be
-used.
-
-A shading rate index is mapped to a base shading rate using a lookup table
-called the shading rate image palette.
-There is a separate palette for each viewport.
-The number of entries in each palette is given by the
-implementation-dependent <<limits-shading-rate-palette-size, shading rate
-image palette size>>.
-
-[open,refpage='vkCmdSetViewportShadingRatePaletteNV',desc='Set shading rate image palettes dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the per-viewport shading
-rate image palettes, call:
-
-include::{generated}/api/protos/vkCmdSetViewportShadingRatePaletteNV.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:firstViewport is the index of the first viewport whose shading
-    rate palette is updated by the command.
-  * pname:viewportCount is the number of viewports whose shading rate
-    palettes are updated by the command.
-  * pname:pShadingRatePalettes is a pointer to an array of
-    slink:VkShadingRatePaletteNV structures defining the palette for each
-    viewport.
-
-This command sets the per-viewport shading rate image palettes for
-subsequent drawing commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineViewportShadingRateImageStateCreateInfoNV::pname:pShadingRatePalettes
-values used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetViewportShadingRatePaletteNV-None-02064]]
-    The <<features-shadingRateImage,shading rate image>> feature must: be
-    enabled
-  * [[VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02067]]
-    The sum of pname:firstViewport and pname:viewportCount must: be between
-    `1` and sname:VkPhysicalDeviceLimits::pname:maxViewports, inclusive
-  * [[VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02068]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:firstViewport must: be `0`
-  * [[VUID-vkCmdSetViewportShadingRatePaletteNV-viewportCount-02069]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:viewportCount must: be `1`
-****
-
-include::{generated}/validity/protos/vkCmdSetViewportShadingRatePaletteNV.txt[]
---
-
-[open,refpage='VkShadingRatePaletteNV',desc='Structure specifying a single shading rate palette',type='structs']
---
-The sname:VkShadingRatePaletteNV structure specifies to contents of a single
-shading rate image palette and is defined as:
-
-include::{generated}/api/structs/VkShadingRatePaletteNV.txt[]
-
-  * pname:shadingRatePaletteEntryCount specifies the number of entries in
-    the shading rate image palette.
-  * pname:pShadingRatePaletteEntries is a pointer to an array of
-    elink:VkShadingRatePaletteEntryNV enums defining the shading rate for
-    each palette entry.
-
-.Valid Usage
-****
-  * [[VUID-VkShadingRatePaletteNV-shadingRatePaletteEntryCount-02071]]
-    pname:shadingRatePaletteEntryCount must: be between `1` and
-    sname:VkPhysicalDeviceShadingRateImagePropertiesNV::pname:shadingRatePaletteSize,
-    inclusive
-
-****
-include::{generated}/validity/structs/VkShadingRatePaletteNV.txt[]
---
-
-To determine the base shading rate image, a shading rate index _i_ is mapped
-to array element _i_ in the array pname:pShadingRatePaletteEntries for the
-palette corresponding to the viewport used for the fragment.
-If _i_ is greater than or equal to the palette size
-pname:shadingRatePaletteEntryCount, the base shading rate is undefined:.
-
-[open,refpage='VkShadingRatePaletteEntryNV',desc='Shading rate image palette entry types',type='enums']
---
-The supported shading rate image palette entries are defined by
-elink:VkShadingRatePaletteEntryNV:
-
-include::{generated}/api/enums/VkShadingRatePaletteEntryNV.txt[]
-
-The following table indicates the width and height (in pixels) of each
-fragment generated using the indicated shading rate, as well as the maximum
-number of fragment shader invocations launched for each fragment.
-When processing regions of a primitive that have a shading rate of
-ename:VK_SHADING_RATE_PALETTE_ENTRY_NO_INVOCATIONS_NV, no fragments will be
-generated in that region.
-
-[options="header"]
-|========
-| Shading Rate | Width | Height | Invocations
-| ename:VK_SHADING_RATE_PALETTE_ENTRY_NO_INVOCATIONS_NV                 | 0 | 0 | 0
-| ename:VK_SHADING_RATE_PALETTE_ENTRY_16_INVOCATIONS_PER_PIXEL_NV       | 1 | 1 | 16
-| ename:VK_SHADING_RATE_PALETTE_ENTRY_8_INVOCATIONS_PER_PIXEL_NV        | 1 | 1 | 8
-| ename:VK_SHADING_RATE_PALETTE_ENTRY_4_INVOCATIONS_PER_PIXEL_NV        | 1 | 1 | 4
-| ename:VK_SHADING_RATE_PALETTE_ENTRY_2_INVOCATIONS_PER_PIXEL_NV        | 1 | 1 | 2
-| ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_PIXEL_NV         | 1 | 1 | 1
-| ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X1_PIXELS_NV    | 2 | 1 | 1
-| ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_1X2_PIXELS_NV    | 1 | 2 | 1
-| ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X2_PIXELS_NV    | 2 | 2 | 1
-| ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X2_PIXELS_NV    | 4 | 2 | 1
-| ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_2X4_PIXELS_NV    | 2 | 4 | 1
-| ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_4X4_PIXELS_NV    | 4 | 4 | 1
-|========
---
-
-When the shading rate image is disabled, a shading rate of
-ename:VK_SHADING_RATE_PALETTE_ENTRY_1_INVOCATION_PER_PIXEL_NV will be used
-as the base shading rate.
-
-Once a base shading rate has been established, it is adjusted to produce a
-final shading rate.
-First, if the base shading rate uses multiple pixels for each fragment, the
-implementation may: reduce the fragment area to ensure that the total number
-of coverage samples for all pixels in a fragment does not exceed
-<<limits-shading-rate-max-coarse-samples, an implementation-dependent
-maximum>>.
-
-If <<primsrast-sampleshading, sample shading>> is active in the current
-pipeline and would result in processing _n_ (_n_ > 1) unique samples per
-fragment when the shading rate image is disabled, the shading rate is
-adjusted in an implementation-dependent manner to increase the number of
-fragment shader invocations spawned by the primitive.
-If the shading rate indicates _fs_ pixels per fragment and _fs_ is greater
-than _n_, the fragment area is adjusted so each fragment has approximately
-latexmath:[fs \over n] pixels.
-Otherwise, if the shading rate indicates _ipf_ invocations per fragment, the
-fragment area will be adjusted to a single pixel with approximately
-latexmath:[ipf \times n \over fs] invocations per fragment.
-
-If sample shading occurs due to the use of a fragment shader input variable
-decorated with code:SampleId or code:SamplePosition, the shading rate is
-ignored.
-Each fragment will have a single pixel and will spawn up to
-code:totalSamples fragment shader invocations, as when using
-<<primsrast-sampleshading, sample shading>> without a shading rate image.
-
-Finally, if the shading rate specifies multiple fragment shader invocations
-per fragment, the total number of invocations in the shading rate is clamped
-to be no larger than the value of code:totalSamples used for
-<<primsrast-sampleshading, sample shading>>.
-
-When the final shading rate for a primitive covering pixel (_x_,_y_) has a
-fragment area of latexmath:[fw \times fh], the fragment for that pixel will
-cover all pixels with coordinates (_x_',_y_') that satisfy the equations:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-\left\lfloor \frac{x}{fw} \right\rfloor = \left\lfloor \frac{x'}{fw} \right\rfloor
-\end{aligned}
-+++++++++++++++++++
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-\left\lfloor \frac{y}{fh} \right\rfloor = \left\lfloor \frac{y'}{fh} \right\rfloor
-\end{aligned}
-+++++++++++++++++++
-
-This combined fragment is considered to have multiple coverage samples; the
-total number of samples in this fragment is given by latexmath:[samples = fw
-\times fh \times rs] where _rs_ indicates the value of
-sname:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples
-specified at pipeline creation time.
-The set of coverage samples in the fragment is the union of the per-pixel
-coverage samples in each of the fragment's pixels The location and order of
-coverage samples within each pixel in the combined fragment are assigned as
-described in
-ifndef::VK_EXT_sample_locations[]
-<<primsrast-multisampling, Multisampling>>.
-endif::VK_EXT_sample_locations[]
-ifdef::VK_EXT_sample_locations[]
-<<primsrast-multisampling, Multisampling>> and <<primsrast-samplelocations,
-Custom Sample Locations>>.
-endif::VK_EXT_sample_locations[]
-Each coverage sample in the set of pixels belonging to the combined fragment
-is assigned a unique <<primsrast-multisampling-coverage-mask, coverage
-index>> in the range [0,_samples_-1].
-If the
-<<features-shadingRateCoarseSampleOrder,shadingRateCoarseSampleOrder>>
-feature is supported, the order of coverage samples can: be specified for
-each combination of fragment area and coverage sample count.
-If this feature is not supported, the sample order is
-implementation-dependent.
-
-[open,refpage='VkPipelineViewportCoarseSampleOrderStateCreateInfoNV',desc='Structure specifying parameters controlling sample order in coarse fragments',type='structs']
---
-If the pname:pNext chain of slink:VkPipelineViewportStateCreateInfo includes
-a sname:VkPipelineViewportCoarseSampleOrderStateCreateInfoNV structure, then
-that structure includes parameters that control the order of coverage
-samples in fragments larger than one pixel.
-
-The sname:VkPipelineViewportCoarseSampleOrderStateCreateInfoNV structure is
-defined as:
-
-include::{generated}/api/structs/VkPipelineViewportCoarseSampleOrderStateCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:sampleOrderType specifies the mechanism used to order coverage
-    samples in fragments larger than one pixel.
-  * pname:customSampleOrderCount specifies the number of custom sample
-    orderings to use when ordering coverage samples.
-  * pname:pCustomSampleOrders is a pointer to an array of
-    pname:customSampleOrderCount slink:VkCoarseSampleOrderCustomNV
-    structures, each of which specifies the coverage sample order for a
-    single combination of fragment area and coverage sample count.
-
-If this structure is not present, pname:sampleOrderType is considered to be
-ename:VK_COARSE_SAMPLE_ORDER_TYPE_DEFAULT_NV.
-
-If pname:sampleOrderType is ename:VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV, the
-coverage sample order used for any combination of fragment area and coverage
-sample count not enumerated in pname:pCustomSampleOrders will be identical
-to that used for ename:VK_COARSE_SAMPLE_ORDER_TYPE_DEFAULT_NV.
-
-If the pipeline was created with
-ename:VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV, the contents of this
-structure (if present) are ignored, and the coverage sample order is instead
-specified by flink:vkCmdSetCoarseSampleOrderNV.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-sampleOrderType-02072]]
-    If pname:sampleOrderType is not
-    ename:VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV,
-    pname:customSamplerOrderCount must: be `0`
-  * [[VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-pCustomSampleOrders-02234]]
-    The array pname:pCustomSampleOrders must: not contain two structures
-    with matching values for both the pname:shadingRate and
-    pname:sampleCount members
-****
-include::{generated}/validity/structs/VkPipelineViewportCoarseSampleOrderStateCreateInfoNV.txt[]
---
-
-[open,refpage='VkCoarseSampleOrderTypeNV',desc='Shading rate image sample ordering types',type='enums']
---
-The type elink:VkCoarseSampleOrderTypeNV specifies the technique used to
-order coverage samples in fragments larger than one pixel, and is defined
-as:
-
-include::{generated}/api/enums/VkCoarseSampleOrderTypeNV.txt[]
-
-  * ename:VK_COARSE_SAMPLE_ORDER_TYPE_DEFAULT_NV specifies that coverage
-    samples will be ordered in an implementation-dependent manner.
-  * ename:VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV specifies that coverage
-    samples will be ordered according to the array of custom orderings
-    provided in either the pname:pCustomSampleOrders member of
-    sname:VkPipelineViewportCoarseSampleOrderStateCreateInfoNV or the
-    pname:pCustomSampleOrders member of flink:vkCmdSetCoarseSampleOrderNV.
-  * ename:VK_COARSE_SAMPLE_ORDER_TYPE_PIXEL_MAJOR_NV specifies that coverage
-    samples will be ordered sequentially, sorted first by pixel coordinate
-    (in row-major order) and then by
-    <<primsrast-multisampling-coverage-mask, sample index>>.
-  * ename:VK_COARSE_SAMPLE_ORDER_TYPE_SAMPLE_MAJOR_NV specifies that
-    coverage samples will be ordered sequentially, sorted first by
-    <<primsrast-multisampling-coverage-mask, sample index>> and then by
-    pixel coordinate (in row-major order).
-
---
-
-When using a coarse sample order of
-ename:VK_COARSE_SAMPLE_ORDER_TYPE_PIXEL_MAJOR_NV for a fragment with an
-upper-left corner of latexmath:[(fx,fy)] with a width of latexmath:[fw
-\times fh] and latexmath:[fsc] samples per pixel,
-<<primsrast-multisampling-coverage-mask, coverage index>> latexmath:[cs] of
-the fragment will be assigned to <<primsrast-multisampling-coverage-mask,
-sample index>> latexmath:[fs] of pixel latexmath:[(px,py)] as follows:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-px = & fx + (\left\lfloor {cs \over fsc} \right\rfloor \text{ \% } fw) \\
-py = & fy + \left\lfloor {cs \over {fsc \times fw}} \right\rfloor \\
-fs = & cs \text{ \% } fsc
-\end{aligned}
-+++++++++++++++++++
-
-When using a coarse sample order of
-ename:VK_COARSE_SAMPLE_ORDER_TYPE_SAMPLE_MAJOR_NV,
-<<primsrast-multisampling-coverage-mask, coverage index>> latexmath:[cs]
-will be assigned as follows:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-px = & fx + cs \text{ \% } fw \\
-py = & (fy + \left\lfloor {cs \over fw} \right\rfloor \text{ \% } fh) \\
-fs = & \left\lfloor {cs \over {fw \times fh}} \right\rfloor
-\end{aligned}
-+++++++++++++++++++
-
-[open,refpage='VkCoarseSampleOrderCustomNV',desc='Structure specifying parameters controlling shading rate image usage',type='structs']
---
-The sname:VkCoarseSampleOrderCustomNV structure is used with a coverage
-sample ordering type of ename:VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV to
-specify the order of coverage samples for one combination of fragment width,
-fragment height, and coverage sample count.
-The structure is defined as:
-
-include::{generated}/api/structs/VkCoarseSampleOrderCustomNV.txt[]
-
-  * pname:shadingRate is a shading rate palette entry that identifies the
-    fragment width and height for the combination of fragment area and
-    per-pixel coverage sample count to control.
-  * pname:sampleCount identifies the per-pixel coverage sample count for the
-    combination of fragment area and coverage sample count to control.
-  * pname:sampleLocationCount specifies the number of sample locations in
-    the custom ordering.
-  * pname:pSampleLocations is a pointer to an array of
-    slink:VkCoarseSampleLocationNV structures specifying the location of
-    each sample in the custom ordering.
-
-When using a custom sample ordering, element _j_ in pname:pSampleLocations
-specifies a specific pixel location and
-<<primsrast-multisampling-coverage-mask, sample index>> that corresponds to
-<<primsrast-multisampling-coverage-mask, coverage index>> _j_ in the
-multi-pixel fragment.
-
-.Valid Usage
-****
-  * [[VUID-VkCoarseSampleOrderCustomNV-shadingRate-02073]]
-    pname:shadingRate must: be a shading rate that generates fragments with
-    more than one pixel
-  * [[VUID-VkCoarseSampleOrderCustomNV-sampleCount-02074]]
-    pname:sampleCount must: correspond to a sample count enumerated in
-    tlink:VkSampleCountFlags whose corresponding bit is set in
-    slink:VkPhysicalDeviceLimits::pname:framebufferNoAttachmentsSampleCounts
-  * [[VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-02075]]
-    pname:sampleLocationCount must: be equal to the product of
-    pname:sampleCount, the fragment width for pname:shadingRate, and the
-    fragment height for pname:shadingRate
-  * [[VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-02076]]
-    pname:sampleLocationCount must: be less than or equal to the value of
-    sname:VkPhysicalDeviceShadingRateImagePropertiesNV::pname:shadingRateMaxCoarseSamples
-  * [[VUID-VkCoarseSampleOrderCustomNV-pSampleLocations-02077]]
-    The array pname:pSampleLocations must: contain exactly one entry for
-    every combination of valid values for pname:pixelX, pname:pixelY, and
-    pname:sample in the structure slink:VkCoarseSampleOrderCustomNV
-****
-include::{generated}/validity/structs/VkCoarseSampleOrderCustomNV.txt[]
---
-
-[open,refpage='VkCoarseSampleLocationNV',desc='Structure specifying parameters controlling shading rate image usage',type='structs']
---
-The sname:VkCoarseSampleLocationNV structure identifies a specific pixel and
-<<primsrast-multisampling-coverage-mask, sample index>> for one of the
-coverage samples in a fragment that is larger than one pixel.
-This structure is defined as:
-
-include::{generated}/api/structs/VkCoarseSampleLocationNV.txt[]
-
-  * pname:pixelX is added to the x coordinate of the upper-leftmost pixel of
-    each fragment to identify the pixel containing the coverage sample.
-  * pname:pixelY is added to the y coordinate of the upper-leftmost pixel of
-    each fragment to identify the pixel containing the coverage sample.
-  * pname:sample is the number of the coverage sample in the pixel
-    identified by pname:pixelX and pname:pixelY.
-
-.Valid Usage
-****
-  * [[VUID-VkCoarseSampleLocationNV-pixelX-02078]]
-    pname:pixelX must: be less than the width (in pixels) of the fragment
-  * [[VUID-VkCoarseSampleLocationNV-pixelY-02079]]
-    pname:pixelY must: be less than the height (in pixels) of the fragment
-  * [[VUID-VkCoarseSampleLocationNV-sample-02080]]
-    pname:sample must: be less than the number of coverage samples in each
-    pixel belonging to the fragment
-****
-
-include::{generated}/validity/structs/VkCoarseSampleLocationNV.txt[]
---
-
-[open,refpage='vkCmdSetCoarseSampleOrderNV',desc='Set order of coverage samples for coarse fragments dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the order of coverage
-samples in fragments larger than one pixel, call:
-
-include::{generated}/api/protos/vkCmdSetCoarseSampleOrderNV.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:sampleOrderType specifies the mechanism used to order coverage
-    samples in fragments larger than one pixel.
-  * pname:customSampleOrderCount specifies the number of custom sample
-    orderings to use when ordering coverage samples.
-  * pname:pCustomSampleOrders is a pointer to an array of
-    slink:VkCoarseSampleOrderCustomNV structures, each of which specifies
-    the coverage sample order for a single combination of fragment area and
-    coverage sample count.
-
-If pname:sampleOrderType is ename:VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV, the
-coverage sample order used for any combination of fragment area and coverage
-sample count not enumerated in pname:pCustomSampleOrders will be identical
-to that used for ename:VK_COARSE_SAMPLE_ORDER_TYPE_DEFAULT_NV.
-
-This command sets the order of coverage samples for subsequent drawing
-commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineViewportCoarseSampleOrderStateCreateInfoNV values used to
-create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetCoarseSampleOrderNV-sampleOrderType-02081]]
-    If pname:sampleOrderType is not
-    ename:VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV,
-    pname:customSamplerOrderCount must: be `0`
-  * [[VUID-vkCmdSetCoarseSampleOrderNV-pCustomSampleOrders-02235]]
-    The array pname:pCustomSampleOrders must: not contain two structures
-    with matching values for both the pname:shadingRate and
-    pname:sampleCount members
-****
-
-include::{generated}/validity/protos/vkCmdSetCoarseSampleOrderNV.txt[]
---
-
-If the final shading rate for a primitive covering pixel (_x_,_y_) results
-in _n_ invocations per pixel (_n_ > 1), _n_ separate fragment shader
-invocations will be generated for the fragment.
-Each coverage sample in the fragment will be assigned to one of the _n_
-fragment shader invocations in an implementation-dependent manner.
-The outputs from the <<interfaces-fragmentoutput, fragment output
-interface>> of each shader invocation will be broadcast to all of the
-framebuffer samples associated with the invocation.
-If none of the coverage samples associated with a fragment shader invocation
-is covered by a primitive, the implementation may: discard the fragment
-shader invocation for those samples.
-
-If the final shading rate for a primitive covering pixel (_x_,_y_) results
-in a fragment containing multiple pixels, a single set of fragment shader
-invocations will be generated for all pixels in the combined fragment.
-Outputs from the <<interfaces-fragmentoutput, fragment output interface>>
-will be broadcast to all covered framebuffer samples belonging to the
-fragment.
-If the fragment shader executes code discarding the fragment, none of the
-samples of the fragment will be updated.
-
-endif::VK_NV_shading_rate_image[]
-
-
-[[primsrast-sampleshading]]
-== Sample Shading
-
-Sample shading can: be used to specify a minimum number of unique samples to
-process for each fragment.
-If sample shading is enabled an implementation must: provide a minimum of
-[eq]#max({lceil} pname:minSampleShadingFactor {times} pname:totalSamples
-{rceil}, 1)# unique associated data for each fragment, where
-pname:minSampleShadingFactor is the minimum fraction of sample shading.
-ifdef::VK_AMD_mixed_attachment_samples[]
-If the `apiext:VK_AMD_mixed_attachment_samples` extension is enabled and the
-subpass uses color attachments, pname:totalSamples is the number of samples
-of the color attachments.
-Otherwise,
-endif::VK_AMD_mixed_attachment_samples[]
-pname:totalSamples is the value of
-slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples
-specified at pipeline creation time.
-These are associated with the samples in an implementation-dependent manner.
-When pname:minSampleShadingFactor is `1.0`, a separate set of associated
-data are evaluated for each sample, and each set of values is evaluated at
-the sample location.
-
-Sample shading is enabled for a graphics pipeline:
-
-  * If the interface of the fragment shader entry point of the graphics
-    pipeline includes an input variable decorated with code:SampleId or
-    code:SamplePosition.
-    In this case pname:minSampleShadingFactor takes the value `1.0`.
-  * Else if the pname:sampleShadingEnable member of the
-    slink:VkPipelineMultisampleStateCreateInfo structure specified when
-    creating the graphics pipeline is set to ename:VK_TRUE.
-    In this case pname:minSampleShadingFactor takes the value of
-    slink:VkPipelineMultisampleStateCreateInfo::pname:minSampleShading.
-
-Otherwise, sample shading is considered disabled.
-
-
-ifdef::VK_NV_fragment_shader_barycentric[]
-[[primsrast-barycentric]]
-== Barycentric Interpolation
-
-When the pname:fragmentShaderBarycentric feature is enabled, the
-code:PerVertexNV <<shaders-interpolation-decorations, interpolation
-decoration>> can: be used with fragment shader inputs to indicate that the
-decorated inputs do not have associated data in the fragment.
-Such inputs can: only be accessed in a fragment shader using an array index
-whose value (0, 1, or 2) identifies one of the vertices of the primitive
-that produced the fragment.
-
-ifndef::VK_NV_mesh_shader[]
-When <<tessellation, tessellation>> and <<geometry, geometry shading>>
-endif::VK_NV_mesh_shader[]
-ifdef::VK_NV_mesh_shader[]
-When <<tessellation, tessellation>>, <<geometry, geometry shading>>, and
-<<mesh,mesh shading>>
-endif::VK_NV_mesh_shader[]
-are not active, fragment shader inputs decorated with code:PerVertexNV will
-take values from one of the vertices of the primitive that produced the
-fragment, identified by the extra index provided in SPIR-V code accessing
-the input.
-If the _n_ vertices passed to a draw call are numbered 0 through _n_-1, and
-the point, line, and triangle primitives produced by the draw call are
-numbered with consecutive integers beginning with zero, the following table
-indicates the original vertex numbers used
-ifdef::VK_EXT_provoking_vertex[]
-when the <<vertexpostproc-flatshading,provoking vertex mode>> is
-ename:VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT
-endif::VK_EXT_provoking_vertex[]
-for index values of 0, 1, and 2.
-If an input decorated with code:PerVertexNV is accessed with any other
-vertex index value, an undefined: value is returned.
-
-[[primsrast-barycentric-order-table]]
-[options="header"]
-|======
-| Primitive Topology                                               | Vertex 0    | Vertex 1    | Vertex 2
-| ename:VK_PRIMITIVE_TOPOLOGY_POINT_LIST                           | i           | -           | -
-| ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST                            | 2i          | 2i+1        | -
-| ename:VK_PRIMITIVE_TOPOLOGY_LINE_STRIP                           | i           | i+1         | -
-| ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST                        | 3i          | 3i+1        | 3i+2
-| ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP (even)                | i           | i+1         | i+2
-| ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP (odd)                 | i           | i+2         | i+1
-| ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN                         | i+1         | i+2         | 0
-| ename:VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY             | 4i+1        | 4i+2        | -
-| ename:VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY            | i+1         | i+2         | -
-| ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY         | 6i          | 6i+2        | 6i+4
-| ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY (even) | 2i          | 2i+2        | 2i+4
-| ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY (odd)  | 2i          | 2i+4        | 2i+2
-|======
-
-ifdef::VK_EXT_provoking_vertex[]
-When the provoking vertex mode is
-ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT, the original vertex numbers
-used are the same as above except as indicated in the table below.
-
-[[primsrast-barycentric-order-table-last-vertex]]
-[options="header"]
-|======
-| Primitive Topology                                               | Vertex 0    | Vertex 1    | Vertex 2
-| ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP (odd)                 | i+1         | i           | i+2
-| ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN                         | 0           | i+1         | i+2
-| ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY (odd)  | 2i+2        | 2i          | 2i+4
-|======
-endif::VK_EXT_provoking_vertex[]
-
-When geometry
-ifdef::VK_NV_mesh_shader[]
-or mesh
-endif::VK_NV_mesh_shader[]
-shading is active, primitives processed by fragment shaders are assembled
-from the vertices emitted by the geometry
-ifdef::VK_NV_mesh_shader[]
-or mesh
-endif::VK_NV_mesh_shader[]
-shader.
-In this case, the vertices used for fragment shader inputs decorated with
-code:PerVertexNV are derived by treating the primitives produced by the
-shader as though they were specified by a draw call and consulting
-<<primsrast-barycentric-order-table, the table above>>.
-
-When using tessellation without geometry shading, the tessellator produces
-primitives in an implementation-dependent manner.
-While there is no defined vertex ordering for inputs decorated with
-code:PerVertexNV, the vertex ordering used in this case will be consistent
-with the ordering used to derive the values of inputs decorated with
-code:BaryCoordNV or code:BaryCoordNoPerspNV.
-
-Fragment shader inputs decorated with code:BaryCoordNV or
-code:BaryCoordNoPerspNV hold three-component vectors with barycentric
-weights that indicate the location of the fragment relative to the
-screen-space locations of vertices of its primitive.
-For point primitives, such variables are always assigned the value (1,0,0).
-For <<primsrast-lines-basic, line>> primitives, the built-ins are obtained
-by interpolating an attribute whose values for the vertices numbered 0 and 1
-are (1,0,0) and (0,1,0), respectively.
-For <<primsrast-polygons-basic, polygon>> primitives, the built-ins are
-obtained by interpolating an attribute whose values for the vertices
-numbered 0, 1, and 2 are (1,0,0), (0,1,0), and (0,0,1), respectively.
-For code:BaryCoordNV, the values are obtained using perspective
-interpolation.
-For code:BaryCoordNoPerspNV, the values are obtained using linear
-interpolation.
-
-endif::VK_NV_fragment_shader_barycentric[]
-
-
-[[primsrast-points]]
-== Points
-
-A point is drawn by generating a set of fragments in the shape of a square
-centered around the vertex of the point.
-Each vertex has an associated point size that controls the width/height of
-that square.
-The point size is taken from the (potentially clipped) shader built-in
-code:PointSize written by:
-
-  * the geometry shader, if active;
-  * the tessellation evaluation shader, if active and no geometry shader is
-    active;
-  * the vertex shader, otherwise
-
-and clamped to the implementation-dependent point size range
-[eq]#[pname:pointSizeRange[0],pname:pointSizeRange[1]]#.
-The value written to code:PointSize must: be greater than zero.
-
-Not all point sizes need be supported, but the size 1.0 must: be supported.
-The range of supported sizes and the size of evenly-spaced gradations within
-that range are implementation-dependent.
-The range and gradations are obtained from the pname:pointSizeRange and
-pname:pointSizeGranularity members of slink:VkPhysicalDeviceLimits.
-If, for instance, the size range is from 0.1 to 2.0 and the gradation size
-is 0.1, then the sizes 0.1, 0.2, ..., 1.9, 2.0 are supported.
-Additional point sizes may: also be supported.
-There is no requirement that these sizes be equally spaced.
-If an unsupported size is requested, the nearest supported size is used
-instead.
-
-ifdef::VK_EXT_fragment_density_map[]
-Further, if the render pass has a fragment density map attachment, point
-size may: be rounded by the implementation to a multiple of the fragment's
-width or height.
-endif::VK_EXT_fragment_density_map[]
-
-
-[[primsrast-points-basic]]
-=== Basic Point Rasterization
-
-Point rasterization produces a fragment for each fragment area group of
-framebuffer pixels with one or more sample points that intersect a region
-centered at the point's [eq]#(x~f~,y~f~)#.
-This region is a square with side equal to the current point size.
-Coverage bits that correspond to sample points that intersect the region are
-1, other coverage bits are 0.
-All fragments produced in rasterizing a point are assigned the same
-associated data, which are those of the vertex corresponding to the point.
-However, the fragment shader built-in code:PointCoord contains point sprite
-texture coordinates.
-The [eq]#s# and [eq]#t# point sprite texture coordinates vary from zero to
-one across the point horizontally left-to-right and vertically
-top-to-bottom, respectively.
-The following formulas are used to evaluate [eq]#s# and [eq]#t#:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-s = {1 \over 2} + { \left( x_p - x_f \right) \over \text{size} }
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-t = {1 \over 2} + { \left( y_p - y_f \right) \over \text{size} }
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-where size is the point's size; [eq]#(x~p~,y~p~)# is the location at which
-the point sprite coordinates are evaluated - this may: be the framebuffer
-coordinates of the fragment center, or the location of a sample; and
-[eq]#(x~f~,y~f~)# is the exact, unrounded framebuffer coordinate of the
-vertex for the point.
-
-
-[[primsrast-lines]]
-== Line Segments
-
-ifdef::VK_EXT_line_rasterization[]
-[open,refpage='VkPipelineRasterizationLineStateCreateInfoEXT',desc='Structure specifying parameters of a newly created pipeline line rasterization state',type='structs']
---
-Line segment rasterization options are controlled by the
-slink:VkPipelineRasterizationLineStateCreateInfoEXT structure.
-
-The sname:VkPipelineRasterizationLineStateCreateInfoEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkPipelineRasterizationLineStateCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:lineRasterizationMode is a elink:VkLineRasterizationModeEXT value
-    selecting the style of line rasterization.
-  * pname:stippledLineEnable enables <<primsrast-lines-stipple, stippled
-    line rasterization>>.
-  * pname:lineStippleFactor is the repeat factor used in stippled line
-    rasterization.
-  * pname:lineStipplePattern is the bit pattern used in stippled line
-    rasterization.
-
-If pname:stippledLineEnable is ename:VK_FALSE, the values of
-pname:lineStippleFactor and pname:lineStipplePattern are ignored.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02768]]
-    If pname:lineRasterizationMode is
-    ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT, then the
-    <<features-rectangularLines,rectangularLines>> feature must: be enabled
-  * [[VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02769]]
-    If pname:lineRasterizationMode is
-    ename:VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT, then the
-    <<features-bresenhamLines,bresenhamLines>> feature must: be enabled
-  * [[VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02770]]
-    If pname:lineRasterizationMode is
-    ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT, then the
-    <<features-bresenhamLines,smoothLines>> feature must: be enabled
-  * [[VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02771]]
-    If pname:stippledLineEnable is ename:VK_TRUE and
-    pname:lineRasterizationMode is
-    ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT, then the
-    <<features-stippledRectangularLines,stippledRectangularLines>> feature
-    must: be enabled
-  * [[VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02772]]
-    If pname:stippledLineEnable is ename:VK_TRUE and
-    pname:lineRasterizationMode is
-    ename:VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT, then the
-    <<features-stippledBresenhamLines,stippledBresenhamLines>> feature must:
-    be enabled
-  * [[VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02773]]
-    If pname:stippledLineEnable is ename:VK_TRUE and
-    pname:lineRasterizationMode is
-    ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT, then the
-    <<features-stippledSmoothLines,stippledSmoothLines>> feature must: be
-    enabled
-  * [[VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02774]]
-    If pname:stippledLineEnable is ename:VK_TRUE and
-    pname:lineRasterizationMode is
-    ename:VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT, then the
-    <<features-stippledRectangularLines,stippledRectangularLines>> feature
-    must: be enabled and slink:VkPhysicalDeviceLimits::pname:strictLines
-    must: be ename:VK_TRUE
-****
-
-include::{generated}/validity/structs/VkPipelineRasterizationLineStateCreateInfoEXT.txt[]
---
-
-[open,refpage='VkLineRasterizationModeEXT',desc='Line rasterization modes',type='enums']
---
-Possible values of
-slink:VkPipelineRasterizationLineStateCreateInfoEXT::pname:lineRasterizationMode
-are:
-
-include::{generated}/api/enums/VkLineRasterizationModeEXT.txt[]
-
-  * ename:VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT is equivalent to
-    ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT if
-    slink:VkPhysicalDeviceLimits::pname:strictLines is ename:VK_TRUE,
-    otherwise lines are drawn as non-pname:strictLines parallelograms.
-    Both of these modes are defined in <<primsrast-lines-basic,Basic Line
-    Segment Rasterization>>.
-  * ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT specifies lines drawn
-    as if they were rectangles extruded from the line
-  * ename:VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT specifies lines drawn by
-    determining which pixel diamonds the line intersects and exits, as
-    defined in <<primsrast-lines-bresenham,Bresenham Line Segment
-    Rasterization>>.
-  * ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT specifies lines
-    drawn if they were rectangles extruded from the line, with alpha
-    falloff, as defined in <<primsrast-lines-smooth,Smooth Lines>>.
---
-endif::VK_EXT_line_rasterization[]
-
-[open,refpage='vkCmdSetLineWidth',desc='Set line width dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the line width, call:
-
-include::{generated}/api/protos/vkCmdSetLineWidth.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:lineWidth is the width of rasterized line segments.
-
-This command sets the line width for subsequent drawing commands when the
-graphics pipeline is created with ename:VK_DYNAMIC_STATE_LINE_WIDTH set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineRasterizationStateCreateInfo::pname:lineWidth value used to
-create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetLineWidth-lineWidth-00788]]
-    If the <<features-wideLines,wide lines>> feature is not enabled,
-    pname:lineWidth must: be `1.0`
-****
-
-include::{generated}/validity/protos/vkCmdSetLineWidth.txt[]
---
-
-Not all line widths need be supported for line segment rasterization, but
-width 1.0 antialiased segments must: be provided.
-The range and gradations are obtained from the pname:lineWidthRange and
-pname:lineWidthGranularity members of slink:VkPhysicalDeviceLimits.
-If, for instance, the size range is from 0.1 to 2.0 and the gradation size
-is 0.1, then the sizes 0.1, 0.2, ..., 1.9, 2.0 are supported.
-Additional line widths may: also be supported.
-There is no requirement that these widths be equally spaced.
-If an unsupported width is requested, the nearest supported width is used
-instead.
-
-ifdef::VK_EXT_fragment_density_map[]
-Further, if the render pass has a fragment density map attachment, line
-width may: be rounded by the implementation to a multiple of the fragment's
-width or height.
-endif::VK_EXT_fragment_density_map[]
-
-
-[[primsrast-lines-basic]]
-=== Basic Line Segment Rasterization
-
-ifdef::VK_EXT_line_rasterization[]
-If the pname:lineRasterizationMode member of
-slink:VkPipelineRasterizationLineStateCreateInfoEXT is
-ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT, rasterized
-endif::VK_EXT_line_rasterization[]
-ifndef::VK_EXT_line_rasterization[]
-Rasterized
-endif::VK_EXT_line_rasterization[]
-line segments produce fragments which intersect a rectangle centered on the
-line segment.
-Two of the edges are parallel to the specified line segment; each is at a
-distance of one-half the current width from that segment in directions
-perpendicular to the direction of the line.
-The other two edges pass through the line endpoints and are perpendicular to
-the direction of the specified line segment.
-Coverage bits that correspond to sample points that intersect the rectangle
-are 1, other coverage bits are 0.
-
-Next we specify how the data associated with each rasterized fragment are
-obtained.
-Let [eq]#**p**~r~ = (x~d~, y~d~)# be the framebuffer coordinates at which
-associated data are evaluated.
-This may: be the center of a fragment or the location of a sample within the
-fragment.
-When pname:rasterizationSamples is ename:VK_SAMPLE_COUNT_1_BIT, the fragment
-center must: be used.
-Let [eq]#**p**~a~ = (x~a~, y~a~)# and [eq]#**p**~b~ = (x~b~,y~b~)# be
-initial and final endpoints of the line segment, respectively.
-Set
-
-// Equation {linet:eq}
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-t = {{( \mathbf{p}_r - \mathbf{p}_a ) \cdot ( \mathbf{p}_b - \mathbf{p}_a )}
-    \over {\| \mathbf{p}_b - \mathbf{p}_a \|^2 }}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-(Note that [eq]#t = 0# at [eq]#**p**~a~# and [eq]#t = 1# at [eq]#**p**~b~#.
-Also note that this calculation projects the vector from [eq]#**p**~a~# to
-[eq]#**p**~r~# onto the line, and thus computes the normalized distance of
-the fragment along the line.)
-
-[[line_perspective_interpolation]]
-The value of an associated datum [eq]#f# for the fragment, whether it be a
-shader output or the clip [eq]#w# coordinate, must: be determined using
-_perspective interpolation_:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = {{ (1-t) {f_a / w_a} + t { f_b / w_b} } \over
-    {(1-t) / w_a + t / w_b }}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-where [eq]#f~a~# and [eq]#f~b~# are the data associated with the starting
-and ending endpoints of the segment, respectively; [eq]#w~a~# and [eq]#w~b~#
-are the clip [eq]#w# coordinates of the starting and ending endpoints of the
-segment, respectively.
-
-[[line_linear_interpolation]]
-Depth values for lines must: be determined using _linear interpolation_:
-
-  {empty}:: [eq]#z = (1 - t) z~a~ {plus} t z~b~#
-
-where [eq]#z~a~# and [eq]#z~b~# are the depth values of the starting and
-ending endpoints of the segment, respectively.
-
-The code:NoPerspective and code:Flat
-<<shaders-interpolation-decorations,interpolation decorations>> can: be used
-with fragment shader inputs to declare how they are interpolated.
-When neither decoration is applied, <<line_perspective_interpolation,
-perspective interpolation>> is performed as described above.
-When the code:NoPerspective decoration is used, <<line_linear_interpolation,
-linear interpolation>> is performed in the same fashion as for depth values,
-as described above.
-When the code:Flat decoration is used, no interpolation is performed, and
-outputs are taken from the corresponding input value of the
-<<vertexpostproc-flatshading,provoking vertex>> corresponding to that
-primitive.
-
-ifdef::VK_NV_fragment_shader_barycentric[]
-When the pname:fragmentShaderBarycentric feature is enabled, the
-code:PerVertexNV <<shaders-interpolation-decorations, interpolation
-decoration>> can: also be used with fragment shader inputs which indicate
-that the decorated inputs are not interpolated and can: only be accessed
-using an extra array dimension, where the extra index identifies one of the
-vertices of the primitive that produced the fragment.
-endif::VK_NV_fragment_shader_barycentric[]
-
-The above description documents the preferred method of line rasterization,
-and must: be used when the implementation advertises the pname:strictLines
-limit in slink:VkPhysicalDeviceLimits as ename:VK_TRUE.
-
-When pname:strictLines is ename:VK_FALSE, the edges of the lines are
-generated as a parallelogram surrounding the original line.
-The major axis is chosen by noting the axis in which there is the greatest
-distance between the line start and end points.
-If the difference is equal in both directions then the X axis is chosen as
-the major axis.
-Edges 2 and 3 are aligned to the minor axis and are centered on the
-endpoints of the line as in <<fig-non-strict-lines>>, and each is
-pname:lineWidth long.
-Edges 0 and 1 are parallel to the line and connect the endpoints of edges 2
-and 3.
-Coverage bits that correspond to sample points that intersect the
-parallelogram are 1, other coverage bits are 0.
-
-Samples that fall exactly on the edge of the parallelogram follow the
-polygon rasterization rules.
-
-Interpolation occurs as if the parallelogram was decomposed into two
-triangles where each pair of vertices at each end of the line has identical
-attributes.
-
-[[fig-non-strict-lines]]
-image::{images}/non_strict_lines.svg[align="center",title="Non strict lines",opts="{imageopts}"]
-
-Only when pname:strictLines is ename:VK_FALSE implementations may: deviate
-from the non-strict line algorithm described above in the following ways:
-
-  * Implementations may: instead interpolate each fragment according to the
-    formula in <<primsrast-lines-basic, Basic Line Segment Rasterization>>
-    using the original line segment endpoints.
-
-  * Rasterization of non-antialiased non-strict line segments may: be
-    performed using the rules defined in
-    <<primsrast-lines-bresenham,Bresenham Line Segment Rasterization>>.
-
-
-[[primsrast-lines-bresenham]]
-=== Bresenham Line Segment Rasterization
-
-ifdef::VK_EXT_line_rasterization[]
-If pname:lineRasterizationMode is
-ename:VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT, then the following rules
-replace the line rasterization rules defined in <<primsrast-lines-basic,
-Basic Line Segment Rasterization>>.
-endif::VK_EXT_line_rasterization[]
-
-Non-strict lines may: also follow these rasterization rules for
-non-antialiased lines.
-
-Line segment rasterization begins by characterizing the segment as either
-_x-major_ or _y-major_.
-x-major line segments have slope in the closed interval [eq]#[-1,1]#; all
-other line segments are y-major (slope is determined by the segment's
-endpoints).
-We specify rasterization only for x-major segments except in cases where the
-modifications for y-major segments are not self-evident.
-
-Ideally, Vulkan uses a _diamond-exit_ rule to determine those fragments that
-are produced by rasterizing a line segment.
-For each fragment [eq]#f# with center at framebuffer coordinates [eq]#x~f~#
-and [eq]#y~f~#, define a diamond-shaped region that is the intersection of
-four half planes:
-
-[latexmath]
-+++++++++++++++++++
-    R_f = \{ (x,y) \mid | x - x_f | + | y - y_f | < \frac{1}{2} \}
-+++++++++++++++++++
-
-Essentially, a line segment starting at [eq]#p~a~# and ending at [eq]#p~b~#
-produces those fragments [eq]#f# for which the segment intersects
-[eq]#R~f~#, except if [eq]#p~b~# is contained in [eq]#R~f~#.
-
-image::{images}/bresenham.svg[title="Visualization of Bresenham's algorithm",align="center",opts="{imageopts}"]
-
-To avoid difficulties when an endpoint lies on a boundary of [eq]#R~f~# we
-(in principle) perturb the supplied endpoints by a tiny amount.
-Let [eq]#p~a~# and [eq]#p~b~# have framebuffer coordinates [eq]#(x~a~,
-y~a~)# and [eq]#(x~b~, y~b~)#, respectively.
-Obtain the perturbed endpoints [eq]#p~a~'# given by [eq]#(x~a~, y~a~) -
-({epsilon}, {epsilon}^2^)# and [eq]#p~b~'# given by [eq]#(x~b~, y~b~) -
-({epsilon}, {epsilon}^2^)#.
-Rasterizing the line segment starting at [eq]#p~a~# and ending at [eq]#p~b~#
-produces those fragments [eq]#f# for which the segment starting at
-[eq]#p~a~'# and ending on [eq]#p~b~'# intersects [eq]#R~f~#, except if
-[eq]#p~b~'# is contained in [eq]#R~f~#.
-[eq]#{epsilon}# is chosen to be so small that rasterizing the line segment
-produces the same fragments when [eq]#{delta}# is substituted for
-[eq]#{epsilon}# for any [eq]#0 < {delta} {leq} {epsilon}#.
-
-When [eq]#p~a~# and [eq]#p~b~# lie on fragment centers, this
-characterization of fragments reduces to Bresenham's algorithm with one
-modification: lines produced in this description are "half-open," meaning
-that the final fragment (corresponding to [eq]#p~b~#) is not drawn.
-This means that when rasterizing a series of connected line segments, shared
-endpoints will be produced only once rather than twice (as would occur with
-Bresenham's algorithm).
-
-Implementations may: use other line segment rasterization algorithms,
-subject to the following rules:
-
-  * The coordinates of a fragment produced by the algorithm must: not
-    deviate by more than one unit in either x or y framebuffer coordinates
-    from a corresponding fragment produced by the diamond-exit rule.
-  * The total number of fragments produced by the algorithm must: not differ
-    from that produced by the diamond-exit rule by no more than one.
-  * For an x-major line, two fragments that lie in the same
-    framebuffer-coordinate column must: not be produced (for a y-major line,
-    two fragments that lie in the same framebuffer-coordinate row must: not
-    be produced).
-  * If two line segments share a common endpoint, and both segments are
-    either x-major (both left-to-right or both right-to-left) or y-major
-    (both bottom-to-top or both top-to-bottom), then rasterizing both
-    segments must: not produce duplicate fragments.
-    Fragments also must: not be omitted so as to interrupt continuity of the
-    connected segments.
-
-The actual width [eq]#w# of Bresenham lines is determined by rounding the
-line width to the nearest integer, clamping it to the
-implementation-dependent pname:lineWidthRange (with both values rounded to
-the nearest integer), then clamping it to be no less than 1.
-
-Bresenham line segments of width other than one are rasterized by offsetting
-them in the minor direction (for an x-major line, the minor direction is y,
-and for a y-major line, the minor direction is x) and producing a row or
-column of fragments in the minor direction.
-If the line segment has endpoints given by [eq]#(x~0~, y~0~)# and
-[eq]#(x~1~, y~1~)# in framebuffer coordinates, the segment with endpoints
-latexmath:[(x_0, y_0 - \frac{w-1}{2})] and latexmath:[(x_1, y_1 -
-\frac{w-1}{2})] is rasterized, but instead of a single fragment, a column of
-fragments of height w (a row of fragments of length w for a y-major segment)
-is produced at each x (y for y-major) location.
-The lowest fragment of this column is the fragment that would be produced by
-rasterizing the segment of width 1 with the modified coordinates.
-
-The preferred method of attribute interpolation for a wide line is to
-generate the same attribute values for all fragments in the row or column
-described above, as if the adjusted line was used for interpolation and
-those values replicated to the other fragments, except for code:FragCoord
-which is interpolated as usual.
-Implementations may: instead interpolate each fragment according to the
-formula in <<primsrast-lines-basic,Basic Line Segment Rasterization>>, using
-the original line segment endpoints.
-
-When Bresenham lines are being rasterized, sample locations may: all be
-treated as being at the pixel center (this may: affect attribute and depth
-interpolation).
-
-[NOTE]
-.Note
-====
-The sample locations described above are *not* used for determining
-coverage, they are only used for things like attribute interpolation.
-The rasterization rules that determine coverage are defined in terms of
-whether the line intersects *pixels*, as opposed to the point sampling rules
-used for other primitive types.
-So these rules are independent of the sample locations.
-One consequence of this is that Bresenham lines cover the same pixels
-regardless of the number of rasterization samples, and cover all samples in
-those pixels (unless masked out or killed).
-====
-
-
-ifdef::VK_EXT_line_rasterization[]
-[[primsrast-lines-stipple]]
-=== Line Stipple
-
-If the pname:stippledLineEnable member of
-slink:VkPipelineRasterizationLineStateCreateInfoEXT is ename:VK_TRUE, then
-lines are rasterized with a _line stipple_ determined by
-pname:lineStippleFactor and pname:lineStipplePattern.
-pname:lineStipplePattern is an unsigned 16-bit integer that determines which
-fragments are to be drawn or discarded when the line is rasterized.
-pname:lineStippleFactor is a count that is used to modify the effective line
-stipple by causing each bit in pname:lineStipplePattern to be used
-pname:lineStippleFactor times.
-
-Line stippling discards certain fragments that are produced by
-rasterization.
-The masking is achieved using three parameters: the 16-bit line stipple
-pattern _p_, the line stipple factor _r_, and an integer stipple counter
-_s_.
-Let
-
-[latexmath]
-+++++++++++++++++++
-b  = \left\lfloor \frac{s}{r} \right\rfloor \bmod 16
-+++++++++++++++++++
-
-Then a fragment is produced if the _b_'th bit of _p_ is 1, and discarded
-otherwise.
-The bits of _p_ are numbered with 0 being the least significant and 15 being
-the most significant.
-
-The initial value of _s_ is zero.
-For ename:VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT lines, _s_ is incremented
-after production of each fragment of a line segment (fragments are produced
-in order, beginning at the starting point and working towards the ending
-point).
-For ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT and
-ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT lines, the
-rectangular region is subdivided into adjacent unit-length rectangles, and s
-is incremented once for each rectangle.
-Rectangles with a value of _s_ such that the _b_'th bit of _p_ is zero are
-discarded.
-If the last rectangle in a line segment is shorter than unit-length, then
-the remainder may: carry over to the next line segment in the line strip
-using the same value of _s_ (this is the preferred behavior, for the stipple
-pattern to appear more consistent through the strip).
-
-_s_ is reset to 0 at the start of each strip (for line strips), and before
-every line segment in a group of independent segments.
-
-If the line segment has been clipped, then the value of _s_ at the beginning
-of the line segment is implementation-dependent.
-
-[open,refpage='vkCmdSetLineStippleEXT',desc='Set line stipple dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the line stipple state,
-call:
-
-include::{generated}/api/protos/vkCmdSetLineStippleEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:lineStippleFactor is the repeat factor used in stippled line
-    rasterization.
-  * pname:lineStipplePattern is the bit pattern used in stippled line
-    rasterization.
-
-This command sets the line stipple state for subsequent drawing commands
-when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_LINE_STIPPLE_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineRasterizationLineStateCreateInfoEXT::pname:lineStippleFactor
-and
-slink:VkPipelineRasterizationLineStateCreateInfoEXT::pname:lineStipplePattern
-values used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetLineStippleEXT-lineStippleFactor-02776]]
-    pname:lineStippleFactor must: be in the range [eq]#[1,256]#
-****
-
-include::{generated}/validity/protos/vkCmdSetLineStippleEXT.txt[]
---
-
-
-[[primsrast-lines-smooth]]
-=== Smooth Lines
-
-If the pname:lineRasterizationMode member of
-slink:VkPipelineRasterizationLineStateCreateInfoEXT is
-ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT, then lines are
-considered to be rectangles using the same geometry as for
-ename:VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT lines.
-The rules for determining which pixels are covered are
-implementation-dependent, and may: include nearby pixels where no sample
-locations are covered or where the rectangle does not intersect the pixel at
-all.
-For each pixel that is considered covered, the fragment computes a coverage
-value that approximates the area of the intersection of the rectangle with
-the pixel square, and this coverage value is multiplied into the color
-location 0's alpha value after fragment shading, as described in
-<<fragops-covg,Multisample Coverage>>.
-
-[NOTE]
-.Note
-====
-The details of the rasterization rules and area calculation are left
-intentionally vague, to allow implementations to generate coverage and
-values that are aesthetically pleasing.
-====
-endif::VK_EXT_line_rasterization[]
-
-
-[[primsrast-polygons]]
-== Polygons
-
-A polygon results from the decomposition of a triangle strip, triangle fan
-or a series of independent triangles.
-Like points and line segments, polygon rasterization is controlled by
-several variables in the slink:VkPipelineRasterizationStateCreateInfo
-structure.
-
-
-[[primsrast-polygons-basic]]
-=== Basic Polygon Rasterization
-
-[open,refpage='VkFrontFace',desc='Interpret polygon front-facing orientation',type='enums']
---
-The first step of polygon rasterization is to determine whether the triangle
-is _back-facing_ or _front-facing_.
-This determination is made based on the sign of the (clipped or unclipped)
-polygon's area computed in framebuffer coordinates.
-One way to compute this area is:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-a = -{1 \over 2}\sum_{i=0}^{n-1}
-      x_f^i y_f^{i \oplus 1} -
-      x_f^{i \oplus 1} y_f^i
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-where latexmath:[x_f^i] and latexmath:[y_f^i] are the [eq]#x# and [eq]#y#
-framebuffer coordinates of the [eq]##i##th vertex of the [eq]#n#-vertex
-polygon (vertices are numbered starting at zero for the purposes of this
-computation) and [eq]#i {oplus} 1# is [eq]#(i {plus} 1) mod n#.
-
-The interpretation of the sign of [eq]#a# is determined by the
-slink:VkPipelineRasterizationStateCreateInfo::pname:frontFace property of
-the currently active pipeline.
-Possible values are:
-
-include::{generated}/api/enums/VkFrontFace.txt[]
-
-  * ename:VK_FRONT_FACE_COUNTER_CLOCKWISE specifies that a triangle with
-    positive area is considered front-facing.
-  * ename:VK_FRONT_FACE_CLOCKWISE specifies that a triangle with negative
-    area is considered front-facing.
-
-Any triangle which is not front-facing is back-facing, including zero-area
-triangles.
---
-
-ifdef::VK_EXT_extended_dynamic_state[]
-[open,refpage='vkCmdSetFrontFaceEXT',desc='Set front face orientation dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the front face orientation,
-call:
-
-include::{generated}/api/protos/vkCmdSetFrontFaceEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:frontFace is a elink:VkFrontFace value specifying the front-facing
-    triangle orientation to be used for culling.
-
-This command sets the front face orientation for subsequent drawing commands
-when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_FRONT_FACE_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineRasterizationStateCreateInfo::pname:frontFace value used to
-create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetFrontFaceEXT-None-03383]]
-    The <<features-extendedDynamicState, extendedDynamicState>> feature
-    must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdSetFrontFaceEXT.txt[]
---
-endif::VK_EXT_extended_dynamic_state[]
-
-
-[open,refpage='VkCullModeFlagBits',desc='Bitmask controlling triangle culling',type='enums']
---
-Once the orientation of triangles is determined, they are culled according
-to the slink:VkPipelineRasterizationStateCreateInfo::pname:cullMode property
-of the currently active pipeline.
-Possible values are:
-
-include::{generated}/api/enums/VkCullModeFlagBits.txt[]
-
-  * ename:VK_CULL_MODE_NONE specifies that no triangles are discarded
-  * ename:VK_CULL_MODE_FRONT_BIT specifies that front-facing triangles are
-    discarded
-  * ename:VK_CULL_MODE_BACK_BIT specifies that back-facing triangles are
-    discarded
-  * ename:VK_CULL_MODE_FRONT_AND_BACK specifies that all triangles are
-    discarded.
-
-Following culling, fragments are produced for any triangles which have not
-been discarded.
---
-
-[open,refpage='VkCullModeFlags',desc='Bitmask of VkCullModeFlagBits',type='flags']
---
-include::{generated}/api/flags/VkCullModeFlags.txt[]
-
-tname:VkCullModeFlags is a bitmask type for setting a mask of zero or more
-elink:VkCullModeFlagBits.
---
-
-ifdef::VK_EXT_extended_dynamic_state[]
-[open,refpage='vkCmdSetCullModeEXT',desc='Set cull mode dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the cull mode, call:
-
-include::{generated}/api/protos/vkCmdSetCullModeEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:cullMode specifies the cull mode property to use for drawing.
-
-This command sets the cull mode for subsequent drawing commands when the
-graphics pipeline is created with ename:VK_DYNAMIC_STATE_CULL_MODE_EXT set
-in slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineRasterizationStateCreateInfo::pname:cullMode value used to
-create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetCullModeEXT-None-03384]]
-    The <<features-extendedDynamicState, extendedDynamicState>> feature
-    must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdSetCullModeEXT.txt[]
---
-endif::VK_EXT_extended_dynamic_state[]
-
-The rule for determining which fragments are produced by polygon
-rasterization is called _point sampling_.
-The two-dimensional projection obtained by taking the x and y framebuffer
-coordinates of the polygon's vertices is formed.
-Fragments are produced for any fragment area groups of pixels for which any
-sample points lie inside of this polygon.
-Coverage bits that correspond to sample points that satisfy the point
-sampling criteria are 1, other coverage bits are 0.
-Special treatment is given to a sample whose sample location lies on a
-polygon edge.
-In such a case, if two polygons lie on either side of a common edge (with
-identical endpoints) on which a sample point lies, then exactly one of the
-polygons must: result in a covered sample for that fragment during
-rasterization.
-As for the data associated with each fragment produced by rasterizing a
-polygon, we begin by specifying how these values are produced for fragments
-in a triangle.
-
-[[primsrast-polygon-barycentrics]]
-_Barycentric coordinates_ are a set of three numbers, [eq]#a#, [eq]#b#, and
-[eq]#c#, each in the range [eq]#[0,1]#, with [eq]#a {plus} b {plus} c = 1#.
-These coordinates uniquely specify any point [eq]#p# within the triangle or
-on the triangle's boundary as
-
-  {empty}:: [eq]#p = a p~a~ {plus} b p~b~ {plus} c p~c~#
-
-where [eq]#p~a~#, [eq]#p~b~#, and [eq]#p~c~# are the vertices of the
-triangle.
-[eq]#a#, [eq]#b#, and [eq]#c# are determined by:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-a = {{\mathrm{A}(p p_b p_c)} \over {\mathrm{A}(p_a p_b p_c)}}, \quad
-b = {{\mathrm{A}(p p_a p_c)} \over {\mathrm{A}(p_a p_b p_c)}}, \quad
-c = {{\mathrm{A}(p p_a p_b)} \over {\mathrm{A}(p_a p_b p_c)}},
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-where [eq]#A(lmn)# denotes the area in framebuffer coordinates of the
-triangle with vertices [eq]#l#, [eq]#m#, and [eq]#n#.
-
-Denote an associated datum at [eq]#p~a~#, [eq]#p~b~#, or [eq]#p~c~# as
-[eq]#f~a~#, [eq]#f~b~#, or [eq]#f~c~#, respectively.
-
-[[triangle_perspective_interpolation]]
-The value of an associated datum [eq]#f# for a fragment produced by
-rasterizing a triangle, whether it be a shader output or the clip [eq]#w#
-coordinate, must: be determined using perspective interpolation:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = { a {f_a / w_a} + b {f_b / w_b} + c {f_c / w_c} } \over
-    { {a / w_a} + {b / w_b} + {c / w_c} }
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-where [eq]#w~a~#, [eq]#w~b~#, and [eq]#w~c~# are the clip [eq]#w#
-coordinates of [eq]#p~a~#, [eq]#p~b~#, and [eq]#p~c~#, respectively.
-[eq]#a#, [eq]#b#, and [eq]#c# are the barycentric coordinates of the
-location at which the data are produced - this must: be the location of the
-fragment center or the location of a sample.
-When pname:rasterizationSamples is ename:VK_SAMPLE_COUNT_1_BIT, the fragment
-center must: be used.
-
-[[triangle_linear_interpolation]]
-Depth values for triangles must: be determined using linear interpolation:
-
-  {empty}:: [eq]#z = a z~a~ {plus} b z~b~ {plus} c z~c~#
-
-where [eq]#z~a~#, [eq]#z~b~#, and [eq]#z~c~# are the depth values of
-[eq]#p~a~#, [eq]#p~b~#, and [eq]#p~c~#, respectively.
-
-The code:NoPerspective and code:Flat
-<<shaders-interpolation-decorations,interpolation decorations>> can: be used
-with fragment shader inputs to declare how they are interpolated.
-When neither decoration is applied, <<triangle_perspective_interpolation,
-perspective interpolation>> is performed as described above.
-When the code:NoPerspective decoration is used,
-<<triangle_linear_interpolation, linear interpolation>> is performed in the
-same fashion as for depth values, as described above.
-When the code:Flat decoration is used, no interpolation is performed, and
-outputs are taken from the corresponding input value of the
-<<vertexpostproc-flatshading,provoking vertex>> corresponding to that
-primitive.
-
-ifdef::VK_AMD_shader_explicit_vertex_parameter[]
-When the `apiext:VK_AMD_shader_explicit_vertex_parameter` device extension
-is enabled the code:CustomInterpAMD <<shaders-interpolation-decorations,
-interpolation decoration>> can: also be used with fragment shader inputs
-which indicate that the decorated inputs can: only be accessed by the
-extended instruction code:InterpolateAtVertexAMD and allows accessing the
-value of the inputs for individual vertices of the primitive.
-endif::VK_AMD_shader_explicit_vertex_parameter[]
-
-ifdef::VK_NV_fragment_shader_barycentric[]
-When the pname:fragmentShaderBarycentric feature is enabled, the
-code:PerVertexNV <<shaders-interpolation-decorations, interpolation
-decoration>> can: also be used with fragment shader inputs which indicate
-that the decorated inputs are not interpolated and can: only be accessed
-using an extra array dimension, where the extra index identifies one of the
-vertices of the primitive that produced the fragment.
-endif::VK_NV_fragment_shader_barycentric[]
-
-For a polygon with more than three edges, such as are produced by clipping a
-triangle, a convex combination of the values of the datum at the polygon's
-vertices must: be used to obtain the value assigned to each fragment
-produced by the rasterization algorithm.
-That is, it must: be the case that at every fragment
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = \sum_{i=1}^{n} a_i f_i
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-where [eq]#n# is the number of vertices in the polygon and [eq]#f~i~# is the
-value of [eq]#f# at vertex [eq]#i#.
-For each [eq]#i#, [eq]#0 {leq} a~i~ {leq} 1# and
-latexmath:[\sum_{i=1}^{n}a_i = 1].
-The values of [eq]#a~i~# may: differ from fragment to fragment, but at
-vertex [eq]#i#, [eq]#a~i~ = 1# and [eq]#a~j~ = 0# for [eq]#j {neq} i#.
-
-[NOTE]
-.Note
-====
-One algorithm that achieves the required behavior is to triangulate a
-polygon (without adding any vertices) and then treat each triangle
-individually as already discussed.
-A scan-line rasterizer that linearly interpolates data along each edge and
-then linearly interpolates data across each horizontal span from edge to
-edge also satisfies the restrictions (in this case the numerator and
-denominator of <<triangle_perspective_interpolation, perspective
-interpolation>> are iterated independently, and a division is performed for
-each fragment).
-====
-
-
-[[primsrast-polygonmode]]
-=== Polygon Mode
-
-[open,refpage='VkPolygonMode',desc='Control polygon rasterization mode',type='enums']
---
-Possible values of the
-slink:VkPipelineRasterizationStateCreateInfo::pname:polygonMode property of
-the currently active pipeline, specifying the method of rasterization for
-polygons, are:
-
-include::{generated}/api/enums/VkPolygonMode.txt[]
-
-  * ename:VK_POLYGON_MODE_POINT specifies that polygon vertices are drawn as
-    points.
-  * ename:VK_POLYGON_MODE_LINE specifies that polygon edges are drawn as
-    line segments.
-  * ename:VK_POLYGON_MODE_FILL specifies that polygons are rendered using
-    the polygon rasterization rules in this section.
-ifdef::VK_NV_fill_rectangle[]
-  * ename:VK_POLYGON_MODE_FILL_RECTANGLE_NV specifies that polygons are
-    rendered using polygon rasterization rules, modified to consider a
-    sample within the primitive if the sample location is inside the
-    axis-aligned bounding box of the triangle after projection.
-    Note that the barycentric weights used in attribute interpolation can:
-    extend outside the range [eq]#[0,1]# when these primitives are shaded.
-    Special treatment is given to a sample position on the boundary edge of
-    the bounding box.
-    In such a case, if two rectangles lie on either side of a common edge
-    (with identical endpoints) on which a sample position lies, then exactly
-    one of the triangles must: produce a fragment that covers that sample
-    during rasterization.
-+
-Polygons rendered in ename:VK_POLYGON_MODE_FILL_RECTANGLE_NV mode may: be
-clipped by the frustum or by user clip planes.
-If clipping is applied, the triangle is culled rather than clipped.
-+
-Area calculation and facingness are determined for
-ename:VK_POLYGON_MODE_FILL_RECTANGLE_NV mode using the triangle's vertices.
-endif::VK_NV_fill_rectangle[]
-
-These modes affect only the final rasterization of polygons: in particular,
-a polygon's vertices are shaded and the polygon is clipped and possibly
-culled before these modes are applied.
---
-
-
-[[primsrast-depthbias]]
-=== Depth Bias
-
-The depth values of all fragments generated by the rasterization of a
-polygon can: be biased (offset) by a single depth bias value latexmath:[o]
-that is computed for that polygon.
-
-
-[[primsrast-depthbias-enable]]
-==== Depth Bias Enable
-
-The depth bias computation is enabled by the
-ifdef::VK_EXT_extended_dynamic_state2[]
-pname:depthBiasEnable set with flink:vkCmdSetDepthBiasEnableEXT, or the
-corresponding
-endif::VK_EXT_extended_dynamic_state2[]
-slink:VkPipelineRasterizationStateCreateInfo::pname:depthBiasEnable value
-used to create the currently active pipeline.
-If the depth bias enable is ename:VK_FALSE, no bias is applied and the
-fragment's depth values are unchanged.
-
-ifdef::VK_EXT_extended_dynamic_state2[]
-[open,refpage='vkCmdSetDepthBiasEnableEXT',desc='Control whether to bias fragment depth values dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically enable>> whether to bias fragment
-depth values, call:
-
-include::{generated}/api/protos/vkCmdSetDepthBiasEnableEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:depthBiasEnable controls whether to bias fragment depth values.
-
-This command sets the depth bias enable for subsequent drawing commands when
-the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineRasterizationStateCreateInfo::pname:depthBiasEnable value
-used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetDepthBiasEnableEXT-None-04872]]
-    The <<features-extendedDynamicState2, extendedDynamicState2>> feature
-    must: be enabled
-****
-
-include::{generated}/validity/protos/vkCmdSetDepthBiasEnableEXT.txt[]
---
-endif::VK_EXT_extended_dynamic_state2[]
-
-
-[[primsrast-depthbias-computation]]
-==== Depth Bias Computation
-
-The depth bias depends on three parameters:
-
-  * pname:depthBiasSlopeFactor scales the maximum depth slope [eq]#m# of the
-    polygon
-  * pname:depthBiasConstantFactor scales the minimum resolvable difference
-    [eq]#r# of the depth buffer
-  * the scaled terms are summed to produce a value which is then clamped to
-    a minimum or maximum value specified by pname:depthBiasClamp
-
-pname:depthBiasSlopeFactor, pname:depthBiasConstantFactor, and
-pname:depthBiasClamp can: each be positive, negative, or zero.
-These parameters are set as described for flink:vkCmdSetDepthBias below.
-
-The maximum depth slope [eq]#m# of a triangle is
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-m = \sqrt{ \left({{\partial z_f} \over {\partial x_f}}\right)^2
-        +  \left({{\partial z_f} \over {\partial y_f}}\right)^2}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-where [eq]#(x~f~, y~f~, z~f~)# is a point on the triangle.
-[eq]#m# may: be approximated as
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-m = \max\left( \left| { {\partial z_f} \over {\partial x_f} } \right|,
-               \left| { {\partial z_f} \over {\partial y_f} } \right|
-       \right).
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-The minimum resolvable difference [eq]#r# is a parameter that depends on the
-depth buffer representation.
-It is the smallest difference in framebuffer coordinate [eq]#z# values that
-is guaranteed to remain distinct throughout polygon rasterization and in the
-depth buffer.
-All pairs of fragments generated by the rasterization of two polygons with
-otherwise identical vertices, but [eq]#pname:z~f~# values that differ by
-[eq]#r#, will have distinct depth values.
-
-For fixed-point depth buffer representations, [eq]#r# is constant throughout
-the range of the entire depth buffer.
-Its value is implementation-dependent but must: be at most
-
-  {empty}:: [eq]#r = 2 {times} 2^-n^#
-
-for an n-bit buffer.
-For floating-point depth buffers, there is no single minimum resolvable
-difference.
-In this case, the minimum resolvable difference for a given polygon is
-dependent on the maximum exponent, [eq]#e#, in the range of [eq]#z# values
-spanned by the primitive.
-If [eq]#n# is the number of bits in the floating-point mantissa, the minimum
-resolvable difference, [eq]#r#, for the given primitive is defined as
-
-  {empty}:: [eq]#r = 2^e-n^#
-
-ifdef::VK_NV_fill_rectangle[]
-If a triangle is rasterized using the
-ename:VK_POLYGON_MODE_FILL_RECTANGLE_NV polygon mode, then this minimum
-resolvable difference may: not be resolvable for samples outside of the
-triangle, where the depth is extrapolated.
-endif::VK_NV_fill_rectangle[]
-
-If no depth buffer is present, [eq]#r# is undefined:.
-
-The bias value [eq]#o# for a polygon is
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\begin{aligned}
-o &= \mathrm{dbclamp}( m \times \mathtt{depthBiasSlopeFactor} + r \times \mathtt{depthBiasConstantFactor} ) \\
-\text{where} &\quad \mathrm{dbclamp}(x) =
-\begin{cases}
-    x                                 & \mathtt{depthBiasClamp} = 0 \ \text{or}\ \texttt{NaN} \\
-    \min(x, \mathtt{depthBiasClamp})  & \mathtt{depthBiasClamp} > 0 \\
-    \max(x, \mathtt{depthBiasClamp})  & \mathtt{depthBiasClamp} < 0 \\
-\end{cases}
-\end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-[eq]#m# is computed as described above.
-If the depth buffer uses a fixed-point representation, [eq]#m# is a function
-of depth values in the range [eq]#[0,1]#, and [eq]#o# is applied to depth
-values in the same range.
-
-[open,refpage='vkCmdSetDepthBias',desc='Set depth bias factors and clamp dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the depth bias parameters,
-call:
-
-include::{generated}/api/protos/vkCmdSetDepthBias.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:depthBiasConstantFactor is a scalar factor controlling the
-    constant depth value added to each fragment.
-  * pname:depthBiasClamp is the maximum (or minimum) depth bias of a
-    fragment.
-  * pname:depthBiasSlopeFactor is a scalar factor applied to a fragment's
-    slope in depth bias calculations.
-
-This command sets the depth bias parameters for subsequent drawing commands
-when the graphics pipeline is created with ename:VK_DYNAMIC_STATE_DEPTH_BIAS
-set in slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the corresponding
-slink:VkPipelineInputAssemblyStateCreateInfo::pname:depthBiasConstantFactor,
-pname:depthBiasClamp, and pname:depthBiasSlopeFactor values used to create
-the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetDepthBias-depthBiasClamp-00790]]
-    If the <<features-depthBiasClamp,depth bias clamping>> feature is not
-    enabled, pname:depthBiasClamp must: be `0.0`
-****
-
-include::{generated}/validity/protos/vkCmdSetDepthBias.txt[]
---
-
-
-ifdef::VK_EXT_conservative_rasterization[]
-[[primsrast-conservativeraster]]
-=== Conservative Rasterization
-
-[open,refpage='VkPipelineRasterizationConservativeStateCreateInfoEXT',desc='Structure specifying conservative raster state',type='structs']
---
-Polygon rasterization can: be made conservative by setting
-pname:conservativeRasterizationMode to
-ename:VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT or
-ename:VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT in
-sname:VkPipelineRasterizationConservativeStateCreateInfoEXT.
-The sname:VkPipelineRasterizationConservativeStateCreateInfoEXT state is set
-by adding this structure to the pname:pNext chain of a
-sname:VkPipelineRasterizationStateCreateInfo structure when creating the
-graphics pipeline.
-Enabling these modes also affects line and point rasterization if the
-implementation sets
-sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:conservativePointAndLineRasterization
-to ename:VK_TRUE.
-
-sname:VkPipelineRasterizationConservativeStateCreateInfoEXT is defined as:
-
-include::{generated}/api/structs/VkPipelineRasterizationConservativeStateCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:conservativeRasterizationMode is the conservative rasterization
-    mode to use.
-  * pname:extraPrimitiveOverestimationSize is the extra size in pixels to
-    increase the generating primitive during conservative rasterization at
-    each of its edges in `X` and `Y` equally in screen space beyond the base
-    overestimation specified in
-    sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:primitiveOverestimationSize.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-extraPrimitiveOverestimationSize-01769]]
-    pname:extraPrimitiveOverestimationSize must: be in the range of `0.0` to
-    sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:maxExtraPrimitiveOverestimationSize
-    inclusive
-****
-
-include::{generated}/validity/structs/VkPipelineRasterizationConservativeStateCreateInfoEXT.txt[]
---
-
-[open,refpage='VkPipelineRasterizationConservativeStateCreateFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineRasterizationConservativeStateCreateFlagsEXT.txt[]
-
-tname:VkPipelineRasterizationConservativeStateCreateFlagsEXT is a bitmask
-type for setting a mask, but is currently reserved for future use.
---
-
-[open,refpage='VkConservativeRasterizationModeEXT',desc='Specify the conservative rasterization mode',type='enums']
---
-Possible values of
-slink:VkPipelineRasterizationConservativeStateCreateInfoEXT::pname:conservativeRasterizationMode,
-specifying the conservative rasterization mode are:
-
-include::{generated}/api/enums/VkConservativeRasterizationModeEXT.txt[]
-
-  * ename:VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT specifies that
-    conservative rasterization is disabled and rasterization proceeds as
-    normal.
-  * ename:VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT specifies that
-    conservative rasterization is enabled in overestimation mode.
-  * ename:VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT specifies
-    that conservative rasterization is enabled in underestimation mode.
---
-
-When overestimate conservative rasterization is enabled, rather than
-evaluating coverage at individual sample locations, a determination is made
-of whether any portion of the pixel (including its edges and corners) is
-covered by the primitive.
-If any portion of the pixel is covered, then all bits of the
-<<primsrast-multisampling-coverage-mask, coverage mask>> for the fragment
-corresponding to that pixel are enabled.
-ifdef::VK_EXT_fragment_density_map[]
-If the render pass has a fragment density map attachment and any bit of the
-<<primsrast-multisampling-coverage-mask, coverage mask>> for the fragment is
-enabled, then all bits of the <<primsrast-multisampling-coverage-mask,
-coverage mask>> for the fragment are enabled.
-endif::VK_EXT_fragment_density_map[]
-
-For the purposes of evaluating which pixels are covered by the primitive,
-implementations can: increase the size of the primitive by up to
-sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:primitiveOverestimationSize
-pixels at each of the primitive edges.
-This may: increase the number of fragments generated by this primitive and
-represents an overestimation of the pixel coverage.
-
-This overestimation size can be increased further by setting the
-pname:extraPrimitiveOverestimationSize value above `0.0` in steps of
-sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:extraPrimitiveOverestimationSizeGranularity
-up to and including
-sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:extraPrimitiveOverestimationSize.
-This will: further increase the number of fragments generated by this
-primitive.
-
-The actual precision of the overestimation size used for conservative
-rasterization may: vary between implementations and produce results that
-only approximate the pname:primitiveOverestimationSize and
-pname:extraPrimitiveOverestimationSizeGranularity properties.
-ifdef::VK_EXT_fragment_density_map[]
-Implementations may: especially vary these approximations when the render
-pass has a fragment density map and the fragment area covers multiple
-pixels.
-endif::VK_EXT_fragment_density_map[]
-
-For triangles if ename:VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT
-is enabled, fragments will be generated if the primitive area covers any
-portion of any pixel inside the fragment area, including their edges or
-corners.
-The tie-breaking rule described in <<primsrast-polygons-basic, Basic Polygon
-Rasterization>> does not apply during conservative rasterization and
-coverage is set for all fragments generated from shared edges of polygons.
-Degenerate triangles that evaluate to zero area after rasterization, even
-for pixels containing a vertex or edge of the zero-area polygon, will be
-culled if
-sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:degenerateTrianglesRasterized
-is ename:VK_FALSE or will generate fragments if
-pname:degenerateTrianglesRasterized is ename:VK_TRUE.
-The fragment input values for these degenerate triangles take their
-attribute and depth values from the provoking vertex.
-Degenerate triangles are considered backfacing and the application can:
-enable backface culling if desired.
-Triangles that are zero area before rasterization may: be culled regardless.
-
-For lines if ename:VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT is
-enabled, and the implementation sets
-sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:conservativePointAndLineRasterization
-to ename:VK_TRUE, fragments will be generated if the line covers any portion
-of any pixel inside the fragment area, including their edges or corners.
-Degenerate lines that evaluate to zero length after rasterization will be
-culled if
-sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:degenerateLinesRasterized
-is ename:VK_FALSE or will generate fragments if
-pname:degenerateLinesRasterized is ename:VK_TRUE.
-The fragments input values for these degenerate lines take their attribute
-and depth values from the provoking vertex.
-Lines that are zero length before rasterization may: be culled regardless.
-
-For points if ename:VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT is
-enabled, and the implementation sets
-sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:conservativePointAndLineRasterization
-to ename:VK_TRUE, fragments will be generated if the point square covers any
-portion of any pixel inside the fragment area, including their edges or
-corners.
-
-When underestimate conservative rasterization is enabled, rather than
-evaluating coverage at individual sample locations, a determination is made
-of whether all of the pixel (including its edges and corners) is covered by
-the primitive.
-If the entire pixel is covered, then a fragment is generated with all bits
-of its <<primsrast-multisampling-coverage-mask, coverage mask>>
-corresponding to the pixel enabled, otherwise the pixel is not considered
-covered even if some portion of the pixel is covered.
-The fragment is discarded if no pixels inside the fragment area are
-considered covered.
-ifdef::VK_EXT_fragment_density_map[]
-If the render pass has a fragment density map attachment and any pixel
-inside the fragment area is not considered covered, then the fragment is
-discarded even if some pixels are considered covered.
-endif::VK_EXT_fragment_density_map[]
-
-For triangles, if ename:VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT
-is enabled, fragments will only be generated if any pixel inside the
-fragment area is fully covered by the generating primitive, including its
-edges and corners.
-
-For lines, if ename:VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT is
-enabled, fragments will be generated if any pixel inside the fragment area,
-including its edges and corners, are entirely covered by the line.
-
-For points, if ename:VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT is
-enabled, fragments will only be generated if the point square covers the
-entirety of any pixel square inside the fragment area, including its edges
-or corners.
-
-ifdef::VK_EXT_fragment_density_map[]
-If the render pass has a fragment density map and
-ename:VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT is enabled,
-fragments will only be generated if the entirety of all pixels inside the
-fragment area are covered by the generating primitive, line, or point.
-endif::VK_EXT_fragment_density_map[]
-
-For both overestimate and underestimate conservative rasterization modes a
-fragment has all of its pixel squares fully covered by the generating
-primitive must: set code:FullyCoveredEXT to ename:VK_TRUE if the
-implementation enables the
-sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT::pname:fullyCoveredFragmentShaderInputVariable
-feature.
-
-ifdef::VK_NV_shading_rate_image,VK_KHR_fragment_shading_rate[]
-When
-ifdef::VK_NV_shading_rate_image[]
-the use of a <<primsrast-shading-rate-image, shading rate image>>
-endif::VK_NV_shading_rate_image[]
-ifdef::VK_NV_shading_rate_image+VK_KHR_fragment_shading_rate[or]
-ifdef::VK_KHR_fragment_shading_rate[]
-setting the <<primsrast-fragment-shading-rate, fragment shading rate>>
-endif::VK_KHR_fragment_shading_rate[]
-results in fragments covering multiple pixels, coverage for conservative
-rasterization is still evaluated on a per-pixel basis and may result in
-fragments with partial coverage.
-For fragment shader inputs decorated with code:FullyCoveredEXT, a fragment
-is considered fully covered if and only if all pixels in the fragment are
-fully covered by the generating primitive.
-endif::VK_NV_shading_rate_image,VK_KHR_fragment_shading_rate[]
-
-endif::VK_EXT_conservative_rasterization[]
diff --git a/registry/vulkan/chapters/queries.txt b/registry/vulkan/chapters/queries.txt
deleted file mode 100644
index 4f7a6e2..0000000
--- a/registry/vulkan/chapters/queries.txt
+++ /dev/null
@@ -1,1686 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[queries]]
-= Queries
-
-_Queries_ provide a mechanism to return information about the processing of
-a sequence of Vulkan commands.
-Query operations are asynchronous, and as such, their results are not
-returned immediately.
-Instead, their results, and their availability status are stored in a
-<<queries-pools, Query Pool>>.
-The state of these queries can: be read back on the host, or copied to a
-buffer object on the device.
-
-The supported query types are <<queries-occlusion,Occlusion Queries>>,
-<<queries-pipestats,Pipeline Statistics Queries>>,
-ifdef::VK_KHR_video_queue[]
-<<queries-result-status-only, Result Status Queries>>,
-endif::VK_KHR_video_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-<<queries-video-encode-bitstream-buffer-range, Video Encode Bitstream
-Queries>>,
-endif::VK_KHR_video_encode_queue[]
-and <<queries-timestamps, Timestamp Queries>>.
-ifdef::VK_KHR_performance_query[]
-<<queries-performance, Performance Queries>> are supported if the associated
-extension is available.
-endif::VK_KHR_performance_query[]
-ifdef::VK_EXT_transform_feedback[]
-<<queries-transform-feedback, Transform Feedback Queries>> are supported if
-the associated extension is available.
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_INTEL_performance_query[]
-<<queries-performance-intel>> are supported if the associated extension is
-available.
-endif::VK_INTEL_performance_query[]
-
-ifdef::VK_KHR_acceleration_structure,VK_NV_ray_tracing[]
-Several additional queries with specific purposes associated with ray
-tracing are available if the corresponding extensions are supported, as
-described for elink:VkQueryType.
-endif::VK_KHR_acceleration_structure,VK_NV_ray_tracing[]
-
-
-[[queries-pools]]
-== Query Pools
-
-[open,refpage='VkQueryPool',desc='Opaque handle to a query pool object',type='handles']
---
-Queries are managed using _query pool_ objects.
-Each query pool is a collection of a specific number of queries of a
-particular type.
-
-Query pools are represented by sname:VkQueryPool handles:
-
-include::{generated}/api/handles/VkQueryPool.txt[]
---
-
-[open,refpage='vkCreateQueryPool',desc='Create a new query pool object',type='protos']
---
-To create a query pool, call:
-
-include::{generated}/api/protos/vkCreateQueryPool.txt[]
-
-  * pname:device is the logical device that creates the query pool.
-  * pname:pCreateInfo is a pointer to a slink:VkQueryPoolCreateInfo
-    structure containing the number and type of queries to be managed by the
-    pool.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pQueryPool is a pointer to a slink:VkQueryPool handle in which the
-    resulting query pool object is returned.
-
-include::{generated}/validity/protos/vkCreateQueryPool.txt[]
---
-
-[open,refpage='VkQueryPoolCreateInfo',desc='Structure specifying parameters of a newly created query pool',type='structs']
---
-The sname:VkQueryPoolCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkQueryPoolCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:queryType is a elink:VkQueryType value specifying the type of
-    queries managed by the pool.
-  * pname:queryCount is the number of queries managed by the pool.
-  * pname:pipelineStatistics is a bitmask of
-    elink:VkQueryPipelineStatisticFlagBits specifying which counters will be
-    returned in queries on the new pool, as described below in
-    <<queries-pipestats>>.
-
-pname:pipelineStatistics is ignored if pname:queryType is not
-ename:VK_QUERY_TYPE_PIPELINE_STATISTICS.
-
-.Valid Usage
-****
-  * [[VUID-VkQueryPoolCreateInfo-queryType-00791]]
-    If the <<features-pipelineStatisticsQuery,pipeline statistics queries>>
-    feature is not enabled, pname:queryType must: not be
-    ename:VK_QUERY_TYPE_PIPELINE_STATISTICS
-  * [[VUID-VkQueryPoolCreateInfo-queryType-00792]]
-    If pname:queryType is ename:VK_QUERY_TYPE_PIPELINE_STATISTICS,
-    pname:pipelineStatistics must: be a valid combination of
-    elink:VkQueryPipelineStatisticFlagBits values
-ifdef::VK_KHR_performance_query[]
-  * [[VUID-VkQueryPoolCreateInfo-queryType-03222]]
-    If pname:queryType is ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the
-    pname:pNext chain must: include a
-    slink:VkQueryPoolPerformanceCreateInfoKHR structure
-endif::VK_KHR_performance_query[]
-  * [[VUID-VkQueryPoolCreateInfo-queryCount-02763]]
-    pname:queryCount must: be greater than 0
-****
-
-include::{generated}/validity/structs/VkQueryPoolCreateInfo.txt[]
---
-
-[open,refpage='VkQueryPoolCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkQueryPoolCreateFlags.txt[]
-
-tname:VkQueryPoolCreateFlags is a bitmask type for setting a mask, but is
-currently reserved for future use.
---
-
-ifdef::VK_KHR_performance_query[]
-include::VK_KHR_performance_query/querycreateinfo.txt[]
-endif::VK_KHR_performance_query[]
-
-[open,refpage='vkDestroyQueryPool',desc='Destroy a query pool object',type='protos']
---
-To destroy a query pool, call:
-
-include::{generated}/api/protos/vkDestroyQueryPool.txt[]
-
-  * pname:device is the logical device that destroys the query pool.
-  * pname:queryPool is the query pool to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyQueryPool-queryPool-00793]]
-    All submitted commands that refer to pname:queryPool must: have
-    completed execution
-  * [[VUID-vkDestroyQueryPool-queryPool-00794]]
-    If sname:VkAllocationCallbacks were provided when pname:queryPool was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyQueryPool-queryPool-00795]]
-    If no sname:VkAllocationCallbacks were provided when pname:queryPool was
-    created, pname:pAllocator must: be `NULL`
-****
-
-[NOTE]
-.Note
-====
-Applications can: verify that pname:queryPool can: be destroyed by checking
-that fname:vkGetQueryPoolResults() without the
-ename:VK_QUERY_RESULT_PARTIAL_BIT flag returns ename:VK_SUCCESS for all
-queries that are used in command buffers submitted for execution.
-====
-
-include::{generated}/validity/protos/vkDestroyQueryPool.txt[]
---
-
-[open,refpage='VkQueryType',desc='Specify the type of queries managed by a query pool',type='enums']
---
-Possible values of slink:VkQueryPoolCreateInfo::pname:queryType, specifying
-the type of queries managed by the pool, are:
-
-include::{generated}/api/enums/VkQueryType.txt[]
-
-  * ename:VK_QUERY_TYPE_OCCLUSION specifies an <<queries-occlusion,
-    occlusion query>>.
-  * ename:VK_QUERY_TYPE_PIPELINE_STATISTICS specifies a <<queries-pipestats,
-    pipeline statistics query>>.
-  * ename:VK_QUERY_TYPE_TIMESTAMP specifies a <<queries-timestamps,
-    timestamp query>>.
-ifdef::VK_KHR_performance_query[]
-  * ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR specifies a
-    <<queries-performance, performance query>>.
-endif::VK_KHR_performance_query[]
-ifdef::VK_EXT_transform_feedback[]
-  * ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT specifies a
-    <<queries-transform-feedback, transform feedback query>>.
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_KHR_acceleration_structure[]
-  * ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR specifies
-    a <<acceleration-structure-copying, acceleration structure size query>>
-    for use with flink:vkCmdWriteAccelerationStructuresPropertiesKHR or
-    flink:vkWriteAccelerationStructuresPropertiesKHR.
-  * ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR
-    specifies a <<acceleration-structure-copying, serialization acceleration
-    structure size query>>
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_NV_ray_tracing[]
-  * ename:VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV specifies a
-    <<acceleration-structure-copying, acceleration structure size query>>
-    for use with flink:vkCmdWriteAccelerationStructuresPropertiesNV.
-endif::VK_NV_ray_tracing[]
-ifdef::VK_INTEL_performance_query[]
-  * ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL specifies a
-    <<queries-performance-intel, Intel performance query>>.
-endif::VK_INTEL_performance_query[]
-ifdef::VK_KHR_video_queue[]
-  * ename:VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR specifies a
-    <<queries-result-status-only, result status query>>.
-endif::VK_KHR_video_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-  * ename:VK_QUERY_TYPE_VIDEO_ENCODE_BITSTREAM_BUFFER_RANGE_KHR specifies a
-    <<queries-video-encode-bitstream-buffer-range, video encode bitstream
-    range query>>.
-endif::VK_KHR_video_encode_queue[]
---
-
-
-[[queries-operation]]
-== Query Operation
-
-The operation of queries is controlled by the commands
-flink:vkCmdBeginQuery, flink:vkCmdEndQuery,
-ifdef::VK_EXT_transform_feedback[]
-flink:vkCmdBeginQueryIndexedEXT, flink:vkCmdEndQueryIndexedEXT,
-endif::VK_EXT_transform_feedback[]
-flink:vkCmdResetQueryPool, flink:vkCmdCopyQueryPoolResults,
-ifdef::VK_KHR_synchronization2[]
-flink:vkCmdWriteTimestamp2KHR,
-endif::VK_KHR_synchronization2[]
-and flink:vkCmdWriteTimestamp.
-
-In order for a sname:VkCommandBuffer to record query management commands,
-the queue family for which its sname:VkCommandPool was created must: support
-the appropriate type of operations (graphics, compute) suitable for the
-query type of a given query pool.
-
-Each query in a query pool has a status that is either _unavailable_ or
-_available_, and also has state to store the numerical results of a query
-operation of the type requested when the query pool was created.
-Resetting a query via flink:vkCmdResetQueryPool
-ifdef::VK_VERSION_1_2,VK_EXT_host_query_reset[]
-or flink:vkResetQueryPool
-endif::VK_VERSION_1_2,VK_EXT_host_query_reset[]
-sets the status to unavailable and makes the numerical results undefined:.
-Performing a query operation with flink:vkCmdBeginQuery and
-flink:vkCmdEndQuery changes the status to available when the query
-<<queries-operation-finished,finishes>>, and updates the numerical results.
-Both the availability status and numerical results are retrieved by calling
-either flink:vkGetQueryPoolResults or flink:vkCmdCopyQueryPoolResults.
-
-[[queries-order]]
-Query commands, for the same query and submitted to the same queue, execute
-in their entirety in <<synchronization-submission-order, submission order>>,
-relative to each other.
-In effect there is an implicit execution dependency from each such query
-command to all query commands previously submitted to the same queue.
-There is one significant exception to this; if the pname:flags parameter of
-flink:vkCmdCopyQueryPoolResults does not include
-ename:VK_QUERY_RESULT_WAIT_BIT, execution of flink:vkCmdCopyQueryPoolResults
-may: happen-before the results of flink:vkCmdEndQuery are available.
-
-After query pool creation, each query must: be reset before it is used.
-Queries must: also be reset between uses.
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-
-If a logical device includes multiple physical devices, then each command
-that writes a query must: execute on a single physical device, and any call
-to flink:vkCmdBeginQuery must: execute the corresponding flink:vkCmdEndQuery
-command on the same physical device.
-
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-[open,refpage='vkCmdResetQueryPool',desc='Reset queries in a query pool',type='protos']
---
-To reset a range of queries in a query pool on a queue, call:
-
-include::{generated}/api/protos/vkCmdResetQueryPool.txt[]
-
-  * pname:commandBuffer is the command buffer into which this command will
-    be recorded.
-  * pname:queryPool is the handle of the query pool managing the queries
-    being reset.
-  * pname:firstQuery is the initial query index to reset.
-  * pname:queryCount is the number of queries to reset.
-
-When executed on a queue, this command sets the status of query indices
-[eq]#[pname:firstQuery, pname:firstQuery {plus} pname:queryCount - 1]# to
-unavailable.
-
-ifdef::VK_KHR_performance_query[]
-If the pname:queryType used to create pname:queryPool was
-ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, this command sets the status of
-query indices [eq]#[pname:firstQuery, pname:firstQuery {plus}
-pname:queryCount - 1]# to unavailable for each pass of pname:queryPool, as
-indicated by a call to
-flink:vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR.
-
-[NOTE]
-.Note
-====
-Because fname:vkCmdResetQueryPool resets all the passes of the indicated
-queries, applications must not record a fname:vkCmdResetQueryPool command
-for a pname:queryPool created with ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR
-in a command buffer that needs to be submitted multiple times as indicated
-by a call to flink:vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR.
-Otherwise applications will never be able to complete the recorded queries.
-====
-endif::VK_KHR_performance_query[]
-
-
-.Valid Usage
-****
-  * [[VUID-vkCmdResetQueryPool-firstQuery-00796]]
-    pname:firstQuery must: be less than the number of queries in
-    pname:queryPool
-  * [[VUID-vkCmdResetQueryPool-firstQuery-00797]]
-    The sum of pname:firstQuery and pname:queryCount must: be less than or
-    equal to the number of queries in pname:queryPool
-  * [[VUID-vkCmdResetQueryPool-None-02841]]
-    All queries used by the command must: not be active
-ifdef::VK_KHR_performance_query[]
-  * [[VUID-vkCmdResetQueryPool-firstQuery-02862]]
-    If pname:queryPool was created with
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, this command must: not be
-    recorded in a command buffer that, either directly or through secondary
-    command buffers, also contains begin commands for a query from the set
-    of queries [eq]#[pname:firstQuery, pname:firstQuery {plus}
-    pname:queryCount - 1]#
-endif::VK_KHR_performance_query[]
-****
-
-include::{generated}/validity/protos/vkCmdResetQueryPool.txt[]
---
-
-ifdef::VK_VERSION_1_2,VK_EXT_host_query_reset[]
-[open,refpage='vkResetQueryPool',desc='Reset queries in a query pool',type='protos',alias='vkResetQueryPoolEXT']
---
-To reset a range of queries in a query pool on the host, call:
-
-ifdef::VK_VERSION_1_2[]
-include::{generated}/api/protos/vkResetQueryPool.txt[]
-endif::VK_VERSION_1_2[]
-
-ifdef::VK_VERSION_1_2+VK_EXT_host_query_reset[or the equivalent command]
-
-ifdef::VK_EXT_host_query_reset[]
-include::{generated}/api/protos/vkResetQueryPoolEXT.txt[]
-endif::VK_EXT_host_query_reset[]
-
-  * pname:device is the logical device that owns the query pool.
-  * pname:queryPool is the handle of the query pool managing the queries
-    being reset.
-  * pname:firstQuery is the initial query index to reset.
-  * pname:queryCount is the number of queries to reset.
-
-This command sets the status of query indices [eq]#[pname:firstQuery,
-pname:firstQuery {plus} pname:queryCount - 1]# to unavailable.
-
-ifdef::VK_KHR_performance_query[]
-If pname:queryPool is ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR this command
-sets the status of query indices [eq]#[pname:firstQuery, pname:firstQuery
-{plus} pname:queryCount - 1]# to unavailable for each pass.
-endif::VK_KHR_performance_query[]
-
-.Valid Usage
-****
-  * [[VUID-vkResetQueryPool-None-02665]]
-    The <<features-hostQueryReset,hostQueryReset>> feature must: be enabled
-  * [[VUID-vkResetQueryPool-firstQuery-02666]]
-    pname:firstQuery must: be less than the number of queries in
-    pname:queryPool
-  * [[VUID-vkResetQueryPool-firstQuery-02667]]
-    The sum of pname:firstQuery and pname:queryCount must: be less than or
-    equal to the number of queries in pname:queryPool
-  * [[VUID-vkResetQueryPool-firstQuery-02741]]
-    Submitted commands that refer to the range specified by pname:firstQuery
-    and pname:queryCount in pname:queryPool must: have completed execution
-  * [[VUID-vkResetQueryPool-firstQuery-02742]]
-    The range of queries specified by pname:firstQuery and pname:queryCount
-    in pname:queryPool must: not be in use by calls to
-    flink:vkGetQueryPoolResults or fname:vkResetQueryPool in other threads
-****
-
-include::{generated}/validity/protos/vkResetQueryPool.txt[]
---
-endif::VK_VERSION_1_2,VK_EXT_host_query_reset[]
-
-Once queries are reset and ready for use, query commands can: be issued to a
-command buffer.
-Occlusion queries and pipeline statistics queries count events - drawn
-samples and pipeline stage invocations, respectively - resulting from
-commands that are recorded between a flink:vkCmdBeginQuery command and a
-flink:vkCmdEndQuery command within a specified command buffer, effectively
-scoping a set of drawing and/or dispatching commands.
-Timestamp queries write timestamps to a query pool.
-ifdef::VK_KHR_performance_query[]
-Performance queries record performance counters to a query pool.
-endif::VK_KHR_performance_query[]
-
-A query must: begin and end in the same command buffer, although if it is a
-primary command buffer, and the <<features-inheritedQueries,inherited
-queries>> feature is enabled, it can: execute secondary command buffers
-during the query operation.
-For a secondary command buffer to be executed while a query is active, it
-must: set the pname:occlusionQueryEnable, pname:queryFlags, and/or
-pname:pipelineStatistics members of slink:VkCommandBufferInheritanceInfo to
-conservative values, as described in the <<commandbuffers-recording, Command
-Buffer Recording>> section.
-A query must: either begin and end inside the same subpass of a render pass
-instance, or must: both begin and end outside of a render pass instance
-(i.e. contain entire render pass instances).
-
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-
-If queries are used while executing a render pass instance that has
-multiview enabled, the query uses [eq]#N# consecutive query indices in the
-query pool (starting at pname:query) where [eq]#N# is the number of bits set
-in the view mask in the subpass the query is used in.
-How the numerical results of the query are distributed among the queries is
-implementation-dependent.
-For example, some implementations may: write each view's results to a
-distinct query, while other implementations may: write the total result to
-the first query and write zero to the other queries.
-However, the sum of the results in all the queries must: accurately reflect
-the total result of the query summed over all views.
-Applications can: sum the results from all the queries to compute the total
-result.
-
-Queries used with multiview rendering must: not span subpasses, i.e. they
-must: begin and end in the same subpass.
-
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-[open,refpage='vkCmdBeginQuery',desc='Begin a query',type='protos']
---
-:refpage: vkCmdBeginQuery
-
-To begin a query, call:
-
-include::{generated}/api/protos/vkCmdBeginQuery.txt[]
-
-  * pname:commandBuffer is the command buffer into which this command will
-    be recorded.
-  * pname:queryPool is the query pool that will manage the results of the
-    query.
-  * pname:query is the query index within the query pool that will contain
-    the results.
-  * pname:flags is a bitmask of elink:VkQueryControlFlagBits specifying
-    constraints on the types of queries that can: be performed.
-
-If the pname:queryType of the pool is ename:VK_QUERY_TYPE_OCCLUSION and
-pname:flags contains ename:VK_QUERY_CONTROL_PRECISE_BIT, an implementation
-must: return a result that matches the actual number of samples passed.
-This is described in more detail in <<queries-occlusion,Occlusion Queries>>.
-
-ifdef::VK_EXT_transform_feedback[]
-Calling fname:vkCmdBeginQuery is equivalent to calling
-flink:vkCmdBeginQueryIndexedEXT with the pname:index parameter set to zero.
-endif::VK_EXT_transform_feedback[]
-
-[[queries-operation-active]]
-After beginning a query, that query is considered _active_ within the
-command buffer it was called in until that same query is ended.
-Queries active in a primary command buffer when secondary command buffers
-are executed are considered active for those secondary command buffers.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/query_begin_common.txt[]
-  * [[VUID-vkCmdBeginQuery-queryPool-01922]]
-    pname:queryPool must: have been created with a pname:queryType that
-    differs from that of any queries that are
-    <<queries-operation-active,active>> within pname:commandBuffer
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-vkCmdBeginQuery-queryType-02327]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the
-    sname:VkCommandPool that pname:commandBuffer was allocated from must:
-    support graphics operations
-  * [[VUID-vkCmdBeginQuery-queryType-02328]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT then
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:transformFeedbackQueries
-    must: be supported
-endif::VK_EXT_transform_feedback[]
-include::{chapters}/commonvalidity/performance_query_begin_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdBeginQuery.txt[]
---
-
-ifdef::VK_EXT_transform_feedback[]
-[open,refpage='vkCmdBeginQueryIndexedEXT',desc='Begin an indexed query',type='protos']
---
-:refpage: vkCmdBeginQueryIndexedEXT
-
-To begin an indexed query, call:
-
-include::{generated}/api/protos/vkCmdBeginQueryIndexedEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which this command will
-    be recorded.
-  * pname:queryPool is the query pool that will manage the results of the
-    query.
-  * pname:query is the query index within the query pool that will contain
-    the results.
-  * pname:flags is a bitmask of elink:VkQueryControlFlagBits specifying
-    constraints on the types of queries that can: be performed.
-  * pname:index is the query type specific index.
-    When the query type is ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT
-    the index represents the vertex stream.
-
-The fname:vkCmdBeginQueryIndexedEXT command operates the same as the
-flink:vkCmdBeginQuery command, except that it also accepts a query type
-specific pname:index parameter.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/query_begin_common.txt[]
-  * [[VUID-vkCmdBeginQueryIndexedEXT-queryPool-04753]]
-    If the pname:queryPool was created with the same pname:queryType as that
-    of another <<queries-operation-active,active>> query within
-    pname:commandBuffer, then pname:index must: not match the index used for
-    the active query
-  * [[VUID-vkCmdBeginQueryIndexedEXT-queryType-02338]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the
-    sname:VkCommandPool that pname:commandBuffer was allocated from must:
-    support graphics operations
-  * [[VUID-vkCmdBeginQueryIndexedEXT-queryType-02339]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the pname:index
-    parameter must: be less than
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackStreams
-  * [[VUID-vkCmdBeginQueryIndexedEXT-queryType-02340]]
-    If the pname:queryType used to create pname:queryPool was not
-    ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the pname:index must:
-    be zero
-  * [[VUID-vkCmdBeginQueryIndexedEXT-queryType-02341]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT then
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:transformFeedbackQueries
-    must: be supported
-include::{chapters}/commonvalidity/performance_query_begin_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdBeginQueryIndexedEXT.txt[]
---
-endif::VK_EXT_transform_feedback[]
-
-[open,refpage='VkQueryControlFlagBits',desc='Bitmask specifying constraints on a query',type='enums']
---
-Bits which can: be set in flink:vkCmdBeginQuery::pname:flags, specifying
-constraints on the types of queries that can: be performed, are:
-
-include::{generated}/api/enums/VkQueryControlFlagBits.txt[]
-
-  * ename:VK_QUERY_CONTROL_PRECISE_BIT specifies the precision of
-    <<queries-occlusion, occlusion queries>>.
---
-
-[open,refpage='VkQueryControlFlags',desc='Bitmask of VkQueryControlFlagBits',type='flags']
---
-include::{generated}/api/flags/VkQueryControlFlags.txt[]
-
-tname:VkQueryControlFlags is a bitmask type for setting a mask of zero or
-more elink:VkQueryControlFlagBits.
---
-
-[open,refpage='vkCmdEndQuery',desc='Ends a query',type='protos']
---
-To end a query after the set of desired drawing or dispatching commands is
-executed, call:
-
-include::{generated}/api/protos/vkCmdEndQuery.txt[]
-
-  * pname:commandBuffer is the command buffer into which this command will
-    be recorded.
-  * pname:queryPool is the query pool that is managing the results of the
-    query.
-  * pname:query is the query index within the query pool where the result is
-    stored.
-
-ifdef::VK_EXT_transform_feedback[]
-Calling fname:vkCmdEndQuery is equivalent to calling
-flink:vkCmdEndQueryIndexedEXT with the pname:index parameter set to zero.
-endif::VK_EXT_transform_feedback[]
-
-[[queries-operation-finished]]
-As queries operate asynchronously, ending a query does not immediately set
-the query's status to available.
-A query is considered _finished_ when the final results of the query are
-ready to be retrieved by flink:vkGetQueryPoolResults and
-flink:vkCmdCopyQueryPoolResults, and this is when the query's status is set
-to available.
-
-Once a query is ended the query must: finish in finite time, unless the
-state of the query is changed using other commands, e.g. by issuing a reset
-of the query.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdEndQuery-None-01923]]
-    All queries used by the command must: be
-    <<queries-operation-active,active>>
-  * [[VUID-vkCmdEndQuery-query-00810]]
-    pname:query must: be less than the number of queries in pname:queryPool
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-vkCmdEndQuery-commandBuffer-01886]]
-    pname:commandBuffer must: not be a protected command buffer
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-vkCmdEndQuery-query-00812]]
-    If fname:vkCmdEndQuery is called within a render pass instance, the sum
-    of pname:query and the number of bits set in the current subpass's view
-    mask must: be less than or equal to the number of queries in
-    pname:queryPool
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifdef::VK_KHR_performance_query[]
-  * [[VUID-vkCmdEndQuery-queryPool-03227]]
-    If pname:queryPool was created with a pname:queryType of
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one or more of the
-    counters used to create pname:queryPool was
-    ename:VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR, the
-    flink:vkCmdEndQuery must: be the last recorded command in
-    pname:commandBuffer
-  * [[VUID-vkCmdEndQuery-queryPool-03228]]
-    If pname:queryPool was created with a pname:queryType of
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one or more of the
-    counters used to create pname:queryPool was
-    ename:VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR, the
-    flink:vkCmdEndQuery must: not be recorded within a render pass instance
-endif::VK_KHR_performance_query[]
-****
-
-include::{generated}/validity/protos/vkCmdEndQuery.txt[]
---
-
-ifdef::VK_EXT_transform_feedback[]
-[open,refpage='vkCmdEndQueryIndexedEXT',desc='Ends a query',type='protos']
---
-To end an indexed query after the set of desired drawing or dispatching
-commands is recorded, call:
-
-include::{generated}/api/protos/vkCmdEndQueryIndexedEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which this command will
-    be recorded.
-  * pname:queryPool is the query pool that is managing the results of the
-    query.
-  * pname:query is the query index within the query pool where the result is
-    stored.
-  * pname:index is the query type specific index.
-
-The fname:vkCmdEndQueryIndexedEXT command operates the same as the
-flink:vkCmdEndQuery command, except that it also accepts a query type
-specific pname:index parameter.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdEndQueryIndexedEXT-None-02342]]
-    All queries used by the command must: be
-    <<queries-operation-active,active>>
-  * [[VUID-vkCmdEndQueryIndexedEXT-query-02343]]
-    pname:query must: be less than the number of queries in pname:queryPool
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-vkCmdEndQueryIndexedEXT-commandBuffer-02344]]
-    pname:commandBuffer must: not be a protected command buffer
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-vkCmdEndQueryIndexedEXT-query-02345]]
-    If fname:vkCmdEndQueryIndexedEXT is called within a render pass
-    instance, the sum of pname:query and the number of bits set in the
-    current subpass's view mask must: be less than or equal to the number of
-    queries in pname:queryPool
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-vkCmdEndQueryIndexedEXT-queryType-02346]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the pname:index
-    parameter must: be less than
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackStreams
-  * [[VUID-vkCmdEndQueryIndexedEXT-queryType-02347]]
-    If the pname:queryType used to create pname:queryPool was not
-    ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the pname:index must:
-    be zero
-  * [[VUID-vkCmdEndQueryIndexedEXT-queryType-02723]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT pname:index must:
-    equal the pname:index used to begin the query
-
-****
-
-include::{generated}/validity/protos/vkCmdEndQueryIndexedEXT.txt[]
---
-endif::VK_EXT_transform_feedback[]
-
-[[queries-operation-memorylayout]]
-An application can: retrieve results either by requesting they be written
-into application-provided memory, or by requesting they be copied into a
-sname:VkBuffer.
-In either case, the layout in memory is defined as follows:
-
-  * The first query's result is written starting at the first byte requested
-    by the command, and each subsequent query's result begins pname:stride
-    bytes later.
-  * Occlusion queries, pipeline statistics queries,
-ifdef::VK_EXT_transform_feedback[]
-    transform feedback queries,
-endif::VK_EXT_transform_feedback[]
-    and timestamp queries store results in a tightly packed array of
-    unsigned integers, either 32- or 64-bits as requested by the command,
-    storing the numerical results and, if requested, the availability
-    status.
-ifdef::VK_KHR_performance_query[]
-  * Performance queries store results in a tightly packed array whose type
-    is determined by the pname:unit member of the corresponding
-    slink:VkPerformanceCounterKHR.
-endif::VK_KHR_performance_query[]
-  * If ename:VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is used, the final
-    element of each query's result is an integer indicating whether the
-    query's result is available, with any non-zero value indicating that it
-    is available.
-ifdef::VK_KHR_video_queue[]
-  * If ename:VK_QUERY_RESULT_WITH_STATUS_BIT_KHR is used, the final element
-    of each query's result is an integer value indicating that status of the
-    query result.
-    Positive values indicate success, negative values indicate failure, and
-    0 indicates that the result is not yet available.
-    Specific error codes are encoded in the elink:VkQueryResultStatusKHR
-    enumeration.
-endif::VK_KHR_video_queue[]
-  * Occlusion queries write one integer value - the number of samples
-    passed.
-    Pipeline statistics queries write one integer value for each bit that is
-    enabled in the pname:pipelineStatistics when the pool is created, and
-    the statistics values are written in bit order starting from the least
-    significant bit.
-    Timestamp queries write one integer value.
-ifdef::VK_KHR_performance_query[]
-    Performance queries write one slink:VkPerformanceCounterResultKHR value
-    for each slink:VkPerformanceCounterKHR in the query.
-endif::VK_KHR_performance_query[]
-ifdef::VK_EXT_transform_feedback[]
-    Transform feedback queries write two integers; the first integer is the
-    number of primitives successfully written to the corresponding transform
-    feedback buffer and the second is the number of primitives output to the
-    vertex stream, regardless of whether they were successfully captured or
-    not.
-    In other words, if the transform feedback buffer was sized too small for
-    the number of primitives output by the vertex stream, the first integer
-    represents the number of primitives actually written and the second is
-    the number that would have been written if all the transform feedback
-    buffers associated with that vertex stream were large enough.
-endif::VK_EXT_transform_feedback[]
-  * If more than one query is retrieved and pname:stride is not at least as
-    large as the size of the array of values corresponding to a single
-    query, the values written to memory are undefined:.
-
-[open,refpage='vkGetQueryPoolResults',desc='Copy results of queries in a query pool to a host memory region',type='protos']
---
-To retrieve status and results for a set of queries, call:
-
-include::{generated}/api/protos/vkGetQueryPoolResults.txt[]
-
-  * pname:device is the logical device that owns the query pool.
-  * pname:queryPool is the query pool managing the queries containing the
-    desired results.
-  * pname:firstQuery is the initial query index.
-  * pname:queryCount is the number of queries to read.
-  * pname:dataSize is the size in bytes of the buffer pointed to by
-    pname:pData.
-  * pname:pData is a pointer to a user-allocated buffer where the results
-    will be written
-  * pname:stride is the stride in bytes between results for individual
-    queries within pname:pData.
-  * pname:flags is a bitmask of elink:VkQueryResultFlagBits specifying how
-    and when results are returned.
-
-The range of queries read is defined by [eq]#[pname:firstQuery,
-pname:firstQuery {plus} pname:queryCount - 1]#.
-For pipeline statistics queries, each query index in the pool contains one
-integer value for each bit that is enabled in
-slink:VkQueryPoolCreateInfo::pname:pipelineStatistics when the pool is
-created.
-
-If no bits are set in pname:flags, and all requested queries are in the
-available state, results are written as an array of 32-bit unsigned integer
-values.
-The behavior when not all queries are available, is described
-<<queries-wait-bit-not-set, below>>.
-
-If ename:VK_QUERY_RESULT_64_BIT is not set and the result overflows a 32-bit
-value, the value may: either wrap or saturate.
-Similarly, if ename:VK_QUERY_RESULT_64_BIT is set and the result overflows a
-64-bit value, the value may: either wrap or saturate.
-
-If ename:VK_QUERY_RESULT_WAIT_BIT is set, Vulkan will wait for each query to
-be in the available state before retrieving the numerical results for that
-query.
-In this case, fname:vkGetQueryPoolResults is guaranteed to succeed and
-return ename:VK_SUCCESS if the queries become available in a finite time
-(i.e. if they have been issued and not reset).
-If queries will never finish (e.g. due to being reset but not issued), then
-fname:vkGetQueryPoolResults may: not return in finite time.
-
-[[queries-wait-bit-not-set]]
-If ename:VK_QUERY_RESULT_WAIT_BIT and ename:VK_QUERY_RESULT_PARTIAL_BIT are
-both not set then no result values are written to pname:pData for queries
-that are in the unavailable state at the time of the call, and
-fname:vkGetQueryPoolResults returns ename:VK_NOT_READY.
-However, availability state is still written to pname:pData for those
-queries if ename:VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is set.
-ifdef::VK_KHR_video_queue[]
-Similarly, the status is still written to pname:pData for those queries if
-ename:VK_QUERY_RESULT_WITH_STATUS_BIT_KHR is set.
-endif::VK_KHR_video_queue[]
-
-If ename:VK_QUERY_RESULT_WAIT_BIT is not set, fname:vkGetQueryPoolResults
-may: return ename:VK_NOT_READY if there are queries in the unavailable
-state.
-
-[NOTE]
-.Note
-====
-Applications must: take care to ensure that use of the
-ename:VK_QUERY_RESULT_WAIT_BIT bit has the desired effect.
-
-For example, if a query has been used previously and a command buffer
-records the commands fname:vkCmdResetQueryPool, fname:vkCmdBeginQuery, and
-fname:vkCmdEndQuery for that query, then the query will remain in the
-available state until
-ifdef::VK_VERSION_1_2,VK_EXT_host_query_reset[]
-fname:vkResetQueryPool is called or
-endif::VK_VERSION_1_2,VK_EXT_host_query_reset[]
-the fname:vkCmdResetQueryPool command executes on a queue.
-Applications can: use fences or events to ensure that a query has already
-been reset before checking for its results or availability status.
-Otherwise, a stale value could be returned from a previous use of the query.
-
-The above also applies when ename:VK_QUERY_RESULT_WAIT_BIT is used in
-combination with ename:VK_QUERY_RESULT_WITH_AVAILABILITY_BIT.
-In this case, the returned availability status may: reflect the result of a
-previous use of the query unless
-ifdef::VK_VERSION_1_2,VK_EXT_host_query_reset[]
-fname:vkResetQueryPool is called or
-endif::VK_VERSION_1_2,VK_EXT_host_query_reset[]
-the fname:vkCmdResetQueryPool command has been executed since the last use
-of the query.
-
-ifdef::VK_KHR_video_queue[]
-A similar situation can arise with the
-ename:VK_QUERY_RESULT_WITH_STATUS_BIT_KHR flag.
-endif::VK_KHR_video_queue[]
-====
-
-[NOTE]
-.Note
-====
-Applications can: double-buffer query pool usage, with a pool per frame, and
-reset queries at the end of the frame in which they are read.
-====
-
-If ename:VK_QUERY_RESULT_PARTIAL_BIT is set, ename:VK_QUERY_RESULT_WAIT_BIT
-is not set, and the query's status is unavailable, an intermediate result
-value between zero and the final result value is written to pname:pData for
-that query.
-
-If ename:VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is set, the final integer
-value written for each query is non-zero if the query's status was available
-or zero if the status was unavailable.
-When ename:VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is used, implementations
-must: guarantee that if they return a non-zero availability value then the
-numerical results must: be valid, assuming the results are not reset by a
-subsequent command.
-
-[NOTE]
-.Note
-====
-Satisfying this guarantee may: require careful ordering by the application,
-e.g. to read the availability status before reading the results.
-====
-
-ifdef::VK_KHR_video_queue[]
-If ename:VK_QUERY_RESULT_WITH_STATUS_BIT_KHR is set, the final integer value
-written for each query indicates whether the result is available or not, and
-whether an error occurred.
-A value of zero indicates that the results are not yet available.
-Positive values indicate that the operations within the query completed
-successfully, and the query results are valid.
-Negative values indicate that the operations within the query completed
-unsuccessfully.
-
-Specific result codes are defined by the elink:VkQueryResultStatusKHR
-enumeration.
-endif::VK_KHR_video_queue[]
-
-.Valid Usage
-****
-  * [[VUID-vkGetQueryPoolResults-firstQuery-00813]]
-    pname:firstQuery must: be less than the number of queries in
-    pname:queryPool
-ifndef::VK_KHR_performance_query[]
-  * [[VUID-vkGetQueryPoolResults-flags-02827]]
-    If ename:VK_QUERY_RESULT_64_BIT is not set in pname:flags, then
-    pname:pData and pname:stride must: be multiples of `4`
-endif::VK_KHR_performance_query[]
-ifdef::VK_KHR_performance_query[]
-  * [[VUID-vkGetQueryPoolResults-flags-02828]]
-    If ename:VK_QUERY_RESULT_64_BIT is not set in pname:flags and the
-    pname:queryType used to create pname:queryPool was not
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, then pname:pData and
-    pname:stride must: be multiples of `4`
-endif::VK_KHR_performance_query[]
-  * [[VUID-vkGetQueryPoolResults-flags-00815]]
-    If ename:VK_QUERY_RESULT_64_BIT is set in pname:flags then pname:pData
-    and pname:stride must: be multiples of `8`
-ifdef::VK_KHR_performance_query[]
-  * [[VUID-vkGetQueryPoolResults-queryType-03229]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, then pname:pData and
-    pname:stride must: be multiples of the size of
-    slink:VkPerformanceCounterResultKHR
-  * [[VUID-vkGetQueryPoolResults-queryType-04519]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, then pname:stride must: be
-    large enough to contain
-    sname:VkQueryPoolPerformanceCreateInfoKHR::pname:counterIndexCount used
-    to create pname:queryPool times the size of
-    slink:VkPerformanceCounterResultKHR
-endif::VK_KHR_performance_query[]
-  * [[VUID-vkGetQueryPoolResults-firstQuery-00816]]
-    The sum of pname:firstQuery and pname:queryCount must: be less than or
-    equal to the number of queries in pname:queryPool
-  * [[VUID-vkGetQueryPoolResults-dataSize-00817]]
-    pname:dataSize must: be large enough to contain the result of each
-    query, as described <<queries-operation-memorylayout,here>>
-  * [[VUID-vkGetQueryPoolResults-queryType-00818]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_TIMESTAMP, pname:flags must: not contain
-    ename:VK_QUERY_RESULT_PARTIAL_BIT
-ifdef::VK_KHR_performance_query[]
-  * [[VUID-vkGetQueryPoolResults-queryType-03230]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, pname:flags must: not contain
-    ename:VK_QUERY_RESULT_WITH_AVAILABILITY_BIT,
-    ename:VK_QUERY_RESULT_PARTIAL_BIT or ename:VK_QUERY_RESULT_64_BIT
-  * [[VUID-vkGetQueryPoolResults-queryType-03231]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the pname:queryPool must:
-    have been recorded once for each pass as retrieved via a call to
-    flink:vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR
-endif::VK_KHR_performance_query[]
-ifdef::VK_KHR_video_queue[]
-  * [[VUID-vkGetQueryPoolResults-queryType-04810]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR, pname:flags must: include
-    ename:VK_QUERY_RESULT_WITH_STATUS_BIT_KHR
-  * [[VUID-vkGetQueryPoolResults-flags-04811]]
-    If pname:flags includes ename:VK_QUERY_RESULT_WITH_STATUS_BIT_KHR, it
-    must: not include ename:VK_QUERY_RESULT_WITH_AVAILABILITY_BIT
-endif::VK_KHR_video_queue[]
-****
-
-include::{generated}/validity/protos/vkGetQueryPoolResults.txt[]
---
-
-[open,refpage='VkQueryResultFlagBits',desc='Bitmask specifying how and when query results are returned',type='enums']
---
-Bits which can: be set in flink:vkGetQueryPoolResults::pname:flags and
-flink:vkCmdCopyQueryPoolResults::pname:flags, specifying how and when
-results are returned, are:
-
-include::{generated}/api/enums/VkQueryResultFlagBits.txt[]
-
-  * ename:VK_QUERY_RESULT_64_BIT specifies the results will be written as an
-    array of 64-bit unsigned integer values.
-    If this bit is not set, the results will be written as an array of
-    32-bit unsigned integer values.
-  * ename:VK_QUERY_RESULT_WAIT_BIT specifies that Vulkan will wait for each
-    query's status to become available before retrieving its results.
-  * ename:VK_QUERY_RESULT_WITH_AVAILABILITY_BIT specifies that the
-    availability status accompanies the results.
-  * ename:VK_QUERY_RESULT_PARTIAL_BIT specifies that returning partial
-    results is acceptable.
-ifdef::VK_KHR_video_queue[]
-  * ename:VK_QUERY_RESULT_WITH_STATUS_BIT_KHR specifies that the last value
-    returned in the query is a elink:VkQueryResultStatusKHR value.
-endif::VK_KHR_video_queue[]
---
-
-[open,refpage='VkQueryResultFlags',desc='Bitmask of VkQueryResultFlagBits',type='flags']
---
-include::{generated}/api/flags/VkQueryResultFlags.txt[]
-
-tname:VkQueryResultFlags is a bitmask type for setting a mask of zero or
-more elink:VkQueryResultFlagBits.
---
-
-ifdef::VK_KHR_video_queue[]
-[open,refpage='VkQueryResultStatusKHR',desc='Specific status codes for operations',type='enums']
---
-Specific status codes that can: be returned from a query are:
-
-include::{generated}/api/enums/VkQueryResultStatusKHR.txt[]
-
-  * ename:VK_QUERY_RESULT_STATUS_NOT_READY_KHR specifies that the query
-    result is not yet available.
-  * ename:VK_QUERY_RESULT_STATUS_ERROR_KHR specifies that operations did not
-    complete successfully.
-  * ename:VK_QUERY_RESULT_STATUS_COMPLETE_KHR specifies that operations
-    completed successfully and the query result is available.
---
-endif::VK_KHR_video_queue[]
-
-[open,refpage='vkCmdCopyQueryPoolResults',desc='Copy the results of queries in a query pool to a buffer object',type='protos']
---
-To copy query statuses and numerical results directly to buffer memory,
-call:
-
-include::{generated}/api/protos/vkCmdCopyQueryPoolResults.txt[]
-
-  * pname:commandBuffer is the command buffer into which this command will
-    be recorded.
-  * pname:queryPool is the query pool managing the queries containing the
-    desired results.
-  * pname:firstQuery is the initial query index.
-  * pname:queryCount is the number of queries.
-    pname:firstQuery and pname:queryCount together define a range of
-    queries.
-  * pname:dstBuffer is a slink:VkBuffer object that will receive the results
-    of the copy command.
-  * pname:dstOffset is an offset into pname:dstBuffer.
-  * pname:stride is the stride in bytes between results for individual
-    queries within pname:dstBuffer.
-    The required size of the backing memory for pname:dstBuffer is
-    determined as described above for flink:vkGetQueryPoolResults.
-  * pname:flags is a bitmask of elink:VkQueryResultFlagBits specifying how
-    and when results are returned.
-
-fname:vkCmdCopyQueryPoolResults is guaranteed to see the effect of previous
-uses of fname:vkCmdResetQueryPool in the same queue, without any additional
-synchronization.
-Thus, the results will always reflect the most recent use of the query.
-
-pname:flags has the same possible values described above for the pname:flags
-parameter of flink:vkGetQueryPoolResults, but the different style of
-execution causes some subtle behavioral differences.
-Because fname:vkCmdCopyQueryPoolResults executes in order with respect to
-other query commands, there is less ambiguity about which use of a query is
-being requested.
-
-Results for all requested occlusion queries, pipeline statistics queries,
-ifdef::VK_EXT_transform_feedback[]
-transform feedback queries,
-endif::VK_EXT_transform_feedback[]
-and timestamp queries are written as 64-bit unsigned integer values if
-ename:VK_QUERY_RESULT_64_BIT is set or 32-bit unsigned integer values
-otherwise.
-ifdef::VK_KHR_performance_query[]
-Performance queries store results in a tightly packed array whose type is
-determined by the pname:unit member of the corresponding
-slink:VkPerformanceCounterKHR.
-endif::VK_KHR_performance_query[]
-
-If neither of ename:VK_QUERY_RESULT_WAIT_BIT and
-ename:VK_QUERY_RESULT_WITH_AVAILABILITY_BIT are set, results are only
-written out for queries in the available state.
-
-If ename:VK_QUERY_RESULT_WAIT_BIT is set, the implementation will wait for
-each query's status to be in the available state before retrieving the
-numerical results for that query.
-This is guaranteed to reflect the most recent use of the query on the same
-queue, assuming that the query is not being simultaneously used by other
-queues.
-If the query does not become available in a finite amount of time (e.g. due
-to not issuing a query since the last reset), a ename:VK_ERROR_DEVICE_LOST
-error may: occur.
-
-Similarly, if ename:VK_QUERY_RESULT_WITH_AVAILABILITY_BIT is set and
-ename:VK_QUERY_RESULT_WAIT_BIT is not set, the availability is guaranteed to
-reflect the most recent use of the query on the same queue, assuming that
-the query is not being simultaneously used by other queues.
-As with fname:vkGetQueryPoolResults, implementations must: guarantee that if
-they return a non-zero availability value, then the numerical results are
-valid.
-
-If ename:VK_QUERY_RESULT_PARTIAL_BIT is set, ename:VK_QUERY_RESULT_WAIT_BIT
-is not set, and the query's status is unavailable, an intermediate result
-value between zero and the final result value is written for that query.
-
-ename:VK_QUERY_RESULT_PARTIAL_BIT must: not be used if the pool's
-pname:queryType is ename:VK_QUERY_TYPE_TIMESTAMP.
-
-fname:vkCmdCopyQueryPoolResults is considered to be a transfer operation,
-and its writes to buffer memory must: be synchronized using
-ename:VK_PIPELINE_STAGE_TRANSFER_BIT and ename:VK_ACCESS_TRANSFER_WRITE_BIT
-before using the results.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdCopyQueryPoolResults-dstOffset-00819]]
-    pname:dstOffset must: be less than the size of pname:dstBuffer
-  * [[VUID-vkCmdCopyQueryPoolResults-firstQuery-00820]]
-    pname:firstQuery must: be less than the number of queries in
-    pname:queryPool
-  * [[VUID-vkCmdCopyQueryPoolResults-firstQuery-00821]]
-    The sum of pname:firstQuery and pname:queryCount must: be less than or
-    equal to the number of queries in pname:queryPool
-  * [[VUID-vkCmdCopyQueryPoolResults-flags-00822]]
-    If ename:VK_QUERY_RESULT_64_BIT is not set in pname:flags then
-    pname:dstOffset and pname:stride must: be multiples of `4`
-  * [[VUID-vkCmdCopyQueryPoolResults-flags-00823]]
-    If ename:VK_QUERY_RESULT_64_BIT is set in pname:flags then
-    pname:dstOffset and pname:stride must: be multiples of `8`
-  * [[VUID-vkCmdCopyQueryPoolResults-dstBuffer-00824]]
-    pname:dstBuffer must: have enough storage, from pname:dstOffset, to
-    contain the result of each query, as described
-    <<queries-operation-memorylayout,here>>
-  * [[VUID-vkCmdCopyQueryPoolResults-dstBuffer-00825]]
-    pname:dstBuffer must: have been created with
-    ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag
-  * [[VUID-vkCmdCopyQueryPoolResults-dstBuffer-00826]]
-    If pname:dstBuffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-vkCmdCopyQueryPoolResults-queryType-00827]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_TIMESTAMP, pname:flags must: not contain
-    ename:VK_QUERY_RESULT_PARTIAL_BIT
-ifdef::VK_KHR_performance_query[]
-  * [[VUID-vkCmdCopyQueryPoolResults-queryType-03232]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,
-    slink:VkPhysicalDevicePerformanceQueryPropertiesKHR::pname:allowCommandBufferQueryCopies
-    must: be ename:VK_TRUE
-  * [[VUID-vkCmdCopyQueryPoolResults-queryType-03233]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, pname:flags must: not contain
-    ename:VK_QUERY_RESULT_WITH_AVAILABILITY_BIT,
-    ename:VK_QUERY_RESULT_PARTIAL_BIT or ename:VK_QUERY_RESULT_64_BIT
-  * [[VUID-vkCmdCopyQueryPoolResults-queryType-03234]]
-    If the pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the pname:queryPool must:
-    have been submitted once for each pass as retrieved via a call to
-    flink:vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR
-endif::VK_KHR_performance_query[]
-ifdef::VK_INTEL_performance_query[]
-  * [[VUID-vkCmdCopyQueryPoolResults-queryType-02734]]
-    flink:vkCmdCopyQueryPoolResults must: not be called if the
-    pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL
-endif::VK_INTEL_performance_query[]
-ifdef::VK_KHR_video_queue[]
-  * [[VUID-vkCmdCopyQueryPoolResults-queryType-04812]]
-    flink:vkCmdCopyQueryPoolResults must: not be called if the
-    pname:queryType used to create pname:queryPool was
-    ename:VK_QUERY_TYPE_VIDEO_ENCODE_BITSTREAM_BUFFER_RANGE_KHR or
-    ename:VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR
-endif::VK_KHR_video_queue[]
-****
-
-include::{generated}/validity/protos/vkCmdCopyQueryPoolResults.txt[]
---
-
-[[queries-operation-undefined]]
-Rendering operations such as clears, MSAA resolves, attachment load/store
-operations, and blits may: count towards the results of queries.
-This behavior is implementation-dependent and may: vary depending on the
-path used within an implementation.
-For example, some implementations have several types of clears, some of
-which may: include vertices and some not.
-
-
-[[queries-occlusion]]
-== Occlusion Queries
-
-Occlusion queries track the number of samples that pass the per-fragment
-tests for a set of drawing commands.
-As such, occlusion queries are only available on queue families supporting
-graphics operations.
-The application can: then use these results to inform future rendering
-decisions.
-An occlusion query is begun and ended by calling fname:vkCmdBeginQuery and
-fname:vkCmdEndQuery, respectively.
-When an occlusion query begins, the count of passing samples always starts
-at zero.
-For each drawing command, the count is incremented as described in
-<<fragops-samplecount,Sample Counting>>.
-If pname:flags does not contain ename:VK_QUERY_CONTROL_PRECISE_BIT an
-implementation may: generate any non-zero result value for the query if the
-count of passing samples is non-zero.
-
-[NOTE]
-.Note
-====
-Not setting ename:VK_QUERY_CONTROL_PRECISE_BIT mode may: be more efficient
-on some implementations, and should: be used where it is sufficient to know
-a boolean result on whether any samples passed the per-fragment tests.
-In this case, some implementations may: only return zero or one, indifferent
-to the actual number of samples passing the per-fragment tests.
-====
-
-When an occlusion query finishes, the result for that query is marked as
-available.
-The application can: then either copy the result to a buffer (via
-fname:vkCmdCopyQueryPoolResults) or request it be put into host memory (via
-fname:vkGetQueryPoolResults).
-
-[NOTE]
-.Note
-====
-If occluding geometry is not drawn first, samples can: pass the depth test,
-but still not be visible in a final image.
-====
-
-
-[[queries-pipestats]]
-== Pipeline Statistics Queries
-
-Pipeline statistics queries allow the application to sample a specified set
-of sname:VkPipeline counters.
-These counters are accumulated by Vulkan for a set of either drawing or
-dispatching commands while a pipeline statistics query is active.
-As such, pipeline statistics queries are available on queue families
-supporting either graphics or compute operations.
-The availability of pipeline statistics queries is indicated by the
-pname:pipelineStatisticsQuery member of the sname:VkPhysicalDeviceFeatures
-object (see fname:vkGetPhysicalDeviceFeatures and fname:vkCreateDevice for
-detecting and requesting this query type on a sname:VkDevice).
-
-A pipeline statistics query is begun and ended by calling
-fname:vkCmdBeginQuery and fname:vkCmdEndQuery, respectively.
-When a pipeline statistics query begins, all statistics counters are set to
-zero.
-While the query is active, the pipeline type determines which set of
-statistics are available, but these must: be configured on the query pool
-when it is created.
-If a statistic counter is issued on a command buffer that does not support
-the corresponding operation, the value of that counter is undefined: after
-the query has finished.
-At least one statistic counter relevant to the operations supported on the
-recording command buffer must: be enabled.
-
-[open,refpage='VkQueryPipelineStatisticFlagBits',desc='Bitmask specifying queried pipeline statistics',type='enums']
---
-Bits which can: be set to individually enable pipeline statistics counters
-for query pools with slink:VkQueryPoolCreateInfo::pname:pipelineStatistics,
-and for secondary command buffers with
-slink:VkCommandBufferInheritanceInfo::pname:pipelineStatistics, are:
-
-include::{generated}/api/enums/VkQueryPipelineStatisticFlagBits.txt[]
-
-  * ename:VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT specifies
-    that queries managed by the pool will count the number of vertices
-    processed by the <<drawing,input assembly>> stage.
-    Vertices corresponding to incomplete primitives may: contribute to the
-    count.
-  * ename:VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT
-    specifies that queries managed by the pool will count the number of
-    primitives processed by the <<drawing,input assembly>> stage.
-    If primitive restart is enabled, restarting the primitive topology has
-    no effect on the count.
-    Incomplete primitives may: be counted.
-  * ename:VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT
-    specifies that queries managed by the pool will count the number of
-    vertex shader invocations.
-    This counter's value is incremented each time a vertex shader is
-    <<shaders-vertex-execution,invoked>>.
-  * ename:VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT
-    specifies that queries managed by the pool will count the number of
-    geometry shader invocations.
-    This counter's value is incremented each time a geometry shader is
-    <<shaders-geometry-execution,invoked>>.
-    In the case of <<geometry-invocations,instanced geometry shaders>>, the
-    geometry shader invocations count is incremented for each separate
-    instanced invocation.
-  * ename:VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT
-    specifies that queries managed by the pool will count the number of
-    primitives generated by geometry shader invocations.
-    The counter's value is incremented each time the geometry shader emits a
-    primitive.
-    Restarting primitive topology using the SPIR-V instructions
-    code:OpEndPrimitive or code:OpEndStreamPrimitive has no effect on the
-    geometry shader output primitives count.
-  * ename:VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT specifies
-    that queries managed by the pool will count the number of primitives
-    processed by the <<vertexpostproc-clipping,Primitive Clipping>> stage of
-    the pipeline.
-    The counter's value is incremented each time a primitive reaches the
-    primitive clipping stage.
-  * ename:VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT specifies that
-    queries managed by the pool will count the number of primitives output
-    by the <<vertexpostproc-clipping,Primitive Clipping>> stage of the
-    pipeline.
-    The counter's value is incremented each time a primitive passes the
-    primitive clipping stage.
-    The actual number of primitives output by the primitive clipping stage
-    for a particular input primitive is implementation-dependent but must:
-    satisfy the following conditions:
-  ** If at least one vertex of the input primitive lies inside the clipping
-     volume, the counter is incremented by one or more.
-  ** Otherwise, the counter is incremented by zero or more.
-  * ename:VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT
-    specifies that queries managed by the pool will count the number of
-    fragment shader invocations.
-    The counter's value is incremented each time the fragment shader is
-    <<fragops-shader,invoked>>.
-  * ename:VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT
-    specifies that queries managed by the pool will count the number of
-    patches processed by the tessellation control shader.
-    The counter's value is incremented once for each patch for which a
-    tessellation control shader is
-    <<shaders-tessellation-control-execution,invoked>>.
-  * ename:VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT
-    specifies that queries managed by the pool will count the number of
-    invocations of the tessellation evaluation shader.
-    The counter's value is incremented each time the tessellation evaluation
-    shader is <<shaders-tessellation-evaluation-execution,invoked>>.
-  * ename:VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT
-    specifies that queries managed by the pool will count the number of
-    compute shader invocations.
-    The counter's value is incremented every time the compute shader is
-    invoked.
-    Implementations may: skip the execution of certain compute shader
-    invocations or execute additional compute shader invocations for
-    implementation-dependent reasons as long as the results of rendering
-    otherwise remain unchanged.
-
-These values are intended to measure relative statistics on one
-implementation.
-Various device architectures will count these values differently.
-Any or all counters may: be affected by the issues described in
-<<queries-operation-undefined,Query Operation>>.
-
-[NOTE]
-.Note
-====
-For example, tile-based rendering devices may: need to replay the scene
-multiple times, affecting some of the counts.
-====
-
-If a pipeline has pname:rasterizerDiscardEnable enabled, implementations
-may: discard primitives after the final
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>>.
-As a result, if pname:rasterizerDiscardEnable is enabled, the clipping input
-and output primitives counters may: not be incremented.
-
-When a pipeline statistics query finishes, the result for that query is
-marked as available.
-The application can: copy the result to a buffer (via
-fname:vkCmdCopyQueryPoolResults), or request it be put into host memory (via
-fname:vkGetQueryPoolResults).
---
-
-[open,refpage='VkQueryPipelineStatisticFlags',desc='Bitmask of VkQueryPipelineStatisticFlagBits',type='flags']
---
-include::{generated}/api/flags/VkQueryPipelineStatisticFlags.txt[]
-
-tname:VkQueryPipelineStatisticFlags is a bitmask type for setting a mask of
-zero or more elink:VkQueryPipelineStatisticFlagBits.
---
-
-
-[[queries-timestamps]]
-== Timestamp Queries
-
-_Timestamps_ provide applications with a mechanism for timing the execution
-of commands.
-A timestamp is an integer value generated by the sname:VkPhysicalDevice.
-Unlike other queries, timestamps do not operate over a range, and so do not
-use flink:vkCmdBeginQuery or flink:vkCmdEndQuery.
-The mechanism is built around a set of commands that allow the application
-to tell the sname:VkPhysicalDevice to write timestamp values to a
-<<queries-pools,query pool>> and then either read timestamp values on the
-host (using flink:vkGetQueryPoolResults) or copy timestamp values to a
-sname:VkBuffer (using flink:vkCmdCopyQueryPoolResults).
-The application can: then compute differences between timestamps to
-determine execution time.
-
-The number of valid bits in a timestamp value is determined by the
-sname:VkQueueFamilyProperties::pname:timestampValidBits property of the
-queue on which the timestamp is written.
-Timestamps are supported on any queue which reports a non-zero value for
-pname:timestampValidBits via flink:vkGetPhysicalDeviceQueueFamilyProperties.
-If the <<limits-timestampComputeAndGraphics,
-pname:timestampComputeAndGraphics>> limit is ename:VK_TRUE, timestamps are
-supported by every queue family that supports either graphics or compute
-operations (see slink:VkQueueFamilyProperties).
-
-The number of nanoseconds it takes for a timestamp value to be incremented
-by 1 can: be obtained from
-sname:VkPhysicalDeviceLimits::pname:timestampPeriod after a call to
-fname:vkGetPhysicalDeviceProperties.
-
-ifdef::VK_KHR_synchronization2[]
-
-[open,refpage='vkCmdWriteTimestamp2KHR',desc='Write a device timestamp into a query object',type='protos']
---
-:refpage: vkCmdWriteTimestamp2KHR
-
-To request a timestamp, call:
-
-include::{generated}/api/protos/vkCmdWriteTimestamp2KHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:stage specifies a stage of the pipeline.
-  * pname:queryPool is the query pool that will manage the timestamp.
-  * pname:query is the query within the query pool that will contain the
-    timestamp.
-
-When fname:vkCmdWriteTimestamp2KHR is submitted to a queue, it defines an
-execution dependency on commands that were submitted before it, and writes a
-timestamp to a query pool.
-
-The first <<synchronization-dependencies-scopes, synchronization scope>>
-includes all commands that occur earlier in
-<<synchronization-submission-order,submission order>>.
-The synchronization scope is limited to operations on the pipeline stage
-specified by pname:stage.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-includes only the timestamp write operation.
-
-When the timestamp value is written, the availability status of the query is
-set to available.
-
-[NOTE]
-.Note
-====
-If an implementation is unable to detect completion and latch the timer at
-any specific stage of the pipeline, it may: instead do so at any logically
-later stage.
-====
-
-Comparisons between timestamps are not meaningful if the timestamps are
-written by commands submitted to different queues.
-
-[NOTE]
-.Note
-====
-An example of such a comparison is subtracting an older timestamp from a
-newer one to determine the execution time of a sequence of commands.
-====
-
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-
-If fname:vkCmdWriteTimestamp2KHR is called while executing a render pass
-instance that has multiview enabled, the timestamp uses [eq]#N# consecutive
-query indices in the query pool (starting at pname:query) where [eq]#N# is
-the number of bits set in the view mask of the subpass the command is
-executed in.
-The resulting query values are determined by an implementation-dependent
-choice of one of the following behaviors:
-
-  * The first query is a timestamp value and (if more than one bit is set in
-    the view mask) zero is written to the remaining queries.
-    If two timestamps are written in the same subpass, the sum of the
-    execution time of all views between those commands is the difference
-    between the first query written by each command.
-  * All [eq]#N# queries are timestamp values.
-    If two timestamps are written in the same subpass, the sum of the
-    execution time of all views between those commands is the sum of the
-    difference between corresponding queries written by each command.
-    The difference between corresponding queries may: be the execution time
-    of a single view.
-
-In either case, the application can: sum the differences between all [eq]#N#
-queries to determine the total execution time.
-
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-.Valid Usage
-****
-:stageMaskName: stage
-include::{chapters}/commonvalidity/stage_mask_2_common.txt[]
-  * [[VUID-vkCmdWriteTimestamp2KHR-synchronization2-03858]]
-    The <<features-synchronization2, pname:synchronization2>> feature must:
-    be enabled
-  * [[VUID-vkCmdWriteTimestamp2KHR-stage-03859]]
-    pname:stage must: only include a single pipeline stage
-  * [[VUID-vkCmdWriteTimestamp2KHR-stage-03860]]
-    pname:stage must: only include stages valid for the queue family that
-    was used to create the command pool that pname:commandBuffer was
-    allocated from
-  * [[VUID-vkCmdWriteTimestamp2KHR-queryPool-03861]]
-    pname:queryPool must: have been created with a pname:queryType of
-    ename:VK_QUERY_TYPE_TIMESTAMP
-  * [[VUID-vkCmdWriteTimestamp2KHR-queryPool-03862]]
-    The query identified by pname:queryPool and pname:query must: be
-    _unavailable_
-  * [[VUID-vkCmdWriteTimestamp2KHR-timestampValidBits-03863]]
-    The command pool's queue family must: support a non-zero
-    pname:timestampValidBits
-  * [[VUID-vkCmdWriteTimestamp2KHR-query-04903]]
-    pname:query must: be less than the number of queries in pname:queryPool
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-vkCmdWriteTimestamp2KHR-None-03864]]
-    All queries used by the command must: be unavailable
-  * [[VUID-vkCmdWriteTimestamp2KHR-query-03865]]
-    If fname:vkCmdWriteTimestamp2KHR is called within a render pass
-    instance, the sum of pname:query and the number of bits set in the
-    current subpass's view mask must: be less than or equal to the number of
-    queries in pname:queryPool
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-****
-
-include::{generated}/validity/protos/vkCmdWriteTimestamp2KHR.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='vkCmdWriteTimestamp',desc='Write a device timestamp into a query object',type='protos']
---
-:refpage: vkCmdWriteTimestamp
-
-To request a timestamp, call:
-
-include::{generated}/api/protos/vkCmdWriteTimestamp.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pipelineStage is a elink:VkPipelineStageFlagBits value, specifying
-    a stage of the pipeline.
-  * pname:queryPool is the query pool that will manage the timestamp.
-  * pname:query is the query within the query pool that will contain the
-    timestamp.
-
-fname:vkCmdWriteTimestamp latches the value of the timer when all previous
-commands have completed executing as far as the specified pipeline stage,
-and writes the timestamp value to memory.
-When the timestamp value is written, the availability status of the query is
-set to available.
-
-[NOTE]
-.Note
-====
-If an implementation is unable to detect completion and latch the timer at
-any specific stage of the pipeline, it may: instead do so at any logically
-later stage.
-====
-
-Comparisons between timestamps are not meaningful if the timestamps are
-written by commands submitted to different queues.
-
-[NOTE]
-.Note
-====
-An example of such a comparison is subtracting an older timestamp from a
-newer one to determine the execution time of a sequence of commands.
-====
-
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-
-If fname:vkCmdWriteTimestamp is called while executing a render pass
-instance that has multiview enabled, the timestamp uses [eq]#N# consecutive
-query indices in the query pool (starting at pname:query) where [eq]#N# is
-the number of bits set in the view mask of the subpass the command is
-executed in.
-The resulting query values are determined by an implementation-dependent
-choice of one of the following behaviors:
-
-  * The first query is a timestamp value and (if more than one bit is set in
-    the view mask) zero is written to the remaining queries.
-    If two timestamps are written in the same subpass, the sum of the
-    execution time of all views between those commands is the difference
-    between the first query written by each command.
-  * All [eq]#N# queries are timestamp values.
-    If two timestamps are written in the same subpass, the sum of the
-    execution time of all views between those commands is the sum of the
-    difference between corresponding queries written by each command.
-    The difference between corresponding queries may: be the execution time
-    of a single view.
-
-In either case, the application can: sum the differences between all [eq]#N#
-queries to determine the total execution time.
-
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/pipeline_stage_common.txt[]
-  * [[VUID-vkCmdWriteTimestamp-queryPool-01416]]
-    pname:queryPool must: have been created with a pname:queryType of
-    ename:VK_QUERY_TYPE_TIMESTAMP
-  * [[VUID-vkCmdWriteTimestamp-queryPool-00828]]
-    The query identified by pname:queryPool and pname:query must: be
-    _unavailable_
-  * [[VUID-vkCmdWriteTimestamp-timestampValidBits-00829]]
-    The command pool's queue family must: support a non-zero
-    pname:timestampValidBits
-  * [[VUID-vkCmdWriteTimestamp-query-04904]]
-    pname:query must: be less than the number of queries in pname:queryPool
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-vkCmdWriteTimestamp-None-00830]]
-    All queries used by the command must: be unavailable
-  * [[VUID-vkCmdWriteTimestamp-query-00831]]
-    If fname:vkCmdWriteTimestamp is called within a render pass instance,
-    the sum of pname:query and the number of bits set in the current
-    subpass's view mask must: be less than or equal to the number of queries
-    in pname:queryPool
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-****
-
-include::{generated}/validity/protos/vkCmdWriteTimestamp.txt[]
---
-
-ifdef::VK_KHR_performance_query[]
-include::VK_KHR_performance_query/queriesperformance.txt[]
-endif::VK_KHR_performance_query[]
-
-
-ifdef::VK_EXT_transform_feedback[]
-[[queries-transform-feedback]]
-== Transform Feedback Queries
-
-Transform feedback queries track the number of primitives attempted to be
-written and actually written, by the vertex stream being captured, to a
-transform feedback buffer.
-This query is updated during drawing commands while transform feedback is
-active.
-The number of primitives actually written will be less than the number
-attempted to be written if the bound transform feedback buffer size was too
-small for the number of primitives actually drawn.
-Primitives are not written beyond the bound range of the transform feedback
-buffer.
-A transform feedback query is begun and ended by calling
-fname:vkCmdBeginQuery and fname:vkCmdEndQuery, respectively to query for
-vertex stream zero.
-fname:vkCmdBeginQueryIndexedEXT and fname:vkCmdEndQueryIndexedEXT can: be
-used to begin and end transform feedback queries for any supported vertex
-stream.
-When a transform feedback query begins, the count of primitives written and
-primitives needed starts from zero.
-For each drawing command, the count is incremented as vertex attribute
-outputs are captured to the transform feedback buffers while transform
-feedback is active.
-
-When a transform feedback query finishes, the result for that query is
-marked as available.
-The application can: then either copy the result to a buffer (via
-fname:vkCmdCopyQueryPoolResults) or request it be put into host memory (via
-fname:vkGetQueryPoolResults).
-
-endif::VK_EXT_transform_feedback[]
-
-ifdef::VK_INTEL_performance_query[]
-include::VK_INTEL_performance_query/queries.txt[]
-endif::VK_INTEL_performance_query[]
-
-
-ifdef::VK_KHR_video_queue[]
-[[queries-result-status-only]]
-== Result Status Queries
-
-Result status queries are used for a single purpose - to check whether a set
-of operations has completed successfully or not, using the
-ename:VK_QUERY_RESULT_WITH_STATUS_BIT_KHR flag.
-
-No other data is written to such a query.
-endif::VK_KHR_video_queue[]
-
-
-ifdef::VK_KHR_video_encode_queue[]
-[[queries-video-encode-bitstream-buffer-range]]
-== Video Encode Bitstream Buffer Range
-
-Bitstream buffer range queries describe the range of bytes written in the
-bitstream buffer by video encode commands.
-
-When an encode command is recorded within a bitstream buffer range query,
-two values are written to the query slot.
-The first value is an offset into the bitstream buffer where the encoded
-video data was written.
-This offset is an additional offset from the start of the range specified by
-the application.
-The second value is a size value describing the number of bytes written to
-the bitstream buffer beyond the offset.
-
-One slot is consumed for each slice in each command recorded between a begin
-and end query pair.
-endif::VK_KHR_video_encode_queue[]
diff --git a/registry/vulkan/chapters/raytracing.txt b/registry/vulkan/chapters/raytracing.txt
deleted file mode 100644
index 61a0c83..0000000
--- a/registry/vulkan/chapters/raytracing.txt
+++ /dev/null
@@ -1,902 +0,0 @@
-// Copyright 2018-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[ray-tracing]]
-= Ray Tracing
-
-Ray tracing uses a separate rendering pipeline from both the graphics and
-compute pipelines (see <<pipelines-ray-tracing,Ray Tracing Pipeline>>).
-
-[[fig-raypipe]]
-image::{images}/ray_tracing_execution.svg[align="center",title="Ray tracing pipeline execution",opts="{imageopts}"]
-
-.Caption
-****
-Interaction between the different shader stages in the ray tracing pipeline
-****
-
-Within the ray tracing pipeline, code:OpTraceRayKHR
-ifdef::VK_NV_ray_tracing_motion_blur[]
-or code:OpTraceRayMotionNV
-endif::VK_NV_ray_tracing_motion_blur[]
-can: be called to perform a <<ray-traversal,ray traversal>> that invokes the
-various ray tracing shader stages during its execution.
-The relationship between the ray tracing pipeline object and the geometries
-present in the acceleration structure traversed is passed into the ray
-tracing command in a slink:VkBuffer object known as a _shader binding
-table_.
-code:OpExecuteCallableKHR can also be used in ray tracing pipelines to
-invoke a <<shaders-callable,callable shader>>.
-
-During execution, control alternates between scheduling and other
-operations.
-The scheduling functionality is implementation-specific and is responsible
-for workload execution.
-The shader stages are programmable.
-<<ray-traversal, _Traversal_>>, which refers to the process of traversing
-acceleration structures to find potential intersections of rays with
-geometry, is fixed function.
-
-The programmable portions of the pipeline are exposed in a single-ray
-programming model, with each invocation handling one ray at a time.
-Memory operations can: be synchronized using standard memory barriers.
-The code:Workgroup scope and variables with a storage class of
-code:Workgroup must: not be used in the ray tracing pipeline.
-
-
-[[ray-tracing-shader-call]]
-== Shader Call Instructions
-
-A _shader call_ is an instruction which may: cause execution to continue
-elsewhere by creating one or more invocations that execute a different
-shader stage.
-
-The shader call instructions are:
-
- * code:OpTraceRayKHR which may: invoke intersection, any-hit, closest hit,
-   or miss shaders,
-ifdef::VK_NV_ray_tracing_motion_blur[]
- * code:OpTraceRayMotionNV which may: invoke intersection, any-hit, closest
-   hit, or miss shaders,
-endif::VK_NV_ray_tracing_motion_blur[]
- * code:OpReportIntersectionKHR which may: invoke any-hit shaders, and
- * code:OpExecuteCallableKHR which will invoke a callable shader.
-
-ifdef::VK_VERSION_1_1[]
-The invocations created by shader call instructions are grouped into
-subgroups by the implementation.
-Those subgroups may: be unrelated to the subgroup of the parent invocation.
-endif::VK_VERSION_1_1[]
-
-
-[[ray-tracing-recursion-depth]]
-_Pipeline trace ray instructions_ can: be used recursively; invoked shaders
-can: themselves execute pipeline trace ray instructions, to a maximum depth
-defined by the
-ifdef::VK_NV_ray_tracing[]
-<<limits-maxRecursionDepth, pname:maxRecursionDepth>> or
-endif::VK_NV_ray_tracing[]
-<<limits-maxRayRecursionDepth, pname:maxRayRecursionDepth>> limit.
-
-Shaders directly invoked from the API always have a recursion depth of 0;
-each shader executed by a pipeline trace ray instruction has a recursion
-depth one higher than the recursion depth of the shader which invoked it.
-Applications must: not invoke a shader with a recursion depth greater than
-the value of
-ifdef::VK_NV_ray_tracing[]
-pname:maxRecursionDepth or
-endif::VK_NV_ray_tracing[]
-pname:maxPipelineRayRecursionDepth specified in the pipeline.
-
-There is no explicit recursion limit for other shader call instructions
-which may recurse (e.g. code:OpExecuteCallableKHR) but there is an upper
-bound determined by the <<ray-tracing-pipeline-stack, stack size>>.
-
-[[ray-tracing-repack]]
-An _invocation repack instruction_ is a ray tracing shader call instruction
-where the implementation may: change the set of invocations that are
-executing.
-When a repack instruction is encountered, the invocation is suspended and a
-new invocation begins and executes the instruction.
-After executing the repack instruction (which may: result in other ray
-tracing shader stages executing) the new invocation ends and the original
-invocation is resumed, but it may: be resumed in a different subgroup or at
-a different code:SubgroupLocalInvocationId within the same subgroup.
-When a subset of invocations in a subgroup execute the invocation repack
-instruction, those that do not execute it remain in the same subgroup at the
-same code:SubgroupLocalInvocationId.
-
-The code:OpTraceRayKHR,
-ifdef::VK_NV_ray_tracing_motion_blur[]
-code:OpTraceRayMotionNV,
-endif::VK_NV_ray_tracing_motion_blur[]
-code:OpReportIntersectionKHR, and code:OpExecuteCallableKHR instructions are
-invocation repack instructions.
-
-ifdef::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-The invocations that are executing before an invocation repack instruction,
-after the instruction, or are created by the instruction, are
-<<shader-call-related,shader-call-related>>.
-endif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-
-If the implementation changes the composition of subgroups, the values of
-code:SubgroupSize, code:SubgroupLocalInvocationId,
-ifdef::VK_NV_shader_sm_builtins[]
-code:SMIDNV, code:WarpIDNV,
-endif::VK_NV_shader_sm_builtins[]
-and builtin variables that are derived from them (code:SubgroupEqMask,
-code:SubgroupGeMask, code:SubgroupGtMask, code:SubgroupLeMask,
-code:SubgroupLtMask) must: be changed accordingly by the invocation repack
-instruction.
-The application must: use <<builtin-volatile-semantics,code:Volatile
-semantics>> on these code:BuiltIn variables when used in the ray generation,
-closest hit, miss, intersection, and callable shaders.
-Similarly, the application must: use code:Volatile semantics on any
-code:RayTmaxKHR decorated code:Builtin used in an intersection shader.
-
-[NOTE]
-.Note
-====
-<<shaders-group-operations,Subgroup operations>> are permitted in the
-programmable ray tracing shader stages.
-However, shader call instructions place a bound on where results of subgroup
-instructions or subgroup-scoped instructions that execute the dynamic
-instance of that instruction are potentially valid.
-For example, care must: be taken when using the result of a ballot operation
-that was computed before an invocation repack instruction, after that repack
-instruction.
-The ballot may: be incorrect as the set of invocations could have changed.
-
-ifdef::VK_EXT_subgroup_size_control[]
-While the code:SubgroupSize built-in is required to be declared
-code:Volatile, its value will never change unless
-ename:VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT is
-set on pipeline creation, as without that bit set, its value is required to
-match that of slink:VkPhysicalDeviceSubgroupProperties::pname:subgroupSize.
-endif::VK_EXT_subgroup_size_control[]
-
-ifdef::VK_KHR_shader_clock[]
-For clock operations, the value of a code:Subgroup scoped
-code:OpReadClockKHR read before the dynamic instance of a repack instruction
-should: not be compared to the result of that clock instruction after the
-repack instruction.
-endif::VK_KHR_shader_clock[]
-====
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-When a ray tracing shader executes a dynamic instance of an invocation
-repack instruction which results in another ray tracing shader being
-invoked, their instructions are related by
-<<shader-call-order,shader-call-order>>.
-
-For ray tracing invocations that are
-<<shader-call-related,shader-call-related>>:
-
-  * <<memory-model-memory-operation,memory operations>> on
-    code:StorageBuffer, code:Image, and code:ShaderRecordBufferKHR storage
-    classes can: be synchronized using the
-ifdef::VK_KHR_ray_tracing_pipeline[code:ShaderCallKHR]
-ifndef::VK_KHR_ray_tracing_pipeline[code:Device or code:QueueFamily]
-    scope.
-
-  * the code:CallableDataKHR, code:IncomingCallableDataKHR,
-    code:RayPayloadKHR, code:HitAttributeKHR, and code:IncomingRayPayloadKHR
-    storage classes are <<memory-model-shader-io,system-synchronized>> and
-    no application availability and visibility operations are required.
-
-  * memory operations within a single invocation before and after the
-    invocation repack instruction are ordered by
-    <<memory-model-program-order,program-order>> and do not require explicit
-    synchronzation.
-endif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-
-
-[[ray-tracing-commands]]
-== Ray Tracing Commands
-
-_Ray tracing commands_ provoke work in the ray tracing pipeline.
-Ray tracing commands are recorded into a command buffer and when executed by
-a queue will produce work that executes according to the currently bound ray
-tracing pipeline.
-A ray tracing pipeline must: be bound to a command buffer before any ray
-tracing commands are recorded in that command buffer.
-
-ifdef::VK_NV_ray_tracing[]
-
-[open,refpage='vkCmdTraceRaysNV',desc='Initialize a ray tracing dispatch',type='protos']
---
-:refpage: vkCmdTraceRaysNV
-
-To dispatch ray tracing use:
-
-include::{generated}/api/protos/vkCmdTraceRaysNV.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:raygenShaderBindingTableBuffer is the buffer object that holds the
-    shader binding table data for the ray generation shader stage.
-  * pname:raygenShaderBindingOffset is the offset in bytes (relative to
-    pname:raygenShaderBindingTableBuffer) of the ray generation shader being
-    used for the trace.
-  * pname:missShaderBindingTableBuffer is the buffer object that holds the
-    shader binding table data for the miss shader stage.
-  * pname:missShaderBindingOffset is the offset in bytes (relative to
-    pname:missShaderBindingTableBuffer) of the miss shader being used for
-    the trace.
-  * pname:missShaderBindingStride is the size in bytes of each shader
-    binding table record in pname:missShaderBindingTableBuffer.
-  * pname:hitShaderBindingTableBuffer is the buffer object that holds the
-    shader binding table data for the hit shader stages.
-  * pname:hitShaderBindingOffset is the offset in bytes (relative to
-    pname:hitShaderBindingTableBuffer) of the hit shader group being used
-    for the trace.
-  * pname:hitShaderBindingStride is the size in bytes of each shader binding
-    table record in pname:hitShaderBindingTableBuffer.
-  * pname:callableShaderBindingTableBuffer is the buffer object that holds
-    the shader binding table data for the callable shader stage.
-  * pname:callableShaderBindingOffset is the offset in bytes (relative to
-    pname:callableShaderBindingTableBuffer) of the callable shader being
-    used for the trace.
-  * pname:callableShaderBindingStride is the size in bytes of each shader
-    binding table record in pname:callableShaderBindingTableBuffer.
-  * pname:width is the width of the ray trace query dimensions.
-  * pname:height is height of the ray trace query dimensions.
-  * pname:depth is depth of the ray trace query dimensions.
-
-When the command is executed, a ray generation group of [eq]#pname:width
-{times} pname:height {times} pname:depth# rays is assembled.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/trace_rays_common.txt[]
-  * [[VUID-vkCmdTraceRaysNV-commandBuffer-04624]]
-    pname:commandBuffer must: not be a protected command buffer
-  * [[VUID-vkCmdTraceRaysNV-maxRecursionDepth-03625]]
-    This command must: not cause a pipeline trace ray instruction to be
-    executed from a shader invocation with a <<ray-tracing-recursion-depth,
-    recursion depth>> greater than the value of pname:maxRecursionDepth used
-    to create the bound ray tracing pipeline
-  * [[VUID-vkCmdTraceRaysNV-raygenShaderBindingTableBuffer-04042]]
-    If pname:raygenShaderBindingTableBuffer is non-sparse then it must: be
-    bound completely and contiguously to a single sname:VkDeviceMemory
-    object
-  * [[VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455]]
-    pname:raygenShaderBindingOffset must: be less than the size of
-    pname:raygenShaderBindingTableBuffer
-  * [[VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02456]]
-    pname:raygenShaderBindingOffset must: be a multiple of
-    sname:VkPhysicalDeviceRayTracingPropertiesNV::pname:shaderGroupBaseAlignment
-  * [[VUID-vkCmdTraceRaysNV-missShaderBindingTableBuffer-04043]]
-    If pname:missShaderBindingTableBuffer is non-sparse then it must: be
-    bound completely and contiguously to a single sname:VkDeviceMemory
-    object
-  * [[VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457]]
-    pname:missShaderBindingOffset must: be less than the size of
-    pname:missShaderBindingTableBuffer
-  * [[VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02458]]
-    pname:missShaderBindingOffset must: be a multiple of
-    sname:VkPhysicalDeviceRayTracingPropertiesNV::pname:shaderGroupBaseAlignment
-  * [[VUID-vkCmdTraceRaysNV-hitShaderBindingTableBuffer-04044]]
-    If pname:hitShaderBindingTableBuffer is non-sparse then it must: be
-    bound completely and contiguously to a single sname:VkDeviceMemory
-    object
-  * [[VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459]]
-    pname:hitShaderBindingOffset must: be less than the size of
-    pname:hitShaderBindingTableBuffer
-  * [[VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02460]]
-    pname:hitShaderBindingOffset must: be a multiple of
-    sname:VkPhysicalDeviceRayTracingPropertiesNV::pname:shaderGroupBaseAlignment
-  * [[VUID-vkCmdTraceRaysNV-callableShaderBindingTableBuffer-04045]]
-    If pname:callableShaderBindingTableBuffer is non-sparse then it must: be
-    bound completely and contiguously to a single sname:VkDeviceMemory
-    object
-  * [[VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461]]
-    pname:callableShaderBindingOffset must: be less than the size of
-    pname:callableShaderBindingTableBuffer
-  * [[VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02462]]
-    pname:callableShaderBindingOffset must: be a multiple of
-    sname:VkPhysicalDeviceRayTracingPropertiesNV::pname:shaderGroupBaseAlignment
-  * [[VUID-vkCmdTraceRaysNV-missShaderBindingStride-02463]]
-    pname:missShaderBindingStride must: be a multiple of
-    sname:VkPhysicalDeviceRayTracingPropertiesNV::pname:shaderGroupHandleSize
-  * [[VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02464]]
-    pname:hitShaderBindingStride must: be a multiple of
-    sname:VkPhysicalDeviceRayTracingPropertiesNV::pname:shaderGroupHandleSize
-  * [[VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02465]]
-    pname:callableShaderBindingStride must: be a multiple of
-    sname:VkPhysicalDeviceRayTracingPropertiesNV::pname:shaderGroupHandleSize
-  * [[VUID-vkCmdTraceRaysNV-missShaderBindingStride-02466]]
-    pname:missShaderBindingStride must: be less than or equal to
-    sname:VkPhysicalDeviceRayTracingPropertiesNV::pname:maxShaderGroupStride
-  * [[VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02467]]
-    pname:hitShaderBindingStride must: be less than or equal to
-    sname:VkPhysicalDeviceRayTracingPropertiesNV::pname:maxShaderGroupStride
-  * [[VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02468]]
-    pname:callableShaderBindingStride must: be less than or equal to
-    sname:VkPhysicalDeviceRayTracingPropertiesNV::pname:maxShaderGroupStride
-  * [[VUID-vkCmdTraceRaysNV-width-02469]]
-    pname:width must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[0]
-  * [[VUID-vkCmdTraceRaysNV-height-02470]]
-    pname:height must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[1]
-  * [[VUID-vkCmdTraceRaysNV-depth-02471]]
-    pname:depth must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[2]
-****
-
-include::{generated}/validity/protos/vkCmdTraceRaysNV.txt[]
---
-
-endif::VK_NV_ray_tracing[]
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-[open,refpage='vkCmdTraceRaysKHR',desc='Initialize a ray tracing dispatch',type='protos']
---
-:refpage: vkCmdTraceRaysKHR
-
-To dispatch ray tracing use:
-
-include::{generated}/api/protos/vkCmdTraceRaysKHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pRaygenShaderBindingTable is a
-    slink:VkStridedDeviceAddressRegionKHR that holds the shader binding
-    table data for the ray generation shader stage.
-  * pname:pMissShaderBindingTable is a slink:VkStridedDeviceAddressRegionKHR
-    that holds the shader binding table data for the miss shader stage.
-  * pname:pHitShaderBindingTable is a slink:VkStridedDeviceAddressRegionKHR
-    that holds the shader binding table data for the hit shader stage.
-  * pname:pCallableShaderBindingTable is a
-    slink:VkStridedDeviceAddressRegionKHR that holds the shader binding
-    table data for the callable shader stage.
-  * pname:width is the width of the ray trace query dimensions.
-  * pname:height is height of the ray trace query dimensions.
-  * pname:depth is depth of the ray trace query dimensions.
-
-When the command is executed, a ray generation group of [eq]#pname:width
-{times} pname:height {times} pname:depth# rays is assembled.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/trace_rays_common.txt[]
-include::{chapters}/commonvalidity/trace_rays_common_khr.txt[]
-  * [[VUID-vkCmdTraceRaysKHR-commandBuffer-04625]]
-    pname:commandBuffer must: not be a protected command buffer
-  * [[VUID-vkCmdTraceRaysKHR-width-03626]]
-    pname:width must: be less than or equal to
-    [eq]#sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[0]
-    {times} sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupSize[0]#
-  * [[VUID-vkCmdTraceRaysKHR-height-03627]]
-    pname:height must: be less than or equal to
-    [eq]#sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[1]
-    {times} sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupSize[1]#
-  * [[VUID-vkCmdTraceRaysKHR-depth-03628]]
-    pname:depth must: be less than or equal to
-    [eq]#sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[2]
-    {times} sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupSize[2]#
-  * [[VUID-vkCmdTraceRaysKHR-width-03629]]
-    [eq]#pname:width {times} pname:height {times} pname:depth# must: be less
-    than or equal to
-    sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:maxRayDispatchInvocationCount
-****
-
-include::{generated}/validity/protos/vkCmdTraceRaysKHR.txt[]
---
-
-[open,refpage='VkStridedDeviceAddressRegionKHR',desc='Structure specifying a region of device addresses with a stride',type='structs']
---
-:refpage: VkStridedDeviceAddressRegionKHR
-
-The sname:VkStridedDeviceAddressRegionKHR structure is defined as:
-
-include::{generated}/api/structs/VkStridedDeviceAddressRegionKHR.txt[]
-
-  * pname:deviceAddress is the device address (as returned by the
-    flink:vkGetBufferDeviceAddress command) at which the region starts, or
-    zero if the region is unused.
-  * pname:stride is the byte stride between consecutive elements.
-  * pname:size is the size in bytes of the region starting at
-    pname:deviceAddress.
-
-.Valid Usage
-****
-  * [[VUID-VkStridedDeviceAddressRegionKHR-size-04631]]
-    If pname:size is not zero, all addresses between pname:deviceAddress and
-    [eq]#pname:deviceAddress {plus} pname:size - 1# must: be in the buffer
-    device address range of the same buffer
-  * [[VUID-VkStridedDeviceAddressRegionKHR-size-04632]]
-    If pname:size is not zero, pname:stride must: be less than or equal to
-    the size of the buffer from which pname:deviceAddress was queried
-****
-
-include::{generated}/validity/structs/VkStridedDeviceAddressRegionKHR.txt[]
---
-
-ifdef::VK_HUAWEI_invocation_mask[]
-
-[open,refpage='vkCmdBindInvocationMaskHUAWEI',desc='Bind an invocation mask image on a command buffer',type='protos']
---
-
-When invocation mask image usage is enabled in the bound ray tracing
-pipeline, the pipeline uses an invocation mask image specified by the
-command:
-
-include::{generated}/api/protos/vkCmdBindInvocationMaskHUAWEI.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded
-  * pname:imageView is an image view handle that specifies the invocation
-    mask image pname:imageView may: be set to dlink:VK_NULL_HANDLE, which is
-    equivalent to specifying a view of an image filled with ones value.
-  * pname:imageLayout is the layout that the image subresources accessible
-    from pname:imageView will be in when the invocation mask image is
-    accessed
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBindInvocationMaskHUAWEI-None-04976]]
-    The <<features-invocationMask,invocation mask image>> feature must: be
-    enabled
-  * [[VUID-vkCmdBindInvocationMaskHUAWEI-imageView-04977]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, it must: be a valid
-    slink:VkImageView handle of type ename:VK_IMAGE_VIEW_TYPE_2D
-  * [[VUID-vkCmdBindInvocationMaskHUAWEI-imageView-04978]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, it must: have a format
-    of ename:VK_FORMAT_R8_UINT
-  * [[VUID-vkCmdBindInvocationMaskHUAWEI-imageView-04979]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, it must: have been
-    created with ename:VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI set
-  * [[VUID-vkCmdBindInvocationMaskHUAWEI-imageView-04980]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, pname:imageLayout must:
-    be ename:VK_IMAGE_LAYOUT_GENERAL
-  * [[VUID-vkCmdBindInvocationMaskHUAWEI-width-04981]]
-    Thread mask image resolution must match the pname:width and pname:height
-    in flink:vkCmdTraceRaysKHR
-  * [[VUID-vkCmdBindInvocationMaskHUAWEI-None-04982]]
-    Each element in the invocation mask image must: have the value `0` or
-    `1`.
-    The value 1 means the invocation is active
-  * [[VUID-vkCmdBindInvocationMaskHUAWEI-width-04983]]
-    pname:width in flink:vkCmdTraceRaysKHR should be 1
-****
-
-include::{generated}/validity/protos/vkCmdBindInvocationMaskHUAWEI.txt[]
---
-endif::VK_HUAWEI_invocation_mask[]
-
-[open,refpage='vkCmdTraceRaysIndirectKHR',desc='Initialize an indirect ray tracing dispatch',type='protos']
---
-:refpage: vkCmdTraceRaysIndirectKHR
-
-To dispatch ray tracing, with some parameters sourced on the device, use:
-
-include::{generated}/api/protos/vkCmdTraceRaysIndirectKHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:pRaygenShaderBindingTable is a
-    slink:VkStridedDeviceAddressRegionKHR that holds the shader binding
-    table data for the ray generation shader stage.
-  * pname:pMissShaderBindingTable is a slink:VkStridedDeviceAddressRegionKHR
-    that holds the shader binding table data for the miss shader stage.
-  * pname:pHitShaderBindingTable is a slink:VkStridedDeviceAddressRegionKHR
-    that holds the shader binding table data for the hit shader stage.
-  * pname:pCallableShaderBindingTable is a
-    slink:VkStridedDeviceAddressRegionKHR that holds the shader binding
-    table data for the callable shader stage.
-  * pname:indirectDeviceAddress is a buffer device address which is a
-    pointer to a slink:VkTraceRaysIndirectCommandKHR structure containing
-    the trace ray parameters.
-
-fname:vkCmdTraceRaysIndirectKHR behaves similarly to flink:vkCmdTraceRaysKHR
-except that the ray trace query dimensions are read by the device from
-pname:indirectDeviceAddress during execution.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/trace_rays_common.txt[]
-include::{chapters}/commonvalidity/trace_rays_common_khr.txt[]
-  * [[VUID-vkCmdTraceRaysIndirectKHR-indirectDeviceAddress-03632]]
-    If the buffer from which pname:indirectDeviceAddress was queried is
-    non-sparse then it must: be bound completely and contiguously to a
-    single sname:VkDeviceMemory object
-  * [[VUID-vkCmdTraceRaysIndirectKHR-indirectDeviceAddress-03633]]
-    The buffer from which pname:indirectDeviceAddress was queried must: have
-    been created with the ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set
-  * [[VUID-vkCmdTraceRaysIndirectKHR-indirectDeviceAddress-03634]]
-    pname:indirectDeviceAddress must: be a multiple of `4`
-  * [[VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-03635]]
-    pname:commandBuffer must: not be a protected command buffer
-  * [[VUID-vkCmdTraceRaysIndirectKHR-indirectDeviceAddress-03636]]
-    All device addresses between pname:indirectDeviceAddress and
-    [eq]#pname:indirectDeviceAddress {plus}
-    code:sizeof(sname:VkTraceRaysIndirectCommandKHR) - 1# must: be in the
-    buffer device address range of the same buffer
-  * [[VUID-vkCmdTraceRaysIndirectKHR-rayTracingPipelineTraceRaysIndirect-03637]]
-    The <<features-rayTracingPipelineTraceRaysIndirect,
-    sname:VkPhysicalDeviceRayTracingPipelineFeaturesKHR::pname:rayTracingPipelineTraceRaysIndirect>>
-    feature must: be enabled
-ifdef::VK_NV_ray_tracing_motion_blur[]
-  * [[VUID-vkCmdTraceRaysIndirectKHR-rayTracingMotionBlurPipelineTraceRaysIndirect-04951]]
-    If the bound ray tracing pipeline was created with
-    ename:VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV
-    sname:VkPhysicalDeviceRayTracingMotionBlurFeaturesNV::pname:rayTracingMotionBlurPipelineTraceRaysIndirect
-    feature must: be enabled
-endif::VK_NV_ray_tracing_motion_blur[]
-****
-
-include::{generated}/validity/protos/vkCmdTraceRaysIndirectKHR.txt[]
---
-
-[open,refpage='VkTraceRaysIndirectCommandKHR',desc='Structure specifying the parameters of an indirect ray tracing command',type='structs']
---
-:refpage: VkTraceRaysIndirectCommandKHR
-
-The sname:VkTraceRaysIndirectCommandKHR structure is defined as:
-
-include::{generated}/api/structs/VkTraceRaysIndirectCommandKHR.txt[]
-
-  * pname:width is the width of the ray trace query dimensions.
-  * pname:height is height of the ray trace query dimensions.
-  * pname:depth is depth of the ray trace query dimensions.
-
-The members of sname:VkTraceRaysIndirectCommandKHR have the same meaning as
-the similarly named parameters of flink:vkCmdTraceRaysKHR.
-
-.Valid Usage
-****
-  * [[VUID-VkTraceRaysIndirectCommandKHR-width-03638]]
-    pname:width must: be less than or equal to
-    [eq]#sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[0]
-    {times} sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupSize[0]#
-  * [[VUID-VkTraceRaysIndirectCommandKHR-height-03639]]
-    pname:height must: be less than or equal to
-    [eq]#sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[1]
-    {times} sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupSize[1]#
-  * [[VUID-VkTraceRaysIndirectCommandKHR-depth-03640]]
-    pname:depth must: be less than or equal to
-    [eq]#sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupCount[2]
-    {times} sname:VkPhysicalDeviceLimits::pname:maxComputeWorkGroupSize[2]#
-  * [[VUID-VkTraceRaysIndirectCommandKHR-width-03641]]
-    [eq]#pname:width {times} pname:height {times} pname:depth# must: be less
-    than or equal to
-    sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:maxRayDispatchInvocationCount
-****
-
-include::{generated}/validity/structs/VkTraceRaysIndirectCommandKHR.txt[]
---
-endif::VK_KHR_ray_tracing_pipeline[]
-
-
-[[shader-binding-table]]
-== Shader Binding Table
-
-A _shader binding table_ is a resource which establishes the relationship
-between the ray tracing pipeline and the acceleration structures that were
-built for the ray tracing pipeline.
-It indicates the shaders that operate on each geometry in an acceleration
-structure.
-In addition, it contains the resources accessed by each shader, including
-indices of textures, buffer device addresses, and constants.
-The application allocates and manages _shader binding tables_ as
-slink:VkBuffer objects.
-
-Each entry in the shader binding table consists of
-pname:shaderGroupHandleSize bytes of data, either as queried by
-flink:vkGetRayTracingShaderGroupHandlesKHR to refer to those specified
-shaders, or all zeros to refer to a zero shader group.
-A zero shader group behaves as though it is a shader group consisting
-entirely of ename:VK_SHADER_UNUSED_KHR.
-The remainder of the data specified by the stride is application-visible
-data that can be referenced by a code:ShaderRecordBufferKHR block in the
-shader.
-
-The shader binding tables to use in a ray tracing pipeline are passed to the
-ifdef::VK_NV_ray_tracing[]
-flink:vkCmdTraceRaysNV,
-endif::VK_NV_ray_tracing[]
-flink:vkCmdTraceRaysKHR, or flink:vkCmdTraceRaysIndirectKHR commands.
-Shader binding tables are read-only in shaders that are executing on the ray
-tracing pipeline.
-
-Shader variables identified with the code:ShaderRecordBufferKHR storage
-class are used to access the provided shader binding table.
-Such variables must: be:
-
-  * typed as code:OpTypeStruct, or an array of this type,
-  * identified with a code:Block decoration, and
-  * laid out explicitly using the code:Offset, code:ArrayStride, and
-    code:MatrixStride decorations as specified in
-    <<interfaces-resources-layout,Offset and Stride Assignment>>.
-
-The code:Offset decoration for any member of a code:Block-decorated variable
-in the code:ShaderRecordBufferKHR storage class must: not cause the space
-required for that variable to extend outside the range [eq]#[0,
-pname:maxStorageBufferRange)#.
-
-Accesses to the shader binding table from ray tracing pipelines must: be
-<<synchronization-dependencies,synchronized>> with the
-ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR
-<<synchronization-pipeline-stages, pipeline stage>> and an
-<<synchronization-access-types, access type>> of
-ename:VK_ACCESS_SHADER_READ_BIT.
-
-[NOTE]
-.Note
-====
-Because different shader record buffers can be associated with the same
-shader, a shader variable with code:ShaderRecordBufferKHR storage class will
-not be dynamically uniform if different invocations of the same shader can
-reference different data in the shader record buffer, such as if the same
-shader occurs twice in the shader binding table with a different shader
-record buffer.
-In this case, indexing resources based on values in the
-code:ShaderRecordBufferKHR storage class, the index should be decorated as
-code:NonUniform.
-====
-
-[[shader-binding-table-indexing-rules]]
-=== Indexing Rules
-
-In order to execute the correct shaders and access the correct resources
-during a ray tracing dispatch, the implementation must: be able to locate
-shader binding table entries at various stages of execution.
-This is accomplished by defining a set of indexing rules that compute shader
-binding table record positions relative to the buffer's base address in
-memory.
-The application must: organize the contents of the shader binding table's
-memory in a way that application of the indexing rules will lead to correct
-records.
-
-
-==== Ray Generation Shaders
-
-Only one ray generation shader is executed per ray tracing dispatch.
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-For flink:vkCmdTraceRaysKHR, the location of the ray generation shader is
-specified by the pname:pRaygenShaderBindingTable->deviceAddress parameter
--- there is no indexing.
-All data accessed must: be less than pname:pRaygenShaderBindingTable->size
-bytes from pname:deviceAddress.
-pname:pRaygenShaderBindingTable->stride is unused, and must: be equal to
-pname:pRaygenShaderBindingTable->size.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_NV_ray_tracing[]
-For flink:vkCmdTraceRaysNV, the location of the ray generation shader is
-specified by the pname:raygenShaderBindingTableBuffer and
-pname:raygenShaderBindingOffset parameters -- there is no indexing.
-endif::VK_NV_ray_tracing[]
-
-
-[[shader-binding-table-hit-shader-indexing]]
-==== Hit Shaders
-
-The base for the computation of intersection, any-hit, and closest hit
-shader locations is the code:instanceShaderBindingTableRecordOffset value
-stored with each instance of a top-level acceleration structure
-(slink:VkAccelerationStructureInstanceKHR).
-This value determines the beginning of the shader binding table records for
-a given instance.
-
-In the following rule, code:geometryIndex refers to the
-<<acceleration-structure-geometry-index, geometry index>> of the intersected
-geometry within the instance.
-
-The code:sbtRecordOffset and code:sbtRecordStride values are passed in as
-parameters to
-ifdef::VK_NV_ray_tracing[code:traceNV()]
-ifdef::VK_NV_ray_tracing+VK_KHR_ray_tracing_pipeline[ or ]
-ifdef::VK_KHR_ray_tracing_pipeline[code:traceRayEXT()]
-calls made in the shaders.
-See Section 8.19 (Ray Tracing Functions) of the OpenGL Shading Language
-Specification for more details.
-In SPIR-V, these correspond to the code:SBTOffset and code:SBTStride
-parameters to the
-ifdef::VK_NV_ray_tracing[code:OpTraceRayNV]
-ifdef::VK_NV_ray_tracing+VK_KHR_ray_tracing_pipeline[ or ]
-ifdef::VK_KHR_ray_tracing_pipeline[code:OpTraceRayKHR]
-ifdef::VK_NV_ray_tracing_motion_blur[ or code:OpTraceRayMotionNV]
-instruction.
-
-The result of this computation is then added to
-ifdef::VK_KHR_ray_tracing_pipeline[]
-pname:pHitShaderBindingTable->deviceAddress, a device address passed to
-flink:vkCmdTraceRaysKHR
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_NV_ray_tracing+VK_KHR_ray_tracing_pipeline[, or ]
-ifdef::VK_NV_ray_tracing[]
-pname:hitShaderBindingOffset, a base offset passed to flink:vkCmdTraceRaysNV
-endif::VK_NV_ray_tracing[]
-.
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-For flink:vkCmdTraceRaysKHR, the complete rule to compute a hit shader
-binding table record address in the pname:pHitShaderBindingTable is:
-
-  {empty}:: [eq]#pname:pHitShaderBindingTable->deviceAddress {plus}
-            pname:pHitShaderBindingTable->stride {times} (
-            code:instanceShaderBindingTableRecordOffset {plus}
-            code:geometryIndex {times} code:sbtRecordStride {plus}
-            code:sbtRecordOffset )#
-
-All data accessed must: be less than pname:pHitShaderBindingTable->size
-bytes from the base address.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_NV_ray_tracing[]
-For flink:vkCmdTraceRaysNV, the offset and stride come from direct
-parameters, so the full rule to compute a hit shader binding table record
-address in the pname:hitShaderBindingTableBuffer is:
-
-  {empty}:: [eq]#pname:hitShaderBindingOffset {plus}
-            pname:hitShaderBindingStride {times} (
-            code:instanceShaderBindingTableRecordOffset {plus}
-            code:geometryIndex {times} code:sbtRecordStride {plus}
-            code:sbtRecordOffset )#
-
-endif::VK_NV_ray_tracing[]
-
-
-==== Miss Shaders
-
-A miss shader is executed whenever a ray query fails to find an intersection
-for the given scene geometry.
-Multiple miss shaders may: be executed throughout a ray tracing dispatch.
-
-The base for the computation of miss shader locations is
-ifdef::VK_KHR_ray_tracing_pipeline[]
-pname:pMissShaderBindingTable->deviceAddress, a device address passed into
-flink:vkCmdTraceRaysKHR
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_NV_ray_tracing+VK_KHR_ray_tracing_pipeline[, or ]
-ifdef::VK_NV_ray_tracing[]
-pname:missShaderBindingOffset, a base offset passed into
-flink:vkCmdTraceRaysNV
-endif::VK_NV_ray_tracing[]
-.
-
-The code:missIndex value is passed in as a parameter to
-ifdef::VK_NV_ray_tracing[code:traceNV()]
-ifdef::VK_NV_ray_tracing+VK_KHR_ray_tracing_pipeline[ or ]
-ifdef::VK_KHR_ray_tracing_pipeline[code:traceRayEXT()]
-calls made in the shaders.
-See Section 8.19 (Ray Tracing Functions) of the OpenGL Shading Language
-Specification for more details.
-In SPIR-V, this corresponds to the code:MissIndex parameter to the
-ifdef::VK_NV_ray_tracing[code:OpTraceRayNV]
-ifdef::VK_NV_ray_tracing+VK_KHR_ray_tracing_pipeline[ or ]
-ifdef::VK_KHR_ray_tracing_pipeline[code:OpTraceRayKHR]
-ifdef::VK_NV_ray_tracing_motion_blur[ or code:OpTraceRayMotionNV]
-instruction.
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-For flink:vkCmdTraceRaysKHR, the complete rule to compute a miss shader
-binding table record address in the pname:pMissShaderBindingTable is:
-
-  {empty}:: [eq]#pname:pMissShaderBindingTable->deviceAddress {plus}
-            pname:pMissShaderBindingTable->stride {times} code:missIndex#
-
-All data accessed must: be less than pname:pMissShaderBindingTable->size
-bytes from the base address.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_NV_ray_tracing[]
-For flink:vkCmdTraceRaysNV, the offset and stride come from direct
-parameters, so the full rule to compute a miss shader binding table record
-address in the pname:missShaderBindingTableBuffer is:
-
-  {empty}:: [eq]#pname:missShaderBindingOffset {plus}
-            pname:missShaderBindingStride {times} code:missIndex#
-
-endif::VK_NV_ray_tracing[]
-
-
-==== Callable Shaders
-
-A callable shader is executed when requested by a ray tracing shader.
-Multiple callable shaders may: be executed throughout a ray tracing
-dispatch.
-
-The base for the computation of callable shader locations is
-ifdef::VK_KHR_ray_tracing_pipeline[]
-pname:pCallableShaderBindingTable->deviceAddress, a device address passed
-into flink:vkCmdTraceRaysKHR
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_NV_ray_tracing+VK_KHR_ray_tracing_pipeline[, or ]
-ifdef::VK_NV_ray_tracing[]
-pname:callableShaderBindingOffset, a base offset passed into
-flink:vkCmdTraceRaysNV
-endif::VK_NV_ray_tracing[]
-.
-
-The code:sbtRecordIndex value is passed in as a parameter to
-ifdef::VK_NV_ray_tracing[code:executeCallableNV()]
-ifdef::VK_NV_ray_tracing+VK_KHR_ray_tracing_pipeline[ or ]
-ifdef::VK_KHR_ray_tracing_pipeline[code:executeCallableEXT()]
-calls made in the shaders.
-See Section 8.19 (Ray Tracing Functions) of the OpenGL Shading Language
-Specification for more details.
-In SPIR-V, this corresponds to the code:SBTIndex parameter to the
-ifdef::VK_NV_ray_tracing[code:OpExecuteCallableNV]
-ifdef::VK_NV_ray_tracing+VK_KHR_ray_tracing_pipeline[ or ]
-ifdef::VK_KHR_ray_tracing_pipeline[code:OpExecuteCallableKHR]
-instruction.
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-For flink:vkCmdTraceRaysKHR, the complete rule to compute a callable shader
-binding table record address in the pname:pCallableShaderBindingTable is:
-
-  {empty}:: [eq]#pname:pCallableShaderBindingTable->deviceAddress {plus}
-            pname:pCallableShaderBindingTable->stride {times}
-            code:sbtRecordIndex#
-
-All data accessed must: be less than pname:pCallableShaderBindingTable->size
-bytes from the base address.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_NV_ray_tracing[]
-For flink:vkCmdTraceRaysNV, the offset and stride come from direct
-parameters, so the full rule to compute a callable shader binding table
-record address in the pname:callableShaderBindingTableBuffer is:
-
-  {empty}:: [eq]#pname:callableShaderBindingOffset {plus}
-            pname:callableShaderBindingStride {times} code:sbtRecordIndex#
-
-endif::VK_NV_ray_tracing[]
-
-
-[[ray-tracing-pipeline-stack]]
-== Ray Tracing Pipeline Stack
-
-Ray tracing pipelines have a potentially large set of shaders which may: be
-invoked in various call chain combinations to perform ray tracing.
-To store parameters for a given shader execution, an implementation may: use
-a stack of data in memory.
-This stack must: be sized to the sum of the stack sizes of all shaders in
-any call chain executed by the application.
-
-If the stack size is not set explicitly, the stack size for a pipeline is:
-
-  {empty}:: [eq]#rayGenStackMax {plus} min(1,
-            pname:maxPipelineRayRecursionDepth) {times}
-            max(closestHitStackMax, missStackMax, intersectionStackMax
-            {plus} anyHitStackMax) {plus} max(0,
-            pname:maxPipelineRayRecursionDepth-1) {times}
-            max(closestHitStackMax, missStackMax) {plus} 2 {times}
-            callableStackMax#
-
-where [eq]#rayGenStackMax#, [eq]#closestHitStackMax#, [eq]#missStackMax#,
-[eq]#anyHitStackMax#, [eq]#intersectionStackMax#, and [eq]#callableStackMax#
-are the maximum stack values queried by the respective shader stages for any
-shaders in any shader groups defined by the pipeline.
-
-This stack size is potentially significant, so an application may: want to
-provide a more accurate stack size after pipeline compilation.
-The value that the application provides is the maximum value of the sum of
-all shaders in a call chain across all possible call chains, taking into
-account any application specific knowledge about the properties of the call
-chains.
-
-[NOTE]
-.Note
-====
-For example, if an application has two types of closest hit and miss shaders
-that it can use but the first level of rays will only use the first kind
-(possibly reflection) and the second level will only use the second kind
-(occlusion or shadow ray, for example) then the application can compute the
-stack size by something similar to:
-
-  {empty}:: [eq]#code:rayGenStack {plus} max(code:closestHit1Stack,
-            code:miss1Stack) {plus} max(code:closestHit2Stack,
-            code:miss2Stack)#
-
-This is guaranteed to be no larger than the default stack size computation
-which assumes that both call levels may be the larger of the two.
-====
diff --git a/registry/vulkan/chapters/raytraversal.txt b/registry/vulkan/chapters/raytraversal.txt
deleted file mode 100644
index 280490e..0000000
--- a/registry/vulkan/chapters/raytraversal.txt
+++ /dev/null
@@ -1,602 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[ray-traversal]]
-= Ray Traversal
-
-The ray traversal process identifies and handles intersections between a ray
-and geometries in an acceleration structure.
-
-Ray traversal cannot be started by a Vulkan API command directly - a shader
-must execute
-ifdef::VK_KHR_ray_query[code:OpRayQueryProceedKHR]
-ifdef::VK_KHR_ray_query+VK_KHR_ray_tracing_pipeline[or]
-ifdef::VK_KHR_ray_tracing_pipeline[code:OpTraceRayKHR]
-.
-ifdef::VK_KHR_ray_tracing_pipeline[]
-When the <<features-rayTracingPipeline,pname:rayTracingPipeline>> feature is
-enabled, code:OpTraceRayKHR can: be used for <<ray-tracing, ray tracing>> in
-a <<pipelines-ray-tracing, ray tracing pipeline>>.
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_KHR_ray_query[]
-When the <<features-rayQuery,pname:rayQuery>> feature is enabled,
-code:OpRayQueryProceedKHR can: be used in any shader stage.
-endif::VK_KHR_ray_query[]
-
-[[ray-intersection-candidate-determination]]
-== Ray Intersection Candidate Determination
-
-Once tracing begins, rays are first tested against instances in a top-level
-acceleration structure.
-A ray that intersects an instance will be transformed into the space of the
-instance to continue traversal within that instance; therefore the transform
-matrix stored in the instance must be invertible.
-
-Next, rays are tested against geometries in an bottom-level acceleration
-structure to determine if a hit occurred between them, initially based only
-on their geometric properties (i.e. their vertices).
-The implementation performs similar operations to that of rasterization, but
-with the effective viewport determined by the parameters of the ray, and the
-geometry transformed into a space determined by that viewport.
-
-The vertices of each primitive are transformed from acceleration structure
-space #~as~# to ray space #~r~# according to the ray origin and direction as
-follows:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\left(
-    \begin{array}{c}
-        x_{r} \\
-        y_{r}\\
-        z_{r}
-    \end{array}
-\right) =
-\left(
-    \begin{matrix}
-        a_x^2(1-c)  + c    & a_xa_y(1-c) - sa_z & a_xa_z(1-c) + sa_y \\
-        a_xa_y(1-c) + sa_z & a_y^2(1-c)  + c    & a_ya_z(1-c) - sa_x \\
-        a_xa_z(1-c) - sa_y & a_ya_z(1-c) + sa_x & a_z^2(1-c)  + c
-    \end{matrix}
-\right)
-\left(
-    \begin{array}{c}
-        x_{as} - o_x \\
-        y_{as} - o_y \\
-        z_{as} - o_z
-    \end{array}
-\right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-latexmath:[\mathbf{a}] is the axis of rotation from the unnormalized ray
-direction vector latexmath:[\mathbf{d}] to the axis vector
-latexmath:[\mathbf{k}]:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\mathbf{a} = \begin{cases}
-    \frac{\mathbf{d} \times \mathbf{k}}{|| \mathbf{d} \times \mathbf{k} ||} & \mathrm{if}\; || \mathbf{d} \times \mathbf{k} || \ne 0 \\
-    \left(\begin{array}{c}
-    0 \\
-    1 \\
-    0
-    \end{array}
-    \right) & \mathrm{if}\; || \mathbf{d} \times \mathbf{k} || = 0 \\
-  \end{cases}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-latexmath:[\mathit{s}] and latexmath:[\mathit{c}] are the sine and cosine of
-the angle of rotation about latexmath:[\mathbf{a}] from
-latexmath:[\mathbf{d}] to latexmath:[\mathbf{k}]:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\begin{aligned}
-c      &= {{\mathbf{d} \cdot \mathbf{k}}\over{||\mathbf{d}||}} \\
-s      &= \sqrt{1 - c^2}
-\end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-latexmath:[\mathbf{k}] is the unit vector:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\mathbf{k} = \left(
-    \begin{array}{c}
-        0 \\
-        0 \\
-        -1
-    \end{array}
-\right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-latexmath:[\mathbf{o}] and latexmath:[\mathbf{d}] are the ray origin and
-unnormalized direction, respectively; the vector described by [eq]#x~as~#,
-[eq]#y~as~#, and [eq]#z~as~# is any position in acceleration structure
-space; and the vector described by [eq]#x~r~#, [eq]#y~r~#, and [eq]#z~r~# is
-the same position in ray space.
-
-An _intersection candidate_ is a unique point of intersection between a ray
-and a geometric primitive.
-For any primitive that has within its bounds a position
-latexmath:[\mathbf{xyz_{as}}] such that
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\begin{aligned}
-             x_r &= 0 \\
-             y_r &= 0 \\
-t_\mathit{min} \lt {-{z_r}\over{||\mathbf{d}||}}  &\lt t_\mathit{max}  & \text{if the primitive is a triangle,} \\
-t_\mathit{min} \leq {-{z_r}\over{||\mathbf{d}||}} &\leq t_\mathit{max} & \text{otherwise} \\
-\end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-(where latexmath:[t = {-{z_r}\over{||\mathbf{d}||}}]), an intersection
-candidate exists.
-
-Triangle primitive bounds consist of all points on the plane formed by the
-three vertices and within the bounds of the edges between the vertices,
-subject to the watertightness constraints below.
-AABB primitive bounds consist of all points within an implementation-defined
-bound which includes the specified box.
-
-[NOTE]
-.Note
-====
-The bounds of the AABB including all points internal to the bound implies
-that a ray started within the AABB will hit that AABB.
-====
-
-[[raytraversal-ray-intersection-candidate-diagram]]
-image::{images}/ray_intersection_candidate.svg[align="center",title="Ray intersection candidate",opts="{imageopts}"]
-
-The determination of this condition is performed in an implementation
-specific manner, and may: be performed with floating point operations.
-Due to the complexity and number of operations involved, inaccuracies are
-expected, particularly as the scale of values involved begins to diverge.
-Implementations should: take efforts to maintain as much precision as
-possible.
-
-[NOTE]
-.Note
-====
-One very common case is when geometries are close to each other at some
-distance from the origin in acceleration structure space, where an effect
-similar to "`z-fighting`" is likely to be observed.
-Applications can mitigate this by ensuring their detailed geometries remain
-close to the origin.
-
-Another likely case is when the origin of a ray is set to a position on a
-previously intersected surface, and its [eq]#t~min~# is zero or near zero;
-an intersection may be detected on the emitting surface.
-This case can usually be mitigated by offsetting [eq]#t~min~# slightly.
-====
-
-ifdef::VK_NV_ray_tracing_motion_blur[]
-For a motion primitive or a motion instance, the positions for intersection
-are evaluated at the time specified in the code:time parameter to
-code:OpTraceRayMotionNV by interpolating between the two endpoints as
-specified for the given motion type.
-If a motion acceleration structure is traced with code:OpTraceRayKHR, it
-behaves as a code:OpTraceRayMotionNV with code:time of 0.0.
-endif::VK_NV_ray_tracing_motion_blur[]
-
-In the case of AABB geometries, implementations may: increase their size in
-an acceleration structure in order to mitigate precision issues.
-This may: result in false positive intersections being reported to the
-application.
-
-For triangle intersection candidates, the [eq]#b# and [eq]#c#
-<<primsrast-polygon-barycentrics,barycentric coordinates>> on the triangle
-where the above condition is met are made available to future shading.
-ifdef::VK_KHR_ray_tracing_pipeline[]
-If the ray was traced with code:OpTraceRayKHR, these values are available as
-a vector of 2 32-bit floating point values in the code:HitAttributeKHR
-storage class.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-Once an intersection candidate is determined, it proceeds through the
-following operations, in order:
-
-    . <<ray-intersection-culling>>
-    . <<ray-intersection-confirmation>>
-    . <<ray-closest-hit-determination>>
-    . <<ray-result-determination>>
-
-The sections below describe the exact details of these tests.
-There is no ordering guarantee between operations performed on different
-intersection candidates.
-
-
-[[ray-traversal-watertight]]
-=== Watertightness
-
-For a set of triangles with identical transforms, within a single instance:
-
-  * Any set of two or more triangles where all triangles have one vertex
-    with an identical position value, that vertex is a _shared vertex_.
-  * Any set of two triangles with two shared vertices that were specified in
-    the same <<drawing-triangle-lists, winding order>> in each triangle have
-    a _shared edge_ defined by those vertices.
-
-A _closed fan_ is a set of three or more triangles where:
-
- * All triangles in the set have the same shared vertex as one of their
-   vertices.
- * All edges that include the above vertex are shared edges.
- * All above shared edges are shared by exactly two triangles from the set.
- * No two triangles in the set intersect, except at shared edges.
- * Every triangle in the set is joined to every other triangle in the set by
-   a series of the above shared edges.
-
-Implementations should: not double-hit or miss when a ray intersects a
-shared edge, or a shared vertex of a closed fan.
-
-
-[[ray-intersection-culling]]
-== Ray Intersection Culling
-
-Candidate intersections go through several phases of culling before
-confirmation as an actual hit.
-There is no particular ordering dependency between the different culling
-operations.
-
-
-[[ray-traversal-culling-primitive]]
-=== Ray Primitive Culling
-
-If the <<features-rayTraversalPrimitiveCulling,
-pname:rayTraversalPrimitiveCulling>> or <<features-rayQuery,
-pname:rayQuery>> features are enabled, the code:SkipTrianglesKHR and
-code:SkipAABBsKHR ray flags can: be specified when tracing a ray.
-
-If code:SkipTrianglesKHR was included in the `Ray Flags` operand of the ray
-trace instruction, and the intersection is with a triangle primitive, the
-intersection is dropped, and no further processing of this intersection
-occurs.
-If ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR was included
-in the pipeline, traversal with code:OpTraceRayKHR calls will all behave as
-if code:SkipTrianglesKHR was included in its `Ray Flags` operand.
-
-If code:SkipAABBsKHR was included in the `Ray Flags` operand of the ray
-trace instruction, and the intersection is with an AABB primitive, the
-intersection is dropped, and no further processing of this intersection
-occurs.
-If ename:VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR was included in
-the pipeline, traversal with code:OpTraceRayKHR calls will all behave as if
-code:SkipAABBsKHR was included in its `Ray Flags` operand.
-
-
-=== Ray Mask Culling
-
-Instances can: be made invisible to particular rays based on the value of
-slink:VkAccelerationStructureInstanceKHR::pname:mask used to add that
-instance to a top-level acceleration structure, and the `Cull Mask`
-parameter used to trace the ray.
-
-For the instance which is intersected, if [eq]#pname:mask & `Cull Mask` ==
-0#, the intersection is dropped, and no further processing occurs.
-
-
-[[ray-traversal-culling-face]]
-=== Ray Face Culling
-
-As in <<primsrast-polygons-basic,polygon rasterization>>, one of the stages
-of ray traversal is to determine if a triangle primitive is back- or
-front-facing, and primitives can: be culled based on that facing.
-
-If the intersection candidate is with an AABB primitive, this operation is
-skipped.
-
-.Determination
-
-When a ray intersects a triangle primitive, the order that vertices are
-specified for the polygon affects whether the ray intersects the front or
-back face.
-Front or back facing is determined in the same way as they are for
-<<primsrast-polygons-basic,rasterization>>, based on the sign of the
-polygon's area but using the ray space coordinates instead of framebuffer
-coordinates.
-One way to compute this area is:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-a = -{1 \over 2}\sum_{i=0}^{n-1}
-      x_r^i y_r^{i \oplus 1} -
-      x_r^{i \oplus 1} y_r^i
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-where latexmath:[x_r^i] and latexmath:[y_r^i] are the [eq]#x# and [eq]#y#
-<<ray-intersection-candidate-determination,ray space coordinates>> of the
-[eq]##i##th vertex of the [eq]#n#-vertex polygon (vertices are numbered
-starting at zero for the purposes of this computation) and [eq]#i {oplus} 1#
-is [eq]#(i {plus} 1) mod n#.
-
-By default, if [eq]#a# is negative then the intersection is with the front
-face of the triangle, otherwise it is with the back face.
-If ename:VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR is included in
-slink:VkAccelerationStructureInstanceKHR::pname:flags for the instance
-containing the intersected triangle, this determination is reversed.
-Additionally, if [eq]#a# is 0, the intersection candidate is treated as not
-intersecting with any face, irrespective of the sign.
-
-[NOTE]
-.Note
-====
-In a left-handed coordinate system, an intersection will be with the front
-face of a triangle if the vertices of the triangle, as defined in index
-order, appear from the ray's perspective in a clockwise rotation order.
-ename:VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR was previously
-annotated as
-ename:VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR because
-of this.
-====
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-If the ray was traced with code:OpTraceRayKHR, the code:HitKindKHR built-in
-is set to code:HitKindFrontFacingTriangleKHR if the intersection is with
-front-facing geometry, and code:HitKindBackFacingTriangleKHR if the
-intersection is with back-facing geometry, for shader stages considering
-this intersection.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_KHR_ray_query[]
-If the ray was traced with code:OpRayQueryProceedKHR,
-code:OpRayQueryGetIntersectionFrontFaceKHR will return true for intersection
-candidates with front faces, or false for back faces.
-endif::VK_KHR_ray_query[]
-
-.Culling
-
-If code:CullBackFacingTrianglesKHR was included in the `Ray Flags` parameter
-of the ray trace instruction, and the intersection is determined as with the
-back face of a triangle primitive, the intersection is dropped, and no
-further processing of this intersection occurs.
-
-If code:CullFrontFacingTrianglesKHR was included in the `Ray Flags`
-parameter of the ray trace instruction, and the intersection is determined
-as with the front face of a triangle primitive, the intersection is dropped,
-and no further processing of this intersection occurs.
-
-This culling is disabled if
-ename:VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR was included
-in slink:VkAccelerationStructureInstanceKHR::pname:flags for the instance
-which the intersected geometry belongs to.
-
-Intersection candidates that have not intersected with any face ([eq]#a ==
-0#) are unconditionally culled, irrespective of ray flags and geometry
-instance flags.
-
-
-=== Ray Opacity Culling
-
-Each geometry in the acceleration structure may: be considered either opaque
-or not.
-Opaque geometries continue through traversal as normal, whereas non-opaque
-geometries need to be either confirmed or discarded by shader code.
-Intersection candidates can: also be culled based on their opacity.
-
-.Determination
-
-Each individual intersection candidate is initally determined as opaque if
-ename:VK_GEOMETRY_OPAQUE_BIT_KHR was included in the
-slink:VkAccelerationStructureGeometryKHR::pname:flags when the geometry it
-intersected with was built, otherwise it is considered non-opaque.
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-If the intersection candidate was generated by an <<shaders-intersection,
-intersection shader>>, the intersection is initially considered to have
-opacity matching the AABB candidate that it was generated from.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-However, this opacity can be overridden when it is built into an instance.
-Setting ename:VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR in
-slink:VkAccelerationStructureInstanceKHR::pname:flags will force all
-geometries in the instance to be considered opaque.
-Similarly, setting ename:VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR will
-force all geometries in the instance to be considered non-opaque.
-
-This can again be overridden by including code:OpaqueKHR or code:NoOpaqueKHR
-in the `Ray Flags` parameter when tracing a ray.
-code:OpaqueKHR forces all geometries to behave as if they are opaque,
-regardless of their build parameters.
-Similarly, code:NoOpaqueKHR forces all geometries to behave as if they are
-non-opaque.
-
-ifdef::VK_KHR_ray_query[]
-If the ray was traced with code:OpRayQueryProceedKHR, to determine the
-opacity of AABB intersection candidates,
-code:OpRayQueryGetIntersectionCandidateAABBOpaqueKHR can: be used.
-This instruction will return code:true for opaque intersection candidates,
-and code:false for non-opaque intersection candidates.
-endif::VK_KHR_ray_query[]
-
-.Culling
-
-If code:CullOpaqueKHR is included in the `Ray Flags` parameter when tracing
-a ray, an intersection with a geometry that is considered opaque is dropped,
-and no further processing occurs.
-
-If code:CullNoOpaqueKHR is included in the `Ray Flags` parameter when
-tracing a ray, an intersection with a geometry that is considered non-opaque
-is dropped, and no further processing occurs.
-
-
-[[ray-intersection-confirmation]]
-== Ray Intersection Confirmation
-
-Depending on the opacity of intersected geometry and whether it is a
-triangle or an AABB, candidate intersections are further processed to
-determine the eventual hit result.
-Candidates generated from AABB intersections run through the same
-confirmation process as triangle hits.
-
-
-=== AABB Intersection Candidates
-
-For an intersection candidate with an AABB geometry generated by
-<<ray-intersection-candidate-determination>>, shader code is executed to
-determine whether any hits should be reported to the traversal
-infrastructure; no further processing of this intersection candidate occurs.
-The occurrence of an AABB intersection candidate does not guarantee the ray
-intersects the primitive bounds.
-To avoid propagating false intersections the application should: verify the
-intersection candidate before reporting any hits.
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-If the ray was traced with code:OpTraceRayKHR, an <<shaders-intersection,
-intersection shader>> is invoked from the <<shader-binding-table>> according
-to the <<shader-binding-table-indexing-rules, specified indexing>> for the
-intersected geometry.
-If this shader calls code:OpReportIntersectionKHR, a new intersection
-candidate is generated as described
-<<aabb-intersection-candidate-generation, below>>.
-If the intersection shader is ename:VK_SHADER_UNUSED_KHR (which is only
-allowed for a zero shader group) then no further processing of the
-intersection candidate occurs.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-[[aabb-intersection-candidate-generation]]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-Each new candidate generated as a result of this processing is a generated
-intersection candidate that intersects the AABB geometry, with a [eq]#t#
-value equal to the `Hit` parameter of the code:OpReportIntersectionKHR
-instruction.
-The new generated candidate is then independently run through
-<<ray-intersection-confirmation>> as a
-<<ray-triangle-and-generated-intersection-candidates, generated
-intersection>>.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_KHR_ray_query[]
-If the ray was traced with code:OpRayQueryProceedKHR, control is returned to
-the shader which executed code:OpRayQueryProceedKHR, returning code:true.
-The resulting ray query has a candidate intersection type of
-code:RayQueryCandidateIntersectionAABBKHR.
-code:OpRayQueryGenerateIntersectionKHR can: be called to commit a new
-intersection candidate with committed intersection type of
-code:RayQueryCommittedIntersectionGeneratedKHR.
-Further ray query processing can: be continued by executing
-code:OpRayQueryProceedKHR with the same ray query, or intersection can: be
-terminated with code:OpRayQueryTerminateKHR.
-endif::VK_KHR_ray_query[]
-ifdef::VK_KHR_ray_tracing_pipeline+VK_KHR_ray_query[]
-Unlike rays traced with code:OpTraceRayKHR, candidates generated in this way
-skip generated intersection candidate confirmation; applications should:
-make this determination before generating the intersection.
-endif::VK_KHR_ray_tracing_pipeline+VK_KHR_ray_query[]
-
-This operation may: be executed multiple times for the same intersection
-candidate.
-
-
-[[ray-triangle-and-generated-intersection-candidates]]
-=== Triangle and Generated Intersection Candidates
-
-For triangle and <<aabb-intersection-candidate-generation, generated
-intersection candidates>>, additional shader code may: be executed based on
-the intersection's opacity.
-
-If the intersection is opaque, the candidate is immediately confirmed as a
-valid hit and passes to the next stage of processing.
-
-For non-opaque intersection candidates, shader code is executed to determine
-whether a hit occurred or not.
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-If the ray was traced with code:OpTraceRayKHR, an <<shaders-any-hit, any-hit
-shader>> is invoked from the <<shader-binding-table>> according to the
-specified indexing.
-If this shader calls code:OpIgnoreIntersectionKHR, the candidate is dropped
-and no further processing of the candidate occurs.
-If the <<shaders-any-hit, any-hit shader>> identified is
-ename:VK_SHADER_UNUSED_KHR, the candidate is immediately confirmed as a
-valid hit and passes to the next stage of processing.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_KHR_ray_query[]
-If the ray was traced with code:OpRayQueryProceedKHR, control is returned to
-the shader which executed code:OpRayQueryProceedKHR, returning code:true.
-As only triangle candidates participate in this operation with ray queries,
-the resulting candidate intersection type is always
-code:RayQueryCandidateIntersectionTriangleKHR.
-code:OpRayQueryConfirmIntersectionKHR can: be called on the ray query to
-confirm the candidate as a hit with committed intersection type of
-code:RayQueryCommittedIntersectionTriangleKHR.
-Further ray query processing can: be continued by executing
-code:OpRayQueryProceedKHR with the same ray query, or intersection can: be
-terminated with code:OpRayQueryTerminateKHR.
-If code:OpRayQueryConfirmIntersectionKHR has not been executed, the
-candidate is dropped and no further processing of the candidate occurs.
-endif::VK_KHR_ray_query[]
-
-This operation may: be executed multiple times for the same intersection
-candidate unless ename:VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR
-was specified for the intersected geometry.
-
-
-[[ray-closest-hit-determination]]
-== Ray Closest Hit Determination
-
-Unless the ray was traced with the code:TerminateOnFirstHitKHR ray flag, the
-implementation must: track the closest confirmed hit until all geometries
-have been tested and either confirmed or dropped.
-
-After an intersection candidate is confirmed, its [eq]#t# value is compared
-to [eq]#t~max~# to determine which intersection is closer, where [eq]#t# is
-the parametric distance along the ray at which the intersection occurred.
-
-  * If [eq]#t < t~max~#, [eq]#t~max~# is set to [eq]#t# and the candidate is
-    set as the current closest hit.
-  * If [eq]#t > t~max~#, the candidate is dropped and no further processing
-    of that candidate occurs.
-  * If [eq]#t = t~max~#, the candidate may: be set as the current closest
-    hit or dropped.
-
-If code:TerminateOnFirstHitKHR was included in the `Ray Flags` used to trace
-the ray, once the first hit is confirmed, the ray trace is terminated.
-
-
-[[ray-result-determination]]
-== Ray Result Determination
-
-Once all candidates have finished processing the prior stages, or if the ray
-is forcibly terminated, the final result of the ray trace is determined.
-
-If a closest hit result was identified by <<ray-closest-hit-determination>>,
-a closest hit has occurred, otherwise the final result is a miss.
-
-ifdef::VK_KHR_ray_tracing_pipeline[]
-For rays traced with code:OpTraceRayKHR, if a closest hit result was
-identified, a <<shaders-closest-hit, closest hit shader>> is invoked from
-the <<shader-binding-table>> according to the
-<<shader-binding-table-indexing-rules, specified indexing>> for the
-intersected geometry.
-Control returns to the shader that executed code:OpTraceRayKHR once this
-shader returns.
-This shader is skipped if either the ray flags included
-code:SkipClosestHitShaderKHR, or if the <<shaders-closest-hit, closest hit
-shader>> identified is ename:VK_SHADER_UNUSED_KHR.
-
-For rays traced with code:OpTraceRayKHR where no hit result was identified,
-the <<shaders-miss, miss shader>> identified by the `Miss Index` parameter
-of code:OpTraceRayKHR is invoked.
-Control returns to the shader that executed code:OpTraceRayKHR once this
-shader returns.
-This shader is skipped if the miss shader identified is
-ename:VK_SHADER_UNUSED_KHR.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-ifdef::VK_KHR_ray_query[]
-If the ray was traced with code:OpRayQueryProceedKHR, control is returned to
-the shader which executed code:OpRayQueryProceedKHR, returning code:false.
-If a closest hit was identified by <<ray-closest-hit-determination>>, the
-ray query will now have a committed intersection type of
-code:RayQueryCommittedIntersectionGeneratedKHR or
-code:RayQueryCommittedIntersectionTriangleKHR.
-If no closest hit was identified, the committed intersection type will be
-code:RayQueryCommittedIntersectionNoneKHR.
-
-No further processing of a ray query occurs after this result is determined.
-endif::VK_KHR_ray_query[]
diff --git a/registry/vulkan/chapters/renderpass.txt b/registry/vulkan/chapters/renderpass.txt
deleted file mode 100644
index f7db1f0..0000000
--- a/registry/vulkan/chapters/renderpass.txt
+++ /dev/null
@@ -1,5719 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[renderpass]]
-= Render Pass
-
-<<drawing, Draw commands>> must: be recorded within a _render pass
-instance_.
-Each render pass instance defines a set of image resources, referred to as
-_attachments_, used during rendering.
-
-ifdef::VK_KHR_dynamic_rendering[]
-[open,refpage='vkCmdBeginRenderingKHR',desc='Begin a dynamic render pass instance',type='protos']
---
-To begin a render pass instance, call:
-
-include::{generated}/api/protos/vkCmdBeginRenderingKHR.txt[]
-
-  * pname:commandBuffer is the command buffer in which to record the
-    command.
-  * pname:pRenderingInfo is a pointer to a slink:VkRenderingInfoKHR
-    structure specifying details of the render pass instance to begin.
-
-After beginning a render pass instance, the command buffer is ready to
-record <<drawing,draw commands>>.
-
-If pname:pRenderingInfo->flags includes ename:VK_RENDERING_RESUMING_BIT_KHR
-then this render pass is resumed from a render pass instance that has been
-suspended earlier in <<synchronization-submission-order, submission order>>.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBeginRenderingKHR-dynamicRendering-06446]]
-    The <<features-dynamicRendering,pname:dynamicRendering>> feature must:
-    be enabled
-  * [[VUID-vkCmdBeginRenderingKHR-commandBuffer-06068]]
-    If pname:commandBuffer is a secondary command buffer,
-    pname:pRenderingInfo->flags must: not include
-    ename:VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR
-****
-
-include::{generated}/validity/protos/vkCmdBeginRenderingKHR.txt[]
---
-
-[open,refpage='VkRenderingInfoKHR',desc='Structure specifying render pass instance begin info',type='structs']
---
-The sname:VkRenderingInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkRenderingInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkRenderingFlagBitsKHR.
-  * pname:renderArea is the render area that is affected by the render pass
-    instance.
-  * pname:layerCount is the number of layers rendered to in each attachment
-    when pname:viewMask is `0`.
-  * pname:viewMask is the view mask indicating the indices of attachment
-    layers that will be rendered when it is not `0`.
-  * pname:colorAttachmentCount is the number of elements in
-    pname:pColorAttachments.
-  * pname:pColorAttachments is a pointer to an array of
-    pname:colorAttachmentCount slink:VkRenderingAttachmentInfoKHR structures
-    describing any color attachments used.
-  * pname:pDepthAttachment is a pointer to a
-    slink:VkRenderingAttachmentInfoKHR structure describing a depth
-    attachment.
-  * pname:pStencilAttachment is a pointer to a
-    slink:VkRenderingAttachmentInfoKHR structure describing a stencil
-    attachment.
-
-ifdef::VK_KHR_multiview,VK_VERSION_1_1[]
-If pname:viewMask is not `0`, multiview is enabled.
-endif::VK_KHR_multiview,VK_VERSION_1_1[]
-
-ifdef::VK_KHR_device_group,VK_VERSION_1_1[]
-If there is an instance of slink:VkDeviceGroupRenderPassBeginInfo included
-in the pname:pNext chain and its pname:deviceCount member is not `0`, then
-pname:renderArea is ignored, and the render area is defined per-device by
-that structure.
-endif::VK_KHR_device_group,VK_VERSION_1_1[]
-
-Each element of the pname:pColorAttachments array corresponds to an output
-location in the shader, i.e. if the shader declares an output variable
-decorated with a code:Location value of *X*, then it uses the attachment
-provided in pname:pColorAttachments[*X*].
-If the pname:imageView member of any element of pname:pColorAttachments is
-dlink:VK_NULL_HANDLE, writes to the corresponding location by a fragment are
-discarded.
-
-.Valid Usage
-****
-  * [[VUID-VkRenderingInfoKHR-viewMask-06069]]
-    If pname:viewMask is `0`, pname:layerCount must: not be `0`
-  * [[VUID-VkRenderingInfoKHR-imageView-06070]]
-    If neither the apiext:VK_AMD_mixed_attachment_samples nor the
-    apiext:VK_NV_framebuffer_mixed_samples extensions are enabled,
-    pname:imageView members of pname:pDepthAttachment,
-    pname:pStencilAttachment, and elements of pname:pColorAttachments that
-    are not dlink:VK_NULL_HANDLE must: have been created with the same
-    pname:sampleCount
-ifndef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkRenderingInfoKHR-renderArea-06071]]
-    pname:renderArea.offset.x must: be greater than or equal to 0
-  * [[VUID-VkRenderingInfoKHR-renderArea-06072]]
-    pname:renderArea.offset.y must: be greater than or equal to 0
-  * [[VUID-VkRenderingInfoKHR-renderArea-06073]]
-    The sum of pname:renderArea.offset.x and pname:renderArea.extent.width
-    must: be less than or equal to <<limits-maxFramebufferWidth,
-    pname:maxFramebufferWidth>>
-  * [[VUID-VkRenderingInfoKHR-renderArea-06074]]
-    The sum of pname:renderArea.offset.y and pname:renderArea.extent.height
-    must: be less than or equal to <<limits-maxFramebufferHeight,
-    pname:maxFramebufferHeight>>
-  * [[VUID-VkRenderingInfoKHR-imageView-06075]]
-    The width of the pname:imageView member of any element of
-    pname:pColorAttachments, pname:pDepthAttachment, or
-    pname:pStencilAttachment that is not dlink:VK_NULL_HANDLE must: be
-    greater than or equal to [eq]#pname:renderArea.offset.x {plus}
-    pname:renderArea.extent.width#
-  * [[VUID-VkRenderingInfoKHR-imageView-06076]]
-    The height of the pname:imageView member of any element of
-    pname:pColorAttachments, pname:pDepthAttachment, or
-    pname:pStencilAttachment that is not dlink:VK_NULL_HANDLE must: be
-    greater than or equal to [eq]#pname:renderArea.offset.y {plus}
-    pname:renderArea.extent.height#
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkRenderingInfoKHR-pNext-06077]]
-    If the pname:pNext chain does not contain
-    slink:VkDeviceGroupRenderPassBeginInfo or its
-    pname:deviceRenderAreaCount member is equal to 0,
-    pname:renderArea.offset.x must: be greater than or equal to 0
-  * [[VUID-VkRenderingInfoKHR-pNext-06078]]
-    If the pname:pNext chain does not contain
-    slink:VkDeviceGroupRenderPassBeginInfo or its
-    pname:deviceRenderAreaCount member is equal to 0,
-    pname:renderArea.offset.y must: be greater than or equal to 0
-  * [[VUID-VkRenderingInfoKHR-pNext-06079]]
-    If the pname:pNext chain does not contain
-    slink:VkDeviceGroupRenderPassBeginInfo or its
-    pname:deviceRenderAreaCount member is equal to 0, the width of the
-    pname:imageView member of any element of pname:pColorAttachments,
-    pname:pDepthAttachment, or pname:pStencilAttachment that is not
-    dlink:VK_NULL_HANDLE must: be greater than or equal to
-    [eq]#pname:renderArea.offset.x {plus} pname:renderArea.extent.width#
-  * [[VUID-VkRenderingInfoKHR-pNext-06080]]
-    If the pname:pNext chain does not contain
-    slink:VkDeviceGroupRenderPassBeginInfo or its
-    pname:deviceRenderAreaCount member is equal to 0, the height of the
-    pname:imageView member of any element of pname:pColorAttachments,
-    pname:pDepthAttachment, or pname:pStencilAttachment that is not
-    dlink:VK_NULL_HANDLE must: be greater than or equal to
-    [eq]#pname:renderArea.offset.y {plus} pname:renderArea.extent.height#
-  * [[VUID-VkRenderingInfoKHR-pNext-06081]]
-    If the pname:pNext chain contains
-    slink:VkDeviceGroupRenderPassBeginInfo, the pname:offset.x member of
-    each element of pname:pDeviceRenderAreas must: be greater than or equal
-    to 0
-  * [[VUID-VkRenderingInfoKHR-pNext-06082]]
-    If the pname:pNext chain contains
-    slink:VkDeviceGroupRenderPassBeginInfo, the pname:offset.y member of
-    each element of pname:pDeviceRenderAreas must: be greater than or equal
-    to 0
-  * [[VUID-VkRenderingInfoKHR-pNext-06083]]
-    If the pname:pNext chain contains
-    slink:VkDeviceGroupRenderPassBeginInfo, the width of the pname:imageView
-    member of any element of pname:pColorAttachments,
-    pname:pDepthAttachment, or pname:pStencilAttachment that is not
-    dlink:VK_NULL_HANDLE must: be greater than or equal to the sum of the
-    pname:offset.x and pname:extent.width members of each element of
-    pname:pDeviceRenderAreas
-  * [[VUID-VkRenderingInfoKHR-pNext-06084]]
-    If the pname:pNext chain contains
-    slink:VkDeviceGroupRenderPassBeginInfo, the height of the
-    pname:imageView member of any element of pname:pColorAttachments,
-    pname:pDepthAttachment, or pname:pStencilAttachment that is not
-    dlink:VK_NULL_HANDLE must: be greater than or equal to the sum of the
-    pname:offset.y and pname:extent.height members of each element of
-    pname:pDeviceRenderAreas
-  * [[VUID-VkRenderingInfoKHR-pDepthAttachment-06085]]
-    If neither pname:pDepthAttachment or pname:pStencilAttachment are `NULL`
-    and the pname:imageView member of either structure is not
-    dlink:VK_NULL_HANDLE, the pname:imageView member of each structure must:
-    be the same
-  * [[VUID-VkRenderingInfoKHR-pDepthAttachment-06086]]
-    If neither pname:pDepthAttachment or pname:pStencilAttachment are
-    `NULL`, and the pname:resolveMode member of each is not
-    ename:VK_RESOLVE_MODE_NONE, the pname:resolveImageView member of each
-    structure must: be the same
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkRenderingInfoKHR-colorAttachmentCount-06087]]
-    If pname:colorAttachmentCount is not `0` and the pname:imageView member
-    of an element of pname:pColorAttachments is not dlink:VK_NULL_HANDLE,
-    that pname:imageView must: have been created with
-    ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
-  * [[VUID-VkRenderingInfoKHR-pDepthAttachment-06088]]
-    If pname:pDepthAttachment is not `NULL` and
-    pname:pDepthAttachment->imageView is not dlink:VK_NULL_HANDLE,
-    pname:pDepthAttachment->imageView must: have been created with
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkRenderingInfoKHR-pStencilAttachment-06089]]
-    If pname:pStencilAttachment is not `NULL` and
-    pname:pStencilAttachment->imageView is not dlink:VK_NULL_HANDLE,
-    pname:pStencilAttachment->imageView must: have been created with a
-    stencil usage including
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkRenderingInfoKHR-colorAttachmentCount-06090]]
-    If pname:colorAttachmentCount is not `0` and the pname:imageView member
-    of an element of pname:pColorAttachments is not dlink:VK_NULL_HANDLE,
-    the pname:layout member of that element of pname:pColorAttachments must:
-    not be ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkRenderingInfoKHR-colorAttachmentCount-06091]]
-    If pname:colorAttachmentCount is not `0` and the pname:imageView member
-    of an element of pname:pColorAttachments is not dlink:VK_NULL_HANDLE, if
-    the pname:resolveMode member of that element of pname:pColorAttachments
-    is not ename:VK_RESOLVE_MODE_NONE, its pname:resolveImageLayout member
-    must: not be ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkRenderingInfoKHR-pDepthAttachment-06092]]
-    If pname:pDepthAttachment is not `NULL` and
-    pname:pDepthAttachment->imageView is not dlink:VK_NULL_HANDLE,
-    pname:pDepthAttachment->layout must: not be
-    ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-  * [[VUID-VkRenderingInfoKHR-pDepthAttachment-06093]]
-    If pname:pDepthAttachment is not `NULL`,
-    pname:pDepthAttachment->imageView is not dlink:VK_NULL_HANDLE, and
-    pname:pDepthAttachment->resolveMode is not ename:VK_RESOLVE_MODE_NONE,
-    pname:pDepthAttachment->resolveImageLayout must: not be
-    ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-  * [[VUID-VkRenderingInfoKHR-pStencilAttachment-06094]]
-    If pname:pStencilAttachment is not `NULL` and
-    pname:pStencilAttachment->imageView is not dlink:VK_NULL_HANDLE,
-    pname:pStencilAttachment->layout must: not be
-    ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-  * [[VUID-VkRenderingInfoKHR-pStencilAttachment-06095]]
-    If pname:pStencilAttachment is not `NULL`,
-    pname:pStencilAttachment->imageView is not dlink:VK_NULL_HANDLE, and
-    pname:pStencilAttachment->resolveMode is not ename:VK_RESOLVE_MODE_NONE,
-    pname:pStencilAttachment->resolveImageLayout must: not be
-    ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-ifdef::VK_KHR_maintenance2,VK_VERSION_1_1[]
-  * [[VUID-VkRenderingInfoKHR-colorAttachmentCount-06096]]
-    If pname:colorAttachmentCount is not `0` and the pname:imageView member
-    of an element of pname:pColorAttachments is not dlink:VK_NULL_HANDLE,
-    the pname:layout member of that element of pname:pColorAttachments must:
-    not be ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL
-    or ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkRenderingInfoKHR-colorAttachmentCount-06097]]
-    If pname:colorAttachmentCount is not `0` and the pname:imageView member
-    of an element of pname:pColorAttachments is not dlink:VK_NULL_HANDLE, if
-    the pname:resolveMode member of that element of pname:pColorAttachments
-    is not ename:VK_RESOLVE_MODE_NONE, its pname:resolveImageLayout member
-    must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkRenderingInfoKHR-pDepthAttachment-06098]]
-    If pname:pDepthAttachment is not `NULL`,
-    pname:pDepthAttachment->imageView is not dlink:VK_NULL_HANDLE, and
-    pname:pDepthAttachment->resolveMode is not ename:VK_RESOLVE_MODE_NONE,
-    pname:pDepthAttachment->resolveImageLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL
-  * [[VUID-VkRenderingInfoKHR-pStencilAttachment-06099]]
-    If pname:pStencilAttachment is not `NULL`,
-    pname:pStencilAttachment->imageView is not dlink:VK_NULL_HANDLE, and
-    pname:pStencilAttachment->resolveMode is not ename:VK_RESOLVE_MODE_NONE,
-    pname:pStencilAttachment->resolveImageLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL
-endif::VK_KHR_maintenance2,VK_VERSION_1_1[]
-ifdef::VK_KHR_separate_depth_stencil_layouts,VK_VERSION_1_2[]
-  * [[VUID-VkRenderingInfoKHR-colorAttachmentCount-06100]]
-    If pname:colorAttachmentCount is not `0` and the pname:imageView member
-    of an element of pname:pColorAttachments is not dlink:VK_NULL_HANDLE,
-    the pname:layout member of that element of pname:pColorAttachments must:
-    not be ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkRenderingInfoKHR-colorAttachmentCount-06101]]
-    If pname:colorAttachmentCount is not `0` and the pname:imageView member
-    of an element of pname:pColorAttachments is not dlink:VK_NULL_HANDLE, if
-    the pname:resolveMode member of that element of pname:pColorAttachments
-    is not ename:VK_RESOLVE_MODE_NONE, its pname:resolveImageLayout member
-    must: not be ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-endif::VK_KHR_separate_depth_stencil_layouts,VK_VERSION_1_2[]
-ifdef::VK_KHR_depth_stencil_resolve,VK_VERSION_1_2[]
-  * [[VUID-VkRenderingInfoKHR-pDepthAttachment-06102]]
-    If pname:pDepthAttachment is not `NULL` and
-    pname:pDepthAttachment->imageView is not dlink:VK_NULL_HANDLE,
-    pname:pDepthAttachment->resolveMode must: be one of the bits set in
-    slink:VkPhysicalDeviceDepthStencilResolveProperties::pname:supportedDepthResolveModes
-  * [[VUID-VkRenderingInfoKHR-pStencilAttachment-06103]]
-    If pname:pStencilAttachment is not `NULL` and
-    pname:pStencilAttachment->imageView is not dlink:VK_NULL_HANDLE,
-    pname:pStencilAttachment->resolveMode must: be one of the bits set in
-    slink:VkPhysicalDeviceDepthStencilResolveProperties::pname:supportedStencilResolveModes
-  * [[VUID-VkRenderingInfoKHR-pDepthAttachment-06104]]
-    If pname:pDepthAttachment or pname:pStencilAttachment are both not
-    `NULL`, pname:pDepthAttachment->imageView and
-    pname:pStencilAttachment->imageView are both not dlink:VK_NULL_HANDLE,
-    and
-    slink:VkPhysicalDeviceDepthStencilResolveProperties::pname:independentResolveNone
-    is ename:VK_FALSE, the pname:resolveMode of both structures must: be the
-    same value
-  * [[VUID-VkRenderingInfoKHR-pDepthAttachment-06105]]
-    If pname:pDepthAttachment or pname:pStencilAttachment are both not
-    `NULL`, pname:pDepthAttachment->imageView and
-    pname:pStencilAttachment->imageView are both not dlink:VK_NULL_HANDLE,
-    slink:VkPhysicalDeviceDepthStencilResolveProperties::pname:independentResolve
-    is ename:VK_FALSE, and the pname:resolveMode of neither structure is
-    ename:VK_RESOLVE_MODE_NONE, the pname:resolveMode of both structures
-    must: be the same value
-endif::VK_KHR_depth_stencil_resolve,VK_VERSION_1_2[]
-  * [[VUID-VkRenderingInfoKHR-colorAttachmentCount-06106]]
-    pname:colorAttachmentCount must: be less than or equal to
-    slink:VkPhysicalDeviceLimits::pname:maxColorAttachments
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-VkRenderingInfoKHR-imageView-06107]]
-    If the pname:imageView member of a
-    slink:VkRenderingFragmentDensityMapAttachmentInfoEXT structure included
-    in the pname:pNext chain is not dlink:VK_NULL_HANDLE, and
-    <<features-fragmentDensityMapNonSubsampledImages,non-subsample image
-    feature>> is not enabled, valid pname:imageView and
-    pname:resolveImageView members of pname:pDepthAttachment,
-    pname:pStencilAttachment, and each element of pname:pColorAttachments
-    must: be a slink:VkImageView created with
-    ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkRenderingInfoKHR-imageView-06108]]
-    If the pname:imageView member of a
-    slink:VkRenderingFragmentDensityMapAttachmentInfoEXT structure included
-    in the pname:pNext chain is not dlink:VK_NULL_HANDLE, and pname:viewMask
-    is not `0`, pname:imageView must: have a pname:layerCount greater than
-    or equal to the index of the most significant bit in pname:viewMask
-  * [[VUID-VkRenderingInfoKHR-imageView-06109]]
-    If the pname:imageView member of a
-    slink:VkRenderingFragmentDensityMapAttachmentInfoEXT structure included
-    in the pname:pNext chain is not dlink:VK_NULL_HANDLE, and pname:viewMask
-    is `0`, pname:imageView must: have a pname:layerCount equal to `1`
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifndef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkRenderingInfoKHR-imageView-06110]]
-    If the pname:imageView member of a
-    slink:VkRenderingFragmentDensityMapAttachmentInfoEXT structure included
-    in the pname:pNext chain is not dlink:VK_NULL_HANDLE, pname:imageView
-    must: have a width greater than or equal to
-    latexmath:[\left\lceil{\frac{renderArea_{x}+renderArea_{width}}{maxFragmentDensityTexelSize_{width}}}\right\rceil]
-  * [[VUID-VkRenderingInfoKHR-imageView-06111]]
-    If the pname:imageView member of a
-    slink:VkRenderingFragmentDensityMapAttachmentInfoEXT structure included
-    in the pname:pNext chain is not dlink:VK_NULL_HANDLE, pname:imageView
-    must: have a height greater than or equal to
-    latexmath:[\left\lceil{\frac{renderArea_{y}+renderArea_{height}}{maxFragmentDensityTexelSize_{height}}}\right\rceil]
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkRenderingInfoKHR-pNext-06112]]
-    If the pname:pNext chain does not contain
-    slink:VkDeviceGroupRenderPassBeginInfo or its
-    pname:deviceRenderAreaCount member is equal to 0 and the pname:imageView
-    member of a slink:VkRenderingFragmentDensityMapAttachmentInfoEXT
-    structure included in the pname:pNext chain is not dlink:VK_NULL_HANDLE,
-    pname:imageView must: have a width greater than or equal to
-    latexmath:[\left\lceil{\frac{renderArea_{x}+renderArea_{width}}{maxFragmentDensityTexelSize_{width}}}\right\rceil]
-  * [[VUID-VkRenderingInfoKHR-pNext-06113]]
-    If the pname:pNext chain contains a
-    slink:VkDeviceGroupRenderPassBeginInfo structure, its
-    pname:deviceRenderAreaCount member is not 0, and the pname:imageView
-    member of a slink:VkRenderingFragmentDensityMapAttachmentInfoEXT
-    structure included in the pname:pNext chain is not dlink:VK_NULL_HANDLE,
-    pname:imageView must: have a width greater than or equal to
-    latexmath:[\left\lceil{\frac{pDeviceRenderAreas_{x}+pDeviceRenderAreas_{width}}{maxFragmentDensityTexelSize_{width}}}\right\rceil]
-    for each element of pname:pDeviceRenderAreas
-  * [[VUID-VkRenderingInfoKHR-pNext-06114]]
-    If the pname:pNext chain does not contain
-    slink:VkDeviceGroupRenderPassBeginInfo or its
-    pname:deviceRenderAreaCount member is equal to 0 and the pname:imageView
-    member of a slink:VkRenderingFragmentDensityMapAttachmentInfoEXT
-    structure included in the pname:pNext chain is not dlink:VK_NULL_HANDLE,
-    pname:imageView must: have a height greater than or equal to
-    latexmath:[\left\lceil{\frac{renderArea_{y}+renderArea_{height}}{maxFragmentDensityTexelSize_{height}}}\right\rceil]
-  * [[VUID-VkRenderingInfoKHR-pNext-06115]]
-    If the pname:pNext chain contains a
-    slink:VkDeviceGroupRenderPassBeginInfo structure, its
-    pname:deviceRenderAreaCount member is not 0, and the pname:imageView
-    member of a slink:VkRenderingFragmentDensityMapAttachmentInfoEXT
-    structure included in the pname:pNext chain is not dlink:VK_NULL_HANDLE,
-    pname:imageView must: have a height greater than or equal to
-    latexmath:[\left\lceil{\frac{pDeviceRenderAreas_{y}+pDeviceRenderAreas_{height}}{maxFragmentDensityTexelSize_{height}}}\right\rceil]
-    for each element of pname:pDeviceRenderAreas
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkRenderingInfoKHR-imageView-06116]]
-    If the pname:imageView member of a
-    slink:VkRenderingFragmentDensityMapAttachmentInfoEXT structure included
-    in the pname:pNext chain is not dlink:VK_NULL_HANDLE, it must: not be
-    equal to the pname:imageView or pname:resolveImageView member of
-    pname:pDepthAttachment, pname:pStencilAttachment, or any element of
-    pname:pColorAttachments
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_KHR_fragment_shading_rate[]
-ifndef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkRenderingInfoKHR-imageView-06117]]
-    If the pname:imageView member of a
-    slink:VkRenderingFragmentShadingRateAttachmentInfoKHR structure included
-    in the pname:pNext chain is not dlink:VK_NULL_HANDLE, pname:imageView
-    must: have a width greater than or equal to
-    latexmath:[\left\lceil{\frac{renderArea_{x}+renderArea_{width}}{shadingRateAttachmentTexelSize_{width}}}\right\rceil]
-  * [[VUID-VkRenderingInfoKHR-imageView-06118]]
-    If the pname:imageView member of a
-    slink:VkRenderingFragmentShadingRateAttachmentInfoKHR structure included
-    in the pname:pNext chain is not dlink:VK_NULL_HANDLE, pname:imageView
-    must: have a height greater than or equal to
-    latexmath:[\left\lceil{\frac{renderArea_{y}+renderArea_{height}}{shadingRateAttachmentTexelSize_{height}}}\right\rceil]
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkRenderingInfoKHR-pNext-06119]]
-    If the pname:pNext chain does not contain
-    slink:VkDeviceGroupRenderPassBeginInfo or its
-    pname:deviceRenderAreaCount member is equal to 0 and the pname:imageView
-    member of a slink:VkRenderingFragmentShadingRateAttachmentInfoKHR
-    structure included in the pname:pNext chain is not dlink:VK_NULL_HANDLE,
-    pname:imageView must: have a width greater than or equal to
-    latexmath:[\left\lceil{\frac{renderArea_{x}+renderArea_{width}}{shadingRateAttachmentTexelSize_{width}}}\right\rceil]
-  * [[VUID-VkRenderingInfoKHR-pNext-06120]]
-    If the pname:pNext chain contains a
-    slink:VkDeviceGroupRenderPassBeginInfo structure, its
-    pname:deviceRenderAreaCount member is not 0, and the pname:imageView
-    member of a slink:VkRenderingFragmentShadingRateAttachmentInfoKHR
-    structure included in the pname:pNext chain is not dlink:VK_NULL_HANDLE,
-    pname:imageView must: have a width greater than or equal to
-    latexmath:[\left\lceil{\frac{pDeviceRenderAreas_{x}+pDeviceRenderAreas_{width}}{shadingRateAttachmentTexelSize_{width}}}\right\rceil]
-    for each element of pname:pDeviceRenderAreas
-  * [[VUID-VkRenderingInfoKHR-pNext-06121]]
-    If the pname:pNext chain does not contain
-    slink:VkDeviceGroupRenderPassBeginInfo or its
-    pname:deviceRenderAreaCount member is equal to 0 and the pname:imageView
-    member of a slink:VkRenderingFragmentShadingRateAttachmentInfoKHR
-    structure included in the pname:pNext chain is not dlink:VK_NULL_HANDLE,
-    pname:imageView must: have a height greater than or equal to
-    latexmath:[\left\lceil{\frac{renderArea_{y}+renderArea_{height}}{shadingRateAttachmentTexelSize_{height}}}\right\rceil]
-  * [[VUID-VkRenderingInfoKHR-pNext-06122]]
-    If the pname:pNext chain contains a
-    slink:VkDeviceGroupRenderPassBeginInfo structure, its
-    pname:deviceRenderAreaCount member is not 0, and the pname:imageView
-    member of a slink:VkRenderingFragmentShadingRateAttachmentInfoKHR
-    structure included in the pname:pNext chain is not dlink:VK_NULL_HANDLE,
-    pname:imageView must: have a height greater than or equal to
-    latexmath:[\left\lceil{\frac{pDeviceRenderAreas_{y}+pDeviceRenderAreas_{height}}{shadingRateAttachmentTexelSize_{height}}}\right\rceil]
-    for each element of pname:pDeviceRenderAreas
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkRenderingInfoKHR-imageView-06123]]
-    If the pname:imageView member of a
-    slink:VkRenderingFragmentShadingRateAttachmentInfoKHR structure included
-    in the pname:pNext chain is not dlink:VK_NULL_HANDLE, and pname:viewMask
-    is `0`, pname:imageView must: have a pname:layerCount that is either
-    equal to `1` or greater than or equal to pname:layerCount
-  * [[VUID-VkRenderingInfoKHR-imageView-06124]]
-    If the pname:imageView member of a
-    slink:VkRenderingFragmentShadingRateAttachmentInfoKHR structure included
-    in the pname:pNext chain is not dlink:VK_NULL_HANDLE, and pname:viewMask
-    is not `0`, pname:imageView must: have a pname:layerCount that either
-    equal to `1` or greater than or equal to the index of the most
-    significant bit in pname:viewMask
-  * [[VUID-VkRenderingInfoKHR-imageView-06125]]
-    If the pname:imageView member of a
-    slink:VkRenderingFragmentShadingRateAttachmentInfoKHR structure included
-    in the pname:pNext chain is not dlink:VK_NULL_HANDLE, it must: not be
-    equal to the pname:imageView or pname:resolveImageView member of
-    pname:pDepthAttachment, pname:pStencilAttachment, or any element of
-    pname:pColorAttachments
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-VkRenderingInfoKHR-imageView-06126]]
-    If the pname:imageView member of a
-    slink:VkRenderingFragmentShadingRateAttachmentInfoKHR structure included
-    in the pname:pNext chain is not dlink:VK_NULL_HANDLE, it must: not be
-    equal to the pname:imageView member of a
-    slink:VkRenderingFragmentDensityMapAttachmentInfoEXT structure included
-    in the pname:pNext chain
-endif::VK_EXT_fragment_density_map[]
-endif::VK_KHR_fragment_shading_rate[]
-  * [[VUID-VkRenderingInfoKHR-multiview-06127]]
-    If the <<features-multiview,pname:multiview>> feature is not enabled,
-    pname:viewMask must: be `0`
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkRenderingInfoKHR-viewMask-06128]]
-    The index of the most significant bit in pname:viewMask must: be less
-    than <<limits-maxMultiviewViewCount,pname:maxMultiviewViewCount>>
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-****
-
-include::{generated}/validity/structs/VkRenderingInfoKHR.txt[]
---
-
-[open,refpage='VkRenderingFlagBitsKHR',desc='Bitmask specifying additional properties of a dynamic render pass instance',type='enums']
---
-Bits which can: be set in slink:VkRenderingInfoKHR::pname:flags describing
-additional properties of the render pass are:
-
-include::{generated}/api/enums/VkRenderingFlagBitsKHR.txt[]
-
-  * ename:VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR specifies
-    that draw calls for the render pass instance will be recorded in
-    secondary command buffers.
-  * ename:VK_RENDERING_RESUMING_BIT_KHR specifies that the render pass
-    instance is resuming an earlier suspended render pass instance.
-  * ename:VK_RENDERING_SUSPENDING_BIT_KHR specifies that the render pass
-    instance will be suspended.
-
-[[renderpass-suspension]]
-The contents of pname:pRenderingInfo must: match between suspended render
-pass instances and the render pass instances that resume them, other than
-the presence or absence of the ename:VK_RENDERING_RESUMING_BIT_KHR,
-ename:VK_RENDERING_SUSPENDING_BIT_KHR, and
-ename:VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR flags.
-No action or synchronization commands, or other render pass instances, are
-allowed between suspending and resuming render pass instances.
---
-
-[open,refpage='VkRenderingFlagsKHR',desc='Bitmask of VkRenderingFlagBitsKHR',type='flags']
---
-include::{generated}/api/flags/VkRenderingFlagsKHR.txt[]
-
-tname:VkRenderingFlagsKHR is a bitmask type for setting a mask of zero or
-more elink:VkRenderingFlagBitsKHR.
---
-
-[open,refpage='VkRenderingAttachmentInfoKHR',desc='Structure specifying attachment information',type='structs']
---
-The sname:VkRenderingAttachmentInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkRenderingAttachmentInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:imageView is the image view that will be used for rendering.
-  * pname:imageLayout is the layout that pname:imageView will be in during
-    rendering.
-  * pname:resolveMode is a elink:VkResolveModeFlagBits value defining how
-    multisampled data written to pname:imageView will be resolved.
-  * pname:resolveImageView is an image view used to write resolved
-    multisample data at the end of rendering.
-  * pname:resolveImageLayout is the layout that pname:resolveImageView will
-    be in during rendering.
-  * pname:loadOp is a elink:VkAttachmentLoadOp value specifying how the
-    contents of pname:imageView are treated at the start of the render pass
-    instance.
-  * pname:storeOp is a elink:VkAttachmentStoreOp value specifying how the
-    contents of pname:imageView are treated at the end of the render pass
-    instance.
-  * pname:clearValue is a slink:VkClearValue structure that defines values
-    used to clear pname:imageView when pname:loadOp is
-    ename:VK_ATTACHMENT_LOAD_OP_CLEAR.
-
-Values in pname:imageView are loaded and stored according to the values of
-pname:loadOp and pname:storeOp, within the render area
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-for each device
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-specified in slink:VkRenderingInfoKHR.
-If pname:imageView is dlink:VK_NULL_HANDLE, other members of this structure
-are ignored; writes to this attachment will be discarded, and no load,
-store, or resolve operations will be performed.
-
-If pname:resolveMode is ename:VK_RESOLVE_MODE_NONE, then
-pname:resolveImageView is ignored.
-If pname:resolveMode is not ename:VK_RESOLVE_MODE_NONE, values in
-pname:resolveImageView within the render area become undefined: once
-rendering begins.
-At the end of rendering, the color values written to each pixel location in
-pname:imageView will be resolved according to pname:resolveMode and stored
-into the the same location in pname:resolveImageView.
-
-[NOTE]
-.Note
-====
-The resolve mode and store operation are independent; it is valid to write
-both resolved and unresolved values, and equally valid to discard the
-unresolved values while writing the resolved ones.
-====
-
-Store and resolve operations are only performed at the end of a render pass
-instance that does not specify the ename:VK_RENDERING_SUSPENDING_BIT_KHR
-flag.
-
-Load operations are only performed at the beginning of a render pass
-instance that does not specify the ename:VK_RENDERING_RESUMING_BIT_KHR flag.
-
-Image contents at the end of a suspended render pass instance remain defined
-for access by a resuming render pass instance.
-
-.Valid Usage
-****
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06129]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE and has a non-integer
-    color format, pname:resolveMode must: be ename:VK_RESOLVE_MODE_NONE or
-    ename:VK_RESOLVE_MODE_AVERAGE_BIT
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06130]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE and has an integer color
-    format, pname:resolveMode must: be ename:VK_RESOLVE_MODE_NONE or
-    ename:VK_RESOLVE_MODE_SAMPLE_ZERO_BIT
-ifndef::VK_KHR_depth_stencil_resolve,VK_VERSION_1_2[]
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06131]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE and has a depth or
-    stencil format, pname:resolveMode must: be ename:VK_RESOLVE_MODE_NONE
-endif::VK_KHR_depth_stencil_resolve,VK_VERSION_1_2[]
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06132]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE and pname:resolveMode is
-    not ename:VK_RESOLVE_MODE_NONE, pname:imageView must: not have a sample
-    count of ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06133]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE and pname:resolveMode is
-    not ename:VK_RESOLVE_MODE_NONE, pname:resolveImageView must: have a
-    sample count of ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06134]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE and pname:resolveMode is
-    not ename:VK_RESOLVE_MODE_NONE, pname:imageView and
-    pname:resolveImageView must: have the same elink:VkFormat
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06135]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, pname:layout must: not
-    be ename:VK_IMAGE_LAYOUT_UNDEFINED,
-    ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_PREINITIALIZED
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06136]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE and pname:resolveMode is
-    not ename:VK_RESOLVE_MODE_NONE, pname:resolveImageLayout must: not be
-    ename:VK_IMAGE_LAYOUT_UNDEFINED,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_PREINITIALIZED
-ifdef::VK_KHR_separate_depth_stencil_layouts,VK_VERSION_1_2[]
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06137]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE and pname:resolveMode is
-    not ename:VK_RESOLVE_MODE_NONE, pname:resolveImageLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-endif::VK_KHR_separate_depth_stencil_layouts,VK_VERSION_1_2[]
-ifdef::VK_NV_shading_rate_image[]
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06138]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, pname:layout must: not
-    be ename:VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06139]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE and pname:resolveMode is
-    not ename:VK_RESOLVE_MODE_NONE, pname:resolveImageLayout must: not be
-    ename:VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV
-endif::VK_NV_shading_rate_image[]
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06140]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, pname:layout must: not
-    be ename:VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06141]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE and pname:resolveMode is
-    not ename:VK_RESOLVE_MODE_NONE, pname:resolveImageLayout must: not be
-    ename:VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_KHR_synchronization2[]
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06142]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE and pname:resolveMode is
-    not ename:VK_RESOLVE_MODE_NONE, pname:resolveImageLayout must: not be
-    ename:VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR
-endif::VK_KHR_synchronization2[]
-ifdef::VK_KHR_fragment_shading_rate[]
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06143]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, pname:layout must: not
-    be ename:VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06144]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE and pname:resolveMode is
-    not ename:VK_RESOLVE_MODE_NONE, pname:resolveImageLayout must: not be
-    ename:VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_KHR_swapchain[]
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06145]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, pname:layout must: not
-    be ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
-  * [[VUID-VkRenderingAttachmentInfoKHR-imageView-06146]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE and pname:resolveMode is
-    not ename:VK_RESOLVE_MODE_NONE, pname:resolveImageLayout must: not be
-    ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
-endif::VK_KHR_swapchain[]
-****
-
-include::{generated}/validity/structs/VkRenderingAttachmentInfoKHR.txt[]
---
-
-ifdef::VK_KHR_fragment_shading_rate[]
-[open,refpage='VkRenderingFragmentShadingRateAttachmentInfoKHR',desc='Structure specifying fragment shading rate attachment information',type='structs']
---
-The sname:VkRenderingFragmentShadingRateAttachmentInfoKHR structure is
-defined as:
-
-include::{generated}/api/structs/VkRenderingFragmentShadingRateAttachmentInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:imageView is the image view that will be used as a fragment
-    shading rate attachment.
-  * pname:imageLayout is the layout that pname:imageView will be in during
-    rendering.
-  * pname:shadingRateAttachmentTexelSize specifies the number of pixels
-    corresponding to each texel in pname:imageView.
-
-This structure can be included in the pname:pNext chain of
-slink:VkRenderingInfoKHR to define a
-<<primsrast-fragment-shading-rate-attachment, fragment shading rate
-attachment>>.
-If pname:imageView is dlink:VK_NULL_HANDLE, or if this structure is not
-specified, the implementation behaves as if a valid shading rate attachment
-was specified with all texels specifying a single pixel per fragment.
-
-.Valid Usage
-****
-  * [[VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06147]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, pname:layout must: be
-    ename:VK_IMAGE_LAYOUT_GENERAL or
-    ename:VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR
-  * [[VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06148]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, it must: have been
-    created with
-    ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-  * [[VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06149]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE,
-    pname:shadingRateAttachmentTexelSize.width must: be a power of two value
-  * [[VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06150]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE,
-    pname:shadingRateAttachmentTexelSize.width must: be less than or equal
-    to <<limits-maxFragmentShadingRateAttachmentTexelSize,
-    pname:maxFragmentShadingRateAttachmentTexelSize.width>>
-  * [[VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06151]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE,
-    pname:shadingRateAttachmentTexelSize.width must: be greater than or
-    equal to <<limits-minFragmentShadingRateAttachmentTexelSize,
-    pname:minFragmentShadingRateAttachmentTexelSize.width>>
-  * [[VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06152]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE,
-    pname:shadingRateAttachmentTexelSize.height must: be a power of two
-    value
-  * [[VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06153]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE,
-    pname:shadingRateAttachmentTexelSize.height must: be less than or equal
-    to <<limits-maxFragmentShadingRateAttachmentTexelSize,
-    pname:maxFragmentShadingRateAttachmentTexelSize.height>>
-  * [[VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06154]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE,
-    pname:shadingRateAttachmentTexelSize.height must: be greater than or
-    equal to <<limits-minFragmentShadingRateAttachmentTexelSize,
-    pname:minFragmentShadingRateAttachmentTexelSize.height>>
-  * [[VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06155]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, the quotient of
-    pname:shadingRateAttachmentTexelSize.width and
-    pname:shadingRateAttachmentTexelSize.height must: be less than or equal
-    to <<limits-maxFragmentShadingRateAttachmentTexelSizeAspectRatio,
-    pname:maxFragmentShadingRateAttachmentTexelSizeAspectRatio>>
-  * [[VUID-VkRenderingFragmentShadingRateAttachmentInfoKHR-imageView-06156]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, the quotient of
-    pname:shadingRateAttachmentTexelSize.height and
-    pname:shadingRateAttachmentTexelSize.width must: be less than or equal
-    to <<limits-maxFragmentShadingRateAttachmentTexelSizeAspectRatio,
-    pname:maxFragmentShadingRateAttachmentTexelSizeAspectRatio>>
-****
-
-include::{generated}/validity/structs/VkRenderingFragmentShadingRateAttachmentInfoKHR.txt[]
---
-endif::VK_KHR_fragment_shading_rate[]
-
-ifdef::VK_EXT_fragment_density_map[]
-[open,refpage='VkRenderingFragmentDensityMapAttachmentInfoEXT',desc='Structure specifying fragment shading rate attachment information',type='structs']
---
-The sname:VkRenderingFragmentDensityMapAttachmentInfoEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkRenderingFragmentDensityMapAttachmentInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:imageView is the image view that will be used as a fragment
-    shading rate attachment.
-  * pname:imageLayout is the layout that pname:imageView will be in during
-    rendering.
-
-This structure can be included in the pname:pNext chain of
-slink:VkRenderingInfoKHR to define a fragment density map.
-If pname:imageView is dlink:VK_NULL_HANDLE, or if this structure is not
-specified, pname:imageView is dlink:VK_NULL_HANDLE.
-
-.Valid Usage
-****
-  * [[VUID-VkRenderingFragmentDensityMapAttachmentInfoEXT-imageView-06157]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, pname:layout must: be
-    ename:VK_IMAGE_LAYOUT_GENERAL or
-    ename:VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT
-  * [[VUID-VkRenderingFragmentDensityMapAttachmentInfoEXT-imageView-06158]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, it must: have been
-    created with ename:VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT
-  * [[VUID-VkRenderingFragmentDensityMapAttachmentInfoEXT-imageView-06159]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, it must: not have been
-    created with ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT
-ifndef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkRenderingFragmentDensityMapAttachmentInfoEXT-imageView-06160]]
-    If pname:imageView is not dlink:VK_NULL_HANDLE, it must: have a
-    pname:layerCount equal to `1`
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-****
-
-include::{generated}/validity/structs/VkRenderingFragmentDensityMapAttachmentInfoEXT.txt[]
---
-endif::VK_EXT_fragment_density_map[]
-
-[open,refpage='vkCmdEndRenderingKHR',desc='End a dynamic render pass instance',type='protos']
---
-To end a render pass instance, call:
-
-include::{generated}/api/protos/vkCmdEndRenderingKHR.txt[]
-
-  * pname:commandBuffer is the command buffer in which to record the
-    command.
-
-If the value of pname:pRenderingInfo->flags used to begin this render pass
-instance included ename:VK_RENDERING_SUSPENDING_BIT_KHR, then this render
-pass is suspended and will be resumed later in
-<<synchronization-submission-order, submission order>>.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdEndRenderingKHR-None-06161]]
-    The current render pass instance must: have been begun with
-    flink:vkCmdBeginRenderingKHR
-  * [[VUID-vkCmdEndRenderingKHR-commandBuffer-06162]]
-    The current render pass instance must: have been begun in
-    pname:commandBuffer
-****
-include::{generated}/validity/protos/vkCmdEndRenderingKHR.txt[]
---
-
-[NOTE]
-.Note
-====
-For more complex rendering graphs, it's possible to pre-define a static
-_render pass_ object, which as well as allowing draw commands, allows the
-definition of framebuffer-local dependencies between multiple subpasses.
-These objects have a lot of setup cost compared to
-flink:vkCmdBeginRenderingKHR, but use of subpass dependencies can confer
-important performance benefits on some devices.
-====
-endif::VK_KHR_dynamic_rendering[]
-
-[open,refpage='VkRenderPass',desc='Opaque handle to a render pass object',type='handles']
---
-A render pass object represents a collection of attachments, subpasses, and
-dependencies between the subpasses, and describes how the attachments are
-used over the course of the subpasses.
-
-Render passes are represented by sname:VkRenderPass handles:
-
-include::{generated}/api/handles/VkRenderPass.txt[]
---
-
-An _attachment description_ describes the properties of an attachment
-including its format, sample count, and how its contents are treated at the
-beginning and end of each render pass instance.
-
-[[renderpass-subpass]]
-A _subpass_ represents a phase of rendering that reads and writes a subset
-of the attachments in a render pass.
-Rendering commands are recorded into a particular subpass of a render pass
-instance.
-
-A _subpass description_ describes the subset of attachments that is involved
-in the execution of a subpass.
-Each subpass can: read from some attachments as _input attachments_, write
-to some as _color attachments_ or _depth/stencil attachments_,
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-perform _shader resolve operations_ to _color_attachments_ or
-_depth/stencil_attachments_,
-endif::VK_QCOM_render_pass_shader_resolve[]
-and perform _multisample resolve operations_ to _resolve attachments_.
-A subpass description can: also include a set of _preserve attachments_,
-which are attachments that are not read or written by the subpass but whose
-contents must: be preserved throughout the subpass.
-
-A subpass _uses an attachment_ if the attachment is a color, depth/stencil,
-resolve,
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-depth/stencil resolve,
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-ifdef::VK_KHR_fragment_shading_rate[]
-fragment shading rate,
-endif::VK_KHR_fragment_shading_rate[]
-or input attachment for that subpass (as determined by the
-pname:pColorAttachments, pname:pDepthStencilAttachment,
-pname:pResolveAttachments,
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-slink:VkSubpassDescriptionDepthStencilResolve::pname:pDepthStencilResolveAttachment,
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-ifdef::VK_KHR_fragment_shading_rate[]
-slink:VkFragmentShadingRateAttachmentInfoKHR::pname:pFragmentShadingRateAttachment->attachment,
-endif::VK_KHR_fragment_shading_rate[]
-and pname:pInputAttachments members of slink:VkSubpassDescription,
-respectively).
-A subpass does not use an attachment if that attachment is preserved by the
-subpass.
-The _first use of an attachment_ is in the lowest numbered subpass that uses
-that attachment.
-Similarly, the _last use of an attachment_ is in the highest numbered
-subpass that uses that attachment.
-
-The subpasses in a render pass all render to the same dimensions, and
-fragments for pixel (x,y,layer) in one subpass can: only read attachment
-contents written by previous subpasses at that same (x,y,layer) location.
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate,VK_EXT_fragment_density_map[]
-For multi-pixel fragments, the pixel read from an input attachment is
-selected from the pixels covered by that fragment in an
-implementation-dependent manner.
-However, this selection must: be made consistently for any fragment with the
-same shading rate for the lifetime of the slink:VkDevice.
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate,VK_EXT_fragment_density_map[]
-
-[NOTE]
-.Note
-====
-By describing a complete set of subpasses in advance, render passes provide
-the implementation an opportunity to optimize the storage and transfer of
-attachment data between subpasses.
-
-In practice, this means that subpasses with a simple framebuffer-space
-dependency may: be merged into a single tiled rendering pass, keeping the
-attachment data on-chip for the duration of a render pass instance.
-However, it is also quite common for a render pass to only contain a single
-subpass.
-====
-
-_Subpass dependencies_ describe <<synchronization-dependencies, execution
-and memory dependencies>> between subpasses.
-
-A _subpass dependency chain_ is a sequence of subpass dependencies in a
-render pass, where the source subpass of each subpass dependency (after the
-first) equals the destination subpass of the previous dependency.
-
-Execution of subpasses may: overlap or execute out of order with regards to
-other subpasses, unless otherwise enforced by an execution dependency.
-Each subpass only respects <<synchronization-submission-order, submission
-order>> for commands recorded in the same subpass, and the
-flink:vkCmdBeginRenderPass and flink:vkCmdEndRenderPass commands that
-delimit the render pass - commands within other subpasses are not included.
-This affects most other <<synchronization-implicit, implicit ordering
-guarantees>>.
-
-A render pass describes the structure of subpasses and attachments
-independent of any specific image views for the attachments.
-The specific image views that will be used for the attachments, and their
-dimensions, are specified in sname:VkFramebuffer objects.
-Framebuffers are created with respect to a specific render pass that the
-framebuffer is compatible with (see <<renderpass-compatibility,Render Pass
-Compatibility>>).
-Collectively, a render pass and a framebuffer define the complete render
-target state for one or more subpasses as well as the algorithmic
-dependencies between the subpasses.
-
-The various pipeline stages of the drawing commands for a given subpass may:
-execute concurrently and/or out of order, both within and across drawing
-commands, whilst still respecting <<synchronization-pipeline-stages-order,
-pipeline order>>.
-However for a given (x,y,layer,sample) sample location, certain per-sample
-operations are performed in <<primsrast-order,rasterization order>>.
-
-[open,refpage='VK_ATTACHMENT_UNUSED',desc='Unused attachment sentinel',type='consts']
---
-ename:VK_ATTACHMENT_UNUSED is a constant indicating that a render pass
-attachment is not used.
-
-include::{generated}/api/enums/VK_ATTACHMENT_UNUSED.txt[]
---
-
-
-[[renderpass-creation]]
-== Render Pass Creation
-
-[open,refpage='vkCreateRenderPass',desc='Create a new render pass object',type='protos']
---
-To create a render pass, call:
-
-include::{generated}/api/protos/vkCreateRenderPass.txt[]
-
-  * pname:device is the logical device that creates the render pass.
-  * pname:pCreateInfo is a pointer to a slink:VkRenderPassCreateInfo
-    structure describing the parameters of the render pass.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pRenderPass is a pointer to a slink:VkRenderPass handle in which
-    the resulting render pass object is returned.
-
-include::{generated}/validity/protos/vkCreateRenderPass.txt[]
---
-
-[open,refpage='VkRenderPassCreateInfo',desc='Structure specifying parameters of a newly created render pass',type='structs']
---
-The sname:VkRenderPassCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkRenderPassCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-ifndef::VK_QCOM_render_pass_transform[]
-  * pname:flags is reserved for future use.
-endif::VK_QCOM_render_pass_transform[]
-ifdef::VK_QCOM_render_pass_transform[]
-  * pname:flags is a bitmask of elink:VkRenderPassCreateFlagBits
-endif::VK_QCOM_render_pass_transform[]
-  * pname:attachmentCount is the number of attachments used by this render
-    pass.
-  * pname:pAttachments is a pointer to an array of pname:attachmentCount
-    slink:VkAttachmentDescription structures describing the attachments used
-    by the render pass.
-  * pname:subpassCount is the number of subpasses to create.
-  * pname:pSubpasses is a pointer to an array of pname:subpassCount
-    slink:VkSubpassDescription structures describing each subpass.
-  * pname:dependencyCount is the number of memory dependencies between pairs
-    of subpasses.
-  * pname:pDependencies is a pointer to an array of pname:dependencyCount
-    slink:VkSubpassDependency structures describing dependencies between
-    pairs of subpasses.
-
-[NOTE]
-.Note
-====
-Care should be taken to avoid a data race here; if any subpasses access
-attachments with overlapping memory locations, and one of those accesses is
-a write, a subpass dependency needs to be included between them.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkRenderPassCreateInfo-attachment-00834]]
-    If the pname:attachment member of any element of
-    pname:pInputAttachments, pname:pColorAttachments,
-    pname:pResolveAttachments or pname:pDepthStencilAttachment, or any
-    element of pname:pPreserveAttachments in any element of pname:pSubpasses
-    is not ename:VK_ATTACHMENT_UNUSED, it must: be less than
-    pname:attachmentCount
-  * [[VUID-VkRenderPassCreateInfo-pAttachments-00836]]
-    For any member of pname:pAttachments with a pname:loadOp equal to
-    ename:VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment
-    must: not specify a pname:layout equal to
-    ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkRenderPassCreateInfo-pAttachments-02511]]
-    For any member of pname:pAttachments with a pname:stencilLoadOp equal to
-    ename:VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment
-    must: not specify a pname:layout equal to
-    ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-  * [[VUID-VkRenderPassCreateInfo-pAttachments-01566]]
-    For any member of pname:pAttachments with a pname:loadOp equal to
-    ename:VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment
-    must: not specify a pname:layout equal to
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL
-  * [[VUID-VkRenderPassCreateInfo-pAttachments-01567]]
-    For any member of pname:pAttachments with a pname:stencilLoadOp equal to
-    ename:VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment
-    must: not specify a pname:layout equal to
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkRenderPassCreateInfo-pNext-01926]]
-    If the pname:pNext chain includes a
-    slink:VkRenderPassInputAttachmentAspectCreateInfo structure, the
-    pname:subpass member of each element of its pname:pAspectReferences
-    member must: be less than pname:subpassCount
-  * [[VUID-VkRenderPassCreateInfo-pNext-01927]]
-    If the pname:pNext chain includes a
-    slink:VkRenderPassInputAttachmentAspectCreateInfo structure, the
-    pname:inputAttachmentIndex member of each element of its
-    pname:pAspectReferences member must: be less than the value of
-    pname:inputAttachmentCount in the element of pname:pSubpasses identified
-    by its pname:subpass member
-  * [[VUID-VkRenderPassCreateInfo-pNext-01963]]
-    If the pname:pNext chain includes a
-    slink:VkRenderPassInputAttachmentAspectCreateInfo structure, for any
-    element of the pname:pInputAttachments member of any element of
-    pname:pSubpasses where the pname:attachment member is not
-    ename:VK_ATTACHMENT_UNUSED, the pname:aspectMask member of the
-    corresponding element of
-    slink:VkRenderPassInputAttachmentAspectCreateInfo::pname:pAspectReferences
-    must: only include aspects that are present in images of the format
-    specified by the element of pname:pAttachments at pname:attachment
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkRenderPassCreateInfo-pNext-01928]]
-    If the pname:pNext chain includes a
-    slink:VkRenderPassMultiviewCreateInfo structure, and its
-    pname:subpassCount member is not zero, that member must: be equal to the
-    value of pname:subpassCount
-  * [[VUID-VkRenderPassCreateInfo-pNext-01929]]
-    If the pname:pNext chain includes a
-    slink:VkRenderPassMultiviewCreateInfo structure, if its
-    pname:dependencyCount member is not zero, it must: be equal to
-    pname:dependencyCount
-  * [[VUID-VkRenderPassCreateInfo-pNext-01930]]
-    If the pname:pNext chain includes a
-    slink:VkRenderPassMultiviewCreateInfo structure, for each non-zero
-    element of pname:pViewOffsets, the pname:srcSubpass and pname:dstSubpass
-    members of pname:pDependencies at the same index must: not be equal
-  * [[VUID-VkRenderPassCreateInfo-pNext-02512]]
-    If the pname:pNext chain includes a
-    slink:VkRenderPassMultiviewCreateInfo structure, for any element of
-    pname:pDependencies with a pname:dependencyFlags member that does not
-    include ename:VK_DEPENDENCY_VIEW_LOCAL_BIT, the corresponding element of
-    the pname:pViewOffsets member of that
-    slink:VkRenderPassMultiviewCreateInfo instance must: be `0`
-  * [[VUID-VkRenderPassCreateInfo-pNext-02513]]
-    If the pname:pNext chain includes a
-    slink:VkRenderPassMultiviewCreateInfo structure, elements of its
-    pname:pViewMasks member must: either all be `0`, or all not be `0`
-  * [[VUID-VkRenderPassCreateInfo-pNext-02514]]
-    If the pname:pNext chain includes a
-    slink:VkRenderPassMultiviewCreateInfo structure, and each element of its
-    pname:pViewMasks member is `0`, the pname:dependencyFlags member of each
-    element of pname:pDependencies must: not include
-    ename:VK_DEPENDENCY_VIEW_LOCAL_BIT
-  * [[VUID-VkRenderPassCreateInfo-pNext-02515]]
-    If the pname:pNext chain includes a
-    slink:VkRenderPassMultiviewCreateInfo structure, and each element of its
-    pname:pViewMasks member is `0`, its pname:correlationMaskCount member
-    must: be `0`
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkRenderPassCreateInfo-pDependencies-00837]]
-    For any element of pname:pDependencies, if the pname:srcSubpass is not
-    ename:VK_SUBPASS_EXTERNAL, all stage flags included in the
-    pname:srcStageMask member of that dependency must: be a pipeline stage
-    supported by the <<synchronization-pipeline-stages-types, pipeline>>
-    identified by the pname:pipelineBindPoint member of the source subpass
-  * [[VUID-VkRenderPassCreateInfo-pDependencies-00838]]
-    For any element of pname:pDependencies, if the pname:dstSubpass is not
-    ename:VK_SUBPASS_EXTERNAL, all stage flags included in the
-    pname:dstStageMask member of that dependency must: be a pipeline stage
-    supported by the <<synchronization-pipeline-stages-types, pipeline>>
-    identified by the pname:pipelineBindPoint member of the destination
-    subpass
-  * [[VUID-VkRenderPassCreateInfo-srcSubpass-02517]]
-    The pname:srcSubpass member of each element of pname:pDependencies must:
-    be less than pname:subpassCount
-  * [[VUID-VkRenderPassCreateInfo-dstSubpass-02518]]
-    The pname:dstSubpass member of each element of pname:pDependencies must:
-    be less than pname:subpassCount
-****
-
-include::{generated}/validity/structs/VkRenderPassCreateInfo.txt[]
---
-
-ifdef::VK_QCOM_render_pass_transform[]
-[open,refpage='VkRenderPassCreateFlagBits',desc='Bitmask specifying additional properties of a render pass',type='enums']
---
-Bits which can: be set in slink:VkRenderPassCreateInfo::pname:flags
-describing additional properties of the render pass are:
-
-include::{generated}/api/enums/VkRenderPassCreateFlagBits.txt[]
-
-  * ename:VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM specifies that the
-    created render pass is compatible with
-    <<vertexpostproc-renderpass-transform, render pass transform>>.
---
-endif::VK_QCOM_render_pass_transform[]
-
-[open,refpage='VkRenderPassCreateFlags',desc='Bitmask of VkRenderPassCreateFlagBits',type='flags']
---
-include::{generated}/api/flags/VkRenderPassCreateFlags.txt[]
-
-tname:VkRenderPassCreateFlags is a bitmask type for setting a mask of zero
-or more elink:VkRenderPassCreateFlagBits.
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-[[renderpass-multiview]]
-[open,refpage='VkRenderPassMultiviewCreateInfo',desc='Structure containing multiview information for all subpasses',type='structs']
---
-If the slink:VkRenderPassCreateInfo::pname:pNext chain includes a
-sname:VkRenderPassMultiviewCreateInfo structure, then that structure
-includes an array of view masks, view offsets, and correlation masks for the
-render pass.
-
-The sname:VkRenderPassMultiviewCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkRenderPassMultiviewCreateInfo.txt[]
-
-ifdef::VK_KHR_multiview[]
-or the equivalent
-
-include::{generated}/api/structs/VkRenderPassMultiviewCreateInfoKHR.txt[]
-endif::VK_KHR_multiview[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:subpassCount is zero or the number of subpasses in the render
-    pass.
-  * pname:pViewMasks is a pointer to an array of pname:subpassCount view
-    masks, where each mask is a bitfield of view indices describing which
-    views rendering is broadcast to in each subpass, when multiview is
-    enabled.
-    If pname:subpassCount is zero, each view mask is treated as zero.
-  * pname:dependencyCount is zero or the number of dependencies in the
-    render pass.
-  * pname:pViewOffsets is a pointer to an array of pname:dependencyCount
-    view offsets, one for each dependency.
-    If pname:dependencyCount is zero, each dependency's view offset is
-    treated as zero.
-    Each view offset controls which views in the source subpass the views in
-    the destination subpass depend on.
-  * pname:correlationMaskCount is zero or the number of correlation masks.
-  * pname:pCorrelationMasks is a pointer to an array of
-    pname:correlationMaskCount view masks indicating sets of views that may:
-    be more efficient to render concurrently.
-
-When a subpass uses a non-zero view mask, _multiview_ functionality is
-considered to be enabled.
-Multiview is all-or-nothing for a render pass - that is, either all
-subpasses must: have a non-zero view mask (though some subpasses may: have
-only one view) or all must: be zero.
-Multiview causes all drawing and clear commands in the subpass to behave as
-if they were broadcast to each view, where a view is represented by one
-layer of the framebuffer attachments.
-All draws and clears are broadcast to each _view index_ whose bit is set in
-the view mask.
-The view index is provided in the code:ViewIndex shader input variable, and
-color, depth/stencil, and input attachments all read/write the layer of the
-framebuffer corresponding to the view index.
-
-If the view mask is zero for all subpasses, multiview is considered to be
-disabled and all drawing commands execute normally, without this additional
-broadcasting.
-
-Some implementations may: not support multiview in conjunction with
-<<features-multiview-gs,geometry shaders>> or
-<<features-multiview-tess,tessellation shaders>>.
-
-[[renderpass-multiview-view-local]]
-When multiview is enabled, the ename:VK_DEPENDENCY_VIEW_LOCAL_BIT bit in a
-dependency can: be used to express a view-local dependency, meaning that
-each view in the destination subpass depends on a single view in the source
-subpass.
-Unlike pipeline barriers, a subpass dependency can: potentially have a
-different view mask in the source subpass and the destination subpass.
-If the dependency is view-local, then each view ([eq]#dstView#) in the
-destination subpass depends on the view [eq]#dstView {plus}
-pname:pViewOffsets[dependency]# in the source subpass.
-If there is not such a view in the source subpass, then this dependency does
-not affect that view in the destination subpass.
-If the dependency is not view-local, then all views in the destination
-subpass depend on all views in the source subpass, and the view offset is
-ignored.
-A non-zero view offset is not allowed in a self-dependency.
-
-The elements of pname:pCorrelationMasks are a set of masks of views
-indicating that views in the same mask may: exhibit spatial coherency
-between the views, making it more efficient to render them concurrently.
-Correlation masks must: not have a functional effect on the results of the
-multiview rendering.
-
-When multiview is enabled, at the beginning of each subpass all non-render
-pass state is undefined:.
-In particular, each time flink:vkCmdBeginRenderPass or
-flink:vkCmdNextSubpass is called the graphics pipeline must: be bound, any
-relevant descriptor sets or vertex/index buffers must: be bound, and any
-relevant dynamic state or push constants must: be set before they are used.
-
-ifdef::VK_NVX_multiview_per_view_attributes[]
-
-A multiview subpass can: declare that its shaders will write per-view
-attributes for all views in a single invocation, by setting the
-ename:VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX bit in the subpass
-description.
-The only supported per-view attributes are position and viewport mask, and
-per-view position and viewport masks are written to output array variables
-decorated with code:PositionPerViewNV and code:ViewportMaskPerViewNV,
-respectively.
-If `apiext:VK_NV_viewport_array2` is not supported and enabled,
-code:ViewportMaskPerViewNV must: not be used.
-Values written to elements of code:PositionPerViewNV and
-code:ViewportMaskPerViewNV must: not depend on the code:ViewIndex.
-The shader must: also write to an output variable decorated with
-code:Position, and the value written to code:Position must: equal the value
-written to code:PositionPerViewNV[code:ViewIndex].
-Similarly, if code:ViewportMaskPerViewNV is written to then the shader must:
-also write to an output variable decorated with code:ViewportMaskNV, and the
-value written to code:ViewportMaskNV must: equal the value written to
-code:ViewportMaskPerViewNV[code:ViewIndex].
-Implementations will either use values taken from code:Position and
-code:ViewportMaskNV and invoke the shader once for each view, or will use
-values taken from code:PositionPerViewNV and code:ViewportMaskPerViewNV and
-invoke the shader fewer times.
-The values written to code:Position and code:ViewportMaskNV must: not depend
-on the values written to code:PositionPerViewNV and
-code:ViewportMaskPerViewNV, or vice versa (to allow compilers to eliminate
-the unused outputs).
-All attributes that do not have `*PerViewNV` counterparts must: not depend
-on code:ViewIndex.
-
-Per-view attributes are all-or-nothing for a subpass.
-That is, all pipelines compiled against a subpass that includes the
-ename:VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX bit must: write
-per-view attributes to the `*PerViewNV[]` shader outputs, in addition to the
-non-per-view (e.g. code:Position) outputs.
-Pipelines compiled against a subpass that does not include this bit must:
-not include the `*PerViewNV[]` outputs in their interfaces.
-
-endif::VK_NVX_multiview_per_view_attributes[]
-
-.Valid Usage
-****
-  * [[VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-00841]]
-    Each view index must: not be set in more than one element of
-    pname:pCorrelationMasks
-****
-
-include::{generated}/validity/structs/VkRenderPassMultiviewCreateInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-ifdef::VK_NVX_multiview_per_view_attributes[]
-ifdef::VK_KHR_dynamic_rendering[]
-
-[open,refpage='VkMultiviewPerViewAttributesInfoNVX',desc='Structure specifying the multiview per-attribute properties',type='structs']
---
-
-The sname:VkMultiviewPerViewAttributesInfoNVX structure is defined as:
-
-include::{generated}/api/structs/VkMultiviewPerViewAttributesInfoNVX.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:perViewAttributes specifies that shaders compiled for this
-    pipeline write the attributes for all views in a single invocation of
-    each vertex processing stage.
-    All pipelines executed within a render pass instance that includes this
-    bit must: write per-view attributes to the `*PerViewNV[]` shader
-    outputs, in addition to the non-per-view (e.g. code:Position) outputs.
-  * pname:perViewAttributesPositionXOnly specifies that shaders compiled for
-    this pipeline use per-view positions which only differ in value in the x
-    component.
-    Per-view viewport mask can: also be used.
-
-When dynamic render pass instances are being used, instead of specifying
-ename:VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX or
-ename:VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX in the subpass
-description flags, the per-attibute properties of the render pass instance
-must: be specified by the sname:VkMultiviewPerViewAttributesInfoNVX
-structure Include the sname:VkMultiviewPerViewAttributesInfoNVX structure in
-the pname:pNext chain of slink:VkGraphicsPipelineCreateInfo when creating a
-graphics pipeline for dynamic rendering, slink:VkRenderingInfoKHR when
-starting a dynamic render pass instance, and
-slink:VkCommandBufferInheritanceInfo when specifying the dynamic render pass
-instance parameters for secondary command buffers.
-
-.Valid Usage
-****
-  * [[VUID-VkMultiviewPerViewAttributesInfoNVX-perViewAttributesPositionXOnly-06163]]
-    If pname:perViewAttributesPositionXOnly is ename:VK_TRUE then
-    pname:perViewAttributes must: also be ename:VK_TRUE
-****
-
-include::{generated}/validity/structs/VkMultiviewPerViewAttributesInfoNVX.txt[]
---
-endif::VK_KHR_dynamic_rendering[]
-endif::VK_NVX_multiview_per_view_attributes[]
-
-ifdef::VK_EXT_fragment_density_map[]
-[[renderpass-fragmentdensitymapattachment]]
-[open,refpage='VkRenderPassFragmentDensityMapCreateInfoEXT',desc='Structure containing fragment density map attachment for render pass',type='structs']
---
-If the slink:VkRenderPassCreateInfo::pname:pNext chain includes a
-sname:VkRenderPassFragmentDensityMapCreateInfoEXT structure, then that
-structure includes a fragment density map attachment for the render pass.
-
-The sname:VkRenderPassFragmentDensityMapCreateInfoEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkRenderPassFragmentDensityMapCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:fragmentDensityMapAttachment is the fragment density map to use
-    for the render pass.
-
-The fragment density map is read at an implementation-dependent time with
-the following constraints determined by the attachment's image view
-pname:flags:
-
-  * ename:VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT
-    specifies that the fragment density map will be read by the device
-    during ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT
-ifdef::VK_EXT_fragment_density_map2[]
-  * ename:VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT
-    specifies that the fragment density map will be read by the host during
-    flink:vkEndCommandBuffer of the primary command buffer that the render
-    pass is recorded into
-endif::VK_EXT_fragment_density_map2[]
-  * Otherwise the fragment density map will be read by the host during
-    flink:vkCmdBeginRenderPass
-
-The fragment density map may: additionally be read by the device during
-ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT for any mode.
-
-If this structure is not present, it is as if
-pname:fragmentDensityMapAttachment was given as ename:VK_ATTACHMENT_UNUSED.
-
-.Valid Usage
-****
-  * [[VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02547]]
-    If pname:fragmentDensityMapAttachment is not ename:VK_ATTACHMENT_UNUSED,
-    pname:fragmentDensityMapAttachment must: be less than
-    sname:VkRenderPassCreateInfo::pname:attachmentCount
-  * [[VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02548]]
-    If pname:fragmentDensityMapAttachment is not ename:VK_ATTACHMENT_UNUSED,
-    pname:fragmentDensityMapAttachment must: not be an element of
-    sname:VkSubpassDescription::pname:pInputAttachments,
-    sname:VkSubpassDescription::pname:pColorAttachments,
-    sname:VkSubpassDescription::pname:pResolveAttachments,
-    sname:VkSubpassDescription::pname:pDepthStencilAttachment, or
-    sname:VkSubpassDescription::pname:pPreserveAttachments for any subpass
-  * [[VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02549]]
-    If pname:fragmentDensityMapAttachment is not ename:VK_ATTACHMENT_UNUSED,
-    pname:layout must: be equal to
-    ename:VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT, or
-    ename:VK_IMAGE_LAYOUT_GENERAL
-  * [[VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02550]]
-    If pname:fragmentDensityMapAttachment is not ename:VK_ATTACHMENT_UNUSED,
-    pname:fragmentDensityMapAttachment must: reference an attachment with a
-    pname:loadOp equal to ename:VK_ATTACHMENT_LOAD_OP_LOAD or
-    ename:VK_ATTACHMENT_LOAD_OP_DONT_CARE
-  * [[VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02551]]
-    If pname:fragmentDensityMapAttachment is not ename:VK_ATTACHMENT_UNUSED,
-    pname:fragmentDensityMapAttachment must: reference an attachment with a
-    pname:storeOp equal to ename:VK_ATTACHMENT_STORE_OP_DONT_CARE
-****
-
-include::{generated}/validity/structs/VkRenderPassFragmentDensityMapCreateInfoEXT.txt[]
---
-endif::VK_EXT_fragment_density_map[]
-
-[open,refpage='VkAttachmentDescription',desc='Structure specifying an attachment description',type='structs']
---
-The sname:VkAttachmentDescription structure is defined as:
-
-include::{generated}/api/structs/VkAttachmentDescription.txt[]
-
-  * pname:flags is a bitmask of elink:VkAttachmentDescriptionFlagBits
-    specifying additional properties of the attachment.
-  * pname:format is a elink:VkFormat value specifying the format of the
-    image view that will be used for the attachment.
-  * pname:samples is a elink:VkSampleCountFlagBits value specifying the
-    number of samples of the image.
-  * pname:loadOp is a elink:VkAttachmentLoadOp value specifying how the
-    contents of color and depth components of the attachment are treated at
-    the beginning of the subpass where it is first used.
-  * pname:storeOp is a elink:VkAttachmentStoreOp value specifying how the
-    contents of color and depth components of the attachment are treated at
-    the end of the subpass where it is last used.
-  * pname:stencilLoadOp is a elink:VkAttachmentLoadOp value specifying how
-    the contents of stencil components of the attachment are treated at the
-    beginning of the subpass where it is first used.
-  * pname:stencilStoreOp is a elink:VkAttachmentStoreOp value specifying how
-    the contents of stencil components of the attachment are treated at the
-    end of the last subpass where it is used.
-  * pname:initialLayout is the layout the attachment image subresource will
-    be in when a render pass instance begins.
-  * pname:finalLayout is the layout the attachment image subresource will be
-    transitioned to when a render pass instance ends.
-
-[[renderpass-load-store-ops]]
-If the attachment uses a color format, then pname:loadOp and pname:storeOp
-are used, and pname:stencilLoadOp and pname:stencilStoreOp are ignored.
-If the format has depth and/or stencil components, pname:loadOp and
-pname:storeOp apply only to the depth data, while pname:stencilLoadOp and
-pname:stencilStoreOp define how the stencil data is handled.
-pname:loadOp and pname:stencilLoadOp define the _load operations_ that
-execute as part of the first subpass that uses the attachment.
-pname:storeOp and pname:stencilStoreOp define the _store operations_ that
-execute as part of the last subpass that uses the attachment.
-
-The load operation for each sample in an attachment happens-before any
-recorded command which accesses the sample in the first subpass where the
-attachment is used.
-Load operations for attachments with a depth/stencil format execute in the
-ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT pipeline stage.
-Load operations for attachments with a color format execute in the
-ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT pipeline stage.
-
-The store operation for each sample in an attachment happens-after any
-recorded command which accesses the sample in the last subpass where the
-attachment is used.
-Store operations for attachments with a depth/stencil format execute in the
-ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT pipeline stage.
-Store operations for attachments with a color format execute in the
-ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT pipeline stage.
-
-If an attachment is not used by any subpass, then pname:loadOp,
-pname:storeOp, pname:stencilStoreOp, and pname:stencilLoadOp are ignored,
-and the attachment's memory contents will not be modified by execution of a
-render pass instance.
-
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-
-The load and store operations apply on the first and last use of each view
-in the render pass, respectively.
-If a view index of an attachment is not included in the view mask in any
-subpass that uses it, then the load and store operations are ignored, and
-the attachment's memory contents will not be modified by execution of a
-render pass instance.
-
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-[[renderpass-precision]]
-During a render pass instance, input/color attachments with color formats
-that have a component size of 8, 16, or 32 bits must: be represented in the
-attachment's format throughout the instance.
-Attachments with other floating- or fixed-point color formats, or with depth
-components may: be represented in a format with a precision higher than the
-attachment format, but must: be represented with the same range.
-When such a component is loaded via the pname:loadOp, it will be converted
-into an implementation-dependent format used by the render pass.
-Such components must: be converted from the render pass format, to the
-format of the attachment, before they are resolved or stored at the end of a
-render pass instance via pname:storeOp.
-Conversions occur as described in <<fundamentals-numerics,Numeric
-Representation and Computation>> and <<fundamentals-fixedconv, Fixed-Point
-Data Conversions>>.
-
-[[renderpass-aliasing]]
-If pname:flags includes ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT, then
-the attachment is treated as if it shares physical memory with another
-attachment in the same render pass.
-This information limits the ability of the implementation to reorder certain
-operations (like layout transitions and the pname:loadOp) such that it is
-not improperly reordered against other uses of the same physical memory via
-a different attachment.
-This is described in more detail below.
-
-If a render pass uses multiple attachments that alias the same device
-memory, those attachments must: each include the
-ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT bit in their attachment
-description flags.
-Attachments aliasing the same memory occurs in multiple ways:
-
-  * Multiple attachments being assigned the same image view as part of
-    framebuffer creation.
-  * Attachments using distinct image views that correspond to the same image
-    subresource of an image.
-  * Attachments using views of distinct image subresources which are bound
-    to overlapping memory ranges.
-
-[NOTE]
-.Note
-====
-Render passes must: include subpass dependencies (either directly or via a
-subpass dependency chain) between any two subpasses that operate on the same
-attachment or aliasing attachments and those subpass dependencies must:
-include execution and memory dependencies separating uses of the aliases, if
-at least one of those subpasses writes to one of the aliases.
-These dependencies must: not include the ename:VK_DEPENDENCY_BY_REGION_BIT
-if the aliases are views of distinct image subresources which overlap in
-memory.
-====
-
-Multiple attachments that alias the same memory must: not be used in a
-single subpass.
-A given attachment index must: not be used multiple times in a single
-subpass, with one exception: two subpass attachments can: use the same
-attachment index if at least one use is as an input attachment and neither
-use is as a resolve or preserve attachment.
-In other words, the same view can: be used simultaneously as an input and
-color or depth/stencil attachment, but must: not be used as multiple color
-or depth/stencil attachments nor as resolve or preserve attachments.
-The precise set of valid scenarios is described in more detail
-<<renderpass-feedbackloop, below>>.
-
-If a set of attachments alias each other, then all except the first to be
-used in the render pass must: use an pname:initialLayout of
-ename:VK_IMAGE_LAYOUT_UNDEFINED, since the earlier uses of the other aliases
-make their contents undefined:.
-Once an alias has been used and a different alias has been used after it,
-the first alias must: not be used in any later subpasses.
-However, an application can: assign the same image view to multiple aliasing
-attachment indices, which allows that image view to be used multiple times
-even if other aliases are used in between.
-
-[NOTE]
-.Note
-====
-Once an attachment needs the ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT
-bit, there should: be no additional cost of introducing additional aliases,
-and using these additional aliases may: allow more efficient clearing of the
-attachments on multiple uses via ename:VK_ATTACHMENT_LOAD_OP_CLEAR.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkAttachmentDescription-finalLayout-00843]]
-    pname:finalLayout must: not be ename:VK_IMAGE_LAYOUT_UNDEFINED or
-    ename:VK_IMAGE_LAYOUT_PREINITIALIZED
-  * [[VUID-VkAttachmentDescription-format-03280]]
-    If pname:format is a color format, pname:initialLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL
-  * [[VUID-VkAttachmentDescription-format-03281]]
-    If pname:format is a depth/stencil format, pname:initialLayout must: not
-    be ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-  * [[VUID-VkAttachmentDescription-format-03282]]
-    If pname:format is a color format, pname:finalLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL
-  * [[VUID-VkAttachmentDescription-format-03283]]
-    If pname:format is a depth/stencil format, pname:finalLayout must: not
-    be ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * [[VUID-VkAttachmentDescription-separateDepthStencilLayouts-03284]]
-    If the <<features-separateDepthStencilLayouts,
-    pname:separateDepthStencilLayouts>> feature is not enabled,
-    pname:initialLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription-separateDepthStencilLayouts-03285]]
-    If the <<features-separateDepthStencilLayouts,
-    pname:separateDepthStencilLayouts>> feature is not enabled,
-    pname:finalLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription-format-03286]]
-    If pname:format is a color format, pname:initialLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription-format-03287]]
-    If pname:format is a color format, pname:finalLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription-format-03288]]
-    If pname:format is a depth/stencil format which includes both depth and
-    stencil aspects, pname:initialLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription-format-03289]]
-    If pname:format is a depth/stencil format which includes both depth and
-    stencil aspects, pname:finalLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription-format-03290]]
-    If pname:format is a depth/stencil format which includes only the depth
-    aspect, pname:initialLayout must: not be
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription-format-03291]]
-    If pname:format is a depth/stencil format which includes only the depth
-    aspect, pname:finalLayout must: not be
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription-format-03292]]
-    If pname:format is a depth/stencil format which includes only the
-    stencil aspect, pname:initialLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription-format-03293]]
-    If pname:format is a depth/stencil format which includes only the
-    stencil aspect, pname:finalLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-****
-
-include::{generated}/validity/structs/VkAttachmentDescription.txt[]
---
-
-[open,refpage='VkAttachmentDescriptionFlagBits',desc='Bitmask specifying additional properties of an attachment',type='enums']
---
-Bits which can: be set in slink:VkAttachmentDescription::pname:flags
-describing additional properties of the attachment are:
-
-include::{generated}/api/enums/VkAttachmentDescriptionFlagBits.txt[]
-
-  * ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT specifies that the
-    attachment aliases the same device memory as other attachments.
---
-
-[open,refpage='VkAttachmentDescriptionFlags',desc='Bitmask of VkAttachmentDescriptionFlagBits',type='flags']
---
-include::{generated}/api/flags/VkAttachmentDescriptionFlags.txt[]
-
-tname:VkAttachmentDescriptionFlags is a bitmask type for setting a mask of
-zero or more elink:VkAttachmentDescriptionFlagBits.
---
-
-[open,refpage='VkAttachmentLoadOp',desc='Specify how contents of an attachment are treated at the beginning of a subpass',type='enums']
---
-Possible values of slink:VkAttachmentDescription::pname:loadOp and
-pname:stencilLoadOp, specifying how the contents of the attachment are
-treated, are:
-
-include::{generated}/api/enums/VkAttachmentLoadOp.txt[]
-
-  * ename:VK_ATTACHMENT_LOAD_OP_LOAD specifies that the previous contents of
-    the image within the render area will be preserved.
-    For attachments with a depth/stencil format, this uses the access type
-    ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT.
-    For attachments with a color format, this uses the access type
-    ename:VK_ACCESS_COLOR_ATTACHMENT_READ_BIT.
-  * ename:VK_ATTACHMENT_LOAD_OP_CLEAR specifies that the contents within the
-    render area will be cleared to a uniform value, which is specified when
-    a render pass instance is begun.
-    For attachments with a depth/stencil format, this uses the access type
-    ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT.
-    For attachments with a color format, this uses the access type
-    ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT.
-  * ename:VK_ATTACHMENT_LOAD_OP_DONT_CARE specifies that the previous
-    contents within the area need not be preserved; the contents of the
-    attachment will be undefined: inside the render area.
-    For attachments with a depth/stencil format, this uses the access type
-    ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT.
-    For attachments with a color format, this uses the access type
-    ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT.
-ifdef::VK_EXT_load_store_op_none[]
-  * ename:VK_ATTACHMENT_LOAD_OP_NONE_EXT specifies that the previous
-    contents of the image within the render area will be preserved, but the
-    contents of the attachment will be undefined: inside the render pass.
-    No access type is used as the image is not accessed.
-endif::VK_EXT_load_store_op_none[]
---
-
-[open,refpage='VkAttachmentStoreOp',desc='Specify how contents of an attachment are treated at the end of a subpass',type='enums']
---
-Possible values of slink:VkAttachmentDescription::pname:storeOp and
-pname:stencilStoreOp, specifying how the contents of the attachment are
-treated, are:
-
-include::{generated}/api/enums/VkAttachmentStoreOp.txt[]
-
-  * ename:VK_ATTACHMENT_STORE_OP_STORE specifies the contents generated
-    during the render pass and within the render area are written to memory.
-    For attachments with a depth/stencil format, this uses the access type
-    ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT.
-    For attachments with a color format, this uses the access type
-    ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT.
-  * ename:VK_ATTACHMENT_STORE_OP_DONT_CARE specifies the contents within the
-    render area are not needed after rendering, and may: be discarded; the
-    contents of the attachment will be undefined: inside the render area.
-    For attachments with a depth/stencil format, this uses the access type
-    ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT.
-    For attachments with a color format, this uses the access type
-    ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT.
-ifdef::VK_EXT_load_store_op_none,VK_KHR_dynamic_rendering,VK_QCOM_render_pass_store_ops[]
-  * ename:VK_ATTACHMENT_STORE_OP_NONE_KHR specifies the contents within the
-    render area are not accessed by the store operation.
-    However, if the attachment was written to during the render pass, the
-    contents of the attachment will be undefined: inside the render area.
-endif::VK_EXT_load_store_op_none,VK_KHR_dynamic_rendering,VK_QCOM_render_pass_store_ops[]
-
-[NOTE]
-.Note
-====
-ename:VK_ATTACHMENT_STORE_OP_DONT_CARE can: cause contents generated during
-previous render passes to be discarded before reaching memory, even if no
-write to the attachment occurs during the current render pass.
-====
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-[open,refpage='VkRenderPassInputAttachmentAspectCreateInfo',desc='Structure specifying, for a given subpass/input attachment pair, which aspect can: be read.',type='structs']
---
-The sname:VkRenderPassInputAttachmentAspectCreateInfo structure is defined
-as:
-
-include::{generated}/api/structs/VkRenderPassInputAttachmentAspectCreateInfo.txt[]
-
-ifdef::VK_KHR_maintenance2[]
-or the equivalent
-
-include::{generated}/api/structs/VkRenderPassInputAttachmentAspectCreateInfoKHR.txt[]
-endif::VK_KHR_maintenance2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:aspectReferenceCount is the number of elements in the
-    pname:pAspectReferences array.
-  * pname:pAspectReferences is a pointer to an array of
-    pname:aspectReferenceCount slink:VkInputAttachmentAspectReference
-    structures containing a mask describing which aspect(s) can: be accessed
-    for a given input attachment within a given subpass.
-
-To specify which aspects of an input attachment can: be read, add a
-slink:VkRenderPassInputAttachmentAspectCreateInfo structure to the
-pname:pNext chain of the slink:VkRenderPassCreateInfo structure:
-
-An application can: access any aspect of an input attachment that does not
-have a specified aspect mask in the pname:pAspectReferences array.
-Otherwise, an application must: not access aspect(s) of an input attachment
-other than those in its specified aspect mask.
-
-include::{generated}/validity/structs/VkRenderPassInputAttachmentAspectCreateInfo.txt[]
---
-
-[open,refpage='VkInputAttachmentAspectReference',desc='Structure specifying a subpass/input attachment pair and an aspect mask that can: be read.',type='structs']
---
-The sname:VkInputAttachmentAspectReference structure is defined as:
-
-include::{generated}/api/structs/VkInputAttachmentAspectReference.txt[]
-
-ifdef::VK_KHR_maintenance2[]
-or the equivalent
-
-include::{generated}/api/structs/VkInputAttachmentAspectReferenceKHR.txt[]
-endif::VK_KHR_maintenance2[]
-
-  * pname:subpass is an index into the pname:pSubpasses array of the parent
-    sname:VkRenderPassCreateInfo structure.
-  * pname:inputAttachmentIndex is an index into the pname:pInputAttachments
-    of the specified subpass.
-  * pname:aspectMask is a mask of which aspect(s) can: be accessed within
-    the specified subpass.
-
-This structure specifies an aspect mask for a specific input attachment of a
-specific subpass in the render pass.
-
-pname:subpass and pname:inputAttachmentIndex index into the render pass as:
-
-[source,c]
-~~~~
-pCreateInfo->pSubpasses[subpass].pInputAttachments[inputAttachmentIndex]
-~~~~
-
-.Valid Usage
-****
-  * [[VUID-VkInputAttachmentAspectReference-aspectMask-01964]]
-    pname:aspectMask must: not include ename:VK_IMAGE_ASPECT_METADATA_BIT
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkInputAttachmentAspectReference-aspectMask-02250]]
-    pname:aspectMask must: not include
-    `VK_IMAGE_ASPECT_MEMORY_PLANE__{ibit}__BIT_EXT` for any index _i_
-endif::VK_EXT_image_drm_format_modifier[]
-****
-
-include::{generated}/validity/structs/VkInputAttachmentAspectReference.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-
-[open,refpage='VkSubpassDescription',desc='Structure specifying a subpass description',type='structs']
---
-The sname:VkSubpassDescription structure is defined as:
-
-include::{generated}/api/structs/VkSubpassDescription.txt[]
-
-  * pname:flags is a bitmask of elink:VkSubpassDescriptionFlagBits
-    specifying usage of the subpass.
-  * pname:pipelineBindPoint is a elink:VkPipelineBindPoint value specifying
-    the pipeline type supported for this subpass.
-  * pname:inputAttachmentCount is the number of input attachments.
-  * pname:pInputAttachments is a pointer to an array of
-    slink:VkAttachmentReference structures defining the input attachments
-    for this subpass and their layouts.
-  * pname:colorAttachmentCount is the number of color attachments.
-  * pname:pColorAttachments is a pointer to an array of
-    pname:colorAttachmentCount slink:VkAttachmentReference structures
-    defining the color attachments for this subpass and their layouts.
-  * pname:pResolveAttachments is `NULL` or a pointer to an array of
-    pname:colorAttachmentCount slink:VkAttachmentReference structures
-    defining the resolve attachments for this subpass and their layouts.
-  * pname:pDepthStencilAttachment is a pointer to a
-    slink:VkAttachmentReference structure specifying the depth/stencil
-    attachment for this subpass and its layout.
-  * pname:preserveAttachmentCount is the number of preserved attachments.
-  * pname:pPreserveAttachments is a pointer to an array of
-    pname:preserveAttachmentCount render pass attachment indices identifying
-    attachments that are not used by this subpass, but whose contents must:
-    be preserved throughout the subpass.
-
-Each element of the pname:pInputAttachments array corresponds to an input
-attachment index in a fragment shader, i.e. if a shader declares an image
-variable decorated with a code:InputAttachmentIndex value of *X*, then it
-uses the attachment provided in pname:pInputAttachments[*X*].
-Input attachments must: also be bound to the pipeline in a descriptor set.
-If the pname:attachment member of any element of pname:pInputAttachments is
-ename:VK_ATTACHMENT_UNUSED, the application must: not read from the
-corresponding input attachment index.
-Fragment shaders can: use subpass input variables to access the contents of
-an input attachment at the fragment's (x, y, layer) framebuffer coordinates.
-ifdef::VK_QCOM_render_pass_transform[]
-Input attachments must: not be used by any subpasses within a render pass
-that enables <<vertexpostproc-renderpass-transform, render pass transform>>.
-endif::VK_QCOM_render_pass_transform[]
-
-Each element of the pname:pColorAttachments array corresponds to an output
-location in the shader, i.e. if the shader declares an output variable
-decorated with a code:Location value of *X*, then it uses the attachment
-provided in pname:pColorAttachments[*X*].
-If the pname:attachment member of any element of pname:pColorAttachments is
-ename:VK_ATTACHMENT_UNUSED,
-ifdef::VK_EXT_color_write_enable[]
-or if <<framebuffer-color-write-enable,Color Write Enable>> has been
-disabled for the corresponding attachment index,
-endif::VK_EXT_color_write_enable[]
-then writes to the corresponding location by a fragment shader are
-discarded.
-
-If
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-pname:flags does not include
-ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, and if
-endif::VK_QCOM_render_pass_shader_resolve[]
-pname:pResolveAttachments is not `NULL`, each of its elements corresponds to
-a color attachment (the element in pname:pColorAttachments at the same
-index), and a multisample resolve operation is defined for each attachment.
-At the end of each subpass, multisample resolve operations read the
-subpass's color attachments, and resolve the samples for each pixel within
-the render area to the same pixel location in the corresponding resolve
-attachments, unless the resolve attachment index is
-ename:VK_ATTACHMENT_UNUSED.
-
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-Similarly, if
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-pname:flags does not include
-ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, and
-endif::VK_QCOM_render_pass_shader_resolve[]
-slink:VkSubpassDescriptionDepthStencilResolve::pname:pDepthStencilResolveAttachment
-is not `NULL` and does not have the value ename:VK_ATTACHMENT_UNUSED, it
-corresponds to the depth/stencil attachment in
-pname:pDepthStencilAttachment, and multisample resolve operations for depth
-and stencil are defined by
-slink:VkSubpassDescriptionDepthStencilResolve::pname:depthResolveMode and
-slink:VkSubpassDescriptionDepthStencilResolve::pname:stencilResolveMode,
-respectively.
-At the end of each subpass, multisample resolve operations read the
-subpass's depth/stencil attachment, and resolve the samples for each pixel
-to the same pixel location in the corresponding resolve attachment.
-If slink:VkSubpassDescriptionDepthStencilResolve::pname:depthResolveMode is
-ename:VK_RESOLVE_MODE_NONE, then the depth component of the resolve
-attachment is not written to and its contents are preserved.
-Similarly, if
-slink:VkSubpassDescriptionDepthStencilResolve::pname:stencilResolveMode is
-ename:VK_RESOLVE_MODE_NONE, then the stencil component of the resolve
-attachment is not written to and its contents are preserved.
-slink:VkSubpassDescriptionDepthStencilResolve::pname:depthResolveMode is
-ignored if the elink:VkFormat of the pname:pDepthStencilResolveAttachment
-does not have a depth component.
-Similarly,
-slink:VkSubpassDescriptionDepthStencilResolve::pname:stencilResolveMode is
-ignored if the elink:VkFormat of the pname:pDepthStencilResolveAttachment
-does not have a stencil component.
-
-ifdef::VK_EXT_sample_locations[]
-If the image subresource range referenced by the depth/stencil attachment is
-created with
-ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT, then the
-multisample resolve operation uses the sample locations state specified in
-the pname:sampleLocationsInfo member of the element of the
-sname:VkRenderPassSampleLocationsBeginInfoEXT::pname:pPostSubpassSampleLocations
-for the subpass.
-endif::VK_EXT_sample_locations[]
-
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-
-If pname:pDepthStencilAttachment is `NULL`, or if its attachment index is
-ename:VK_ATTACHMENT_UNUSED, it indicates that no depth/stencil attachment
-will be used in the subpass.
-
-The contents of an attachment within the render area become undefined: at
-the start of a subpass *S* if all of the following conditions are true:
-
-  * The attachment is used as a color, depth/stencil, or resolve attachment
-    in any subpass in the render pass.
-  * There is a subpass *S~1~* that uses or preserves the attachment, and a
-    subpass dependency from *S~1~* to *S*.
-  * The attachment is not used or preserved in subpass *S*.
-
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-In addition, the contents of an attachment within the render area become
-undefined: at the start of a subpass *S* if all of the following conditions
-are true:
-
-  * ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM is set.
-  * The attachment is used as a color or depth/stencil in the subpass.
-endif::VK_QCOM_render_pass_shader_resolve[]
-
-Once the contents of an attachment become undefined: in subpass *S*, they
-remain undefined: for subpasses in subpass dependency chains starting with
-subpass *S* until they are written again.
-However, they remain valid for subpasses in other subpass dependency chains
-starting with subpass *S~1~* if those subpasses use or preserve the
-attachment.
-
-.Valid Usage
-****
-ifndef::VK_HUAWEI_subpass_shading[]
-  * [[VUID-VkSubpassDescription-pipelineBindPoint-00844]]
-    pname:pipelineBindPoint must: be ename:VK_PIPELINE_BIND_POINT_GRAPHICS
-endif::VK_HUAWEI_subpass_shading[]
-ifdef::VK_HUAWEI_subpass_shading[]
-  * [[VUID-VkSubpassDescription-pipelineBindPoint-04952]]
-    pname:pipelineBindPoint must: be ename:VK_PIPELINE_BIND_POINT_GRAPHICS
-    or ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI
-endif::VK_HUAWEI_subpass_shading[]
-  * [[VUID-VkSubpassDescription-colorAttachmentCount-00845]]
-    pname:colorAttachmentCount must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxColorAttachments
-  * [[VUID-VkSubpassDescription-loadOp-00846]]
-    If the first use of an attachment in this render pass is as an input
-    attachment, and the attachment is not also used as a color or
-    depth/stencil attachment in the same subpass, then pname:loadOp must:
-    not be ename:VK_ATTACHMENT_LOAD_OP_CLEAR
-  * [[VUID-VkSubpassDescription-pResolveAttachments-00847]]
-    If pname:pResolveAttachments is not `NULL`, for each resolve attachment
-    that is not ename:VK_ATTACHMENT_UNUSED, the corresponding color
-    attachment must: not be ename:VK_ATTACHMENT_UNUSED
-  * [[VUID-VkSubpassDescription-pResolveAttachments-00848]]
-    If pname:pResolveAttachments is not `NULL`, for each resolve attachment
-    that is not ename:VK_ATTACHMENT_UNUSED, the corresponding color
-    attachment must: not have a sample count of ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-VkSubpassDescription-pResolveAttachments-00849]]
-    If pname:pResolveAttachments is not `NULL`, each resolve attachment that
-    is not ename:VK_ATTACHMENT_UNUSED must: have a sample count of
-    ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-VkSubpassDescription-pResolveAttachments-00850]]
-    If pname:pResolveAttachments is not `NULL`, each resolve attachment that
-    is not ename:VK_ATTACHMENT_UNUSED must: have the same elink:VkFormat as
-    its corresponding color attachment
-  * [[VUID-VkSubpassDescription-pColorAttachments-01417]]
-    All attachments in pname:pColorAttachments that are not
-    ename:VK_ATTACHMENT_UNUSED must: have the same sample count
-  * [[VUID-VkSubpassDescription-pInputAttachments-02647]]
-    All attachments in pname:pInputAttachments that are not
-    ename:VK_ATTACHMENT_UNUSED must: have image formats whose
-    <<potential-format-features, potential format features>> contain at
-    least ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkSubpassDescription-pColorAttachments-02648]]
-    All attachments in pname:pColorAttachments that are not
-    ename:VK_ATTACHMENT_UNUSED must: have image formats whose
-    <<potential-format-features, potential format features>> contain
-    ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
-  * [[VUID-VkSubpassDescription-pResolveAttachments-02649]]
-    All attachments in pname:pResolveAttachments that are not
-    ename:VK_ATTACHMENT_UNUSED must: have image formats whose
-    <<potential-format-features, potential format features>> contain
-    ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
-  * [[VUID-VkSubpassDescription-pDepthStencilAttachment-02650]]
-    If pname:pDepthStencilAttachment is not `NULL` and the attachment is not
-    ename:VK_ATTACHMENT_UNUSED then it must: have an image format whose
-    <<potential-format-features, potential format features>> contain
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-ifdef::VK_AMD_mixed_attachment_samples[]
-  * [[VUID-VkSubpassDescription-pColorAttachments-01506]]
-    If the `apiext:VK_AMD_mixed_attachment_samples` extension is enabled,
-    and all attachments in pname:pColorAttachments that are not
-    ename:VK_ATTACHMENT_UNUSED must: have a sample count that is smaller
-    than or equal to the sample count of pname:pDepthStencilAttachment if it
-    is not ename:VK_ATTACHMENT_UNUSED
-endif::VK_AMD_mixed_attachment_samples[]
-  * [[VUID-VkSubpassDescription-pDepthStencilAttachment-01418]]
-    If neither the `apiext:VK_AMD_mixed_attachment_samples` nor the
-    `apiext:VK_NV_framebuffer_mixed_samples` extensions are enabled, and if
-    pname:pDepthStencilAttachment is not ename:VK_ATTACHMENT_UNUSED and any
-    attachments in pname:pColorAttachments are not
-    ename:VK_ATTACHMENT_UNUSED, they must: have the same sample count
-  * [[VUID-VkSubpassDescription-attachment-00853]]
-    Each element of pname:pPreserveAttachments must: not be
-    ename:VK_ATTACHMENT_UNUSED
-  * [[VUID-VkSubpassDescription-pPreserveAttachments-00854]]
-    Each element of pname:pPreserveAttachments must: not also be an element
-    of any other member of the subpass description
-  * [[VUID-VkSubpassDescription-layout-02519]]
-    If any attachment is used by more than one slink:VkAttachmentReference
-    member, then each use must: use the same pname:layout
-  * [[VUID-VkSubpassDescription-None-04437]]
-    Each attachment must: follow the <<attachment-type-imagelayout, image
-    layout requirements>> specified for its attachment type
-ifdef::VK_NVX_multiview_per_view_attributes[]
-  * [[VUID-VkSubpassDescription-flags-00856]]
-    If pname:flags includes
-    ename:VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX, it must:
-    also include ename:VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX
-endif::VK_NVX_multiview_per_view_attributes[]
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-  * [[VUID-VkSubpassDescription-flags-03341]]
-    If pname:flags includes
-    ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, and if
-    pname:pResolveAttachments is not `NULL`, then each resolve attachment
-    must: be ename:VK_ATTACHMENT_UNUSED
-  * [[VUID-VkSubpassDescription-flags-03342]]
-    If pname:flags includes
-    ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, and if
-    pname:pDepthStencilResolveAttachmentKHR is not `NULL`, then the
-    depth/stencil resolve attachment must: be ename:VK_ATTACHMENT_UNUSED
-  * [[VUID-VkSubpassDescription-flags-03343]]
-    If pname:flags includes
-    ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, then the subpass
-    must: be the last subpass in a subpass dependency chain
-endif::VK_QCOM_render_pass_shader_resolve[]
-ifdef::VK_QCOM_render_pass_transform[]
-  * [[VUID-VkSubpassDescription-pInputAttachments-02868]]
-    If the render pass is created with
-    ename:VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM each of the elements of
-    pname:pInputAttachments must: be ename:VK_ATTACHMENT_UNUSED
-endif::VK_QCOM_render_pass_transform[]
-  * [[VUID-VkSubpassDescription-pDepthStencilAttachment-04438]]
-    pname:pDepthStencilAttachment and pname:pColorAttachments must not
-    contain references to the same attachment
-****
-
-include::{generated}/validity/structs/VkSubpassDescription.txt[]
---
-
-[open,refpage='VkSubpassDescriptionFlagBits',desc='Bitmask specifying usage of a subpass',type='enums']
---
-Bits which can: be set in slink:VkSubpassDescription::pname:flags,
-specifying usage of the subpass, are:
-
-include::{generated}/api/enums/VkSubpassDescriptionFlagBits.txt[]
-
-ifdef::VK_NVX_multiview_per_view_attributes[]
-  * ename:VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX specifies that
-    shaders compiled for this subpass write the attributes for all views in
-    a single invocation of each
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stage>>.
-    All pipelines compiled against a subpass that includes this bit must:
-    write per-view attributes to the `*PerViewNV[]` shader outputs, in
-    addition to the non-per-view (e.g. code:Position) outputs.
-  * ename:VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX specifies
-    that shaders compiled for this subpass use per-view positions which only
-    differ in value in the x component.
-    Per-view viewport mask can: also be used.
-endif::VK_NVX_multiview_per_view_attributes[]
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-  * ename:VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM specifies that the
-    framebuffer region is the fragment region, that is, the minimum region
-    dependencies are by pixel rather than by sample, such that any fragment
-    shader invocation can: access any sample associated with that fragment
-    shader invocation.
-  * ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM specifies that the
-    subpass performs shader resolve operations.
-endif::VK_QCOM_render_pass_shader_resolve[]
-
-ifndef::VK_NVX_multiview_per_view_attributes,VK_QCOM_render_pass_shader_resolve[]
-[NOTE]
-.Note
-====
-All bits for this type are defined by extensions, and none of those
-extensions are enabled in this build of the specification.
-====
-endif::VK_NVX_multiview_per_view_attributes,VK_QCOM_render_pass_shader_resolve[]
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-[NOTE]
-.Note
-====
-Shader resolve operations allow for custom resolve operations, but
-overdrawing pixels may: have a performance and/or power cost.
-Furthermore, since the content of any depth stencil attachment or color
-attachment is undefined: at the begining of a shader resolve subpass, any
-depth testing, stencil testing, or blending operation which sources these
-undefined: values also has undefined: result value.
-====
-endif::VK_QCOM_render_pass_shader_resolve[]
---
-
-[open,refpage='VkSubpassDescriptionFlags',desc='Bitmask of VkSubpassDescriptionFlagBits',type='flags']
---
-include::{generated}/api/flags/VkSubpassDescriptionFlags.txt[]
-
-tname:VkSubpassDescriptionFlags is a bitmask type for setting a mask of zero
-or more elink:VkSubpassDescriptionFlagBits.
---
-
-[open,refpage='VkAttachmentReference',desc='Structure specifying an attachment reference',type='structs']
---
-The sname:VkAttachmentReference structure is defined as:
-
-include::{generated}/api/structs/VkAttachmentReference.txt[]
-
-  * pname:attachment is either an integer value identifying an attachment at
-    the corresponding index in
-    slink:VkRenderPassCreateInfo::pname:pAttachments, or
-    ename:VK_ATTACHMENT_UNUSED to signify that this attachment is not used.
-  * pname:layout is a elink:VkImageLayout value specifying the layout the
-    attachment uses during the subpass.
-
-.Valid Usage
-****
-  * [[VUID-VkAttachmentReference-layout-00857]]
-    If pname:attachment is not ename:VK_ATTACHMENT_UNUSED, pname:layout
-    must: not be ename:VK_IMAGE_LAYOUT_UNDEFINED,
-    ename:VK_IMAGE_LAYOUT_PREINITIALIZED,
-    ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-****
-
-include::{generated}/validity/structs/VkAttachmentReference.txt[]
---
-
-[open,refpage='VK_SUBPASS_EXTERNAL',desc='Subpass index sentinel expanding synchronization scope outside a subpass',type='consts']
---
-ename:VK_SUBPASS_EXTERNAL is a special subpass index value expanding
-synchronization scope outside a subpass.
-It is described in more detail by slink:VkSubpassDependency.
-
-include::{generated}/api/enums/VK_SUBPASS_EXTERNAL.txt[]
---
-
-[open,refpage='VkSubpassDependency',desc='Structure specifying a subpass dependency',type='structs']
---
-The sname:VkSubpassDependency structure is defined as:
-
-include::{generated}/api/structs/VkSubpassDependency.txt[]
-
-  * pname:srcSubpass is the subpass index of the first subpass in the
-    dependency, or ename:VK_SUBPASS_EXTERNAL.
-  * pname:dstSubpass is the subpass index of the second subpass in the
-    dependency, or ename:VK_SUBPASS_EXTERNAL.
-  * pname:srcStageMask is a bitmask of elink:VkPipelineStageFlagBits
-    specifying the <<synchronization-pipeline-stages-masks, source stage
-    mask>>.
-  * pname:dstStageMask is a bitmask of elink:VkPipelineStageFlagBits
-    specifying the <<synchronization-pipeline-stages-masks, destination
-    stage mask>>
-  * pname:srcAccessMask is a bitmask of elink:VkAccessFlagBits specifying a
-    <<synchronization-access-masks, source access mask>>.
-  * pname:dstAccessMask is a bitmask of elink:VkAccessFlagBits specifying a
-    <<synchronization-access-masks, destination access mask>>.
-  * pname:dependencyFlags is a bitmask of elink:VkDependencyFlagBits.
-
-If pname:srcSubpass is equal to pname:dstSubpass then the
-slink:VkSubpassDependency describes a
-<<synchronization-pipeline-barriers-subpass-self-dependencies, subpass
-self-dependency>>, and only constrains the pipeline barriers allowed within
-a subpass instance.
-Otherwise, when a render pass instance which includes a subpass dependency
-is submitted to a queue, it defines a memory dependency between the
-subpasses identified by pname:srcSubpass and pname:dstSubpass.
-
-If pname:srcSubpass is equal to ename:VK_SUBPASS_EXTERNAL, the first
-<<synchronization-dependencies-scopes, synchronization scope>> includes
-commands that occur earlier in <<synchronization-submission-order,submission
-order>> than the flink:vkCmdBeginRenderPass used to begin the render pass
-instance.
-Otherwise, the first set of commands includes all commands submitted as part
-of the subpass instance identified by pname:srcSubpass and any load, store
-or multisample resolve operations on attachments used in pname:srcSubpass.
-In either case, the first synchronization scope is limited to operations on
-the pipeline stages determined by the
-<<synchronization-pipeline-stages-masks, source stage mask>> specified by
-pname:srcStageMask.
-
-If pname:dstSubpass is equal to ename:VK_SUBPASS_EXTERNAL, the second
-<<synchronization-dependencies-scopes, synchronization scope>> includes
-commands that occur later in <<synchronization-submission-order,submission
-order>> than the flink:vkCmdEndRenderPass used to end the render pass
-instance.
-Otherwise, the second set of commands includes all commands submitted as
-part of the subpass instance identified by pname:dstSubpass and any load,
-store or multisample resolve operations on attachments used in
-pname:dstSubpass.
-In either case, the second synchronization scope is limited to operations on
-the pipeline stages determined by the
-<<synchronization-pipeline-stages-masks, destination stage mask>> specified
-by pname:dstStageMask.
-
-The first <<synchronization-dependencies-access-scopes, access scope>> is
-limited to accesses in the pipeline stages determined by the
-<<synchronization-pipeline-stages-masks, source stage mask>> specified by
-pname:srcStageMask.
-It is also limited to access types in the <<synchronization-access-masks,
-source access mask>> specified by pname:srcAccessMask.
-
-The second <<synchronization-dependencies-access-scopes, access scope>> is
-limited to accesses in the pipeline stages determined by the
-<<synchronization-pipeline-stages-masks, destination stage mask>> specified
-by pname:dstStageMask.
-It is also limited to access types in the <<synchronization-access-masks,
-destination access mask>> specified by pname:dstAccessMask.
-
-The <<synchronization-dependencies-available-and-visible, availability and
-visibility operations>> defined by a subpass dependency affect the execution
-of <<renderpass-layout-transitions, image layout transitions>> within the
-render pass.
-
-[NOTE]
-.Note
-====
-For non-attachment resources, the memory dependency expressed by subpass
-dependency is nearly identical to that of a slink:VkMemoryBarrier (with
-matching pname:srcAccessMask and pname:dstAccessMask parameters) submitted
-as a part of a flink:vkCmdPipelineBarrier (with matching pname:srcStageMask
-and pname:dstStageMask parameters).
-The only difference being that its scopes are limited to the identified
-subpasses rather than potentially affecting everything before and after.
-
-For attachments however, subpass dependencies work more like a
-slink:VkImageMemoryBarrier defined similarly to the slink:VkMemoryBarrier
-above, the queue family indices set to ename:VK_QUEUE_FAMILY_IGNORED, and
-layouts as follows:
-
-  * The equivalent to pname:oldLayout is the attachment's layout according
-    to the subpass description for pname:srcSubpass.
-  * The equivalent to pname:newLayout is the attachment's layout according
-    to the subpass description for pname:dstSubpass.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkSubpassDependency-srcStageMask-00860]]
-    If the <<features-geometryShader,geometry shaders>> feature is not
-    enabled, pname:srcStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
-  * [[VUID-VkSubpassDependency-dstStageMask-00861]]
-    If the <<features-geometryShader,geometry shaders>> feature is not
-    enabled, pname:dstStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
-  * [[VUID-VkSubpassDependency-srcStageMask-00862]]
-    If the <<features-tessellationShader,tessellation shaders>> feature is
-    not enabled, pname:srcStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or
-    ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
-  * [[VUID-VkSubpassDependency-dstStageMask-00863]]
-    If the <<features-tessellationShader,tessellation shaders>> feature is
-    not enabled, pname:dstStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or
-    ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
-  * [[VUID-VkSubpassDependency-srcSubpass-00864]]
-    pname:srcSubpass must: be less than or equal to pname:dstSubpass, unless
-    one of them is ename:VK_SUBPASS_EXTERNAL, to avoid cyclic dependencies
-    and ensure a valid execution order
-  * [[VUID-VkSubpassDependency-srcSubpass-00865]]
-    pname:srcSubpass and pname:dstSubpass must: not both be equal to
-    ename:VK_SUBPASS_EXTERNAL
-  * [[VUID-VkSubpassDependency-srcSubpass-00867]]
-    If pname:srcSubpass is equal to pname:dstSubpass and not all of the
-    stages in pname:srcStageMask and pname:dstStageMask are
-    <<synchronization-framebuffer-regions,framebuffer-space stages>>, the
-    <<synchronization-pipeline-stages-order, logically latest>> pipeline
-    stage in pname:srcStageMask must: be
-    <<synchronization-pipeline-stages-order, logically earlier>> than or
-    equal to the <<synchronization-pipeline-stages-order, logically
-    earliest>> pipeline stage in pname:dstStageMask
-  * [[VUID-VkSubpassDependency-srcAccessMask-00868]]
-    Any access flag included in pname:srcAccessMask must: be supported by
-    one of the pipeline stages in pname:srcStageMask, as specified in the
-    <<synchronization-access-types-supported, table of supported access
-    types>>
-  * [[VUID-VkSubpassDependency-dstAccessMask-00869]]
-    Any access flag included in pname:dstAccessMask must: be supported by
-    one of the pipeline stages in pname:dstStageMask, as specified in the
-    <<synchronization-access-types-supported, table of supported access
-    types>>
-  * [[VUID-VkSubpassDependency-srcSubpass-02243]]
-    If pname:srcSubpass equals pname:dstSubpass, and pname:srcStageMask and
-    pname:dstStageMask both include a
-    <<synchronization-framebuffer-regions,framebuffer-space stage>>, then
-    pname:dependencyFlags must: include ename:VK_DEPENDENCY_BY_REGION_BIT
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkSubpassDependency-dependencyFlags-02520]]
-    If pname:dependencyFlags includes ename:VK_DEPENDENCY_VIEW_LOCAL_BIT,
-    pname:srcSubpass must: not be equal to ename:VK_SUBPASS_EXTERNAL
-  * [[VUID-VkSubpassDependency-dependencyFlags-02521]]
-    If pname:dependencyFlags includes ename:VK_DEPENDENCY_VIEW_LOCAL_BIT,
-    pname:dstSubpass must: not be equal to ename:VK_SUBPASS_EXTERNAL
-  * [[VUID-VkSubpassDependency-srcSubpass-00872]]
-    If pname:srcSubpass equals pname:dstSubpass and that subpass has more
-    than one bit set in the view mask, then pname:dependencyFlags must:
-    include ename:VK_DEPENDENCY_VIEW_LOCAL_BIT
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifdef::VK_NV_mesh_shader[]
-  * [[VUID-VkSubpassDependency-srcStageMask-02099]]
-    If the <<features-meshShader,mesh shaders>> feature is not enabled,
-    pname:srcStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV
-  * [[VUID-VkSubpassDependency-srcStageMask-02100]]
-    If the <<features-taskShader,task shaders>> feature is not enabled,
-    pname:srcStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV
-  * [[VUID-VkSubpassDependency-dstStageMask-02101]]
-    If the <<features-meshShader,mesh shaders>> feature is not enabled,
-    pname:dstStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV
-  * [[VUID-VkSubpassDependency-dstStageMask-02102]]
-    If the <<features-taskShader,task shaders>> feature is not enabled,
-    pname:dstStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV
-endif::VK_NV_mesh_shader[]
-ifdef::VK_KHR_synchronization2[]
-  * [[VUID-VkSubpassDependency-synchronization2-04984]]
-    If the <<features-synchronization2, pname:synchronization2>> feature is
-    not enabled, pname:srcStageMask must: not be `0`
-  * [[VUID-VkSubpassDependency-synchronization2-04985]]
-    If the <<features-synchronization2, pname:synchronization2>> feature is
-    not enabled, pname:dstStageMask must: not be `0`
-endif::VK_KHR_synchronization2[]
-ifndef::VK_KHR_synchronization2[]
-  * [[VUID-VkSubpassDependency-srcStageMask-04986]]
-    pname:srcStageMask must: not be `0`
-  * [[VUID-VkSubpassDependency-dstStageMask-04987]]
-    pname:dstStageMask must: not be `0`
-endif::VK_KHR_synchronization2[]
-****
-
-include::{generated}/validity/structs/VkSubpassDependency.txt[]
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-
-When multiview is enabled, the execution of the multiple views of one
-subpass may: not occur simultaneously or even back-to-back, and rather may:
-be interleaved with the execution of other subpasses.
-The load and store operations apply to attachments on a per-view basis.
-For example, an attachment using ename:VK_ATTACHMENT_LOAD_OP_CLEAR will have
-each view cleared on first use, but the first use of one view may be
-temporally distant from the first use of another view.
-
-[NOTE]
-.Note
-====
-A good mental model for multiview is to think of a multiview subpass as if
-it were a collection of individual (per-view) subpasses that are logically
-grouped together and described as a single multiview subpass in the API.
-Similarly, a multiview attachment can be thought of like several individual
-attachments that happen to be layers in a single image.
-A view-local dependency between two multiview subpasses acts like a set of
-one-to-one dependencies between corresponding pairs of per-view subpasses.
-A view-global dependency between two multiview subpasses acts like a set of
-[eq]#N {times} M# dependencies between all pairs of per-view subpasses in
-the source and destination.
-Thus, it is a more compact representation which also makes clear the
-commonality and reuse that is present between views in a subpass.
-This interpretation motivates the answers to questions like "`when does the
-load op apply`" - it is on the first use of each view of an attachment, as
-if each view was a separate attachment.
-====
-
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-ifdef::VK_EXT_transform_feedback[]
-If any two subpasses of a render pass activate transform feedback to the
-same bound transform feedback buffers, a subpass dependency must: be
-included (either directly or via some intermediate subpasses) between them.
-endif::VK_EXT_transform_feedback[]
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-The following two alleged implicit dependencies are practically no-ops, as
-the operations they describe are already guaranteed by semaphores and
-submission order (so they are almost entirely no-ops on their own).
-The *only* reason they exist is because it simplifies reasoning about where
-<<renderpass-layout-transitions, automatic layout transitions>> happen.
-Further rewrites of this chapter could potentially remove the need for
-these.
-====
-endif::editing-notes[]
-
-[[renderpass-implicit-dependencies]]
-If there is no subpass dependency from ename:VK_SUBPASS_EXTERNAL to the
-first subpass that uses an attachment, then an implicit subpass dependency
-exists from ename:VK_SUBPASS_EXTERNAL to the first subpass it is used in.
-The implicit subpass dependency only exists if there exists an automatic
-layout transition away from pname:initialLayout.
-The subpass dependency operates as if defined with the following parameters:
-
-[source,c]
-~~~~
-VkSubpassDependency implicitDependency = {
-    .srcSubpass = VK_SUBPASS_EXTERNAL;
-    .dstSubpass = firstSubpass; // First subpass attachment is used in
-ifdef::VK_KHR_synchronization2[]
-    .srcStageMask = VK_PIPELINE_STAGE_NONE_KHR;
-endif::VK_KHR_synchronization2[]
-ifndef::VK_KHR_synchronization2[]
-    .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
-endif::VK_KHR_synchronization2[]
-    .dstStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
-    .srcAccessMask = 0;
-    .dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
-                     VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
-                     VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
-                     VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
-                     VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
-    .dependencyFlags = 0;
-};
-~~~~
-
-Similarly, if there is no subpass dependency from the last subpass that uses
-an attachment to ename:VK_SUBPASS_EXTERNAL, then an implicit subpass
-dependency exists from the last subpass it is used in to
-ename:VK_SUBPASS_EXTERNAL.
-The implicit subpass dependency only exists if there exists an automatic
-layout transition into pname:finalLayout.
-The subpass dependency operates as if defined with the following parameters:
-
-[source,c]
-~~~~
-VkSubpassDependency implicitDependency = {
-    .srcSubpass = lastSubpass; // Last subpass attachment is used in
-    .dstSubpass = VK_SUBPASS_EXTERNAL;
-    .srcStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
-ifdef::VK_KHR_synchronization2[]
-    .dstStageMask = VK_PIPELINE_STAGE_NONE_KHR;
-endif::VK_KHR_synchronization2[]
-ifndef::VK_KHR_synchronization2[]
-    .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
-endif::VK_KHR_synchronization2[]
-    .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
-                     VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
-    .dstAccessMask = 0;
-    .dependencyFlags = 0;
-};
-~~~~
-
-[[renderpass-layout-transitions]]
-As subpasses may: overlap or execute out of order with regards to other
-subpasses unless a subpass dependency chain describes otherwise, the layout
-transitions required between subpasses cannot: be known to an application.
-Instead, an application provides the layout that each attachment must: be in
-at the start and end of a render pass, and the layout it must: be in during
-each subpass it is used in.
-The implementation then must: execute layout transitions between subpasses
-in order to guarantee that the images are in the layouts required by each
-subpass, and in the final layout at the end of the render pass.
-
-Automatic layout transitions apply to the entire image subresource attached
-to the framebuffer.
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-If the attachment view is a 2D or 2D array view of a 3D image, even if the
-attachment view only refers to a subset of the slices of the selected mip
-level of the 3D image, automatic layout transitions apply to the entire
-subresource referenced which is the entire mip level in this case.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-
-Automatic layout transitions away from the layout used in a subpass
-happen-after the availability operations for all dependencies with that
-subpass as the pname:srcSubpass.
-
-Automatic layout transitions into the layout used in a subpass happen-before
-the visibility operations for all dependencies with that subpass as the
-pname:dstSubpass.
-
-Automatic layout transitions away from pname:initialLayout happen-after the
-availability operations for all dependencies with a pname:srcSubpass equal
-to ename:VK_SUBPASS_EXTERNAL, where pname:dstSubpass uses the attachment
-that will be transitioned.
-For attachments created with ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT,
-automatic layout transitions away from pname:initialLayout happen-after the
-availability operations for all dependencies with a pname:srcSubpass equal
-to ename:VK_SUBPASS_EXTERNAL, where pname:dstSubpass uses any aliased
-attachment.
-
-Automatic layout transitions into pname:finalLayout happen-before the
-visibility operations for all dependencies with a pname:dstSubpass equal to
-ename:VK_SUBPASS_EXTERNAL, where pname:srcSubpass uses the attachment that
-will be transitioned.
-For attachments created with ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT,
-automatic layout transitions into pname:finalLayout happen-before the
-visibility operations for all dependencies with a pname:dstSubpass equal to
-ename:VK_SUBPASS_EXTERNAL, where pname:srcSubpass uses any aliased
-attachment.
-
-ifdef::VK_EXT_sample_locations[]
-
-The image layout of the depth aspect of a depth/stencil attachment referring
-to an image created with
-ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT is dependent
-on the last sample locations used to render to the attachment, thus
-automatic layout transitions use the sample locations state specified in
-slink:VkRenderPassSampleLocationsBeginInfoEXT.
-
-Automatic layout transitions of an attachment referring to a depth/stencil
-image created with
-ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT use the
-sample locations the image subresource range referenced by the attachment
-was last rendered with.
-If the current render pass does not use the attachment as a depth/stencil
-attachment in any subpass that happens-before, the automatic layout
-transition uses the sample locations state specified in the
-pname:sampleLocationsInfo member of the element of the
-sname:VkRenderPassSampleLocationsBeginInfoEXT::pname:pAttachmentInitialSampleLocations
-array for which the pname:attachmentIndex member equals the attachment index
-of the attachment, if one is specified.
-Otherwise, the automatic layout transition uses the sample locations state
-specified in the pname:sampleLocationsInfo member of the element of the
-sname:VkRenderPassSampleLocationsBeginInfoEXT::pname:pPostSubpassSampleLocations
-array for which the pname:subpassIndex member equals the index of the
-subpass that last used the attachment as a depth/stencil attachment, if one
-is specified.
-
-If no sample locations state has been specified for an automatic layout
-transition performed on an attachment referring to a depth/stencil image
-created with ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT
-the contents of the depth aspect of the depth/stencil attachment become
-undefined: as if the layout of the attachment was transitioned from the
-ename:VK_IMAGE_LAYOUT_UNDEFINED layout.
-
-endif::VK_EXT_sample_locations[]
-
-If two subpasses use the same attachment, and both subpasses use the
-attachment in a read-only layout, no subpass dependency needs to be
-specified between those subpasses.
-If an implementation treats those layouts separately, it must: insert an
-implicit subpass dependency between those subpasses to separate the uses in
-each layout.
-The subpass dependency operates as if defined with the following parameters:
-
-[source,c]
-~~~~
-// Used for input attachments
-VkPipelineStageFlags inputAttachmentStages = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
-VkAccessFlags inputAttachmentDstAccess = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
-
-// Used for depth/stencil attachments
-VkPipelineStageFlags depthStencilAttachmentStages = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
-VkAccessFlags depthStencilAttachmentDstAccess = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
-
-VkSubpassDependency implicitDependency = {
-    .srcSubpass = firstSubpass;
-    .dstSubpass = secondSubpass;
-    .srcStageMask = inputAttachmentStages | depthStencilAttachmentStages;
-    .dstStageMask = inputAttachmentStages | depthStencilAttachmentStages;
-    .srcAccessMask = 0;
-    .dstAccessMask = inputAttachmentDstAccess | depthStencilAttachmentDstAccess;
-    .dependencyFlags = 0;
-};
-~~~~
-
-[[renderpass-feedbackloop]]
-If a subpass uses the same attachment as both an input attachment and either
-a color attachment or a depth/stencil attachment, writes via the color or
-depth/stencil attachment are not automatically made visible to reads via the
-input attachment, causing a _feedback loop_, except in any of the following
-conditions:
-
-  * If the color components or depth/stencil components read by the input
-    attachment are mutually exclusive with the components written by the
-    color or depth/stencil attachments, then there is no feedback loop.
-    This requires the graphics pipelines used by the subpass to disable
-    writes to color components that are read as inputs via the
-ifdef::VK_EXT_color_write_enable[]
-    pname:colorWriteEnable or
-endif::VK_EXT_color_write_enable[]
-    pname:colorWriteMask, and to disable writes to depth/stencil components
-    that are read as inputs via pname:depthWriteEnable or
-    pname:stencilTestEnable.
-  * If the attachment is used as an input attachment and depth/stencil
-    attachment only, and the depth/stencil attachment is not written to.
-
-Rendering within a subpass that contains a feedback loop creates a
-<<memory-model-access-data-race, data race>>, except in the following cases:
-
-  * If a memory dependency is inserted between when the attachment is
-    written and when it is subsequently read by later fragments.
-    <<synchronization-pipeline-barriers, Pipeline barriers>> expressing a
-    <<synchronization-pipeline-barriers-subpass-self-dependencies, subpass
-    self-dependency>> are the only way to achieve this, and one must: be
-    inserted every time a fragment will read values at a particular sample
-    (x, y, layer, sample) coordinate, if those values have been written
-    since the most recent pipeline barrier; or since the start of the
-    subpass, if there have been no pipeline barriers since the start of the
-    subpass.
-
-[[attachment-type-imagelayout]]
-Attachments have requirements for a valid image layout depending on the
-usage
-
-  * An attachment used as an input attachment must: be in the
-ifdef::VK_KHR_shared_presentable_image[]
-    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_GENERAL layout.
-  * An attachment used only as a color attachment must: be in the
-    ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL or
-ifdef::VK_KHR_shared_presentable_image[]
-    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR or
-endif::VK_KHR_shared_presentable_image[]
-    ename:VK_IMAGE_LAYOUT_GENERAL layout.
-  * An attachment used as both an input attachment and a color attachment
-    must: be in the
-ifdef::VK_KHR_shared_presentable_image[]
-    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR or
-endif::VK_KHR_shared_presentable_image[]
-    ename:VK_IMAGE_LAYOUT_GENERAL layout.
-  * An attachment used only as a depth/stencil attachment must: be in the
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-ifdef::VK_KHR_shared_presentable_image[]
-    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_GENERAL layout.
-  * An attachment used as an input attachment and depth/stencil attachment
-    must: be in the
-ifdef::VK_KHR_shared_presentable_image[]
-    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
-endif::VK_KHR_shared_presentable_image[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_GENERAL layout.
-
-An attachment must: not be used as both a depth/stencil attachment and a
-color attachment.
-
-ifdef::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-A more extensible version of render pass creation is also defined below.
-
-[open,refpage='vkCreateRenderPass2',desc='Create a new render pass object',type='protos',alias='vkCreateRenderPass2KHR']
---
-To create a render pass, call:
-
-ifdef::VK_VERSION_1_2[]
-include::{generated}/api/protos/vkCreateRenderPass2.txt[]
-endif::VK_VERSION_1_2[]
-
-ifdef::VK_VERSION_1_2+VK_KHR_create_renderpass2[or the equivalent command]
-
-ifdef::VK_KHR_create_renderpass2[]
-include::{generated}/api/protos/vkCreateRenderPass2KHR.txt[]
-endif::VK_KHR_create_renderpass2[]
-
-  * pname:device is the logical device that creates the render pass.
-  * pname:pCreateInfo is a pointer to a slink:VkRenderPassCreateInfo2
-    structure describing the parameters of the render pass.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pRenderPass is a pointer to a slink:VkRenderPass handle in which
-    the resulting render pass object is returned.
-
-This command is functionally identical to flink:vkCreateRenderPass, but
-includes extensible sub-structures that include pname:sType and pname:pNext
-parameters, allowing them to be more easily extended.
-
-include::{generated}/validity/protos/vkCreateRenderPass2.txt[]
---
-
-[open,refpage='VkRenderPassCreateInfo2',desc='Structure specifying parameters of a newly created render pass',type='structs',alias='VkRenderPassCreateInfo2KHR']
---
-The sname:VkRenderPassCreateInfo2 structure is defined as:
-
-include::{generated}/api/structs/VkRenderPassCreateInfo2.txt[]
-
-ifdef::VK_KHR_create_renderpass2[]
-or the equivalent
-
-include::{generated}/api/structs/VkRenderPassCreateInfo2KHR.txt[]
-endif::VK_KHR_create_renderpass2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:attachmentCount is the number of attachments used by this render
-    pass.
-  * pname:pAttachments is a pointer to an array of pname:attachmentCount
-    slink:VkAttachmentDescription2 structures describing the attachments
-    used by the render pass.
-  * pname:subpassCount is the number of subpasses to create.
-  * pname:pSubpasses is a pointer to an array of pname:subpassCount
-    slink:VkSubpassDescription2 structures describing each subpass.
-  * pname:dependencyCount is the number of dependencies between pairs of
-    subpasses.
-  * pname:pDependencies is a pointer to an array of pname:dependencyCount
-    slink:VkSubpassDependency2 structures describing dependencies between
-    pairs of subpasses.
-  * pname:correlatedViewMaskCount is the number of correlation masks.
-  * pname:pCorrelatedViewMasks is a pointer to an array of view masks
-    indicating sets of views that may: be more efficient to render
-    concurrently.
-
-Parameters defined by this structure with the same name as those in
-slink:VkRenderPassCreateInfo have the identical effect to those parameters;
-the child structures are variants of those used in
-slink:VkRenderPassCreateInfo which add pname:sType and pname:pNext
-parameters, allowing them to be extended.
-
-If the slink:VkSubpassDescription2::pname:viewMask member of any element of
-pname:pSubpasses is not zero, _multiview_ functionality is considered to be
-enabled for this render pass.
-
-pname:correlatedViewMaskCount and pname:pCorrelatedViewMasks have the same
-effect as slink:VkRenderPassMultiviewCreateInfo::pname:correlationMaskCount
-and slink:VkRenderPassMultiviewCreateInfo::pname:pCorrelationMasks,
-respectively.
-
-.Valid Usage
-****
-  * [[VUID-VkRenderPassCreateInfo2-None-03049]]
-    If any two subpasses operate on attachments with overlapping ranges of
-    the same sname:VkDeviceMemory object, and at least one subpass writes to
-    that area of sname:VkDeviceMemory, a subpass dependency must: be
-    included (either directly or via some intermediate subpasses) between
-    them
-  * [[VUID-VkRenderPassCreateInfo2-attachment-03050]]
-    If the pname:attachment member of any element of
-    pname:pInputAttachments, pname:pColorAttachments,
-    pname:pResolveAttachments or pname:pDepthStencilAttachment, or the
-    attachment indexed by any element of pname:pPreserveAttachments in any
-    given element of pname:pSubpasses is bound to a range of a
-    sname:VkDeviceMemory object that overlaps with any other attachment in
-    any subpass (including the same subpass), the
-    sname:VkAttachmentDescription2 structures describing them must: include
-    ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT in pname:flags
-  * [[VUID-VkRenderPassCreateInfo2-attachment-03051]]
-    If the pname:attachment member of any element of
-    pname:pInputAttachments, pname:pColorAttachments,
-    pname:pResolveAttachments or pname:pDepthStencilAttachment, or any
-    element of pname:pPreserveAttachments in any given element of
-    pname:pSubpasses is not ename:VK_ATTACHMENT_UNUSED, it must: be less
-    than pname:attachmentCount
-  * [[VUID-VkRenderPassCreateInfo2-pAttachments-02522]]
-    For any member of pname:pAttachments with a pname:loadOp equal to
-    ename:VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment
-    must: not specify a pname:layout equal to
-    ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL
-  * [[VUID-VkRenderPassCreateInfo2-pAttachments-02523]]
-    For any member of pname:pAttachments with a pname:stencilLoadOp equal to
-    ename:VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment
-    must: not specify a pname:layout equal to
-    ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkRenderPassCreateInfo2-pDependencies-03054]]
-    For any element of pname:pDependencies, if the pname:srcSubpass is not
-    ename:VK_SUBPASS_EXTERNAL, all stage flags included in the
-    pname:srcStageMask member of that dependency must: be a pipeline stage
-    supported by the <<synchronization-pipeline-stages-types, pipeline>>
-    identified by the pname:pipelineBindPoint member of the source subpass
-  * [[VUID-VkRenderPassCreateInfo2-pDependencies-03055]]
-    For any element of pname:pDependencies, if the pname:dstSubpass is not
-    ename:VK_SUBPASS_EXTERNAL, all stage flags included in the
-    pname:dstStageMask member of that dependency must: be a pipeline stage
-    supported by the <<synchronization-pipeline-stages-types, pipeline>>
-    identified by the pname:pipelineBindPoint member of the destination
-    subpass
-  * [[VUID-VkRenderPassCreateInfo2-pCorrelatedViewMasks-03056]]
-    The set of bits included in any element of pname:pCorrelatedViewMasks
-    must: not overlap with the set of bits included in any other element of
-    pname:pCorrelatedViewMasks
-  * [[VUID-VkRenderPassCreateInfo2-viewMask-03057]]
-    If the slink:VkSubpassDescription2::pname:viewMask member of all
-    elements of pname:pSubpasses is `0`, pname:correlatedViewMaskCount must:
-    be `0`
-  * [[VUID-VkRenderPassCreateInfo2-viewMask-03058]]
-    The slink:VkSubpassDescription2::pname:viewMask member of all elements
-    of pname:pSubpasses must: either all be `0`, or all not be `0`
-  * [[VUID-VkRenderPassCreateInfo2-viewMask-03059]]
-    If the slink:VkSubpassDescription2::pname:viewMask member of all
-    elements of pname:pSubpasses is `0`, the pname:dependencyFlags member of
-    any element of pname:pDependencies must: not include
-    ename:VK_DEPENDENCY_VIEW_LOCAL_BIT
-  * [[VUID-VkRenderPassCreateInfo2-pDependencies-03060]]
-    For any element of pname:pDependencies where its pname:srcSubpass member
-    equals its pname:dstSubpass member, if the pname:viewMask member of the
-    corresponding element of pname:pSubpasses includes more than one bit,
-    its pname:dependencyFlags member must: include
-    ename:VK_DEPENDENCY_VIEW_LOCAL_BIT
-  * [[VUID-VkRenderPassCreateInfo2-attachment-02525]]
-    If the pname:attachment member of any element of the
-    pname:pInputAttachments member of any element of pname:pSubpasses is not
-    ename:VK_ATTACHMENT_UNUSED, the pname:aspectMask member of that element
-    of pname:pInputAttachments must: only include aspects that are present
-    in images of the format specified by the element of pname:pAttachments
-    specified by pname:attachment
-  * [[VUID-VkRenderPassCreateInfo2-srcSubpass-02526]]
-    The pname:srcSubpass member of each element of pname:pDependencies must:
-    be less than pname:subpassCount
-  * [[VUID-VkRenderPassCreateInfo2-dstSubpass-02527]]
-    The pname:dstSubpass member of each element of pname:pDependencies must:
-    be less than pname:subpassCount
-ifdef::VK_KHR_fragment_shading_rate[]
-  * [[VUID-VkRenderPassCreateInfo2-pAttachments-04585]]
-    If any element of pname:pAttachments is used as a fragment shading rate
-    attachment in any subpass, it must: not be used as any other attachment
-    in the render pass
-ifdef::VK_QCOM_render_pass_transform[]
-  * [[VUID-VkRenderPassCreateInfo2-flags-04521]]
-    If pname:flags includes ename:VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM,
-    an element of pname:pSubpasses includes an instance of
-    slink:VkFragmentShadingRateAttachmentInfoKHR in its pname:pNext chain,
-    and the pname:pFragmentShadingRateAttachment member of that structure is
-    not equal to `NULL`, the pname:attachment member of
-    pname:pFragmentShadingRateAttachment must: be ename:VK_ATTACHMENT_UNUSED
-endif::VK_QCOM_render_pass_transform[]
-  * [[VUID-VkRenderPassCreateInfo2-pAttachments-04586]]
-    If any element of pname:pAttachments is used as a fragment shading rate
-    attachment in any subpass, it must: have an image format whose
-    <<potential-format-features, potential format features>> contain
-    ename:VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-  * [[VUID-VkRenderPassCreateInfo2-rasterizationSamples-04905]]
-    If the pipeline is being created with fragment shader state, and the
-    apiext:VK_QCOM_render_pass_shader_resolve extension is enabled, and if
-    subpass has any input attachments, and if the subpass description
-    contains ename:VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM, then the
-    sample count of the input attachments must: equal
-    pname:rasterizationSamples
-  * [[VUID-VkRenderPassCreateInfo2-sampleShadingEnable-04906]]
-    If the pipeline is being created with fragment shader state, and the
-    apiext:VK_QCOM_render_pass_shader_resolve extension is enabled, and if
-    the subpass description contains
-    ename:VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM, then
-    pname:sampleShadingEnable must: be false
-  * [[VUID-VkRenderPassCreateInfo2-flags-04907]]
-    If pname:flags includes
-    ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, and if
-    pname:pResolveAttachments is not `NULL`, then each resolve attachment
-    must: be ename:VK_ATTACHMENT_UNUSED
-  * [[VUID-VkRenderPassCreateInfo2-flags-04908]]
-    If pname:flags includes
-    ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, and if
-    pname:pDepthStencilResolveAttachmentKHR is not `NULL`, then the
-    depth/stencil resolve attachment must: be ename:VK_ATTACHMENT_UNUSED
-  * [[VUID-VkRenderPassCreateInfo2-flags-04909]]
-    If pname:flags includes
-    ename:VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, then the subpass
-    must: be the last subpass in a subpass dependency chain
-endif::VK_QCOM_render_pass_shader_resolve[]
-****
-
-include::{generated}/validity/structs/VkRenderPassCreateInfo2.txt[]
---
-
-[open,refpage='VkAttachmentDescription2',desc='Structure specifying an attachment description',type='structs',alias='VkAttachmentDescription2KHR']
---
-The sname:VkAttachmentDescription2 structure is defined as:
-
-include::{generated}/api/structs/VkAttachmentDescription2.txt[]
-
-ifdef::VK_KHR_create_renderpass2[]
-or the equivalent
-
-include::{generated}/api/structs/VkAttachmentDescription2KHR.txt[]
-endif::VK_KHR_create_renderpass2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkAttachmentDescriptionFlagBits
-    specifying additional properties of the attachment.
-  * pname:format is a elink:VkFormat value specifying the format of the
-    image that will be used for the attachment.
-  * pname:samples is a elink:VkSampleCountFlagBits value specifying the
-    number of samples of the image.
-  * pname:loadOp is a elink:VkAttachmentLoadOp value specifying how the
-    contents of color and depth components of the attachment are treated at
-    the beginning of the subpass where it is first used.
-  * pname:storeOp is a elink:VkAttachmentStoreOp value specifying how the
-    contents of color and depth components of the attachment are treated at
-    the end of the subpass where it is last used.
-  * pname:stencilLoadOp is a elink:VkAttachmentLoadOp value specifying how
-    the contents of stencil components of the attachment are treated at the
-    beginning of the subpass where it is first used.
-  * pname:stencilStoreOp is a elink:VkAttachmentStoreOp value specifying how
-    the contents of stencil components of the attachment are treated at the
-    end of the last subpass where it is used.
-  * pname:initialLayout is the layout the attachment image subresource will
-    be in when a render pass instance begins.
-  * pname:finalLayout is the layout the attachment image subresource will be
-    transitioned to when a render pass instance ends.
-
-Parameters defined by this structure with the same name as those in
-slink:VkAttachmentDescription have the identical effect to those parameters.
-
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-If the <<features-separateDepthStencilLayouts,
-pname:separateDepthStencilLayouts>> feature is enabled, and pname:format is
-a depth/stencil format, pname:initialLayout and pname:finalLayout can: be
-set to a layout that only specifies the layout of the depth aspect.
-
-If the pname:pNext chain includes a
-slink:VkAttachmentDescriptionStencilLayout structure, then the
-pname:stencilInitialLayout and pname:stencilFinalLayout members specify the
-initial and final layouts of the stencil aspect of a depth/stencil format,
-and pname:initialLayout and pname:finalLayout only apply to the depth
-aspect.
-For depth-only formats, the slink:VkAttachmentDescriptionStencilLayout
-structure is ignored.
-For stencil-only formats, the initial and final layouts of the stencil
-aspect are taken from the slink:VkAttachmentDescriptionStencilLayout
-structure if present, or pname:initialLayout and pname:finalLayout if not
-present.
-
-If pname:format is a depth/stencil format, and either pname:initialLayout or
-pname:finalLayout does not specify a layout for the stencil aspect, then the
-application must: specify the initial and final layouts of the stencil
-aspect by including a slink:VkAttachmentDescriptionStencilLayout structure
-in the pname:pNext chain.
-
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-
-.Valid Usage
-****
-  * [[VUID-VkAttachmentDescription2-finalLayout-03061]]
-    pname:finalLayout must: not be ename:VK_IMAGE_LAYOUT_UNDEFINED or
-    ename:VK_IMAGE_LAYOUT_PREINITIALIZED
-  * [[VUID-VkAttachmentDescription2-format-03294]]
-    If pname:format is a color format, pname:initialLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL
-  * [[VUID-VkAttachmentDescription2-format-03295]]
-    If pname:format is a depth/stencil format, pname:initialLayout must: not
-    be ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-  * [[VUID-VkAttachmentDescription2-format-03296]]
-    If pname:format is a color format, pname:finalLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL
-  * [[VUID-VkAttachmentDescription2-format-03297]]
-    If pname:format is a depth/stencil format, pname:finalLayout must: not
-    be ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * [[VUID-VkAttachmentDescription2-separateDepthStencilLayouts-03298]]
-    If the <<features-separateDepthStencilLayouts,
-    pname:separateDepthStencilLayouts>> feature is not enabled,
-    pname:initialLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription2-separateDepthStencilLayouts-03299]]
-    If the <<features-separateDepthStencilLayouts,
-    pname:separateDepthStencilLayouts>> feature is not enabled,
-    pname:finalLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription2-format-03300]]
-    If pname:format is a color format, pname:initialLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription2-format-03301]]
-    If pname:format is a color format, pname:finalLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription2-format-03302]]
-    If pname:format is a depth/stencil format which includes both depth and
-    stencil aspects, and pname:initialLayout is
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, the pname:pNext chain
-    must: include a slink:VkAttachmentDescriptionStencilLayout structure
-  * [[VUID-VkAttachmentDescription2-format-03303]]
-    If pname:format is a depth/stencil format which includes both depth and
-    stencil aspects, and pname:finalLayout is
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, the pname:pNext chain
-    must: include a slink:VkAttachmentDescriptionStencilLayout structure
-  * [[VUID-VkAttachmentDescription2-format-03304]]
-    If pname:format is a depth/stencil format which includes only the depth
-    aspect, pname:initialLayout must: not be
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription2-format-03305]]
-    If pname:format is a depth/stencil format which includes only the depth
-    aspect, pname:finalLayout must: not be
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription2-format-03306]]
-    If pname:format is a depth/stencil format which includes only the
-    stencil aspect, pname:initialLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentDescription2-format-03307]]
-    If pname:format is a depth/stencil format which includes only the
-    stencil aspect, pname:finalLayout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-****
-
-include::{generated}/validity/structs/VkAttachmentDescription2.txt[]
---
-
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-[open,refpage='VkAttachmentDescriptionStencilLayout',desc='Structure specifying an attachment description',type='structs',alias='VkAttachmentDescriptionStencilLayoutKHR']
---
-The sname:VkAttachmentDescriptionStencilLayout structure is defined as:
-
-include::{generated}/api/structs/VkAttachmentDescriptionStencilLayout.txt[]
-
-ifdef::VK_KHR_separate_depth_stencil_layouts[]
-or the equivalent
-
-include::{generated}/api/structs/VkAttachmentDescriptionStencilLayoutKHR.txt[]
-endif::VK_KHR_separate_depth_stencil_layouts[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:stencilInitialLayout is the layout the stencil aspect of the
-    attachment image subresource will be in when a render pass instance
-    begins.
-  * pname:stencilFinalLayout is the layout the stencil aspect of the
-    attachment image subresource will be transitioned to when a render pass
-    instance ends.
-
-.Valid Usage
-****
-  * [[VUID-VkAttachmentDescriptionStencilLayout-stencilInitialLayout-03308]]
-    pname:stencilInitialLayout must: not be
-    ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL
-  * [[VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-03309]]
-    pname:stencilFinalLayout must: not be
-    ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL
-  * [[VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-03310]]
-    pname:stencilFinalLayout must: not be ename:VK_IMAGE_LAYOUT_UNDEFINED or
-    ename:VK_IMAGE_LAYOUT_PREINITIALIZED
-****
-
-include::{generated}/validity/structs/VkAttachmentDescriptionStencilLayout.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-
-[open,refpage='VkSubpassDescription2',desc='Structure specifying a subpass description',type='structs',alias='VkSubpassDescription2KHR']
---
-The sname:VkSubpassDescription2 structure is defined as:
-
-include::{generated}/api/structs/VkSubpassDescription2.txt[]
-
-ifdef::VK_KHR_create_renderpass2[]
-or the equivalent
-
-include::{generated}/api/structs/VkSubpassDescription2KHR.txt[]
-endif::VK_KHR_create_renderpass2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkSubpassDescriptionFlagBits
-    specifying usage of the subpass.
-  * pname:pipelineBindPoint is a elink:VkPipelineBindPoint value specifying
-    the pipeline type supported for this subpass.
-  * pname:viewMask is a bitfield of view indices describing which views
-    rendering is broadcast to in this subpass, when multiview is enabled.
-  * pname:inputAttachmentCount is the number of input attachments.
-  * pname:pInputAttachments is a pointer to an array of
-    slink:VkAttachmentReference2 structures defining the input attachments
-    for this subpass and their layouts.
-  * pname:colorAttachmentCount is the number of color attachments.
-  * pname:pColorAttachments is a pointer to an array of
-    pname:colorAttachmentCount slink:VkAttachmentReference2 structures
-    defining the color attachments for this subpass and their layouts.
-  * pname:pResolveAttachments is `NULL` or a pointer to an array of
-    pname:colorAttachmentCount slink:VkAttachmentReference2 structures
-    defining the resolve attachments for this subpass and their layouts.
-  * pname:pDepthStencilAttachment is a pointer to a
-    slink:VkAttachmentReference2 structure specifying the depth/stencil
-    attachment for this subpass and its layout.
-  * pname:preserveAttachmentCount is the number of preserved attachments.
-  * pname:pPreserveAttachments is a pointer to an array of
-    pname:preserveAttachmentCount render pass attachment indices identifying
-    attachments that are not used by this subpass, but whose contents must:
-    be preserved throughout the subpass.
-
-Parameters defined by this structure with the same name as those in
-slink:VkSubpassDescription have the identical effect to those parameters.
-
-pname:viewMask has the same effect for the described subpass as
-slink:VkRenderPassMultiviewCreateInfo::pname:pViewMasks has on each
-corresponding subpass.
-
-ifdef::VK_KHR_fragment_shading_rate[]
-If a slink:VkFragmentShadingRateAttachmentInfoKHR structure is included in
-the pname:pNext chain, pname:pFragmentShadingRateAttachment is not `NULL`,
-and its pname:attachment member is not ename:VK_ATTACHMENT_UNUSED, the
-identified attachment defines a fragment shading rate attachment for that
-subpass.
-endif::VK_KHR_fragment_shading_rate[]
-
-.Valid Usage
-****
-ifndef::VK_HUAWEI_subpass_shading[]
-  * [[VUID-VkSubpassDescription2-pipelineBindPoint-03062]]
-    pname:pipelineBindPoint must: be ename:VK_PIPELINE_BIND_POINT_GRAPHICS
-endif::VK_HUAWEI_subpass_shading[]
-ifdef::VK_HUAWEI_subpass_shading[]
-  * [[VUID-VkSubpassDescription2-pipelineBindPoint-04953]]
-    pname:pipelineBindPoint must: be ename:VK_PIPELINE_BIND_POINT_GRAPHICS
-    or ename:VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI
-endif::VK_HUAWEI_subpass_shading[]
-  * [[VUID-VkSubpassDescription2-colorAttachmentCount-03063]]
-    pname:colorAttachmentCount must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxColorAttachments
-  * [[VUID-VkSubpassDescription2-loadOp-03064]]
-    If the first use of an attachment in this render pass is as an input
-    attachment, and the attachment is not also used as a color or
-    depth/stencil attachment in the same subpass, then pname:loadOp must:
-    not be ename:VK_ATTACHMENT_LOAD_OP_CLEAR
-  * [[VUID-VkSubpassDescription2-pResolveAttachments-03065]]
-    If pname:pResolveAttachments is not `NULL`, for each resolve attachment
-    that does not have the value ename:VK_ATTACHMENT_UNUSED, the
-    corresponding color attachment must: not have the value
-    ename:VK_ATTACHMENT_UNUSED
-  * [[VUID-VkSubpassDescription2-pResolveAttachments-03066]]
-    If pname:pResolveAttachments is not `NULL`, for each resolve attachment
-    that is not ename:VK_ATTACHMENT_UNUSED, the corresponding color
-    attachment must: not have a sample count of ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-VkSubpassDescription2-pResolveAttachments-03067]]
-    If pname:pResolveAttachments is not `NULL`, each resolve attachment that
-    is not ename:VK_ATTACHMENT_UNUSED must: have a sample count of
-    ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-VkSubpassDescription2-pResolveAttachments-03068]]
-    Any given element of pname:pResolveAttachments must: have the same
-    elink:VkFormat as its corresponding color attachment
-  * [[VUID-VkSubpassDescription2-pColorAttachments-03069]]
-    All attachments in pname:pColorAttachments that are not
-    ename:VK_ATTACHMENT_UNUSED must: have the same sample count
-  * [[VUID-VkSubpassDescription2-pInputAttachments-02897]]
-    All attachments in pname:pInputAttachments that are not
-    ename:VK_ATTACHMENT_UNUSED must: have image formats whose
-    <<potential-format-features, potential format features>> contain at
-    least ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkSubpassDescription2-pColorAttachments-02898]]
-    All attachments in pname:pColorAttachments that are not
-    ename:VK_ATTACHMENT_UNUSED must: have image formats whose
-    <<potential-format-features, potential format features>> contain
-    ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
-  * [[VUID-VkSubpassDescription2-pResolveAttachments-02899]]
-    All attachments in pname:pResolveAttachments that are not
-    ename:VK_ATTACHMENT_UNUSED must: have image formats whose
-    <<potential-format-features, potential format features>> contain
-    ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
-  * [[VUID-VkSubpassDescription2-pDepthStencilAttachment-02900]]
-    If pname:pDepthStencilAttachment is not `NULL` and the attachment is not
-    ename:VK_ATTACHMENT_UNUSED then it must: have an image format whose
-    <<potential-format-features, potential format features>> contain
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-ifdef::VK_AMD_mixed_attachment_samples[]
-  * [[VUID-VkSubpassDescription2-pColorAttachments-03070]]
-    If the `apiext:VK_AMD_mixed_attachment_samples` extension is enabled,
-    all attachments in pname:pColorAttachments that are not
-    ename:VK_ATTACHMENT_UNUSED must: have a sample count that is smaller
-    than or equal to the sample count of pname:pDepthStencilAttachment if it
-    is not ename:VK_ATTACHMENT_UNUSED
-endif::VK_AMD_mixed_attachment_samples[]
-  * [[VUID-VkSubpassDescription2-pDepthStencilAttachment-03071]]
-    If neither the `apiext:VK_AMD_mixed_attachment_samples` nor the
-    `apiext:VK_NV_framebuffer_mixed_samples` extensions are enabled, and if
-    pname:pDepthStencilAttachment is not ename:VK_ATTACHMENT_UNUSED and any
-    attachments in pname:pColorAttachments are not
-    ename:VK_ATTACHMENT_UNUSED, they must: have the same sample count
-  * [[VUID-VkSubpassDescription2-attachment-03073]]
-    Each element of pname:pPreserveAttachments must: not be
-    ename:VK_ATTACHMENT_UNUSED
-  * [[VUID-VkSubpassDescription2-pPreserveAttachments-03074]]
-    Any given element of pname:pPreserveAttachments must: not also be an
-    element of any other member of the subpass description
-  * [[VUID-VkSubpassDescription2-layout-02528]]
-    If any attachment is used by more than one slink:VkAttachmentReference2
-    member, then each use must: use the same pname:layout
-  * [[VUID-VkSubpassDescription2-None-04439]]
-    Attachments must: follow the <<attachment-type-imagelayout, image layout
-    requirements>> based on the type of attachment it is being used as
-ifdef::VK_NVX_multiview_per_view_attributes[]
-  * [[VUID-VkSubpassDescription2-flags-03076]]
-    If pname:flags includes
-    ename:VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX, it must:
-    also include ename:VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX
-endif::VK_NVX_multiview_per_view_attributes[]
-  * [[VUID-VkSubpassDescription2-attachment-02799]]
-    If the pname:attachment member of any element of pname:pInputAttachments
-    is not ename:VK_ATTACHMENT_UNUSED, then the pname:aspectMask member
-    must: be a valid combination of elink:VkImageAspectFlagBits
-  * [[VUID-VkSubpassDescription2-attachment-02800]]
-    If the pname:attachment member of any element of pname:pInputAttachments
-    is not ename:VK_ATTACHMENT_UNUSED, then the pname:aspectMask member
-    must: not be `0`
-  * [[VUID-VkSubpassDescription2-attachment-02801]]
-    If the pname:attachment member of any element of pname:pInputAttachments
-    is not ename:VK_ATTACHMENT_UNUSED, then the pname:aspectMask member
-    must: not include ename:VK_IMAGE_ASPECT_METADATA_BIT
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkSubpassDescription2-attachment-04563]]
-    If the pname:attachment member of any element of pname:pInputAttachments
-    is not ename:VK_ATTACHMENT_UNUSED, then the pname:aspectMask member
-    must: not include `VK_IMAGE_ASPECT_MEMORY_PLANE__{ibit}__BIT_EXT` for
-    any index _i_
-endif::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkSubpassDescription2-pDepthStencilAttachment-04440]]
-    An attachment must: not be used in both pname:pDepthStencilAttachment
-    and pname:pColorAttachments
-****
-
-include::{generated}/validity/structs/VkSubpassDescription2.txt[]
---
-
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-[open,refpage='VkSubpassDescriptionDepthStencilResolve',desc='Structure specifying depth/stencil resolve operations for a subpass',type='structs',alias='VkSubpassDescriptionDepthStencilResolveKHR']
---
-If the pname:pNext chain of sname:VkSubpassDescription2 includes a
-sname:VkSubpassDescriptionDepthStencilResolve structure, then that structure
-describes multisample resolve operations for the depth/stencil attachment in
-a subpass.
-
-The sname:VkSubpassDescriptionDepthStencilResolve structure is defined as:
-
-include::{generated}/api/structs/VkSubpassDescriptionDepthStencilResolve.txt[]
-
-ifdef::VK_KHR_depth_stencil_resolve[]
-or the equivalent
-
-include::{generated}/api/structs/VkSubpassDescriptionDepthStencilResolveKHR.txt[]
-endif::VK_KHR_depth_stencil_resolve[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:depthResolveMode is a elink:VkResolveModeFlagBits value describing
-    the depth resolve mode.
-  * pname:stencilResolveMode is a elink:VkResolveModeFlagBits value
-    describing the stencil resolve mode.
-  * pname:pDepthStencilResolveAttachment is `NULL` or a pointer to a
-    slink:VkAttachmentReference2 structure defining the depth/stencil
-    resolve attachment for this subpass and its layout.
-
-.Valid Usage
-****
-  * [[VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03177]]
-    If pname:pDepthStencilResolveAttachment is not `NULL` and does not have
-    the value ename:VK_ATTACHMENT_UNUSED, pname:pDepthStencilAttachment
-    must: not have the value ename:VK_ATTACHMENT_UNUSED
-  * [[VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03178]]
-    If pname:pDepthStencilResolveAttachment is not `NULL` and does not have
-    the value ename:VK_ATTACHMENT_UNUSED, pname:depthResolveMode and
-    pname:stencilResolveMode must: not both be ename:VK_RESOLVE_MODE_NONE
-  * [[VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03179]]
-    If pname:pDepthStencilResolveAttachment is not `NULL` and does not have
-    the value ename:VK_ATTACHMENT_UNUSED, pname:pDepthStencilAttachment
-    must: not have a sample count of ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03180]]
-    If pname:pDepthStencilResolveAttachment is not `NULL` and does not have
-    the value ename:VK_ATTACHMENT_UNUSED,
-    pname:pDepthStencilResolveAttachment must: have a sample count of
-    ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-02651]]
-    If pname:pDepthStencilResolveAttachment is not `NULL` and does not have
-    the value ename:VK_ATTACHMENT_UNUSED then it must: have an image format
-    whose <<potential-format-features, potential format features>> contain
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03181]]
-    If the elink:VkFormat of pname:pDepthStencilResolveAttachment has a
-    depth component, then the elink:VkFormat of
-    pname:pDepthStencilAttachment must: have a depth component with the same
-    number of bits and numerical type
-  * [[VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03182]]
-    If the elink:VkFormat of pname:pDepthStencilResolveAttachment has a
-    stencil component, then the elink:VkFormat of
-    pname:pDepthStencilAttachment must: have a stencil component with the
-    same number of bits and numerical type
-  * [[VUID-VkSubpassDescriptionDepthStencilResolve-depthResolveMode-03183]]
-    The value of pname:depthResolveMode must: be one of the bits set in
-    slink:VkPhysicalDeviceDepthStencilResolveProperties::pname:supportedDepthResolveModes
-    or ename:VK_RESOLVE_MODE_NONE
-  * [[VUID-VkSubpassDescriptionDepthStencilResolve-stencilResolveMode-03184]]
-    The value of pname:stencilResolveMode must: be one of the bits set in
-    slink:VkPhysicalDeviceDepthStencilResolveProperties::pname:supportedStencilResolveModes
-    or ename:VK_RESOLVE_MODE_NONE
-  * [[VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03185]]
-    If the elink:VkFormat of pname:pDepthStencilResolveAttachment has both
-    depth and stencil components,
-    slink:VkPhysicalDeviceDepthStencilResolveProperties::pname:independentResolve
-    is ename:VK_FALSE, and
-    slink:VkPhysicalDeviceDepthStencilResolveProperties::pname:independentResolveNone
-    is ename:VK_FALSE, then the values of pname:depthResolveMode and
-    pname:stencilResolveMode must: be identical
-  * [[VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03186]]
-    If the elink:VkFormat of pname:pDepthStencilResolveAttachment has both
-    depth and stencil components,
-    slink:VkPhysicalDeviceDepthStencilResolveProperties::pname:independentResolve
-    is ename:VK_FALSE and
-    slink:VkPhysicalDeviceDepthStencilResolveProperties::pname:independentResolveNone
-    is ename:VK_TRUE, then the values of pname:depthResolveMode and
-    pname:stencilResolveMode must: be identical or one of them must: be
-    ename:VK_RESOLVE_MODE_NONE
-  * [[VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-04588]]
-    If the elink:VkFormat of pname:pDepthStencilResolveAttachment has a
-    depth component, pname:depthResolveMode must: be a valid
-    elink:VkResolveModeFlagBits value
-  * [[VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-04589]]
-    If the elink:VkFormat of pname:pDepthStencilResolveAttachment has a
-    stencil component, pname:stencilResolveMode must: be a valid
-    elink:VkResolveModeFlagBits value
-****
-
-include::{generated}/validity/structs/VkSubpassDescriptionDepthStencilResolve.txt[]
---
-
-[open,refpage='VkResolveModeFlagBits',desc='Bitmask indicating supported depth and stencil resolve modes',type='enums',alias='VkResolveModeFlagBitsKHR']
---
-Possible values of
-slink:VkSubpassDescriptionDepthStencilResolve::pname:depthResolveMode and
-pname:stencilResolveMode, specifying the depth and stencil resolve modes,
-are:
-
-include::{generated}/api/enums/VkResolveModeFlagBits.txt[]
-
-ifdef::VK_KHR_depth_stencil_resolve[]
-or the equivalent
-
-include::{generated}/api/enums/VkResolveModeFlagBitsKHR.txt[]
-endif::VK_KHR_depth_stencil_resolve[]
-
-  * ename:VK_RESOLVE_MODE_NONE indicates that no resolve operation is done.
-  * ename:VK_RESOLVE_MODE_SAMPLE_ZERO_BIT indicates that result of the
-    resolve operation is equal to the value of sample 0.
-  * ename:VK_RESOLVE_MODE_AVERAGE_BIT indicates that result of the resolve
-    operation is the average of the sample values.
-  * ename:VK_RESOLVE_MODE_MIN_BIT indicates that result of the resolve
-    operation is the minimum of the sample values.
-  * ename:VK_RESOLVE_MODE_MAX_BIT indicates that result of the resolve
-    operation is the maximum of the sample values.
---
-
-[open,refpage='VkResolveModeFlags',desc='Bitmask of VkResolveModeFlagBits',type='flags',alias='VkResolveModeFlagsKHR']
---
-include::{generated}/api/flags/VkResolveModeFlags.txt[]
-
-ifdef::VK_KHR_depth_stencil_resolve[]
-or the equivalent
-
-include::{generated}/api/flags/VkResolveModeFlagsKHR.txt[]
-endif::VK_KHR_depth_stencil_resolve[]
-
-tname:VkResolveModeFlags is a bitmask type for setting a mask of zero or
-more elink:VkResolveModeFlagBits.
---
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-
-
-ifdef::VK_KHR_fragment_shading_rate[]
-[open,refpage='VkFragmentShadingRateAttachmentInfoKHR',desc='Structure specifying a fragment shading rate attachment for a subpass',type='structs']
---
-The sname:VkFragmentShadingRateAttachmentInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkFragmentShadingRateAttachmentInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pFragmentShadingRateAttachment is `NULL` or a pointer to a
-    slink:VkAttachmentReference2 structure defining the fragment shading
-    rate attachment for this subpass.
-  * pname:shadingRateAttachmentTexelSize specifies the size of the portion
-    of the framebuffer corresponding to each texel in
-    pname:pFragmentShadingRateAttachment.
-
-If no shading rate attachment is specified, or if this structure is not
-specified, the implementation behaves as if a valid shading rate attachment
-was specified with all texels specifying a single pixel per fragment.
-
-.Valid Usage
-****
-  * [[VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04524]]
-    If pname:pFragmentShadingRateAttachment is not `NULL` and its
-    pname:attachment member is not ename:VK_ATTACHMENT_UNUSED, its
-    pname:layout member must: be equal to ename:VK_IMAGE_LAYOUT_GENERAL or
-    ename:VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR
-  * [[VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04525]]
-    If pname:pFragmentShadingRateAttachment is not `NULL` and its
-    pname:attachment member is not ename:VK_ATTACHMENT_UNUSED,
-    pname:shadingRateAttachmentTexelSize.width must: be a power of two value
-  * [[VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04526]]
-    If pname:pFragmentShadingRateAttachment is not `NULL` and its
-    pname:attachment member is not ename:VK_ATTACHMENT_UNUSED,
-    pname:shadingRateAttachmentTexelSize.width must: be less than or equal
-    to <<limits-maxFragmentShadingRateAttachmentTexelSize,
-    pname:maxFragmentShadingRateAttachmentTexelSize.width>>
-  * [[VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04527]]
-    If pname:pFragmentShadingRateAttachment is not `NULL` and its
-    pname:attachment member is not ename:VK_ATTACHMENT_UNUSED,
-    pname:shadingRateAttachmentTexelSize.width must: be greater than or
-    equal to <<limits-minFragmentShadingRateAttachmentTexelSize,
-    pname:minFragmentShadingRateAttachmentTexelSize.width>>
-  * [[VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04528]]
-    If pname:pFragmentShadingRateAttachment is not `NULL` and its
-    pname:attachment member is not ename:VK_ATTACHMENT_UNUSED,
-    pname:shadingRateAttachmentTexelSize.height must: be a power of two
-    value
-  * [[VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04529]]
-    If pname:pFragmentShadingRateAttachment is not `NULL` and its
-    pname:attachment member is not ename:VK_ATTACHMENT_UNUSED,
-    pname:shadingRateAttachmentTexelSize.height must: be less than or equal
-    to <<limits-maxFragmentShadingRateAttachmentTexelSize,
-    pname:maxFragmentShadingRateAttachmentTexelSize.height>>
-  * [[VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04530]]
-    If pname:pFragmentShadingRateAttachment is not `NULL` and its
-    pname:attachment member is not ename:VK_ATTACHMENT_UNUSED,
-    pname:shadingRateAttachmentTexelSize.height must: be greater than or
-    equal to <<limits-minFragmentShadingRateAttachmentTexelSize,
-    pname:minFragmentShadingRateAttachmentTexelSize.height>>
-  * [[VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04531]]
-    If pname:pFragmentShadingRateAttachment is not `NULL` and its
-    pname:attachment member is not ename:VK_ATTACHMENT_UNUSED, the quotient
-    of pname:shadingRateAttachmentTexelSize.width and
-    pname:shadingRateAttachmentTexelSize.height must: be less than or equal
-    to <<limits-maxFragmentShadingRateAttachmentTexelSizeAspectRatio,
-    pname:maxFragmentShadingRateAttachmentTexelSizeAspectRatio>>
-  * [[VUID-VkFragmentShadingRateAttachmentInfoKHR-pFragmentShadingRateAttachment-04532]]
-    If pname:pFragmentShadingRateAttachment is not `NULL` and its
-    pname:attachment member is not ename:VK_ATTACHMENT_UNUSED, the quotient
-    of pname:shadingRateAttachmentTexelSize.height and
-    pname:shadingRateAttachmentTexelSize.width must: be less than or equal
-    to <<limits-maxFragmentShadingRateAttachmentTexelSizeAspectRatio,
-    pname:maxFragmentShadingRateAttachmentTexelSizeAspectRatio>>
-****
-
-include::{generated}/validity/structs/VkFragmentShadingRateAttachmentInfoKHR.txt[]
---
-endif::VK_KHR_fragment_shading_rate[]
-
-[open,refpage='VkAttachmentReference2',desc='Structure specifying an attachment reference',type='structs',alias='VkAttachmentReference2KHR']
---
-The sname:VkAttachmentReference2 structure is defined as:
-
-include::{generated}/api/structs/VkAttachmentReference2.txt[]
-
-ifdef::VK_KHR_create_renderpass2[]
-or the equivalent
-
-include::{generated}/api/structs/VkAttachmentReference2KHR.txt[]
-endif::VK_KHR_create_renderpass2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:attachment is either an integer value identifying an attachment at
-    the corresponding index in
-    slink:VkRenderPassCreateInfo2::pname:pAttachments, or
-    ename:VK_ATTACHMENT_UNUSED to signify that this attachment is not used.
-  * pname:layout is a elink:VkImageLayout value specifying the layout the
-    attachment uses during the subpass.
-  * pname:aspectMask is a mask of which aspect(s) can: be accessed within
-    the specified subpass as an input attachment.
-
-Parameters defined by this structure with the same name as those in
-slink:VkAttachmentReference have the identical effect to those parameters.
-
-pname:aspectMask is ignored when this structure is used to describe anything
-other than an input attachment reference.
-
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-If the <<features-separateDepthStencilLayouts,
-pname:separateDepthStencilLayouts>> feature is enabled, and pname:attachment
-has a depth/stencil format, pname:layout can: be set to a layout that only
-specifies the layout of the depth aspect.
-
-If pname:layout only specifies the layout of the depth aspect of the
-attachment, the layout of the stencil aspect is specified by the
-pname:stencilLayout member of a slink:VkAttachmentReferenceStencilLayout
-structure included in the pname:pNext chain.
-Otherwise, pname:layout describes the layout for all relevant image aspects.
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-
-.Valid Usage
-****
-  * [[VUID-VkAttachmentReference2-layout-03077]]
-    If pname:attachment is not ename:VK_ATTACHMENT_UNUSED, pname:layout
-    must: not be ename:VK_IMAGE_LAYOUT_UNDEFINED,
-    ename:VK_IMAGE_LAYOUT_PREINITIALIZED, or
-    ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * [[VUID-VkAttachmentReference2-separateDepthStencilLayouts-03313]]
-    If the <<features-separateDepthStencilLayouts,
-    pname:separateDepthStencilLayouts>> feature is not enabled, and
-    pname:attachment is not ename:VK_ATTACHMENT_UNUSED, pname:layout must:
-    not be ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,
-  * [[VUID-VkAttachmentReference2-attachment-04754]]
-    If pname:attachment is not ename:VK_ATTACHMENT_UNUSED, and the format of
-    the referenced attachment is a color format, pname:layout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentReference2-attachment-04755]]
-    If pname:attachment is not ename:VK_ATTACHMENT_UNUSED, and the format of
-    the referenced attachment is a depth/stencil format which includes both
-    depth and stencil aspects, and pname:layout is
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, the pname:pNext chain
-    must: include a slink:VkAttachmentReferenceStencilLayout structure
-  * [[VUID-VkAttachmentReference2-attachment-04756]]
-    If pname:attachment is not ename:VK_ATTACHMENT_UNUSED, and the format of
-    the referenced attachment is a depth/stencil format which includes only
-    the depth aspect, pname:layout must: not be
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL
-  * [[VUID-VkAttachmentReference2-attachment-04757]]
-    If pname:attachment is not ename:VK_ATTACHMENT_UNUSED, and the format of
-    the referenced attachment is a depth/stencil format which includes only
-    the stencil aspect, pname:layout must: not be
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-****
-
-include::{generated}/validity/structs/VkAttachmentReference2.txt[]
---
-
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-[open,refpage='VkAttachmentReferenceStencilLayout',desc='Structure specifying an attachment description',type='structs',alias='VkAttachmentReferenceStencilLayoutKHR']
---
-The sname:VkAttachmentReferenceStencilLayout structure is defined as:
-
-include::{generated}/api/structs/VkAttachmentReferenceStencilLayout.txt[]
-
-ifdef::VK_KHR_separate_depth_stencil_layouts[]
-or the equivalent
-
-include::{generated}/api/structs/VkAttachmentReferenceStencilLayoutKHR.txt[]
-endif::VK_KHR_separate_depth_stencil_layouts[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:stencilLayout is a elink:VkImageLayout value specifying the layout
-    the stencil aspect of the attachment uses during the subpass.
-
-.Valid Usage
-****
-  * [[VUID-VkAttachmentReferenceStencilLayout-stencilLayout-03318]]
-    pname:stencilLayout must: not be ename:VK_IMAGE_LAYOUT_UNDEFINED,
-    ename:VK_IMAGE_LAYOUT_PREINITIALIZED,
-    ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
-****
-
-include::{generated}/validity/structs/VkAttachmentReferenceStencilLayout.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-
-[open,refpage='VkSubpassDependency2',desc='Structure specifying a subpass dependency',type='structs',alias='VkSubpassDependency2KHR']
---
-The sname:VkSubpassDependency2 structure is defined as:
-
-include::{generated}/api/structs/VkSubpassDependency2.txt[]
-
-ifdef::VK_KHR_create_renderpass2[]
-or the equivalent
-
-include::{generated}/api/structs/VkSubpassDependency2KHR.txt[]
-endif::VK_KHR_create_renderpass2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcSubpass is the subpass index of the first subpass in the
-    dependency, or ename:VK_SUBPASS_EXTERNAL.
-  * pname:dstSubpass is the subpass index of the second subpass in the
-    dependency, or ename:VK_SUBPASS_EXTERNAL.
-  * pname:srcStageMask is a bitmask of elink:VkPipelineStageFlagBits
-    specifying the <<synchronization-pipeline-stages-masks, source stage
-    mask>>.
-  * pname:dstStageMask is a bitmask of elink:VkPipelineStageFlagBits
-    specifying the <<synchronization-pipeline-stages-masks, destination
-    stage mask>>
-  * pname:srcAccessMask is a bitmask of elink:VkAccessFlagBits specifying a
-    <<synchronization-access-masks, source access mask>>.
-  * pname:dstAccessMask is a bitmask of elink:VkAccessFlagBits specifying a
-    <<synchronization-access-masks, destination access mask>>.
-  * pname:dependencyFlags is a bitmask of elink:VkDependencyFlagBits.
-  * pname:viewOffset controls which views in the source subpass the views in
-    the destination subpass depend on.
-
-Parameters defined by this structure with the same name as those in
-slink:VkSubpassDependency have the identical effect to those parameters.
-
-pname:viewOffset has the same effect for the described subpass dependency as
-slink:VkRenderPassMultiviewCreateInfo::pname:pViewOffsets has on each
-corresponding subpass dependency.
-
-ifdef::VK_KHR_synchronization2[]
-If a slink:VkMemoryBarrier2KHR structure is included in the pname:pNext
-chain, pname:srcStageMask, pname:dstStageMask, pname:srcAccessMask, and
-pname:dstAccessMask parameters are ignored.
-The synchronization and access scopes instead are defined by the parameters
-of slink:VkMemoryBarrier2KHR.
-endif::VK_KHR_synchronization2[]
-
-.Valid Usage
-****
-  * [[VUID-VkSubpassDependency2-srcStageMask-03080]]
-    If the <<features-geometryShader,geometry shaders>> feature is not
-    enabled, pname:srcStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
-  * [[VUID-VkSubpassDependency2-dstStageMask-03081]]
-    If the <<features-geometryShader,geometry shaders>> feature is not
-    enabled, pname:dstStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
-  * [[VUID-VkSubpassDependency2-srcStageMask-03082]]
-    If the <<features-tessellationShader,tessellation shaders>> feature is
-    not enabled, pname:srcStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or
-    ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
-  * [[VUID-VkSubpassDependency2-dstStageMask-03083]]
-    If the <<features-tessellationShader,tessellation shaders>> feature is
-    not enabled, pname:dstStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or
-    ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
-  * [[VUID-VkSubpassDependency2-srcSubpass-03084]]
-    pname:srcSubpass must: be less than or equal to pname:dstSubpass, unless
-    one of them is ename:VK_SUBPASS_EXTERNAL, to avoid cyclic dependencies
-    and ensure a valid execution order
-  * [[VUID-VkSubpassDependency2-srcSubpass-03085]]
-    pname:srcSubpass and pname:dstSubpass must: not both be equal to
-    ename:VK_SUBPASS_EXTERNAL
-  * [[VUID-VkSubpassDependency2-srcSubpass-03087]]
-    If pname:srcSubpass is equal to pname:dstSubpass and not all of the
-    stages in pname:srcStageMask and pname:dstStageMask are
-    <<synchronization-framebuffer-regions,framebuffer-space stages>>, the
-    <<synchronization-pipeline-stages-order, logically latest>> pipeline
-    stage in pname:srcStageMask must: be
-    <<synchronization-pipeline-stages-order, logically earlier>> than or
-    equal to the <<synchronization-pipeline-stages-order, logically
-    earliest>> pipeline stage in pname:dstStageMask
-  * [[VUID-VkSubpassDependency2-srcAccessMask-03088]]
-    Any access flag included in pname:srcAccessMask must: be supported by
-    one of the pipeline stages in pname:srcStageMask, as specified in the
-    <<synchronization-access-types-supported, table of supported access
-    types>>
-  * [[VUID-VkSubpassDependency2-dstAccessMask-03089]]
-    Any access flag included in pname:dstAccessMask must: be supported by
-    one of the pipeline stages in pname:dstStageMask, as specified in the
-    <<synchronization-access-types-supported, table of supported access
-    types>>
-  * [[VUID-VkSubpassDependency2-dependencyFlags-03090]]
-    If pname:dependencyFlags includes ename:VK_DEPENDENCY_VIEW_LOCAL_BIT,
-    pname:srcSubpass must: not be equal to ename:VK_SUBPASS_EXTERNAL
-  * [[VUID-VkSubpassDependency2-dependencyFlags-03091]]
-    If pname:dependencyFlags includes ename:VK_DEPENDENCY_VIEW_LOCAL_BIT,
-    pname:dstSubpass must: not be equal to ename:VK_SUBPASS_EXTERNAL
-  * [[VUID-VkSubpassDependency2-srcSubpass-02245]]
-    If pname:srcSubpass equals pname:dstSubpass, and pname:srcStageMask and
-    pname:dstStageMask both include a
-    <<synchronization-framebuffer-regions,framebuffer-space stage>>, then
-    pname:dependencyFlags must: include ename:VK_DEPENDENCY_BY_REGION_BIT
-  * [[VUID-VkSubpassDependency2-viewOffset-02530]]
-    If pname:viewOffset is not equal to `0`, pname:srcSubpass must: not be
-    equal to pname:dstSubpass
-  * [[VUID-VkSubpassDependency2-dependencyFlags-03092]]
-    If pname:dependencyFlags does not include
-    ename:VK_DEPENDENCY_VIEW_LOCAL_BIT, pname:viewOffset must: be `0`
-ifdef::VK_NV_mesh_shader[]
-  * [[VUID-VkSubpassDependency2-srcStageMask-02103]]
-    If the <<features-meshShader,mesh shaders>> feature is not enabled,
-    pname:srcStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV
-  * [[VUID-VkSubpassDependency2-srcStageMask-02104]]
-    If the <<features-taskShader,task shaders>> feature is not enabled,
-    pname:srcStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV
-  * [[VUID-VkSubpassDependency2-dstStageMask-02105]]
-    If the <<features-meshShader,mesh shaders>> feature is not enabled,
-    pname:dstStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV
-  * [[VUID-VkSubpassDependency2-dstStageMask-02106]]
-    If the <<features-taskShader,task shaders>> feature is not enabled,
-    pname:dstStageMask must: not contain
-    ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV
-endif::VK_NV_mesh_shader[]
-ifdef::VK_KHR_synchronization2[]
-  * [[VUID-VkSubpassDependency2-synchronization2-04988]]
-    If the <<features-synchronization2, pname:synchronization2>> feature is
-    not enabled, pname:srcStageMask must: not be `0`
-  * [[VUID-VkSubpassDependency2-synchronization2-04989]]
-    If the <<features-synchronization2, pname:synchronization2>> feature is
-    not enabled, pname:dstStageMask must: not be `0`
-endif::VK_KHR_synchronization2[]
-ifndef::VK_KHR_synchronization2[]
-  * [[VUID-VkSubpassDependency2-srcStageMask-04990]]
-    pname:srcStageMask must: not be `0`
-  * [[VUID-VkSubpassDependency2-dstStageMask-04991]]
-    pname:dstStageMask must: not be `0`
-endif::VK_KHR_synchronization2[]
-****
-
-include::{generated}/validity/structs/VkSubpassDependency2.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-
-[open,refpage='vkDestroyRenderPass',desc='Destroy a render pass object',type='protos']
---
-To destroy a render pass, call:
-
-include::{generated}/api/protos/vkDestroyRenderPass.txt[]
-
-  * pname:device is the logical device that destroys the render pass.
-  * pname:renderPass is the handle of the render pass to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyRenderPass-renderPass-00873]]
-    All submitted commands that refer to pname:renderPass must: have
-    completed execution
-  * [[VUID-vkDestroyRenderPass-renderPass-00874]]
-    If sname:VkAllocationCallbacks were provided when pname:renderPass was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyRenderPass-renderPass-00875]]
-    If no sname:VkAllocationCallbacks were provided when pname:renderPass
-    was created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyRenderPass.txt[]
---
-
-
-[[renderpass-compatibility]]
-== Render Pass Compatibility
-
-Framebuffers and graphics pipelines are created based on a specific render
-pass object.
-They must: only be used with that render pass object, or one compatible with
-it.
-
-Two attachment references are compatible if they have matching format and
-sample count, or are both ename:VK_ATTACHMENT_UNUSED or the pointer that
-would contain the reference is `NULL`.
-
-Two arrays of attachment references are compatible if all corresponding
-pairs of attachments are compatible.
-If the arrays are of different lengths, attachment references not present in
-the smaller array are treated as ename:VK_ATTACHMENT_UNUSED.
-
-Two render passes are compatible if their corresponding color, input,
-resolve, and depth/stencil attachment references are compatible and if they
-are otherwise identical except for:
-
-  * Initial and final image layout in attachment descriptions
-  * Load and store operations in attachment descriptions
-  * Image layout in attachment references
-
-As an additional special case, if two render passes have a single subpass,
-the resolve attachment reference
-ifdef::VK_KHR_depth_stencil_resolve[]
-and depth/stencil resolve mode
-endif::VK_KHR_depth_stencil_resolve[]
-compatibility requirements are ignored.
-
-A framebuffer is compatible with a render pass if it was created using the
-same render pass or a compatible render pass.
-
-
-== Framebuffers
-
-[open,refpage='VkFramebuffer',desc='Opaque handle to a framebuffer object',type='handles']
---
-Render passes operate in conjunction with _framebuffers_.
-Framebuffers represent a collection of specific memory attachments that a
-render pass instance uses.
-
-Framebuffers are represented by sname:VkFramebuffer handles:
-
-include::{generated}/api/handles/VkFramebuffer.txt[]
---
-
-[open,refpage='vkCreateFramebuffer',desc='Create a new framebuffer object',type='protos']
---
-To create a framebuffer, call:
-
-include::{generated}/api/protos/vkCreateFramebuffer.txt[]
-
-  * pname:device is the logical device that creates the framebuffer.
-  * pname:pCreateInfo is a pointer to a slink:VkFramebufferCreateInfo
-    structure describing additional information about framebuffer creation.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pFramebuffer is a pointer to a slink:VkFramebuffer handle in which
-    the resulting framebuffer object is returned.
-
-.Valid Usage
-****
-  * [[VUID-vkCreateFramebuffer-pCreateInfo-02777]]
-    If pname:pCreateInfo->flags does not include
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, and pname:attachmentCount is
-    not `0`, each element of pname:pCreateInfo->pAttachments must: have been
-    created on pname:device
-****
-
-include::{generated}/validity/protos/vkCreateFramebuffer.txt[]
---
-
-[open,refpage='VkFramebufferCreateInfo',desc='Structure specifying parameters of a newly created framebuffer',type='structs']
---
-The sname:VkFramebufferCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkFramebufferCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkFramebufferCreateFlagBits
-  * pname:renderPass is a render pass defining what render passes the
-    framebuffer will be compatible with.
-    See <<renderpass-compatibility,Render Pass Compatibility>> for details.
-  * pname:attachmentCount is the number of attachments.
-  * pname:pAttachments is a pointer to an array of slink:VkImageView
-    handles, each of which will be used as the corresponding attachment in a
-    render pass instance.
-ifdef::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-    If pname:flags includes ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, this
-    parameter is ignored.
-endif::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-  * pname:width, pname:height and pname:layers define the dimensions of the
-    framebuffer.
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-    If the render pass uses multiview, then pname:layers must: be one and
-    each attachment requires a number of layers that is greater than the
-    maximum bit index set in the view mask in the subpasses in which it is
-    used.
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-Other than the exceptions listed below, applications must: ensure that all
-accesses to memory that backs image subresources used as attachments in a
-given render pass instance either happen-before the
-<<renderpass-load-store-ops, load operations>> for those attachments, or
-happen-after the <<renderpass-load-store-ops, store operations>> for those
-attachments.
-
-[[renderpass-attachment-nonattachment]]
-The exceptions to the general rule are:
-
-  * For depth/stencil attachments, an aspect can: be used separately as
-    attachment and non-attachment if both accesses are read-only.
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-  * For depth/stencil attachments, each aspect can: be used separately as
-    attachment and non-attachment as long as the non-attachment accesses are
-    also via an image subresource in either the
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL layout
-    or the ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL
-    layout, and the attachment resource uses whichever of those two layouts
-    the image accesses do not.
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-
-Use of non-attachment aspects in these cases is only well defined if the
-attachment is used in the subpass where the non-attachment access is being
-made, or the layout of the image subresource is constant throughout the
-entire render pass instance, including the pname:initialLayout and
-pname:finalLayout.
-
-[NOTE]
-.Note
-====
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-This restriction means
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-These restrictions mean
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-that the render pass has full knowledge of all uses of all of the
-attachments, so that the implementation is able to make correct decisions
-about when and how to perform layout transitions, when to overlap execution
-of subpasses, etc.
-====
-
-[[renderpass-noattachments]]
-It is legal for a subpass to use no color or depth/stencil attachments,
-either because it has no attachment references or because all of them are
-ename:VK_ATTACHMENT_UNUSED.
-This kind of subpass can: use shader side effects such as image stores and
-atomics to produce an output.
-In this case, the subpass continues to use the pname:width, pname:height,
-and pname:layers of the framebuffer to define the dimensions of the
-rendering area, and the pname:rasterizationSamples from each pipeline's
-slink:VkPipelineMultisampleStateCreateInfo to define the number of samples
-used in rasterization; however, if
-slink:VkPhysicalDeviceFeatures::pname:variableMultisampleRate is
-ename:VK_FALSE, then all pipelines to be bound with the subpass must: have
-the same value for
-slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples.
-
-.Valid Usage
-****
-  * [[VUID-VkFramebufferCreateInfo-attachmentCount-00876]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE, pname:attachmentCount
-    must: be equal to the attachment count specified in pname:renderPass
-  * [[VUID-VkFramebufferCreateInfo-flags-02778]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE, pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, and
-    pname:attachmentCount is not `0`, pname:pAttachments must: be a valid
-    pointer to an array of pname:attachmentCount valid slink:VkImageView
-    handles
-  * [[VUID-VkFramebufferCreateInfo-pAttachments-00877]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments that is used as a color attachment or resolve
-    attachment by pname:renderPass must: have been created with a
-    pname:usage value including ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
-  * [[VUID-VkFramebufferCreateInfo-pAttachments-02633]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments that is used as a depth/stencil attachment by
-    pname:renderPass must: have been created with a pname:usage value
-    including ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-  * [[VUID-VkFramebufferCreateInfo-pAttachments-02634]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments that is used as a depth/stencil resolve attachment by
-    pname:renderPass must: have been created with a pname:usage value
-    including ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-  * [[VUID-VkFramebufferCreateInfo-pAttachments-00879]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:renderpass is
-    not dlink:VK_NULL_HANDLE, pname:flags does not include
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments that is used as an input attachment by
-    pname:renderPass must: have been created with a pname:usage value
-    including ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-VkFramebufferCreateInfo-pAttachments-02552]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE, each element of
-    pname:pAttachments that is used as a fragment density map attachment by
-    pname:renderPass must: not have been created with a pname:flags value
-    including ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT
-  * [[VUID-VkFramebufferCreateInfo-renderPass-02553]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE, pname:renderPass has a
-    fragment density map attachment, and
-    <<features-fragmentDensityMapNonSubsampledImages,non-subsample image
-    feature>> is not enabled, each element of pname:pAttachments must: have
-    been created with a pname:flags value including
-    ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT unless that element is the
-    fragment density map attachment
-endif::VK_EXT_fragment_density_map[]
-  * [[VUID-VkFramebufferCreateInfo-pAttachments-00880]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments must: have been created with a elink:VkFormat value
-    that matches the elink:VkFormat specified by the corresponding
-    sname:VkAttachmentDescription in pname:renderPass
-  * [[VUID-VkFramebufferCreateInfo-pAttachments-00881]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments must: have been created with a pname:samples value
-    that matches the pname:samples value specified by the corresponding
-    sname:VkAttachmentDescription in pname:renderPass
-  * [[VUID-VkFramebufferCreateInfo-flags-04533]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments that is used as an input, color, resolve, or
-    depth/stencil attachment by pname:renderPass must: have been created
-    with a slink:VkImageCreateInfo::pname:width greater than or equal to
-    pname:width
-  * [[VUID-VkFramebufferCreateInfo-flags-04534]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments that is used as an input, color, resolve, or
-    depth/stencil attachment by pname:renderPass must: have been created
-    with a slink:VkImageCreateInfo::pname:height greater than or equal to
-    pname:height
-  * [[VUID-VkFramebufferCreateInfo-flags-04535]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments that is used as an input, color, resolve, or
-    depth/stencil attachment by pname:renderPass must: have been created
-    with a slink:VkImageViewCreateInfo::pname:subresourceRange.layerCount
-    greater than or equal to pname:layers
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkFramebufferCreateInfo-renderPass-04536]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:renderPass was
-    specified with non-zero view masks, each element of pname:pAttachments
-    that is used as an input, color, resolve, or depth/stencil attachment by
-    pname:renderPass must: have a pname:layerCount greater than the index of
-    the most significant bit set in any of those view masks
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifdef::VK_EXT_fragment_density_map[]
-ifndef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkFramebufferCreateInfo-pAttachments-02744]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE, an element of
-    pname:pAttachments that is referenced by
-    pname:fragmentDensityMapAttachment must: have a pname:layerCount equal
-    to `1`
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkFramebufferCreateInfo-renderPass-02746]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:renderPass was
-    specified with non-zero view masks, each element of pname:pAttachments
-    that is referenced by pname:fragmentDensityMapAttachment must: have a
-    pname:layerCount equal to `1` or greater than the index of the most
-    significant bit set in any of those view masks
-  * [[VUID-VkFramebufferCreateInfo-renderPass-02747]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:renderPass was
-    not specified with non-zero view masks, each element of
-    pname:pAttachments that is referenced by
-    pname:fragmentDensityMapAttachment must: have a pname:layerCount equal
-    to `1`
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkFramebufferCreateInfo-pAttachments-02555]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, an element of
-    pname:pAttachments that is referenced by
-    pname:fragmentDensityMapAttachment must: have a width at least as large
-    as
-    latexmath:[\left\lceil{\frac{width}{maxFragmentDensityTexelSize_{width}}}\right\rceil]
-  * [[VUID-VkFramebufferCreateInfo-pAttachments-02556]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, an element of
-    pname:pAttachments that is referenced by
-    pname:fragmentDensityMapAttachment must: have a height at least as large
-    as
-    latexmath:[\left\lceil{\frac{height}{maxFragmentDensityTexelSize_{height}}}\right\rceil]
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_KHR_fragment_shading_rate[]
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkFramebufferCreateInfo-flags-04537]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, and pname:renderPass
-    was specified with non-zero view masks, each element of
-    pname:pAttachments that is used as a
-    <<primsrast-fragment-shading-rate-attachment,fragment shading rate
-    attachment>> by pname:renderPass must: have a pname:layerCount that is
-    either `1`, or greater than the index of the most significant bit set in
-    any of those view masks
-  * [[VUID-VkFramebufferCreateInfo-flags-04538]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, and pname:renderPass
-    was not specified with non-zero view masks, each element of
-    pname:pAttachments that is used as a
-    <<primsrast-fragment-shading-rate-attachment,fragment shading rate
-    attachment>> by pname:renderPass must: have a pname:layerCount that is
-    either `1`, or greater than pname:layers
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkFramebufferCreateInfo-flags-04539]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, an element of
-    pname:pAttachments that is used as a
-    <<primsrast-fragment-shading-rate-attachment, fragment shading rate
-    attachment>> must: have a width at least as large as
-    [eq]#{lceil}pname:width / code:texelWidth{rceil}#, where code:texelWidth
-    is the largest value of pname:shadingRateAttachmentTexelSize.width in a
-    slink:VkFragmentShadingRateAttachmentInfoKHR which references that
-    attachment
-  * [[VUID-VkFramebufferCreateInfo-flags-04540]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, an element of
-    pname:pAttachments that is used as a
-    <<primsrast-fragment-shading-rate-attachment, fragment shading rate
-    attachment>> must: have a height at least as large as
-    [eq]#{lceil}pname:height / code:texelHeight{rceil}#, where
-    code:texelHeight is the largest value of
-    pname:shadingRateAttachmentTexelSize.height in a
-    slink:VkFragmentShadingRateAttachmentInfoKHR which references that
-    attachment
-endif::VK_KHR_fragment_shading_rate[]
-  * [[VUID-VkFramebufferCreateInfo-pAttachments-00883]]
-    If pname:flags does not include
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments must: only specify a single mip level
-  * [[VUID-VkFramebufferCreateInfo-pAttachments-00884]]
-    If pname:flags does not include
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments must: have been created with the identity swizzle
-  * [[VUID-VkFramebufferCreateInfo-width-00885]]
-    pname:width must: be greater than `0`
-  * [[VUID-VkFramebufferCreateInfo-width-00886]]
-    pname:width must: be less than or equal to
-    <<limits-maxFramebufferWidth,pname:maxFramebufferWidth>>
-  * [[VUID-VkFramebufferCreateInfo-height-00887]]
-    pname:height must: be greater than `0`
-  * [[VUID-VkFramebufferCreateInfo-height-00888]]
-    pname:height must: be less than or equal to
-    <<limits-maxFramebufferHeight,pname:maxFramebufferHeight>>
-  * [[VUID-VkFramebufferCreateInfo-layers-00889]]
-    pname:layers must: be greater than `0`
-  * [[VUID-VkFramebufferCreateInfo-layers-00890]]
-    pname:layers must: be less than or equal to
-    <<limits-maxFramebufferLayers,pname:maxFramebufferLayers>>
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkFramebufferCreateInfo-renderPass-02531]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:renderPass was
-    specified with non-zero view masks, pname:layers must: be `1`
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-VkFramebufferCreateInfo-pAttachments-00891]]
-    If pname:flags does not include
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments that is a 2D or 2D array image view taken from a 3D
-    image must: not be a depth/stencil format
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifdef::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-  * [[VUID-VkFramebufferCreateInfo-flags-03189]]
-    If the <<features-imagelessFramebuffer, imageless framebuffer>> feature
-    is not enabled, pname:flags must: not include
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT
-  * [[VUID-VkFramebufferCreateInfo-flags-03190]]
-    If pname:flags includes ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the
-    pname:pNext chain must: include a
-    slink:VkFramebufferAttachmentsCreateInfo structure
-  * [[VUID-VkFramebufferCreateInfo-flags-03191]]
-    If pname:flags includes ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the
-    pname:attachmentImageInfoCount member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure in the pname:pNext
-    chain must: be equal to either zero or pname:attachmentCount
-  * [[VUID-VkFramebufferCreateInfo-flags-04541]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:width member of any
-    element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure in the pname:pNext
-    chain that is used as an input, color, resolve or depth/stencil
-    attachment in pname:renderPass must: be greater than or equal to
-    pname:width
-  * [[VUID-VkFramebufferCreateInfo-flags-04542]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:height member of
-    any element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure in the pname:pNext
-    chain that is used as an input, color, resolve or depth/stencil
-    attachment in pname:renderPass must: be greater than or equal to
-    pname:height
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-VkFramebufferCreateInfo-flags-03196]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:width member of any
-    element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure in the pname:pNext
-    chain that is referenced by
-    slink:VkRenderPassFragmentDensityMapCreateInfoEXT::pname:fragmentDensityMapAttachment
-    in pname:renderPass must: be greater than or equal to
-    latexmath:[\left\lceil{\frac{width}{maxFragmentDensityTexelSize_{width}}}\right\rceil]
-  * [[VUID-VkFramebufferCreateInfo-flags-03197]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:height member of
-    any element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure included in the
-    pname:pNext chain that is referenced by
-    slink:VkRenderPassFragmentDensityMapCreateInfoEXT::pname:fragmentDensityMapAttachment
-    in pname:renderPass must: be greater than or equal to
-    latexmath:[\left\lceil{\frac{height}{maxFragmentDensityTexelSize_{height}}}\right\rceil]
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_KHR_fragment_shading_rate[]
-  * [[VUID-VkFramebufferCreateInfo-flags-04543]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:width member of any
-    element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure in the pname:pNext
-    chain that is used as a <<primsrast-fragment-shading-rate-attachment,
-    fragment shading rate attachment>> must: be greater than or equal to
-    [eq]#{lceil}pname:width / code:texelWidth{rceil}#, where code:texelWidth
-    is the largest value of pname:shadingRateAttachmentTexelSize.width in a
-    slink:VkFragmentShadingRateAttachmentInfoKHR which references that
-    attachment
-  * [[VUID-VkFramebufferCreateInfo-flags-04544]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:height member of
-    any element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure in the pname:pNext
-    chain that is used as a <<primsrast-fragment-shading-rate-attachment,
-    fragment shading rate attachment>> must: be greater than or equal to
-    [eq]#{lceil}pname:height / code:texelHeight{rceil}#, where
-    code:texelHeight is the largest value of
-    pname:shadingRateAttachmentTexelSize.height in a
-    slink:VkFragmentShadingRateAttachmentInfoKHR which references that
-    attachment
-  * [[VUID-VkFramebufferCreateInfo-flags-04545]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:layerCount member
-    of any element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure in the pname:pNext
-    chain that is used as a <<primsrast-fragment-shading-rate-attachment,
-    fragment shading rate attachment>> must: be either `1`, or greater than
-    or equal to pname:layers
-  * [[VUID-VkFramebufferCreateInfo-flags-04587]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE, pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, and pname:renderPass was
-    specified with non-zero view masks, each element of pname:pAttachments
-    that is used as a <<primsrast-fragment-shading-rate-attachment,fragment
-    shading rate attachment>> by pname:renderPass must: have a
-    pname:layerCount that is either `1`, or greater than the index of the
-    most significant bit set in any of those view masks
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-VkFramebufferCreateInfo-renderPass-03198]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE, multiview is enabled
-    for pname:renderPass, and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:layerCount member
-    of any element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure included in the
-    pname:pNext chain used as an input, color, resolve, or depth/stencil
-    attachment in pname:renderPass must: be greater than the maximum bit
-    index set in the view mask in the subpasses in which it is used in
-    pname:renderPass
-  * [[VUID-VkFramebufferCreateInfo-renderPass-04546]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE, multiview is not
-    enabled for pname:renderPass, and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:layerCount member
-    of any element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure included in the
-    pname:pNext chain used as an input, color, resolve, or depth/stencil
-    attachment in pname:renderPass must: be greater than or equal to
-    pname:layers
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifndef::VK_VERSION_1_1+VK_KHR_multiview[]
-  * [[VUID-VkFramebufferCreateInfo-flags-04547]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:layerCount member
-    of any element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure included in the
-    pname:pNext chain used as an input, color, resolve, or depth/stencil
-    attachment in pname:pRenderPass must: be greater than or equal to
-    pname:layers
-endif::VK_VERSION_1_1+VK_KHR_multiview[]
-  * [[VUID-VkFramebufferCreateInfo-flags-03201]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:usage member of any
-    element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure included in the
-    pname:pNext chain that refers to an attachment used as a color
-    attachment or resolve attachment by pname:renderPass must: include
-    ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
-  * [[VUID-VkFramebufferCreateInfo-flags-03202]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:usage member of any
-    element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure included in the
-    pname:pNext chain that refers to an attachment used as a depth/stencil
-    attachment by pname:renderPass must: include
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-ifdef::VK_KHR_depth_stencil_resolve[]
-  * [[VUID-VkFramebufferCreateInfo-flags-03203]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:usage member of any
-    element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure included in the
-    pname:pNext chain that refers to an attachment used as a depth/stencil
-    resolve attachment by pname:renderPass must: include
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-endif::VK_KHR_depth_stencil_resolve[]
-  * [[VUID-VkFramebufferCreateInfo-flags-03204]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:usage member of any
-    element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure included in the
-    pname:pNext chain that refers to an attachment used as an input
-    attachment by pname:renderPass must: include
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
-  * [[VUID-VkFramebufferCreateInfo-flags-03205]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, at least one element of the
-    pname:pViewFormats member of any element of the
-    pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure included in the
-    pname:pNext chain must: be equal to the corresponding value of
-    slink:VkAttachmentDescription::pname:format used to create
-    pname:renderPass
-endif::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-  * [[VUID-VkFramebufferCreateInfo-flags-04113]]
-    If pname:flags does not include
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments must: have been created with
-    slink:VkImageViewCreateInfo::pname:viewType not equal to
-    ename:VK_IMAGE_VIEW_TYPE_3D
-ifdef::VK_KHR_fragment_shading_rate[]
-  * [[VUID-VkFramebufferCreateInfo-flags-04548]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags does not
-    include ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of
-    pname:pAttachments that is used as a fragment shading rate attachment by
-    pname:renderPass must: have been created with a pname:usage value
-    including ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-ifdef::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-  * [[VUID-VkFramebufferCreateInfo-flags-04549]]
-    If pname:renderpass is not dlink:VK_NULL_HANDLE and pname:flags includes
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:usage member of any
-    element of the pname:pAttachmentImageInfos member of a
-    slink:VkFramebufferAttachmentsCreateInfo structure included in the
-    pname:pNext chain that refers to an attachment used as a fragment
-    shading rate attachment by pname:renderPass must: include
-    ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-endif::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-endif::VK_KHR_fragment_shading_rate[]
-****
-
-include::{generated}/validity/structs/VkFramebufferCreateInfo.txt[]
---
-
-ifdef::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-[open,refpage='VkFramebufferAttachmentsCreateInfo',desc='Structure specifying parameters of images that will be used with a framebuffer',type='structs',alias='VkFramebufferAttachmentsCreateInfo']
---
-The sname:VkFramebufferAttachmentsCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkFramebufferAttachmentsCreateInfo.txt[]
-
-ifdef::VK_KHR_imageless_framebuffer[]
-or the equivalent
-
-include::{generated}/api/structs/VkFramebufferAttachmentsCreateInfoKHR.txt[]
-endif::VK_KHR_imageless_framebuffer[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:attachmentImageInfoCount is the number of attachments being
-    described.
-  * pname:pAttachmentImageInfos is a pointer to an array of
-    slink:VkFramebufferAttachmentImageInfo structures, each of which
-    describes a number of parameters of the corresponding attachment in a
-    render pass instance.
-
-include::{generated}/validity/structs/VkFramebufferAttachmentsCreateInfo.txt[]
---
-
-[open,refpage='VkFramebufferAttachmentImageInfo',desc='Structure specifying parameters of an image that will be used with a framebuffer',type='structs',alias='VkFramebufferAttachmentImageInfoKHR']
---
-The sname:VkFramebufferAttachmentImageInfo structure is defined as:
-
-include::{generated}/api/structs/VkFramebufferAttachmentImageInfo.txt[]
-
-ifdef::VK_KHR_imageless_framebuffer[]
-or the equivalent
-
-include::{generated}/api/structs/VkFramebufferAttachmentImageInfoKHR.txt[]
-endif::VK_KHR_imageless_framebuffer[]
-
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkImageCreateFlagBits, matching the
-    value of slink:VkImageCreateInfo::pname:flags used to create an image
-    that will be used with this framebuffer.
-  * pname:usage is a bitmask of elink:VkImageUsageFlagBits, matching the
-    value of slink:VkImageCreateInfo::pname:usage used to create an image
-    used with this framebuffer.
-  * pname:width is the width of the image view used for rendering.
-  * pname:height is the height of the image view used for rendering.
-  * pname:layerCount is the number of array layers of the image view used
-    for rendering.
-  * pname:viewFormatCount is the number of entries in the pname:pViewFormats
-    array, matching the value of
-    slink:VkImageFormatListCreateInfo::pname:viewFormatCount used to create
-    an image used with this framebuffer.
-  * pname:pViewFormats is a pointer to an array of elink:VkFormat values
-    specifying all of the formats which can: be used when creating views of
-    the image, matching the value of
-    slink:VkImageFormatListCreateInfo::pname:pViewFormats used to create an
-    image used with this framebuffer.
-
-Images that can: be used with the framebuffer when beginning a render pass,
-as specified by slink:VkRenderPassAttachmentBeginInfo, must: be created with
-parameters that are identical to those specified here.
-
-
-include::{generated}/validity/structs/VkFramebufferAttachmentImageInfo.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-
-
-[open,refpage='VkFramebufferCreateFlagBits',desc='Bitmask specifying framebuffer properties',type='enums']
---
-Bits which can: be set in slink:VkFramebufferCreateInfo::pname:flags to
-specify options for framebuffers are:
-
-include::{generated}/api/enums/VkFramebufferCreateFlagBits.txt[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-  * ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT specifies that image views are
-    not specified, and only attachment compatibility information will be
-    provided via a slink:VkFramebufferAttachmentImageInfo structure.
-endif::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-
-ifndef::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-[NOTE]
-.Note
-====
-All bits for this type are defined by extensions, and none of those
-extensions are enabled in this build of the specification.
-====
-endif::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
---
-
-[open,refpage='VkFramebufferCreateFlags',desc='Bitmask of VkFramebufferCreateFlagBits',type='flags']
---
-include::{generated}/api/flags/VkFramebufferCreateFlags.txt[]
-
-tname:VkFramebufferCreateFlags is a bitmask type for setting a mask of zero
-or more elink:VkFramebufferCreateFlagBits.
---
-
-[open,refpage='vkDestroyFramebuffer',desc='Destroy a framebuffer object',type='protos']
---
-To destroy a framebuffer, call:
-
-include::{generated}/api/protos/vkDestroyFramebuffer.txt[]
-
-  * pname:device is the logical device that destroys the framebuffer.
-  * pname:framebuffer is the handle of the framebuffer to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyFramebuffer-framebuffer-00892]]
-    All submitted commands that refer to pname:framebuffer must: have
-    completed execution
-  * [[VUID-vkDestroyFramebuffer-framebuffer-00893]]
-    If sname:VkAllocationCallbacks were provided when pname:framebuffer was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyFramebuffer-framebuffer-00894]]
-    If no sname:VkAllocationCallbacks were provided when pname:framebuffer
-    was created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyFramebuffer.txt[]
---
-
-
-[[renderpass-commands]]
-== Render Pass Commands
-
-An application records the commands for a render pass instance one subpass
-at a time, by beginning a render pass instance, iterating over the subpasses
-to record commands for that subpass, and then ending the render pass
-instance.
-
-[open,refpage='vkCmdBeginRenderPass',desc='Begin a new render pass',type='protos']
---
-To begin a render pass instance, call:
-
-include::{generated}/api/protos/vkCmdBeginRenderPass.txt[]
-
-  * pname:commandBuffer is the command buffer in which to record the
-    command.
-  * pname:pRenderPassBegin is a pointer to a slink:VkRenderPassBeginInfo
-    structure specifying the render pass to begin an instance of, and the
-    framebuffer the instance uses.
-  * pname:contents is a elink:VkSubpassContents value specifying how the
-    commands in the first subpass will be provided.
-
-After beginning a render pass instance, the command buffer is ready to
-record the commands for the first subpass of that render pass.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBeginRenderPass-initialLayout-00895]]
-    If any of the pname:initialLayout or pname:finalLayout member of the
-    sname:VkAttachmentDescription structures or the pname:layout member of
-    the sname:VkAttachmentReference structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-    then the corresponding attachment image view of the framebuffer
-    specified in the pname:framebuffer member of pname:pRenderPassBegin
-    must: have been created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
-// The VU below comes in an alternate version when the extension is
-// enabled.
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-  * [[VUID-vkCmdBeginRenderPass-initialLayout-00896]]
-    If any of the pname:initialLayout or pname:finalLayout member of the
-    sname:VkAttachmentDescription structures or the pname:layout member of
-    the sname:VkAttachmentReference structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then the
-    corresponding attachment image view of the framebuffer specified in the
-    pname:framebuffer member of pname:pRenderPassBegin must: have been
-    created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-// The nested ifdefs are there in anticipation of the hoped-for day when the
-// VU extractor and validation layers can handle VU with imbedded
-// conditionals. They are commented out until then.
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-  * [[VUID-vkCmdBeginRenderPass-initialLayout-01758]]
-    If any of the pname:initialLayout or pname:finalLayout member of the
-    sname:VkAttachmentDescription structures or the pname:layout member of
-    the sname:VkAttachmentReference structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is
-// ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
-// endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then the
-    corresponding attachment image view of the framebuffer specified in the
-    pname:framebuffer member of pname:pRenderPassBegin must: have been
-    created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * [[VUID-vkCmdBeginRenderPass-initialLayout-02842]]
-    If any of the pname:initialLayout or pname:finalLayout member of the
-    sname:VkAttachmentDescription structures or the pname:layout member of
-    the sname:VkAttachmentReference structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL then the corresponding
-    attachment image view of the framebuffer specified in the
-    pname:framebuffer member of pname:pRenderPassBegin must: have been
-    created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-vkCmdBeginRenderPass-stencilInitialLayout-02843]]
-    If any of the pname:stencilInitialLayout or pname:stencilFinalLayout
-    member of the sname:VkAttachmentDescriptionStencilLayout structures or
-    the pname:stencilLayout member of the
-    sname:VkAttachmentReferenceStencilLayout structures specified when
-    creating the render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL then the corresponding
-    attachment image view of the framebuffer specified in the
-    pname:framebuffer member of pname:pRenderPassBegin must: have been
-    created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-  * [[VUID-vkCmdBeginRenderPass-initialLayout-00897]]
-    If any of the pname:initialLayout or pname:finalLayout member of the
-    sname:VkAttachmentDescription structures or the pname:layout member of
-    the sname:VkAttachmentReference structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
-    then the corresponding attachment image view of the framebuffer
-    specified in the pname:framebuffer member of pname:pRenderPassBegin
-    must: have been created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_SAMPLED_BIT or
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
-  * [[VUID-vkCmdBeginRenderPass-initialLayout-00898]]
-    If any of the pname:initialLayout or pname:finalLayout member of the
-    sname:VkAttachmentDescription structures or the pname:layout member of
-    the sname:VkAttachmentReference structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
-    then the corresponding attachment image view of the framebuffer
-    specified in the pname:framebuffer member of pname:pRenderPassBegin
-    must: have been created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT
-  * [[VUID-vkCmdBeginRenderPass-initialLayout-00899]]
-    If any of the pname:initialLayout or pname:finalLayout member of the
-    sname:VkAttachmentDescription structures or the pname:layout member of
-    the sname:VkAttachmentReference structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
-    then the corresponding attachment image view of the framebuffer
-    specified in the pname:framebuffer member of pname:pRenderPassBegin
-    must: have been created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT
-  * [[VUID-vkCmdBeginRenderPass-initialLayout-00900]]
-    If the pname:initialLayout member of any of the
-    sname:VkAttachmentDescription structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is not ename:VK_IMAGE_LAYOUT_UNDEFINED, then each
-    such pname:initialLayout must: be equal to the current layout of the
-    corresponding attachment image subresource of the framebuffer specified
-    in the pname:framebuffer member of pname:pRenderPassBegin
-  * [[VUID-vkCmdBeginRenderPass-srcStageMask-00901]]
-    The pname:srcStageMask and pname:dstStageMask members of any element of
-    the pname:pDependencies member of slink:VkRenderPassCreateInfo used to
-    create pname:renderPass must: be supported by the capabilities of the
-    queue family identified by the pname:queueFamilyIndex member of the
-    slink:VkCommandPoolCreateInfo used to create the command pool which
-    pname:commandBuffer was allocated from
-  * [[VUID-vkCmdBeginRenderPass-framebuffer-02532]]
-    For any attachment in pname:framebuffer that is used by pname:renderPass
-    and is bound to memory locations that are also bound to another
-    attachment used by pname:renderPass, and if at least one of those uses
-    causes either attachment to be written to, both attachments must: have
-    had the ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT set
-****
-
-include::{generated}/validity/protos/vkCmdBeginRenderPass.txt[]
---
-
-ifdef::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-[open,refpage='vkCmdBeginRenderPass2',desc='Begin a new render pass',type='protos',alias='vkCmdBeginRenderPass2KHR']
---
-Alternatively to begin a render pass, call:
-
-ifdef::VK_VERSION_1_2[]
-include::{generated}/api/protos/vkCmdBeginRenderPass2.txt[]
-endif::VK_VERSION_1_2[]
-
-ifdef::VK_VERSION_1_2+VK_KHR_create_renderpass2[or the equivalent command]
-
-ifdef::VK_KHR_create_renderpass2[]
-include::{generated}/api/protos/vkCmdBeginRenderPass2KHR.txt[]
-endif::VK_KHR_create_renderpass2[]
-
-  * pname:commandBuffer is the command buffer in which to record the
-    command.
-  * pname:pRenderPassBegin is a pointer to a slink:VkRenderPassBeginInfo
-    structure specifying the render pass to begin an instance of, and the
-    framebuffer the instance uses.
-  * pname:pSubpassBeginInfo is a pointer to a slink:VkSubpassBeginInfo
-    structure containing information about the subpass which is about to
-    begin rendering.
-
-After beginning a render pass instance, the command buffer is ready to
-record the commands for the first subpass of that render pass.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBeginRenderPass2-framebuffer-02779]]
-    Both the pname:framebuffer and pname:renderPass members of
-    pname:pRenderPassBegin must: have been created on the same
-    slink:VkDevice that pname:commandBuffer was allocated on
-  * [[VUID-vkCmdBeginRenderPass2-initialLayout-03094]]
-    If any of the pname:initialLayout or pname:finalLayout member of the
-    sname:VkAttachmentDescription structures or the pname:layout member of
-    the sname:VkAttachmentReference structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-    then the corresponding attachment image view of the framebuffer
-    specified in the pname:framebuffer member of pname:pRenderPassBegin
-    must: have been created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
-  * [[VUID-vkCmdBeginRenderPass2-initialLayout-03096]]
-    If any of the pname:initialLayout or pname:finalLayout member of the
-    sname:VkAttachmentDescription structures or the pname:layout member of
-    the sname:VkAttachmentReference structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then the
-    corresponding attachment image view of the framebuffer specified in the
-    pname:framebuffer member of pname:pRenderPassBegin must: have been
-    created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * [[VUID-vkCmdBeginRenderPass2-initialLayout-02844]]
-    If any of the pname:initialLayout or pname:finalLayout member of the
-    sname:VkAttachmentDescription structures or the pname:layout member of
-    the sname:VkAttachmentReference structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL then the corresponding
-    attachment image view of the framebuffer specified in the
-    pname:framebuffer member of pname:pRenderPassBegin must: have been
-    created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-vkCmdBeginRenderPass2-stencilInitialLayout-02845]]
-    If any of the pname:stencilInitialLayout or pname:stencilFinalLayout
-    member of the sname:VkAttachmentDescriptionStencilLayout structures or
-    the pname:stencilLayout member of the
-    sname:VkAttachmentReferenceStencilLayout structures specified when
-    creating the render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL then the corresponding
-    attachment image view of the framebuffer specified in the
-    pname:framebuffer member of pname:pRenderPassBegin must: have been
-    created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * [[VUID-vkCmdBeginRenderPass2-initialLayout-03097]]
-    If any of the pname:initialLayout or pname:finalLayout member of the
-    sname:VkAttachmentDescription structures or the pname:layout member of
-    the sname:VkAttachmentReference structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
-    then the corresponding attachment image view of the framebuffer
-    specified in the pname:framebuffer member of pname:pRenderPassBegin
-    must: have been created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_SAMPLED_BIT or
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
-  * [[VUID-vkCmdBeginRenderPass2-initialLayout-03098]]
-    If any of the pname:initialLayout or pname:finalLayout member of the
-    sname:VkAttachmentDescription structures or the pname:layout member of
-    the sname:VkAttachmentReference structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
-    then the corresponding attachment image view of the framebuffer
-    specified in the pname:framebuffer member of pname:pRenderPassBegin
-    must: have been created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT
-  * [[VUID-vkCmdBeginRenderPass2-initialLayout-03099]]
-    If any of the pname:initialLayout or pname:finalLayout member of the
-    sname:VkAttachmentDescription structures or the pname:layout member of
-    the sname:VkAttachmentReference structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
-    then the corresponding attachment image view of the framebuffer
-    specified in the pname:framebuffer member of pname:pRenderPassBegin
-    must: have been created with a pname:usage value including
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT
-  * [[VUID-vkCmdBeginRenderPass2-initialLayout-03100]]
-    If the pname:initialLayout member of any of the
-    sname:VkAttachmentDescription structures specified when creating the
-    render pass specified in the pname:renderPass member of
-    pname:pRenderPassBegin is not ename:VK_IMAGE_LAYOUT_UNDEFINED, then each
-    such pname:initialLayout must: be equal to the current layout of the
-    corresponding attachment image subresource of the framebuffer specified
-    in the pname:framebuffer member of pname:pRenderPassBegin
-  * [[VUID-vkCmdBeginRenderPass2-srcStageMask-03101]]
-    The pname:srcStageMask and pname:dstStageMask members of any element of
-    the pname:pDependencies member of slink:VkRenderPassCreateInfo used to
-    create pname:renderPass must: be supported by the capabilities of the
-    queue family identified by the pname:queueFamilyIndex member of the
-    slink:VkCommandPoolCreateInfo used to create the command pool which
-    pname:commandBuffer was allocated from
-  * [[VUID-vkCmdBeginRenderPass2-framebuffer-02533]]
-    For any attachment in pname:framebuffer that is used by pname:renderPass
-    and is bound to memory locations that are also bound to another
-    attachment used by pname:renderPass, and if at least one of those uses
-    causes either attachment to be written to, both attachments must: have
-    had the ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT set
-****
-
-include::{generated}/validity/protos/vkCmdBeginRenderPass2.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-
-[open,refpage='VkRenderPassBeginInfo',desc='Structure specifying render pass begin information',type='structs']
---
-The sname:VkRenderPassBeginInfo structure is defined as:
-
-include::{generated}/api/structs/VkRenderPassBeginInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:renderPass is the render pass to begin an instance of.
-  * pname:framebuffer is the framebuffer containing the attachments that are
-    used with the render pass.
-  * pname:renderArea is the render area that is affected by the render pass
-    instance, and is described in more detail below.
-  * pname:clearValueCount is the number of elements in pname:pClearValues.
-  * pname:pClearValues is a pointer to an array of pname:clearValueCount
-    slink:VkClearValue structures that contains clear values for each
-    attachment, if the attachment uses a pname:loadOp value of
-    ename:VK_ATTACHMENT_LOAD_OP_CLEAR or if the attachment has a
-    depth/stencil format and uses a pname:stencilLoadOp value of
-    ename:VK_ATTACHMENT_LOAD_OP_CLEAR.
-    The array is indexed by attachment number.
-    Only elements corresponding to cleared attachments are used.
-    Other elements of pname:pClearValues are ignored.
-
-pname:renderArea is the render area that is affected by the render pass
-instance.
-The effects of attachment load, store and multisample resolve operations are
-restricted to the pixels whose x and y coordinates fall within the render
-area on all attachments.
-The render area extends to all layers of pname:framebuffer.
-The application must: ensure (using scissor if necessary) that all rendering
-is contained within the render area.
-ifndef::VK_QCOM_render_pass_transform[]
-The render area must: be contained within the framebuffer dimensions.
-endif::VK_QCOM_render_pass_transform[]
-ifdef::VK_QCOM_render_pass_transform[]
-The render area, after any transform specified by
-slink:VkRenderPassTransformBeginInfoQCOM::pname:transform is applied, must:
-be contained within the framebuffer dimensions.
-endif::VK_QCOM_render_pass_transform[]
-
-ifdef::VK_QCOM_render_pass_transform[]
-If <<vertexpostproc-renderpass-transform, render pass transform>> is
-enabled, then pname:renderArea must: equal the framebuffer pre-transformed
-dimensions.
-After pname:renderArea has been transformed by
-slink:VkRenderPassTransformBeginInfoQCOM::pname:transform, the resulting
-render area must: be equal to the framebuffer dimensions.
-endif::VK_QCOM_render_pass_transform[]
-
-ifdef::VK_HUAWEI_subpass_shading[]
-If <<features-subpassShading, subpass shading>> is enabled, then
-pname:renderArea must: equal the framebuffer dimensions.
-endif::VK_HUAWEI_subpass_shading[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-
-When multiview is enabled, the resolve operation at the end of a subpass
-applies to all views in the view mask.
-
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-[NOTE]
-.Note
-====
-There may: be a performance cost for using a render area smaller than the
-framebuffer, unless it matches the render area granularity for the render
-pass.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkRenderPassBeginInfo-clearValueCount-00902]]
-    pname:clearValueCount must: be greater than the largest attachment index
-    in pname:renderPass that specifies a pname:loadOp (or
-    pname:stencilLoadOp, if the attachment has a depth/stencil format) of
-    ename:VK_ATTACHMENT_LOAD_OP_CLEAR
-  * [[VUID-VkRenderPassBeginInfo-clearValueCount-04962]]
-    If pname:clearValueCount is not `0`, pname:pClearValues must: be a valid
-    pointer to an array of pname:clearValueCount slink:VkClearValue unions
-  * [[VUID-VkRenderPassBeginInfo-renderPass-00904]]
-    pname:renderPass must: be <<renderpass-compatibility,compatible>> with
-    the pname:renderPass member of the slink:VkFramebufferCreateInfo
-    structure specified when creating pname:framebuffer
-ifndef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkRenderPassBeginInfo-renderArea-02846]]
-    pname:renderArea.offset.x must: be greater than or equal to 0
-  * [[VUID-VkRenderPassBeginInfo-renderArea-02847]]
-    pname:renderArea.offset.y must: be greater than or equal to 0
-  * [[VUID-VkRenderPassBeginInfo-renderArea-02848]]
-    [eq]#pname:renderArea.offset.x {plus} pname:renderArea.extent.width#
-    must: be less than or equal to
-    slink:VkFramebufferCreateInfo::pname:width the pname:framebuffer was
-    created with
-  * [[VUID-VkRenderPassBeginInfo-renderArea-02849]]
-    [eq]#pname:renderArea.offset.y {plus} pname:renderArea.extent.height#
-    must: be less than or equal to
-    slink:VkFramebufferCreateInfo::pname:height the pname:framebuffer was
-    created with
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkRenderPassBeginInfo-pNext-02850]]
-    If the pname:pNext chain does not contain
-    slink:VkDeviceGroupRenderPassBeginInfo or its
-    pname:deviceRenderAreaCount member is equal to 0,
-    pname:renderArea.offset.x must: be greater than or equal to 0
-  * [[VUID-VkRenderPassBeginInfo-pNext-02851]]
-    If the pname:pNext chain does not contain
-    slink:VkDeviceGroupRenderPassBeginInfo or its
-    pname:deviceRenderAreaCount member is equal to 0,
-    pname:renderArea.offset.y must: be greater than or equal to 0
-  * [[VUID-VkRenderPassBeginInfo-pNext-02852]]
-    If the pname:pNext chain does not contain
-    slink:VkDeviceGroupRenderPassBeginInfo or its
-    pname:deviceRenderAreaCount member is equal to 0,
-    [eq]#pname:renderArea.offset.x {plus} pname:renderArea.extent.width#
-    must: be less than or equal to
-    slink:VkFramebufferCreateInfo::pname:width the pname:framebuffer was
-    created with
-  * [[VUID-VkRenderPassBeginInfo-pNext-02853]]
-    If the pname:pNext chain does not contain
-    slink:VkDeviceGroupRenderPassBeginInfo or its
-    pname:deviceRenderAreaCount member is equal to 0,
-    [eq]#pname:renderArea.offset.y {plus} pname:renderArea.extent.height#
-    must: be less than or equal to
-    slink:VkFramebufferCreateInfo::pname:height the pname:framebuffer was
-    created with
-  * [[VUID-VkRenderPassBeginInfo-pNext-02854]]
-    If the pname:pNext chain contains
-    slink:VkDeviceGroupRenderPassBeginInfo, the pname:offset.x member of
-    each element of pname:pDeviceRenderAreas must: be greater than or equal
-    to 0
-  * [[VUID-VkRenderPassBeginInfo-pNext-02855]]
-    If the pname:pNext chain contains
-    slink:VkDeviceGroupRenderPassBeginInfo, the pname:offset.y member of
-    each element of pname:pDeviceRenderAreas must: be greater than or equal
-    to 0
-  * [[VUID-VkRenderPassBeginInfo-pNext-02856]]
-    If the pname:pNext chain contains
-    slink:VkDeviceGroupRenderPassBeginInfo, [eq]#pname:offset.x {plus}
-    pname:extent.width# of each element of pname:pDeviceRenderAreas must: be
-    less than or equal to slink:VkFramebufferCreateInfo::pname:width the
-    pname:framebuffer was created with
-  * [[VUID-VkRenderPassBeginInfo-pNext-02857]]
-    If the pname:pNext chain contains
-    slink:VkDeviceGroupRenderPassBeginInfo, [eq]#pname:offset.y {plus}
-    pname:extent.height# of each element of pname:pDeviceRenderAreas must:
-    be less than or equal to slink:VkFramebufferCreateInfo::pname:height the
-    pname:framebuffer was created with
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-  * [[VUID-VkRenderPassBeginInfo-framebuffer-03207]]
-    If pname:framebuffer was created with a
-    slink:VkFramebufferCreateInfo::pname:flags value that did not include
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, and the pname:pNext chain
-    includes a slink:VkRenderPassAttachmentBeginInfo structure, its
-    pname:attachmentCount must: be zero
-  * [[VUID-VkRenderPassBeginInfo-framebuffer-03208]]
-    If pname:framebuffer was created with a
-    slink:VkFramebufferCreateInfo::pname:flags value that included
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pname:attachmentCount of
-    a slink:VkRenderPassAttachmentBeginInfo structure included in the
-    pname:pNext chain must: be equal to the value of
-    slink:VkFramebufferAttachmentsCreateInfo::pname:attachmentImageInfoCount
-    used to create pname:framebuffer
-  * [[VUID-VkRenderPassBeginInfo-framebuffer-02780]]
-    If pname:framebuffer was created with a
-    slink:VkFramebufferCreateInfo::pname:flags value that included
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the
-    pname:pAttachments member of a slink:VkRenderPassAttachmentBeginInfo
-    structure included in the pname:pNext chain must: have been created on
-    the same slink:VkDevice as pname:framebuffer and pname:renderPass
-  * [[VUID-VkRenderPassBeginInfo-framebuffer-03209]]
-    If pname:framebuffer was created with a
-    slink:VkFramebufferCreateInfo::pname:flags value that included
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the
-    pname:pAttachments member of a slink:VkRenderPassAttachmentBeginInfo
-    structure included in the pname:pNext chain must: be a slink:VkImageView
-    of an image created with a value of slink:VkImageCreateInfo::pname:flags
-    equal to the pname:flags member of the corresponding element of
-    slink:VkFramebufferAttachmentsCreateInfo::pname:pAttachmentImageInfos
-    used to create pname:framebuffer
-  * [[VUID-VkRenderPassBeginInfo-framebuffer-04627]]
-    If pname:framebuffer was created with a
-    slink:VkFramebufferCreateInfo::pname:flags value that included
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the
-    pname:pAttachments member of a slink:VkRenderPassAttachmentBeginInfo
-    structure included in the pname:pNext chain must: be a slink:VkImageView
-    with <<resources-image-inherited-usage, an inherited usage>> equal to
-    the pname:usage member of the corresponding element of
-    slink:VkFramebufferAttachmentsCreateInfo::pname:pAttachmentImageInfos
-    used to create pname:framebuffer
-  * [[VUID-VkRenderPassBeginInfo-framebuffer-03211]]
-    If pname:framebuffer was created with a
-    slink:VkFramebufferCreateInfo::pname:flags value that included
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the
-    pname:pAttachments member of a slink:VkRenderPassAttachmentBeginInfo
-    structure included in the pname:pNext chain must: be a slink:VkImageView
-    with a width equal to the pname:width member of the corresponding
-    element of
-    slink:VkFramebufferAttachmentsCreateInfo::pname:pAttachmentImageInfos
-    used to create pname:framebuffer
-  * [[VUID-VkRenderPassBeginInfo-framebuffer-03212]]
-    If pname:framebuffer was created with a
-    slink:VkFramebufferCreateInfo::pname:flags value that included
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the
-    pname:pAttachments member of a slink:VkRenderPassAttachmentBeginInfo
-    structure included in the pname:pNext chain must: be a slink:VkImageView
-    with a height equal to the pname:height member of the corresponding
-    element of
-    slink:VkFramebufferAttachmentsCreateInfo::pname:pAttachmentImageInfos
-    used to create pname:framebuffer
-  * [[VUID-VkRenderPassBeginInfo-framebuffer-03213]]
-    If pname:framebuffer was created with a
-    slink:VkFramebufferCreateInfo::pname:flags value that included
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the
-    pname:pAttachments member of a slink:VkRenderPassAttachmentBeginInfo
-    structure included in the pname:pNext chain must: be a slink:VkImageView
-    of an image created with a value of
-    slink:VkImageViewCreateInfo::pname:subresourceRange.layerCount equal to
-    the pname:layerCount member of the corresponding element of
-    slink:VkFramebufferAttachmentsCreateInfo::pname:pAttachmentImageInfos
-    used to create pname:framebuffer
-  * [[VUID-VkRenderPassBeginInfo-framebuffer-03214]]
-    If pname:framebuffer was created with a
-    slink:VkFramebufferCreateInfo::pname:flags value that included
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the
-    pname:pAttachments member of a slink:VkRenderPassAttachmentBeginInfo
-    structure included in the pname:pNext chain must: be a slink:VkImageView
-    of an image created with a value of
-    slink:VkImageFormatListCreateInfo::pname:viewFormatCount equal to the
-    pname:viewFormatCount member of the corresponding element of
-    slink:VkFramebufferAttachmentsCreateInfo::pname:pAttachmentImageInfos
-    used to create pname:framebuffer
-  * [[VUID-VkRenderPassBeginInfo-framebuffer-03215]]
-    If pname:framebuffer was created with a
-    slink:VkFramebufferCreateInfo::pname:flags value that included
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the
-    pname:pAttachments member of a slink:VkRenderPassAttachmentBeginInfo
-    structure included in the pname:pNext chain must: be a slink:VkImageView
-    of an image created with a set of elements in
-    slink:VkImageFormatListCreateInfo::pname:pViewFormats equal to the set
-    of elements in the pname:pViewFormats member of the corresponding
-    element of
-    slink:VkFramebufferAttachmentsCreateInfo::pname:pAttachmentImageInfos
-    used to create pname:framebuffer
-  * [[VUID-VkRenderPassBeginInfo-framebuffer-03216]]
-    If pname:framebuffer was created with a
-    slink:VkFramebufferCreateInfo::pname:flags value that included
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the
-    pname:pAttachments member of a slink:VkRenderPassAttachmentBeginInfo
-    structure included in the pname:pNext chain must: be a slink:VkImageView
-    of an image created with a value of
-    slink:VkImageViewCreateInfo::pname:format equal to the corresponding
-    value of slink:VkAttachmentDescription::pname:format in pname:renderPass
-  * [[VUID-VkRenderPassBeginInfo-framebuffer-03217]]
-    If pname:framebuffer was created with a
-    slink:VkFramebufferCreateInfo::pname:flags value that included
-    ename:VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the
-    pname:pAttachments member of a slink:VkRenderPassAttachmentBeginInfo
-    structure included in the pname:pNext chain must: be a slink:VkImageView
-    of an image created with a value of
-    slink:VkImageCreateInfo::pname:samples equal to the corresponding value
-    of slink:VkAttachmentDescription::pname:samples in pname:renderPass
-endif::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-ifdef::VK_QCOM_render_pass_transform[]
-  * [[VUID-VkRenderPassBeginInfo-pNext-02869]]
-    If the pname:pNext chain includes
-    slink:VkRenderPassTransformBeginInfoQCOM, pname:renderArea.offset must:
-    equal (0,0)
-  * [[VUID-VkRenderPassBeginInfo-pNext-02870]]
-    If the pname:pNext chain includes
-    slink:VkRenderPassTransformBeginInfoQCOM, pname:renderArea.extent
-    transformed by slink:VkRenderPassTransformBeginInfoQCOM::pname:transform
-    must: equal the pname:framebuffer dimensions
-endif::VK_QCOM_render_pass_transform[]
-****
-
-include::{generated}/validity/structs/VkRenderPassBeginInfo.txt[]
---
-
-ifdef::VK_EXT_sample_locations[]
-[open,refpage='VkRenderPassSampleLocationsBeginInfoEXT',desc='Structure specifying sample locations to use for the layout transition of custom sample locations compatible depth/stencil attachments',type='structs']
---
-The image layout of the depth aspect of a depth/stencil attachment referring
-to an image created with
-ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT is dependent
-on the last sample locations used to render to the image subresource, thus
-preserving the contents of such depth/stencil attachments across subpass
-boundaries requires the application to specify these sample locations
-whenever a layout transition of the attachment may: occur.
-This information can: be provided by adding a
-sname:VkRenderPassSampleLocationsBeginInfoEXT structure to the pname:pNext
-chain of sname:VkRenderPassBeginInfo.
-
-The sname:VkRenderPassSampleLocationsBeginInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkRenderPassSampleLocationsBeginInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:attachmentInitialSampleLocationsCount is the number of elements in
-    the pname:pAttachmentInitialSampleLocations array.
-  * pname:pAttachmentInitialSampleLocations is a pointer to an array of
-    pname:attachmentInitialSampleLocationsCount
-    slink:VkAttachmentSampleLocationsEXT structures specifying the
-    attachment indices and their corresponding sample location state.
-    Each element of pname:pAttachmentInitialSampleLocations can: specify the
-    sample location state to use in the automatic layout transition
-    performed to transition a depth/stencil attachment from the initial
-    layout of the attachment to the image layout specified for the
-    attachment in the first subpass using it.
-  * pname:postSubpassSampleLocationsCount is the number of elements in the
-    pname:pPostSubpassSampleLocations array.
-  * pname:pPostSubpassSampleLocations is a pointer to an array of
-    pname:postSubpassSampleLocationsCount slink:VkSubpassSampleLocationsEXT
-    structures specifying the subpass indices and their corresponding sample
-    location state.
-    Each element of pname:pPostSubpassSampleLocations can: specify the
-    sample location state to use in the automatic layout transition
-    performed to transition the depth/stencil attachment used by the
-    specified subpass to the image layout specified in a dependent subpass
-    or to the final layout of the attachment in case the specified subpass
-    is the last subpass using that attachment.
-    In addition, if
-    slink:VkPhysicalDeviceSampleLocationsPropertiesEXT::pname:variableSampleLocations
-    is ename:VK_FALSE, each element of pname:pPostSubpassSampleLocations
-    must: specify the sample location state that matches the sample
-    locations used by all pipelines that will be bound to a command buffer
-    during the specified subpass.
-    If pname:variableSampleLocations is ename:VK_TRUE, the sample locations
-    used for rasterization do not depend on
-    pname:pPostSubpassSampleLocations.
-
-include::{generated}/validity/structs/VkRenderPassSampleLocationsBeginInfoEXT.txt[]
---
-
-[open,refpage='VkAttachmentSampleLocationsEXT',desc='Structure specifying the sample locations state to use in the initial layout transition of attachments',type='structs']
---
-The sname:VkAttachmentSampleLocationsEXT structure is defined as:
-
-include::{generated}/api/structs/VkAttachmentSampleLocationsEXT.txt[]
-
-  * pname:attachmentIndex is the index of the attachment for which the
-    sample locations state is provided.
-  * pname:sampleLocationsInfo is the sample locations state to use for the
-    layout transition of the given attachment from the initial layout of the
-    attachment to the image layout specified for the attachment in the first
-    subpass using it.
-
-If the image referenced by the framebuffer attachment at index
-pname:attachmentIndex was not created with
-ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT then the
-values specified in pname:sampleLocationsInfo are ignored.
-
-.Valid Usage
-****
-  * [[VUID-VkAttachmentSampleLocationsEXT-attachmentIndex-01531]]
-    pname:attachmentIndex must: be less than the pname:attachmentCount
-    specified in slink:VkRenderPassCreateInfo the render pass specified by
-    slink:VkRenderPassBeginInfo::pname:renderPass was created with
-****
-
-include::{generated}/validity/structs/VkAttachmentSampleLocationsEXT.txt[]
---
-
-[open,refpage='VkSubpassSampleLocationsEXT',desc='Structure specifying the sample locations state to use for layout transitions of attachments performed after a given subpass',type='structs']
---
-The sname:VkSubpassSampleLocationsEXT structure is defined as:
-
-include::{generated}/api/structs/VkSubpassSampleLocationsEXT.txt[]
-
-  * pname:subpassIndex is the index of the subpass for which the sample
-    locations state is provided.
-  * pname:sampleLocationsInfo is the sample locations state to use for the
-    layout transition of the depth/stencil attachment away from the image
-    layout the attachment is used with in the subpass specified in
-    pname:subpassIndex.
-
-If the image referenced by the depth/stencil attachment used in the subpass
-identified by pname:subpassIndex was not created with
-ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT or if the
-subpass does not use a depth/stencil attachment, and
-slink:VkPhysicalDeviceSampleLocationsPropertiesEXT::pname:variableSampleLocations
-is ename:VK_TRUE then the values specified in pname:sampleLocationsInfo are
-ignored.
-
-.Valid Usage
-****
-  * [[VUID-VkSubpassSampleLocationsEXT-subpassIndex-01532]]
-    pname:subpassIndex must: be less than the pname:subpassCount specified
-    in slink:VkRenderPassCreateInfo the render pass specified by
-    slink:VkRenderPassBeginInfo::pname:renderPass was created with
-****
-
-include::{generated}/validity/structs/VkSubpassSampleLocationsEXT.txt[]
---
-endif::VK_EXT_sample_locations[]
-
-ifdef::VK_QCOM_render_pass_transform[]
-[open,refpage='VkRenderPassTransformBeginInfoQCOM',desc='Structure describing transform parameters of a render pass instance',type='structs']
---
-To begin a render pass instance with <<vertexpostproc-renderpass-transform,
-render pass transform>> enabled, add the
-slink:VkRenderPassTransformBeginInfoQCOM to the pname:pNext chain of
-slink:VkRenderPassBeginInfo structure passed to the
-flink:vkCmdBeginRenderPass command specifying the render pass transform.
-
-The sname:VkRenderPassTransformBeginInfoQCOM structure is defined as:
-
-include::{generated}/api/structs/VkRenderPassTransformBeginInfoQCOM.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:transform is a elink:VkSurfaceTransformFlagBitsKHR value
-    describing the transform to be applied to rasterization.
-
-.Valid Usage
-****
-  * [[VUID-VkRenderPassTransformBeginInfoQCOM-transform-02871]]
-    pname:transform must: be ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,
-    ename:VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR,
-    ename:VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR, or
-    ename:VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR
-  * [[VUID-VkRenderPassTransformBeginInfoQCOM-flags-02872]]
-    The pname:renderpass must: have been created with
-    slink:VkRenderPassCreateInfo::pname:flags containing
-    ename:VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM
-****
-
-include::{generated}/validity/structs/VkRenderPassTransformBeginInfoQCOM.txt[]
---
-endif::VK_QCOM_render_pass_transform[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-[open,refpage='VkSubpassBeginInfo',desc='Structure specifying subpass begin information',type='structs',alias='VkSubpassBeginInfoKHR']
---
-The sname:VkSubpassBeginInfo structure is defined as:
-
-include::{generated}/api/structs/VkSubpassBeginInfo.txt[]
-
-ifdef::VK_KHR_create_renderpass2[]
-or the equivalent
-
-include::{generated}/api/structs/VkSubpassBeginInfoKHR.txt[]
-endif::VK_KHR_create_renderpass2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:contents is a elink:VkSubpassContents value specifying how the
-    commands in the next subpass will be provided.
-
-include::{generated}/validity/structs/VkSubpassBeginInfo.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-
-[open,refpage='VkSubpassContents',desc='Specify how commands in the first subpass of a render pass are provided',type='enums']
---
-Possible values of flink:vkCmdBeginRenderPass::pname:contents, specifying
-how the commands in the first subpass will be provided, are:
-
-include::{generated}/api/enums/VkSubpassContents.txt[]
-
-  * ename:VK_SUBPASS_CONTENTS_INLINE specifies that the contents of the
-    subpass will be recorded inline in the primary command buffer, and
-    secondary command buffers must: not be executed within the subpass.
-  * ename:VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS specifies that the
-    contents are recorded in secondary command buffers that will be called
-    from the primary command buffer, and flink:vkCmdExecuteCommands is the
-    only valid command on the command buffer until flink:vkCmdNextSubpass or
-    flink:vkCmdEndRenderPass.
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[open,refpage='VkDeviceGroupRenderPassBeginInfo',desc='Set the initial device mask and render areas for a render pass instance',type='structs']
---
-If the pname:pNext chain of slink:VkRenderPassBeginInfo
-ifdef::VK_KHR_dynamic_rendering[or slink:VkRenderingInfoKHR]
-includes a sname:VkDeviceGroupRenderPassBeginInfo structure, then that
-structure includes a device mask and set of render areas for the render pass
-instance.
-
-The sname:VkDeviceGroupRenderPassBeginInfo structure is defined as:
-
-include::{generated}/api/structs/VkDeviceGroupRenderPassBeginInfo.txt[]
-
-ifdef::VK_KHR_device_group[]
-or the equivalent
-
-include::{generated}/api/structs/VkDeviceGroupRenderPassBeginInfoKHR.txt[]
-endif::VK_KHR_device_group[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:deviceMask is the device mask for the render pass instance.
-  * pname:deviceRenderAreaCount is the number of elements in the
-    pname:pDeviceRenderAreas array.
-  * pname:pDeviceRenderAreas is a pointer to an array of slink:VkRect2D
-    structures defining the render area for each physical device.
-
-The pname:deviceMask serves several purposes.
-It is an upper bound on the set of physical devices that can: be used during
-the render pass instance, and the initial device mask when the render pass
-instance begins.
-In addition, commands transitioning to the next subpass in a render pass
-instance and commands ending the render pass instance, and, accordingly
-render pass attachment load, store, and resolve operations and subpass
-dependencies corresponding to the render pass instance, are executed on the
-physical devices included in the device mask provided here.
-
-If pname:deviceRenderAreaCount is not zero, then the elements of
-pname:pDeviceRenderAreas override the value of
-slink:VkRenderPassBeginInfo::pname:renderArea, and provide a render area
-specific to each physical device.
-These render areas serve the same purpose as
-slink:VkRenderPassBeginInfo::pname:renderArea, including controlling the
-region of attachments that are cleared by ename:VK_ATTACHMENT_LOAD_OP_CLEAR
-and that are resolved into resolve attachments.
-
-If this structure is not present, the render pass instance's device mask is
-the value of slink:VkDeviceGroupCommandBufferBeginInfo::pname:deviceMask.
-If this structure is not present or if pname:deviceRenderAreaCount is zero,
-slink:VkRenderPassBeginInfo::pname:renderArea is used for all physical
-devices.
-
-.Valid Usage
-****
-  * [[VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00905]]
-    pname:deviceMask must: be a valid device mask value
-  * [[VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00906]]
-    pname:deviceMask must: not be zero
-  * [[VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00907]]
-    pname:deviceMask must: be a subset of the command buffer's initial
-    device mask
-  * [[VUID-VkDeviceGroupRenderPassBeginInfo-deviceRenderAreaCount-00908]]
-    pname:deviceRenderAreaCount must: either be zero or equal to the number
-    of physical devices in the logical device
-  * [[VUID-VkDeviceGroupRenderPassBeginInfo-offset-06166]]
-    The pname:offset.x member of any element of pname:pDeviceRenderAreas
-    must: be greater than or equal to 0
-  * [[VUID-VkDeviceGroupRenderPassBeginInfo-offset-06167]]
-    The pname:offset.y member of any element of pname:pDeviceRenderAreas
-    must: be greater than or equal to 0
-  * [[VUID-VkDeviceGroupRenderPassBeginInfo-offset-06168]]
-    The sum of the pname:offset.x and pname:extent.width members of any
-    element of pname:pDeviceRenderAreas must: be less than or equal to
-    <<limits-maxFramebufferWidth, pname:maxFramebufferWidth>>
-  * [[VUID-VkDeviceGroupRenderPassBeginInfo-offset-06169]]
-    The sum of the pname:offset.y and pname:extent.height members of any
-    element of pname:pDeviceRenderAreas must: be less than or equal to
-    <<limits-maxFramebufferHeight, pname:maxFramebufferHeight>>
-****
-
-include::{generated}/validity/structs/VkDeviceGroupRenderPassBeginInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-[open,refpage='VkRenderPassAttachmentBeginInfo',desc='Structure specifying images to be used as framebuffer attachments',type='structs',alias='VkRenderPassAttachmentBeginInfoKHR']
---
-The sname:VkRenderPassAttachmentBeginInfo structure is defined as:
-
-include::{generated}/api/structs/VkRenderPassAttachmentBeginInfo.txt[]
-
-ifdef::VK_KHR_imageless_framebuffer[]
-or the equivalent
-
-include::{generated}/api/structs/VkRenderPassAttachmentBeginInfoKHR.txt[]
-endif::VK_KHR_imageless_framebuffer[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:attachmentCount is the number of attachments.
-  * pname:pAttachments is a pointer to an array of sname:VkImageView
-    handles, each of which will be used as the corresponding attachment in
-    the render pass instance.
-
-.Valid Usage
-****
-  * [[VUID-VkRenderPassAttachmentBeginInfo-pAttachments-03218]]
-    Each element of pname:pAttachments must: only specify a single mip level
-  * [[VUID-VkRenderPassAttachmentBeginInfo-pAttachments-03219]]
-    Each element of pname:pAttachments must: have been created with the
-    identity swizzle
-  * [[VUID-VkRenderPassAttachmentBeginInfo-pAttachments-04114]]
-    Each element of pname:pAttachments must: have been created with
-    slink:VkImageViewCreateInfo::pname:viewType not equal to
-    ename:VK_IMAGE_VIEW_TYPE_3D
-****
-
-include::{generated}/validity/structs/VkRenderPassAttachmentBeginInfo.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_imageless_framebuffer[]
-
-[open,refpage='vkGetRenderAreaGranularity',desc='Returns the granularity for optimal render area',type='protos']
---
-To query the render area granularity, call:
-
-include::{generated}/api/protos/vkGetRenderAreaGranularity.txt[]
-
-  * pname:device is the logical device that owns the render pass.
-  * pname:renderPass is a handle to a render pass.
-  * pname:pGranularity is a pointer to a slink:VkExtent2D structure in which
-    the granularity is returned.
-
-The conditions leading to an optimal pname:renderArea are:
-
-  * the pname:offset.x member in pname:renderArea is a multiple of the
-    pname:width member of the returned slink:VkExtent2D (the horizontal
-    granularity).
-  * the pname:offset.y member in pname:renderArea is a multiple of the
-    pname:height member of the returned slink:VkExtent2D (the vertical
-    granularity).
-  * either the pname:extent.width member in pname:renderArea is a multiple
-    of the horizontal granularity or pname:offset.x+pname:extent.width is
-    equal to the pname:width of the pname:framebuffer in the
-    slink:VkRenderPassBeginInfo.
-  * either the pname:extent.height member in pname:renderArea is a multiple
-    of the vertical granularity or pname:offset.y+pname:extent.height is
-    equal to the pname:height of the pname:framebuffer in the
-    slink:VkRenderPassBeginInfo.
-
-Subpass dependencies are not affected by the render area, and apply to the
-entire image subresources attached to the framebuffer as specified in the
-description of <<renderpass-layout-transitions,automatic layout
-transitions>>.
-Similarly, pipeline barriers are valid even if their effect extends outside
-the render area.
-
-include::{generated}/validity/protos/vkGetRenderAreaGranularity.txt[]
---
-
-[open,refpage='vkCmdNextSubpass',desc='Transition to the next subpass of a render pass',type='protos']
---
-To transition to the next subpass in the render pass instance after
-recording the commands for a subpass, call:
-
-include::{generated}/api/protos/vkCmdNextSubpass.txt[]
-
-  * pname:commandBuffer is the command buffer in which to record the
-    command.
-  * pname:contents specifies how the commands in the next subpass will be
-    provided, in the same fashion as the corresponding parameter of
-    flink:vkCmdBeginRenderPass.
-
-The subpass index for a render pass begins at zero when
-fname:vkCmdBeginRenderPass is recorded, and increments each time
-fname:vkCmdNextSubpass is recorded.
-
-Moving to the next subpass automatically performs any multisample resolve
-operations in the subpass being ended.
-End-of-subpass multisample resolves are treated as color attachment writes
-for the purposes of synchronization.
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-This applies to resolve operations for both color and depth/stencil
-attachments.
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-That is, they are considered to execute in the
-ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT pipeline stage and their
-writes are synchronized with ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT.
-Synchronization between rendering within a subpass and any resolve
-operations at the end of the subpass occurs automatically, without need for
-explicit dependencies or pipeline barriers.
-However, if the resolve attachment is also used in a different subpass, an
-explicit dependency is needed.
-
-After transitioning to the next subpass, the application can: record the
-commands for that subpass.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdNextSubpass-None-00909]]
-    The current subpass index must: be less than the number of subpasses in
-    the render pass minus one
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-vkCmdNextSubpass-None-02349]]
-    This command must: not be recorded when transform feedback is active
-endif::VK_EXT_transform_feedback[]
-****
-
-include::{generated}/validity/protos/vkCmdNextSubpass.txt[]
---
-
-ifdef::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-[open,refpage='vkCmdNextSubpass2',desc='Transition to the next subpass of a render pass',type='protos',alias='vkCmdNextSubpass2KHR']
---
-To transition to the next subpass in the render pass instance after
-recording the commands for a subpass, call:
-
-ifdef::VK_VERSION_1_2[]
-include::{generated}/api/protos/vkCmdNextSubpass2.txt[]
-endif::VK_VERSION_1_2[]
-
-ifdef::VK_VERSION_1_2+VK_KHR_create_renderpass2[or the equivalent command]
-
-ifdef::VK_KHR_create_renderpass2[]
-include::{generated}/api/protos/vkCmdNextSubpass2KHR.txt[]
-endif::VK_KHR_create_renderpass2[]
-
-  * pname:commandBuffer is the command buffer in which to record the
-    command.
-  * pname:pSubpassBeginInfo is a pointer to a slink:VkSubpassBeginInfo
-    structure containing information about the subpass which is about to
-    begin rendering.
-  * pname:pSubpassEndInfo is a pointer to a slink:VkSubpassEndInfo structure
-    containing information about how the previous subpass will be ended.
-
-fname:vkCmdNextSubpass2 is semantically identical to flink:vkCmdNextSubpass,
-except that it is extensible, and that pname:contents is provided as part of
-an extensible structure instead of as a flat parameter.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdNextSubpass2-None-03102]]
-    The current subpass index must: be less than the number of subpasses in
-    the render pass minus one
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-vkCmdNextSubpass2-None-02350]]
-    This command must: not be recorded when transform feedback is active
-endif::VK_EXT_transform_feedback[]
-****
-
-include::{generated}/validity/protos/vkCmdNextSubpass2.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-
-[open,refpage='vkCmdEndRenderPass',desc='End the current render pass',type='protos']
---
-To record a command to end a render pass instance after recording the
-commands for the last subpass, call:
-
-include::{generated}/api/protos/vkCmdEndRenderPass.txt[]
-
-  * pname:commandBuffer is the command buffer in which to end the current
-    render pass instance.
-
-Ending a render pass instance performs any multisample resolve operations on
-the final subpass.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdEndRenderPass-None-00910]]
-    The current subpass index must: be equal to the number of subpasses in
-    the render pass minus one
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-vkCmdEndRenderPass-None-02351]]
-    This command must: not be recorded when transform feedback is active
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_KHR_dynamic_rendering[]
-  * [[VUID-vkCmdEndRenderPass-None-06170]]
-    The current render pass instance must: not have been begun with
-    flink:vkCmdBeginRenderingKHR
-endif::VK_KHR_dynamic_rendering[]
-****
-
-include::{generated}/validity/protos/vkCmdEndRenderPass.txt[]
---
-
-ifdef::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
-[open,refpage='vkCmdEndRenderPass2',desc='End the current render pass',type='protos',alias='vkCmdEndRenderPass2KHR']
---
-To record a command to end a render pass instance after recording the
-commands for the last subpass, call:
-
-ifdef::VK_VERSION_1_2[]
-include::{generated}/api/protos/vkCmdEndRenderPass2.txt[]
-endif::VK_VERSION_1_2[]
-
-ifdef::VK_VERSION_1_2+VK_KHR_create_renderpass2[or the equivalent command]
-
-ifdef::VK_KHR_create_renderpass2[]
-include::{generated}/api/protos/vkCmdEndRenderPass2KHR.txt[]
-endif::VK_KHR_create_renderpass2[]
-
-  * pname:commandBuffer is the command buffer in which to end the current
-    render pass instance.
-  * pname:pSubpassEndInfo is a pointer to a slink:VkSubpassEndInfo structure
-    containing information about how the previous subpass will be ended.
-
-fname:vkCmdEndRenderPass2 is semantically identical to
-flink:vkCmdEndRenderPass, except that it is extensible.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdEndRenderPass2-None-03103]]
-    The current subpass index must: be equal to the number of subpasses in
-    the render pass minus one
-ifdef::VK_EXT_transform_feedback[]
-  * [[VUID-vkCmdEndRenderPass2-None-02352]]
-    This command must: not be recorded when transform feedback is active
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_KHR_dynamic_rendering[]
-  * [[VUID-vkCmdEndRenderPass2-None-06171]]
-    The current render pass instance must: not have been begun with
-    flink:vkCmdBeginRenderingKHR
-endif::VK_KHR_dynamic_rendering[]
-****
-
-include::{generated}/validity/protos/vkCmdEndRenderPass2.txt[]
---
-
-[open,refpage='VkSubpassEndInfo',desc='Structure specifying subpass end information',type='structs',alias='VkSubpassEndInfoKHR']
---
-The sname:VkSubpassEndInfo structure is defined as:
-
-include::{generated}/api/structs/VkSubpassEndInfo.txt[]
-
-ifdef::VK_KHR_create_renderpass2[]
-or the equivalent
-
-include::{generated}/api/structs/VkSubpassEndInfoKHR.txt[]
-endif::VK_KHR_create_renderpass2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-
-include::{generated}/validity/structs/VkSubpassEndInfo.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
diff --git a/registry/vulkan/chapters/resources.txt b/registry/vulkan/chapters/resources.txt
deleted file mode 100644
index b844ac7..0000000
--- a/registry/vulkan/chapters/resources.txt
+++ /dev/null
@@ -1,7991 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[resources]]
-= Resource Creation
-
-Vulkan supports two primary resource types: _buffers_ and _images_.
-Resources are views of memory with associated formatting and dimensionality.
-Buffers are essentially unformatted arrays of bytes whereas images contain
-format information, can: be multidimensional and may: have associated
-metadata.
-
-
-[[resources-buffers]]
-== Buffers
-
-[open,refpage='VkBuffer',desc='Opaque handle to a buffer object',type='handles']
---
-Buffers represent linear arrays of data which are used for various purposes
-by binding them to a graphics or compute pipeline via descriptor sets or via
-certain commands, or by directly specifying them as parameters to certain
-commands.
-
-Buffers are represented by sname:VkBuffer handles:
-
-include::{generated}/api/handles/VkBuffer.txt[]
---
-
-[open,refpage='vkCreateBuffer',desc='Create a new buffer object',type='protos']
---
-To create buffers, call:
-
-include::{generated}/api/protos/vkCreateBuffer.txt[]
-
-  * pname:device is the logical device that creates the buffer object.
-  * pname:pCreateInfo is a pointer to a slink:VkBufferCreateInfo structure
-    containing parameters affecting creation of the buffer.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pBuffer is a pointer to a slink:VkBuffer handle in which the
-    resulting buffer object is returned.
-
-.Valid Usage
-****
-  * [[VUID-vkCreateBuffer-flags-00911]]
-    If the pname:flags member of pname:pCreateInfo includes
-    ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT, creating this sname:VkBuffer
-    must: not cause the total required sparse memory for all currently valid
-    sparse resources on the device to exceed
-    sname:VkPhysicalDeviceLimits::pname:sparseAddressSpaceSize
-ifdef::VK_FUCHSIA_buffer_collection[]
-  * [[VUID-vkCreateBuffer-pNext-06387]]
-    If using the slink:VkBuffer for an import operation from a
-    slink:VkBufferCollectionFUCHSIA where a
-    slink:VkBufferCollectionBufferCreateInfoFUCHSIA has been chained to
-    pname:pNext, pname:pCreateInfo must: match the
-    slink:VkBufferConstraintsInfoFUCHSIA::pname:createInfo used when setting
-    the constraints on the buffer collection with
-    flink:vkSetBufferCollectionBufferConstraintsFUCHSIA
-endif::VK_FUCHSIA_buffer_collection[]
-****
-
-include::{generated}/validity/protos/vkCreateBuffer.txt[]
---
-
-[open,refpage='VkBufferCreateInfo',desc='Structure specifying the parameters of a newly created buffer object',type='structs']
---
-The sname:VkBufferCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkBufferCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkBufferCreateFlagBits specifying
-    additional parameters of the buffer.
-  * pname:size is the size in bytes of the buffer to be created.
-  * pname:usage is a bitmask of elink:VkBufferUsageFlagBits specifying
-    allowed usages of the buffer.
-  * pname:sharingMode is a elink:VkSharingMode value specifying the sharing
-    mode of the buffer when it will be accessed by multiple queue families.
-  * pname:queueFamilyIndexCount is the number of entries in the
-    pname:pQueueFamilyIndices array.
-  * pname:pQueueFamilyIndices is a pointer to an array of queue families
-    that will access this buffer.
-    It is ignored if pname:sharingMode is not
-    ename:VK_SHARING_MODE_CONCURRENT.
-
-.Valid Usage
-****
-  * [[VUID-VkBufferCreateInfo-size-00912]]
-    pname:size must: be greater than `0`
-  * [[VUID-VkBufferCreateInfo-sharingMode-00913]]
-    If pname:sharingMode is ename:VK_SHARING_MODE_CONCURRENT,
-    pname:pQueueFamilyIndices must: be a valid pointer to an array of
-    pname:queueFamilyIndexCount code:uint32_t values
-  * [[VUID-VkBufferCreateInfo-sharingMode-00914]]
-    If pname:sharingMode is ename:VK_SHARING_MODE_CONCURRENT,
-    pname:queueFamilyIndexCount must: be greater than `1`
-ifndef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-  * [[VUID-VkBufferCreateInfo-sharingMode-01391]]
-    If pname:sharingMode is ename:VK_SHARING_MODE_CONCURRENT, each element
-    of pname:pQueueFamilyIndices must: be unique and must: be less than
-    pname:pQueueFamilyPropertyCount returned by
-    flink:vkGetPhysicalDeviceQueueFamilyProperties for the
-    pname:physicalDevice that was used to create pname:device
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-  * [[VUID-VkBufferCreateInfo-sharingMode-01419]]
-    If pname:sharingMode is ename:VK_SHARING_MODE_CONCURRENT, each element
-    of pname:pQueueFamilyIndices must: be unique and must: be less than
-    pname:pQueueFamilyPropertyCount returned by either
-    flink:vkGetPhysicalDeviceQueueFamilyProperties or
-    flink:vkGetPhysicalDeviceQueueFamilyProperties2 for the
-    pname:physicalDevice that was used to create pname:device
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-  * [[VUID-VkBufferCreateInfo-flags-00915]]
-    If the <<features-sparseBinding,sparse bindings>> feature is not
-    enabled, pname:flags must: not contain
-    ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT
-  * [[VUID-VkBufferCreateInfo-flags-00916]]
-    If the <<features-sparseResidencyBuffer,sparse buffer residency>>
-    feature is not enabled, pname:flags must: not contain
-    ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT
-  * [[VUID-VkBufferCreateInfo-flags-00917]]
-    If the <<features-sparseResidencyAliased,sparse aliased residency>>
-    feature is not enabled, pname:flags must: not contain
-    ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT
-  * [[VUID-VkBufferCreateInfo-flags-00918]]
-    If pname:flags contains ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT or
-    ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, it must: also contain
-    ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * [[VUID-VkBufferCreateInfo-pNext-00920]]
-    If the pname:pNext chain includes a
-    slink:VkExternalMemoryBufferCreateInfo structure, its pname:handleTypes
-    member must: only contain bits that are also in
-    slink:VkExternalBufferProperties::pname:externalMemoryProperties.compatibleHandleTypes,
-    as returned by flink:vkGetPhysicalDeviceExternalBufferProperties with
-    pname:pExternalBufferInfo->handleType equal to any one of the handle
-    types specified in
-    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-VkBufferCreateInfo-flags-01887]]
-    If the protected memory feature is not enabled, pname:flags must: not
-    contain ename:VK_BUFFER_CREATE_PROTECTED_BIT
-  * [[VUID-VkBufferCreateInfo-None-01888]]
-    If any of the bits ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT,
-    ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT, or
-    ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT are set,
-    ename:VK_BUFFER_CREATE_PROTECTED_BIT must: not also be set
-endif::VK_VERSION_1_1[]
-ifdef::VK_NV_dedicated_allocation[]
-  * [[VUID-VkBufferCreateInfo-pNext-01571]]
-    If the pname:pNext chain includes a
-    slink:VkDedicatedAllocationBufferCreateInfoNV structure, and the
-    pname:dedicatedAllocation member of the chained structure is
-    ename:VK_TRUE, then pname:flags must: not include
-    ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT,
-    ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT, or
-    ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT
-endif::VK_NV_dedicated_allocation[]
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-ifdef::VK_EXT_buffer_device_address[]
-  * [[VUID-VkBufferCreateInfo-deviceAddress-02604]]
-    If slink:VkBufferDeviceAddressCreateInfoEXT::pname:deviceAddress is not
-    zero, pname:flags must: include
-    ename:VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT
-endif::VK_EXT_buffer_device_address[]
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-  * [[VUID-VkBufferCreateInfo-opaqueCaptureAddress-03337]]
-    If
-    slink:VkBufferOpaqueCaptureAddressCreateInfo::pname:opaqueCaptureAddress
-    is not zero, pname:flags must: include
-    ename:VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-  * [[VUID-VkBufferCreateInfo-flags-03338]]
-    If pname:flags includes
-    ename:VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT, the
-    <<features-bufferDeviceAddressCaptureReplay,bufferDeviceAddressCaptureReplay>>
-    or
-    <<features-bufferDeviceAddressCaptureReplayEXT,sname:VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::pname:bufferDeviceAddressCaptureReplay>>
-    feature must: be enabled
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-ifdef::VK_KHR_video_decode_queue[]
-  * [[VUID-VkBufferCreateInfo-usage-04813]]
-    If pname:usage includes ename:VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR,
-    ename:VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR, then the pname:pNext
-    chain must: include a valid slink:VkVideoProfilesKHR structure which
-    includes at least one slink:VkVideoProfileKHR with a decode
-    codec-operation
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-  * [[VUID-VkBufferCreateInfo-usage-04814]]
-    If pname:usage includes ename:VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR,
-    ename:VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR, then the pname:pNext
-    chain must: include a valid slink:VkVideoProfilesKHR structure which
-    includes at least one slink:VkVideoProfileKHR with a encode
-    codec-operation
-endif::VK_KHR_video_encode_queue[]
-ifdef::VK_KHR_maintenance4[]
-  * [[VUID-VkBufferCreateInfo-size-06409]]
-    pname:size must: be less than or equal to
-    slink:VkPhysicalDeviceMaintenance4PropertiesKHR::pname:maxBufferSize
-endif::VK_KHR_maintenance4[]
-****
-
-include::{generated}/validity/structs/VkBufferCreateInfo.txt[]
---
-
-[open,refpage='VkBufferUsageFlagBits',desc='Bitmask specifying allowed usage of a buffer',type='enums']
---
-Bits which can: be set in slink:VkBufferCreateInfo::pname:usage, specifying
-usage behavior of a buffer, are:
-
-include::{generated}/api/enums/VkBufferUsageFlagBits.txt[]
-
-  * ename:VK_BUFFER_USAGE_TRANSFER_SRC_BIT specifies that the buffer can: be
-    used as the source of a _transfer command_ (see the definition of
-    <<synchronization-pipeline-stages-transfer,
-    ename:VK_PIPELINE_STAGE_TRANSFER_BIT>>).
-  * ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT specifies that the buffer can: be
-    used as the destination of a transfer command.
-  * ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT specifies that the buffer
-    can: be used to create a sname:VkBufferView suitable for occupying a
-    sname:VkDescriptorSet slot of type
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER.
-  * ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT specifies that the buffer
-    can: be used to create a sname:VkBufferView suitable for occupying a
-    sname:VkDescriptorSet slot of type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
-  * ename:VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT specifies that the buffer can:
-    be used in a sname:VkDescriptorBufferInfo suitable for occupying a
-    sname:VkDescriptorSet slot either of type
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC.
-  * ename:VK_BUFFER_USAGE_STORAGE_BUFFER_BIT specifies that the buffer can:
-    be used in a sname:VkDescriptorBufferInfo suitable for occupying a
-    sname:VkDescriptorSet slot either of type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC.
-  * ename:VK_BUFFER_USAGE_INDEX_BUFFER_BIT specifies that the buffer is
-    suitable for passing as the pname:buffer parameter to
-    flink:vkCmdBindIndexBuffer.
-  * ename:VK_BUFFER_USAGE_VERTEX_BUFFER_BIT specifies that the buffer is
-    suitable for passing as an element of the pname:pBuffers array to
-    flink:vkCmdBindVertexBuffers.
-  * ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT specifies that the buffer is
-    suitable for passing as the pname:buffer parameter to
-    flink:vkCmdDrawIndirect, flink:vkCmdDrawIndexedIndirect,
-ifdef::VK_NV_mesh_shader[]
-    flink:vkCmdDrawMeshTasksIndirectNV,
-    flink:vkCmdDrawMeshTasksIndirectCountNV,
-endif::VK_NV_mesh_shader[]
-    or flink:vkCmdDispatchIndirect.
-ifdef::VK_NV_device_generated_commands[]
-    It is also suitable for passing as the pname:buffer member of
-    sname:VkIndirectCommandsStreamNV, or pname:sequencesCountBuffer or
-    pname:sequencesIndexBuffer or pname:preprocessedBuffer member of
-    sname:VkGeneratedCommandsInfoNV
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_EXT_conditional_rendering[]
-  * ename:VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT specifies that the
-    buffer is suitable for passing as the pname:buffer parameter to
-    flink:vkCmdBeginConditionalRenderingEXT.
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_transform_feedback[]
-  * ename:VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT specifies that
-    the buffer is suitable for using for binding as a transform feedback
-    buffer with flink:vkCmdBindTransformFeedbackBuffersEXT.
-  * ename:VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT
-    specifies that the buffer is suitable for using as a counter buffer with
-    flink:vkCmdBeginTransformFeedbackEXT and
-    flink:vkCmdEndTransformFeedbackEXT.
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_ray_tracing[]
-  * ename:VK_BUFFER_USAGE_RAY_TRACING_BIT_NV specifies that the buffer is
-    suitable for use in flink:vkCmdTraceRaysNV.
-endif::VK_NV_ray_tracing[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-  * ename:VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR specifies that the
-    buffer is suitable for use as a <<shader-binding-table,Shader Binding
-    Table>>.
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_KHR_acceleration_structure[]
-  * ename:VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR
-    specifies that the buffer is suitable for use as a read-only input to an
-    <<acceleration-structure-building,acceleration structure build>>.
-  * ename:VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR specifies
-    that the buffer is suitable for storage space for a
-    slink:VkAccelerationStructureKHR.
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-  * ename:VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT specifies that the
-    buffer can: be used to retrieve a buffer device address via
-    flink:vkGetBufferDeviceAddress and use that address to access the
-    buffer's memory from a shader.
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-ifdef::VK_KHR_video_decode_queue[]
-  * ename:VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR specifies that the buffer
-    can: be used as the source bitstream buffer in a
-    <<video-decode-operations, video decode operation>>.
-  * ename:VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR specifies that the buffer
-    can: be used as the destination status buffer in a
-    <<video-decode-operations, video decode operation>>.
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-  * ename:VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR specifies that the buffer
-    can: be used as the destination bitstream buffer in a
-    <<video-encode-operations, video encode operation>>.
-  * ename:VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR specifies that the buffer
-    can: be used as the destination status buffer in a
-    <<video-encode-operations, video encode operation>>.
-endif::VK_KHR_video_encode_queue[]
---
-
-[open,refpage='VkBufferUsageFlags',desc='Bitmask of VkBufferUsageFlagBits',type='flags']
---
-include::{generated}/api/flags/VkBufferUsageFlags.txt[]
-
-tname:VkBufferUsageFlags is a bitmask type for setting a mask of zero or
-more elink:VkBufferUsageFlagBits.
---
-
-[open,refpage='VkBufferCreateFlagBits',desc='Bitmask specifying additional parameters of a buffer',type='enums']
---
-Bits which can: be set in slink:VkBufferCreateInfo::pname:flags, specifying
-additional parameters of a buffer, are:
-
-include::{generated}/api/enums/VkBufferCreateFlagBits.txt[]
-
-  * ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT specifies that the buffer will
-    be backed using sparse memory binding.
-  * ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT specifies that the buffer
-    can: be partially backed using sparse memory binding.
-    Buffers created with this flag must: also be created with the
-    ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT flag.
-  * ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT specifies that the buffer will
-    be backed using sparse memory binding with memory ranges that might also
-    simultaneously be backing another buffer (or another portion of the same
-    buffer).
-    Buffers created with this flag must: also be created with the
-    ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT flag.
-ifdef::VK_VERSION_1_1[]
-  * ename:VK_BUFFER_CREATE_PROTECTED_BIT specifies that the buffer is a
-    protected buffer.
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-  * ename:VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT specifies that
-    the buffer's address can: be saved and reused on a subsequent run (e.g.
-    for trace capture and replay), see
-    slink:VkBufferOpaqueCaptureAddressCreateInfo for more detail.
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-
-See <<sparsememory-sparseresourcefeatures,Sparse Resource Features>> and
-<<features,Physical Device Features>> for details of the sparse memory
-features supported on a device.
---
-
-[open,refpage='VkBufferCreateFlags',desc='Bitmask of VkBufferCreateFlagBits',type='flags']
---
-include::{generated}/api/flags/VkBufferCreateFlags.txt[]
-
-tname:VkBufferCreateFlags is a bitmask type for setting a mask of zero or
-more elink:VkBufferCreateFlagBits.
---
-
-ifdef::VK_NV_dedicated_allocation[]
-[open,refpage='VkDedicatedAllocationBufferCreateInfoNV',desc='Specify that a buffer is bound to a dedicated memory resource',type='structs']
---
-If the pname:pNext chain includes a
-sname:VkDedicatedAllocationBufferCreateInfoNV structure, then that structure
-includes an enable controlling whether the buffer will have a dedicated
-memory allocation bound to it.
-
-The sname:VkDedicatedAllocationBufferCreateInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkDedicatedAllocationBufferCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:dedicatedAllocation specifies whether the buffer will have a
-    dedicated allocation bound to it.
-
-include::{generated}/validity/structs/VkDedicatedAllocationBufferCreateInfoNV.txt[]
---
-endif::VK_NV_dedicated_allocation[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-[open,refpage='VkExternalMemoryBufferCreateInfo',desc='Specify that a buffer may be backed by external memory',type='structs']
---
-To define a set of external memory handle types that may: be used as backing
-store for a buffer, add a slink:VkExternalMemoryBufferCreateInfo structure
-to the pname:pNext chain of the slink:VkBufferCreateInfo structure.
-The sname:VkExternalMemoryBufferCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkExternalMemoryBufferCreateInfo.txt[]
-
-ifdef::VK_KHR_external_memory[]
-or the equivalent
-
-include::{generated}/api/structs/VkExternalMemoryBufferCreateInfoKHR.txt[]
-endif::VK_KHR_external_memory[]
-
-[NOTE]
-.Note
-====
-A sname:VkExternalMemoryBufferCreateInfo structure with a non-zero
-pname:handleTypes field must be included in the creation parameters for a
-buffer that will be bound to memory that is either exported or imported.
-====
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleTypes is zero, or a bitmask of
-    elink:VkExternalMemoryHandleTypeFlagBits specifying one or more external
-    memory handle types.
-
-include::{generated}/validity/structs/VkExternalMemoryBufferCreateInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-[open,refpage='VkBufferOpaqueCaptureAddressCreateInfo',desc='Request a specific address for a buffer',type='structs',alias='VkBufferOpaqueCaptureAddressCreateInfoKHR']
---
-To request a specific device address for a buffer, add a
-slink:VkBufferOpaqueCaptureAddressCreateInfo structure to the pname:pNext
-chain of the slink:VkBufferCreateInfo structure.
-The sname:VkBufferOpaqueCaptureAddressCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkBufferOpaqueCaptureAddressCreateInfo.txt[]
-
-ifdef::VK_KHR_buffer_device_address[]
-or the equivalent
-
-include::{generated}/api/structs/VkBufferOpaqueCaptureAddressCreateInfoKHR.txt[]
-endif::VK_KHR_buffer_device_address[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:opaqueCaptureAddress is the opaque capture address requested for
-    the buffer.
-
-If pname:opaqueCaptureAddress is zero, no specific address is requested.
-
-If pname:opaqueCaptureAddress is not zero, then it should: be an address
-retrieved from flink:vkGetBufferOpaqueCaptureAddress for an identically
-created buffer on the same implementation.
-
-If this structure is not present, it is as if pname:opaqueCaptureAddress is
-zero.
-
-Apps should: avoid creating buffers with app-provided addresses and
-implementation-provided addresses in the same process, to reduce the
-likelihood of ename:VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS errors.
-
-[NOTE]
-.Note
-====
-The expected usage for this is that a trace capture/replay tool will add the
-ename:VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT flag to all buffers
-that use ename:VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, and during capture
-will save the queried opaque device addresses in the trace.
-During replay, the buffers will be created specifying the original address
-so any address values stored in the trace data will remain valid.
-
-Implementations are expected to separate such buffers in the GPU address
-space so normal allocations will avoid using these addresses.
-Apps/tools should avoid mixing app-provided and implementation-provided
-addresses for buffers created with
-ename:VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT, to avoid address
-space allocation conflicts.
-====
-
-include::{generated}/validity/structs/VkBufferOpaqueCaptureAddressCreateInfo.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-
-ifdef::VK_EXT_buffer_device_address[]
-[open,refpage='VkBufferDeviceAddressCreateInfoEXT',desc='Request a specific address for a buffer',type='structs']
---
-ifdef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-Alternatively, to
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-ifndef::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-To
-endif::VK_VERSION_1_2,VK_KHR_buffer_device_address[]
-request a specific device address for a buffer, add a
-slink:VkBufferDeviceAddressCreateInfoEXT structure to the pname:pNext chain
-of the slink:VkBufferCreateInfo structure.
-The sname:VkBufferDeviceAddressCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkBufferDeviceAddressCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:deviceAddress is the device address requested for the buffer.
-
-If pname:deviceAddress is zero, no specific address is requested.
-
-If pname:deviceAddress is not zero, then it must: be an address retrieved
-from an identically created buffer on the same implementation.
-The buffer must: also be bound to an identically created
-sname:VkDeviceMemory object.
-
-If this structure is not present, it is as if pname:deviceAddress is zero.
-
-Apps should: avoid creating buffers with app-provided addresses and
-implementation-provided addresses in the same process, to reduce the
-likelihood of ename:VK_ERROR_INVALID_DEVICE_ADDRESS_EXT errors.
-
-include::{generated}/validity/structs/VkBufferDeviceAddressCreateInfoEXT.txt[]
---
-endif::VK_EXT_buffer_device_address[]
-
-
-ifdef::VK_FUCHSIA_buffer_collection[]
-[open,refpage='VkBufferCollectionBufferCreateInfoFUCHSIA',desc='Create a VkBufferCollectionFUCHSIA-compatible VkBuffer',type='structs']
---
-The sname:VkBufferCollectionBufferCreateInfoFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkBufferCollectionBufferCreateInfoFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure
-  * pname:collection is the slink:VkBufferCollectionFUCHSIA handle
-  * pname:index is the index of the buffer in the buffer collection from
-    which the memory will be imported
-
-.Valid Usage
-****
-  * [[VUID-VkBufferCollectionBufferCreateInfoFUCHSIA-index-06388]]
-    pname:index must: be less than
-    slink:VkBufferCollectionPropertiesFUCHSIA::pname:bufferCount
-****
-
-include::{generated}/validity/structs/VkBufferCollectionBufferCreateInfoFUCHSIA.txt[]
---
-endif::VK_FUCHSIA_buffer_collection[]
-
-[open,refpage='vkDestroyBuffer',desc='Destroy a buffer object',type='protos']
---
-To destroy a buffer, call:
-
-include::{generated}/api/protos/vkDestroyBuffer.txt[]
-
-  * pname:device is the logical device that destroys the buffer.
-  * pname:buffer is the buffer to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyBuffer-buffer-00922]]
-    All submitted commands that refer to pname:buffer, either directly or
-    via a sname:VkBufferView, must: have completed execution
-  * [[VUID-vkDestroyBuffer-buffer-00923]]
-    If sname:VkAllocationCallbacks were provided when pname:buffer was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyBuffer-buffer-00924]]
-    If no sname:VkAllocationCallbacks were provided when pname:buffer was
-    created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyBuffer.txt[]
---
-
-
-[[resources-buffer-views]]
-== Buffer Views
-
-[open,refpage='VkBufferView',desc='Opaque handle to a buffer view object',type='handles']
---
-A _buffer view_ represents a contiguous range of a buffer and a specific
-format to be used to interpret the data.
-Buffer views are used to enable shaders to access buffer contents
-interpreted as formatted data.
-In order to create a valid buffer view, the buffer must: have been created
-with at least one of the following usage flags:
-
-  * ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT
-  * ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT
-
-Buffer views are represented by sname:VkBufferView handles:
-
-include::{generated}/api/handles/VkBufferView.txt[]
---
-
-[open,refpage='vkCreateBufferView',desc='Create a new buffer view object',type='protos']
---
-To create a buffer view, call:
-
-include::{generated}/api/protos/vkCreateBufferView.txt[]
-
-  * pname:device is the logical device that creates the buffer view.
-  * pname:pCreateInfo is a pointer to a slink:VkBufferViewCreateInfo
-    structure containing parameters to be used to create the buffer view.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pView is a pointer to a slink:VkBufferView handle in which the
-    resulting buffer view object is returned.
-
-include::{generated}/validity/protos/vkCreateBufferView.txt[]
---
-
-[open,refpage='VkBufferViewCreateInfo',desc='Structure specifying parameters of a newly created buffer view',type='structs']
---
-The sname:VkBufferViewCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkBufferViewCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:buffer is a slink:VkBuffer on which the view will be created.
-  * pname:format is a elink:VkFormat describing the format of the data
-    elements in the buffer.
-  * pname:offset is an offset in bytes from the base address of the buffer.
-    Accesses to the buffer view from shaders use addressing that is relative
-    to this starting offset.
-  * pname:range is a size in bytes of the buffer view.
-    If pname:range is equal to ename:VK_WHOLE_SIZE, the range from
-    pname:offset to the end of the buffer is used.
-    If ename:VK_WHOLE_SIZE is used and the remaining size of the buffer is
-    not a multiple of the <<texel-block-size, texel block size>> of
-    pname:format, the nearest smaller multiple is used.
-
-.Valid Usage
-****
-  * [[VUID-VkBufferViewCreateInfo-offset-00925]]
-    pname:offset must: be less than the size of pname:buffer
-ifndef::VK_EXT_texel_buffer_alignment[]
-  * [[VUID-VkBufferViewCreateInfo-offset-00926]]
-    pname:offset must: be a multiple of
-    sname:VkPhysicalDeviceLimits::pname:minTexelBufferOffsetAlignment
-endif::VK_EXT_texel_buffer_alignment[]
-  * [[VUID-VkBufferViewCreateInfo-range-00928]]
-    If pname:range is not equal to ename:VK_WHOLE_SIZE, pname:range must: be
-    greater than `0`
-  * [[VUID-VkBufferViewCreateInfo-range-00929]]
-    If pname:range is not equal to ename:VK_WHOLE_SIZE, pname:range must: be
-    an integer multiple of the texel block size of pname:format
-  * [[VUID-VkBufferViewCreateInfo-range-00930]]
-    If pname:range is not equal to ename:VK_WHOLE_SIZE, the number of texel
-    buffer elements given by [eq]#({lfloor}pname:range / (texel block
-    size){rfloor} {times} (texels per block))# where texel block size and
-    texels per block are as defined in the <<formats-compatibility,
-    Compatible Formats>> table for pname:format, must: be less than or equal
-    to sname:VkPhysicalDeviceLimits::pname:maxTexelBufferElements
-  * [[VUID-VkBufferViewCreateInfo-offset-00931]]
-    If pname:range is not equal to ename:VK_WHOLE_SIZE, the sum of
-    pname:offset and pname:range must: be less than or equal to the size of
-    pname:buffer
-  * [[VUID-VkBufferViewCreateInfo-range-04059]]
-    If pname:range is equal to ename:VK_WHOLE_SIZE, the number of texel
-    buffer elements given by [eq]#({lfloor}(size - pname:offset) / (texel
-    block size){rfloor} {times} (texels per block))# where size is the size
-    of pname:buffer, and texel block size and texels per block are as
-    defined in the <<formats-compatibility, Compatible Formats>> table for
-    pname:format, must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxTexelBufferElements
-  * [[VUID-VkBufferViewCreateInfo-buffer-00932]]
-    pname:buffer must: have been created with a pname:usage value containing
-    at least one of ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or
-    ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT
-  * [[VUID-VkBufferViewCreateInfo-buffer-00933]]
-    If pname:buffer was created with pname:usage containing
-    ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, pname:format must: be
-    supported for uniform texel buffers, as specified by the
-    ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT flag in
-    sname:VkFormatProperties::pname:bufferFeatures returned by
-    flink:vkGetPhysicalDeviceFormatProperties
-  * [[VUID-VkBufferViewCreateInfo-buffer-00934]]
-    If pname:buffer was created with pname:usage containing
-    ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, pname:format must: be
-    supported for storage texel buffers, as specified by the
-    ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT flag in
-    sname:VkFormatProperties::pname:bufferFeatures returned by
-    flink:vkGetPhysicalDeviceFormatProperties
-  * [[VUID-VkBufferViewCreateInfo-buffer-00935]]
-    If pname:buffer is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-ifdef::VK_EXT_texel_buffer_alignment[]
-  * [[VUID-VkBufferViewCreateInfo-offset-02749]]
-    If the <<features-texelBufferAlignment,texelBufferAlignment>> feature is
-    not enabled, pname:offset must: be a multiple of
-    sname:VkPhysicalDeviceLimits::pname:minTexelBufferOffsetAlignment
-  * [[VUID-VkBufferViewCreateInfo-buffer-02750]]
-    If the <<features-texelBufferAlignment,texelBufferAlignment>> feature is
-    enabled and if pname:buffer was created with pname:usage containing
-    ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, pname:offset must: be a
-    multiple of the lesser of
-    slink:VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::pname:storageTexelBufferOffsetAlignmentBytes
-    or, if
-    slink:VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::pname:storageTexelBufferOffsetSingleTexelAlignment
-    is ename:VK_TRUE, the size of a texel of the requested pname:format.
-    If the size of a texel is a multiple of three bytes, then the size of a
-    single component of pname:format is used instead
-  * [[VUID-VkBufferViewCreateInfo-buffer-02751]]
-    If the <<features-texelBufferAlignment,texelBufferAlignment>> feature is
-    enabled and if pname:buffer was created with pname:usage containing
-    ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, pname:offset must: be a
-    multiple of the lesser of
-    slink:VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::pname:uniformTexelBufferOffsetAlignmentBytes
-    or, if
-    slink:VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::pname:uniformTexelBufferOffsetSingleTexelAlignment
-    is ename:VK_TRUE, the size of a texel of the requested pname:format.
-    If the size of a texel is a multiple of three bytes, then the size of a
-    single component of pname:format is used instead
-endif::VK_EXT_texel_buffer_alignment[]
-****
-
-include::{generated}/validity/structs/VkBufferViewCreateInfo.txt[]
---
-
-[open,refpage='VkBufferViewCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkBufferViewCreateFlags.txt[]
-
-tname:VkBufferViewCreateFlags is a bitmask type for setting a mask, but is
-currently reserved for future use.
---
-
-[open,refpage='vkDestroyBufferView',desc='Destroy a buffer view object',type='protos']
---
-To destroy a buffer view, call:
-
-include::{generated}/api/protos/vkDestroyBufferView.txt[]
-
-  * pname:device is the logical device that destroys the buffer view.
-  * pname:bufferView is the buffer view to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyBufferView-bufferView-00936]]
-    All submitted commands that refer to pname:bufferView must: have
-    completed execution
-  * [[VUID-vkDestroyBufferView-bufferView-00937]]
-    If sname:VkAllocationCallbacks were provided when pname:bufferView was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyBufferView-bufferView-00938]]
-    If no sname:VkAllocationCallbacks were provided when pname:bufferView
-    was created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyBufferView.txt[]
---
-
-
-[[resources-images]]
-== Images
-
-[open,refpage='VkImage',desc='Opaque handle to an image object',type='handles']
---
-Images represent multidimensional - up to 3 - arrays of data which can: be
-used for various purposes (e.g. attachments, textures), by binding them to a
-graphics or compute pipeline via descriptor sets, or by directly specifying
-them as parameters to certain commands.
-
-Images are represented by sname:VkImage handles:
-
-include::{generated}/api/handles/VkImage.txt[]
---
-
-[open,refpage='vkCreateImage',desc='Create a new image object',type='protos']
---
-To create images, call:
-
-include::{generated}/api/protos/vkCreateImage.txt[]
-
-  * pname:device is the logical device that creates the image.
-  * pname:pCreateInfo is a pointer to a slink:VkImageCreateInfo structure
-    containing parameters to be used to create the image.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pImage is a pointer to a slink:VkImage handle in which the
-    resulting image object is returned.
-
-.Valid Usage
-****
-  * [[VUID-vkCreateImage-flags-00939]]
-    If the pname:flags member of pname:pCreateInfo includes
-    ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT, creating this sname:VkImage
-    must: not cause the total required sparse memory for all currently valid
-    sparse resources on the device to exceed
-    sname:VkPhysicalDeviceLimits::pname:sparseAddressSpaceSize
-ifdef::VK_FUCHSIA_buffer_collection[]
-  * [[VUID-vkCreateImage-pNext-06389]]
-    If a slink:VkBufferCollectionImageCreateInfoFUCHSIA has been chained to
-    pname:pNext, pname:pCreateInfo must: match the
-    <<sysmem-chosen-create-infos,Sysmem chosen sname:VkImageCreateInfo>>
-    excepting members slink:VkImageCreateInfo::pname:extent and
-    slink:VkImageCreateInfo::pname:usage in the match criteria
-endif::VK_FUCHSIA_buffer_collection[]
-****
-
-include::{generated}/validity/protos/vkCreateImage.txt[]
---
-
-[open,refpage='VkImageCreateInfo',desc='Structure specifying the parameters of a newly created image object',type='structs']
---
-The sname:VkImageCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkImageCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkImageCreateFlagBits describing
-    additional parameters of the image.
-  * pname:imageType is a elink:VkImageType value specifying the basic
-    dimensionality of the image.
-    Layers in array textures do not count as a dimension for the purposes of
-    the image type.
-  * pname:format is a elink:VkFormat describing the format and type of the
-    texel blocks that will be contained in the image.
-  * pname:extent is a slink:VkExtent3D describing the number of data
-    elements in each dimension of the base level.
-  * pname:mipLevels describes the number of levels of detail available for
-    minified sampling of the image.
-  * pname:arrayLayers is the number of layers in the image.
-  * pname:samples is a elink:VkSampleCountFlagBits value specifying the
-    number of <<primsrast-multisampling,samples per texel>>.
-  * pname:tiling is a elink:VkImageTiling value specifying the tiling
-    arrangement of the texel blocks in memory.
-  * pname:usage is a bitmask of elink:VkImageUsageFlagBits describing the
-    intended usage of the image.
-  * pname:sharingMode is a elink:VkSharingMode value specifying the sharing
-    mode of the image when it will be accessed by multiple queue families.
-  * pname:queueFamilyIndexCount is the number of entries in the
-    pname:pQueueFamilyIndices array.
-  * pname:pQueueFamilyIndices is a pointer to an array of queue families
-    that will access this image.
-    It is ignored if pname:sharingMode is not
-    ename:VK_SHARING_MODE_CONCURRENT.
-  * pname:initialLayout is a elink:VkImageLayout value specifying the
-    initial elink:VkImageLayout of all image subresources of the image.
-    See <<resources-image-layouts,Image Layouts>>.
-
-Images created with pname:tiling equal to ename:VK_IMAGE_TILING_LINEAR have
-further restrictions on their limits and capabilities compared to images
-created with pname:tiling equal to ename:VK_IMAGE_TILING_OPTIMAL.
-Creation of images with tiling ename:VK_IMAGE_TILING_LINEAR may: not be
-supported unless other parameters meet all of the constraints:
-
-  * pname:imageType is ename:VK_IMAGE_TYPE_2D
-  * pname:format is not a depth/stencil format
-  * pname:mipLevels is 1
-  * pname:arrayLayers is 1
-  * pname:samples is ename:VK_SAMPLE_COUNT_1_BIT
-  * pname:usage only includes ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT and/or
-    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-Images created with one of the <<formats-requiring-sampler-ycbcr-conversion,
-formats that require a sampler Y'C~B~C~R~ conversion>>, have further
-restrictions on their limits and capabilities compared to images created
-with other formats.
-Creation of images with a format requiring
-<<formats-requiring-sampler-ycbcr-conversion, {YCbCr} conversion>> may: not
-be supported unless other parameters meet all of the constraints:
-
-  * pname:imageType is ename:VK_IMAGE_TYPE_2D
-  * pname:mipLevels is 1
-  * pname:arrayLayers is 1
-  * pname:samples is ename:VK_SAMPLE_COUNT_1_BIT
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-Implementations may: support additional limits and capabilities beyond those
-listed above.
-
-To determine the set of valid pname:usage bits for a given format, call
-flink:vkGetPhysicalDeviceFormatProperties.
-
-If the size of the resultant image would exceed pname:maxResourceSize, then
-flink:vkCreateImage must: fail and return
-ename:VK_ERROR_OUT_OF_DEVICE_MEMORY.
-This failure may: occur even when all image creation parameters satisfy
-their valid usage requirements.
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-[NOTE]
-.Note
-====
-For images created without ename:VK_IMAGE_CREATE_EXTENDED_USAGE_BIT a
-pname:usage bit is valid if it is supported for the format the image is
-created with.
-
-For images created with ename:VK_IMAGE_CREATE_EXTENDED_USAGE_BIT a
-pname:usage bit is valid if it is supported for at least one of the formats
-a sname:VkImageView created from the image can: have (see
-<<resources-image-views,Image Views>> for more detail).
-====
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-
-[[resources-image-creation-limits]]
-.Image Creation Limits
-****
-Valid values for some image creation parameters are limited by a numerical
-upper bound or by inclusion in a bitset.
-For example, slink:VkImageCreateInfo::pname:arrayLayers is limited by
-pname:imageCreateMaxArrayLayers, defined below; and
-slink:VkImageCreateInfo::pname:samples is limited by
-pname:imageCreateSampleCounts, also defined below.
-
-Several limiting values are defined below, as well as assisting values from
-which the limiting values are derived.
-The limiting values are referenced by the relevant valid usage statements of
-slink:VkImageCreateInfo.
-
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * Let `uint64_t imageCreateDrmFormatModifiers[]` be the set of
-    <<glossary-drm-format-modifier,Linux DRM format modifiers>> that the
-    resultant image may: have.
-  ** If pname:tiling is not ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,
-     then pname:imageCreateDrmFormatModifiers is empty.
-  ** If slink:VkImageCreateInfo::pname:pNext contains
-     slink:VkImageDrmFormatModifierExplicitCreateInfoEXT, then
-     pname:imageCreateDrmFormatModifiers contains exactly one modifier,
-     slink:VkImageDrmFormatModifierExplicitCreateInfoEXT::pname:drmFormatModifier.
-  ** If slink:VkImageCreateInfo::pname:pNext contains
-     slink:VkImageDrmFormatModifierListCreateInfoEXT, then
-     pname:imageCreateDrmFormatModifiers contains the entire array
-     slink:VkImageDrmFormatModifierListCreateInfoEXT::pname:pDrmFormatModifiers.
-endif::VK_EXT_image_drm_format_modifier[]
-
-  * Let `VkBool32 imageCreateMaybeLinear` indicate if the resultant image
-    may be <<glossary-linear-resource,linear>>.
-ifndef::VK_EXT_image_drm_format_modifier[]
-    (The definition below is trivial because certain extensions are disabled
-    in this build of the specification).
-endif::VK_EXT_image_drm_format_modifier[]
-  ** If pname:tiling is ename:VK_IMAGE_TILING_LINEAR, then
-     pname:imageCreateMaybeLinear is ename:VK_TRUE.
-  ** If pname:tiling is ename:VK_IMAGE_TILING_OPTIMAL, then
-     pname:imageCreateMaybeLinear is ename:VK_FALSE.
-ifdef::VK_EXT_image_drm_format_modifier[]
-  ** If pname:tiling is ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then
-     pname:imageCreateMaybeLinear is ename:VK_TRUE if and only if
-     pname:imageCreateDrmFormatModifiers contains
-     etext:DRM_FORMAT_MOD_LINEAR.
-endif::VK_EXT_image_drm_format_modifier[]
-
-  * Let `VkFormatFeatureFlags imageCreateFormatFeatures` be the set of valid
-    _format features_ available during image creation.
-  ** If pname:tiling is ename:VK_IMAGE_TILING_LINEAR, then
-     pname:imageCreateFormatFeatures is the value of
-     slink:VkFormatProperties::pname:linearTilingFeatures found by calling
-     flink:vkGetPhysicalDeviceFormatProperties with parameter pname:format
-     equal to slink:VkImageCreateInfo::pname:format.
-  ** If pname:tiling is ename:VK_IMAGE_TILING_OPTIMAL,
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-     and if the pname:pNext chain includes no slink:VkExternalFormatANDROID
-     structure with non-zero pname:externalFormat,
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-     then pname:imageCreateFormatFeatures is the value of
-     slink:VkFormatProperties::pname:optimalTilingFeatures found by calling
-     flink:vkGetPhysicalDeviceFormatProperties with parameter pname:format
-     equal to slink:VkImageCreateInfo::pname:format.
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  ** If pname:tiling is ename:VK_IMAGE_TILING_OPTIMAL, and if the
-     pname:pNext chain includes a slink:VkExternalFormatANDROID structure
-     with non-zero pname:externalFormat, then
-     pname:imageCreateFormatFeatures is the value of
-     slink:VkAndroidHardwareBufferFormatPropertiesANDROID::pname:formatFeatures
-     obtained by flink:vkGetAndroidHardwareBufferPropertiesANDROID with a
-     matching pname:externalFormat value.
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_FUCHSIA_buffer_collection[]
-  ** If the pname:pNext chain includes a
-     slink:VkBufferCollectionImageCreateInfoFUCHSIA structure, then
-     pname:imageCreateFormatFeatures is the value of
-     slink:VkBufferCollectionPropertiesFUCHSIA::pname:formatFeatures found
-     by calling flink:vkGetBufferCollectionPropertiesFUCHSIA with a
-     parameter pname:collection equal to
-     slink:VkBufferCollectionImageCreateInfoFUCHSIA::pname:collection
-endif::VK_FUCHSIA_buffer_collection[]
-ifdef::VK_EXT_image_drm_format_modifier[]
-  ** If pname:tiling is ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then
-     the value of pname:imageCreateFormatFeatures is found by calling
-     flink:vkGetPhysicalDeviceFormatProperties2 with
-     slink:VkImageFormatProperties::pname:format equal to
-     slink:VkImageCreateInfo::pname:format and with
-     slink:VkDrmFormatModifierPropertiesListEXT chained into
-     slink:VkImageFormatProperties2; by collecting all members of the
-     returned array
-     slink:VkDrmFormatModifierPropertiesListEXT::pname:pDrmFormatModifierProperties
-     whose pname:drmFormatModifier belongs to
-     pname:imageCreateDrmFormatModifiers; and by taking the bitwise
-     intersection, over the collected array members, of
-     pname:drmFormatModifierTilingFeatures.
-     (The resultant pname:imageCreateFormatFeatures may: be empty).
-endif::VK_EXT_image_drm_format_modifier[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * Let `VkImageFormatProperties2 imageCreateImageFormatPropertiesList[]` be
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-    defined as follows.
-  ** If slink:VkImageCreateInfo::pname:pNext contains no
-     slink:VkExternalFormatANDROID structure with non-zero
-     pname:externalFormat, then pname:imageCreateImageFormatPropertiesList
-     is
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-     the list of structures obtained by calling
-     flink:vkGetPhysicalDeviceImageFormatProperties2, possibly multiple
-     times, as follows:
-  *** The parameters slink:VkPhysicalDeviceImageFormatInfo2::pname:format,
-      pname:imageType, pname:tiling, pname:usage, and pname:flags must: be
-      equal to those in slink:VkImageCreateInfo.
-  *** If slink:VkImageCreateInfo::pname:pNext contains a
-      slink:VkExternalMemoryImageCreateInfo structure whose
-      pname:handleTypes is not `0`, then
-      slink:VkPhysicalDeviceImageFormatInfo2::pname:pNext must: contain a
-      slink:VkPhysicalDeviceExternalImageFormatInfo structure whose
-      pname:handleType is not `0`; and
-      flink:vkGetPhysicalDeviceImageFormatProperties2 must: be called for
-      each handle type in
-      slink:VkExternalMemoryImageCreateInfo::pname:handleTypes, successively
-      setting
-      slink:VkPhysicalDeviceExternalImageFormatInfo::pname:handleType on
-      each call.
-  *** If slink:VkImageCreateInfo::pname:pNext contains no
-      slink:VkExternalMemoryImageCreateInfo structure, or contains a
-      structure whose pname:handleTypes is `0`, then
-      slink:VkPhysicalDeviceImageFormatInfo2::pname:pNext must: either
-      contain no slink:VkPhysicalDeviceExternalImageFormatInfo structure, or
-      contain a structure whose pname:handleType is `0`.
-ifdef::VK_EXT_image_drm_format_modifier[]
-  *** If pname:tiling is ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then
-      slink:VkPhysicalDeviceImageFormatInfo2::pname:pNext must: contain a
-      slink:VkPhysicalDeviceImageDrmFormatModifierInfoEXT structure where
-      pname:sharingMode is equal to
-      slink:VkImageCreateInfo::pname:sharingMode; and, if pname:sharingMode
-      is ename:VK_SHARING_MODE_CONCURRENT, then pname:queueFamilyIndexCount
-      and pname:pQueueFamilyIndices must: be equal to those in
-      slink:VkImageCreateInfo; and, if pname:flags contains
-      ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, then the
-      slink:VkImageFormatListCreateInfo structure included in the
-      pname:pNext chain of slink:VkPhysicalDeviceImageFormatInfo2 must: be
-      equivalent to the one included in the pname:pNext chain of
-      slink:VkImageCreateInfo; and
-      flink:vkGetPhysicalDeviceImageFormatProperties2 must: be called for
-      each modifier in pname:imageCreateDrmFormatModifiers, successively
-      setting
-      slink:VkPhysicalDeviceImageDrmFormatModifierInfoEXT::pname:drmFormatModifier
-      on each call.
-  *** If pname:tiling is not ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,
-      then slink:VkPhysicalDeviceImageFormatInfo2::pname:pNext must: contain
-      no slink:VkPhysicalDeviceImageDrmFormatModifierInfoEXT structure.
-endif::VK_EXT_image_drm_format_modifier[]
-  *** If any call to flink:vkGetPhysicalDeviceImageFormatProperties2 returns
-      an error, then pname:imageCreateImageFormatPropertiesList is defined
-      to be the empty list.
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  ** If slink:VkImageCreateInfo::pname:pNext contains a
-     slink:VkExternalFormatANDROID structure with non-zero
-     pname:externalFormat, then pname:imageCreateImageFormatPropertiesList
-     contains a single element where:
-  *** sname:VkImageFormatProperties::pname:maxMipLevels is
-      [eq]#{lfloor}log~2~(max(pname:extent.width, pname:extent.height,
-      pname:extent.depth)){rfloor} {plus} 1#.
-  *** sname:VkImageFormatProperties::pname:maxArrayLayers is
-      slink:VkPhysicalDeviceLimits::pname:maxImageArrayLayers.
-  *** Each component of sname:VkImageFormatProperties::pname:maxExtent is
-      slink:VkPhysicalDeviceLimits::pname:maxImageDimension2D.
-  *** sname:VkImageFormatProperties::pname:sampleCounts contains exactly
-      ename:VK_SAMPLE_COUNT_1_BIT.
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-  * Let `uint32_t imageCreateMaxMipLevels` be
-ifndef::VK_VERSION_1_1,VK_KHR_external_memory[]
-    the value of slink:VkImageFormatProperties::pname:maxMipLevels found by
-    calling flink:vkGetPhysicalDeviceImageFormatProperties with parameters
-    pname:format, pname:imageType, pname:tiling, pname:usage, and
-    pname:flags equal to those in slink:VkImageCreateInfo.
-    If flink:vkGetPhysicalDeviceFormatProperties returns an error, then the
-    value of pname:imageCreateMaxMipLevels is undefined:.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-    the minimum value of slink:VkImageFormatProperties::pname:maxMipLevels
-    in pname:imageCreateImageFormatPropertiesList.
-    The value is undefined: if pname:imageCreateImageFormatPropertiesList is
-    empty.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-  * Let `uint32_t imageCreateMaxArrayLayers` be
-ifndef::VK_VERSION_1_1,VK_KHR_external_memory[]
-    defined analogously to pname:imageCreateMaxMipLevels.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-    the minimum value of slink:VkImageFormatProperties::pname:maxArrayLayers
-    in pname:imageCreateImageFormatPropertiesList.
-    The value is undefined: if pname:imageCreateImageFormatPropertiesList is
-    empty.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-  * Let `VkExtent3D imageCreateMaxExtent` be
-ifndef::VK_VERSION_1_1,VK_KHR_external_memory[]
-    defined analogously to pname:imageCreateMaxMipLevels.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-    the component-wise minimum over all
-    slink:VkImageFormatProperties::pname:maxExtent values in
-    pname:imageCreateImageFormatPropertiesList.
-    The value is undefined: if pname:imageCreateImageFormatPropertiesList is
-    empty.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-  * Let `VkSampleCountFlags imageCreateSampleCounts` be
-ifndef::VK_VERSION_1_1,VK_KHR_external_memory[]
-    defined analogously to pname:imageCreateMaxMipLevels.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-    the intersection of each
-    slink:VkImageFormatProperties::pname:sampleCounts in
-    pname:imageCreateImageFormatPropertiesList.
-    The value is undefined: if pname:imageCreateImageFormatPropertiesList is
-    empty.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-****
-
-.Valid Usage
-****
-  * [[VUID-VkImageCreateInfo-imageCreateMaxMipLevels-02251]]
-    Each of the following values (as described in
-    <<resources-image-creation-limits,Image Creation Limits>>) must: not be
-    undefined: : pname:imageCreateMaxMipLevels,
-    pname:imageCreateMaxArrayLayers, pname:imageCreateMaxExtent, and
-    pname:imageCreateSampleCounts
-  * [[VUID-VkImageCreateInfo-sharingMode-00941]]
-    If pname:sharingMode is ename:VK_SHARING_MODE_CONCURRENT,
-    pname:pQueueFamilyIndices must: be a valid pointer to an array of
-    pname:queueFamilyIndexCount code:uint32_t values
-  * [[VUID-VkImageCreateInfo-sharingMode-00942]]
-    If pname:sharingMode is ename:VK_SHARING_MODE_CONCURRENT,
-    pname:queueFamilyIndexCount must: be greater than `1`
-ifndef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-  * [[VUID-VkImageCreateInfo-sharingMode-01392]]
-    If pname:sharingMode is ename:VK_SHARING_MODE_CONCURRENT, each element
-    of pname:pQueueFamilyIndices must: be unique and must: be less than
-    pname:pQueueFamilyPropertyCount returned by
-    flink:vkGetPhysicalDeviceQueueFamilyProperties for the
-    pname:physicalDevice that was used to create pname:device
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-  * [[VUID-VkImageCreateInfo-sharingMode-01420]]
-    If pname:sharingMode is ename:VK_SHARING_MODE_CONCURRENT, each element
-    of pname:pQueueFamilyIndices must: be unique and must: be less than
-    pname:pQueueFamilyPropertyCount returned by either
-    flink:vkGetPhysicalDeviceQueueFamilyProperties or
-    flink:vkGetPhysicalDeviceQueueFamilyProperties2 for the
-    pname:physicalDevice that was used to create pname:device
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-ifndef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkImageCreateInfo-format-00943]]
-    pname:format must: not be ename:VK_FORMAT_UNDEFINED
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkImageCreateInfo-pNext-01974]]
-    If the pname:pNext chain includes a slink:VkExternalFormatANDROID
-    structure, and its pname:externalFormat member is non-zero the
-    pname:format must: be ename:VK_FORMAT_UNDEFINED
-  * [[VUID-VkImageCreateInfo-pNext-01975]]
-    If the pname:pNext chain does not include a
-    slink:VkExternalFormatANDROID structure, or does and its
-    pname:externalFormat member is `0`, the pname:format must: not be
-    ename:VK_FORMAT_UNDEFINED
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkImageCreateInfo-extent-00944]]
-    pname:extent.width must: be greater than `0`
-  * [[VUID-VkImageCreateInfo-extent-00945]]
-    pname:extent.height must: be greater than `0`
-  * [[VUID-VkImageCreateInfo-extent-00946]]
-    pname:extent.depth must: be greater than `0`
-  * [[VUID-VkImageCreateInfo-mipLevels-00947]]
-    pname:mipLevels must: be greater than `0`
-  * [[VUID-VkImageCreateInfo-arrayLayers-00948]]
-    pname:arrayLayers must: be greater than `0`
-  * [[VUID-VkImageCreateInfo-flags-00949]]
-    If pname:flags contains ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT,
-    pname:imageType must: be ename:VK_IMAGE_TYPE_2D
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-VkImageCreateInfo-flags-02557]]
-    If pname:flags contains
-    ename:VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, pname:imageType must:
-    be ename:VK_IMAGE_TYPE_2D
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-VkImageCreateInfo-flags-00950]]
-    If pname:flags contains ename:VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT,
-    pname:imageType must: be ename:VK_IMAGE_TYPE_3D
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-VkImageCreateInfo-extent-02252]]
-    pname:extent.width must: be less than or equal to
-    pname:imageCreateMaxExtent.width (as defined in
-    <<resources-image-creation-limits,Image Creation Limits>>)
-  * [[VUID-VkImageCreateInfo-extent-02253]]
-    pname:extent.height must: be less than or equal to
-    pname:imageCreateMaxExtent.height (as defined in
-    <<resources-image-creation-limits,Image Creation Limits>>)
-  * [[VUID-VkImageCreateInfo-extent-02254]]
-    pname:extent.depth must: be less than or equal to
-    pname:imageCreateMaxExtent.depth (as defined in
-    <<resources-image-creation-limits,Image Creation Limits>>)
-  * [[VUID-VkImageCreateInfo-imageType-00954]]
-    If pname:imageType is ename:VK_IMAGE_TYPE_2D and pname:flags contains
-    ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, pname:extent.width and
-    pname:extent.height must: be equal and pname:arrayLayers must: be
-    greater than or equal to 6
-  * [[VUID-VkImageCreateInfo-imageType-00956]]
-    If pname:imageType is ename:VK_IMAGE_TYPE_1D, both pname:extent.height
-    and pname:extent.depth must: be `1`
-  * [[VUID-VkImageCreateInfo-imageType-00957]]
-    If pname:imageType is ename:VK_IMAGE_TYPE_2D, pname:extent.depth must:
-    be `1`
-  * [[VUID-VkImageCreateInfo-mipLevels-00958]]
-    pname:mipLevels must: be less than or equal to the number of levels in
-    the complete mipmap chain based on [eq]#pname:extent.width#,
-    [eq]#pname:extent.height#, and [eq]#pname:extent.depth#
-  * [[VUID-VkImageCreateInfo-mipLevels-02255]]
-    pname:mipLevels must: be less than or equal to
-    pname:imageCreateMaxMipLevels (as defined in
-    <<resources-image-creation-limits,Image Creation Limits>>)
-  * [[VUID-VkImageCreateInfo-arrayLayers-02256]]
-    pname:arrayLayers must: be less than or equal to
-    pname:imageCreateMaxArrayLayers (as defined in
-    <<resources-image-creation-limits,Image Creation Limits>>)
-  * [[VUID-VkImageCreateInfo-imageType-00961]]
-    If pname:imageType is ename:VK_IMAGE_TYPE_3D, pname:arrayLayers must: be
-    `1`
-  * [[VUID-VkImageCreateInfo-samples-02257]]
-    If pname:samples is not ename:VK_SAMPLE_COUNT_1_BIT, then
-    pname:imageType must: be ename:VK_IMAGE_TYPE_2D, pname:flags must: not
-    contain ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, pname:mipLevels must:
-    be equal to `1`, and pname:imageCreateMaybeLinear (as defined in
-    <<resources-image-creation-limits,Image Creation Limits>>) must: be
-    ename:VK_FALSE,
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-VkImageCreateInfo-samples-02558]]
-    If pname:samples is not ename:VK_SAMPLE_COUNT_1_BIT, pname:usage must:
-    not contain ename:VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-  * [[VUID-VkImageCreateInfo-usage-00963]]
-    If pname:usage includes ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT,
-    then bits other than ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, and
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT must: not be set
-  * [[VUID-VkImageCreateInfo-usage-00964]]
-    If pname:usage includes ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
-    ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, or
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, pname:extent.width must: be
-    less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxFramebufferWidth
-  * [[VUID-VkImageCreateInfo-usage-00965]]
-    If pname:usage includes ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
-    ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, or
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, pname:extent.height must: be
-    less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxFramebufferHeight
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-VkImageCreateInfo-usage-02559]]
-    If pname:usage includes
-    ename:VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, pname:extent.width
-    must: be less than or equal to
-    latexmath:[\left\lceil{\frac{maxFramebufferWidth}{minFragmentDensityTexelSize_{width}}}\right\rceil]
-  * [[VUID-VkImageCreateInfo-usage-02560]]
-    If pname:usage includes
-    ename:VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, pname:extent.height
-    must: be less than or equal to
-    latexmath:[\left\lceil{\frac{maxFramebufferHeight}{minFragmentDensityTexelSize_{height}}}\right\rceil]
-endif::VK_EXT_fragment_density_map[]
-  * [[VUID-VkImageCreateInfo-usage-00966]]
-    If pname:usage includes ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT,
-    pname:usage must: also contain at least one of
-    ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, or
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
-  * [[VUID-VkImageCreateInfo-samples-02258]]
-    pname:samples must: be a bit value that is set in
-    pname:imageCreateSampleCounts (as defined in
-    <<resources-image-creation-limits,Image Creation Limits>>)
-  * [[VUID-VkImageCreateInfo-usage-00968]]
-    If the <<features-shaderStorageImageMultisample,multisampled storage
-    images>> feature is not enabled, and pname:usage contains
-    ename:VK_IMAGE_USAGE_STORAGE_BIT, pname:samples must: be
-    ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-VkImageCreateInfo-flags-00969]]
-    If the <<features-sparseBinding,sparse bindings>> feature is not
-    enabled, pname:flags must: not contain
-    ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT
-  * [[VUID-VkImageCreateInfo-flags-01924]]
-    If the <<features-sparseResidencyAliased,sparse aliased residency>>
-    feature is not enabled, pname:flags must: not contain
-    ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT
-  * [[VUID-VkImageCreateInfo-tiling-04121]]
-    If pname:tiling is ename:VK_IMAGE_TILING_LINEAR, pname:flags must: not
-    contain ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-  * [[VUID-VkImageCreateInfo-imageType-00970]]
-    If pname:imageType is ename:VK_IMAGE_TYPE_1D, pname:flags must: not
-    contain ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-  * [[VUID-VkImageCreateInfo-imageType-00971]]
-    If the <<features-sparseResidencyImage2D,sparse residency for 2D
-    images>> feature is not enabled, and pname:imageType is
-    ename:VK_IMAGE_TYPE_2D, pname:flags must: not contain
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-  * [[VUID-VkImageCreateInfo-imageType-00972]]
-    If the <<features-sparseResidencyImage3D,sparse residency for 3D
-    images>> feature is not enabled, and pname:imageType is
-    ename:VK_IMAGE_TYPE_3D, pname:flags must: not contain
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-  * [[VUID-VkImageCreateInfo-imageType-00973]]
-    If the <<features-sparseResidency2Samples,sparse residency for images
-    with 2 samples>> feature is not enabled, pname:imageType is
-    ename:VK_IMAGE_TYPE_2D, and pname:samples is
-    ename:VK_SAMPLE_COUNT_2_BIT, pname:flags must: not contain
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-  * [[VUID-VkImageCreateInfo-imageType-00974]]
-    If the <<features-sparseResidency4Samples,sparse residency for images
-    with 4 samples>> feature is not enabled, pname:imageType is
-    ename:VK_IMAGE_TYPE_2D, and pname:samples is
-    ename:VK_SAMPLE_COUNT_4_BIT, pname:flags must: not contain
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-  * [[VUID-VkImageCreateInfo-imageType-00975]]
-    If the <<features-sparseResidency8Samples,sparse residency for images
-    with 8 samples>> feature is not enabled, pname:imageType is
-    ename:VK_IMAGE_TYPE_2D, and pname:samples is
-    ename:VK_SAMPLE_COUNT_8_BIT, pname:flags must: not contain
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-  * [[VUID-VkImageCreateInfo-imageType-00976]]
-    If the <<features-sparseResidency16Samples,sparse residency for images
-    with 16 samples>> feature is not enabled, pname:imageType is
-    ename:VK_IMAGE_TYPE_2D, and pname:samples is
-    ename:VK_SAMPLE_COUNT_16_BIT, pname:flags must: not contain
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-  * [[VUID-VkImageCreateInfo-flags-00987]]
-    If pname:flags contains ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or
-    ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must: also contain
-    ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT
-  * [[VUID-VkImageCreateInfo-None-01925]]
-    If any of the bits ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT,
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or
-    ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT are set,
-    ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT must: not also be set
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-VkImageCreateInfo-flags-01890]]
-    If the protected memory feature is not enabled, pname:flags must: not
-    contain ename:VK_IMAGE_CREATE_PROTECTED_BIT
-  * [[VUID-VkImageCreateInfo-None-01891]]
-    If any of the bits ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT,
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or
-    ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT are set,
-    ename:VK_IMAGE_CREATE_PROTECTED_BIT must: not also be set
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifdef::VK_NV_external_memory[]
-  * [[VUID-VkImageCreateInfo-pNext-00988]]
-    If the pname:pNext chain includes a
-    slink:VkExternalMemoryImageCreateInfoNV structure, it must: not contain
-    a slink:VkExternalMemoryImageCreateInfo structure
-endif::VK_NV_external_memory[]
-  * [[VUID-VkImageCreateInfo-pNext-00990]]
-    If the pname:pNext chain includes a
-    slink:VkExternalMemoryImageCreateInfo structure, its pname:handleTypes
-    member must: only contain bits that are also in
-    slink:VkExternalImageFormatProperties::pname:externalMemoryProperties.compatibleHandleTypes,
-    as returned by flink:vkGetPhysicalDeviceImageFormatProperties2 with
-    pname:format, pname:imageType, pname:tiling, pname:usage, and
-    pname:flags equal to those in this structure, and with a
-    slink:VkPhysicalDeviceExternalImageFormatInfo structure included in the
-    pname:pNext chain, with a pname:handleType equal to any one of the
-    handle types specified in
-    slink:VkExternalMemoryImageCreateInfo::pname:handleTypes
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifdef::VK_NV_external_memory+VK_NV_external_memory_capabilities[]
-  * [[VUID-VkImageCreateInfo-pNext-00991]]
-    If the pname:pNext chain includes a
-    slink:VkExternalMemoryImageCreateInfoNV structure, its pname:handleTypes
-    member must: only contain bits that are also in
-    slink:VkExternalImageFormatPropertiesNV::pname:externalMemoryProperties.compatibleHandleTypes,
-    as returned by flink:vkGetPhysicalDeviceExternalImageFormatPropertiesNV
-    with pname:format, pname:imageType, pname:tiling, pname:usage, and
-    pname:flags equal to those in this structure, and with
-    pname:externalHandleType equal to any one of the handle types specified
-    in slink:VkExternalMemoryImageCreateInfoNV::pname:handleTypes
-endif::VK_NV_external_memory+VK_NV_external_memory_capabilities[]
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkImageCreateInfo-physicalDeviceCount-01421]]
-    If the logical device was created with
-    slink:VkDeviceGroupDeviceCreateInfo::pname:physicalDeviceCount equal to
-    1, pname:flags must: not contain
-    ename:VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT
-  * [[VUID-VkImageCreateInfo-flags-02259]]
-    If pname:flags contains
-    ename:VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT, then
-    pname:mipLevels must: be one, pname:arrayLayers must: be one,
-    pname:imageType must: be ename:VK_IMAGE_TYPE_2D.
-    and pname:imageCreateMaybeLinear (as defined in
-    <<resources-image-creation-limits,Image Creation Limits>>) must: be
-    ename:VK_FALSE
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-  * [[VUID-VkImageCreateInfo-flags-01572]]
-    If pname:flags contains
-    ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, then pname:format
-    must: be a <<compressed_image_formats,compressed image format>>
-  * [[VUID-VkImageCreateInfo-flags-01573]]
-    If pname:flags contains
-    ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, then pname:flags
-    must: also contain ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-  * [[VUID-VkImageCreateInfo-initialLayout-00993]]
-    pname:initialLayout must: be ename:VK_IMAGE_LAYOUT_UNDEFINED or
-    ename:VK_IMAGE_LAYOUT_PREINITIALIZED
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory,VK_NV_external_memory[]
-  * [[VUID-VkImageCreateInfo-pNext-01443]]
-    If the pname:pNext chain includes a
-    slink:VkExternalMemoryImageCreateInfo or
-    sname:VkExternalMemoryImageCreateInfoNV structure whose
-    pname:handleTypes member is not `0`, pname:initialLayout must: be
-    ename:VK_IMAGE_LAYOUT_UNDEFINED
-endif::VK_VERSION_1_1,VK_KHR_external_memory,VK_NV_external_memory[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkImageCreateInfo-format-06410]]
-    If the image pname:format is one of the
-    <<formats-requiring-sampler-ycbcr-conversion, formats that require a
-    sampler Y'C~B~C~R~ conversion>>, pname:mipLevels must: be 1
-  * [[VUID-VkImageCreateInfo-format-06411]]
-    If the image pname:format is one of the
-    <<formats-requiring-sampler-ycbcr-conversion, formats that require a
-    sampler Y'C~B~C~R~ conversion>>, pname:samples must: be
-    ename:VK_SAMPLE_COUNT_1_BIT
-  * [[VUID-VkImageCreateInfo-format-06412]]
-    If the image pname:format is one of the
-    <<formats-requiring-sampler-ycbcr-conversion, formats that require a
-    sampler Y'C~B~C~R~ conversion>>, pname:imageType must: be
-    ename:VK_IMAGE_TYPE_2D
-ifdef::VK_EXT_ycbcr_image_arrays[]
-  * [[VUID-VkImageCreateInfo-format-06413]]
-    If the image pname:format is one of the
-    <<formats-requiring-sampler-ycbcr-conversion, formats that require a
-    sampler Y'C~B~C~R~ conversion>>, and the pname:ycbcrImageArrays feature
-    is not enabled, pname:arrayLayers must: be 1
-endif::VK_EXT_ycbcr_image_arrays[]
-ifndef::VK_EXT_ycbcr_image_arrays[]
-  * [[VUID-VkImageCreateInfo-format-06414]]
-    If the image pname:format is one of the
-    <<formats-requiring-sampler-ycbcr-conversion, formats that require a
-    sampler Y'C~B~C~R~ conversion>>, pname:arrayLayers must: be 1
-endif::VK_EXT_ycbcr_image_arrays[]
-  * [[VUID-VkImageCreateInfo-imageCreateFormatFeatures-02260]]
-    If pname:format is a _multi-planar_ format, and if
-    pname:imageCreateFormatFeatures (as defined in
-    <<resources-image-creation-limits,Image Creation Limits>>) does not
-    contain ename:VK_FORMAT_FEATURE_DISJOINT_BIT, then pname:flags must: not
-    contain ename:VK_IMAGE_CREATE_DISJOINT_BIT
-  * [[VUID-VkImageCreateInfo-format-01577]]
-    If pname:format is not a _multi-planar_ format, and pname:flags does not
-    include ename:VK_IMAGE_CREATE_ALIAS_BIT, pname:flags must: not contain
-    ename:VK_IMAGE_CREATE_DISJOINT_BIT
-  * [[VUID-VkImageCreateInfo-format-04712]]
-    If pname:format has a code:_422 or code:_420 suffix, pname:width must:
-    be a multiple of 2
-  * [[VUID-VkImageCreateInfo-format-04713]]
-    If pname:format has a code:_420 suffix, pname:height must: be a multiple
-    of 2
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkImageCreateInfo-tiling-02261]]
-    If pname:tiling is ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then
-    the pname:pNext chain must: include exactly one of
-    slink:VkImageDrmFormatModifierListCreateInfoEXT or
-    slink:VkImageDrmFormatModifierExplicitCreateInfoEXT structures
-  * [[VUID-VkImageCreateInfo-pNext-02262]]
-    If the pname:pNext chain includes a
-    slink:VkImageDrmFormatModifierListCreateInfoEXT or
-    slink:VkImageDrmFormatModifierExplicitCreateInfoEXT structure, then
-    pname:tiling must: be ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT
-  * [[VUID-VkImageCreateInfo-tiling-02353]]
-    If pname:tiling is ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT and
-    pname:flags contains ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, then the
-    pname:pNext chain must: include a slink:VkImageFormatListCreateInfo
-    structure with non-zero pname:viewFormatCount
-endif::VK_EXT_image_drm_format_modifier[]
-ifdef::VK_EXT_sample_locations[]
-  * [[VUID-VkImageCreateInfo-flags-01533]]
-    If pname:flags contains
-    ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT
-    pname:format must: be a depth or depth/stencil format
-endif::VK_EXT_sample_locations[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkImageCreateInfo-pNext-02393]]
-    If the pname:pNext chain includes a
-    slink:VkExternalMemoryImageCreateInfo structure whose pname:handleTypes
-    member includes
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID,
-    pname:imageType must: be ename:VK_IMAGE_TYPE_2D
-  * [[VUID-VkImageCreateInfo-pNext-02394]]
-    If the pname:pNext chain includes a
-    slink:VkExternalMemoryImageCreateInfo structure whose pname:handleTypes
-    member includes
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID,
-    pname:mipLevels must: either be `1` or equal to the number of levels in
-    the complete mipmap chain based on [eq]#pname:extent.width#,
-    [eq]#pname:extent.height#, and [eq]#pname:extent.depth#
-  * [[VUID-VkImageCreateInfo-pNext-02396]]
-    If the pname:pNext chain includes a slink:VkExternalFormatANDROID
-    structure whose pname:externalFormat member is not `0`, pname:flags
-    must: not include ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
-  * [[VUID-VkImageCreateInfo-pNext-02397]]
-    If the pname:pNext chain includes a slink:VkExternalFormatANDROID
-    structure whose pname:externalFormat member is not `0`, pname:usage
-    must: not include any usages except ename:VK_IMAGE_USAGE_SAMPLED_BIT
-  * [[VUID-VkImageCreateInfo-pNext-02398]]
-    If the pname:pNext chain includes a slink:VkExternalFormatANDROID
-    structure whose pname:externalFormat member is not `0`, pname:tiling
-    must: be ename:VK_IMAGE_TILING_OPTIMAL
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-  * [[VUID-VkImageCreateInfo-format-02795]]
-    If pname:format is a depth-stencil format, pname:usage includes
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, and the pname:pNext
-    chain includes a slink:VkImageStencilUsageCreateInfo structure, then its
-    slink:VkImageStencilUsageCreateInfo::pname:stencilUsage member must:
-    also include ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkImageCreateInfo-format-02796]]
-    If pname:format is a depth-stencil format, pname:usage does not include
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, and the pname:pNext
-    chain includes a slink:VkImageStencilUsageCreateInfo structure, then its
-    slink:VkImageStencilUsageCreateInfo::pname:stencilUsage member must:
-    also not include ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkImageCreateInfo-format-02797]]
-    If pname:format is a depth-stencil format, pname:usage includes
-    ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, and the pname:pNext chain
-    includes a slink:VkImageStencilUsageCreateInfo structure, then its
-    slink:VkImageStencilUsageCreateInfo::pname:stencilUsage member must:
-    also include ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
-  * [[VUID-VkImageCreateInfo-format-02798]]
-    If pname:format is a depth-stencil format, pname:usage does not include
-    ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, and the pname:pNext chain
-    includes a slink:VkImageStencilUsageCreateInfo structure, then its
-    slink:VkImageStencilUsageCreateInfo::pname:stencilUsage member must:
-    also not include ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
-  * [[VUID-VkImageCreateInfo-Format-02536]]
-    If pname:Format is a depth-stencil format and the pname:pNext chain
-    includes a slink:VkImageStencilUsageCreateInfo structure with its
-    pname:stencilUsage member including
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, pname:extent.width must: be
-    less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxFramebufferWidth
-  * [[VUID-VkImageCreateInfo-format-02537]]
-    If pname:format is a depth-stencil format and the pname:pNext chain
-    includes a slink:VkImageStencilUsageCreateInfo structure with its
-    pname:stencilUsage member including
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, pname:extent.height must: be
-    less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxFramebufferHeight
-  * [[VUID-VkImageCreateInfo-format-02538]]
-    If the <<features-shaderStorageImageMultisample,multisampled storage
-    images>> feature is not enabled, pname:format is a depth-stencil format
-    and the pname:pNext chain includes a slink:VkImageStencilUsageCreateInfo
-    structure with its pname:stencilUsage including
-    ename:VK_IMAGE_USAGE_STORAGE_BIT, pname:samples must: be
-    ename:VK_SAMPLE_COUNT_1_BIT
-endif::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-ifdef::VK_NV_corner_sampled_image[]
-  * [[VUID-VkImageCreateInfo-flags-02050]]
-    If pname:flags contains ename:VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV,
-    pname:imageType must: be ename:VK_IMAGE_TYPE_2D or
-    ename:VK_IMAGE_TYPE_3D
-  * [[VUID-VkImageCreateInfo-flags-02051]]
-    If pname:flags contains ename:VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV, it
-    must: not contain ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT and the
-    pname:format must: not be a depth/stencil format
-  * [[VUID-VkImageCreateInfo-flags-02052]]
-    If pname:flags contains ename:VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV and
-    pname:imageType is ename:VK_IMAGE_TYPE_2D, pname:extent.width and
-    pname:extent.height must: be greater than `1`
-  * [[VUID-VkImageCreateInfo-flags-02053]]
-    If pname:flags contains ename:VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV and
-    pname:imageType is ename:VK_IMAGE_TYPE_3D, pname:extent.width,
-    pname:extent.height, and pname:extent.depth must: be greater than `1`
-endif::VK_NV_corner_sampled_image[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  * [[VUID-VkImageCreateInfo-imageType-02082]]
-    If pname:usage includes
-    ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,
-    pname:imageType must: be ename:VK_IMAGE_TYPE_2D
-  * [[VUID-VkImageCreateInfo-samples-02083]]
-    If pname:usage includes
-    ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,
-    pname:samples must: be ename:VK_SAMPLE_COUNT_1_BIT
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-ifdef::VK_NV_shading_rate_image[]
-  * [[VUID-VkImageCreateInfo-tiling-02084]]
-    If pname:usage includes ename:VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV,
-    pname:tiling must: be ename:VK_IMAGE_TILING_OPTIMAL
-endif::VK_NV_shading_rate_image[]
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-VkImageCreateInfo-flags-02565]]
-    If pname:flags contains ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT,
-    pname:tiling must: be ename:VK_IMAGE_TILING_OPTIMAL
-  * [[VUID-VkImageCreateInfo-flags-02566]]
-    If pname:flags contains ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT,
-    pname:imageType must: be ename:VK_IMAGE_TYPE_2D
-  * [[VUID-VkImageCreateInfo-flags-02567]]
-    If pname:flags contains ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT,
-    pname:flags must: not contain ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
-  * [[VUID-VkImageCreateInfo-flags-02568]]
-    If pname:flags contains ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT,
-    pname:mipLevels must: be `1`
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_HUAWEI_invocation_mask[]
-  * [[VUID-VkImageCreateInfo-usage-04992]]
-    If pname:usage includes ename:VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI,
-    pname:tiling must: be ename:VK_IMAGE_TILING_LINEAR
-endif::VK_HUAWEI_invocation_mask[]
-ifdef::VK_KHR_portability_subset[]
-  * [[VUID-VkImageCreateInfo-imageView2DOn3DImage-04459]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:imageView2DOn3DImage
-    is ename:VK_FALSE, pname:flags must: not contain
-    ename:VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT
-  * [[VUID-VkImageCreateInfo-multisampleArrayImage-04460]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:multisampleArrayImage
-    is ename:VK_FALSE, and pname:samples is not ename:VK_SAMPLE_COUNT_1_BIT,
-    then pname:arrayLayers must: be `1`
-endif::VK_KHR_portability_subset[]
-ifdef::VK_VERSION_1_2,VK_KHR_image_format_list[]
-  * [[VUID-VkImageCreateInfo-pNext-04737]]
-    If a slink:VkImageFormatListCreateInfo structure was included in the
-    pname:pNext chain and
-    slink:VkImageFormatListCreateInfo::pname:viewFormatCount is not zero,
-    then all of the formats in
-    slink:VkImageFormatListCreateInfo::pname:pViewFormats must: be
-    compatible with the pname:format as described in the
-    <<formats-compatibility,compatibility table>>
-  * [[VUID-VkImageCreateInfo-flags-04738]]
-    If pname:flags does not contain ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
-    and the pname:pNext chain includes a slink:VkImageFormatListCreateInfo
-    structure, then slink:VkImageFormatListCreateInfo::pname:viewFormatCount
-    must: be `0` or `1`
-endif::VK_VERSION_1_2,VK_KHR_image_format_list[]
-ifdef::VK_KHR_video_decode_queue[]
-  * [[VUID-VkImageCreateInfo-usage-04815]]
-    If pname:usage includes ename:VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR,
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR,
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR, then the pname:pNext
-    chain must: include a valid slink:VkVideoProfilesKHR structure which
-    includes at least one slink:VkVideoProfileKHR with a decode
-    codec-operation
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-  * [[VUID-VkImageCreateInfo-usage-04816]]
-    If pname:usage includes ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR,
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR,
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR, then the pname:pNext
-    chain must: include a valid slink:VkVideoProfilesKHR structure which
-    includes at least one slink:VkVideoProfileKHR with a encode
-    codec-operation
-endif::VK_KHR_video_encode_queue[]
-ifdef::VK_FUCHSIA_buffer_collection[]
-  * [[VUID-VkImageCreateInfo-pNext-06390]]
-    If the slink:VkImage is to be used to import memory from a
-    slink:VkBufferCollectionFUCHSIA, a
-    slink:VkBufferCollectionImageCreateInfoFUCHSIA structure must: be
-    chained to pname:pNext.
-endif::VK_FUCHSIA_buffer_collection[]
-****
-
-include::{generated}/validity/structs/VkImageCreateInfo.txt[]
---
-
-ifdef::VK_FUCHSIA_buffer_collection[]
-[open,refpage='VkBufferCollectionImageCreateInfoFUCHSIA',desc='Create a VkBufferCollectionFUCHSIA-compatible VkImage',type='structs']
---
-The sname:VkBufferCollectionImageCreateInfoFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkBufferCollectionImageCreateInfoFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure
-  * pname:collection is the slink:VkBufferCollectionFUCHSIA handle
-  * pname:index is the index of the buffer in the buffer collection from
-    which the memory will be imported
-
-.Valid Usage
-****
-  * [[VUID-VkBufferCollectionImageCreateInfoFUCHSIA-index-06391]]
-    pname:index must: be less than
-    slink:VkBufferCollectionPropertiesFUCHSIA::pname:bufferCount
-****
-
-include::{generated}/validity/structs/VkBufferCollectionImageCreateInfoFUCHSIA.txt[]
---
-endif::VK_FUCHSIA_buffer_collection[]
-
-ifdef::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-[open,refpage='VkImageStencilUsageCreateInfo',desc='Specify separate usage flags for the stencil aspect of a depth-stencil image',type='structs',alias='VkImageStencilUsageCreateInfoEXT']
---
-The sname:VkImageStencilUsageCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkImageStencilUsageCreateInfo.txt[]
-
-ifdef::VK_EXT_separate_stencil_usage[]
-or the equivalent
-
-include::{generated}/api/structs/VkImageStencilUsageCreateInfoEXT.txt[]
-endif::VK_EXT_separate_stencil_usage[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:stencilUsage is a bitmask of elink:VkImageUsageFlagBits describing
-    the intended usage of the stencil aspect of the image.
-
-If the pname:pNext chain of slink:VkImageCreateInfo includes a
-sname:VkImageStencilUsageCreateInfo structure, then that structure includes
-the usage flags specific to the stencil aspect of the image for an image
-with a depth-stencil format.
-
-This structure specifies image usages which only apply to the stencil aspect
-of a depth/stencil format image.
-When this structure is included in the pname:pNext chain of
-slink:VkImageCreateInfo, the stencil aspect of the image must: only be used
-as specified by pname:stencilUsage.
-When this structure is not included in the pname:pNext chain of
-slink:VkImageCreateInfo, the stencil aspect of an image must: only be used
-as specified by slink:VkImageCreateInfo::pname:usage.
-Use of other aspects of an image are unaffected by this structure.
-
-This structure can: also be included in the pname:pNext chain of
-slink:VkPhysicalDeviceImageFormatInfo2 to query additional capabilities
-specific to image creation parameter combinations including a separate set
-of usage flags for the stencil aspect of the image using
-flink:vkGetPhysicalDeviceImageFormatProperties2.
-When this structure is not included in the pname:pNext chain of
-sname:VkPhysicalDeviceImageFormatInfo2 then the implicit value of
-pname:stencilUsage matches that of
-sname:VkPhysicalDeviceImageFormatInfo2::pname:usage.
-
-.Valid Usage
-****
-  * [[VUID-VkImageStencilUsageCreateInfo-stencilUsage-02539]]
-    If pname:stencilUsage includes
-    ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, it must: not include bits
-    other than ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT or
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
-****
-
-include::{generated}/validity/structs/VkImageStencilUsageCreateInfo.txt[]
---
-endif::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-
-ifdef::VK_NV_dedicated_allocation[]
-[open,refpage='VkDedicatedAllocationImageCreateInfoNV',desc='Specify that an image is bound to a dedicated memory resource',type='structs']
---
-If the pname:pNext chain includes a
-sname:VkDedicatedAllocationImageCreateInfoNV structure, then that structure
-includes an enable controlling whether the image will have a dedicated
-memory allocation bound to it.
-
-The sname:VkDedicatedAllocationImageCreateInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkDedicatedAllocationImageCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:dedicatedAllocation specifies whether the image will have a
-    dedicated allocation bound to it.
-
-[NOTE]
-.Note
-====
-Using a dedicated allocation for color and depth/stencil attachments or
-other large images may: improve performance on some devices.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkDedicatedAllocationImageCreateInfoNV-dedicatedAllocation-00994]]
-    If pname:dedicatedAllocation is ename:VK_TRUE,
-    slink:VkImageCreateInfo::pname:flags must: not include
-    ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT,
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or
-    ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT
-****
-
-include::{generated}/validity/structs/VkDedicatedAllocationImageCreateInfoNV.txt[]
---
-endif::VK_NV_dedicated_allocation[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-[open,refpage='VkExternalMemoryImageCreateInfo',desc='Specify that an image may be backed by external memory',type='structs']
---
-To define a set of external memory handle types that may: be used as backing
-store for an image, add a slink:VkExternalMemoryImageCreateInfo structure to
-the pname:pNext chain of the slink:VkImageCreateInfo structure.
-The sname:VkExternalMemoryImageCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkExternalMemoryImageCreateInfo.txt[]
-
-ifdef::VK_KHR_external_memory[]
-or the equivalent
-
-include::{generated}/api/structs/VkExternalMemoryImageCreateInfoKHR.txt[]
-endif::VK_KHR_external_memory[]
-
-[NOTE]
-.Note
-====
-A sname:VkExternalMemoryImageCreateInfo structure with a non-zero
-pname:handleTypes field must be included in the creation parameters for an
-image that will be bound to memory that is either exported or imported.
-====
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleTypes is zero, or a bitmask of
-    elink:VkExternalMemoryHandleTypeFlagBits specifying one or more external
-    memory handle types.
-
-include::{generated}/validity/structs/VkExternalMemoryImageCreateInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-ifdef::VK_NV_external_memory[]
-[open,refpage='VkExternalMemoryImageCreateInfoNV',desc='Specify that an image may be backed by external memory',type='structs']
---
-If the pname:pNext chain includes a sname:VkExternalMemoryImageCreateInfoNV
-structure, then that structure defines a set of external memory handle types
-that may: be used as backing store for the image.
-
-The sname:VkExternalMemoryImageCreateInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkExternalMemoryImageCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleTypes is zero, or a bitmask of
-    elink:VkExternalMemoryHandleTypeFlagBitsNV specifying one or more
-    external memory handle types.
-
-include::{generated}/validity/structs/VkExternalMemoryImageCreateInfoNV.txt[]
---
-endif::VK_NV_external_memory[]
-
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-[open,refpage='VkExternalFormatANDROID',desc='Structure containing an Android hardware buffer external format',type='structs']
---
-To create an image with an
-<<memory-external-android-hardware-buffer-external-formats,external
-format>>, add a sname:VkExternalFormatANDROID structure in the pname:pNext
-chain of slink:VkImageCreateInfo.
-sname:VkExternalFormatANDROID is defined as:
-
-include::{generated}/api/structs/VkExternalFormatANDROID.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:externalFormat is an implementation-defined identifier for the
-    external format
-
-If pname:externalFormat is zero, the effect is as if the
-sname:VkExternalFormatANDROID structure was not present.
-Otherwise, the pname:image will have the specified external format.
-
-.Valid Usage
-****
-  * [[VUID-VkExternalFormatANDROID-externalFormat-01894]]
-    pname:externalFormat must: be `0` or a value returned in the
-    pname:externalFormat member of
-    slink:VkAndroidHardwareBufferFormatPropertiesANDROID by an earlier call
-    to flink:vkGetAndroidHardwareBufferPropertiesANDROID
-****
-
-include::{generated}/validity/structs/VkExternalFormatANDROID.txt[]
---
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_KHR_swapchain[]
-[open,refpage='VkImageSwapchainCreateInfoKHR',desc='Specify that an image will be bound to swapchain memory',type='structs']
---
-If the pname:pNext chain of slink:VkImageCreateInfo includes a
-sname:VkImageSwapchainCreateInfoKHR structure, then that structure includes
-a swapchain handle indicating that the image will be bound to memory from
-that swapchain.
-
-The sname:VkImageSwapchainCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkImageSwapchainCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:swapchain is dlink:VK_NULL_HANDLE or a handle of a swapchain that
-    the image will be bound to.
-
-.Valid Usage
-****
-  * [[VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995]]
-    If pname:swapchain is not dlink:VK_NULL_HANDLE, the fields of
-    slink:VkImageCreateInfo must: match the
-    <<swapchain-wsi-image-create-info, implied image creation parameters>>
-    of the swapchain
-****
-
-include::{generated}/validity/structs/VkImageSwapchainCreateInfoKHR.txt[]
---
-endif::VK_KHR_swapchain[]
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_image_format_list[]
-[open,refpage='VkImageFormatListCreateInfo',desc='Specify that an image can: be used with a particular set of formats',type='structs',alias='VkImageFormatListCreateInfoKHR']
---
-If the pname:pNext chain of slink:VkImageCreateInfo includes a
-sname:VkImageFormatListCreateInfo structure, then that structure contains a
-list of all formats that can: be used when creating views of this image.
-
-The sname:VkImageFormatListCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkImageFormatListCreateInfo.txt[]
-
-ifdef::VK_KHR_image_format_list[]
-or the equivalent
-
-include::{generated}/api/structs/VkImageFormatListCreateInfoKHR.txt[]
-endif::VK_KHR_image_format_list[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:viewFormatCount is the number of entries in the pname:pViewFormats
-    array.
-  * pname:pViewFormats is a pointer to an array of elink:VkFormat values
-    specifying all formats which can: be used when creating views of this
-    image.
-
-If pname:viewFormatCount is zero, pname:pViewFormats is ignored and the
-image is created as if the sname:VkImageFormatListCreateInfo structure were
-not included in the pname:pNext chain of slink:VkImageCreateInfo.
-
-include::{generated}/validity/structs/VkImageFormatListCreateInfo.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_image_format_list[]
-
-ifdef::VK_EXT_image_drm_format_modifier[]
-[open,refpage='VkImageDrmFormatModifierListCreateInfoEXT',desc='Specify that an image must be created with a DRM format modifier from the provided list',type='structs']
---
-If the pname:pNext chain of slink:VkImageCreateInfo includes a
-slink:VkImageDrmFormatModifierListCreateInfoEXT structure, then the image
-will be created with one of the <<glossary-drm-format-modifier,Linux DRM
-format modifiers>> listed in the structure.
-The choice of modifier is implementation-dependent.
-
-The slink:VkImageDrmFormatModifierListCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkImageDrmFormatModifierListCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:drmFormatModifierCount is the length of the
-    pname:pDrmFormatModifiers array.
-  * pname:pDrmFormatModifiers is a pointer to an array of _Linux DRM format
-    modifiers_.
-
-.Valid Usage
-****
-  * [[VUID-VkImageDrmFormatModifierListCreateInfoEXT-pDrmFormatModifiers-02263]]
-    Each _modifier_ in pname:pDrmFormatModifiers must: be compatible with
-    the parameters in slink:VkImageCreateInfo and its pname:pNext chain, as
-    determined by querying slink:VkPhysicalDeviceImageFormatInfo2 extended
-    with slink:VkPhysicalDeviceImageDrmFormatModifierInfoEXT
-****
-
-include::{generated}/validity/structs/VkImageDrmFormatModifierListCreateInfoEXT.txt[]
---
-
-[open,refpage='VkImageDrmFormatModifierExplicitCreateInfoEXT',desc='Specify that an image be created with the provided DRM format modifier and explicit memory layout',type='structs']
---
-If the pname:pNext chain of slink:VkImageCreateInfo includes a
-slink:VkImageDrmFormatModifierExplicitCreateInfoEXT structure, then the
-image will be created with the <<glossary-drm-format-modifier,Linux DRM
-format modifier>> and memory layout defined by the structure.
-
-The slink:VkImageDrmFormatModifierExplicitCreateInfoEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkImageDrmFormatModifierExplicitCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:drmFormatModifier is the _Linux DRM format modifier_ with which
-    the image will be created.
-  * pname:drmFormatModifierPlaneCount is the number of _memory planes_ in
-    the image (as reported by slink:VkDrmFormatModifierPropertiesEXT) as
-    well as the length of the pname:pPlaneLayouts array.
-  * pname:pPlaneLayouts is a pointer to an array of
-    slink:VkSubresourceLayout structures describing the image's _memory
-    planes_.
-
-The etext:i^th^ member of pname:pPlaneLayouts describes the layout of the
-image's etext:i^th^ _memory plane_ (that is,
-`VK_IMAGE_ASPECT_MEMORY_PLANE__{ibit}__BIT_EXT`).
-In each element of pname:pPlaneLayouts, the implementation must: ignore
-pname:size.
-The implementation calculates the size of each plane, which the application
-can: query with flink:vkGetImageSubresourceLayout.
-
-When creating an image with
-slink:VkImageDrmFormatModifierExplicitCreateInfoEXT, it is the application's
-responsibility to satisfy all valid usage requirements.
-However, the implementation must: validate that the provided
-pname:pPlaneLayouts, when combined with the provided pname:drmFormatModifier
-and other creation parameters in slink:VkImageCreateInfo and its pname:pNext
-chain, produce a valid image.
-(This validation is necessarily implementation-dependent and outside the
-scope of Vulkan, and therefore not described by valid usage requirements).
-If this validation fails, then flink:vkCreateImage returns
-ename:VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT.
-
-.Valid Usage
-****
-  * [[VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-drmFormatModifier-02264]]
-    pname:drmFormatModifier must: be compatible with the parameters in
-    slink:VkImageCreateInfo and its pname:pNext chain, as determined by
-    querying slink:VkPhysicalDeviceImageFormatInfo2 extended with
-    slink:VkPhysicalDeviceImageDrmFormatModifierInfoEXT
-  * [[VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-drmFormatModifierPlaneCount-02265]]
-    pname:drmFormatModifierPlaneCount must: be equal to the
-    slink:VkDrmFormatModifierPropertiesEXT::pname:drmFormatModifierPlaneCount
-    associated with slink:VkImageCreateInfo::pname:format and
-    pname:drmFormatModifier, as found by querying
-    slink:VkDrmFormatModifierPropertiesListEXT
-  * [[VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-size-02267]]
-    For each element of pname:pPlaneLayouts, pname:size must: be 0
-  * [[VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-arrayPitch-02268]]
-    For each element of pname:pPlaneLayouts, pname:arrayPitch must: be 0 if
-    slink:VkImageCreateInfo::pname:arrayLayers is 1
-  * [[VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-depthPitch-02269]]
-    For each element of pname:pPlaneLayouts, pname:depthPitch must: be 0 if
-    slink:VkImageCreateInfo::pname:extent.depth is 1
-****
-
-include::{generated}/validity/structs/VkImageDrmFormatModifierExplicitCreateInfoEXT.txt[]
---
-endif::VK_EXT_image_drm_format_modifier[]
-
-[open,refpage='VkImageUsageFlagBits',desc='Bitmask specifying intended usage of an image',type='enums']
---
-Bits which can: be set in
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-slink:VkImageViewUsageCreateInfo::pname:usage, or
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-slink:VkImageStencilUsageCreateInfo::pname:stencilUsage, or
-endif::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-slink:VkImageCreateInfo::pname:usage, specifying intended usage of an image,
-are:
-
-include::{generated}/api/enums/VkImageUsageFlagBits.txt[]
-
-  * ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT specifies that the image can: be
-    used as the source of a transfer command.
-  * ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT specifies that the image can: be
-    used as the destination of a transfer command.
-  * ename:VK_IMAGE_USAGE_SAMPLED_BIT specifies that the image can: be used
-    to create a sname:VkImageView suitable for occupying a
-    sname:VkDescriptorSet slot either of type
-    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE or
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and be sampled by a
-    shader.
-  * ename:VK_IMAGE_USAGE_STORAGE_BIT specifies that the image can: be used
-    to create a sname:VkImageView suitable for occupying a
-    sname:VkDescriptorSet slot of type
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE.
-  * ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT specifies that the image can:
-    be used to create a sname:VkImageView suitable for use as a color or
-    resolve attachment in a sname:VkFramebuffer.
-  * ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT specifies that the
-    image can: be used to create a sname:VkImageView suitable for use as a
-    depth/stencil
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    or depth/stencil resolve
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    attachment in a sname:VkFramebuffer.
-  * ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT specifies that
-    implementations may: support using <<memory, memory allocations>> with
-    the ename:VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT to back an image with
-    this usage.
-    This bit can: be set for any image that can: be used to create a
-    sname:VkImageView suitable for use as a color, resolve, depth/stencil,
-    or input attachment.
-  * ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT specifies that the image can:
-    be used to create a sname:VkImageView suitable for occupying
-    sname:VkDescriptorSet slot of type
-    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT; be read from a shader as an
-    input attachment; and be used as an input attachment in a framebuffer.
-ifdef::VK_EXT_fragment_density_map[]
-  * ename:VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT specifies that the
-    image can: be used to create a sname:VkImageView suitable for use as a
-    <<fragmentdensitymapops, fragment density map image>>.
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  * ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR specifies
-    that the image can: be used to create a sname:VkImageView suitable for
-    use as a
-ifdef::VK_KHR_fragment_shading_rate[]
-    <<primsrast-fragment-shading-rate-attachment, fragment shading rate
-    attachment>>
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_KHR_fragment_shading_rate+VK_NV_shading_rate_image[or]
-ifdef::VK_NV_shading_rate_image[]
-    <<primsrast-shading-rate-image, shading rate image>>
-endif::VK_NV_shading_rate_image[]
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-ifdef::VK_KHR_video_decode_queue[]
-  * ename:VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR specifies that
-    <<video-decode-operations, video decode operations>> can use the image
-    as a <<reference-picture,reference picture>>, or a source of
-    postprocessing, or transfer operation.
-  * ename:VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR specifies that
-    <<video-decode-operations, video decode operations>> can use the image
-    as a <<video-picture-resources,DPB Video Picture Resource>>,
-    representing a <<reference-picture,reference picture>>.
-    This flag must: be combined with
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR and
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR.
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR is required for DPB image
-    resources because these resources will be associated with
-    <<reference-picture,reference pictures>> after acting as targets for
-    video decode operations.
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR is required for DPB image
-    resources because the <<reference-picture,reference pictures>>
-    associated with them act as information sources for subsequent decode
-    operations.
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-  * ename:VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR specifies that the image
-    can be used as an <<input-encode-picture,input picture>> for
-    <<video-encode-operations, video encode operations>>.
-  * ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR specifies that
-    <<video-encode-operations, video encode operations>> can use the image
-    to hold a <<video-picture-resources,reconstructed picture>>, and to act
-    as a <<reference-picture,reference picture>>.
-    This flag must: be combined with
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR and
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR.
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR is required for a DPB
-    image resource because the reconstructed picture resulting from an
-    encode operation will be written to it.
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR is required for DPB image
-    resources because it can be used as a <<reference-picture,reconstructed
-    reference picture>> source for the encode operation.
-endif::VK_KHR_video_encode_queue[]
---
-
-[open,refpage='VkImageUsageFlags',desc='Bitmask of VkImageUsageFlagBits',type='flags']
---
-include::{generated}/api/flags/VkImageUsageFlags.txt[]
-
-tname:VkImageUsageFlags is a bitmask type for setting a mask of zero or more
-elink:VkImageUsageFlagBits.
-
-[[valid-imageview-imageusage]]
-When creating a sname:VkImageView one of the following
-elink:VkImageUsageFlagBits must: be set:
-
-  * ename:VK_IMAGE_USAGE_SAMPLED_BIT
-  * ename:VK_IMAGE_USAGE_STORAGE_BIT
-  * ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
-  * ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
-  * ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
-ifdef::VK_NV_shading_rate_image,VK_KHR_fragment_shading_rate[]
-  * ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-endif::VK_NV_shading_rate_image,VK_KHR_fragment_shading_rate[]
-ifdef::VK_EXT_fragment_density_map[]
-  * ename:VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
---
-
-[open,refpage='VkImageCreateFlagBits',desc='Bitmask specifying additional parameters of an image',type='enums']
---
-Bits which can: be set in slink:VkImageCreateInfo::pname:flags, specifying
-additional parameters of an image, are:
-
-include::{generated}/api/enums/VkImageCreateFlagBits.txt[]
-
-  * ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT specifies that the image will
-    be backed using sparse memory binding.
-  * ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT specifies that the image can:
-    be partially backed using sparse memory binding.
-    Images created with this flag must: also be created with the
-    ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT flag.
-  * ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT specifies that the image will
-    be backed using sparse memory binding with memory ranges that might also
-    simultaneously be backing another image (or another portion of the same
-    image).
-    Images created with this flag must: also be created with the
-    ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT flag.
-  * ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT specifies that the image can:
-    be used to create a sname:VkImageView with a different format from the
-    image.
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-    For <<formats-requiring-sampler-ycbcr-conversion,multi-planar>> formats,
-    ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT specifies that a
-    sname:VkImageView can be created of a _plane_ of the image.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT specifies that the image can:
-    be used to create a sname:VkImageView of type
-    ename:VK_IMAGE_VIEW_TYPE_CUBE or ename:VK_IMAGE_VIEW_TYPE_CUBE_ARRAY.
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * ename:VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT specifies that the image
-    can: be used to create a sname:VkImageView of type
-    ename:VK_IMAGE_VIEW_TYPE_2D or ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifdef::VK_VERSION_1_1[]
-  * ename:VK_IMAGE_CREATE_PROTECTED_BIT specifies that the image is a
-    protected image.
-endif::VK_VERSION_1_1[]
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * ename:VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT specifies that the
-    image can: be used with a non-zero value of the
-    pname:splitInstanceBindRegionCount member of a
-    slink:VkBindImageMemoryDeviceGroupInfo structure passed into
-    flink:vkBindImageMemory2.
-    This flag also has the effect of making the image use the standard
-    sparse image block dimensions.
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-  * ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT specifies that the
-    image having a compressed format can: be used to create a
-    sname:VkImageView with an uncompressed format where each texel in the
-    image view corresponds to a compressed texel block of the image.
-  * ename:VK_IMAGE_CREATE_EXTENDED_USAGE_BIT specifies that the image can:
-    be created with usage flags that are not supported for the format the
-    image is created with but are supported for at least one format a
-    sname:VkImageView created from the image can: have.
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * ename:VK_IMAGE_CREATE_DISJOINT_BIT specifies that an image with a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar format>> must:
-    have each plane separately bound to memory, rather than having a single
-    memory binding for the whole image; the presence of this bit
-    distinguishes a _disjoint image_ from an image without this bit set.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-  * ename:VK_IMAGE_CREATE_ALIAS_BIT specifies that two images created with
-    the same creation parameters and aliased to the same memory can:
-    interpret the contents of the memory consistently with each other,
-    subject to the rules described in the <<resources-memory-aliasing,Memory
-    Aliasing>> section.
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-    This flag further specifies that each plane of a _disjoint_ image can:
-    share an in-memory non-linear representation with single-plane images,
-    and that a single-plane image can: share an in-memory non-linear
-    representation with a plane of a multi-planar disjoint image, according
-    to the rules in <<formats-compatible-planes>>.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory,VK_NV_external_memory[]
-    If the pname:pNext chain includes a
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[slink:VkExternalMemoryImageCreateInfo]
-// Jon: logic needs to incorporate VK_VERSION_1_1
-ifdef::VK_KHR_external_memory+VK_NV_external_memory[or]
-ifdef::VK_NV_external_memory[slink:VkExternalMemoryImageCreateInfoNV]
-    structure whose pname:handleTypes member is not `0`, it is as if
-    ename:VK_IMAGE_CREATE_ALIAS_BIT is set.
-endif::VK_VERSION_1_1,VK_KHR_external_memory,VK_NV_external_memory[]
-endif::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-ifdef::VK_EXT_sample_locations[]
-  * ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT
-    specifies that an image with a depth or depth/stencil format can: be
-    used with custom sample locations when used as a depth/stencil
-    attachment.
-endif::VK_EXT_sample_locations[]
-ifdef::VK_NV_corner_sampled_image[]
-  * ename:VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV specifies that the image is
-    a <<resources-images-corner-sampled,corner-sampled image>>.
-endif::VK_NV_corner_sampled_image[]
-ifdef::VK_EXT_fragment_density_map[]
-  * ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT specifies that an image can: be
-    in a subsampled format which may: be more optimal when written as an
-    attachment by a render pass that has a fragment density map attachment.
-    Accessing a subsampled image has additional considerations:
-  ** Image data read as an image sampler will have undefined: values if the
-     sampler was not created with pname:flags containing
-     ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT or was not sampled through
-     the use of a combined image sampler with an immutable sampler in
-     sname:VkDescriptorSetLayoutBinding.
-  ** Image data read with an input attachment will have undefined: values if
-     the contents were not written as an attachment in an earlier subpass of
-     the same render pass.
-ifdef::VK_EXT_fragment_density_map2[]
-  ** Image data read as an image sampler in the fragment shader will be
-     additionally be read by the device during
-     ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT if
-     <<limits-subsampledCoarseReconstructionEarlyAccess,sname:VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::pname:subsampledCoarseReconstructionEarlyAccess>>
-     is ename:VK_TRUE and the sampler was created with pname:flags
-     containing
-     ename:VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT.
-  ** Image data read with load operations are resampled to the fragment
-     density of the render pass if
-     <<limits-subsampledLoads,sname:VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::pname:subsampledLoads>>
-     is ename:VK_TRUE.
-     Otherwise, values of image data are undefined:.
-endif::VK_EXT_fragment_density_map2[]
-ifndef::VK_EXT_fragment_density_map2[]
-  ** Image data read with load operations may: be resampled to the fragment
-     density of the render pass.
-endif::VK_EXT_fragment_density_map2[]
-  ** Image contents outside of the render area take on undefined: values if
-     the image is stored as a render pass attachment.
-endif::VK_EXT_fragment_density_map[]
-
-See <<sparsememory-sparseresourcefeatures,Sparse Resource Features>> and
-<<sparsememory-physicalfeatures,Sparse Physical Device Features>> for more
-details.
---
-
-[open,refpage='VkImageCreateFlags',desc='Bitmask of VkImageCreateFlagBits',type='flags']
---
-include::{generated}/api/flags/VkImageCreateFlags.txt[]
-
-tname:VkImageCreateFlags is a bitmask type for setting a mask of zero or
-more elink:VkImageCreateFlagBits.
---
-
-[open,refpage='VkImageType',desc='Specifies the type of an image object',type='enums']
---
-Possible values of slink:VkImageCreateInfo::pname:imageType, specifying the
-basic dimensionality of an image, are:
-
-include::{generated}/api/enums/VkImageType.txt[]
-
-  * ename:VK_IMAGE_TYPE_1D specifies a one-dimensional image.
-  * ename:VK_IMAGE_TYPE_2D specifies a two-dimensional image.
-  * ename:VK_IMAGE_TYPE_3D specifies a three-dimensional image.
---
-
-[open,refpage='VkImageTiling',desc='Specifies the tiling arrangement of data in an image',type='enums']
---
-Possible values of slink:VkImageCreateInfo::pname:tiling, specifying the
-tiling arrangement of texel blocks in an image, are:
-
-include::{generated}/api/enums/VkImageTiling.txt[]
-
-  * ename:VK_IMAGE_TILING_OPTIMAL specifies optimal tiling (texels are laid
-    out in an implementation-dependent arrangement, for more efficient
-    memory access).
-  * ename:VK_IMAGE_TILING_LINEAR specifies linear tiling (texels are laid
-    out in memory in row-major order, possibly with some padding on each
-    row).
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT indicates that the image's
-    tiling is defined by a <<glossary-drm-format-modifier,Linux DRM format
-    modifier>>.
-    The modifier is specified at image creation with
-    slink:VkImageDrmFormatModifierListCreateInfoEXT or
-    slink:VkImageDrmFormatModifierExplicitCreateInfoEXT, and can: be queried
-    with flink:vkGetImageDrmFormatModifierPropertiesEXT.
-endif::VK_EXT_image_drm_format_modifier[]
---
-
-[open,refpage='vkGetImageSubresourceLayout',desc='Retrieve information about an image subresource',type='protos']
---
-To query the memory layout of an image subresource, call:
-
-include::{generated}/api/protos/vkGetImageSubresourceLayout.txt[]
-
-  * pname:device is the logical device that owns the image.
-  * pname:image is the image whose layout is being queried.
-  * pname:pSubresource is a pointer to a slink:VkImageSubresource structure
-    selecting a specific image for the image subresource.
-  * pname:pLayout is a pointer to a slink:VkSubresourceLayout structure in
-    which the layout is returned.
-
-ifndef::VK_EXT_image_drm_format_modifier[]
-The image must: be <<glossary-linear-resource,linear>>.
-The
-endif::VK_EXT_image_drm_format_modifier[]
-ifdef::VK_EXT_image_drm_format_modifier[]
-If the image is <<glossary-linear-resource,linear>>, then the
-endif::VK_EXT_image_drm_format_modifier[]
-returned layout is valid for <<memory-device-hostaccess, host access>>.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-If the image's
-ifdef::VK_EXT_image_drm_format_modifier[]
-tiling is ename:VK_IMAGE_TILING_LINEAR and its
-endif::VK_EXT_image_drm_format_modifier[]
-format is a <<formats-requiring-sampler-ycbcr-conversion,multi-planar
-format>>, then fname:vkGetImageSubresourceLayout describes one
-ifdef::VK_EXT_image_drm_format_modifier[_format plane_]
-ifndef::VK_EXT_image_drm_format_modifier[plane]
-of the image.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_EXT_image_drm_format_modifier[]
-If the image's tiling is ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then
-fname:vkGetImageSubresourceLayout describes one _memory plane_ of the image.
-If the image's tiling is ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT and
-the image is <<glossary-linear-resource,non-linear>>, then the returned
-layout has an implementation-dependent meaning; the vendor of the image's
-<<glossary-drm-format-modifier,DRM format modifier>> may: provide
-documentation that explains how to interpret the returned layout.
-endif::VK_EXT_image_drm_format_modifier[]
-
-fname:vkGetImageSubresourceLayout is invariant for the lifetime of a single
-image.
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-However, the subresource layout of images in Android hardware buffer
-external memory is not known until the image has been bound to memory, so
-applications must: not call flink:vkGetImageSubresourceLayout for such an
-image before it has been bound.
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-
-.Valid Usage
-****
-ifndef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-vkGetImageSubresourceLayout-image-00996]]
-    pname:image must: have been created with pname:tiling equal to
-    ename:VK_IMAGE_TILING_LINEAR
-endif::VK_EXT_image_drm_format_modifier[]
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-vkGetImageSubresourceLayout-image-02270]]
-    pname:image must: have been created with pname:tiling equal to
-    ename:VK_IMAGE_TILING_LINEAR or
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT
-endif::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-vkGetImageSubresourceLayout-aspectMask-00997]]
-    The pname:aspectMask member of pname:pSubresource must: only have a
-    single bit set
-  * [[VUID-vkGetImageSubresourceLayout-mipLevel-01716]]
-    The pname:mipLevel member of pname:pSubresource must: be less than the
-    pname:mipLevels specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-vkGetImageSubresourceLayout-arrayLayer-01717]]
-    The pname:arrayLayer member of pname:pSubresource must: be less than the
-    pname:arrayLayers specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-vkGetImageSubresourceLayout-format-04461]]
-    If pname:format is a color format, the pname:aspectMask member of
-    pname:pSubresource must: be ename:VK_IMAGE_ASPECT_COLOR_BIT
-  * [[VUID-vkGetImageSubresourceLayout-format-04462]]
-    If pname:format has a depth component, the pname:aspectMask member of
-    pname:pSubresource must: contain ename:VK_IMAGE_ASPECT_DEPTH_BIT
-  * [[VUID-vkGetImageSubresourceLayout-format-04463]]
-    If pname:format has a stencil component, the pname:aspectMask member of
-    pname:pSubresource must: contain ename:VK_IMAGE_ASPECT_STENCIL_BIT
-  * [[VUID-vkGetImageSubresourceLayout-format-04464]]
-    If pname:format does not contain a stencil or depth component, the
-    pname:aspectMask member of pname:pSubresource must: not contain
-    ename:VK_IMAGE_ASPECT_DEPTH_BIT or ename:VK_IMAGE_ASPECT_STENCIL_BIT
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-vkGetImageSubresourceLayout-format-01581]]
-    If the pname:tiling of the pname:image is ename:VK_IMAGE_TILING_LINEAR
-    and its pname:format is a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar format>> with
-    two planes, the pname:aspectMask member of pname:pSubresource must: be
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT or ename:VK_IMAGE_ASPECT_PLANE_1_BIT
-  * [[VUID-vkGetImageSubresourceLayout-format-01582]]
-    If the pname:tiling of the pname:image is ename:VK_IMAGE_TILING_LINEAR
-    and its pname:format is a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar format>> with
-    three planes, the pname:aspectMask member of pname:pSubresource must: be
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT or
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-vkGetImageSubresourceLayout-image-01895]]
-    If pname:image was created with the
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID
-    external memory handle type, then pname:image must: be bound to memory
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-vkGetImageSubresourceLayout-tiling-02271]]
-    If the pname:tiling of the pname:image is
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then the pname:aspectMask
-    member of pname:pSubresource must: be
-    `VK_IMAGE_ASPECT_MEMORY_PLANE__{ibit}__BIT_EXT` and the index _i_ must:
-    be less than the
-    slink:VkDrmFormatModifierPropertiesEXT::pname:drmFormatModifierPlaneCount
-    associated with the image's pname:format and
-    slink:VkImageDrmFormatModifierPropertiesEXT::pname:drmFormatModifier
-endif::VK_EXT_image_drm_format_modifier[]
-****
-
-include::{generated}/validity/protos/vkGetImageSubresourceLayout.txt[]
---
-
-[open,refpage='VkImageSubresource',desc='Structure specifying an image subresource',type='structs']
---
-The sname:VkImageSubresource structure is defined as:
-
-include::{generated}/api/structs/VkImageSubresource.txt[]
-
-  * pname:aspectMask is a tlink:VkImageAspectFlags value selecting the image
-    _aspect_.
-  * pname:mipLevel selects the mipmap level.
-  * pname:arrayLayer selects the array layer.
-
-include::{generated}/validity/structs/VkImageSubresource.txt[]
---
-
-[open,refpage='VkSubresourceLayout',desc='Structure specifying subresource layout',type='structs']
---
-Information about the layout of the image subresource is returned in a
-sname:VkSubresourceLayout structure:
-
-include::{generated}/api/structs/VkSubresourceLayout.txt[]
-
-  * pname:offset is the byte offset from the start of the image
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-    or the plane
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-    where the image subresource begins.
-  * pname:size is the size in bytes of the image subresource.
-    pname:size includes any extra memory that is required based on
-    pname:rowPitch.
-  * pname:rowPitch describes the number of bytes between each row of texels
-    in an image.
-  * pname:arrayPitch describes the number of bytes between each array layer
-    of an image.
-  * pname:depthPitch describes the number of bytes between each slice of 3D
-    image.
-
-If the image is <<glossary-linear-resource,linear>>, then pname:rowPitch,
-pname:arrayPitch and pname:depthPitch describe the layout of the image
-subresource in linear memory.
-For uncompressed formats, pname:rowPitch is the number of bytes between
-texels with the same x coordinate in adjacent rows (y coordinates differ by
-one).
-pname:arrayPitch is the number of bytes between texels with the same x and y
-coordinate in adjacent array layers of the image (array layer values differ
-by one).
-pname:depthPitch is the number of bytes between texels with the same x and y
-coordinate in adjacent slices of a 3D image (z coordinates differ by one).
-Expressed as an addressing formula, the starting byte of a texel in the
-image subresource has address:
-
-[source,c]
-~~~~
-// (x,y,z,layer) are in texel coordinates
-address(x,y,z,layer) = layer*arrayPitch + z*depthPitch + y*rowPitch + x*elementSize + offset
-~~~~
-
-For compressed formats, the pname:rowPitch is the number of bytes between
-compressed texel blocks in adjacent rows.
-pname:arrayPitch is the number of bytes between compressed texel blocks in
-adjacent array layers.
-pname:depthPitch is the number of bytes between compressed texel blocks in
-adjacent slices of a 3D image.
-
-[source,c]
-~~~~
-// (x,y,z,layer) are in compressed texel block coordinates
-address(x,y,z,layer) = layer*arrayPitch + z*depthPitch + y*rowPitch + x*compressedTexelBlockByteSize + offset;
-~~~~
-
-The value of pname:arrayPitch is undefined: for images that were not created
-as arrays.
-pname:depthPitch is defined only for 3D images.
-
-If the image has a
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-_single-plane_
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-color format
-ifdef::VK_EXT_image_drm_format_modifier[]
-and its tiling is ename:VK_IMAGE_TILING_LINEAR
-endif::VK_EXT_image_drm_format_modifier[]
-, then the pname:aspectMask member of sname:VkImageSubresource must: be
-ename:VK_IMAGE_ASPECT_COLOR_BIT.
-
-If the image has a depth/stencil format
-ifdef::VK_EXT_image_drm_format_modifier[]
-and its tiling is ename:VK_IMAGE_TILING_LINEAR
-endif::VK_EXT_image_drm_format_modifier[]
-, then pname:aspectMask must: be either ename:VK_IMAGE_ASPECT_DEPTH_BIT or
-ename:VK_IMAGE_ASPECT_STENCIL_BIT.
-On implementations that store depth and stencil aspects separately, querying
-each of these image subresource layouts will return a different pname:offset
-and pname:size representing the region of memory used for that aspect.
-On implementations that store depth and stencil aspects interleaved, the
-same pname:offset and pname:size are returned and represent the interleaved
-memory allocation.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-If the image has a <<formats-requiring-sampler-ycbcr-conversion,multi-planar
-format>>
-ifdef::VK_EXT_image_drm_format_modifier[]
-and its tiling is ename:VK_IMAGE_TILING_LINEAR
-endif::VK_EXT_image_drm_format_modifier[]
-, then the pname:aspectMask member of sname:VkImageSubresource must: be
-ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT, or
-(for 3-plane formats only) ename:VK_IMAGE_ASPECT_PLANE_2_BIT.
-Querying each of these image subresource layouts will return a different
-pname:offset and pname:size representing the region of memory used for that
-plane.
-If the image is _disjoint_, then the pname:offset is relative to the base
-address of the plane.
-If the image is _non-disjoint_, then the pname:offset is relative to the
-base address of the image.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-ifdef::VK_EXT_image_drm_format_modifier[]
-If the image's tiling is ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then
-the pname:aspectMask member of sname:VkImageSubresource must: be one of
-`VK_IMAGE_ASPECT_MEMORY_PLANE__{ibit}__BIT_EXT`, where the maximum allowed
-plane index _i_ is defined by the
-slink:VkDrmFormatModifierPropertiesEXT::pname:drmFormatModifierPlaneCount
-associated with the image's slink:VkImageCreateInfo::pname:format and
-<<glossary-drm-format-modifier,modifier>>.
-The memory range used by the subresource is described by pname:offset and
-pname:size.
-If the image is _disjoint_, then the pname:offset is relative to the base
-address of the _memory plane_.
-If the image is _non-disjoint_, then the pname:offset is relative to the
-base address of the image.
-If the image is <<glossary-linear-resource,non-linear>>, then
-pname:rowPitch, pname:arrayPitch, and pname:depthPitch have an
-implementation-dependent meaning.
-endif::VK_EXT_image_drm_format_modifier[]
-
-include::{generated}/validity/structs/VkSubresourceLayout.txt[]
---
-
-ifdef::VK_EXT_image_drm_format_modifier[]
-[open,refpage='vkGetImageDrmFormatModifierPropertiesEXT',desc='Returns an image\'s DRM format modifier',type='protos']
---
-If an image was created with ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,
-then the image has a <<glossary-drm-format-modifier,Linux DRM format
-modifier>>.
-To query the _modifier_, call:
-
-include::{generated}/api/protos/vkGetImageDrmFormatModifierPropertiesEXT.txt[]
-
-  * pname:device is the logical device that owns the image.
-  * pname:image is the queried image.
-  * pname:pProperties is a pointer to a
-    slink:VkImageDrmFormatModifierPropertiesEXT structure in which
-    properties of the image's _DRM format modifier_ are returned.
-
-.Valid Usage
-****
-  * [[VUID-vkGetImageDrmFormatModifierPropertiesEXT-image-02272]]
-    pname:image must: have been created with
-    <<VkImageCreateInfo,pname:tiling>> equal to
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT
-****
-
-include::{generated}/validity/protos/vkGetImageDrmFormatModifierPropertiesEXT.txt[]
---
-
-[open,refpage='VkImageDrmFormatModifierPropertiesEXT',desc='Properties of an image\'s Linux DRM format modifier',type='structs']
---
-The slink:VkImageDrmFormatModifierPropertiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkImageDrmFormatModifierPropertiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:drmFormatModifier returns the image's
-    <<glossary-drm-format-modifier,Linux DRM format modifier>>.
-
-If the pname:image was created with
-slink:VkImageDrmFormatModifierListCreateInfoEXT, then the returned
-pname:drmFormatModifier must: belong to the list of modifiers provided at
-time of image creation in
-slink:VkImageDrmFormatModifierListCreateInfoEXT::pname:pDrmFormatModifiers.
-If the pname:image was created with
-slink:VkImageDrmFormatModifierExplicitCreateInfoEXT, then the returned
-pname:drmFormatModifier must: be the modifier provided at time of image
-creation in
-slink:VkImageDrmFormatModifierExplicitCreateInfoEXT::pname:drmFormatModifier.
-
-include::{generated}/validity/structs/VkImageDrmFormatModifierPropertiesEXT.txt[]
---
-endif::VK_EXT_image_drm_format_modifier[]
-
-[open,refpage='vkDestroyImage',desc='Destroy an image object',type='protos']
---
-To destroy an image, call:
-
-include::{generated}/api/protos/vkDestroyImage.txt[]
-
-  * pname:device is the logical device that destroys the image.
-  * pname:image is the image to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyImage-image-01000]]
-    All submitted commands that refer to pname:image, either directly or via
-    a sname:VkImageView, must: have completed execution
-  * [[VUID-vkDestroyImage-image-01001]]
-    If sname:VkAllocationCallbacks were provided when pname:image was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyImage-image-01002]]
-    If no sname:VkAllocationCallbacks were provided when pname:image was
-    created, pname:pAllocator must: be `NULL`
-ifdef::VK_KHR_swapchain[]
-  * [[VUID-vkDestroyImage-image-04882]]
-    pname:image must: not have been acquired from
-    flink:vkGetSwapchainImagesKHR
-endif::VK_KHR_swapchain[]
-****
-
-include::{generated}/validity/protos/vkDestroyImage.txt[]
---
-
-
-[[resources-image-format-features]]
-=== Image Format Features
-
-Valid uses of a slink:VkImage may: depend on the image's _format features_,
-defined below.
-Such constraints are documented in the affected valid usage statement.
-
-  * If the image was created with ename:VK_IMAGE_TILING_LINEAR, then its set
-    of _format features_ is the value of
-    slink:VkFormatProperties::pname:linearTilingFeatures found by calling
-    flink:vkGetPhysicalDeviceFormatProperties on the same pname:format as
-    slink:VkImageCreateInfo::pname:format.
-  * If the image was created with ename:VK_IMAGE_TILING_OPTIMAL,
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-    but without an
-    <<memory-external-android-hardware-buffer-external-formats,Android
-    hardware buffer external format>>,
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_FUCHSIA_buffer_collection[]
-ifndef::VK_ANDROID_external_memory_android_hardware_buffer[]
-    but without an
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-    or an
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-    slink:VkBufferCollectionImageCreateInfoFUCHSIA,
-endif::VK_FUCHSIA_buffer_collection[]
-    then its set of _format features_ is the value of
-    slink:VkFormatProperties::pname:optimalTilingFeatures found by calling
-    flink:vkGetPhysicalDeviceFormatProperties on the same pname:format as
-    slink:VkImageCreateInfo::pname:format.
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * If the image was created with an
-    <<memory-external-android-hardware-buffer-external-formats,Android
-    hardware buffer external format>>, then its set of _format features_ is
-    the value of
-    slink:VkAndroidHardwareBufferFormatPropertiesANDROID::pname:formatFeatures
-    found by calling flink:vkGetAndroidHardwareBufferPropertiesANDROID on
-    the Android hardware buffer that was imported to the
-    slink:VkDeviceMemory to which the image is bound.
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * If the image was created with
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then:
-  ** The image's DRM format modifier is the value of
-     slink:VkImageDrmFormatModifierListCreateInfoEXT::pname:drmFormatModifier
-     found by calling flink:vkGetImageDrmFormatModifierPropertiesEXT.
-  ** Let
-     slink:VkDrmFormatModifierPropertiesListEXT::pname:pDrmFormatModifierProperties
-     be the array found by calling
-     flink:vkGetPhysicalDeviceFormatProperties2 on the same pname:format as
-     slink:VkImageCreateInfo::pname:format.
-  ** Let `VkDrmFormatModifierPropertiesEXT prop` be an array element whose
-     pname:drmFormatModifier member is the value of the image's DRM format
-     modifier.
-  ** Then the image set of _format features_ is the value of taking the
-     bitwise intersection over the collected
-     `prop`::pname:drmFormatModifierTilingFeatures.
-endif::VK_EXT_image_drm_format_modifier[]
-
-
-ifdef::VK_NV_corner_sampled_image[]
-[[resources-images-corner-sampled]]
-=== Corner-Sampled Images
-
-A _corner-sampled image_ is an image where unnormalized texel coordinates
-are centered on integer values rather than half-integer values.
-
-A corner-sampled image has a number of differences compared to conventional
-texture image:
-
-  * Texels are centered on integer coordinates.
-    See <<textures-unnormalized-to-integer, Unnormalized Texel Coordinate
-    Operations>>
-  * Normalized coordinates are scaled using [eq]#coord {times} (dim - 1)#
-    rather than [eq]#coord {times} dim#, where dim is the size of one
-    dimension of the image.
-    See <<textures-normalized-to-unnormalized, normalized texel coordinate
-    transform>>.
-  * Partial derivatives are scaled using [eq]#coord {times} (dim - 1)#
-    rather than [eq]#coord {times} dim#.
-    See <<textures-scale-factor,Scale Factor Operation>>.
-  * Calculation of the next higher lod size goes according to
-    [eq]#{lceil}dim / 2{rceil}# rather than [eq]#{lfloor}dim / 2{rfloor}#.
-    See <<resources-image-miplevel-sizing,Image Miplevel Sizing>>.
-  * The minimum level size is 2x2 for 2D images and 2x2x2 for 3D images.
-    See <<resources-image-miplevel-sizing,Image Miplevel Sizing>>.
-
-Corner-sampling is only supported for 2D and 3D images.
-When sampling a corner-sampled image, the sampler addressing mode must: be
-ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE.
-Corner-sampled images are not supported as cube maps or depth/stencil
-images.
-endif::VK_NV_corner_sampled_image[]
-
-
-[[resources-image-miplevel-sizing]]
-=== Image Miplevel Sizing
-
-A _complete mipmap chain_ is the full set of miplevels, from the largest
-miplevel provided, down to the _minimum miplevel size_.
-
-
-==== Conventional Images
-
-For conventional images, the dimensions of each successive miplevel,
-[eq]#n+1#, are:
-
-  {empty}:: [eq]#pname:width~n+1~ = max({lfloor}pname:width~n~/2{rfloor},
-            1)#
-  {empty}:: [eq]#pname:height~n+1~ = max({lfloor}pname:height~n~/2{rfloor},
-            1)#
-  {empty}:: [eq]#pname:depth~n+1~ = max({lfloor}pname:depth~n~/2{rfloor},
-            1)#
-
-where [eq]#pname:width~n~#, [eq]#pname:height~n~#, and [eq]#pname:depth~n~#
-are the dimensions of the next larger miplevel, [eq]#n#.
-
-The minimum miplevel size is:
-
-  * 1 for one-dimensional images,
-  * 1x1 for two-dimensional images, and
-  * 1x1x1 for three-dimensional images.
-
-The number of levels in a complete mipmap chain is:
-
-  {empty}:: [eq]#{lfloor}log~2~(max(pname:width~0~, pname:height~0~,
-            pname:depth~0~)){rfloor} {plus} 1#
-
-where [eq]#pname:width~0~#, [eq]#pname:height~0~#, and [eq]#pname:depth~0~#
-are the dimensions of the largest (most detailed) miplevel, `0`.
-
-
-ifdef::VK_NV_corner_sampled_image[]
-==== Corner-Sampled Images
-
-For corner-sampled images, the dimensions of each successive miplevel,
-[eq]#n+1#, are:
-
-  {empty}:: [eq]#pname:width~n+1~ = max({lceil}pname:width~n~/2{rceil}, 2)#
-  {empty}:: [eq]#pname:height~n+1~ = max({lceil}pname:height~n~/2{rceil},
-            2)#
-  {empty}:: [eq]#pname:depth~n+1~ = max({lceil}pname:depth~n~/2{rceil}, 2)#
-
-where [eq]#pname:width~n~#, [eq]#pname:height~n~#, and [eq]#pname:depth~n~#
-are the dimensions of the next larger miplevel, [eq]#n#.
-
-The minimum miplevel size is:
-
-  * 2x2 for two-dimensional images, and
-  * 2x2x2 for three-dimensional images.
-
-The number of levels in a complete mipmap chain is:
-
-  {empty}:: [eq]#{lceil}log~2~(max(pname:width~0~, pname:height~0~,
-            pname:depth~0~)){rceil}#
-
-where [eq]#pname:width~0~#, [eq]#pname:height~0~#, and [eq]#pname:depth~0~#
-are the dimensions of the largest (most detailed) miplevel, `0`.
-endif::VK_NV_corner_sampled_image[]
-
-
-[[resources-image-layouts]]
-== Image Layouts
-
-Images are stored in implementation-dependent opaque layouts in memory.
-Each layout has limitations on what kinds of operations are supported for
-image subresources using the layout.
-At any given time, the data representing an image subresource in memory
-exists in a particular layout which is determined by the most recent layout
-transition that was performed on that image subresource.
-Applications have control over which layout each image subresource uses, and
-can: transition an image subresource from one layout to another.
-Transitions can: happen with an image memory barrier, included as part of a
-flink:vkCmdPipelineBarrier or a flink:vkCmdWaitEvents command buffer command
-(see <<synchronization-image-memory-barriers>>), or as part of a subpass
-dependency within a render pass (see sname:VkSubpassDependency).
-
-Image layout is per-image subresource.
-Separate image subresources of the same image can: be in different layouts
-at the same time, with the exception that depth and stencil aspects of a
-given image subresource can: only be in different layouts if the
-<<features-separateDepthStencilLayouts, pname:separateDepthStencilLayouts>>
-feature is enabled.
-
-[NOTE]
-.Note
-====
-Each layout may: offer optimal performance for a specific usage of image
-memory.
-For example, an image with a layout of
-ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL may: provide optimal
-performance for use as a color attachment, but be unsupported for use in
-transfer commands.
-Applications can: transition an image subresource from one layout to another
-in order to achieve optimal performance when the image subresource is used
-for multiple kinds of operations.
-After initialization, applications need not use any layout other than the
-general layout, though this may: produce suboptimal performance on some
-implementations.
-====
-
-Upon creation, all image subresources of an image are initially in the same
-layout, where that layout is selected by the
-sname:VkImageCreateInfo::pname:initialLayout member.
-The pname:initialLayout must: be either ename:VK_IMAGE_LAYOUT_UNDEFINED or
-ename:VK_IMAGE_LAYOUT_PREINITIALIZED.
-If it is ename:VK_IMAGE_LAYOUT_PREINITIALIZED, then the image data can: be
-preinitialized by the host while using this layout, and the transition away
-from this layout will preserve that data.
-If it is ename:VK_IMAGE_LAYOUT_UNDEFINED, then the contents of the data are
-considered to be undefined:, and the transition away from this layout is not
-guaranteed to preserve that data.
-For either of these initial layouts, any image subresources must: be
-transitioned to another layout before they are accessed by the device.
-
-Host access to image memory is only well-defined for
-<<glossary-linear-resource,linear>> images and for image subresources of
-those images which are currently in either the
-ename:VK_IMAGE_LAYOUT_PREINITIALIZED or ename:VK_IMAGE_LAYOUT_GENERAL
-layout.
-Calling flink:vkGetImageSubresourceLayout for a linear image returns a
-subresource layout mapping that is valid for either of those image layouts.
-
-[open,refpage='VkImageLayout',desc='Layout of image and image subresources',type='enums']
---
-The set of image layouts consists of:
-
-include::{generated}/api/enums/VkImageLayout.txt[]
-
-The type(s) of device access supported by each layout are:
-
-  * ename:VK_IMAGE_LAYOUT_UNDEFINED specifies that the layout is unknown.
-    Image memory cannot: be transitioned into this layout.
-    This layout can: be used as the pname:initialLayout member of
-    slink:VkImageCreateInfo.
-    This layout can: be used in place of the current image layout in a
-    layout transition, but doing so will cause the contents of the image's
-    memory to be undefined:.
-  * ename:VK_IMAGE_LAYOUT_PREINITIALIZED specifies that an image's memory is
-    in a defined layout and can: be populated by data, but that it has not
-    yet been initialized by the driver.
-    Image memory cannot: be transitioned into this layout.
-    This layout can: be used as the pname:initialLayout member of
-    slink:VkImageCreateInfo.
-    This layout is intended to be used as the initial layout for an image
-    whose contents are written by the host, and hence the data can: be
-    written to memory immediately, without first executing a layout
-    transition.
-    Currently, ename:VK_IMAGE_LAYOUT_PREINITIALIZED is only useful with
-    <<glossary-linear-resource,linear>> images because there is not a
-    standard layout defined for ename:VK_IMAGE_TILING_OPTIMAL images.
-  * ename:VK_IMAGE_LAYOUT_GENERAL supports all types of device access.
-ifdef::VK_KHR_synchronization2[]
-  * ename:VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR specifies a layout that
-    must: only be used with attachment accesses in the graphics pipeline.
-  * ename:VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR specifies a layout allowing
-    read only access as an attachment, or in shaders as a sampled image,
-    combined image/sampler, or input attachment.
-endif::VK_KHR_synchronization2[]
-  * ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL must: only be used as a
-    color or resolve attachment in a sname:VkFramebuffer.
-    This layout is valid only for image subresources of images created with
-    the ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT usage bit enabled.
-  * ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL specifies a
-    layout for both the depth and stencil aspects of a depth/stencil format
-    image allowing read and write access as a depth/stencil attachment.
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-    It is equivalent to ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL and
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL.
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL specifies a layout
-    for both the depth and stencil aspects of a depth/stencil format image
-    allowing read only access as a depth/stencil attachment or in shaders as
-    a sampled image, combined image/sampler, or input attachment.
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-    It is equivalent to ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL and
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL.
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-  * ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL
-    specifies a layout for depth/stencil format images allowing read and
-    write access to the stencil aspect as a stencil attachment, and read
-    only access to the depth aspect as a depth attachment or in shaders as a
-    sampled image, combined image/sampler, or input attachment.
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-    It is equivalent to ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL and
-    ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL.
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL
-    specifies a layout for depth/stencil format images allowing read and
-    write access to the depth aspect as a depth attachment, and read only
-    access to the stencil aspect as a stencil attachment or in shaders as a
-    sampled image, combined image/sampler, or input attachment.
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-    It is equivalent to ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL and
-    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL.
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL specifies a layout for
-    the depth aspect of a depth/stencil format image allowing read and write
-    access as a depth attachment.
-  * ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL specifies a layout for the
-    depth aspect of a depth/stencil format image allowing read-only access
-    as a depth attachment or in shaders as a sampled image, combined
-    image/sampler, or input attachment.
-  * ename:VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL specifies a layout for
-    the stencil aspect of a depth/stencil format image allowing read and
-    write access as a stencil attachment.
-  * ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL specifies a layout for
-    the stencil aspect of a depth/stencil format image allowing read-only
-    access as a stencil attachment or in shaders as a sampled image,
-    combined image/sampler, or input attachment.
-endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
-  * ename:VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL specifies a layout
-    allowing read-only access in a shader as a sampled image, combined
-    image/sampler, or input attachment.
-    This layout is valid only for image subresources of images created with
-    the ename:VK_IMAGE_USAGE_SAMPLED_BIT or
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT usage bits enabled.
-  * ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL must: only be used as a
-    source image of a transfer command (see the definition of
-    <<synchronization-pipeline-stages-transfer,
-    ename:VK_PIPELINE_STAGE_TRANSFER_BIT>>).
-    This layout is valid only for image subresources of images created with
-    the ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage bit enabled.
-  * ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL must: only be used as a
-    destination image of a transfer command.
-    This layout is valid only for image subresources of images created with
-    the ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT usage bit enabled.
-ifdef::VK_KHR_swapchain[]
-  * ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR must: only be used for presenting
-    a presentable image for display.
-    A swapchain's image must: be transitioned to this layout before calling
-    flink:vkQueuePresentKHR, and must: be transitioned away from this layout
-    after calling flink:vkAcquireNextImageKHR.
-ifdef::VK_KHR_shared_presentable_image[]
-  * ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR is valid only for shared
-    presentable images, and must: be used for any usage the image supports.
-endif::VK_KHR_shared_presentable_image[]
-endif::VK_KHR_swapchain[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  * ename:VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR must:
-    only be used as a
-ifdef::VK_KHR_fragment_shading_rate[]
-    <<primsrast-fragment-shading-rate-attachment, fragment shading rate
-    attachment>>
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[or]
-ifdef::VK_NV_shading_rate_image[]
-    <<primsrast-shading-rate-image, shading rate image>>.
-endif::VK_NV_shading_rate_image[]
-    This layout is valid only for image subresources of images created with
-    the ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR usage
-    bit enabled.
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-ifdef::VK_EXT_fragment_density_map[]
-  * ename:VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT must: only be
-    used as a fragment density map attachment in a sname:VkRenderPass.
-    This layout is valid only for image subresources of images created with
-    the ename:VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT usage bit enabled.
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_KHR_video_decode_queue[]
-  * ename:VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR must: only be used as a
-    decode output image of a <<video-decode-operations, video decode
-    operation>>.
-    This layout is valid only for image subresources of images created with
-    the ename:VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR usage bit enabled.
-  * ename:VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR must: only be used as a
-    decode source image of a <<video-decode-operations, video decode
-    operation>>.
-    This layout is valid only for image subresources of images created with
-    the ename:VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR usage bit enabled.
-  * ename:VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR must: only be used as a
-    decode source or destination image of a <<video-decode-operations, video
-    decode operation>>.
-    This layout is valid only for image subresources of images created with
-    the ename:VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR usage bit enabled.
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-  * ename:VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR must: only be used as a
-    encode output image of a <<video-encode-operations, video encode
-    operation>>.
-    This layout is valid only for image subresources of images created with
-    the ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR usage bit enabled.
-  * ename:VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR must: only be used as a
-    encode source image of a <<video-encode-operations, video encode
-    operation>>.
-    This layout is valid only for image subresources of images created with
-    the ename:VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR usage bit enabled.
-  * ename:VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR must: only be used as a
-    encode source or destination image of a <<video-encode-operations, video
-    encode operation>>.
-    This layout is valid only for image subresources of images created with
-    the ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR usage bit enabled.
-endif::VK_KHR_video_encode_queue[]
-
-The layout of each image subresource is not a state of the image subresource
-itself, but is rather a property of how the data in memory is organized, and
-thus for each mechanism of accessing an image in the API the application
-must: specify a parameter or structure member that indicates which image
-layout the image subresource(s) are considered to be in when the image will
-be accessed.
-For transfer commands, this is a parameter to the command (see <<clears>>
-and <<copies>>).
-For use as a framebuffer attachment, this is a member in the substructures
-of the slink:VkRenderPassCreateInfo (see <<renderpass,Render Pass>>).
-For use in a descriptor set, this is a member in the
-sname:VkDescriptorImageInfo structure (see <<descriptorsets-updates>>).
---
-
-
-[[resources-image-layouts-matching-rule]]
-=== Image Layout Matching Rules
-
-At the time that any command buffer command accessing an image executes on
-any queue, the layouts of the image subresources that are accessed must: all
-match exactly the layout specified via the API controlling those accesses
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-, except in case of accesses to an image with a depth/stencil format
-performed through descriptors referring to only a single aspect of the
-image, where the following relaxed matching rules apply:
-
-  * Descriptors referring just to the depth aspect of a depth/stencil image
-    only need to match in the image layout of the depth aspect, thus
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL and
-    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL are
-    considered to match.
-  * Descriptors referring just to the stencil aspect of a depth/stencil
-    image only need to match in the image layout of the stencil aspect, thus
-    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL and
-    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL are
-    considered to match
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-.
-
-When performing a layout transition on an image subresource, the old layout
-value must: either equal the current layout of the image subresource (at the
-time the transition executes), or else be ename:VK_IMAGE_LAYOUT_UNDEFINED
-(implying that the contents of the image subresource need not be preserved).
-The new layout used in a transition must: not be
-ename:VK_IMAGE_LAYOUT_UNDEFINED or ename:VK_IMAGE_LAYOUT_PREINITIALIZED.
-
-ifdef::VK_EXT_sample_locations[]
-
-The image layout of each image subresource of a depth/stencil image created
-with ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT is
-dependent on the last sample locations used to render to the image
-subresource as a depth/stencil attachment, thus applications must: provide
-the same sample locations that were last used to render to the given image
-subresource whenever a layout transition of the image subresource happens,
-otherwise the contents of the depth aspect of the image subresource become
-undefined:.
-
-In addition, depth reads from a depth/stencil attachment referring to an
-image subresource range of a depth/stencil image created with
-ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT using
-different sample locations than what have been last used to perform depth
-writes to the image subresources of the same image subresource range return
-undefined: values.
-
-Similarly, depth writes to a depth/stencil attachment referring to an image
-subresource range of a depth/stencil image created with
-ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT using
-different sample locations than what have been last used to perform depth
-writes to the image subresources of the same image subresource range make
-the contents of the depth aspect of those image subresources undefined:.
-
-endif::VK_EXT_sample_locations[]
-
-
-[[resources-image-views]]
-== Image Views
-
-[open,refpage='VkImageView',desc='Opaque handle to an image view object',type='handles']
---
-Image objects are not directly accessed by pipeline shaders for reading or
-writing image data.
-Instead, _image views_ representing contiguous ranges of the image
-subresources and containing additional metadata are used for that purpose.
-Views must: be created on images of compatible types, and must: represent a
-valid subset of image subresources.
-
-Image views are represented by sname:VkImageView handles:
-
-include::{generated}/api/handles/VkImageView.txt[]
---
-
-[open,refpage='VK_REMAINING_ARRAY_LAYERS',desc='Sentinel for all remaining array layers',type='consts']
---
-ename:VK_REMAINING_ARRAY_LAYERS is a special constant value used for image
-views to indicate that all remaining array layers in an image after the base
-layer should be included in the view.
-
-include::{generated}/api/enums/VK_REMAINING_ARRAY_LAYERS.txt[]
---
-
-[open,refpage='VK_REMAINING_MIP_LEVELS',desc='Sentinel for all remaining array layers',type='consts']
---
-ename:VK_REMAINING_MIP_LEVELS is a special constant value used for image
-views to indicate that all remaining mipmap levels in an image after the
-base level should be included in the view.
-
-include::{generated}/api/enums/VK_REMAINING_MIP_LEVELS.txt[]
---
-
-[open,refpage='VkImageViewType',desc='Image view types',type='enums']
---
-The types of image views that can: be created are:
-
-include::{generated}/api/enums/VkImageViewType.txt[]
---
-
-[open,refpage='vkCreateImageView',desc='Create an image view from an existing image',type='protos']
---
-To create an image view, call:
-
-include::{generated}/api/protos/vkCreateImageView.txt[]
-
-  * pname:device is the logical device that creates the image view.
-  * pname:pCreateInfo is a pointer to a sname:VkImageViewCreateInfo
-    structure containing parameters to be used to create the image view.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pView is a pointer to a slink:VkImageView handle in which the
-    resulting image view object is returned.
-
-include::{generated}/validity/protos/vkCreateImageView.txt[]
---
-
-[open,refpage='VkImageViewCreateInfo',desc='Structure specifying parameters of a newly created image view',type='structs']
---
-The sname:VkImageViewCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkImageViewCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkImageViewCreateFlagBits describing
-    additional parameters of the image view.
-  * pname:image is a slink:VkImage on which the view will be created.
-  * pname:viewType is a elink:VkImageViewType value specifying the type of
-    the image view.
-  * pname:format is a elink:VkFormat describing the format and type used to
-    interpret texel blocks in the image.
-  * pname:components is a slink:VkComponentMapping structure specifying a
-    remapping of color components (or of depth or stencil components after
-    they have been converted into color components).
-  * pname:subresourceRange is a slink:VkImageSubresourceRange structure
-    selecting the set of mipmap levels and array layers to be accessible to
-    the view.
-
-[[resources-image-inherited-usage]]
-Some of the pname:image creation parameters are inherited by the view.
-In particular, image view creation inherits the implicit parameter
-pname:usage specifying the allowed usages of the image view that, by
-default, takes the value of the corresponding pname:usage parameter
-specified in slink:VkImageCreateInfo at image creation time.
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-The implicit pname:usage can: be overriden by adding a
-slink:VkImageViewUsageCreateInfo structure to the pname:pNext chain, but the
-view usage must: be a subset of the image usage.
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-If pname:image has a depth-stencil format and was created with a
-slink:VkImageStencilUsageCreateInfo structure included in the pname:pNext
-chain of slink:VkImageCreateInfo, the usage is calculated based on the
-pname:subresource.aspectMask provided:
-
-  * If pname:aspectMask includes only ename:VK_IMAGE_ASPECT_STENCIL_BIT, the
-    implicit pname:usage is equal to
-    slink:VkImageStencilUsageCreateInfo::pname:stencilUsage.
-  * If pname:aspectMask includes only ename:VK_IMAGE_ASPECT_DEPTH_BIT, the
-    implicit pname:usage is equal to slink:VkImageCreateInfo::pname:usage.
-  * If both aspects are included in pname:aspectMask, the implicit
-    pname:usage is equal to the intersection of
-    slink:VkImageCreateInfo::pname:usage and
-    slink:VkImageStencilUsageCreateInfo::pname:stencilUsage.
-endif::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-
-If pname:image was created with the ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
-flag,
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-and if the pname:format of the image is not
-<<formats-requiring-sampler-ycbcr-conversion,multi-planar>>,
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-pname:format can: be different from the image's format, but if
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-pname:image was created without the
-ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag and
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-they are not equal they must: be _compatible_.
-Image format compatibility is defined in the
-<<formats-compatibility-classes,Format Compatibility Classes>> section.
-Views of compatible formats will have the same mapping between texel
-coordinates and memory locations irrespective of the pname:format, with only
-the interpretation of the bit pattern changing.
-
-[NOTE]
-.Note
-====
-Values intended to be used with one view format may: not be exactly
-preserved when written or read through a different format.
-For example, an integer value that happens to have the bit pattern of a
-floating point denorm or NaN may: be flushed or canonicalized when written
-or read through a view with a floating point format.
-Similarly, a value written through a signed normalized format that has a bit
-pattern exactly equal to [eq]#-2^b^# may: be changed to [eq]#-2^b^ {plus} 1#
-as described in <<fundamentals-fixedfpconv,Conversion from Normalized
-Fixed-Point to Floating-Point>>.
-====
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-If pname:image was created with the
-ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag, pname:format
-must: be _compatible_ with the image's format as described above, or must:
-be an uncompressed format in which case it must: be _size-compatible_ with
-the image's format, as defined for
-<<copies-images-format-size-compatibility, copying data between images>>.
-In this case, the resulting image view's texel dimensions equal the
-dimensions of the selected mip level divided by the compressed texel block
-size and rounded up.
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-
-The slink:VkComponentMapping pname:components member describes a remapping
-from components of the image to components of the vector returned by shader
-image instructions.
-This remapping must: be the identity swizzle for storage image descriptors,
-input attachment descriptors,
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-and framebuffer attachments.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-framebuffer attachments, and any sname:VkImageView used with a combined
-image sampler that enables <<samplers-YCbCr-conversion,sampler Y'C~B~C~R~
-conversion>>.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-If the image view is to be used with a sampler which supports
-<<samplers-YCbCr-conversion,sampler {YCbCr} conversion>>, an _identically
-defined object_ of type slink:VkSamplerYcbcrConversion to that used to
-create the sampler must: be passed to flink:vkCreateImageView in a
-slink:VkSamplerYcbcrConversionInfo included in the pname:pNext chain of
-slink:VkImageViewCreateInfo.
-Conversely, if a slink:VkSamplerYcbcrConversion object is passed to
-flink:vkCreateImageView, an identically defined
-slink:VkSamplerYcbcrConversion object must: be used when sampling the image.
-
-If the image has a
-<<formats-requiring-sampler-ycbcr-conversion,multi-planar>> pname:format and
-pname:subresourceRange.aspectMask is ename:VK_IMAGE_ASPECT_COLOR_BIT,
-ifdef::VK_KHR_video_decode_queue[]
-and pname:image has been created with a pname:usage value *not* containing
-any of the ename:VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR,
-ename:VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR,
-ename:VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR,
-ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR,
-ename:VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR, and
-ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR flags,
-endif::VK_KHR_video_decode_queue[]
-then the pname:format must: be identical to the image pname:format, and the
-sampler to be used with the image view must: enable
-<<samplers-YCbCr-conversion,sampler {YCbCr} conversion>>.
-
-ifdef::VK_KHR_video_decode_queue[]
-If the image has a
-<<formats-requiring-sampler-ycbcr-conversion,multi-planar>> pname:format and
-the pname:image has been created with a pname:usage value containing any of
-the ename:VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR,
-ename:VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR, and
-ename:VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR flags, then all of the
-<<video-decode-operations, video decode operations>> would ignore the
-slink:VkSamplerYcbcrConversionInfo structure and/or
-<<samplers-YCbCr-conversion,sampler Y'C~B~C~R~ conversion>> object,
-associated with the image view.
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-If the image has a
-<<formats-requiring-sampler-ycbcr-conversion,multi-planar>> pname:format and
-the pname:image has been created with a pname:usage value containing any of
-the ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR,
-ename:VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR, and
-ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR flags, then all of the
-<<video-encode-operations, video encode operations>> would ignore the
-slink:VkSamplerYcbcrConversionInfo structure and/or
-<<samplers-YCbCr-conversion,sampler Y'C~B~C~R~ conversion>> object,
-associated with the image view.
-endif::VK_KHR_video_encode_queue[]
-
-If pname:image was created with the ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
-and the image has a
-<<formats-requiring-sampler-ycbcr-conversion,multi-planar>> pname:format,
-and if pname:subresourceRange.aspectMask is
-ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT, or
-ename:VK_IMAGE_ASPECT_PLANE_2_BIT, pname:format must: be
-<<formats-compatible-planes,compatible>> with the corresponding plane of the
-image, and the sampler to be used with the image view must: not enable
-<<samplers-YCbCr-conversion,sampler {YCbCr} conversion>>.
-The pname:width and pname:height of the single-plane image view must: be
-derived from the multi-planar image's dimensions in the manner listed for
-<<formats-compatible-planes,plane compatibility>> for the plane.
-
-Any view of an image plane will have the same mapping between texel
-coordinates and memory locations as used by the components of the color
-aspect, subject to the formulae relating texel coordinates to
-lower-resolution planes as described in <<textures-chroma-reconstruction,
-Chroma Reconstruction>>.
-That is, if an R or B plane has a reduced resolution relative to the G plane
-of the multi-planar image, the image view operates using the (_u~plane~_,
-_v~plane~_) unnormalized coordinates of the reduced-resolution plane, and
-these coordinates access the same memory locations as the (_u~color~_,
-_v~color~_) unnormalized coordinates of the color aspect for which chroma
-reconstruction operations operate on the same (_u~plane~_, _v~plane~_) or
-(_i~plane~_, _j~plane~_) coordinates.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-[[resources-image-views-compatibility]]
-.Image type and image view type compatibility requirements
-[cols="35%,50%",options="header"]
-|====
-| Image View Type | Compatible Image Types
-| ename:VK_IMAGE_VIEW_TYPE_1D         | ename:VK_IMAGE_TYPE_1D
-| ename:VK_IMAGE_VIEW_TYPE_1D_ARRAY   | ename:VK_IMAGE_TYPE_1D
-| ename:VK_IMAGE_VIEW_TYPE_2D         | ename:VK_IMAGE_TYPE_2D
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[, ename:VK_IMAGE_TYPE_3D]
-| ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY   | ename:VK_IMAGE_TYPE_2D
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[, ename:VK_IMAGE_TYPE_3D]
-| ename:VK_IMAGE_VIEW_TYPE_CUBE       | ename:VK_IMAGE_TYPE_2D
-| ename:VK_IMAGE_VIEW_TYPE_CUBE_ARRAY | ename:VK_IMAGE_TYPE_2D
-| ename:VK_IMAGE_VIEW_TYPE_3D         | ename:VK_IMAGE_TYPE_3D
-|====
-
-.Valid Usage
-****
-  * [[VUID-VkImageViewCreateInfo-image-01003]]
-    If pname:image was not created with
-    ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT then pname:viewType must: not
-    be ename:VK_IMAGE_VIEW_TYPE_CUBE or ename:VK_IMAGE_VIEW_TYPE_CUBE_ARRAY
-  * [[VUID-VkImageViewCreateInfo-viewType-01004]]
-    If the <<features-imageCubeArray,image cube map arrays>> feature is not
-    enabled, pname:viewType must: not be ename:VK_IMAGE_VIEW_TYPE_CUBE_ARRAY
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-VkImageViewCreateInfo-image-01005]]
-    If pname:image was created with ename:VK_IMAGE_TYPE_3D but without
-    ename:VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set then pname:viewType
-    must: not be ename:VK_IMAGE_VIEW_TYPE_2D or
-    ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY
-  * [[VUID-VkImageViewCreateInfo-image-04970]]
-    If pname:image was created with ename:VK_IMAGE_TYPE_3D and
-    pname:viewType is ename:VK_IMAGE_VIEW_TYPE_2D or
-    ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY then pname:subresourceRange.levelCount
-    must: be 1
-  * [[VUID-VkImageViewCreateInfo-image-04971]]
-    If pname:image was created with ename:VK_IMAGE_TYPE_3D and
-    pname:viewType is ename:VK_IMAGE_VIEW_TYPE_2D or
-    ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY then pname:flags must: not contain any
-    of ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT,
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, and
-    ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT
-  * [[VUID-VkImageViewCreateInfo-image-04972]]
-    If pname:image was created with a pname:samples value not equal to
-    ename:VK_SAMPLE_COUNT_1_BIT then pname:viewType must: be either
-    ename:VK_IMAGE_VIEW_TYPE_2D or ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-VkImageViewCreateInfo-image-04441]]
-    pname:image must: have been created with a pname:usage value containing
-    at least one of the usages defined in the <<valid-imageview-imageusage,
-    valid image usage>> list for image views
-  * [[VUID-VkImageViewCreateInfo-None-02273]]
-    The <<resources-image-view-format-features,format features>> of the
-    resultant image view must: contain at least one bit
-  * [[VUID-VkImageViewCreateInfo-usage-02274]]
-    If pname:usage contains ename:VK_IMAGE_USAGE_SAMPLED_BIT, then the
-    <<resources-image-view-format-features,format features>> of the
-    resultant image view must: contain
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
-  * [[VUID-VkImageViewCreateInfo-usage-02275]]
-    If pname:usage contains ename:VK_IMAGE_USAGE_STORAGE_BIT, then the image
-    view's <<resources-image-view-format-features,format features>> must:
-    contain ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
-  * [[VUID-VkImageViewCreateInfo-usage-02276]]
-    If pname:usage contains ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, then
-    the image view's <<resources-image-view-format-features,format
-    features>> must: contain ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
-  * [[VUID-VkImageViewCreateInfo-usage-02277]]
-    If pname:usage contains
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, then the image view's
-    <<resources-image-view-format-features,format features>> must: contain
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkImageViewCreateInfo-usage-02652]]
-    If pname:usage contains ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, then
-    the image view's <<resources-image-view-format-features,format
-    features>> must: contain at least one of
-    ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkImageViewCreateInfo-subresourceRange-01478]]
-    pname:subresourceRange.baseMipLevel must: be less than the
-    pname:mipLevels specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-VkImageViewCreateInfo-subresourceRange-01718]]
-    If pname:subresourceRange.levelCount is not
-    ename:VK_REMAINING_MIP_LEVELS, [eq]#pname:subresourceRange.baseMipLevel
-    {plus} pname:subresourceRange.levelCount# must: be less than or equal to
-    the pname:mipLevels specified in slink:VkImageCreateInfo when
-    pname:image was created
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-VkImageViewCreateInfo-image-02571]]
-    If pname:image was created with pname:usage containing
-    ename:VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT,
-    pname:subresourceRange.levelCount must: be `1`
-endif::VK_EXT_fragment_density_map[]
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-VkImageViewCreateInfo-subresourceRange-01480]]
-    pname:subresourceRange.baseArrayLayer must: be less than the
-    pname:arrayLayers specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-VkImageViewCreateInfo-subresourceRange-01719]]
-    If pname:subresourceRange.layerCount is not
-    ename:VK_REMAINING_ARRAY_LAYERS,
-    [eq]#pname:subresourceRange.baseArrayLayer {plus}
-    pname:subresourceRange.layerCount# must: be less than or equal to the
-    pname:arrayLayers specified in slink:VkImageCreateInfo when pname:image
-    was created
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-  * [[VUID-VkImageViewCreateInfo-image-01482]]
-    If pname:image is not a 3D image created with
-    ename:VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set, or pname:viewType is
-    not ename:VK_IMAGE_VIEW_TYPE_2D or ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY,
-    pname:subresourceRange.baseArrayLayer must: be less than the
-    pname:arrayLayers specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-VkImageViewCreateInfo-subresourceRange-01483]]
-    If pname:subresourceRange.layerCount is not
-    ename:VK_REMAINING_ARRAY_LAYERS, pname:image is not a 3D image created
-    with ename:VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set, or
-    pname:viewType is not ename:VK_IMAGE_VIEW_TYPE_2D or
-    ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY, pname:subresourceRange.layerCount
-    must: be non-zero and [eq]#pname:subresourceRange.baseArrayLayer {plus}
-    pname:subresourceRange.layerCount# must: be less than or equal to the
-    pname:arrayLayers specified in slink:VkImageCreateInfo when pname:image
-    was created
-  * [[VUID-VkImageViewCreateInfo-image-02724]]
-    If pname:image is a 3D image created with
-    ename:VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set, and pname:viewType is
-    ename:VK_IMAGE_VIEW_TYPE_2D or ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY,
-    pname:subresourceRange.baseArrayLayer must: be less than the depth
-    computed from pname:baseMipLevel and pname:extent.depth specified in
-    slink:VkImageCreateInfo when pname:image was created, according to the
-    formula defined in <<resources-image-miplevel-sizing,Image Miplevel
-    Sizing>>
-  * [[VUID-VkImageViewCreateInfo-subresourceRange-02725]]
-    If pname:subresourceRange.layerCount is not
-    ename:VK_REMAINING_ARRAY_LAYERS, pname:image is a 3D image created with
-    ename:VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set, and pname:viewType is
-    ename:VK_IMAGE_VIEW_TYPE_2D or ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY,
-    pname:subresourceRange.layerCount must: be non-zero and
-    [eq]#pname:subresourceRange.baseArrayLayer {plus}
-    pname:subresourceRange.layerCount# must: be less than or equal to the
-    depth computed from pname:baseMipLevel and pname:extent.depth specified
-    in slink:VkImageCreateInfo when pname:image was created, according to
-    the formula defined in <<resources-image-miplevel-sizing,Image Miplevel
-    Sizing>>
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-// The VU below comes in 4 alternate versions
-// both disabled, both enabled, maintenance2 only, ycbcr only
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkImageViewCreateInfo-image-01018]]
-    If pname:image was created with the
-    ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, pname:format must: be
-    compatible with the pname:format used to create pname:image, as defined
-    in <<formats-compatibility-classes,Format Compatibility Classes>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-// The nested ifdefs are there in anticipation of the hoped-for day when the
-// VU extractor and validation layers can handle VU with imbedded
-// conditionals. They are commented out until then.
-//
-// If VK_VERSION_1_1,VK_KHR_maintenance2 and NOT VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkImageViewCreateInfo-image-01759]]
-    If pname:image was created with the
-    ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, but without the
-    ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag, pname:format
-    must: be compatible with the pname:format used to create pname:image, as
-    defined in <<formats-compatibility-classes,Format Compatibility
-    Classes>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-// If NOT VK_VERSION_1_1,VK_KHR_maintenance2 and VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkImageViewCreateInfo-image-01760]]
-    If pname:image was created with the
-    ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, and if the pname:format
-    of the pname:image is not a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar>> format,
-    pname:format must: be compatible with the pname:format used to create
-    pname:image, as defined in <<formats-compatibility-classes,Format
-    Compatibility Classes>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-// If VK_VERSION_1_1,VK_KHR_maintenance2 and VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkImageViewCreateInfo-image-01761]]
-    If pname:image was created with the
-    ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag,
-// ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-    but without the ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT
-    flag,
-// endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-// ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-    and if the pname:format of the pname:image is not a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar>> format,
-// endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-    pname:format must: be compatible with the pname:format used to create
-    pname:image, as defined in <<formats-compatibility-classes,Format
-    Compatibility Classes>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-  * [[VUID-VkImageViewCreateInfo-image-01583]]
-    If pname:image was created with the
-    ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag, pname:format
-    must: be compatible with, or must: be an uncompressed format that is
-    size-compatible with, the pname:format used to create pname:image
-  * [[VUID-VkImageViewCreateInfo-image-01584]]
-    If pname:image was created with the
-    ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag, the
-    pname:levelCount and pname:layerCount members of pname:subresourceRange
-    must: both be `1`
-  * [[VUID-VkImageViewCreateInfo-image-04739]]
-    If pname:image was created with the
-    ename:VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag and
-    pname:format is a non-compressed format, pname:viewType must: not be
-    ename:VK_IMAGE_VIEW_TYPE_3D
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifdef::VK_VERSION_1_2,VK_KHR_image_format_list[]
-  * [[VUID-VkImageViewCreateInfo-pNext-01585]]
-    If a slink:VkImageFormatListCreateInfo structure was included in the
-    pname:pNext chain of the slink:VkImageCreateInfo structure used when
-    creating pname:image and
-    slink:VkImageFormatListCreateInfo::pname:viewFormatCount is not zero
-    then pname:format must: be one of the formats in
-    slink:VkImageFormatListCreateInfo::pname:pViewFormats
-endif::VK_VERSION_1_2,VK_KHR_image_format_list[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkImageViewCreateInfo-image-01586]]
-    If pname:image was created with the
-    ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, if the pname:format of
-    the pname:image is a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar>> format, and
-    if pname:subresourceRange.aspectMask is one of
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT, or
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT, then pname:format must: be compatible
-    with the elink:VkFormat for the plane of the pname:image pname:format
-    indicated by pname:subresourceRange.aspectMask, as defined in
-    <<formats-compatible-planes>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-// The VU below comes in an alternate version when the extension is
-// enabled.
-  * [[VUID-VkImageViewCreateInfo-image-01019]]
-    If pname:image was not created with the
-    ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, pname:format must: be
-    identical to the pname:format used to create pname:image
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-// The nested ifdefs are there in anticipation of the hoped-for day when the
-// VU extractor and validation layers can handle VU with imbedded
-// conditionals. They are commented out until then.
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkImageViewCreateInfo-image-01762]]
-    If pname:image was not created with the
-    ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag,
-// ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-    or if the pname:format of the pname:image is a
-    <<formats-requiring-sampler-ycbcr-conversion,multi-planar>> format and
-    if pname:subresourceRange.aspectMask is ename:VK_IMAGE_ASPECT_COLOR_BIT,
-// endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-    pname:format must: be identical to the pname:format used to create
-    pname:image
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkImageViewCreateInfo-format-06415]]
-    If the image pname:format is one of the
-    <<formats-requiring-sampler-ycbcr-conversion, formats that require a
-    sampler Y'C~B~C~R~ conversion>>, then the pname:pNext chain must:
-    include a slink:VkSamplerYcbcrConversionInfo structure with a conversion
-    value other than dlink:VK_NULL_HANDLE
-  * [[VUID-VkImageViewCreateInfo-format-04714]]
-    If pname:format has a code:_422 or code:_420 suffix then pname:image
-    must: have been created with a width that is a multiple of 2
-  * [[VUID-VkImageViewCreateInfo-format-04715]]
-    If pname:format has a code:_420 suffix then pname:image must: have been
-    created with a height that is a multiple of 2
-  * [[VUID-VkImageViewCreateInfo-pNext-01970]]
-    If the pname:pNext chain includes a slink:VkSamplerYcbcrConversionInfo
-    structure with a pname:conversion value other than dlink:VK_NULL_HANDLE,
-    all members of pname:components must: have the
-    <<resources-image-views-identity-mappings,identity swizzle>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkImageViewCreateInfo-image-01020]]
-    If pname:image is non-sparse then it must: be bound completely and
-    contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-VkImageViewCreateInfo-subResourceRange-01021]]
-    pname:viewType must: be compatible with the type of pname:image as shown
-    in the <<resources-image-views-compatibility,view type compatibility
-    table>>
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkImageViewCreateInfo-image-02399]]
-    If pname:image has an
-    <<memory-external-android-hardware-buffer-external-formats,external
-    format>>, pname:format must: be ename:VK_FORMAT_UNDEFINED
-  * [[VUID-VkImageViewCreateInfo-image-02400]]
-    If pname:image has an
-    <<memory-external-android-hardware-buffer-external-formats,external
-    format>>, the pname:pNext chain must: include a
-    slink:VkSamplerYcbcrConversionInfo structure with a pname:conversion
-    object created with the same external format as pname:image
-  * [[VUID-VkImageViewCreateInfo-image-02401]]
-    If pname:image has an
-    <<memory-external-android-hardware-buffer-external-formats,external
-    format>>, all members of pname:components must: be the
-    <<resources-image-views-identity-mappings,identity swizzle>>
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  * [[VUID-VkImageViewCreateInfo-image-02086]]
-    If pname:image was created with pname:usage containing
-    ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,
-    pname:viewType must: be ename:VK_IMAGE_VIEW_TYPE_2D or
-    ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-ifdef::VK_NV_shading_rate_image[]
-  * [[VUID-VkImageViewCreateInfo-image-02087]]
-    If the <<features-shadingRateImage, pname:shadingRateImage feature>> is
-    enabled, and If pname:image was created with pname:usage containing
-    ename:VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, pname:format must: be
-    ename:VK_FORMAT_R8_UINT
-endif::VK_NV_shading_rate_image[]
-ifdef::VK_KHR_fragment_shading_rate[]
-  * [[VUID-VkImageViewCreateInfo-usage-04550]]
-    If the <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate feature>> is enabled, and the
-    pname:usage for the image view includes
-    ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR, then the
-    image view's <<resources-image-view-format-features,format features>>
-    must: contain
-    ename:VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-  * [[VUID-VkImageViewCreateInfo-usage-04551]]
-    If the <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate feature>> is enabled, the
-    pname:usage for the image view includes
-    ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR, and
-    <<limits-layeredShadingRateAttachments,
-    pname:layeredShadingRateAttachments>> is ename:VK_FALSE,
-    pname:subresourceRange.layerCount must: be `1`
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-VkImageViewCreateInfo-flags-02572]]
-    If <<features-fragmentDensityMapDynamic,dynamic fragment density map>>
-    feature is not enabled, pname:flags must: not contain
-    ename:VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT
-ifdef::VK_EXT_fragment_density_map2[]
-  * [[VUID-VkImageViewCreateInfo-flags-03567]]
-    If <<features-fragmentDensityMapDeferred,deferred fragment density map>>
-    feature is not enabled, pname:flags must: not contain
-    ename:VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT
-  * [[VUID-VkImageViewCreateInfo-flags-03568]]
-    If pname:flags contains
-    ename:VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT,
-    pname:flags must: not contain
-    ename:VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT
-  * [[VUID-VkImageViewCreateInfo-image-03569]]
-    If pname:image was created with pname:flags containing
-    ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT and pname:usage containing
-    ename:VK_IMAGE_USAGE_SAMPLED_BIT, pname:subresourceRange.layerCount
-    must: be less than or equal to
-    <<limits-maxSubsampledArrayLayers,sname:VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::pname:maxSubsampledArrayLayers>>
-endif::VK_EXT_fragment_density_map2[]
-ifdef::VK_HUAWEI_invocation_mask[]
-  * [[VUID-VkImageViewCreateInfo-invocationMask-04993]]
-    If the <<features-invocationMask, pname:invocationMask feature>> is
-    enabled, and if pname:image was created with pname:usage containing
-    ename:VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI, pname:format must: be
-    ename:VK_FORMAT_R8_UINT
-endif::VK_HUAWEI_invocation_mask[]
-  * [[VUID-VkImageViewCreateInfo-flags-04116]]
-    If pname:flags does not contain
-    ename:VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT and
-    pname:image was created with pname:usage containing
-    ename:VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, its pname:flags must:
-    not contain any of ename:VK_IMAGE_CREATE_PROTECTED_BIT,
-    ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT,
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or
-    ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifndef::VK_VERSION_1_2+VK_EXT_separate_stencil_usage[]
-  * [[VUID-VkImageViewCreateInfo-pNext-02661]]
-    If the pname:pNext chain includes a slink:VkImageViewUsageCreateInfo
-    structure, its pname:usage member must: not include any bits that were
-    not set in the pname:usage member of the slink:VkImageCreateInfo
-    structure used to create pname:image
-endif::VK_VERSION_1_2+VK_EXT_separate_stencil_usage[]
-ifdef::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-  * [[VUID-VkImageViewCreateInfo-pNext-02662]]
-    If the pname:pNext chain includes a slink:VkImageViewUsageCreateInfo
-    structure, and pname:image was not created with a
-    slink:VkImageStencilUsageCreateInfo structure included in the
-    pname:pNext chain of slink:VkImageCreateInfo, its pname:usage member
-    must: not include any bits that were not set in the pname:usage member
-    of the slink:VkImageCreateInfo structure used to create pname:image
-  * [[VUID-VkImageViewCreateInfo-pNext-02663]]
-    If the pname:pNext chain includes a slink:VkImageViewUsageCreateInfo
-    structure, pname:image was created with a
-    slink:VkImageStencilUsageCreateInfo structure included in the
-    pname:pNext chain of slink:VkImageCreateInfo, and
-    pname:subresourceRange.aspectMask includes
-    ename:VK_IMAGE_ASPECT_STENCIL_BIT, the pname:usage member of the
-    slink:VkImageViewUsageCreateInfo structure must: not include any bits
-    that were not set in the pname:usage member of the
-    slink:VkImageStencilUsageCreateInfo structure used to create pname:image
-  * [[VUID-VkImageViewCreateInfo-pNext-02664]]
-    If the pname:pNext chain includes a slink:VkImageViewUsageCreateInfo
-    structure, pname:image was created with a
-    slink:VkImageStencilUsageCreateInfo structure included in the
-    pname:pNext chain of slink:VkImageCreateInfo, and
-    pname:subresourceRange.aspectMask includes bits other than
-    ename:VK_IMAGE_ASPECT_STENCIL_BIT, the pname:usage member of the
-    slink:VkImageViewUsageCreateInfo structure must: not include any bits
-    that were not set in the pname:usage member of the
-    slink:VkImageCreateInfo structure used to create pname:image
-endif::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-  * [[VUID-VkImageViewCreateInfo-imageViewType-04973]]
-    If pname:viewType is ename:VK_IMAGE_VIEW_TYPE_1D,
-    ename:VK_IMAGE_VIEW_TYPE_2D, or ename:VK_IMAGE_VIEW_TYPE_3D; and
-    pname:subresourceRange.layerCount is not
-    ename:VK_REMAINING_ARRAY_LAYERS, then pname:subresourceRange.layerCount
-    must: be 1
-  * [[VUID-VkImageViewCreateInfo-imageViewType-04974]]
-    If pname:viewType is ename:VK_IMAGE_VIEW_TYPE_1D,
-    ename:VK_IMAGE_VIEW_TYPE_2D, or ename:VK_IMAGE_VIEW_TYPE_3D; and
-    pname:subresourceRange.layerCount is ename:VK_REMAINING_ARRAY_LAYERS,
-    then the remaining number of layers must: be 1
-  * [[VUID-VkImageViewCreateInfo-viewType-02960]]
-    If pname:viewType is ename:VK_IMAGE_VIEW_TYPE_CUBE and
-    pname:subresourceRange.layerCount is not
-    ename:VK_REMAINING_ARRAY_LAYERS, pname:subresourceRange.layerCount must:
-    be `6`
-  * [[VUID-VkImageViewCreateInfo-viewType-02961]]
-    If pname:viewType is ename:VK_IMAGE_VIEW_TYPE_CUBE_ARRAY and
-    pname:subresourceRange.layerCount is not
-    ename:VK_REMAINING_ARRAY_LAYERS, pname:subresourceRange.layerCount must:
-    be a multiple of `6`
-  * [[VUID-VkImageViewCreateInfo-viewType-02962]]
-    If pname:viewType is ename:VK_IMAGE_VIEW_TYPE_CUBE and
-    pname:subresourceRange.layerCount is ename:VK_REMAINING_ARRAY_LAYERS,
-    the remaining number of layers must: be `6`
-  * [[VUID-VkImageViewCreateInfo-viewType-02963]]
-    If pname:viewType is ename:VK_IMAGE_VIEW_TYPE_CUBE_ARRAY and
-    pname:subresourceRange.layerCount is ename:VK_REMAINING_ARRAY_LAYERS,
-    the remaining number of layers must: be a multiple of `6`
-ifdef::VK_KHR_portability_subset[]
-  * [[VUID-VkImageViewCreateInfo-imageViewFormatSwizzle-04465]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:imageViewFormatSwizzle
-    is ename:VK_FALSE, all elements of pname:components must: have the
-    <<resources-image-views-identity-mappings,identity swizzle>>
-  * [[VUID-VkImageViewCreateInfo-imageViewFormatReinterpretation-04466]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:imageViewFormatReinterpretation
-    is ename:VK_FALSE, the elink:VkFormat in pname:format must: not contain
-    a different number of components, or a different number of bits in each
-    component, than the format of the sname:VkImage in pname:image
-endif::VK_KHR_portability_subset[]
-ifdef::VK_KHR_video_decode_queue[]
-  * [[VUID-VkImageViewCreateInfo-image-04817]]
-    If pname:image was created with pname:usage containing
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR,
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR,
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR, then the pname:viewType
-    must: be ename:VK_IMAGE_VIEW_TYPE_2D or
-    ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY and all members of pname:components
-    must: have the <<resources-image-views-identity-mappings,identity
-    swizzle>>
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-  * [[VUID-VkImageViewCreateInfo-image-04818]]
-    If pname:image was created with pname:usage containing
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR,
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR,
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR, then the pname:viewType
-    must: be ename:VK_IMAGE_VIEW_TYPE_2D or
-    ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY and all members of pname:components
-    must: have the <<resources-image-views-identity-mappings,identity
-    swizzle>>
-endif::VK_KHR_video_encode_queue[]
-****
-
-include::{generated}/validity/structs/VkImageViewCreateInfo.txt[]
---
-
-[open,refpage='VkImageViewCreateFlagBits',desc='Bitmask specifying additional parameters of an image view',type='enums']
---
-Bits which can: be set in slink:VkImageViewCreateInfo::pname:flags,
-specifying additional parameters of an image view, are:
-
-include::{generated}/api/enums/VkImageViewCreateFlagBits.txt[]
-
-ifdef::VK_EXT_fragment_density_map[]
-  * ename:VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT
-    specifies that the fragment density map will be read by device during
-    ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_EXT_fragment_density_map2[]
-  * ename:VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT
-    specifies that the fragment density map will be read by the host during
-    flink:vkEndCommandBuffer for the primary command buffer that the render
-    pass is recorded into
-endif::VK_EXT_fragment_density_map2[]
---
-
-[open,refpage='VkImageViewCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkImageViewCreateFlags.txt[]
-
-tname:VkImageViewCreateFlags is a bitmask type for setting a mask of zero or
-more elink:VkImageViewCreateFlagBits.
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-[open,refpage='VkImageViewUsageCreateInfo',desc='Specify the intended usage of an image view',type='structs']
---
-The set of usages for the created image view can: be restricted compared to
-the parent image's pname:usage flags by adding a
-sname:VkImageViewUsageCreateInfo structure to the pname:pNext chain of
-slink:VkImageViewCreateInfo.
-
-The sname:VkImageViewUsageCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkImageViewUsageCreateInfo.txt[]
-
-ifdef::VK_KHR_maintenance2[]
-or the equivalent
-
-include::{generated}/api/structs/VkImageViewUsageCreateInfoKHR.txt[]
-endif::VK_KHR_maintenance2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:usage is a bitmask of elink:VkImageUsageFlagBits specifying
-    allowed usages of the image view.
-
-When this structure is chained to slink:VkImageViewCreateInfo the
-pname:usage field overrides the implicit pname:usage parameter inherited
-from image creation time and its value is used instead for the purposes of
-determining the valid usage conditions of slink:VkImageViewCreateInfo.
-
-include::{generated}/validity/structs/VkImageViewUsageCreateInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-
-[open,refpage='VkImageSubresourceRange',desc='Structure specifying an image subresource range',type='structs']
---
-The sname:VkImageSubresourceRange structure is defined as:
-
-include::{generated}/api/structs/VkImageSubresourceRange.txt[]
-
-  * pname:aspectMask is a bitmask of elink:VkImageAspectFlagBits specifying
-    which aspect(s) of the image are included in the view.
-  * pname:baseMipLevel is the first mipmap level accessible to the view.
-  * pname:levelCount is the number of mipmap levels (starting from
-    pname:baseMipLevel) accessible to the view.
-  * pname:baseArrayLayer is the first array layer accessible to the view.
-  * pname:layerCount is the number of array layers (starting from
-    pname:baseArrayLayer) accessible to the view.
-
-The number of mipmap levels and array layers must: be a subset of the image
-subresources in the image.
-If an application wants to use all mip levels or layers in an image after
-the pname:baseMipLevel or pname:baseArrayLayer, it can: set pname:levelCount
-and pname:layerCount to the special values ename:VK_REMAINING_MIP_LEVELS and
-ename:VK_REMAINING_ARRAY_LAYERS without knowing the exact number of mip
-levels or layers.
-
-For cube and cube array image views, the layers of the image view starting
-at pname:baseArrayLayer correspond to faces in the order +X, -X, +Y, -Y, +Z,
--Z.
-For cube arrays, each set of six sequential layers is a single cube, so the
-number of cube maps in a cube map array view is _pname:layerCount / 6_, and
-image array layer [eq]#(pname:baseArrayLayer {plus} i)# is face index
-[eq]#(i mod 6)# of cube _i / 6_.
-If the number of layers in the view, whether set explicitly in
-pname:layerCount or implied by ename:VK_REMAINING_ARRAY_LAYERS, is not a
-multiple of 6, the last cube map in the array must: not be accessed.
-
-pname:aspectMask must: be only ename:VK_IMAGE_ASPECT_COLOR_BIT,
-ename:VK_IMAGE_ASPECT_DEPTH_BIT or ename:VK_IMAGE_ASPECT_STENCIL_BIT if
-pname:format is a color, depth-only or stencil-only format,
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-respectively.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-respectively, except if pname:format is a
-<<formats-requiring-sampler-ycbcr-conversion,multi-planar format>>.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-If using a depth/stencil format with both depth and stencil components,
-pname:aspectMask must: include at least one of
-ename:VK_IMAGE_ASPECT_DEPTH_BIT and ename:VK_IMAGE_ASPECT_STENCIL_BIT, and
-can: include both.
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-When the sname:VkImageSubresourceRange structure is used to select a subset
-of the slices of a 3D image's mip level in order to create a 2D or 2D array
-image view of a 3D image created with
-ename:VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT, pname:baseArrayLayer and
-pname:layerCount specify the first slice index and the number of slices to
-include in the created image view.
-Such an image view can: be used as a framebuffer attachment that refers only
-to the specified range of slices of the selected mip level.
-However, any layout transitions performed on such an attachment view during
-a render pass instance still apply to the entire subresource referenced
-which includes all the slices of the selected mip level.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-
-When using an image view of a depth/stencil image to populate a descriptor
-set (e.g. for sampling in the shader, or for use as an input attachment),
-the pname:aspectMask must: only include one bit, which selects whether the
-image view is used for depth reads (i.e. using a floating-point sampler or
-input attachment in the shader) or stencil reads (i.e. using an unsigned
-integer sampler or input attachment in the shader).
-When an image view of a depth/stencil image is used as a depth/stencil
-framebuffer attachment, the pname:aspectMask is ignored and both depth and
-stencil image subresources are used.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-When creating a sname:VkImageView, if <<samplers-YCbCr-conversion,sampler
-{YCbCr} conversion>> is enabled in the sampler, the pname:aspectMask of a
-pname:subresourceRange used by the sname:VkImageView must: be
-ename:VK_IMAGE_ASPECT_COLOR_BIT.
-
-When creating a sname:VkImageView, if sampler {YCbCr} conversion is not
-enabled in the sampler and the image pname:format is
-<<formats-requiring-sampler-ycbcr-conversion,multi-planar>>, the image must:
-have been created with ename:VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, and the
-pname:aspectMask of the sname:VkImageView's pname:subresourceRange must: be
-ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT or
-ename:VK_IMAGE_ASPECT_PLANE_2_BIT.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-.Valid Usage
-****
-  * [[VUID-VkImageSubresourceRange-levelCount-01720]]
-    If pname:levelCount is not ename:VK_REMAINING_MIP_LEVELS, it must: be
-    greater than `0`
-  * [[VUID-VkImageSubresourceRange-layerCount-01721]]
-    If pname:layerCount is not ename:VK_REMAINING_ARRAY_LAYERS, it must: be
-    greater than `0`
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkImageSubresourceRange-aspectMask-01670]]
-    If pname:aspectMask includes ename:VK_IMAGE_ASPECT_COLOR_BIT, then it
-    must: not include any of ename:VK_IMAGE_ASPECT_PLANE_0_BIT,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT, or ename:VK_IMAGE_ASPECT_PLANE_2_BIT
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkImageSubresourceRange-aspectMask-02278]]
-    pname:aspectMask must: not include
-    `VK_IMAGE_ASPECT_MEMORY_PLANE__{ibit}__BIT_EXT` for any index _i_
-endif::VK_EXT_image_drm_format_modifier[]
-****
-
-include::{generated}/validity/structs/VkImageSubresourceRange.txt[]
---
-
-[open,refpage='VkImageAspectFlagBits',desc='Bitmask specifying which aspects of an image are included in a view',type='enums']
---
-Bits which can: be set in an aspect mask to specify aspects of an image for
-purposes such as identifying a subresource, are:
-
-include::{generated}/api/enums/VkImageAspectFlagBits.txt[]
-
-  * ename:VK_IMAGE_ASPECT_COLOR_BIT specifies the color aspect.
-  * ename:VK_IMAGE_ASPECT_DEPTH_BIT specifies the depth aspect.
-  * ename:VK_IMAGE_ASPECT_STENCIL_BIT specifies the stencil aspect.
-  * ename:VK_IMAGE_ASPECT_METADATA_BIT specifies the metadata aspect, used
-    for <<sparsememory, sparse resource>> operations.
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * ename:VK_IMAGE_ASPECT_PLANE_0_BIT specifies plane 0 of a _multi-planar_
-    image format.
-  * ename:VK_IMAGE_ASPECT_PLANE_1_BIT specifies plane 1 of a _multi-planar_
-    image format.
-  * ename:VK_IMAGE_ASPECT_PLANE_2_BIT specifies plane 2 of a _multi-planar_
-    image format.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * ename:VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT specifies _memory plane_ 0.
-  * ename:VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT specifies _memory plane_ 1.
-  * ename:VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT specifies _memory plane_ 2.
-  * ename:VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT specifies _memory plane_ 3.
-endif::VK_EXT_image_drm_format_modifier[]
---
-
-[open,refpage='VkImageAspectFlags',desc='Bitmask of VkImageAspectFlagBits',type='flags']
---
-include::{generated}/api/flags/VkImageAspectFlags.txt[]
-
-tname:VkImageAspectFlags is a bitmask type for setting a mask of zero or
-more elink:VkImageAspectFlagBits.
---
-
-[open,refpage='VkComponentMapping',desc='Structure specifying a color component mapping',type='structs']
---
-The sname:VkComponentMapping structure is defined as:
-
-include::{generated}/api/structs/VkComponentMapping.txt[]
-
-  * pname:r is a elink:VkComponentSwizzle specifying the component value
-    placed in the R component of the output vector.
-  * pname:g is a elink:VkComponentSwizzle specifying the component value
-    placed in the G component of the output vector.
-  * pname:b is a elink:VkComponentSwizzle specifying the component value
-    placed in the B component of the output vector.
-  * pname:a is a elink:VkComponentSwizzle specifying the component value
-    placed in the A component of the output vector.
-
-include::{generated}/validity/structs/VkComponentMapping.txt[]
---
-
-[open,refpage='VkComponentSwizzle',desc='Specify how a component is swizzled',type='enums']
---
-Possible values of the members of slink:VkComponentMapping, specifying the
-component values placed in each component of the output vector, are:
-
-include::{generated}/api/enums/VkComponentSwizzle.txt[]
-
-  * ename:VK_COMPONENT_SWIZZLE_IDENTITY specifies that the component is set
-    to the identity swizzle.
-  * ename:VK_COMPONENT_SWIZZLE_ZERO specifies that the component is set to
-    zero.
-  * ename:VK_COMPONENT_SWIZZLE_ONE specifies that the component is set to
-    either 1 or 1.0, depending on whether the type of the image view format
-    is integer or floating-point respectively, as determined by the
-    <<formats-definition,Format Definition>> section for each
-    elink:VkFormat.
-  * ename:VK_COMPONENT_SWIZZLE_R specifies that the component is set to the
-    value of the R component of the image.
-  * ename:VK_COMPONENT_SWIZZLE_G specifies that the component is set to the
-    value of the G component of the image.
-  * ename:VK_COMPONENT_SWIZZLE_B specifies that the component is set to the
-    value of the B component of the image.
-  * ename:VK_COMPONENT_SWIZZLE_A specifies that the component is set to the
-    value of the A component of the image.
-
-[[resources-image-views-identity-mappings]]
-Setting the identity swizzle on a component is equivalent to setting the
-identity mapping on that component.
-That is:
-
-.Component Mappings Equivalent To ename:VK_COMPONENT_SWIZZLE_IDENTITY
-[options="header"]
-|====
-| Component          | Identity Mapping
-| pname:components.r | ename:VK_COMPONENT_SWIZZLE_R
-| pname:components.g | ename:VK_COMPONENT_SWIZZLE_G
-| pname:components.b | ename:VK_COMPONENT_SWIZZLE_B
-| pname:components.a | ename:VK_COMPONENT_SWIZZLE_A
-|====
---
-
-ifdef::VK_EXT_astc_decode_mode[]
-[open,refpage='VkImageViewASTCDecodeModeEXT',desc='Structure describing the ASTC decode mode for an image view',type='structs']
---
-If the pname:pNext chain includes a sname:VkImageViewASTCDecodeModeEXT
-structure, then that structure includes a parameter specifying the decode
-mode for image views using ASTC compressed formats.
-
-The sname:VkImageViewASTCDecodeModeEXT structure is defined as:
-
-include::{generated}/api/structs/VkImageViewASTCDecodeModeEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:decodeMode is the intermediate format used to decode ASTC
-    compressed formats.
-
-.Valid Usage
-****
-  * [[VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02230]]
-    pname:decodeMode must: be one of ename:VK_FORMAT_R16G16B16A16_SFLOAT,
-    ename:VK_FORMAT_R8G8B8A8_UNORM, or
-    ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32
-  * [[VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02231]]
-    If the <<features-astc-decodeModeSharedExponent,
-    pname:decodeModeSharedExponent>> feature is not enabled,
-    pname:decodeMode must: not be ename:VK_FORMAT_E5B9G9R9_UFLOAT_PACK32
-  * [[VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02232]]
-    If pname:decodeMode is ename:VK_FORMAT_R8G8B8A8_UNORM the image view
-    must: not include blocks using any of the ASTC HDR modes
-  * [[VUID-VkImageViewASTCDecodeModeEXT-format-04084]]
-    pname:format of the image view must: be one of the
-    <<appendix-compressedtex-astc, ASTC Compressed Image Formats>>
-****
-
-If pname:format uses sRGB encoding then the pname:decodeMode has no effect.
-
-include::{generated}/validity/structs/VkImageViewASTCDecodeModeEXT.txt[]
---
-endif::VK_EXT_astc_decode_mode[]
-
-[open,refpage='vkDestroyImageView',desc='Destroy an image view object',type='protos']
---
-To destroy an image view, call:
-
-include::{generated}/api/protos/vkDestroyImageView.txt[]
-
-  * pname:device is the logical device that destroys the image view.
-  * pname:imageView is the image view to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyImageView-imageView-01026]]
-    All submitted commands that refer to pname:imageView must: have
-    completed execution
-  * [[VUID-vkDestroyImageView-imageView-01027]]
-    If sname:VkAllocationCallbacks were provided when pname:imageView was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyImageView-imageView-01028]]
-    If no sname:VkAllocationCallbacks were provided when pname:imageView was
-    created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyImageView.txt[]
---
-
-ifdef::VK_NVX_image_view_handle[]
-[open,refpage='vkGetImageViewHandleNVX',desc='Get the handle for an image view for a specific descriptor type',type='protos']
---
-To get the handle for an image view, call:
-
-include::{generated}/api/protos/vkGetImageViewHandleNVX.txt[]
-
-  * pname:device is the logical device that owns the image view.
-  * pname:pInfo describes the image view to query and type of handle.
-
-include::{generated}/validity/protos/vkGetImageViewHandleNVX.txt[]
---
-
-[open,refpage='VkImageViewHandleInfoNVX',desc='Structure specifying the image view for handle queries',type='structs']
---
-The sname:VkImageViewHandleInfoNVX structure is defined as:
-
-include::{generated}/api/structs/VkImageViewHandleInfoNVX.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:imageView is the image view to query.
-  * pname:descriptorType is the type of descriptor for which to query a
-    handle.
-  * pname:sampler is the sampler to combine with the image view when
-    generating the handle.
-
-.Valid Usage
-****
-  * [[VUID-VkImageViewHandleInfoNVX-descriptorType-02654]]
-    pname:descriptorType must: be ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
-    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
-  * [[VUID-VkImageViewHandleInfoNVX-sampler-02655]]
-    pname:sampler must: be a valid slink:VkSampler if pname:descriptorType
-    is ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
-  * [[VUID-VkImageViewHandleInfoNVX-imageView-02656]]
-    If descriptorType is ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE or
-    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, the image that
-    pname:imageView was created from must: have been created with the
-    ename:VK_IMAGE_USAGE_SAMPLED_BIT usage bit set
-  * [[VUID-VkImageViewHandleInfoNVX-imageView-02657]]
-    If descriptorType is ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, the image
-    that pname:imageView was created from must: have been created with the
-    ename:VK_IMAGE_USAGE_STORAGE_BIT usage bit set
-****
-
-include::{generated}/validity/structs/VkImageViewHandleInfoNVX.txt[]
---
-
-[open,refpage='vkGetImageViewAddressNVX',desc='Get the device address of an image view',type='protos']
---
-To get the device address for an image view, call:
-
-include::{generated}/api/protos/vkGetImageViewAddressNVX.txt[]
-
-  * pname:device is the logical device that owns the image view.
-  * pname:imageView is a handle to the image view.
-  * pname:pProperties contains the device address and size when the call
-    returns.
-
-include::{generated}/validity/protos/vkGetImageViewAddressNVX.txt[]
---
-
-[open,refpage='VkImageViewAddressPropertiesNVX',desc='Structure specifying the image view for handle queries',type='structs']
---
-The sname:VkImageViewAddressPropertiesNVX structure is defined as:
-
-include::{generated}/api/structs/VkImageViewAddressPropertiesNVX.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:deviceAddress is the device address of the image view.
-  * pname:size is the size in bytes of the image view device memory.
-
-
-include::{generated}/validity/structs/VkImageViewAddressPropertiesNVX.txt[]
---
-endif::VK_NVX_image_view_handle[]
-
-
-[[resources-image-view-format-features]]
-=== Image View Format Features
-
-Valid uses of a slink:VkImageView may: depend on the image view's _format
-features_, defined below.
-Such constraints are documented in the affected valid usage statement.
-
-ifndef::VK_KHR_format_feature_flags2[]
-  * If slink:VkImageViewCreateInfo::pname:image was created with
-    ename:VK_IMAGE_TILING_LINEAR, then the image view's set of _format
-    features_ is the value of
-    slink:VkFormatProperties::pname:linearTilingFeatures found by calling
-    flink:vkGetPhysicalDeviceFormatProperties on the same pname:format as
-    slink:VkImageViewCreateInfo::pname:format.
-endif::VK_KHR_format_feature_flags2[]
-ifdef::VK_KHR_format_feature_flags2[]
-  * If the extension `apiext:VK_KHR_format_feature_flags2` is enabled and
-    slink:VkImageViewCreateInfo::pname:image was created with
-    ename:VK_IMAGE_TILING_LINEAR, then the image view's set of _format
-    features_ is the value of
-    slink:VkFormatProperties3KHR::pname:linearTilingFeatures found by
-    calling flink:vkGetPhysicalDeviceFormatProperties2 on the same
-    pname:format as slink:VkImageViewCreateInfo::pname:format.
-  * If the extension `apiext:VK_KHR_format_feature_flags2` is not enabled
-    and slink:VkImageViewCreateInfo::pname:image was created with
-    ename:VK_IMAGE_TILING_LINEAR, then the image view's set of _format
-    features_ is the union of the value of
-    slink:VkFormatProperties::pname:linearTilingFeatures found by calling
-    flink:vkGetPhysicalDeviceFormatProperties on the same pname:format as
-    slink:VkImageViewCreateInfo::pname:format, with:
-    - ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR if
-      the format is a depth/stencil format and the image view features also
-      contain ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR.
-    - ename:VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR if the
-      format is one of the <<formats-without-shader-storage-format,extended
-      storage formats>> and pname:shaderStorageImageReadWithoutFormat is
-      enabled on the device.
-    - ename:VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR if the
-      format is one of the <<formats-without-shader-storage-format,extended
-      storage formats>> and pname:shaderStorageImageWriteWithoutFormat is
-      enabled on the device.
-endif::VK_KHR_format_feature_flags2[]
-ifndef::VK_KHR_format_feature_flags2[]
-  * If slink:VkImageViewCreateInfo::pname:image was created with
-    ename:VK_IMAGE_TILING_OPTIMAL,
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-    but without an
-    <<memory-external-android-hardware-buffer-external-formats,Android
-    hardware buffer external format>>,
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-    then the image view's set of _format features_ is the value of
-    slink:VkFormatProperties::pname:optimalTilingFeatures found by calling
-    flink:vkGetPhysicalDeviceFormatProperties on the same pname:format as
-    slink:VkImageViewCreateInfo::pname:format.
-endif::VK_KHR_format_feature_flags2[]
-ifdef::VK_KHR_format_feature_flags2[]
-  * If the extension `apiext:VK_KHR_format_feature_flags2` is enabled and
-    slink:VkImageViewCreateInfo::pname:image was created with
-    ename:VK_IMAGE_TILING_OPTIMAL,
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-    but without an
-    <<memory-external-android-hardware-buffer-external-formats,Android
-    hardware buffer external format>>,
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-    then the image view's set of _format features_ is the value of
-    slink:VkFormatProperties::pname:optimalTilingFeatures or
-    slink:VkFormatProperties3KHR::pname:optimalTilingFeatures found by
-    calling flink:vkGetPhysicalDeviceFormatProperties or
-    flink:vkGetPhysicalDeviceImageFormatProperties2 on the same pname:format
-    as slink:VkImageViewCreateInfo::pname:format.
-  * If the extension `apiext:VK_KHR_format_feature_flags2` is not enabled
-    and slink:VkImageViewCreateInfo::pname:image was created with
-    ename:VK_IMAGE_TILING_OPTIMAL,
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-    but without an
-    <<memory-external-android-hardware-buffer-external-formats,Android
-    hardware buffer external format>>,
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-    then the image view's set of _format features_ is the union of the value
-    of slink:VkFormatProperties::pname:optimalTilingFeatures found by
-    calling flink:vkGetPhysicalDeviceFormatProperties on the same
-    pname:format as slink:VkImageViewCreateInfo::pname:format, with:
-    - ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR if
-      the format is a depth/stencil format and the image view features also
-      contain ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR.
-    - ename:VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR if the
-      format is one of the <<formats-without-shader-storage-format,extended
-      storage formats>> and pname:shaderStorageImageReadWithoutFormat is
-      enabled on the device.
-    - ename:VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR if the
-      format is one of the <<formats-without-shader-storage-format,extended
-      storage formats>> and pname:shaderStorageImageWriteWithoutFormat is
-      enabled on the device.
-endif::VK_KHR_format_feature_flags2[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * If slink:VkImageViewCreateInfo::pname:image was created with an
-    <<memory-external-android-hardware-buffer-external-formats,Android
-    hardware buffer external format>>, then the image views's set of _format
-    features_ is the value of
-    slink:VkAndroidHardwareBufferFormatPropertiesANDROID::pname:formatFeatures
-    found by calling flink:vkGetAndroidHardwareBufferPropertiesANDROID on
-    the Android hardware buffer that was imported to the
-    slink:VkDeviceMemory to which the
-    slink:VkImageViewCreateInfo::pname:image is bound.
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_FUCHSIA_buffer_collection[]
-  * If slink:VkImageViewCreateInfo::pname:image was created with a chained
-    slink:VkBufferCollectionImageCreateInfoFUCHSIA, then the image view's
-    set of _format features_ is the value of
-    slink:VkBufferCollectionPropertiesFUCHSIA::pname:formatFeatures found by
-    calling flink:vkGetBufferCollectionPropertiesFUCHSIA on the buffer
-    collection passed as
-    slink:VkBufferCollectionImageCreateInfoFUCHSIA::pname:collection when
-    the image was created.
-endif::VK_FUCHSIA_buffer_collection[]
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * If slink:VkImageViewCreateInfo::pname:image was created with
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then:
-  ** The image's DRM format modifier is the value of
-     slink:VkImageDrmFormatModifierListCreateInfoEXT::pname:drmFormatModifier
-     found by calling flink:vkGetImageDrmFormatModifierPropertiesEXT.
-  ** Let
-     slink:VkDrmFormatModifierPropertiesListEXT::pname:pDrmFormatModifierProperties
-     be the array found by calling
-     flink:vkGetPhysicalDeviceFormatProperties2 on the same pname:format as
-     slink:VkImageViewCreateInfo::pname:format.
-  ** Let `VkDrmFormatModifierPropertiesEXT prop` be an array element whose
-     pname:drmFormatModifier member is the value of the image's DRM format
-     modifier.
-  ** Then the image view's set of _format features_ is the value of taking
-     the bitwise intersection, over the collected
-     `prop`::pname:drmFormatModifierTilingFeatures.
-endif::VK_EXT_image_drm_format_modifier[]
-
-
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-[[resources-acceleration-structures]]
-== Acceleration Structures
-
-[open,refpage='VkAccelerationStructureKHR',desc='Opaque handle to an acceleration structure object',type='handles']
---
-:refpage: VkAccelerationStructureKHR
-
-Acceleration structures are opaque data structures that are built by the
-implementation to more efficiently perform spatial queries on the provided
-geometric data.
-For this extension, an acceleration structure is either a top-level
-acceleration structure containing a set of bottom-level acceleration
-structures or a bottom-level acceleration structure containing either a set
-of axis-aligned bounding boxes for custom geometry or a set of triangles.
-
-Each instance in the top-level acceleration structure contains a reference
-to a bottom-level acceleration structure as well as an instance transform
-plus information required to index into the shader bindings.
-The top-level acceleration structure is what is bound to the acceleration
-descriptor, for example to trace inside the shader in the ray tracing
-pipeline.
-
-Acceleration structures are represented by sname:VkAccelerationStructureKHR
-handles:
-
-include::{generated}/api/handles/VkAccelerationStructureKHR.txt[]
---
-
-ifdef::VK_NV_ray_tracing[]
-[open,refpage='VkAccelerationStructureNV',desc='Opaque handle to an acceleration structure object',type='handles']
---
-:refpage: VkAccelerationStructureNV
-
-Acceleration structures for the apiext:VK_NV_ray_tracing extension are
-represented by the similar sname:VkAccelerationStructureNV handles:
-
-include::{generated}/api/handles/VkAccelerationStructureNV.txt[]
---
-
-[open,refpage='vkCreateAccelerationStructureNV',desc='Create a new acceleration structure object',type='protos']
---
-:refpage: vkCreateAccelerationStructureNV
-
-To create acceleration structures, call:
-
-include::{generated}/api/protos/vkCreateAccelerationStructureNV.txt[]
-
-  * pname:device is the logical device that creates the buffer object.
-  * pname:pCreateInfo is a pointer to a
-    slink:VkAccelerationStructureCreateInfoNV structure containing
-    parameters affecting creation of the acceleration structure.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pAccelerationStructure is a pointer to a
-    slink:VkAccelerationStructureNV handle in which the resulting
-    acceleration structure object is returned.
-
-Similarly to other objects in Vulkan, the acceleration structure creation
-merely creates an object with a specific "`shape`" as specified by the
-information in slink:VkAccelerationStructureInfoNV and pname:compactedSize
-in pname:pCreateInfo.
-Populating the data in the object after allocating and binding memory is
-done with flink:vkCmdBuildAccelerationStructureNV and
-flink:vkCmdCopyAccelerationStructureNV.
-
-Acceleration structure creation uses the count and type information from the
-geometries, but does not use the data references in the structures.
-
-include::{generated}/validity/protos/vkCreateAccelerationStructureNV.txt[]
---
-
-[open,refpage='VkAccelerationStructureCreateInfoNV',desc='Structure specifying the parameters of a newly created acceleration structure object',type='structs']
---
-:refpage: VkAccelerationStructureCreateInfoNV
-
-The sname:VkAccelerationStructureCreateInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkAccelerationStructureCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:compactedSize is the size from the result of
-    flink:vkCmdWriteAccelerationStructuresPropertiesNV if this acceleration
-    structure is going to be the target of a compacting copy.
-  * pname:info is the slink:VkAccelerationStructureInfoNV structure
-    specifying further parameters of the created acceleration structure.
-
-.Valid Usage
-****
-  * [[VUID-VkAccelerationStructureCreateInfoNV-compactedSize-02421]]
-    If pname:compactedSize is not `0` then both pname:info.geometryCount and
-    pname:info.instanceCount must: be `0`
-****
-
-include::{generated}/validity/structs/VkAccelerationStructureCreateInfoNV.txt[]
---
-
-[open,refpage='VkAccelerationStructureInfoNV',desc='Structure specifying the parameters of acceleration structure object',type='structs']
---
-:refpage: VkAccelerationStructureInfoNV
-
-The sname:VkAccelerationStructureInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkAccelerationStructureInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:type is a elink:VkAccelerationStructureTypeNV value specifying the
-    type of acceleration structure that will be created.
-  * pname:flags is a bitmask of elink:VkBuildAccelerationStructureFlagBitsNV
-    specifying additional parameters of the acceleration structure.
-  * pname:instanceCount specifies the number of instances that will be in
-    the new acceleration structure.
-  * pname:geometryCount specifies the number of geometries that will be in
-    the new acceleration structure.
-  * pname:pGeometries is a pointer to an array of pname:geometryCount
-    slink:VkGeometryNV structures containing the scene data being passed
-    into the acceleration structure.
-
-sname:VkAccelerationStructureInfoNV contains information that is used both
-for acceleration structure creation with
-flink:vkCreateAccelerationStructureNV and in combination with the actual
-geometric data to build the acceleration structure with
-flink:vkCmdBuildAccelerationStructureNV.
-
-.Valid Usage
-****
-  * [[VUID-VkAccelerationStructureInfoNV-geometryCount-02422]]
-    pname:geometryCount must: be less than or equal to
-    slink:VkPhysicalDeviceRayTracingPropertiesNV::pname:maxGeometryCount
-  * [[VUID-VkAccelerationStructureInfoNV-instanceCount-02423]]
-    pname:instanceCount must: be less than or equal to
-    slink:VkPhysicalDeviceRayTracingPropertiesNV::pname:maxInstanceCount
-  * [[VUID-VkAccelerationStructureInfoNV-maxTriangleCount-02424]]
-    The total number of triangles in all geometries must: be less than or
-    equal to
-    slink:VkPhysicalDeviceRayTracingPropertiesNV::pname:maxTriangleCount
-  * [[VUID-VkAccelerationStructureInfoNV-type-02425]]
-    If pname:type is ename:VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV then
-    pname:geometryCount must: be `0`
-  * [[VUID-VkAccelerationStructureInfoNV-type-02426]]
-    If pname:type is ename:VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV
-    then pname:instanceCount must: be `0`
-  * [[VUID-VkAccelerationStructureInfoNV-type-02786]]
-    If pname:type is ename:VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV
-    then the pname:geometryType member of each geometry in pname:pGeometries
-    must: be the same
-ifdef::VK_KHR_acceleration_structure[]
-  * [[VUID-VkAccelerationStructureInfoNV-type-04623]]
-    pname:type must: not be ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR
-endif::VK_KHR_acceleration_structure[]
-  * [[VUID-VkAccelerationStructureInfoNV-flags-02592]]
-    If pname:flags has the
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV bit set,
-    then it must: not have the
-    ename:VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_NV bit set
-  * [[VUID-VkAccelerationStructureInfoNV-scratch-02781]]
-    pname:scratch must: have been created with
-    ename:VK_BUFFER_USAGE_RAY_TRACING_BIT_NV usage flag
-  * [[VUID-VkAccelerationStructureInfoNV-instanceData-02782]]
-    If pname:instanceData is not dlink:VK_NULL_HANDLE, pname:instanceData
-    must: have been created with ename:VK_BUFFER_USAGE_RAY_TRACING_BIT_NV
-    usage flag
-****
-
-include::{generated}/validity/structs/VkAccelerationStructureInfoNV.txt[]
---
-endif::VK_NV_ray_tracing[]
-
-ifdef::VK_KHR_acceleration_structure[]
-[open,refpage='vkCreateAccelerationStructureKHR',desc='Create a new acceleration structure object',type='protos']
---
-:refpage: vkCreateAccelerationStructureKHR
-
-To create an acceleration structure, call:
-
-include::{generated}/api/protos/vkCreateAccelerationStructureKHR.txt[]
-
-  * pname:device is the logical device that creates the acceleration
-    structure object.
-  * pname:pCreateInfo is a pointer to a
-    slink:VkAccelerationStructureCreateInfoKHR structure containing
-    parameters affecting creation of the acceleration structure.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pAccelerationStructure is a pointer to a
-    sname:VkAccelerationStructureKHR handle in which the resulting
-    acceleration structure object is returned.
-
-Similar to other objects in Vulkan, the acceleration structure creation
-merely creates an object with a specific "`shape`".
-The type and quantity of geometry that can be built into an acceleration
-structure is determined by the parameters of
-slink:VkAccelerationStructureCreateInfoKHR.
-
-Populating the data in the object after allocating and binding memory is
-done with commands such as flink:vkCmdBuildAccelerationStructuresKHR,
-flink:vkBuildAccelerationStructuresKHR,
-flink:vkCmdCopyAccelerationStructureKHR, and
-flink:vkCopyAccelerationStructureKHR.
-
-The input buffers passed to acceleration structure build commands will be
-referenced by the implementation for the duration of the command.
-After the command completes, the acceleration structure may: hold a
-reference to any acceleration structure specified by an active instance
-contained therein.
-Apart from this referencing, acceleration structures must: be fully
-self-contained.
-The application may: re-use or free any memory which was used by the command
-as an input or as scratch without affecting the results of ray traversal.
-
-.Valid Usage
-****
-  * [[VUID-vkCreateAccelerationStructureKHR-accelerationStructure-03611]]
-    The <<features-accelerationStructure, pname:accelerationStructure>>
-    feature must: be enabled
-  * [[VUID-vkCreateAccelerationStructureKHR-deviceAddress-03488]]
-    If slink:VkAccelerationStructureCreateInfoKHR::pname:deviceAddress is
-    not zero, the
-    <<features-accelerationStructureCaptureReplay,pname:accelerationStructureCaptureReplay>>
-    feature must: be enabled
-  * [[VUID-vkCreateAccelerationStructureKHR-device-03489]]
-    If pname:device was created with multiple physical devices, then the
-    <<features-bufferDeviceAddressMultiDevice,bufferDeviceAddressMultiDevice>>
-    feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkCreateAccelerationStructureKHR.txt[]
---
-
-[open,refpage='VkAccelerationStructureCreateInfoKHR',desc='Structure specifying the parameters of a newly created acceleration structure object',type='structs']
---
-:refpage: VkAccelerationStructureCreateInfoKHR
-
-The sname:VkAccelerationStructureCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkAccelerationStructureCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:createFlags is a bitmask of
-    elink:VkAccelerationStructureCreateFlagBitsKHR specifying additional
-    creation parameters of the acceleration structure.
-  * pname:buffer is the buffer on which the acceleration structure will be
-    stored.
-  * pname:offset is an offset in bytes from the base address of the buffer
-    at which the acceleration structure will be stored, and must: be a
-    multiple of `256`.
-  * pname:size is the size required for the acceleration structure.
-  * pname:type is a elink:VkAccelerationStructureTypeKHR value specifying
-    the type of acceleration structure that will be created.
-  * pname:deviceAddress is the device address requested for the acceleration
-    structure if the <<features-accelerationStructureCaptureReplay,
-    pname:accelerationStructureCaptureReplay>> feature is being used.
-
-If pname:deviceAddress is zero, no specific address is requested.
-
-If pname:deviceAddress is not zero, pname:deviceAddress must: be an address
-retrieved from an identically created acceleration structure on the same
-implementation.
-The acceleration structure must: also be placed on an identically created
-pname:buffer and at the same pname:offset.
-
-Applications should: avoid creating acceleration structures with
-application-provided addresses and implementation-provided addresses in the
-same process, to reduce the likelihood of
-ename:VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR errors.
-
-[NOTE]
-.Note
-====
-The expected usage for this is that a trace capture/replay tool will add the
-ename:VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT flag to all buffers
-that use ename:VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, and will add
-ename:VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT to all buffers used as
-storage for an acceleration structure where pname:deviceAddress is not zero.
-This also means that the tool will need to add
-ename:VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT to memory allocations to allow
-the flag to be set where the application may not have otherwise required it.
-During capture the tool will save the queried opaque device addresses in the
-trace.
-During replay, the buffers will be created specifying the original address
-so any address values stored in the trace data will remain valid.
-
-Implementations are expected to separate such buffers in the GPU address
-space so normal allocations will avoid using these addresses.
-Apps/tools should avoid mixing app-provided and implementation-provided
-addresses for buffers created with
-ename:VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT, to avoid address
-space allocation conflicts.
-====
-
-
-Applications should: create an acceleration structure with a specific
-elink:VkAccelerationStructureTypeKHR other than
-ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR.
-
-If the acceleration structure will be the target of a build operation, the
-required size for an acceleration structure can: be queried with
-flink:vkGetAccelerationStructureBuildSizesKHR.
-If the acceleration structure is going to be the target of a compacting
-copy, flink:vkCmdWriteAccelerationStructuresPropertiesKHR or
-flink:vkWriteAccelerationStructuresPropertiesKHR can: be used to obtain the
-compacted size required.
-
-ifdef::VK_NV_ray_tracing_motion_blur[]
-If the acceleration structure will be the target of a build operation with
-ename:VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV it must: include
-ename:VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV in pname:flags and
-include slink:VkAccelerationStructureMotionInfoNV as an extension structure
-in pname:pNext with the number of instances as metadata for the object.
-endif::VK_NV_ray_tracing_motion_blur[]
-
-.Valid Usage
-****
-  * [[VUID-VkAccelerationStructureCreateInfoKHR-deviceAddress-03612]]
-    If pname:deviceAddress is not zero, pname:createFlags must: include
-    ename:VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR
-  * [[VUID-VkAccelerationStructureCreateInfoKHR-createFlags-03613]]
-    If pname:createFlags includes
-    ename:VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR,
-    slink:VkPhysicalDeviceAccelerationStructureFeaturesKHR::pname:accelerationStructureCaptureReplay
-    must: be ename:VK_TRUE
-  * [[VUID-VkAccelerationStructureCreateInfoKHR-buffer-03614]]
-    pname:buffer must: have been created with a pname:usage value containing
-    ename:VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR
-  * [[VUID-VkAccelerationStructureCreateInfoKHR-buffer-03615]]
-    pname:buffer must: not have been created with
-    ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT
-  * [[VUID-VkAccelerationStructureCreateInfoKHR-offset-03616]]
-    The sum of pname:offset and pname:size must: be less than the size of
-    pname:buffer
-  * [[VUID-VkAccelerationStructureCreateInfoKHR-offset-03734]]
-    pname:offset must: be a multiple of `256` bytes
-ifdef::VK_NV_ray_tracing_motion_blur[]
-  * [[VUID-VkAccelerationStructureCreateInfoKHR-flags-04954]]
-    If ename:VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV is set in
-    pname:flags and pname:type is
-    ename:VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR,
- one member of the pname:pNext chain must: be a pointer to a valid instance
- of slink:VkAccelerationStructureMotionInfoNV
-  * [[VUID-VkAccelerationStructureCreateInfoKHR-flags-04955]]
-    If any geometry includes
-    sname:VkAccelerationStructureGeometryMotionTrianglesDataNV then
-    pname:flags must: contain
-    ename:VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV
-endif::VK_NV_ray_tracing_motion_blur[]
-****
-
-include::{generated}/validity/structs/VkAccelerationStructureCreateInfoKHR.txt[]
---
-
-ifdef::VK_NV_ray_tracing_motion_blur[]
-[open,refpage='VkAccelerationStructureMotionInfoNV',desc='Structure specifying the parameters of a newly created acceleration structure object',type='structs']
---
-:refpage: VkAccelerationStructureMotionInfoNV
-
-The sname:VkAccelerationStructureMotionInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkAccelerationStructureMotionInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxInstances is the maximum number of instances that may: be used
-    in the motion top-level acceleration structure.
-  * pname:flags is 0 and reserved for future use.
-
-include::{generated}/validity/structs/VkAccelerationStructureMotionInfoNV.txt[]
---
-
-[open,refpage='VkAccelerationStructureMotionInfoFlagsNV',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkAccelerationStructureMotionInfoFlagsNV.txt[]
-
-tname:VkAccelerationStructureMotionInfoFlagsNV is a bitmask type for setting
-a mask, but is currently reserved for future use.
---
-endif::VK_NV_ray_tracing_motion_blur[]
-
-[open,refpage='vkGetAccelerationStructureBuildSizesKHR',desc='Retrieve the required size for an acceleration structure',type='protos']
---
-:refpage: vkGetAccelerationStructureBuildSizesKHR
-
-To get the build sizes for an acceleration structure, call:
-
-include::{generated}/api/protos/vkGetAccelerationStructureBuildSizesKHR.txt[]
-
-  * pname:device is the logical device that will be used for creating the
-    acceleration structure.
-  * pname:buildType defines whether host or device operations (or both) are
-    being queried for.
-  * pname:pBuildInfo is a pointer to a
-    slink:VkAccelerationStructureBuildGeometryInfoKHR structure describing
-    parameters of a build operation.
-  * pname:pMaxPrimitiveCounts is a pointer to an array of
-    pname:pBuildInfo->geometryCount code:uint32_t values defining the number
-    of primitives built into each geometry.
-  * pname:pSizeInfo is a pointer to a
-    slink:VkAccelerationStructureBuildSizesInfoKHR structure which returns
-    the size required for an acceleration structure and the sizes required
-    for the scratch buffers, given the build parameters.
-
-The pname:srcAccelerationStructure, pname:dstAccelerationStructure, and
-pname:mode members of pname:pBuildInfo are ignored.
-Any slink:VkDeviceOrHostAddressKHR members of pname:pBuildInfo are ignored
-by this command, except that the pname:hostAddress member of
-slink:VkAccelerationStructureGeometryTrianglesDataKHR::pname:transformData
-will be examined to check if it is `NULL`.
-
-An acceleration structure created with the pname:accelerationStructureSize
-returned by this command supports any build or update with a
-slink:VkAccelerationStructureBuildGeometryInfoKHR structure and array of
-slink:VkAccelerationStructureBuildRangeInfoKHR structures subject to the
-following properties:
-
-  * The build command is a host build command, and pname:buildType is
-    ename:VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR or
-    ename:VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR
-  * The build command is a device build command, and pname:buildType is
-    ename:VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR or
-    ename:VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR
-  * For slink:VkAccelerationStructureBuildGeometryInfoKHR:
-  ** Its pname:type, and pname:flags members are equal to those specified in
-     pname:pBuildInfo.
-  ** pname:geometryCount is less than or equal to that specified in
-     pname:pBuildInfo.
-  ** For each element of either pname:pGeometries or pname:ppGeometries at a
-     given index, its pname:geometryType member is equal to that specified
-     in pname:pBuildInfo.
-  ** For each element of either pname:pGeometries or pname:ppGeometries at a
-     given index, with a pname:geometryType member equal to
-     ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, the pname:vertexFormat and
-     pname:indexType members of pname:geometry.triangles are equal to those
-     specified in the same element in pname:pBuildInfo.
-  ** For each element of either pname:pGeometries or pname:ppGeometries at a
-     given index, with a pname:geometryType member equal to
-     ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, the pname:maxVertex member of
-     pname:geometry.triangles is less than or equal to that specified in the
-     same element in pname:pBuildInfo.
-  ** For each element of either pname:pGeometries or pname:ppGeometries at a
-     given index, with a pname:geometryType member equal to
-     ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR, if the applicable address in the
-     pname:transformData member of pname:geometry.triangles is not `NULL`,
-     the corresponding pname:transformData.hostAddress parameter in
-     pname:pBuildInfo is not `NULL`.
-  * For each slink:VkAccelerationStructureBuildRangeInfoKHR corresponding to
-    the slink:VkAccelerationStructureBuildGeometryInfoKHR:
-  ** Its pname:primitiveCount member is less than or equal to the
-     corresponding element of pname:pMaxPrimitiveCounts.
-
-Similarly, the pname:updateScratchSize value will support any build command
-specifying the ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR
-pname:mode under the above conditions, and the pname:buildScratchSize value
-will support any build command specifying the
-ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR pname:mode under the
-above conditions.
-
-.Valid Usage
-****
-  * [[VUID-vkGetAccelerationStructureBuildSizesKHR-rayTracingPipeline-03617]]
-    The <<features-rayTracingPipeline, pname:rayTracingPipeline>> or
-    <<features-rayQuery, pname:rayQuery>> feature must: be enabled
-  * [[VUID-vkGetAccelerationStructureBuildSizesKHR-device-03618]]
-    If pname:device was created with multiple physical devices, then the
-    <<features-bufferDeviceAddressMultiDevice,bufferDeviceAddressMultiDevice>>
-    feature must: be enabled
-  * [[VUID-vkGetAccelerationStructureBuildSizesKHR-pBuildInfo-03619]]
-    If pname:pBuildInfo->geometryCount is not `0`, pname:pMaxPrimitiveCounts
-    must: be a valid pointer to an array of pname:pBuildInfo->geometryCount
-    code:uint32_t values
-  * [[VUID-vkGetAccelerationStructureBuildSizesKHR-pBuildInfo-03785]]
-    If pname:pBuildInfo->pGeometries or pname:pBuildInfo->ppGeometries has a
-    pname:geometryType of ename:VK_GEOMETRY_TYPE_INSTANCES_KHR, each
-    pname:pMaxPrimitiveCounts[i] must: be less than or equal to
-    slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR::pname:maxInstanceCount
-****
-
-include::{generated}/validity/protos/vkGetAccelerationStructureBuildSizesKHR.txt[]
---
-
-[open,refpage='VkAccelerationStructureBuildSizesInfoKHR',desc='Structure specifying build sizes for an acceleration structure',type='structs']
---
-:refpage: VkAccelerationStructureBuildSizesInfoKHR
-
-The sname:VkAccelerationStructureBuildSizesInfoKHR structure describes the
-required build sizes for an acceleration structure and scratch buffers and
-is defined as:
-
-include::{generated}/api/structs/VkAccelerationStructureBuildSizesInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:accelerationStructureSize is the size in bytes required in a
-    slink:VkAccelerationStructureKHR for a build or update operation.
-  * pname:updateScratchSize is the size in bytes required in a scratch
-    buffer for an update operation.
-  * pname:buildScratchSize is the size in bytes required in a scratch buffer
-    for a build operation.
-
-include::{generated}/validity/structs/VkAccelerationStructureBuildSizesInfoKHR.txt[]
---
-endif::VK_KHR_acceleration_structure[]
-
-[open,refpage='VkAccelerationStructureTypeKHR',desc='Type of acceleration structure',type='enums',alias='VkAccelerationStructureTypeNV']
---
-:refpage: VkAccelerationStructureTypeKHR
-
-Values which can: be set in
-ifdef::VK_KHR_acceleration_structure[]
-slink:VkAccelerationStructureCreateInfoKHR::pname:type
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_KHR_acceleration_structure+VK_NV_ray_tracing[or]
-ifdef::VK_NV_ray_tracing[]
-slink:VkAccelerationStructureInfoNV::pname:type
-endif::VK_NV_ray_tracing[]
-specifying the type of acceleration structure, are:
-
-include::{generated}/api/enums/VkAccelerationStructureTypeKHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/enums/VkAccelerationStructureTypeNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-  * ename:VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR is a top-level
-    acceleration structure containing instance data referring to
-    bottom-level acceleration structures.
-  * ename:VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR is a bottom-level
-    acceleration structure containing the AABBs or geometry to be
-    intersected.
-  * ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR is an acceleration
-    structure whose type is determined at build time used for special
-    circumstances.
---
-
-ifdef::VK_KHR_acceleration_structure[]
-[open,refpage='VkAccelerationStructureCreateFlagBitsKHR',desc='Bitmask specifying additional creation parameters for acceleration structure',type='enums']
---
-Bits which can: be set in
-slink:VkAccelerationStructureCreateInfoKHR::pname:createFlags specifying
-additional creation parameters for acceleration structures, are:
-
-include::{generated}/api/enums/VkAccelerationStructureCreateFlagBitsKHR.txt[]
-
-  * ename:VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR
-    specifies that the acceleration structure's address can: be saved and
-    reused on a subsequent run.
---
-
-[open,refpage='VkAccelerationStructureCreateFlagsKHR',desc='Bitmask of VkAccelerationStructureCreateFlagBitsKHR',type='flags']
---
-include::{generated}/api/flags/VkAccelerationStructureCreateFlagsKHR.txt[]
-
-tname:VkAccelerationStructureCreateFlagsKHR is a bitmask type for setting a
-mask of zero or more elink:VkAccelerationStructureCreateFlagBitsKHR.
---
-endif::VK_KHR_acceleration_structure[]
-
-[open,refpage='VkBuildAccelerationStructureFlagBitsKHR',desc='Bitmask specifying additional parameters for acceleration structure builds',type='enums',alias='VkBuildAccelerationStructureFlagBitsNV']
---
-:refpage: VkBuildAccelerationStructureFlagBitsKHR
-
-Bits which can: be set in
-ifdef::VK_KHR_acceleration_structure[]
-slink:VkAccelerationStructureBuildGeometryInfoKHR::pname:flags
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_KHR_acceleration_structure+VK_NV_ray_tracing[or]
-ifdef::VK_NV_ray_tracing[]
-slink:VkAccelerationStructureInfoNV::pname:flags
-endif::VK_NV_ray_tracing[]
-specifying additional parameters for acceleration structure builds, are:
-
-include::{generated}/api/enums/VkBuildAccelerationStructureFlagBitsKHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/enums/VkBuildAccelerationStructureFlagBitsNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-  * ename:VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR indicates
-    that the specified acceleration structure can: be updated with
-ifdef::VK_KHR_acceleration_structure[]
-    a pname:mode of ename:VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR in
-    slink:VkAccelerationStructureBuildGeometryInfoKHR
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_KHR_acceleration_structure+VK_NV_ray_tracing[or]
-ifdef::VK_NV_ray_tracing[]
-    an pname:update of ename:VK_TRUE in
-    flink:vkCmdBuildAccelerationStructureNV
-endif::VK_NV_ray_tracing[]
-    .
-  * ename:VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR indicates
-    that the specified acceleration structure can: act as the source for a
-    copy acceleration structure command with pname:mode of
-    ename:VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR to produce a
-    compacted acceleration structure.
-  * ename:VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR
-    indicates that the given acceleration structure build should: prioritize
-    trace performance over build time.
-  * ename:VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR
-    indicates that the given acceleration structure build should: prioritize
-    build time over trace performance.
-  * ename:VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR indicates that
-    this acceleration structure should: minimize the size of the scratch
-    memory and the final result acceleration structure, potentially at the
-    expense of build time or trace performance.
-
-[NOTE]
-.Note
-====
-ename:VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR and
-ename:VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR may: take
-more time and memory than a normal build, and so should: only be used when
-those features are needed.
-====
---
-
-[open,refpage='VkBuildAccelerationStructureFlagsKHR',desc='Bitmask of VkBuildAccelerationStructureFlagBitsKHR',type='flags',alias='VkBuildAccelerationStructureFlagsNV']
---
-:refpage: VkBuildAccelerationStructureFlagsKHR
-
-include::{generated}/api/flags/VkBuildAccelerationStructureFlagsKHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/flags/VkBuildAccelerationStructureFlagsNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-tname:VkBuildAccelerationStructureFlagsKHR is a bitmask type for setting a
-mask of zero or more elink:VkBuildAccelerationStructureFlagBitsKHR.
---
-
-ifdef::VK_NV_ray_tracing[]
-[open,refpage='VkGeometryNV',desc='Structure specifying a geometry in a bottom-level acceleration structure',type='structs']
---
-:refpage: VkGeometryNV
-
-The sname:VkGeometryNV structure describes geometry in a bottom-level
-acceleration structure and is defined as:
-
-include::{generated}/api/structs/VkGeometryNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:geometryType specifies the elink:VkGeometryTypeKHR which this
-    geometry refers to.
-  * pname:geometry contains the geometry data as described in
-    slink:VkGeometryDataNV.
-  * pname:flags has elink:VkGeometryFlagBitsKHR describing options for this
-    geometry.
-
-.Valid Usage
-****
-  * [[VUID-VkGeometryNV-geometryType-03503]]
-    pname:geometryType must: be ename:VK_GEOMETRY_TYPE_TRIANGLES_NV or
-    ename:VK_GEOMETRY_TYPE_AABBS_NV
-****
-
-include::{generated}/validity/structs/VkGeometryNV.txt[]
---
-endif::VK_NV_ray_tracing[]
-
-[open,refpage='VkGeometryTypeKHR',desc='Enum specifying which type of geometry is provided',type='enums',alias='VkGeometryTypeNV']
---
-:refpage: VkGeometryTypeKHR
-
-Geometry types are specified by elink:VkGeometryTypeKHR, which takes values:
-
-include::{generated}/api/enums/VkGeometryTypeKHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/enums/VkGeometryTypeNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-  * ename:VK_GEOMETRY_TYPE_TRIANGLES_KHR specifies a geometry type
-    consisting of triangles.
-  * ename:VK_GEOMETRY_TYPE_AABBS_KHR specifies a geometry type consisting of
-    axis-aligned bounding boxes.
-ifdef::VK_KHR_acceleration_structure[]
-  * ename:VK_GEOMETRY_TYPE_INSTANCES_KHR specifies a geometry type
-    consisting of acceleration structure instances.
-endif::VK_KHR_acceleration_structure[]
---
-
-[open,refpage='VkGeometryFlagBitsKHR',desc='Bitmask specifying additional parameters for a geometry',type='enums',alias='VkGeometryFlagBitsNV']
---
-:refpage: VkGeometryFlagBitsKHR
-
-Bits specifying additional parameters for geometries in acceleration
-structure builds, are:
-
-include::{generated}/api/enums/VkGeometryFlagBitsKHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/enums/VkGeometryFlagBitsNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-  * ename:VK_GEOMETRY_OPAQUE_BIT_KHR indicates that this geometry does not
-    invoke the any-hit shaders even if present in a hit group.
-  * ename:VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR indicates that
-    the implementation must: only call the any-hit shader a single time for
-    each primitive in this geometry.
-    If this bit is absent an implementation may: invoke the any-hit shader
-    more than once for this geometry.
---
-
-[open,refpage='VkGeometryFlagsKHR',desc='Bitmask of VkGeometryFlagBitsKHR',type='flags',alias='VkGeometryFlagsNV']
---
-:refpage: VkGeometryFlagsKHR
-
-include::{generated}/api/flags/VkGeometryFlagsKHR.txt[]
-
-ifdef::VK_NV_ray_tracing[]
-or the equivalent
-
-include::{generated}/api/flags/VkGeometryFlagsNV.txt[]
-endif::VK_NV_ray_tracing[]
-
-tname:VkGeometryFlagsKHR is a bitmask type for setting a mask of zero or
-more elink:VkGeometryFlagBitsKHR.
---
-
-ifdef::VK_NV_ray_tracing[]
-[open,refpage='VkGeometryDataNV',desc='Structure specifying geometry in a bottom-level acceleration structure',type='structs']
---
-:refpage: VkGeometryDataNV
-
-The sname:VkGeometryDataNV structure specifes geometry in a bottom-level
-acceleration structure and is defined as:
-
-include::{generated}/api/structs/VkGeometryDataNV.txt[]
-
-  * pname:triangles contains triangle data if
-    slink:VkGeometryNV::pname:geometryType is
-    ename:VK_GEOMETRY_TYPE_TRIANGLES_NV.
-  * pname:aabbs contains axis-aligned bounding box data if
-    slink:VkGeometryNV::pname:geometryType is
-    ename:VK_GEOMETRY_TYPE_AABBS_NV.
-
-include::{generated}/validity/structs/VkGeometryDataNV.txt[]
---
-
-[open,refpage='VkGeometryTrianglesNV',desc='Structure specifying a triangle geometry in a bottom-level acceleration structure',type='structs']
---
-:refpage: VkGeometryTrianglesNV
-
-The sname:VkGeometryTrianglesNV structure specifies triangle geometry in a
-bottom-level acceleration structure and is defined as:
-
-include::{generated}/api/structs/VkGeometryTrianglesNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:vertexData is the buffer containing vertex data for this geometry.
-  * pname:vertexOffset is the offset in bytes within pname:vertexData
-    containing vertex data for this geometry.
-  * pname:vertexCount is the number of valid vertices.
-  * pname:vertexStride is the stride in bytes between each vertex.
-  * pname:vertexFormat is a elink:VkFormat describing the format of each
-    vertex element.
-  * pname:indexData is the buffer containing index data for this geometry.
-  * pname:indexOffset is the offset in bytes within pname:indexData
-    containing index data for this geometry.
-  * pname:indexCount is the number of indices to include in this geometry.
-  * pname:indexType is a elink:VkIndexType describing the format of each
-    index.
-  * pname:transformData is an optional buffer containing an
-    slink:VkTransformMatrixNV structure defining a transformation to be
-    applied to this geometry.
-  * pname:transformOffset is the offset in bytes in pname:transformData of
-    the transform information described above.
-
-If pname:indexType is ename:VK_INDEX_TYPE_NONE_NV, then this structure
-describes a set of triangles determined by pname:vertexCount.
-Otherwise, this structure describes a set of indexed triangles determined by
-pname:indexCount.
-
-.Valid Usage
-****
-  * [[VUID-VkGeometryTrianglesNV-vertexOffset-02428]]
-    pname:vertexOffset must: be less than the size of pname:vertexData
-  * [[VUID-VkGeometryTrianglesNV-vertexOffset-02429]]
-    pname:vertexOffset must: be a multiple of the component size of
-    pname:vertexFormat
-  * [[VUID-VkGeometryTrianglesNV-vertexFormat-02430]]
-    pname:vertexFormat must: be one of ename:VK_FORMAT_R32G32B32_SFLOAT,
-    ename:VK_FORMAT_R32G32_SFLOAT, ename:VK_FORMAT_R16G16B16_SFLOAT,
-    ename:VK_FORMAT_R16G16_SFLOAT, ename:VK_FORMAT_R16G16_SNORM, or
-    ename:VK_FORMAT_R16G16B16_SNORM
-  * [[VUID-VkGeometryTrianglesNV-vertexStride-03818]]
-    pname:vertexStride must: be less than or equal to [eq]#2^32^-1#
-  * [[VUID-VkGeometryTrianglesNV-indexOffset-02431]]
-    pname:indexOffset must: be less than the size of pname:indexData
-  * [[VUID-VkGeometryTrianglesNV-indexOffset-02432]]
-    pname:indexOffset must: be a multiple of the element size of
-    pname:indexType
-  * [[VUID-VkGeometryTrianglesNV-indexType-02433]]
-    pname:indexType must: be ename:VK_INDEX_TYPE_UINT16,
-    ename:VK_INDEX_TYPE_UINT32, or ename:VK_INDEX_TYPE_NONE_NV
-  * [[VUID-VkGeometryTrianglesNV-indexData-02434]]
-    pname:indexData must: be dlink:VK_NULL_HANDLE if pname:indexType is
-    ename:VK_INDEX_TYPE_NONE_NV
-  * [[VUID-VkGeometryTrianglesNV-indexData-02435]]
-    pname:indexData must: be a valid sname:VkBuffer handle if
-    pname:indexType is not ename:VK_INDEX_TYPE_NONE_NV
-  * [[VUID-VkGeometryTrianglesNV-indexCount-02436]]
-    pname:indexCount must: be `0` if pname:indexType is
-    ename:VK_INDEX_TYPE_NONE_NV
-  * [[VUID-VkGeometryTrianglesNV-transformOffset-02437]]
-    pname:transformOffset must: be less than the size of pname:transformData
-  * [[VUID-VkGeometryTrianglesNV-transformOffset-02438]]
-    pname:transformOffset must: be a multiple of `16`
-****
-
-include::{generated}/validity/structs/VkGeometryTrianglesNV.txt[]
---
-
-[open,refpage='VkGeometryAABBNV',desc='Structure specifying axis-aligned bounding box geometry in a bottom-level acceleration structure',type='structs']
---
-:refpage: VkGeometryAABBNV
-
-The sname:VkGeometryAABBNV structure specifies axis-aligned bounding box
-geometry in a bottom-level acceleration structure, and is defined as:
-
-include::{generated}/api/structs/VkGeometryAABBNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:aabbData is the buffer containing axis-aligned bounding box data.
-  * pname:numAABBs is the number of AABBs in this geometry.
-  * pname:stride is the stride in bytes between AABBs in pname:aabbData.
-  * pname:offset is the offset in bytes of the first AABB in pname:aabbData.
-
-The AABB data in memory is six 32-bit floats consisting of the minimum x, y,
-and z values followed by the maximum x, y, and z values.
-
-.Valid Usage
-****
-  * [[VUID-VkGeometryAABBNV-offset-02439]]
-    pname:offset must: be less than the size of pname:aabbData
-  * [[VUID-VkGeometryAABBNV-offset-02440]]
-    pname:offset must: be a multiple of `8`
-  * [[VUID-VkGeometryAABBNV-stride-02441]]
-    pname:stride must: be a multiple of `8`
-****
-
-include::{generated}/validity/structs/VkGeometryAABBNV.txt[]
---
-endif::VK_NV_ray_tracing[]
-
-[open,refpage='vkDestroyAccelerationStructureKHR',desc='Destroy an acceleration structure object',type='protos']
---
-:refpage: vkDestroyAccelerationStructureKHR
-
-To destroy an acceleration structure, call:
-
-ifdef::VK_KHR_acceleration_structure[]
-include::{generated}/api/protos/vkDestroyAccelerationStructureKHR.txt[]
-endif::VK_KHR_acceleration_structure[]
-
-  * pname:device is the logical device that destroys the acceleration
-    structure.
-  * pname:accelerationStructure is the acceleration structure to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02442]]
-    All submitted commands that refer to pname:accelerationStructure must:
-    have completed execution
-  * [[VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02443]]
-    If sname:VkAllocationCallbacks were provided when
-    pname:accelerationStructure was created, a compatible set of callbacks
-    must: be provided here
-  * [[VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02444]]
-    If no sname:VkAllocationCallbacks were provided when
-    pname:accelerationStructure was created, pname:pAllocator must: be
-    `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyAccelerationStructureKHR.txt[]
---
-
-ifdef::VK_NV_ray_tracing[]
-[open,refpage='vkDestroyAccelerationStructureNV',desc='Destroy an acceleration structure object',type='protos']
---
-:refpage: vkDestroyAccelerationStructureNV
-
-To destroy an acceleration structure, call:
-
-include::{generated}/api/protos/vkDestroyAccelerationStructureNV.txt[]
-
-  * pname:device is the logical device that destroys the buffer.
-  * pname:accelerationStructure is the acceleration structure to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyAccelerationStructureNV-accelerationStructure-03752]]
-    All submitted commands that refer to pname:accelerationStructure must:
-    have completed execution
-  * [[VUID-vkDestroyAccelerationStructureNV-accelerationStructure-03753]]
-    If sname:VkAllocationCallbacks were provided when
-    pname:accelerationStructure was created, a compatible set of callbacks
-    must: be provided here
-  * [[VUID-vkDestroyAccelerationStructureNV-accelerationStructure-03754]]
-    If no sname:VkAllocationCallbacks were provided when
-    pname:accelerationStructure was created, pname:pAllocator must: be
-    `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyAccelerationStructureNV.txt[]
---
-
-[open,refpage='vkGetAccelerationStructureMemoryRequirementsNV',desc='Get acceleration structure memory requirements',type='protos']
---
-:refpage: vkGetAccelerationStructureMemoryRequirementsNV
-
-An acceleration structure has memory requirements for the structure object
-itself, scratch space for the build, and scratch space for the update.
-
-Scratch space is allocated as a sname:VkBuffer, so for
-ename:VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV
-and
-ename:VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV
-the pname:pMemoryRequirements->alignment and
-pname:pMemoryRequirements->memoryTypeBits values returned by this call must:
-be filled with zero, and should: be ignored by the application.
-
-To query the memory requirements, call:
-
-include::{generated}/api/protos/vkGetAccelerationStructureMemoryRequirementsNV.txt[]
-
-  * pname:device is the logical device on which the acceleration structure
-    was created.
-  * pname:pInfo is a pointer to a
-    slink:VkAccelerationStructureMemoryRequirementsInfoNV structure
-    specifying the acceleration structure to get memory requirements for.
-  * pname:pMemoryRequirements is a pointer to a
-    slink:VkMemoryRequirements2KHR structure in which the requested
-    acceleration structure memory requirements are returned.
-
-include::{generated}/validity/protos/vkGetAccelerationStructureMemoryRequirementsNV.txt[]
---
-
-[open,refpage='VkAccelerationStructureMemoryRequirementsInfoNV',desc='Structure specifying acceleration to query for memory requirements',type='structs']
---
-:refpage: VkAccelerationStructureMemoryRequirementsInfoNV
-
-The sname:VkAccelerationStructureMemoryRequirementsInfoNV structure is
-defined as:
-
-include::{generated}/api/structs/VkAccelerationStructureMemoryRequirementsInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:type selects the type of memory requirement being queried.
-    ename:VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV
-    returns the memory requirements for the object itself.
-    ename:VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV
-    returns the memory requirements for the scratch memory when doing a
-    build.
-    ename:VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV
-    returns the memory requirements for the scratch memory when doing an
-    update.
-  * pname:accelerationStructure is the acceleration structure to be queried
-    for memory requirements.
-
-include::{generated}/validity/structs/VkAccelerationStructureMemoryRequirementsInfoNV.txt[]
---
-
-[open,refpage='VkAccelerationStructureMemoryRequirementsTypeNV',desc='Acceleration structure memory requirement type',type='enums']
---
-:refpage: VkAccelerationStructureMemoryRequirementsTypeNV
-
-Possible values of pname:type in
-sname:VkAccelerationStructureMemoryRequirementsInfoNV are:,
-
-include::{generated}/api/enums/VkAccelerationStructureMemoryRequirementsTypeNV.txt[]
-
-  * ename:VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV
-    requests the memory requirement for the sname:VkAccelerationStructureNV
-    backing store.
-  * ename:VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV
-    requests the memory requirement for scratch space during the initial
-    build.
-  * ename:VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV
-    requests the memory requirement for scratch space during an update.
---
-endif::VK_NV_ray_tracing[]
-
-ifdef::VK_KHR_acceleration_structure[]
-[open,refpage='VkAccelerationStructureBuildTypeKHR',desc='Acceleration structure build type',type='enums']
---
-:refpage: VkAccelerationStructureBuildTypeKHR
-
-Possible values of pname:buildType in
-flink:vkGetAccelerationStructureBuildSizesKHR are:
-
-include::{generated}/api/enums/VkAccelerationStructureBuildTypeKHR.txt[]
-
-  * ename:VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR requests the memory
-    requirement for operations performed by the host.
-  * ename:VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR requests the
-    memory requirement for operations performed by the device.
-  * ename:VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR requests
-    the memory requirement for operations performed by either the host, or
-    the device.
---
-endif::VK_KHR_acceleration_structure[]
-
-ifdef::VK_NV_ray_tracing[]
-[open,refpage='vkBindAccelerationStructureMemoryNV',desc='Bind acceleration structure memory',type='protos']
---
-:refpage: vkBindAccelerationStructureMemoryNV
-
-To attach memory to one or more acceleration structures at a time, call:
-
-include::{generated}/api/protos/vkBindAccelerationStructureMemoryNV.txt[]
-
-  * pname:device is the logical device that owns the acceleration structures
-    and memory.
-  * pname:bindInfoCount is the number of elements in pname:pBindInfos.
-  * pname:pBindInfos is a pointer to an array of
-    slink:VkBindAccelerationStructureMemoryInfoNV structures describing
-    acceleration structures and memory to bind.
-
-include::{generated}/validity/protos/vkBindAccelerationStructureMemoryNV.txt[]
---
-
-[open,refpage='VkBindAccelerationStructureMemoryInfoNV',desc='Structure specifying acceleration structure memory binding',type='structs']
---
-:refpage: VkBindAccelerationStructureMemoryInfoNV
-
-The sname:VkBindAccelerationStructureMemoryInfoNV structure is defined as:
-
-include::{generated}/api/structs/VkBindAccelerationStructureMemoryInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:accelerationStructure is the acceleration structure to be attached
-    to memory.
-  * pname:memory is a sname:VkDeviceMemory object describing the device
-    memory to attach.
-  * pname:memoryOffset is the start offset of the region of memory that is
-    to be bound to the acceleration structure.
-    The number of bytes returned in the
-    slink:VkMemoryRequirements::pname:size member in pname:memory, starting
-    from pname:memoryOffset bytes, will be bound to the specified
-    acceleration structure.
-  * pname:deviceIndexCount is the number of elements in
-    pname:pDeviceIndices.
-  * pname:pDeviceIndices is a pointer to an array of device indices.
-
-.Valid Usage
-****
-  * [[VUID-VkBindAccelerationStructureMemoryInfoNV-accelerationStructure-03620]]
-    pname:accelerationStructure must: not already be backed by a memory
-    object
-  * [[VUID-VkBindAccelerationStructureMemoryInfoNV-memoryOffset-03621]]
-    pname:memoryOffset must: be less than the size of pname:memory
-  * [[VUID-VkBindAccelerationStructureMemoryInfoNV-memory-03622]]
-    pname:memory must: have been allocated using one of the memory types
-    allowed in the pname:memoryTypeBits member of the
-    slink:VkMemoryRequirements structure returned from a call to
-    flink:vkGetAccelerationStructureMemoryRequirementsNV with
-    pname:accelerationStructure and pname:type of
-    ename:VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV
-  * [[VUID-VkBindAccelerationStructureMemoryInfoNV-memoryOffset-03623]]
-    pname:memoryOffset must: be an integer multiple of the pname:alignment
-    member of the slink:VkMemoryRequirements structure returned from a call
-    to flink:vkGetAccelerationStructureMemoryRequirementsNV with
-    pname:accelerationStructure and pname:type of
-    ename:VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV
-  * [[VUID-VkBindAccelerationStructureMemoryInfoNV-size-03624]]
-    The pname:size member of the sname:VkMemoryRequirements structure
-    returned from a call to
-    flink:vkGetAccelerationStructureMemoryRequirementsNV with
-    pname:accelerationStructure and pname:type of
-    ename:VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV must:
-    be less than or equal to the size of pname:memory minus
-    pname:memoryOffset
-****
-
-include::{generated}/validity/structs/VkBindAccelerationStructureMemoryInfoNV.txt[]
---
-
-[open,refpage='vkGetAccelerationStructureHandleNV',desc='Get opaque acceleration structure handle',type='protos']
---
-:refpage: vkGetAccelerationStructureHandleNV
-
-To allow constructing geometry instances with device code if desired, we
-need to be able to query a opaque handle for an acceleration structure.
-This handle is a value of 8 bytes.
-To get this handle, call:
-
-include::{generated}/api/protos/vkGetAccelerationStructureHandleNV.txt[]
-
-  * pname:device is the logical device that owns the acceleration
-    structures.
-  * pname:accelerationStructure is the acceleration structure.
-  * pname:dataSize is the size in bytes of the buffer pointed to by
-    pname:pData.
-  * pname:pData is a pointer to a user-allocated buffer where the results
-    will be written.
-
-.Valid Usage
-****
-  * [[VUID-vkGetAccelerationStructureHandleNV-dataSize-02240]]
-    pname:dataSize must: be large enough to contain the result of the query,
-    as described above
-  * [[VUID-vkGetAccelerationStructureHandleNV-accelerationStructure-02787]]
-    pname:accelerationStructure must: be bound completely and contiguously
-    to a single sname:VkDeviceMemory object via
-    flink:vkBindAccelerationStructureMemoryNV
-****
-
-include::{generated}/validity/protos/vkGetAccelerationStructureHandleNV.txt[]
---
-endif::VK_NV_ray_tracing[]
-
-ifdef::VK_KHR_acceleration_structure[]
-[open,refpage='vkGetAccelerationStructureDeviceAddressKHR',desc='Query an address of a acceleration structure',type='protos']
---
-:refpage: vkGetAccelerationStructureDeviceAddressKHR
-
-To query the 64-bit device address for an acceleration structure, call:
-
-include::{generated}/api/protos/vkGetAccelerationStructureDeviceAddressKHR.txt[]
-
-  * pname:device is the logical device that the acceleration structure was
-    created on.
-  * pname:pInfo is a pointer to a
-    slink:VkAccelerationStructureDeviceAddressInfoKHR structure specifying
-    the acceleration structure to retrieve an address for.
-
-The 64-bit return value is an address of the acceleration structure, which
-can be used for device and shader operations that involve acceleration
-structures, such as
-ifdef::VK_KHR_ray_tracing_pipeline,VK_KHR_ray_query[]
-ray traversal and
-endif::VK_KHR_ray_tracing_pipeline,VK_KHR_ray_query[]
-acceleration structure building.
-
-If the acceleration structure was created with a non-zero value of
-slink:VkAccelerationStructureCreateInfoKHR::pname:deviceAddress, the return
-value will be the same address.
-
-If the acceleration structure was created with a pname:type of
-ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR, the returned address must:
-be consistent with the relative offset to other acceleration structures with
-pname:type ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR allocated with
-the same slink:VkBuffer.
-That is, the difference in returned addresses between the two must: be the
-same as the difference in offsets provided at acceleration structure
-creation.
-
-[NOTE]
-.Note
-====
-The acceleration structure device address may: be different from the buffer
-device address corresponding to the acceleration structure's start offset in
-its storage buffer for acceleration structure types other than
-ename:VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkGetAccelerationStructureDeviceAddressKHR-device-03504]]
-    If pname:device was created with multiple physical devices, then the
-    <<features-bufferDeviceAddressMultiDevice,bufferDeviceAddressMultiDevice>>
-    feature must: be enabled
-****
-
-include::{generated}/validity/protos/vkGetAccelerationStructureDeviceAddressKHR.txt[]
---
-
-[open,refpage='VkAccelerationStructureDeviceAddressInfoKHR',desc='Structure specifying the acceleration structure to query an address for',type='structs']
---
-:refpage: VkAccelerationStructureDeviceAddressInfoKHR
-
-The sname:VkAccelerationStructureDeviceAddressInfoKHR structure is defined
-as:
-
-include::{generated}/api/structs/VkAccelerationStructureDeviceAddressInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:accelerationStructure specifies the acceleration structure whose
-    address is being queried.
-
-include::{generated}/validity/structs/VkAccelerationStructureDeviceAddressInfoKHR.txt[]
---
-endif::VK_KHR_acceleration_structure[]
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-
-
-[[resources-association]]
-== Resource Memory Association
-
-Resources are initially created as _virtual allocations_ with no backing
-memory.
-Device memory is allocated separately (see <<memory-device>>) and then
-associated with the resource.
-This association is done differently for sparse and non-sparse resources.
-
-Resources created with any of the sparse creation flags are considered
-sparse resources.
-Resources created without these flags are non-sparse.
-The details on resource memory association for sparse resources is described
-in <<sparsememory>>.
-
-Non-sparse resources must: be bound completely and contiguously to a single
-sname:VkDeviceMemory object before the resource is passed as a parameter to
-any of the following operations:
-
-  * creating image or buffer views
-  * updating descriptor sets
-  * recording commands in a command buffer
-
-Once bound, the memory binding is immutable for the lifetime of the
-resource.
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-
-In a logical device representing more than one physical device, buffer and
-image resources exist on all physical devices but can: be bound to memory
-differently on each.
-Each such replicated resource is an _instance_ of the resource.
-For sparse resources, each instance can: be bound to memory arbitrarily
-differently.
-For non-sparse resources, each instance can: either be bound to the local or
-a peer instance of the memory, or for images can: be bound to rectangular
-regions from the local and/or peer instances.
-When a resource is used in a descriptor set, each physical device interprets
-the descriptor according to its own instance's binding to memory.
-
-[NOTE]
-.Note
-====
-There are no new copy commands to transfer data between physical devices.
-Instead, an application can: create a resource with a peer mapping and use
-it as the source or destination of a transfer command executed by a single
-physical device to copy the data from one physical device to another.
-====
-
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-[open,refpage='vkGetBufferMemoryRequirements',desc='Returns the memory requirements for specified Vulkan object',type='protos']
---
-To determine the memory requirements for a buffer resource, call:
-
-include::{generated}/api/protos/vkGetBufferMemoryRequirements.txt[]
-
-  * pname:device is the logical device that owns the buffer.
-  * pname:buffer is the buffer to query.
-  * pname:pMemoryRequirements is a pointer to a slink:VkMemoryRequirements
-    structure in which the memory requirements of the buffer object are
-    returned.
-
-include::{generated}/validity/protos/vkGetBufferMemoryRequirements.txt[]
---
-
-[open,refpage='vkGetImageMemoryRequirements',desc='Returns the memory requirements for specified Vulkan object',type='protos']
---
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-To determine the memory requirements for an image resource, call:
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-To determine the memory requirements for an image resource which is not
-created with the ename:VK_IMAGE_CREATE_DISJOINT_BIT flag set, call:
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-include::{generated}/api/protos/vkGetImageMemoryRequirements.txt[]
-
-  * pname:device is the logical device that owns the image.
-  * pname:image is the image to query.
-  * pname:pMemoryRequirements is a pointer to a slink:VkMemoryRequirements
-    structure in which the memory requirements of the image object are
-    returned.
-
-.Valid Usage
-****
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-vkGetImageMemoryRequirements-image-01588]]
-    pname:image must: not have been created with the
-    ename:VK_IMAGE_CREATE_DISJOINT_BIT flag set
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-vkGetImageMemoryRequirements-image-04004]]
-    If pname:image was created with the
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID
-    external memory handle type, then pname:image must: be bound to memory
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-****
-
-include::{generated}/validity/protos/vkGetImageMemoryRequirements.txt[]
---
-
-[open,refpage='VkMemoryRequirements',desc='Structure specifying memory requirements',type='structs']
---
-The sname:VkMemoryRequirements structure is defined as:
-
-include::{generated}/api/structs/VkMemoryRequirements.txt[]
-
-  * pname:size is the size, in bytes, of the memory allocation required: for
-    the resource.
-  * pname:alignment is the alignment, in bytes, of the offset within the
-    allocation required: for the resource.
-  * pname:memoryTypeBits is a bitmask and contains one bit set for every
-    supported memory type for the resource.
-    Bit `i` is set if and only if the memory type `i` in the
-    sname:VkPhysicalDeviceMemoryProperties structure for the physical device
-    is supported for the resource.
-
-include::{generated}/validity/structs/VkMemoryRequirements.txt[]
---
-
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-The precise size of images that will be bound to external Android hardware
-buffer memory is unknown until the memory has been imported or allocated, so
-applications must: not call flink:vkGetImageMemoryRequirements or
-flink:vkGetImageMemoryRequirements2 with such an slink:VkImage before it has
-been bound to memory.
-ifdef::VK_KHR_maintenance4[]
-For this reason, applications also must: not call
-flink:vkGetDeviceImageMemoryRequirementsKHR with a slink:VkImageCreateInfo
-describing an external Android hardware buffer.
-endif::VK_KHR_maintenance4[]
-When importing Android hardware buffer memory, the pname:allocationSize can:
-be determined by calling flink:vkGetAndroidHardwareBufferPropertiesANDROID.
-When allocating new memory for a slink:VkImage that can: be exported to an
-Android hardware buffer, the memory's pname:allocationSize must: be zero;
-the actual size will be determined by the dedicated image's parameters.
-After the memory has been allocated, the amount of space allocated from the
-memory's heap can: be obtained by getting the image's memory requirements or
-by calling flink:vkGetAndroidHardwareBufferPropertiesANDROID with the
-Android hardware buffer exported from the memory.
-
-When allocating new memory for a slink:VkBuffer that can: be exported to an
-Android hardware buffer an application may: still call
-flink:vkGetBufferMemoryRequirements or flink:vkGetBufferMemoryRequirements2
-with slink:VkBuffer before it has been bound to memory.
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-
-ifdef::VK_KHR_external_memory_win32[]
-If the resource being queried was created with the
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT,
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT, or
-ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT external memory
-handle type, the value of pname:size has no meaning and should: be ignored.
-endif::VK_KHR_external_memory_win32[]
-
-The implementation guarantees certain properties about the memory
-requirements returned by
-ifdef::VK_KHR_get_memory_requirements2[]
-flink:vkGetBufferMemoryRequirements2, flink:vkGetImageMemoryRequirements2,
-endif::VK_KHR_get_memory_requirements2[]
-ifdef::VK_KHR_maintenance4[]
-flink:vkGetDeviceBufferMemoryRequirementsKHR,
-flink:vkGetDeviceImageMemoryRequirementsKHR,
-endif::VK_KHR_maintenance4[]
-flink:vkGetBufferMemoryRequirements and flink:vkGetImageMemoryRequirements:
-
-  * The pname:memoryTypeBits member always contains at least one bit set.
-  * If pname:buffer is a sname:VkBuffer not created with the
-    ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT bit set, or if pname:image is
-    <<glossary-linear-resource,linear>> image, then the pname:memoryTypeBits
-    member always contains at least one bit set corresponding to a
-    sname:VkMemoryType with a pname:propertyFlags that has both the
-    ename:VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT bit and the
-    ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT bit set.
-    In other words, mappable coherent memory can: always be attached to
-    these objects.
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * If pname:buffer was created with
-    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes set to `0` or
-    pname:image was created with
-    slink:VkExternalMemoryImageCreateInfo::pname:handleTypes set to `0`, the
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifndef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * The
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-    pname:memoryTypeBits member always contains at least one bit set
-    corresponding to a sname:VkMemoryType with a pname:propertyFlags that
-    has the ename:VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT bit set.
-  * The pname:memoryTypeBits member is identical for all sname:VkBuffer
-    objects created with the same value for the pname:flags and pname:usage
-    members in the slink:VkBufferCreateInfo structure
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-    and the pname:handleTypes member of the
-    slink:VkExternalMemoryBufferCreateInfo structure
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-    passed to flink:vkCreateBuffer.
-    Further, if code:usage1 and code:usage2 of type tlink:VkBufferUsageFlags
-    are such that the bits set in code:usage2 are a subset of the bits set
-    in code:usage1, and they have the same
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-    pname:flags and
-    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes,
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifndef::VK_VERSION_1_1,VK_KHR_external_memory[]
-    pname:flags,
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-    then the bits set in pname:memoryTypeBits returned for code:usage1 must:
-    be a subset of the bits set in pname:memoryTypeBits returned for
-    code:usage2, for all values of pname:flags.
-  * The pname:alignment member is a power of two.
-  * The pname:alignment member is identical for all sname:VkBuffer objects
-    created with the same combination of values for the pname:usage and
-    pname:flags members in the slink:VkBufferCreateInfo structure passed to
-    flink:vkCreateBuffer.
-ifdef::VK_KHR_maintenance4[]
-  * If the <<features-maintenance4, pname:maintenance4>> feature is enabled,
-    then the pname:alignment member is identical for all sname:VkImage
-    objects created with the same combination of values for the pname:flags,
-    pname:imageType, pname:format, pname:extent, pname:mipLevels,
-    pname:arrayLayers, pname:samples, pname:tiling and pname:usage members
-    in the slink:VkImageCreateInfo structure passed to flink:vkCreateImage.
-endif::VK_KHR_maintenance4[]
-  * The pname:alignment member satisfies the buffer descriptor offset
-    alignment requirements associated with the sname:VkBuffer's pname:usage:
-  ** If pname:usage included ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT
-     or ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, pname:alignment
-     must: be an integer multiple of
-     sname:VkPhysicalDeviceLimits::pname:minTexelBufferOffsetAlignment.
-  ** If pname:usage included ename:VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
-     pname:alignment must: be an integer multiple of
-     sname:VkPhysicalDeviceLimits::pname:minUniformBufferOffsetAlignment.
-  ** If pname:usage included ename:VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
-     pname:alignment must: be an integer multiple of
-     sname:VkPhysicalDeviceLimits::pname:minStorageBufferOffsetAlignment.
-  * For images created with a color format, the pname:memoryTypeBits member
-    is identical for all sname:VkImage objects created with the same
-    combination of values for the pname:tiling member, the
-    ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT bit of the pname:flags member,
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-    the ename:VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT bit of the
-    pname:flags member,
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-    pname:handleTypes member of slink:VkExternalMemoryImageCreateInfo,
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-    and the ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT of the pname:usage
-    member in the slink:VkImageCreateInfo structure passed to
-    flink:vkCreateImage.
-  * For images created with a depth/stencil format, the pname:memoryTypeBits
-    member is identical for all sname:VkImage objects created with the same
-    combination of values for the pname:format member, the pname:tiling
-    member, the ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT bit of the
-    pname:flags member,
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-    the ename:VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT bit of the
-    pname:flags member,
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-    pname:handleTypes member of slink:VkExternalMemoryImageCreateInfo,
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-    and the ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT of the pname:usage
-    member in the slink:VkImageCreateInfo structure passed to
-    flink:vkCreateImage.
-  * If the memory requirements are for a sname:VkImage, the
-    pname:memoryTypeBits member must: not refer to a sname:VkMemoryType with
-    a pname:propertyFlags that has the
-    ename:VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT bit set if the pname:image
-    did not have ename:VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT bit set in
-    the pname:usage member of the slink:VkImageCreateInfo structure passed
-    to flink:vkCreateImage.
-  * If the memory requirements are for a sname:VkBuffer, the
-    pname:memoryTypeBits member must: not refer to a sname:VkMemoryType with
-    a pname:propertyFlags that has the
-    ename:VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT bit set.
-+
-[NOTE]
-.Note
-====
-The implication of this requirement is that lazily allocated memory is
-disallowed for buffers in all cases.
-====
-  * The pname:size member is identical for all sname:VkBuffer objects
-    created with the same combination of creation parameters specified in
-    slink:VkBufferCreateInfo and its pname:pNext chain.
-  * The pname:size member is identical for all sname:VkImage objects created
-    with the same combination of creation parameters specified in
-    slink:VkImageCreateInfo and its pname:pNext chain.
-+
-[NOTE]
-.Note
-====
-This, however, does not imply that they interpret the contents of the bound
-memory identically with each other.
-ifdef::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-That additional guarantee, however, can: be explicitly requested using
-ename:VK_IMAGE_CREATE_ALIAS_BIT.
-endif::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-====
-ifdef::VK_KHR_maintenance4[]
-  * If the <<features-maintenance4, pname:maintenance4>> feature is enabled,
-    these additional guarantees apply:
-  ** For a sname:VkBuffer, the pname:size memory requirement is never
-     greater than that of another sname:VkBuffer created with a greater or
-     equal pname:size specified in slink:VkBufferCreateInfo, all other
-     creation parameters being identical.
-  ** For a slink:VkImage, the pname:size memory requirement is never greater
-     than that of another slink:VkImage created with a greater or equal
-     value in each of pname:extent.width, pname:extent.height, and
-     pname:extent.depth; all other creation parameters being identical.
-  ** The memory requirements returned by
-     flink:vkGetDeviceBufferMemoryRequirementsKHR are identical to those
-     that would be returned by flink:vkGetBufferMemoryRequirements2 if it
-     were called with a sname:VkBuffer created with the same
-     slink:VkBufferCreateInfo values.
-  ** The memory requirements returned by
-     flink:vkGetDeviceImageMemoryRequirementsKHR are identical to those that
-     would be returned by flink:vkGetImageMemoryRequirements2 if it were
-     called with a sname:VkImage created with the same
-     slink:VkImageCreateInfo values.
-endif::VK_KHR_maintenance4[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_memory_requirements2[]
-[open,refpage='vkGetBufferMemoryRequirements2',desc='Returns the memory requirements for specified Vulkan object',type='protos']
---
-To determine the memory requirements for a buffer resource, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetBufferMemoryRequirements2.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_get_memory_requirements2[or the equivalent command]
-
-ifdef::VK_KHR_get_memory_requirements2[]
-include::{generated}/api/protos/vkGetBufferMemoryRequirements2KHR.txt[]
-endif::VK_KHR_get_memory_requirements2[]
-
-  * pname:device is the logical device that owns the buffer.
-  * pname:pInfo is a pointer to a slink:VkBufferMemoryRequirementsInfo2
-    structure containing parameters required for the memory requirements
-    query.
-  * pname:pMemoryRequirements is a pointer to a slink:VkMemoryRequirements2
-    structure in which the memory requirements of the buffer object are
-    returned.
-
-include::{generated}/validity/protos/vkGetBufferMemoryRequirements2.txt[]
---
-
-ifdef::VK_KHR_maintenance4[]
-[open,refpage='vkGetDeviceBufferMemoryRequirementsKHR',desc='Returns the memory requirements for specified Vulkan object',type='protos']
---
-To determine the memory requirements for a buffer resource without creating
-an object, call:
-
-include::{generated}/api/protos/vkGetDeviceBufferMemoryRequirementsKHR.txt[]
-
-  * pname:device is the logical device intended to own the buffer.
-  * pname:pInfo is a pointer to a slink:VkDeviceBufferMemoryRequirementsKHR
-    structure containing parameters required for the memory requirements
-    query.
-  * pname:pMemoryRequirements is a pointer to a slink:VkMemoryRequirements2
-    structure in which the memory requirements of the buffer object are
-    returned.
-
-include::{generated}/validity/protos/vkGetDeviceBufferMemoryRequirementsKHR.txt[]
---
-endif::VK_KHR_maintenance4[]
-
-[open,refpage='VkBufferMemoryRequirementsInfo2',desc='(None)',type='structs']
---
-The sname:VkBufferMemoryRequirementsInfo2 structure is defined as:
-
-include::{generated}/api/structs/VkBufferMemoryRequirementsInfo2.txt[]
-
-ifdef::VK_KHR_get_memory_requirements2[]
-or the equivalent
-
-include::{generated}/api/structs/VkBufferMemoryRequirementsInfo2KHR.txt[]
-endif::VK_KHR_get_memory_requirements2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:buffer is the buffer to query.
-
-include::{generated}/validity/structs/VkBufferMemoryRequirementsInfo2.txt[]
---
-
-ifdef::VK_KHR_maintenance4[]
-[open,refpage='VkDeviceBufferMemoryRequirementsKHR',desc='(None)',type='structs']
---
-The sname:VkDeviceBufferMemoryRequirementsKHR structure is defined as:
-
-include::{generated}/api/structs/VkDeviceBufferMemoryRequirementsKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pCreateInfo is a pointer to a slink:VkBufferCreateInfo structure
-    containing parameters affecting creation of the buffer to query.
-
-include::{generated}/validity/structs/VkDeviceBufferMemoryRequirementsKHR.txt[]
---
-endif::VK_KHR_maintenance4[]
-
-[open,refpage='vkGetImageMemoryRequirements2',desc='Returns the memory requirements for specified Vulkan object',type='protos']
---
-To determine the memory requirements for an image resource, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetImageMemoryRequirements2.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_get_memory_requirements2[or the equivalent command]
-
-ifdef::VK_KHR_get_memory_requirements2[]
-include::{generated}/api/protos/vkGetImageMemoryRequirements2KHR.txt[]
-endif::VK_KHR_get_memory_requirements2[]
-
-  * pname:device is the logical device that owns the image.
-  * pname:pInfo is a pointer to a slink:VkImageMemoryRequirementsInfo2
-    structure containing parameters required for the memory requirements
-    query.
-  * pname:pMemoryRequirements is a pointer to a slink:VkMemoryRequirements2
-    structure in which the memory requirements of the image object are
-    returned.
-
-include::{generated}/validity/protos/vkGetImageMemoryRequirements2.txt[]
---
-
-ifdef::VK_KHR_maintenance4[]
-[open,refpage='vkGetDeviceImageMemoryRequirementsKHR',desc='Returns the memory requirements for specified Vulkan object',type='protos']
---
-To determine the memory requirements for an image resource without creating
-an object, call:
-
-include::{generated}/api/protos/vkGetDeviceImageMemoryRequirementsKHR.txt[]
-
-  * pname:device is the logical device intended to own the image.
-  * pname:pInfo is a pointer to a slink:VkDeviceImageMemoryRequirementsKHR
-    structure containing parameters required for the memory requirements
-    query.
-  * pname:pMemoryRequirements is a pointer to a slink:VkMemoryRequirements2
-    structure in which the memory requirements of the image object are
-    returned.
-
-include::{generated}/validity/protos/vkGetDeviceImageMemoryRequirementsKHR.txt[]
---
-endif::VK_KHR_maintenance4[]
-
-[open,refpage='VkImageMemoryRequirementsInfo2',desc='(None)',type='structs']
---
-The sname:VkImageMemoryRequirementsInfo2 structure is defined as:
-
-include::{generated}/api/structs/VkImageMemoryRequirementsInfo2.txt[]
-
-ifdef::VK_KHR_get_memory_requirements2[]
-or the equivalent
-
-include::{generated}/api/structs/VkImageMemoryRequirementsInfo2KHR.txt[]
-endif::VK_KHR_get_memory_requirements2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:image is the image to query.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-.Valid Usage
-****
-  * [[VUID-VkImageMemoryRequirementsInfo2-image-01589]]
-    If pname:image was created with a _multi-planar_ format and the
-    ename:VK_IMAGE_CREATE_DISJOINT_BIT flag, there must: be a
-    slink:VkImagePlaneMemoryRequirementsInfo included in the pname:pNext
-    chain of the slink:VkImageMemoryRequirementsInfo2 structure
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkImageMemoryRequirementsInfo2-image-02279]]
-    If pname:image was created with ename:VK_IMAGE_CREATE_DISJOINT_BIT and
-    with ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then there must: be
-    a slink:VkImagePlaneMemoryRequirementsInfo included in the pname:pNext
-    chain of the slink:VkImageMemoryRequirementsInfo2 structure
-endif::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkImageMemoryRequirementsInfo2-image-01590]]
-    If pname:image was not created with the
-    ename:VK_IMAGE_CREATE_DISJOINT_BIT flag, there must: not be a
-    slink:VkImagePlaneMemoryRequirementsInfo included in the pname:pNext
-    chain of the slink:VkImageMemoryRequirementsInfo2 structure
-ifndef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkImageMemoryRequirementsInfo2-image-01591]]
-    If pname:image was created with a single-plane format, there must: not
-    be a slink:VkImagePlaneMemoryRequirementsInfo included in the
-    pname:pNext chain of the slink:VkImageMemoryRequirementsInfo2 structure
-endif::VK_EXT_image_drm_format_modifier[]
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkImageMemoryRequirementsInfo2-image-02280]]
-    If pname:image was created with a single-plane format and with any
-    pname:tiling other than ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,
-    then there must: not be a slink:VkImagePlaneMemoryRequirementsInfo
-    included in the pname:pNext chain of the
-    slink:VkImageMemoryRequirementsInfo2 structure
-endif::VK_EXT_image_drm_format_modifier[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkImageMemoryRequirementsInfo2-image-01897]]
-    If pname:image was created with the
-    ename:VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID
-    external memory handle type, then pname:image must: be bound to memory
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-****
-
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-include::{generated}/validity/structs/VkImageMemoryRequirementsInfo2.txt[]
---
-
-ifdef::VK_KHR_maintenance4[]
-[open,refpage='VkDeviceImageMemoryRequirementsKHR',desc='(None)',type='structs']
---
-The sname:VkDeviceImageMemoryRequirementsKHR structure is defined as:
-
-include::{generated}/api/structs/VkDeviceImageMemoryRequirementsKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pCreateInfo is a pointer to a slink:VkImageCreateInfo structure
-    containing parameters affecting creation of the image to query.
-  * pname:planeAspect is a elink:VkImageAspectFlagBits value specifying the
-    aspect corresponding to the image plane to query.
-    This parameter is ignored unless pname:pCreateInfo::pname:flags has
-    ename:VK_IMAGE_CREATE_DISJOINT_BIT
-ifdef::VK_EXT_image_drm_format_modifier[]
-    or ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT
-endif::VK_EXT_image_drm_format_modifier[]
-    set.
-
-.Valid Usage
-****
-  * [[VUID-VkDeviceImageMemoryRequirementsKHR-pCreateInfo-06416]]
-    The pname:pCreateInfo::pname:pNext chain must: not contain a
-    slink:VkImageSwapchainCreateInfoKHR structure
-  * [[VUID-VkDeviceImageMemoryRequirementsKHR-pCreateInfo-06417]]
-    If pname:pCreateInfo::pname:flags has ename:VK_IMAGE_CREATE_DISJOINT_BIT
-    set then pname:planAspect must: not be zero
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkDeviceImageMemoryRequirementsKHR-pCreateInfo-06418]]
-    If pname:pCreateInfo::pname:flags has
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT set then pname:planAspect
-    must: not be zero
-endif::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkDeviceImageMemoryRequirementsKHR-pCreateInfo-06419]]
-    If pname:pCreateInfo::pname:flags has ename:VK_IMAGE_CREATE_DISJOINT_BIT
-    set and if the pname:pCreateInfo::pname:tiling is
-    ename:VK_IMAGE_TILING_LINEAR or ename:VK_IMAGE_TILING_OPTIMAL, then
-    pname:planeAspect must: be a single valid _format plane_ for the image
-    (that is, for a two-plane image pname:planeAspect must: be
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT or ename:VK_IMAGE_ASPECT_PLANE_1_BIT,
-    and for a three-plane image pname:planeAspect must: be
-    ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT or
-    ename:VK_IMAGE_ASPECT_PLANE_2_BIT)
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkDeviceImageMemoryRequirementsKHR-pCreateInfo-06420]]
-    If pname:pCreateInfo::pname:flags has
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT set and the
-    pname:pCreateInfo::pname:tiling is
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then pname:planeAspect
-    must: be a single valid _memory plane_ for the image (that is,
-    pname:aspectMask must: specify a plane index that is less than the
-    slink:VkDrmFormatModifierPropertiesEXT::pname:drmFormatModifierPlaneCount
-    associated with the image's pname:format and
-    slink:VkImageDrmFormatModifierPropertiesEXT::pname:drmFormatModifier)
-endif::VK_EXT_image_drm_format_modifier[]
-****
-
-include::{generated}/validity/structs/VkDeviceImageMemoryRequirementsKHR.txt[]
---
-endif::VK_KHR_maintenance4[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-[open,refpage='VkImagePlaneMemoryRequirementsInfo',desc='Structure specifying image plane for memory requirements',type='structs']
---
-To determine the memory requirements for a plane of a disjoint image, add a
-sname:VkImagePlaneMemoryRequirementsInfo structure to the pname:pNext chain
-of the sname:VkImageMemoryRequirementsInfo2 structure.
-
-The sname:VkImagePlaneMemoryRequirementsInfo structure is defined as:
-
-include::{generated}/api/structs/VkImagePlaneMemoryRequirementsInfo.txt[]
-
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-or the equivalent
-
-include::{generated}/api/structs/VkImagePlaneMemoryRequirementsInfoKHR.txt[]
-endif::VK_KHR_sampler_ycbcr_conversion[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:planeAspect is a elink:VkImageAspectFlagBits value specifying the
-    aspect corresponding to the image plane to query.
-
-.Valid Usage
-****
-  * [[VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02281]]
-    If the image's pname:tiling is ename:VK_IMAGE_TILING_LINEAR or
-    ename:VK_IMAGE_TILING_OPTIMAL, then pname:planeAspect must: be a single
-    valid _format plane_ for the image (that is, for a two-plane image
-    pname:planeAspect must: be ename:VK_IMAGE_ASPECT_PLANE_0_BIT or
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT, and for a three-plane image
-    pname:planeAspect must: be ename:VK_IMAGE_ASPECT_PLANE_0_BIT,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT or ename:VK_IMAGE_ASPECT_PLANE_2_BIT)
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02282]]
-    If the image's pname:tiling is
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then pname:planeAspect
-    must: be a single valid _memory plane_ for the image (that is,
-    pname:aspectMask must: specify a plane index that is less than the
-    slink:VkDrmFormatModifierPropertiesEXT::pname:drmFormatModifierPlaneCount
-    associated with the image's pname:format and
-    slink:VkImageDrmFormatModifierPropertiesEXT::pname:drmFormatModifier)
-endif::VK_EXT_image_drm_format_modifier[]
-****
-
-include::{generated}/validity/structs/VkImagePlaneMemoryRequirementsInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-[open,refpage='VkMemoryRequirements2',desc='Structure specifying memory requirements',type='structs']
---
-The sname:VkMemoryRequirements2 structure is defined as:
-
-include::{generated}/api/structs/VkMemoryRequirements2.txt[]
-
-ifdef::VK_KHR_get_memory_requirements2[]
-or the equivalent
-
-include::{generated}/api/structs/VkMemoryRequirements2KHR.txt[]
-endif::VK_KHR_get_memory_requirements2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memoryRequirements is a slink:VkMemoryRequirements structure
-    describing the memory requirements of the resource.
-
-include::{generated}/validity/structs/VkMemoryRequirements2.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_get_memory_requirements2[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
-[open,refpage='VkMemoryDedicatedRequirements',desc='Structure describing dedicated allocation requirements of buffer and image resources',type='structs']
---
-The sname:VkMemoryDedicatedRequirements structure is defined as:
-
-include::{generated}/api/structs/VkMemoryDedicatedRequirements.txt[]
-
-ifdef::VK_KHR_dedicated_allocation[]
-or the equivalent
-
-include::{generated}/api/structs/VkMemoryDedicatedRequirementsKHR.txt[]
-endif::VK_KHR_dedicated_allocation[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:prefersDedicatedAllocation specifies that the implementation would
-    prefer a dedicated allocation for this resource.
-    The application is still free to suballocate the resource but it may:
-    get better performance if a dedicated allocation is used.
-  * pname:requiresDedicatedAllocation specifies that a dedicated allocation
-    is required for this resource.
-
-To determine the dedicated allocation requirements of a buffer or image
-resource, add a slink:VkMemoryDedicatedRequirements structure to the
-pname:pNext chain of the slink:VkMemoryRequirements2 structure passed as the
-pname:pMemoryRequirements parameter of flink:vkGetBufferMemoryRequirements2
-or flink:vkGetImageMemoryRequirements2, respectively.
-
-Constraints on the values returned for buffer resources are:
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * pname:requiresDedicatedAllocation may: be ename:VK_TRUE if the
-    pname:pNext chain of slink:VkBufferCreateInfo for the call to
-    fname:vkCreateBuffer used to create the buffer being queried included a
-    slink:VkExternalMemoryBufferCreateInfo structure, and any of the handle
-    types specified in
-    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes requires
-    dedicated allocation, as reported by
-    flink:vkGetPhysicalDeviceExternalBufferProperties in
-    sname:VkExternalBufferProperties::pname:externalMemoryProperties.externalMemoryFeatures.
-    Otherwise, pname:requiresDedicatedAllocation will be ename:VK_FALSE.
-
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifndef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * pname:requiresDedicatedAllocation will be ename:VK_FALSE
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * When the implementation sets pname:requiresDedicatedAllocation to
-    ename:VK_TRUE, it must: also set pname:prefersDedicatedAllocation to
-    ename:VK_TRUE.
-  * If ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT was set in
-    slink:VkBufferCreateInfo::pname:flags when pname:buffer was created,
-    then both pname:prefersDedicatedAllocation and
-    pname:requiresDedicatedAllocation will be ename:VK_FALSE.
-
-Constraints on the values returned for image resources are:
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * pname:requiresDedicatedAllocation may: be ename:VK_TRUE if the
-    pname:pNext chain of slink:VkImageCreateInfo for the call to
-    flink:vkCreateImage used to create the image being queried included a
-    slink:VkExternalMemoryImageCreateInfo structure, and any of the handle
-    types specified in
-    slink:VkExternalMemoryImageCreateInfo::pname:handleTypes requires
-    dedicated allocation, as reported by
-    flink:vkGetPhysicalDeviceImageFormatProperties2 in
-    sname:VkExternalImageFormatProperties::pname:externalMemoryProperties.externalMemoryFeatures.
-    Otherwise, pname:requiresDedicatedAllocation will be ename:VK_FALSE.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifndef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * pname:requiresDedicatedAllocation will be ename:VK_FALSE
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * If ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT was set in
-    slink:VkImageCreateInfo::pname:flags when pname:image was created, then
-    both pname:prefersDedicatedAllocation and
-    pname:requiresDedicatedAllocation will be ename:VK_FALSE.
-
-include::{generated}/validity/structs/VkMemoryDedicatedRequirements.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_dedicated_allocation[]
-
-[open,refpage='vkBindBufferMemory',desc='Bind device memory to a buffer object',type='protos']
---
-:refpage: vkBindBufferMemory
-
-To attach memory to a buffer object, call:
-
-include::{generated}/api/protos/vkBindBufferMemory.txt[]
-
-  * pname:device is the logical device that owns the buffer and memory.
-  * pname:buffer is the buffer to be attached to memory.
-  * pname:memory is a slink:VkDeviceMemory object describing the device
-    memory to attach.
-  * pname:memoryOffset is the start offset of the region of pname:memory
-    which is to be bound to the buffer.
-    The number of bytes returned in the
-    sname:VkMemoryRequirements::pname:size member in pname:memory, starting
-    from pname:memoryOffset bytes, will be bound to the specified buffer.
-
-ifdef::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-fname:vkBindBufferMemory is equivalent to passing the same parameters
-through slink:VkBindBufferMemoryInfo to flink:vkBindBufferMemory2.
-endif::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/bind_buffer_common.txt[]
-****
-
-include::{generated}/validity/protos/vkBindBufferMemory.txt[]
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-[open,refpage='vkBindBufferMemory2',desc='Bind device memory to buffer objects',type='protos']
---
-To attach memory to buffer objects for one or more buffers at a time, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkBindBufferMemory2.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_bind_memory2[or the equivalent command]
-
-ifdef::VK_KHR_bind_memory2[]
-include::{generated}/api/protos/vkBindBufferMemory2KHR.txt[]
-endif::VK_KHR_bind_memory2[]
-
-  * pname:device is the logical device that owns the buffers and memory.
-  * pname:bindInfoCount is the number of elements in pname:pBindInfos.
-  * pname:pBindInfos is a pointer to an array of pname:bindInfoCount
-    slink:VkBindBufferMemoryInfo structures describing buffers and memory to
-    bind.
-
-On some implementations, it may: be more efficient to batch memory bindings
-into a single command.
-
-include::{generated}/validity/protos/vkBindBufferMemory2.txt[]
---
-
-[open,refpage='VkBindBufferMemoryInfo',desc='Structure specifying how to bind a buffer to memory',type='structs']
---
-:refpage: VkBindBufferMemoryInfo
-
-sname:VkBindBufferMemoryInfo contains members corresponding to the
-parameters of flink:vkBindBufferMemory.
-
-The sname:VkBindBufferMemoryInfo structure is defined as:
-
-include::{generated}/api/structs/VkBindBufferMemoryInfo.txt[]
-
-ifdef::VK_KHR_bind_memory2[]
-or the equivalent
-
-include::{generated}/api/structs/VkBindBufferMemoryInfoKHR.txt[]
-endif::VK_KHR_bind_memory2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:buffer is the buffer to be attached to memory.
-  * pname:memory is a slink:VkDeviceMemory object describing the device
-    memory to attach.
-  * pname:memoryOffset is the start offset of the region of pname:memory
-    which is to be bound to the buffer.
-    The number of bytes returned in the
-    sname:VkMemoryRequirements::pname:size member in pname:memory, starting
-    from pname:memoryOffset bytes, will be bound to the specified buffer.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/bind_buffer_common.txt[]
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkBindBufferMemoryInfo-pNext-01605]]
-    If the pname:pNext chain includes a
-    slink:VkBindBufferMemoryDeviceGroupInfo structure, all instances of
-    pname:memory specified by
-    slink:VkBindBufferMemoryDeviceGroupInfo::pname:pDeviceIndices must: have
-    been allocated
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-****
-
-include::{generated}/validity/structs/VkBindBufferMemoryInfo.txt[]
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[open,refpage='VkBindBufferMemoryDeviceGroupInfo',desc='Structure specifying device within a group to bind to',type='structs']
---
-The sname:VkBindBufferMemoryDeviceGroupInfo structure is defined as:
-
-include::{generated}/api/structs/VkBindBufferMemoryDeviceGroupInfo.txt[]
-
-// Jon: this conditional needs to be enhanced for 1.1 / bind_memory_2
-ifdef::VK_KHR_device_group+VK_KHR_bind_memory2[]
-or the equivalent
-
-include::{generated}/api/structs/VkBindBufferMemoryDeviceGroupInfoKHR.txt[]
-endif::VK_KHR_device_group+VK_KHR_bind_memory2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:deviceIndexCount is the number of elements in
-    pname:pDeviceIndices.
-  * pname:pDeviceIndices is a pointer to an array of device indices.
-
-If the pname:pNext chain of slink:VkBindBufferMemoryInfo includes a
-sname:VkBindBufferMemoryDeviceGroupInfo structure, then that structure
-determines how memory is bound to buffers across multiple devices in a
-device group.
-
-If pname:deviceIndexCount is greater than zero, then on device index [eq]#i#
-the buffer is attached to the instance of pname:memory on the physical
-device with device index [eq]#pname:pDeviceIndices[i]#.
-
-If pname:deviceIndexCount is zero and pname:memory comes from a memory heap
-with the ename:VK_MEMORY_HEAP_MULTI_INSTANCE_BIT bit set, then it is as if
-pname:pDeviceIndices contains consecutive indices from zero to the number of
-physical devices in the logical device, minus one.
-In other words, by default each physical device attaches to its own instance
-of pname:memory.
-
-If pname:deviceIndexCount is zero and pname:memory comes from a memory heap
-without the ename:VK_MEMORY_HEAP_MULTI_INSTANCE_BIT bit set, then it is as
-if pname:pDeviceIndices contains an array of zeros.
-In other words, by default each physical device attaches to instance zero.
-
-.Valid Usage
-****
-  * [[VUID-VkBindBufferMemoryDeviceGroupInfo-deviceIndexCount-01606]]
-    pname:deviceIndexCount must: either be zero or equal to the number of
-    physical devices in the logical device
-  * [[VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-01607]]
-    All elements of pname:pDeviceIndices must: be valid device indices
-****
-
-include::{generated}/validity/structs/VkBindBufferMemoryDeviceGroupInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-endif::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-
-[open,refpage='vkBindImageMemory',desc='Bind device memory to an image object',type='protos']
---
-:refpage: vkBindImageMemory
-
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-To attach memory to an image object, call:
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-To attach memory to a sname:VkImage object created without the
-ename:VK_IMAGE_CREATE_DISJOINT_BIT set, call:
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-include::{generated}/api/protos/vkBindImageMemory.txt[]
-
-  * pname:device is the logical device that owns the image and memory.
-  * pname:image is the image.
-  * pname:memory is the slink:VkDeviceMemory object describing the device
-    memory to attach.
-  * pname:memoryOffset is the start offset of the region of pname:memory
-    which is to be bound to the image.
-    The number of bytes returned in the
-    sname:VkMemoryRequirements::pname:size member in pname:memory, starting
-    from pname:memoryOffset bytes, will be bound to the specified image.
-
-ifdef::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-fname:vkBindImageMemory is equivalent to passing the same parameters through
-slink:VkBindImageMemoryInfo to flink:vkBindImageMemory2.
-endif::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/bind_image_common.txt[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-vkBindImageMemory-image-01608]]
-    pname:image must: not have been created with the
-    ename:VK_IMAGE_CREATE_DISJOINT_BIT set
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-vkBindImageMemory-memory-01047]]
-    pname:memory must: have been allocated using one of the memory types
-    allowed in the pname:memoryTypeBits member of the
-    sname:VkMemoryRequirements structure returned from a call to
-    flink:vkGetImageMemoryRequirements with pname:image
-  * [[VUID-vkBindImageMemory-memoryOffset-01048]]
-    pname:memoryOffset must: be an integer multiple of the pname:alignment
-    member of the sname:VkMemoryRequirements structure returned from a call
-    to flink:vkGetImageMemoryRequirements with pname:image
-  * [[VUID-vkBindImageMemory-size-01049]]
-    The difference of the size of pname:memory and pname:memoryOffset must:
-    be greater than or equal to the pname:size member of the
-    slink:VkMemoryRequirements structure returned from a call to
-    flink:vkGetImageMemoryRequirements with the same pname:image
-ifdef::VK_FUCHSIA_buffer_collection[]
-  * [[VUID-vkBindImageMemory-image-06392]]
-    If pname:image was created with
-    slink:VkBufferCollectionImageCreateInfoFUCHSIA chained to
-    slink:VkImageCreateInfo::pname:pNext, pname:memory must: be allocated
-    with a slink:VkImportMemoryBufferCollectionFUCHSIA chained to
-    slink:VkMemoryAllocateInfo::pname:pNext
-endif::VK_FUCHSIA_buffer_collection[]
-****
-
-include::{generated}/validity/protos/vkBindImageMemory.txt[]
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-[open,refpage='vkBindImageMemory2',desc='Bind device memory to image objects',type='protos']
---
-To attach memory to image objects for one or more images at a time, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkBindImageMemory2.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_bind_memory2[or the equivalent command]
-
-ifdef::VK_KHR_bind_memory2[]
-include::{generated}/api/protos/vkBindImageMemory2KHR.txt[]
-endif::VK_KHR_bind_memory2[]
-
-  * pname:device is the logical device that owns the images and memory.
-  * pname:bindInfoCount is the number of elements in pname:pBindInfos.
-  * pname:pBindInfos is a pointer to an array of slink:VkBindImageMemoryInfo
-    structures, describing images and memory to bind.
-
-On some implementations, it may: be more efficient to batch memory bindings
-into a single command.
-
-.Valid Usage
-****
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-vkBindImageMemory2-pBindInfos-02858]]
-    If any slink:VkBindImageMemoryInfo::pname:image was created with
-    ename:VK_IMAGE_CREATE_DISJOINT_BIT then all planes of
-    slink:VkBindImageMemoryInfo::pname:image must: be bound individually in
-    separate pname:pBindInfos
-  * [[VUID-vkBindImageMemory2-pBindInfos-04006]]
-    pname:pBindInfos must: not refer to the same image subresource more than
-    once
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-****
-
-include::{generated}/validity/protos/vkBindImageMemory2.txt[]
---
-
-[open,refpage='VkBindImageMemoryInfo',desc='Structure specifying how to bind an image to memory',type='structs']
---
-:refpage: VkBindImageMemoryInfo
-
-sname:VkBindImageMemoryInfo contains members corresponding to the parameters
-of flink:vkBindImageMemory.
-
-The sname:VkBindImageMemoryInfo structure is defined as:
-
-include::{generated}/api/structs/VkBindImageMemoryInfo.txt[]
-
-ifdef::VK_KHR_bind_memory2[]
-or the equivalent
-
-include::{generated}/api/structs/VkBindImageMemoryInfoKHR.txt[]
-endif::VK_KHR_bind_memory2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:image is the image to be attached to memory.
-  * pname:memory is a slink:VkDeviceMemory object describing the device
-    memory to attach.
-  * pname:memoryOffset is the start offset of the region of pname:memory
-    which is to be bound to the image.
-    The number of bytes returned in the
-    sname:VkMemoryRequirements::pname:size member in pname:memory, starting
-    from pname:memoryOffset bytes, will be bound to the specified image.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/bind_image_common.txt[]
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkBindImageMemoryInfo-memory-01612]]
-    pname:memory must: have been allocated using one of the memory types
-    allowed in the pname:memoryTypeBits member of the
-    slink:VkMemoryRequirements structure returned from a call to
-    flink:vkGetImageMemoryRequirements with pname:image
-  * [[VUID-VkBindImageMemoryInfo-memoryOffset-01613]]
-    pname:memoryOffset must: be an integer multiple of the pname:alignment
-    member of the slink:VkMemoryRequirements structure returned from a call
-    to flink:vkGetImageMemoryRequirements with pname:image
-  * [[VUID-VkBindImageMemoryInfo-memory-01614]]
-    The difference of the size of pname:memory and pname:memoryOffset must:
-    be greater than or equal to the pname:size member of the
-    slink:VkMemoryRequirements structure returned from a call to
-    flink:vkGetImageMemoryRequirements with the same pname:image
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkBindImageMemoryInfo-pNext-01615]]
-    If the pname:pNext chain does not include a
-    slink:VkBindImagePlaneMemoryInfo structure, pname:memory must: have been
-    allocated using one of the memory types allowed in the
-    pname:memoryTypeBits member of the slink:VkMemoryRequirements structure
-    returned from a call to flink:vkGetImageMemoryRequirements2 with
-    pname:image
-  * [[VUID-VkBindImageMemoryInfo-pNext-01616]]
-    If the pname:pNext chain does not include a
-    slink:VkBindImagePlaneMemoryInfo structure, pname:memoryOffset must: be
-    an integer multiple of the pname:alignment member of the
-    slink:VkMemoryRequirements structure returned from a call to
-    flink:vkGetImageMemoryRequirements2 with pname:image
-  * [[VUID-VkBindImageMemoryInfo-pNext-01617]]
-    If the pname:pNext chain does not include a
-    slink:VkBindImagePlaneMemoryInfo structure, the difference of the size
-    of pname:memory and pname:memoryOffset must: be greater than or equal to
-    the pname:size member of the slink:VkMemoryRequirements structure
-    returned from a call to flink:vkGetImageMemoryRequirements2 with the
-    same pname:image
-  * [[VUID-VkBindImageMemoryInfo-pNext-01618]]
-    If the pname:pNext chain includes a slink:VkBindImagePlaneMemoryInfo
-    structure, pname:image must: have been created with the
-    ename:VK_IMAGE_CREATE_DISJOINT_BIT bit set
-  * [[VUID-VkBindImageMemoryInfo-pNext-01619]]
-    If the pname:pNext chain includes a slink:VkBindImagePlaneMemoryInfo
-    structure, pname:memory must: have been allocated using one of the
-    memory types allowed in the pname:memoryTypeBits member of the
-    slink:VkMemoryRequirements structure returned from a call to
-    flink:vkGetImageMemoryRequirements2 with pname:image and where
-    slink:VkBindImagePlaneMemoryInfo::pname:planeAspect corresponds to the
-    slink:VkImagePlaneMemoryRequirementsInfo::pname:planeAspect in the
-    slink:VkImageMemoryRequirementsInfo2 structure's pname:pNext chain
-  * [[VUID-VkBindImageMemoryInfo-pNext-01620]]
-    If the pname:pNext chain includes a slink:VkBindImagePlaneMemoryInfo
-    structure, pname:memoryOffset must: be an integer multiple of the
-    pname:alignment member of the slink:VkMemoryRequirements structure
-    returned from a call to flink:vkGetImageMemoryRequirements2 with
-    pname:image and where
-    slink:VkBindImagePlaneMemoryInfo::pname:planeAspect corresponds to the
-    slink:VkImagePlaneMemoryRequirementsInfo::pname:planeAspect in the
-    slink:VkImageMemoryRequirementsInfo2 structure's pname:pNext chain
-  * [[VUID-VkBindImageMemoryInfo-pNext-01621]]
-    If the pname:pNext chain includes a slink:VkBindImagePlaneMemoryInfo
-    structure, the difference of the size of pname:memory and
-    pname:memoryOffset must: be greater than or equal to the pname:size
-    member of the slink:VkMemoryRequirements structure returned from a call
-    to flink:vkGetImageMemoryRequirements2 with the same pname:image and
-    where slink:VkBindImagePlaneMemoryInfo::pname:planeAspect corresponds to
-    the slink:VkImagePlaneMemoryRequirementsInfo::pname:planeAspect in the
-    slink:VkImageMemoryRequirementsInfo2 structure's pname:pNext chain
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifndef::VK_VERSION_1_1+VK_KHR_swapchain[]
-ifndef::VK_KHR_device_group+VK_KHR_swapchain[]
-  * [[VUID-VkBindImageMemoryInfo-memory-01625]]
-    pname:memory must: be a valid slink:VkDeviceMemory handle
-endif::VK_KHR_device_group+VK_KHR_swapchain[]
-endif::VK_VERSION_1_1+VK_KHR_swapchain[]
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-VkBindImageMemoryInfo-pNext-01626]]
-    If the pname:pNext chain includes a
-    slink:VkBindImageMemoryDeviceGroupInfo structure, all instances of
-    pname:memory specified by
-    slink:VkBindImageMemoryDeviceGroupInfo::pname:pDeviceIndices must: have
-    been allocated
-  * [[VUID-VkBindImageMemoryInfo-pNext-01627]]
-    If the pname:pNext chain includes a
-    slink:VkBindImageMemoryDeviceGroupInfo structure, and
-    slink:VkBindImageMemoryDeviceGroupInfo::pname:splitInstanceBindRegionCount
-    is not zero, then pname:image must: have been created with the
-    ename:VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT bit set
-  * [[VUID-VkBindImageMemoryInfo-pNext-01628]]
-    If the pname:pNext chain includes a
-    slink:VkBindImageMemoryDeviceGroupInfo structure, all elements of
-    slink:VkBindImageMemoryDeviceGroupInfo::pname:pSplitInstanceBindRegions
-    must: be valid rectangles contained within the dimensions of pname:image
-  * [[VUID-VkBindImageMemoryInfo-pNext-01629]]
-    If the pname:pNext chain includes a
-    slink:VkBindImageMemoryDeviceGroupInfo structure, the union of the areas
-    of all elements of
-    slink:VkBindImageMemoryDeviceGroupInfo::pname:pSplitInstanceBindRegions
-    that correspond to the same instance of pname:image must: cover the
-    entire image
-ifdef::VK_KHR_swapchain[]
-  * [[VUID-VkBindImageMemoryInfo-image-01630]]
-    If pname:image was created with a valid swapchain handle in
-    slink:VkImageSwapchainCreateInfoKHR::pname:swapchain, then the
-    pname:pNext chain must: include a
-    slink:VkBindImageMemorySwapchainInfoKHR structure containing the same
-    swapchain handle
-  * [[VUID-VkBindImageMemoryInfo-pNext-01631]]
-    If the pname:pNext chain includes a
-    slink:VkBindImageMemorySwapchainInfoKHR structure, pname:memory must: be
-    dlink:VK_NULL_HANDLE
-  * [[VUID-VkBindImageMemoryInfo-pNext-01632]]
-    If the pname:pNext chain does not include a
-    slink:VkBindImageMemorySwapchainInfoKHR structure, pname:memory must: be
-    a valid slink:VkDeviceMemory handle
-endif::VK_KHR_swapchain[]
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-****
-
-include::{generated}/validity/structs/VkBindImageMemoryInfo.txt[]
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[open,refpage='VkBindImageMemoryDeviceGroupInfo',desc='Structure specifying device within a group to bind to',type='structs']
---
-The sname:VkBindImageMemoryDeviceGroupInfo structure is defined as:
-
-include::{generated}/api/structs/VkBindImageMemoryDeviceGroupInfo.txt[]
-
-// Jon: this conditional needs to be enhanced for 1.1 / bind_memory_2
-ifdef::VK_KHR_device_group+VK_KHR_bind_memory2[]
-or the equivalent
-
-include::{generated}/api/structs/VkBindImageMemoryDeviceGroupInfoKHR.txt[]
-endif::VK_KHR_device_group+VK_KHR_bind_memory2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:deviceIndexCount is the number of elements in
-    pname:pDeviceIndices.
-  * pname:pDeviceIndices is a pointer to an array of device indices.
-  * pname:splitInstanceBindRegionCount is the number of elements in
-    pname:pSplitInstanceBindRegions.
-  * pname:pSplitInstanceBindRegions is a pointer to an array of
-    slink:VkRect2D structures describing which regions of the image are
-    attached to each instance of memory.
-
-If the pname:pNext chain of slink:VkBindImageMemoryInfo includes a
-sname:VkBindImageMemoryDeviceGroupInfo structure, then that structure
-determines how memory is bound to images across multiple devices in a device
-group.
-
-If pname:deviceIndexCount is greater than zero, then on device index [eq]#i#
-pname:image is attached to the instance of the memory on the physical device
-with device index [eq]#pDeviceIndices[i]#.
-
-Let [eq]#N# be the number of physical devices in the logical device.
-If pname:splitInstanceBindRegionCount is greater than zero, then
-pname:pSplitInstanceBindRegions is a pointer to an array of [eq]#N^2^#
-rectangles, where the image region specified by the rectangle at element
-[eq]#i*N+j# in resource instance [eq]#i# is bound to the memory instance
-[eq]#j#.
-The blocks of the memory that are bound to each sparse image block region
-use an offset in memory, relative to pname:memoryOffset, computed as if the
-whole image was being bound to a contiguous range of memory.
-In other words, horizontally adjacent image blocks use consecutive blocks of
-memory, vertically adjacent image blocks are separated by the number of
-bytes per block multiplied by the width in blocks of pname:image, and the
-block at [eq]#(0,0)# corresponds to memory starting at pname:memoryOffset.
-
-If pname:splitInstanceBindRegionCount and pname:deviceIndexCount are zero
-and the memory comes from a memory heap with the
-ename:VK_MEMORY_HEAP_MULTI_INSTANCE_BIT bit set, then it is as if
-pname:pDeviceIndices contains consecutive indices from zero to the number of
-physical devices in the logical device, minus one.
-In other words, by default each physical device attaches to its own instance
-of the memory.
-
-If pname:splitInstanceBindRegionCount and pname:deviceIndexCount are zero
-and the memory comes from a memory heap without the
-ename:VK_MEMORY_HEAP_MULTI_INSTANCE_BIT bit set, then it is as if
-pname:pDeviceIndices contains an array of zeros.
-In other words, by default each physical device attaches to instance zero.
-
-.Valid Usage
-****
-  * [[VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01633]]
-    At least one of pname:deviceIndexCount and
-    pname:splitInstanceBindRegionCount must: be zero
-  * [[VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01634]]
-    pname:deviceIndexCount must: either be zero or equal to the number of
-    physical devices in the logical device
-  * [[VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-01635]]
-    All elements of pname:pDeviceIndices must: be valid device indices
-  * [[VUID-VkBindImageMemoryDeviceGroupInfo-splitInstanceBindRegionCount-01636]]
-    pname:splitInstanceBindRegionCount must: either be zero or equal to the
-    number of physical devices in the logical device squared
-  * [[VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-01637]]
-    Elements of pname:pSplitInstanceBindRegions that correspond to the same
-    instance of an image must: not overlap
-  * [[VUID-VkBindImageMemoryDeviceGroupInfo-offset-01638]]
-    The pname:offset.x member of any element of
-    pname:pSplitInstanceBindRegions must: be a multiple of the sparse image
-    block width
-    (sname:VkSparseImageFormatProperties::pname:imageGranularity.width) of
-    all non-metadata aspects of the image
-  * [[VUID-VkBindImageMemoryDeviceGroupInfo-offset-01639]]
-    The pname:offset.y member of any element of
-    pname:pSplitInstanceBindRegions must: be a multiple of the sparse image
-    block height
-    (sname:VkSparseImageFormatProperties::pname:imageGranularity.height) of
-    all non-metadata aspects of the image
-  * [[VUID-VkBindImageMemoryDeviceGroupInfo-extent-01640]]
-    The pname:extent.width member of any element of
-    pname:pSplitInstanceBindRegions must: either be a multiple of the sparse
-    image block width of all non-metadata aspects of the image, or else
-    pname:extent.width {plus} pname:offset.x must: equal the width of the
-    image subresource
-  * [[VUID-VkBindImageMemoryDeviceGroupInfo-extent-01641]]
-    The pname:extent.height member of any element of
-    pname:pSplitInstanceBindRegions must: either be a multiple of the sparse
-    image block height of all non-metadata aspects of the image, or else
-    pname:extent.height {plus} pname:offset.y must: equal the height of the
-    image subresource
-****
-
-include::{generated}/validity/structs/VkBindImageMemoryDeviceGroupInfo.txt[]
---
-
-ifdef::VK_KHR_swapchain[]
-[open,refpage='VkBindImageMemorySwapchainInfoKHR',desc='Structure specifying swapchain image memory to bind to',type='structs']
---
-If the pname:pNext chain of slink:VkBindImageMemoryInfo includes a
-sname:VkBindImageMemorySwapchainInfoKHR structure, then that structure
-includes a swapchain handle and image index indicating that the image will
-be bound to memory from that swapchain.
-
-The sname:VkBindImageMemorySwapchainInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkBindImageMemorySwapchainInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:swapchain is dlink:VK_NULL_HANDLE or a swapchain handle.
-  * pname:imageIndex is an image index within pname:swapchain.
-
-If pname:swapchain is not `NULL`, the pname:swapchain and pname:imageIndex
-are used to determine the memory that the image is bound to, instead of
-pname:memory and pname:memoryOffset.
-
-Memory can: be bound to a swapchain and use the pname:pDeviceIndices or
-pname:pSplitInstanceBindRegions members of
-slink:VkBindImageMemoryDeviceGroupInfo.
-
-.Valid Usage
-****
-  * [[VUID-VkBindImageMemorySwapchainInfoKHR-imageIndex-01644]]
-    pname:imageIndex must: be less than the number of images in
-    pname:swapchain
-****
-
-include::{generated}/validity/structs/VkBindImageMemorySwapchainInfoKHR.txt[]
---
-endif::VK_KHR_swapchain[]
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-[open,refpage='VkBindImagePlaneMemoryInfo',desc='Structure specifying how to bind an image plane to memory',type='structs']
---
-In order to bind _planes_ of a _disjoint image_, add a
-sname:VkBindImagePlaneMemoryInfo structure to the pname:pNext chain of
-slink:VkBindImageMemoryInfo.
-
-The sname:VkBindImagePlaneMemoryInfo structure is defined as:
-
-include::{generated}/api/structs/VkBindImagePlaneMemoryInfo.txt[]
-
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-or the equivalent
-
-include::{generated}/api/structs/VkBindImagePlaneMemoryInfoKHR.txt[]
-endif::VK_KHR_sampler_ycbcr_conversion[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:planeAspect is a ename:VkImageAspectFlagBits value specifying the
-    aspect of the disjoint image plane to bind.
-
-.Valid Usage
-****
-  * [[VUID-VkBindImagePlaneMemoryInfo-planeAspect-02283]]
-    If the image's pname:tiling is ename:VK_IMAGE_TILING_LINEAR or
-    ename:VK_IMAGE_TILING_OPTIMAL, then pname:planeAspect must: be a single
-    valid _format plane_ for the image (that is, for a two-plane image
-    pname:planeAspect must: be ename:VK_IMAGE_ASPECT_PLANE_0_BIT or
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT, and for a three-plane image
-    pname:planeAspect must: be ename:VK_IMAGE_ASPECT_PLANE_0_BIT,
-    ename:VK_IMAGE_ASPECT_PLANE_1_BIT or ename:VK_IMAGE_ASPECT_PLANE_2_BIT)
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * [[VUID-VkBindImagePlaneMemoryInfo-planeAspect-02284]]
-    If the image's pname:tiling is
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then pname:planeAspect
-    must: be a single valid _memory plane_ for the image (that is,
-    pname:aspectMask must: specify a plane index that is less than the
-    slink:VkDrmFormatModifierPropertiesEXT::pname:drmFormatModifierPlaneCount
-    associated with the image's pname:format and
-    slink:VkImageDrmFormatModifierPropertiesEXT::pname:drmFormatModifier)
-endif::VK_EXT_image_drm_format_modifier[]
-****
-
-include::{generated}/validity/structs/VkBindImagePlaneMemoryInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-endif::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-
-
-[[resources-bufferimagegranularity,Buffer-Image Granularity]]
-.Buffer-Image Granularity
-There is an implementation-dependent limit, pname:bufferImageGranularity,
-which specifies a page-like granularity at which linear and non-linear
-resources must: be placed in adjacent memory locations to avoid aliasing.
-Two resources which do not satisfy this granularity requirement are said to
-<<resources-memory-aliasing,alias>>.
-pname:bufferImageGranularity is specified in bytes, and must: be a power of
-two.
-Implementations which do not impose a granularity restriction may: report a
-pname:bufferImageGranularity value of one.
-
-[NOTE]
-.Note
-====
-Despite its name, pname:bufferImageGranularity is really a granularity
-between "`linear`" and "`non-linear`" resources.
-====
-
-Given resourceA at the lower memory offset and resourceB at the higher
-memory offset in the same sname:VkDeviceMemory object, where one resource is
-linear and the other is non-linear (as defined in the
-<<glossary-linear-resource,Glossary>>), and the following:
-
-[source,c]
----------------------------------------------------
-resourceA.end       = resourceA.memoryOffset + resourceA.size - 1
-resourceA.endPage   = resourceA.end & ~(bufferImageGranularity-1)
-resourceB.start     = resourceB.memoryOffset
-resourceB.startPage = resourceB.start & ~(bufferImageGranularity-1)
----------------------------------------------------
-
-The following property must: hold:
-
-[source,c]
----------------------------------------------------
-resourceA.endPage < resourceB.startPage
----------------------------------------------------
-
-That is, the end of the first resource (A) and the beginning of the second
-resource (B) must: be on separate "`pages`" of size
-pname:bufferImageGranularity.
-pname:bufferImageGranularity may: be different than the physical page size
-of the memory heap.
-This restriction is only needed when a linear resource and a non-linear
-resource are adjacent in memory and will be used simultaneously.
-The memory ranges of adjacent resources can: be closer than
-pname:bufferImageGranularity, provided they meet the pname:alignment
-requirement for the objects in question.
-
-Sparse block size in bytes and sparse image and buffer memory alignments
-must: all be multiples of the pname:bufferImageGranularity.
-Therefore, memory bound to sparse resources naturally satisfies the
-pname:bufferImageGranularity.
-
-
-[[resources-sharing]]
-== Resource Sharing Mode
-
-[open,refpage='VkSharingMode',desc='Buffer and image sharing modes',type='enums']
---
-Buffer and image objects are created with a _sharing mode_ controlling how
-they can: be accessed from queues.
-The supported sharing modes are:
-
-include::{generated}/api/enums/VkSharingMode.txt[]
-
-  * ename:VK_SHARING_MODE_EXCLUSIVE specifies that access to any range or
-    image subresource of the object will be exclusive to a single queue
-    family at a time.
-  * ename:VK_SHARING_MODE_CONCURRENT specifies that concurrent access to any
-    range or image subresource of the object from multiple queue families is
-    supported.
-
-[NOTE]
-.Note
-====
-ename:VK_SHARING_MODE_CONCURRENT may: result in lower performance access to
-the buffer or image than ename:VK_SHARING_MODE_EXCLUSIVE.
-====
-
-Ranges of buffers and image subresources of image objects created using
-ename:VK_SHARING_MODE_EXCLUSIVE must: only be accessed by queues in the
-queue family that has _ownership_ of the resource.
-Upon creation, such resources are not owned by any queue family; ownership
-is implicitly acquired upon first use within a queue.
-Once a resource using ename:VK_SHARING_MODE_EXCLUSIVE is owned by some queue
-family, the application must: perform a
-<<synchronization-queue-transfers,queue family ownership transfer>> to make
-the memory contents of a range or image subresource accessible to a
-different queue family.
-
-[NOTE]
-.Note
-====
-Images still require a <<resources-image-layouts, layout transition>> from
-ename:VK_IMAGE_LAYOUT_UNDEFINED or ename:VK_IMAGE_LAYOUT_PREINITIALIZED
-before being used on the first queue.
-====
-
-A queue family can: take ownership of an image subresource or buffer range
-of a resource created with ename:VK_SHARING_MODE_EXCLUSIVE, without an
-ownership transfer, in the same way as for a resource that was just created;
-however, taking ownership in this way has the effect that the contents of
-the image subresource or buffer range are undefined:.
-
-Ranges of buffers and image subresources of image objects created using
-ename:VK_SHARING_MODE_CONCURRENT must: only be accessed by queues from the
-queue families specified through the pname:queueFamilyIndexCount and
-pname:pQueueFamilyIndices members of the corresponding create info
-structures.
---
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-[[resources-external-sharing]]
-=== External Resource Sharing
-
-Resources should: only be accessed in the Vulkan instance that has exclusive
-ownership of their underlying memory.
-Only one Vulkan instance has exclusive ownership of a resource's underlying
-memory at a given time, regardless of whether the resource was created using
-ename:VK_SHARING_MODE_EXCLUSIVE or ename:VK_SHARING_MODE_CONCURRENT.
-Applications can transfer ownership of a resource's underlying memory only
-if the memory has been imported from or exported to another instance or
-external API using external memory handles.
-The semantics for transferring ownership outside of the instance are similar
-to those used for transferring ownership of ename:VK_SHARING_MODE_EXCLUSIVE
-resources between queues, and is also accomplished using
-slink:VkBufferMemoryBarrier or slink:VkImageMemoryBarrier operations.
-To make the contents of the underlying memory accessible in the destination
-instance or API, applications must:
-
-  . Release exclusive ownership from the source instance or API.
-  . Ensure the release operation has completed using semaphores or fences.
-  . Acquire exclusive ownership in the destination instance or API
-
-Unlike queue ownership transfers, the destination instance or API is not
-specified explicitly when releasing ownership, nor is the source instance or
-API specified when acquiring ownership.
-Instead, the image or memory barrier's pname:dstQueueFamilyIndex or
-pname:srcQueueFamilyIndex parameters are set to the reserved queue family
-index ename:VK_QUEUE_FAMILY_EXTERNAL
-ifdef::VK_EXT_queue_family_foreign[]
-or ename:VK_QUEUE_FAMILY_FOREIGN_EXT
-endif::VK_EXT_queue_family_foreign[]
-to represent the external destination or source respectively.
-
-Binding a resource to a memory object shared between multiple Vulkan
-instances or other APIs does not change the ownership of the underlying
-memory.
-The first entity to access the resource implicitly acquires ownership.
-An entity can: also implicitly take ownership from another entity in the
-same way without an explicit ownership transfer.
-However, taking ownership in this way has the effect that the contents of
-the underlying memory are undefined:.
-
-Accessing a resource backed by memory that is owned by a particular instance
-or API has the same semantics as accessing a ename:VK_SHARING_MODE_EXCLUSIVE
-resource, with one exception: Implementations must: ensure layout
-transitions performed on one member of a set of identical subresources of
-identical images that alias the same range of an underlying memory object
-affect the layout of all the subresources in the set.
-
-As a corollary, writes to any image subresources in such a set must: not
-make the contents of memory used by other subresources in the set
-undefined:.
-An application can: define the content of a subresource of one image by
-performing device writes to an identical subresource of another image
-provided both images are bound to the same region of external memory.
-Applications may: also add resources to such a set after the content of the
-existing set members has been defined without making the content undefined:
-by creating a new image with the initial layout
-ename:VK_IMAGE_LAYOUT_UNDEFINED and binding it to the same region of
-external memory as the existing images.
-
-[NOTE]
-.Note
-====
-Because layout transitions apply to all identical images aliasing the same
-region of external memory, the actual layout of the memory backing a new
-image as well as an existing image with defined content will not be
-undefined:.
-Such an image is not usable until it acquires ownership of its memory from
-the existing owner.
-Therefore, the layout specified as part of this transition will be the true
-initial layout of the image.
-The undefined: layout specified when creating it is a placeholder to
-simplify valid usage requirements.
-====
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-
-[[resources-memory-aliasing]]
-== Memory Aliasing
-
-A range of a sname:VkDeviceMemory allocation is _aliased_ if it is bound to
-multiple resources simultaneously, as described below, via
-flink:vkBindImageMemory, flink:vkBindBufferMemory,
-ifdef::VK_NV_ray_tracing[]
-flink:vkBindAccelerationStructureMemoryNV,
-endif::VK_NV_ray_tracing[]
-ifndef::VK_VERSION_1_1,VK_KHR_external_memory[]
-or via <<sparsememory-resource-binding,sparse memory bindings>>.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-via <<sparsememory-resource-binding,sparse memory bindings>>, or by binding
-the memory to resources in multiple Vulkan instances or external APIs using
-external memory handle export and import mechanisms.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-Consider two resources, resource~A~ and resource~B~, bound respectively to
-memory range~A~ and range~B~.
-Let paddedRange~A~ and paddedRange~B~ be, respectively, range~A~ and
-range~B~ aligned to pname:bufferImageGranularity.
-If the resources are both linear or both non-linear (as defined in the
-<<glossary-linear-resource,Glossary>>), then the resources _alias_ the
-memory in the intersection of range~A~ and range~B~.
-If one resource is linear and the other is non-linear, then the resources
-_alias_ the memory in the intersection of paddedRange~A~ and paddedRange~B~.
-
-Applications can: alias memory, but use of multiple aliases is subject to
-several constraints.
-
-[NOTE]
-.Note
-====
-Memory aliasing can: be useful to reduce the total device memory footprint
-of an application, if some large resources are used for disjoint periods of
-time.
-====
-
-When a <<glossary-linear-resource,non-linear>>,
-non-ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT image is bound to an aliased
-range, all image subresources of the image _overlap_ the range.
-When a linear image is bound to an aliased range, the image subresources
-that (according to the image's advertised layout) include bytes from the
-aliased range overlap the range.
-When a ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT image has sparse image
-blocks bound to an aliased range, only image subresources including those
-sparse image blocks overlap the range, and when the memory bound to the
-image's mip tail overlaps an aliased range all image subresources in the mip
-tail overlap the range.
-
-Buffers, and linear image subresources in either the
-ename:VK_IMAGE_LAYOUT_PREINITIALIZED or ename:VK_IMAGE_LAYOUT_GENERAL
-layouts, are _host-accessible subresources_.
-That is, the host has a well-defined addressing scheme to interpret the
-contents, and thus the layout of the data in memory can: be consistently
-interpreted across aliases if each of those aliases is a host-accessible
-subresource.
-Non-linear images, and linear image subresources in other layouts, are not
-host-accessible.
-
-If two aliases are both host-accessible, then they interpret the contents of
-the memory in consistent ways, and data written to one alias can: be read by
-the other alias.
-
-ifdef::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-[[resources-memory-aliasing-consistency]]
-If two aliases are both images that were created with identical creation
-parameters, both were created with the ename:VK_IMAGE_CREATE_ALIAS_BIT flag
-set, and both are bound identically to memory
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-except for slink:VkBindImageMemoryDeviceGroupInfo::pname:pDeviceIndices and
-slink:VkBindImageMemoryDeviceGroupInfo::pname:pSplitInstanceBindRegions,
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-then they interpret the contents of the memory in consistent ways, and data
-written to one alias can: be read by the other alias.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-[[resources-memory-aliasing-consistency-planes]]
-Additionally, if an individual plane of a multi-planar image and a
-single-plane image alias the same memory, then they also interpret the
-contents of the memory in consistent ways under the same conditions, but
-with the following modifications:
-
-  * Both must: have been created with the ename:VK_IMAGE_CREATE_DISJOINT_BIT
-    flag.
-  * The single-plane image must: have a elink:VkFormat that is
-    <<formats-compatible-planes,equivalent>> to that of the multi-planar
-    image's individual plane.
-  * The single-plane image and the individual plane of the multi-planar
-    image must: be bound identically to memory
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-    except for slink:VkBindImageMemoryDeviceGroupInfo::pname:pDeviceIndices
-    and
-    slink:VkBindImageMemoryDeviceGroupInfo::pname:pSplitInstanceBindRegions.
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-  * The pname:width and pname:height of the single-plane image are derived
-    from the multi-planar image's dimensions in the manner listed for
-    <<formats-compatible-planes,plane compatibility>> for the aliased plane.
-ifdef::VK_EXT_image_drm_format_modifier[]
-  * If either image's pname:tiling is
-    ename:VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then both images must: be
-    <<glossary-linear-resource,linear>>.
-endif::VK_EXT_image_drm_format_modifier[]
-  * All other creation parameters must: be identical
-
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-endif::VK_VERSION_1_1,VK_KHR_bind_memory2[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-Aliases created by binding the same memory to resources in multiple Vulkan
-instances or external APIs using external memory handle export and import
-mechanisms interpret the contents of the memory in consistent ways, and data
-written to one alias can: be read by the other alias.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-Otherwise, the aliases interpret the contents of the memory differently, and
-writes via one alias make the contents of memory partially or completely
-undefined: to the other alias.
-If the first alias is a host-accessible subresource, then the bytes affected
-are those written by the memory operations according to its addressing
-scheme.
-If the first alias is not host-accessible, then the bytes affected are those
-overlapped by the image subresources that were written.
-If the second alias is a host-accessible subresource, the affected bytes
-become undefined:.
-If the second alias is not host-accessible, all sparse image blocks (for
-sparse partially-resident images) or all image subresources (for non-sparse
-image and fully resident sparse images) that overlap the affected bytes
-become undefined:.
-
-If any image subresources are made undefined: due to writes to an alias,
-then each of those image subresources must: have its layout transitioned
-from ename:VK_IMAGE_LAYOUT_UNDEFINED to a valid layout before it is used, or
-from ename:VK_IMAGE_LAYOUT_PREINITIALIZED if the memory has been written by
-the host.
-If any sparse blocks of a sparse image have been made undefined:, then only
-the image subresources containing them must: be transitioned.
-
-Use of an overlapping range by two aliases must: be separated by a memory
-dependency using the appropriate <<synchronization-access-types, access
-types>> if at least one of those uses performs writes, whether the aliases
-interpret memory consistently or not.
-If buffer or image memory barriers are used, the scope of the barrier must:
-contain the entire range and/or set of image subresources that overlap.
-
-If two aliasing image views are used in the same framebuffer, then the
-render pass must: declare the attachments using the
-<<renderpass-aliasing,ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT>>, and
-follow the other rules listed in that section.
-
-[NOTE]
-.Note
-====
-Memory recycled via an application suballocator (i.e. without freeing and
-reallocating the memory objects) is not substantially different from memory
-aliasing.
-However, a suballocator usually waits on a fence before recycling a region
-of memory, and signaling a fence involves sufficient implicit dependencies
-to satisfy all the above requirements.
-====
-
-
-ifdef::VK_FUCHSIA_buffer_collection[]
-[[resources-buffer-collection-fuchsia]]
-== Buffer Collections
-
-[open,refpage='VkBufferCollectionFUCHSIA',desc='Opaque handle to a buffer collection object',type='handles']
---
-Fuchsia's FIDL-based Sysmem service interoperates with Vulkan via the
-`apiext:VK_FUCHSIA_buffer_collection` extension.
-
-A buffer collection is a set of one or more buffers which were allocated
-together as a group and which all have the same properties.
-These properties describe the buffers' internal representation, such as its
-dimensions and memory layout.
-This ensures that all of the buffers can be used interchangeably by tasks
-that require swapping among multiple buffers, such as double-buffered
-graphics rendering.
-
-On Fuchsia, the Sysmem service uses buffer collections as a core construct
-in its design.
-
-Buffer collections are represented by sname:VkBufferCollectionFUCHSIA
-handles:
-
-include::{generated}/api/handles/VkBufferCollectionFUCHSIA.txt[]
---
-
-
-=== Definitions
-
-  * FIDL - Fuchsia Interface Definition Language.
-    The declarative language used to define FIDL interprocess communication
-    interfaces on Fuchsia.
-    FIDL files use the `fidl` extension.
-    FIDL is also used to refer to the services defined by interfaces
-    declared in the FIDL language
-  * Sysmem - The FIDL service that facilitates optimal buffer sharing and
-    reuse on Fuchsia
-  * client - Any participant of the buffer collection e.g. the Vulkan
-    application
-  * token - A code:zx_handle_t Zircon channel object that allows
-    participation in the buffer collection
-
-
-=== Platform initialization for buffer collections
-To initialize a buffer collection on Fuchsia:
-
-  * Connect to the Sysmem service to initialize a Sysmem allocator
-  * Create an initial buffer collection token using the Sysmem allocator
-  * Duplicate the token for each participant beyond the initiator
-  * See the Sysmem Overview and fuchsia.sysmem FIDL documentation on
-    fuchsia.dev for more detailed information
-
-
-=== Create the buffer collection
-
-[open,refpage='vkCreateBufferCollectionFUCHSIA',desc='Create a new buffer collection',type='protos']
---
-To create an slink:VkBufferCollectionFUCHSIA for Vulkan to participate in
-the buffer collection:
-
-include::{generated}/api/protos/vkCreateBufferCollectionFUCHSIA.txt[]
-
-  * pname:device is the logical device that creates the
-    sname:VkBufferCollectionFUCHSIA
-  * pname:pCreateInfo is a pointer to a
-    slink:VkBufferCollectionCreateInfoFUCHSIA structure containing
-    parameters affecting creation of the buffer collection
-  * pname:pAllocator is a pointer to a slink:VkAllocationCallbacks structure
-    which controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter
-  * pname:pBufferCollection is a pointer to a
-    slink:VkBufferCollectionFUCHSIA handle in which the resulting buffer
-    collection object is returned
-
-include::{generated}/validity/protos/vkCreateBufferCollectionFUCHSIA.txt[]
-
-.Host Access
-****
-All functions referencing a slink:VkBufferCollectionFUCHSIA must: be
-externally synchronized with the exception of
-fname:vkCreateBufferCollectionFUCHSIA.
-****
---
-
-
-[open,refpage='VkBufferCollectionCreateInfoFUCHSIA',desc='Structure specifying desired parameters to create the buffer collection',type='structs']
---
-The sname:VkBufferCollectionCreateInfoFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkBufferCollectionCreateInfoFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure
-  * pname:collectionToken is a fname:zx_handle_t containing the Sysmem
-    client's buffer collection token
-
-.Valid Usage
-****
-  * [[VUID-VkBufferCollectionCreateInfoFUCHSIA-collectionToken-06393]]
-    pname:collectionToken must: be a valid code:zx_handle_t to a Zircon
-    channel allocated from Sysmem
-    (code:fuchsia.sysmem.Allocator/AllocateSharedCollection) with
-    code:ZX_DEFAULT_CHANNEL_RIGHTS rights
-****
-
-include::{generated}/validity/structs/VkBufferCollectionCreateInfoFUCHSIA.txt[]
---
-
-
-=== Set the constraints
-Buffer collections can be established for slink:VkImage allocations or
-slink:VkBuffer allocations.
-
-
-==== Set image-based buffer collection constraints
-
-[open,refpage='vkSetBufferCollectionImageConstraintsFUCHSIA',desc='Set image-based constraints for a buffer collection',type='protos']
---
-Setting the constraints on the buffer collection initiates the format
-negotiation and allocation of the buffer collection.
-To set the constraints on a slink:VkImage buffer collection, call:
-
-include::{generated}/api/protos/vkSetBufferCollectionImageConstraintsFUCHSIA.txt[]
-
-  * pname:device is the logical device
-  * pname:collection is the slink:VkBufferCollectionFUCHSIA handle
-  * pname:pImageConstraintsInfo is a pointer to a
-    slink:VkImageConstraintsInfoFUCHSIA structure
-
-fname:vkSetBufferCollectionImageConstraintsFUCHSIA may: fail if
-pname:pImageConstraintsInfo::pname:formatConstraintsCount is larger than the
-implementation-defined limit.
-If that occurs, flink:vkSetBufferCollectionImageConstraintsFUCHSIA will
-return VK_ERROR_INITIALIZATION_FAILED.
-
-fname:vkSetBufferCollectionImageConstraintsFUCHSIA may: fail if the
-implementation does not support any of the formats described by the
-pname:pImageConstraintsInfo structure.
-If that occurs, flink:vkSetBufferCollectionImageConstraintsFUCHSIA will
-return ename:VK_ERROR_FORMAT_NOT_SUPPORTED.
-
-.Valid Usage
-****
-  * [[VUID-vkSetBufferCollectionImageConstraintsFUCHSIA-collection-06394]]
-    fname:vkSetBufferCollectionImageConstraintsFUCHSIA or
-    fname:vkSetBufferCollectionBufferConstraintsFUCHSIA must: not have
-    already been called on pname:collection
-****
-
-include::{generated}/validity/protos/vkSetBufferCollectionImageConstraintsFUCHSIA.txt[]
---
-
-[open,refpage='VkImageConstraintsInfoFUCHSIA',desc='Structure of image-based buffer collection constraints',type='structs']
---
-The sname:VkImageConstraintsInfoFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkImageConstraintsInfoFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:formatConstraintsCount is the number of elements in
-    pname:pFormatConstraints.
-  * pname:pFormatConstraints is an array of
-    slink:VkImageFormatConstraintsInfoFUCHSIA structures of size
-    pname:formatConstraintsCount that is used to further constrain buffer
-    collection format selection for image-based buffer collections.
-  * pname:bufferCollectionConstraints is a
-    slink:VkBufferCollectionConstraintsInfoFUCHSIA structure used to supply
-    parameters for the negotiation and allocation for buffer-based buffer
-    collections.
-  * pname:flags is a elink:VkImageConstraintsInfoFlagBitsFUCHSIA value
-    specifying hints about the type of memory Sysmem should allocate for the
-    buffer collection.
-
-.Valid Usage
-****
-  * [[VUID-VkImageConstraintsInfoFUCHSIA-pFormatConstraints-06395]]
-    All elements of pname:pFormatConstraints must: have at least one bit set
-    in its
-    slink:VkImageFormatConstraintsInfoFUCHSIA::pname:requiredFormatFeatures
-  * [[VUID-VkImageConstraintsInfoFUCHSIA-pFormatConstraints-06396]]
-    If pname:pFormatConstraints::pname:imageCreateInfo::pname:usage contains
-    ename:VK_IMAGE_USAGE_SAMPLED_BIT, then
-    pname:pFormatConstraints::pname:requiredFormatFeatures must: contain
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
-  * [[VUID-VkImageConstraintsInfoFUCHSIA-pFormatConstraints-06397]]
-    If pname:pFormatConstraints::pname:imageCreateInfo::pname:usage contains
-    ename:VK_IMAGE_USAGE_STORAGE_BIT, then
-    pname:pFormatConstraints::pname:requiredFormatFeatures must: contain
-    ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
-  * [[VUID-VkImageConstraintsInfoFUCHSIA-pFormatConstraints-06398]]
-    If pname:pFormatConstraints::pname:imageCreateInfo::pname:usage contains
-    ename:VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, then
-    pname:pFormatConstraints::pname:requiredFormatFeatures must: contain
-    ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
-  * [[VUID-VkImageConstraintsInfoFUCHSIA-pFormatConstraints-06399]]
-    If pname:pFormatConstraints::pname:imageCreateInfo::pname:usage contains
-    ename:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, then
-    pname:pFormatConstraints::pname:requiredFormatFeatures must: contain
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-  * [[VUID-VkImageConstraintsInfoFUCHSIA-pFormatConstraints-06400]]
-    If pname:pFormatConstraints::pname:imageCreateInfo::pname:usage contains
-    ename:VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, then
-    pname:pFormatConstraints::pname:requiredFormatFeatures must: contain at
-    least one of ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or
-    ename:VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
-ifdef::VK_KHR_fragment_shading_rate[]
-  * [[VUID-VkImageConstraintsInfoFUCHSIA-attachmentFragmentShadingRate-06401]]
-    If the <<features-attachmentFragmentShadingRate,
-    pname:attachmentFragmentShadingRate feature>> is enabled, and
-    pname:pFormatConstraints::pname:imageCreateInfo::pname:usage contains
-    ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR, then
-    pname:pFormatConstraints::pname:requiredFormatFeatures must: contain
-    ename:VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-endif::VK_KHR_fragment_shading_rate[]
-****
-
-include::{generated}/validity/structs/VkImageConstraintsInfoFUCHSIA.txt[]
---
-
-[open,refpage='VkImageConstraintsInfoFlagsFUCHSIA',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkImageConstraintsInfoFlagsFUCHSIA.txt[]
-
-tname:VkImageConstraintsInfoFlagsFUCHSIA is a bitmask type for setting a
-mask of zero or more elink:VkImageConstraintsInfoFlagBitsFUCHSIA bits.
---
-
-[open,refpage='VkImageConstraintsInfoFlagBitsFUCHSIA',desc='Bitmask specifying image constraints flags',type='enums']
---
-Bits which can: be set in
-elink:VkImageConstraintsInfoFlagBitsFUCHSIA::pname:flags include:
-
-include::{generated}/api/enums/VkImageConstraintsInfoFlagBitsFUCHSIA.txt[]
-
-General hints about the type of memory that should be allocated by Sysmem
-based on the expected usage of the images in the buffer collection include:
-
-  * ename:VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIA
-  * ename:VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIA
-  * ename:VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIA
-  * ename:VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIA
-
-For protected memory:
-
-  * ename:VK_IMAGE_CONSTRAINTS_INFO_PROTECTED_OPTIONAL_FUCHSIA specifies
-    that protected memory is optional for the buffer collection.
-
-Note that if all participants in the buffer collection (Vulkan or otherwise)
-specify that protected memory is optional, Sysmem will not allocate
-protected memory.
---
-
-[open,refpage='VkImageFormatConstraintsInfoFUCHSIA',desc='Structure image-based buffer collection constraints',type='structs']
---
-The sname:VkImageFormatConstraintsInfoFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkImageFormatConstraintsInfoFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure
-  * pname:imageCreateInfo is the slink:VkImageCreateInfo used to create a
-    slink:VkImage that is to use memory from the
-    slink:VkBufferCollectionFUCHSIA
-  * pname:requiredFormatFeatures is a bitmask of
-    ename:VkFormatFeatureFlagBits specifying required features of the
-    buffers in the buffer collection
-  * pname:flags is reserved for future use
-  * pname:sysmemPixelFormat is a code:PixelFormatType value from the
-    `fuchsia.sysmem/image_formats.fidl` FIDL interface
-  * pname:colorSpaceCount the element count of pname:pColorSpaces
-  * pname:pColorSpaces is an array of slink:VkSysmemColorSpaceFUCHSIA
-    structs of size pname:colorSpaceCount
-
-include::{generated}/validity/structs/VkImageFormatConstraintsInfoFUCHSIA.txt[]
---
-
-[open,refpage='VkImageFormatConstraintsFlagsFUCHSIA',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkImageFormatConstraintsFlagsFUCHSIA.txt[]
-
-tname:VkImageFormatConstraintsFlagsFUCHSIA is a bitmask type for setting a
-mask, but is currently reserved for future use.
---
-
-[open,refpage='VkBufferCollectionConstraintsInfoFUCHSIA',desc='Structure of general buffer collection constraints',type='structs']
---
-The sname:VkBufferCollectionConstraintsInfoFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkBufferCollectionConstraintsInfoFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure
-  * pname:minBufferCount is the minimum number of buffers available in the
-    collection
-  * pname:maxBufferCount is the maximum number of buffers allowed in the
-    collection
-  * pname:minBufferCountForCamping is the per-participant minimum buffers
-    for camping
-  * pname:minBufferCountForDedicatedSlack is the per-participant minimum
-    buffers for dedicated slack
-  * pname:minBufferCountForSharedSlack is the per-participant minimum
-    buffers for shared slack
-
-Sysmem uses all buffer count parameters in combination to determine the
-number of buffers it will allocate.
-Sysmem defines buffer count constraints in
-`fuchsia.sysmem/constraints.fidl`.
-
-_Camping_ as referred to by pname:minBufferCountForCamping, is the number of
-buffers that should be available for the participant that are not for
-transient use.
-This number of buffers is required for the participant to logically operate.
-
-_Slack_ as referred to by pname:minBufferCountForDedicatedSlack and
-pname:minBufferCountForSharedSlack, refers to the number of buffers desired
-by participants for optimal performance.
-pname:minBufferCountForDedicatedSlack refers to the current participant.
-pname:minBufferCountForSharedSlack refers to buffer slack for all
-participants in the collection.
-
-include::{generated}/validity/structs/VkBufferCollectionConstraintsInfoFUCHSIA.txt[]
---
-
-[open,refpage='VkSysmemColorSpaceFUCHSIA',desc='Structure describing the buffer collections color space',type='structs']
---
-
-The sname:VkSysmemColorSpaceFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkSysmemColorSpaceFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure
-  * pname:colorSpace value of the Sysmem code:ColorSpaceType
-
-.Valid Usage
-****
-  * [[VUID-VkSysmemColorSpaceFUCHSIA-colorSpace-06402]]
-    pname:colorSpace must: be a code:ColorSpaceType as defined in
-    `fuchsia.sysmem/image_formats.fidl`
-****
-
-include::{generated}/validity/structs/VkSysmemColorSpaceFUCHSIA.txt[]
---
-
-
-==== Set buffer-based buffer collection constraints
-
-[open,refpage='vkSetBufferCollectionBufferConstraintsFUCHSIA',desc='Set buffer-based constraints for a buffer collection',type='protos']
---
-To set the constraints on a slink:VkBuffer buffer collection, call:
-
-include::{generated}/api/protos/vkSetBufferCollectionBufferConstraintsFUCHSIA.txt[]
-
-  * pname:device is the logical device
-  * pname:collection is the slink:VkBufferCollectionFUCHSIA handle
-  * pname:pBufferConstraintsInfo is a pointer to a
-    slink:VkBufferConstraintsInfoFUCHSIA structure
-
-fname:vkSetBufferCollectionBufferConstraintsFUCHSIA may: fail if the
-implementation does not support the constraints specified in the
-pname:bufferCollectionConstraints structure.
-If that occurs, flink:vkSetBufferCollectionBufferConstraintsFUCHSIA will
-return ename:VK_ERROR_FORMAT_NOT_SUPPORTED.
-
-.Valid Usage
-****
-  * [[VUID-vkSetBufferCollectionBufferConstraintsFUCHSIA-collection-06403]]
-    fname:vkSetBufferCollectionImageConstraintsFUCHSIA or
-    fname:vkSetBufferCollectionBufferConstraintsFUCHSIA must: not have
-    already been called on pname:collection
-****
-
-include::{generated}/validity/protos/vkSetBufferCollectionBufferConstraintsFUCHSIA.txt[]
---
-
-[open,refpage='VkBufferConstraintsInfoFUCHSIA',desc='Structure buffer-based buffer collection constraints',type='structs']
---
-The sname:VkBufferConstraintsInfoFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkBufferConstraintsInfoFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure
-  * pname:pBufferCreateInfo a pointer to a slink:VkBufferCreateInfo struct
-    describing the buffer attributes for the buffer collection
-  * pname:requiredFormatFeatures bitmask of ename:VkFormatFeatureFlagBits
-    required features of the buffers in the buffer collection
-  * pname:bufferCollectionConstraints is used to supply parameters for the
-    negotiation and allocation of the buffer collection
-
-.Valid Usage
-****
-  * [[VUID-VkBufferConstraintsInfoFUCHSIA-requiredFormatFeatures-06404]]
-    The pname:requiredFormatFeatures bitmask of
-    ename:VkFormatFeatureFlagBits must: be chosen from among the buffer
-    compatible format features listed in
-    <<buffer-compatible-format-features,buffer compatible format features>>
-****
-
-include::{generated}/validity/structs/VkBufferConstraintsInfoFUCHSIA.txt[]
---
-
-
-=== Retrieve buffer collection properties
-
-[open,refpage='vkGetBufferCollectionPropertiesFUCHSIA',desc='Retrieve properties from a buffer collection',type='protos']
---
-After constraints have been set on the buffer collection by calling
-flink:vkSetBufferCollectionImageConstraintsFUCHSIA or
-flink:vkSetBufferCollectionBufferConstraintsFUCHSIA, call
-fname:vkGetBufferCollectionPropertiesFUCHSIA to retrieve the negotiated and
-finalized properties of the buffer collection.
-
-The call to fname:vkGetBufferCollectionPropertiesFUCHSIA is synchronous.
-It waits for the Sysmem format negotiation and buffer collection allocation
-to complete before returning.
-
-include::{generated}/api/protos/vkGetBufferCollectionPropertiesFUCHSIA.txt[]
-
-  * pname:device is the logical device handle
-  * pname:collection is the slink:VkBufferCollectionFUCHSIA handle
-  * pname:pProperties is a pointer to the retrieved
-    slink:VkBufferCollectionPropertiesFUCHSIA struct
-
-[[sysmem-chosen-create-infos]]
-For image-based buffer collections, upon calling
-fname:vkGetBufferCollectionPropertiesFUCHSIA, Sysmem will choose an element
-of the slink:VkImageConstraintsInfoFUCHSIA::pname:pImageCreateInfos
-established by the preceding call to
-flink:vkSetBufferCollectionImageConstraintsFUCHSIA.
-The index of the element chosen is stored in and can be retrieved from
-slink:VkBufferCollectionPropertiesFUCHSIA::pname:createInfoIndex.
-
-For buffer-based buffer collections, a single slink:VkBufferCreateInfo is
-specified as slink:VkBufferConstraintsInfoFUCHSIA::pname:createInfo.
-slink:VkBufferCollectionPropertiesFUCHSIA::pname:createInfoIndex will
-therefore always be zero.
-
-fname:vkGetBufferCollectionPropertiesFUCHSIA may: fail if Sysmem is unable
-to resolve the constraints of all of the participants in the buffer
-collection.
-If that occurs, fname:vkGetBufferCollectionPropertiesFUCHSIA will return
-ename:VK_ERROR_INITIALIZATION_FAILED.
-
-.Valid Usage
-****
-  * [[VUID-vkGetBufferCollectionPropertiesFUCHSIA-None-06405]]
-    Prior to calling flink:vkGetBufferCollectionPropertiesFUCHSIA, the
-    constraints on the buffer collection must: have been set by either
-    flink:vkSetBufferCollectionImageConstraintsFUCHSIA or
-    flink:vkSetBufferCollectionBufferConstraintsFUCHSIA.
-****
-
-include::{generated}/validity/protos/vkGetBufferCollectionPropertiesFUCHSIA.txt[]
---
-
-[open,refpage='VkBufferCollectionPropertiesFUCHSIA',desc='Structure specifying the negotiated format chosen by Sysmem',type='structs']
---
-
-The sname:VkBufferCollectionPropertiesFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkBufferCollectionPropertiesFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure
-  * pname:memoryTypeBits is a bitmask containing one bit set for every
-    memory type which the buffer collection can be imported as buffer
-    collection
-  * pname:bufferCount is the number of buffers in the collection
-  * pname:createInfoIndex as described in <<sysmem-chosen-create-infos,
-    Sysmem chosen create infos>>
-  * pname:sysmemPixelFormat is the Sysmem code:PixelFormatType as defined in
-    `fuchsia.sysmem/image_formats.fidl`
-  * pname:formatFeatures is a bitmask of elink:VkFormatFeatureFlagBits
-    shared by the buffer collection
-  * pname:sysmemColorSpaceIndex is a slink:VkSysmemColorSpaceFUCHSIA struct
-    specifying the color space
-  * pname:samplerYcbcrConversionComponents is a slink:VkComponentMapping
-    struct specifying the component mapping
-  * pname:suggestedYcbcrModel is a elink:VkSamplerYcbcrModelConversion value
-    specifying the suggested {YCbCr} model
-  * pname:suggestedYcbcrRange is a elink:VkSamplerYcbcrRange value
-    specifying the suggested {YCbCr} range
-  * pname:suggestedXChromaOffset is a elink:VkChromaLocation value
-    specifying the suggested X chroma offset
-  * pname:suggestedYChromaOffset is a elink:VkChromaLocation value
-    specifying the suggested Y chroma offset
-
-pname:sysmemColorSpace is only set for image-based buffer collections where
-the constraints were specified using slink:VkImageConstraintsInfoFUCHSIA in
-a call to flink:vkSetBufferCollectionImageConstraintsFUCHSIA.
-
-For image-based buffer collections, pname:createInfoIndex will identify both
-the slink:VkImageConstraintsInfoFUCHSIA::pname:pImageCreateInfos element and
-the slink:VkImageConstraintsInfoFUCHSIA::pname:pFormatConstraints element
-chosen by Sysmem when flink:vkSetBufferCollectionImageConstraintsFUCHSIA was
-called.
-The value of pname:sysmemColorSpaceIndex will be an index to one of the
-color spaces provided in the
-slink:VkImageFormatConstraintsInfoFUCHSIA::pname:pColorSpaces array.
-
-The implementation must have pname:formatFeatures with all bits set that
-were set in
-slink:VkImageFormatConstraintsInfoFUCHSIA::pname:requiredFormatFeatures, by
-the call to flink:vkSetBufferCollectionImageConstraintsFUCHSIA, at
-pname:createInfoIndex (other bits could be set as well).
-
-include::{generated}/validity/structs/VkBufferCollectionPropertiesFUCHSIA.txt[]
---
-
-
-=== Memory allocation
-
-To import memory from a buffer collection into a slink:VkImage or a
-slink:VkBuffer, chain a slink:VkImportMemoryBufferCollectionFUCHSIA
-structure to the pname:pNext member of the slink:VkMemoryAllocateInfo in the
-call to flink:vkAllocateMemory.
-
-[open,refpage='VkImportMemoryBufferCollectionFUCHSIA',desc='Structure to specify the Sysmem buffer to import',type='structs']
---
-The sname:VkImportMemoryBufferCollectionFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkImportMemoryBufferCollectionFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure
-  * pname:collection is the slink:VkBufferCollectionFUCHSIA handle
-  * pname:index the index of the buffer to import from pname:collection
-
-.Valid Usage
-****
-  * [[VUID-VkImportMemoryBufferCollectionFUCHSIA-index-06406]]
-    pname:index must: be less than the value retrieved as
-    slink:VkBufferCollectionPropertiesFUCHSIA:bufferCount
-****
-
-include::{generated}/validity/structs/VkImportMemoryBufferCollectionFUCHSIA.txt[]
---
-
-[open,refpage='vkDestroyBufferCollectionFUCHSIA',desc='Destroy a buffer collection',type='protos']
---
-To release a slink:VkBufferCollectionFUCHSIA:
-
-include::{generated}/api/protos/vkDestroyBufferCollectionFUCHSIA.txt[]
-
-  * pname:device is the logical device that creates the
-    sname:VkBufferCollectionFUCHSIA
-  * pname:collection is the slink:VkBufferCollectionFUCHSIA handle
-  * pname:pAllocator is a pointer to a slink:VkAllocationCallbacks structure
-    which controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyBufferCollectionFUCHSIA-collection-06407]]
-    slink:VkImage and slink:VkBuffer objects that referenced
-    pname:collection upon creation by inclusion of a
-    slink:VkBufferCollectionImageCreateInfoFUCHSIA or
-    slink:VkBufferCollectionBufferCreateInfoFUCHSIA chained to their
-    slink:VkImageCreateInfo or slink:VkBufferCreateInfo structures
-    respectively, may: outlive pname:collection.
-****
-
-include::{generated}/validity/protos/vkDestroyBufferCollectionFUCHSIA.txt[]
---
-endif::VK_FUCHSIA_buffer_collection[]
diff --git a/registry/vulkan/chapters/samplers.txt b/registry/vulkan/chapters/samplers.txt
deleted file mode 100644
index 726b4a7..0000000
--- a/registry/vulkan/chapters/samplers.txt
+++ /dev/null
@@ -1,1025 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[samplers]]
-= Samplers
-
-[open,refpage='VkSampler',desc='Opaque handle to a sampler object',type='handles']
---
-sname:VkSampler objects represent the state of an image sampler which is
-used by the implementation to read image data and apply filtering and other
-transformations for the shader.
-
-Samplers are represented by sname:VkSampler handles:
-
-include::{generated}/api/handles/VkSampler.txt[]
---
-
-[open,refpage='vkCreateSampler',desc='Create a new sampler object',type='protos']
---
-To create a sampler object, call:
-
-include::{generated}/api/protos/vkCreateSampler.txt[]
-
-  * pname:device is the logical device that creates the sampler.
-  * pname:pCreateInfo is a pointer to a slink:VkSamplerCreateInfo structure
-    specifying the state of the sampler object.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pSampler is a pointer to a slink:VkSampler handle in which the
-    resulting sampler object is returned.
-
-.Valid Usage
-****
-  * [[VUID-vkCreateSampler-maxSamplerAllocationCount-04110]]
-    There must: be less than
-    slink:VkPhysicalDeviceLimits::pname:maxSamplerAllocationCount
-    slink:VkSampler objects currently created on the device
-****
-
-include::{generated}/validity/protos/vkCreateSampler.txt[]
---
-
-[open,refpage='VkSamplerCreateInfo',desc='Structure specifying parameters of a newly created sampler',type='structs']
---
-The sname:VkSamplerCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkSamplerCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkSamplerCreateFlagBits describing
-    additional parameters of the sampler.
-  * pname:magFilter is a elink:VkFilter value specifying the magnification
-    filter to apply to lookups.
-  * pname:minFilter is a elink:VkFilter value specifying the minification
-    filter to apply to lookups.
-  * pname:mipmapMode is a elink:VkSamplerMipmapMode value specifying the
-    mipmap filter to apply to lookups.
-  * pname:addressModeU is a elink:VkSamplerAddressMode value specifying the
-    addressing mode for U coordinates outside [eq]#[0,1)#.
-  * pname:addressModeV is a elink:VkSamplerAddressMode value specifying the
-    addressing mode for V coordinates outside [eq]#[0,1)#.
-  * pname:addressModeW is a elink:VkSamplerAddressMode value specifying the
-    addressing mode for W coordinates outside [eq]#[0,1)#.
-  * [[samplers-mipLodBias]] pname:mipLodBias is the bias to be added to
-    mipmap LOD (level-of-detail) calculation and bias provided by image
-    sampling functions in SPIR-V, as described in the
-    <<textures-level-of-detail-operation, Level-of-Detail Operation>>
-    section.
-  * [[samplers-maxAnisotropy]] pname:anisotropyEnable is ename:VK_TRUE to
-    enable anisotropic filtering, as described in the
-    <<textures-texel-anisotropic-filtering, Texel Anisotropic Filtering>>
-    section, or ename:VK_FALSE otherwise.
-  * pname:maxAnisotropy is the anisotropy value clamp used by the sampler
-    when pname:anisotropyEnable is ename:VK_TRUE.
-    If pname:anisotropyEnable is ename:VK_FALSE, pname:maxAnisotropy is
-    ignored.
-  * pname:compareEnable is ename:VK_TRUE to enable comparison against a
-    reference value during lookups, or ename:VK_FALSE otherwise.
-  ** Note: Some implementations will default to shader state if this member
-     does not match.
-  * pname:compareOp is a elink:VkCompareOp value specifying the comparison
-    function to apply to fetched data before filtering as described in the
-    <<textures-depth-compare-operation, Depth Compare Operation>> section.
-  * pname:minLod is used to clamp the <<textures-level-of-detail-operation,
-    minimum of the computed LOD value>>.
-  * pname:maxLod is used to clamp the <<textures-level-of-detail-operation,
-    maximum of the computed LOD value>>.
-    To avoid clamping the maximum value, set pname:maxLod to the constant
-    ename:VK_LOD_CLAMP_NONE.
-  * pname:borderColor is a elink:VkBorderColor value specifying the
-    predefined border color to use.
-  * [[samplers-unnormalizedCoordinates]] pname:unnormalizedCoordinates
-    controls whether to use unnormalized or normalized texel coordinates to
-    address texels of the image.
-    When set to ename:VK_TRUE, the range of the image coordinates used to
-    lookup the texel is in the range of zero to the image size in each
-    dimension.
-    When set to ename:VK_FALSE the range of image coordinates is zero to
-    one.
-+
-When pname:unnormalizedCoordinates is ename:VK_TRUE, images the sampler is
-used with in the shader have the following requirements:
-+
-  ** The pname:viewType must: be either ename:VK_IMAGE_VIEW_TYPE_1D or
-     ename:VK_IMAGE_VIEW_TYPE_2D.
-  ** The image view must: have a single layer and a single mip level.
-+
-When pname:unnormalizedCoordinates is ename:VK_TRUE, image built-in
-functions in the shader that use the sampler have the following
-requirements:
-+
-  ** The functions must: not use projection.
-  ** The functions must: not use offsets.
-
-[NOTE]
-.Mapping of OpenGL to Vulkan filter modes
-====
-pname:magFilter values of ename:VK_FILTER_NEAREST and ename:VK_FILTER_LINEAR
-directly correspond to code:GL_NEAREST and code:GL_LINEAR magnification
-filters.
-pname:minFilter and pname:mipmapMode combine to correspond to the similarly
-named OpenGL minification filter of code:GL_minFilter_MIPMAP_mipmapMode
-(e.g. pname:minFilter of ename:VK_FILTER_LINEAR and pname:mipmapMode of
-ename:VK_SAMPLER_MIPMAP_MODE_NEAREST correspond to
-code:GL_LINEAR_MIPMAP_NEAREST).
-
-There are no Vulkan filter modes that directly correspond to OpenGL
-minification filters of code:GL_LINEAR or code:GL_NEAREST, but they can: be
-emulated using ename:VK_SAMPLER_MIPMAP_MODE_NEAREST, pname:minLod = 0, and
-pname:maxLod = 0.25, and using pname:minFilter = ename:VK_FILTER_LINEAR or
-pname:minFilter = ename:VK_FILTER_NEAREST, respectively.
-
-Note that using a pname:maxLod of zero would cause
-<<textures-texel-filtering,magnification>> to always be performed, and the
-pname:magFilter to always be used.
-This is valid, just not an exact match for OpenGL behavior.
-Clamping the maximum LOD to 0.25 allows the [eq]#{lambda}# value to be
-non-zero and minification to be performed, while still always rounding down
-to the base level.
-If the pname:minFilter and pname:magFilter are equal, then using a
-pname:maxLod of zero also works.
-====
-
-The maximum number of sampler objects which can: be simultaneously created
-on a device is implementation-dependent and specified by the
-<<limits-maxSamplerAllocationCount,maxSamplerAllocationCount>> member of the
-slink:VkPhysicalDeviceLimits structure.
-
-[NOTE]
-.Note
-====
-For historical reasons, if pname:maxSamplerAllocationCount is exceeded, some
-implementations may return ename:VK_ERROR_TOO_MANY_OBJECTS.
-Exceeding this limit will result in undefined: behavior, and an application
-should not rely on the use of the returned error code in order to identify
-when the limit is reached.
-====
-
-Since slink:VkSampler is a non-dispatchable handle type, implementations
-may: return the same handle for sampler state vectors that are identical.
-In such cases, all such objects would only count once against the
-pname:maxSamplerAllocationCount limit.
-
-.Valid Usage
-****
-  * [[VUID-VkSamplerCreateInfo-mipLodBias-01069]]
-    The absolute value of pname:mipLodBias must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxSamplerLodBias
-ifdef::VK_KHR_portability_subset[]
-  * [[VUID-VkSamplerCreateInfo-samplerMipLodBias-04467]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:samplerMipLodBias
-    is ename:VK_FALSE, pname:mipLodBias must: be zero
-endif::VK_KHR_portability_subset[]
-  * [[VUID-VkSamplerCreateInfo-maxLod-01973]]
-    pname:maxLod must: be greater than or equal to pname:minLod
-  * [[VUID-VkSamplerCreateInfo-anisotropyEnable-01070]]
-    If the <<features-samplerAnisotropy,anisotropic sampling>> feature is
-    not enabled, pname:anisotropyEnable must: be ename:VK_FALSE
-  * [[VUID-VkSamplerCreateInfo-anisotropyEnable-01071]]
-    If pname:anisotropyEnable is ename:VK_TRUE, pname:maxAnisotropy must: be
-    between `1.0` and
-    sname:VkPhysicalDeviceLimits::pname:maxSamplerAnisotropy, inclusive
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkSamplerCreateInfo-minFilter-01645]]
-    If <<samplers-YCbCr-conversion,sampler {YCbCr} conversion>> is enabled
-    and the <<potential-format-features, potential format features>> of the
-    sampler {YCbCr} conversion do not support
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT,
-    pname:minFilter and pname:magFilter must: be equal to the sampler
-    {YCbCr} conversion's pname:chromaFilter
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01072]]
-    If pname:unnormalizedCoordinates is ename:VK_TRUE, pname:minFilter and
-    pname:magFilter must: be equal
-  * [[VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01073]]
-    If pname:unnormalizedCoordinates is ename:VK_TRUE, pname:mipmapMode
-    must: be ename:VK_SAMPLER_MIPMAP_MODE_NEAREST
-  * [[VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01074]]
-    If pname:unnormalizedCoordinates is ename:VK_TRUE, pname:minLod and
-    pname:maxLod must: be zero
-  * [[VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01075]]
-    If pname:unnormalizedCoordinates is ename:VK_TRUE, pname:addressModeU
-    and pname:addressModeV must: each be either
-    ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE or
-    ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER
-  * [[VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01076]]
-    If pname:unnormalizedCoordinates is ename:VK_TRUE,
-    pname:anisotropyEnable must: be ename:VK_FALSE
-  * [[VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01077]]
-    If pname:unnormalizedCoordinates is ename:VK_TRUE, pname:compareEnable
-    must: be ename:VK_FALSE
-  * [[VUID-VkSamplerCreateInfo-addressModeU-01078]]
-    If any of pname:addressModeU, pname:addressModeV or pname:addressModeW
-    are ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, pname:borderColor
-    must: be a valid elink:VkBorderColor value
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkSamplerCreateInfo-addressModeU-01646]]
-    If <<samplers-YCbCr-conversion,sampler {YCbCr} conversion>> is enabled,
-    pname:addressModeU, pname:addressModeV, and pname:addressModeW must: be
-    ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, pname:anisotropyEnable
-    must: be ename:VK_FALSE, and pname:unnormalizedCoordinates must: be
-    ename:VK_FALSE
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-  * [[VUID-VkSamplerCreateInfo-None-01647]]
-    The sampler reduction mode must: be set to
-    ename:VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE if
-    <<samplers-YCbCr-conversion,sampler {YCbCr} conversion>> is enabled
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * [[VUID-VkSamplerCreateInfo-addressModeU-01079]]
-    If <<features-samplerMirrorClampToEdge,samplerMirrorClampToEdge>> is not
-    enabled, and if the `apiext:VK_KHR_sampler_mirror_clamp_to_edge`
-    extension is not enabled, pname:addressModeU, pname:addressModeV and
-    pname:addressModeW must: not be
-    ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE
-  * [[VUID-VkSamplerCreateInfo-compareEnable-01080]]
-    If pname:compareEnable is ename:VK_TRUE, pname:compareOp must: be a
-    valid elink:VkCompareOp value
-ifdef::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-  * [[VUID-VkSamplerCreateInfo-magFilter-01081]]
-    If either pname:magFilter or pname:minFilter is
-    ename:VK_FILTER_CUBIC_EXT, pname:anisotropyEnable must: be
-    ename:VK_FALSE
-endif::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-ifdef::VK_IMG_filter_cubic+VK_EXT_sampler_filter_minmax[]
-ifndef::VK_EXT_filter_cubic[]
-  * [[VUID-VkSamplerCreateInfo-magFilter-01422]]
-    If either pname:magFilter or pname:minFilter is
-    ename:VK_FILTER_CUBIC_EXT, the pname:reductionMode member of
-    slink:VkSamplerReductionModeCreateInfo must: be
-    ename:VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE
-endif::VK_EXT_filter_cubic[]
-endif::VK_IMG_filter_cubic+VK_EXT_sampler_filter_minmax[]
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-  * [[VUID-VkSamplerCreateInfo-compareEnable-01423]]
-    If pname:compareEnable is ename:VK_TRUE, the pname:reductionMode member
-    of slink:VkSamplerReductionModeCreateInfo must: be
-    ename:VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-ifdef::VK_EXT_fragment_density_map[]
-  * [[VUID-VkSamplerCreateInfo-flags-02574]]
-    If pname:flags includes ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then
-    pname:minFilter and pname:magFilter must: be equal
-  * [[VUID-VkSamplerCreateInfo-flags-02575]]
-    If pname:flags includes ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then
-    pname:mipmapMode must: be ename:VK_SAMPLER_MIPMAP_MODE_NEAREST
-  * [[VUID-VkSamplerCreateInfo-flags-02576]]
-    If pname:flags includes ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then
-    pname:minLod and pname:maxLod must: be zero
-  * [[VUID-VkSamplerCreateInfo-flags-02577]]
-    If pname:flags includes ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then
-    pname:addressModeU and pname:addressModeV must: each be either
-    ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE or
-    ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER
-  * [[VUID-VkSamplerCreateInfo-flags-02578]]
-    If pname:flags includes ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then
-    pname:anisotropyEnable must: be ename:VK_FALSE
-  * [[VUID-VkSamplerCreateInfo-flags-02579]]
-    If pname:flags includes ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then
-    pname:compareEnable must: be ename:VK_FALSE
-  * [[VUID-VkSamplerCreateInfo-flags-02580]]
-    If pname:flags includes ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then
-    pname:unnormalizedCoordinates must: be ename:VK_FALSE
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_EXT_custom_border_color[]
-  * [[VUID-VkSamplerCreateInfo-borderColor-04011]]
-    If pname:borderColor is one of ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT or
-    ename:VK_BORDER_COLOR_INT_CUSTOM_EXT, then a
-    slink:VkSamplerCustomBorderColorCreateInfoEXT must: be included in the
-    pname:pNext chain
-  * [[VUID-VkSamplerCreateInfo-customBorderColors-04085]]
-    If the <<features-customBorderColors, pname:customBorderColors>> feature
-    is not enabled, pname:borderColor must: not be
-    ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT or
-    ename:VK_BORDER_COLOR_INT_CUSTOM_EXT
-  * [[VUID-VkSamplerCreateInfo-borderColor-04442]]
-    If pname:borderColor is one of ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT or
-    ename:VK_BORDER_COLOR_INT_CUSTOM_EXT, and
-    slink:VkSamplerCustomBorderColorCreateInfoEXT::pname:format is not
-    ename:VK_FORMAT_UNDEFINED,
-    slink:VkSamplerCustomBorderColorCreateInfoEXT::pname:customBorderColor
-    must: be within the range of values representable in pname:format
-  * [[VUID-VkSamplerCreateInfo-None-04012]]
-    The maximum number of samplers with custom border colors which can: be
-    simultaneously created on a device is implementation-dependent and
-    specified by the
-    <<limits-maxCustomBorderColorSamplers,maxCustomBorderColorSamplers>>
-    member of the slink:VkPhysicalDeviceCustomBorderColorPropertiesEXT
-    structure
-endif::VK_EXT_custom_border_color[]
-****
-
-include::{generated}/validity/structs/VkSamplerCreateInfo.txt[]
---
-
-[open,refpage='VK_LOD_CLAMP_NONE',desc='Maximum level of detail unclamped access sentinel',type='consts']
---
-ename:VK_LOD_CLAMP_NONE is a special constant value used for
-slink:VkSamplerCreateInfo::pname:maxLod to indicate that maximum LOD
-clamping should not be performed.
-
-include::{generated}/api/enums/VK_LOD_CLAMP_NONE.txt[]
---
-
-[open,refpage='VkSamplerCreateFlagBits',desc='Bitmask specifying additional parameters of sampler',type='enums']
---
-Bits which can: be set in slink:VkSamplerCreateInfo::pname:flags, specifying
-additional parameters of a sampler, are:
-
-include::{generated}/api/enums/VkSamplerCreateFlagBits.txt[]
-
-ifdef::VK_EXT_fragment_density_map[]
-  * [[samplers-subsamplesampler]] ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT
-    specifies that the sampler will read from an image created with
-    pname:flags containing ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT.
-  * ename:VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT
-    specifies that the implementation may: use approximations when
-    reconstructing a full color value for texture access from a subsampled
-    image.
-
-[NOTE]
-.Note
-====
-The approximations used when
-ename:VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT is
-specified are implementation defined.
-Some implementations may: interpolate between fragment density levels in a
-subsampled image.
-In that case, this bit may: be used to decide whether the interpolation
-factors are calculated per fragment or at a coarser granularity.
-====
-endif::VK_EXT_fragment_density_map[]
---
-
-[open,refpage='VkSamplerCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkSamplerCreateFlags.txt[]
-
-tname:VkSamplerCreateFlags is a bitmask type for setting a mask of zero or
-more elink:VkSamplerCreateFlagBits.
---
-
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-[open,refpage='VkSamplerReductionModeCreateInfo',desc='Structure specifying sampler reduction mode',type='structs',alias='VkSamplerReductionModeCreateInfoEXT']
---
-The sname:VkSamplerReductionModeCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkSamplerReductionModeCreateInfo.txt[]
-
-ifdef::VK_EXT_sampler_filter_minmax[]
-or the equivalent
-
-include::{generated}/api/structs/VkSamplerReductionModeCreateInfoEXT.txt[]
-endif::VK_EXT_sampler_filter_minmax[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:reductionMode is a elink:VkSamplerReductionMode value controlling
-    how texture filtering combines texel values.
-
-If the pname:pNext chain of slink:VkSamplerCreateInfo includes a
-sname:VkSamplerReductionModeCreateInfo structure, then that structure
-includes a mode that controls how texture filtering combines texel values.
-
-If this structure is not present, pname:reductionMode is considered to be
-ename:VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE.
-
-include::{generated}/validity/structs/VkSamplerReductionModeCreateInfo.txt[]
---
-
-[open,refpage='VkSamplerReductionMode',desc='Specify reduction mode for texture filtering',type='enums',alias='VkSamplerReductionModeEXT']
---
-Reduction modes are specified by elink:VkSamplerReductionMode, which takes
-values:
-
-include::{generated}/api/enums/VkSamplerReductionMode.txt[]
-
-ifdef::VK_EXT_sampler_filter_minmax[]
-or the equivalent
-
-include::{generated}/api/enums/VkSamplerReductionModeEXT.txt[]
-endif::VK_EXT_sampler_filter_minmax[]
-
-  * ename:VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE specifies that texel
-    values are combined by computing a weighted average of values in the
-    footprint, using weights as specified in
-    <<textures-unnormalized-to-integer,the image operations chapter>>.
-  * ename:VK_SAMPLER_REDUCTION_MODE_MIN specifies that texel values are
-    combined by taking the component-wise minimum of values in the footprint
-    with non-zero weights.
-  * ename:VK_SAMPLER_REDUCTION_MODE_MAX specifies that texel values are
-    combined by taking the component-wise maximum of values in the footprint
-    with non-zero weights.
---
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-
-[open,refpage='VkFilter',desc='Specify filters used for texture lookups',type='enums']
---
-Possible values of the slink:VkSamplerCreateInfo::pname:magFilter and
-pname:minFilter parameters, specifying filters used for texture lookups,
-are:
-
-include::{generated}/api/enums/VkFilter.txt[]
-
-  * ename:VK_FILTER_NEAREST specifies nearest filtering.
-  * ename:VK_FILTER_LINEAR specifies linear filtering.
-ifdef::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-  * ename:VK_FILTER_CUBIC_EXT specifies cubic filtering.
-endif::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-
-These filters are described in detail in <<textures-texel-filtering, Texel
-Filtering>>.
---
-
-[open,refpage='VkSamplerMipmapMode',desc='Specify mipmap mode used for texture lookups',type='enums']
---
-Possible values of the slink:VkSamplerCreateInfo::pname:mipmapMode,
-specifying the mipmap mode used for texture lookups, are:
-
-include::{generated}/api/enums/VkSamplerMipmapMode.txt[]
-
-  * ename:VK_SAMPLER_MIPMAP_MODE_NEAREST specifies nearest filtering.
-  * ename:VK_SAMPLER_MIPMAP_MODE_LINEAR specifies linear filtering.
-
-These modes are described in detail in <<textures-texel-filtering, Texel
-Filtering>>.
---
-
-[open,refpage='VkSamplerAddressMode',desc='Specify behavior of sampling with texture coordinates outside an image',type='enums']
---
-Possible values of the slink:VkSamplerCreateInfo::ptext:addressMode*
-parameters, specifying the behavior of sampling with coordinates outside the
-range [eq]#[0,1]# for the respective [eq]#u#, [eq]#v#, or [eq]#w# coordinate
-as defined in the <<textures-wrapping-operation, Wrapping Operation>>
-section, are:
-
-include::{generated}/api/enums/VkSamplerAddressMode.txt[]
-
-  * ename:VK_SAMPLER_ADDRESS_MODE_REPEAT specifies that the repeat wrap mode
-    will be used.
-  * ename:VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT specifies that the
-    mirrored repeat wrap mode will be used.
-  * ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE specifies that the clamp to
-    edge wrap mode will be used.
-  * ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER specifies that the clamp
-    to border wrap mode will be used.
-ifdef::VK_VERSION_1_2,VK_KHR_sampler_mirror_clamp_to_edge[]
-  * ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE specifies that the
-    mirror clamp to edge wrap mode will be used.
-    This is only valid if
-ifdef::VK_VERSION_1_2[<<features-samplerMirrorClampToEdge,samplerMirrorClampToEdge>> is enabled, or if]
-    the `apiext:VK_KHR_sampler_mirror_clamp_to_edge` extension is enabled.
-endif::VK_VERSION_1_2,VK_KHR_sampler_mirror_clamp_to_edge[]
---
-
-[open,refpage='VkBorderColor',desc='Specify border color used for texture lookups',type='enums']
---
-Possible values of slink:VkSamplerCreateInfo::pname:borderColor, specifying
-the border color used for texture lookups, are:
-
-include::{generated}/api/enums/VkBorderColor.txt[]
-
-  * ename:VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK specifies a transparent,
-    floating-point format, black color.
-  * ename:VK_BORDER_COLOR_INT_TRANSPARENT_BLACK specifies a transparent,
-    integer format, black color.
-  * ename:VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK specifies an opaque,
-    floating-point format, black color.
-  * ename:VK_BORDER_COLOR_INT_OPAQUE_BLACK specifies an opaque, integer
-    format, black color.
-  * ename:VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE specifies an opaque,
-    floating-point format, white color.
-  * ename:VK_BORDER_COLOR_INT_OPAQUE_WHITE specifies an opaque, integer
-    format, white color.
-ifdef::VK_EXT_custom_border_color[]
-  * ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT indicates that a
-    slink:VkSamplerCustomBorderColorCreateInfoEXT structure is included in
-    the slink:VkSamplerCreateInfo::pname:pNext chain which contains the
-    color data in floating-point format.
-  * ename:VK_BORDER_COLOR_INT_CUSTOM_EXT indicates that a
-    slink:VkSamplerCustomBorderColorCreateInfoEXT structure is included in
-    the slink:VkSamplerCreateInfo::pname:pNext chain which contains the
-    color data in integer format.
-endif::VK_EXT_custom_border_color[]
-
-These colors are described in detail in <<textures-texel-replacement, Texel
-Replacement>>.
---
-
-[open,refpage='vkDestroySampler',desc='Destroy a sampler object',type='protos']
---
-To destroy a sampler, call:
-
-include::{generated}/api/protos/vkDestroySampler.txt[]
-
-  * pname:device is the logical device that destroys the sampler.
-  * pname:sampler is the sampler to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroySampler-sampler-01082]]
-    All submitted commands that refer to pname:sampler must: have completed
-    execution
-  * [[VUID-vkDestroySampler-sampler-01083]]
-    If sname:VkAllocationCallbacks were provided when pname:sampler was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroySampler-sampler-01084]]
-    If no sname:VkAllocationCallbacks were provided when pname:sampler was
-    created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroySampler.txt[]
---
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-[[samplers-YCbCr-conversion]]
-== Sampler {YCbCr} conversion
-
-[open,refpage='VkSamplerYcbcrConversionInfo',desc='Structure specifying {YCbCr} conversion to a sampler or image view',type='structs']
---
-To create a sampler with {YCbCr} conversion enabled, add a
-slink:VkSamplerYcbcrConversionInfo structure to the pname:pNext chain of the
-slink:VkSamplerCreateInfo structure.
-To create a sampler {YCbCr} conversion, the
-<<features-samplerYcbcrConversion,pname:samplerYcbcrConversion feature>>
-must: be enabled.
-Conversion must: be fixed at pipeline creation time, through use of a
-combined image sampler with an immutable sampler in
-sname:VkDescriptorSetLayoutBinding.
-
-A slink:VkSamplerYcbcrConversionInfo must: be provided for samplers to be
-used with image views that access ename:VK_IMAGE_ASPECT_COLOR_BIT if the
-format is one of the <<formats-requiring-sampler-ycbcr-conversion, formats
-that require a sampler Y'C~B~C~R~ conversion>>
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-, or if the image view has an
-<<memory-external-android-hardware-buffer-external-formats,external format>>
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-.
-
-The sname:VkSamplerYcbcrConversionInfo structure is defined as:
-
-include::{generated}/api/structs/VkSamplerYcbcrConversionInfo.txt[]
-
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-or the equivalent
-
-include::{generated}/api/structs/VkSamplerYcbcrConversionInfoKHR.txt[]
-endif::VK_KHR_sampler_ycbcr_conversion[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:conversion is a slink:VkSamplerYcbcrConversion handle created with
-    flink:vkCreateSamplerYcbcrConversion.
-
-include::{generated}/validity/structs/VkSamplerYcbcrConversionInfo.txt[]
---
-
-[open,refpage='VkSamplerYcbcrConversion',desc='Opaque handle to a device-specific sampler {YCbCr} conversion description',type='handles']
---
-A sampler {YCbCr} conversion is an opaque representation of a
-device-specific sampler {YCbCr} conversion description, represented as a
-sname:VkSamplerYcbcrConversion handle:
-
-include::{generated}/api/handles/VkSamplerYcbcrConversion.txt[]
-
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-or the equivalent
-
-include::{generated}/api/handles/VkSamplerYcbcrConversionKHR.txt[]
-endif::VK_KHR_sampler_ycbcr_conversion[]
---
-
-[open,refpage='vkCreateSamplerYcbcrConversion',desc='Create a new {YCbCr} conversion',type='protos']
---
-To create a slink:VkSamplerYcbcrConversion, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkCreateSamplerYcbcrConversion.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_sampler_ycbcr_conversion[or the equivalent command]
-
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-include::{generated}/api/protos/vkCreateSamplerYcbcrConversionKHR.txt[]
-endif::VK_KHR_sampler_ycbcr_conversion[]
-
-  * pname:device is the logical device that creates the sampler {YCbCr}
-    conversion.
-  * pname:pCreateInfo is a pointer to a
-    slink:VkSamplerYcbcrConversionCreateInfo structure specifying the
-    requested sampler {YCbCr} conversion.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pYcbcrConversion is a pointer to a slink:VkSamplerYcbcrConversion
-    handle in which the resulting sampler {YCbCr} conversion is returned.
-
-The interpretation of the configured sampler {YCbCr} conversion is described
-in more detail in <<textures-sampler-YCbCr-conversion,the description of
-sampler {YCbCr} conversion>> in the <<textures,Image Operations>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkCreateSamplerYcbcrConversion-None-01648]]
-    The <<features-samplerYcbcrConversion, sampler {YCbCr} conversion
-    feature>> must: be enabled
-****
-
-include::{generated}/validity/protos/vkCreateSamplerYcbcrConversion.txt[]
---
-
-[open,refpage='VkSamplerYcbcrConversionCreateInfo',desc='Structure specifying the parameters of the newly created conversion',type='structs']
---
-The sname:VkSamplerYcbcrConversionCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkSamplerYcbcrConversionCreateInfo.txt[]
-
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-or the equivalent
-
-include::{generated}/api/structs/VkSamplerYcbcrConversionCreateInfoKHR.txt[]
-endif::VK_KHR_sampler_ycbcr_conversion[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:format is the format of the image from which color information
-    will be retrieved.
-  * pname:ycbcrModel describes the color matrix for conversion between color
-    models.
-  * pname:ycbcrRange describes whether the encoded values have headroom and
-    foot room, or whether the encoding uses the full numerical range.
-  * pname:components applies a _swizzle_ based on elink:VkComponentSwizzle
-    enums prior to range expansion and color model conversion.
-  * pname:xChromaOffset describes the
-    <<textures-chroma-reconstruction,sample location>> associated with
-    downsampled chroma components in the x dimension.
-    pname:xChromaOffset has no effect for formats in which chroma components
-    are not downsampled horizontally.
-  * pname:yChromaOffset describes the
-    <<textures-chroma-reconstruction,sample location>> associated with
-    downsampled chroma components in the y dimension.
-    pname:yChromaOffset has no effect for formats in which the chroma
-    components are not downsampled vertically.
-  * pname:chromaFilter is the filter for chroma reconstruction.
-  * pname:forceExplicitReconstruction can: be used to ensure that
-    reconstruction is done explicitly, if supported.
-
-[NOTE]
-.Note
-====
-Setting pname:forceExplicitReconstruction to ename:VK_TRUE may: have a
-performance penalty on implementations where explicit reconstruction is not
-the default mode of operation.
-
-If pname:format supports
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT
-the pname:forceExplicitReconstruction value behaves as if it was set to
-ename:VK_TRUE.
-====
-
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-If the pname:pNext chain includes a slink:VkExternalFormatANDROID structure
-with non-zero pname:externalFormat member, the sampler {YCbCr} conversion
-object represents an _external format conversion_, and pname:format must: be
-ename:VK_FORMAT_UNDEFINED.
-Such conversions must: only be used to sample image views with a matching
-<<memory-external-android-hardware-buffer-external-formats,external
-format>>.
-When creating an external format conversion, the value of pname:components
-is ignored.
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifndef::VK_ANDROID_external_memory_android_hardware_buffer[]
-Sampler {YCbCr} conversion objects do not support _external format
-conversion_ without additional extensions defining _external formats_.
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-
-.Valid Usage
-****
-ifndef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-format-04060]]
-    pname:format must: represent unsigned normalized values (i.e. the format
-    must be a etext:UNORM format)
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-ifdef::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-format-01904]]
-    If an external format conversion is being created, pname:format must: be
-    ename:VK_FORMAT_UNDEFINED
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-format-04061]]
-    If an external format conversion is not being created, pname:format
-    must: represent unsigned normalized values (i.e. the format must be a
-    etext:UNORM format)
-endif::VK_ANDROID_external_memory_android_hardware_buffer[]
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-format-01650]]
-    The <<potential-format-features, potential format features>> of the
-    sampler {YCbCr} conversion must: support
-    ename:VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT or
-    ename:VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651]]
-    If the <<potential-format-features, potential format features>> of the
-    sampler {YCbCr} conversion do not support
-    ename:VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT, pname:xChromaOffset
-    and pname:yChromaOffset must: not be
-    ename:VK_CHROMA_LOCATION_COSITED_EVEN if the corresponding components
-    are <<textures-chroma-reconstruction, downsampled>>
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652]]
-    If the <<potential-format-features, potential format features>> of the
-    sampler {YCbCr} conversion do not support
-    ename:VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT, pname:xChromaOffset
-    and pname:yChromaOffset must: not be ename:VK_CHROMA_LOCATION_MIDPOINT
-    if the corresponding components are <<textures-chroma-reconstruction,
-    downsampled>>
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-components-02581]]
-    If the format has a etext:_422 or etext:_420 suffix, then
-    pname:components.g must: be the
-    <<resources-image-views-identity-mappings,identity swizzle>>
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-components-02582]]
-    If the format has a etext:_422 or etext:_420 suffix, then
-    pname:components.a must: be the
-    <<resources-image-views-identity-mappings,identity swizzle>>,
-    ename:VK_COMPONENT_SWIZZLE_ONE, or ename:VK_COMPONENT_SWIZZLE_ZERO
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-components-02583]]
-    If the format has a etext:_422 or etext:_420 suffix, then
-    pname:components.r must: be the
-    <<resources-image-views-identity-mappings,identity swizzle>> or
-    ename:VK_COMPONENT_SWIZZLE_B
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-components-02584]]
-    If the format has a etext:_422 or etext:_420 suffix, then
-    pname:components.b must: be the
-    <<resources-image-views-identity-mappings,identity swizzle>> or
-    ename:VK_COMPONENT_SWIZZLE_R
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-components-02585]]
-    If the format has a etext:_422 or etext:_420 suffix, and if either
-    pname:components.r or pname:components.b is the
-    <<resources-image-views-identity-mappings,identity swizzle>>, both
-    values must: be the identity swizzle
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-01655]]
-    If pname:ycbcrModel is not
-    ename:VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY, then
-    pname:components.r, pname:components.g, and pname:components.b must:
-    correspond to components of the pname:format; that is,
-    pname:components.r, pname:components.g, and pname:components.b must: not
-    be ename:VK_COMPONENT_SWIZZLE_ZERO or ename:VK_COMPONENT_SWIZZLE_ONE,
-    and must: not correspond to a component which contains zero or one as a
-    consequence of <<textures-conversion-to-rgba,conversion to RGBA>>
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-02748]]
-    If pname:ycbcrRange is ename:VK_SAMPLER_YCBCR_RANGE_ITU_NARROW then the
-    R, G and B components obtained by applying the pname:component swizzle
-    to pname:format must: each have a bit-depth greater than or equal to 8
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-forceExplicitReconstruction-01656]]
-    If the <<potential-format-features, potential format features>> of the
-    sampler {YCbCr} conversion do not support
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT
-    pname:forceExplicitReconstruction must: be ename:VK_FALSE
-  * [[VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-01657]]
-    If the <<potential-format-features, potential format features>> of the
-    sampler {YCbCr} conversion do not support
-    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT,
-    pname:chromaFilter must: not be ename:VK_FILTER_LINEAR
-****
-
-include::{generated}/validity/structs/VkSamplerYcbcrConversionCreateInfo.txt[]
-
-If pname:chromaFilter is ename:VK_FILTER_NEAREST, chroma samples are
-reconstructed to luma component resolution using nearest-neighbour sampling.
-Otherwise, chroma samples are reconstructed using interpolation.
-More details can be found in <<textures-sampler-YCbCr-conversion,the
-description of sampler {YCbCr} conversion>> in the <<textures,Image
-Operations>> chapter.
---
-
-[open,refpage='VkSamplerYcbcrModelConversion',desc='Color model component of a color space',type='enums']
---
-elink:VkSamplerYcbcrModelConversion defines the conversion from the source
-color model to the shader color model.
-Possible values are:
-
-include::{generated}/api/enums/VkSamplerYcbcrModelConversion.txt[]
-
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-or the equivalent
-
-include::{generated}/api/enums/VkSamplerYcbcrModelConversionKHR.txt[]
-endif::VK_KHR_sampler_ycbcr_conversion[]
-
-  * ename:VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY specifies that the
-    input values to the conversion are unmodified.
-  * ename:VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY specifies no
-    model conversion but the inputs are range expanded as for {YCbCr}.
-  * ename:VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709 specifies the color
-    model conversion from {YCbCr} to {RGBprime} defined in BT.709 and
-    described in the "`BT.709 Y’C~B~C~R~ conversion`" section of the
-    <<data-format,Khronos Data Format Specification>>.
-  * ename:VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601 specifies the color
-    model conversion from {YCbCr} to {RGBprime} defined in BT.601 and
-    described in the "`BT.601 Y’C~B~C~R~ conversion`" section of the
-    <<data-format,Khronos Data Format Specification>>.
-  * ename:VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020 specifies the color
-    model conversion from {YCbCr} to {RGBprime} defined in BT.2020 and
-    described in the "`BT.2020 Y’C~B~C~R~ conversion`" section of the
-    <<data-format,Khronos Data Format Specification>>.
-
-In the etext:VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_* color models, for the
-input to the sampler {YCbCr} range expansion and model conversion:
-
-  * the Y (Y{prime} luma) component corresponds to the G component of an RGB
-    image.
-  * the CB (C~B~ or "`U`" blue color difference) component corresponds to
-    the B component of an RGB image.
-  * the CR (C~R~ or "`V`" red color difference) component corresponds to the
-    R component of an RGB image.
-  * the alpha component, if present, is not modified by color model
-    conversion.
-
-These rules reflect the mapping of components after the component swizzle
-operation (controlled by
-slink:VkSamplerYcbcrConversionCreateInfo::pname:components).
-
-[NOTE]
-.Note
-====
-For example, an "`YUVA`" 32-bit format comprising four 8-bit components can
-be implemented as ename:VK_FORMAT_R8G8B8A8_UNORM with a component mapping:
-
-  * pname:components.a = ename:VK_COMPONENT_SWIZZLE_IDENTITY
-  * pname:components.r = ename:VK_COMPONENT_SWIZZLE_B
-  * pname:components.g = ename:VK_COMPONENT_SWIZZLE_R
-  * pname:components.b = ename:VK_COMPONENT_SWIZZLE_G
-====
---
-
-[open,refpage='VkSamplerYcbcrRange',desc='Range of encoded values in a color space',type='enums']
---
-The elink:VkSamplerYcbcrRange enum describes whether color components are
-encoded using the full range of numerical values or whether values are
-reserved for headroom and foot room.
-elink:VkSamplerYcbcrRange is defined as:
-
-include::{generated}/api/enums/VkSamplerYcbcrRange.txt[]
-
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-or the equivalent
-
-include::{generated}/api/enums/VkSamplerYcbcrRangeKHR.txt[]
-endif::VK_KHR_sampler_ycbcr_conversion[]
-
-  * ename:VK_SAMPLER_YCBCR_RANGE_ITU_FULL specifies that the full range of
-    the encoded values are valid and interpreted according to the ITU "`full
-    range`" quantization rules.
-  * ename:VK_SAMPLER_YCBCR_RANGE_ITU_NARROW specifies that headroom and foot
-    room are reserved in the numerical range of encoded values, and the
-    remaining values are expanded according to the ITU "`narrow range`"
-    quantization rules.
-
-The formulae for these conversions is described in the
-<<textures-sampler-YCbCr-conversion-rangeexpand,Sampler {YCbCr} Range
-Expansion>> section of the <<textures,Image Operations>> chapter.
-
-No range modification takes place if pname:ycbcrModel is
-ename:VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY; the pname:ycbcrRange
-field of slink:VkSamplerYcbcrConversionCreateInfo is ignored in this case.
---
-
-[open,refpage='VkChromaLocation',desc='Position of downsampled chroma samples',type='enums']
---
-The elink:VkChromaLocation enum defines the location of downsampled chroma
-component samples relative to the luma samples, and is defined as:
-
-include::{generated}/api/enums/VkChromaLocation.txt[]
-
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-or the equivalent
-
-include::{generated}/api/enums/VkChromaLocationKHR.txt[]
-endif::VK_KHR_sampler_ycbcr_conversion[]
-
-  * ename:VK_CHROMA_LOCATION_COSITED_EVEN specifies that downsampled chroma
-    samples are aligned with luma samples with even coordinates.
-  * ename:VK_CHROMA_LOCATION_MIDPOINT specifies that downsampled chroma
-    samples are located half way between each even luma sample and the
-    nearest higher odd luma sample.
---
-
-[open,refpage='vkDestroySamplerYcbcrConversion',desc='Destroy a created {YCbCr} conversion',type='protos']
---
-To destroy a sampler {YCbCr} conversion, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkDestroySamplerYcbcrConversion.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_sampler_ycbcr_conversion[or the equivalent command]
-
-ifdef::VK_KHR_sampler_ycbcr_conversion[]
-include::{generated}/api/protos/vkDestroySamplerYcbcrConversionKHR.txt[]
-endif::VK_KHR_sampler_ycbcr_conversion[]
-
-  * pname:device is the logical device that destroys the {YCbCr} conversion.
-  * pname:ycbcrConversion is the conversion to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-include::{generated}/validity/protos/vkDestroySamplerYcbcrConversion.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-ifdef::VK_EXT_custom_border_color[]
-[open,refpage='VkSamplerCustomBorderColorCreateInfoEXT',desc='Structure specifying custom border color',type='structs']
---
-In addition to the predefined border color values, applications can: provide
-a custom border color value by including the
-sname:VkSamplerCustomBorderColorCreateInfoEXT structure in the
-slink:VkSamplerCreateInfo::pname:pNext chain.
-
-The sname:VkSamplerCustomBorderColorCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkSamplerCustomBorderColorCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:customBorderColor is a slink:VkClearColorValue representing the
-    desired custom sampler border color.
-  * pname:format is a elink:VkFormat representing the format of the sampled
-    image view(s).
-    This field may be ename:VK_FORMAT_UNDEFINED if the
-    <<features-customBorderColorWithoutFormat,customBorderColorWithoutFormat>>
-    feature is enabled.
-
-.Valid Usage
-****
-  * [[VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04013]]
-    If provided pname:format is not ename:VK_FORMAT_UNDEFINED then the
-    slink:VkSamplerCreateInfo::pname:borderColor type must: match the
-    sampled type of the provided pname:format, as shown in the _SPIR-V
-    Sampled Type_ column of the <<formats-numericformat>> table
-  * [[VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04014]]
-    If the
-    <<features-customBorderColorWithoutFormat,customBorderColorWithoutFormat>>
-    feature is not enabled then pname:format must: not be
-    ename:VK_FORMAT_UNDEFINED
-  * [[VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04015]]
-    If the sampler is used to sample an image view of
-    ename:VK_FORMAT_B4G4R4A4_UNORM_PACK16,
-    ename:VK_FORMAT_B5G6R5_UNORM_PACK16, or
-    ename:VK_FORMAT_B5G5R5A1_UNORM_PACK16 format then pname:format must: not
-    be ename:VK_FORMAT_UNDEFINED
-****
-
-include::{generated}/validity/structs/VkSamplerCustomBorderColorCreateInfoEXT.txt[]
---
-endif::VK_EXT_custom_border_color[]
-
-ifdef::VK_EXT_border_color_swizzle[]
-[open,refpage='VkSamplerBorderColorComponentMappingCreateInfoEXT',desc='Structure specifying the component mapping of the border color',type='structs']
---
-
-If the sampler is created with ename:VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK,
-ename:VK_BORDER_COLOR_INT_OPAQUE_BLACK,
-ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT, or
-ename:VK_BORDER_COLOR_INT_CUSTOM_EXT pname:borderColor, and that sampler
-will be combined with an image view that does not have an
-<<resources-image-views-identity-mappings,identity swizzle>>, and
-slink:VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::pname:borderColorSwizzleFromImage
-is not enabled, then it is necessary to specify the component mapping of the
-border color, by including the
-sname:VkSamplerBorderColorComponentMappingCreateInfoEXT structure in the
-slink:VkSamplerCreateInfo::pname:pNext chain, to get defined results.
-
-The sname:VkSamplerBorderColorComponentMappingCreateInfoEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkSamplerBorderColorComponentMappingCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:components is a slink:VkComponentMapping structure specifying a
-    remapping of the border color components.
-  * pname:srgb indicates that the sampler will be combined with an image
-    view that has an image format which is sRGB encoded.
-
-The slink:VkComponentMapping pname:components member describes a remapping
-from components of the border color to components of the vector returned by
-shader image instructions when the border color is used.
-
-.Valid Usage
-****
-  * [[VUID-VkSamplerBorderColorComponentMappingCreateInfoEXT-borderColorSwizzle-06437]]
-    The <<features-borderColorSwizzle, pname:borderColorSwizzle>> feature
-    must: be enabled.
-****
-
-include::{generated}/validity/structs/VkSamplerBorderColorComponentMappingCreateInfoEXT.txt[]
---
-endif::VK_EXT_border_color_swizzle[]
diff --git a/registry/vulkan/chapters/shaders.txt b/registry/vulkan/chapters/shaders.txt
deleted file mode 100644
index 7e923e8..0000000
--- a/registry/vulkan/chapters/shaders.txt
+++ /dev/null
@@ -1,1909 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[shaders]]
-= Shaders
-
-A shader specifies programmable operations that execute for each vertex,
-control point, tessellated vertex, primitive, fragment, or workgroup in the
-corresponding stage(s) of the graphics and compute pipelines.
-
-Graphics pipelines include vertex shader execution as a result of
-<<drawing,primitive assembly>>, followed, if enabled, by tessellation
-control and evaluation shaders operating on <<drawing-patch-lists,patches>>,
-geometry shaders, if enabled, operating on primitives, and fragment shaders,
-if present, operating on fragments generated by <<primsrast,Rasterization>>.
-In this specification, vertex, tessellation control, tessellation evaluation
-and geometry shaders are collectively referred to as
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>>s and occur in the logical pipeline before rasterization.
-The fragment shader occurs logically after rasterization.
-
-Only the compute shader stage is included in a compute pipeline.
-Compute shaders operate on compute invocations in a workgroup.
-
-Shaders can: read from input variables, and read from and write to output
-variables.
-Input and output variables can: be used to transfer data between shader
-stages, or to allow the shader to interact with values that exist in the
-execution environment.
-Similarly, the execution environment provides constants that describe
-capabilities.
-
-Shader variables are associated with execution environment-provided inputs
-and outputs using _built-in_ decorations in the shader.
-The available decorations for each stage are documented in the following
-subsections.
-
-
-[[shader-modules]]
-== Shader Modules
-
-[open,refpage='VkShaderModule',desc='Opaque handle to a shader module object',type='handles']
---
-_Shader modules_ contain _shader code_ and one or more entry points.
-Shaders are selected from a shader module by specifying an entry point as
-part of <<pipelines,pipeline>> creation.
-The stages of a pipeline can: use shaders that come from different modules.
-The shader code defining a shader module must: be in the SPIR-V format, as
-described by the <<spirvenv,Vulkan Environment for SPIR-V>> appendix.
-
-Shader modules are represented by sname:VkShaderModule handles:
-
-include::{generated}/api/handles/VkShaderModule.txt[]
---
-
-[open,refpage='vkCreateShaderModule',desc='Creates a new shader module object',type='protos']
---
-To create a shader module, call:
-
-include::{generated}/api/protos/vkCreateShaderModule.txt[]
-
-  * pname:device is the logical device that creates the shader module.
-  * pname:pCreateInfo is a pointer to a slink:VkShaderModuleCreateInfo
-    structure.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pShaderModule is a pointer to a slink:VkShaderModule handle in
-    which the resulting shader module object is returned.
-
-Once a shader module has been created, any entry points it contains can: be
-used in pipeline shader stages as described in <<pipelines-compute,Compute
-Pipelines>> and <<pipelines-graphics,Graphics Pipelines>>.
-
-include::{generated}/validity/protos/vkCreateShaderModule.txt[]
---
-
-[open,refpage='VkShaderModuleCreateInfo',desc='Structure specifying parameters of a newly created shader module',type='structs']
---
-The sname:VkShaderModuleCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkShaderModuleCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:codeSize is the size, in bytes, of the code pointed to by
-    pname:pCode.
-  * pname:pCode is a pointer to code that is used to create the shader
-    module.
-    The type and format of the code is determined from the content of the
-    memory addressed by pname:pCode.
-
-.Valid Usage
-****
-  * [[VUID-VkShaderModuleCreateInfo-codeSize-01085]]
-    pname:codeSize must: be greater than 0
-ifndef::VK_NV_glsl_shader[]
-  * [[VUID-VkShaderModuleCreateInfo-codeSize-01086]]
-    pname:codeSize must: be a multiple of 4
-  * [[VUID-VkShaderModuleCreateInfo-pCode-01087]]
-    pname:pCode must: point to valid SPIR-V code, formatted and packed as
-    described by the <<spirv-spec,Khronos SPIR-V Specification>>
-  * [[VUID-VkShaderModuleCreateInfo-pCode-01088]]
-    pname:pCode must: adhere to the validation rules described by the
-    <<spirvenv-module-validation, Validation Rules within a Module>> section
-    of the <<spirvenv-capabilities,SPIR-V Environment>> appendix
-endif::VK_NV_glsl_shader[]
-ifdef::VK_NV_glsl_shader[]
-  * [[VUID-VkShaderModuleCreateInfo-pCode-01376]]
-    If pname:pCode is a pointer to SPIR-V code, pname:codeSize must: be a
-    multiple of 4
-  * [[VUID-VkShaderModuleCreateInfo-pCode-01377]]
-    pname:pCode must: point to either valid SPIR-V code, formatted and
-    packed as described by the <<spirv-spec,Khronos SPIR-V Specification>>
-    or valid GLSL code which must: be written to the `GL_KHR_vulkan_glsl`
-    extension specification
-  * [[VUID-VkShaderModuleCreateInfo-pCode-01378]]
-    If pname:pCode is a pointer to SPIR-V code, that code must: adhere to
-    the validation rules described by the <<spirvenv-module-validation,
-    Validation Rules within a Module>> section of the
-    <<spirvenv-capabilities,SPIR-V Environment>> appendix
-  * [[VUID-VkShaderModuleCreateInfo-pCode-01379]]
-    If pname:pCode is a pointer to GLSL code, it must: be valid GLSL code
-    written to the `GL_KHR_vulkan_glsl` GLSL extension specification
-endif::VK_NV_glsl_shader[]
-  * [[VUID-VkShaderModuleCreateInfo-pCode-01089]]
-    pname:pCode must: declare the code:Shader capability for SPIR-V code
-  * [[VUID-VkShaderModuleCreateInfo-pCode-01090]]
-    pname:pCode must: not declare any capability that is not supported by
-    the API, as described by the <<spirvenv-module-validation,
-    Capabilities>> section of the <<spirvenv-capabilities,SPIR-V
-    Environment>> appendix
-  * [[VUID-VkShaderModuleCreateInfo-pCode-01091]]
-    If pname:pCode declares any of the capabilities listed in the
-    <<spirvenv-capabilities-table,SPIR-V Environment>> appendix, one of the
-    corresponding requirements must: be satisfied
-  * [[VUID-VkShaderModuleCreateInfo-pCode-04146]]
-    pname:pCode must: not declare any SPIR-V extension that is not supported
-    by the API, as described by the <<spirvenv-extensions, Extension>>
-    section of the <<spirvenv-capabilities,SPIR-V Environment>> appendix
-  * [[VUID-VkShaderModuleCreateInfo-pCode-04147]]
-    If pname:pCode declares any of the SPIR-V extensions listed in the
-    <<spirvenv-extensions-table,SPIR-V Environment>> appendix, one of the
-    corresponding requirements must: be satisfied
-****
-
-include::{generated}/validity/structs/VkShaderModuleCreateInfo.txt[]
---
-
-[open,refpage='VkShaderModuleCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkShaderModuleCreateFlags.txt[]
-
-tname:VkShaderModuleCreateFlags is a bitmask type for setting a mask, but is
-currently reserved for future use.
---
-
-ifdef::VK_EXT_validation_cache[]
-include::VK_EXT_validation_cache/shader-module-validation-cache.txt[]
-endif::VK_EXT_validation_cache[]
-
-
-[open,refpage='vkDestroyShaderModule',desc='Destroy a shader module',type='protos']
---
-To destroy a shader module, call:
-
-include::{generated}/api/protos/vkDestroyShaderModule.txt[]
-
-  * pname:device is the logical device that destroys the shader module.
-  * pname:shaderModule is the handle of the shader module to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-A shader module can: be destroyed while pipelines created using its shaders
-are still in use.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyShaderModule-shaderModule-01092]]
-    If sname:VkAllocationCallbacks were provided when pname:shaderModule was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyShaderModule-shaderModule-01093]]
-    If no sname:VkAllocationCallbacks were provided when pname:shaderModule
-    was created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyShaderModule.txt[]
---
-
-
-[[shaders-execution]]
-== Shader Execution
-
-At each stage of the pipeline, multiple invocations of a shader may: execute
-simultaneously.
-Further, invocations of a single shader produced as the result of different
-commands may: execute simultaneously.
-The relative execution order of invocations of the same shader type is
-undefined:.
-Shader invocations may: complete in a different order than that in which the
-primitives they originated from were drawn or dispatched by the application.
-However, fragment shader outputs are written to attachments in
-<<primsrast-order,rasterization order>>.
-
-The relative execution order of invocations of different shader types is
-largely undefined:.
-However, when invoking a shader whose inputs are generated from a previous
-pipeline stage, the shader invocations from the previous stage are
-guaranteed to have executed far enough to generate input values for all
-required inputs.
-
-
-[[shaders-execution-memory-ordering]]
-== Shader Memory Access Ordering
-
-The order in which image or buffer memory is read or written by shaders is
-largely undefined:.
-For some shader types (vertex, tessellation evaluation, and in some cases,
-fragment), even the number of shader invocations that may: perform loads and
-stores is undefined:.
-
-In particular, the following rules apply:
-
-  * <<shaders-vertex-execution,Vertex>> and
-    <<shaders-tessellation-evaluation-execution,tessellation evaluation>>
-    shaders will be invoked at least once for each unique vertex, as defined
-    in those sections.
-  * <<fragops-shader,Fragment>> shaders will be invoked zero or more times,
-    as defined in that section.
-  * The relative execution order of invocations of the same shader type is
-    undefined:.
-    A store issued by a shader when working on primitive B might complete
-    prior to a store for primitive A, even if primitive A is specified prior
-    to primitive B. This applies even to fragment shaders; while fragment
-    shader outputs are always written to the framebuffer in
-    <<primsrast-order, rasterization order>>, stores executed by fragment
-    shader invocations are not.
-  * The relative execution order of invocations of different shader types is
-    largely undefined:.
-
-[NOTE]
-.Note
-====
-The above limitations on shader invocation order make some forms of
-synchronization between shader invocations within a single set of primitives
-unimplementable.
-For example, having one invocation poll memory written by another invocation
-assumes that the other invocation has been launched and will complete its
-writes in finite time.
-====
-
-ifdef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-
-The <<memory-model,Memory Model>> appendix defines the terminology and rules
-for how to correctly communicate between shader invocations, such as when a
-write is <<memory-model-visible-to,Visible-To>> a read, and what constitutes
-a <<memory-model-access-data-race,Data Race>>.
-
-Applications must: not cause a data race.
-
-endif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-
-ifndef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-
-Stores issued to different memory locations within a single shader
-invocation may: not be visible to other invocations, or may: not become
-visible in the order they were performed.
-
-The code:OpMemoryBarrier instruction can: be used to provide stronger
-ordering of reads and writes performed by a single invocation.
-code:OpMemoryBarrier guarantees that any memory transactions issued by the
-shader invocation prior to the instruction complete prior to the memory
-transactions issued after the instruction.
-Memory barriers are needed for algorithms that require multiple invocations
-to access the same memory and require the operations to be performed in a
-partially-defined relative order.
-For example, if one shader invocation does a series of writes, followed by
-an code:OpMemoryBarrier instruction, followed by another write, then the
-results of the series of writes before the barrier become visible to other
-shader invocations at a time earlier or equal to when the results of the
-final write become visible to those invocations.
-In practice it means that another invocation that sees the results of the
-final write would also see the previous writes.
-Without the memory barrier, the final write may: be visible before the
-previous writes.
-
-Writes that are the result of shader stores through a variable decorated
-with code:Coherent automatically have available writes to the same buffer,
-buffer view, or image view made visible to them, and are themselves
-automatically made available to access by the same buffer, buffer view, or
-image view.
-Reads that are the result of shader loads through a variable decorated with
-code:Coherent automatically have available writes to the same buffer, buffer
-view, or image view made visible to them.
-The order that coherent writes to different locations become available is
-undefined:, unless enforced by a memory barrier instruction or other memory
-dependency.
-
-[NOTE]
-.Note
-====
-Explicit memory dependencies must: still be used to guarantee availability
-and visibility for access via other buffers, buffer views, or image views.
-====
-
-The built-in atomic memory transaction instructions can: be used to read and
-write a given memory address atomically.
-While built-in atomic functions issued by multiple shader invocations are
-executed in undefined: order relative to each other, these functions perform
-both a read and a write of a memory address and guarantee that no other
-memory transaction will write to the underlying memory between the read and
-write.
-Atomic operations ensure automatic availability and visibility for writes
-and reads in the same way as those to code:Coherent variables.
-
-[NOTE]
-.Note
-====
-Memory accesses performed on different resource descriptors with the same
-memory backing may: not be well-defined even with the code:Coherent
-decoration or via atomics, due to things such as image layouts or ownership
-of the resource - as described in the <<synchronization, Synchronization and
-Cache Control>> chapter.
-====
-
-[NOTE]
-.Note
-====
-Atomics allow shaders to use shared global addresses for mutual exclusion or
-as counters, among other uses.
-====
-
-endif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-
-The SPIR-V *SubgroupMemory*, *CrossWorkgroupMemory*, and
-*AtomicCounterMemory* memory semantics are ignored.
-Sequentially consistent atomics and barriers are not supported and
-*SequentiallyConsistent* is treated as *AcquireRelease*.
-*SequentiallyConsistent* should: not be used.
-
-
-[[shaders-inputs]]
-== Shader Inputs and Outputs
-
-Data is passed into and out of shaders using variables with input or output
-storage class, respectively.
-User-defined inputs and outputs are connected between stages by matching
-their code:Location decorations.
-Additionally, data can: be provided by or communicated to special functions
-provided by the execution environment using code:BuiltIn decorations.
-
-In many cases, the same code:BuiltIn decoration can: be used in multiple
-shader stages with similar meaning.
-The specific behavior of variables decorated as code:BuiltIn is documented
-in the following sections.
-
-
-ifdef::VK_NV_mesh_shader[]
-[[shaders-task]]
-== Task Shaders
-
-Task shaders operate in conjunction with the mesh shaders to produce a
-collection of primitives that will be processed by subsequent stages of the
-graphics pipeline.
-Its primary purpose is to create a variable amount of subsequent mesh shader
-invocations.
-
-Task shaders are invoked via the execution of the
-<<drawing-mesh-shading,programmable mesh shading>> pipeline.
-
-The task shader has no fixed-function inputs other than variables
-identifying the specific workgroup and invocation.
-The only fixed output of the task shader is a task count, identifying the
-number of mesh shader workgroups to create.
-The task shader can write additional outputs to task memory, which can be
-read by all of the mesh shader workgroups it created.
-
-
-=== Task Shader Execution
-
-Task workloads are formed from groups of work items called workgroups and
-processed by the task shader in the current graphics pipeline.
-A workgroup is a collection of shader invocations that execute the same
-shader, potentially in parallel.
-Task shaders execute in _global workgroups_ which are divided into a number
-of _local workgroups_ with a size that can: be set by assigning a value to
-the code:LocalSize
-ifdef::VK_KHR_maintenance4[or code:LocalSizeId]
-execution mode or via an object decorated by the code:WorkgroupSize
-decoration.
-An invocation within a local workgroup can: share data with other members of
-the local workgroup through shared variables and issue memory and control
-flow barriers to synchronize with other members of the local workgroup.
-
-
-[[shaders-mesh]]
-== Mesh Shaders
-
-Mesh shaders operate in workgroups to produce a collection of primitives
-that will be processed by subsequent stages of the graphics pipeline.
-Each workgroup emits zero or more output primitives and the group of
-vertices and their associated data required for each output primitive.
-
-Mesh shaders are invoked via the execution of the
-<<drawing-mesh-shading,programmable mesh shading>> pipeline.
-
-The only inputs available to the mesh shader are variables identifying the
-specific workgroup and invocation and, if applicable, any outputs written to
-task memory by the task shader that spawned the mesh shader's workgroup.
-The mesh shader can operate without a task shader as well.
-
-The invocations of the mesh shader workgroup write an output mesh,
-comprising a set of primitives with per-primitive attributes, a set of
-vertices with per-vertex attributes, and an array of indices identifying the
-mesh vertices that belong to each primitive.
-The primitives of this mesh are then processed by subsequent graphics
-pipeline stages, where the outputs of the mesh shader form an interface with
-the fragment shader.
-
-
-=== Mesh Shader Execution
-
-Mesh workloads are formed from groups of work items called workgroups and
-processed by the mesh shader in the current graphics pipeline.
-A workgroup is a collection of shader invocations that execute the same
-shader, potentially in parallel.
-Mesh shaders execute in _global workgroups_ which are divided into a number
-of _local workgroups_ with a size that can: be set by assigning a value to
-the code:LocalSize
-ifdef::VK_KHR_maintenance4[or code:LocalSizeId]
-execution mode or via an object decorated by the code:WorkgroupSize
-decoration.
-An invocation within a local workgroup can: share data with other members of
-the local workgroup through shared variables and issue memory and control
-flow barriers to synchronize with other members of the local workgroup.
-
-The _global workgroups_ may be generated explcitly via the API, or
-implicitly through the task shader's work creation mechanism.
-endif::VK_NV_mesh_shader[]
-
-
-[[shaders-vertex]]
-== Vertex Shaders
-
-Each vertex shader invocation operates on one vertex and its associated
-<<fxvertex-attrib,vertex attribute>> data, and outputs one vertex and
-associated data.
-ifndef::VK_NV_mesh_shader[]
-Graphics pipelines must: include a vertex shader, and the vertex shader
-stage is always the first shader stage in the graphics pipeline.
-endif::VK_NV_mesh_shader[]
-ifdef::VK_NV_mesh_shader[]
-Graphics pipelines using primitive shading must: include a vertex shader,
-and the vertex shader stage is always the first shader stage in the graphics
-pipeline.
-endif::VK_NV_mesh_shader[]
-
-
-[[shaders-vertex-execution]]
-=== Vertex Shader Execution
-
-A vertex shader must: be executed at least once for each vertex specified by
-a drawing command.
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-If the subpass includes multiple views in its view mask, the shader may: be
-invoked separately for each view.
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-During execution, the shader is presented with the index of the vertex and
-instance for which it has been invoked.
-Input variables declared in the vertex shader are filled by the
-implementation with the values of vertex attributes associated with the
-invocation being executed.
-
-If the same vertex is specified multiple times in a drawing command (e.g. by
-including the same index value multiple times in an index buffer) the
-implementation may: reuse the results of vertex shading if it can statically
-determine that the vertex shader invocations will produce identical results.
-
-[NOTE]
-.Note
-====
-It is implementation-dependent when and if results of vertex shading are
-reused, and thus how many times the vertex shader will be executed.
-This is true also if the vertex shader contains stores or atomic operations
-(see <<features-vertexPipelineStoresAndAtomics,
-pname:vertexPipelineStoresAndAtomics>>).
-====
-
-
-[[shaders-tessellation-control]]
-== Tessellation Control Shaders
-
-The tessellation control shader is used to read an input patch provided by
-the application and to produce an output patch.
-Each tessellation control shader invocation operates on an input patch
-(after all control points in the patch are processed by a vertex shader) and
-its associated data, and outputs a single control point of the output patch
-and its associated data, and can: also output additional per-patch data.
-The input patch is sized according to the pname:patchControlPoints member of
-slink:VkPipelineTessellationStateCreateInfo, as part of input assembly.
-
-ifdef::VK_EXT_extended_dynamic_state2[]
-The input patch can also be dynamically sized with pname:patchControlPoints
-parameter of flink:vkCmdSetPatchControlPointsEXT.
-
-[open,refpage='vkCmdSetPatchControlPointsEXT',desc='Specify the number of control points per patch dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the number of control points
-per patch, call:
-
-include::{generated}/api/protos/vkCmdSetPatchControlPointsEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:patchControlPoints specifies the number of control points per
-    patch.
-
-This command sets the number of control points per patch for subsequent
-drawing commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-slink:VkPipelineTessellationStateCreateInfo::pname:patchControlPoints value
-used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetPatchControlPointsEXT-None-04873]]
-    The <<features-extendedDynamicState2PatchControlPoints,
-    extendedDynamicState2PatchControlPoints>> feature must: be enabled
-  * [[VUID-vkCmdSetPatchControlPointsEXT-patchControlPoints-04874]]
-    pname:patchControlPoints must: be greater than zero and less than or
-    equal to sname:VkPhysicalDeviceLimits::pname:maxTessellationPatchSize
-****
-
-include::{generated}/validity/protos/vkCmdSetPatchControlPointsEXT.txt[]
---
-endif::VK_EXT_extended_dynamic_state2[]
-
-The size of the output patch is controlled by the code:OpExecutionMode
-code:OutputVertices specified in the tessellation control or tessellation
-evaluation shaders, which must: be specified in at least one of the shaders.
-The size of the input and output patches must: each be greater than zero and
-less than or equal to
-sname:VkPhysicalDeviceLimits::pname:maxTessellationPatchSize.
-
-
-[[shaders-tessellation-control-execution]]
-=== Tessellation Control Shader Execution
-
-A tessellation control shader is invoked at least once for each _output_
-vertex in a patch.
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-If the subpass includes multiple views in its view mask, the shader may: be
-invoked separately for each view.
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-Inputs to the tessellation control shader are generated by the vertex
-shader.
-Each invocation of the tessellation control shader can: read the attributes
-of any incoming vertices and their associated data.
-The invocations corresponding to a given patch execute logically in
-parallel, with undefined: relative execution order.
-However, the code:OpControlBarrier instruction can: be used to provide
-limited control of the execution order by synchronizing invocations within a
-patch, effectively dividing tessellation control shader execution into a set
-of phases.
-Tessellation control shaders will read undefined: values if one invocation
-reads a per-vertex or per-patch output written by another invocation at any
-point during the same phase, or if two invocations attempt to write
-different values to the same per-patch output in a single phase.
-
-
-[[shaders-tessellation-evaluation]]
-== Tessellation Evaluation Shaders
-
-The Tessellation Evaluation Shader operates on an input patch of control
-points and their associated data, and a single input barycentric coordinate
-indicating the invocation's relative position within the subdivided patch,
-and outputs a single vertex and its associated data.
-
-
-[[shaders-tessellation-evaluation-execution]]
-=== Tessellation Evaluation Shader Execution
-
-A tessellation evaluation shader is invoked at least once for each unique
-vertex generated by the tessellator.
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-If the subpass includes multiple views in its view mask, the shader may: be
-invoked separately for each view.
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-
-[[shaders-geometry]]
-== Geometry Shaders
-
-The geometry shader operates on a group of vertices and their associated
-data assembled from a single input primitive, and emits zero or more output
-primitives and the group of vertices and their associated data required for
-each output primitive.
-
-
-[[shaders-geometry-execution]]
-=== Geometry Shader Execution
-
-A geometry shader is invoked at least once for each primitive produced by
-the tessellation stages, or at least once for each primitive generated by
-<<drawing,primitive assembly>> when tessellation is not in use.
-A shader can request that the geometry shader runs multiple
-<<geometry-invocations, instances>>.
-A geometry shader is invoked at least once for each instance.
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-If the subpass includes multiple views in its view mask, the shader may: be
-invoked separately for each view.
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-
-[[shaders-fragment]]
-== Fragment Shaders
-
-Fragment shaders are invoked as a <<fragops-shader, fragment operation>> in
-a graphics pipeline.
-Each fragment shader invocation operates on a single fragment and its
-associated data.
-With few exceptions, fragment shaders do not have access to any data
-associated with other fragments and are considered to execute in isolation
-of fragment shader invocations associated with other fragments.
-
-
-[[shaders-compute]]
-== Compute Shaders
-
-Compute shaders are invoked via flink:vkCmdDispatch and
-flink:vkCmdDispatchIndirect commands.
-In general, they have access to similar resources as shader stages executing
-as part of a graphics pipeline.
-
-Compute workloads are formed from groups of work items called workgroups and
-processed by the compute shader in the current compute pipeline.
-A workgroup is a collection of shader invocations that execute the same
-shader, potentially in parallel.
-Compute shaders execute in _global workgroups_ which are divided into a
-number of _local workgroups_ with a size that can: be set by assigning a
-value to the code:LocalSize
-ifdef::VK_KHR_maintenance4[or code:LocalSizeId]
-execution mode or via an object decorated by the code:WorkgroupSize
-decoration.
-An invocation within a local workgroup can: share data with other members of
-the local workgroup through shared variables and issue memory and control
-flow barriers to synchronize with other members of the local workgroup.
-
-
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-[[shaders-raytracing-shaders]]
-[[shaders-ray-generation]]
-== Ray Generation Shaders
-
-A ray generation shader is similar to a compute shader.
-Its main purpose is to execute ray tracing queries using code:OpTraceRayKHR
-instructions and process the results.
-
-
-[[shaders-ray-generation-execution]]
-=== Ray Generation Shader Execution
-
-One ray generation shader is executed per ray tracing dispatch.
-Its location in the shader binding table (see <<shader-binding-table,Shader
-Binding Table>> for details) is passed directly into fname:vkCmdTraceRaysKHR
-using the pname:raygenShaderBindingTableBuffer and
-pname:raygenShaderBindingOffset parameters.
-
-
-[[shaders-intersection]]
-== Intersection Shaders
-
-Intersection shaders enable the implementation of arbitrary, application
-defined geometric primitives.
-An intersection shader for a primitive is executed whenever its axis-aligned
-bounding box is hit by a ray.
-
-Like other ray tracing shader domains, an intersection shader operates on a
-single ray at a time.
-It also operates on a single primitive at a time.
-It is therefore the purpose of an intersection shader to compute the
-ray-primitive intersections and report them.
-To report an intersection, the shader calls the code:OpReportIntersectionKHR
-instruction.
-
-An intersection shader communicates with any-hit and closest shaders by
-generating attribute values that they can: read.
-Intersection shaders cannot: read or modify the ray payload.
-
-
-[[shaders-intersection-execution]]
-=== Intersection Shader Execution
-The order in which intersections are found along a ray, and therefore the
-order in which intersection shaders are executed, is unspecified.
-
-The intersection shader of the closest AABB which intersects the ray is
-guaranteed to be executed at some point during traversal, unless the ray is
-forcibly terminated.
-
-
-[[shaders-any-hit]]
-== Any-Hit Shaders
-
-The any-hit shader is executed after the intersection shader reports an
-intersection that lies within the current [eq]#[t~min~,t~max~]# of the ray.
-The main use of any-hit shaders is to programmatically decide whether or not
-an intersection will be accepted.
-The intersection will be accepted unless the shader calls the
-code:OpIgnoreIntersectionKHR instruction.
-Any-hit shaders have read-only access to the attributes generated by the
-corresponding intersection shader, and can: read or modify the ray payload.
-
-
-[[shaders-any-hit-execution]]
-=== Any-Hit Shader Execution
-
-The order in which intersections are found along a ray, and therefore the
-order in which any-hit shaders are executed, is unspecified.
-
-The any-hit shader of the closest hit is guaranteed to be executed at some
-point during traversal, unless the ray is forcibly terminated.
-
-
-[[shaders-closest-hit]]
-== Closest Hit Shaders
-
-Closest hit shaders have read-only access to the attributes generated by the
-corresponding intersection shader, and can: read or modify the ray payload.
-They also have access to a number of system-generated values.
-Closest hit shaders can: call code:OpTraceRayKHR to recursively trace rays.
-
-
-[[shaders-closest-hit-execution]]
-=== Closest Hit Shader Execution
-
-Exactly one closest hit shader is executed when traversal is finished and an
-intersection has been found and accepted.
-
-
-[[shaders-miss]]
-== Miss Shaders
-
-Miss shaders can: access the ray payload and can: trace new rays through the
-code:OpTraceRayKHR instruction, but cannot: access attributes since they are
-not associated with an intersection.
-
-
-[[shaders-miss-execution]]
-=== Miss Shader Execution
-
-A miss shader is executed instead of a closest hit shader if no intersection
-was found during traversal.
-
-
-[[shaders-callable]]
-== Callable Shaders
-
-Callable shaders can: access a callable payload that works similarly to ray
-payloads to do subroutine work.
-
-
-[[shaders-callable-execution]]
-=== Callable Shader Execution
-
-A callable shader is executed by calling code:OpExecuteCallableKHR from an
-allowed shader stage.
-
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-
-
-[[shaders-interpolation-decorations]]
-== Interpolation Decorations
-
-Interpolation decorations control the behavior of attribute interpolation in
-the fragment shader stage.
-Interpolation decorations can: be applied to code:Input storage class
-variables in the fragment shader stage's interface, and control the
-interpolation behavior of those variables.
-
-Inputs that could be interpolated can: be decorated by at most one of the
-following decorations:
-
-  * code:Flat: no interpolation
-  * code:NoPerspective: linear interpolation (for
-    <<line_linear_interpolation,lines>> and
-    <<triangle_linear_interpolation,polygons>>)
-ifdef::VK_NV_fragment_shader_barycentric[]
-  * code:PerVertexNV: values fetched from shader-specified primitive vertex
-endif::VK_NV_fragment_shader_barycentric[]
-
-Fragment input variables decorated with neither code:Flat nor
-code:NoPerspective use perspective-correct interpolation (for
-<<line_perspective_interpolation,lines>> and
-<<triangle_perspective_interpolation,polygons>>).
-
-The presence of and type of interpolation is controlled by the above
-interpolation decorations as well as the auxiliary decorations code:Centroid
-and code:Sample.
-
-A variable decorated with code:Flat will not be interpolated.
-Instead, it will have the same value for every fragment within a triangle.
-This value will come from a single <<vertexpostproc-flatshading,provoking
-vertex>>.
-A variable decorated with code:Flat can: also be decorated with
-code:Centroid or code:Sample, which will mean the same thing as decorating
-it only as code:Flat.
-
-For fragment shader input variables decorated with neither code:Centroid nor
-code:Sample, the assigned variable may: be interpolated anywhere within the
-fragment and a single value may: be assigned to each sample within the
-fragment.
-
-If a fragment shader input is decorated with code:Centroid, a single value
-may: be assigned to that variable for all samples in the fragment, but that
-value must: be interpolated to a location that lies in both the fragment and
-in the primitive being rendered, including any of the fragment's samples
-covered by the primitive.
-Because the location at which the variable is interpolated may: be different
-in neighboring fragments, and derivatives may: be computed by computing
-differences between neighboring fragments, derivatives of centroid-sampled
-inputs may: be less accurate than those for non-centroid interpolated
-variables.
-ifdef::VK_EXT_post_depth_coverage[]
-The code:PostDepthCoverage execution mode does not affect the determination
-of the centroid location.
-endif::VK_EXT_post_depth_coverage[]
-
-If a fragment shader input is decorated with code:Sample, a separate value
-must: be assigned to that variable for each covered sample in the fragment,
-and that value must: be sampled at the location of the individual sample.
-When pname:rasterizationSamples is ename:VK_SAMPLE_COUNT_1_BIT, the fragment
-center must: be used for code:Centroid, code:Sample, and undecorated
-attribute interpolation.
-
-Fragment shader inputs that are signed or unsigned integers, integer
-vectors, or any double-precision floating-point type must: be decorated with
-code:Flat.
-
-ifdef::VK_AMD_shader_explicit_vertex_parameter[]
-When the `apiext:VK_AMD_shader_explicit_vertex_parameter` device extension
-is enabled inputs can: be also decorated with the code:CustomInterpAMD
-interpolation decoration, including fragment shader inputs that are signed
-or unsigned integers, integer vectors, or any double-precision
-floating-point type.
-Inputs decorated with code:CustomInterpAMD can: only be accessed by the
-extended instruction code:InterpolateAtVertexAMD and allows accessing the
-value of the input for individual vertices of the primitive.
-endif::VK_AMD_shader_explicit_vertex_parameter[]
-
-ifdef::VK_NV_fragment_shader_barycentric[]
-[[shaders-interpolation-decorations-pervertexnv]]
-When the pname:fragmentShaderBarycentric feature is enabled, inputs can: be
-also decorated with the code:PerVertexNV interpolation decoration, including
-fragment shader inputs that are signed or unsigned integers, integer
-vectors, or any double-precision floating-point type.
-Inputs decorated with code:PerVertexNV can: only be accessed using an extra
-array dimension, where the extra index identifies one of the vertices of the
-primitive that produced the fragment.
-endif::VK_NV_fragment_shader_barycentric[]
-
-
-[[shaders-staticuse]]
-== Static Use
-
-A SPIR-V module declares a global object in memory using the code:OpVariable
-instruction, which results in a pointer code:x to that object.
-A specific entry point in a SPIR-V module is said to _statically use_ that
-object if that entry point's call tree contains a function containing a
-memory instruction or image instruction with code:x as an code:id operand.
-See the "`Memory Instructions`" and "`Image Instructions`" subsections of
-section 3 "`Binary Form`" of the SPIR-V specification for the complete list
-of SPIR-V memory instructions.
-
-Static use is not used to control the behavior of variables with code:Input
-and code:Output storage.
-The effects of those variables are applied based only on whether they are
-present in a shader entry point's interface.
-
-
-[[shaders-scope]]
-== Scope
-
-A _scope_ describes a set of shader invocations, where each such set is a
-_scope instance_.
-Each invocation belongs to one or more scope instances, but belongs to no
-more than one scope instance for each scope.
-
-The operations available between invocations in a given scope instance vary,
-with smaller scopes generally able to perform more operations, and with
-greater efficiency.
-
-
-[[shaders-scope-cross-device]]
-=== Cross Device
-
-All invocations executed in a Vulkan instance fall into a single _cross
-device scope instance_.
-
-Whilst the code:CrossDevice scope is defined in SPIR-V, it is disallowed in
-Vulkan.
-API <<synchronization, synchronization>> commands can: be used to
-communicate between devices.
-
-
-[[shaders-scope-device]]
-=== Device
-
-All invocations executed on a single device form a _device scope instance_.
-
-ifdef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-If the <<features-vulkanMemoryModel,pname:vulkanMemoryModel>> and
-<<features-vulkanMemoryModelDeviceScope,
-pname:vulkanMemoryModelDeviceScope>> features are enabled, this scope is
-represented in SPIR-V by the code:Device code:Scope, which can: be used as a
-code:Memory code:Scope for barrier and atomic operations.
-
-ifdef::VK_KHR_shader_clock[]
-If both the <<features-shaderDeviceClock, pname:shaderDeviceClock>> and
-<<features-vulkanMemoryModelDeviceScope,
-pname:vulkanMemoryModelDeviceScope>> features are enabled, using the
-code:Device code:Scope with the code:OpReadClockKHR instruction will read
-from a clock that is consistent across invocations in the same device scope
-instance.
-endif::VK_KHR_shader_clock[]
-endif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-
-There is no method to synchronize the execution of these invocations within
-SPIR-V, and this can: only be done with API synchronization primitives.
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-Invocations executing on different devices in a device group operate in
-separate device scope instances.
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-ifndef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-The scope only extends to the queue family, not the whole device.
-endif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-
-
-[[shaders-scope-queue-family]]
-=== Queue Family
-
-Invocations executed by queues in a given queue family form a _queue family
-scope instance_.
-
-This scope is identified in SPIR-V as the
-ifdef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-code:QueueFamily code:Scope if the
-<<features-vulkanMemoryModel,pname:vulkanMemoryModel>> feature is enabled,
-or if not, the
-endif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-code:Device code:Scope, which can: be used as a code:Memory code:Scope for
-barrier and atomic operations.
-
-ifdef::VK_KHR_shader_clock[]
-If the <<features-shaderDeviceClock, pname:shaderDeviceClock>> feature is
-enabled,
-ifdef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-but the <<features-vulkanMemoryModelDeviceScope,
-pname:vulkanMemoryModelDeviceScope>> feature is not enabled,
-endif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-using the code:Device code:Scope with the code:OpReadClockKHR instruction
-will read from a clock that is consistent across invocations in the same
-queue family scope instance.
-endif::VK_KHR_shader_clock[]
-
-There is no method to synchronize the execution of these invocations within
-SPIR-V, and this can: only be done with API synchronization primitives.
-
-Each invocation in a queue family scope instance must: be in the same
-<<shaders-scope-device, device scope instance>>.
-
-
-[[shaders-scope-command]]
-=== Command
-
-Any shader invocations executed as the result of a single command such as
-flink:vkCmdDispatch or flink:vkCmdDraw form a _command scope instance_.
-For indirect drawing commands with pname:drawCount greater than one,
-invocations from separate draws are in separate command scope instances.
-ifdef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-For ray tracing shaders, an invocation group is an implementation-dependent
-subset of the set of shader invocations of a given shader stage which are
-produced by a single trace rays command.
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-
-There is no specific code:Scope for communication across invocations in a
-command scope instance.
-As this has a clear boundary at the API level, coordination here can: be
-performed in the API, rather than in SPIR-V.
-
-Each invocation in a command scope instance must: be in the same
-<<shaders-scope-queue-family, queue-family scope instance>>.
-
-For shaders without defined <<shaders-scope-workgroup, workgroups>>, this
-set of invocations forms an _invocation group_ as defined in the
-<<spirv-spec,SPIR-V specification>>.
-
-
-[[shaders-scope-primitive]]
-=== Primitive
-
-Any fragment shader invocations executed as the result of rasterization of a
-single primitive form a _primitive scope instance_.
-
-There is no specific code:Scope for communication across invocations in a
-primitive scope instance.
-
-Any generated <<shaders-helper-invocations, helper invocations>> are
-included in this scope instance.
-
-Each invocation in a primitive scope instance must: be in the same
-<<shaders-scope-command, command scope instance>>.
-
-Any input variables decorated with code:Flat are uniform within a primitive
-scope instance.
-
-
-// intentionally no VK_NV_ray_tracing here since this scope does not exist there
-ifdef::VK_KHR_ray_tracing_pipeline[]
-[[shaders-scope-shadercall]]
-=== Shader Call
-
-Any <<shader-call-related,shader-call-related>> invocations that are
-executed in one or more ray tracing execution models form a _shader call
-scope instance_.
-
-The code:ShaderCallKHR code:Scope can be used as code:Memory code:Scope for
-barrier and atomic operations.
-
-Each invocation in a shader call scope instance must: be in the same
-<<shaders-scope-queue-family, queue family scope instance>>.
-endif::VK_KHR_ray_tracing_pipeline[]
-
-
-[[shaders-scope-workgroup]]
-=== Workgroup
-
-A _local workgroup_ is a set of invocations that can synchronize and share
-data with each other using memory in the code:Workgroup storage class.
-
-The code:Workgroup code:Scope can be used as both an code:Execution
-code:Scope and code:Memory code:Scope for barrier and atomic operations.
-
-Each invocation in a local workgroup must: be in the same
-<<shaders-scope-command, command scope instance>>.
-
-Only
-ifdef::VK_NV_mesh_shader[]
-task, mesh, and
-endif::VK_NV_mesh_shader[]
-compute shaders have defined workgroups - other shader types cannot: use
-workgroup functionality.
-For shaders that have defined workgroups, this set of invocations forms an
-_invocation group_ as defined in the <<spirv-spec,SPIR-V specification>>.
-
-
-ifdef::VK_VERSION_1_1[]
-[[shaders-scope-subgroup]]
-=== Subgroup
-
-A _subgroup_ (see the subsection "`Control Flow`" of section 2 of the SPIR-V
-1.3 Revision 1 specification) is a set of invocations that can synchronize
-and share data with each other efficiently.
-
-The code:Subgroup code:Scope can be used as both an code:Execution
-code:Scope and code:Memory code:Scope for barrier and atomic operations.
-Other <<VkSubgroupFeatureFlagBits, subgroup features>> allow the use of
-<<shaders-group-operations, group operations>> with subgroup scope.
-
-ifdef::VK_KHR_shader_clock[]
-If the <<features-shaderSubgroupClock, pname:shaderSubgroupClock>> feature
-is enabled, using the code:Subgroup code:Scope with the code:OpReadClockKHR
-instruction will read from a clock that is consistent across invocations in
-the same subgroup.
-endif::VK_KHR_shader_clock[]
-
-For <<shaders-scope-workgroup, shaders that have defined workgroups>>, each
-invocation in a subgroup must: be in the same <<shaders-scope-workgroup,
-local workgroup>>.
-
-In other shader stages, each invocation in a subgroup must: be in the same
-<<shaders-scope-device, device scope instance>>.
-
-Only <<limits-subgroup-supportedStages, shader stages that support subgroup
-operations>> have defined subgroups.
-endif::VK_VERSION_1_1[]
-
-
-[[shaders-scope-quad]]
-=== Quad
-
-A _quad scope instance_ is formed of four shader invocations.
-
-In a fragment shader, each invocation in a quad scope instance is formed of
-invocations in neighboring framebuffer locations [eq]#(x~i~, y~i~)#, where:
-
-  * [eq]#i# is the index of the invocation within the scope instance.
-  * [eq]#w# and [eq]#h# are the number of pixels the fragment covers in the
-    [eq]#x# and [eq]#y# axes.
-  * [eq]#w# and [eq]#h# are identical for all participating invocations.
-  * [eq]#(x~0~) = (x~1~ - w) = (x~2~) = (x~3~ - w)#
-  * [eq]#(y~0~) = (y~1~) = (y~2~ - h) = (y~3~ - h)#
-  * Each invocation has the same layer and sample indices.
-
-ifdef::VK_NV_compute_shader_derivatives[]
-In a compute shader, if the code:DerivativeGroupQuadsNV execution mode is
-specified, each invocation in a quad scope instance is formed of invocations
-with adjacent local invocation IDs [eq]#(x~i~, y~i~)#, where:
-
-  * [eq]#i# is the index of the invocation within the quad scope instance.
-  * [eq]#(x~0~) = (x~1~ - 1) = (x~2~) = (x~3~ - 1)#
-  * [eq]#(y~0~) = (y~1~) = (y~2~ - 1) = (y~3~ - 1)#
-  * [eq]#x~0~# and [eq]#y~0~# are integer multiples of 2.
-  * Each invocation has the same [eq]#z# coordinate.
-
-In a compute shader, if the code:DerivativeGroupLinearNV execution mode is
-specified, each invocation in a quad scope instance is formed of invocations
-with adjacent local invocation indices [eq]#(l~i~)#, where:
-
-  * [eq]#i# is the index of the invocation within the quad scope instance.
-  * [eq]#(l~0~) = (l~1~ - 1) = (l~2~ - 2) = (l~3~ - 3)#
-  * [eq]#l~0~# is an integer multiple of 4.
-
-endif::VK_NV_compute_shader_derivatives[]
-
-ifdef::VK_VERSION_1_1[]
-In all shaders, each invocation in a quad scope instance is formed of
-invocations in adjacent subgroup invocation indices [eq]#(s~i~)#, where:
-
-  * [eq]#i# is the index of the invocation within the quad scope instance.
-  * [eq]#(s~0~) = (s~1~ - 1) = (s~2~ - 2) = (s~3~ - 3)#
-  * [eq]#s~0~# is an integer multiple of 4.
-
-Each invocation in a quad scope instance must: be in the same
-<<shaders-scope-subgroup, subgroup>>.
-endif::VK_VERSION_1_1[]
-
-ifndef::VK_VERSION_1_1[]
-The specific set of invocations that make up a quad scope instance in other
-shader stages is undefined:.
-endif::VK_VERSION_1_1[]
-
-In a fragment shader, each invocation in a quad scope instance must: be in
-the same <<shaders-scope-primitive, primitive scope instance>>.
-
-ifndef::VK_VERSION_1_1[]
-For <<shaders-scope-workgroup, shaders that have defined workgroups>>, each
-invocation in a quad scope instance must: be in the same
-<<shaders-scope-workgroup, local workgroup>>.
-
-In other shader stages, each invocation in a quad scope instance must: be in
-the same <<shaders-scope-device, device scope instance>>.
-endif::VK_VERSION_1_1[]
-
-Fragment
-ifdef::VK_NV_compute_shader_derivatives,VK_VERSION_1_1[]
-and compute
-endif::VK_NV_compute_shader_derivatives,VK_VERSION_1_1[]
-shaders have defined quad scope instances.
-ifdef::VK_VERSION_1_1[]
-If the <<limits-subgroup-quadOperationsInAllStages,
-pname:quadOperationsInAllStages>> limit is supported, any
-<<limits-subgroup-supportedStages, shader stages that support subgroup
-operations>> also have defined quad scope instances.
-endif::VK_VERSION_1_1[]
-
-
-ifdef::VK_EXT_fragment_shader_interlock[]
-[[shaders-scope-fragment-interlock]]
-=== Fragment Interlock
-
-A _fragment interlock scope instance_ is formed of fragment shader
-invocations based on their framebuffer locations [eq]#(x,y,layer,sample)#,
-executed by commands inside a single <<renderpass,subpass>>.
-
-The specific set of invocations included varies based on the execution mode
-as follows:
-
-  * If the code:SampleInterlockOrderedEXT or
-    code:SampleInterlockUnorderedEXT execution modes are used, only
-    invocations with identical framebuffer locations
-    [eq]#(x,y,layer,sample)# are included.
-  * If the code:PixelInterlockOrderedEXT or code:PixelInterlockUnorderedEXT
-    execution modes are used, fragments with different sample ids are also
-    included.
-ifdef::VK_NV_shading_rate_image,VK_KHR_fragment_shading_rate[]
-  * If the code:ShadingRateInterlockOrderedEXT or
-    code:ShadingRateInterlockUnorderedEXT execution modes are used,
-    fragments from neighbouring framebuffer locations are also included, as
-    <<primsrast-shading-rate-image,determined by the shading rate>>.
-endif::VK_NV_shading_rate_image,VK_KHR_fragment_shading_rate[]
-
-Only fragment shaders with one of the above execution modes have defined
-fragment interlock scope instances.
-
-There is no specific code:Scope value for communication across invocations
-in a fragment interlock scope instance.
-However, this is implicitly used as a memory scope by
-code:OpBeginInvocationInterlockEXT and code:OpEndInvocationInterlockEXT.
-
-Each invocation in a fragment interlock scope instance must: be in the same
-<<shaders-scope-queue-family, queue family scope instance>>.
-endif::VK_EXT_fragment_shader_interlock[]
-
-
-[[shaders-scope-invocation]]
-=== Invocation
-
-The smallest _scope_ is a single invocation; this is represented by the
-code:Invocation code:Scope in SPIR-V.
-
-Fragment shader invocations must: be in a <<shaders-scope-primitive,
-primitive scope instance>>.
-
-ifdef::VK_EXT_fragment_shader_interlock[]
-Invocations in <<shaders-scope-fragment-interlock, fragment shaders that
-have a defined fragment interlock scope>> must: be in a
-<<shaders-scope-fragment-interlock, fragment interlock scope instance>>.
-endif::VK_EXT_fragment_shader_interlock[]
-
-Invocations in <<shaders-scope-workgroup, shaders that have defined
-workgroups>> must: be in a <<shaders-scope-workgroup, local workgroup>>.
-
-ifdef::VK_VERSION_1_1[]
-Invocations in <<shaders-scope-subgroup, shaders that have a defined
-subgroup scope>> must: be in a <<shaders-scope-subgroup, subgroup>>.
-endif::VK_VERSION_1_1[]
-
-Invocations in <<shaders-scope-quad, shaders that have a defined quad
-scope>> must: be in a <<shaders-scope-quad, quad scope instance>>.
-
-All invocations in all stages must: be in a <<shaders-scope-command,command
-scope instance>>.
-
-
-ifdef::VK_VERSION_1_1[]
-[[shaders-group-operations]]
-== Group Operations
-
-_Group operations_ are executed by multiple invocations within a
-<<shaders-scope, scope instance>>; with each invocation involved in
-calculating the result.
-This provides a mechanism for efficient communication between invocations in
-a particular scope instance.
-
-Group operations all take a code:Scope defining the desired
-<<shaders-scope,scope instance>> to operate within.
-Only the code:Subgroup scope can: be used for these operations; the
-<<limits-subgroupSupportedOperations, pname:subgroupSupportedOperations>>
-limit defines which types of operation can: be used.
-
-
-[[shaders-group-operations-basic]]
-=== Basic Group Operations
-
-Basic group operations include the use of code:OpGroupNonUniformElect,
-code:OpControlBarrier, code:OpMemoryBarrier, and atomic operations.
-
-code:OpGroupNonUniformElect can: be used to choose a single invocation to
-perform a task for the whole group.
-Only the invocation with the lowest id in the group will return code:true.
-
-The <<memory-model,Memory Model>> appendix defines the operation of barriers
-and atomics.
-
-
-[[shaders-group-operations-vote]]
-=== Vote Group Operations
-
-The vote group operations allow invocations within a group to compare values
-across a group.
-The types of votes enabled are:
-
-  * Do all active group invocations agree that an expression is true?
-  * Do any active group invocations evaluate an expression to true?
-  * Do all active group invocations have the same value of an expression?
-
-[NOTE]
-.Note
-====
-These operations are useful in combination with control flow in that they
-allow for developers to check whether conditions match across the group and
-choose potentially faster code-paths in these cases.
-====
-
-
-[[shaders-group-operations-arithmetic]]
-=== Arithmetic Group Operations
-
-The arithmetic group operations allow invocations to perform scans and
-reductions across a group.
-The operators supported are add, mul, min, max, and, or, xor.
-
-For reductions, every invocation in a group will obtain the cumulative
-result of these operators applied to all values in the group.
-For exclusive scans, each invocation in a group will obtain the cumulative
-result of these operators applied to all values in invocations with a lower
-index in the group.
-Inclusive scans are identical to exclusive scans, except the cumulative
-result includes the operator applied to the value in the current invocation.
-
-The order in which these operators are applied is implementation-dependent.
-
-
-[[shaders-group-operations-ballot]]
-=== Ballot Group Operations
-
-The ballot group operations allow invocations to perform more complex votes
-across the group.
-The ballot functionality allows all invocations within a group to provide a
-boolean value and get as a result what each invocation provided as their
-boolean value.
-The broadcast functionality allows values to be broadcast from an invocation
-to all other invocations within the group.
-
-
-[[shaders-group-operations-shuffle]]
-=== Shuffle Group Operations
-
-The shuffle group operations allow invocations to read values from other
-invocations within a group.
-
-
-[[shaders-group-operations-shuffle-relative]]
-=== Shuffle Relative Group Operations
-
-The shuffle relative group operations allow invocations to read values from
-other invocations within the group relative to the current invocation in the
-group.
-The relative operations supported allow data to be shifted up and down
-through the invocations within a group.
-
-
-[[shaders-group-operations-clustered]]
-=== Clustered Group Operations
-
-The clustered group operations allow invocations to perform an operation
-among partitions of a group, such that the operation is only performed
-within the group invocations within a partition.
-The partitions for clustered group operations are consecutive power-of-two
-size groups of invocations and the cluster size must: be known at pipeline
-creation time.
-The operations supported are add, mul, min, max, and, or, xor.
-
-
-[[shaders-quad-operations]]
-== Quad Group Operations
-
-Quad group operations (code:OpGroupNonUniformQuad*) are a specialized type
-of <<shaders-group-operations, group operations>> that only operate on
-<<shaders-scope-quad, quad scope instances>>.
-Whilst these instructions do include a code:Scope parameter, this scope is
-always overridden; only the <<shaders-scope-quad, quad scope instance>> is
-included in its execution scope.
-
-Fragment shaders that statically execute quad group operations must: launch
-sufficient invocations to ensure their correct operation; additional
-<<shaders-helper-invocations, helper invocations>> are launched for
-framebuffer locations not covered by rasterized fragments if necessary.
-
-The index used to select participating invocations is [eq]#i#, as described
-for a <<shaders-scope-quad, quad scope instance>>, defined as the _quad
-index_ in the <<spirv-spec,SPIR-V specification>>.
-
-For code:OpGroupNonUniformQuadBroadcast this value is equal to code:Index.
-For code:OpGroupNonUniformQuadSwap, it is equal to the implicit code:Index
-used by each participating invocation.
-endif::VK_VERSION_1_1[]
-
-
-[[shaders-derivative-operations]]
-== Derivative Operations
-
-Derivative operations calculate the partial derivative for an expression
-[eq]#P# as a function of an invocation's [eq]#x# and [eq]#y# coordinates.
-
-Derivative operations operate on a set of invocations known as a _derivative
-group_ as defined in the <<spirv-spec,SPIR-V specification>>.
-A derivative group is equivalent to
-ifdef::VK_NV_compute_shader_derivatives[]
-the <<shaders-scope-quad, quad scope instance>> for a compute shader
-invocation, or
-endif::VK_NV_compute_shader_derivatives[]
-the <<shaders-scope-primitive, primitive scope instance>> for a fragment
-shader invocation.
-
-Derivatives are calculated assuming that [eq]#P# is piecewise linear and
-continuous within the derivative group.
-All dynamic instances of explicit derivative instructions (code:OpDPdx*,
-code:OpDPdy*, and code:OpFwidth*) must: be executed in control flow that is
-uniform within a derivative group.
-For other derivative operations, results are undefined: if a dynamic
-instance is executed in control flow that is not uniform within the
-derivative group.
-
-Fragment shaders that statically execute derivative operations must: launch
-sufficient invocations to ensure their correct operation; additional
-<<shaders-helper-invocations, helper invocations>> are launched for
-framebuffer locations not covered by rasterized fragments if necessary.
-
-ifdef::VK_NV_compute_shader_derivatives[]
-[NOTE]
-.Note
-====
-In a compute shader, it is the application's responsibility to ensure that
-sufficient invocations are launched.
-====
-endif::VK_NV_compute_shader_derivatives[]
-
-Derivative operations calculate their results as the difference between the
-result of [eq]#P# across invocations in the quad.
-For fine derivative operations (code:OpDPdxFine and code:OpDPdyFine), the
-values of [eq]#DPdx(P~i~)# are calculated as
-
-  {empty}:: [eq]#DPdx(P~0~) = DPdx(P~1~) = P~1~ - P~0~#
-  {empty}:: [eq]#DPdx(P~2~) = DPdx(P~3~) = P~3~ - P~2~#
-
-and the values of [eq]#DPdy(P~i~)# are calculated as
-
-  {empty}:: [eq]#DPdy(P~0~) = DPdy(P~2~) = P~2~ - P~0~#
-  {empty}:: [eq]#DPdy(P~1~) = DPdy(P~3~) = P~3~ - P~1~#
-
-where [eq]#i# is the index of each invocation as described in
-<<shaders-scope-quad>>.
-
-Coarse derivative operations (code:OpDPdxCoarse and code:OpDPdyCoarse),
-calculate their results in roughly the same manner, but may: only calculate
-two values instead of four (one for each of [eq]#DPdx# and [eq]#DPdy#),
-reusing the same result no matter the originating invocation.
-If an implementation does this, it should: use the fine derivative
-calculations described for [eq]#P~0~#.
-
-[NOTE]
-.Note
-====
-Derivative values are calculated between fragments rather than pixels.
-If the fragment shader invocations involved in the calculation cover
-multiple pixels, these operations cover a wider area, resulting in larger
-derivative values.
-This in turn will result in a coarser level of detail being selected for
-image sampling operations using derivatives.
-
-Applications may want to account for this when using multi-pixel fragments;
-if pixel derivatives are desired, applications should use explicit
-derivative operations and divide the results by the size of the fragment in
-each dimension as follows:
-
-  {empty}:: [eq]#DPdx(P~n~)' = DPdx(P~n~) / w#
-  {empty}:: [eq]#DPdy(P~n~)' = DPdy(P~n~) / h#
-
-where [eq]#w# and [eq]#h# are the size of the fragments in the quad, and
-[eq]#DPdx(P~n~)'# and [eq]#DPdy(P~n~)'# are the pixel derivatives.
-====
-
-The results for code:OpDPdx and code:OpDPdy may: be calculated as either
-fine or coarse derivatives, with implementations favouring the most
-efficient approach.
-Implementations must: choose coarse or fine consistently between the two.
-
-Executing code:OpFwidthFine, code:OpFwidthCoarse, or code:OpFwidth is
-equivalent to executing the corresponding code:OpDPdx* and code:OpDPdy*
-instructions, taking the absolute value of the results, and summing them.
-
-Executing an code:OpImage*Sample*ImplicitLod instruction is equivalent to
-executing code:OpDPdx(code:Coordinate) and code:OpDPdy(code:Coordinate), and
-passing the results as the code:Grad operands code:dx and code:dy.
-
-[NOTE]
-.Note
-====
-It is expected that using the code:ImplicitLod variants of sampling
-functions will be substantially more efficient than using the
-code:ExplicitLod variants with explicitly generated derivatives.
-====
-
-
-[[shaders-helper-invocations]]
-== Helper Invocations
-
-When performing <<shaders-derivative-operations, derivative>>
-ifdef::VK_VERSION_1_1[]
-or <<shaders-quad-operations, quad group>>
-endif::VK_VERSION_1_1[]
-operations in a fragment shader, additional invocations may: be spawned in
-order to ensure correct results.
-These additional invocations are known as _helper invocations_ and can: be
-identified by a non-zero value in the code:HelperInvocation built-in.
-Stores and atomics performed by helper invocations must: not have any effect
-on memory, and values returned by atomic instructions in helper invocations
-are undefined:.
-
-Helper invocations may: become inactive at any time for any reason, with one
-exception.
-If a helper invocation would be active if it were not a helper invocation,
-it must: be active for <<shaders-derivative-operations, derivative>>
-ifdef::VK_VERSION_1_1[]
-and <<shaders-quad-operations, quad group>>
-endif::VK_VERSION_1_1[]
-operations.
-
-ifdef::VK_EXT_shader_demote_to_helper_invocation[]
-Helper invocations may: become permanently inactive if all invocations in a
-quad scope instance become helper invocations.
-endif::VK_EXT_shader_demote_to_helper_invocation[]
-
-
-ifdef::VK_NV_cooperative_matrix[]
-== Cooperative Matrices
-
-A _cooperative matrix_ type is a SPIR-V type where the storage for and
-computations performed on the matrix are spread across the invocations in a
-scope instance.
-These types give the implementation freedom in how to optimize matrix
-multiplies.
-
-SPIR-V defines the types and instructions, but does not specify rules about
-what sizes/combinations are valid, and it is expected that different
-implementations may: support different sizes.
-
-[open,refpage='vkGetPhysicalDeviceCooperativeMatrixPropertiesNV',desc='Returns properties describing what cooperative matrix types are supported',type='protos']
---
-To enumerate the supported cooperative matrix types and operations, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceCooperativeMatrixPropertiesNV.txt[]
-
-  * pname:physicalDevice is the physical device.
-  * pname:pPropertyCount is a pointer to an integer related to the number of
-    cooperative matrix properties available or queried.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    slink:VkCooperativeMatrixPropertiesNV structures.
-
-If pname:pProperties is `NULL`, then the number of cooperative matrix
-properties available is returned in pname:pPropertyCount.
-Otherwise, pname:pPropertyCount must: point to a variable set by the user to
-the number of elements in the pname:pProperties array, and on return the
-variable is overwritten with the number of structures actually written to
-pname:pProperties.
-If pname:pPropertyCount is less than the number of cooperative matrix
-properties available, at most pname:pPropertyCount structures will be
-written, and ename:VK_INCOMPLETE will be returned instead of
-ename:VK_SUCCESS, to indicate that not all the available cooperative matrix
-properties were returned.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceCooperativeMatrixPropertiesNV.txt[]
---
-
-[open,refpage='VkCooperativeMatrixPropertiesNV',desc='Structure specifying cooperative matrix properties',type='structs']
---
-Each sname:VkCooperativeMatrixPropertiesNV structure describes a single
-supported combination of types for a matrix multiply/add operation
-(code:OpCooperativeMatrixMulAddNV).
-The multiply can: be described in terms of the following variables and types
-(in SPIR-V pseudocode):
-
-[source,c]
-~~~~
-    %A is of type OpTypeCooperativeMatrixNV %AType %scope %MSize %KSize
-    %B is of type OpTypeCooperativeMatrixNV %BType %scope %KSize %NSize
-    %C is of type OpTypeCooperativeMatrixNV %CType %scope %MSize %NSize
-    %D is of type OpTypeCooperativeMatrixNV %DType %scope %MSize %NSize
-
-    %D = %A * %B + %C // using OpCooperativeMatrixMulAddNV
-~~~~
-
-A matrix multiply with these dimensions is known as an _MxNxK_ matrix
-multiply.
-
-The sname:VkCooperativeMatrixPropertiesNV structure is defined as:
-
-include::{generated}/api/structs/VkCooperativeMatrixPropertiesNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:MSize is the number of rows in matrices A, C, and D.
-  * pname:KSize is the number of columns in matrix A and rows in matrix B.
-  * pname:NSize is the number of columns in matrices B, C, D.
-  * pname:AType is the component type of matrix A, of type
-    elink:VkComponentTypeNV.
-  * pname:BType is the component type of matrix B, of type
-    elink:VkComponentTypeNV.
-  * pname:CType is the component type of matrix C, of type
-    elink:VkComponentTypeNV.
-  * pname:DType is the component type of matrix D, of type
-    elink:VkComponentTypeNV.
-  * pname:scope is the scope of all the matrix types, of type
-    elink:VkScopeNV.
-
-If some types are preferred over other types (e.g. for performance), they
-should: appear earlier in the list enumerated by
-flink:vkGetPhysicalDeviceCooperativeMatrixPropertiesNV.
-
-At least one entry in the list must: have power of two values for all of
-pname:MSize, pname:KSize, and pname:NSize.
-
-include::{generated}/validity/structs/VkCooperativeMatrixPropertiesNV.txt[]
---
-
-[open,refpage='VkScopeNV',desc='Specify SPIR-V scope',type='enums']
---
-Possible values for elink:VkScopeNV include:
-
-include::{generated}/api/enums/VkScopeNV.txt[]
-
-  * ename:VK_SCOPE_DEVICE_NV corresponds to SPIR-V code:Device scope.
-  * ename:VK_SCOPE_WORKGROUP_NV corresponds to SPIR-V code:Workgroup scope.
-  * ename:VK_SCOPE_SUBGROUP_NV corresponds to SPIR-V code:Subgroup scope.
-  * ename:VK_SCOPE_QUEUE_FAMILY_NV corresponds to SPIR-V code:QueueFamily
-    scope.
-
-All enum values match the corresponding SPIR-V value.
---
-
-[open,refpage='VkComponentTypeNV',desc='Specify SPIR-V cooperative matrix component type',type='enums']
---
-Possible values for elink:VkComponentTypeNV include:
-
-include::{generated}/api/enums/VkComponentTypeNV.txt[]
-
-  * ename:VK_COMPONENT_TYPE_FLOAT16_NV corresponds to SPIR-V
-    code:OpTypeFloat 16.
-  * ename:VK_COMPONENT_TYPE_FLOAT32_NV corresponds to SPIR-V
-    code:OpTypeFloat 32.
-  * ename:VK_COMPONENT_TYPE_FLOAT64_NV corresponds to SPIR-V
-    code:OpTypeFloat 64.
-  * ename:VK_COMPONENT_TYPE_SINT8_NV corresponds to SPIR-V code:OpTypeInt 8 1.
-  * ename:VK_COMPONENT_TYPE_SINT16_NV corresponds to SPIR-V code:OpTypeInt
-    16 1.
-  * ename:VK_COMPONENT_TYPE_SINT32_NV corresponds to SPIR-V code:OpTypeInt
-    32 1.
-  * ename:VK_COMPONENT_TYPE_SINT64_NV corresponds to SPIR-V code:OpTypeInt
-    64 1.
-  * ename:VK_COMPONENT_TYPE_UINT8_NV corresponds to SPIR-V code:OpTypeInt 8 0.
-  * ename:VK_COMPONENT_TYPE_UINT16_NV corresponds to SPIR-V code:OpTypeInt
-    16 0.
-  * ename:VK_COMPONENT_TYPE_UINT32_NV corresponds to SPIR-V code:OpTypeInt
-    32 0.
-  * ename:VK_COMPONENT_TYPE_UINT64_NV corresponds to SPIR-V code:OpTypeInt
-    64 0.
---
-endif::VK_NV_cooperative_matrix[]
-
-
-ifdef::VK_EXT_validation_cache[]
-[[shaders-validation-cache]]
-== Validation Cache
-
-[open,refpage='VkValidationCacheEXT',desc='Opaque handle to a validation cache object',type='handles']
---
-Validation cache objects allow the result of internal validation to be
-reused, both within a single application run and between multiple runs.
-Reuse within a single run is achieved by passing the same validation cache
-object when creating supported Vulkan objects.
-Reuse across runs of an application is achieved by retrieving validation
-cache contents in one run of an application, saving the contents, and using
-them to preinitialize a validation cache on a subsequent run.
-The contents of the validation cache objects are managed by the validation
-layers.
-Applications can: manage the host memory consumed by a validation cache
-object and control the amount of data retrieved from a validation cache
-object.
-
-Validation cache objects are represented by sname:VkValidationCacheEXT
-handles:
-
-include::{generated}/api/handles/VkValidationCacheEXT.txt[]
---
-
-[open,refpage='vkCreateValidationCacheEXT',desc='Creates a new validation cache',type='protos']
---
-To create validation cache objects, call:
-
-include::{generated}/api/protos/vkCreateValidationCacheEXT.txt[]
-
-  * pname:device is the logical device that creates the validation cache
-    object.
-  * pname:pCreateInfo is a pointer to a slink:VkValidationCacheCreateInfoEXT
-    structure containing the initial parameters for the validation cache
-    object.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pValidationCache is a pointer to a slink:VkValidationCacheEXT
-    handle in which the resulting validation cache object is returned.
-
-[NOTE]
-.Note
-====
-Applications can: track and manage the total host memory size of a
-validation cache object using the pname:pAllocator.
-Applications can: limit the amount of data retrieved from a validation cache
-object in fname:vkGetValidationCacheDataEXT.
-Implementations should: not internally limit the total number of entries
-added to a validation cache object or the total host memory consumed.
-====
-
-Once created, a validation cache can: be passed to the
-fname:vkCreateShaderModule command by adding this object to the
-slink:VkShaderModuleCreateInfo structure's pname:pNext chain.
-If a slink:VkShaderModuleValidationCacheCreateInfoEXT object is included in
-the slink:VkShaderModuleCreateInfo::pname:pNext chain, and its
-pname:validationCache field is not dlink:VK_NULL_HANDLE, the implementation
-will query it for possible reuse opportunities and update it with new
-content.
-The use of the validation cache object in these commands is internally
-synchronized, and the same validation cache object can: be used in multiple
-threads simultaneously.
-
-[NOTE]
-.Note
-====
-Implementations should: make every effort to limit any critical sections to
-the actual accesses to the cache, which is expected to be significantly
-shorter than the duration of the fname:vkCreateShaderModule command.
-====
-
-include::{generated}/validity/protos/vkCreateValidationCacheEXT.txt[]
---
-
-[open,refpage='VkValidationCacheCreateInfoEXT',desc='Structure specifying parameters of a newly created validation cache',type='structs']
---
-The sname:VkValidationCacheCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkValidationCacheCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:initialDataSize is the number of bytes in pname:pInitialData.
-    If pname:initialDataSize is zero, the validation cache will initially be
-    empty.
-  * pname:pInitialData is a pointer to previously retrieved validation cache
-    data.
-    If the validation cache data is incompatible (as defined below) with the
-    device, the validation cache will be initially empty.
-    If pname:initialDataSize is zero, pname:pInitialData is ignored.
-
-.Valid Usage
-****
-  * [[VUID-VkValidationCacheCreateInfoEXT-initialDataSize-01534]]
-    If pname:initialDataSize is not `0`, it must: be equal to the size of
-    pname:pInitialData, as returned by fname:vkGetValidationCacheDataEXT
-    when pname:pInitialData was originally retrieved
-  * [[VUID-VkValidationCacheCreateInfoEXT-initialDataSize-01535]]
-    If pname:initialDataSize is not `0`, pname:pInitialData must: have been
-    retrieved from a previous call to fname:vkGetValidationCacheDataEXT
-****
-
-include::{generated}/validity/structs/VkValidationCacheCreateInfoEXT.txt[]
---
-
-[open,refpage='VkValidationCacheCreateFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkValidationCacheCreateFlagsEXT.txt[]
-
-tname:VkValidationCacheCreateFlagsEXT is a bitmask type for setting a mask,
-but is currently reserved for future use.
---
-
-[open,refpage='vkMergeValidationCachesEXT',desc='Combine the data stores of validation caches',type='protos']
---
-Validation cache objects can: be merged using the command:
-
-include::{generated}/api/protos/vkMergeValidationCachesEXT.txt[]
-
-  * pname:device is the logical device that owns the validation cache
-    objects.
-  * pname:dstCache is the handle of the validation cache to merge results
-    into.
-  * pname:srcCacheCount is the length of the pname:pSrcCaches array.
-  * pname:pSrcCaches is a pointer to an array of validation cache handles,
-    which will be merged into pname:dstCache.
-    The previous contents of pname:dstCache are included after the merge.
-
-[NOTE]
-.Note
-====
-The details of the merge operation are implementation-dependent, but
-implementations should: merge the contents of the specified validation
-caches and prune duplicate entries.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkMergeValidationCachesEXT-dstCache-01536]]
-    pname:dstCache must: not appear in the list of source caches
-****
-
-include::{generated}/validity/protos/vkMergeValidationCachesEXT.txt[]
---
-
-[open,refpage='vkGetValidationCacheDataEXT',desc='Get the data store from a validation cache',type='protos']
---
-Data can: be retrieved from a validation cache object using the command:
-
-include::{generated}/api/protos/vkGetValidationCacheDataEXT.txt[]
-
-  * pname:device is the logical device that owns the validation cache.
-  * pname:validationCache is the validation cache to retrieve data from.
-  * pname:pDataSize is a pointer to a value related to the amount of data in
-    the validation cache, as described below.
-  * pname:pData is either `NULL` or a pointer to a buffer.
-
-If pname:pData is `NULL`, then the maximum size of the data that can: be
-retrieved from the validation cache, in bytes, is returned in
-pname:pDataSize.
-Otherwise, pname:pDataSize must: point to a variable set by the user to the
-size of the buffer, in bytes, pointed to by pname:pData, and on return the
-variable is overwritten with the amount of data actually written to
-pname:pData.
-If pname:pDataSize is less than the maximum size that can: be retrieved by
-the validation cache, at most pname:pDataSize bytes will be written to
-pname:pData, and fname:vkGetValidationCacheDataEXT will return
-ename:VK_INCOMPLETE instead of ename:VK_SUCCESS, to indicate that not all of
-the validation cache was returned.
-
-Any data written to pname:pData is valid and can: be provided as the
-pname:pInitialData member of the slink:VkValidationCacheCreateInfoEXT
-structure passed to fname:vkCreateValidationCacheEXT.
-
-Two calls to fname:vkGetValidationCacheDataEXT with the same parameters
-must: retrieve the same data unless a command that modifies the contents of
-the cache is called between them.
-
-[[validation-cache-header]]
-Applications can: store the data retrieved from the validation cache, and
-use these data, possibly in a future run of the application, to populate new
-validation cache objects.
-The results of validation, however, may: depend on the vendor ID, device ID,
-driver version, and other details of the device.
-To enable applications to detect when previously retrieved data is
-incompatible with the device, the initial bytes written to pname:pData must:
-be a header consisting of the following members:
-
-.Layout for validation cache header version ename:VK_VALIDATION_CACHE_HEADER_VERSION_ONE_EXT
-[width="85%",cols="8%,21%,71%",options="header"]
-|====
-| Offset | Size | Meaning
-| 0 | 4                    | length in bytes of the entire validation cache header
-                             written as a stream of bytes, with the least
-                             significant byte first
-| 4 | 4                    | a elink:VkValidationCacheHeaderVersionEXT value
-                             written as a stream of bytes, with the least
-                             significant byte first
-| 8 | ename:VK_UUID_SIZE   | a layer commit ID expressed as a UUID, which uniquely
-                             identifies the version of the validation layers used
-                             to generate these validation results
-|====
-
-The first four bytes encode the length of the entire validation cache
-header, in bytes.
-This value includes all fields in the header including the validation cache
-version field and the size of the length field.
-
-The next four bytes encode the validation cache version, as described for
-elink:VkValidationCacheHeaderVersionEXT.
-A consumer of the validation cache should: use the cache version to
-interpret the remainder of the cache header.
-
-If pname:pDataSize is less than what is necessary to store this header,
-nothing will be written to pname:pData and zero will be written to
-pname:pDataSize.
-
-include::{generated}/validity/protos/vkGetValidationCacheDataEXT.txt[]
---
-
-[open,refpage='VkValidationCacheHeaderVersionEXT',desc='Encode validation cache version',type='enums',xrefs='vkCreateValidationCacheEXT vkGetValidationCacheDataEXT']
---
-Possible values of the second group of four bytes in the header returned by
-flink:vkGetValidationCacheDataEXT, encoding the validation cache version,
-are:
-
-include::{generated}/api/enums/VkValidationCacheHeaderVersionEXT.txt[]
-
-  * ename:VK_VALIDATION_CACHE_HEADER_VERSION_ONE_EXT specifies version one
-    of the validation cache.
---
-
-[open,refpage='vkDestroyValidationCacheEXT',desc='Destroy a validation cache object',type='protos']
---
-To destroy a validation cache, call:
-
-include::{generated}/api/protos/vkDestroyValidationCacheEXT.txt[]
-
-  * pname:device is the logical device that destroys the validation cache
-    object.
-  * pname:validationCache is the handle of the validation cache to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyValidationCacheEXT-validationCache-01537]]
-    If sname:VkAllocationCallbacks were provided when pname:validationCache
-    was created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyValidationCacheEXT-validationCache-01538]]
-    If no sname:VkAllocationCallbacks were provided when
-    pname:validationCache was created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyValidationCacheEXT.txt[]
---
-endif::VK_EXT_validation_cache[]
diff --git a/registry/vulkan/chapters/sparsemem.txt b/registry/vulkan/chapters/sparsemem.txt
deleted file mode 100644
index dc6d76a..0000000
--- a/registry/vulkan/chapters/sparsemem.txt
+++ /dev/null
@@ -1,1813 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[sparsememory]]
-= Sparse Resources
-
-As documented in <<resources-association,Resource Memory Association>>,
-sname:VkBuffer and sname:VkImage resources in Vulkan must: be bound
-completely and contiguously to a single sname:VkDeviceMemory object.
-This binding must: be done before the resource is used, and the binding is
-immutable for the lifetime of the resource.
-
-_Sparse resources_ relax these restrictions and provide these additional
-features:
-
-  * Sparse resources can: be bound non-contiguously to one or more
-    sname:VkDeviceMemory allocations.
-  * Sparse resources can: be re-bound to different memory allocations over
-    the lifetime of the resource.
-  * Sparse resources can: have descriptors generated and used orthogonally
-    with memory binding commands.
-
-
-[[sparsememory-sparseresourcefeatures]]
-== Sparse Resource Features
-
-Sparse resources have several features that must: be enabled explicitly at
-resource creation time.
-The features are enabled by including bits in the pname:flags parameter of
-slink:VkImageCreateInfo or slink:VkBufferCreateInfo.
-Each feature also has one or more corresponding feature enables specified in
-slink:VkPhysicalDeviceFeatures.
-
-  * <<features-sparseBinding,Sparse binding>> is the base feature, and
-    provides the following capabilities:
-
-  ** Resources can: be bound at some defined (sparse block) granularity.
-  ** The entire resource must: be bound to memory before use regardless of
-     regions actually accessed.
-  ** No specific mapping of image region to memory offset is defined, i.e.
-     the location that each texel corresponds to in memory is
-     implementation-dependent.
-  ** Sparse buffers have a well-defined mapping of buffer range to memory
-     range, where an offset into a range of the buffer that is bound to a
-     single contiguous range of memory corresponds to an identical offset
-     within that range of memory.
-  ** Requested via the ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT and
-     ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT bits.
-  ** A sparse image created using ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT
-     (but not ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) supports all
-     formats that non-sparse usage supports, and supports both
-     ename:VK_IMAGE_TILING_OPTIMAL and ename:VK_IMAGE_TILING_LINEAR tiling.
-
-  * _Sparse Residency_ builds on (and requires) the pname:sparseBinding
-    feature.
-    It includes the following capabilities:
-
-  ** Resources do not have to be completely bound to memory before use on
-     the device.
-  ** Images have a prescribed sparse image block layout, allowing specific
-     rectangular regions of the image to be bound to specific offsets in
-     memory allocations.
-  ** Consistency of access to unbound regions of the resource is defined by
-     the absence or presence of
-     sname:VkPhysicalDeviceSparseProperties::pname:residencyNonResidentStrict.
-     If this property is present, accesses to unbound regions of the
-     resource are well defined and behave as if the data bound is populated
-     with all zeros; writes are discarded.
-     When this property is absent, accesses are considered safe, but reads
-     will return undefined: values.
-  ** Requested via the ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT and
-     ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT bits.
-  ** [[features-sparseResidency]] Sparse residency support is advertised on
-     a finer grain via the following features:
-+
-  *** <<features-sparseResidencyBuffer,pname:sparseResidencyBuffer>>:
-      Support for creating sname:VkBuffer objects with the
-      ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT.
-  *** <<features-sparseResidencyImage2D,pname:sparseResidencyImage2D>>:
-      Support for creating 2D single-sampled sname:VkImage objects with
-      ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT.
-  *** <<features-sparseResidencyImage3D,pname:sparseResidencyImage3D>>:
-      Support for creating 3D sname:VkImage objects with
-      ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT.
-  *** <<features-sparseResidency2Samples,pname:sparseResidency2Samples>>:
-      Support for creating 2D sname:VkImage objects with 2 samples and
-      ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT.
-  *** <<features-sparseResidency4Samples,pname:sparseResidency4Samples>>:
-      Support for creating 2D sname:VkImage objects with 4 samples and
-      ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT.
-  *** <<features-sparseResidency8Samples,pname:sparseResidency8Samples>>:
-      Support for creating 2D sname:VkImage objects with 8 samples and
-      ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT.
-  *** <<features-sparseResidency16Samples,pname:sparseResidency16Samples>>:
-      Support for creating 2D sname:VkImage objects with 16 samples and
-      ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT.
-+
-Implementations supporting pname:sparseResidencyImage2D are only required:
-to support sparse 2D, single-sampled images.
-Support for sparse 3D and MSAA images is optional: and can: be enabled via
-pname:sparseResidencyImage3D, pname:sparseResidency2Samples,
-pname:sparseResidency4Samples, pname:sparseResidency8Samples, and
-pname:sparseResidency16Samples.
-
-  ** A sparse image created using ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-     supports all non-compressed color formats with power-of-two element
-     size that non-sparse usage supports.
-     Additional formats may: also be supported and can: be queried via
-     flink:vkGetPhysicalDeviceSparseImageFormatProperties.
-     ename:VK_IMAGE_TILING_LINEAR tiling is not supported.
-
-  * <<features-sparseResidencyAliased,Sparse aliasing>> provides the
-    following capability that can: be enabled per resource:
-+
-Allows physical memory ranges to be shared between multiple locations in the
-same sparse resource or between multiple sparse resources, with each binding
-of a memory location observing a consistent interpretation of the memory
-contents.
-+
-See <<sparsememory-sparse-memory-aliasing,Sparse Memory Aliasing>> for more
-information.
-
-
-[[sparsememory-fully-resident]]
-== Sparse Buffers and Fully-Resident Images
-
-Both sname:VkBuffer and sname:VkImage objects created with the
-ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT or
-ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT bits can: be thought of as a
-linear region of address space.
-In the sname:VkImage case if ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT is
-not used, this linear region is entirely opaque, meaning that there is no
-application-visible mapping between texel location and memory offset.
-
-Unless ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or
-ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT are also used, the entire
-resource must: be bound to one or more sname:VkDeviceMemory objects before
-use.
-
-
-=== Sparse Buffer and Fully-Resident Image Block Size
-
-The sparse block size in bytes for sparse buffers and fully-resident images
-is reported as sname:VkMemoryRequirements::pname:alignment.
-pname:alignment represents both the memory alignment requirement and the
-binding granularity (in bytes) for sparse resources.
-
-
-[[sparsememory-partially-resident-buffers]]
-== Sparse Partially-Resident Buffers
-
-sname:VkBuffer objects created with the
-ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT bit allow the buffer to be made
-only partially resident.
-Partially resident sname:VkBuffer objects are allocated and bound
-identically to sname:VkBuffer objects using only the
-ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT feature.
-The only difference is the ability for some regions of the buffer to be
-unbound during device use.
-
-
-[[sparsememory-partially-resident-images]]
-== Sparse Partially-Resident Images
-
-sname:VkImage objects created with the
-ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT bit allow specific rectangular
-regions of the image called sparse image blocks to be bound to specific
-ranges of memory.
-This allows the application to manage residency at either image subresource
-or sparse image block granularity.
-Each image subresource (outside of the <<sparsememory-miptail,mip tail>>)
-starts on a sparse block boundary and has dimensions that are integer
-multiples of the corresponding dimensions of the sparse image block.
-
-[NOTE]
-.Note
-====
-Applications can: use these types of images to control LOD based on total
-memory consumption.
-If memory pressure becomes an issue the application can: unbind and disable
-specific mipmap levels of images without having to recreate resources or
-modify texel data of unaffected levels.
-
-The application can: also use this functionality to access subregions of the
-image in a "`megatexture`" fashion.
-The application can: create a large image and only populate the region of
-the image that is currently being used in the scene.
-====
-
-
-[[sparsememory-accessing-unbound]]
-=== Accessing Unbound Regions
-
-The following member of sname:VkPhysicalDeviceSparseProperties affects how
-data in unbound regions of sparse resources are handled by the
-implementation:
-
-  * pname:residencyNonResidentStrict
-
-If this property is not present, reads of unbound regions of the image will
-return undefined: values.
-Both reads and writes are still considered _safe_ and will not affect other
-resources or populated regions of the image.
-
-If this property is present, all reads of unbound regions of the image will
-behave as if the region was bound to memory populated with all zeros; writes
-will be discarded.
-
-Formatted accesses to unbound memory may: still alter some component values
-in the natural way for those accesses, e.g. substituting a value of one for
-alpha in formats that do not have an alpha component.
-
-====
-Example: Reading the alpha component of an unbacked ename:VK_FORMAT_R8_UNORM
-image will return a value of [eq]#1.0f#.
-====
-
-See <<devsandqueues-physical-device-enumeration,Physical Device
-Enumeration>> for instructions for retrieving physical device properties.
-
-ifdef::implementation-guide[]
-.Implementor's Note
-****
-For implementations that cannot: natively handle access to unbound regions
-of a resource, the implementation may: allocate and bind memory to the
-unbound regions.
-Reads and writes to unbound regions will access the implementation-managed
-memory instead.
-
-Given that the values resulting from reads of unbound regions are undefined:
-in this scenario, implementations may: use the same physical memory for all
-unbound regions of multiple resources within the same process.
-****
-endif::implementation-guide[]
-
-
-[[sparsememory-miptail]]
-=== Mip Tail Regions
-
-Sparse images created using ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT
-(without also using ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) have no
-specific mapping of image region or image subresource to memory offset
-defined, so the entire image can: be thought of as a linear opaque address
-region.
-However, images created with ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT do
-have a prescribed sparse image block layout, and hence each image
-subresource must: start on a sparse block boundary.
-Within each array layer, the set of mip levels that have a smaller size than
-the sparse block size in bytes are grouped together into a _mip tail
-region_.
-
-If the ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT flag is present in
-the pname:flags member of sname:VkSparseImageFormatProperties, for the
-image's pname:format, then any mip level which has dimensions that are not
-integer multiples of the corresponding dimensions of the sparse image block,
-and all subsequent mip levels, are also included in the mip tail region.
-
-The following member of sname:VkPhysicalDeviceSparseProperties may: affect
-how the implementation places mip levels in the mip tail region:
-
-  * pname:residencyAlignedMipSize
-
-Each mip tail region is bound to memory as an opaque region (i.e. must: be
-bound using a slink:VkSparseImageOpaqueMemoryBindInfo structure) and may: be
-of a size greater than or equal to the sparse block size in bytes.
-This size is guaranteed to be an integer multiple of the sparse block size
-in bytes.
-
-An implementation may: choose to allow each array-layer's mip tail region to
-be bound to memory independently or require that all array-layer's mip tail
-regions be treated as one.
-This is dictated by ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT in
-sname:VkSparseImageMemoryRequirements::pname:flags.
-
-The following diagrams depict how
-ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT and
-ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT alter memory usage and
-requirements.
-
-image::{images}/sparseimage.svg[align="center",title="Sparse Image",opts="{imageopts}"]
-
-In the absence of ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT and
-ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT, each array layer contains a
-mip tail region containing texel data for all mip levels smaller than the
-sparse image block in any dimension.
-
-Mip levels that are as large or larger than a sparse image block in all
-dimensions can: be bound individually.
-Right-edges and bottom-edges of each level are allowed to have partially
-used sparse blocks.
-Any bound partially-used-sparse-blocks must: still have their full sparse
-block size in bytes allocated in memory.
-
-image::{images}/sparseimage_singlemiptail.svg[align="center",title="Sparse Image with Single Mip Tail",opts="{imageopts}"]
-
-When ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT is present all array
-layers will share a single mip tail region.
-
-image::{images}/sparseimage_alignedmipsize.svg[align="center",title="Sparse Image with Aligned Mip Size",opts="{imageopts}"]
-
-[NOTE]
-.Note
-====
-The mip tail regions are presented here in 2D arrays simply for figure size
-reasons.
-Each mip tail is logically a single array of sparse blocks with an
-implementation-dependent mapping of texels or compressed texel blocks to
-sparse blocks.
-====
-
-When ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT is present the first
-mip level that would contain partially used sparse blocks begins the mip
-tail region.
-This level and all subsequent levels are placed in the mip tail.
-Only the first [eq]#N# mip levels whose dimensions are an exact multiple of
-the sparse image block dimensions can: be bound and unbound on a sparse
-block basis.
-
-image::{images}/sparseimage_alignedmipsize_singlemiptail.svg[align="center",title="Sparse Image with Aligned Mip Size and Single Mip Tail",opts="{imageopts}"]
-
-[NOTE]
-.Note
-====
-The mip tail region is presented here in a 2D array simply for figure size
-reasons.
-It is logically a single array of sparse blocks with an
-implementation-dependent mapping of texels or compressed texel blocks to
-sparse blocks.
-====
-
-When both ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT and
-ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT are present the constraints
-from each of these flags are in effect.
-
-
-[[sparsememory-standard-shapes]]
-=== Standard Sparse Image Block Shapes
-
-Standard sparse image block shapes define a standard set of dimensions for
-sparse image blocks that depend on the format of the image.
-Layout of texels or compressed texel blocks within a sparse image block is
-implementation-dependent.
-All currently defined standard sparse image block shapes are 64 KB in size.
-
-For block-compressed formats (e.g. ename:VK_FORMAT_BC5_UNORM_BLOCK), the
-texel size is the size of the compressed texel block (e.g. 128-bit for
-etext:BC5) thus the dimensions of the standard sparse image block shapes
-apply in terms of compressed texel blocks.
-
-[NOTE]
-.Note
-====
-For block-compressed formats, the dimensions of a sparse image block in
-terms of texels can: be calculated by multiplying the sparse image block
-dimensions by the compressed texel block dimensions.
-====
-
-<<<
-
-[[sparsememory-sparseblockshapessingle]]
-.Standard Sparse Image Block Shapes (Single Sample)
-[options="header"]
-|====
-| TEXEL SIZE (bits) | Block Shape (2D)              | Block Shape (3D)
-| *8-Bit*           | 256 {times} 256 {times} 1     | 64 {times} 32 {times} 32
-| *16-Bit*          | 256 {times} 128 {times} 1     | 32 {times} 32 {times} 32
-| *32-Bit*          | 128 {times} 128 {times} 1     | 32 {times} 32 {times} 16
-| *64-Bit*          | 128 {times} 64 {times} 1      | 32 {times} 16 {times} 16
-| *128-Bit*         | 64 {times} 64 {times} 1       | 16 {times} 16 {times} 16
-|====
-
-[[sparsememory-sparseblockshapesmsaa]]
-.Standard Sparse Image Block Shapes (MSAA)
-[options="header"]
-|====
-| TEXEL SIZE (bits)| Block Shape (2X)            | Block Shape (4X)             | Block Shape (8X)             | Block Shape (16X)
-| *8-Bit*          | 128 {times} 256 {times} 1   | 128 {times} 128 {times} 1    | 64 {times} 128 {times} 1     | 64 {times} 64 {times} 1
-| *16-Bit*         | 128 {times} 128 {times} 1   | 128 {times} 64 {times} 1     | 64 {times} 64 {times} 1      | 64 {times} 32 {times} 1
-| *32-Bit*         | 64 {times} 128 {times} 1    | 64 {times} 64 {times} 1      | 32 {times} 64 {times} 1      | 32 {times} 32 {times} 1
-| *64-Bit*         | 64 {times} 64 {times} 1     | 64 {times} 32 {times} 1      | 32 {times} 32 {times} 1      | 32 {times} 16 {times} 1
-| *128-Bit*        | 32 {times} 64 {times} 1     | 32 {times} 32 {times} 1      | 16 {times} 32 {times} 1      | 16 {times} 16 {times} 1
-|====
-
-
-Implementations that support the standard sparse image block shape for all
-formats listed in the <<sparsememory-sparseblockshapessingle>> and
-<<sparsememory-sparseblockshapesmsaa>> tables may: advertise the following
-sname:VkPhysicalDeviceSparseProperties:
-
-  * pname:residencyStandard2DBlockShape
-  * pname:residencyStandard2DMultisampleBlockShape
-  * pname:residencyStandard3DBlockShape
-
-Reporting each of these features does _not_ imply that all possible image
-types are supported as sparse.
-Instead, this indicates that no supported sparse image of the corresponding
-type will use custom sparse image block dimensions for any formats that have
-a corresponding standard sparse image block shape.
-
-
-[[sparsememory-custom-shapes]]
-=== Custom Sparse Image Block Shapes
-
-An implementation that does not support a standard image block shape for a
-particular sparse partially-resident image may: choose to support a custom
-sparse image block shape for it instead.
-The dimensions of such a custom sparse image block shape are reported in
-sname:VkSparseImageFormatProperties::pname:imageGranularity.
-As with standard sparse image block shapes, the size in bytes of the custom
-sparse image block shape will be reported in
-sname:VkMemoryRequirements::pname:alignment.
-
-Custom sparse image block dimensions are reported through
-fname:vkGetPhysicalDeviceSparseImageFormatProperties and
-fname:vkGetImageSparseMemoryRequirements.
-
-An implementation must: not support both the standard sparse image block
-shape and a custom sparse image block shape for the same image.
-The standard sparse image block shape must: be used if it is supported.
-
-
-[[sparsememory-multiaspect]]
-=== Multiple Aspects
-
-Partially resident images are allowed to report separate sparse properties
-for different aspects of the image.
-One example is for depth/stencil images where the implementation separates
-the depth and stencil data into separate planes.
-Another reason for multiple aspects is to allow the application to manage
-memory allocation for implementation-private _metadata_ associated with the
-image.
-See the figure below:
-
-image::{images}/sparseimage_multiaspect.svg[align="center",title="Multiple Aspect Sparse Image",opts="{imageopts}"]
-
-[NOTE]
-.Note
-====
-The mip tail regions are presented here in 2D arrays simply for figure size
-reasons.
-Each mip tail is logically a single array of sparse blocks with an
-implementation-dependent mapping of texels or compressed texel blocks to
-sparse blocks.
-====
-
-In the figure above the depth, stencil, and metadata aspects all have unique
-sparse properties.
-The per-texel stencil data is [eq]#{onequarter}# the size of the depth data,
-hence the stencil sparse blocks include [eq]#4 {times}# the number of
-texels.
-The sparse block size in bytes for all of the aspects is identical and
-defined by sname:VkMemoryRequirements::pname:alignment.
-
-
-==== Metadata
-
-The metadata aspect of an image has the following constraints:
-
-  * All metadata is reported in the mip tail region of the metadata aspect.
-  * All metadata must: be bound prior to device use of the sparse image.
-
-
-[[sparsememory-sparse-memory-aliasing]]
-== Sparse Memory Aliasing
-
-By default sparse resources have the same aliasing rules as non-sparse
-resources.
-See <<resources-memory-aliasing,Memory Aliasing>> for more information.
-
-sname:VkDevice objects that have the
-<<features-sparseResidencyAliased,sparseResidencyAliased>> feature enabled
-are able to use the ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT and
-ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT flags for resource creation.
-These flags allow resources to access physical memory bound into multiple
-locations within one or more sparse resources in a _data consistent_
-fashion.
-This means that reading physical memory from multiple aliased locations will
-return the same value.
-
-Care must: be taken when performing a write operation to aliased physical
-memory.
-Memory dependencies must: be used to separate writes to one alias from reads
-or writes to another alias.
-Writes to aliased memory that are not properly guarded against accesses to
-different aliases will have undefined: results for all accesses to the
-aliased memory.
-
-Applications that wish to make use of data consistent sparse memory aliasing
-must: abide by the following guidelines:
-
-  * All sparse resources that are bound to aliased physical memory must: be
-    created with the ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT /
-    ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT flag.
-  * All resources that access aliased physical memory must: interpret the
-    memory in the same way.
-    This implies the following:
-  ** Buffers and images cannot: alias the same physical memory in a data
-     consistent fashion.
-     The physical memory ranges must: be used exclusively by buffers or used
-     exclusively by images for data consistency to be guaranteed.
-  ** Memory in sparse image mip tail regions cannot: access aliased memory
-     in a data consistent fashion.
-  ** Sparse images that alias the same physical memory must: have compatible
-     formats and be using the same sparse image block shape in order to
-     access aliased memory in a data consistent fashion.
-
-Failure to follow any of the above guidelines will require the application
-to abide by the normal, non-sparse resource <<resources-memory-aliasing,
-aliasing rules>>.
-In this case memory cannot: be accessed in a data consistent fashion.
-
-[NOTE]
-.Note
-====
-Enabling sparse resource memory aliasing can: be a way to lower physical
-memory use, but it may: reduce performance on some implementations.
-An application developer can: test on their target HW and balance the memory
-/ performance trade-offs measured.
-====
-
-
-ifdef::implementation-guide[]
-== Sparse Resource Implementation Guidelines (Informative)
-
-****
-This section is Informative.
-It is included to aid in implementors`' understanding of sparse resources.
-
-.Device Virtual Address
-
-The basic pname:sparseBinding feature allows the resource to reserve its own
-device virtual address range at resource creation time rather than relying
-on a bind operation to set this.
-Without any other creation flags, no other constraints are relaxed compared
-to normal resources.
-All pages must: be bound to physical memory before the device accesses the
-resource.
-
-The <<features-sparseResidency,sparse residency>> features allow sparse
-resources to be used even when not all pages are bound to memory.
-Implementations that support access to unbound pages without causing a fault
-may: support pname:residencyNonResidentStrict.
-
-Not faulting on access to unbound pages is not enough to support
-pname:residencyNonResidentStrict.
-An implementation must: also guarantee that reads after writes to unbound
-regions of the resource always return data for the read as if the memory
-contains zeros.
-Depending on any caching hierarchy of the implementation this may: not
-always be possible.
-
-Any implementation that does not fault, but does not guarantee correct read
-values must: not support pname:residencyNonResidentStrict.
-
-Any implementation that cannot: access unbound pages without causing a fault
-will require the implementation to bind the entire device virtual address
-range to physical memory.
-Any pages that the application does not bind to memory may: be bound to one
-(or more) "`placeholder" physical page(s) allocated by the implementation.
-Given the following properties:
-
-  * A process must: not access memory from another process
-  * Reads return undefined: values
-
-It is sufficient for each host process to allocate these placeholder pages
-and use them for all resources in that process.
-Implementations may: allocate more often (per instance, per device, or per
-resource).
-
-
-.Binding Memory
-
-The byte size reported in sname:VkMemoryRequirements::pname:size must: be
-greater than or equal to the amount of physical memory required: to fully
-populate the resource.
-Some implementations require "`holes`" in the device virtual address range
-that are never accessed.
-These holes may: be included in the pname:size reported for the resource.
-
-Including or not including the device virtual address holes in the resource
-size will alter how the implementation provides support for
-sname:VkSparseImageOpaqueMemoryBindInfo.
-This operation must: be supported for all sparse images, even ones created
-with ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT.
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-@ntrevett suggested expanding the NOTE tag below to encompass everything
-from "`The cost is...`" in the first bullet point through the current note.
-TBD.
-====
-endif::editing-notes[]
-
-  * If the holes are included in the size, this bind function becomes very
-    easy.
-    In most cases the pname:resourceOffset is simply a device virtual
-    address offset and the implementation can easily determine what device
-    virtual address to bind.
-    The cost is that the application may: allocate more physical memory for
-    the resource than it needs.
-  * If the holes are not included in the size, the application can: allocate
-    less physical memory than otherwise for the resource.
-    However, in this case the implementation must: account for the holes
-    when mapping pname:resourceOffset to the actual device virtual address
-    intended to be mapped.
-
-[NOTE]
-.Note
-====
-If the application always uses sname:VkSparseImageMemoryBindInfo to bind
-memory for the non-tail mip levels, any holes that are present in the
-resource size may: never be bound.
-
-Since sname:VkSparseImageMemoryBindInfo uses texel locations to determine
-which device virtual addresses to bind, it is impossible to bind device
-virtual address holes with this operation.
-====
-
-.Binding Metadata Memory
-
-All metadata for sparse images have their own sparse properties and are
-embedded in the mip tail region for said properties.
-See the <<sparsememory-multiaspect,Multiaspect>> section for details.
-
-Given that metadata is in a mip tail region, and the mip tail region must:
-be reported as contiguous (either globally or per-array-layer), some
-implementations will have to resort to complicated offset -> device virtual
-address mapping for handling sname:VkSparseImageOpaqueMemoryBindInfo.
-
-To make this easier on the implementation, the
-ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT explicitly specifies when metadata
-is bound with sname:VkSparseImageOpaqueMemoryBindInfo.
-When this flag is not present, the pname:resourceOffset may: be treated as a
-strict device virtual address offset.
-
-When ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT is present, the
-pname:resourceOffset must: have been derived explicitly from the
-pname:imageMipTailOffset in the sparse resource properties returned for the
-metadata aspect.
-By manipulating the value returned for pname:imageMipTailOffset, the
-pname:resourceOffset does not have to correlate directly to a device virtual
-address offset, and may: instead be whatever value makes it easiest for the
-implementation to derive the correct device virtual address.
-
-****
-endif::implementation-guide[]
-
-
-[[sparsememory-resourceapi]]
-== Sparse Resource API
-
-The APIs related to sparse resources are grouped into the following
-categories:
-
-  * <<sparsememory-physicalfeatures,Physical Device Features>>
-  * <<sparsememory-physicalprops,Physical Device Sparse Properties>>
-  * <<sparsememory-format-props,Sparse Image Format Properties>>
-  * <<sparsememory-resource-creation,Sparse Resource Creation>>
-  * <<sparsememory-memory-requirements,Sparse Resource Memory Requirements>>
-  * <<sparsememory-resource-binding,Binding Resource Memory>>
-
-
-[[sparsememory-physicalfeatures]]
-=== Physical Device Features
-
-Some sparse-resource related features are reported and enabled in
-sname:VkPhysicalDeviceFeatures.
-These features must: be supported and enabled on the sname:VkDevice object
-before applications can: use them.
-See <<features,Physical Device Features>> for information on how to get and
-set enabled device features, and for more detailed explanations of these
-features.
-
-
-==== Sparse Physical Device Features
-
-  * pname:sparseBinding: Support for creating slink:VkBuffer and
-    sname:VkImage objects with the ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT
-    and ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT flags, respectively.
-  * pname:sparseResidencyBuffer: Support for creating slink:VkBuffer objects
-    with the ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT flag.
-  * pname:sparseResidencyImage2D: Support for creating 2D single-sampled
-    sname:VkImage objects with ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT.
-  * pname:sparseResidencyImage3D: Support for creating 3D slink:VkImage
-    objects with ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT.
-  * pname:sparseResidency2Samples: Support for creating 2D slink:VkImage
-    objects with 2 samples and ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT.
-  * pname:sparseResidency4Samples: Support for creating 2D slink:VkImage
-    objects with 4 samples and ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT.
-  * pname:sparseResidency8Samples: Support for creating 2D slink:VkImage
-    objects with 8 samples and ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT.
-  * pname:sparseResidency16Samples: Support for creating 2D slink:VkImage
-    objects with 16 samples and ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT.
-  * pname:sparseResidencyAliased: Support for creating slink:VkBuffer and
-    sname:VkImage objects with the ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT
-    and ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT flags, respectively.
-
-
-[[sparsememory-physicalprops]]
-=== Physical Device Sparse Properties
-
-Some features of the implementation are not possible to disable, and are
-reported to allow applications to alter their sparse resource usage
-accordingly.
-These read-only capabilities are reported in the
-slink:VkPhysicalDeviceProperties::pname:sparseProperties member, which is a
-sname:VkPhysicalDeviceSparseProperties structure.
-
-[open,refpage='VkPhysicalDeviceSparseProperties',desc='Structure specifying physical device sparse memory properties',type='structs']
---
-The sname:VkPhysicalDeviceSparseProperties structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceSparseProperties.txt[]
-
-  * pname:residencyStandard2DBlockShape is ename:VK_TRUE if the physical
-    device will access all single-sample 2D sparse resources using the
-    standard sparse image block shapes (based on image format), as described
-    in the <<sparsememory-sparseblockshapessingle,Standard Sparse Image
-    Block Shapes (Single Sample)>> table.
-    If this property is not supported the value returned in the
-    pname:imageGranularity member of the sname:VkSparseImageFormatProperties
-    structure for single-sample 2D images is not required: to match the
-    standard sparse image block dimensions listed in the table.
-  * pname:residencyStandard2DMultisampleBlockShape is ename:VK_TRUE if the
-    physical device will access all multisample 2D sparse resources using
-    the standard sparse image block shapes (based on image format), as
-    described in the <<sparsememory-sparseblockshapesmsaa,Standard Sparse
-    Image Block Shapes (MSAA)>> table.
-    If this property is not supported, the value returned in the
-    pname:imageGranularity member of the sname:VkSparseImageFormatProperties
-    structure for multisample 2D images is not required: to match the
-    standard sparse image block dimensions listed in the table.
-  * pname:residencyStandard3DBlockShape is ename:VK_TRUE if the physical
-    device will access all 3D sparse resources using the standard sparse
-    image block shapes (based on image format), as described in the
-    <<sparsememory-sparseblockshapessingle,Standard Sparse Image Block
-    Shapes (Single Sample)>> table.
-    If this property is not supported, the value returned in the
-    pname:imageGranularity member of the sname:VkSparseImageFormatProperties
-    structure for 3D images is not required: to match the standard sparse
-    image block dimensions listed in the table.
-  * pname:residencyAlignedMipSize is ename:VK_TRUE if images with mip level
-    dimensions that are not integer multiples of the corresponding
-    dimensions of the sparse image block may: be placed in the mip tail.
-    If this property is not reported, only mip levels with dimensions
-    smaller than the pname:imageGranularity member of the
-    sname:VkSparseImageFormatProperties structure will be placed in the mip
-    tail.
-    If this property is reported the implementation is allowed to return
-    ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT in the pname:flags
-    member of sname:VkSparseImageFormatProperties, indicating that mip level
-    dimensions that are not integer multiples of the corresponding
-    dimensions of the sparse image block will be placed in the mip tail.
-  * pname:residencyNonResidentStrict specifies whether the physical device
-    can: consistently access non-resident regions of a resource.
-    If this property is ename:VK_TRUE, access to non-resident regions of
-    resources will be guaranteed to return values as if the resource was
-    populated with 0; writes to non-resident regions will be discarded.
-
-include::{generated}/validity/structs/VkPhysicalDeviceSparseProperties.txt[]
---
-
-
-[[sparsememory-format-props]]
-=== Sparse Image Format Properties
-
-Given that certain aspects of sparse image support, including the sparse
-image block dimensions, may: be implementation-dependent,
-flink:vkGetPhysicalDeviceSparseImageFormatProperties can: be used to query
-for sparse image format properties prior to resource creation.
-This command is used to check whether a given set of sparse image parameters
-is supported and what the sparse image block shape will be.
-
-
-==== Sparse Image Format Properties API
-
-[open,refpage='VkSparseImageFormatProperties',desc='Structure specifying sparse image format properties',type='structs']
---
-The sname:VkSparseImageFormatProperties structure is defined as:
-
-include::{generated}/api/structs/VkSparseImageFormatProperties.txt[]
-
-  * pname:aspectMask is a bitmask elink:VkImageAspectFlagBits specifying
-    which aspects of the image the properties apply to.
-  * pname:imageGranularity is the width, height, and depth of the sparse
-    image block in texels or compressed texel blocks.
-  * pname:flags is a bitmask of elink:VkSparseImageFormatFlagBits specifying
-    additional information about the sparse resource.
-
-include::{generated}/validity/structs/VkSparseImageFormatProperties.txt[]
---
-
-[open,refpage='VkSparseImageFormatFlagBits',desc='Bitmask specifying additional information about a sparse image resource',type='enums']
---
-Bits which may: be set in slink:VkSparseImageFormatProperties::pname:flags,
-specifying additional information about the sparse resource, are:
-
-include::{generated}/api/enums/VkSparseImageFormatFlagBits.txt[]
-
-  * ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT specifies that the image
-    uses a single mip tail region for all array layers.
-  * ename:VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT specifies that the
-    first mip level whose dimensions are not integer multiples of the
-    corresponding dimensions of the sparse image block begins the mip tail
-    region.
-  * ename:VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT specifies that
-    the image uses non-standard sparse image block dimensions, and the
-    pname:imageGranularity values do not match the standard sparse image
-    block dimensions for the given format.
---
-
-[open,refpage='VkSparseImageFormatFlags',desc='Bitmask of VkSparseImageFormatFlagBits',type='flags']
---
-include::{generated}/api/flags/VkSparseImageFormatFlags.txt[]
-
-tname:VkSparseImageFormatFlags is a bitmask type for setting a mask of zero
-or more elink:VkSparseImageFormatFlagBits.
---
-
-[open,refpage='vkGetPhysicalDeviceSparseImageFormatProperties',desc='Retrieve properties of an image format applied to sparse images',type='protos']
---
-fname:vkGetPhysicalDeviceSparseImageFormatProperties returns an array of
-slink:VkSparseImageFormatProperties.
-Each element will describe properties for one set of image aspects that are
-bound simultaneously in the image.
-This is usually one element for each aspect in the image, but for
-interleaved depth/stencil images there is only one element describing the
-combined aspects.
-
-include::{generated}/api/protos/vkGetPhysicalDeviceSparseImageFormatProperties.txt[]
-
-  * pname:physicalDevice is the physical device from which to query the
-    sparse image format properties.
-  * pname:format is the image format.
-  * pname:type is the dimensionality of image.
-  * pname:samples is a elink:VkSampleCountFlagBits value specifying the
-    number of samples per texel.
-  * pname:usage is a bitmask describing the intended usage of the image.
-  * pname:tiling is the tiling arrangement of the texel blocks in memory.
-  * pname:pPropertyCount is a pointer to an integer related to the number of
-    sparse format properties available or queried, as described below.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    slink:VkSparseImageFormatProperties structures.
-
-If pname:pProperties is `NULL`, then the number of sparse format properties
-available is returned in pname:pPropertyCount.
-Otherwise, pname:pPropertyCount must: point to a variable set by the user to
-the number of elements in the pname:pProperties array, and on return the
-variable is overwritten with the number of structures actually written to
-pname:pProperties.
-If pname:pPropertyCount is less than the number of sparse format properties
-available, at most pname:pPropertyCount structures will be written.
-
-If ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT is not supported for the given
-arguments, pname:pPropertyCount will be set to zero upon return, and no data
-will be written to pname:pProperties.
-
-Multiple aspects are returned for depth/stencil images that are implemented
-as separate planes by the implementation.
-The depth and stencil data planes each have unique
-sname:VkSparseImageFormatProperties data.
-
-Depth/stencil images with depth and stencil data interleaved into a single
-plane will return a single sname:VkSparseImageFormatProperties structure
-with the pname:aspectMask set to ename:VK_IMAGE_ASPECT_DEPTH_BIT |
-ename:VK_IMAGE_ASPECT_STENCIL_BIT.
-
-.Valid Usage
-****
-  * [[VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-01094]]
-    pname:samples must: be a bit value that is set in
-    sname:VkImageFormatProperties::pname:sampleCounts returned by
-    fname:vkGetPhysicalDeviceImageFormatProperties with pname:format,
-    pname:type, pname:tiling, and pname:usage equal to those in this command
-    and pname:flags equal to the value that is set in
-    slink:VkImageCreateInfo::pname:flags when the image is created
-****
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceSparseImageFormatProperties.txt[]
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-[open,refpage='vkGetPhysicalDeviceSparseImageFormatProperties2',desc='Retrieve properties of an image format applied to sparse images',type='protos']
---
-fname:vkGetPhysicalDeviceSparseImageFormatProperties2 returns an array of
-slink:VkSparseImageFormatProperties2.
-Each element will describe properties for one set of image aspects that are
-bound simultaneously in the image.
-This is usually one element for each aspect in the image, but for
-interleaved depth/stencil images there is only one element describing the
-combined aspects.
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetPhysicalDeviceSparseImageFormatProperties2.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_get_physical_device_properties2[or the equivalent command]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-include::{generated}/api/protos/vkGetPhysicalDeviceSparseImageFormatProperties2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:physicalDevice is the physical device from which to query the
-    sparse image format properties.
-  * pname:pFormatInfo is a pointer to a
-    slink:VkPhysicalDeviceSparseImageFormatInfo2 structure containing input
-    parameters to the command.
-  * pname:pPropertyCount is a pointer to an integer related to the number of
-    sparse format properties available or queried, as described below.
-  * pname:pProperties is either `NULL` or a pointer to an array of
-    slink:VkSparseImageFormatProperties2 structures.
-
-fname:vkGetPhysicalDeviceSparseImageFormatProperties2 behaves identically to
-flink:vkGetPhysicalDeviceSparseImageFormatProperties, with the ability to
-return extended information by adding extending structures to the
-pname:pNext chain of its pname:pProperties parameter.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceSparseImageFormatProperties2.txt[]
---
-
-[open,refpage='VkPhysicalDeviceSparseImageFormatInfo2',desc='Structure specifying sparse image format inputs',type='structs']
---
-The sname:VkPhysicalDeviceSparseImageFormatInfo2 structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceSparseImageFormatInfo2.txt[]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-or the equivalent
-
-include::{generated}/api/structs/VkPhysicalDeviceSparseImageFormatInfo2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:format is the image format.
-  * pname:type is the dimensionality of image.
-  * pname:samples is a elink:VkSampleCountFlagBits value specifying the
-    number of samples per texel.
-  * pname:usage is a bitmask describing the intended usage of the image.
-  * pname:tiling is the tiling arrangement of the texel blocks in memory.
-
-.Valid Usage
-****
-  * [[VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-01095]]
-    pname:samples must: be a bit value that is set in
-    sname:VkImageFormatProperties::pname:sampleCounts returned by
-    fname:vkGetPhysicalDeviceImageFormatProperties with pname:format,
-    pname:type, pname:tiling, and pname:usage equal to those in this command
-    and pname:flags equal to the value that is set in
-    slink:VkImageCreateInfo::pname:flags when the image is created
-****
-
-include::{generated}/validity/structs/VkPhysicalDeviceSparseImageFormatInfo2.txt[]
---
-
-[open,refpage='VkSparseImageFormatProperties2',desc='Structure specifying sparse image format properties',type='structs']
---
-The sname:VkSparseImageFormatProperties2 structure is defined as:
-
-include::{generated}/api/structs/VkSparseImageFormatProperties2.txt[]
-
-ifdef::VK_KHR_get_physical_device_properties2[]
-or the equivalent
-
-include::{generated}/api/structs/VkSparseImageFormatProperties2KHR.txt[]
-endif::VK_KHR_get_physical_device_properties2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:properties is a slink:VkSparseImageFormatProperties structure
-    which is populated with the same values as in
-    flink:vkGetPhysicalDeviceSparseImageFormatProperties.
-
-include::{generated}/validity/structs/VkSparseImageFormatProperties2.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
-
-
-[[sparsememory-resource-creation]]
-=== Sparse Resource Creation
-
-Sparse resources require that one or more sparse feature flags be specified
-(as part of the sname:VkPhysicalDeviceFeatures structure described
-previously in the <<sparsememory-physicalfeatures,Physical Device Features>>
-section) when calling flink:vkCreateDevice.
-When the appropriate device features are enabled, the
-etext:VK_BUFFER_CREATE_SPARSE_* and etext:VK_IMAGE_CREATE_SPARSE_* flags
-can: be used.
-See flink:vkCreateBuffer and flink:vkCreateImage for details of the resource
-creation APIs.
-
-[NOTE]
-.Note
-====
-Specifying ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT or
-ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT requires specifying
-ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT or
-ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT, respectively, as well.
-This means that resources must: be created with the appropriate
-etext:*_SPARSE_BINDING_BIT to be used with the sparse binding command
-(fname:vkQueueBindSparse).
-====
-
-
-[[sparsememory-memory-requirements]]
-=== Sparse Resource Memory Requirements
-
-Sparse resources have specific memory requirements related to binding sparse
-memory.
-These memory requirements are reported differently for sname:VkBuffer
-objects and sname:VkImage objects.
-
-
-[[sparsememory-memory-buffer-fully-resident]]
-==== Buffer and Fully-Resident Images
-
-Buffers (both fully and partially resident) and fully-resident images can:
-be bound to memory using only the data from sname:VkMemoryRequirements.
-For all sparse resources the sname:VkMemoryRequirements::pname:alignment
-member specifies both the bindable sparse block size in bytes and required:
-alignment of sname:VkDeviceMemory.
-
-
-[[sparsememory-memory-partially-resident]]
-==== Partially Resident Images
-
-Partially resident images have a different method for binding memory.
-As with buffers and fully resident images, the
-sname:VkMemoryRequirements::pname:alignment field specifies the bindable
-sparse block size in bytes for the image.
-
-Requesting sparse memory requirements for sname:VkImage objects using
-fname:vkGetImageSparseMemoryRequirements will return an array of one or more
-sname:VkSparseImageMemoryRequirements structures.
-Each structure describes the sparse memory requirements for a group of
-aspects of the image.
-
-The sparse image must: have been created using the
-ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT flag to retrieve valid sparse
-image memory requirements.
-
-
-==== Sparse Image Memory Requirements
-
-[open,refpage='VkSparseImageMemoryRequirements',desc='Structure specifying sparse image memory requirements',type='structs']
---
-The sname:VkSparseImageMemoryRequirements structure is defined as:
-
-include::{generated}/api/structs/VkSparseImageMemoryRequirements.txt[]
-
-  * pname:formatProperties is a slink:VkSparseImageFormatProperties
-    structure specifying properties of the image format.
-  * pname:imageMipTailFirstLod is the first mip level at which image
-    subresources are included in the mip tail region.
-  * pname:imageMipTailSize is the memory size (in bytes) of the mip tail
-    region.
-    If pname:formatProperties.flags contains
-    ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT, this is the size of the
-    whole mip tail, otherwise this is the size of the mip tail of a single
-    array layer.
-    This value is guaranteed to be a multiple of the sparse block size in
-    bytes.
-  * pname:imageMipTailOffset is the opaque memory offset used with
-    slink:VkSparseImageOpaqueMemoryBindInfo to bind the mip tail region(s).
-  * pname:imageMipTailStride is the offset stride between each array-layer's
-    mip tail, if pname:formatProperties.flags does not contain
-    ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT (otherwise the value is
-    undefined:).
-
-include::{generated}/validity/structs/VkSparseImageMemoryRequirements.txt[]
---
-
-[open,refpage='vkGetImageSparseMemoryRequirements',desc='Query the memory requirements for a sparse image',type='protos']
---
-To query sparse memory requirements for an image, call:
-
-include::{generated}/api/protos/vkGetImageSparseMemoryRequirements.txt[]
-
-  * pname:device is the logical device that owns the image.
-  * pname:image is the slink:VkImage object to get the memory requirements
-    for.
-  * pname:pSparseMemoryRequirementCount is a pointer to an integer related
-    to the number of sparse memory requirements available or queried, as
-    described below.
-  * pname:pSparseMemoryRequirements is either `NULL` or a pointer to an
-    array of sname:VkSparseImageMemoryRequirements structures.
-
-If pname:pSparseMemoryRequirements is `NULL`, then the number of sparse
-memory requirements available is returned in
-pname:pSparseMemoryRequirementCount.
-Otherwise, pname:pSparseMemoryRequirementCount must: point to a variable set
-by the user to the number of elements in the pname:pSparseMemoryRequirements
-array, and on return the variable is overwritten with the number of
-structures actually written to pname:pSparseMemoryRequirements.
-If pname:pSparseMemoryRequirementCount is less than the number of sparse
-memory requirements available, at most pname:pSparseMemoryRequirementCount
-structures will be written.
-
-If the image was not created with ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-then pname:pSparseMemoryRequirementCount will be set to zero and
-pname:pSparseMemoryRequirements will not be written to.
-
-[NOTE]
-.Note
-====
-It is legal for an implementation to report a larger value in
-sname:VkMemoryRequirements::pname:size than would be obtained by adding
-together memory sizes for all sname:VkSparseImageMemoryRequirements returned
-by fname:vkGetImageSparseMemoryRequirements.
-This may: occur when the implementation requires unused padding in the
-address range describing the resource.
-====
-
-include::{generated}/validity/protos/vkGetImageSparseMemoryRequirements.txt[]
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_get_memory_requirements2[]
-[open,refpage='vkGetImageSparseMemoryRequirements2',desc='Query the memory requirements for a sparse image',type='protos']
---
-To query sparse memory requirements for an image, call:
-
-ifdef::VK_VERSION_1_1[]
-include::{generated}/api/protos/vkGetImageSparseMemoryRequirements2.txt[]
-endif::VK_VERSION_1_1[]
-
-ifdef::VK_VERSION_1_1+VK_KHR_get_memory_requirements2[or the equivalent command]
-
-ifdef::VK_KHR_get_memory_requirements2[]
-include::{generated}/api/protos/vkGetImageSparseMemoryRequirements2KHR.txt[]
-endif::VK_KHR_get_memory_requirements2[]
-
-  * pname:device is the logical device that owns the image.
-  * pname:pInfo is a pointer to a sname:VkImageSparseMemoryRequirementsInfo2
-    structure containing parameters required for the memory requirements
-    query.
-  * pname:pSparseMemoryRequirementCount is a pointer to an integer related
-    to the number of sparse memory requirements available or queried, as
-    described below.
-  * pname:pSparseMemoryRequirements is either `NULL` or a pointer to an
-    array of sname:VkSparseImageMemoryRequirements2 structures.
-
-include::{generated}/validity/protos/vkGetImageSparseMemoryRequirements2.txt[]
---
-
-ifdef::VK_KHR_maintenance4[]
-[open,refpage='vkGetDeviceImageSparseMemoryRequirementsKHR',desc='Query the memory requirements for a sparse image',type='protos']
---
-To determine the sparse memory requirements for an image resource without
-creating an object, call:
-
-include::{generated}/api/protos/vkGetDeviceImageSparseMemoryRequirementsKHR.txt[]
-
-  * pname:device is the logical device intended to own the image.
-  * pname:pInfo is a pointer to a slink:VkDeviceImageMemoryRequirementsKHR
-    structure containing parameters required for the memory requirements
-    query.
-  * pname:pSparseMemoryRequirementCount is a pointer to an integer related
-    to the number of sparse memory requirements available or queried, as
-    described below.
-  * pname:pSparseMemoryRequirements is either `NULL` or a pointer to an
-    array of sname:VkSparseImageMemoryRequirements2 structures.
-
-include::{generated}/validity/protos/vkGetDeviceImageSparseMemoryRequirementsKHR.txt[]
---
-endif::VK_KHR_maintenance4[]
-
-[open,refpage='VkImageSparseMemoryRequirementsInfo2',desc='(None)',type='structs']
---
-The sname:VkImageSparseMemoryRequirementsInfo2 structure is defined as:
-
-include::{generated}/api/structs/VkImageSparseMemoryRequirementsInfo2.txt[]
-
-ifdef::VK_KHR_get_memory_requirements2[]
-or the equivalent
-
-include::{generated}/api/structs/VkImageSparseMemoryRequirementsInfo2KHR.txt[]
-endif::VK_KHR_get_memory_requirements2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:image is the image to query.
-
-include::{generated}/validity/structs/VkImageSparseMemoryRequirementsInfo2.txt[]
---
-
-[open,refpage='VkSparseImageMemoryRequirements2',desc='(None)',type='structs']
---
-The sname:VkSparseImageMemoryRequirements2 structure is defined as:
-
-include::{generated}/api/structs/VkSparseImageMemoryRequirements2.txt[]
-
-ifdef::VK_KHR_get_memory_requirements2[]
-or the equivalent
-
-include::{generated}/api/structs/VkSparseImageMemoryRequirements2KHR.txt[]
-endif::VK_KHR_get_memory_requirements2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memoryRequirements is a slink:VkSparseImageMemoryRequirements
-    structure describing the memory requirements of the sparse image.
-
-include::{generated}/validity/structs/VkSparseImageMemoryRequirements2.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_get_memory_requirements2[]
-
-
-[[sparsememory-resource-binding]]
-=== Binding Resource Memory
-
-Non-sparse resources are backed by a single physical allocation prior to
-device use (via fname:vkBindImageMemory or fname:vkBindBufferMemory), and
-their backing must: not be changed.
-On the other hand, sparse resources can: be bound to memory non-contiguously
-and these bindings can: be altered during the lifetime of the resource.
-
-[NOTE]
-.Note
-====
-It is important to note that freeing a sname:VkDeviceMemory object with
-fname:vkFreeMemory will not cause resources (or resource regions) bound to
-the memory object to become unbound.
-Applications must: not access resources bound to memory that has been freed.
-====
-
-Sparse memory bindings execute on a queue that includes the
-ename:VK_QUEUE_SPARSE_BINDING_BIT bit.
-Applications must: use <<synchronization,synchronization primitives>> to
-guarantee that other queues do not access ranges of memory concurrently with
-a binding change.
-Applications can: access other ranges of the same resource while a bind
-operation is executing.
-
-[NOTE]
-.Note
-====
-Implementations must: provide a guarantee that simultaneously binding sparse
-blocks while another queue accesses those same sparse blocks via a sparse
-resource must: not access memory owned by another process or otherwise
-corrupt the system.
-====
-
-While some implementations may: include ename:VK_QUEUE_SPARSE_BINDING_BIT
-support in queue families that also include graphics and compute support,
-other implementations may: only expose a
-ename:VK_QUEUE_SPARSE_BINDING_BIT-only queue family.
-In either case, applications must: use <<synchronization,synchronization
-primitives>> to explicitly request any ordering dependencies between sparse
-memory binding operations and other graphics/compute/transfer operations, as
-sparse binding operations are not automatically ordered against command
-buffer execution, even within a single queue.
-
-When binding memory explicitly for the ename:VK_IMAGE_ASPECT_METADATA_BIT
-the application must: use the ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT in
-the sname:VkSparseMemoryBind::pname:flags field when binding memory.
-Binding memory for metadata is done the same way as binding memory for the
-mip tail, with the addition of the ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT
-flag.
-
-Binding the mip tail for any aspect must: only be performed using
-slink:VkSparseImageOpaqueMemoryBindInfo.
-If pname:formatProperties.flags contains
-ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT, then it can: be bound with
-a single slink:VkSparseMemoryBind structure, with pname:resourceOffset =
-pname:imageMipTailOffset and pname:size = pname:imageMipTailSize.
-
-If pname:formatProperties.flags does not contain
-ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT then the offset for the mip
-tail in each array layer is given as:
-
-[source,c++]
----------------------------------------------------
-arrayMipTailOffset = imageMipTailOffset + arrayLayer * imageMipTailStride;
----------------------------------------------------
-
-and the mip tail can: be bound with code:layerCount slink:VkSparseMemoryBind
-structures, each using pname:size = pname:imageMipTailSize and
-pname:resourceOffset = ptext:arrayMipTailOffset as defined above.
-
-Sparse memory binding is handled by the following APIs and related data
-structures.
-
-
-[[sparsemem-memory-binding]]
-==== Sparse Memory Binding Functions
-
-[open,refpage='VkSparseMemoryBind',desc='Structure specifying a sparse memory bind operation',type='structs']
---
-The sname:VkSparseMemoryBind structure is defined as:
-
-include::{generated}/api/structs/VkSparseMemoryBind.txt[]
-
-  * pname:resourceOffset is the offset into the resource.
-  * pname:size is the size of the memory region to be bound.
-  * pname:memory is the slink:VkDeviceMemory object that the range of the
-    resource is bound to.
-    If pname:memory is dlink:VK_NULL_HANDLE, the range is unbound.
-  * pname:memoryOffset is the offset into the slink:VkDeviceMemory object to
-    bind the resource range to.
-    If pname:memory is dlink:VK_NULL_HANDLE, this value is ignored.
-  * pname:flags is a bitmask of elink:VkSparseMemoryBindFlagBits specifying
-    usage of the binding operation.
-
-The _binding range_ [eq]#[pname:resourceOffset, pname:resourceOffset {plus}
-pname:size)# has different constraints based on pname:flags.
-If pname:flags contains ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the
-binding range must: be within the mip tail region of the metadata aspect.
-This metadata region is defined by:
-
-  {empty}:: [eq]#metadataRegion = [base, base {plus}
-            pname:imageMipTailSize)#
-  {empty}:: [eq]#base = pname:imageMipTailOffset {plus}
-            pname:imageMipTailStride {times} n#
-
-and pname:imageMipTailOffset, pname:imageMipTailSize, and
-pname:imageMipTailStride values are from the
-slink:VkSparseImageMemoryRequirements corresponding to the metadata aspect
-of the image, and [eq]#n# is a valid array layer index for the image,
-
-pname:imageMipTailStride is considered to be zero for aspects where
-sname:VkSparseImageMemoryRequirements::pname:formatProperties.flags contains
-ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT.
-
-If pname:flags does not contain ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT,
-the binding range must: be within the range
-[eq]#[0,slink:VkMemoryRequirements::pname:size)#.
-
-.Valid Usage
-****
-  * [[VUID-VkSparseMemoryBind-memory-01096]]
-    If pname:memory is not dlink:VK_NULL_HANDLE, pname:memory and
-    pname:memoryOffset must: match the memory requirements of the resource,
-    as described in section <<resources-association>>
-  * [[VUID-VkSparseMemoryBind-memory-01097]]
-    If pname:memory is not dlink:VK_NULL_HANDLE, pname:memory must: not have
-    been created with a memory type that reports
-    ename:VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT bit set
-  * [[VUID-VkSparseMemoryBind-size-01098]]
-    pname:size must: be greater than `0`
-  * [[VUID-VkSparseMemoryBind-resourceOffset-01099]]
-    pname:resourceOffset must: be less than the size of the resource
-  * [[VUID-VkSparseMemoryBind-size-01100]]
-    pname:size must: be less than or equal to the size of the resource minus
-    pname:resourceOffset
-  * [[VUID-VkSparseMemoryBind-memoryOffset-01101]]
-    pname:memoryOffset must: be less than the size of pname:memory
-  * [[VUID-VkSparseMemoryBind-size-01102]]
-    pname:size must: be less than or equal to the size of pname:memory minus
-    pname:memoryOffset
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * [[VUID-VkSparseMemoryBind-memory-02730]]
-    If pname:memory was created with
-    slink:VkExportMemoryAllocateInfo::pname:handleTypes not equal to `0`, at
-    least one handle type it contained must: also have been set in
-    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes or
-    slink:VkExternalMemoryImageCreateInfo::pname:handleTypes when the
-    resource was created
-  * [[VUID-VkSparseMemoryBind-memory-02731]]
-    If pname:memory was created by a memory import operation, the external
-    handle type of the imported memory must: also have been set in
-    slink:VkExternalMemoryBufferCreateInfo::pname:handleTypes or
-    slink:VkExternalMemoryImageCreateInfo::pname:handleTypes when the
-    resource was created
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-****
-
-include::{generated}/validity/structs/VkSparseMemoryBind.txt[]
---
-
-[open,refpage='VkSparseMemoryBindFlagBits',desc='Bitmask specifying usage of a sparse memory binding operation',type='enums']
---
-Bits which can: be set in slink:VkSparseMemoryBind::pname:flags, specifying
-usage of a sparse memory binding operation, are:
-
-include::{generated}/api/enums/VkSparseMemoryBindFlagBits.txt[]
-
-  * ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT specifies that the memory being
-    bound is only for the metadata aspect.
---
-
-[open,refpage='VkSparseMemoryBindFlags',desc='Bitmask of VkSparseMemoryBindFlagBits',type='flags']
---
-include::{generated}/api/flags/VkSparseMemoryBindFlags.txt[]
-
-tname:VkSparseMemoryBindFlags is a bitmask type for setting a mask of zero
-or more elink:VkSparseMemoryBindFlagBits.
---
-
-[open,refpage='VkSparseBufferMemoryBindInfo',desc='Structure specifying a sparse buffer memory bind operation',type='structs']
---
-Memory is bound to sname:VkBuffer objects created with the
-ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT flag using the following
-structure:
-
-include::{generated}/api/structs/VkSparseBufferMemoryBindInfo.txt[]
-
-  * pname:buffer is the slink:VkBuffer object to be bound.
-  * pname:bindCount is the number of slink:VkSparseMemoryBind structures in
-    the pname:pBinds array.
-  * pname:pBinds is a pointer to an array of slink:VkSparseMemoryBind
-    structures.
-
-include::{generated}/validity/structs/VkSparseBufferMemoryBindInfo.txt[]
---
-
-[open,refpage='VkSparseImageOpaqueMemoryBindInfo',desc='Structure specifying sparse image opaque memory bind information',type='structs']
---
-Memory is bound to opaque regions of sname:VkImage objects created with the
-ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT flag using the following structure:
-
-include::{generated}/api/structs/VkSparseImageOpaqueMemoryBindInfo.txt[]
-
-  * pname:image is the slink:VkImage object to be bound.
-  * pname:bindCount is the number of slink:VkSparseMemoryBind structures in
-    the pname:pBinds array.
-  * pname:pBinds is a pointer to an array of slink:VkSparseMemoryBind
-    structures.
-
-.Valid Usage
-****
-  * [[VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-01103]]
-    If the pname:flags member of any element of pname:pBinds contains
-    ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the binding range defined
-    must: be within the mip tail region of the metadata aspect of
-    pname:image
-****
-
-include::{generated}/validity/structs/VkSparseImageOpaqueMemoryBindInfo.txt[]
---
-
-[NOTE]
-.Note
-====
-This operation is normally used to bind memory to fully-resident sparse
-images or for mip tail regions of partially resident images.
-However, it can: also be used to bind memory for the entire binding range of
-partially resident images.
-
-In case pname:flags does not contain
-ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the pname:resourceOffset is in the
-range [eq]#[0, slink:VkMemoryRequirements::pname:size)#, This range includes
-data from all aspects of the image, including metadata.
-For most implementations this will probably mean that the
-pname:resourceOffset is a simple device address offset within the resource.
-It is possible for an application to bind a range of memory that includes
-both resource data and metadata.
-However, the application would not know what part of the image the memory is
-used for, or if any range is being used for metadata.
-
-When pname:flags contains ename:VK_SPARSE_MEMORY_BIND_METADATA_BIT, the
-binding range specified must: be within the mip tail region of the metadata
-aspect.
-In this case the pname:resourceOffset is not required: to be a simple device
-address offset within the resource.
-However, it _is_ defined to be within [eq]#[pname:imageMipTailOffset,
-pname:imageMipTailOffset {plus} pname:imageMipTailSize)# for the metadata
-aspect.
-See slink:VkSparseMemoryBind for the full constraints on binding region with
-this flag present.
-====
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-(Jon) The preceding NOTE refers to pname:flags, which is presumably a
-reference to slink:VkSparseMemoryBind above, even though that is not
-contextually clear.
-====
-endif::editing-notes[]
-
-[open,refpage='VkSparseImageMemoryBindInfo',desc='Structure specifying sparse image memory bind information',type='structs']
---
-Memory can: be bound to sparse image blocks of sname:VkImage objects created
-with the ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT flag using the following
-structure:
-
-include::{generated}/api/structs/VkSparseImageMemoryBindInfo.txt[]
-
-  * pname:image is the slink:VkImage object to be bound
-  * pname:bindCount is the number of slink:VkSparseImageMemoryBind
-    structures in pname:pBinds array
-  * pname:pBinds is a pointer to an array of slink:VkSparseImageMemoryBind
-    structures
-
-.Valid Usage
-****
-  * [[VUID-VkSparseImageMemoryBindInfo-subresource-01722]]
-    The pname:subresource.mipLevel member of each element of pname:pBinds
-    must: be less than the pname:mipLevels specified in
-    slink:VkImageCreateInfo when pname:image was created
-  * [[VUID-VkSparseImageMemoryBindInfo-subresource-01723]]
-    The pname:subresource.arrayLayer member of each element of pname:pBinds
-    must: be less than the pname:arrayLayers specified in
-    slink:VkImageCreateInfo when pname:image was created
-  * [[VUID-VkSparseImageMemoryBindInfo-image-02901]]
-    pname:image must: have been created with
-    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT set
-****
-
-include::{generated}/validity/structs/VkSparseImageMemoryBindInfo.txt[]
---
-
-[open,refpage='VkSparseImageMemoryBind',desc='Structure specifying sparse image memory bind',type='structs']
---
-The sname:VkSparseImageMemoryBind structure is defined as:
-
-include::{generated}/api/structs/VkSparseImageMemoryBind.txt[]
-
-  * pname:subresource is the image _aspect_ and region of interest in the
-    image.
-  * pname:offset are the coordinates of the first texel within the image
-    subresource to bind.
-  * pname:extent is the size in texels of the region within the image
-    subresource to bind.
-    The extent must: be a multiple of the sparse image block dimensions,
-    except when binding sparse image blocks along the edge of an image
-    subresource it can: instead be such that any coordinate of
-    [eq]#pname:offset {plus} pname:extent# equals the corresponding
-    dimensions of the image subresource.
-  * pname:memory is the slink:VkDeviceMemory object that the sparse image
-    blocks of the image are bound to.
-    If pname:memory is dlink:VK_NULL_HANDLE, the sparse image blocks are
-    unbound.
-  * pname:memoryOffset is an offset into slink:VkDeviceMemory object.
-    If pname:memory is dlink:VK_NULL_HANDLE, this value is ignored.
-  * pname:flags are sparse memory binding flags.
-
-.Valid Usage
-****
-  * [[VUID-VkSparseImageMemoryBind-memory-01104]]
-    If the <<features-sparseResidencyAliased,sparse aliased residency>>
-    feature is not enabled, and if any other resources are bound to ranges
-    of pname:memory, the range of pname:memory being bound must: not overlap
-    with those bound ranges
-  * [[VUID-VkSparseImageMemoryBind-memory-01105]]
-    pname:memory and pname:memoryOffset must: match the memory requirements
-    of the calling command's pname:image, as described in section
-    <<resources-association>>
-  * [[VUID-VkSparseImageMemoryBind-subresource-01106]]
-    pname:subresource must: be a valid image subresource for pname:image
-    (see <<resources-image-views>>)
-  * [[VUID-VkSparseImageMemoryBind-offset-01107]]
-    pname:offset.x must: be a multiple of the sparse image block width
-    (sname:VkSparseImageFormatProperties::pname:imageGranularity.width) of
-    the image
-  * [[VUID-VkSparseImageMemoryBind-extent-01108]]
-    pname:extent.width must: either be a multiple of the sparse image block
-    width of the image, or else [eq]#(pname:extent.width {plus}
-    pname:offset.x)# must: equal the width of the image subresource
-  * [[VUID-VkSparseImageMemoryBind-offset-01109]]
-    pname:offset.y must: be a multiple of the sparse image block height
-    (sname:VkSparseImageFormatProperties::pname:imageGranularity.height) of
-    the image
-  * [[VUID-VkSparseImageMemoryBind-extent-01110]]
-    pname:extent.height must: either be a multiple of the sparse image block
-    height of the image, or else [eq]#(pname:extent.height {plus}
-    pname:offset.y)# must: equal the height of the image subresource
-  * [[VUID-VkSparseImageMemoryBind-offset-01111]]
-    pname:offset.z must: be a multiple of the sparse image block depth
-    (sname:VkSparseImageFormatProperties::pname:imageGranularity.depth) of
-    the image
-  * [[VUID-VkSparseImageMemoryBind-extent-01112]]
-    pname:extent.depth must: either be a multiple of the sparse image block
-    depth of the image, or else [eq]#(pname:extent.depth {plus}
-    pname:offset.z)# must: equal the depth of the image subresource
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * [[VUID-VkSparseImageMemoryBind-memory-02732]]
-    If pname:memory was created with
-    slink:VkExportMemoryAllocateInfo::pname:handleTypes not equal to `0`, at
-    least one handle type it contained must: also have been set in
-    slink:VkExternalMemoryImageCreateInfo::pname:handleTypes when the image
-    was created
-  * [[VUID-VkSparseImageMemoryBind-memory-02733]]
-    If pname:memory was created by a memory import operation, the external
-    handle type of the imported memory must: also have been set in
-    slink:VkExternalMemoryImageCreateInfo::pname:handleTypes when
-    pname:image was created
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-****
-
-include::{generated}/validity/structs/VkSparseImageMemoryBind.txt[]
---
-
-[open,refpage='vkQueueBindSparse',desc='Bind device memory to a sparse resource object',type='protos']
---
-To submit sparse binding operations to a queue, call:
-
-include::{generated}/api/protos/vkQueueBindSparse.txt[]
-
-  * pname:queue is the queue that the sparse binding operations will be
-    submitted to.
-  * pname:bindInfoCount is the number of elements in the pname:pBindInfo
-    array.
-  * pname:pBindInfo is a pointer to an array of slink:VkBindSparseInfo
-    structures, each specifying a sparse binding submission batch.
-  * pname:fence is an optional: handle to a fence to be signaled.
-    If pname:fence is not dlink:VK_NULL_HANDLE, it defines a
-    <<synchronization-fences-signaling, fence signal operation>>.
-
-fname:vkQueueBindSparse is a <<devsandqueues-submission,queue submission
-command>>, with each batch defined by an element of pname:pBindInfo as a
-slink:VkBindSparseInfo structure.
-Batches begin execution in the order they appear in pname:pBindInfo, but
-may: complete out of order.
-
-Within a batch, a given range of a resource must: not be bound more than
-once.
-Across batches, if a range is to be bound to one allocation and offset and
-then to another allocation and offset, then the application must: guarantee
-(usually using semaphores) that the binding operations are executed in the
-correct order, as well as to order binding operations against the execution
-of command buffer submissions.
-
-As no operation to flink:vkQueueBindSparse causes any pipeline stage to
-access memory, synchronization primitives used in this command effectively
-only define execution dependencies.
-
-Additional information about fence and semaphore operation is described in
-<<synchronization, the synchronization chapter>>.
-
-.Valid Usage
-****
-  * [[VUID-vkQueueBindSparse-fence-01113]]
-    If pname:fence is not dlink:VK_NULL_HANDLE, pname:fence must: be
-    unsignaled
-  * [[VUID-vkQueueBindSparse-fence-01114]]
-    If pname:fence is not dlink:VK_NULL_HANDLE, pname:fence must: not be
-    associated with any other queue command that has not yet completed
-    execution on that queue
-  * [[VUID-vkQueueBindSparse-pSignalSemaphores-01115]]
-    Each element of the pname:pSignalSemaphores member of each element of
-    pname:pBindInfo must: be unsignaled when the semaphore signal operation
-    it defines is executed on the device
-  * [[VUID-vkQueueBindSparse-pWaitSemaphores-01116]]
-    When a semaphore wait operation referring to a binary semaphore defined
-    by any element of the pname:pWaitSemaphores member of any element of
-    pname:pBindInfo executes on pname:queue, there must: be no other queues
-    waiting on the same semaphore
-  * [[VUID-vkQueueBindSparse-pWaitSemaphores-01117]]
-    All elements of the pname:pWaitSemaphores member of all elements of the
-    pname:pBindInfo parameter referring to a binary semaphore must: be
-    semaphores that are signaled, or have
-    <<synchronization-semaphores-signaling, semaphore signal operations>>
-    previously submitted for execution
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-  * [[VUID-vkQueueBindSparse-pWaitSemaphores-03245]]
-    All elements of the pname:pWaitSemaphores member of all elements of
-    pname:pBindInfo created with a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_BINARY must: reference a semaphore signal
-    operation that has been submitted for execution and any semaphore signal
-    operations on which it depends (if any) must: have also been submitted
-    for execution
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-****
-
-include::{generated}/validity/protos/vkQueueBindSparse.txt[]
---
-
-[open,refpage='VkBindSparseInfo',desc='Structure specifying a sparse binding operation',type='structs']
---
-The sname:VkBindSparseInfo structure is defined as:
-
-include::{generated}/api/structs/VkBindSparseInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:waitSemaphoreCount is the number of semaphores upon which to wait
-    before executing the sparse binding operations for the batch.
-  * pname:pWaitSemaphores is a pointer to an array of semaphores upon which
-    to wait on before the sparse binding operations for this batch begin
-    execution.
-    If semaphores to wait on are provided, they define a
-    <<synchronization-semaphores-waiting, semaphore wait operation>>.
-  * pname:bufferBindCount is the number of sparse buffer bindings to perform
-    in the batch.
-  * pname:pBufferBinds is a pointer to an array of
-    slink:VkSparseBufferMemoryBindInfo structures.
-  * pname:imageOpaqueBindCount is the number of opaque sparse image bindings
-    to perform.
-  * pname:pImageOpaqueBinds is a pointer to an array of
-    slink:VkSparseImageOpaqueMemoryBindInfo structures, indicating opaque
-    sparse image bindings to perform.
-  * pname:imageBindCount is the number of sparse image bindings to perform.
-  * pname:pImageBinds is a pointer to an array of
-    slink:VkSparseImageMemoryBindInfo structures, indicating sparse image
-    bindings to perform.
-  * pname:signalSemaphoreCount is the number of semaphores to be signaled
-    once the sparse binding operations specified by the structure have
-    completed execution.
-  * pname:pSignalSemaphores is a pointer to an array of semaphores which
-    will be signaled when the sparse binding operations for this batch have
-    completed execution.
-    If semaphores to be signaled are provided, they define a
-    <<synchronization-semaphores-signaling, semaphore signal operation>>.
-
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-.Valid Usage
-****
-  * [[VUID-VkBindSparseInfo-pWaitSemaphores-03246]]
-    If any element of pname:pWaitSemaphores or pname:pSignalSemaphores was
-    created with a elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE
-    then the pname:pNext chain must: include a
-    slink:VkTimelineSemaphoreSubmitInfo structure
-  * [[VUID-VkBindSparseInfo-pNext-03247]]
-    If the pname:pNext chain of this structure includes a
-    slink:VkTimelineSemaphoreSubmitInfo structure and any element of
-    pname:pWaitSemaphores was created with a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_TIMELINE then its pname:waitSemaphoreValueCount
-    member must: equal pname:waitSemaphoreCount
-  * [[VUID-VkBindSparseInfo-pNext-03248]]
-    If the pname:pNext chain of this structure includes a
-    slink:VkTimelineSemaphoreSubmitInfo structure and any element of
-    pname:pSignalSemaphores was created with a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_TIMELINE then its
-    pname:signalSemaphoreValueCount member must: equal
-    pname:signalSemaphoreCount
-  * [[VUID-VkBindSparseInfo-pSignalSemaphores-03249]]
-    For each element of pname:pSignalSemaphores created with a
-    elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE the
-    corresponding element of
-    slink:VkTimelineSemaphoreSubmitInfo::pname:pSignalSemaphoreValues must:
-    have a value greater than the current value of the semaphore when the
-    <<synchronization-semaphores-signaling,semaphore signal operation>> is
-    executed
-  * [[VUID-VkBindSparseInfo-pWaitSemaphores-03250]]
-    For each element of pname:pWaitSemaphores created with a
-    elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE the
-    corresponding element of
-    slink:VkTimelineSemaphoreSubmitInfo::pname:pWaitSemaphoreValues must:
-    have a value which does not differ from the current value of the
-    semaphore or from the value of any outstanding semaphore wait or signal
-    operation on that semaphore by more than
-    <<limits-maxTimelineSemaphoreValueDifference,
-    pname:maxTimelineSemaphoreValueDifference>>
-  * [[VUID-VkBindSparseInfo-pSignalSemaphores-03251]]
-    For each element of pname:pSignalSemaphores created with a
-    elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE the
-    corresponding element of
-    slink:VkTimelineSemaphoreSubmitInfo::pname:pSignalSemaphoreValues must:
-    have a value which does not differ from the current value of the
-    semaphore or from the value of any outstanding semaphore wait or signal
-    operation on that semaphore by more than
-    <<limits-maxTimelineSemaphoreValueDifference,
-    pname:maxTimelineSemaphoreValueDifference>>
-****
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-include::{generated}/validity/structs/VkBindSparseInfo.txt[]
---
-
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-To specify the values to use when waiting for and signaling semaphores
-created with a elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE,
-add a slink:VkTimelineSemaphoreSubmitInfo structure to the pname:pNext chain
-of the slink:VkBindSparseInfo structure.
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[open,refpage='VkDeviceGroupBindSparseInfo',desc='Structure indicating which instances are bound',type='structs']
---
-If the pname:pNext chain of slink:VkBindSparseInfo includes a
-sname:VkDeviceGroupBindSparseInfo structure, then that structure includes
-device indices specifying which instance of the resources and memory are
-bound.
-
-The sname:VkDeviceGroupBindSparseInfo structure is defined as:
-
-include::{generated}/api/structs/VkDeviceGroupBindSparseInfo.txt[]
-
-ifdef::VK_KHR_device_group[]
-or the equivalent
-
-include::{generated}/api/structs/VkDeviceGroupBindSparseInfoKHR.txt[]
-endif::VK_KHR_device_group[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:resourceDeviceIndex is a device index indicating which instance of
-    the resource is bound.
-  * pname:memoryDeviceIndex is a device index indicating which instance of
-    the memory the resource instance is bound to.
-
-These device indices apply to all buffer and image memory binds included in
-the batch pointing to this structure.
-The semaphore waits and signals for the batch are executed only by the
-physical device specified by the pname:resourceDeviceIndex.
-
-If this structure is not present, pname:resourceDeviceIndex and
-pname:memoryDeviceIndex are assumed to be zero.
-
-.Valid Usage
-****
-  * [[VUID-VkDeviceGroupBindSparseInfo-resourceDeviceIndex-01118]]
-    pname:resourceDeviceIndex and pname:memoryDeviceIndex must: both be
-    valid device indices
-  * [[VUID-VkDeviceGroupBindSparseInfo-memoryDeviceIndex-01119]]
-    Each memory allocation bound in this batch must: have allocated an
-    instance for pname:memoryDeviceIndex
-****
-
-include::{generated}/validity/structs/VkDeviceGroupBindSparseInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
diff --git a/registry/vulkan/chapters/synchronization.txt b/registry/vulkan/chapters/synchronization.txt
deleted file mode 100644
index 0f316f8..0000000
--- a/registry/vulkan/chapters/synchronization.txt
+++ /dev/null
@@ -1,6534 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[synchronization]]
-= Synchronization and Cache Control
-
-Synchronization of access to resources is primarily the responsibility of
-the application in Vulkan.
-The order of execution of commands with respect to the host and other
-commands on the device has few implicit guarantees, and needs to be
-explicitly specified.
-Memory caches and other optimizations are also explicitly managed, requiring
-that the flow of data through the system is largely under application
-control.
-
-Whilst some implicit guarantees exist between commands, five explicit
-synchronization mechanisms are exposed by Vulkan:
-
-<<synchronization-fences,Fences>>::
-    Fences can: be used to communicate to the host that execution of some
-    task on the device has completed.
-
-<<synchronization-semaphores,Semaphores>>::
-    Semaphores can: be used to control resource access across multiple
-    queues.
-
-<<synchronization-events,Events>>::
-    Events provide a fine-grained synchronization primitive which can: be
-    signaled either within a command buffer or by the host, and can: be
-    waited upon within a command buffer or queried on the host.
-
-<<synchronization-pipeline-barriers,Pipeline Barriers>>::
-    Pipeline barriers also provide synchronization control within a command
-    buffer, but at a single point, rather than with separate signal and wait
-    operations.
-
-<<renderpass,Render Passes>>::
-    Render passes provide a useful synchronization framework for most
-    rendering tasks, built upon the concepts in this chapter.
-    Many cases that would otherwise need an application to use other
-    synchronization primitives can: be expressed more efficiently as part of
-    a render pass.
-
-
-[[synchronization-dependencies]]
-== Execution and Memory Dependencies
-
-An _operation_ is an arbitrary amount of work to be executed on the host, a
-device, or an external entity such as a presentation engine.
-Synchronization commands introduce explicit _execution dependencies_, and
-_memory dependencies_ between two sets of operations defined by the
-command's two _synchronization scopes_.
-
-[[synchronization-dependencies-scopes]]
-The synchronization scopes define which other operations a synchronization
-command is able to create execution dependencies with.
-Any type of operation that is not in a synchronization command's
-synchronization scopes will not be included in the resulting dependency.
-For example, for many synchronization commands, the synchronization scopes
-can: be limited to just operations executing in specific
-<<synchronization-pipeline-stages,pipeline stages>>, which allows other
-pipeline stages to be excluded from a dependency.
-Other scoping options are possible, depending on the particular command.
-
-[[synchronization-dependencies-execution]]
-An _execution dependency_ is a guarantee that for two sets of operations,
-the first set must: _happen-before_ the second set.
-If an operation happens-before another operation, then the first operation
-must: complete before the second operation is initiated.
-More precisely:
-
-  * Let *A* and *B* be separate sets of operations.
-  * Let *S* be a synchronization command.
-  * Let *A~S~* and *B~S~* be the synchronization scopes of *S*.
-  * Let *A'* be the intersection of sets *A* and *A~S~*.
-  * Let *B'* be the intersection of sets *B* and *B~S~*.
-  * Submitting *A*, *S* and *B* for execution, in that order, will result in
-    execution dependency *E* between *A'* and *B'*.
-  * Execution dependency *E* guarantees that *A'* happens-before *B'*.
-
-[[synchronization-dependencies-chains]]
-An _execution dependency chain_ is a sequence of execution dependencies that
-form a happens-before relation between the first dependency's *A'* and the
-final dependency's *B'*.
-For each consecutive pair of execution dependencies, a chain exists if the
-intersection of *B~S~* in the first dependency and *A~S~* in the second
-dependency is not an empty set.
-The formation of a single execution dependency from an execution dependency
-chain can be described by substituting the following in the description of
-execution dependencies:
-
-  * Let *S* be a set of synchronization commands that generate an execution
-    dependency chain.
-  * Let *A~S~* be the first synchronization scope of the first command in
-    *S*.
-  * Let *B~S~* be the second synchronization scope of the last command in
-    *S*.
-
-Execution dependencies alone are not sufficient to guarantee that values
-resulting from writes in one set of operations can: be read from another set
-of operations.
-
-[[synchronization-dependencies-available-and-visible]]
-Three additional types of operations are used to control memory access.
-_Availability operations_ cause the values generated by specified memory
-write accesses to become _available_ to a memory domain for future access.
-Any available value remains available until a subsequent write to the same
-memory location occurs (whether it is made available or not) or the memory
-is freed.
-_Memory domain operations_ cause writes that are available to a source
-memory domain to become available to a destination memory domain (an example
-of this is making writes available to the host domain available to the
-device domain).
-_Visibility operations_ cause values available to a memory domain to become
-_visible_ to specified memory accesses.
-
-ifdef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-Availability, visibility, memory domains, and memory domain operations are
-formally defined in the <<memory-model-availability-visibility,Availability
-and Visibility>> section of the <<memory-model,Memory Model>> chapter.
-Which API operations perform each of these operations is defined in
-<<memory-model-vulkan-availability-visibility,Availability, Visibility, and
-Domain Operations>>.
-endif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-
-[[synchronization-dependencies-memory]]
-A _memory dependency_ is an execution dependency which includes availability
-and visibility operations such that:
-
-  * The first set of operations happens-before the availability operation.
-  * The availability operation happens-before the visibility operation.
-  * The visibility operation happens-before the second set of operations.
-
-Once written values are made visible to a particular type of memory access,
-they can: be read or written by that type of memory access.
-Most synchronization commands in Vulkan define a memory dependency.
-
-[[synchronization-dependencies-access-scopes]]
-The specific memory accesses that are made available and visible are defined
-by the _access scopes_ of a memory dependency.
-Any type of access that is in a memory dependency's first access scope and
-occurs in *A'* is made available.
-Any type of access that is in a memory dependency's second access scope and
-occurs in *B'* has any available writes made visible to it.
-Any type of operation that is not in a synchronization command's access
-scopes will not be included in the resulting dependency.
-
-A memory dependency enforces availability and visibility of memory accesses
-and execution order between two sets of operations.
-Adding to the description of <<synchronization-dependencies-chains,
-execution dependency chains>>:
-
-  * Let *a* be the set of memory accesses performed by *A'*.
-  * Let *b* be the set of memory accesses performed by *B'*.
-  * Let *a~S~* be the first access scope of the first command in *S*.
-  * Let *b~S~* be the second access scope of the last command in *S*.
-  * Let *a'* be the intersection of sets *a* and *a~S~*.
-  * Let *b'* be the intersection of sets *b* and *b~S~*.
-  * Submitting *A*, *S* and *B* for execution, in that order, will result in
-    a memory dependency *m* between *A'* and *B'*.
-  * Memory dependency *m* guarantees that:
-  ** Memory writes in *a'* are made available.
-  ** Available memory writes, including those from *a'*, are made visible to
-     *b'*.
-
-[NOTE]
-.Note
-====
-Execution and memory dependencies are used to solve data hazards, i.e. to
-ensure that read and write operations occur in a well-defined order.
-Write-after-read hazards can be solved with just an execution dependency,
-but read-after-write and write-after-write hazards need appropriate memory
-dependencies to be included between them.
-If an application does not include dependencies to solve these hazards, the
-results and execution orders of memory accesses are undefined:.
-====
-
-
-[[synchronization-image-layout-transitions]]
-=== Image Layout Transitions
-
-Image subresources can: be transitioned from one <<resources-image-layouts,
-layout>> to another as part of a <<synchronization-dependencies-memory,
-memory dependency>> (e.g. by using an
-<<synchronization-image-memory-barriers,image memory barrier>>).
-When a layout transition is specified in a memory dependency, it
-happens-after the availability operations in the memory dependency, and
-happens-before the visibility operations.
-Image layout transitions may: perform read and write accesses on all memory
-bound to the image subresource range, so applications must: ensure that all
-memory writes have been made
-<<synchronization-dependencies-available-and-visible, available>> before a
-layout transition is executed.
-Available memory is automatically made visible to a layout transition, and
-writes performed by a layout transition are automatically made available.
-
-Layout transitions always apply to a particular image subresource range, and
-specify both an old layout and new layout.
-The old layout must: either be ename:VK_IMAGE_LAYOUT_UNDEFINED, or match the
-current layout of the image subresource range.
-If the old layout matches the current layout of the image subresource range,
-the transition preserves the contents of that range.
-If the old layout is ename:VK_IMAGE_LAYOUT_UNDEFINED, the contents of that
-range may: be discarded.
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-As image layout transitions may: perform read and write accesses on the
-memory bound to the image, if the image subresource affected by the layout
-transition is bound to peer memory for any device in the current device mask
-then the memory heap the bound memory comes from must: support the
-ename:VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT and
-ename:VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT capabilities as returned by
-flink:vkGetDeviceGroupPeerMemoryFeatures.
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-[NOTE]
-.Note
-====
-Applications must: ensure that layout transitions happen-after all
-operations accessing the image with the old layout, and happen-before any
-operations that will access the image with the new layout.
-Layout transitions are potentially read/write operations, so not defining
-appropriate memory dependencies to guarantee this will result in a data
-race.
-====
-
-Image layout transitions interact with <<resources-memory-aliasing,memory
-aliasing>>.
-
-
-[[synchronization-image-barrier-layout-transition-order]]
-Layout transitions that are performed via image memory barriers execute in
-their entirety in <<synchronization-submission-order, submission order>>,
-relative to other image layout transitions submitted to the same queue,
-including those performed by <<renderpass, render passes>>.
-In effect there is an implicit execution dependency from each such layout
-transition to all layout transitions previously submitted to the same queue.
-
-ifdef::VK_EXT_sample_locations[]
-
-The image layout of each image subresource of a depth/stencil image created
-with ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT is
-dependent on the last sample locations used to render to the image
-subresource as a depth/stencil attachment, thus when the pname:image member
-of an <<synchronization-image-memory-barriers, image memory barrier>> is an
-image created with this flag the application can: chain a
-slink:VkSampleLocationsInfoEXT structure to the pname:pNext chain of
-ifdef::VK_KHR_synchronization2[]
-slink:VkImageMemoryBarrier2KHR or
-endif::VK_KHR_synchronization2[]
-slink:VkImageMemoryBarrier to specify the sample locations to use during any
-image layout transition.
-
-If the sname:VkSampleLocationsInfoEXT structure does not match the sample
-location state last used to render to the image subresource range specified
-by pname:subresourceRange, or if no sname:VkSampleLocationsInfoEXT structure
-is present, then the contents of the given image subresource range becomes
-undefined: as if pname:oldLayout would equal
-ename:VK_IMAGE_LAYOUT_UNDEFINED.
-
-endif::VK_EXT_sample_locations[]
-
-
-[[synchronization-pipeline-stages]]
-=== Pipeline Stages
-
-The work performed by an <<fundamentals-queueoperation-command-types, action
-or synchronization command>> consists of multiple operations, which are
-performed as a sequence of logically independent steps known as _pipeline
-stages_.
-The exact pipeline stages executed depend on the particular command that is
-used, and current command buffer state when the command was recorded.
-<<drawing,Drawing commands>>, <<dispatch,dispatching commands>>,
-<<copies,copy commands>>, <<clears,clear commands>>, and <<synchronization,
-synchronization commands>> all execute in different sets of
-<<VkPipelineStageFlagBits,pipeline stages>>.
-<<synchronization, Synchronization commands>> do not execute in a defined
-pipeline stage.
-
-[NOTE]
-.Note
-====
-Operations performed by synchronization commands (e.g.
-<<synchronization-dependencies-available-and-visible, availability and
-visibility operations>>) are not executed by a defined pipeline stage.
-However other commands can still synchronize with them by using the
-<<synchronization-dependencies-scopes, synchronization scopes>> to create a
-<<synchronization-dependencies-chains, dependency chain>>.
-====
-
-Execution of operations across pipeline stages must: adhere to
-<<synchronization-implicit, implicit ordering guarantees>>, particularly
-including <<synchronization-pipeline-stages-order, pipeline stage order>>.
-Otherwise, execution across pipeline stages may: overlap or execute out of
-order with regards to other stages, unless otherwise enforced by an
-execution dependency.
-
-Several of the synchronization commands include pipeline stage parameters,
-restricting the <<synchronization-dependencies-scopes, synchronization
-scopes>> for that command to just those stages.
-This allows fine grained control over the exact execution dependencies and
-accesses performed by action commands.
-Implementations should: use these pipeline stages to avoid unnecessary
-stalls or cache flushing.
-
-ifdef::VK_KHR_synchronization2[]
-[open,refpage='VkPipelineStageFlagBits2KHR',desc='Pipeline stage flags for VkPipelineStageFlags2KHR',type='enums']
---
-Bits which can: be set in a tlink:VkPipelineStageFlags2KHR mask, specifying
-stages of execution, are:
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-The many places pipeline stage flags are used are not currently listed here.
-====
-endif::editing-notes[]
-
-include::{generated}/api/enums/VkPipelineStageFlagBits2KHR.txt[]
-
-  * ename:VK_PIPELINE_STAGE_2_NONE_KHR specifies no stages of execution.
-  * ename:VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR specifies the stage of
-    the pipeline where indirect command parameters are consumed.
-ifdef::VK_NV_device_generated_commands[]
-    This stage also includes reading commands written by
-    flink:vkCmdPreprocessGeneratedCommandsNV.
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_NV_mesh_shader[]
-  * ename:VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV specifies the task shader
-    stage.
-  * ename:VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV specifies the mesh shader
-    stage.
-endif::VK_NV_mesh_shader[]
-  * ename:VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR specifies the stage of the
-    pipeline where index buffers are consumed.
-  * ename:VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR specifies the
-    stage of the pipeline where vertex buffers are consumed.
-  * ename:VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR is equivalent to the
-    logical OR of:
-  ** ename:VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR
-  * ename:VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR specifies the vertex
-    shader stage.
-  * ename:VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR specifies
-    the tessellation control shader stage.
-  * ename:VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR
-    specifies the tessellation evaluation shader stage.
-  * ename:VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR specifies the geometry
-    shader stage.
-  * ename:VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR is
-    equivalent to specifying all supported
-    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-    stages>>:
-  ** ename:VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR
-ifdef::VK_NV_mesh_shader[]
-  ** ename:VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV
-  ** ename:VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV
-endif::VK_NV_mesh_shader[]
-  * ename:VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR specifies the fragment
-    shader stage.
-  * ename:VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR specifies the
-    stage of the pipeline where early fragment tests (depth and stencil
-    tests before fragment shading) are performed.
-    This stage also includes <<renderpass-load-store-ops, subpass load
-    operations>> for framebuffer attachments with a depth/stencil format.
-  * ename:VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR specifies the
-    stage of the pipeline where late fragment tests (depth and stencil tests
-    after fragment shading) are performed.
-    This stage also includes <<renderpass-load-store-ops, subpass store
-    operations>> for framebuffer attachments with a depth/stencil format.
-  * ename:VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR specifies the
-    stage of the pipeline after blending where the final color values are
-    output from the pipeline.
-    This stage also includes <<renderpass-load-store-ops, subpass load and
-    store operations>> and multisample resolve operations for framebuffer
-    attachments with a color
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    or depth/stencil
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    format.
-  * ename:VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR specifies the compute
-    shader stage.
-  * ename:VK_PIPELINE_STAGE_2_HOST_BIT_KHR specifies a pseudo-stage
-    indicating execution on the host of reads/writes of device memory.
-    This stage is not invoked by any commands recorded in a command buffer.
-  * ename:VK_PIPELINE_STAGE_2_COPY_BIT_KHR specifies the execution of all
-    <<copies,copy commands>>, including flink:vkCmdCopyQueryPoolResults.
-  * ename:VK_PIPELINE_STAGE_2_BLIT_BIT_KHR specifies the execution of
-    flink:vkCmdBlitImage.
-  * ename:VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR specifies the execution of
-    flink:vkCmdResolveImage.
-  * ename:VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR specifies the execution of
-    <<clears,clear commands>>, with the exception of
-    flink:vkCmdClearAttachments.
-  * ename:VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR is equivalent to
-    specifying all of:
-  ** ename:VK_PIPELINE_STAGE_2_COPY_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_BLIT_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR
-ifdef::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-  * ename:VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR specifies the
-    execution of the ray tracing shader stages.
-endif::VK_KHR_ray_tracing_pipeline,VK_NV_ray_tracing[]
-ifdef::VK_KHR_acceleration_structure,VK_NV_ray_tracing[]
-  * ename:VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR specifies
-    the execution of <<acceleration-structure, acceleration structure
-    commands>>.
-endif::VK_KHR_acceleration_structure,VK_NV_ray_tracing[]
-  * ename:VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR specifies the execution
-    of all graphics pipeline stages, and is equivalent to the logical OR of:
-  ** ename:VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR
-ifdef::VK_NV_mesh_shader[]
-  ** ename:VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV
-  ** ename:VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV
-endif::VK_NV_mesh_shader[]
-  ** ename:VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR
-  ** ename:VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR
-ifdef::VK_EXT_conditional_rendering[]
-  ** ename:VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_transform_feedback[]
-  ** ename:VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_shading_rate_image[]
-  ** ename:VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV
-endif::VK_NV_shading_rate_image[]
-ifdef::VK_EXT_fragment_density_map[]
-  ** ename:VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_HUAWEI_invocation_mask[]
-  ** ename:VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI
-endif::VK_HUAWEI_invocation_mask[]
-  * ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR specifies all operations
-    performed by all commands supported on the queue it is used with.
-ifdef::VK_EXT_conditional_rendering[]
-  * ename:VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT specifies the
-    stage of the pipeline where the predicate of conditional rendering is
-    consumed.
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_transform_feedback[]
-  * ename:VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT specifies the stage
-    of the pipeline where vertex attribute output values are written to the
-    transform feedback buffers.
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_device_generated_commands[]
-  * ename:VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV specifies the stage
-    of the pipeline where device-side generation of commands via
-    flink:vkCmdPreprocessGeneratedCommandsNV is handled.
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  * ename:VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-    specifies the stage of the pipeline where the
-ifdef::VK_KHR_fragment_shading_rate[]
-    <<primsrast-fragment-shading-rate-attachment, fragment shading rate
-    attachment>>
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_KHR_fragment_shading_rate+VK_NV_shading_rate_image[or]
-ifdef::VK_NV_shading_rate_image[]
-    <<primsrast-shading-rate-image, shading rate image>>
-endif::VK_NV_shading_rate_image[]
-    is read to determine the fragment shading rate for portions of a
-    rasterized primitive.
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-ifdef::VK_EXT_fragment_density_map[]
-  * ename:VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT specifies the
-    stage of the pipeline where the fragment density map is read to
-    <<fragmentdensitymapops,generate the fragment areas>>.
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_HUAWEI_invocation_mask[]
-  * ename:VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI specifies the stage
-    of the pipeline where the invocation mask image is read by the
-    implementation to optimize the ray dispatch.
-endif::VK_HUAWEI_invocation_mask[]
-ifdef::VK_KHR_video_decode_queue[]
-  * ename:VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR specifies the stage of
-    the pipeline where <<video-decode-operations, video decode operation>>
-    are performed.
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-  * ename:VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR specifies the stage of
-    the pipeline where <<video-encode-operations, video encode operation>>
-    are performed.
-endif::VK_KHR_video_encode_queue[]
-ifdef::VK_HUAWEI_subpass_shading[]
-  * ename:VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI specifies the
-    subpass shading shader stage.
-endif::VK_HUAWEI_subpass_shading[]
-  * ename:VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR is equivalent to
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR with
-    tlink:VkAccessFlags2KHR set to `0` when specified in the second
-    synchronization scope, but equivalent to
-    ename:VK_PIPELINE_STAGE_2_NONE_KHR in the first scope.
-  * ename:VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR is equivalent to
-    ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR with
-    tlink:VkAccessFlags2KHR set to `0` when specified in the first
-    synchronization scope, but equivalent to
-    ename:VK_PIPELINE_STAGE_2_NONE_KHR in the second scope.
-
-[NOTE]
-.Note
-====
-The etext:TOP and etext:BOTTOM pipeline stages are deprecated, and
-applications should prefer ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR
-and ename:VK_PIPELINE_STAGE_2_NONE_KHR.
-====
-
-[NOTE]
-.Note
-====
-The tname:VkPipelineStageFlags2KHR bitmask goes beyond the 31 individual bit
-flags allowable within a C99 enum, which is how
-elink:VkPipelineStageFlagBits is defined.
-The first 31 values are common to both, and are interchangeable.
-====
---
-
-[open,refpage='VkPipelineStageFlags2KHR',desc='64-bit mask of pipeline stage flags',type='flags']
---
-tname:VkPipelineStageFlags2KHR is a bitmask type for setting a mask of zero
-or more elink:VkPipelineStageFlagBits2KHR flags:
-
-include::{generated}/api/flags/VkPipelineStageFlags2KHR.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='VkPipelineStageFlagBits',desc='Bitmask specifying pipeline stages',type='enums']
---
-Bits which can: be set in a tlink:VkPipelineStageFlags mask, specifying
-stages of execution, are:
-
-include::{generated}/api/enums/VkPipelineStageFlagBits.txt[]
-
-ifdef::VK_KHR_synchronization2[]
-These values all have the same meaning as the equivalently named values for
-tlink:VkPipelineStageFlags2KHR.
-endif::VK_KHR_synchronization2[]
-
-  * ename:VK_PIPELINE_STAGE_NONE_KHR specifies no stages of execution.
-  * ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT specifies the stage of the
-    pipeline where stext:VkDrawIndirect* / stext:VkDispatchIndirect* /
-    stext:VkTraceRaysIndirect* data structures are consumed.
-ifdef::VK_NV_device_generated_commands[]
-    This stage also includes reading commands written by
-    flink:vkCmdExecuteGeneratedCommandsNV.
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_NV_mesh_shader[]
-  * ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV specifies the task shader
-    stage.
-  * ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV specifies the mesh shader
-    stage.
-endif::VK_NV_mesh_shader[]
-  * ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT specifies the stage of the
-    pipeline where vertex and index buffers are consumed.
-  * ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT specifies the vertex shader
-    stage.
-  * ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT specifies the
-    tessellation control shader stage.
-  * ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT specifies the
-    tessellation evaluation shader stage.
-  * ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT specifies the geometry
-    shader stage.
-  * ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT specifies the fragment
-    shader stage.
-  * ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT specifies the stage of
-    the pipeline where early fragment tests (depth and stencil tests before
-    fragment shading) are performed.
-    This stage also includes <<renderpass-load-store-ops, subpass load
-    operations>> for framebuffer attachments with a depth/stencil format.
-  * ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT specifies the stage of
-    the pipeline where late fragment tests (depth and stencil tests after
-    fragment shading) are performed.
-    This stage also includes <<renderpass-load-store-ops, subpass store
-    operations>> for framebuffer attachments with a depth/stencil format.
-  * ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT specifies the stage
-    of the pipeline after blending where the final color values are output
-    from the pipeline.
-    This stage also includes <<renderpass-load-store-ops, subpass load and
-    store operations>> and multisample resolve operations for framebuffer
-    attachments with a color
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    or depth/stencil
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    format.
-  * ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT specifies the execution of a
-    compute shader.
-  * [[synchronization-pipeline-stages-transfer]]
-    ename:VK_PIPELINE_STAGE_TRANSFER_BIT specifies the following commands:
-  ** All <<copies,copy commands>>, including flink:vkCmdCopyQueryPoolResults
-ifndef::VK_KHR_copy_commands2[]
-  ** flink:vkCmdBlitImage
-  ** flink:vkCmdResolveImage
-endif::VK_KHR_copy_commands2[]
-ifdef::VK_KHR_copy_commands2[]
-  ** flink:vkCmdBlitImage2KHR and flink:vkCmdBlitImage
-  ** flink:vkCmdResolveImage2KHR and flink:vkCmdResolveImage
-endif::VK_KHR_copy_commands2[]
-  ** All <<clears,clear commands>>, with the exception of
-     flink:vkCmdClearAttachments
-  * ename:VK_PIPELINE_STAGE_HOST_BIT specifies a pseudo-stage indicating
-    execution on the host of reads/writes of device memory.
-    This stage is not invoked by any commands recorded in a command buffer.
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-  * ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR specifies
-    the execution of
-ifdef::VK_NV_ray_tracing[]
-    flink:vkCmdBuildAccelerationStructureNV,
-    flink:vkCmdCopyAccelerationStructureNV,
-    flink:vkCmdWriteAccelerationStructuresPropertiesNV
-endif::VK_NV_ray_tracing[]
-ifdef::VK_NV_ray_tracing+VK_KHR_acceleration_structure[,]
-ifdef::VK_KHR_acceleration_structure[]
-    flink:vkCmdBuildAccelerationStructuresKHR,
-    flink:vkCmdBuildAccelerationStructuresIndirectKHR,
-    flink:vkCmdCopyAccelerationStructureKHR,
-    flink:vkCmdCopyAccelerationStructureToMemoryKHR,
-    flink:vkCmdCopyMemoryToAccelerationStructureKHR, and
-    flink:vkCmdWriteAccelerationStructuresPropertiesKHR.
-endif::VK_KHR_acceleration_structure[]
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-  * ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR specifies the
-    execution of the ray tracing shader stages, via
-ifdef::VK_NV_ray_tracing[flink:vkCmdTraceRaysNV]
-ifdef::VK_NV_ray_tracing+VK_KHR_ray_tracing_pipeline[,]
-ifdef::VK_KHR_ray_tracing_pipeline[flink:vkCmdTraceRaysKHR, or flink:vkCmdTraceRaysIndirectKHR]
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-  * ename:VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT specifies the execution of all
-    graphics pipeline stages, and is equivalent to the logical OR of:
-  ** ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
-ifdef::VK_NV_mesh_shader[]
-  ** ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV
-  ** ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV
-endif::VK_NV_mesh_shader[]
-  ** ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
-  ** ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
-  ** ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
-  ** ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
-  ** ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
-  ** ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
-  ** ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
-  ** ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
-  ** ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
-ifdef::VK_EXT_conditional_rendering[]
-  ** ename:VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_transform_feedback[]
-  ** ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  ** ename:VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-ifdef::VK_EXT_fragment_density_map[]
-  ** ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-  * ename:VK_PIPELINE_STAGE_ALL_COMMANDS_BIT specifies all operations
-    performed by all commands supported on the queue it is used with.
-ifdef::VK_EXT_conditional_rendering[]
-  * ename:VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT specifies the
-    stage of the pipeline where the predicate of conditional rendering is
-    consumed.
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_transform_feedback[]
-  * ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT specifies the stage
-    of the pipeline where vertex attribute output values are written to the
-    transform feedback buffers.
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_device_generated_commands[]
-  * ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV specifies the stage of
-    the pipeline where device-side preprocessing for generated commands via
-    flink:vkCmdPreprocessGeneratedCommandsNV is handled.
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  * ename:VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-    specifies the stage of the pipeline where the
-ifdef::VK_KHR_fragment_shading_rate[]
-    <<primsrast-fragment-shading-rate-attachment, fragment shading rate
-    attachment>>
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_KHR_fragment_shading_rate+VK_NV_shading_rate_image[or]
-ifdef::VK_NV_shading_rate_image[]
-    <<primsrast-shading-rate-image, shading rate image>>
-endif::VK_NV_shading_rate_image[]
-    is read to determine the fragment shading rate for portions of a
-    rasterized primitive.
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-ifdef::VK_EXT_fragment_density_map[]
-  * ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT specifies the
-    stage of the pipeline where the fragment density map is read to
-    <<fragmentdensitymapops,generate the fragment areas>>.
-endif::VK_EXT_fragment_density_map[]
-  * ename:VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT is equivalent to
-    ename:VK_PIPELINE_STAGE_ALL_COMMANDS_BIT with tlink:VkAccessFlags set to
-    `0` when specified in the second synchronization scope, but specifies no
-    stage of execution when specified in the first scope.
-  * ename:VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT is equivalent to
-    ename:VK_PIPELINE_STAGE_ALL_COMMANDS_BIT with tlink:VkAccessFlags set to
-    `0` when specified in the first synchronization scope, but specifies no
-    stage of execution when specified in the second scope.
---
-
-[open,refpage='VkPipelineStageFlags',desc='Bitmask of VkPipelineStageFlagBits',type='flags']
---
-include::{generated}/api/flags/VkPipelineStageFlags.txt[]
-
-tname:VkPipelineStageFlags is a bitmask type for setting a mask of zero or
-more elink:VkPipelineStageFlagBits.
---
-
-[[synchronization-pipeline-stages-masks]]
-If a synchronization command includes a source stage mask, its first
-<<synchronization-dependencies-scopes, synchronization scope>> only includes
-execution of the pipeline stages specified in that mask, and its first
-<<synchronization-dependencies-access-scopes, access scope>> only includes
-memory accesses performed by pipeline stages specified in that mask.
-
-If a synchronization command includes a destination stage mask, its second
-<<synchronization-dependencies-scopes, synchronization scope>> only includes
-execution of the pipeline stages specified in that mask, and its second
-<<synchronization-dependencies-access-scopes, access scope>> only includes
-memory access performed by pipeline stages specified in that mask.
-
-[NOTE]
-.Note
-====
-Including a particular pipeline stage in the first
-<<synchronization-dependencies-scopes, synchronization scope>> of a command
-implicitly includes <<synchronization-pipeline-stages-order, logically
-earlier>> pipeline stages in the synchronization scope.
-Similarly, the second <<synchronization-dependencies-scopes, synchronization
-scope>> includes <<synchronization-pipeline-stages-order, logically later>>
-pipeline stages.
-
-However, note that <<synchronization-dependencies-access-scopes, access
-scopes>> are not affected in this way - only the precise stages specified
-are considered part of each access scope.
-====
-
-Certain pipeline stages are only available on queues that support a
-particular set of operations.
-The following table lists, for each pipeline stage flag, which queue
-capability flag must: be supported by the queue.
-When multiple flags are enumerated in the second column of the table, it
-means that the pipeline stage is supported on the queue if it supports any
-of the listed capability flags.
-For further details on queue capabilities see
-<<devsandqueues-physical-device-enumeration,Physical Device Enumeration>>
-and <<devsandqueues-queues,Queues>>.
-
-[[synchronization-pipeline-stages-supported]]
-.Supported pipeline stage flags
-[cols="60%,40%",options="header"]
-|====
-|Pipeline stage flag                                          | Required queue capability flag
-|ename:VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT                      | None required
-|ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT                    | ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT
-|ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT                     | ename:VK_QUEUE_GRAPHICS_BIT
-|ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT                    | ename:VK_QUEUE_GRAPHICS_BIT
-|ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT      | ename:VK_QUEUE_GRAPHICS_BIT
-|ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT   | ename:VK_QUEUE_GRAPHICS_BIT
-|ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT                  | ename:VK_QUEUE_GRAPHICS_BIT
-|ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT                  | ename:VK_QUEUE_GRAPHICS_BIT
-|ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT             | ename:VK_QUEUE_GRAPHICS_BIT
-|ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT              | ename:VK_QUEUE_GRAPHICS_BIT
-|ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT          | ename:VK_QUEUE_GRAPHICS_BIT
-|ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT                   | ename:VK_QUEUE_COMPUTE_BIT
-|ename:VK_PIPELINE_STAGE_TRANSFER_BIT                         | ename:VK_QUEUE_GRAPHICS_BIT, ename:VK_QUEUE_COMPUTE_BIT or ename:VK_QUEUE_TRANSFER_BIT
-|ename:VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT                   | None required
-|ename:VK_PIPELINE_STAGE_HOST_BIT                             | None required
-|ename:VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT                     | ename:VK_QUEUE_GRAPHICS_BIT
-|ename:VK_PIPELINE_STAGE_ALL_COMMANDS_BIT                     | None required
-ifdef::VK_EXT_conditional_rendering[]
-|ename:VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT        | ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_transform_feedback[]
-|ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT           | ename:VK_QUEUE_GRAPHICS_BIT
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_device_generated_commands[]
-|ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV            | ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-|ename:VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR | ename:VK_QUEUE_GRAPHICS_BIT
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-ifdef::VK_NV_mesh_shader[]
-|ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV                   | ename:VK_QUEUE_GRAPHICS_BIT
-|ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV                   | ename:VK_QUEUE_GRAPHICS_BIT
-endif::VK_NV_mesh_shader[]
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-|ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | ename:VK_QUEUE_COMPUTE_BIT
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-|ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR           | ename:VK_QUEUE_COMPUTE_BIT
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_EXT_fragment_density_map[]
-|ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT     | ename:VK_QUEUE_GRAPHICS_BIT
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_HUAWEI_subpass_shading[]
-|ename:VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI         | ename:VK_QUEUE_GRAPHICS_BIT
-endif::VK_HUAWEI_subpass_shading[]
-|====
-
-[[synchronization-pipeline-stages-order]]
-Pipeline stages that execute as a result of a command logically complete
-execution in a specific order, such that completion of a logically later
-pipeline stage must: not happen-before completion of a logically earlier
-stage.
-This means that including any stage in the source stage mask for a
-particular synchronization command also implies that any logically earlier
-stages are included in *A~S~* for that command.
-
-Similarly, initiation of a logically earlier pipeline stage must: not
-happen-after initiation of a logically later pipeline stage.
-Including any given stage in the destination stage mask for a particular
-synchronization command also implies that any logically later stages are
-included in *B~S~* for that command.
-
-[NOTE]
-.Note
-====
-Implementations may: not support synchronization at every pipeline stage for
-every synchronization operation.
-If a pipeline stage that an implementation does not support synchronization
-for appears in a source stage mask, it may: substitute any logically later
-stage in its place for the first synchronization scope.
-If a pipeline stage that an implementation does not support synchronization
-for appears in a destination stage mask, it may: substitute any logically
-earlier stage in its place for the second synchronization scope.
-
-For example, if an implementation is unable to signal an event immediately
-after vertex shader execution is complete, it may: instead signal the event
-after color attachment output has completed.
-
-If an implementation makes such a substitution, it must: not affect the
-semantics of execution or memory dependencies or image and buffer memory
-barriers.
-====
-
-[[synchronization-pipeline-stages-types]][[synchronization-pipeline-graphics]]
-<<pipelines-graphics, Graphics pipelines>> are executable on queues
-supporting ename:VK_QUEUE_GRAPHICS_BIT.
-Stages executed by graphics pipelines can: only be specified in commands
-recorded for queues supporting ename:VK_QUEUE_GRAPHICS_BIT.
-
-The graphics
-ifdef::VK_NV_mesh_shader[]
-primitive
-endif::VK_NV_mesh_shader[]
-pipeline executes the following stages, with the logical ordering of the
-stages matching the order specified here:
-
-  * ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
-ifdef::VK_KHR_synchronization2[]
-  * ename:VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR
-  * ename:VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR
-endif::VK_KHR_synchronization2[]
-ifndef::VK_KHR_synchronization2[]
-  * ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
-endif::VK_KHR_synchronization2[]
-  * ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
-  * ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
-  * ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
-  * ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
-ifdef::VK_EXT_transform_feedback[]
-  * ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  * ename:VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  * ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
-  * ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
-  * ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
-  * ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
-
-ifdef::VK_NV_mesh_shader[]
-The graphics mesh pipeline executes the following stages, with the logical
-ordering of the stages matching the order specified here:
-
-  * ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
-  * ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV
-  * ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  * ename:VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-  * ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
-  * ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
-  * ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
-  * ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
-endif::VK_NV_mesh_shader[]
-
-For the compute pipeline, the following stages occur in this order:
-
-  * ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
-  * ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
-
-ifdef::VK_HUAWEI_subpass_shading[]
-For the subpass shading pipeline, the following stages occur in this order:
-
-  * ename:VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI
-endif::VK_HUAWEI_subpass_shading[]
-
-ifdef::VK_EXT_fragment_density_map[]
-For graphics pipeline commands executing in a render pass with a fragment
-density map attachment, the following pipeline stage where the fragment
-density map read happens has no particular order relative to the other
-stages, except that it is logically earlier than
-ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT:
-
-  * ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT
-  * ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
-endif::VK_EXT_fragment_density_map[]
-
-ifdef::VK_EXT_conditional_rendering[]
-The conditional rendering stage is formally part of both the graphics, and
-the compute pipeline.
-The pipeline stage where the predicate read happens has unspecified order
-relative to other stages of these pipelines:
-
-  * ename:VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT
-endif::VK_EXT_conditional_rendering[]
-
-For the transfer pipeline, the following stages occur in this order:
-
-  * ename:VK_PIPELINE_STAGE_TRANSFER_BIT
-
-For host operations, only one pipeline stage occurs, so no order is
-guaranteed:
-
-  * ename:VK_PIPELINE_STAGE_HOST_BIT
-
-ifdef::VK_NV_device_generated_commands[]
-For the command preprocessing pipeline, the following stages occur in this
-order:
-
-  * ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV
-endif::VK_NV_device_generated_commands[]
-
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-For acceleration structure operations, only one pipeline stage occurs, so no
-order is guaranteed:
-
-  * ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-For the ray tracing pipeline, the following stages occur in this order:
-
-  * ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
-  * ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR
-
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-
-
-[[synchronization-access-types]]
-=== Access Types
-
-Memory in Vulkan can: be accessed from within shader invocations and via
-some fixed-function stages of the pipeline.
-The _access type_ is a function of the <<descriptorsets, descriptor type>>
-used, or how a fixed-function stage accesses memory.
-
-[[synchronization-access-masks]]
-Some synchronization commands take sets of access types as parameters to
-define the <<synchronization-dependencies-access-scopes, access scopes>> of
-a memory dependency.
-If a synchronization command includes a _source access mask_, its first
-<<synchronization-dependencies-access-scopes, access scope>> only includes
-accesses via the access types specified in that mask.
-Similarly, if a synchronization command includes a _destination access
-mask_, its second <<synchronization-dependencies-access-scopes, access
-scope>> only includes accesses via the access types specified in that mask.
-
-ifdef::VK_KHR_synchronization2[]
-[open,refpage='VkAccessFlagBits2KHR',desc='Access flags for VkAccessFlags2KHR',type='enums']
---
-Bits which can: be set in the pname:srcAccessMask and pname:dstAccessMask
-members of slink:VkMemoryBarrier2KHR, slink:VkImageMemoryBarrier2KHR, and
-slink:VkBufferMemoryBarrier2KHR, specifying access behavior, are:
-
-include::{generated}/api/enums/VkAccessFlagBits2KHR.txt[]
-
-  * ename:VK_ACCESS_2_NONE_KHR specifies no accesses.
-  * ename:VK_ACCESS_2_MEMORY_READ_BIT_KHR specifies all read accesses.
-    It is always valid in any access mask, and is treated as equivalent to
-    setting all etext:READ access flags that are valid where it is used.
-  * ename:VK_ACCESS_2_MEMORY_WRITE_BIT_KHR specifies all write accesses.
-    It is always valid in any access mask, and is treated as equivalent to
-    setting all etext:WRITE access flags that are valid where it is used.
-  * ename:VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR specifies read access to
-    command data read from indirect buffers as part of an indirect
-ifdef::VK_KHR_acceleration_structure[build,]
-ifdef::VK_KHR_ray_tracing_pipeline[trace,]
-    drawing or dispatch command.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR pipeline stage.
-  * ename:VK_ACCESS_2_INDEX_READ_BIT_KHR specifies read access to an index
-    buffer as part of an indexed drawing command, bound by
-    flink:vkCmdBindIndexBuffer.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR
-    pipeline stage.
-  * ename:VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT_KHR specifies read access to
-    a vertex buffer as part of a drawing command, bound by
-    flink:vkCmdBindVertexBuffers.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR pipeline stage.
-  * ename:VK_ACCESS_2_UNIFORM_READ_BIT_KHR specifies read access to a
-    <<descriptorsets-uniformbuffer, uniform buffer>> in any shader pipeline
-    stage.
-  * ename:VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT_KHR specifies read access to
-    an <<renderpass, input attachment>> within a render pass during
-ifdef::VK_HUAWEI_subpass_shading[]
-    subpass shading or
-endif::VK_HUAWEI_subpass_shading[]
-    fragment shading.
-    Such access occurs in the
-ifdef::VK_HUAWEI_subpass_shading[]
-    ename:VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI or
-endif::VK_HUAWEI_subpass_shading[]
-    ename:VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR pipeline stage.
-  * ename:VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR specifies read access to a
-    <<descriptorsets-uniformtexelbuffer, uniform texel buffer>> or
-    <<descriptorsets-sampledimage, sampled image>> in any shader pipeline
-    stage.
-  * ename:VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR specifies read access to a
-    <<descriptorsets-storagebuffer, storage buffer>>,
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_buffer_device_address[]
-    <<descriptorsets-physical-storage-buffer, physical storage buffer>>,
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_buffer_device_address[]
-    <<descriptorsets-storagetexelbuffer, storage texel buffer>>, or
-    <<descriptorsets-storageimage, storage image>> in any shader pipeline
-    stage.
-  * ename:VK_ACCESS_2_SHADER_READ_BIT_KHR
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-    specifies read access to a <<shader-binding-table, shader binding
-    table>> in any shader pipeline.
-    In addition, it
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-    is equivalent to the logical OR of:
-  ** ename:VK_ACCESS_2_UNIFORM_READ_BIT_KHR
-  ** ename:VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR
-  ** ename:VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR
-  * ename:VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR specifies write access to
-    a <<descriptorsets-storagebuffer, storage buffer>>,
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_buffer_device_address[]
-    <<descriptorsets-physical-storage-buffer, physical storage buffer>>,
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_buffer_device_address[]
-    <<descriptorsets-storagetexelbuffer, storage texel buffer>>, or
-    <<descriptorsets-storageimage, storage image>> in any shader pipeline
-    stage.
-  * ename:VK_ACCESS_2_SHADER_WRITE_BIT_KHR is equivalent to
-    ename:VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR.
-  * ename:VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR specifies read access to
-    a <<renderpass, color attachment>>, such as via <<framebuffer-blending,
-    blending>>, <<framebuffer-logicop, logic operations>>, or via certain
-    <<renderpass-load-store-ops, subpass load operations>>.
-ifdef::VK_EXT_blend_operation_advanced[]
-    It does not include <<framebuffer-blend-advanced, advanced blend
-    operations>>.
-endif::VK_EXT_blend_operation_advanced[]
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR pipeline
-    stage.
-  * ename:VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR specifies write access
-    to a
-ifndef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    <<renderpass, color or resolve attachment>>
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    <<renderpass, color, resolve, or depth/stencil resolve attachment>>
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    during a <<renderpass, render pass>> or via certain
-    <<renderpass-load-store-ops, subpass load and store operations>>.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR pipeline
-    stage.
-  * ename:VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT_KHR specifies read
-    access to a <<renderpass, depth/stencil attachment>>, via
-    <<fragops-ds-state, depth or stencil operations>> or via certain
-    <<renderpass-load-store-ops, subpass load operations>>.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR or
-    ename:VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR pipeline stages.
-  * ename:VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT_KHR specifies write
-    access to a <<renderpass, depth/stencil attachment>>, via
-    <<fragops-ds-state, depth or stencil operations>> or via certain
-    <<renderpass-load-store-ops, subpass load and store operations>>.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR or
-    ename:VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR pipeline stages.
-  * ename:VK_ACCESS_2_TRANSFER_READ_BIT_KHR specifies read access to an
-    image or buffer in a <<copies, copy>> operation.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_2_COPY_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_BLIT_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR pipeline stages.
-  * ename:VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR specifies write access to an
-    image or buffer in a <<clears, clear>> or <<copies, copy>> operation.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_2_COPY_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_BLIT_BIT_KHR,
-    ename:VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR, or
-    ename:VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR pipeline stages.
-  * ename:VK_ACCESS_2_HOST_READ_BIT_KHR specifies read access by a host
-    operation.
-    Accesses of this type are not performed through a resource, but directly
-    on memory.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_2_HOST_BIT_KHR
-    pipeline stage.
-  * ename:VK_ACCESS_2_HOST_WRITE_BIT_KHR specifies write access by a host
-    operation.
-    Accesses of this type are not performed through a resource, but directly
-    on memory.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_2_HOST_BIT_KHR
-    pipeline stage.
-ifdef::VK_EXT_conditional_rendering[]
-  * ename:VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT specifies read
-    access to a predicate as part of conditional rendering.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT pipeline stage.
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_transform_feedback[]
-  * ename:VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT specifies write
-    access to a transform feedback buffer made when transform feedback is
-    active.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT pipeline stage.
-  * ename:VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT specifies read
-    access to a transform feedback counter buffer which is read when
-    flink:vkCmdBeginTransformFeedbackEXT executes.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT pipeline stage.
-  * ename:VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT specifies
-    write access to a transform feedback counter buffer which is written
-    when flink:vkCmdEndTransformFeedbackEXT executes.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT pipeline stage.
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_device_generated_commands[]
-  * ename:VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV specifies reads from
-    buffer inputs to flink:vkCmdPreprocessGeneratedCommandsNV.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV pipeline stage.
-  * ename:VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV specifies writes to
-    the target command buffer preprocess outputs.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV pipeline stage.
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_EXT_blend_operation_advanced[]
-  * ename:VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT specifies
-    read access to <<renderpass, color attachments>>, including
-    <<framebuffer-blend-advanced,advanced blend operations>>.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR pipeline
-    stage.
-endif::VK_EXT_blend_operation_advanced[]
-ifdef::VK_HUAWEI_invocation_mask[]
-  * ename:VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI specifies read access
-    to a invocation mask image in the
-    ename:VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI pipeline stage.
-endif::VK_HUAWEI_invocation_mask[]
-ifdef::VK_KHR_acceleration_structure,VK_NV_ray_tracing[]
-  * ename:VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR specifies read
-    access to an acceleration structure as part of a trace, build, or copy
-    command, or to an <<acceleration-structure-scratch, acceleration
-    structure scratch buffer>> as part of a build command.
-    Such access occurs in the
-ifdef::VK_KHR_ray_tracing_pipeline[]
-    ename:VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR pipeline stage or
-endif::VK_KHR_ray_tracing_pipeline[]
-    ename:VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR pipeline
-    stage.
-  * ename:VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR specifies write
-    access to an acceleration structure or <<acceleration-structure-scratch,
-    acceleration structure scratch buffer>> as part of a build or copy
-    command.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR pipeline
-    stage.
-endif::VK_KHR_acceleration_structure,VK_NV_ray_tracing[]
-ifdef::VK_EXT_fragment_density_map[]
-  * ename:VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT specifies read
-    access to a <<renderpass-fragmentdensitymapattachment, fragment density
-    map attachment>> during dynamic <<fragmentdensitymapops, fragment
-    density map operations>>.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT pipeline
-    stage.
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_KHR_fragment_shading_rate[]
-  * ename:VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR
-    specifies read access to a fragment shading rate attachment during
-    rasterization.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-    pipeline stage.
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_NV_shading_rate_image[]
-  * ename:VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV specifies read access
-    to a shading rate image during rasterization.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV pipeline stage.
-ifdef::VK_KHR_fragment_shading_rate[]
-    It is equivalent to
-    ename:VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR.
-endif::VK_KHR_fragment_shading_rate[]
-endif::VK_NV_shading_rate_image[]
-ifdef::VK_KHR_video_decode_queue[]
-  * ename:VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR specifies read access to an
-    image or buffer resource as part of a <<video-decode-operations, video
-    decode operation>>.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR
-    pipeline stage.
-  * ename:VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR specifies write access to
-    an image or buffer resource as part of a <<video-decode-operations,
-    video decode operation>>.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR
-    pipeline stage.
-endif::VK_KHR_video_decode_queue[]
-ifdef::VK_KHR_video_encode_queue[]
-  * ename:VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR specifies read access to an
-    image or buffer resource as part of a <<video-encode-operations, video
-    encode operation>>.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR
-    pipeline stage.
-  * ename:VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR specifies write access to
-    an image or buffer resource as part of a <<video-encode-operations,
-    video encode operation>>.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR
-    pipeline stage.
-endif::VK_KHR_video_encode_queue[]
-
-[NOTE]
-.Note
-====
-In situations where an application wishes to select all access types for a
-given set of pipeline stages, ename:VK_ACCESS_2_MEMORY_READ_BIT_KHR or
-ename:VK_ACCESS_2_MEMORY_WRITE_BIT_KHR can be used.
-This is particularly useful when specifying stages that only have a single
-access type.
-====
-
-[NOTE]
-.Note
-====
-The tname:VkAccessFlags2KHR bitmask goes beyond the 31 individual bit flags
-allowable within a C99 enum, which is how elink:VkAccessFlagBits is defined.
-The first 31 values are common to both, and are interchangeable.
-====
---
-
-[open,refpage='VkAccessFlags2KHR',desc='64-bit mask of access flags',type='flags']
---
-tname:VkAccessFlags2KHR is a bitmask type for setting a mask of zero or more
-elink:VkAccessFlagBits2KHR:
-
-include::{generated}/api/flags/VkAccessFlags2KHR.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='VkAccessFlagBits',desc='Bitmask specifying memory access types that will participate in a memory dependency',type='enums']
---
-Bits which can: be set in the pname:srcAccessMask and pname:dstAccessMask
-members of slink:VkSubpassDependency,
-ifdef::VK_KHR_synchronization2[slink:VkSubpassDependency2,]
-slink:VkMemoryBarrier, slink:VkBufferMemoryBarrier, and
-slink:VkImageMemoryBarrier, specifying access behavior, are:
-
-include::{generated}/api/enums/VkAccessFlagBits.txt[]
-
-ifdef::VK_KHR_synchronization2[]
-These values all have the same meaning as the equivalently named values for
-tlink:VkAccessFlags2KHR.
-
-  * ename:VK_ACCESS_NONE_KHR specifies no accesses.
-endif::VK_KHR_synchronization2[]
-  * ename:VK_ACCESS_MEMORY_READ_BIT specifies all read accesses.
-    It is always valid in any access mask, and is treated as equivalent to
-    setting all etext:READ access flags that are valid where it is used.
-  * ename:VK_ACCESS_MEMORY_WRITE_BIT specifies all write accesses.
-    It is always valid in any access mask, and is treated as equivalent to
-    setting all etext:WRITE access flags that are valid where it is used.
-  * ename:VK_ACCESS_INDIRECT_COMMAND_READ_BIT specifies read access to
-    indirect command data read as part of an indirect
-ifdef::VK_KHR_acceleration_structure[build,]
-ifdef::VK_KHR_ray_tracing_pipeline[trace,]
-    drawing or dispatching command.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
-    pipeline stage.
-  * ename:VK_ACCESS_INDEX_READ_BIT specifies read access to an index buffer
-    as part of an indexed drawing command, bound by
-    flink:vkCmdBindIndexBuffer.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
-    pipeline stage.
-  * ename:VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT specifies read access to a
-    vertex buffer as part of a drawing command, bound by
-    flink:vkCmdBindVertexBuffers.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
-    pipeline stage.
-  * ename:VK_ACCESS_UNIFORM_READ_BIT specifies read access to a
-    <<descriptorsets-uniformbuffer, uniform buffer>> in any shader pipeline
-    stage.
-  * ename:VK_ACCESS_INPUT_ATTACHMENT_READ_BIT specifies read access to an
-    <<renderpass, input attachment>> within a render pass during
-ifdef::VK_HUAWEI_subpass_shading[]
-    subpass shading or
-endif::VK_HUAWEI_subpass_shading[]
-    fragment shading.
-    Such access occurs in the
-ifdef::VK_HUAWEI_subpass_shading[]
-    ename:VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI or
-endif::VK_HUAWEI_subpass_shading[]
-    ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT pipeline stage.
-  * ename:VK_ACCESS_SHADER_READ_BIT specifies read access to a
-    <<descriptorsets-uniformbuffer, uniform buffer>>,
-    <<descriptorsets-uniformtexelbuffer, uniform texel buffer>>,
-    <<descriptorsets-sampledimage, sampled image>>,
-    <<descriptorsets-storagebuffer, storage buffer>>,
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-    <<descriptorsets-physical-storage-buffer, physical storage buffer>>,
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-    <<shader-binding-table, shader binding table>>,
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-    <<descriptorsets-storagetexelbuffer, storage texel buffer>>, or
-    <<descriptorsets-storageimage, storage image>> in any shader pipeline
-    stage.
-  * ename:VK_ACCESS_SHADER_WRITE_BIT specifies write access to a
-    <<descriptorsets-storagebuffer, storage buffer>>,
-ifdef::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-    <<descriptorsets-physical-storage-buffer, physical storage buffer>>,
-endif::VK_VERSION_1_2,VK_EXT_buffer_device_address,VK_KHR_buffer_device_address[]
-    <<descriptorsets-storagetexelbuffer, storage texel buffer>>, or
-    <<descriptorsets-storageimage, storage image>> in any shader pipeline
-    stage.
-  * ename:VK_ACCESS_COLOR_ATTACHMENT_READ_BIT specifies read access to a
-    <<renderpass, color attachment>>, such as via <<framebuffer-blending,
-    blending>>, <<framebuffer-logicop, logic operations>>, or via certain
-    <<renderpass-load-store-ops, subpass load operations>>.
-ifdef::VK_EXT_blend_operation_advanced[]
-    It does not include <<framebuffer-blend-advanced, advanced blend
-    operations>>.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT pipeline stage.
-endif::VK_EXT_blend_operation_advanced[]
-  * ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT specifies write access to a
-ifndef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    <<renderpass, color or resolve attachment>>
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    <<renderpass, color, resolve, or depth/stencil resolve attachment>>
-endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
-    during a <<renderpass, render pass>> or via certain
-    <<renderpass-load-store-ops, subpass load and store operations>>.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT pipeline stage.
-  * ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT specifies read access
-    to a <<renderpass, depth/stencil attachment>>, via <<fragops-ds-state,
-    depth or stencil operations>> or via certain
-    <<renderpass-load-store-ops, subpass load operations>>.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT or
-    ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT pipeline stages.
-  * ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT specifies write
-    access to a <<renderpass, depth/stencil attachment>>, via
-    <<fragops-ds-state, depth or stencil operations>> or via certain
-    <<renderpass-load-store-ops, subpass load and store operations>>.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT or
-    ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT pipeline stages.
-  * ename:VK_ACCESS_TRANSFER_READ_BIT specifies read access to an image or
-    buffer in a <<copies, copy>> operation.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR
-    pipeline stage.
-  * ename:VK_ACCESS_TRANSFER_WRITE_BIT specifies write access to an image or
-    buffer in a <<clears, clear>> or <<copies, copy>> operation.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR
-    pipeline stage.
-  * ename:VK_ACCESS_HOST_READ_BIT specifies read access by a host operation.
-    Accesses of this type are not performed through a resource, but directly
-    on memory.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_HOST_BIT pipeline
-    stage.
-  * ename:VK_ACCESS_HOST_WRITE_BIT specifies write access by a host
-    operation.
-    Accesses of this type are not performed through a resource, but directly
-    on memory.
-    Such access occurs in the ename:VK_PIPELINE_STAGE_HOST_BIT pipeline
-    stage.
-ifdef::VK_EXT_conditional_rendering[]
-  * ename:VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT specifies read access
-    to a predicate as part of conditional rendering.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT pipeline stage.
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_EXT_transform_feedback[]
-  * ename:VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT specifies write access
-    to a transform feedback buffer made when transform feedback is active.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT pipeline stage.
-  * ename:VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT specifies read
-    access to a transform feedback counter buffer which is read when
-    fname:vkCmdBeginTransformFeedbackEXT executes.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT pipeline stage.
-  * ename:VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT specifies write
-    access to a transform feedback counter buffer which is written when
-    fname:vkCmdEndTransformFeedbackEXT executes.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT pipeline stage.
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_device_generated_commands[]
-  * ename:VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV specifies reads from
-    buffer inputs to flink:vkCmdPreprocessGeneratedCommandsNV.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV pipeline stage.
-  * ename:VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV specifies writes to the
-    target command buffer:VkBuffer preprocess outputs in
-    flink:vkCmdPreprocessGeneratedCommandsNV.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV pipeline stage.
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_EXT_blend_operation_advanced[]
-  * ename:VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT specifies read
-    access to <<renderpass, color attachments>>, including
-    <<framebuffer-blend-advanced,advanced blend operations>>.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT pipeline stage.
-endif::VK_EXT_blend_operation_advanced[]
-ifdef::VK_KHR_acceleration_structure,VK_NV_ray_tracing[]
-ifdef::VK_HUAWEI_invocation_mask[]
-  * ename:VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI specifies read access
-    to a invocation mask image in the
-    ename:VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI pipeline stage.
-endif::VK_HUAWEI_invocation_mask[]
-  * ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR specifies read
-    access to an acceleration structure as part of a trace, build, or copy
-    command, or to an <<acceleration-structure-scratch, acceleration
-    structure scratch buffer>> as part of a build command.
-    Such access occurs in the
-ifdef::VK_KHR_ray_tracing_pipeline[]
-    ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR pipeline stage or
-endif::VK_KHR_ray_tracing_pipeline[]
-    ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR pipeline
-    stage.
-  * ename:VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR specifies write
-    access to an acceleration structure or <<acceleration-structure-scratch,
-    acceleration structure scratch buffer>> as part of a build or copy
-    command.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR pipeline
-    stage.
-endif::VK_KHR_acceleration_structure,VK_NV_ray_tracing[]
-ifdef::VK_EXT_fragment_density_map[]
-  * ename:VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT specifies read access
-    to a <<renderpass-fragmentdensitymapattachment, fragment density map
-    attachment>> during dynamic <<fragmentdensitymapops, fragment density
-    map operations>> Such access occurs in the
-    ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT pipeline stage.
-endif::VK_EXT_fragment_density_map[]
-ifdef::VK_KHR_fragment_shading_rate[]
-  * ename:VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR specifies
-    read access to a fragment shading rate attachment during rasterization.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-    pipeline stage.
-endif::VK_KHR_fragment_shading_rate[]
-ifdef::VK_NV_shading_rate_image[]
-  * ename:VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV specifies read access to
-    a shading rate image during rasterization.
-    Such access occurs in the
-    ename:VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV pipeline stage.
-ifdef::VK_KHR_fragment_shading_rate[]
-    It is equivalent to
-    ename:VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR.
-endif::VK_KHR_fragment_shading_rate[]
-endif::VK_NV_shading_rate_image[]
-
-Certain access types are only performed by a subset of pipeline stages.
-Any synchronization command that takes both stage masks and access masks
-uses both to define the <<synchronization-dependencies-access-scopes, access
-scopes>> - only the specified access types performed by the specified stages
-are included in the access scope.
-An application must: not specify an access flag in a synchronization command
-if it does not include a pipeline stage in the corresponding stage mask that
-is able to perform accesses of that type.
-The following table lists, for each access flag, which pipeline stages can:
-perform that type of access.
-
-[[synchronization-access-types-supported]]
-.Supported access types
-[cols="50,50",options="header"]
-|====
-|Access flag                                                  | Supported pipeline stages
-|ename:VK_ACCESS_INDIRECT_COMMAND_READ_BIT                    | ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
-ifdef::VK_KHR_acceleration_structure[]
-, ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-endif::VK_KHR_acceleration_structure[]
-|ename:VK_ACCESS_INDEX_READ_BIT                               | ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
-|ename:VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT                    | ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
-
-|ename:VK_ACCESS_UNIFORM_READ_BIT                             |
-ifdef::VK_NV_mesh_shader[]
-                                                               ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
-endif::VK_NV_mesh_shader[]
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-                                                               ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-                                                               ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, or ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
-
-|ename:VK_ACCESS_SHADER_READ_BIT                              |
-ifdef::VK_KHR_acceleration_structure[]
-                                                               ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR,
-endif::VK_KHR_acceleration_structure[]
-ifdef::VK_NV_mesh_shader[]
-                                                               ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
-endif::VK_NV_mesh_shader[]
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-                                                               ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-                                                               ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, or ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
-
-|ename:VK_ACCESS_SHADER_WRITE_BIT                             |
-ifdef::VK_NV_mesh_shader[]
-                                                               ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
-endif::VK_NV_mesh_shader[]
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-                                                               ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-                                                               ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, or ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
-
-|ename:VK_ACCESS_INPUT_ATTACHMENT_READ_BIT                    |
-ifdef::VK_HUAWEI_subpass_shading[]
-                                                               ename:VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI, or
-endif::VK_HUAWEI_subpass_shading[]
-                                                               ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
-|ename:VK_ACCESS_COLOR_ATTACHMENT_READ_BIT                    | ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
-|ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT                   | ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
-|ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT            | ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, or ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
-|ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT           | ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, or ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
-|ename:VK_ACCESS_TRANSFER_READ_BIT                            | ename:VK_PIPELINE_STAGE_TRANSFER_BIT
-ifdef::VK_KHR_acceleration_structure[or ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR]
-|ename:VK_ACCESS_TRANSFER_WRITE_BIT                           | ename:VK_PIPELINE_STAGE_TRANSFER_BIT
-ifdef::VK_KHR_acceleration_structure[or ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR]
-|ename:VK_ACCESS_HOST_READ_BIT                                | ename:VK_PIPELINE_STAGE_HOST_BIT
-|ename:VK_ACCESS_HOST_WRITE_BIT                               | ename:VK_PIPELINE_STAGE_HOST_BIT
-|ename:VK_ACCESS_MEMORY_READ_BIT                              | Any
-|ename:VK_ACCESS_MEMORY_WRITE_BIT                             | Any
-ifdef::VK_EXT_blend_operation_advanced[]
-|ename:VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT    | ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
-endif::VK_EXT_blend_operation_advanced[]
-ifdef::VK_NV_device_generated_commands[]
-|ename:VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV               | ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV
-|ename:VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV              | ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV
-endif::VK_NV_device_generated_commands[]
-ifdef::VK_EXT_conditional_rendering[]
-|ename:VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT           | ename:VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT
-endif::VK_EXT_conditional_rendering[]
-ifdef::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-|ename:VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR | ename:VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-endif::VK_KHR_fragment_shading_rate,VK_NV_shading_rate_image[]
-ifdef::VK_HUAWEI_invocation_mask[]
-|ename:VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI                           | ename:VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI
-endif::VK_HUAWEI_invocation_mask[]
-ifdef::VK_EXT_transform_feedback[]
-|ename:VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT             | ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
-|ename:VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT     | ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
-|ename:VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT      | ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-|ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR          |
-ifdef::VK_KHR_ray_query[]
-ifdef::VK_NV_mesh_shader[]
-                                                               ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
-endif::VK_NV_mesh_shader[]
-                                                               ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
-endif::VK_KHR_ray_query[]
-ifdef::VK_KHR_ray_tracing_pipeline[]
-ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,
-endif::VK_KHR_ray_tracing_pipeline[]
-ifdef::VK_KHR_ray_tracing_pipeline,VK_KHR_ray_query[]
- or
-endif::VK_KHR_ray_tracing_pipeline,VK_KHR_ray_query[]
-ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-|ename:VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR         | ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-ifdef::VK_EXT_fragment_density_map[]
-|ename:VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT            | ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT
-endif::VK_EXT_fragment_density_map[]
-|====
---
-
-[open,refpage='VkAccessFlags',desc='Bitmask of VkAccessFlagBits',type='flags']
---
-include::{generated}/api/flags/VkAccessFlags.txt[]
-
-tname:VkAccessFlags is a bitmask type for setting a mask of zero or more
-elink:VkAccessFlagBits.
---
-
-
-[[synchronization-host-access-types]]
-If a memory object does not have the
-ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT property, then
-flink:vkFlushMappedMemoryRanges must: be called in order to guarantee that
-writes to the memory object from the host are made available to the host
-domain, where they can: be further made available to the device domain via a
-domain operation.
-Similarly, flink:vkInvalidateMappedMemoryRanges must: be called to guarantee
-that writes which are available to the host domain are made visible to host
-operations.
-
-If the memory object does have the
-ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT property flag, writes to the
-memory object from the host are automatically made available to the host
-domain.
-Similarly, writes made available to the host domain are automatically made
-visible to the host.
-
-[NOTE]
-.Note
-====
-<<devsandqueues-submission, Queue submission commands>> automatically
-perform a <<synchronization-submission-host-writes,domain operation from
-host to device>> for all writes performed before the command executes, so in
-most cases an explicit memory barrier is not needed for this case.
-In the few circumstances where a submit does not occur between the host
-write and the device read access, writes can: be made available by using an
-explicit memory barrier.
-====
-
-
-[[synchronization-framebuffer-regions]]
-=== Framebuffer Region Dependencies
-
-<<synchronization-pipeline-stages, Pipeline stages>> that operate on, or
-with respect to, the framebuffer are collectively the _framebuffer-space_
-pipeline stages.
-These stages are:
-
-  * ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
-  * ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
-  * ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
-  * ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
-
-For these pipeline stages, an execution or memory dependency from the first
-set of operations to the second set can: either be a single
-_framebuffer-global_ dependency, or split into multiple _framebuffer-local_
-dependencies.
-A dependency with non-framebuffer-space pipeline stages is neither
-framebuffer-global nor framebuffer-local.
-
-ifndef::VK_QCOM_render_pass_shader_resolve[]
-A _framebuffer region_ is a set of sample (x, y, layer, sample) coordinates
-that is a subset of the entire framebuffer.
-endif::VK_QCOM_render_pass_shader_resolve[]
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-A _framebuffer region_ is a subset of the entire framebuffer, and can:
-either be:
-
- * A _sample region_, which is set of sample (x, y, layer, sample)
-   coordinates that is a subset of the entire framebuffer, or
-
- * A _fragment region_, which is a set of fragment (x, y, layer) coordinates
-   that is a subset of the entire framebuffer.
-endif::VK_QCOM_render_pass_shader_resolve[]
-
-Both <<synchronization-dependencies-scopes, synchronization scopes>> of a
-framebuffer-local dependency include only the operations performed within
-corresponding framebuffer regions (as defined below).
-No ordering guarantees are made between different framebuffer regions for a
-framebuffer-local dependency.
-
-Both <<synchronization-dependencies-scopes, synchronization scopes>> of a
-framebuffer-global dependency include operations on all framebuffer-regions.
-
-If the first synchronization scope includes operations on pixels/fragments
-with N samples and the second synchronization scope includes operations on
-pixels/fragments with M samples, where N does not equal M, then a
-framebuffer region containing all samples at a given (x, y, layer)
-coordinate in the first synchronization scope corresponds to a region
-containing all samples at the same coordinate in the second synchronization
-scope.
-ifndef::VK_QCOM_render_pass_shader_resolve[]
-In other words, it is a pixel granularity dependency.
-endif::VK_QCOM_render_pass_shader_resolve[]
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-In other words, the framebuffer region is a fragment region and it is a
-pixel granularity dependency.
-endif::VK_QCOM_render_pass_shader_resolve[]
-If N equals M,
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-and if the sname:VkSubpassDescription::pname:flags does not specify the
-ename:VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM flag,
-endif::VK_QCOM_render_pass_shader_resolve[]
-then a framebuffer region containing a single (x, y, layer, sample)
-coordinate in the first synchronization scope corresponds to a region
-containing the same sample at the same coordinate in the second
-synchronization scope.
-ifndef::VK_QCOM_render_pass_shader_resolve[]
-In other words, it is a sample granularity dependency.
-endif::VK_QCOM_render_pass_shader_resolve[]
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-In other words, the framebuffer region is a sample region and it is a sample
-granularity dependency.
-endif::VK_QCOM_render_pass_shader_resolve[]
-
-[NOTE]
-.Note
-====
-Since fragment shader invocations are not specified to run in any particular
-groupings, the size of a framebuffer region is implementation-dependent, not
-known to the application, and must: be assumed to be no larger than
-specified above.
-====
-
-[NOTE]
-.Note
-====
-Practically, the pixel vs sample granularity dependency means that if an
-input attachment has a different number of samples than the pipeline's
-pname:rasterizationSamples, then a fragment can: access any sample in the
-input attachment's pixel even if it only uses framebuffer-local
-dependencies.
-If the input attachment has the same number of samples, then the fragment
-can: only access the covered samples in its input code:SampleMask (i.e. the
-fragment operations happen-after a framebuffer-local dependency for each
-sample the fragment covers).
-To access samples that are not covered,
-ifdef::VK_QCOM_render_pass_shader_resolve[]
-either the sname:VkSubpassDescription::pname:flags
-ename:VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM flag is required, or
-endif::VK_QCOM_render_pass_shader_resolve[]
-a framebuffer-global dependency is required.
-====
-
-If a synchronization command includes a pname:dependencyFlags parameter, and
-specifies the ename:VK_DEPENDENCY_BY_REGION_BIT flag, then it defines
-framebuffer-local dependencies for the framebuffer-space pipeline stages in
-that synchronization command, for all framebuffer regions.
-If no pname:dependencyFlags parameter is included, or the
-ename:VK_DEPENDENCY_BY_REGION_BIT flag is not specified, then a
-framebuffer-global dependency is specified for those stages.
-The ename:VK_DEPENDENCY_BY_REGION_BIT flag does not affect the dependencies
-between non-framebuffer-space pipeline stages, nor does it affect the
-dependencies between framebuffer-space and non-framebuffer-space pipeline
-stages.
-
-[NOTE]
-.Note
-====
-Framebuffer-local dependencies are more efficient for most architectures;
-particularly tile-based architectures - which can keep framebuffer-regions
-entirely in on-chip registers and thus avoid external bandwidth across such
-a dependency.
-Including a framebuffer-global dependency in your rendering will usually
-force all implementations to flush data to memory, or to a higher level
-cache, breaking any potential locality optimizations.
-====
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-[[synchronization-view-local-dependencies]]
-=== View-Local Dependencies
-
-In a render pass instance that has <<renderpass-multiview,multiview>>
-enabled, dependencies can: be either view-local or view-global.
-
-A view-local dependency only includes operations from a single
-<<renderpass-multiview-view-local,source view>> from the source subpass in
-the first synchronization scope, and only includes operations from a single
-<<renderpass-multiview-view-local,destination view>> from the destination
-subpass in the second synchronization scope.
-A view-global dependency includes all views in the view mask of the source
-and destination subpasses in the corresponding synchronization scopes.
-
-If a synchronization command includes a pname:dependencyFlags parameter and
-specifies the ename:VK_DEPENDENCY_VIEW_LOCAL_BIT flag, then it defines
-view-local dependencies for that synchronization command, for all views.
-If no pname:dependencyFlags parameter is included or the
-ename:VK_DEPENDENCY_VIEW_LOCAL_BIT flag is not specified, then a view-global
-dependency is specified.
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[[synchronization-device-local-dependencies]]
-=== Device-Local Dependencies
-
-Dependencies can: be either device-local or non-device-local.
-A device-local dependency acts as multiple separate dependencies, one for
-each physical device that executes the synchronization command, where each
-dependency only includes operations from that physical device in both
-synchronization scopes.
-A non-device-local dependency is a single dependency where both
-synchronization scopes include operations from all physical devices that
-participate in the synchronization command.
-For subpass dependencies, all physical devices in the
-slink:VkDeviceGroupRenderPassBeginInfo::pname:deviceMask participate in the
-dependency, and for pipeline barriers all physical devices that are set in
-the command buffer's current device mask participate in the dependency.
-
-If a synchronization command includes a pname:dependencyFlags parameter and
-specifies the ename:VK_DEPENDENCY_DEVICE_GROUP_BIT flag, then it defines a
-non-device-local dependency for that synchronization command.
-If no pname:dependencyFlags parameter is included or the
-ename:VK_DEPENDENCY_DEVICE_GROUP_BIT flag is not specified, then it defines
-device-local dependencies for that synchronization command, for all
-participating physical devices.
-
-Semaphore and event dependencies are device-local and only execute on the
-one physical device that performs the dependency.
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-
-[[synchronization-implicit]]
-== Implicit Synchronization Guarantees
-
-A small number of implicit ordering guarantees are provided by Vulkan,
-ensuring that the order in which commands are submitted is meaningful, and
-avoiding unnecessary complexity in common operations.
-
-[[synchronization-submission-order]]
-_Submission order_ is a fundamental ordering in Vulkan, giving meaning to
-the order in which <<fundamentals-queueoperation-command-types, action and
-synchronization commands>> are recorded and submitted to a single queue.
-Explicit and implicit ordering guarantees between commands in Vulkan all
-work on the premise that this ordering is meaningful.
-This order does not itself define any execution or memory dependencies;
-synchronization commands and other orderings within the API use this
-ordering to define their scopes.
-
-Submission order for any given set of commands is based on the order in
-which they were recorded to command buffers and then submitted.
-This order is determined as follows:
-
-  . The initial order is determined by the order in which
-    flink:vkQueueSubmit
-ifdef::VK_KHR_synchronization2[]
-    and flink:vkQueueSubmit2KHR
-endif::VK_KHR_synchronization2[]
-    commands are executed on the host, for a single queue, from first to
-    last.
-  . The order in which slink:VkSubmitInfo structures are specified in the
-    pname:pSubmits parameter of flink:vkQueueSubmit,
-ifdef::VK_KHR_synchronization2[]
-    or in which slink:VkSubmitInfo2KHR structures are specified in the
-    pname:pSubmits parameter of flink:vkQueueSubmit2KHR,
-endif::VK_KHR_synchronization2[]
-    from lowest index to highest.
-  . The order in which command buffers are specified in the
-    pname:pCommandBuffers member of slink:VkSubmitInfo
-ifdef::VK_KHR_synchronization2[]
-    or slink:VkSubmitInfo2KHR
-endif::VK_KHR_synchronization2[]
-    from lowest index to highest.
-  . The order in which commands were recorded to a command buffer on the
-    host, from first to last:
-  ** For commands recorded outside a render pass, this includes all other
-     commands recorded outside a render pass, including
-     flink:vkCmdBeginRenderPass and flink:vkCmdEndRenderPass commands; it
-     does not directly include commands inside a render pass.
-  ** For commands recorded inside a render pass, this includes all other
-     commands recorded inside the same subpass, including the
-     flink:vkCmdBeginRenderPass and flink:vkCmdEndRenderPass commands that
-     delimit the same render pass instance; it does not include commands
-     recorded to other subpasses.
-<<fundamentals-queueoperation-command-types, State commands>> do not execute
-any operations on the device, instead they set the state of the command
-buffer when they execute on the host, in the order that they are recorded.
-<<fundamentals-queueoperation-command-types, Action commands>> consume the
-current state of the command buffer when they are recorded, and will execute
-state changes on the device as required to match the recorded state.
-
-<<queries-order, Query commands>>, <<drawing-primitive-order, the order of
-primitives passing through the graphics pipeline>> and
-<<synchronization-image-barrier-layout-transition-order, image layout
-transitions as part of an image memory barrier>> provide additional
-guarantees based on submission order.
-
-Execution of <<synchronization-pipeline-stages-order, pipeline stages>>
-within a given command also has a loose ordering, dependent only on a single
-command.
-
-[[synchronization-signal-operation-order]]
-_Signal operation order_ is a fundamental ordering in Vulkan, giving meaning
-to the order in which semaphore and fence signal operations occur when
-submitted to a single queue.
-The signal operation order for queue operations is determined as follows:
-
-  . The initial order is determined by the order in which
-    flink:vkQueueSubmit
-ifdef::VK_KHR_synchronization2[]
-    and flink:vkQueueSubmit2KHR
-endif::VK_KHR_synchronization2[]
-    commands are executed on the host, for a single queue, from first to
-    last.
-  . The order in which slink:VkSubmitInfo structures are specified in the
-    pname:pSubmits parameter of flink:vkQueueSubmit,
-ifdef::VK_KHR_synchronization2[]
-    or in which slink:VkSubmitInfo2KHR structures are specified in the
-    pname:pSubmits parameter of flink:vkQueueSubmit2KHR,
-endif::VK_KHR_synchronization2[]
-    from lowest index to highest.
-  . The fence signal operation defined by the pname:fence parameter of a
-    flink:vkQueueSubmit,
-ifdef::VK_KHR_synchronization2[]
-    flink:vkQueueSubmit2KHR,
-endif::VK_KHR_synchronization2[]
-    or flink:vkQueueBindSparse command is ordered after all semaphore signal
-    operations defined by that command.
-
-Semaphore signal operations defined by a single slink:VkSubmitInfo,
-ifdef::VK_KHR_synchronization2[]
-slink:VkSubmitInfo2KHR,
-endif::VK_KHR_synchronization2[]
-or slink:VkBindSparseInfo structure are unordered with respect to other
-semaphore signal operations defined within the same structure.
-
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-The flink:vkSignalSemaphore command does not execute on a queue but instead
-performs the signal operation from the host.
-The semaphore signal operation defined by executing a
-flink:vkSignalSemaphore command happens-after the flink:vkSignalSemaphore
-command is invoked and happens-before the command returns.
-
-[NOTE]
-.Note
-====
-When signaling timeline semaphores, it is the responsibility of the
-application to ensure that they are ordered such that the semaphore value is
-strictly increasing.
-Because the first synchronization scope for a semaphore signal operation
-contains all semaphore signal operations which occur earlier in submission
-order, all semaphore signal operations contained in any given batch are
-guaranteed to happen-after all semaphore signal operations contained in any
-previous batches.
-However, no ordering guarantee is provided between the semaphore signal
-operations defined within a single batch.
-This, combined with the requirement that timeline semaphore values strictly
-increase, means that it is invalid to signal the same timeline semaphore
-twice within a single batch.
-
-If an application wishes to ensure that some semaphore signal operation
-happens-after some other semaphore signal operation, it can submit a
-separate batch containing only semaphore signal operations, which will
-happen-after the semaphore signal operations in any earlier batches.
-
-When signaling a semaphore from the host, the only ordering guarantee is
-that the signal operation happens-after when flink:vkSignalSemaphore is
-called and happens-before it returns.
-Therefore, it is invalid to call fname:vkSignalSemaphore while there are any
-outstanding signal operations on that semaphore from any queue submissions
-unless those queue submissions have some dependency which ensures that they
-happen-after the host signal operation.
-One example of this would be if the pending signal operation is, itself,
-waiting on the same semaphore at a lower value and the call to
-fname:vkSignalSemaphore signals that lower value.
-Furthermore, if there are two or more processes or threads signaling the
-same timeline semaphore from the host, the application must ensure that the
-fname:vkSignalSemaphore with the lower semaphore value returns before
-fname:vkSignalSemaphore is called with the higher value.
-====
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-
-[[synchronization-fences]]
-== Fences
-
-[open,refpage='VkFence',desc='Opaque handle to a fence object',type='handles']
---
-Fences are a synchronization primitive that can: be used to insert a
-dependency from a queue to the host.
-Fences have two states - signaled and unsignaled.
-A fence can: be signaled as part of the execution of a
-<<devsandqueues-submission, queue submission>> command.
-Fences can: be unsignaled on the host with flink:vkResetFences.
-Fences can: be waited on by the host with the flink:vkWaitForFences command,
-and the current state can: be queried with flink:vkGetFenceStatus.
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_fence[]
-[[synchronization-fences-payloads]]
-The internal data of a fence may: include a reference to any resources and
-pending work associated with signal or unsignal operations performed on that
-fence object, collectively referred to as the fence's _payload_.
-Mechanisms to import and export that internal data to and from fences are
-provided <<VkExportFenceCreateInfo, below>>.
-These mechanisms indirectly enable applications to share fence state between
-two or more fences and other synchronization primitives across process and
-API boundaries.
-
-endif::VK_VERSION_1_1,VK_KHR_external_fence[]
-
-Fences are represented by sname:VkFence handles:
-
-include::{generated}/api/handles/VkFence.txt[]
---
-
-[open,refpage='vkCreateFence',desc='Create a new fence object',type='protos']
---
-To create a fence, call:
-
-include::{generated}/api/protos/vkCreateFence.txt[]
-
-  * pname:device is the logical device that creates the fence.
-  * pname:pCreateInfo is a pointer to a slink:VkFenceCreateInfo structure
-    containing information about how the fence is to be created.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pFence is a pointer to a handle in which the resulting fence
-    object is returned.
-
-include::{generated}/validity/protos/vkCreateFence.txt[]
---
-
-[open,refpage='VkFenceCreateInfo',desc='Structure specifying parameters of a newly created fence',type='structs']
---
-The sname:VkFenceCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkFenceCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkFenceCreateFlagBits specifying the
-    initial state and behavior of the fence.
-
-include::{generated}/validity/structs/VkFenceCreateInfo.txt[]
---
-
-[open,refpage='VkFenceCreateFlagBits',desc='Bitmask specifying initial state and behavior of a fence',type='enums']
---
-include::{generated}/api/enums/VkFenceCreateFlagBits.txt[]
-
-  * ename:VK_FENCE_CREATE_SIGNALED_BIT specifies that the fence object is
-    created in the signaled state.
-    Otherwise, it is created in the unsignaled state.
---
-
-[open,refpage='VkFenceCreateFlags',desc='Bitmask of VkFenceCreateFlagBits',type='flags']
---
-include::{generated}/api/flags/VkFenceCreateFlags.txt[]
-
-tname:VkFenceCreateFlags is a bitmask type for setting a mask of zero or
-more elink:VkFenceCreateFlagBits.
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_fence[]
-[open,refpage='VkExportFenceCreateInfo',desc='Structure specifying handle types that can be exported from a fence',type='structs']
---
-To create a fence whose payload can: be exported to external handles, add a
-slink:VkExportFenceCreateInfo structure to the pname:pNext chain of the
-slink:VkFenceCreateInfo structure.
-The sname:VkExportFenceCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkExportFenceCreateInfo.txt[]
-
-ifdef::VK_KHR_external_fence[]
-or the equivalent
-
-include::{generated}/api/structs/VkExportFenceCreateInfoKHR.txt[]
-endif::VK_KHR_external_fence[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleTypes is a bitmask of
-    elink:VkExternalFenceHandleTypeFlagBits specifying one or more fence
-    handle types the application can: export from the resulting fence.
-    The application can: request multiple handle types for the same fence.
-
-.Valid Usage
-****
-  * [[VUID-VkExportFenceCreateInfo-handleTypes-01446]]
-    The bits in pname:handleTypes must: be supported and compatible, as
-    reported by slink:VkExternalFenceProperties
-****
-
-include::{generated}/validity/structs/VkExportFenceCreateInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_external_fence[]
-
-ifdef::VK_KHR_external_fence_win32[]
-[open,refpage='VkExportFenceWin32HandleInfoKHR',desc='Structure specifying additional attributes of Windows handles exported from a fence',type='structs']
---
-To specify additional attributes of NT handles exported from a fence, add a
-slink:VkExportFenceWin32HandleInfoKHR structure to the pname:pNext chain of
-the slink:VkFenceCreateInfo structure.
-The sname:VkExportFenceWin32HandleInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkExportFenceWin32HandleInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pAttributes is a pointer to a Windows code:SECURITY_ATTRIBUTES
-    structure specifying security attributes of the handle.
-  * pname:dwAccess is a code:DWORD specifying access rights of the handle.
-  * pname:name is a null-terminated UTF-16 string to associate with the
-    underlying synchronization primitive referenced by NT handles exported
-    from the created fence.
-
-If slink:VkExportFenceCreateInfo is not inluded in the same pname:pNext
-chain, this structure is ignored.
-
-If slink:VkExportFenceCreateInfo is included in the pname:pNext chain of
-slink:VkFenceCreateInfo with a Windows pname:handleType, but either
-sname:VkExportFenceWin32HandleInfoKHR is not included in the pname:pNext
-chain, or if it is but pname:pAttributes is set to `NULL`, default security
-descriptor values will be used, and child processes created by the
-application will not inherit the handle, as described in the MSDN
-documentation for "`Synchronization Object Security and Access Rights`"^1^.
-Further, if the structure is not present, the access rights will be
-
-code:DXGI_SHARED_RESOURCE_READ | code:DXGI_SHARED_RESOURCE_WRITE
-
-for handles of the following types:
-
-ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT
-
-1::
-    https://docs.microsoft.com/en-us/windows/win32/sync/synchronization-object-security-and-access-rights
-
-.Valid Usage
-****
-  * [[VUID-VkExportFenceWin32HandleInfoKHR-handleTypes-01447]]
-    If slink:VkExportFenceCreateInfo::pname:handleTypes does not include
-    ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT, a
-    sname:VkExportFenceWin32HandleInfoKHR structure must: not be included in
-    the pname:pNext chain of slink:VkFenceCreateInfo
-****
-
-include::{generated}/validity/structs/VkExportFenceWin32HandleInfoKHR.txt[]
---
-
-[open,refpage='vkGetFenceWin32HandleKHR',desc='Get a Windows HANDLE for a fence',type='protos']
---
-To export a Windows handle representing the state of a fence, call:
-
-include::{generated}/api/protos/vkGetFenceWin32HandleKHR.txt[]
-
-  * pname:device is the logical device that created the fence being
-    exported.
-  * pname:pGetWin32HandleInfo is a pointer to a
-    slink:VkFenceGetWin32HandleInfoKHR structure containing parameters of
-    the export operation.
-  * pname:pHandle will return the Windows handle representing the fence
-    state.
-
-For handle types defined as NT handles, the handles returned by
-fname:vkGetFenceWin32HandleKHR are owned by the application.
-To avoid leaking resources, the application must: release ownership of them
-using the code:CloseHandle system call when they are no longer needed.
-
-Exporting a Windows handle from a fence may: have side effects depending on
-the transference of the specified handle type, as described in
-<<synchronization-fences-importing,Importing Fence Payloads>>.
-
-include::{generated}/validity/protos/vkGetFenceWin32HandleKHR.txt[]
---
-
-[open,refpage='VkFenceGetWin32HandleInfoKHR',desc='Structure describing a Win32 handle fence export operation',type='structs']
---
-The sname:VkFenceGetWin32HandleInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkFenceGetWin32HandleInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:fence is the fence from which state will be exported.
-  * pname:handleType is a elink:VkExternalFenceHandleTypeFlagBits value
-    specifying the type of handle requested.
-
-The properties of the handle returned depend on the value of
-pname:handleType.
-See elink:VkExternalFenceHandleTypeFlagBits for a description of the
-properties of the defined external fence handle types.
-
-.Valid Usage
-****
-  * [[VUID-VkFenceGetWin32HandleInfoKHR-handleType-01448]]
-    pname:handleType must: have been included in
-    slink:VkExportFenceCreateInfo::pname:handleTypes when the pname:fence's
-    current payload was created
-  * [[VUID-VkFenceGetWin32HandleInfoKHR-handleType-01449]]
-    If pname:handleType is defined as an NT handle,
-    flink:vkGetFenceWin32HandleKHR must: be called no more than once for
-    each valid unique combination of pname:fence and pname:handleType
-  * [[VUID-VkFenceGetWin32HandleInfoKHR-fence-01450]]
-    pname:fence must: not currently have its payload replaced by an imported
-    payload as described below in
-    <<synchronization-fences-importing,Importing Fence Payloads>> unless
-    that imported payload's handle type was included in
-    slink:VkExternalFenceProperties::pname:exportFromImportedHandleTypes for
-    pname:handleType
-  * [[VUID-VkFenceGetWin32HandleInfoKHR-handleType-01451]]
-    If pname:handleType refers to a handle type with copy payload
-    transference semantics, pname:fence must: be signaled, or have an
-    associated <<synchronization-fences-signaling,fence signal operation>>
-    pending execution
-  * [[VUID-VkFenceGetWin32HandleInfoKHR-handleType-01452]]
-    pname:handleType must: be defined as an NT handle or a global share
-    handle
-****
-
-include::{generated}/validity/structs/VkFenceGetWin32HandleInfoKHR.txt[]
---
-endif::VK_KHR_external_fence_win32[]
-
-ifdef::VK_KHR_external_fence_fd[]
-[open,refpage='vkGetFenceFdKHR',desc='Get a POSIX file descriptor handle for a fence',type='protos']
---
-To export a POSIX file descriptor representing the payload of a fence, call:
-
-include::{generated}/api/protos/vkGetFenceFdKHR.txt[]
-
-  * pname:device is the logical device that created the fence being
-    exported.
-  * pname:pGetFdInfo is a pointer to a slink:VkFenceGetFdInfoKHR structure
-    containing parameters of the export operation.
-  * pname:pFd will return the file descriptor representing the fence
-    payload.
-
-Each call to fname:vkGetFenceFdKHR must: create a new file descriptor and
-transfer ownership of it to the application.
-To avoid leaking resources, the application must: release ownership of the
-file descriptor when it is no longer needed.
-
-[NOTE]
-.Note
-====
-Ownership can be released in many ways.
-For example, the application can call code:close() on the file descriptor,
-or transfer ownership back to Vulkan by using the file descriptor to import
-a fence payload.
-====
-
-If pname:pGetFdInfo->handleType is
-ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT and the fence is signaled at
-the time fname:vkGetFenceFdKHR is called, pname:pFd may: return the value
-`-1` instead of a valid file descriptor.
-
-Where supported by the operating system, the implementation must: set the
-file descriptor to be closed automatically when an code:execve system call
-is made.
-
-Exporting a file descriptor from a fence may: have side effects depending on
-the transference of the specified handle type, as described in
-<<synchronization-fences-importing,Importing Fence State>>.
-
-include::{generated}/validity/protos/vkGetFenceFdKHR.txt[]
---
-
-[open,refpage='VkFenceGetFdInfoKHR',desc='Structure describing a POSIX FD fence export operation',type='structs']
---
-The sname:VkFenceGetFdInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkFenceGetFdInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:fence is the fence from which state will be exported.
-  * pname:handleType is a elink:VkExternalFenceHandleTypeFlagBits value
-    specifying the type of handle requested.
-
-The properties of the file descriptor returned depend on the value of
-pname:handleType.
-See elink:VkExternalFenceHandleTypeFlagBits for a description of the
-properties of the defined external fence handle types.
-
-.Valid Usage
-****
-  * [[VUID-VkFenceGetFdInfoKHR-handleType-01453]]
-    pname:handleType must: have been included in
-    slink:VkExportFenceCreateInfo::pname:handleTypes when pname:fence's
-    current payload was created
-  * [[VUID-VkFenceGetFdInfoKHR-handleType-01454]]
-    If pname:handleType refers to a handle type with copy payload
-    transference semantics, pname:fence must: be signaled, or have an
-    associated <<synchronization-fences-signaling,fence signal operation>>
-    pending execution
-  * [[VUID-VkFenceGetFdInfoKHR-fence-01455]]
-    pname:fence must: not currently have its payload replaced by an imported
-    payload as described below in
-    <<synchronization-fences-importing,Importing Fence Payloads>> unless
-    that imported payload's handle type was included in
-    slink:VkExternalFenceProperties::pname:exportFromImportedHandleTypes for
-    pname:handleType
-  * [[VUID-VkFenceGetFdInfoKHR-handleType-01456]]
-    pname:handleType must: be defined as a POSIX file descriptor handle
-****
-
-include::{generated}/validity/structs/VkFenceGetFdInfoKHR.txt[]
---
-endif::VK_KHR_external_fence_fd[]
-
-[open,refpage='vkDestroyFence',desc='Destroy a fence object',type='protos']
---
-To destroy a fence, call:
-
-include::{generated}/api/protos/vkDestroyFence.txt[]
-
-  * pname:device is the logical device that destroys the fence.
-  * pname:fence is the handle of the fence to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyFence-fence-01120]]
-    All <<devsandqueues-submission, queue submission>> commands that refer
-    to pname:fence must: have completed execution
-  * [[VUID-vkDestroyFence-fence-01121]]
-    If sname:VkAllocationCallbacks were provided when pname:fence was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyFence-fence-01122]]
-    If no sname:VkAllocationCallbacks were provided when pname:fence was
-    created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyFence.txt[]
---
-
-[open,refpage='vkGetFenceStatus',desc='Return the status of a fence',type='protos']
---
-To query the status of a fence from the host, call:
-
-include::{generated}/api/protos/vkGetFenceStatus.txt[]
-
-  * pname:device is the logical device that owns the fence.
-  * pname:fence is the handle of the fence to query.
-
-Upon success, fname:vkGetFenceStatus returns the status of the fence object,
-with the following return codes:
-
-.Fence Object Status Codes
-[width="80%",options="header"]
-|====
-| Status | Meaning
-| ename:VK_SUCCESS | The fence specified by pname:fence is signaled.
-| ename:VK_NOT_READY | The fence specified by pname:fence is unsignaled.
-| ename:VK_ERROR_DEVICE_LOST | The device has been lost.  See <<devsandqueues-lost-device,Lost Device>>.
-|====
-
-If a <<devsandqueues-submission, queue submission>> command is pending
-execution, then the value returned by this command may: immediately be out
-of date.
-
-If the device has been lost (see <<devsandqueues-lost-device,Lost Device>>),
-fname:vkGetFenceStatus may: return any of the above status codes.
-If the device has been lost and fname:vkGetFenceStatus is called repeatedly,
-it will eventually return either ename:VK_SUCCESS or
-ename:VK_ERROR_DEVICE_LOST.
-
-include::{generated}/validity/protos/vkGetFenceStatus.txt[]
---
-
-[[synchronization-fences-unsignaling]]
-[open,refpage='vkResetFences',desc='Resets one or more fence objects',type='protos']
---
-To set the state of fences to unsignaled from the host, call:
-
-include::{generated}/api/protos/vkResetFences.txt[]
-
-  * pname:device is the logical device that owns the fences.
-  * pname:fenceCount is the number of fences to reset.
-  * pname:pFences is a pointer to an array of fence handles to reset.
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_fence[]
-
-If any member of pname:pFences currently has its
-<<synchronization-fences-importing, payload imported>> with temporary
-permanence, that fence's prior permanent payload is first restored.
-The remaining operations described therefore operate on the restored
-payload.
-
-endif::VK_VERSION_1_1,VK_KHR_external_fence[]
-
-When flink:vkResetFences is executed on the host, it defines a _fence
-unsignal operation_ for each fence, which resets the fence to the unsignaled
-state.
-
-If any member of pname:pFences is already in the unsignaled state when
-flink:vkResetFences is executed, then flink:vkResetFences has no effect on
-that fence.
-
-.Valid Usage
-****
-  * [[VUID-vkResetFences-pFences-01123]]
-    Each element of pname:pFences must: not be currently associated with any
-    queue command that has not yet completed execution on that queue
-****
-
-include::{generated}/validity/protos/vkResetFences.txt[]
---
-
-[[synchronization-fences-signaling]]
-When a fence is submitted to a queue as part of a
-<<devsandqueues-submission, queue submission>> command, it defines a memory
-dependency on the batches that were submitted as part of that command, and
-defines a _fence signal operation_ which sets the fence to the signaled
-state.
-
-The first <<synchronization-dependencies-scopes, synchronization scope>>
-includes every batch submitted in the same <<devsandqueues-submission, queue
-submission>> command.
-Fence signal operations that are defined by flink:vkQueueSubmit additionally
-include in the first synchronization scope all commands that occur earlier
-in <<synchronization-submission-order,submission order>>.
-Fence signal operations that are defined by flink:vkQueueSubmit or
-flink:vkQueueBindSparse additionally include in the first synchronization
-scope any semaphore and fence signal operations that occur earlier in
-<<synchronization-signal-operation-order,signal operation order>>.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-only includes the fence signal operation.
-
-The first <<synchronization-dependencies-access-scopes, access scope>>
-includes all memory access performed by the device.
-
-The second <<synchronization-dependencies-access-scopes, access scope>> is
-empty.
-
-[open,refpage='vkWaitForFences',desc='Wait for one or more fences to become signaled',type='protos']
---
-To wait for one or more fences to enter the signaled state on the host,
-call:
-
-include::{generated}/api/protos/vkWaitForFences.txt[]
-
-  * pname:device is the logical device that owns the fences.
-  * pname:fenceCount is the number of fences to wait on.
-  * pname:pFences is a pointer to an array of pname:fenceCount fence
-    handles.
-  * pname:waitAll is the condition that must: be satisfied to successfully
-    unblock the wait.
-    If pname:waitAll is ename:VK_TRUE, then the condition is that all fences
-    in pname:pFences are signaled.
-    Otherwise, the condition is that at least one fence in pname:pFences is
-    signaled.
-  * pname:timeout is the timeout period in units of nanoseconds.
-    pname:timeout is adjusted to the closest value allowed by the
-    implementation-dependent timeout accuracy, which may: be substantially
-    longer than one nanosecond, and may: be longer than the requested
-    period.
-
-If the condition is satisfied when fname:vkWaitForFences is called, then
-fname:vkWaitForFences returns immediately.
-If the condition is not satisfied at the time fname:vkWaitForFences is
-called, then fname:vkWaitForFences will block and wait until the condition
-is satisfied or the pname:timeout has expired, whichever is sooner.
-
-If pname:timeout is zero, then fname:vkWaitForFences does not wait, but
-simply returns the current state of the fences.
-ename:VK_TIMEOUT will be returned in this case if the condition is not
-satisfied, even though no actual wait was performed.
-
-If the condition is satisfied before the pname:timeout has expired,
-fname:vkWaitForFences returns ename:VK_SUCCESS.
-Otherwise, fname:vkWaitForFences returns ename:VK_TIMEOUT after the
-pname:timeout has expired.
-
-If device loss occurs (see <<devsandqueues-lost-device,Lost Device>>) before
-the timeout has expired, fname:vkWaitForFences must: return in finite time
-with either ename:VK_SUCCESS or ename:VK_ERROR_DEVICE_LOST.
-
-[NOTE]
-.Note
-====
-While we guarantee that fname:vkWaitForFences must: return in finite time,
-no guarantees are made that it returns immediately upon device loss.
-However, the client can reasonably expect that the delay will be on the
-order of seconds and that calling fname:vkWaitForFences will not result in a
-permanently (or seemingly permanently) dead process.
-====
-
-include::{generated}/validity/protos/vkWaitForFences.txt[]
---
-
-[[synchronization-fences-waiting]]
-An execution dependency is defined by waiting for a fence to become
-signaled, either via flink:vkWaitForFences or by polling on
-flink:vkGetFenceStatus.
-
-The first <<synchronization-dependencies-scopes, synchronization scope>>
-includes only the fence signal operation.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-includes the host operations of flink:vkWaitForFences or
-flink:vkGetFenceStatus indicating that the fence has become signaled.
-
-[NOTE]
-.Note
-====
-Signaling a fence and waiting on the host does not guarantee that the
-results of memory accesses will be visible to the host, as the access scope
-of a memory dependency defined by a fence only includes device access.
-A <<synchronization-memory-barriers, memory barrier>> or other memory
-dependency must: be used to guarantee this.
-See the description of <<synchronization-host-access-types, host access
-types>> for more information.
-====
-
-ifdef::VK_EXT_display_control[]
-include::VK_EXT_display_control/fence_events.txt[]
-endif::VK_EXT_display_control[]
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_fence[]
-[[synchronization-fences-importing]]
-=== Importing Fence Payloads
-
-Applications can: import a fence payload into an existing fence using an
-external fence handle.
-The effects of the import operation will be either temporary or permanent,
-as specified by the application.
-If the import is temporary, the fence will be _restored_ to its permanent
-state the next time that fence is passed to flink:vkResetFences.
-
-[NOTE]
-.Note
-====
-Restoring a fence to its prior permanent payload is a distinct operation
-from resetting a fence payload.
-See flink:vkResetFences for more detail.
-====
-
-Performing a subsequent temporary import on a fence before resetting it has
-no effect on this requirement; the next unsignal of the fence must: still
-restore its last permanent state.
-A permanent payload import behaves as if the target fence was destroyed, and
-a new fence was created with the same handle but the imported payload.
-Because importing a fence payload temporarily or permanently detaches the
-existing payload from a fence, similar usage restrictions to those applied
-to fname:vkDestroyFence are applied to any command that imports a fence
-payload.
-Which of these import types is used is referred to as the import operation's
-_permanence_.
-Each handle type supports either one or both types of permanence.
-
-The implementation must: perform the import operation by either referencing
-or copying the payload referred to by the specified external fence handle,
-depending on the handle's type.
-The import method used is referred to as the handle type's _transference_.
-When using handle types with reference transference, importing a payload to
-a fence adds the fence to the set of all fences sharing that payload.
-This set includes the fence from which the payload was exported.
-Fence signaling, waiting, and resetting operations performed on any fence in
-the set must: behave as if the set were a single fence.
-Importing a payload using handle types with copy transference creates a
-duplicate copy of the payload at the time of import, but makes no further
-reference to it.
-Fence signaling, waiting, and resetting operations performed on the target
-of copy imports must: not affect any other fence or payload.
-
-Export operations have the same transference as the specified handle type's
-import operations.
-Additionally, exporting a fence payload to a handle with copy transference
-has the same side effects on the source fence's payload as executing a fence
-reset operation.
-If the fence was using a temporarily imported payload, the fence's prior
-permanent payload will be restored.
-
-ifdef::VK_KHR_external_fence_win32,VK_KHR_external_fence_fd[]
-[NOTE]
-.Note
-====
-The
-ifdef::VK_KHR_external_fence_win32+VK_KHR_external_fence_fd[tables]
-ifndef::VK_KHR_external_fence_win32+VK_KHR_external_fence_fd[table]
-ifdef::VK_KHR_external_fence_win32[]
-<<synchronization-fence-handletypes-win32,Handle Types Supported by
-sname:VkImportFenceWin32HandleInfoKHR>>
-endif::VK_KHR_external_fence_win32[]
-ifdef::VK_KHR_external_fence_win32+VK_KHR_external_fence_fd[and]
-ifdef::VK_KHR_external_fence_fd[]
-<<synchronization-fence-handletypes-fd,Handle Types Supported by
-sname:VkImportFenceFdInfoKHR>>
-endif::VK_KHR_external_fence_fd[]
-ifdef::VK_KHR_external_fence_win32+VK_KHR_external_fence_fd[define]
-ifndef::VK_KHR_external_fence_win32+VK_KHR_external_fence_fd[defines]
-the permanence and transference of each handle type.
-====
-endif::VK_KHR_external_fence_win32,VK_KHR_external_fence_fd[]
-
-<<fundamentals-threadingbehavior,External synchronization>> allows
-implementations to modify an object's internal state, i.e. payload, without
-internal synchronization.
-However, for fences sharing a payload across processes, satisfying the
-external synchronization requirements of sname:VkFence parameters as if all
-fences in the set were the same object is sometimes infeasible.
-Satisfying valid usage constraints on the state of a fence would similarly
-require impractical coordination or levels of trust between processes.
-Therefore, these constraints only apply to a specific fence handle, not to
-its payload.
-For distinct fence objects which share a payload:
-
-  * If multiple commands which queue a signal operation, or which unsignal a
-    fence, are called concurrently, behavior will be as if the commands were
-    called in an arbitrary sequential order.
-  * If a queue submission command is called with a fence that is sharing a
-    payload, and the payload is already associated with another queue
-    command that has not yet completed execution, either one or both of the
-    commands will cause the fence to become signaled when they complete
-    execution.
-  * If a fence payload is reset while it is associated with a queue command
-    that has not yet completed execution, the payload will become
-    unsignaled, but may: become signaled again when the command completes
-    execution.
-  * In the preceding cases, any of the devices associated with the fences
-    sharing the payload may: be lost, or any of the queue submission or
-    fence reset commands may: return ename:VK_ERROR_INITIALIZATION_FAILED.
-
-Other than these non-deterministic results, behavior is well defined.
-In particular:
-
-  * The implementation must: not crash or enter an internally inconsistent
-    state where future valid Vulkan commands might cause undefined: results,
-  * Timeouts on future wait commands on fences sharing the payload must: be
-    effective.
-
-[NOTE]
-.Note
-====
-These rules allow processes to synchronize access to shared memory without
-trusting each other.
-However, such processes must still be cautious not to use the shared fence
-for more than synchronizing access to the shared memory.
-For example, a process should not use a fence with shared payload to tell
-when commands it submitted to a queue have completed and objects used by
-those commands may be destroyed, since the other process can accidentally or
-maliciously cause the fence to signal before the commands actually complete.
-====
-
-When a fence is using an imported payload, its
-slink:VkExportFenceCreateInfo::pname:handleTypes value is that specified
-when creating the fence from which the payload was exported, rather than
-that specified when creating the fence.
-Additionally,
-slink:VkExternalFenceProperties::pname:exportFromImportedHandleTypes
-restricts which handle types can: be exported from such a fence based on the
-specific handle type used to import the current payload.
-ifdef::VK_KHR_swapchain[]
-Passing a fence to flink:vkAcquireNextImageKHR is equivalent to temporarily
-importing a fence payload to that fence.
-
-[NOTE]
-.Note
-====
-Because the exportable handle types of an imported fence correspond to its
-current imported payload, and flink:vkAcquireNextImageKHR behaves the same
-as a temporary import operation for which the source fence is opaque to the
-application, applications have no way of determining whether any external
-handle types can: be exported from a fence in this state.
-Therefore, applications must: not attempt to export handles from fences
-using a temporarily imported payload from flink:vkAcquireNextImageKHR.
-====
-endif::VK_KHR_swapchain[]
-
-When importing a fence payload, it is the responsibility of the application
-to ensure the external handles meet all valid usage requirements.
-However, implementations must: perform sufficient validation of external
-handles to ensure that the operation results in a valid fence which will not
-cause program termination, device loss, queue stalls, host thread stalls, or
-corruption of other resources when used as allowed according to its import
-parameters.
-If the external handle provided does not meet these requirements, the
-implementation must: fail the fence payload import operation with the error
-code ename:VK_ERROR_INVALID_EXTERNAL_HANDLE.
-endif::VK_VERSION_1_1,VK_KHR_external_fence[]
-
-ifdef::VK_KHR_external_fence_win32[]
-[open,refpage='vkImportFenceWin32HandleKHR',desc='Import a fence from a Windows HANDLE',type='protos']
---
-To import a fence payload from a Windows handle, call:
-
-include::{generated}/api/protos/vkImportFenceWin32HandleKHR.txt[]
-
-  * pname:device is the logical device that created the fence.
-  * pname:pImportFenceWin32HandleInfo is a pointer to a
-    slink:VkImportFenceWin32HandleInfoKHR structure specifying the fence and
-    import parameters.
-
-Importing a fence payload from Windows handles does not transfer ownership
-of the handle to the Vulkan implementation.
-For handle types defined as NT handles, the application must: release
-ownership using the code:CloseHandle system call when the handle is no
-longer needed.
-
-Applications can: import the same fence payload into multiple instances of
-Vulkan, into the same instance from which it was exported, and multiple
-times into a given Vulkan instance.
-
-.Valid Usage
-****
-  * [[VUID-vkImportFenceWin32HandleKHR-fence-04448]]
-    pname:fence must: not be associated with any queue command that has not
-    yet completed execution on that queue
-****
-
-include::{generated}/validity/protos/vkImportFenceWin32HandleKHR.txt[]
---
-
-[open,refpage='VkImportFenceWin32HandleInfoKHR',desc='(None)',type='structs']
---
-The sname:VkImportFenceWin32HandleInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkImportFenceWin32HandleInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:fence is the fence into which the state will be imported.
-  * pname:flags is a bitmask of elink:VkFenceImportFlagBits specifying
-    additional parameters for the fence payload import operation.
-  * pname:handleType is a elink:VkExternalFenceHandleTypeFlagBits value
-    specifying the type of pname:handle.
-  * pname:handle is `NULL` or the external handle to import.
-  * pname:name is `NULL` or a null-terminated UTF-16 string naming the
-    underlying synchronization primitive to import.
-
-The handle types supported by pname:handleType are:
-
-[[synchronization-fence-handletypes-win32]]
-.Handle Types Supported by sname:VkImportFenceWin32HandleInfoKHR
-[width="80%",options="header"]
-|====
-| Handle Type                                                  | Transference | Permanence Supported
-| ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT     | Reference    | Temporary,Permanent
-| ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT | Reference    | Temporary,Permanent
-|====
-
-.Valid Usage
-****
-  * [[VUID-VkImportFenceWin32HandleInfoKHR-handleType-01457]]
-    pname:handleType must: be a value included in the
-    <<synchronization-fence-handletypes-win32, Handle Types Supported by
-    sname:VkImportFenceWin32HandleInfoKHR>> table
-  * [[VUID-VkImportFenceWin32HandleInfoKHR-handleType-01459]]
-    If pname:handleType is not
-    ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT, pname:name must:
-    be `NULL`
-  * [[VUID-VkImportFenceWin32HandleInfoKHR-handleType-01460]]
-    If pname:handle is `NULL`, pname:name must: name a valid synchronization
-    primitive of the type specified by pname:handleType
-  * [[VUID-VkImportFenceWin32HandleInfoKHR-handleType-01461]]
-    If pname:name is `NULL`, pname:handle must: be a valid handle of the
-    type specified by pname:handleType
-  * [[VUID-VkImportFenceWin32HandleInfoKHR-handle-01462]]
-    If pname:handle is not `NULL`, pname:name must: be `NULL`
-  * [[VUID-VkImportFenceWin32HandleInfoKHR-handle-01539]]
-    If pname:handle is not `NULL`, it must: obey any requirements listed for
-    pname:handleType in <<external-fence-handle-types-compatibility,external
-    fence handle types compatibility>>
-  * [[VUID-VkImportFenceWin32HandleInfoKHR-name-01540]]
-    If pname:name is not `NULL`, it must: obey any requirements listed for
-    pname:handleType in <<external-fence-handle-types-compatibility,external
-    fence handle types compatibility>>
-****
-
-include::{generated}/validity/structs/VkImportFenceWin32HandleInfoKHR.txt[]
---
-endif::VK_KHR_external_fence_win32[]
-
-ifdef::VK_KHR_external_fence_fd[]
-[open,refpage='vkImportFenceFdKHR',desc='Import a fence from a POSIX file descriptor',type='protos']
---
-To import a fence payload from a POSIX file descriptor, call:
-
-include::{generated}/api/protos/vkImportFenceFdKHR.txt[]
-
-  * pname:device is the logical device that created the fence.
-  * pname:pImportFenceFdInfo is a pointer to a slink:VkImportFenceFdInfoKHR
-    structure specifying the fence and import parameters.
-
-Importing a fence payload from a file descriptor transfers ownership of the
-file descriptor from the application to the Vulkan implementation.
-The application must: not perform any operations on the file descriptor
-after a successful import.
-
-Applications can: import the same fence payload into multiple instances of
-Vulkan, into the same instance from which it was exported, and multiple
-times into a given Vulkan instance.
-
-.Valid Usage
-****
-  * [[VUID-vkImportFenceFdKHR-fence-01463]]
-    pname:fence must: not be associated with any queue command that has not
-    yet completed execution on that queue
-****
-
-include::{generated}/validity/protos/vkImportFenceFdKHR.txt[]
---
-
-[open,refpage='VkImportFenceFdInfoKHR',desc='(None)',type='structs']
---
-The sname:VkImportFenceFdInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkImportFenceFdInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:fence is the fence into which the payload will be imported.
-  * pname:flags is a bitmask of elink:VkFenceImportFlagBits specifying
-    additional parameters for the fence payload import operation.
-  * pname:handleType is a elink:VkExternalFenceHandleTypeFlagBits value
-    specifying the type of pname:fd.
-  * pname:fd is the external handle to import.
-
-The handle types supported by pname:handleType are:
-
-[[synchronization-fence-handletypes-fd]]
-.Handle Types Supported by sname:VkImportFenceFdInfoKHR
-[width="80%",options="header"]
-|====
-| Handle Type                                           | Transference | Permanence Supported
-| ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT | Reference    | Temporary,Permanent
-| ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT   | Copy         | Temporary
-|====
-
-.Valid Usage
-****
-  * [[VUID-VkImportFenceFdInfoKHR-handleType-01464]]
-    pname:handleType must: be a value included in the
-    <<synchronization-fence-handletypes-fd, Handle Types Supported by
-    sname:VkImportFenceFdInfoKHR>> table
-  * [[VUID-VkImportFenceFdInfoKHR-fd-01541]]
-    pname:fd must: obey any requirements listed for pname:handleType in
-    <<external-fence-handle-types-compatibility,external fence handle types
-    compatibility>>
-****
-
-If pname:handleType is ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT, the
-special value `-1` for pname:fd is treated like a valid sync file descriptor
-referring to an object that has already signaled.
-The import operation will succeed and the sname:VkFence will have a
-temporarily imported payload as if a valid file descriptor had been
-provided.
-
-[NOTE]
-.Note
-====
-This special behavior for importing an invalid sync file descriptor allows
-easier interoperability with other system APIs which use the convention that
-an invalid sync file descriptor represents work that has already completed
-and does not need to be waited for.
-It is consistent with the option for implementations to return a `-1` file
-descriptor when exporting a ename:VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT
-from a sname:VkFence which is signaled.
-====
-
-include::{generated}/validity/structs/VkImportFenceFdInfoKHR.txt[]
---
-endif::VK_KHR_external_fence_fd[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_fence[]
-ifdef::VK_KHR_external_fence_win32,VK_KHR_external_fence_fd[]
-[open,refpage='VkFenceImportFlagBits',desc='Bitmask specifying additional parameters of fence payload import',type='enums']
---
-Bits which can: be set in
-
-ifdef::VK_KHR_external_fence_win32[]
-  * slink:VkImportFenceWin32HandleInfoKHR::pname:flags
-endif::VK_KHR_external_fence_win32[]
-ifdef::VK_KHR_external_fence_fd[]
-  * slink:VkImportFenceFdInfoKHR::pname:flags
-endif::VK_KHR_external_fence_fd[]
-
-specifying additional parameters of a fence import operation are:
-
-include::{generated}/api/enums/VkFenceImportFlagBits.txt[]
-
-ifdef::VK_KHR_external_fence[]
-or the equivalent
-
-include::{generated}/api/enums/VkFenceImportFlagBitsKHR.txt[]
-endif::VK_KHR_external_fence[]
-
-  * ename:VK_FENCE_IMPORT_TEMPORARY_BIT specifies that the fence payload
-    will be imported only temporarily, as described in
-    <<synchronization-fences-importing,Importing Fence Payloads>>,
-    regardless of the permanence of pname:handleType.
---
-
-[open,refpage='VkFenceImportFlags',desc='Bitmask of VkFenceImportFlagBits',type='flags']
---
-include::{generated}/api/flags/VkFenceImportFlags.txt[]
-
-ifdef::VK_KHR_external_fence[]
-or the equivalent
-
-include::{generated}/api/flags/VkFenceImportFlagsKHR.txt[]
-endif::VK_KHR_external_fence[]
-
-tname:VkFenceImportFlags is a bitmask type for setting a mask of zero or
-more elink:VkFenceImportFlagBits.
---
-endif::VK_KHR_external_fence_win32,VK_KHR_external_fence_fd[]
-endif::VK_VERSION_1_1,VK_KHR_external_fence[]
-
-
-[[synchronization-semaphores]]
-== Semaphores
-
-[open,refpage='VkSemaphore',desc='Opaque handle to a semaphore object',type='handles']
---
-Semaphores are a synchronization primitive that can: be used to insert a
-dependency
-ifndef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-between queue operations.
-Semaphores have two states - signaled and unsignaled.
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-between queue operations or between a queue operation and the host.
-<<glossary, Binary semaphores>> have two states - signaled and unsignaled.
-<<glossary, Timeline semaphores>> have a strictly increasing 64-bit unsigned
-integer payload and are signaled with respect to a particular reference
-value.
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-A semaphore can: be signaled after execution of a queue operation is
-completed, and a queue operation can: wait for a semaphore to become
-signaled before it begins execution.
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-A timeline semaphore can: additionally be signaled from the host with the
-flink:vkSignalSemaphore command and waited on from the host with the
-flink:vkWaitSemaphores command.
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_semaphore[]
-[[synchronization-semaphores-payloads]]
-The internal data of a semaphore may: include a reference to any resources
-and pending work associated with signal or unsignal operations performed on
-that semaphore object, collectively referred to as the semaphore's
-_payload_.
-Mechanisms to import and export that internal data to and from semaphores
-are provided <<VkExportSemaphoreCreateInfo, below>>.
-These mechanisms indirectly enable applications to share semaphore state
-between two or more semaphores and other synchronization primitives across
-process and API boundaries.
-
-endif::VK_VERSION_1_1,VK_KHR_external_semaphore[]
-
-Semaphores are represented by sname:VkSemaphore handles:
-
-include::{generated}/api/handles/VkSemaphore.txt[]
---
-
-[open,refpage='vkCreateSemaphore',desc='Create a new queue semaphore object',type='protos']
---
-To create a semaphore, call:
-
-include::{generated}/api/protos/vkCreateSemaphore.txt[]
-
-  * pname:device is the logical device that creates the semaphore.
-  * pname:pCreateInfo is a pointer to a slink:VkSemaphoreCreateInfo
-    structure containing information about how the semaphore is to be
-    created.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pSemaphore is a pointer to a handle in which the resulting
-    semaphore object is returned.
-
-ifndef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-This command creates a _binary semaphore_ that has a boolean payload
-indicating whether the semaphore is currently signaled or unsignaled.
-When created, the semaphore is in the unsignaled state.
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-include::{generated}/validity/protos/vkCreateSemaphore.txt[]
---
-
-[open,refpage='VkSemaphoreCreateInfo',desc='Structure specifying parameters of a newly created semaphore',type='structs']
---
-The sname:VkSemaphoreCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkSemaphoreCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-
-include::{generated}/validity/structs/VkSemaphoreCreateInfo.txt[]
---
-
-[open,refpage='VkSemaphoreCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkSemaphoreCreateFlags.txt[]
-
-tname:VkSemaphoreCreateFlags is a bitmask type for setting a mask, but is
-currently reserved for future use.
---
-
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-[open,refpage='VkSemaphoreTypeCreateInfo',desc='Structure specifying the type of a newly created semaphore',type='structs',alias='VkSemaphoreTypeCreateInfoKHR']
---
-The sname:VkSemaphoreTypeCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkSemaphoreTypeCreateInfo.txt[]
-
-ifdef::VK_KHR_timeline_semaphore[]
-or the equivalent
-
-include::{generated}/api/structs/VkSemaphoreTypeCreateInfoKHR.txt[]
-endif::VK_KHR_timeline_semaphore[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:semaphoreType is a elink:VkSemaphoreType value specifying the type
-    of the semaphore.
-  * pname:initialValue is the initial payload value if pname:semaphoreType
-    is ename:VK_SEMAPHORE_TYPE_TIMELINE.
-
-To create a semaphore of a specific type, add a
-sname:VkSemaphoreTypeCreateInfo structure to the
-slink:VkSemaphoreCreateInfo::pname:pNext chain.
-
-If no sname:VkSemaphoreTypeCreateInfo structure is included in the
-pname:pNext chain of slink:VkSemaphoreCreateInfo, then the created semaphore
-will have a default elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_BINARY.
-
-.Valid Usage
-****
-  * [[VUID-VkSemaphoreTypeCreateInfo-timelineSemaphore-03252]]
-    If the <<features-timelineSemaphore,pname:timelineSemaphore>> feature is
-    not enabled, pname:semaphoreType must: not equal
-    ename:VK_SEMAPHORE_TYPE_TIMELINE
-  * [[VUID-VkSemaphoreTypeCreateInfo-semaphoreType-03279]]
-    If pname:semaphoreType is ename:VK_SEMAPHORE_TYPE_BINARY,
-    pname:initialValue must: be zero
-****
-
-include::{generated}/validity/structs/VkSemaphoreTypeCreateInfo.txt[]
---
-
-[open,refpage='VkSemaphoreType',desc='Sepcifies the type of a semaphore object',type='enums',alias='VkSemaphoreTypeKHR']
---
-Possible values of slink:VkSemaphoreTypeCreateInfo::pname:semaphoreType,
-specifying the type of a semaphore, are:
-
-include::{generated}/api/enums/VkSemaphoreType.txt[]
-
-ifdef::VK_KHR_timeline_semaphore[]
-or the equivalent
-
-include::{generated}/api/enums/VkSemaphoreTypeKHR.txt[]
-endif::VK_KHR_timeline_semaphore[]
-
-  * ename:VK_SEMAPHORE_TYPE_BINARY specifies a _binary semaphore_ type that
-    has a boolean payload indicating whether the semaphore is currently
-    signaled or unsignaled.
-    When created, the semaphore is in the unsignaled state.
-  * ename:VK_SEMAPHORE_TYPE_TIMELINE specifies a _timeline semaphore_ type
-    that has a strictly increasing 64-bit unsigned integer payload
-    indicating whether the semaphore is signaled with respect to a
-    particular reference value.
-    When created, the semaphore payload has the value given by the
-    pname:initialValue field of slink:VkSemaphoreTypeCreateInfo.
---
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_semaphore[]
-[open,refpage='VkExportSemaphoreCreateInfo',desc='Structure specifying handle types that can be exported from a semaphore',type='structs']
---
-To create a semaphore whose payload can: be exported to external handles,
-add a slink:VkExportSemaphoreCreateInfo structure to the pname:pNext chain
-of the slink:VkSemaphoreCreateInfo structure.
-The sname:VkExportSemaphoreCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkExportSemaphoreCreateInfo.txt[]
-
-ifdef::VK_KHR_external_semaphore[]
-or the equivalent
-
-include::{generated}/api/structs/VkExportSemaphoreCreateInfoKHR.txt[]
-endif::VK_KHR_external_semaphore[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:handleTypes is a bitmask of
-    elink:VkExternalSemaphoreHandleTypeFlagBits specifying one or more
-    semaphore handle types the application can: export from the resulting
-    semaphore.
-    The application can: request multiple handle types for the same
-    semaphore.
-
-.Valid Usage
-****
-  * [[VUID-VkExportSemaphoreCreateInfo-handleTypes-01124]]
-    The bits in pname:handleTypes must: be supported and compatible, as
-    reported by slink:VkExternalSemaphoreProperties
-****
-
-include::{generated}/validity/structs/VkExportSemaphoreCreateInfo.txt[]
---
-endif::VK_VERSION_1_1,VK_KHR_external_semaphore[]
-
-ifdef::VK_KHR_external_semaphore_win32[]
-[open,refpage='VkExportSemaphoreWin32HandleInfoKHR',desc='Structure specifying additional attributes of Windows handles exported from a semaphore',type='structs']
---
-To specify additional attributes of NT handles exported from a semaphore,
-add a sname:VkExportSemaphoreWin32HandleInfoKHR structure to the pname:pNext
-chain of the slink:VkSemaphoreCreateInfo structure.
-The sname:VkExportSemaphoreWin32HandleInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkExportSemaphoreWin32HandleInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pAttributes is a pointer to a Windows code:SECURITY_ATTRIBUTES
-    structure specifying security attributes of the handle.
-  * pname:dwAccess is a code:DWORD specifying access rights of the handle.
-  * pname:name is a null-terminated UTF-16 string to associate with the
-    underlying synchronization primitive referenced by NT handles exported
-    from the created semaphore.
-
-If slink:VkExportSemaphoreCreateInfo is not included in the same pname:pNext
-chain, this structure is ignored.
-
-If slink:VkExportSemaphoreCreateInfo is included in the pname:pNext chain of
-slink:VkSemaphoreCreateInfo with a Windows pname:handleType, but either
-sname:VkExportSemaphoreWin32HandleInfoKHR is not included in the pname:pNext
-chain, or if it is but pname:pAttributes is set to `NULL`, default security
-descriptor values will be used, and child processes created by the
-application will not inherit the handle, as described in the MSDN
-documentation for "`Synchronization Object Security and Access Rights`"^1^.
-Further, if the structure is not present, the access rights used depend on
-the handle type.
-
-For handles of the following types:
-
-ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT
-
-The implementation must: ensure the access rights allow both signal and wait
-operations on the semaphore.
-
-For handles of the following types:
-
-ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT
-
-The access rights must: be:
-
-code:GENERIC_ALL
-
-1::
-    https://docs.microsoft.com/en-us/windows/win32/sync/synchronization-object-security-and-access-rights
-
-.Valid Usage
-****
-  * [[VUID-VkExportSemaphoreWin32HandleInfoKHR-handleTypes-01125]]
-    If slink:VkExportSemaphoreCreateInfo::pname:handleTypes does not include
-    ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT or
-    ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT,
-    sname:VkExportSemaphoreWin32HandleInfoKHR must: not be included in the
-    pname:pNext chain of slink:VkSemaphoreCreateInfo
-****
-
-include::{generated}/validity/structs/VkExportSemaphoreWin32HandleInfoKHR.txt[]
---
-
-[open,refpage='vkGetSemaphoreWin32HandleKHR',desc='Get a Windows HANDLE for a semaphore',type='protos']
---
-To export a Windows handle representing the payload of a semaphore, call:
-
-include::{generated}/api/protos/vkGetSemaphoreWin32HandleKHR.txt[]
-
-  * pname:device is the logical device that created the semaphore being
-    exported.
-  * pname:pGetWin32HandleInfo is a pointer to a
-    slink:VkSemaphoreGetWin32HandleInfoKHR structure containing parameters
-    of the export operation.
-  * pname:pHandle will return the Windows handle representing the semaphore
-    state.
-
-For handle types defined as NT handles, the handles returned by
-fname:vkGetSemaphoreWin32HandleKHR are owned by the application.
-To avoid leaking resources, the application must: release ownership of them
-using the code:CloseHandle system call when they are no longer needed.
-
-Exporting a Windows handle from a semaphore may: have side effects depending
-on the transference of the specified handle type, as described in
-<<synchronization-semaphores-importing,Importing Semaphore Payloads>>.
-
-include::{generated}/validity/protos/vkGetSemaphoreWin32HandleKHR.txt[]
---
-
-[open,refpage='VkSemaphoreGetWin32HandleInfoKHR',desc='Structure describing a Win32 handle semaphore export operation',type='structs']
---
-The sname:VkSemaphoreGetWin32HandleInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkSemaphoreGetWin32HandleInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:semaphore is the semaphore from which state will be exported.
-  * pname:handleType is a elink:VkExternalSemaphoreHandleTypeFlagBits value
-    specifying the type of handle requested.
-
-The properties of the handle returned depend on the value of
-pname:handleType.
-See elink:VkExternalSemaphoreHandleTypeFlagBits for a description of the
-properties of the defined external semaphore handle types.
-
-.Valid Usage
-****
-  * [[VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01126]]
-    pname:handleType must: have been included in
-    slink:VkExportSemaphoreCreateInfo::pname:handleTypes when the
-    pname:semaphore's current payload was created
-  * [[VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01127]]
-    If pname:handleType is defined as an NT handle,
-    flink:vkGetSemaphoreWin32HandleKHR must: be called no more than once for
-    each valid unique combination of pname:semaphore and pname:handleType
-  * [[VUID-VkSemaphoreGetWin32HandleInfoKHR-semaphore-01128]]
-    pname:semaphore must: not currently have its payload replaced by an
-    imported payload as described below in
-    <<synchronization-semaphores-importing,Importing Semaphore Payloads>>
-    unless that imported payload's handle type was included in
-    slink:VkExternalSemaphoreProperties::pname:exportFromImportedHandleTypes
-    for pname:handleType
-  * [[VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01129]]
-    If pname:handleType refers to a handle type with copy payload
-    transference semantics, as defined below in
-    <<synchronization-semaphores-importing,Importing Semaphore Payloads>>,
-    there must: be no queue waiting on pname:semaphore
-  * [[VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01130]]
-    If pname:handleType refers to a handle type with copy payload
-    transference semantics, pname:semaphore must: be signaled, or have an
-    associated <<synchronization-semaphores-signaling,semaphore signal
-    operation>> pending execution
-  * [[VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01131]]
-    pname:handleType must: be defined as an NT handle or a global share
-    handle
-****
-
-include::{generated}/validity/structs/VkSemaphoreGetWin32HandleInfoKHR.txt[]
---
-endif::VK_KHR_external_semaphore_win32[]
-
-ifdef::VK_KHR_external_semaphore_fd[]
-[open,refpage='vkGetSemaphoreFdKHR',desc='Get a POSIX file descriptor handle for a semaphore',type='protos']
---
-To export a POSIX file descriptor representing the payload of a semaphore,
-call:
-
-include::{generated}/api/protos/vkGetSemaphoreFdKHR.txt[]
-
-  * pname:device is the logical device that created the semaphore being
-    exported.
-  * pname:pGetFdInfo is a pointer to a slink:VkSemaphoreGetFdInfoKHR
-    structure containing parameters of the export operation.
-  * pname:pFd will return the file descriptor representing the semaphore
-    payload.
-
-Each call to fname:vkGetSemaphoreFdKHR must: create a new file descriptor
-and transfer ownership of it to the application.
-To avoid leaking resources, the application must: release ownership of the
-file descriptor when it is no longer needed.
-
-[NOTE]
-.Note
-====
-Ownership can be released in many ways.
-For example, the application can call code:close() on the file descriptor,
-or transfer ownership back to Vulkan by using the file descriptor to import
-a semaphore payload.
-====
-Where supported by the operating system, the implementation must: set the
-file descriptor to be closed automatically when an code:execve system call
-is made.
-
-Exporting a file descriptor from a semaphore may: have side effects
-depending on the transference of the specified handle type, as described in
-<<synchronization-semaphores-importing,Importing Semaphore State>>.
-
-include::{generated}/validity/protos/vkGetSemaphoreFdKHR.txt[]
---
-
-[open,refpage='VkSemaphoreGetFdInfoKHR',desc='Structure describing a POSIX FD semaphore export operation',type='structs']
---
-The sname:VkSemaphoreGetFdInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkSemaphoreGetFdInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:semaphore is the semaphore from which state will be exported.
-  * pname:handleType is a elink:VkExternalSemaphoreHandleTypeFlagBits value
-    specifying the type of handle requested.
-
-The properties of the file descriptor returned depend on the value of
-pname:handleType.
-See elink:VkExternalSemaphoreHandleTypeFlagBits for a description of the
-properties of the defined external semaphore handle types.
-
-.Valid Usage
-****
-  * [[VUID-VkSemaphoreGetFdInfoKHR-handleType-01132]]
-    pname:handleType must: have been included in
-    slink:VkExportSemaphoreCreateInfo::pname:handleTypes when
-    pname:semaphore's current payload was created
-  * [[VUID-VkSemaphoreGetFdInfoKHR-semaphore-01133]]
-    pname:semaphore must: not currently have its payload replaced by an
-    imported payload as described below in
-    <<synchronization-semaphores-importing,Importing Semaphore Payloads>>
-    unless that imported payload's handle type was included in
-    slink:VkExternalSemaphoreProperties::pname:exportFromImportedHandleTypes
-    for pname:handleType
-  * [[VUID-VkSemaphoreGetFdInfoKHR-handleType-01134]]
-    If pname:handleType refers to a handle type with copy payload
-    transference semantics, as defined below in
-    <<synchronization-semaphores-importing,Importing Semaphore Payloads>>,
-    there must: be no queue waiting on pname:semaphore
-  * [[VUID-VkSemaphoreGetFdInfoKHR-handleType-01135]]
-    If pname:handleType refers to a handle type with copy payload
-    transference semantics, pname:semaphore must: be signaled, or have an
-    associated <<synchronization-semaphores-signaling,semaphore signal
-    operation>> pending execution
-  * [[VUID-VkSemaphoreGetFdInfoKHR-handleType-01136]]
-    pname:handleType must: be defined as a POSIX file descriptor handle
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-  * [[VUID-VkSemaphoreGetFdInfoKHR-handleType-03253]]
-    If pname:handleType refers to a handle type with copy payload
-    transference semantics, pname:semaphore must: have been created with a
-    elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_BINARY
-  * [[VUID-VkSemaphoreGetFdInfoKHR-handleType-03254]]
-    If pname:handleType refers to a handle type with copy payload
-    transference semantics, pname:semaphore must: have an associated
-    semaphore signal operation that has been submitted for execution and any
-    semaphore signal operations on which it depends (if any) must: have also
-    been submitted for execution
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-****
-
-include::{generated}/validity/structs/VkSemaphoreGetFdInfoKHR.txt[]
---
-endif::VK_KHR_external_semaphore_fd[]
-
-ifdef::VK_FUCHSIA_external_semaphore[]
-[open,refpage='vkGetSemaphoreZirconHandleFUCHSIA',desc='Get a Zircon event handle for a semaphore',type='protos']
---
-To export a Zircon event handle representing the payload of a semaphore,
-call:
-
-include::{generated}/api/protos/vkGetSemaphoreZirconHandleFUCHSIA.txt[]
-
-  * pname:device is the logical device that created the semaphore being
-    exported.
-  * pname:pGetZirconHandleInfo is a pointer to a
-    slink:VkSemaphoreGetZirconHandleInfoFUCHSIA structure containing
-    parameters of the export operation.
-  * pname:pZirconHandle will return the Zircon event handle representing the
-    semaphore payload.
-
-Each call to fname:vkGetSemaphoreZirconHandleFUCHSIA must: create a Zircon
-event handle and transfer ownership of it to the application.
-To avoid leaking resources, the application must: release ownership of the
-Zircon event handle when it is no longer needed.
-
-[NOTE]
-.Note
-====
-Ownership can be released in many ways.
-For example, the application can call zx_handle_close() on the file
-descriptor, or transfer ownership back to Vulkan by using the file
-descriptor to import a semaphore payload.
-====
-
-Exporting a Zircon event handle from a semaphore may: have side effects
-depending on the transference of the specified handle type, as described in
-<<synchronization-semaphores-importing,Importing Semaphore State>>.
-
-include::{generated}/validity/protos/vkGetSemaphoreZirconHandleFUCHSIA.txt[]
---
-
-[open,refpage='VkSemaphoreGetZirconHandleInfoFUCHSIA',desc='Structure describing a Zircon event handle semaphore export operation',type='structs']
---
-The sname:VkSemaphoreGetZirconHandleInfoFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkSemaphoreGetZirconHandleInfoFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:semaphore is the semaphore from which state will be exported.
-  * pname:handleType is a elink:VkExternalSemaphoreHandleTypeFlagBits value
-    specifying the type of handle requested.
-
-The properties of the Zircon event handle returned depend on the value of
-pname:handleType.
-See elink:VkExternalSemaphoreHandleTypeFlagBits for a description of the
-properties of the defined external semaphore handle types.
-
-.Valid Usage
-****
-  * [[VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-handleType-04758]]
-    pname:handleType must: have been included in
-    slink:VkExportSemaphoreCreateInfo::pname:handleTypes when
-    pname:semaphore's current payload was created
-  * [[VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-semaphore-04759]]
-    pname:semaphore must: not currently have its payload replaced by an
-    imported payload as described below in
-    <<synchronization-semaphores-importing,Importing Semaphore Payloads>>
-    unless that imported payload's handle type was included in
-    slink:VkExternalSemaphoreProperties::pname:exportFromImportedHandleTypes
-    for pname:handleType
-  * [[VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-handleType-04760]]
-    If pname:handleType refers to a handle type with copy payload
-    transference semantics, as defined below in
-    <<synchronization-semaphores-importing,Importing Semaphore Payloads>>,
-    there must: be no queue waiting on pname:semaphore
-  * [[VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-handleType-04761]]
-    If pname:handleType refers to a handle type with copy payload
-    transference semantics, pname:semaphore must: be signaled, or have an
-    associated <<synchronization-semaphores-signaling,semaphore signal
-    operation>> pending execution
-  * [[VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-handleType-04762]]
-    pname:handleType must: be defined as a Zircon event handle
-  * [[VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-semaphore-04763]]
-    pname:semaphore must: have been created with a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_BINARY
-****
-
-include::{generated}/validity/structs/VkSemaphoreGetZirconHandleInfoFUCHSIA.txt[]
---
-endif::VK_FUCHSIA_external_semaphore[]
-
-[open,refpage='vkDestroySemaphore',desc='Destroy a semaphore object',type='protos']
---
-To destroy a semaphore, call:
-
-include::{generated}/api/protos/vkDestroySemaphore.txt[]
-
-  * pname:device is the logical device that destroys the semaphore.
-  * pname:semaphore is the handle of the semaphore to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroySemaphore-semaphore-01137]]
-    All submitted batches that refer to pname:semaphore must: have completed
-    execution
-  * [[VUID-vkDestroySemaphore-semaphore-01138]]
-    If sname:VkAllocationCallbacks were provided when pname:semaphore was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroySemaphore-semaphore-01139]]
-    If no sname:VkAllocationCallbacks were provided when pname:semaphore was
-    created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroySemaphore.txt[]
---
-
-
-[[synchronization-semaphores-signaling]]
-=== Semaphore Signaling
-
-When a batch is submitted to a queue via a <<devsandqueues-submission, queue
-submission>>, and it includes semaphores to be signaled, it defines a memory
-dependency on the batch, and defines _semaphore signal operations_ which set
-the semaphores to the signaled state.
-
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-In case of semaphores created with a elink:VkSemaphoreType of
-ename:VK_SEMAPHORE_TYPE_TIMELINE the semaphore is considered signaled with
-respect to the counter value set to be signaled as specified in
-slink:VkTimelineSemaphoreSubmitInfo or slink:VkSemaphoreSignalInfo.
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-The first <<synchronization-dependencies-scopes, synchronization scope>>
-includes every command submitted in the same batch.
-ifdef::VK_KHR_synchronization2[]
-In the case of flink:vkQueueSubmit2KHR, the first synchronization scope is
-limited to the pipeline stage specified by
-slink:VkSemaphoreSubmitInfoKHR::pname:stageMask.
-endif::VK_KHR_synchronization2[]
-Semaphore signal operations that are defined by flink:vkQueueSubmit
-ifdef::VK_KHR_synchronization2[]
-or flink:vkQueueSubmit2KHR
-endif::VK_KHR_synchronization2[]
-additionally include all commands that occur earlier in
-<<synchronization-submission-order,submission order>>.
-Semaphore signal operations that are defined by flink:vkQueueSubmit or
-flink:vkQueueBindSparse additionally include in the first synchronization
-scope any semaphore and fence signal operations that occur earlier in
-<<synchronization-signal-operation-order,signal operation order>>.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-includes only the semaphore signal operation.
-
-The first <<synchronization-dependencies-access-scopes, access scope>>
-includes all memory access performed by the device.
-
-The second <<synchronization-dependencies-access-scopes, access scope>> is
-empty.
-
-
-[[synchronization-semaphores-waiting]]
-=== Semaphore Waiting
-
-When a batch is submitted to a queue via a <<devsandqueues-submission, queue
-submission>>, and it includes semaphores to be waited on, it defines a
-memory dependency between prior semaphore signal operations and the batch,
-and defines _semaphore wait operations_.
-
-Such semaphore wait operations set the semaphores
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-created with a elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_BINARY
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-to the unsignaled state.
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-In case of semaphores created with a elink:VkSemaphoreType of
-ename:VK_SEMAPHORE_TYPE_TIMELINE a prior semaphore signal operation defines
-a memory dependency with a semaphore wait operation if the value the
-semaphore is signaled with is greater than or equal to the value the
-semaphore is waited with, thus the semaphore will continue to be considered
-signaled with respect to the counter value waited on as specified in
-slink:VkTimelineSemaphoreSubmitInfo.
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-The first synchronization scope includes all semaphore signal operations
-that operate on semaphores waited on in the same batch, and that
-happen-before the wait completes.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-includes every command submitted in the same batch.
-In the case of flink:vkQueueSubmit, the second synchronization scope is
-limited to operations on the pipeline stages determined by the
-<<synchronization-pipeline-stages-masks, destination stage mask>> specified
-by the corresponding element of pname:pWaitDstStageMask.
-ifdef::VK_KHR_synchronization2[]
-In the case of flink:vkQueueSubmit2KHR, the second synchronization scope is
-limited to the pipeline stage specified by
-slink:VkSemaphoreSubmitInfoKHR::pname:stageMask.
-endif::VK_KHR_synchronization2[]
-Also, in the case of
-ifdef::VK_KHR_synchronization2[]
-either flink:vkQueueSubmit2KHR or
-endif::VK_KHR_synchronization2[]
-flink:vkQueueSubmit, the second synchronization scope additionally includes
-all commands that occur later in
-<<synchronization-submission-order,submission order>>.
-
-The first <<synchronization-dependencies-access-scopes, access scope>> is
-empty.
-
-The second <<synchronization-dependencies-access-scopes, access scope>>
-includes all memory access performed by the device.
-
-The semaphore wait operation happens-after the first set of operations in
-the execution dependency, and happens-before the second set of operations in
-the execution dependency.
-
-[NOTE]
-.Note
-====
-Unlike
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-timeline semaphores,
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-fences or events, the act of waiting for a binary semaphore also unsignals
-that semaphore.
-Applications must: ensure that between two such wait operations, the
-semaphore is signaled again, with execution dependencies used to ensure
-these occur in order.
-Binary semaphore waits and signals should thus occur in discrete 1:1 pairs.
-====
-
-ifdef::VK_KHR_swapchain[]
-[NOTE]
-.Note
-====
-A common scenario for using pname:pWaitDstStageMask with values other than
-ename:VK_PIPELINE_STAGE_ALL_COMMANDS_BIT is when synchronizing a window
-system presentation operation against subsequent command buffers which
-render the next frame.
-In this case, a presentation image must: not be overwritten until the
-presentation operation completes, but other pipeline stages can: execute
-without waiting.
-A mask of ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT prevents
-subsequent color attachment writes from executing until the semaphore
-signals.
-Some implementations may: be able to execute transfer operations and/or
-pre-rasterization work before the semaphore is signaled.
-
-If an image layout transition needs to be performed on a presentable image
-before it is used in a framebuffer, that can: be performed as the first
-operation submitted to the queue after acquiring the image, and should: not
-prevent other work from overlapping with the presentation operation.
-For example, a sname:VkImageMemoryBarrier could use:
-
-  * pname:srcStageMask = ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
-  * pname:srcAccessMask = 0
-  * pname:dstStageMask = ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
-  * pname:dstAccessMask = ename:VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
-    ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT.
-  * pname:oldLayout = ename:VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
-  * pname:newLayout = ename:VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
-
-Alternatively, pname:oldLayout can: be ename:VK_IMAGE_LAYOUT_UNDEFINED, if
-the image's contents need not be preserved.
-
-This barrier accomplishes a dependency chain between previous presentation
-operations and subsequent color attachment output operations, with the
-layout transition performed in between, and does not introduce a dependency
-between previous work and any
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>>s.
-More precisely, the semaphore signals after the presentation operation
-completes, the semaphore wait stalls the
-ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT stage, and there is a
-dependency from that same stage to itself with the layout transition
-performed in between.
-====
-endif::VK_KHR_swapchain[]
-
-
-[[synchronization-semaphores-waiting-state]]
-=== Semaphore State Requirements For Wait Operations
-
-Before waiting on a semaphore, the application must: ensure the semaphore is
-in a valid state for a wait operation.
-Specifically, when a <<synchronization-semaphores-waiting,semaphore wait
-operation>> is submitted to a queue:
-
-  * A binary semaphore must: be signaled, or have an associated
-    <<synchronization-semaphores-signaling,semaphore signal operation>> that
-    is pending execution.
-  * Any <<synchronization-semaphores-signaling,semaphore signal operations>>
-    on which the pending binary semaphore signal operation depends must:
-    also be completed or pending execution.
-  * There must: be no other queue waiting on the same binary semaphore when
-    the operation executes.
-
-
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-[[synchronization-semaphores-hostops]]
-=== Host Operations on Semaphores
-
-In addition to <<synchronization-semaphores-signaling,semaphore signal
-operations>> and <<synchronization-semaphores-waiting,semaphore wait
-operations>> submitted to device queues, timeline semaphores support the
-following host operations:
-
-  * Query the current counter value of the semaphore using the
-    flink:vkGetSemaphoreCounterValue command.
-  * Wait for a set of semaphores to reach particular counter values using
-    the flink:vkWaitSemaphores command.
-  * Signal the semaphore with a particular counter value from the host using
-    the flink:vkSignalSemaphore command.
-
-[open,refpage='vkGetSemaphoreCounterValue',desc='Query the current state of a timeline semaphore',type='protos',alias='vkGetSemaphoreCounterValueKHR']
---
-To query the current counter value of a semaphore created with a
-elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_TIMELINE from the host,
-call:
-
-ifdef::VK_VERSION_1_2[]
-include::{generated}/api/protos/vkGetSemaphoreCounterValue.txt[]
-endif::VK_VERSION_1_2[]
-
-ifdef::VK_VERSION_1_2+VK_KHR_timeline_semaphore[or the equivalent command]
-
-ifdef::VK_KHR_timeline_semaphore[]
-include::{generated}/api/protos/vkGetSemaphoreCounterValueKHR.txt[]
-endif::VK_KHR_timeline_semaphore[]
-
-  * pname:device is the logical device that owns the semaphore.
-  * pname:semaphore is the handle of the semaphore to query.
-  * pname:pValue is a pointer to a 64-bit integer value in which the current
-    counter value of the semaphore is returned.
-
-[NOTE]
-.Note
-====
-If a <<devsandqueues-submission, queue submission>> command is pending
-execution, then the value returned by this command may: immediately be out
-of date.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkGetSemaphoreCounterValue-semaphore-03255]]
-    pname:semaphore must: have been created with a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_TIMELINE
-****
-
-include::{generated}/validity/protos/vkGetSemaphoreCounterValue.txt[]
---
-
-[open,refpage='vkWaitSemaphores',desc='Wait for timeline semaphores on the host',type='protos',alias='vkWaitSemaphoresKHR']
---
-To wait for a set of semaphores created with a elink:VkSemaphoreType of
-ename:VK_SEMAPHORE_TYPE_TIMELINE to reach particular counter values on the
-host, call:
-
-ifdef::VK_VERSION_1_2[]
-include::{generated}/api/protos/vkWaitSemaphores.txt[]
-endif::VK_VERSION_1_2[]
-
-ifdef::VK_VERSION_1_2+VK_KHR_timeline_semaphore[or the equivalent command]
-
-ifdef::VK_KHR_timeline_semaphore[]
-include::{generated}/api/protos/vkWaitSemaphoresKHR.txt[]
-endif::VK_KHR_timeline_semaphore[]
-
-  * pname:device is the logical device that owns the semaphores.
-  * pname:pWaitInfo is a pointer to a slink:VkSemaphoreWaitInfo structure
-    containing information about the wait condition.
-  * pname:timeout is the timeout period in units of nanoseconds.
-    pname:timeout is adjusted to the closest value allowed by the
-    implementation-dependent timeout accuracy, which may: be substantially
-    longer than one nanosecond, and may: be longer than the requested
-    period.
-
-If the condition is satisfied when fname:vkWaitSemaphores is called, then
-fname:vkWaitSemaphores returns immediately.
-If the condition is not satisfied at the time fname:vkWaitSemaphores is
-called, then fname:vkWaitSemaphores will block and wait until the condition
-is satisfied or the pname:timeout has expired, whichever is sooner.
-
-If pname:timeout is zero, then fname:vkWaitSemaphores does not wait, but
-simply returns information about the current state of the semaphores.
-ename:VK_TIMEOUT will be returned in this case if the condition is not
-satisfied, even though no actual wait was performed.
-
-If the condition is satisfied before the pname:timeout has expired,
-fname:vkWaitSemaphores returns ename:VK_SUCCESS.
-Otherwise, fname:vkWaitSemaphores returns ename:VK_TIMEOUT after the
-pname:timeout has expired.
-
-If device loss occurs (see <<devsandqueues-lost-device,Lost Device>>) before
-the timeout has expired, fname:vkWaitSemaphores must: return in finite time
-with either ename:VK_SUCCESS or ename:VK_ERROR_DEVICE_LOST.
-
-include::{generated}/validity/protos/vkWaitSemaphores.txt[]
---
-
-[open,refpage='VkSemaphoreWaitInfo',desc='Structure containing information about the semaphore wait condition',type='structs',alias='VkSemaphoreWaitInfoKHR']
---
-The sname:VkSemaphoreWaitInfo structure is defined as:
-
-include::{generated}/api/structs/VkSemaphoreWaitInfo.txt[]
-
-ifdef::VK_KHR_timeline_semaphore[]
-or the equivalent
-
-include::{generated}/api/structs/VkSemaphoreWaitInfoKHR.txt[]
-endif::VK_KHR_timeline_semaphore[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkSemaphoreWaitFlagBits specifying
-    additional parameters for the semaphore wait operation.
-  * pname:semaphoreCount is the number of semaphores to wait on.
-  * pname:pSemaphores is a pointer to an array of pname:semaphoreCount
-    semaphore handles to wait on.
-  * pname:pValues is a pointer to an array of pname:semaphoreCount timeline
-    semaphore values.
-
-.Valid Usage
-****
-  * [[VUID-VkSemaphoreWaitInfo-pSemaphores-03256]]
-    All of the elements of pname:pSemaphores must: reference a semaphore
-    that was created with a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_TIMELINE
-****
-
-include::{generated}/validity/structs/VkSemaphoreWaitInfo.txt[]
---
-
-[open,refpage='VkSemaphoreWaitFlagBits',desc='Bitmask specifying additional parameters of a semaphore wait operation',type='enums',alias='VkSemaphoreWaitFlagBitsKHR']
---
-Bits which can: be set in slink:VkSemaphoreWaitInfo::pname:flags, specifying
-additional parameters of a semaphore wait operation, are:
-
-include::{generated}/api/enums/VkSemaphoreWaitFlagBits.txt[]
-
-ifdef::VK_KHR_timeline_semaphore[]
-or the equivalent
-
-include::{generated}/api/enums/VkSemaphoreWaitFlagBitsKHR.txt[]
-endif::VK_KHR_timeline_semaphore[]
-
-  * ename:VK_SEMAPHORE_WAIT_ANY_BIT specifies that the semaphore wait
-    condition is that at least one of the semaphores in
-    sname:VkSemaphoreWaitInfo::pname:pSemaphores has reached the value
-    specified by the corresponding element of
-    sname:VkSemaphoreWaitInfo::pname:pValues.
-    If ename:VK_SEMAPHORE_WAIT_ANY_BIT is not set, the semaphore wait
-    condition is that all of the semaphores in
-    sname:VkSemaphoreWaitInfo::pname:pSemaphores have reached the value
-    specified by the corresponding element of
-    sname:VkSemaphoreWaitInfo::pname:pValues.
---
-
-[open,refpage='VkSemaphoreWaitFlags',desc='Bitmask of VkSemaphoreWaitFlagBits',type='flags',alias='VkSemaphoreWaitFlagsKHR']
---
-include::{generated}/api/flags/VkSemaphoreWaitFlags.txt[]
-
-ifdef::VK_KHR_timeline_semaphore[]
-or the equivalent
-
-include::{generated}/api/flags/VkSemaphoreWaitFlagsKHR.txt[]
-endif::VK_KHR_timeline_semaphore[]
-
-tname:VkSemaphoreWaitFlags is a bitmask type for setting a mask of zero or
-more elink:VkSemaphoreWaitFlagBits.
---
-
-[open,refpage='vkSignalSemaphore',desc='Signal a timeline semaphore on the host',type='protos',alias='vkSignalSemaphoreKHR']
---
-To signal a semaphore created with a elink:VkSemaphoreType of
-ename:VK_SEMAPHORE_TYPE_TIMELINE with a particular counter value, on the
-host, call:
-
-ifdef::VK_VERSION_1_2[]
-include::{generated}/api/protos/vkSignalSemaphore.txt[]
-endif::VK_VERSION_1_2[]
-
-ifdef::VK_VERSION_1_2+VK_KHR_timeline_semaphore[or the equivalent command]
-
-ifdef::VK_KHR_timeline_semaphore[]
-include::{generated}/api/protos/vkSignalSemaphoreKHR.txt[]
-endif::VK_KHR_timeline_semaphore[]
-
-  * pname:device is the logical device that owns the semaphore.
-  * pname:pSignalInfo is a pointer to a slink:VkSemaphoreSignalInfo
-    structure containing information about the signal operation.
-
-When fname:vkSignalSemaphore is executed on the host, it defines and
-immediately executes a <<synchronization-semaphores-signaling,_semaphore
-signal operation_>> which sets the timeline semaphore to the given value.
-
-The first synchronization scope is defined by the host execution model, but
-includes execution of fname:vkSignalSemaphore on the host and anything that
-happened-before it.
-
-The second synchronization scope is empty.
-
-include::{generated}/validity/protos/vkSignalSemaphore.txt[]
---
-
-[open,refpage='VkSemaphoreSignalInfo',desc='Structure containing information about a semaphore signal operation',type='structs',alias='VkSemaphoreSignalInfoKHR']
---
-The sname:VkSemaphoreSignalInfo structure is defined as:
-
-include::{generated}/api/structs/VkSemaphoreSignalInfo.txt[]
-
-ifdef::VK_KHR_timeline_semaphore[]
-or the equivalent
-
-include::{generated}/api/structs/VkSemaphoreSignalInfoKHR.txt[]
-endif::VK_KHR_timeline_semaphore[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:semaphore is the handle of the semaphore to signal.
-  * pname:value is the value to signal.
-
-.Valid Usage
-****
-  * [[VUID-VkSemaphoreSignalInfo-semaphore-03257]]
-    pname:semaphore must: have been created with a elink:VkSemaphoreType of
-    ename:VK_SEMAPHORE_TYPE_TIMELINE
-  * [[VUID-VkSemaphoreSignalInfo-value-03258]]
-    pname:value must: have a value greater than the current value of the
-    semaphore
-  * [[VUID-VkSemaphoreSignalInfo-value-03259]]
-    pname:value must: be less than the value of any pending semaphore signal
-    operations
-  * [[VUID-VkSemaphoreSignalInfo-value-03260]]
-    pname:value must: have a value which does not differ from the current
-    value of the semaphore or the value of any outstanding semaphore wait or
-    signal operation on pname:semaphore by more than
-    <<limits-maxTimelineSemaphoreValueDifference,
-    pname:maxTimelineSemaphoreValueDifference>>
-****
-
-include::{generated}/validity/structs/VkSemaphoreSignalInfo.txt[]
---
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_semaphore[]
-[[synchronization-semaphores-importing]]
-=== Importing Semaphore Payloads
-
-Applications can: import a semaphore payload into an existing semaphore
-using an external semaphore handle.
-The effects of the import operation will be either temporary or permanent,
-as specified by the application.
-If the import is temporary, the implementation must: restore the semaphore
-to its prior permanent state after submitting the next semaphore wait
-operation.
-Performing a subsequent temporary import on a semaphore before performing a
-semaphore wait has no effect on this requirement; the next wait submitted on
-the semaphore must: still restore its last permanent state.
-A permanent payload import behaves as if the target semaphore was destroyed,
-and a new semaphore was created with the same handle but the imported
-payload.
-Because importing a semaphore payload temporarily or permanently detaches
-the existing payload from a semaphore, similar usage restrictions to those
-applied to fname:vkDestroySemaphore are applied to any command that imports
-a semaphore payload.
-Which of these import types is used is referred to as the import operation's
-_permanence_.
-Each handle type supports either one or both types of permanence.
-
-The implementation must: perform the import operation by either referencing
-or copying the payload referred to by the specified external semaphore
-handle, depending on the handle's type.
-The import method used is referred to as the handle type's _transference_.
-When using handle types with reference transference, importing a payload to
-a semaphore adds the semaphore to the set of all semaphores sharing that
-payload.
-This set includes the semaphore from which the payload was exported.
-Semaphore signaling and waiting operations performed on any semaphore in the
-set must: behave as if the set were a single semaphore.
-Importing a payload using handle types with copy transference creates a
-duplicate copy of the payload at the time of import, but makes no further
-reference to it.
-Semaphore signaling and waiting operations performed on the target of copy
-imports must: not affect any other semaphore or payload.
-
-Export operations have the same transference as the specified handle type's
-import operations.
-Additionally, exporting a semaphore payload to a handle with copy
-transference has the same side effects on the source semaphore's payload as
-executing a semaphore wait operation.
-If the semaphore was using a temporarily imported payload, the semaphore's
-prior permanent payload will be restored.
-
-ifdef::VK_KHR_external_semaphore_win32,VK_KHR_external_semaphore_fd,VK_FUCHSIA_external_semaphore[]
-[NOTE]
-.Note
-====
-The permanence and transference of handle types can be found in:
-
-ifdef::VK_KHR_external_semaphore_win32[]
-  * <<synchronization-semaphore-handletypes-win32,Handle Types Supported by
-    sname:VkImportSemaphoreWin32HandleInfoKHR>>
-endif::VK_KHR_external_semaphore_win32[]
-ifdef::VK_KHR_external_semaphore_fd[]
-  * <<synchronization-semaphore-handletypes-fd,Handle Types Supported by
-    sname:VkImportSemaphoreFdInfoKHR>>
-endif::VK_KHR_external_semaphore_fd[]
-ifdef::VK_FUCHSIA_external_semaphore[]
-  * <<synchronization-semaphore-handletypes-fuchsia,Handle Types Supported
-    by sname:VkImportSemaphoreZirconHandleInfoFUCHSIA>>
-endif::VK_FUCHSIA_external_semaphore[]
-====
-endif::VK_KHR_external_semaphore_win32,VK_KHR_external_semaphore_fd,VK_FUCHSIA_external_semaphore[]
-
-<<fundamentals-threadingbehavior,External synchronization>> allows
-implementations to modify an object's internal state, i.e. payload, without
-internal synchronization.
-However, for semaphores sharing a payload across processes, satisfying the
-external synchronization requirements of sname:VkSemaphore parameters as if
-all semaphores in the set were the same object is sometimes infeasible.
-Satisfying the <<synchronization-semaphores-waiting-state,wait operation
-state requirements>> would similarly require impractical coordination or
-levels of trust between processes.
-Therefore, these constraints only apply to a specific semaphore handle, not
-to its payload.
-For distinct semaphore objects which share a payload, if the semaphores are
-passed to separate queue submission commands concurrently, behavior will be
-as if the commands were called in an arbitrary sequential order.
-If the <<synchronization-semaphores-waiting-state,wait operation state
-requirements>> are violated for the shared payload by a queue submission
-command, or if a signal operation is queued for a shared payload that is
-already signaled or has a pending signal operation, effects must: be limited
-to one or more of the following:
-
-  * Returning ename:VK_ERROR_INITIALIZATION_FAILED from the command which
-    resulted in the violation.
-  * Losing the logical device on which the violation occurred immediately or
-    at a future time, resulting in a ename:VK_ERROR_DEVICE_LOST error from
-    subsequent commands, including the one causing the violation.
-  * Continuing execution of the violating command or operation as if the
-    semaphore wait completed successfully after an implementation-dependent
-    timeout.
-    In this case, the state of the payload becomes undefined:, and future
-    operations on semaphores sharing the payload will be subject to these
-    same rules.
-    The semaphore must: be destroyed or have its payload replaced by an
-    import operation to again have a well-defined state.
-
-[NOTE]
-.Note
-====
-These rules allow processes to synchronize access to shared memory without
-trusting each other.
-However, such processes must still be cautious not to use the shared
-semaphore for more than synchronizing access to the shared memory.
-For example, a process should not use a shared semaphore as part of an
-execution dependency chain that, when complete, leads to objects being
-destroyed, if it does not trust other processes sharing the semaphore
-payload.
-====
-
-When a semaphore is using an imported payload, its
-slink:VkExportSemaphoreCreateInfo::pname:handleTypes value is that specified
-when creating the semaphore from which the payload was exported, rather than
-that specified when creating the semaphore.
-Additionally,
-slink:VkExternalSemaphoreProperties::pname:exportFromImportedHandleTypes
-restricts which handle types can: be exported from such a semaphore based on
-the specific handle type used to import the current payload.
-ifdef::VK_KHR_swapchain[]
-Passing a semaphore to flink:vkAcquireNextImageKHR is equivalent to
-temporarily importing a semaphore payload to that semaphore.
-
-[NOTE]
-.Note
-====
-Because the exportable handle types of an imported semaphore correspond to
-its current imported payload, and flink:vkAcquireNextImageKHR behaves the
-same as a temporary import operation for which the source semaphore is
-opaque to the application, applications have no way of determining whether
-any external handle types can: be exported from a semaphore in this state.
-Therefore, applications must: not attempt to export external handles from
-semaphores using a temporarily imported payload from
-flink:vkAcquireNextImageKHR.
-====
-endif::VK_KHR_swapchain[]
-
-When importing a semaphore payload, it is the responsibility of the
-application to ensure the external handles meet all valid usage
-requirements.
-However, implementations must: perform sufficient validation of external
-handles to ensure that the operation results in a valid semaphore which will
-not cause program termination, device loss, queue stalls, or corruption of
-other resources when used as allowed according to its import parameters, and
-excepting those side effects allowed for violations of the
-<<synchronization-semaphores-waiting-state,valid semaphore state for wait
-operations>> rules.
-If the external handle provided does not meet these requirements, the
-implementation must: fail the semaphore payload import operation with the
-error code ename:VK_ERROR_INVALID_EXTERNAL_HANDLE.
-
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-In addition, when importing a semaphore payload that is not compatible with
-the payload type corresponding to the elink:VkSemaphoreType the semaphore
-was created with, the implementation may: fail the semaphore payload import
-operation with the error code ename:VK_ERROR_INVALID_EXTERNAL_HANDLE.
-
-[NOTE]
-.Note
-====
-As the introduction of the external semaphore handle type
-ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT predates that of
-timeline semaphores, support for importing semaphore payloads from external
-handles of that type into semaphores created (implicitly or explicitly) with
-a elink:VkSemaphoreType of ename:VK_SEMAPHORE_TYPE_BINARY is preserved for
-backwards compatibility.
-However, applications should: prefer importing such handle types into
-semaphores created with a elink:VkSemaphoreType of
-ename:VK_SEMAPHORE_TYPE_TIMELINE.
-====
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-endif::VK_VERSION_1_1,VK_KHR_external_semaphore[]
-
-ifdef::VK_KHR_external_semaphore_win32[]
-[open,refpage='vkImportSemaphoreWin32HandleKHR',desc='Import a semaphore from a Windows HANDLE',type='protos']
---
-To import a semaphore payload from a Windows handle, call:
-
-include::{generated}/api/protos/vkImportSemaphoreWin32HandleKHR.txt[]
-
-  * pname:device is the logical device that created the semaphore.
-  * pname:pImportSemaphoreWin32HandleInfo is a pointer to a
-    slink:VkImportSemaphoreWin32HandleInfoKHR structure specifying the
-    semaphore and import parameters.
-
-Importing a semaphore payload from Windows handles does not transfer
-ownership of the handle to the Vulkan implementation.
-For handle types defined as NT handles, the application must: release
-ownership using the code:CloseHandle system call when the handle is no
-longer needed.
-
-Applications can: import the same semaphore payload into multiple instances
-of Vulkan, into the same instance from which it was exported, and multiple
-times into a given Vulkan instance.
-
-include::{generated}/validity/protos/vkImportSemaphoreWin32HandleKHR.txt[]
---
-
-[open,refpage='VkImportSemaphoreWin32HandleInfoKHR',desc='Structure specifying Windows handle to import to a semaphore',type='structs']
---
-The sname:VkImportSemaphoreWin32HandleInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkImportSemaphoreWin32HandleInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:semaphore is the semaphore into which the payload will be
-    imported.
-  * pname:flags is a bitmask of elink:VkSemaphoreImportFlagBits specifying
-    additional parameters for the semaphore payload import operation.
-  * pname:handleType is a elink:VkExternalSemaphoreHandleTypeFlagBits value
-    specifying the type of pname:handle.
-  * pname:handle is `NULL` or the external handle to import.
-  * pname:name is `NULL` or a null-terminated UTF-16 string naming the
-    underlying synchronization primitive to import.
-
-The handle types supported by pname:handleType are:
-
-[[synchronization-semaphore-handletypes-win32]]
-.Handle Types Supported by sname:VkImportSemaphoreWin32HandleInfoKHR
-[width="80%",options="header"]
-|====
-| Handle Type                                                      | Transference | Permanence Supported
-| ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT     | Reference    | Temporary,Permanent
-| ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT | Reference    | Temporary,Permanent
-| ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT      | Reference    | Temporary,Permanent
-|====
-
-.Valid Usage
-****
-  * [[VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01140]]
-    pname:handleType must: be a value included in the
-    <<synchronization-semaphore-handletypes-win32,Handle Types Supported by
-    sname:VkImportSemaphoreWin32HandleInfoKHR>> table
-  * [[VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01466]]
-    If pname:handleType is not
-    ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT or
-    ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT, pname:name
-    must: be `NULL`
-  * [[VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01467]]
-    If pname:handle is `NULL`, pname:name must: name a valid synchronization
-    primitive of the type specified by pname:handleType
-  * [[VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01468]]
-    If pname:name is `NULL`, pname:handle must: be a valid handle of the
-    type specified by pname:handleType
-  * [[VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01469]]
-    If pname:handle is not `NULL`, pname:name must: be `NULL`
-  * [[VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01542]]
-    If pname:handle is not `NULL`, it must: obey any requirements listed for
-    pname:handleType in
-    <<external-semaphore-handle-types-compatibility,external semaphore
-    handle types compatibility>>
-  * [[VUID-VkImportSemaphoreWin32HandleInfoKHR-name-01543]]
-    If pname:name is not `NULL`, it must: obey any requirements listed for
-    pname:handleType in
-    <<external-semaphore-handle-types-compatibility,external semaphore
-    handle types compatibility>>
-  * [[VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-03261]]
-    If pname:handleType is
-    ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT or
-    ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, the
-    slink:VkSemaphoreCreateInfo::pname:flags field must: match that of the
-    semaphore from which pname:handle or pname:name was exported
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-  * [[VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-03262]]
-    If pname:handleType is
-    ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT or
-    ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, the
-    slink:VkSemaphoreTypeCreateInfo::pname:semaphoreType field must: match
-    that of the semaphore from which pname:handle or pname:name was exported
-  * [[VUID-VkImportSemaphoreWin32HandleInfoKHR-flags-03322]]
-    If pname:flags contains ename:VK_SEMAPHORE_IMPORT_TEMPORARY_BIT, the
-    slink:VkSemaphoreTypeCreateInfo::pname:semaphoreType field of the
-    semaphore from which pname:handle or pname:name was exported must: not
-    be ename:VK_SEMAPHORE_TYPE_TIMELINE
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-****
-
-include::{generated}/validity/structs/VkImportSemaphoreWin32HandleInfoKHR.txt[]
---
-endif::VK_KHR_external_semaphore_win32[]
-
-ifdef::VK_KHR_external_semaphore_fd[]
-[open,refpage='vkImportSemaphoreFdKHR',desc='Import a semaphore from a POSIX file descriptor',type='protos']
---
-To import a semaphore payload from a POSIX file descriptor, call:
-
-include::{generated}/api/protos/vkImportSemaphoreFdKHR.txt[]
-
-  * pname:device is the logical device that created the semaphore.
-  * pname:pImportSemaphoreFdInfo is a pointer to a
-    slink:VkImportSemaphoreFdInfoKHR structure specifying the semaphore and
-    import parameters.
-
-Importing a semaphore payload from a file descriptor transfers ownership of
-the file descriptor from the application to the Vulkan implementation.
-The application must: not perform any operations on the file descriptor
-after a successful import.
-
-Applications can: import the same semaphore payload into multiple instances
-of Vulkan, into the same instance from which it was exported, and multiple
-times into a given Vulkan instance.
-
-.Valid Usage
-****
-  * [[VUID-vkImportSemaphoreFdKHR-semaphore-01142]]
-    pname:semaphore must: not be associated with any queue command that has
-    not yet completed execution on that queue
-****
-
-include::{generated}/validity/protos/vkImportSemaphoreFdKHR.txt[]
---
-
-[open,refpage='VkImportSemaphoreFdInfoKHR',desc='Structure specifying POSIX file descriptor to import to a semaphore',type='structs']
---
-The sname:VkImportSemaphoreFdInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkImportSemaphoreFdInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:semaphore is the semaphore into which the payload will be
-    imported.
-  * pname:flags is a bitmask of elink:VkSemaphoreImportFlagBits specifying
-    additional parameters for the semaphore payload import operation.
-  * pname:handleType is a elink:VkExternalSemaphoreHandleTypeFlagBits value
-    specifying the type of pname:fd.
-  * pname:fd is the external handle to import.
-
-The handle types supported by pname:handleType are:
-
-[[synchronization-semaphore-handletypes-fd]]
-.Handle Types Supported by sname:VkImportSemaphoreFdInfoKHR
-[width="80%",options="header"]
-|====
-| Handle Type                                               | Transference | Permanence Supported
-| ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT | Reference    | Temporary,Permanent
-| ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT   | Copy         | Temporary
-|====
-
-.Valid Usage
-****
-  * [[VUID-VkImportSemaphoreFdInfoKHR-handleType-01143]]
-    pname:handleType must: be a value included in the
-    <<synchronization-semaphore-handletypes-fd,Handle Types Supported by
-    sname:VkImportSemaphoreFdInfoKHR>> table
-  * [[VUID-VkImportSemaphoreFdInfoKHR-fd-01544]]
-    pname:fd must: obey any requirements listed for pname:handleType in
-    <<external-semaphore-handle-types-compatibility,external semaphore
-    handle types compatibility>>
-  * [[VUID-VkImportSemaphoreFdInfoKHR-handleType-03263]]
-    If pname:handleType is
-    ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT, the
-    slink:VkSemaphoreCreateInfo::pname:flags field must: match that of the
-    semaphore from which pname:fd was exported
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-  * [[VUID-VkImportSemaphoreFdInfoKHR-handleType-03264]]
-    If pname:handleType is
-    ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT, the
-    slink:VkSemaphoreTypeCreateInfo::pname:semaphoreType field must: match
-    that of the semaphore from which pname:fd was exported
-  * [[VUID-VkImportSemaphoreFdInfoKHR-flags-03323]]
-    If pname:flags contains ename:VK_SEMAPHORE_IMPORT_TEMPORARY_BIT, the
-    slink:VkSemaphoreTypeCreateInfo::pname:semaphoreType field of the
-    semaphore from which pname:fd was exported must: not be
-    ename:VK_SEMAPHORE_TYPE_TIMELINE
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-****
-
-If pname:handleType is ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT,
-the special value `-1` for pname:fd is treated like a valid sync file
-descriptor referring to an object that has already signaled.
-The import operation will succeed and the sname:VkSemaphore will have a
-temporarily imported payload as if a valid file descriptor had been
-provided.
-
-[NOTE]
-.Note
-====
-This special behavior for importing an invalid sync file descriptor allows
-easier interoperability with other system APIs which use the convention that
-an invalid sync file descriptor represents work that has already completed
-and does not need to be waited for.
-It is consistent with the option for implementations to return a `-1` file
-descriptor when exporting a
-ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT from a sname:VkSemaphore
-which is signaled.
-====
-
-include::{generated}/validity/structs/VkImportSemaphoreFdInfoKHR.txt[]
---
-endif::VK_KHR_external_semaphore_fd[]
-
-ifdef::VK_FUCHSIA_external_semaphore[]
-[open,refpage='vkImportSemaphoreZirconHandleFUCHSIA',desc='Import a semaphore from a Zircon event handle',type='protos']
---
-To import a semaphore payload from a Zircon event handle, call:
-
-include::{generated}/api/protos/vkImportSemaphoreZirconHandleFUCHSIA.txt[]
-
-  * pname:device is the logical device that created the semaphore.
-  * pname:pImportSemaphoreZirconHandleInfo is a pointer to a
-    slink:VkImportSemaphoreZirconHandleInfoFUCHSIA structure specifying the
-    semaphore and import parameters.
-
-Importing a semaphore payload from a Zircon event handle transfers ownership
-of the handle from the application to the Vulkan implementation.
-The application must: not perform any operations on the handle after a
-successful import.
-
-Applications can: import the same semaphore payload into multiple instances
-of Vulkan, into the same instance from which it was exported, and multiple
-times into a given Vulkan instance.
-
-.Valid Usage
-****
-  * [[VUID-vkImportSemaphoreZirconHandleFUCHSIA-semaphore-04764]]
-    pname:semaphore must: not be associated with any queue command that has
-    not yet completed execution on that queue
-****
-
-include::{generated}/validity/protos/vkImportSemaphoreZirconHandleFUCHSIA.txt[]
---
-
-[open,refpage='VkImportSemaphoreZirconHandleInfoFUCHSIA',desc='Structure specifying Zircon event handle to import to a semaphore',type='structs']
---
-The sname:VkImportSemaphoreZirconHandleInfoFUCHSIA structure is defined as:
-
-include::{generated}/api/structs/VkImportSemaphoreZirconHandleInfoFUCHSIA.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:semaphore is the semaphore into which the payload will be
-    imported.
-  * pname:flags is a bitmask of elink:VkSemaphoreImportFlagBits specifying
-    additional parameters for the semaphore payload import operation.
-  * pname:handleType is a elink:VkExternalSemaphoreHandleTypeFlagBits value
-    specifying the type of pname:zirconHandle.
-  * pname:zirconHandle is the external handle to import.
-
-The handle types supported by pname:handleType are:
-
-[[synchronization-semaphore-handletypes-fuchsia]]
-.Handle Types Supported by sname:VkImportSemaphoreZirconHandleInfoFUCHSIA
-[width="80%",options="header"]
-|====
-| Handle Type                                               | Transference | Permanence Supported
-| ename:VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA   | Reference         | Temporary,Permanent
-|====
-
-.Valid Usage
-****
-  * [[VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-handleType-04765]]
-    pname:handleType must: be a value included in the
-    <<synchronization-semaphore-handletypes-fuchsia,Handle Types Supported
-    by sname:VkImportSemaphoreZirconHandleInfoFUCHSIA>> table
-  * [[VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-zirconHandle-04766]]
-    pname:zirconHandle must: obey any requirements listed for
-    pname:handleType in
-    <<external-semaphore-handle-types-compatibility,external semaphore
-    handle types compatibility>>
-  * [[VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-zirconHandle-04767]]
-    pname:zirconHandle must: have code:ZX_RIGHTS_BASIC and
-    code:ZX_RIGHTS_SIGNAL rights
-ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-  * [[VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-semaphoreType-04768]]
-    The slink:VkSemaphoreTypeCreateInfo::pname:semaphoreType field must: not
-    be ename:VK_SEMAPHORE_TYPE_TIMELINE
-endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
-****
-
-include::{generated}/validity/structs/VkImportSemaphoreZirconHandleInfoFUCHSIA.txt[]
---
-endif::VK_FUCHSIA_external_semaphore[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_semaphore[]
-ifdef::VK_KHR_external_semaphore_win32,VK_KHR_external_semaphore_fd,VK_FUCHSIA_external_semaphore[]
-[open,refpage='VkSemaphoreImportFlagBits',desc='Bitmask specifying additional parameters of semaphore payload import',type='enums']
---
-Bits which can: be set in
-
-ifdef::VK_KHR_external_semaphore_win32[]
-  * slink:VkImportSemaphoreWin32HandleInfoKHR::pname:flags
-endif::VK_KHR_external_semaphore_win32[]
-ifdef::VK_KHR_external_semaphore_fd[]
-  * slink:VkImportSemaphoreFdInfoKHR::pname:flags
-endif::VK_KHR_external_semaphore_fd[]
-ifdef::VK_FUCHSIA_external_semaphore[]
-  * slink:VkImportSemaphoreZirconHandleInfoFUCHSIA::pname:flags
-endif::VK_FUCHSIA_external_semaphore[]
-
-specifying additional parameters of a semaphore import operation are:
-
-include::{generated}/api/enums/VkSemaphoreImportFlagBits.txt[]
-
-ifdef::VK_KHR_external_semaphore[]
-or the equivalent
-
-include::{generated}/api/enums/VkSemaphoreImportFlagBitsKHR.txt[]
-endif::VK_KHR_external_semaphore[]
-
-These bits have the following meanings:
-
-  * ename:VK_SEMAPHORE_IMPORT_TEMPORARY_BIT specifies that the semaphore
-    payload will be imported only temporarily, as described in
-    <<synchronization-semaphores-importing,Importing Semaphore Payloads>>,
-    regardless of the permanence of pname:handleType.
---
-
-[open,refpage='VkSemaphoreImportFlags',desc='Bitmask of VkSemaphoreImportFlagBits',type='flags']
---
-include::{generated}/api/flags/VkSemaphoreImportFlags.txt[]
-
-ifdef::VK_KHR_external_semaphore[]
-or the equivalent
-
-include::{generated}/api/flags/VkSemaphoreImportFlagsKHR.txt[]
-endif::VK_KHR_external_semaphore[]
-
-tname:VkSemaphoreImportFlags is a bitmask type for setting a mask of zero or
-more elink:VkSemaphoreImportFlagBits.
---
-endif::VK_KHR_external_semaphore_win32,VK_KHR_external_semaphore_fd,VK_FUCHSIA_external_semaphore[]
-endif::VK_VERSION_1_1,VK_KHR_external_semaphore[]
-
-
-[[synchronization-events]]
-== Events
-
-[open,refpage='VkEvent',desc='Opaque handle to an event object',type='handles']
---
-Events are a synchronization primitive that can: be used to insert a
-fine-grained dependency between commands submitted to the same queue, or
-between the host and a queue.
-Events must: not be used to insert a dependency between commands submitted
-to different queues.
-Events have two states - signaled and unsignaled.
-An application can: signal or unsignal an event either on the host or on the
-device.
-A device can: be made to wait for an event to become signaled before
-executing further operations.
-No command exists to wait for an event to become signaled on the host, but
-the current state of an event can: be queried.
-
-Events are represented by sname:VkEvent handles:
-
-include::{generated}/api/handles/VkEvent.txt[]
---
-
-[open,refpage='vkCreateEvent',desc='Create a new event object',type='protos']
---
-To create an event, call:
-
-include::{generated}/api/protos/vkCreateEvent.txt[]
-
-  * pname:device is the logical device that creates the event.
-  * pname:pCreateInfo is a pointer to a slink:VkEventCreateInfo structure
-    containing information about how the event is to be created.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pEvent is a pointer to a handle in which the resulting event
-    object is returned.
-
-When created, the event object is in the unsignaled state.
-
-ifdef::VK_KHR_portability_subset[]
-.Valid Usage
-****
-  * [[VUID-vkCreateEvent-events-04468]]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:events is
-    ename:VK_FALSE, then the implementation does not support
-    <<synchronization-events, events>>, and flink:vkCreateEvent must: not be
-    used
-****
-endif::VK_KHR_portability_subset[]
-
-include::{generated}/validity/protos/vkCreateEvent.txt[]
---
-
-[open,refpage='VkEventCreateInfo',desc='Structure specifying parameters of a newly created event',type='structs']
---
-The sname:VkEventCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkEventCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkEventCreateFlagBits defining
-    additional creation parameters.
-
-include::{generated}/validity/structs/VkEventCreateInfo.txt[]
---
-
-[open,refpage='VkEventCreateFlagBits',desc='Event creation flag bits',type='enums']
---
-include::{generated}/api/enums/VkEventCreateFlagBits.txt[]
-
-ifndef::VK_KHR_synchronization2[]
-All values for this enum are defined by extensions.
-endif::VK_KHR_synchronization2[]
-ifdef::VK_KHR_synchronization2[]
-  * ename:VK_EVENT_CREATE_DEVICE_ONLY_BIT_KHR specifies that host event
-    commands will not be used with this event.
-endif::VK_KHR_synchronization2[]
---
-
-[open,refpage='VkEventCreateFlags',desc='Bitmask of event creation flag bits',type='flags']
---
-include::{generated}/api/flags/VkEventCreateFlags.txt[]
-
-tname:VkEventCreateFlags is a bitmask type for setting a mask of
-elink:VkEventCreateFlagBits.
---
-
-[open,refpage='vkDestroyEvent',desc='Destroy an event object',type='protos']
---
-To destroy an event, call:
-
-include::{generated}/api/protos/vkDestroyEvent.txt[]
-
-  * pname:device is the logical device that destroys the event.
-  * pname:event is the handle of the event to destroy.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-.Valid Usage
-****
-  * [[VUID-vkDestroyEvent-event-01145]]
-    All submitted commands that refer to pname:event must: have completed
-    execution
-  * [[VUID-vkDestroyEvent-event-01146]]
-    If sname:VkAllocationCallbacks were provided when pname:event was
-    created, a compatible set of callbacks must: be provided here
-  * [[VUID-vkDestroyEvent-event-01147]]
-    If no sname:VkAllocationCallbacks were provided when pname:event was
-    created, pname:pAllocator must: be `NULL`
-****
-
-include::{generated}/validity/protos/vkDestroyEvent.txt[]
---
-
-[open,refpage='vkGetEventStatus',desc='Retrieve the status of an event object',type='protos']
---
-To query the state of an event from the host, call:
-
-include::{generated}/api/protos/vkGetEventStatus.txt[]
-
-  * pname:device is the logical device that owns the event.
-  * pname:event is the handle of the event to query.
-
-Upon success, fname:vkGetEventStatus returns the state of the event object
-with the following return codes:
-
-.Event Object Status Codes
-[width="80%",options="header"]
-|====
-| Status | Meaning
-| ename:VK_EVENT_SET | The event specified by pname:event is signaled.
-| ename:VK_EVENT_RESET | The event specified by pname:event is unsignaled.
-|====
-
-If a fname:vkCmdSetEvent or fname:vkCmdResetEvent command is in a command
-buffer that is in the <<commandbuffers-lifecycle, pending state>>, then the
-value returned by this command may: immediately be out of date.
-
-The state of an event can: be updated by the host.
-The state of the event is immediately changed, and subsequent calls to
-fname:vkGetEventStatus will return the new state.
-If an event is already in the requested state, then updating it to the same
-state has no effect.
-
-ifdef::VK_KHR_synchronization2[]
-.Valid Usage
-****
- * [[VUID-vkGetEventStatus-event-03940]]
-    pname:event must: not have been created with
-    ename:VK_EVENT_CREATE_DEVICE_ONLY_BIT_KHR
-****
-endif::VK_KHR_synchronization2[]
-
-include::{generated}/validity/protos/vkGetEventStatus.txt[]
---
-
-[[synchronization-events-signaling-host]]
-[open,refpage='vkSetEvent',desc='Set an event to signaled state',type='protos']
---
-To set the state of an event to signaled from the host, call:
-
-include::{generated}/api/protos/vkSetEvent.txt[]
-
-  * pname:device is the logical device that owns the event.
-  * pname:event is the event to set.
-
-When flink:vkSetEvent is executed on the host, it defines an _event signal
-operation_ which sets the event to the signaled state.
-
-If pname:event is already in the signaled state when flink:vkSetEvent is
-executed, then flink:vkSetEvent has no effect, and no event signal operation
-occurs.
-
-ifdef::VK_KHR_synchronization2[]
-.Valid Usage
-****
- * [[VUID-vkSetEvent-event-03941]]
-   pname:event must: not have been created with
-   ename:VK_EVENT_CREATE_DEVICE_ONLY_BIT_KHR
-****
-endif::VK_KHR_synchronization2[]
-
-include::{generated}/validity/protos/vkSetEvent.txt[]
---
-
-[[synchronization-events-unsignaling-host]]
-[open,refpage='vkResetEvent',desc='Reset an event to non-signaled state',type='protos']
---
-To set the state of an event to unsignaled from the host, call:
-
-include::{generated}/api/protos/vkResetEvent.txt[]
-
-  * pname:device is the logical device that owns the event.
-  * pname:event is the event to reset.
-
-When flink:vkResetEvent is executed on the host, it defines an _event
-unsignal operation_ which resets the event to the unsignaled state.
-
-If pname:event is already in the unsignaled state when flink:vkResetEvent is
-executed, then flink:vkResetEvent has no effect, and no event unsignal
-operation occurs.
-
-.Valid Usage
-****
-  * [[VUID-vkResetEvent-event-03821]]
-    There must: be an execution dependency between fname:vkResetEvent and
-    the execution of any flink:vkCmdWaitEvents that includes pname:event in
-    its pname:pEvents parameter
-ifdef::VK_KHR_synchronization2[]
-  * [[VUID-vkResetEvent-event-03822]]
-    There must: be an execution dependency between fname:vkResetEvent and
-    the execution of any flink:vkCmdWaitEvents2KHR that includes pname:event
-    in its pname:pEvents parameter
-endif::VK_KHR_synchronization2[]
-ifdef::VK_KHR_synchronization2[]
-  * [[VUID-vkResetEvent-event-03823]]
-    pname:event must: not have been created with
-    ename:VK_EVENT_CREATE_DEVICE_ONLY_BIT_KHR
-endif::VK_KHR_synchronization2[]
-****
-
-include::{generated}/validity/protos/vkResetEvent.txt[]
---
-
-The state of an event can: also be updated on the device by commands
-inserted in command buffers.
-
-[[synchronization-events-signaling-device]]
-ifdef::VK_KHR_synchronization2[]
-[open,refpage='vkCmdSetEvent2KHR',desc='Set an event object to signaled state',type='protos']
---
-To signal an event from a device, call:
-
-include::{generated}/api/protos/vkCmdSetEvent2KHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:event is the event that will be signaled.
-  * pname:pDependencyInfo is a pointer to a slink:VkDependencyInfoKHR
-    structure defining the first scopes of this operation.
-
-When flink:vkCmdSetEvent2KHR is submitted to a queue, it defines the first
-half of memory dependencies defined by pname:pDependencyInfo, as well as an
-event signal operation which sets the event to the signaled state.
-A memory dependency is defined between the event signal operation and
-commands that occur earlier in submission order.
-
-The first <<synchronization-dependencies-scopes, synchronization scope>> and
-<<synchronization-dependencies-access-scopes, access scope>> are defined by
-the union of all the memory dependencies defined by pname:pDependencyInfo,
-and are applied to all operations that occur earlier in
-<<synchronization-submission-order,submission order>>.
-<<synchronization-queue-transfers, Queue family ownership transfers>> and
-<<synchronization-image-layout-transitions, image layout transitions>>
-defined by pname:pDependencyInfo are also included in the first scopes.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-includes only the event signal operation, and any
-<<synchronization-queue-transfers, queue family ownership transfers>> and
-<<synchronization-image-layout-transitions, image layout transitions>>
-defined by pname:pDependencyInfo.
-
-The second <<synchronization-dependencies-access-scopes, access scope>>
-includes only <<synchronization-queue-transfers, queue family ownership
-transfers>> and <<synchronization-image-layout-transitions, image layout
-transitions>>.
-
-Future flink:vkCmdWaitEvents2KHR commands rely on all values of each element
-in pname:pDependencyInfo matching exactly with those used to signal the
-corresponding event.
-flink:vkCmdWaitEvents must: not be used to wait on the result of a signal
-operation defined by fname:vkCmdSetEvent2KHR.
-
-[NOTE]
-.Note
-====
-The extra information provided by flink:vkCmdSetEvent2KHR compared to
-flink:vkCmdSetEvent allows implementations to more efficiently schedule the
-operations required to satisfy the requested dependencies.
-With flink:vkCmdSetEvent, the full dependency information is not known until
-flink:vkCmdWaitEvents is recorded, forcing implementations to insert the
-required operations at that point and not before.
-====
-
-If pname:event is already in the signaled state when flink:vkCmdSetEvent2KHR
-is executed on the device, then flink:vkCmdSetEvent2KHR has no effect, no
-event signal operation occurs, and no dependency is generated.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetEvent2KHR-synchronization2-03824]]
-    The <<features-synchronization2, pname:synchronization2>> feature must:
-    be enabled
-  * [[VUID-vkCmdSetEvent2KHR-dependencyFlags-03825]]
-    The pname:dependencyFlags member of pname:pDependencyInfo must: be `0`
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-vkCmdSetEvent2KHR-commandBuffer-03826]]
-    The current device mask of pname:commandBuffer must: include exactly one
-    physical device
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-vkCmdSetEvent2KHR-srcStageMask-03827]]
-    The pname:srcStageMask member of any element of the
-    pname:pMemoryBarriers, pname:pBufferMemoryBarriers, or
-    pname:pImageMemoryBarriers members of pname:pDependencyInfo must: only
-    include pipeline stages valid for the queue family that was used to
-    create the command pool that pname:commandBuffer was allocated from
-  * [[VUID-vkCmdSetEvent2KHR-dstStageMask-03828]]
-    The pname:dstStageMask member of any element of the
-    pname:pMemoryBarriers, pname:pBufferMemoryBarriers, or
-    pname:pImageMemoryBarriers members of pname:pDependencyInfo must: only
-    include pipeline stages valid for the queue family that was used to
-    create the command pool that pname:commandBuffer was allocated from
-****
-
-include::{generated}/validity/protos/vkCmdSetEvent2KHR.txt[]
---
-
-[open,refpage='VkDependencyInfoKHR',desc='Structure specifying dependency information for a synchronization command',type='structs']
---
-The sname:VkDependencyInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkDependencyInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:dependencyFlags is a bitmask of elink:VkDependencyFlagBits
-    specifying how execution and memory dependencies are formed.
-  * pname:memoryBarrierCount is the length of the pname:pMemoryBarriers
-    array.
-  * pname:pMemoryBarriers is a pointer to an array of
-    slink:VkMemoryBarrier2KHR structures that define memory dependencies
-    between any memory accesses.
-  * pname:bufferMemoryBarrierCount is the length of the
-    pname:pBufferMemoryBarriers array.
-  * pname:pBufferMemoryBarriers is a pointer to an array of
-    slink:VkBufferMemoryBarrier2KHR structures that define memory
-    dependencies between buffer ranges.
-  * pname:imageMemoryBarrierCount is the length of the
-    pname:pImageMemoryBarriers array.
-  * pname:pImageMemoryBarriers is a pointer to an array of
-    slink:VkImageMemoryBarrier2KHR structures that define memory
-    dependencies between image subresources.
-
-This structure defines a set of <<synchronization-dependencies-memory,
-memory dependencies>>, as well as <<synchronization-queue-transfers, queue
-family transfer operations>> and <<synchronization-image-layout-transitions,
-image layout transitions>>.
-
-Each member of pname:pMemoryBarriers, pname:pBufferMemoryBarriers, and
-pname:pImageMemoryBarriers defines a separate
-<<synchronization-dependencies-memory, memory dependency>>.
-
-include::{generated}/validity/structs/VkDependencyInfoKHR.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='vkCmdSetEvent',desc='Set an event object to signaled state',type='protos']
---
-:refpage: vkCmdSetEvent
-
-To set the state of an event to signaled from a device, call:
-
-include::{generated}/api/protos/vkCmdSetEvent.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:event is the event that will be signaled.
-  * pname:stageMask specifies the <<synchronization-pipeline-stages,source
-    stage mask>> used to determine the first
-    <<synchronization-dependencies-scopes, synchronization scope>>.
-
-
-ifdef::VK_KHR_synchronization2[]
-fname:vkCmdSetEvent behaves identically to flink:vkCmdSetEvent2KHR, except
-that it does not define an access scope, and must: only be used with
-flink:vkCmdWaitEvents, not flink:vkCmdWaitEvents2KHR.
-endif::VK_KHR_synchronization2[]
-
-ifndef::VK_KHR_synchronization2[]
-When flink:vkCmdSetEvent is submitted to a queue, it defines an execution
-dependency on commands that were submitted before it, and defines an event
-signal operation which sets the event to the signaled state.
-
-The first <<synchronization-dependencies-scopes, synchronization scope>>
-includes all commands that occur earlier in
-<<synchronization-submission-order,submission order>>.
-The synchronization scope is limited to operations on the pipeline stages
-determined by the <<synchronization-pipeline-stages-masks, source stage
-mask>> specified by pname:stageMask.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-includes only the event signal operation.
-
-If pname:event is already in the signaled state when flink:vkCmdSetEvent is
-executed on the device, then flink:vkCmdSetEvent has no effect, no event
-signal operation occurs, and no execution dependency is generated.
-endif::VK_KHR_synchronization2[]
-
-.Valid Usage
-****
-:stageMaskName: stageMask
-include::{chapters}/commonvalidity/stage_mask_common.txt[]
-  * [[VUID-vkCmdSetEvent-stageMask-01149]]
-    pname:stageMask must: not include ename:VK_PIPELINE_STAGE_HOST_BIT
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-vkCmdSetEvent-commandBuffer-01152]]
-    pname:commandBuffer's current device mask must: include exactly one
-    physical device
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-****
-
-include::{generated}/validity/protos/vkCmdSetEvent.txt[]
---
-
-[[synchronization-events-unsignaling-device]]
-ifdef::VK_KHR_synchronization2[]
-[open,refpage='vkCmdResetEvent2KHR',desc='Reset an event object to non-signaled state',type='protos']
---
-:refpage: vkCmdResetEvent2KHR
-
-To unsignal the event from a device, call:
-
-include::{generated}/api/protos/vkCmdResetEvent2KHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:event is the event that will be unsignaled.
-  * pname:stageMask is a tlink:VkPipelineStageFlags2KHR mask of pipeline
-    stages used to determine the first
-    <<synchronization-dependencies-scopes, synchronization scope>>.
-
-When flink:vkCmdResetEvent2KHR is submitted to a queue, it defines an
-execution dependency on commands that were submitted before it, and defines
-an event unsignal operation which resets the event to the unsignaled state.
-
-The first <<synchronization-dependencies-scopes, synchronization scope>>
-includes all commands that occur earlier in
-<<synchronization-submission-order,submission order>>.
-The synchronization scope is limited to operations by pname:stageMask or
-stages that are <<synchronization-pipeline-stages-order,logically earlier>>
-than pname:stageMask.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-includes only the event unsignal operation.
-
-If pname:event is already in the unsignaled state when
-flink:vkCmdResetEvent2KHR is executed on the device, then this command has
-no effect, no event unsignal operation occurs, and no execution dependency
-is generated.
-
-.Valid Usage
-****
-:stageMaskName: stageMask
-include::{chapters}/commonvalidity/stage_mask_2_common.txt[]
-  * [[VUID-vkCmdResetEvent2KHR-synchronization2-03829]]
-    The <<features-synchronization2, pname:synchronization2>> feature must:
-    be enabled
-  * [[VUID-vkCmdResetEvent2KHR-stageMask-03830]]
-    pname:stageMask must: not include ename:VK_PIPELINE_STAGE_2_HOST_BIT_KHR
-  * [[VUID-vkCmdResetEvent2KHR-event-03831]]
-    There must: be an execution dependency between fname:vkCmdResetEvent2KHR
-    and the execution of any flink:vkCmdWaitEvents that includes pname:event
-    in its pname:pEvents parameter
-  * [[VUID-vkCmdResetEvent2KHR-event-03832]]
-    There must: be an execution dependency between fname:vkCmdResetEvent2KHR
-    and the execution of any flink:vkCmdWaitEvents2KHR that includes
-    pname:event in its pname:pEvents parameter
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-vkCmdResetEvent2KHR-commandBuffer-03833]]
-    pname:commandBuffer's current device mask must: include exactly one
-    physical device
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-****
-
-include::{generated}/validity/protos/vkCmdResetEvent2KHR.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='vkCmdResetEvent',desc='Reset an event object to non-signaled state',type='protos']
---
-:refpage: vkCmdResetEvent
-
-To set the state of an event to unsignaled from a device, call:
-
-include::{generated}/api/protos/vkCmdResetEvent.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:event is the event that will be unsignaled.
-  * pname:stageMask is a bitmask of elink:VkPipelineStageFlagBits specifying
-    the <<synchronization-pipeline-stages, source stage mask>> used to
-    determine when the pname:event is unsignaled.
-
-ifdef::VK_KHR_synchronization2[]
-fname:vkCmdResetEvent behaves identically to flink:vkCmdResetEvent2KHR.
-endif::VK_KHR_synchronization2[]
-
-ifndef::VK_KHR_synchronization2[]
-When flink:vkCmdResetEvent is submitted to a queue, it defines an execution
-dependency on commands that were submitted before it, and defines an event
-unsignal operation which resets the event to the unsignaled state.
-
-The first <<synchronization-dependencies-scopes, synchronization scope>>
-includes all commands that occur earlier in
-<<synchronization-submission-order,submission order>>.
-The synchronization scope is limited to operations on the pipeline stages
-determined by the <<synchronization-pipeline-stages-masks, source stage
-mask>> specified by pname:stageMask.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-includes only the event unsignal operation.
-
-If pname:event is already in the unsignaled state when flink:vkCmdResetEvent
-is executed on the device, then flink:vkCmdResetEvent has no effect, no
-event unsignal operation occurs, and no execution dependency is generated.
-endif::VK_KHR_synchronization2[]
-
-.Valid Usage
-****
-:stageMaskName: stageMask
-include::{chapters}/commonvalidity/stage_mask_common.txt[]
-  * [[VUID-vkCmdResetEvent-stageMask-01153]]
-    pname:stageMask must: not include ename:VK_PIPELINE_STAGE_HOST_BIT
-  * [[VUID-vkCmdResetEvent-event-03834]]
-    There must: be an execution dependency between fname:vkCmdResetEvent and
-    the execution of any flink:vkCmdWaitEvents that includes pname:event in
-    its pname:pEvents parameter
-ifdef::VK_KHR_synchronization2[]
-  * [[VUID-vkCmdResetEvent-event-03835]]
-    There must: be an execution dependency between fname:vkCmdResetEvent and
-    the execution of any flink:vkCmdWaitEvents2KHR that includes pname:event
-    in its pname:pEvents parameter
-endif::VK_KHR_synchronization2[]
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-vkCmdResetEvent-commandBuffer-01157]]
-    pname:commandBuffer's current device mask must: include exactly one
-    physical device
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-****
-
-include::{generated}/validity/protos/vkCmdResetEvent.txt[]
---
-
-ifdef::VK_KHR_synchronization2[]
-[open,refpage='vkCmdWaitEvents2KHR',desc='Wait for one or more events',type='protos']
---
-To wait for one or more events to enter the signaled state on a device,
-call:
-
-[[synchronization-events-waiting-device]]
-include::{generated}/api/protos/vkCmdWaitEvents2KHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:eventCount is the length of the pname:pEvents array.
-  * pname:pEvents is a pointer to an array of pname:eventCount events to
-    wait on.
-  * pname:pDependencyInfos is a pointer to an array of pname:eventCount
-    slink:VkDependencyInfoKHR structures, defining the second
-    <<synchronization-dependencies-scopes, synchronization scope>>.
-
-When fname:vkCmdWaitEvents2KHR is submitted to a queue, it inserts memory
-dependencies according to the elements of pname:pDependencyInfos and each
-corresponding element of pname:pEvents.
-fname:vkCmdWaitEvents2KHR must: not be used to wait on event signal
-operations occurring on other queues, or signal operations execyted by
-flink:vkCmdSetEvent.
-
-The first <<synchronization-dependencies-scopes, synchronization scope>> and
-<<synchronization-dependencies-access-scopes, access scope>> of each memory
-dependency defined by any element [eq]#i# of pname:pDependencyInfos are
-applied to operations that occurred earlier in
-<<synchronization-submission-order,submission order>> than the last event
-signal operation on element [eq]#i# of pname:pEvents.
-
-Signal operations for an event at index [eq]#i# are only included if:
-
-  * The event was signaled by a flink:vkCmdSetEvent2KHR command that
-    occurred earlier in <<synchronization-submission-order,submission
-    order>> with a pname:dependencyInfo parameter exactly equal to the
-    element of pname:pDependencyInfos at index [eq]#i# ; or
-  * The event was created without ename:VK_EVENT_CREATE_DEVICE_ONLY_BIT_KHR,
-    and the first <<synchronization-dependencies-scopes, synchronization
-    scope>> defined by the element of pname:pDependencyInfos at index
-    [eq]#i# only includes host operations
-    (ename:VK_PIPELINE_STAGE_2_HOST_BIT_KHR).
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-and <<synchronization-dependencies-access-scopes, access scope>> of each
-memory dependency defined by any element [eq]#i# of pname:pDependencyInfos
-are applied to operations that occurred later in
-<<synchronization-submission-order,submission order>> than
-fname:vkCmdWaitEvents2KHR.
-
-[NOTE]
-.Note
-====
-flink:vkCmdWaitEvents2KHR is used with flink:vkCmdSetEvent2KHR to define a
-memory dependency between two sets of action commands, roughly in the same
-way as pipeline barriers, but split into two commands such that work between
-the two may: execute unhindered.
-====
-
-[NOTE]
-.Note
-====
-Applications should be careful to avoid race conditions when using events.
-There is no direct ordering guarantee between fname:vkCmdSetEvent2KHR and
-flink:vkCmdResetEvent2KHR, flink:vkCmdResetEvent, or flink:vkCmdSetEvent.
-Another execution dependency (e.g. a pipeline barrier or semaphore with
-ename:VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR) is needed to prevent such a
-race condition.
-====
-
-.Valid Usage
-****
-  * [[VUID-vkCmdWaitEvents2KHR-synchronization2-03836]]
-    The <<features-synchronization2, pname:synchronization2>> feature must:
-    be enabled
-  * [[VUID-vkCmdWaitEvents2KHR-pEvents-03837]]
-    Members of pname:pEvents must: not have been signaled by
-    flink:vkCmdSetEvent
-  * [[VUID-vkCmdWaitEvents2KHR-pEvents-03838]]
-    For any element [eq]#i# of pname:pEvents, if that event is signaled by
-    flink:vkCmdSetEvent2KHR, that command's pname:dependencyInfo parameter
-    must: be exactly equal to the [eq]##i##th element of
-    pname:pDependencyInfos
-  * [[VUID-vkCmdWaitEvents2KHR-pEvents-03839]]
-    For any element [eq]#i# of pname:pEvents, if that event is signaled by
-    flink:vkSetEvent, barriers in the [eq]##i##th element of
-    pname:pDependencyInfos must: include only host operations in their first
-    <<synchronization-dependencies-scopes, synchronization scope>>
-  * [[VUID-vkCmdWaitEvents2KHR-pEvents-03840]]
-    For any element [eq]#i# of pname:pEvents, if barriers in the [eq]##i##th
-    element of pname:pDependencyInfos include only host operations, the
-    [eq]##i##th element of pname:pEvents must: be signaled before
-    flink:vkCmdWaitEvents2KHR is executed
-  * [[VUID-vkCmdWaitEvents2KHR-pEvents-03841]]
-    For any element [eq]#i# of pname:pEvents, if barriers in the [eq]##i##th
-    element of pname:pDependencyInfos do not include host operations, the
-    [eq]##i##th element of pname:pEvents must: be signaled by a
-    corresponding flink:vkCmdSetEvent2KHR that occurred earlier in
-    <<synchronization-submission-order,submission order>>
-  * [[VUID-vkCmdWaitEvents2KHR-srcStageMask-03842]]
-    The pname:srcStageMask member of any element of the
-    pname:pMemoryBarriers, pname:pBufferMemoryBarriers, or
-    pname:pImageMemoryBarriers members of pname:pDependencyInfos must:
-    either include only pipeline stages valid for the queue family that was
-    used to create the command pool that pname:commandBuffer was allocated
-    from, or include only ename:VK_PIPELINE_STAGE_2_HOST_BIT_KHR
-  * [[VUID-vkCmdWaitEvents2KHR-dstStageMask-03843]]
-    The pname:dstStageMask member of any element of the
-    pname:pMemoryBarriers, pname:pBufferMemoryBarriers, or
-    pname:pImageMemoryBarriers members of pname:pDependencyInfos must: only
-    include pipeline stages valid for the queue family that was used to
-    create the command pool that pname:commandBuffer was allocated from
-  * [[VUID-vkCmdWaitEvents2KHR-dependencyFlags-03844]]
-    The pname:dependencyFlags member of any element of pname:pDependencyInfo
-    must: be `0`
-  * [[VUID-vkCmdWaitEvents2KHR-pEvents-03845]]
-    If pname:pEvents includes one or more events that will be signaled by
-    flink:vkSetEvent after pname:commandBuffer has been submitted to a
-    queue, then fname:vkCmdWaitEvents2KHR must: not be called inside a
-    render pass instance
-  * [[VUID-vkCmdWaitEvents2KHR-commandBuffer-03846]]
-    pname:commandBuffer's current device mask must: include exactly one
-    physical device
-****
-
-include::{generated}/validity/protos/vkCmdWaitEvents2KHR.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='vkCmdWaitEvents',desc='Wait for one or more events and insert a set of memory',type='protos']
---
-:refpage: vkCmdWaitEvents
-
-To wait for one or more events to enter the signaled state on a device,
-call:
-
-[[synchronization-events-waiting-device]]
-include::{generated}/api/protos/vkCmdWaitEvents.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:eventCount is the length of the pname:pEvents array.
-  * pname:pEvents is a pointer to an array of event object handles to wait
-    on.
-  * pname:srcStageMask is a bitmask of elink:VkPipelineStageFlagBits
-    specifying the <<synchronization-pipeline-stages, source stage mask>>.
-  * pname:dstStageMask is a bitmask of elink:VkPipelineStageFlagBits
-    specifying the <<synchronization-pipeline-stages, destination stage
-    mask>>.
-  * pname:memoryBarrierCount is the length of the pname:pMemoryBarriers
-    array.
-  * pname:pMemoryBarriers is a pointer to an array of slink:VkMemoryBarrier
-    structures.
-  * pname:bufferMemoryBarrierCount is the length of the
-    pname:pBufferMemoryBarriers array.
-  * pname:pBufferMemoryBarriers is a pointer to an array of
-    slink:VkBufferMemoryBarrier structures.
-  * pname:imageMemoryBarrierCount is the length of the
-    pname:pImageMemoryBarriers array.
-  * pname:pImageMemoryBarriers is a pointer to an array of
-    slink:VkImageMemoryBarrier structures.
-
-ifdef::VK_KHR_synchronization2[]
-fname:vkCmdWaitEvents is largely similar to flink:vkCmdWaitEvents2KHR, but
-can: only wait on signal operations defined by flink:vkCmdSetEvent.
-As flink:vkCmdSetEvent does not define any access scopes,
-fname:vkCmdWaitEvents defines the first access scope for each event signal
-operation in addition to its own access scopes.
-
-[NOTE]
-.Note
-====
-Since flink:vkCmdSetEvent does not have any dependency information beyond a
-stage mask, implementations do not have the same opportunity to perform
-<<synchronization-dependencies-available-and-visible, availability and
-visibility operations>> or <<synchronization-image-layout-transitions, image
-layout transitions>> in advance as they do with flink:vkCmdSetEvent2KHR and
-flink:vkCmdWaitEvents2KHR.
-====
-endif::VK_KHR_synchronization2[]
-
-When fname:vkCmdWaitEvents is submitted to a queue, it defines a memory
-dependency between prior event signal operations on the same queue or the
-host, and subsequent commands.
-fname:vkCmdWaitEvents must: not be used to wait on event signal operations
-occurring on other queues.
-
-The first synchronization scope only includes event signal operations that
-operate on members of pname:pEvents, and the operations that happened-before
-the event signal operations.
-Event signal operations performed by flink:vkCmdSetEvent that occur earlier
-in <<synchronization-submission-order,submission order>> are included in the
-first synchronization scope, if the <<synchronization-pipeline-stages-order,
-logically latest>> pipeline stage in their pname:stageMask parameter is
-<<synchronization-pipeline-stages-order, logically earlier>> than or equal
-to the <<synchronization-pipeline-stages-order, logically latest>> pipeline
-stage in pname:srcStageMask.
-Event signal operations performed by flink:vkSetEvent are only included in
-the first synchronization scope if ename:VK_PIPELINE_STAGE_HOST_BIT is
-included in pname:srcStageMask.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-includes all commands that occur later in
-<<synchronization-submission-order,submission order>>.
-The second synchronization scope is limited to operations on the pipeline
-stages determined by the <<synchronization-pipeline-stages-masks,
-destination stage mask>> specified by pname:dstStageMask.
-
-The first <<synchronization-dependencies-access-scopes, access scope>> is
-limited to accesses in the pipeline stages determined by the
-<<synchronization-pipeline-stages-masks, source stage mask>> specified by
-pname:srcStageMask.
-Within that, the first access scope only includes the first access scopes
-defined by elements of the pname:pMemoryBarriers,
-pname:pBufferMemoryBarriers and pname:pImageMemoryBarriers arrays, which
-each define a set of <<synchronization-memory-barriers, memory barriers>>.
-If no memory barriers are specified, then the first access scope includes no
-accesses.
-
-The second <<synchronization-dependencies-access-scopes, access scope>> is
-limited to accesses in the pipeline stages determined by the
-<<synchronization-pipeline-stages-masks, destination stage mask>> specified
-by pname:dstStageMask.
-Within that, the second access scope only includes the second access scopes
-defined by elements of the pname:pMemoryBarriers,
-pname:pBufferMemoryBarriers and pname:pImageMemoryBarriers arrays, which
-each define a set of <<synchronization-memory-barriers, memory barriers>>.
-If no memory barriers are specified, then the second access scope includes
-no accesses.
-
-ifndef::VK_KHR_synchronization2[]
-[NOTE]
-.Note
-====
-flink:vkCmdWaitEvents is used with flink:vkCmdSetEvent to define a memory
-dependency between two sets of action commands, roughly in the same way as
-pipeline barriers, but split into two commands such that work between the
-two may: execute unhindered.
-
-Unlike flink:vkCmdPipelineBarrier, a <<synchronization-queue-transfers,
-queue family ownership transfer>> cannot: be performed using
-flink:vkCmdWaitEvents.
-====
-
-[NOTE]
-.Note
-====
-Applications should be careful to avoid race conditions when using events.
-There is no direct ordering guarantee between flink:vkCmdWaitEvents and
-ifdef::VK_KHR_synchronization2[flink:vkCmdResetEvent2KHR,]
-flink:vkCmdResetEvent, or flink:vkCmdSetEvent.
-Another execution dependency (e.g. a pipeline barrier or semaphore with
-ename:VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) is needed to prevent such a race
-condition.
-====
-endif::VK_KHR_synchronization2[]
-
-.Valid Usage
-****
-:stageMaskName: srcStageMask
-include::{chapters}/commonvalidity/stage_mask_common.txt[]
-
-:stageMaskName: dstStageMask
-include::{chapters}/commonvalidity/stage_mask_common.txt[]
-include::{chapters}/commonvalidity/fine_sync_commands_common.txt[]
-  * [[VUID-vkCmdWaitEvents-srcStageMask-01158]]
-    pname:srcStageMask must: be the bitwise OR of the pname:stageMask
-    parameter used in previous calls to fname:vkCmdSetEvent with any of the
-    elements of pname:pEvents and ename:VK_PIPELINE_STAGE_HOST_BIT if any of
-    the elements of pname:pEvents was set using fname:vkSetEvent
-  * [[VUID-vkCmdWaitEvents-pEvents-01163]]
-    If pname:pEvents includes one or more events that will be signaled by
-    fname:vkSetEvent after pname:commandBuffer has been submitted to a
-    queue, then fname:vkCmdWaitEvents must: not be called inside a render
-    pass instance
-  * [[VUID-vkCmdWaitEvents-srcQueueFamilyIndex-02803]]
-    The pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex members of
-    any element of pname:pBufferMemoryBarriers or pname:pImageMemoryBarriers
-    must: be equal
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * [[VUID-vkCmdWaitEvents-commandBuffer-01167]]
-    pname:commandBuffer's current device mask must: include exactly one
-    physical device
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-ifdef::VK_KHR_synchronization2[]
-  * [[VUID-vkCmdWaitEvents-pEvents-03847]]
-    Elements of pname:pEvents must: not have been signaled by
-    flink:vkCmdSetEvent2KHR
-endif::VK_KHR_synchronization2[]
-****
-
-include::{generated}/validity/protos/vkCmdWaitEvents.txt[]
---
-
-
-[[synchronization-pipeline-barriers]]
-== Pipeline Barriers
-
-ifdef::VK_KHR_synchronization2[]
-[open,refpage='vkCmdPipelineBarrier2KHR',desc='Insert a memory dependency',type='protos']
---
-:refpage: vkCmdPipelineBarrier2KHR
-
-To record a pipeline barrier, call:
-
-include::{generated}/api/protos/vkCmdPipelineBarrier2KHR.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:pDependencyInfo is a pointer to a slink:VkDependencyInfoKHR
-    structure defining the scopes of this operation.
-
-When flink:vkCmdPipelineBarrier2KHR is submitted to a queue, it defines
-memory dependencies between commands that were submitted before it, and
-those submitted after it.
-
-The first <<synchronization-dependencies-scopes, synchronization scope>> and
-<<synchronization-dependencies-access-scopes, access scope>> of each memory
-dependency defined by any element [eq]#i# of pname:pDependencyInfos are
-applied to operations that occurred earlier in
-<<synchronization-submission-order,submission order>>.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-and <<synchronization-dependencies-access-scopes, access scope>> of each
-memory dependency defined by any element [eq]#i# of pname:pDependencyInfos
-are applied to operations that occurred later in
-<<synchronization-submission-order,submission order>>.
-
-If fname:vkCmdPipelineBarrier2KHR is recorded within a render pass instance,
-the synchronization scopes are
-<<synchronization-pipeline-barriers-subpass-self-dependencies, limited to
-operations within the same subpass>>.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/pipeline_barrier_common.txt[]
-  * [[VUID-vkCmdPipelineBarrier2KHR-synchronization2-03848]]
-    The <<features-synchronization2, pname:synchronization2>> feature must:
-    be enabled
-  * [[VUID-vkCmdPipelineBarrier2KHR-srcStageMask-03849]]
-    The pname:srcStageMask member of any element of the
-    pname:pMemoryBarriers, pname:pBufferMemoryBarriers, or
-    pname:pImageMemoryBarriers members of pname:pDependencyInfo must: only
-    include pipeline stages valid for the queue family that was used to
-    create the command pool that pname:commandBuffer was allocated from
-  * [[VUID-vkCmdPipelineBarrier2KHR-dstStageMask-03850]]
-    The pname:dstStageMask member of any element of the
-    pname:pMemoryBarriers, pname:pBufferMemoryBarriers, or
-    pname:pImageMemoryBarriers members of pname:pDependencyInfo must: only
-    include pipeline stages valid for the queue family that was used to
-    create the command pool that pname:commandBuffer was allocated from
-****
-
-include::{generated}/validity/protos/vkCmdPipelineBarrier2KHR.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='vkCmdPipelineBarrier',desc='Insert a memory dependency',type='protos']
---
-:refpage: vkCmdPipelineBarrier
-
-To record a pipeline barrier, call:
-
-include::{generated}/api/protos/vkCmdPipelineBarrier.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:srcStageMask is a bitmask of elink:VkPipelineStageFlagBits
-    specifying the <<synchronization-pipeline-stages-masks,source stages>>.
-  * pname:dstStageMask is a bitmask of elink:VkPipelineStageFlagBits
-    specifying the <<synchronization-pipeline-stages-masks,destination
-    stages>>.
-  * pname:dependencyFlags is a bitmask of elink:VkDependencyFlagBits
-    specifying how execution and memory dependencies are formed.
-  * pname:memoryBarrierCount is the length of the pname:pMemoryBarriers
-    array.
-  * pname:pMemoryBarriers is a pointer to an array of slink:VkMemoryBarrier
-    structures.
-  * pname:bufferMemoryBarrierCount is the length of the
-    pname:pBufferMemoryBarriers array.
-  * pname:pBufferMemoryBarriers is a pointer to an array of
-    slink:VkBufferMemoryBarrier structures.
-  * pname:imageMemoryBarrierCount is the length of the
-    pname:pImageMemoryBarriers array.
-  * pname:pImageMemoryBarriers is a pointer to an array of
-    slink:VkImageMemoryBarrier structures.
-
-ifdef::VK_KHR_synchronization2[]
-fname:vkCmdPipelineBarrier operates almost identically to
-flink:vkCmdPipelineBarrier2KHR, except that the scopes and barriers are
-defined as direct parameters rather than being defined by an
-slink:VkDependencyInfoKHR.
-endif::VK_KHR_synchronization2[]
-
-When flink:vkCmdPipelineBarrier is submitted to a queue, it defines a memory
-dependency between commands that were submitted before it, and those
-submitted after it.
-
-If flink:vkCmdPipelineBarrier was recorded outside a render pass instance,
-the first <<synchronization-dependencies-scopes, synchronization scope>>
-includes all commands that occur earlier in
-<<synchronization-submission-order,submission order>>.
-If flink:vkCmdPipelineBarrier was recorded inside a render pass instance,
-the first synchronization scope includes only commands that occur earlier in
-<<synchronization-submission-order,submission order>> within the same
-subpass.
-In either case, the first synchronization scope is limited to operations on
-the pipeline stages determined by the
-<<synchronization-pipeline-stages-masks, source stage mask>> specified by
-pname:srcStageMask.
-
-If flink:vkCmdPipelineBarrier was recorded outside a render pass instance,
-the second <<synchronization-dependencies-scopes, synchronization scope>>
-includes all commands that occur later in
-<<synchronization-submission-order,submission order>>.
-If flink:vkCmdPipelineBarrier was recorded inside a render pass instance,
-the second synchronization scope includes only commands that occur later in
-<<synchronization-submission-order,submission order>> within the same
-subpass.
-In either case, the second synchronization scope is limited to operations on
-the pipeline stages determined by the
-<<synchronization-pipeline-stages-masks, destination stage mask>> specified
-by pname:dstStageMask.
-
-The first <<synchronization-dependencies-access-scopes, access scope>> is
-limited to accesses in the pipeline stages determined by the
-<<synchronization-pipeline-stages-masks, source stage mask>> specified by
-pname:srcStageMask.
-Within that, the first access scope only includes the first access scopes
-defined by elements of the pname:pMemoryBarriers,
-pname:pBufferMemoryBarriers and pname:pImageMemoryBarriers arrays, which
-each define a set of <<synchronization-memory-barriers, memory barriers>>.
-If no memory barriers are specified, then the first access scope includes no
-accesses.
-
-The second <<synchronization-dependencies-access-scopes, access scope>> is
-limited to accesses in the pipeline stages determined by the
-<<synchronization-pipeline-stages-masks, destination stage mask>> specified
-by pname:dstStageMask.
-Within that, the second access scope only includes the second access scopes
-defined by elements of the pname:pMemoryBarriers,
-pname:pBufferMemoryBarriers and pname:pImageMemoryBarriers arrays, which
-each define a set of <<synchronization-memory-barriers, memory barriers>>.
-If no memory barriers are specified, then the second access scope includes
-no accesses.
-
-If pname:dependencyFlags includes ename:VK_DEPENDENCY_BY_REGION_BIT, then
-any dependency between <<synchronization-framebuffer-regions,
-framebuffer-space>> pipeline stages is
-<<synchronization-framebuffer-regions, framebuffer-local>> - otherwise it is
-<<synchronization-framebuffer-regions, framebuffer-global>>.
-
-.Valid Usage
-****
-:stageMaskName: srcStageMask
-include::{chapters}/commonvalidity/stage_mask_common.txt[]
-
-:stageMaskName: dstStageMask
-include::{chapters}/commonvalidity/stage_mask_common.txt[]
-include::{chapters}/commonvalidity/fine_sync_commands_common.txt[]
-include::{chapters}/commonvalidity/pipeline_barrier_common.txt[]
-****
-
-include::{generated}/validity/protos/vkCmdPipelineBarrier.txt[]
---
-
-[open,refpage='VkDependencyFlagBits',desc='Bitmask specifying how execution and memory dependencies are formed',type='enums']
---
-Bits which can: be set in fname:vkCmdPipelineBarrier::pname:dependencyFlags,
-specifying how execution and memory dependencies are formed, are:
-
-include::{generated}/api/enums/VkDependencyFlagBits.txt[]
-
-  * ename:VK_DEPENDENCY_BY_REGION_BIT specifies that dependencies will be
-    <<synchronization-framebuffer-regions, framebuffer-local>>.
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * ename:VK_DEPENDENCY_VIEW_LOCAL_BIT specifies that a
-    <<synchronization-pipeline-barriers-subpass-self-dependencies, subpass
-    has more than one view>>.
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-  * ename:VK_DEPENDENCY_DEVICE_GROUP_BIT specifies that dependencies are
-    <<synchronization-device-local-dependencies, non-device-local>>.
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
---
-
-[open,refpage='VkDependencyFlags',desc='Bitmask of VkDependencyFlagBits',type='flags']
---
-include::{generated}/api/flags/VkDependencyFlags.txt[]
-
-tname:VkDependencyFlags is a bitmask type for setting a mask of zero or more
-elink:VkDependencyFlagBits.
---
-
-
-[[synchronization-pipeline-barriers-subpass-self-dependencies]]
-=== Subpass Self-dependency
-
-ifdef::VK_KHR_dynamic_rendering[]
-flink:vkCmdPipelineBarrier
-ifdef::VK_KHR_synchronization2[]
-or flink:vkCmdPipelineBarrier2KHR
-endif::VK_KHR_synchronization2[]
-must: not be called within a render pass instance started with
-flink:vkCmdBeginRenderingKHR.
-endif::VK_KHR_dynamic_rendering[]
-
-If flink:vkCmdPipelineBarrier
-ifdef::VK_KHR_synchronization2[]
-or flink:vkCmdPipelineBarrier2KHR
-endif::VK_KHR_synchronization2[]
-is called inside a render pass instance, the following restrictions apply.
-For a given subpass to allow a pipeline barrier, the render pass must:
-declare a _self-dependency_ from that subpass to itself.
-That is, there must: exist a subpass dependency with pname:srcSubpass and
-pname:dstSubpass both equal to that subpass index.
-More than one self-dependency can: be declared for each subpass.
-
-Self-dependencies must: only include pipeline stage bits that are graphics
-stages.
-If any of the stages in pname:srcStageMask are
-<<synchronization-framebuffer-regions,framebuffer-space stages>>,
-pname:dstStageMask must: only contain
-<<synchronization-framebuffer-regions,framebuffer-space stages>>.
-This means that pseudo-stages like ename:VK_PIPELINE_STAGE_ALL_COMMANDS_BIT
-which include the execution of both framebuffer-space stages and
-non-framebuffer-space stages must: not be used.
-
-If the source and destination stage masks both include framebuffer-space
-stages, then pname:dependencyFlags must: include
-ename:VK_DEPENDENCY_BY_REGION_BIT.
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-If the subpass has more than one view, then pname:dependencyFlags must:
-include ename:VK_DEPENDENCY_VIEW_LOCAL_BIT.
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-
-Each of the <<synchronization-dependencies-scopes, synchronization scopes>>
-and <<synchronization-dependencies-access-scopes, access scopes>> of a
-ifdef::VK_KHR_synchronization2[]
-flink:vkCmdPipelineBarrier2KHR or
-endif::VK_KHR_synchronization2[]
-flink:vkCmdPipelineBarrier command inside a render pass instance must: be a
-subset of the scopes of one of the self-dependencies for the current
-subpass.
-
-If the self-dependency has ename:VK_DEPENDENCY_BY_REGION_BIT
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-or ename:VK_DEPENDENCY_VIEW_LOCAL_BIT
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-set, then so must: the pipeline barrier.
-Pipeline barriers within a render pass instance must: not include buffer
-memory barriers.
-Image memory barriers must: only specify image subresources that are used as
-attachments within the subpass, and must: not define an
-<<synchronization-image-layout-transitions, image layout transition>> or
-<<synchronization-queue-transfers, queue family ownership transfer>>.
-
-
-[[synchronization-memory-barriers]]
-== Memory Barriers
-
-_Memory barriers_ are used to explicitly control access to buffer and image
-subresource ranges.
-Memory barriers are used to <<synchronization-queue-transfers, transfer
-ownership between queue families>>,
-<<synchronization-image-layout-transitions, change image layouts>>, and
-define <<synchronization-dependencies-available-and-visible, availability
-and visibility operations>>.
-They explicitly define the <<synchronization-access-types, access types>>
-and buffer and image subresource ranges that are included in the
-<<synchronization-dependencies-access-scopes, access scopes>> of a memory
-dependency that is created by a synchronization command that includes them.
-
-
-[[synchronization-global-memory-barriers]]
-=== Global Memory Barriers
-
-Global memory barriers apply to memory accesses involving all memory objects
-that exist at the time of its execution.
-
-ifdef::VK_KHR_synchronization2[]
-[open,refpage='VkMemoryBarrier2KHR',desc='Structure specifying a global memory barrier',type='structs']
---
-:refpage: VkMemoryBarrier2KHR
-
-The sname:VkMemoryBarrier2KHR structure is defined as:
-
-include::{generated}/api/structs/VkMemoryBarrier2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcStageMask is a tlink:VkPipelineStageFlags2KHR mask of pipeline
-    stages to be included in the <<synchronization-dependencies-scopes,
-    first synchronization scope>>.
-  * pname:srcAccessMask is a tlink:VkAccessFlags2KHR mask of access flags to
-    be included in the <<synchronization-dependencies-access-scopes, first
-    access scope>>.
-  * pname:dstStageMask is a tlink:VkPipelineStageFlags2KHR mask of pipeline
-    stages to be included in the <<synchronization-dependencies-scopes,
-    second synchronization scope>>.
-  * pname:dstAccessMask is a tlink:VkAccessFlags2KHR mask of access flags to
-    be included in the <<synchronization-dependencies-access-scopes, second
-    access scope>>.
-
-This structure defines a <<synchronization-dependencies-memory, memory
-dependency>> affecting all device memory.
-
-The first <<synchronization-dependencies-scopes, synchronization scope>> and
-<<synchronization-dependencies-access-scopes, access scope>> described by
-this structure include only operations and memory accesses specified by
-pname:srcStageMask and pname:srcAccessMask.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-and <<synchronization-dependencies-access-scopes, access scope>> described
-by this structure include only operations and memory accesses specified by
-pname:dstStageMask and pname:dstAccessMask.
-
-.Valid Usage
-****
-:stageMaskName: srcStageMask
-:accessMaskName: srcAccessMask
-include::{chapters}/commonvalidity/stage_mask_2_common.txt[]
-include::{chapters}/commonvalidity/access_mask_2_common.txt[]
-
-:stageMaskName: dstStageMask
-:accessMaskName: dstAccessMask
-include::{chapters}/commonvalidity/stage_mask_2_common.txt[]
-include::{chapters}/commonvalidity/access_mask_2_common.txt[]
-****
-
-include::{generated}/validity/structs/VkMemoryBarrier2KHR.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='VkMemoryBarrier',desc='Structure specifying a global memory barrier',type='structs']
---
-The sname:VkMemoryBarrier structure is defined as:
-
-include::{generated}/api/structs/VkMemoryBarrier.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcAccessMask is a bitmask of elink:VkAccessFlagBits specifying a
-    <<synchronization-access-masks, source access mask>>.
-  * pname:dstAccessMask is a bitmask of elink:VkAccessFlagBits specifying a
-    <<synchronization-access-masks, destination access mask>>.
-
-The first <<synchronization-dependencies-access-scopes, access scope>> is
-limited to access types in the <<synchronization-access-masks, source access
-mask>> specified by pname:srcAccessMask.
-
-The second <<synchronization-dependencies-access-scopes, access scope>> is
-limited to access types in the <<synchronization-access-masks, destination
-access mask>> specified by pname:dstAccessMask.
-
-include::{generated}/validity/structs/VkMemoryBarrier.txt[]
---
-
-
-[[synchronization-buffer-memory-barriers]]
-=== Buffer Memory Barriers
-
-Buffer memory barriers only apply to memory accesses involving a specific
-buffer range.
-That is, a memory dependency formed from a buffer memory barrier is
-<<synchronization-dependencies-access-scopes, scoped>> to access via the
-specified buffer range.
-Buffer memory barriers can: also be used to define a
-<<synchronization-queue-transfers, queue family ownership transfer>> for the
-specified buffer range.
-
-ifdef::VK_KHR_synchronization2[]
-[open,refpage='VkBufferMemoryBarrier2KHR',desc='Structure specifying a buffer memory barrier',type='structs']
---
-:refpage: VkBufferMemoryBarrier2KHR
-
-The sname:VkBufferMemoryBarrier2KHR structure is defined as:
-
-include::{generated}/api/structs/VkBufferMemoryBarrier2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcStageMask is a tlink:VkPipelineStageFlags2KHR mask of pipeline
-    stages to be included in the <<synchronization-dependencies-scopes,
-    first synchronization scope>>.
-  * pname:srcAccessMask is a tlink:VkAccessFlags2KHR mask of access flags to
-    be included in the <<synchronization-dependencies-access-scopes, first
-    access scope>>.
-  * pname:dstStageMask is a tlink:VkPipelineStageFlags2KHR mask of pipeline
-    stages to be included in the <<synchronization-dependencies-scopes,
-    second synchronization scope>>.
-  * pname:dstAccessMask is a tlink:VkAccessFlags2KHR mask of access flags to
-    be included in the <<synchronization-dependencies-access-scopes, second
-    access scope>>.
-  * pname:srcQueueFamilyIndex is the source queue family for a
-    <<synchronization-queue-transfers, queue family ownership transfer>>.
-  * pname:dstQueueFamilyIndex is the destination queue family for a
-    <<synchronization-queue-transfers, queue family ownership transfer>>.
-  * pname:buffer is a handle to the buffer whose backing memory is affected
-    by the barrier.
-  * pname:offset is an offset in bytes into the backing memory for
-    pname:buffer; this is relative to the base offset as bound to the buffer
-    (see flink:vkBindBufferMemory).
-  * pname:size is a size in bytes of the affected area of backing memory for
-    pname:buffer, or ename:VK_WHOLE_SIZE to use the range from pname:offset
-    to the end of the buffer.
-
-This structure defines a <<synchronization-dependencies-memory, memory
-dependency>> limited to a range of a buffer, and can: define a
-<<synchronization-queue-transfers, queue family transfer operation>> for
-that range.
-
-The first <<synchronization-dependencies-scopes, synchronization scope>> and
-<<synchronization-dependencies-access-scopes, access scope>> described by
-this structure include only operations and memory accesses specified by
-pname:srcStageMask and pname:srcAccessMask.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-and <<synchronization-dependencies-access-scopes, access scope>> described
-by this structure include only operations and memory accesses specified by
-pname:dstStageMask and pname:dstAccessMask.
-
-Both <<synchronization-dependencies-access-scopes, access scopes>> are
-limited to only memory accesses to pname:buffer in the range defined by
-pname:offset and pname:size.
-
-If pname:buffer was created with ename:VK_SHARING_MODE_EXCLUSIVE, and
-pname:srcQueueFamilyIndex is not equal to pname:dstQueueFamilyIndex, this
-memory barrier defines a <<synchronization-queue-transfers, queue family
-transfer operation>>.
-When executed on a queue in the family identified by
-pname:srcQueueFamilyIndex, this barrier defines a
-<<synchronization-queue-transfers-release, queue family release operation>>
-for the specified buffer range, and the second synchronization and access
-scopes do not synchronize operations on that queue.
-When executed on a queue in the family identified by
-pname:dstQueueFamilyIndex, this barrier defines a
-<<synchronization-queue-transfers-acquire, queue family acquire operation>>
-for the specified buffer range, and the first synchronization and access
-scopes do not synchronize operations on that queue.
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-A <<synchronization-queue-transfers, queue family transfer operation>> is
-also defined if the values are not equal, and either is one of the special
-queue family values reserved for external memory ownership transfers, as
-described in <<synchronization-queue-transfers>>.
-A <<synchronization-queue-transfers-release, queue family release
-operation>> is defined when pname:dstQueueFamilyIndex is one of those
-values, and a <<synchronization-queue-transfers-acquire, queue family
-acquire operation>> is defined when pname:srcQueueFamilyIndex is one of
-those values.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-
-.Valid Usage
-****
-
-:stageMaskName: srcStageMask
-:accessMaskName: srcAccessMask
-include::{chapters}/commonvalidity/stage_mask_2_common.txt[]
-include::{chapters}/commonvalidity/access_mask_2_common.txt[]
-
-:stageMaskName: dstStageMask
-:accessMaskName: dstAccessMask
-include::{chapters}/commonvalidity/stage_mask_2_common.txt[]
-include::{chapters}/commonvalidity/access_mask_2_common.txt[]
-include::{chapters}/commonvalidity/buffer_memory_barrier_common.txt[]
-  * [[VUID-VkBufferMemoryBarrier2KHR-srcStageMask-03851]]
-    If either pname:srcStageMask or pname:dstStageMask includes
-    ename:VK_PIPELINE_STAGE_2_HOST_BIT_KHR, pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex must: be equal
-****
-
-include::{generated}/validity/structs/VkBufferMemoryBarrier2KHR.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='VkBufferMemoryBarrier',desc='Structure specifying a buffer memory barrier',type='structs']
---
-:refpage: VkBufferMemoryBarrier
-
-The sname:VkBufferMemoryBarrier structure is defined as:
-
-include::{generated}/api/structs/VkBufferMemoryBarrier.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcAccessMask is a bitmask of elink:VkAccessFlagBits specifying a
-    <<synchronization-access-masks, source access mask>>.
-  * pname:dstAccessMask is a bitmask of elink:VkAccessFlagBits specifying a
-    <<synchronization-access-masks, destination access mask>>.
-  * pname:srcQueueFamilyIndex is the source queue family for a
-    <<synchronization-queue-transfers, queue family ownership transfer>>.
-  * pname:dstQueueFamilyIndex is the destination queue family for a
-    <<synchronization-queue-transfers, queue family ownership transfer>>.
-  * pname:buffer is a handle to the buffer whose backing memory is affected
-    by the barrier.
-  * pname:offset is an offset in bytes into the backing memory for
-    pname:buffer; this is relative to the base offset as bound to the buffer
-    (see flink:vkBindBufferMemory).
-  * pname:size is a size in bytes of the affected area of backing memory for
-    pname:buffer, or ename:VK_WHOLE_SIZE to use the range from pname:offset
-    to the end of the buffer.
-
-The first <<synchronization-dependencies-access-scopes, access scope>> is
-limited to access to memory through the specified buffer range, via access
-types in the <<synchronization-access-masks, source access mask>> specified
-by pname:srcAccessMask.
-If pname:srcAccessMask includes ename:VK_ACCESS_HOST_WRITE_BIT, memory
-writes performed by that access type are also made visible, as that access
-type is not performed through a resource.
-
-The second <<synchronization-dependencies-access-scopes, access scope>> is
-limited to access to memory through the specified buffer range, via access
-types in the <<synchronization-access-masks, destination access mask>>
-specified by pname:dstAccessMask.
-If pname:dstAccessMask includes ename:VK_ACCESS_HOST_WRITE_BIT or
-ename:VK_ACCESS_HOST_READ_BIT, available memory writes are also made visible
-to accesses of those types, as those access types are not performed through
-a resource.
-
-If pname:srcQueueFamilyIndex is not equal to pname:dstQueueFamilyIndex, and
-pname:srcQueueFamilyIndex is equal to the current queue family, then the
-memory barrier defines a <<synchronization-queue-transfers-release, queue
-family release operation>> for the specified buffer range, and the second
-access scope includes no access, as if pname:dstAccessMask was `0`.
-
-If pname:dstQueueFamilyIndex is not equal to pname:srcQueueFamilyIndex, and
-pname:dstQueueFamilyIndex is equal to the current queue family, then the
-memory barrier defines a <<synchronization-queue-transfers-acquire, queue
-family acquire operation>> for the specified buffer range, and the first
-access scope includes no access, as if pname:srcAccessMask was `0`.
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/buffer_memory_barrier_common.txt[]
-ifndef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * [[VUID-VkBufferMemoryBarrier-synchronization2-03852]]
-    If the <<features-synchronization2,pname:synchronization2 feature>> is
-    not enabled, and pname:buffer was created with a sharing mode of
-    ename:VK_SHARING_MODE_CONCURRENT, pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex must: both be ename:VK_QUEUE_FAMILY_IGNORED
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * [[VUID-VkBufferMemoryBarrier-synchronization2-03853]]
-    If the <<features-synchronization2,pname:synchronization2 feature>> is
-    not enabled, and pname:buffer was created with a sharing mode of
-    ename:VK_SHARING_MODE_CONCURRENT, at least one of
-    pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex must: be
-    ename:VK_QUEUE_FAMILY_IGNORED
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-****
-
-include::{generated}/validity/structs/VkBufferMemoryBarrier.txt[]
---
-
-[open,refpage='VK_WHOLE_SIZE',desc='Sentinel value to use entire remaining array length',type='consts']
---
-ename:VK_WHOLE_SIZE is a special value indicating that the entire remaining
-length of a buffer following a given pname:offset should be used.
-It can: be specified for slink:VkBufferMemoryBarrier::pname:size and other
-structures.
-
-include::{generated}/api/enums/VK_WHOLE_SIZE.txt[]
---
-
-
-[[synchronization-image-memory-barriers]]
-=== Image Memory Barriers
-
-Image memory barriers only apply to memory accesses involving a specific
-image subresource range.
-That is, a memory dependency formed from an image memory barrier is
-<<synchronization-dependencies-access-scopes, scoped>> to access via the
-specified image subresource range.
-Image memory barriers can: also be used to define
-<<synchronization-image-layout-transitions, image layout transitions>> or a
-<<synchronization-queue-transfers, queue family ownership transfer>> for the
-specified image subresource range.
-
-ifdef::VK_KHR_synchronization2[]
-[open,refpage='VkImageMemoryBarrier2KHR',desc='Structure specifying an image memory barrier',type='structs']
---
-:refpage: VkImageMemoryBarrier2KHR
-
-The sname:VkImageMemoryBarrier2KHR structure is defined as:
-
-include::{generated}/api/structs/VkImageMemoryBarrier2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcStageMask is a tlink:VkPipelineStageFlags2KHR mask of pipeline
-    stages to be included in the <<synchronization-dependencies-scopes,
-    first synchronization scope>>.
-  * pname:srcAccessMask is a tlink:VkAccessFlags2KHR mask of access flags to
-    be included in the <<synchronization-dependencies-access-scopes, first
-    access scope>>.
-  * pname:dstStageMask is a tlink:VkPipelineStageFlags2KHR mask of pipeline
-    stages to be included in the <<synchronization-dependencies-scopes,
-    second synchronization scope>>.
-  * pname:dstAccessMask is a tlink:VkAccessFlags2KHR mask of access flags to
-    be included in the <<synchronization-dependencies-access-scopes, second
-    access scope>>.
-  * pname:oldLayout is the old layout in an
-    <<synchronization-image-layout-transitions, image layout transition>>.
-  * pname:newLayout is the new layout in an
-    <<synchronization-image-layout-transitions, image layout transition>>.
-  * pname:srcQueueFamilyIndex is the source queue family for a
-    <<synchronization-queue-transfers, queue family ownership transfer>>.
-  * pname:dstQueueFamilyIndex is the destination queue family for a
-    <<synchronization-queue-transfers, queue family ownership transfer>>.
-  * pname:image is a handle to the image affected by this barrier.
-  * pname:subresourceRange describes the <<resources-image-views, image
-    subresource range>> within pname:image that is affected by this barrier.
-
-This structure defines a <<synchronization-dependencies-memory, memory
-dependency>> limited to an image subresource range, and can: define a
-<<synchronization-queue-transfers, queue family transfer operation>> and
-<<synchronization-image-layout-transitions, image layout transition>> for
-that subresource range.
-
-The first <<synchronization-dependencies-scopes, synchronization scope>> and
-<<synchronization-dependencies-access-scopes, access scope>> described by
-this structure include only operations and memory accesses specified by
-pname:srcStageMask and pname:srcAccessMask.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-and <<synchronization-dependencies-access-scopes, access scope>> described
-by this structure include only operations and memory accesses specified by
-pname:dstStageMask and pname:dstAccessMask.
-
-Both <<synchronization-dependencies-access-scopes, access scopes>> are
-limited to only memory accesses to pname:image in the subresource range
-defined by pname:subresourceRange.
-
-If pname:image was created with ename:VK_SHARING_MODE_EXCLUSIVE, and
-pname:srcQueueFamilyIndex is not equal to pname:dstQueueFamilyIndex, this
-memory barrier defines a <<synchronization-queue-transfers, queue family
-transfer operation>>.
-When executed on a queue in the family identified by
-pname:srcQueueFamilyIndex, this barrier defines a
-<<synchronization-queue-transfers-release, queue family release operation>>
-for the specified image subresource range, and the second synchronization
-and access scopes do not synchronize operations on that queue.
-When executed on a queue in the family identified by
-pname:dstQueueFamilyIndex, this barrier defines a
-<<synchronization-queue-transfers-acquire, queue family acquire operation>>
-for the specified image subresource range, and the first synchronization and
-access scopes do not synchronize operations on that queue.
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-A <<synchronization-queue-transfers, queue family transfer operation>> is
-also defined if the values are not equal, and either is one of the special
-queue family values reserved for external memory ownership transfers, as
-described in <<synchronization-queue-transfers>>.
-A <<synchronization-queue-transfers-release, queue family release
-operation>> is defined when pname:dstQueueFamilyIndex is one of those
-values, and a <<synchronization-queue-transfers-acquire, queue family
-acquire operation>> is defined when pname:srcQueueFamilyIndex is one of
-those values.
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-If pname:oldLayout is not equal to pname:newLayout, then the memory barrier
-defines an <<synchronization-image-layout-transitions, image layout
-transition>> for the specified image subresource range.
-If this memory barrier defines a <<synchronization-queue-transfers, queue
-family transfer operation>>, the layout transition is only executed once
-between the queues.
-
-[NOTE]
-.Note
-====
-When the old and new layout are equal, the layout values are ignored - data
-is preserved no matter what values are specified, or what layout the image
-is currently in.
-====
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-If pname:image has a multi-planar format and the image is _disjoint_, then
-including ename:VK_IMAGE_ASPECT_COLOR_BIT in the pname:aspectMask member of
-pname:subresourceRange is equivalent to including
-ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT, and
-(for three-plane formats only) ename:VK_IMAGE_ASPECT_PLANE_2_BIT.
-
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-.Valid Usage
-****
-
-:stageMaskName: srcStageMask
-:accessMaskName: srcAccessMask
-include::{chapters}/commonvalidity/stage_mask_2_common.txt[]
-include::{chapters}/commonvalidity/access_mask_2_common.txt[]
-
-:stageMaskName: dstStageMask
-:accessMaskName: dstAccessMask
-include::{chapters}/commonvalidity/stage_mask_2_common.txt[]
-include::{chapters}/commonvalidity/access_mask_2_common.txt[]
-include::{chapters}/commonvalidity/image_memory_barrier_common.txt[]
-  * [[VUID-VkImageMemoryBarrier2KHR-srcStageMask-03854]]
-    If either pname:srcStageMask or pname:dstStageMask includes
-    ename:VK_PIPELINE_STAGE_2_HOST_BIT_KHR, pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex must: be equal
-  * [[VUID-VkImageMemoryBarrier2KHR-srcStageMask-03855]]
-    If pname:srcStageMask includes ename:VK_PIPELINE_STAGE_2_HOST_BIT_KHR,
-    and pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex define a
-    <<synchronization-queue-transfers, queue family ownership transfer>> or
-    pname:oldLayout and pname:newLayout define an
-    <<synchronization-image-layout-transitions, image layout transition>>,
-    pname:oldLayout must: be one of ename:VK_IMAGE_LAYOUT_PREINITIALIZED,
-    ename:VK_IMAGE_LAYOUT_UNDEFINED, or ename:VK_IMAGE_LAYOUT_GENERAL
-****
-
-include::{generated}/validity/structs/VkImageMemoryBarrier2KHR.txt[]
---
-endif::VK_KHR_synchronization2[]
-
-[open,refpage='VkImageMemoryBarrier',desc='Structure specifying the parameters of an image memory barrier',type='structs']
---
-:refpage: VkImageMemoryBarrier
-
-The sname:VkImageMemoryBarrier structure is defined as:
-
-include::{generated}/api/structs/VkImageMemoryBarrier.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:srcAccessMask is a bitmask of elink:VkAccessFlagBits specifying a
-    <<synchronization-access-masks, source access mask>>.
-  * pname:dstAccessMask is a bitmask of elink:VkAccessFlagBits specifying a
-    <<synchronization-access-masks, destination access mask>>.
-  * pname:oldLayout is the old layout in an
-    <<synchronization-image-layout-transitions, image layout transition>>.
-  * pname:newLayout is the new layout in an
-    <<synchronization-image-layout-transitions, image layout transition>>.
-  * pname:srcQueueFamilyIndex is the source queue family for a
-    <<synchronization-queue-transfers, queue family ownership transfer>>.
-  * pname:dstQueueFamilyIndex is the destination queue family for a
-    <<synchronization-queue-transfers, queue family ownership transfer>>.
-  * pname:image is a handle to the image affected by this barrier.
-  * pname:subresourceRange describes the <<resources-image-views, image
-    subresource range>> within pname:image that is affected by this barrier.
-
-The first <<synchronization-dependencies-access-scopes, access scope>> is
-limited to access to memory through the specified image subresource range,
-via access types in the <<synchronization-access-masks, source access mask>>
-specified by pname:srcAccessMask.
-If pname:srcAccessMask includes ename:VK_ACCESS_HOST_WRITE_BIT, memory
-writes performed by that access type are also made visible, as that access
-type is not performed through a resource.
-
-The second <<synchronization-dependencies-access-scopes, access scope>> is
-limited to access to memory through the specified image subresource range,
-via access types in the <<synchronization-access-masks, destination access
-mask>> specified by pname:dstAccessMask.
-If pname:dstAccessMask includes ename:VK_ACCESS_HOST_WRITE_BIT or
-ename:VK_ACCESS_HOST_READ_BIT, available memory writes are also made visible
-to accesses of those types, as those access types are not performed through
-a resource.
-
-If pname:srcQueueFamilyIndex is not equal to pname:dstQueueFamilyIndex, and
-pname:srcQueueFamilyIndex is equal to the current queue family, then the
-memory barrier defines a <<synchronization-queue-transfers-release, queue
-family release operation>> for the specified image subresource range, and
-the second access scope includes no access, as if pname:dstAccessMask was
-`0`.
-
-If pname:dstQueueFamilyIndex is not equal to pname:srcQueueFamilyIndex, and
-pname:dstQueueFamilyIndex is equal to the current queue family, then the
-memory barrier defines a <<synchronization-queue-transfers-acquire, queue
-family acquire operation>> for the specified image subresource range, and
-the first access scope includes no access, as if pname:srcAccessMask was
-`0`.
-
-ifdef::VK_KHR_synchronization2[]
-If the <<features-synchronization2,pname:synchronization2 feature>> is not
-enabled or pname:oldLayout is not equal to pname:newLayout,
-endif::VK_KHR_synchronization2[]
-pname:oldLayout and pname:newLayout define an
-<<synchronization-image-layout-transitions, image layout transition>> for
-the specified image subresource range.
-
-ifdef::VK_KHR_synchronization2[]
-[NOTE]
-.Note
-====
-If the <<features-synchronization2,pname:synchronization2 feature>> is
-enabled, when the old and new layout are equal, the layout values are
-ignored - data is preserved no matter what values are specified, or what
-layout the image is currently in.
-====
-endif::VK_KHR_synchronization2[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-If pname:image has a multi-planar format and the image is _disjoint_, then
-including ename:VK_IMAGE_ASPECT_COLOR_BIT in the pname:aspectMask member of
-pname:subresourceRange is equivalent to including
-ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT, and
-(for three-plane formats only) ename:VK_IMAGE_ASPECT_PLANE_2_BIT.
-
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-.Valid Usage
-****
-include::{chapters}/commonvalidity/image_memory_barrier_common.txt[]
-ifndef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * [[VUID-VkImageMemoryBarrier-synchronization2-03856]]
-    If the <<features-synchronization2,pname:synchronization2 feature>> is
-    not enabled, and pname:image was created with a sharing mode of
-    ename:VK_SHARING_MODE_CONCURRENT, pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex must: both be ename:VK_QUEUE_FAMILY_IGNORED
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-  * [[VUID-VkImageMemoryBarrier-synchronization2-03857]]
-    If the <<features-synchronization2,pname:synchronization2 feature>> is
-    not enabled, and pname:image was created with a sharing mode of
-    ename:VK_SHARING_MODE_CONCURRENT, at least one of
-    pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex must: be
-    ename:VK_QUEUE_FAMILY_IGNORED
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-****
-
-include::{generated}/validity/structs/VkImageMemoryBarrier.txt[]
---
-
-
-[[synchronization-queue-transfers]]
-=== Queue Family Ownership Transfer
-
-Resources created with a elink:VkSharingMode of
-ename:VK_SHARING_MODE_EXCLUSIVE must: have their ownership explicitly
-transferred from one queue family to another in order to access their
-content in a well-defined manner on a queue in a different queue family.
-
-[open,refpage='VK_QUEUE_FAMILY_IGNORED',desc='Ignored queue family index sentinel',type='consts']
---
-The special queue family index ename:VK_QUEUE_FAMILY_IGNORED indicates that
-a queue family parameter or member is ignored.
-
-include::{generated}/api/enums/VK_QUEUE_FAMILY_IGNORED.txt[]
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_external_memory[]
-Resources shared with external APIs or instances using external memory must:
-also explicitly manage ownership transfers between local and external queues
-(or equivalent constructs in external APIs) regardless of the
-elink:VkSharingMode specified when creating them.
-
-[open,refpage='VK_QUEUE_FAMILY_EXTERNAL',desc='External queue family index sentinel',type='consts',alias='VK_QUEUE_FAMILY_EXTERNAL_KHR']
---
-The special queue family index ename:VK_QUEUE_FAMILY_EXTERNAL represents any
-queue external to the resource's current Vulkan instance, as long as the
-queue uses the same underlying
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[device group or]
-physical device, and the same driver version as the resource's
-slink:VkDevice, as indicated by
-slink:VkPhysicalDeviceIDProperties::pname:deviceUUID and
-slink:VkPhysicalDeviceIDProperties::pname:driverUUID.
-
-include::{generated}/api/enums/VK_QUEUE_FAMILY_EXTERNAL.txt[]
-
-ifdef::VK_KHR_external_memory[]
-or the equivalent
-
-include::{generated}/api/enums/VK_QUEUE_FAMILY_EXTERNAL_KHR.txt[]
-endif::VK_KHR_external_memory[]
---
-
-ifdef::VK_EXT_queue_family_foreign[]
-[open,refpage='VK_QUEUE_FAMILY_FOREIGN_EXT',desc='Foreign queue family index sentinel',type='consts']
---
-The special queue family index ename:VK_QUEUE_FAMILY_FOREIGN_EXT represents
-any queue external to the resource's current Vulkan instance, regardless of
-the queue's underlying physical device or driver version.
-This includes, for example, queues for fixed-function image processing
-devices, media codec devices, and display devices, as well as all queues
-that use the same underlying
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[device group or]
-physical device, and the same driver version as the resource's
-slink:VkDevice.
-
-include::{generated}/api/enums/VK_QUEUE_FAMILY_FOREIGN_EXT.txt[]
---
-endif::VK_EXT_queue_family_foreign[]
-endif::VK_VERSION_1_1,VK_KHR_external_memory[]
-
-If memory dependencies are correctly expressed between uses of such a
-resource between two queues in different families, but no ownership transfer
-is defined, the contents of that resource are undefined: for any read
-accesses performed by the second queue family.
-
-[NOTE]
-.Note
-====
-If an application does not need the contents of a resource to remain valid
-when transferring from one queue family to another, then the ownership
-transfer should: be skipped.
-====
-
-ifdef::VK_EXT_queue_family_foreign[]
-[NOTE]
-.Note
-====
-Applications should expect transfers to/from
-ename:VK_QUEUE_FAMILY_FOREIGN_EXT to be more expensive than transfers
-to/from ename:VK_QUEUE_FAMILY_EXTERNAL_KHR.
-====
-endif::VK_EXT_queue_family_foreign[]
-
-A queue family ownership transfer consists of two distinct parts:
-
-  . Release exclusive ownership from the source queue family
-  . Acquire exclusive ownership for the destination queue family
-
-An application must: ensure that these operations occur in the correct order
-by defining an execution dependency between them, e.g. using a semaphore.
-
-[[synchronization-queue-transfers-release]] A _release operation_ is used to
-release exclusive ownership of a range of a buffer or image subresource
-range.
-A release operation is defined by executing a
-<<synchronization-buffer-memory-barriers, buffer memory barrier>> (for a
-buffer range) or an <<synchronization-image-memory-barriers, image memory
-barrier>> (for an image subresource range) using a pipeline barrier command,
-on a queue from the source queue family.
-The pname:srcQueueFamilyIndex parameter of the barrier must: be set to the
-source queue family index, and the pname:dstQueueFamilyIndex parameter to
-the destination queue family index.
-pname:dstAccessMask is ignored for such a barrier, such that no visibility
-operation is executed - the value of this mask does not affect the validity
-of the barrier.
-The release operation happens-after the availability operation, and
-happens-before operations specified in the second synchronization scope of
-the calling command.
-
-[[synchronization-queue-transfers-acquire]] An _acquire operation_ is used
-to acquire exclusive ownership of a range of a buffer or image subresource
-range.
-An acquire operation is defined by executing a
-<<synchronization-buffer-memory-barriers, buffer memory barrier>> (for a
-buffer range) or an <<synchronization-image-memory-barriers, image memory
-barrier>> (for an image subresource range) using a pipeline barrier command,
-on a queue from the destination queue family.
-The buffer range or image subresource range specified in an acquire
-operation must: match exactly that of a previous release operation.
-The pname:srcQueueFamilyIndex parameter of the barrier must: be set to the
-source queue family index, and the pname:dstQueueFamilyIndex parameter to
-the destination queue family index.
-pname:srcAccessMask is ignored for such a barrier, such that no availability
-operation is executed - the value of this mask does not affect the validity
-of the barrier.
-The acquire operation happens-after operations in the first synchronization
-scope of the calling command, and happens-before the visibility operation.
-
-[NOTE]
-.Note
-====
-Whilst it is not invalid to provide destination or source access masks for
-memory barriers used for release or acquire operations, respectively, they
-have no practical effect.
-Access after a release operation has undefined: results, and so visibility
-for those accesses has no practical effect.
-Similarly, write access before an acquire operation will produce undefined:
-results for future access, so availability of those writes has no practical
-use.
-In an earlier version of the specification, these were required to match on
-both sides - but this was subsequently relaxed.
-These masks should: be set to 0.
-====
-
-If the transfer is via an image memory barrier, and an
-<<synchronization-image-layout-transitions, image layout transition>> is
-desired, then the values of pname:oldLayout and pname:newLayout in the
-_release operation_'s memory barrier must: be equal to values of
-pname:oldLayout and pname:newLayout in the _acquire operation_'s memory
-barrier.
-Although the image layout transition is submitted twice, it will only be
-executed once.
-A layout transition specified in this way happens-after the _release
-operation_ and happens-before the _acquire operation_.
-
-If the values of pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex are
-equal, no ownership transfer is performed, and the barrier operates as if
-they were both set to ename:VK_QUEUE_FAMILY_IGNORED.
-
-Queue family ownership transfers may: perform read and write accesses on all
-memory bound to the image subresource or buffer range, so applications must:
-ensure that all memory writes have been made
-<<synchronization-dependencies-available-and-visible, available>> before a
-queue family ownership transfer is executed.
-Available memory is automatically made visible to queue family release and
-acquire operations, and writes performed by those operations are
-automatically made available.
-
-Once a queue family has acquired ownership of a buffer range or image
-subresource range of a ename:VK_SHARING_MODE_EXCLUSIVE resource, its
-contents are undefined: to other queue families unless ownership is
-transferred.
-The contents of any portion of another resource which aliases memory that is
-bound to the transferred buffer or image subresource range are undefined:
-after a release or acquire operation.
-
-[NOTE]
-.Note
-====
-Because <<synchronization-events, events>> cannot: be used directly for
-inter-queue synchronization, and because flink:vkCmdSetEvent does not have
-the queue family index or memory barrier parameters needed by a _release
-operation_, the release and acquire operations of a queue family ownership
-transfer can: only be performed using flink:vkCmdPipelineBarrier.
-====
-
-
-[[synchronization-wait-idle]]
-== Wait Idle Operations
-
-[open,refpage='vkQueueWaitIdle',desc='Wait for a queue to become idle',type='protos']
---
-To wait on the host for the completion of outstanding queue operations for a
-given queue, call:
-
-include::{generated}/api/protos/vkQueueWaitIdle.txt[]
-
-  * pname:queue is the queue on which to wait.
-
-fname:vkQueueWaitIdle is equivalent to having submitted a valid fence to
-every previously executed <<devsandqueues-submission,queue submission
-command>> that accepts a fence, then waiting for all of those fences to
-signal using flink:vkWaitForFences with an infinite timeout and
-pname:waitAll set to ename:VK_TRUE.
-
-include::{generated}/validity/protos/vkQueueWaitIdle.txt[]
---
-
-[open,refpage='vkDeviceWaitIdle',desc='Wait for a device to become idle',type='protos']
---
-To wait on the host for the completion of outstanding queue operations for
-all queues on a given logical device, call:
-
-include::{generated}/api/protos/vkDeviceWaitIdle.txt[]
-
-  * pname:device is the logical device to idle.
-
-fname:vkDeviceWaitIdle is equivalent to calling fname:vkQueueWaitIdle for
-all queues owned by pname:device.
-
-include::{generated}/validity/protos/vkDeviceWaitIdle.txt[]
---
-
-
-[[synchronization-submission-host-writes]]
-== Host Write Ordering Guarantees
-
-When batches of command buffers are submitted to a queue via a
-<<devsandqueues-submission, queue submission command>>, it defines a memory
-dependency with prior host operations, and execution of command buffers
-submitted to the queue.
-
-The first <<synchronization-dependencies-scopes, synchronization scope>> is
-defined by the host execution model, but includes execution of
-flink:vkQueueSubmit on the host and anything that happened-before it.
-
-The second <<synchronization-dependencies-scopes, synchronization scope>>
-includes all commands submitted in the same <<devsandqueues-submission,
-queue submission>>, and all commands that occur later in
-<<synchronization-submission-order,submission order>>.
-
-The first <<synchronization-dependencies-access-scopes, access scope>>
-includes all host writes to mappable device memory that are available to the
-host memory domain.
-
-The second <<synchronization-dependencies-access-scopes, access scope>>
-includes all memory access performed by the device.
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_device_group[]
-[[synchronization-device-group]]
-== Synchronization and Multiple Physical Devices
-
-If a logical device includes more than one physical device, then fences,
-semaphores, and events all still have a single instance of the signaled
-state.
-
-A fence becomes signaled when all physical devices complete the necessary
-queue operations.
-
-Semaphore wait and signal operations all include a device index that is the
-sole physical device that performs the operation.
-These indices are provided in the slink:VkDeviceGroupSubmitInfo and
-slink:VkDeviceGroupBindSparseInfo structures.
-Semaphores are not exclusively owned by any physical device.
-For example, a semaphore can be signaled by one physical device and then
-waited on by a different physical device.
-
-An event can: only be waited on by the same physical device that signaled it
-(or the host).
-endif::VK_VERSION_1_1,VK_KHR_device_group[]
-
-
-ifdef::VK_EXT_calibrated_timestamps[]
-[[calibrated-timestamps]]
-== Calibrated timestamps
-
-[open,refpage='vkGetCalibratedTimestampsEXT',desc='Query calibrated timestamps',type='protos']
---
-In order to be able to correlate the time a particular operation took place
-at on timelines of different time domains (e.g. a device operation vs a host
-operation), Vulkan allows querying calibrated timestamps from multiple time
-domains.
-
-To query calibrated timestamps from a set of time domains, call:
-
-include::{generated}/api/protos/vkGetCalibratedTimestampsEXT.txt[]
-
-  * pname:device is the logical device used to perform the query.
-  * pname:timestampCount is the number of timestamps to query.
-  * pname:pTimestampInfos is a pointer to an array of pname:timestampCount
-    slink:VkCalibratedTimestampInfoEXT structures, describing the time
-    domains the calibrated timestamps should be captured from.
-  * pname:pTimestamps is a pointer to an array of pname:timestampCount
-    64-bit unsigned integer values in which the requested calibrated
-    timestamp values are returned.
-  * pname:pMaxDeviation is a pointer to a 64-bit unsigned integer value in
-    which the strictly positive maximum deviation, in nanoseconds, of the
-    calibrated timestamp values is returned.
-
-[NOTE]
-.Note
-====
-The maximum deviation may: vary between calls to
-fname:vkGetCalibratedTimestampsEXT even for the same set of time domains due
-to implementation and platform specific reasons.
-It is the application's responsibility to assess whether the returned
-maximum deviation makes the timestamp values suitable for any particular
-purpose and can: choose to re-issue the timestamp calibration call pursuing
-a lower devation value.
-====
-
-Calibrated timestamp values can: be extrapolated to estimate future
-coinciding timestamp values, however, depending on the nature of the time
-domains and other properties of the platform extrapolating values over a
-sufficiently long period of time may: no longer be accurate enough to fit
-any particular purpose, so applications are expected to re-calibrate the
-timestamps on a regular basis.
-
-include::{generated}/validity/protos/vkGetCalibratedTimestampsEXT.txt[]
---
-
-[open,refpage='VkCalibratedTimestampInfoEXT',desc='Structure specifying the input parameters of a calibrated timestamp query',type='structs']
---
-The sname:VkCalibratedTimestampInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkCalibratedTimestampInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:timeDomain is a elink:VkTimeDomainEXT value specifying the time
-    domain from which the calibrated timestamp value should be returned.
-
-.Valid Usage
-****
-  * [[VUID-VkCalibratedTimestampInfoEXT-timeDomain-02354]]
-    pname:timeDomain must: be one of the elink:VkTimeDomainEXT values
-    returned by flink:vkGetPhysicalDeviceCalibrateableTimeDomainsEXT
-****
-include::{generated}/validity/structs/VkCalibratedTimestampInfoEXT.txt[]
---
-
-[open,refpage='VkTimeDomainEXT',desc='Supported time domains',type='enums']
---
-The set of supported time domains consists of:
-
-include::{generated}/api/enums/VkTimeDomainEXT.txt[]
-
-  * ename:VK_TIME_DOMAIN_DEVICE_EXT specifies the device time domain.
-    Timestamp values in this time domain use the same units and are
-    comparable with device timestamp values captured using
-    flink:vkCmdWriteTimestamp
-ifdef::VK_KHR_synchronization2[]
-    or flink:vkCmdWriteTimestamp2KHR
-endif::VK_KHR_synchronization2[]
-    and are defined to be incrementing according to the
-    <<limits-timestampPeriod,timestampPeriod>> of the device.
-
-  * ename:VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT specifies the CLOCK_MONOTONIC
-    time domain available on POSIX platforms.
-    Timestamp values in this time domain are in units of nanoseconds and are
-    comparable with platform timestamp values captured using the POSIX
-    clock_gettime API as computed by this example:
-
-[NOTE]
-.Note
-====
-An implementation supporting `apiext:VK_EXT_calibrated_timestamps` will use
-the same time domain for all its slink:VkQueue so that timestamp values
-reported for ename:VK_TIME_DOMAIN_DEVICE_EXT can be matched to any timestamp
-captured through flink:vkCmdWriteTimestamp
-ifdef::VK_KHR_synchronization2[]
-or flink:vkCmdWriteTimestamp2KHR
-endif::VK_KHR_synchronization2[]
-.
-====
-
-[source,c]
-~~~~
-struct timespec tv;
-clock_gettime(CLOCK_MONOTONIC, &tv);
-return tv.tv_nsec + tv.tv_sec*1000000000ull;
-~~~~
-
-  * ename:VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT specifies the
-    CLOCK_MONOTONIC_RAW time domain available on POSIX platforms.
-    Timestamp values in this time domain are in units of nanoseconds and are
-    comparable with platform timestamp values captured using the POSIX
-    clock_gettime API as computed by this example:
-
-[source,c]
-~~~~
-struct timespec tv;
-clock_gettime(CLOCK_MONOTONIC_RAW, &tv);
-return tv.tv_nsec + tv.tv_sec*1000000000ull;
-~~~~
-
-  * ename:VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT specifies the
-    performance counter (QPC) time domain available on Windows.
-    Timestamp values in this time domain are in the same units as those
-    provided by the Windows QueryPerformanceCounter API and are comparable
-    with platform timestamp values captured using that API as computed by
-    this example:
-
-[source,c]
-~~~~
-LARGE_INTEGER counter;
-QueryPerformanceCounter(&counter);
-return counter.QuadPart;
-~~~~
---
-endif::VK_EXT_calibrated_timestamps[]
diff --git a/registry/vulkan/chapters/tessellation.txt b/registry/vulkan/chapters/tessellation.txt
deleted file mode 100644
index f03336d..0000000
--- a/registry/vulkan/chapters/tessellation.txt
+++ /dev/null
@@ -1,629 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[tessellation]]
-= Tessellation
-
-Tessellation involves three pipeline stages.
-First, a <<shaders-tessellation-control,tessellation control shader>>
-transforms control points of a patch and can: produce per-patch data.
-Second, a fixed-function tessellator generates multiple primitives
-corresponding to a tessellation of the patch in (u,v) or (u,v,w) parameter
-space.
-Third, a <<shaders-tessellation-evaluation,tessellation evaluation shader>>
-transforms the vertices of the tessellated patch, for example to compute
-their positions and attributes as part of the tessellated surface.
-The tessellator is enabled when the pipeline contains both a tessellation
-control shader and a tessellation evaluation shader.
-
-
-== Tessellator
-
-If a pipeline includes both tessellation shaders (control and evaluation),
-the tessellator consumes each input patch (after vertex shading) and
-produces a new set of independent primitives (points, lines, or triangles).
-These primitives are logically produced by subdividing a geometric primitive
-(rectangle or triangle) according to the per-patch outer and inner
-tessellation levels written by the tessellation control shader.
-These levels are specified using the <<interfaces-builtin-variables,built-in
-variables>> code:TessLevelOuter and code:TessLevelInner, respectively.
-This subdivision is performed in an implementation-dependent manner.
-If no tessellation shaders are present in the pipeline, the tessellator is
-disabled and incoming primitives are passed through without modification.
-
-The type of subdivision performed by the tessellator is specified by an
-code:OpExecutionMode instruction in the tessellation evaluation or
-tessellation control shader using one of execution modes code:Triangles,
-code:Quads, and code:IsoLines.
-Other tessellation-related execution modes can: also be specified in either
-the tessellation control or tessellation evaluation shaders, and if they are
-specified in both then the modes must: be the same.
-
-Tessellation execution modes include:
-
-  * code:Triangles, code:Quads, and code:IsoLines.
-    These control the type of subdivision and topology of the output
-    primitives.
-    One mode must: be set in at least one of the tessellation shader stages.
-ifdef::VK_KHR_portability_subset[]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:tessellationIsolines
-    is ename:VK_FALSE, then isoline tessellation is not supported by the
-    implementation, and code:IsoLines must: not be used in either
-    tessellation shader stage.
-endif::VK_KHR_portability_subset[]
-  * code:VertexOrderCw and code:VertexOrderCcw.
-    These control the orientation of triangles generated by the tessellator.
-    One mode must: be set in at least one of the tessellation shader stages.
-  * code:PointMode.
-    Controls generation of points rather than triangles or lines.
-    This functionality defaults to disabled, and is enabled if either shader
-    stage includes the execution mode.
-ifdef::VK_KHR_portability_subset[]
-    If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-    slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:tessellationPointMode
-    is ename:VK_FALSE, then point mode tessellation is not supported by the
-    implementation, and code:PointMode must: not be used in either
-    tessellation shader stage.
-endif::VK_KHR_portability_subset[]
-  * code:SpacingEqual, code:SpacingFractionalEven, and
-    code:SpacingFractionalOdd.
-    Controls the spacing of segments on the edges of tessellated primitives.
-    One mode must: be set in at least one of the tessellation shader stages.
-  * code:OutputVertices.
-    Controls the size of the output patch of the tessellation control
-    shader.
-    One value must: be set in at least one of the tessellation shader
-    stages.
-
-For triangles, the tessellator subdivides a triangle primitive into smaller
-triangles.
-For quads, the tessellator subdivides a rectangle primitive into smaller
-triangles.
-For isolines, the tessellator subdivides a rectangle primitive into a
-collection of line segments arranged in strips stretching across the
-rectangle in the [eq]#u# dimension (i.e. the coordinates in code:TessCoord
-are of the form (0,x) through (1,x) for all tessellation evaluation shader
-invocations that share a line).
-
-Each vertex produced by the tessellator has an associated (u,v,w) or (u,v)
-position in a normalized parameter space, with parameter values in the range
-[eq]#[0,1]#, as illustrated
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-in figures <<img-tessellation-topology-ul>> and
-<<img-tessellation-topology-ll>>.
-The domain space can: have either an upper-left or lower-left origin,
-selected by the pname:domainOrigin member of
-slink:VkPipelineTessellationDomainOriginStateCreateInfo.
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-in figure <<img-tessellation-topology-ul>>.
-The domain space has an upper-left origin.
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-
-[[img-tessellation-topology-ul]]
-image::{images}/tessparamUL.svg[align="center",title="Domain parameterization for tessellation primitive modes (upper-left origin)",opts="{imageopts}"]
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-[[img-tessellation-topology-ll]]
-image::{images}/tessparam.svg[align="center",title="Domain parameterization for tessellation primitive modes (lower-left origin)",opts="{imageopts}"]
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-
-.Caption
-****
-In the domain parameterization diagrams, the coordinates illustrate the
-value of code:TessCoord at the corners of the domain.
-The labels on the edges indicate the inner (IL0 and IL1) and outer (OL0
-through OL3) tessellation level values used to control the number of
-subdivisions along each edge of the domain.
-****
-
-For triangles, the vertex's position is a barycentric coordinate
-[eq]#(u,v,w)#, where [eq]#u {plus} v {plus} w = 1.0#, and indicates the
-relative influence of the three vertices of the triangle on the position of
-the vertex.
-For quads and isolines, the position is a [eq]#(u,v)# coordinate indicating
-the relative horizontal and vertical position of the vertex relative to the
-subdivided rectangle.
-The subdivision process is explained in more detail in subsequent sections.
-
-
-== Tessellator Patch Discard
-
-A patch is discarded by the tessellator if any relevant outer tessellation
-level is less than or equal to zero.
-
-Patches will also be discarded if any relevant outer tessellation level
-corresponds to a floating-point [eq]#NaN# (not a number) in implementations
-supporting [eq]#NaN#.
-
-No new primitives are generated and the tessellation evaluation shader is
-not executed for patches that are discarded.
-For code:Quads, all four outer levels are relevant.
-For code:Triangles and code:IsoLines, only the first three or two outer
-levels, respectively, are relevant.
-Negative inner levels will not cause a patch to be discarded; they will be
-clamped as described below.
-
-
-[[tessellation-tessellator-spacing]]
-== Tessellator Spacing
-
-Each of the tessellation levels is used to determine the number and spacing
-of segments used to subdivide a corresponding edge.
-The method used to derive the number and spacing of segments is specified by
-an code:OpExecutionMode in the tessellation control or tessellation
-evaluation shader using one of the identifiers code:SpacingEqual,
-code:SpacingFractionalEven, or code:SpacingFractionalOdd.
-
-If code:SpacingEqual is used, the floating-point tessellation level is first
-clamped to [eq]#[1, pname:maxLevel]#, where [eq]#pname:maxLevel# is the
-implementation-dependent maximum tessellation level
-(sname:VkPhysicalDeviceLimits::pname:maxTessellationGenerationLevel).
-The result is rounded up to the nearest integer [eq]#n#, and the
-corresponding edge is divided into [eq]#n# segments of equal length in (u,v)
-space.
-
-If code:SpacingFractionalEven is used, the tessellation level is first
-clamped to [eq]#[2, pname:maxLevel]# and then rounded up to the nearest even
-integer [eq]#n#.
-If code:SpacingFractionalOdd is used, the tessellation level is clamped to
-[eq]#[1, pname:maxLevel - 1]# and then rounded up to the nearest odd integer
-[eq]#n#.
-If [eq]#n# is one, the edge will not be subdivided.
-Otherwise, the corresponding edge will be divided into [eq]#n - 2# segments
-of equal length, and two additional segments of equal length that are
-typically shorter than the other segments.
-The length of the two additional segments relative to the others will
-decrease monotonically with [eq]#n - f#, where [eq]#f# is the clamped
-floating-point tessellation level.
-When [eq]#n - f# is zero, the additional segments will have equal length to
-the other segments.
-As [eq]#n - f# approaches 2.0, the relative length of the additional
-segments approaches zero.
-The two additional segments must: be placed symmetrically on opposite sides
-of the subdivided edge.
-The relative location of these two segments is implementation-dependent, but
-must: be identical for any pair of subdivided edges with identical values of
-[eq]#f#.
-
-When tessellating triangles or quads using <<tessellation-point-mode, point
-mode>> with fractional odd spacing, the tessellator may: produce _interior
-vertices_ that are positioned on the edge of the patch if an inner
-tessellation level is less than or equal to one.
-Such vertices are considered distinct from vertices produced by subdividing
-the outer edge of the patch, even if there are pairs of vertices with
-identical coordinates.
-
-
-[[tessellation-primitive-order]]
-== Tessellation Primitive Ordering
-
-Few guarantees are provided for the relative ordering of primitives produced
-by tessellation, as they pertain to <<drawing-primitive-order, primitive
-order>>.
-
-  * The output primitives generated from each input primitive are passed to
-    subsequent pipeline stages in an implementation-dependent order.
-  * All output primitives generated from a given input primitive are passed
-    to subsequent pipeline stages before any output primitives generated
-    from subsequent input primitives.
-
-
-[[tessellation-vertex-winding-order]]
-== Tessellator Vertex Winding Order
-
-When the tessellator produces triangles (in the code:Triangles or code:Quads
-modes), the orientation of all triangles is specified with an
-code:OpExecutionMode of code:VertexOrderCw or code:VertexOrderCcw in the
-tessellation control or tessellation evaluation shaders.
-If the order is code:VertexOrderCw, the vertices of all generated triangles
-will have clockwise ordering in (u,v) or (u,v,w) space.
-If the order is code:VertexOrderCcw, the vertices will have
-counter-clockwise ordering in that space.
-
-If the tessellation domain has an upper-left origin, the vertices of a
-triangle have counter-clockwise ordering if
-
-  {empty}:: [eq]#a = u~0~ v~1~ - u~1~ v~0~ {plus} u~1~ v~2~ - u~2~ v~1~
-            {plus} u~2~ v~0~ - u~0~ v~2~#
-
-is negative, and clockwise ordering if [eq]#a# is positive.
-[eq]#u~i~# and [eq]#v~i~# are the [eq]#u# and [eq]#v# coordinates in
-normalized parameter space of the [eq]##i##th vertex of the triangle.
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-If the tessellation domain has a lower-left origin, the vertices of a
-triangle have counter-clockwise ordering if [eq]#a# is positive, and
-clockwise ordering if [eq]#a# is negative.
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-
-[NOTE]
-.Note
-====
-The value [eq]#a# is proportional (with a positive factor) to the signed
-area of the triangle.
-
-In code:Triangles mode, even though the vertex coordinates have a [eq]#w#
-value, it does not participate directly in the computation of [eq]#a#, being
-an affine combination of [eq]#u# and [eq]#v#.
-====
-
-
-[[tessellation-triangle-tessellation]]
-== Triangle Tessellation
-
-If the tessellation primitive mode is code:Triangles, an equilateral
-triangle is subdivided into a collection of triangles covering the area of
-the original triangle.
-First, the original triangle is subdivided into a collection of concentric
-equilateral triangles.
-The edges of each of these triangles are subdivided, and the area between
-each triangle pair is filled by triangles produced by joining the vertices
-on the subdivided edges.
-The number of concentric triangles and the number of subdivisions along each
-triangle except the outermost is derived from the first inner tessellation
-level.
-The edges of the outermost triangle are subdivided independently, using the
-first, second, and third outer tessellation levels to control the number of
-subdivisions of the [eq]#u = 0# (left), [eq]#v = 0# (bottom), and [eq]#w =
-0# (right) edges, respectively.
-The second inner tessellation level and the fourth outer tessellation level
-have no effect in this mode.
-
-If the first inner tessellation level and all three outer tessellation
-levels are exactly one after clamping and rounding, only a single triangle
-with [eq]#(u,v,w)# coordinates of [eq]#(0,0,1)#, [eq]#(1,0,0)#, and
-[eq]#(0,1,0)# is generated.
-If the inner tessellation level is one and any of the outer tessellation
-levels is greater than one, the inner tessellation level is treated as
-though it were originally specified as [eq]#1 {plus} {epsilon}# and will
-result in a two- or three-segment subdivision depending on the tessellation
-spacing.
-When used with fractional odd spacing, the three-segment subdivision may:
-produce _inner vertices_ positioned on the edge of the triangle.
-
-If any tessellation level is greater than one, tessellation begins by
-producing a set of concentric inner triangles and subdividing their edges.
-First, the three outer edges are temporarily subdivided using the clamped
-and rounded first inner tessellation level and the specified tessellation
-spacing, generating [eq]#n# segments.
-For the outermost inner triangle, the inner triangle is degenerate -- a
-single point at the center of the triangle -- if [eq]#n# is two.
-Otherwise, for each corner of the outer triangle, an inner triangle corner
-is produced at the intersection of two lines extended perpendicular to the
-corner's two adjacent edges running through the vertex of the subdivided
-outer edge nearest that corner.
-If [eq]#n# is three, the edges of the inner triangle are not subdivided and
-it is the final triangle in the set of concentric triangles.
-Otherwise, each edge of the inner triangle is divided into [eq]#n - 2#
-segments, with the [eq]#n - 1# vertices of this subdivision produced by
-intersecting the inner edge with lines perpendicular to the edge running
-through the [eq]#n - 1# innermost vertices of the subdivision of the outer
-edge.
-Once the outermost inner triangle is subdivided, the previous subdivision
-process repeats itself, using the generated triangle as an outer triangle.
-This subdivision process is illustrated in <<img-innertri,Inner Triangle
-Tessellation>>.
-
-[[img-innertri]]
-image::{images}/innertri.svg[align="center",title="Inner Triangle Tessellation",opts="{imageopts}"]
-
-.Caption
-****
-In the <<img-innertri,Inner Triangle Tessellation>> diagram, inner
-tessellation levels of (a) five and (b) four are shown (not to scale).
-Solid black circles depict vertices along the edges of the concentric
-triangles.
-The edges of inner triangles are subdivided by intersecting the edge with
-segments perpendicular to the edge passing through each inner vertex of the
-subdivided outer edge.
-Dotted lines depict edges connecting corresponding vertices on the inner and
-outer triangle edges.
-****
-
-Once all the concentric triangles are produced and their edges are
-subdivided, the area between each pair of adjacent inner triangles is filled
-completely with a set of non-overlapping triangles.
-In this subdivision, two of the three vertices of each triangle are taken
-from adjacent vertices on a subdivided edge of one triangle; the third is
-one of the vertices on the corresponding edge of the other triangle.
-If the innermost triangle is degenerate (i.e., a point), the triangle
-containing it is subdivided into six triangles by connecting each of the six
-vertices on that triangle with the center point.
-If the innermost triangle is not degenerate, that triangle is added to the
-set of generated triangles as-is.
-
-After the area corresponding to any inner triangles is filled, the
-tessellator generates triangles to cover the area between the outermost
-triangle and the outermost inner triangle.
-To do this, the temporary subdivision of the outer triangle edge above is
-discarded.
-Instead, the [eq]#u = 0#, [eq]#v = 0#, and [eq]#w = 0# edges are subdivided
-according to the first, second, and third outer tessellation levels,
-respectively, and the tessellation spacing.
-The original subdivision of the first inner triangle is retained.
-The area between the outer and first inner triangles is completely filled by
-non-overlapping triangles as described above.
-If the first (and only) inner triangle is degenerate, a set of triangles is
-produced by connecting each vertex on the outer triangle edges with the
-center point.
-
-After all triangles are generated, each vertex in the subdivided triangle is
-assigned a barycentric (u,v,w) coordinate based on its location relative to
-the three vertices of the outer triangle.
-
-The algorithm used to subdivide the triangular domain in (u,v,w) space into
-individual triangles is implementation-dependent.
-However, the set of triangles produced will completely cover the domain, and
-no portion of the domain will be covered by multiple triangles.
-
-Output triangles are generated with a topology similar to
-<<drawing-triangle-lists, triangle lists>>, except that the order in which
-each triangle is generated, and the order in which the vertices are
-generated for each triangle, are implementation-dependent.
-However, the order of vertices in each triangle is consistent across the
-domain as described in <<tessellation-vertex-winding-order>>.
-
-
-[[tessellation-quad-tessellation]]
-== Quad Tessellation
-
-If the tessellation primitive mode is code:Quads, a rectangle is subdivided
-into a collection of triangles covering the area of the original rectangle.
-First, the original rectangle is subdivided into a regular mesh of
-rectangles, where the number of rectangles along the [eq]#u = 0# and [eq]#u
-= 1# (vertical) and [eq]#v = 0# and [eq]#v = 1# (horizontal) edges are
-derived from the first and second inner tessellation levels, respectively.
-All rectangles, except those adjacent to one of the outer rectangle edges,
-are decomposed into triangle pairs.
-The outermost rectangle edges are subdivided independently, using the first,
-second, third, and fourth outer tessellation levels to control the number of
-subdivisions of the [eq]#u = 0# (left), [eq]#v = 0# (bottom), [eq]#u = 1#
-(right), and [eq]#v = 1# (top) edges, respectively.
-The area between the inner rectangles of the mesh and the outer rectangle
-edges are filled by triangles produced by joining the vertices on the
-subdivided outer edges to the vertices on the edge of the inner rectangle
-mesh.
-
-If both clamped inner tessellation levels and all four clamped outer
-tessellation levels are exactly one, only a single triangle pair covering
-the outer rectangle is generated.
-Otherwise, if either clamped inner tessellation level is one, that
-tessellation level is treated as though it was originally specified as
-[eq]#1 {plus} {epsilon}# and will result in a two- or three-segment
-subdivision depending on the tessellation spacing.
-When used with fractional odd spacing, the three-segment subdivision may:
-produce _inner vertices_ positioned on the edge of the rectangle.
-
-If any tessellation level is greater than one, tessellation begins by
-subdividing the [eq]#u = 0# and [eq]#u = 1# edges of the outer rectangle
-into [eq]#m# segments using the clamped and rounded first inner tessellation
-level and the tessellation spacing.
-The [eq]#v = 0# and [eq]#v = 1# edges are subdivided into [eq]#n# segments
-using the second inner tessellation level.
-Each vertex on the [eq]#u = 0# and [eq]#v = 0# edges are joined with the
-corresponding vertex on the [eq]#u = 1# and [eq]#v = 1# edges to produce a
-set of vertical and horizontal lines that divide the rectangle into a grid
-of smaller rectangles.
-The primitive generator emits a pair of non-overlapping triangles covering
-each such rectangle not adjacent to an edge of the outer rectangle.
-The boundary of the region covered by these triangles forms an inner
-rectangle, the edges of which are subdivided by the grid vertices that lie
-on the edge.
-If either [eq]#m# or [eq]#n# is two, the inner rectangle is degenerate, and
-one or both of the rectangle's _edges_ consist of a single point.
-This subdivision is illustrated in Figure <<img-innerquad,Inner Quad
-Tessellation>>.
-
-[[img-innerquad]]
-image::{images}/innerquad.svg[align="center",title="Inner Quad Tessellation",opts="{imageopts}"]
-
-.Caption
-****
-In the <<img-innerquad,Inner Quad Tessellation>> diagram, inner quad
-tessellation levels of (a) [eq]#(4,2)# and (b) [eq]#(7,4)# are shown.
-The regions highlighted in red in figure (b) depict the 10 inner rectangles,
-each of which will be subdivided into two triangles.
-Solid black circles depict vertices on the boundary of the outer and inner
-rectangles, where the inner rectangle of figure (a) is degenerate (a single
-line segment).
-Dotted lines depict the horizontal and vertical edges connecting
-corresponding vertices on the inner and outer rectangle edges.
-****
-
-After the area corresponding to the inner rectangle is filled, the
-tessellator must: produce triangles to cover the area between the inner and
-outer rectangles.
-To do this, the subdivision of the outer rectangle edge above is discarded.
-Instead, the [eq]#u = 0#, [eq]#v = 0#, [eq]#u = 1#, and [eq]#v = 1# edges
-are subdivided according to the first, second, third, and fourth outer
-tessellation levels, respectively, and the tessellation spacing.
-The original subdivision of the inner rectangle is retained.
-The area between the outer and inner rectangles is completely filled by
-non-overlapping triangles.
-Two of the three vertices of each triangle are adjacent vertices on a
-subdivided edge of one rectangle; the third is one of the vertices on the
-corresponding edge of the other rectangle.
-If either edge of the innermost rectangle is degenerate, the area near the
-corresponding outer edges is filled by connecting each vertex on the outer
-edge with the single vertex making up the _inner edge_.
-
-The algorithm used to subdivide the rectangular domain in (u,v) space into
-individual triangles is implementation-dependent.
-However, the set of triangles produced will completely cover the domain, and
-no portion of the domain will be covered by multiple triangles.
-
-Output triangles are generated with a topology similar to
-<<drawing-triangle-lists, triangle lists>>, except that the order in which
-each triangle is generated, and the order in which the vertices are
-generated for each triangle, are implementation-dependent.
-However, the order of vertices in each triangle is consistent across the
-domain as described in <<tessellation-vertex-winding-order>>.
-
-
-[[tessellation-isoline-tessellation]]
-== Isoline Tessellation
-
-If the tessellation primitive mode is code:IsoLines, a set of independent
-horizontal line segments is drawn.
-The segments are arranged into connected strips called _isolines_, where the
-vertices of each isoline have a constant v coordinate and u coordinates
-covering the full range [eq]#[0,1]#.
-The number of isolines generated is derived from the first outer
-tessellation level; the number of segments in each isoline is derived from
-the second outer tessellation level.
-Both inner tessellation levels and the third and fourth outer tessellation
-levels have no effect in this mode.
-
-As with quad tessellation above, isoline tessellation begins with a
-rectangle.
-The [eq]#u = 0# and [eq]#u = 1# edges of the rectangle are subdivided
-according to the first outer tessellation level.
-For the purposes of this subdivision, the tessellation spacing mode is
-ignored and treated as equal_spacing.
-An isoline is drawn connecting each vertex on the [eq]#u = 0# rectangle edge
-to the corresponding vertex on the [eq]#u = 1# rectangle edge, except that
-no line is drawn between (0,1) and (1,1).
-If the number of isolines on the subdivided [eq]#u = 0# and [eq]#u = 1#
-edges is [eq]#n#, this process will result in [eq]#n# equally spaced lines
-with constant v coordinates of 0, latexmath:[\frac{1}{n}, \frac{2}{n},
-\ldots, \frac{n-1}{n}].
-
-Each of the [eq]#n# isolines is then subdivided according to the second
-outer tessellation level and the tessellation spacing, resulting in [eq]#m#
-line segments.
-Each segment of each line is emitted by the tessellator.
-These line segments are generated with a topology similar to
-<<drawing-line-lists, line lists>>, except that the order in which each line
-is generated, and the order in which the vertices are generated for each
-line segment, are implementation-dependent.
-
-ifdef::VK_KHR_portability_subset[]
-[NOTE]
-.Note
-====
-If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:tessellationIsolines
-is ename:VK_FALSE, then isoline tessellation is not supported by the
-implementation.
-====
-endif::VK_KHR_portability_subset[]
-
-[[tessellation-point-mode]]
-== Tessellation Point Mode
-
-For all primitive modes, the tessellator is capable of generating points
-instead of lines or triangles.
-If the tessellation control or tessellation evaluation shader specifies the
-code:OpExecutionMode code:PointMode, the primitive generator will generate
-one point for each distinct vertex produced by tessellation, rather than
-emitting triangles or lines.
-Otherwise, the tessellator will produce a collection of line segments or
-triangles according to the primitive mode.
-These points are generated with a topology similar to <<drawing-point-lists,
-point lists>>, except the order in which the points are generated for each
-input primitive is undefined:.
-
-ifdef::VK_KHR_portability_subset[]
-[NOTE]
-.Note
-====
-If the `apiext:VK_KHR_portability_subset` extension is enabled, and
-slink:VkPhysicalDevicePortabilitySubsetFeaturesKHR::pname:tessellationPointMode
-is ename:VK_FALSE, then tessellation point mode is not supported by the
-implementation.
-====
-endif::VK_KHR_portability_subset[]
-
-
-== Tessellation Pipeline State
-
-The pname:pTessellationState member of slink:VkGraphicsPipelineCreateInfo is
-a pointer to a sname:VkPipelineTessellationStateCreateInfo structure.
-
-[open,refpage='VkPipelineTessellationStateCreateInfo',desc='Structure specifying parameters of a newly created pipeline tessellation state',type='structs']
---
-The sname:VkPipelineTessellationStateCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkPipelineTessellationStateCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:patchControlPoints is the number of control points per patch.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineTessellationStateCreateInfo-patchControlPoints-01214]]
-    pname:patchControlPoints must: be greater than zero and less than or
-    equal to sname:VkPhysicalDeviceLimits::pname:maxTessellationPatchSize
-****
-
-include::{generated}/validity/structs/VkPipelineTessellationStateCreateInfo.txt[]
---
-
-[open,refpage='VkPipelineTessellationStateCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineTessellationStateCreateFlags.txt[]
-
-tname:VkPipelineTessellationStateCreateFlags is a bitmask type for setting a
-mask, but is currently reserved for future use.
---
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-[open,refpage='VkPipelineTessellationDomainOriginStateCreateInfo',desc='Structure specifying the orientation of the tessellation domain',type='structs']
---
-The sname:VkPipelineTessellationDomainOriginStateCreateInfo structure is
-defined as:
-
-include::{generated}/api/structs/VkPipelineTessellationDomainOriginStateCreateInfo.txt[]
-
-ifdef::VK_KHR_maintenance2[]
-or the equivalent
-
-include::{generated}/api/structs/VkPipelineTessellationDomainOriginStateCreateInfoKHR.txt[]
-endif::VK_KHR_maintenance2[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:domainOrigin is a elink:VkTessellationDomainOrigin value
-    controlling the origin of the tessellation domain space.
-
-If the sname:VkPipelineTessellationDomainOriginStateCreateInfo structure is
-included in the pname:pNext chain of
-slink:VkPipelineTessellationStateCreateInfo, it controls the origin of the
-tessellation domain.
-If this structure is not present, it is as if pname:domainOrigin was
-ename:VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT.
-
-include::{generated}/validity/structs/VkPipelineTessellationDomainOriginStateCreateInfo.txt[]
---
-
-[open,refpage='VkTessellationDomainOrigin',desc='Enum describing tessellation domain origin',type='enums']
---
-The possible tessellation domain origins are specified by the
-elink:VkTessellationDomainOrigin enumeration:
-
-include::{generated}/api/enums/VkTessellationDomainOrigin.txt[]
-
-ifdef::VK_KHR_maintenance2[]
-or the equivalent
-
-include::{generated}/api/enums/VkTessellationDomainOriginKHR.txt[]
-endif::VK_KHR_maintenance2[]
-
-  * ename:VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT specifies that the origin
-    of the domain space is in the upper left corner, as shown in figure
-    <<img-tessellation-topology-ul>>.
-  * ename:VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT specifies that the origin
-    of the domain space is in the lower left corner, as shown in figure
-    <<img-tessellation-topology-ll>>.
-
-This enum affects how the code:VertexOrderCw and code:VertexOrderCcw
-tessellation execution modes are interpreted, since the winding is defined
-relative to the orientation of the domain.
---
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
diff --git a/registry/vulkan/chapters/textures.txt b/registry/vulkan/chapters/textures.txt
deleted file mode 100644
index 2bc160b..0000000
--- a/registry/vulkan/chapters/textures.txt
+++ /dev/null
@@ -1,2991 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[textures]]
-= Image Operations
-
-== Image Operations Overview
-
-Vulkan Image Operations are operations performed by those SPIR-V Image
-Instructions which take an code:OpTypeImage (representing a
-sname:VkImageView) or code:OpTypeSampledImage (representing a
-(sname:VkImageView, sname:VkSampler) pair).
-Read, write, and atomic operations also take texel coordinates as operands,
-and return a value based on a neighborhood of texture elements (_texels_)
-within the image.
-Query operations return properties of the bound image or of the lookup
-itself.
-The "`Depth`" operand of code:OpTypeImage is ignored.
-
-[NOTE]
-.Note
-====
-Texel is a term which is a combination of the words texture and element.
-Early interactive computer graphics supported texture operations on
-textures, a small subset of the image operations on images described here.
-The discrete samples remain essentially equivalent, however, so we retain
-the historical term texel to refer to them.
-====
-
-Image Operations include the functionality of the following SPIR-V Image
-Instructions:
-
-  * code:OpImageSample* and code:OpImageSparseSample* read one or more
-    neighboring texels of the image, and <<textures-texel-filtering,filter>>
-    the texel values based on the state of the sampler.
-  ** Instructions with code:ImplicitLod in the name
-     <<textures-level-of-detail-operation,determine>> the LOD used in the
-     sampling operation based on the coordinates used in neighboring
-     fragments.
-  ** Instructions with code:ExplicitLod in the name
-     <<textures-level-of-detail-operation,determine>> the LOD used in the
-     sampling operation based on additional coordinates.
-  ** Instructions with code:Proj in the name apply homogeneous
-     <<textures-projection,projection>> to the coordinates.
-  * code:OpImageFetch and code:OpImageSparseFetch return a single texel of
-    the image.
-    No sampler is used.
-  * code:OpImage*Gather and code:OpImageSparse*Gather read neighboring
-    texels and <<textures-gather,return a single component>> of each.
-  * code:OpImageRead (and code:OpImageSparseRead) and code:OpImageWrite read
-    and write, respectively, a texel in the image.
-    No sampler is used.
-ifdef::VK_NV_shader_image_footprint[]
-  * code:OpImageSampleFootprintNV identifies and returns information about
-    the set of texels in the image that would be accessed by an equivalent
-    code:OpImageSample* instruction.
-endif::VK_NV_shader_image_footprint[]
-  * Instructions with code:Dref in the name apply
-    <<textures-depth-compare-operation,depth comparison>> on the texel
-    values.
-  * Instructions with code:Sparse in the name additionally return a
-    <<textures-sparse-residency,sparse residency>> code.
-  * code:OpImageQuerySize, code:OpImageQuerySizeLod,
-    code:OpImageQueryLevels, and code:OpImageQuerySamples return properties
-    of the image descriptor that would be accessed.
-    The image itself is not accessed.
-  * code:OpImageQueryLod returns the lod parameters that would be used in a
-    sample operation.
-    The actual operation is not performed.
-
-[[textures-texel-coordinate-systems]]
-=== Texel Coordinate Systems
-
-Images are addressed by _texel coordinates_.
-There are three _texel coordinate systems_:
-
-  * normalized texel coordinates [eq]#[0.0, 1.0]#
-  * unnormalized texel coordinates [eq]#[0.0, width / height / depth)#
-  * integer texel coordinates [eq]#[0, width / height / depth)#
-
-SPIR-V code:OpImageFetch, code:OpImageSparseFetch, code:OpImageRead,
-code:OpImageSparseRead, and code:OpImageWrite instructions use integer texel
-coordinates.
-Other image instructions can: use either normalized or unnormalized texel
-coordinates (selected by the pname:unnormalizedCoordinates state of the
-sampler used in the instruction), but there are
-<<samplers-unnormalizedCoordinates,limitations>> on what operations, image
-state, and sampler state is supported.
-Normalized coordinates are logically
-<<textures-normalized-to-unnormalized,converted>> to unnormalized as part of
-image operations, and <<textures-normalized-operations,certain steps>> are
-only performed on normalized coordinates.
-The array layer coordinate is always treated as unnormalized even when other
-coordinates are normalized.
-
-Normalized texel coordinates are referred to as [eq]#(s,t,r,q,a)#, with the
-coordinates having the following meanings:
-
-  * [eq]#s#: Coordinate in the first dimension of an image.
-  * [eq]#t#: Coordinate in the second dimension of an image.
-  * [eq]#r#: Coordinate in the third dimension of an image.
-  ** [eq]#(s,t,r)# are interpreted as a direction vector for Cube images.
-  * [eq]#q#: Fourth coordinate, for homogeneous (projective) coordinates.
-  * [eq]#a#: Coordinate for array layer.
-
-The coordinates are extracted from the SPIR-V operand based on the
-dimensionality of the image variable and type of instruction.
-For code:Proj instructions, the components are in order [eq]#(s, [t,] [r,]
-q)#, with [eq]#t# and [eq]#r# being conditionally present based on the
-code:Dim of the image.
-For non-code:Proj instructions, the coordinates are [eq]#(s [,t] [,r]
-[,a])#, with [eq]#t# and [eq]#r# being conditionally present based on the
-code:Dim of the image and [eq]#a# being conditionally present based on the
-code:Arrayed property of the image.
-Projective image instructions are not supported on code:Arrayed images.
-
-Unnormalized texel coordinates are referred to as [eq]#(u,v,w,a)#, with the
-coordinates having the following meanings:
-
-  * [eq]#u#: Coordinate in the first dimension of an image.
-  * [eq]#v#: Coordinate in the second dimension of an image.
-  * [eq]#w#: Coordinate in the third dimension of an image.
-  * [eq]#a#: Coordinate for array layer.
-
-Only the [eq]#u# and [eq]#v# coordinates are directly extracted from the
-SPIR-V operand, because only 1D and 2D (non-code:Arrayed) dimensionalities
-support unnormalized coordinates.
-The components are in order [eq]#(u [,v])#, with [eq]#v# being conditionally
-present when the dimensionality is 2D.
-When normalized coordinates are converted to unnormalized coordinates, all
-four coordinates are used.
-
-Integer texel coordinates are referred to as [eq]#(i,j,k,l,n)#, with the
-coordinates having the following meanings:
-
-  * [eq]#i#: Coordinate in the first dimension of an image.
-  * [eq]#j#: Coordinate in the second dimension of an image.
-  * [eq]#k#: Coordinate in the third dimension of an image.
-  * [eq]#l#: Coordinate for array layer.
-  * [eq]#n#: Index of the sample within the texel.
-
-They are extracted from the SPIR-V operand in order [eq]#(i [,j] [,k] [,l]
-[,n])#, with [eq]#j# and [eq]#k# conditionally present based on the code:Dim
-of the image, and [eq]#l# conditionally present based on the code:Arrayed
-property of the image.
-[eq]#n# is conditionally present and is taken from the code:Sample image
-operand.
-
-For all coordinate types, unused coordinates are assigned a value of zero.
-
-[[textures-texel-coordinate-systems-diagrams]]
-image::{images}/vulkantexture0-ll.svg[align="center",title="Texel Coordinate Systems, Linear Filtering",opts="{imageopts}"]
-The Texel Coordinate Systems - For the example shown of an 8{times}4 texel
-two dimensional image.
-
-  * Normalized texel coordinates:
-  ** The [eq]#s# coordinate goes from 0.0 to 1.0.
-  ** The [eq]#t# coordinate goes from 0.0 to 1.0.
-  * Unnormalized texel coordinates:
-  ** The [eq]#u# coordinate within the range 0.0 to 8.0 is within the image,
-     otherwise it is outside the image.
-  ** The [eq]#v# coordinate within the range 0.0 to 4.0 is within the image,
-     otherwise it is outside the image.
-  * Integer texel coordinates:
-  ** The [eq]#i# coordinate within the range 0 to 7 addresses texels within
-     the image, otherwise it is outside the image.
-  ** The [eq]#j# coordinate within the range 0 to 3 addresses texels within
-     the image, otherwise it is outside the image.
-  * Also shown for linear filtering:
-  ** Given the unnormalized coordinates [eq]#(u,v)#, the four texels
-     selected are [eq]#i~0~j~0~#, [eq]#i~1~j~0~#, [eq]#i~0~j~1~#, and
-     [eq]#i~1~j~1~#.
-  ** The fractions [eq]#{alpha}# and [eq]#{beta}#.
-  ** Given the offset [eq]#{DeltaUpper}~i~# and [eq]#{DeltaUpper}~j~#, the
-     four texels selected by the offset are [eq]#i~0~j'~0~#,
-     [eq]#i~1~j'~0~#, [eq]#i~0~j'~1~#, and [eq]#i~1~j'~1~#.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-[NOTE]
-.Note
-====
-For formats with reduced-resolution components, [eq]#{DeltaUpper}~i~# and
-[eq]#{DeltaUpper}~j~# are relative to the resolution of the
-highest-resolution component, and therefore may be divided by two relative
-to the unnormalized coordinate space of the lower-resolution components.
-====
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-image::{images}/vulkantexture1-ll.svg[align="center",title="Texel Coordinate Systems, Nearest Filtering",opts="{imageopts}"]
-
-The Texel Coordinate Systems - For the example shown of an 8{times}4 texel
-two dimensional image.
-
-  * Texel coordinates as above.
-    Also shown for nearest filtering:
-  ** Given the unnormalized coordinates [eq]#(u,v)#, the texel selected is
-     [eq]#ij#.
-  ** Given the offset [eq]#{DeltaUpper}~i~# and [eq]#{DeltaUpper}~j~#, the
-     texel selected by the offset is [eq]#ij'#.
-
-ifdef::VK_NV_corner_sampled_image[]
-For corner-sampled images, the texel samples are located at the grid
-intersections instead of the texel centers.
-
-image::{images}/vulkantexture0-corner-alternative-a-ll.svg[align="center",title="Texel Coordinate Systems, Corner Sampling",opts="{imageopts}"]
-
-endif::VK_NV_corner_sampled_image[]
-
-== Conversion Formulas
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-(Bill) These Conversion Formulas will likely move to Section 2.7 Fixed-Point
-Data Conversions (RGB to sRGB and sRGB to RGB) and section 2.6 Numeric
-Representation and Computation (RGB to Shared Exponent and Shared Exponent
-to RGB)
-====
-endif::editing-notes[]
-
-[[textures-RGB-sexp]]
-=== RGB to Shared Exponent Conversion
-
-An RGB color [eq]#(red, green, blue)# is transformed to a shared exponent
-color [eq]#(red~shared~, green~shared~, blue~shared~, exp~shared~)# as
-follows:
-
-First, the components [eq]#(red, green, blue)# are clamped to
-[eq]#(red~clamped~, green~clamped~, blue~clamped~)# as:
-
-  {empty}:: [eq]#red~clamped~ = max(0, min(sharedexp~max~, red))#
-  {empty}:: [eq]#green~clamped~ = max(0, min(sharedexp~max~, green))#
-  {empty}:: [eq]#blue~clamped~ = max(0, min(sharedexp~max~, blue))#
-
-where:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-N               & = 9  & \text{number of mantissa bits per component} \\
-B               & = 15 & \text{exponent bias} \\
-E_{max}         & = 31 & \text{maximum possible biased exponent value} \\
-sharedexp_{max} & = \frac{(2^N-1)}{2^N} \times 2^{(E_{max}-B)}
-\end{aligned}
-+++++++++++++++++++
-
-[NOTE]
-.Note
-====
-[eq]#NaN#, if supported, is handled as in <<ieee-754,IEEE 754-2008>>
-`minNum()` and `maxNum()`.
-This results in any [eq]#NaN# being mapped to zero.
-====
-
-The largest clamped component, [eq]#max~clamped~# is determined:
-
-  {empty}:: [eq]#max~clamped~ = max(red~clamped~, green~clamped~,
-            blue~clamped~)#
-
-A preliminary shared exponent [eq]#exp'# is computed:
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-exp' =
-  \begin{cases}
-    \left \lfloor \log_2(max_{clamped}) \right \rfloor + (B+1)
-      & \text{for}\  max_{clamped} > 2^{-(B+1)} \\
-    0
-      & \text{for}\  max_{clamped} \leq 2^{-(B+1)}
-  \end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-The shared exponent [eq]#exp~shared~# is computed:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-max_{shared} =
-    \left \lfloor
-        { \frac{max_{clamped}}{2^{(exp'-B-N)}} + \frac{1}{2} }
-    \right \rfloor
-\end{aligned}
-+++++++++++++++++++
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-exp_{shared} =
-  \begin{cases}
-    exp'   & \text{for}\  0 \leq max_{shared} < 2^N \\
-    exp'+1 & \text{for}\  max_{shared} = 2^N
-  \end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-Finally, three integer values in the range [eq]#0# to [eq]#2^N^# are
-computed:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-red_{shared} & =
-    \left \lfloor
-        { \frac{red_{clamped}}{2^{(exp_{shared}-B-N)}}+ \frac{1}{2} }
-    \right \rfloor \\
-green_{shared} & =
-    \left \lfloor
-        { \frac{green_{clamped}}{2^{(exp_{shared}-B-N)}}+ \frac{1}{2} }
-    \right \rfloor \\
-blue_{shared} & =
-    \left \lfloor
-        { \frac{blue_{clamped}}{2^{(exp_{shared}-B-N)}}+ \frac{1}{2} }
-    \right \rfloor
-\end{aligned}
-+++++++++++++++++++
-
-
-[[textures-sexp-RGB]]
-=== Shared Exponent to RGB
-
-A shared exponent color [eq]#(red~shared~, green~shared~, blue~shared~,
-exp~shared~)# is transformed to an RGB color [eq]#(red, green, blue)# as
-follows:
-
-  {empty}:: latexmath:[red = red_{shared} \times {2^{(exp_{shared}-B-N)}}]
-  {empty}:: latexmath:[green = green_{shared} \times
-            {2^{(exp_{shared}-B-N)}}]
-  {empty}:: latexmath:[blue = blue_{shared} \times {2^{(exp_{shared}-B-N)}}]
-
-where:
-
-  {empty}:: [eq]#N = 9# (number of mantissa bits per component)
-  {empty}:: [eq]#B = 15# (exponent bias)
-
-
-== Texel Input Operations
-
-_Texel input instructions_ are SPIR-V image instructions that read from an
-image.
-_Texel input operations_ are a set of steps that are performed on state,
-coordinates, and texel values while processing a texel input instruction,
-and which are common to some or all texel input instructions.
-They include the following steps, which are performed in the listed order:
-
-  * <<textures-input-validation,Validation operations>>
-  ** <<textures-operation-validation,Instruction/Sampler/Image validation>>
-  ** <<textures-integer-coordinate-validation,Coordinate validation>>
-  ** <<textures-sparse-validation,Sparse validation>>
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  ** <<textures-layout-validation,Layout validation>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * <<textures-format-conversion,Format conversion>>
-  * <<textures-texel-replacement,Texel replacement>>
-  * <<textures-depth-compare-operation,Depth comparison>>
-  * <<textures-conversion-to-rgba,Conversion to RGBA>>
-  * <<textures-component-swizzle,Component swizzle>>
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-  * <<textures-chroma-reconstruction,Chroma reconstruction>>
-  * <<textures-sampler-YCbCr-conversion,{YCbCr} conversion>>
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-For texel input instructions involving multiple texels (for sampling or
-gathering), these steps are applied for each texel that is used in the
-instruction.
-Depending on the type of image instruction, other steps are conditionally
-performed between these steps or involving multiple coordinate or texel
-values.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-If <<textures-chroma-reconstruction,Chroma Reconstruction>> is implicit,
-<<textures-texel-filtering, Texel Filtering>> instead takes place during
-chroma reconstruction, before <<textures-sampler-YCbCr-conversion,sampler
-{YCbCr} conversion>> occurs.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-
-[[textures-input-validation]]
-=== Texel Input Validation Operations
-
-_Texel input validation operations_ inspect instruction/image/sampler state
-or coordinates, and in certain circumstances cause the texel value to be
-replaced or become undefined:.
-There are a series of validations that the texel undergoes.
-
-[[textures-operation-validation]]
-==== Instruction/Sampler/Image View Validation
-
-There are a number of cases where a SPIR-V instruction can: mismatch with
-the sampler, the image view, or both, and a number of further cases where
-the sampler can: mismatch with the image view.
-In such cases the value of the texel returned is undefined:.
-
-These cases include:
-
-  * The sampler pname:borderColor is an integer type and the image view
-    pname:format is not one of the elink:VkFormat integer types or a stencil
-    component of a depth/stencil format.
-  * The sampler pname:borderColor is a float type and the image view
-    pname:format is not one of the elink:VkFormat float types or a depth
-    component of a depth/stencil format.
-ifndef::VK_EXT_border_color_swizzle[]
-  * The sampler pname:borderColor is one of the opaque black colors
-    (ename:VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK or
-    ename:VK_BORDER_COLOR_INT_OPAQUE_BLACK) and the image view
-    elink:VkComponentSwizzle for any of the slink:VkComponentMapping
-    components is not the <<resources-image-views-identity-mappings,identity
-    swizzle>>.
-endif::VK_EXT_border_color_swizzle[]
-ifdef::VK_EXT_border_color_swizzle[]
-  * The sampler pname:borderColor is one of the opaque black colors
-    (ename:VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK or
-    ename:VK_BORDER_COLOR_INT_OPAQUE_BLACK) and the image view
-    elink:VkComponentSwizzle for any of the slink:VkComponentMapping
-    components is not the <<resources-image-views-identity-mappings,identity
-    swizzle>>, and
-    slink:VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::pname:borderColorSwizzleFromImage
-    feature is not enabled, and
-    slink:VkSamplerBorderColorComponentMappingCreateInfoEXT is not
-    specified.
-  * slink:VkSamplerBorderColorComponentMappingCreateInfoEXT::pname:components,
-    if specified, has a component swizzle that does not match the component
-    swizzle of the image view, and either component swizzle is not a form of
-    identity swizzle.
-  * slink:VkSamplerBorderColorComponentMappingCreateInfoEXT::pname:srgb, if
-    specified, does not match the sRGB encoding of the image view.
-endif::VK_EXT_border_color_swizzle[]
-ifdef::VK_EXT_custom_border_color[]
-  * The sampler pname:borderColor is a custom color
-    (ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT or
-    ename:VK_BORDER_COLOR_INT_CUSTOM_EXT) and the supplied
-    slink:VkSamplerCustomBorderColorCreateInfoEXT::pname:customBorderColor
-    is outside the bounds of the values representable in the image view's
-    pname:format.
-ifndef::VK_EXT_border_color_swizzle[]
-  * The sampler pname:borderColor is a custom color
-    (ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT or
-    ename:VK_BORDER_COLOR_INT_CUSTOM_EXT) and the image view
-    elink:VkComponentSwizzle for any of the slink:VkComponentMapping
-    components is not the <<resources-image-views-identity-mappings,identity
-    swizzle>>.
-endif::VK_EXT_border_color_swizzle[]
-ifdef::VK_EXT_border_color_swizzle[]
-  * The sampler pname:borderColor is a custom color
-    (ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT or
-    ename:VK_BORDER_COLOR_INT_CUSTOM_EXT) and the image view
-    elink:VkComponentSwizzle for any of the slink:VkComponentMapping
-    components is not the <<resources-image-views-identity-mappings,identity
-    swizzle>>, and
-    slink:VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::pname:borderColorSwizzleFromImage
-    feature is not enabled, and
-    slink:VkSamplerBorderColorComponentMappingCreateInfoEXT is not
-    specified.
-endif::VK_EXT_border_color_swizzle[]
-endif::VK_EXT_custom_border_color[]
-  * The elink:VkImageLayout of any subresource in the image view does not
-    match that specified in slink:VkDescriptorImageInfo::pname:imageLayout
-    used to write the image descriptor.
-  * The SPIR-V Image Format is not <<spirvenv-image-formats,compatible>>
-    with the image view's pname:format.
-  * The sampler pname:unnormalizedCoordinates is ename:VK_TRUE and any of
-    the <<samplers-unnormalizedCoordinates,limitations of unnormalized
-    coordinates>> are violated.
-ifdef::VK_EXT_fragment_density_map[]
-  * The sampler was created with pname:flags containing
-    ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT and the image was not created
-    with pname:flags containing ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT.
-  * The sampler was not created with pname:flags containing
-    ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT and the image was created
-    with pname:flags containing ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT.
-  * The sampler was created with pname:flags containing
-    ename:VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT and is used with a function
-    that is not code:OpImageSampleImplicitLod or
-    code:OpImageSampleExplicitLod, or is used with operands code:Offset or
-    code:ConstOffsets.
-endif::VK_EXT_fragment_density_map[]
-  * The SPIR-V instruction is one of the code:OpImage*Dref* instructions and
-    the sampler pname:compareEnable is ename:VK_FALSE
-  * The SPIR-V instruction is not one of the code:OpImage*Dref* instructions
-    and the sampler pname:compareEnable is ename:VK_TRUE
-ifndef::VK_KHR_format_feature_flags2[]
-  * The SPIR-V instruction is one of the code:OpImage*Dref* instructions and
-    the image view pname:format is not one of the depth/stencil formats with
-    a depth component, or the image view aspect is not
-    ename:VK_IMAGE_ASPECT_DEPTH_BIT.
-endif::VK_KHR_format_feature_flags2[]
-ifdef::VK_KHR_format_feature_flags2[]
-  * The SPIR-V instruction is one of the code:OpImage*Dref* instructions,
-    the image view pname:format is one of the depth/stencil formats, and the
-    image view aspect is not ename:VK_IMAGE_ASPECT_DEPTH_BIT.
-endif::VK_KHR_format_feature_flags2[]
-  * The SPIR-V instruction's image variable's properties are not compatible
-    with the image view:
-  ** Rules for pname:viewType:
-  *** ename:VK_IMAGE_VIEW_TYPE_1D must: have code:Dim = 1D, code:Arrayed =
-      0, code:MS = 0.
-  *** ename:VK_IMAGE_VIEW_TYPE_2D must: have code:Dim = 2D, code:Arrayed = 0.
-  *** ename:VK_IMAGE_VIEW_TYPE_3D must: have code:Dim = 3D, code:Arrayed =
-      0, code:MS = 0.
-  *** ename:VK_IMAGE_VIEW_TYPE_CUBE must: have code:Dim = Cube, code:Arrayed
-      = 0, code:MS = 0.
-  *** ename:VK_IMAGE_VIEW_TYPE_1D_ARRAY must: have code:Dim = 1D,
-      code:Arrayed = 1, code:MS = 0.
-  *** ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY must: have code:Dim = 2D,
-      code:Arrayed = 1.
-  *** ename:VK_IMAGE_VIEW_TYPE_CUBE_ARRAY must: have code:Dim = Cube,
-      code:Arrayed = 1, code:MS = 0.
-  ** If the image was created with slink:VkImageCreateInfo::pname:samples
-     equal to ename:VK_SAMPLE_COUNT_1_BIT, the instruction must: have
-     code:MS = 0.
-  ** If the image was created with slink:VkImageCreateInfo::pname:samples
-     not equal to ename:VK_SAMPLE_COUNT_1_BIT, the instruction must: have
-     code:MS = 1.
-  ** If the code:Sampled code:Type of the code:OpTypeImage does not match
-     the numeric format of the image, as shown in the _SPIR-V Sampled Type_
-     column of the <<formats-numericformat>> table.
-  ** If the <<spirvenv-image-signedness,signedness of any read or sample
-     operation>> does not match the signedness of the image's format.
-ifdef::VK_NV_corner_sampled_image[]
-  * If the image was created with slink:VkImageCreateInfo::pname:flags
-    containing ename:VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV, the sampler
-    addressing modes must: only use a elink:VkSamplerAddressMode of
-    ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE.
-endif::VK_NV_corner_sampled_image[]
-ifdef::VK_NV_shader_image_footprint[]
-  * The SPIR-V instruction is code:OpImageSampleFootprintNV with code:Dim =
-    2D and pname:addressModeU or pname:addressModeV in the sampler is not
-    ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE.
-  * The SPIR-V instruction is code:OpImageSampleFootprintNV with code:Dim =
-    3D and pname:addressModeU, pname:addressModeV, or pname:addressModeW in
-    the sampler is not ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE.
-endif::VK_NV_shader_image_footprint[]
-ifdef::VK_EXT_custom_border_color[]
-  * The sampler was created with a specified
-    slink:VkSamplerCustomBorderColorCreateInfoEXT::pname:format which does
-    not match the elink:VkFormat of the image view(s) it is sampling.
-  * The sampler is sampling an image view of
-    ename:VK_FORMAT_B4G4R4A4_UNORM_PACK16,
-    ename:VK_FORMAT_B5G6R5_UNORM_PACK16, or
-    ename:VK_FORMAT_B5G5R5A1_UNORM_PACK16 format without a specified
-    slink:VkSamplerCustomBorderColorCreateInfoEXT::pname:format.
-endif::VK_EXT_custom_border_color[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-Only code:OpImageSample* and code:OpImageSparseSample* can: be used with a
-sampler that enables <<samplers-YCbCr-conversion,sampler {YCbCr}
-conversion>>.
-
-code:OpImageFetch, code:OpImageSparseFetch, code:OpImage*Gather, and
-code:OpImageSparse*Gather must: not be used with a sampler that enables
-<<samplers-YCbCr-conversion,sampler {YCbCr} conversion>>.
-
-The code:ConstOffset and code:Offset operands must: not be used with a
-sampler that enables <<samplers-YCbCr-conversion,sampler {YCbCr}
-conversion>>.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-ifdef::VK_KHR_format_feature_flags2[]
-If the <<resources-image-view-format-features,image view's format features>>
-do not support
-ename:VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR then
-code:OpImage*Dref* instructions must: not be used to sample from it.
-endif::VK_KHR_format_feature_flags2[]
-
-
-[[textures-integer-coordinate-validation]]
-==== Integer Texel Coordinate Validation
-
-Integer texel coordinates are validated against the size of the image level,
-and the number of layers and number of samples in the image.
-For SPIR-V instructions that use integer texel coordinates, this is
-performed directly on the integer coordinates.
-For instructions that use normalized or unnormalized texel coordinates, this
-is performed on the coordinates that result after
-<<textures-unnormalized-to-integer,conversion>> to integer texel
-coordinates.
-
-If the integer texel coordinates do not satisfy all of the conditions
-
-  {empty}:: [eq]#0 {leq} i < w~s~#
-  {empty}:: [eq]#0 {leq} j < h~s~#
-  {empty}:: [eq]#0 {leq} k < d~s~#
-  {empty}:: [eq]#0 {leq} l < layers#
-  {empty}:: [eq]#0 {leq} n < samples#
-
-where:
-
-  {empty}:: [eq]#w~s~ =# width of the image level
-  {empty}:: [eq]#h~s~ =# height of the image level
-  {empty}:: [eq]#d~s~ =# depth of the image level
-  {empty}:: [eq]#layers =# number of layers in the image
-  {empty}:: [eq]#samples =# number of samples per texel in the image
-
-then the texel fails integer texel coordinate validation.
-
-There are four cases to consider:
-
-  . Valid Texel Coordinates
-+
-  * If the texel coordinates pass validation (that is, the coordinates lie
-    within the image),
-+
-then the texel value comes from the value in image memory.
-
-  . Border Texel
-+
-  * If the texel coordinates fail validation, and
-  * If the read is the result of an image sample instruction or image gather
-    instruction, and
-  * If the image is not a cube image,
-+
-then the texel is a border texel and <<textures-texel-replacement,texel
-replacement>> is performed.
-
-  . Invalid Texel
-+
-  * If the texel coordinates fail validation, and
-  * If the read is the result of an image fetch instruction, image read
-    instruction, or atomic instruction,
-+
-then the texel is an invalid texel and <<textures-texel-replacement,texel
-replacement>> is performed.
-
-  . Cube Map Edge or Corner
-+
-Otherwise the texel coordinates lie beyond the edges or corners of the
-selected cube map face, and <<textures-cubemapedge, Cube map edge handling>>
-is performed.
-
-
-[[textures-cubemapedge]]
-==== Cube Map Edge Handling
-
-If the texel coordinates lie beyond the edges or corners of the selected
-cube map face, the following steps are performed.
-Note that this does not occur when using ename:VK_FILTER_NEAREST filtering
-within a mip level, since ename:VK_FILTER_NEAREST is treated as using
-ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE.
-
-  * Cube Map Edge Texel
-+
-  ** If the texel lies beyond the selected cube map face in either only
-     [eq]#i# or only [eq]#j#, then the coordinates [eq]#(i,j)# and the array
-     layer [eq]#l# are transformed to select the adjacent texel from the
-     appropriate neighboring face.
-
-  * Cube Map Corner Texel
-+
-  ** If the texel lies beyond the selected cube map face in both [eq]#i# and
-     [eq]#j#, then there is no unique neighboring face from which to read
-     that texel.
-     The texel should: be replaced by the average of the three values of the
-     adjacent texels in each incident face.
-     However, implementations may: replace the cube map corner texel by
-     other methods.
-ifndef::VK_EXT_filter_cubic[]
-The methods are subject to the constraint that if the three available texels
-have the same value, the resulting filtered texel must: have that value.
-endif::VK_EXT_filter_cubic[]
-ifdef::VK_EXT_filter_cubic[]
-The methods are subject to the constraint that for linear filtering if the
-three available texels have the same value, the resulting filtered texel
-must: have that value, and for cubic filtering if the twelve available
-samples have the same value, the resulting filtered texel must: have that
-value.
-endif::VK_EXT_filter_cubic[]
-
-[[textures-sparse-validation]]
-==== Sparse Validation
-
-If the texel reads from an unbound region of a sparse image, the texel is a
-_sparse unbound texel_, and processing continues with
-<<textures-texel-replacement,texel replacement>>.
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-[[textures-layout-validation]]
-==== Layout Validation
-
-If all planes of a _disjoint_ _multi-planar_ image are not in the same
-<<resources-image-layouts,image layout>>, the image must: not be sampled
-with <<samplers-YCbCr-conversion,sampler {YCbCr} conversion>> enabled.
-
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-[[textures-format-conversion]]
-=== Format Conversion
-
-Texels undergo a format conversion from the elink:VkFormat of the image view
-to a vector of either floating point or signed or unsigned integer
-components, with the number of components based on the number of components
-present in the format.
-
-  * Color formats have one, two, three, or four components, according to the
-    format.
-  * Depth/stencil formats are one component.
-    The depth or stencil component is selected by the pname:aspectMask of
-    the image view.
-
-Each component is converted based on its type and size (as defined in the
-<<formats-definition,Format Definition>> section for each elink:VkFormat),
-using the appropriate equations in <<fundamentals-fp16,16-Bit Floating-Point
-Numbers>>, <<fundamentals-fp11,Unsigned 11-Bit Floating-Point Numbers>>,
-<<fundamentals-fp10,Unsigned 10-Bit Floating-Point Numbers>>,
-<<fundamentals-fixedconv,Fixed-Point Data Conversion>>, and
-<<textures-sexp-RGB,Shared Exponent to RGB>>.
-Signed integer components smaller than 32 bits are sign-extended.
-
-If the image view format is sRGB, the color components are first converted
-as if they are UNORM, and then sRGB to linear conversion is applied to the
-R, G, and B components as described in the "`sRGB EOTF`" section of the
-<<data-format,Khronos Data Format Specification>>.
-The A component, if present, is unchanged.
-
-If the image view format is block-compressed, then the texel value is first
-decoded, then converted based on the type and number of components defined
-by the compressed format.
-
-
-[[textures-texel-replacement]]
-=== Texel Replacement
-
-A texel is replaced if it is one (and only one) of:
-
-  * a border texel,
-  * an invalid texel, or
-  * a sparse unbound texel.
-
-Border texels are replaced with a value based on the image format and the
-pname:borderColor of the sampler.
-The border color is:
-
-[[textures-border-replacement-color]]
-ifdef::VK_EXT_custom_border_color[]
-.Border Color [eq]#B#, Custom Border Color slink:VkSamplerCustomBorderColorCreateInfoEXT::pname:customBorderColor [eq]#U#
-endif::VK_EXT_custom_border_color[]
-ifndef::VK_EXT_custom_border_color[]
-.Border Color [eq]#B#
-endif::VK_EXT_custom_border_color[]
-[options="header",cols="60%,40%"]
-|====
-| Sampler pname:borderColor                     | Corresponding Border Color
-| ename:VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK | [eq]#[B~r~, B~g~, B~b~, B~a~] = [0.0, 0.0, 0.0, 0.0]#
-| ename:VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK      | [eq]#[B~r~, B~g~, B~b~, B~a~] = [0.0, 0.0, 0.0, 1.0]#
-| ename:VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE      | [eq]#[B~r~, B~g~, B~b~, B~a~] = [1.0, 1.0, 1.0, 1.0]#
-| ename:VK_BORDER_COLOR_INT_TRANSPARENT_BLACK   | [eq]#[B~r~, B~g~, B~b~, B~a~] = [0, 0, 0, 0]#
-| ename:VK_BORDER_COLOR_INT_OPAQUE_BLACK        | [eq]#[B~r~, B~g~, B~b~, B~a~] = [0, 0, 0, 1]#
-| ename:VK_BORDER_COLOR_INT_OPAQUE_WHITE        | [eq]#[B~r~, B~g~, B~b~, B~a~] = [1, 1, 1, 1]#
-ifdef::VK_EXT_custom_border_color[]
-| ename:VK_BORDER_COLOR_FLOAT_CUSTOM_EXT        | [eq]#[B~r~, B~g~, B~b~, B~a~] = [U~r~, U~g~, U~b~, U~a~]#
-| ename:VK_BORDER_COLOR_INT_CUSTOM_EXT          | [eq]#[B~r~, B~g~, B~b~, B~a~] = [U~r~, U~g~, U~b~, U~a~]#
-endif::VK_EXT_custom_border_color[]
-|====
-
-ifdef::VK_EXT_custom_border_color[]
-The custom border color ([eq]#U#) may: be rounded by implementations prior
-to texel replacement, but the error introduced by such a rounding must: not
-exceed one ULP of the image's pname:format.
-endif::VK_EXT_custom_border_color[]
-
-[NOTE]
-.Note
-====
-The names etext:VK_BORDER_COLOR_*\_TRANSPARENT_BLACK,
-etext:VK_BORDER_COLOR_*\_OPAQUE_BLACK, and
-etext:VK_BORDER_COLOR_*_OPAQUE_WHITE are meant to describe which components
-are zeros and ones in the vocabulary of compositing, and are not meant to
-imply that the numerical value of ename:VK_BORDER_COLOR_INT_OPAQUE_WHITE is
-a saturating value for integers.
-====
-
-This is substituted for the texel value by replacing the number of
-components in the image format
-
-[[textures-border-replacement-table]]
-.Border Texel Components After Replacement
-[width="100%",options="header"]
-|====
-| Texel Aspect or Format      | Component Assignment
-| Depth aspect                | [eq]#D                                     = B~r~#
-| Stencil aspect              | [eq]#S                                     = B~r~#
-| One component color format  | [eq]#Color~r~                              = B~r~#
-| Two component color format  | [eq]#[Color~r~,Color~g~]                   = [B~r~,B~g~]#
-| Three component color format| [eq]#[Color~r~,Color~g~,Color~b~]          = [B~r~,B~g~,B~b~]#
-| Four component color format | [eq]#[Color~r~,Color~g~,Color~b~,Color~a~] = [B~r~,B~g~,B~b~,B~a~]#
-|====
-
-The value returned by a read of an invalid texel is undefined:, unless that
-read operation is from a buffer resource and the pname:robustBufferAccess
-feature is enabled.
-In that case, an invalid texel is replaced as described by the
-<<features-robustBufferAccess,pname:robustBufferAccess feature>>.
-ifdef::VK_EXT_image_robustness,VK_EXT_robustness2[]
-If the access is to an image resource and the x, y, z, or layer coordinate
-validation fails and
-ifdef::VK_EXT_image_robustness[]
-<<features-robustImageAccess,pname:robustImageAccess>> is enabled then zero
-must: be returned for the R, G, and B components, if present.
-Either zero or one must: be returned for the A component, if present.
-endif::VK_EXT_image_robustness[]
-ifdef::VK_EXT_image_robustness+VK_EXT_robustness2[If]
-ifdef::VK_EXT_robustness2[]
-<<features-robustImageAccess2,pname:robustImageAccess2>> is enabled, zero
-values must: be returned.
-endif::VK_EXT_robustness2[]
-If only the sample index was invalid, the values returned are undefined:.
-endif::VK_EXT_image_robustness,VK_EXT_robustness2[]
-
-ifdef::VK_EXT_image_robustness[]
-Additionally, if <<features-robustImageAccess,pname:robustImageAccess>> is
-enabled,
-ifdef::VK_EXT_robustness2[]
-but <<features-robustImageAccess2,pname:robustImageAccess2>> is not,
-endif::VK_EXT_robustness2[]
-any invalid texels may: be expanded to four components prior to texel
-replacement.
-This means that components not present in the image format may be replaced
-with 0 or may undergo <<textures-conversion-to-rgba,conversion to RGBA>> as
-normal.
-endif::VK_EXT_image_robustness[]
-
-ifdef::VK_EXT_robustness2[]
-Loads from a null descriptor return a four component color value of all
-zeros.
-However, for storage images and storage texel buffers using an explicit
-SPIR-V Image Format, loads from a null descriptor may: return an alpha value
-of 1 (float or integer, depending on format) if the format does not include
-alpha.
-endif::VK_EXT_robustness2[]
-
-If the
-slink:VkPhysicalDeviceSparseProperties::pname:residencyNonResidentStrict
-property is ename:VK_TRUE, a sparse unbound texel is replaced with 0 or 0.0
-values for integer and floating-point components of the image format,
-respectively.
-
-If pname:residencyNonResidentStrict is ename:VK_FALSE, the value of the
-sparse unbound texel is undefined:.
-
-
-[[textures-depth-compare-operation]]
-=== Depth Compare Operation
-
-If the image view has a depth/stencil format, the depth component is
-selected by the pname:aspectMask, and the operation is a code:Dref
-instruction, a depth comparison is performed.
-The value of the result [eq]#D# is [eq]#1.0# if the result of the compare
-operation is [eq]#true#, and [eq]#0.0# otherwise.
-The compare operation is selected by the pname:compareOp member of the
-sampler.
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-D & = 1.0 &
-  \begin{cases}
-    D_{\textit{ref}} \leq D_{\textit{tex}} & \text{for LEQUAL}   \\
-    D_{\textit{ref}} \geq D_{\textit{tex}} & \text{for GEQUAL}   \\
-    D_{\textit{ref}} < D_{\textit{tex}}    & \text{for LESS}     \\
-    D_{\textit{ref}} > D_{\textit{tex}}    & \text{for GREATER}  \\
-    D_{\textit{ref}} = D_{\textit{tex}}    & \text{for EQUAL}    \\
-    D_{\textit{ref}} \neq D_{\textit{tex}} & \text{for NOTEQUAL} \\
-    \textit{true}                          & \text{for ALWAYS}   \\
-    \textit{false}                         & \text{for NEVER}
-  \end{cases} \\
-D & = 0.0 & \text{otherwise}
-\end{aligned}
-+++++++++++++++++++
-
-where [eq]#D~tex~# is the texel depth value and [eq]#D~ref~# is the
-reference value from the SPIR-V operand.
-If the image being sampled has a fixed-point format then the reference value
-is clamped to [0, 1] before the comparison operation.
-
-
-[[textures-conversion-to-rgba]]
-=== Conversion to RGBA
-
-The texel is expanded from one, two, or three components to four components
-based on the image base color:
-
-[[textures-texel-color-rgba-conversion-table]]
-.Texel Color After Conversion To RGBA
-[width="100%", options="header", cols="<4,<6"]
-|====
-| Texel Aspect or Format      | RGBA Color
-| Depth aspect                | [eq]#[Color~r~,Color~g~,Color~b~, Color~a~] = [D,0,0,one]#
-| Stencil aspect              | [eq]#[Color~r~,Color~g~,Color~b~, Color~a~] = [S,0,0,one]#
-| One component color format  | [eq]#[Color~r~,Color~g~,Color~b~, Color~a~] = [Color~r~,0,0,one]#
-| Two component color format  | [eq]#[Color~r~,Color~g~,Color~b~, Color~a~] = [Color~r~,Color~g~,0,one]#
-| Three component color format| [eq]#[Color~r~,Color~g~,Color~b~, Color~a~] = [Color~r~,Color~g~,Color~b~,one]#
-| Four component color format | [eq]#[Color~r~,Color~g~,Color~b~, Color~a~] = [Color~r~,Color~g~,Color~b~,Color~a~]#
-|====
-
-where [eq]#one = 1.0f# for floating-point formats and depth aspects, and
-[eq]#one = 1# for integer formats and stencil aspects.
-
-
-[[textures-component-swizzle]]
-=== Component Swizzle
-
-ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-All texel input instructions apply a _swizzle_ based on the
-elink:VkComponentSwizzle enums in the pname:components member of the
-slink:VkImageViewCreateInfo structure for the image being read.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-All texel input instructions apply a _swizzle_ based on:
-
-  * the elink:VkComponentSwizzle enums in the pname:components member of the
-    slink:VkImageViewCreateInfo structure for the image being read if
-    <<samplers-YCbCr-conversion,sampler {YCbCr} conversion>> is not enabled,
-    and
-  * the elink:VkComponentSwizzle enums in the pname:components member of the
-    slink:VkSamplerYcbcrConversionCreateInfo structure for the
-    <<samplers-YCbCr-conversion,sampler {YCbCr} conversion>> if sampler
-    {YCbCr} conversion is enabled.
-
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-The swizzle can: rearrange the components of the texel, or substitute zero
-or one for any components.
-It is defined as follows for each color [eq]#component#:
-
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-Color'_{component} & =
-\begin{cases}
-Color_r          & \text{for RED swizzle}   \\
-Color_g          & \text{for GREEN swizzle} \\
-Color_b          & \text{for BLUE swizzle}  \\
-Color_a          & \text{for ALPHA swizzle} \\
-0                & \text{for ZERO swizzle}  \\
-one              & \text{for ONE swizzle} \\
-identity         & \text{for IDENTITY swizzle}
-\end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-where:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-one & =
-\begin{cases}
-& 1.0\text{f}  & \text{for floating point components} \\
-& 1            & \text{for integer components} \\
-\end{cases}
-\\
-identity & =
-\begin{cases}
-& Color_r          & \text{for}\ component = r \\
-& Color_g          & \text{for}\ component = g \\
-& Color_b          & \text{for}\ component = b \\
-& Color_a          & \text{for}\ component = a \\
-\end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-If the border color is one of the etext:VK_BORDER_COLOR_*_OPAQUE_BLACK enums
-and the elink:VkComponentSwizzle is not the
-<<resources-image-views-identity-mappings,identity swizzle>> for all
-components, the value of the texel after swizzle is undefined:.
-
-[[textures-sparse-residency]]
-=== Sparse Residency
-
-code:OpImageSparse* instructions return a structure which includes a
-_residency code_ indicating whether any texels accessed by the instruction
-are sparse unbound texels.
-This code can: be interpreted by the code:OpImageSparseTexelsResident
-instruction which converts the residency code to a boolean value.
-
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-[[textures-chroma-reconstruction]]
-=== Chroma Reconstruction
-
-In some color models, the color representation is defined in terms of
-monochromatic light intensity (often called "`luma`") and color differences
-relative to this intensity, often called "`chroma`".
-It is common for color models other than RGB to represent the chroma
-components at lower spatial resolution than the luma component.
-This approach is used to take advantage of the eye's lower spatial
-sensitivity to color compared with its sensitivity to brightness.
-Less commonly, the same approach is used with additive color, since the
-green component dominates the eye's sensitivity to light intensity and the
-spatial sensitivity to color introduced by red and blue is lower.
-
-Lower-resolution components are "`downsampled`" by resizing them to a lower
-spatial resolution than the component representing luminance.
-This process is also commonly known as "`chroma subsampling`".
-There is one luminance sample in each texture texel, but each chrominance
-sample may be shared among several texels in one or both texture dimensions.
-
- * "`etext:_444`" formats do not spatially downsample chroma values compared
-   with luma: there are unique chroma samples for each texel.
-
- * "`etext:_422`" formats have downsampling in the x dimension
-   (corresponding to _u_ or _s_ coordinates): they are sampled at half the
-   resolution of luma in that dimension.
-
- * "`etext:_420`" formats have downsampling in the x dimension
-   (corresponding to _u_ or _s_ coordinates) and the y dimension
-   (corresponding to _v_ or _t_ coordinates): they are sampled at half the
-   resolution of luma in both dimensions.
-
-The process of reconstructing a full color value for texture access involves
-accessing both chroma and luma values at the same location.
-To generate the color accurately, the values of the lower-resolution
-components at the location of the luma samples must be reconstructed from
-the lower-resolution sample locations, an operation known here as "`chroma
-reconstruction`" irrespective of the actual color model.
-
-The location of the chroma samples relative to the luma coordinates is
-determined by the pname:xChromaOffset and pname:yChromaOffset members of the
-slink:VkSamplerYcbcrConversionCreateInfo structure used to create the
-sampler {YCbCr} conversion.
-
-The following diagrams show the relationship between unnormalized (_u_,_v_)
-coordinates and (_i_,_j_) integer texel positions in the luma component
-(shown in black, with circles showing integer sample positions) and the
-texel coordinates of reduced-resolution chroma components, shown as crosses
-in red.
-
-[NOTE]
-.Note
-====
-If the chroma values are reconstructed at the locations of the luma samples
-by means of interpolation, chroma samples from outside the image bounds are
-needed; these are determined according to <<textures-wrapping-operation>>.
-These diagrams represent this by showing the bounds of the "`chroma texel`"
-extending beyond the image bounds, and including additional chroma sample
-positions where required for interpolation.
-The limits of a sample for etext:NEAREST sampling is shown as a grid.
-====
-
-image::{images}/chromasamples_422_cosited.svg[align="center",title="422 downsampling, xChromaOffset=COSITED_EVEN",opts="{imageopts}"]
-
-image::{images}/chromasamples_422_midpoint.svg[align="center",title="422 downsampling, xChromaOffset=MIDPOINT",opts="{imageopts}"]
-
-image::{images}/chromasamples_420_xcosited_ycosited.svg[align="center",title="420 downsampling, xChromaOffset=COSITED_EVEN, yChromaOffset=COSITED_EVEN",opts="{imageopts}"]
-
-image::{images}/chromasamples_420_xmidpoint_ycosited.svg[align="center",title="420 downsampling, xChromaOffset=MIDPOINT, yChromaOffset=COSITED_EVEN",opts="{imageopts}"]
-
-image::{images}/chromasamples_420_xcosited_ymidpoint.svg[align="center",title="420 downsampling, xChromaOffset=COSITED_EVEN, yChromaOffset=MIDPOINT",opts="{imageopts}"]
-
-image::{images}/chromasamples_420_xmidpoint_ymidpoint.svg[align="center",title="420 downsampling, xChromaOffset=MIDPOINT, yChromaOffset=MIDPOINT",opts="{imageopts}"]
-
-Reconstruction is implemented in one of two ways:
-
-If the format of the image that is to be sampled sets
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT,
-or the slink:VkSamplerYcbcrConversionCreateInfo's
-pname:forceExplicitReconstruction is set to ename:VK_TRUE, reconstruction is
-performed as an explicit step independent of filtering, described in the
-<<textures-explicit-reconstruction>> section.
-
-If the format of the image that is to be sampled does not set
-ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT
-and if the slink:VkSamplerYcbcrConversionCreateInfo's
-pname:forceExplicitReconstruction is set to ename:VK_FALSE, reconstruction
-is performed as an implicit part of filtering prior to color model
-conversion, with no separate post-conversion texel filtering step, as
-described in the <<textures-implict-reconstruction,Implicit Reconstruction>>
-section.
-
-
-[[textures-explicit-reconstruction]]
-==== Explicit Reconstruction
-
-  * If the pname:chromaFilter member of the
-    slink:VkSamplerYcbcrConversionCreateInfo structure is
-    ename:VK_FILTER_NEAREST:
-  ** If the format's R and B components are reduced in resolution in just
-     width by a factor of two relative to the G component (i.e. this is a
-     "`etext:_422`" format), the latexmath:[\tau_{ijk}[level\]] values
-     accessed by <<textures-texel-filtering,texel filtering>> are
-     reconstructed as follows:
-+
-[latexmath]
-++++++++++++++
-\begin{aligned}
-\tau_R'(i, j) & = \tau_R(\left\lfloor{i\times 0.5}\right\rfloor, j)[level] \\
-\tau_B'(i, j) & = \tau_B(\left\lfloor{i\times 0.5}\right\rfloor, j)[level]
-\end{aligned}
-++++++++++++++
-
-  ** If the format's R and B components are reduced in resolution in width
-     and height by a factor of two relative to the G component (i.e. this is
-     a "`etext:_420`" format), the latexmath:[\tau_{ijk}[level\]] values
-     accessed by <<textures-texel-filtering,texel filtering>> are
-     reconstructed as follows:
-+
-[latexmath]
-++++++++++++++
-\begin{aligned}
-\tau_R'(i, j) & = \tau_R(\left\lfloor{i\times 0.5}\right\rfloor, \left\lfloor{j\times 0.5}\right\rfloor)[level] \\
-\tau_B'(i, j) & = \tau_B(\left\lfloor{i\times 0.5}\right\rfloor, \left\lfloor{j\times 0.5}\right\rfloor)[level]
-\end{aligned}
-++++++++++++++
-+
-[NOTE]
-.Note
-====
-pname:xChromaOffset and pname:yChromaOffset have no effect if
-pname:chromaFilter is ename:VK_FILTER_NEAREST for explicit reconstruction.
-====
-
-  * If the pname:chromaFilter member of the
-    slink:VkSamplerYcbcrConversionCreateInfo structure is
-    ename:VK_FILTER_LINEAR:
-  ** If the format's R and B components are reduced in resolution in just
-     width by a factor of two relative to the G component (i.e. this is a
-     "`etext:_422`" format):
-  *** If pname:xChromaOffset is ename:VK_CHROMA_LOCATION_COSITED_EVEN:
-+
-[latexmath]
-+++++
-\tau_{RB}'(i,j) = \begin{cases}
-\tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor,j)[level], & 0.5 \times i = \left\lfloor{0.5 \times i}\right\rfloor\\
-0.5\times\tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor,j)[level] + \\
-0.5\times\tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor + 1,j)[level], & 0.5 \times i \neq \left\lfloor{0.5 \times i}\right\rfloor
-\end{cases}
-+++++
-+
-  *** If pname:xChromaOffset is ename:VK_CHROMA_LOCATION_MIDPOINT:
-+
-[latexmath]
-+++++
-\tau_{RB}'(i,j) = \begin{cases}
-0.25 \times \tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor - 1,j)[level] + \\
-0.75 \times \tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor,j)[level], & 0.5 \times i = \left\lfloor{0.5 \times i}\right\rfloor\\
-0.75 \times \tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor,j)[level] + \\
-0.25 \times \tau_{RB}(\left\lfloor{i\times 0.5}\right\rfloor + 1,j)[level], & 0.5 \times i \neq \left\lfloor{0.5 \times i}\right\rfloor
-\end{cases}
-+++++
-
-  ** If the format's R and B components are reduced in resolution in width
-     and height by a factor of two relative to the G component (i.e. this is
-     a "`etext:_420`" format), a similar relationship applies.
-     Due to the number of options, these formulae are expressed more
-     concisely as follows:
-+
-[latexmath]
-+++++
-\begin{aligned}
-  i_{RB} & =
-    \begin{cases}
-      0.5 \times (i) & \textrm{xChromaOffset = COSITED}\_\textrm{EVEN} \\
-      0.5 \times (i - 0.5) & \textrm{xChromaOffset = MIDPOINT}
-    \end{cases}\\
-  j_{RB} & =
-    \begin{cases}
-      0.5 \times (j) & \textrm{yChromaOffset = COSITED}\_\textrm{EVEN} \\
-      0.5 \times (j - 0.5) & \textrm{yChromaOffset = MIDPOINT}
-    \end{cases}\\
-  \\
-  i_{floor} & = \left\lfloor i_{RB} \right\rfloor \\
-  j_{floor} & = \left\lfloor j_{RB} \right\rfloor \\
-  \\
-  i_{frac} & = i_{RB} - i_{floor} \\
-  j_{frac} & = j_{RB} - j_{floor}
-\end{aligned}
-+++++
-+
-[latexmath]
-+++++
-\begin{aligned}
-\tau_{RB}'(i,j) =
-    & \tau_{RB}(     i_{floor},     j_{floor})[level]
-        & \times & ( 1 - i_{frac} ) &
-        & \times & ( 1 - j_{frac} ) & + \\
-    & \tau_{RB}( 1 + i_{floor},     j_{floor})[level]
-        & \times & (     i_{frac} ) &
-        & \times & ( 1 - j_{frac} ) & + \\
-    & \tau_{RB}(     i_{floor}, 1 + j_{floor})[level]
-        & \times & ( 1 - i_{frac} ) &
-        & \times & (     j_{frac} ) & + \\
-    & \tau_{RB}( 1 + i_{floor}, 1 + j_{floor})[level]
-        & \times & (     i_{frac} ) &
-        & \times & (     j_{frac} ) &
-\end{aligned}
-+++++
-
-[NOTE]
-.Note
-====
-In the case where the texture itself is bilinearly interpolated as described
-in <<textures-texel-filtering,Texel Filtering>>, thus requiring four
-full-color samples for the filtering operation, and where the reconstruction
-of these samples uses bilinear interpolation in the chroma components due to
-pname:chromaFilter=ename:VK_FILTER_LINEAR, up to nine chroma samples may be
-required, depending on the sample location.
-====
-
-
-[[textures-implict-reconstruction]]
-==== Implicit Reconstruction
-
-Implicit reconstruction takes place by the samples being interpolated, as
-required by the filter settings of the sampler, except that
-pname:chromaFilter takes precedence for the chroma samples.
-
-If pname:chromaFilter is ename:VK_FILTER_NEAREST, an implementation may:
-behave as if pname:xChromaOffset and pname:yChromaOffset were both
-ename:VK_CHROMA_LOCATION_MIDPOINT, irrespective of the values set.
-
-[NOTE]
-.Note
-====
-This will not have any visible effect if the locations of the luma samples
-coincide with the location of the samples used for rasterization.
-====
-
-The sample coordinates are adjusted by the downsample factor of the
-component (such that, for example, the sample coordinates are divided by two
-if the component has a downsample factor of two relative to the luma
-component):
-
-[latexmath]
-++++++
-\begin{aligned}
-u_{RB}' (422/420) &=
-  \begin{cases}
-     0.5\times (u + 0.5), & \textrm{xChromaOffset = COSITED}\_\textrm{EVEN} \\
-     0.5\times u, & \textrm{xChromaOffset = MIDPOINT}
-  \end{cases} \\
-v_{RB}' (420) &=
-  \begin{cases}
-     0.5\times (v + 0.5), & \textrm{yChromaOffset = COSITED}\_\textrm{EVEN} \\
-     0.5\times v, & \textrm{yChromaOffset = MIDPOINT}
-  \end{cases}
-\end{aligned}
-++++++
-
-
-[[textures-sampler-YCbCr-conversion]]
-=== Sampler {YCbCr} Conversion
-
-Sampler {YCbCr} conversion performs the following operations, which an
-implementation may: combine into a single mathematical operation:
-
-  * <<textures-sampler-YCbCr-conversion-rangeexpand,Sampler {YCbCr} Range
-    Expansion>>
-  * <<textures-sampler-YCbCr-conversion-modelconversion,Sampler {YCbCr}
-    Model Conversion>>
-
-[[textures-sampler-YCbCr-conversion-rangeexpand]]
-==== Sampler {YCbCr} Range Expansion
-
-Sampler {YCbCr} range expansion is applied to color component values after
-all texel input operations which are not specific to sampler {YCbCr}
-conversion.
-For example, the input values to this stage have been converted using the
-normal <<textures-format-conversion,format conversion>> rules.
-
-Sampler {YCbCr} range expansion is not applied if pname:ycbcrModel is
-ename:VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY.
-That is, the shader receives the vector C'~rgba~ as output by the Component
-Swizzle stage without further modification.
-
-For other values of pname:ycbcrModel, range expansion is applied to the
-texel component values output by the <<textures-component-swizzle,Component
-Swizzle>> defined by the pname:components member of
-slink:VkSamplerYcbcrConversionCreateInfo.
-Range expansion applies independently to each component of the image.
-For the purposes of range expansion and {YCbCr} model conversion, the R and
-B components contain color difference (chroma) values and the G component
-contains luma.
-The A component is not modified by sampler {YCbCr} range expansion.
-
-The range expansion to be applied is defined by the pname:ycbcrRange member
-of the slink:VkSamplerYcbcrConversionCreateInfo structure:
-
-  * If pname:ycbcrRange is ename:VK_SAMPLER_YCBCR_RANGE_ITU_FULL, the
-    following transformations are applied:
-+
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-Y' &= C'_{rgba}[G] \\
-C_B &= C'_{rgba}[B] - {{2^{(n-1)}}\over{(2^n) - 1}} \\
-C_R &= C'_{rgba}[R] - {{2^{(n-1)}}\over{(2^n) - 1}}
-\end{aligned}
-+++++++++++++++++++
-+
-[NOTE]
-.Note
-====
-These formulae correspond to the "`full range`" encoding in the
-"`Quantization schemes`" chapter of the <<data-format,Khronos Data Format
-Specification>>.
-
-Should any future amendments be made to the ITU specifications from which
-these equations are derived, the formulae used by Vulkan may: also be
-updated to maintain parity.
-====
-  * If pname:ycbcrRange is ename:VK_SAMPLER_YCBCR_RANGE_ITU_NARROW, the
-    following transformations are applied:
-+
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-Y' &= {{C'_{rgba}[G] \times (2^n-1) - 16\times 2^{n-8}}\over{219\times 2^{n-8}}} \\
-C_B &= {{C'_{rgba}[B] \times \left(2^n-1\right) - 128\times 2^{n-8}}\over{224\times 2^{n-8}}} \\
-C_R &= {{C'_{rgba}[R] \times \left(2^n-1\right) - 128\times 2^{n-8}}\over{224\times 2^{n-8}}}
-\end{aligned}
-+++++++++++++++++++
-+
-[NOTE]
-.Note
-====
-These formulae correspond to the "`narrow range`" encoding in the
-"`Quantization schemes`" chapter of the <<data-format,Khronos Data Format
-Specification>>.
-====
-  * _n_ is the bit-depth of the components in the format.
-
-The precision of the operations performed during range expansion must: be at
-least that of the source format.
-
-An implementation may: clamp the results of these range expansion operations
-such that Y{prime} falls in the range [0,1], and/or such that C~B~ and C~R~
-fall in the range [-0.5,0.5].
-
-[[textures-sampler-YCbCr-conversion-modelconversion]]
-==== Sampler {YCbCr} Model Conversion
-
-The range-expanded values are converted between color models, according to
-the color model conversion specified in the pname:ycbcrModel member:
-
-ename:VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY::
-  The color components are not modified by the color model conversion since
-  they are assumed already to represent the desired color model in which the
-  shader is operating; {YCbCr} range expansion is also ignored.
-ename:VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY::
-  The color components are not modified by the color model conversion and
-  are assumed to be treated as though in {YCbCr} form both in memory and in
-  the shader; {YCbCr} range expansion is applied to the components as for
-  other {YCbCr} models, with the vector (C~R~,Y{prime},C~B~,A) provided to
-  the shader.
-ename:VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709::
-  The color components are transformed from a {YCbCr} representation to an
-  {RGBprime} representation as described in the "`BT.709 {YCbCr}
-  conversion`" section of the <<data-format,Khronos Data Format
-  Specification>>.
-ename:VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601::
-  The color components are transformed from a {YCbCr} representation to an
-  {RGBprime} representation as described in the "`BT.601 {YCbCr}
-  conversion`" section of the <<data-format,Khronos Data Format
-  Specification>>.
-ename:VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020::
-  The color components are transformed from a {YCbCr} representation to an
-  {RGBprime} representation as described in the "`BT.2020 {YCbCr}
-  conversion`" section of the <<data-format,Khronos Data Format
-  Specification>>.
-
-In this operation, each output component is dependent on each input
-component.
-
-An implementation may: clamp the {RGBprime} results of these conversions to
-the range [0,1].
-
-The precision of the operations performed during model conversion must: be
-at least that of the source format.
-
-The alpha component is not modified by these model conversions.
-
-[NOTE]
-.Note
-====
-Sampling operations in a non-linear color space can introduce color and
-intensity shifts at sharp transition boundaries.
-To avoid this issue, the technically precise color correction sequence
-described in the "`Introduction to Color Conversions`" chapter of the
-<<data-format,Khronos Data Format Specification>> may be performed as
-follows:
-
-  * Calculate the <<textures-normalized-to-unnormalized,unnormalized texel
-    coordinates>> corresponding to the desired sample position.
-  * For a pname:minFilter or pname:magFilter of ename:VK_FILTER_NEAREST:
-    . Calculate (_i_,_j_) for the sample location as described under the
-      "`nearest filtering`" formulae in <<textures-unnormalized-to-integer>>
-    . Calculate the normalized texel coordinates corresponding to these
-      integer coordinates.
-    . Sample using <<samplers-YCbCr-conversion,sampler {YCbCr} conversion>>
-      at this location.
-  * For a pname:minFilter or pname:magFilter of ename:VK_FILTER_LINEAR:
-    . Calculate (_i~[0,1]~_,_j~[0,1]~_) for the sample location as described
-      under the "`linear filtering`" formulae in
-      <<textures-unnormalized-to-integer>>
-    . Calculate the normalized texel coordinates corresponding to these
-      integer coordinates.
-    . Sample using <<samplers-YCbCr-conversion,sampler {YCbCr} conversion>>
-      at each of these locations.
-    . Convert the non-linear A{prime}{RGBprime} outputs of the {YCbCr}
-      conversions to linear ARGB values as described in the "`Transfer
-      Functions`" chapter of the <<data-format,Khronos Data Format
-      Specification>>.
-    . Interpolate the linear ARGB values using the [eq]#{alpha}# and
-      [eq]#{beta}# values described in the "`linear filtering`" section of
-      <<textures-unnormalized-to-integer>> and the equations in
-      <<textures-texel-filtering>>.
-
-The additional calculations and, especially, additional number of sampling
-operations in the ename:VK_FILTER_LINEAR case can be expected to have a
-performance impact compared with using the outputs directly.
-Since the variations from "`correct`" results are subtle for most content,
-the application author should determine whether a more costly implementation
-is strictly necessary.
-
-If pname:chromaFilter, and pname:minFilter or pname:magFilter are both
-ename:VK_FILTER_NEAREST, these operations are redundant and sampling using
-<<samplers-YCbCr-conversion,sampler {YCbCr} conversion>> at the desired
-sample coordinates will produce the "`correct`" results without further
-processing.
-====
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-
-== Texel Output Operations
-
-_Texel output instructions_ are SPIR-V image instructions that write to an
-image.
-_Texel output operations_ are a set of steps that are performed on state,
-coordinates, and texel values while processing a texel output instruction,
-and which are common to some or all texel output instructions.
-They include the following steps, which are performed in the listed order:
-
-  * <<textures-output-validation,Validation operations>>
-  ** <<textures-format-validation,Format validation>>
-  ** <<textures-type-validation,Type validation>>
-  ** <<textures-output-coordinate-validation,Coordinate validation>>
-  ** <<textures-output-sparse-validation,Sparse validation>>
-  * <<textures-output-format-conversion,Texel output format conversion>>
-
-[[textures-output-validation]]
-=== Texel Output Validation Operations
-
-_Texel output validation operations_ inspect instruction/image state or
-coordinates, and in certain circumstances cause the write to have no effect.
-There are a series of validations that the texel undergoes.
-
-
-[[textures-format-validation]]
-==== Texel Format Validation
-
-If the image format of the code:OpTypeImage is not
-<<spirvenv-image-formats,compatible>> with the sname:VkImageView's
-pname:format, the write causes the contents of the image's memory to become
-undefined:.
-
-
-[[textures-type-validation]]
-==== Texel Type Validation
-
-If the code:Sampled code:Type of the code:OpTypeImage does not match the
-type defined for the format, as specified in the _SPIR-V Sampled Type_
-column of the <<formats-numericformat>> table, the write causes the value of
-the texel to become undefined:.
-For integer types, if the <<spirvenv-image-signedness,signedness of the
-access>> does not match the signedness of the accessed resource, the write
-causes the value of the texel to become undefined:.
-
-
-[[textures-output-coordinate-validation]]
-=== Integer Texel Coordinate Validation
-
-The integer texel coordinates are validated according to the same rules as
-for texel input <<textures-integer-coordinate-validation,coordinate
-validation>>.
-
-If the texel fails integer texel coordinate validation, then the write has
-no effect.
-
-
-[[textures-output-sparse-validation]]
-=== Sparse Texel Operation
-
-If the texel attempts to write to an unbound region of a sparse image, the
-texel is a sparse unbound texel.
-In such a case, if the
-slink:VkPhysicalDeviceSparseProperties::pname:residencyNonResidentStrict
-property is ename:VK_TRUE, the sparse unbound texel write has no effect.
-If pname:residencyNonResidentStrict is ename:VK_FALSE, the write may: have a
-side effect that becomes visible to other accesses to unbound texels in any
-resource, but will not be visible to any device memory allocated by the
-application.
-
-
-[[textures-output-format-conversion]]
-=== Texel Output Format Conversion
-
-If the image format is sRGB, a linear to sRGB conversion is applied to the
-R, G, and B components as described in the "`sRGB EOTF`" section of the
-<<data-format,Khronos Data Format Specification>>.
-The A component, if present, is unchanged.
-
-Texels then undergo a format conversion from the floating point, signed, or
-unsigned integer type of the texel data to the elink:VkFormat of the image
-view.
-Any unused components are ignored.
-
-Each component is converted based on its type and size (as defined in the
-<<formats-definition,Format Definition>> section for each elink:VkFormat).
-Floating-point outputs are converted as described in
-<<fundamentals-fp-conversion,Floating-Point Format Conversions>> and
-<<fundamentals-fixedconv,Fixed-Point Data Conversion>>.
-Integer outputs are converted such that their value is preserved.
-The converted value of any integer that cannot be represented in the target
-format is undefined:.
-
-
-[[textures-normalized-operations]]
-== Normalized Texel Coordinate Operations
-
-If the image sampler instruction provides normalized texel coordinates, some
-of the following operations are performed.
-
-
-[[textures-projection]]
-=== Projection Operation
-
-For code:Proj image operations, the normalized texel coordinates
-[eq]#(s,t,r,q,a)# and (if present) the [eq]#D~ref~# coordinate are
-transformed as follows:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-s       & = \frac{s}{q},       & \text{for 1D, 2D, or 3D image} \\
-\\
-t       & = \frac{t}{q},       & \text{for 2D or 3D image} \\
-\\
-r       & = \frac{r}{q},       & \text{for 3D image} \\
-\\
-D_{\textit{ref}} & = \frac{D_{\textit{ref}}}{q}, & \text{if provided}
-\end{aligned}
-+++++++++++++++++++
-
-
-[[textures-derivative-image-operations]]
-=== Derivative Image Operations
-
-Derivatives are used for LOD selection.
-These derivatives are either implicit (in an code:ImplicitLod image
-instruction in a fragment shader) or explicit (provided explicitly by shader
-to the image instruction in any shader).
-
-For implicit derivatives image instructions, the derivatives of texel
-coordinates are calculated in the same manner as
-<<shaders-derivative-operations, derivative operations>>.
-That is:
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-\partial{s}/\partial{x} & = dPdx(s), & \partial{s}/\partial{y} & = dPdy(s), & \text{for 1D, 2D, Cube, or 3D image} \\
-\partial{t}/\partial{x} & = dPdx(t), & \partial{t}/\partial{y} & = dPdy(t), & \text{for 2D, Cube, or 3D image} \\
-\partial{r}/\partial{x} & = dPdx(r), & \partial{r}/\partial{y} & = dPdy(r), & \text{for Cube or 3D image}
-\end{aligned}
-+++++++++++++++++++
-
-Partial derivatives not defined above for certain image dimensionalities are
-set to zero.
-
-For explicit LOD image instructions, if the optional: SPIR-V operand
-code:Grad is provided, then the operand values are used for the derivatives.
-The number of components present in each derivative for a given image
-dimensionality matches the number of partial derivatives computed above.
-
-If the optional: SPIR-V operand code:Lod is provided, then derivatives are
-set to zero, the cube map derivative transformation is skipped, and the
-scale factor operation is skipped.
-Instead, the floating point scalar coordinate is directly assigned to
-[eq]#{lambda}~base~# as described in <<textures-level-of-detail-operation,
-Level-of-Detail Operation>>.
-
-ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-If the image or sampler object used by an implicit derivative image
-instruction is not uniform across the quad and
-<<limits-quadDivergentImplicitLod,pname:quadDivergentImplicitLod>> is not
-supported, then the derivative and LOD values are undefined:.
-Implicit derivatives are well-defined when the image and sampler and control
-flow are uniform across the quad, even if they diverge between different
-quads.
-
-If <<limits-quadDivergentImplicitLod,pname:quadDivergentImplicitLod>> is
-supported, then derivatives and implicit LOD values are well-defined even if
-the image or sampler object are not uniform within a quad.
-The derivatives are computed as specified above, and the implicit LOD
-calculation proceeds for each shader invocation using its respective image
-and sampler object.
-endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
-
-
-=== Cube Map Face Selection and Transformations
-
-For cube map image instructions, the [eq]#(s,t,r)# coordinates are treated
-as a direction vector [eq]#(r~x~,r~y~,r~z~)#.
-The direction vector is used to select a cube map face.
-The direction vector is transformed to a per-face texel coordinate system
-[eq]#(s~face~,t~face~)#, The direction vector is also used to transform the
-derivatives to per-face derivatives.
-
-
-=== Cube Map Face Selection
-
-The direction vector selects one of the cube map's faces based on the
-largest magnitude coordinate direction (the major axis direction).
-Since two or more coordinates can: have identical magnitude, the
-implementation must: have rules to disambiguate this situation.
-
-The rules should: have as the first rule that [eq]#r~z~# wins over
-[eq]#r~y~# and [eq]#r~x~#, and the second rule that [eq]#r~y~# wins over
-[eq]#r~x~#.
-An implementation may: choose other rules, but the rules must: be
-deterministic and depend only on [eq]#(r~x~,r~y~,r~z~)#.
-
-The layer number (corresponding to a cube map face), the coordinate
-selections for [eq]#s~c~#, [eq]#t~c~#, [eq]#r~c~#, and the selection of
-derivatives, are determined by the major axis direction as specified in the
-following two tables.
-
-.Cube map face and coordinate selection
-[width="75%",frame="all",options="header"]
-|====
-| Major Axis Direction | Layer Number | Cube Map Face | [eq]#s~c~#  | [eq]#t~c~#  | [eq]#r~c~#
-| [eq]#+r~x~#          | [eq]#0#      | Positive X    | [eq]#-r~z~# | [eq]#-r~y~# | [eq]#r~x~#
-| [eq]#-r~x~#          | [eq]#1#      | Negative X    | [eq]#+r~z~# | [eq]#-r~y~# | [eq]#r~x~#
-| [eq]#+r~y~#          | [eq]#2#      | Positive Y    | [eq]#+r~x~# | [eq]#+r~z~# | [eq]#r~y~#
-| [eq]#-r~y~#          | [eq]#3#      | Negative Y    | [eq]#+r~x~# | [eq]#-r~z~# | [eq]#r~y~#
-| [eq]#+r~z~#          | [eq]#4#      | Positive Z    | [eq]#+r~x~# | [eq]#-r~y~# | [eq]#r~z~#
-| [eq]#-r~z~#          | [eq]#5#      | Negative Z    | [eq]#-r~x~# | [eq]#-r~y~# | [eq]#r~z~#
-|====
-
-
-.Cube map derivative selection
-[width="75%",frame="all",options="header"]
-|====
-| Major Axis Direction | [eq]#{partial}s~c~ / {partial}x# | [eq]#{partial}s~c~ / {partial}y# | [eq]#{partial}t~c~ / {partial}x# | [eq]#{partial}t~c~ / {partial}y# | [eq]#{partial}r~c~ / {partial}x# | [eq]#{partial}r~c~ / {partial}y#
-
-| [eq]#+r~x~#
-| [eq]#-{partial}r~z~ / {partial}x# | [eq]#-{partial}r~z~ / {partial}y#
-| [eq]#-{partial}r~y~ / {partial}x# | [eq]#-{partial}r~y~ / {partial}y#
-| [eq]#+{partial}r~x~ / {partial}x# | [eq]#+{partial}r~x~ / {partial}y#
-
-| [eq]#-r~x~#
-| [eq]#+{partial}r~z~ / {partial}x# | [eq]#+{partial}r~z~ / {partial}y#
-| [eq]#-{partial}r~y~ / {partial}x# | [eq]#-{partial}r~y~ / {partial}y#
-| [eq]#-{partial}r~x~ / {partial}x# | [eq]#-{partial}r~x~ / {partial}y#
-
-| [eq]#+r~y~#
-| [eq]#+{partial}r~x~ / {partial}x# | [eq]#+{partial}r~x~ / {partial}y#
-| [eq]#+{partial}r~z~ / {partial}x# | [eq]#+{partial}r~z~ / {partial}y#
-| [eq]#+{partial}r~y~ / {partial}x# | [eq]#+{partial}r~y~ / {partial}y#
-
-| [eq]#-r~y~#
-| [eq]#+{partial}r~x~ / {partial}x# | [eq]#+{partial}r~x~ / {partial}y#
-| [eq]#-{partial}r~z~ / {partial}x# | [eq]#-{partial}r~z~ / {partial}y#
-| [eq]#-{partial}r~y~ / {partial}x# | [eq]#-{partial}r~y~ / {partial}y#
-
-| [eq]#+r~z~#
-| [eq]#+{partial}r~x~ / {partial}x# | [eq]#+{partial}r~x~ / {partial}y#
-| [eq]#-{partial}r~y~ / {partial}x# | [eq]#-{partial}r~y~ / {partial}y#
-| [eq]#+{partial}r~z~ / {partial}x# | [eq]#+{partial}r~z~ / {partial}y#
-
-| [eq]#-r~z~#
-| [eq]#-{partial}r~x~ / {partial}x# | [eq]#-{partial}r~x~ / {partial}y#
-| [eq]#-{partial}r~y~ / {partial}x# | [eq]#-{partial}r~y~ / {partial}y#
-| [eq]#-{partial}r~z~ / {partial}x# | [eq]#-{partial}r~z~ / {partial}y#
-|====
-
-
-=== Cube Map Coordinate Transformation
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-s_{\textit{face}} & =
-    \frac{1}{2} \times \frac{s_c}{|r_c|} + \frac{1}{2} \\
-t_{\textit{face}} & =
-    \frac{1}{2} \times \frac{t_c}{|r_c|} + \frac{1}{2} \\
-\end{aligned}
-++++++++++++++++++++++++
-
-
-=== Cube Map Derivative Transformation
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\frac{\partial{s_{\textit{face}}}}{\partial{x}} &=
-    \frac{\partial}{\partial{x}} \left ( \frac{1}{2} \times \frac{s_{c}}{|r_{c}|}
-    + \frac{1}{2}\right ) \\
-\frac{\partial{s_{\textit{face}}}}{\partial{x}} &=
-    \frac{1}{2} \times \frac{\partial}{\partial{x}}
-    \left ( \frac{s_{c}}{|r_{c}|}  \right ) \\
-\frac{\partial{s_{\textit{face}}}}{\partial{x}} &=
-    \frac{1}{2} \times
-    \left (
-    \frac{
-      |r_{c}| \times \partial{s_c}/\partial{x}
-      -s_c \times {\partial{r_{c}}}/{\partial{x}}}
-    {\left ( r_{c} \right )^2}
-    \right )
-\end{aligned}
-++++++++++++++++++++++++
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\frac{\partial{s_{\textit{face}}}}{\partial{y}} &=
-    \frac{1}{2} \times
-    \left (
-    \frac{
-      |r_{c}| \times \partial{s_c}/\partial{y}
-      -s_c \times {\partial{r_{c}}}/{\partial{y}}}
-    {\left ( r_{c} \right )^2}
-    \right )\\
-\frac{\partial{t_{\textit{face}}}}{\partial{x}} &=
-    \frac{1}{2} \times
-    \left (
-    \frac{
-      |r_{c}| \times \partial{t_c}/\partial{x}
-      -t_c \times {\partial{r_{c}}}/{\partial{x}}}
-    {\left ( r_{c} \right )^2}
-    \right ) \\
-\frac{\partial{t_{\textit{face}}}}{\partial{y}} &=
-    \frac{1}{2} \times
-    \left (
-    \frac{
-       |r_{c}| \times \partial{t_c}/\partial{y}
-      -t_c \times {\partial{r_{c}}}/{\partial{y}}}
-    {\left ( r_{c} \right )^2}
-    \right )
-\end{aligned}
-++++++++++++++++++++++++
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-(Bill) Note that we never revisited ARB_texture_cubemap after we introduced
-dependent texture fetches (ARB_fragment_program and ARB_fragment_shader).
-
-The derivatives of [eq]#s~face~# and [eq]#t~face~# are only valid for
-non-dependent texture fetches (pre OpenGL 2.0).
-====
-endif::editing-notes[]
-
-
-[[textures-lod-and-scale-factor]]
-=== Scale Factor Operation, Level-of-Detail Operation and Image Level(s) Selection
-
-LOD selection can: be either explicit (provided explicitly by the image
-instruction) or implicit (determined from a scale factor calculated from the
-derivatives).
-The LOD must: be computed with pname:mipmapPrecisionBits of accuracy.
-
-
-[[textures-scale-factor]]
-==== Scale Factor Operation
-
-The magnitude of the derivatives are calculated by:
-
-  {empty}:: [eq]#m~ux~ = {vert}{partial}s/{partial}x{vert} {times} w~base~#
-  {empty}:: [eq]#m~vx~ = {vert}{partial}t/{partial}x{vert} {times} h~base~#
-  {empty}:: [eq]#m~wx~ = {vert}{partial}r/{partial}x{vert} {times} d~base~#
-
-  {empty}:: [eq]#m~uy~ = {vert}{partial}s/{partial}y{vert} {times} w~base~#
-  {empty}:: [eq]#m~vy~ = {vert}{partial}t/{partial}y{vert} {times} h~base~#
-  {empty}:: [eq]#m~wy~ = {vert}{partial}r/{partial}y{vert} {times} d~base~#
-
-
-where:
-
-  {empty}:: [eq]#{partial}t/{partial}x = {partial}t/{partial}y = 0# (for 1D
-            images)
-  {empty}:: [eq]#{partial}r/{partial}x = {partial}r/{partial}y = 0# (for 1D,
-            2D or Cube images)
-
-and:
-
-  {empty}:: [eq]#w~base~ = image.w#
-  {empty}:: [eq]#h~base~ = image.h#
-  {empty}:: [eq]#d~base~ = image.d#
-
-(for the pname:baseMipLevel, from the image descriptor).
-
-ifdef::VK_NV_corner_sampled_image[]
-
-For corner-sampled images, the [eq]#w~base~#, [eq]#h~base~#, and
-[eq]#d~base~# are instead:
-
-  {empty}:: [eq]#w~base~ = image.w - 1#
-  {empty}:: [eq]#h~base~ = image.h - 1#
-  {empty}:: [eq]#d~base~ = image.d - 1#
-
-endif::VK_NV_corner_sampled_image[]
-
-A point sampled in screen space has an elliptical footprint in texture
-space.
-The minimum and maximum scale factors [eq]#({rho}~min~, {rho}~max~)# should:
-be the minor and major axes of this ellipse.
-
-The _scale factors_ [eq]#{rho}~x~# and [eq]#{rho}~y~#, calculated from the
-magnitude of the derivatives in x and y, are used to compute the minimum and
-maximum scale factors.
-
-[eq]#{rho}~x~# and [eq]#{rho}~y~# may: be approximated with functions
-[eq]#f~x~# and [eq]#f~y~#, subject to the following constraints:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-& f_x \text{\ is\ continuous\ and\ monotonically\ increasing\ in\ each\ of\ }
-    m_{ux},
-    m_{vx}, \text{\ and\ }
-    m_{wx} \\
-& f_y \text{\ is\ continuous\ and\ monotonically\ increasing\ in\ each\ of\ }
-    m_{uy},
-    m_{vy}, \text{\ and\ }
-    m_{wy}
-\end{aligned}
-++++++++++++++++++++++++
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\max(|m_{ux}|, |m_{vx}|, |m_{wx}|) \leq f_{x}
-\leq \sqrt{2} (|m_{ux}| + |m_{vx}| + |m_{wx}|) \\
-\max(|m_{uy}|, |m_{vy}|, |m_{wy}|) \leq f_{y}
-\leq \sqrt{2} (|m_{uy}| + |m_{vy}| + |m_{wy}|)
-\end{aligned}
-++++++++++++++++++++++++
-
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-(Bill) For reviewers only - anticipating questions.
-
-We only support implicit derivatives for normalized texel coordinates.
-
-So we are documenting the derivatives in s,t,r (normalized texel
-coordinates) rather than u,v,w (unnormalized texel coordinates) as in OpenGL
-and OpenGL ES specifications.
-(I know, u,v,w is the way it has been documented since OpenGL V1.0.)
-
-Also there is no reason to have conditional application of [eq]#w~base~,
-h~base~, d~base~# for rectangle textures either, since they do not support
-implicit derivatives.
-====
-endif::editing-notes[]
-
-
-The minimum and maximum scale factors [eq]#({rho}~min~,{rho}~max~)# are
-determined by:
-
-  {empty}:: [eq]#{rho}~max~ = max({rho}~x~, {rho}~y~)#
-  {empty}:: [eq]#{rho}~min~ = min({rho}~x~, {rho}~y~)#
-
-The ratio of anisotropy is determined by:
-
-  {empty}:: [eq]#{eta} = min({rho}~max~/{rho}~min~, max~Aniso~)#
-
-where:
-
-  {empty}:: [eq]#sampler.max~Aniso~ = pname:maxAnisotropy# (from sampler
-            descriptor)
-  {empty}:: [eq]#limits.max~Aniso~ = pname:maxSamplerAnisotropy# (from
-            physical device limits)
-  {empty}:: [eq]#max~Aniso~ = min(sampler.max~Aniso~, limits.max~Aniso~)#
-
-If [eq]#{rho}~max~ = {rho}~min~ = 0#, then all the partial derivatives are
-zero, the fragment's footprint in texel space is a point, and [eq]#{eta}#
-should: be treated as 1.
-If [eq]#{rho}~max~ {neq} 0# and [eq]#{rho}~min~ = 0# then all partial
-derivatives along one axis are zero, the fragment's footprint in texel space
-is a line segment, and [eq]#{eta}# should: be treated as [eq]#max~Aniso~#.
-However, anytime the footprint is small in texel space the implementation
-may: use a smaller value of [eq]#{eta}#, even when [eq]#{rho}~min~# is zero
-or close to zero.
-If either slink:VkPhysicalDeviceFeatures::pname:samplerAnisotropy or
-slink:VkSamplerCreateInfo::pname:anisotropyEnable are ename:VK_FALSE,
-[eq]#max~Aniso~# is set to 1.
-
-If [eq]#{eta} = 1#, sampling is isotropic.
-If [eq]#{eta} > 1#, sampling is anisotropic.
-
-The sampling rate ([eq]#N#) is derived as:
-
-  {empty}:: [eq]#N = {lceil}{eta}{rceil}#
-
-An implementation may: round [eq]#N# up to the nearest supported sampling
-rate.
-An implementation may: use the value of [eq]#N# as an approximation of
-[eq]#{eta}#.
-
-
-[[textures-level-of-detail-operation]]
-==== Level-of-Detail Operation
-
-The LOD parameter [eq]#{lambda}# is computed as follows:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\lambda_{base}(x,y) & =
-  \begin{cases}
-    shaderOp.Lod                                    & \text{(from optional SPIR-V operand)} \\
-    \log_2 \left ( \frac{\rho_{max}}{\eta} \right ) & \text{otherwise}
-  \end{cases} \\
-\lambda'(x,y)       & = \lambda_{base} + \mathbin{clamp}(sampler.bias + shaderOp.bias,-maxSamplerLodBias,maxSamplerLodBias) \\
-\lambda             & =
-  \begin{cases}
-    lod_{max}, & \lambda' > lod_{max} \\
-    \lambda',  & lod_{min} \leq \lambda' \leq lod_{max} \\
-    lod_{min}, & \lambda' < lod_{min} \\
-    \textit{undefined}, & lod_{min} > lod_{max}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-where:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-sampler.bias       & = mipLodBias & \text{(from sampler descriptor)} \\
-shaderOp.bias      & =
-  \begin{cases}
-    Bias & \text{(from optional SPIR-V operand)} \\
-    0    & \text{otherwise}
-  \end{cases} \\
-sampler.lod_{min}  & = minLod & \text{(from sampler descriptor)} \\
-shaderOp.lod_{min} & =
-  \begin{cases}
-    MinLod & \text{(from optional SPIR-V operand)} \\
-    0      & \text{otherwise}
-  \end{cases} \\
-\\
-lod_{min}          & = \max(sampler.lod_{min}, shaderOp.lod_{min}) \\
-lod_{max}          & = maxLod & \text{(from sampler descriptor)}
-\end{aligned}
-++++++++++++++++++++++++
-
-and [eq]#maxSamplerLodBias# is the value of the slink:VkPhysicalDeviceLimits
-feature <<limits-maxSamplerLodBias,pname:maxSamplerLodBias>>.
-
-
-[[textures-image-level-selection]]
-==== Image Level(s) Selection
-
-The image level(s) [eq]#d#, [eq]#d~hi~#, and [eq]#d~lo~# which texels are
-read from are determined by an image-level parameter [eq]#d~l~#, which is
-computed based on the LOD parameter, as follows:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-d_{l} =
-  \begin{cases}
-    nearest(d'),  & \text{mipmapMode is VK\_SAMPLER\_MIPMAP\_MODE\_NEAREST} \\
-    d',           & \text{otherwise}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-where:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-d' = level_{base} + \text{clamp}(\lambda, 0, q)
-\end{aligned}
-++++++++++++++++++++++++
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-nearest(d') & =
-  \begin{cases}
-    \left \lceil d' + 0.5\right \rceil - 1, &
-        \text{preferred} \\
-    \left \lfloor d' + 0.5\right \rfloor,   &
-        \text{alternative}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-and:
-
-  {empty}:: [eq]#level~base~ = pname:baseMipLevel#
-  {empty}:: [eq]#q = pname:levelCount - 1#
-
-pname:baseMipLevel and pname:levelCount are taken from the
-pname:subresourceRange of the image view.
-
-If the sampler's pname:mipmapMode is ename:VK_SAMPLER_MIPMAP_MODE_NEAREST,
-then the level selected is [eq]#d = d~l~#.
-
-If the sampler's pname:mipmapMode is ename:VK_SAMPLER_MIPMAP_MODE_LINEAR,
-two neighboring levels are selected:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-d_{hi} & = \left\lfloor d_{l} \right\rfloor \\
-d_{lo} & = min( d_{hi} + 1, q ) \\
-\delta & = d_{l} - d_{hi}
-\end{aligned}
-++++++++++++++++++++++++
-
-[eq]#{delta}# is the fractional value, quantized to the number of
-<<limits-mipmapPrecisionBits,mipmap precision bits>>, used for
-<<textures-texel-filtering, linear filtering>> between levels.
-
-[[textures-normalized-to-unnormalized]]
-=== (s,t,r,q,a) to (u,v,w,a) Transformation
-
-The normalized texel coordinates are scaled by the image level dimensions
-and the array layer is selected.
-
-This transformation is performed once for each level used in
-<<textures-texel-filtering,filtering>> (either [eq]#d#, or [eq]#d~hi~# and
-[eq]#d~lo~#).
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-u(x,y) & = s(x,y) \times width_{scale} + \Delta_i\\
-v(x,y) & =
-  \begin{cases}
-    0                         & \text{for 1D images} \\
-    t(x,y) \times height_{scale} + \Delta_j & \text{otherwise}
-  \end{cases} \\
-w(x,y) & =
-  \begin{cases}
-    0                         & \text{for 2D or Cube images} \\
-    r(x,y) \times depth_{scale}  + \Delta_k & \text{otherwise}
-  \end{cases} \\
-\\
-a(x,y) & =
-  \begin{cases}
-    a(x,y)                    & \text{for array images} \\
-    0                         & \text{otherwise}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-where:
-
-  {empty}:: [eq]#width~scale~ = width~level~#
-  {empty}:: [eq]#height~scale~ = height~level~#
-  {empty}:: [eq]#depth~scale~ = depth~level~#
-
-ifdef::VK_NV_corner_sampled_image[]
-for conventional images, and:
-
-  {empty}:: [eq]#width~scale~ = width~level~ - 1#
-  {empty}:: [eq]#height~scale~ = height~level~ - 1#
-  {empty}:: [eq]#depth~scale~ = depth~level~ - 1#
-
-for corner-sampled images.
-endif::VK_NV_corner_sampled_image[]
-
-and where [eq]#({DeltaUpper}~i~, {DeltaUpper}~j~, {DeltaUpper}~k~)# are
-taken from the image instruction if it includes a code:ConstOffset or
-code:Offset operand, otherwise they are taken to be zero.
-
-
-Operations then proceed to Unnormalized Texel Coordinate Operations.
-
-
-== Unnormalized Texel Coordinate Operations
-
-
-[[textures-unnormalized-to-integer]]
-=== (u,v,w,a) to (i,j,k,l,n) Transformation And Array Layer Selection
-
-The unnormalized texel coordinates are transformed to integer texel
-coordinates relative to the selected mipmap level.
-
-The layer index [eq]#l# is computed as:
-
-  {empty}:: [eq]#l = clamp(RNE(a), 0, pname:layerCount - 1) {plus}
-            pname:baseArrayLayer#
-
-where pname:layerCount is the number of layers in the image subresource
-range of the image view, pname:baseArrayLayer is the first layer from the
-subresource range, and where:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\mathbin{RNE}(a) & =
-  \begin{cases}
-    \mathbin{roundTiesToEven}(a)                  & \text{preferred, from IEEE Std 754-2008 Floating-Point Arithmetic} \\
-    \left \lfloor a + 0.5 \right \rfloor & \text{alternative}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-The sample index [eq]#n# is assigned the value 0.
-
-Nearest filtering (ename:VK_FILTER_NEAREST) computes the integer texel
-coordinates that the unnormalized coordinates lie within:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-i &= \left\lfloor u + shift \right\rfloor \\
-j &= \left\lfloor v + shift \right\rfloor \\
-k &= \left\lfloor w + shift \right\rfloor
-\end{aligned}
-++++++++++++++++++++++++
-where:
-
-  {empty}:: [eq]#shift = 0.0#
-
-ifdef::VK_NV_corner_sampled_image[]
-for conventional images, and:
-
-  {empty}:: [eq]#shift = 0.5#
-
-for corner-sampled images.
-endif::VK_NV_corner_sampled_image[]
-
-Linear filtering (ename:VK_FILTER_LINEAR) computes a set of neighboring
-coordinates which bound the unnormalized coordinates.
-The integer texel coordinates are combinations of [eq]#i~0~# or [eq]#i~1~#,
-[eq]#j~0~# or [eq]#j~1~#, [eq]#k~0~# or [eq]#k~1~#, as well as weights
-[eq]#{alpha}, {beta}#, and [eq]#{gamma}#.
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-i_0 &= \left\lfloor u - shift \right\rfloor \\
-i_1 &= i_0 + 1 \\
-j_0 &= \left\lfloor v - shift \right\rfloor \\
-j_1 &= j_0 + 1 \\
-k_0 &= \left\lfloor w - shift \right\rfloor \\
-k_1 &= k_0 + 1
-\end{aligned}
-++++++++++++++++++++++++
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\alpha &= \mathbin{frac}\left(u - shift\right)  \\[1em]
-\beta &= \mathbin{frac}\left(v - shift\right)  \\[1em]
-\gamma &= \mathbin{frac}\left(w - shift\right)
-\end{aligned}
-++++++++++++++++++++++++
-
-where:
-
-  {empty}:: [eq]#shift = 0.5#
-
-ifdef::VK_NV_corner_sampled_image[]
-for conventional images, and:
-
-  {empty}:: [eq]#shift = 0.0#
-
-for corner-sampled images,
-endif::VK_NV_corner_sampled_image[]
-and where:
-
-[latexmath]
-++++++++++++++++++++++++
-\mathbin{frac}(x) = x -  \left\lfloor x \right\rfloor
-++++++++++++++++++++++++
-where the number of fraction bits retained is specified by
-sname:VkPhysicalDeviceLimits::pname:subTexelPrecisionBits.
-
-ifdef::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-Cubic filtering (ename:VK_FILTER_CUBIC_EXT) computes a set of neighboring
-coordinates which bound the unnormalized coordinates.
-The integer texel coordinates are combinations of [eq]#i~0~#, [eq]#i~1~#,
-[eq]#i~2~# or [eq]#i~3~#, [eq]#j~0~#, [eq]#j~1~#, [eq]#j~2~# or [eq]#j~3~#,
-ifndef::VK_EXT_filter_cubic[]
-as well as weights [eq]#{alpha}# and [eq]#{beta}#.
-endif::VK_EXT_filter_cubic[]
-ifdef::VK_EXT_filter_cubic[]
-[eq]#k~0~#, [eq]#k~1~#, [eq]#k~2~# or [eq]#k~3~#, as well as weights
-[eq]#{alpha}#, [eq]#{beta}#, and [eq]#{gamma}#.
-endif::VK_EXT_filter_cubic[]
-
-ifndef::VK_EXT_filter_cubic[]
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-i_{0}  & = {\left \lfloor {u - \frac{3}{2}} \right \rfloor} & i_{1} & = i_{0} + 1 & i_{2} & = i_{1} + 1 & i_{3} & = i_{2} + 1 \\[1em]
-j_{0}  & = {\left \lfloor {v - \frac{3}{2}} \right \rfloor} & j_{1} & = j_{0} + 1 & j_{2} & = j_{1} + 1 & j_{3} & = j_{2} + 1
-\end{aligned}
-++++++++++++++++++++++++
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-alpha &= \mathbin{frac}\left(u - \frac{1}{2}\right)  \\[1em]
-\beta &= \mathbin{frac}\left(v - \frac{1}{2}\right)
-\end{aligned}
-++++++++++++++++++++++++
-
-endif::VK_EXT_filter_cubic[]
-
-ifdef::VK_EXT_filter_cubic[]
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-i_{0}  & = {\left \lfloor {u - \frac{3}{2}} \right \rfloor} & i_{1} & = i_{0} + 1 & i_{2} & = i_{1} + 1 & i_{3} & = i_{2} + 1 \\[1em]
-j_{0}  & = {\left \lfloor {v - \frac{3}{2}} \right \rfloor} & j_{1} & = j_{0} + 1 & j_{2} & = j_{1} + 1 & j_{3} & = j_{2} + 1 \\[1em]
-k_{0}  & = {\left \lfloor {w - \frac{3}{2}} \right \rfloor} & k_{1} & = k_{0} + 1 & k_{2} & = k_{1} + 1 & k_{3} & = k_{2} + 1
-\end{aligned}
-++++++++++++++++++++++++
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\alpha &= \mathbin{frac}\left(u - \frac{1}{2}\right)  \\[1em]
-\beta &= \mathbin{frac}\left(v - \frac{1}{2}\right)  \\[1em]
-\gamma &= \mathbin{frac}\left(w - \frac{1}{2}\right)
-\end{aligned}
-++++++++++++++++++++++++
-
-endif::VK_EXT_filter_cubic[]
-
-where:
-
-[latexmath]
-++++++++++++++++++++++++
-\mathbin{frac}(x) = x -  \left\lfloor x \right\rfloor
-++++++++++++++++++++++++
-
-where the number of fraction bits retained is specified by
-sname:VkPhysicalDeviceLimits::pname:subTexelPrecisionBits.
-endif::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-
-
-[[textures-integer-coordinate-operations]]
-== Integer Texel Coordinate Operations
-
-ifdef::VK_AMD_shader_image_load_store_lod[]
-Integer texel coordinate operations may: supply a LOD which texels are to be
-read from or written to using the optional SPIR-V operand code:Lod.
-endif::VK_AMD_shader_image_load_store_lod[]
-ifndef::VK_AMD_shader_image_load_store_lod[]
-The code:OpImageFetch and code:OpImageFetchSparse SPIR-V instructions may:
-supply a LOD from which texels are to be fetched using the optional SPIR-V
-operand code:Lod.
-Other integer-coordinate operations must: not.
-endif::VK_AMD_shader_image_load_store_lod[]
-If the code:Lod is provided then it must: be an integer.
-
-The image level selected is:
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-d & = level_{base} +
-  \begin{cases}
-    Lod & \text{(from optional SPIR-V operand)} \\
-    0   & \text{otherwise}
-  \end{cases} \\
-\end{aligned}
-++++++++++++++++++++++++
-
-If [eq]#d# does not lie in the range [eq]#[pname:baseMipLevel,
-pname:baseMipLevel {plus} pname:levelCount)# then any values fetched are
-ifdef::VK_EXT_robustness2[]
-zero if <<features-robustImageAccess2,pname:robustImageAccess2>> is enabled,
-otherwise are
-endif::VK_EXT_robustness2[]
-undefined:, and any writes (if supported) are discarded.
-
-
-[[textures-sample-operations]]
-== Image Sample Operations
-
-
-[[textures-wrapping-operation]]
-=== Wrapping Operation
-
-code:Cube images ignore the wrap modes specified in the sampler.
-Instead, if ename:VK_FILTER_NEAREST is used within a mip level then
-ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE is used, and if
-ename:VK_FILTER_LINEAR is used within a mip level then sampling at the edges
-is performed as described earlier in the <<textures-cubemapedge,Cube map
-edge handling>> section.
-
-The first integer texel coordinate i is transformed based on the
-pname:addressModeU parameter of the sampler.
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-i &=
-  \begin{cases}
-    i \bmod size                                & \text{for repeat} \\
-    (size - 1) - \mathbin{mirror}
-        ((i \bmod (2 \times size)) - size)      & \text{for mirrored repeat} \\
-    \mathbin{clamp}(i,0,size-1)                  & \text{for clamp to edge} \\
-    \mathbin{clamp}(i,-1,size)                   & \text{for clamp to border} \\
-    \mathbin{clamp}(\mathbin{mirror}(i),0,size-1) & \text{for mirror clamp to edge}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-where:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-& \mathbin{mirror}(n) =
-  \begin{cases}
-    n      & \text{for}\  n \geq 0 \\
-    -(1+n) & \text{otherwise}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-[eq]#j# (for 2D and Cube image) and [eq]#k# (for 3D image) are similarly
-transformed based on the pname:addressModeV and pname:addressModeW
-parameters of the sampler, respectively.
-
-
-[[textures-gather]]
-=== Texel Gathering
-
-SPIR-V instructions with code:Gather in the name return a vector derived
-from 4 texels in the base level of the image view.
-The rules for the ename:VK_FILTER_LINEAR minification filter are applied to
-identify the four selected texels.
-Each texel is then converted to an RGBA value according to
-<<textures-conversion-to-rgba,conversion to RGBA>> and then
-<<textures-component-swizzle,swizzled>>.
-A four-component vector is then assembled by taking the component indicated
-by the code:Component value in the instruction from the swizzled color value
-of the four texels.
-If the operation does not use the code:ConstOffsets image operand then the
-four texels form the 2 {times} 2 rectangle used for texture filtering:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau[R] &= \tau_{i0j1}[level_{base}][comp] \\
-\tau[G] &= \tau_{i1j1}[level_{base}][comp] \\
-\tau[B] &= \tau_{i1j0}[level_{base}][comp] \\
-\tau[A] &= \tau_{i0j0}[level_{base}][comp]
-\end{aligned}
-++++++++++++++++++++++++
-
-If the operation does use the code:ConstOffsets image operand then the
-offsets allow a custom filter to be defined:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau[R] &= \tau_{i0j0 + \Delta_0}[level_{base}][comp] \\
-\tau[G] &= \tau_{i0j0 + \Delta_1}[level_{base}][comp] \\
-\tau[B] &= \tau_{i0j0 + \Delta_2}[level_{base}][comp] \\
-\tau[A] &= \tau_{i0j0 + \Delta_3}[level_{base}][comp]
-\end{aligned}
-++++++++++++++++++++++++
-
-where:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau[level_{base}][comp] &=
-  \begin{cases}
-    \tau[level_{base}][R], & \text{for}\  comp = 0 \\
-    \tau[level_{base}][G], & \text{for}\  comp = 1 \\
-    \tau[level_{base}][B], & \text{for}\  comp = 2 \\
-    \tau[level_{base}][A], & \text{for}\  comp = 3
-  \end{cases}\\
-comp & \,\text{from SPIR-V operand Component}
-\end{aligned}
-++++++++++++++++++++++++
-
-ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-code:OpImage*Gather must: not be used on a sampled image with
-<<samplers-YCbCr-conversion,sampler {YCbCr} conversion>> enabled.
-endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
-
-
-[[textures-texel-filtering]]
-=== Texel Filtering
-
-Texel filtering is first performed for each level (either [eq]#d# or
-[eq]#d~hi~# and [eq]#d~lo~#).
-
-If [eq]#{lambda}# is less than or equal to zero, the texture is said to be
-_magnified_, and the filter mode within a mip level is selected by the
-pname:magFilter in the sampler.
-If [eq]#{lambda}# is greater than zero, the texture is said to be
-_minified_, and the filter mode within a mip level is selected by the
-pname:minFilter in the sampler.
-
-[[textures-texel-nearest-filtering]]
-==== Texel Nearest Filtering
-
-Within a mip level, ename:VK_FILTER_NEAREST filtering selects a single value
-using the [eq]#(i, j, k)# texel coordinates, with all texels taken from
-layer l.
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau[level] &=
-  \begin{cases}
-     \tau_{ijk}[level], & \text{for 3D image} \\
-     \tau_{ij}[level],  & \text{for 2D or Cube image} \\
-     \tau_{i}[level],   & \text{for 1D image}
-   \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-[[textures-texel-linear-filtering]]
-==== Texel Linear Filtering
-
-Within a mip level, ename:VK_FILTER_LINEAR filtering combines 8 (for 3D), 4
-(for 2D or Cube), or 2 (for 1D) texel values, together with their linear
-weights.
-The linear weights are derived from the fractions computed earlier:
-
-[latexmath]
-
-++++++++++++++++++++++++
-\begin{aligned}
-w_{i_0} &= (1-\alpha) \\
-w_{i_1} &= (\alpha)   \\
-w_{j_0} &= (1-\beta)  \\
-w_{j_1} &= (\beta)    \\
-w_{k_0} &= (1-\gamma) \\
-w_{k_1} &= (\gamma)
-\end{aligned}
-++++++++++++++++++++++++
-
-ifndef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-The values of multiple texels, together with their weights, are combined
-using a weighted average to produce a filtered value:
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-The values of multiple texels, together with their weights, are combined to
-produce a filtered value.
-
-The slink:VkSamplerReductionModeCreateInfo::pname:reductionMode can: control
-the process by which multiple texels, together with their weights, are
-combined to produce a filtered texture value.
-
-When the pname:reductionMode is set (explicitly or implicitly) to
-ename:VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE, a weighted average is
-computed:
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau_{3D} &= \sum_{k=k_0}^{k_1}\sum_{j=j_0}^{j_1}\sum_{i=i_0}^{i_1}(w_{i})(w_{j})(w_{k})\tau_{ijk} \\
-\tau_{2D} &= \sum_{j=j_0}^{j_1}\sum_{i=i_0}^{i_1}(w_{i})(w_{j})\tau_{ij} \\
-\tau_{1D} &= \sum_{i=i_0}^{i_1}(w_{i})\tau_{i}
-\end{aligned}
-++++++++++++++++++++++++
-
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-However, if the reduction mode is ename:VK_SAMPLER_REDUCTION_MODE_MIN or
-ename:VK_SAMPLER_REDUCTION_MODE_MAX, the process operates on the above set
-of multiple texels, together with their weights, computing a component-wise
-minimum or maximum, respectively, of the components of the set of texels
-with non-zero weights.
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-
-ifdef::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-
-[[textures-texel-cubic-filtering]]
-==== Texel Cubic Filtering
-
-Within a mip level, ename:VK_FILTER_CUBIC_EXT, filtering computes a weighted
-average of
-ifdef::VK_EXT_filter_cubic[]
-64 (for 3D),
-endif::VK_EXT_filter_cubic[]
-16 (for 2D), or 4 (for 1D) texel values, together with their Catmull-Rom
-weights.
-
-Catmull-Rom weights are derived from the fractions computed earlier.
-
-ifndef::VK_EXT_filter_cubic[]
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\begin{bmatrix}
-w_{i_0}\phantom{,} w_{i_1}\phantom{,} w_{i_2}\phantom{,} w_{i_3}
-\end{bmatrix}
-= \frac{1}{2}
-\begin{bmatrix}
-1 & \alpha & \alpha^2 & \alpha^3
-\end{bmatrix}
-\begin{bmatrix}
-\phantom{-}0 &  \phantom{-}2 &  \phantom{-}0 &  \phantom{-}0 \\
--1 &  \phantom{-}0 &  \phantom{-}1 &  \phantom{-}0 \\
-\phantom{-}2 & -5 &  \phantom{-}4 &  -1 \\
--1 &  \phantom{-}3 & -3 &  \phantom{-}1
-\end{bmatrix}
-\\
-\begin{bmatrix}
-w_{j_0}\phantom{,} w_{j_1}\phantom{,} w_{j_2}\phantom{,} w_{j_3}
-\end{bmatrix}
-= \frac{1}{2}
-\begin{bmatrix}
-1 & \beta & \beta^2 & \beta^3
-\end{bmatrix}
-\begin{bmatrix}
-\phantom{-}0 &  \phantom{-}2 &  \phantom{-}0 &  \phantom{-}0 \\
--1 &  \phantom{-}0 &  \phantom{-}1 &  \phantom{-}0 \\
-\phantom{-}2 & -5 &  \phantom{-}4 &  -1 \\
--1 &  \phantom{-}3 & -3 &  \phantom{-}1
-\end{bmatrix}
-\end{aligned}
-++++++++++++++++++++++++
-
-The values of multiple texels, together with their weights, are combined
-using a weighted average to produce a filtered value:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau_{2D} &= \sum_{j=j_0}^{j_3}\sum_{i=i_0}^{i_3}(w_{i})(w_{j})\tau_{ij} \\
-\tau_{1D} &= \sum_{i=i_0}^{i_3}(w_{i})\tau_{i}
-\end{aligned}
-++++++++++++++++++++++++
-endif::VK_EXT_filter_cubic[]
-
-ifdef::VK_EXT_filter_cubic[]
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\begin{bmatrix}
-w_{i_0}\phantom{,} w_{i_1}\phantom{,} w_{i_2}\phantom{,} w_{i_3}
-\end{bmatrix}
-= \frac{1}{2}
-\begin{bmatrix}
-1 & \alpha & \alpha^2 & \alpha^3
-\end{bmatrix}
-\begin{bmatrix}
-\phantom{-}0 &  \phantom{-}2 &  \phantom{-}0 &  \phantom{-}0 \\
--1 &  \phantom{-}0 &  \phantom{-}1 &  \phantom{-}0 \\
-\phantom{-}2 & -5 &  \phantom{-}4 &  -1 \\
--1 &  \phantom{-}3 & -3 &  \phantom{-}1
-\end{bmatrix}
-\\
-\begin{bmatrix}
-w_{j_0}\phantom{,} w_{j_1}\phantom{,} w_{j_2}\phantom{,} w_{j_3}
-\end{bmatrix}
-= \frac{1}{2}
-\begin{bmatrix}
-1 & \beta & \beta^2 & \beta^3
-\end{bmatrix}
-\begin{bmatrix}
-\phantom{-}0 &  \phantom{-}2 &  \phantom{-}0 &  \phantom{-}0 \\
--1 &  \phantom{-}0 &  \phantom{-}1 &  \phantom{-}0 \\
-\phantom{-}2 & -5 &  \phantom{-}4 &  -1 \\
--1 &  \phantom{-}3 & -3 &  \phantom{-}1
-\end{bmatrix}
-\\
-\begin{bmatrix}
-w_{k_0}\phantom{,} w_{k_1}\phantom{,} w_{k_2}\phantom{,} w_{k_3}
-\end{bmatrix}
-= \frac{1}{2}
-\begin{bmatrix}
-1 & \gamma & \gamma^2 & \gamma^3
-\end{bmatrix}
-\begin{bmatrix}
-\phantom{-}0 &  \phantom{-}2 &  \phantom{-}0 &  \phantom{-}0 \\
--1 &  \phantom{-}0 &  \phantom{-}1 &  \phantom{-}0 \\
-\phantom{-}2 & -5 &  \phantom{-}4 &  -1 \\
--1 &  \phantom{-}3 & -3 &  \phantom{-}1
-\end{bmatrix}
-\end{aligned}
-++++++++++++++++++++++++
-
-The values of multiple texels, together with their weights, are combined to
-produce a filtered value.
-
-The slink:VkSamplerReductionModeCreateInfo::pname:reductionMode can: control
-the process by which multiple texels, together with their weights, are
-combined to produce a filtered texture value.
-
-When the pname:reductionMode is set (explicitly or implicitly) to
-ename:VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE, a weighted average is
-computed:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau_{3D} &= \sum_{k=j_0}^{k_3}\sum_{j=j_0}^{j_3}\sum_{i=i_0}^{i_3}(w_{i})(w_{j})(w_{k})\tau_{ijk} \\
-\tau_{2D} &= \sum_{j=j_0}^{j_3}\sum_{i=i_0}^{i_3}(w_{i})(w_{j})\tau_{ij} \\
-\tau_{1D} &= \sum_{i=i_0}^{i_3}(w_{i})\tau_{i}
-\end{aligned}
-++++++++++++++++++++++++
-
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-However, if the reduction mode is ename:VK_SAMPLER_REDUCTION_MODE_MIN or
-ename:VK_SAMPLER_REDUCTION_MODE_MAX, the process operates on the above set
-of multiple texels, together with their weights, computing a component-wise
-minimum or maximum, respectively, of the components of the set of texels
-with non-zero weights.
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-
-endif::VK_EXT_filter_cubic[]
-endif::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
-
-[[textures-texel-mipmap-filtering]]
-
-==== Texel Mipmap Filtering
-
-ename:VK_SAMPLER_MIPMAP_MODE_NEAREST filtering returns the value of a single
-mipmap level,
-
-[eq]#{tau} = {tau}[d]#.
-
-ename:VK_SAMPLER_MIPMAP_MODE_LINEAR filtering combines the values of
-multiple mipmap levels ({tau}[hi] and {tau}[lo]), together with their linear
-weights.
-
-The linear weights are derived from the fraction computed earlier:
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-w_{hi} &= (1-\delta) \\
-w_{lo} &= (\delta)   \\
-\end{aligned}
-++++++++++++++++++++++++
-
-ifndef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-The values of multiple mipmap levels together with their linear weights, are
-combined using a weighted average to produce a final filtered value:
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-The values of multiple mipmap levels, together with their weights, are
-combined to produce a final filtered value.
-
-The slink:VkSamplerReductionModeCreateInfo::pname:reductionMode can: control
-the process by which multiple texels, together with their weights, are
-combined to produce a filtered texture value.
-
-When the pname:reductionMode is set (explicitly or implicitly) to
-ename:VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE, a weighted average is
-computed:
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau &= (w_{hi})\tau[hi]+(w_{lo})\tau[lo]
-\end{aligned}
-++++++++++++++++++++++++
-
-[[textures-texel-anisotropic-filtering]]
-==== Texel Anisotropic Filtering
-
-Anisotropic filtering is enabled by the pname:anisotropyEnable in the
-sampler.
-When enabled, the image filtering scheme accounts for a degree of
-anisotropy.
-
-The particular scheme for anisotropic texture filtering is
-implementation-dependent.
-Implementations should: consider the pname:magFilter, pname:minFilter and
-pname:mipmapMode of the sampler to control the specifics of the anisotropic
-filtering scheme used.
-In addition, implementations should: consider pname:minLod and pname:maxLod
-of the sampler.
-
-The following describes one particular approach to implementing anisotropic
-filtering for the 2D Image case, implementations may: choose other methods:
-
-Given a pname:magFilter, pname:minFilter of ename:VK_FILTER_LINEAR and a
-pname:mipmapMode of ename:VK_SAMPLER_MIPMAP_MODE_NEAREST:
-
-Instead of a single isotropic sample, N isotropic samples are sampled within
-the image footprint of the image level [eq]#d# to approximate an anisotropic
-filter.
-The sum [eq]#{tau}~2Daniso~# is defined using the single isotropic
-[eq]#{tau}~2D~(u,v)# at level [eq]#d#.
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau_{2Daniso} & =
-     \frac{1}{N}\sum_{i=1}^{N}
-     {\tau_{2D}\left (
-       u \left ( x - \frac{1}{2} + \frac{i}{N+1} , y \right ),
-         \left ( v \left (x-\frac{1}{2}+\frac{i}{N+1}, y \right ),
-\right )
-     \right )},
-     & \text{when}\  \rho_{x} > \rho_{y} \\
-\tau_{2Daniso} &=
-     \frac{1}{N}\sum_{i=1}^{N}
-     {\tau_{2D}\left (
-        u \left  ( x, y - \frac{1}{2} + \frac{i}{N+1} \right ),
-          \left ( v \left (x,y-\frac{1}{2}+\frac{i}{N+1} \right )
-\right )
-     \right )},
-     & \text{when}\  \rho_{y} \geq \rho_{x}
-\end{aligned}
-++++++++++++++++++++++++
-
-ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-When slink:VkSamplerReductionModeCreateInfo::pname:reductionMode is set to
-ename:VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE, the above summation is
-used.
-However, if the reduction mode is ename:VK_SAMPLER_REDUCTION_MODE_MIN or
-ename:VK_SAMPLER_REDUCTION_MODE_MAX, the process operates on the above
-values, together with their weights, computing a component-wise minimum or
-maximum, respectively, of the components of the values with non-zero
-weights.
-endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
-
-
-ifdef::VK_NV_shader_image_footprint[]
-[[textures-footprint]]
-== Texel Footprint Evaluation
-
-The SPIR-V instruction code:OpImageSampleFootprintNV evaluates the set of
-texels from a single mip level that would be accessed during a
-<<textures-texel-filtering, texel filtering>> operation.
-In addition to the inputs that would be accepted by an equivalent
-code:OpImageSample* instruction, code:OpImageSampleFootprintNV accepts two
-additional inputs.
-The code:Granularity input is an integer identifying the size of texel
-groups used to evaluate the footprint.
-Each bit in the returned footprint mask corresponds to an aligned block of
-texels whose size is given by the following table:
-
-.Texel footprint granularity values
-[width="50%",options="header"]
-|=====
-| code:Granularity  | code:Dim = 2D |  code:Dim = 3D
-|         0         |  unsupported  |  unsupported
-|         1         |      2x2      |     2x2x2
-|         2         |      4x2      |  unsupported
-|         3         |      4x4      |     4x4x2
-|         4         |      8x4      |  unsupported
-|         5         |      8x8      |  unsupported
-|         6         |     16x8      |  unsupported
-|         7         |     16x16     |  unsupported
-|         8         |  unsupported  |  unsupported
-|         9         |  unsupported  |  unsupported
-|         10        |  unsupported  |    16x16x16
-|         11        |     64x64     |    32x16x16
-|         12        |    128x64     |    32x32x16
-|         13        |    128x128    |    32x32x32
-|         14        |    256x128    |    64x32x32
-|         15        |    256x256    |  unsupported
-|=====
-
-The code:Coarse input is used to select between the two mip levels that may:
-be accessed during texel filtering when using a pname:mipmapMode of
-ename:VK_SAMPLER_MIPMAP_MODE_LINEAR.
-When filtering between two mip levels, a code:Coarse value of code:true
-requests the footprint in the lower-resolution mip level (higher level
-number), while code:false requests the footprint in the higher-resolution
-mip level.
-If texel filtering would access only a single mip level, the footprint in
-that level would be returned when code:Coarse is set to code:false; an empty
-footprint would be returned when code:Coarse is set to code:true.
-
-The footprint for code:OpImageSampleFootprintNV is returned in a structure
-with six members:
-
-  * The first member is a boolean value that is true if the texel filtering
-    operation would access only a single mip level.
-  * The second member is a two- or three-component integer vector holding
-    the footprint anchor location.
-    For two-dimensional images, the returned components are in units of
-    eight texel groups.
-    For three-dimensional images, the returned components are in units of
-    four texel groups.
-  * The third member is a two- or three-component integer vector holding a
-    footprint offset relative to the anchor.
-    All returned components are in units of texel groups.
-  * The fourth member is a two-component integer vector mask, which holds a
-    bitfield identifying the set of texel groups in an 8x8 or 4x4x4
-    neighborhood relative to the anchor and offset.
-  * The fifth member is an integer identifying the mip level containing the
-    footprint identified by the anchor, offset, and mask.
-  * The sixth member is an integer identifying the granularity of the
-    returned footprint.
-
-For footprints in two-dimensional images (code:Dim2D), the mask returned by
-code:OpImageSampleFootprintNV indicates whether each texel group in a 8x8
-local neighborhood of texel groups would have one or more texels accessed
-during texel filtering.
-In the mask, the texel group with local group coordinates
-latexmath:[(lgx,lgy)] is considered covered if and only if
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-0 \neq ((mask.x + (mask.y << 32)) \text{ \& } (1 << (lgy \times 8 + lgx)))
-\end{aligned}
-+++++++++++++++++++
-
-where:
-
-  * latexmath:[0 \leq lgx < 8] and latexmath:[0 \leq lgy < 8]; and
-  * latexmath:[mask] is the returned two-component mask.
-
-The local group with coordinates latexmath:[(lgx,lgy)] in the mask is
-considered covered if and only if the texel filtering operation would access
-one or more texels latexmath:[\tau_{ij}] in the returned miplevel where:
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-i0 & =
-  \begin{cases}
-    gran.x \times (8 \times anchor.x + lgx), & \text{if } lgx + offset.x < 8 \\
-    gran.x \times (8 \times (anchor.x - 1) + lgx), & \text{otherwise}
-  \end{cases} \\
-i1 & = i0 + gran.x - 1 \\
-j0 & =
-  \begin{cases}
-    gran.y \times (8 \times anchor.y + lgy), & \text{if } lgy + offset.y < 8 \\
-    gran.y \times (8 \times (anchor.y - 1) + lgy), & otherwise
-  \end{cases} \\
-j1 & = j0 + gran.y - 1
-\end{aligned}
-+++++++++++++++++++
-and
-
-  * latexmath:[i0 \leq i \leq i1] and latexmath:[j0 \leq j \leq j1];
-  * latexmath:[gran] is a two-component vector holding the width and height
-    of the texel group identified by the granularity;
-  * latexmath:[anchor] is the returned two-component anchor vector; and
-  * latexmath:[offset] is the returned two-component offset vector.
-
-For footprints in three-dimensional images (code:Dim3D), the mask returned
-by code:OpImageSampleFootprintNV indicates whether each texel group in a
-4x4x4 local neighborhood of texel groups would have one or more texels
-accessed during texel filtering.
-In the mask, the texel group with local group coordinates
-latexmath:[(lgx,lgy,lgz)], is considered covered if and only if:
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-0 \neq ((mask.x + (mask.y << 32)) \text{ \& } (1 << (lgz \times 16 + lgy \times 4 + lgx)))
-\end{aligned}
-+++++++++++++++++++
-where:
-
-  * latexmath:[0 \leq lgx < 4], latexmath:[0 \leq lgy < 4], and latexmath:[0
-    \leq lgz < 4]; and
-  * latexmath:[mask] is the returned two-component mask.
-
-The local group with coordinates latexmath:[(lgx,lgy,lgz)] in the mask is
-considered covered if and only if the texel filtering operation would access
-one or more texels latexmath:[\tau_{ijk}] in the returned miplevel where:
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-i0 & =
-  \begin{cases}
-    gran.x \times (4 \times anchor.x + lgx), & \text{if } lgx + offset.x < 4 \\
-    gran.x \times (4 \times (anchor.x - 1) + lgx), & \text{otherwise}
-  \end{cases} \\
-i1 & = i0 + gran.x - 1 \\
-j0 & =
-  \begin{cases}
-    gran.y \times (4 \times anchor.y + lgy), & \text{if } lgy + offset.y < 4 \\
-    gran.y \times (4 \times (anchor.y - 1) + lgy), & otherwise
-  \end{cases} \\
-j1 & = j0 + gran.y - 1 \\
-k0 & =
-  \begin{cases}
-    gran.z \times (4 \times anchor.z + lgz), & \text{if } lgz + offset.z < 4 \\
-    gran.z \times (4 \times (anchor.z - 1) + lgz), & otherwise
-  \end{cases} \\
-k1 & = k0 + gran.z - 1
-\end{aligned}
-+++++++++++++++++++
-and
-
-  * latexmath:[i0 \leq i \leq i1], latexmath:[j0 \leq j \leq j1],
-    latexmath:[k0 \leq k \leq k1];
-  * latexmath:[gran] is a three-component vector holding the width, height,
-    and depth of the texel group identified by the granularity;
-  * latexmath:[anchor] is the returned three-component anchor vector; and
-  * latexmath:[offset] is the returned three-component offset vector.
-
-If the sampler used by code:OpImageSampleFootprintNV enables anisotropic
-texel filtering via pname:anisotropyEnable, it is possible that the set of
-texel groups accessed in a mip level may be too large to be expressed using
-an 8x8 or 4x4x4 mask using the granularity requested in the instruction.
-In this case, the implementation uses a texel group larger than the
-requested granularity.
-When a larger texel group size is used, code:OpImageSampleFootprintNV
-returns an integer granularity value that can: be interpreted in the same
-manner as the granularity value provided to the instruction to determine the
-texel group size used.
-If anisotropic texel filtering is disabled in the sampler, or if an
-anisotropic footprint can be represented as an 8x8 or 4x4x4 mask with the
-requested granularity, code:OpImageSampleFootprintNV will use the requested
-granularity as-is and return a granularity value of zero.
-
-code:OpImageSampleFootprintNV supports only two- and three-dimensional image
-accesses (code:Dim2D and code:Dim3D), and the footprint returned is
-undefined: if a sampler uses an addressing mode other than
-ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE.
-
-endif::VK_NV_shader_image_footprint[]
-
-
-[[textures-instructions]]
-== Image Operation Steps
-
-Each step described in this chapter is performed by a subset of the image
-instructions:
-
-  * Texel Input Validation Operations, Format Conversion, Texel Replacement,
-    Conversion to RGBA, and Component Swizzle: Performed by all instructions
-    except code:OpImageWrite.
-  * Depth Comparison: Performed by code:OpImage*Dref instructions.
-  * All Texel output operations: Performed by code:OpImageWrite.
-  * Projection: Performed by all code:OpImage*Proj instructions.
-  * Derivative Image Operations, Cube Map Operations, Scale Factor
-    Operation, Level-of-Detail Operation and Image Level(s) Selection, and
-    Texel Anisotropic Filtering: Performed by all code:OpImageSample* and
-    code:OpImageSparseSample* instructions.
-  * (s,t,r,q,a) to (u,v,w,a) Transformation, Wrapping, and (u,v,w,a) to
-    (i,j,k,l,n) Transformation And Array Layer Selection: Performed by all
-    code:OpImageSample, code:OpImageSparseSample, and code:OpImage*Gather
-    instructions.
-  * Texel Gathering: Performed by code:OpImage*Gather instructions.
-ifdef::VK_NV_shader_image_footprint[]
-  * Texel Footprint Evaluation: Performed by code:OpImageSampleFootprint
-    instructions.
-endif::VK_NV_shader_image_footprint[]
-  * Texel Filtering: Performed by all code:OpImageSample* and
-    code:OpImageSparseSample* instructions.
-  * Sparse Residency: Performed by all code:OpImageSparse* instructions.
-
-
-[[textures-queries]]
-== Image Query Instructions
-
-=== Image Property Queries
-
-code:OpImageQuerySize, code:OpImageQuerySizeLod, code:OpImageQueryLevels,
-and code:OpImageQuerySamples query properties of the image descriptor that
-would be accessed by a shader image operation.
-ifdef::VK_EXT_robustness2[]
-They return 0 if the bound descriptor is a null descriptor.
-endif::VK_EXT_robustness2[]
-
-code:OpImageQuerySizeLod returns the size of the image level identified by
-the code:Level code:of code:Detail operand.
-If that level does not exist in the image,
-ifdef::VK_EXT_robustness2[and the descriptor is not null,]
-then the value returned is undefined:.
-
-
-=== Lod Query
-
-code:OpImageQueryLod returns the Lod parameters that would be used in an
-image operation with the given image and coordinates.
-ifdef::VK_EXT_robustness2[]
-If the descriptor that would be accessed is a null descriptor then (0, 0) is
-returned.
-endif::VK_EXT_robustness2[]
-ifdef::VK_EXT_robustness2[Otherwise, the]
-ifndef::VK_EXT_robustness2[The]
-steps described in this chapter are performed as if for
-code:OpImageSampleImplicitLod, up to <<textures-lod-and-scale-factor>>.
-The return value is the vector [eq]#({lambda}', d~l~)#.
-These values may: be subject to implementation-specific maxima and minima
-for very large, out-of-range values.
diff --git a/registry/vulkan/chapters/vertexpostproc.txt b/registry/vulkan/chapters/vertexpostproc.txt
deleted file mode 100644
index 5511353..0000000
--- a/registry/vulkan/chapters/vertexpostproc.txt
+++ /dev/null
@@ -1,1446 +0,0 @@
-// Copyright 2015-2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[vertexpostproc]]
-= Fixed-Function Vertex Post-Processing
-
-After <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stages>>, the following fixed-function operations are applied to vertices of
-the resulting primitives:
-
-ifdef::VK_EXT_transform_feedback[]
-  * Transform feedback (see <<vertexpostproc-transform-feedback,Transform
-    Feedback>>)
-endif::VK_EXT_transform_feedback[]
-ifdef::VK_NV_viewport_swizzle[]
-  * Viewport swizzle (see <<vertexpostproc-viewport-swizzle,Viewport
-    Swizzle>>)
-endif::VK_NV_viewport_swizzle[]
-  * Flat shading (see <<vertexpostproc-flatshading>>).
-  * Primitive clipping, including client-defined half-spaces (see
-    <<vertexpostproc-clipping,Primitive Clipping>>).
-  * Shader output attribute clipping (see
-    <<vertexpostproc-clipping-shader-outputs,Clipping Shader Outputs>>).
-ifdef::VK_NV_clip_space_w_scaling[]
-  * Clip space W scaling (see <<vertexpostproc-viewportwscaling,Controlling
-    Viewport W Scaling>>).
-endif::VK_NV_clip_space_w_scaling[]
-  * Perspective division on clip coordinates (see
-    <<vertexpostproc-coord-transform,Coordinate Transformations>>).
-  * Viewport mapping, including depth range scaling (see
-    <<vertexpostproc-viewport,Controlling the Viewport>>).
-  * Front face determination for polygon primitives (see
-    <<primsrast-polygons-basic,Basic Polygon Rasterization>>).
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-TODO:Odd that this one link to a different chapter is in this list.
-====
-endif::editing-notes[]
-
-Next, rasterization is performed on primitives as described in chapter
-<<primsrast,Rasterization>>.
-
-
-ifdef::VK_EXT_transform_feedback[]
-[[vertexpostproc-transform-feedback]]
-== Transform Feedback
-
-Before any other fixed-function vertex post-processing, vertex outputs from
-the last shader in the
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> can: be written out to one or more transform feedback buffers bound
-to the command buffer.
-To capture vertex outputs the last
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> shader must: be declared with the code:Xfb execution mode.
-Outputs decorated with code:XfbBuffer will be written out to the
-corresponding transform feedback buffers bound to the command buffer when
-transform feedback is active.
-Transform feedback buffers are bound to the command buffer by using
-flink:vkCmdBindTransformFeedbackBuffersEXT.
-Transform feedback is made active by calling
-flink:vkCmdBeginTransformFeedbackEXT and made inactive by calling
-flink:vkCmdEndTransformFeedbackEXT.
-After vertex data is written it is possible to use
-flink:vkCmdDrawIndirectByteCountEXT to start a new draw where the
-pname:vertexCount is derived from the number of bytes written by a previous
-transform feedback.
-
-When an individual point, line, or triangle primitive reaches the transform
-feedback stage while transform feedback is active, the values of the
-specified output variables are assembled into primitives and appended to the
-bound transform feedback buffers.
-After activating transform feedback, the values of the first assembled
-primitive are written at the starting offsets of the bound transform
-feedback buffers, and subsequent primitives are appended to the buffer.
-If the optional pname:pCounterBuffers and pname:pCounterBufferOffsets
-parameters are specified, the starting points within the transform feedback
-buffers are adjusted so data is appended to the previously written values
-indicated by the value stored by the implementation in the counter buffer.
-
-For multi-vertex primitives, all values for a given vertex are written
-before writing values for any other vertex.
-ifdef::VK_EXT_provoking_vertex[]
-When
-<<features-transformFeedbackPreservesProvokingVertex,transformFeedbackPreservesProvokingVertex>>
-is not enabled, implementations
-endif::VK_EXT_provoking_vertex[]
-ifndef::VK_EXT_provoking_vertex[]
-Implementations
-endif::VK_EXT_provoking_vertex[]
-may: write out any vertex within the primitive first, but all subsequent
-vertices for that primitive must: be written out in a consistent winding
-order defined as follows:
-
-  * If neither <<geometry,geometry>> or <<tessellation,tessellation
-    shading>> is active, vertices within a primitive are appended according
-    to the winding order described by the <<drawing-primitive-topologies,
-    primitive topology>> defined by the
-    slink:VkPipelineInputAssemblyStateCreateInfo:pname:topology used to
-    execute the <<drawing,drawing command>>.
-  * If <<geometry,geometry shading>> is active, vertices within a primitive
-    are appended according to the winding order described by the
-    <<drawing-primitive-topologies, primitive topology>> defined by the
-    <<drawing-point-lists, code:OutputPoints>>, <<drawing-line-strips,
-    code:OutputLineStrips>>, or <<drawing-triangle-strips,
-    code:OutputTriangleStrips>> execution mode.
-  * If <<tessellation,tessellation shading>> is active but
-    <<geometry,geometry shading>> is not, vertices within a primitive are
-    appended according to the winding order defined by
-    <<tessellation-triangle-tessellation, triangle tessellation>>,
-    <<tessellation-quad-tessellation, quad tessellation>>, and
-    <<tessellation-isoline-tessellation, isoline tessellation>>.
-
-ifdef::VK_EXT_provoking_vertex[]
-When
-<<features-transformFeedbackPreservesProvokingVertex,transformFeedbackPreservesProvokingVertex>>
-is enabled, then in addition to writing vertices with a consistent winding
-order, the vertex order must: preserve the <<vertexpostproc-flatshading,
-provoking vertex>> of each primitive:
-
-  * When the
-    <<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT,pipeline's
-    provoking vertex mode>> is
-    ename:VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT, the primitive's
-    provoking vertex must be the first vertex written.
-  * When the
-    <<VkPipelineRasterizationProvokingVertexStateCreateInfoEXT,pipeline's
-    provoking vertex mode>> is
-    ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT, the primitive's
-    provoking vertex must be the last vertex written.
-
-If
-<<limits-transformFeedbackPreservesTriangleFanProvokingVertex,pname:transformFeedbackPreservesTriangleFanProvokingVertex>>
-is ename:VK_FALSE, neither <<geometry,geometry>> nor
-<<tessellation,tessellation>> shading is active, and the
-<<drawing-primitive-topologies,primitive topology>> is
-ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, then the first vertex written from
-each primitive is implementation-defined even when
-<<features-transformFeedbackPreservesProvokingVertex,transformFeedbackPreservesProvokingVertex>>
-is enabled.
-
-endif::VK_EXT_provoking_vertex[]
-
-When capturing vertices, the stride associated with each transform feedback
-buffer, as indicated by the code:XfbStride decoration, indicates the number
-of bytes of storage reserved for each vertex in the transform feedback
-buffer.
-For every vertex captured, each output attribute with a code:Offset
-decoration will be written to the storage reserved for the vertex at the
-associated transform feedback buffer.
-When writing output variables that are arrays or structures, individual
-array elements or structure members are written tightly packed in order.
-For vector types, individual components are written in order.
-For matrix types, outputs are written as an array of column vectors.
-
-If any component of an output with an assigned transform feedback offset was
-not written to by its shader, the value recorded for that component is
-undefined:.
-All components of an output variable must: be written at an offset aligned
-to the size of the component.
-The size of each component of an output variable must: be at least 32-bits.
-When capturing a vertex, any portion of the reserved storage not associated
-with an output variable with an assigned transform feedback offset will be
-unmodified.
-
-When transform feedback is inactive, no vertices are recorded.
-If there is a valid counter buffer handle and counter buffer offset in the
-pname:pCounterBuffers and pname:pCounterBufferOffsets arrays, writes to the
-corresponding transform feedback buffer will start at the byte offset
-represented by the value stored in the counter buffer location.
-
-Individual lines or triangles of a strip or fan primitive will be extracted
-and recorded separately.
-Incomplete primitives are not recorded.
-
-When using a geometry shader that emits vertices to multiple vertex streams,
-a primitive will be assembled and output for each stream when there are
-enough vertices emitted for the output primitive type.
-All outputs assigned to a given transform feedback buffer are required to
-come from a single vertex stream.
-
-The sizes of the transform feedback buffers are defined by the
-flink:vkCmdBindTransformFeedbackBuffersEXT pname:pSizes parameter for each
-of the bound buffers, or the size of the bound buffer, whichever is the
-lesser.
-If there is less space remaining in any of the transform feedback buffers
-than the size of all of the vertex data for that primitive based on the
-code:XfbStride for that code:XfbBuffer then no vertex data of that primitive
-is recorded in any transform feedback buffer, and the value for the number
-of primitives written in the corresponding
-ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT query for all transform
-feedback buffers is no longer incremented.
-
-Any outputs made to a code:XfbBuffer that is not bound to a transform
-feedback buffer is ignored.
-
-[open,refpage='vkCmdBindTransformFeedbackBuffersEXT',desc='Bind transform feedback buffers to a command buffer',type='protos']
---
-To bind transform feedback buffers to a command buffer for use in subsequent
-drawing commands, call:
-
-include::{generated}/api/protos/vkCmdBindTransformFeedbackBuffersEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:firstBinding is the index of the first transform feedback binding
-    whose state is updated by the command.
-  * pname:bindingCount is the number of transform feedback bindings whose
-    state is updated by the command.
-  * pname:pBuffers is a pointer to an array of buffer handles.
-  * pname:pOffsets is a pointer to an array of buffer offsets.
-  * pname:pSizes is `NULL` or a pointer to an array of basetype:VkDeviceSize
-    buffer sizes, specifying the maximum number of bytes to capture to the
-    corresponding transform feedback buffer.
-    If pname:pSizes is `NULL`, or the value of the pname:pSizes array
-    element is ename:VK_WHOLE_SIZE, then the maximum number of bytes
-    captured will be the size of the corresponding buffer minus the buffer
-    offset.
-
-The values taken from elements [eq]#i# of pname:pBuffers, pname:pOffsets and
-pname:pSizes replace the current state for the transform feedback binding
-[eq]#pname:firstBinding {plus} i#, for [eq]#i# in [eq]#[0,
-pname:bindingCount)#.
-The transform feedback binding is updated to start at the offset indicated
-by pname:pOffsets[i] from the start of the buffer pname:pBuffers[i].
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355]]
-    sname:VkPhysicalDeviceTransformFeedbackFeaturesEXT::pname:transformFeedback
-    must: be enabled
-  * [[VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356]]
-    pname:firstBinding must: be less than
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackBuffers
-  * [[VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357]]
-    The sum of pname:firstBinding and pname:bindingCount must: be less than
-    or equal to
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackBuffers
-  * [[VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358]]
-    All elements of pname:pOffsets must: be less than the size of the
-    corresponding element in pname:pBuffers
-  * [[VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359]]
-    All elements of pname:pOffsets must: be a multiple of 4
-  * [[VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360]]
-    All elements of pname:pBuffers must: have been created with the
-    ename:VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT flag
-  * [[VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361]]
-    If the optional pname:pSize array is specified, each element of
-    pname:pSizes must: either be ename:VK_WHOLE_SIZE, or be less than or
-    equal to
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackBufferSize
-  * [[VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362]]
-    All elements of pname:pSizes must: be either ename:VK_WHOLE_SIZE, or
-    less than or equal to the size of the corresponding buffer in
-    pname:pBuffers
-  * [[VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363]]
-    All elements of pname:pOffsets plus pname:pSizes, where the
-    pname:pSizes, element is not ename:VK_WHOLE_SIZE, must: be less than or
-    equal to the size of the corresponding buffer in pname:pBuffers
-  * [[VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364]]
-    Each element of pname:pBuffers that is non-sparse must: be bound
-    completely and contiguously to a single sname:VkDeviceMemory object
-  * [[VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365]]
-    Transform feedback must: not be active when the
-    fname:vkCmdBindTransformFeedbackBuffersEXT command is recorded
-****
-
-include::{generated}/validity/protos/vkCmdBindTransformFeedbackBuffersEXT.txt[]
---
-
-[open,refpage='vkCmdBeginTransformFeedbackEXT',desc='Make transform feedback active in the command buffer',type='protos']
---
-Transform feedback for specific transform feedback buffers is made active by
-calling:
-
-include::{generated}/api/protos/vkCmdBeginTransformFeedbackEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:firstCounterBuffer is the index of the first transform feedback
-    buffer corresponding to pname:pCounterBuffers[0] and
-    pname:pCounterBufferOffsets[0].
-  * pname:counterBufferCount is the size of the pname:pCounterBuffers and
-    pname:pCounterBufferOffsets arrays.
-  * pname:pCounterBuffers is `NULL` or a pointer to an array of
-    slink:VkBuffer handles to counter buffers.
-    Each buffer contains a 4 byte integer value representing the byte offset
-    from the start of the corresponding transform feedback buffer from where
-    to start capturing vertex data.
-    If the byte offset stored to the counter buffer location was done using
-    flink:vkCmdEndTransformFeedbackEXT it can be used to resume transform
-    feedback from the previous location.
-    If pname:pCounterBuffers is `NULL`, then transform feedback will start
-    capturing vertex data to byte offset zero in all bound transform
-    feedback buffers.
-    For each element of pname:pCounterBuffers that is dlink:VK_NULL_HANDLE,
-    transform feedback will start capturing vertex data to byte zero in the
-    corresponding bound transform feedback buffer.
-  * pname:pCounterBufferOffsets is `NULL` or a pointer to an array of
-    basetype:VkDeviceSize values specifying offsets within each of the
-    pname:pCounterBuffers where the counter values were previously written.
-    The location in each counter buffer at these offsets must: be large
-    enough to contain 4 bytes of data.
-    This data is the number of bytes captured by the previous transform
-    feedback to this buffer.
-    If pname:pCounterBufferOffsets is `NULL`, then it is assumed the offsets
-    are zero.
-
-The active transform feedback buffers will capture primitives emitted from
-the corresponding code:XfbBuffer in the bound graphics pipeline.
-Any code:XfbBuffer emitted that does not output to an active transform
-feedback buffer will not be captured.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366]]
-    sname:VkPhysicalDeviceTransformFeedbackFeaturesEXT::pname:transformFeedback
-    must: be enabled
-  * [[VUID-vkCmdBeginTransformFeedbackEXT-None-02367]]
-    Transform feedback must: not be active
-  * [[VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368]]
-    pname:firstCounterBuffer must: be less than
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackBuffers
-  * [[VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369]]
-    The sum of pname:firstCounterBuffer and pname:counterBufferCount must:
-    be less than or equal to
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackBuffers
-  * [[VUID-vkCmdBeginTransformFeedbackEXT-counterBufferCount-02607]]
-    If pname:counterBufferCount is not `0`, and pname:pCounterBuffers is not
-    `NULL`, pname:pCounterBuffers must: be a valid pointer to an array of
-    pname:counterBufferCount sname:VkBuffer handles that are either valid or
-    dlink:VK_NULL_HANDLE
-  * [[VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370]]
-    For each buffer handle in the array, if it is not dlink:VK_NULL_HANDLE
-    it must: reference a buffer large enough to hold 4 bytes at the
-    corresponding offset from the pname:pCounterBufferOffsets array
-  * [[VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371]]
-    If pname:pCounterBuffer is `NULL`, then pname:pCounterBufferOffsets
-    must: also be `NULL`
-  * [[VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372]]
-    For each buffer handle in the pname:pCounterBuffers array that is not
-    dlink:VK_NULL_HANDLE it must: have been created with a pname:usage value
-    containing
-    ename:VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT
-  * [[VUID-vkCmdBeginTransformFeedbackEXT-None-06233]]
-    A valid graphics pipeline must: be bound to
-    ename:VK_PIPELINE_BIND_POINT_GRAPHICS
-  * [[VUID-vkCmdBeginTransformFeedbackEXT-None-04128]]
-    The last <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization
-    shader stage>> of the bound graphics pipeline must: have been declared
-    with the code:Xfb execution mode
-ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
-  * [[VUID-vkCmdBeginTransformFeedbackEXT-None-02373]]
-    Transform feedback must: not be made active in a render pass instance
-    with multiview enabled
-endif::VK_VERSION_1_1,VK_KHR_multiview[]
-****
-
-include::{generated}/validity/protos/vkCmdBeginTransformFeedbackEXT.txt[]
---
-
-[open,refpage='vkCmdEndTransformFeedbackEXT',desc='Make transform feedback inactive in the command buffer',type='protos']
---
-Transform feedback for specific transform feedback buffers is made inactive
-by calling:
-
-include::{generated}/api/protos/vkCmdEndTransformFeedbackEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command is
-    recorded.
-  * pname:firstCounterBuffer is the index of the first transform feedback
-    buffer corresponding to pname:pCounterBuffers[0] and
-    pname:pCounterBufferOffsets[0].
-  * pname:counterBufferCount is the size of the pname:pCounterBuffers and
-    pname:pCounterBufferOffsets arrays.
-  * pname:pCounterBuffers is `NULL` or a pointer to an array of
-    slink:VkBuffer handles to counter buffers.
-    The counter buffers are used to record the current byte positions of
-    each transform feedback buffer where the next vertex output data would
-    be captured.
-    This can: be used by a subsequent flink:vkCmdBeginTransformFeedbackEXT
-    call to resume transform feedback capture from this position.
-    It can also be used by flink:vkCmdDrawIndirectByteCountEXT to determine
-    the vertex count of the draw call.
-  * pname:pCounterBufferOffsets is `NULL` or a pointer to an array of
-    basetype:VkDeviceSize values specifying offsets within each of the
-    pname:pCounterBuffers where the counter values can be written.
-    The location in each counter buffer at these offsets must: be large
-    enough to contain 4 bytes of data.
-    The data stored at this location is the byte offset from the start of
-    the transform feedback buffer binding where the next vertex data would
-    be written.
-    If pname:pCounterBufferOffsets is `NULL`, then it is assumed the offsets
-    are zero.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374]]
-    sname:VkPhysicalDeviceTransformFeedbackFeaturesEXT::pname:transformFeedback
-    must: be enabled
-  * [[VUID-vkCmdEndTransformFeedbackEXT-None-02375]]
-    Transform feedback must: be active
-  * [[VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376]]
-    pname:firstCounterBuffer must: be less than
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackBuffers
-  * [[VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377]]
-    The sum of pname:firstCounterBuffer and pname:counterBufferCount must:
-    be less than or equal to
-    sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT::pname:maxTransformFeedbackBuffers
-  * [[VUID-vkCmdEndTransformFeedbackEXT-counterBufferCount-02608]]
-    If pname:counterBufferCount is not `0`, and pname:pCounterBuffers is not
-    `NULL`, pname:pCounterBuffers must: be a valid pointer to an array of
-    pname:counterBufferCount sname:VkBuffer handles that are either valid or
-    dlink:VK_NULL_HANDLE
-  * [[VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378]]
-    For each buffer handle in the array, if it is not dlink:VK_NULL_HANDLE
-    it must: reference a buffer large enough to hold 4 bytes at the
-    corresponding offset from the pname:pCounterBufferOffsets array
-  * [[VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379]]
-    If pname:pCounterBuffer is `NULL`, then pname:pCounterBufferOffsets
-    must: also be `NULL`
-  * [[VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380]]
-    For each buffer handle in the pname:pCounterBuffers array that is not
-    dlink:VK_NULL_HANDLE it must: have been created with a pname:usage value
-    containing
-    ename:VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT
-****
-
-include::{generated}/validity/protos/vkCmdEndTransformFeedbackEXT.txt[]
---
-endif::VK_EXT_transform_feedback[]
-
-
-ifdef::VK_NV_viewport_swizzle[]
-[[vertexpostproc-viewport-swizzle]]
-== Viewport Swizzle
-
-[open,refpage='VkPipelineViewportSwizzleStateCreateInfoNV',desc='Structure specifying swizzle applied to primitive clip coordinates',type='structs']
---
-Each primitive sent to a given viewport has a swizzle and optional: negation
-applied to its clip coordinates.
-The swizzle that is applied depends on the viewport index, and is controlled
-by the sname:VkPipelineViewportSwizzleStateCreateInfoNV pipeline state:
-
-include::{generated}/api/structs/VkPipelineViewportSwizzleStateCreateInfoNV.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:viewportCount is the number of viewport swizzles used by the
-    pipeline.
-  * pname:pViewportSwizzles is a pointer to an array of
-    slink:VkViewportSwizzleNV structures, defining the viewport swizzles.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-01215]]
-    pname:viewportCount must: be greater than or equal to the
-    pname:viewportCount set in sname:VkPipelineViewportStateCreateInfo
-****
-
-include::{generated}/validity/structs/VkPipelineViewportSwizzleStateCreateInfoNV.txt[]
---
-
-[open,refpage='VkPipelineViewportSwizzleStateCreateFlagsNV',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineViewportSwizzleStateCreateFlagsNV.txt[]
-
-tname:VkPipelineViewportSwizzleStateCreateFlagsNV is a bitmask type for
-setting a mask, but is currently reserved for future use.
---
-
-The sname:VkPipelineViewportSwizzleStateCreateInfoNV state is set by adding
-this structure to the pname:pNext chain of a
-sname:VkPipelineViewportStateCreateInfo structure and setting the graphics
-pipeline state with flink:vkCreateGraphicsPipelines.
-
-Each viewport specified from 0 to pname:viewportCount - 1 has its x,y,z,w
-swizzle state set to the corresponding pname:x, pname:y, pname:z and pname:w
-in the slink:VkViewportSwizzleNV structure.
-Each component is of type elink:VkViewportCoordinateSwizzleNV, which
-determines the type of swizzle for that component.
-The value of pname:x computes the new x component of the position as:
-
-[source,c]
----------------------------------------------------
-if (x == VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_X_NV) x' = x;
-if (x == VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_X_NV) x' = -x;
-if (x == VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Y_NV) x' = y;
-if (x == VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Y_NV) x' = -y;
-if (x == VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Z_NV) x' = z;
-if (x == VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_Z_NV) x' = -z;
-if (x == VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_W_NV) x' = w;
-if (x == VK_VIEWPORT_COORDINATE_SWIZZLE_NEGATIVE_W_NV) x' = -w;
----------------------------------------------------
-
-Similar selections are performed for the pname:y, pname:z, and pname:w
-coordinates.
-This swizzling is applied before clipping and perspective divide.
-If the swizzle for an active viewport index is not specified, the swizzle
-for pname:x is ename:VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_X_NV, pname:y
-is ename:VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Y_NV, pname:z is
-ename:VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_Z_NV and pname:w is
-ename:VK_VIEWPORT_COORDINATE_SWIZZLE_POSITIVE_W_NV.
-
-Viewport swizzle parameters are specified by setting the pname:pNext pointer
-of sname:VkGraphicsPipelineCreateInfo to point to a
-sname:VkPipelineViewportSwizzleStateCreateInfoNV structure.
-slink:VkPipelineViewportSwizzleStateCreateInfoNV uses
-sname:VkViewportSwizzleNV to set the viewport swizzle parameters.
-
-[open,refpage='VkViewportSwizzleNV',desc='Structure specifying a viewport swizzle',type='structs']
---
-The sname:VkViewportSwizzleNV structure is defined as:
-
-include::{generated}/api/structs/VkViewportSwizzleNV.txt[]
-
-  * pname:x is a elink:VkViewportCoordinateSwizzleNV value specifying the
-    swizzle operation to apply to the x component of the primitive
-  * pname:y is a elink:VkViewportCoordinateSwizzleNV value specifying the
-    swizzle operation to apply to the y component of the primitive
-  * pname:z is a elink:VkViewportCoordinateSwizzleNV value specifying the
-    swizzle operation to apply to the z component of the primitive
-  * pname:w is a elink:VkViewportCoordinateSwizzleNV value specifying the
-    swizzle operation to apply to the w component of the primitive
-
-include::{generated}/validity/structs/VkViewportSwizzleNV.txt[]
---
-
-[open,refpage='VkViewportCoordinateSwizzleNV',desc='Specify how a viewport coordinate is swizzled',type='enums']
---
-Possible values of the slink:VkViewportSwizzleNV::pname:x, pname:y, pname:z,
-and pname:w members, specifying swizzling of the corresponding components of
-primitives, are:
-
-include::{generated}/api/enums/VkViewportCoordinateSwizzleNV.txt[]
-
-These values are described in detail in <<vertexpostproc-viewport-swizzle,
-Viewport Swizzle>>.
---
-endif::VK_NV_viewport_swizzle[]
-
-
-[[vertexpostproc-flatshading]]
-== Flat Shading
-
-_Flat shading_ a vertex output attribute means to assign all vertices of the
-primitive the same value for that output.
-The output values assigned are those of the _provoking vertex_ of the
-primitive.
-Flat shading is applied to those vertex attributes that
-<<interfaces-iointerfaces-matching,match>> fragment input attributes which
-are decorated as code:Flat.
-
-If neither <<geometry,geometry>> nor <<tessellation,tessellation shading>>
-is active, the provoking vertex is determined by the
-<<drawing-primitive-topologies, primitive topology>> defined by
-slink:VkPipelineInputAssemblyStateCreateInfo:pname:topology used to execute
-the <<drawing,drawing command>>.
-
-If <<geometry,geometry shading>> is active, the provoking vertex is
-determined by the <<drawing-primitive-topologies, primitive topology>>
-defined by the <<drawing-point-lists, code:OutputPoints>>,
-<<drawing-line-strips, code:OutputLineStrips>>, or
-<<drawing-triangle-strips, code:OutputTriangleStrips>> execution mode.
-
-If <<tessellation,tessellation shading>> is active but <<geometry,geometry
-shading>> is not, the provoking vertex may: be any of the vertices in each
-primitive.
-
-ifdef::VK_EXT_provoking_vertex[]
-[open,refpage='VkPipelineRasterizationProvokingVertexStateCreateInfoEXT',desc='Structure specifying provoking vertex mode used by a graphics pipeline',type='structs']
---
-For a given primitive topology, the pipeline's provoking vertex mode
-determines which vertex is the provoking vertex.
-To specify the provoking vertex mode, include a
-sname:VkPipelineRasterizationProvokingVertexStateCreateInfoEXT structure in
-the slink:VkPipelineRasterizationStateCreateInfo::pname:pNext chain when
-creating the pipeline.
-
-The sname:VkPipelineRasterizationProvokingVertexStateCreateInfoEXT structure
-is defined as:
-
-include::{generated}/api/structs/VkPipelineRasterizationProvokingVertexStateCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:provokingVertexMode is a elink:VkProvokingVertexModeEXT value
-    selecting the provoking vertex mode.
-
-If this struct is not provided when creating the pipeline, the pipeline will
-use the ename:VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT mode.
-
-If the
-<<limits-provokingVertexModePerPipeline,provokingVertexModePerPipeline>>
-limit is ename:VK_FALSE, then all pipelines bound within a render pass
-instance must: have the same pname:provokingVertexMode.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineRasterizationProvokingVertexStateCreateInfoEXT-provokingVertexMode-04883]]
-    If pname:provokingVertexMode is
-    ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT, then the
-    <<features-provokingVertexLast,provokingVertexLast>> feature must: be
-    enabled
-****
-
-include::{generated}/validity/structs/VkPipelineRasterizationProvokingVertexStateCreateInfoEXT.txt[]
---
-
-[open,refpage='VkProvokingVertexModeEXT',desc='Specify which vertex in a primitive is the provoking vertex',type='enums']
---
-Possible values of
-slink:VkPipelineRasterizationProvokingVertexStateCreateInfoEXT::pname:provokingVertexMode
-are:
-
-include::{generated}/api/enums/VkProvokingVertexModeEXT.txt[]
-
-  * ename:VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT specifies that the
-    provoking vertex is the first non-adjacency vertex in the list of
-    vertices used by a primitive.
-  * ename:VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT specifies that the
-    provoking vertex is the last non-adjacency vertex in the list of
-    vertices used by a primitive.
-
-These modes are described more precisely in
-<<drawing-primitive-topologies,Primitive Topologies>>.
---
-endif::VK_EXT_provoking_vertex[]
-
-
-[[vertexpostproc-clipping]]
-== Primitive Clipping
-
-Primitives are culled against the _cull volume_ and then clipped to the
-_clip volume_.
-In clip coordinates, the _view volume_ is defined by:
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\begin{array}{c}
--w_c \leq x_c \leq w_c \\
--w_c \leq y_c \leq w_c \\
-0 \leq z_c \leq w_c
-\end{array}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-This view volume can: be further restricted by as many as
-sname:VkPhysicalDeviceLimits::pname:maxClipDistances client-defined
-half-spaces.
-
-The cull volume is the intersection of up to
-sname:VkPhysicalDeviceLimits::pname:maxCullDistances client-defined
-half-spaces (if no client-defined cull half-spaces are enabled, culling
-against the cull volume is skipped).
-
-A shader must: write a single cull distance for each enabled cull half-space
-to elements of the code:CullDistance array.
-If the cull distance for any enabled cull half-space is negative for all of
-the vertices of the primitive under consideration, the primitive is
-discarded.
-Otherwise the primitive is clipped against the clip volume as defined below.
-
-The clip volume is the intersection of up to
-sname:VkPhysicalDeviceLimits::pname:maxClipDistances client-defined
-half-spaces with the view volume (if no client-defined clip half-spaces are
-enabled, the clip volume is the view volume).
-
-A shader must: write a single clip distance for each enabled clip half-space
-to elements of the code:ClipDistance array.
-Clip half-space [eq]#i# is then given by the set of points satisfying the
-inequality
-
-  {empty}:: [eq]#c~i~(**P**) {geq} 0#
-
-where [eq]#c~i~(**P**)# is the clip distance [eq]#i# at point [eq]#**P**#.
-For point primitives, [eq]#c~i~(**P**)# is simply the clip distance for the
-vertex in question.
-For line and triangle primitives, per-vertex clip distances are interpolated
-using a weighted mean, with weights derived according to the algorithms
-described in sections <<primsrast-lines-basic,Basic Line Segment
-Rasterization>> and <<primsrast-polygons-basic,Basic Polygon
-Rasterization>>, using the perspective interpolation equations.
-
-The number of client-defined clip and cull half-spaces that are enabled is
-determined by the explicit size of the built-in arrays code:ClipDistance and
-code:CullDistance, respectively, declared as an output in the interface of
-the entry point of the final shader stage before clipping.
-
-ifdef::VK_EXT_depth_clip_enable[]
-If slink:VkPipelineRasterizationDepthClipStateCreateInfoEXT is present in
-the graphics pipeline state then depth clipping is disabled if
-slink:VkPipelineRasterizationDepthClipStateCreateInfoEXT::pname:depthClipEnable
-is ename:VK_FALSE.
-Otherwise, if slink:VkPipelineRasterizationDepthClipStateCreateInfoEXT is
-not present, depth clipping is disabled when
-slink:VkPipelineRasterizationStateCreateInfo::pname:depthClampEnable is
-ename:VK_TRUE.
-endif::VK_EXT_depth_clip_enable[]
-ifndef::VK_EXT_depth_clip_enable[]
-Depth clamping is enabled or disabled via the pname:depthClampEnable enable
-of the slink:VkPipelineRasterizationStateCreateInfo structure.
-Depth clipping is disabled when pname:depthClampEnable is ename:VK_TRUE.
-endif::VK_EXT_depth_clip_enable[]
-When depth clipping is disabled, the plane equation
-
-  {empty}:: [eq]#0 {leq} z~c~ {leq} w~c~#
-
-(see the clip volume definition above) is ignored by view volume clipping
-(effectively, there is no near or far plane clipping).
-
-If the primitive under consideration is a point or line segment, then
-clipping passes it unchanged if its vertices lie entirely within the clip
-volume.
-
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-If a point's vertex lies outside of the clip volume, the entire primitive
-may: be discarded.
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
-[open,refpage='VkPointClippingBehavior',desc='Enum specifying the point clipping behavior',type='enums']
---
-Possible values of
-slink:VkPhysicalDevicePointClippingProperties::pname:pointClippingBehavior,
-specifying clipping behavior of a point primitive whose vertex lies outside
-the clip volume, are:
-
-include::{generated}/api/enums/VkPointClippingBehavior.txt[]
-
-ifdef::VK_KHR_maintenance2[]
-or the equivalent
-
-include::{generated}/api/enums/VkPointClippingBehaviorKHR.txt[]
-endif::VK_KHR_maintenance2[]
-
-  * ename:VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES specifies that the
-    primitive is discarded if the vertex lies outside any clip plane,
-    including the planes bounding the view volume.
-  * ename:VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY specifies that
-    the primitive is discarded only if the vertex lies outside any user clip
-    plane.
---
-endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
-
-If either of a line segment's vertices lie outside of the clip volume, the
-line segment may: be clipped, with new vertex coordinates computed for each
-vertex that lies outside the clip volume.
-A clipped line segment endpoint lies on both the original line segment and
-the boundary of the clip volume.
-
-This clipping produces a value, [eq]#0 {leq} t {leq} 1#, for each clipped
-vertex.
-If the coordinates of a clipped vertex are [eq]#**P**# and the unclipped
-line segment's vertex coordinates are [eq]#**P**~1~# and [eq]#**P**~2~#,
-then [eq]#t# satisfies the following equation
-
-  {empty}:: [eq]#**P** = t **P**~1~ {plus} (1-t) **P**~2~#.
-
-[eq]#t# is used to clip vertex output attributes as described in
-<<vertexpostproc-clipping-shader-outputs,Clipping Shader Outputs>>.
-
-If the primitive is a polygon, it passes unchanged if every one of its edges
-lies entirely inside the clip volume, and is either clipped or discarded
-otherwise.
-If the edges of the polygon intersect the boundary of the clip volume, the
-intersecting edges are reconnected by new edges that lie along the boundary
-of the clip volume - in some cases requiring the introduction of new
-vertices into a polygon.
-
-If a polygon intersects an edge of the clip volume's boundary, the clipped
-polygon must: include a point on this boundary edge.
-
-Primitives rendered with user-defined half-spaces must: satisfy a
-complementarity criterion.
-Suppose a series of primitives is drawn where each vertex [eq]#i# has a
-single specified clip distance [eq]#d~i~# (or a number of similarly
-specified clip distances, if multiple half-spaces are enabled).
-Next, suppose that the same series of primitives are drawn again with each
-such clip distance replaced by [eq]#-d~i~# (and the graphics pipeline is
-otherwise the same).
-In this case, primitives must: not be missing any pixels, and pixels must:
-not be drawn twice in regions where those primitives are cut by the clip
-planes.
-
-
-[[vertexpostproc-clipping-shader-outputs]]
-== Clipping Shader Outputs
-
-Next, vertex output attributes are clipped.
-The output values associated with a vertex that lies within the clip volume
-are unaffected by clipping.
-If a primitive is clipped, however, the output values assigned to vertices
-produced by clipping are clipped.
-
-Let the output values assigned to the two vertices [eq]#**P**~1~# and
-[eq]#**P**~2~# of an unclipped edge be [eq]#**c**~1~# and [eq]#**c**~2~#.
-The value of [eq]#t# (see <<vertexpostproc-clipping,Primitive Clipping>>)
-for a clipped point [eq]#**P**# is used to obtain the output value
-associated with [eq]#**P**# as
-
-  {empty}:: [eq]#**c** = t **c**~1~ {plus} (1-t) **c**~2~#.
-
-(Multiplying an output value by a scalar means multiplying each of _x_, _y_,
-_z_, and _w_ by the scalar.)
-
-Since this computation is performed in clip space before division by
-[eq]#w~c~#, clipped output values are perspective-correct.
-
-Polygon clipping creates a clipped vertex along an edge of the clip volume's
-boundary.
-This situation is handled by noting that polygon clipping proceeds by
-clipping against one half-space at a time.
-Output value clipping is done in the same way, so that clipped points always
-occur at the intersection of polygon edges (possibly already clipped) with
-the clip volume's boundary.
-
-For vertex output attributes whose matching fragment input attributes are
-decorated with code:NoPerspective, the value of [eq]#t# used to obtain the
-output value associated with [eq]#**P**# will be adjusted to produce results
-that vary linearly in framebuffer space.
-
-Output attributes of integer or unsigned integer type must: always be flat
-shaded.
-Flat shaded attributes are constant over the primitive being rasterized (see
-<<primsrast-lines-basic,Basic Line Segment Rasterization>> and
-<<primsrast-polygons-basic,Basic Polygon Rasterization>>), and no
-interpolation is performed.
-The output value [eq]#**c**# is taken from either [eq]#**c**~1~# or
-[eq]#**c**~2~#, since flat shading has already occurred and the two values
-are identical.
-
-ifdef::VK_NV_clip_space_w_scaling[]
-include::VK_NV_clip_space_w_scaling/vertexpostproc.txt[]
-endif::VK_NV_clip_space_w_scaling[]
-
-
-[[vertexpostproc-coord-transform]]
-== Coordinate Transformations
-
-_Clip coordinates_ for a vertex result from shader execution, which yields a
-vertex coordinate code:Position.
-
-Perspective division on clip coordinates yields _normalized device
-coordinates_, followed by a _viewport_ transformation (see
-<<vertexpostproc-viewport,Controlling the Viewport>>) to convert these
-coordinates into _framebuffer coordinates_.
-
-If a vertex in clip coordinates has a position given by
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\left(\begin{array}{c}
-x_c \\
-y_c \\
-z_c \\
-w_c
-\end{array}\right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-then the vertex's normalized device coordinates are
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\left(
-        \begin{array}{c}
-                x_d \\
-                y_d \\
-                z_d
-        \end{array}
-\right) =
-\left(
-        \begin{array}{c}
-                \frac{x_c}{w_c} \\
-                \frac{y_c}{w_c} \\
-                \frac{z_c}{w_c}
-        \end{array}
-\right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-
-ifdef::VK_QCOM_render_pass_transform[]
-[[vertexpostproc-renderpass-transform]]
-== Render Pass Transform
-
-A _render pass transform_ can: be enabled for render pass instances.
-The clip coordinates [eq]#(x~c~, y~c~)# that result from vertex shader
-execution are transformed by a rotation of 0, 90, 180, or 270 degrees in the
-XY plane, centered at the origin.
-
-When _Render pass transform_ is enabled, the transform applies to all
-primitives for all subpasses of the render pass.
-The transformed vertex in clip coordinates has a position given by
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\left(
-        \begin{array}{c}
-                x_{c_{trans}} \\
-                y_{c_{trans}} \\
-                z_{c_{trans}}
-        \end{array}
-\right) =
-\left(
-        \begin{array}{c}
-                x_{c} \cos \theta - y_{c} \sin \theta \\
-                x_{c} \sin \theta + y_{c} \cos \theta \\
-                z_c
-        \end{array}
-\right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-where
-
-  * _[eq]#{theta}#_ is 0 degrees for
-    ename:VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR
-  * _[eq]#{theta}#_ is 90 degrees for
-    ename:VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR
-  * _[eq]#{theta}#_ is 180 degrees for
-    ename:VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR
-  * _[eq]#{theta}#_ is 270 degrees for
-    ename:VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR
-
-
-The transformed vertex's normalized device coordinates are
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\left(
-        \begin{array}{c}
-                x_d \\
-                y_d \\
-                z_d
-        \end{array}
-\right) =
-\left(
-        \begin{array}{c}
-                \frac{x_{c_{trans}}}{w_c} \\
-                \frac{y_{c_{trans}}}{w_c} \\
-                \frac{z_{c_{trans}}}{w_c}
-        \end{array}
-\right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-
-When render pass transform is enabled for a render pass instance, the
-following additional features are enabled:
-
-  * Each slink:VkViewport specified by either
-    slink:VkPipelineViewportStateCreateInfo::pname:pViewports or
-    flink:vkCmdSetViewport will have its width/height [eq]#(p~x~, p~y~)# and
-    its center [eq]#(o~x~, o~y~)# similarly transformed by the
-    implementation.
-  * Each scissor specified by
-    slink:VkPipelineViewportStateCreateInfo::pname:pScissors or
-    flink:vkCmdSetScissor will have its [eq]#(offset~x~, offset~y~)# and
-    [eq]#(extent~x~, extent~y~)# similarly transformed by the
-    implementation.
-  * The pname:renderArea specified in
-    slink:VkCommandBufferInheritanceRenderPassTransformInfoQCOM and
-    slink:VkRenderPassBeginInfo will be similarly transformed by the
-    implementation.
-  * The [eq]#(x, y)# components of shader variables with built-in
-    decorations code:FragCoord, code:SamplePosition, or code:PointCoord will
-    be similarly transformed by the implementation.
-  * The [eq]#(x,y)# components of the code:offset operand of the
-    code:InterpolateAtOffset extended instruction will be similarly
-    transformed by the implementation.
-  * The values returned by SPIR-V <<shaders-derivative-operations,
-    derivative instructions>> code:OpDPdx, code:OpDPdy, code:OpDPdxCourse,
-    code:OpDPdyCourse, code:OpDPdxFine, code:OpDPdyFine will be similarly
-    transformed by the implementation.
-
-
-The net result of the above, is that applications can: act as if rendering
-to a framebuffer oriented with the
-slink:VkSurfaceCapabilitiesKHR::pname:currentTransform.
-In other words, applications can: act as if the presentation engine will be
-performing the transformation of the swapchain image after rendering and
-prior to presentation to the user.
-In fact, the transformation of the various items cited above are being
-handled by the implementation as the rendering takes place.
-
-endif::VK_QCOM_render_pass_transform[]
-
-
-[[vertexpostproc-viewport]]
-== Controlling the Viewport
-
-The viewport transformation is determined by the selected viewport's width
-and height in pixels, [eq]#p~x~# and [eq]#p~y~#, respectively, and its
-center [eq]#(o~x~, o~y~)# (also in pixels), as well as its depth range min
-and max determining a depth range scale value [eq]#p~z~# and a depth range
-bias value [eq]#o~z~# (defined below).
-The vertex's framebuffer coordinates [eq]#(x~f~, y~f~, z~f~)# are given by
-
-  {empty}:: [eq]#x~f~ = (p~x~ / 2) x~d~ {plus} o~x~#
-  {empty}:: [eq]#y~f~ = (p~y~ / 2) y~d~ {plus} o~y~#
-  {empty}:: [eq]#z~f~ = p~z~ {times} z~d~ {plus} o~z~#
-
-Multiple viewports are available, numbered zero up to
-sname:VkPhysicalDeviceLimits::pname:maxViewports minus one.
-The number of viewports used by a pipeline is controlled by the
-pname:viewportCount member of the sname:VkPipelineViewportStateCreateInfo
-structure used in pipeline creation.
-
-[eq]#x~f~# and [eq]#y~f~# have limited precision, where the number of
-fractional bits retained is specified by
-sname:VkPhysicalDeviceLimits::pname:subPixelPrecisionBits.
-ifdef::VK_EXT_line_rasterization[]
-When rasterizing <<primsrast-lines,line segments>>, the number of fractional
-bits is specified by
-sname:VkPhysicalDeviceLineRasterizationPropertiesEXT::pname:lineSubPixelPrecisionBits.
-endif::VK_EXT_line_rasterization[]
-
-[open,refpage='VkPipelineViewportStateCreateInfo',desc='Structure specifying parameters of a newly created pipeline viewport state',type='structs']
---
-The sname:VkPipelineViewportStateCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkPipelineViewportStateCreateInfo.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:viewportCount is the number of viewports used by the pipeline.
-  * pname:pViewports is a pointer to an array of slink:VkViewport
-    structures, defining the viewport transforms.
-    If the viewport state is dynamic, this member is ignored.
-  * pname:scissorCount is the number of <<fragops-scissor,scissors>> and
-    must: match the number of viewports.
-  * pname:pScissors is a pointer to an array of slink:VkRect2D structures
-    defining the rectangular bounds of the scissor for the corresponding
-    viewport.
-    If the scissor state is dynamic, this member is ignored.
-
-.Valid Usage
-****
-  * [[VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:viewportCount must: not be greater than `1`
-  * [[VUID-VkPipelineViewportStateCreateInfo-scissorCount-01217]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:scissorCount must: not be greater than `1`
-  * [[VUID-VkPipelineViewportStateCreateInfo-viewportCount-01218]]
-    pname:viewportCount must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxViewports
-  * [[VUID-VkPipelineViewportStateCreateInfo-scissorCount-01219]]
-    pname:scissorCount must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxViewports
-ifndef::VK_EXT_extended_dynamic_state[]
-  * [[VUID-VkPipelineViewportStateCreateInfo-scissorCount-01220]]
-    pname:scissorCount and pname:viewportCount must: be identical
-endif::VK_EXT_extended_dynamic_state[]
-  * [[VUID-VkPipelineViewportStateCreateInfo-x-02821]]
-    The pname:x and pname:y members of pname:offset member of any element of
-    pname:pScissors must: be greater than or equal to `0`
-  * [[VUID-VkPipelineViewportStateCreateInfo-offset-02822]]
-    Evaluation of [eq]#(pname:offset.x {plus} pname:extent.width)# must: not
-    cause a signed integer addition overflow for any element of
-    pname:pScissors
-  * [[VUID-VkPipelineViewportStateCreateInfo-offset-02823]]
-    Evaluation of [eq]#(pname:offset.y {plus} pname:extent.height)# must:
-    not cause a signed integer addition overflow for any element of
-    pname:pScissors
-ifndef::VK_EXT_extended_dynamic_state[]
-  * [[VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength]]
-    pname:viewportCount must: be greater than `0`
-  * [[VUID-VkPipelineViewportStateCreateInfo-scissorCount-arraylength]]
-    pname:scissorCount must: be greater than `0`
-endif::VK_EXT_extended_dynamic_state[]
-ifdef::VK_EXT_extended_dynamic_state[]
-  * [[VUID-VkPipelineViewportStateCreateInfo-scissorCount-04134]]
-    If the graphics pipeline is being created without
-    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT and
-    ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT set then
-    pname:scissorCount and pname:viewportCount must: be identical
-  * [[VUID-VkPipelineViewportStateCreateInfo-viewportCount-04135]]
-    If the graphics pipeline is being created with
-    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT set then
-    pname:viewportCount must: be `0`, otherwise it must: be greater than `0`
-  * [[VUID-VkPipelineViewportStateCreateInfo-scissorCount-04136]]
-    If the graphics pipeline is being created with
-    ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT set then
-    pname:scissorCount must: be `0`, otherwise it must: be greater than `0`
-endif::VK_EXT_extended_dynamic_state[]
-ifdef::VK_NV_clip_space_w_scaling[]
-  * [[VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726]]
-    If the pname:viewportWScalingEnable member of a
-    slink:VkPipelineViewportWScalingStateCreateInfoNV structure included in
-    the pname:pNext chain is ename:VK_TRUE, the pname:viewportCount member
-    of the slink:VkPipelineViewportWScalingStateCreateInfoNV structure must:
-    be greater than or equal to
-    slink:VkPipelineViewportStateCreateInfo::pname:viewportCount
-endif::VK_NV_clip_space_w_scaling[]
-****
-
-include::{generated}/validity/structs/VkPipelineViewportStateCreateInfo.txt[]
---
-
-ifdef::VK_EXT_extended_dynamic_state[]
-[open,refpage='vkCmdSetViewportWithCountEXT',desc='Set the viewport count and viewports dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the viewport count and
-viewports, call:
-
-include::{generated}/api/protos/vkCmdSetViewportWithCountEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:viewportCount specifies the viewport count.
-  * pname:pViewports specifies the viewports to use for drawing.
-
-This command sets the viewport count and viewports state for subsequent
-drawing commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the corresponding
-slink:VkPipelineViewportStateCreateInfo::pname:viewportCount and
-pname:pViewports values used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetViewportWithCountEXT-None-03393]]
-    The <<features-extendedDynamicState, extendedDynamicState>> feature
-    must: be enabled
-  * [[VUID-vkCmdSetViewportWithCountEXT-viewportCount-03394]]
-    pname:viewportCount must: be between `1` and
-    sname:VkPhysicalDeviceLimits::pname:maxViewports, inclusive
-  * [[VUID-vkCmdSetViewportWithCountEXT-viewportCount-03395]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:viewportCount must: be `1`
-ifdef::VK_NV_inherited_viewport_scissor[]
-  * [[VUID-vkCmdSetViewportWithCountEXT-commandBuffer-04819]]
-    pname:commandBuffer must: not have
-    slink:VkCommandBufferInheritanceViewportScissorInfoNV::pname:viewportScissor2D
-    enabled
-endif::VK_NV_inherited_viewport_scissor[]
-****
-
-include::{generated}/validity/protos/vkCmdSetViewportWithCountEXT.txt[]
---
-
-[open,refpage='vkCmdSetScissorWithCountEXT',desc='Set the scissor count and scissor rectangular bounds dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the scissor count and
-scissor rectangular bounds, call:
-
-include::{generated}/api/protos/vkCmdSetScissorWithCountEXT.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:scissorCount specifies the scissor count.
-  * pname:pScissors specifies the scissors to use for drawing.
-
-This command sets the scissor count and scissor rectangular bounds state for
-subsequence drawing commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the corresponding
-slink:VkPipelineViewportStateCreateInfo::pname:scissorCount and
-pname:pScissors values used to create the currently active pipeline.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetScissorWithCountEXT-None-03396]]
-    The <<features-extendedDynamicState, extendedDynamicState>> feature
-    must: be enabled
-  * [[VUID-vkCmdSetScissorWithCountEXT-scissorCount-03397]]
-    pname:scissorCount must: be between `1` and
-    sname:VkPhysicalDeviceLimits::pname:maxViewports, inclusive
-  * [[VUID-vkCmdSetScissorWithCountEXT-scissorCount-03398]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:scissorCount must: be `1`
-  * [[VUID-vkCmdSetScissorWithCountEXT-x-03399]]
-    The pname:x and pname:y members of pname:offset member of any element of
-    pname:pScissors must: be greater than or equal to `0`
-  * [[VUID-vkCmdSetScissorWithCountEXT-offset-03400]]
-    Evaluation of [eq]#(pname:offset.x {plus} pname:extent.width)# must: not
-    cause a signed integer addition overflow for any element of
-    pname:pScissors
-  * [[VUID-vkCmdSetScissorWithCountEXT-offset-03401]]
-    Evaluation of [eq]#(pname:offset.y {plus} pname:extent.height)# must:
-    not cause a signed integer addition overflow for any element of
-    pname:pScissors
-ifdef::VK_NV_inherited_viewport_scissor[]
-  * [[VUID-vkCmdSetScissorWithCountEXT-commandBuffer-04820]]
-    pname:commandBuffer must: not have
-    slink:VkCommandBufferInheritanceViewportScissorInfoNV::pname:viewportScissor2D
-    enabled
-endif::VK_NV_inherited_viewport_scissor[]
-****
-
-include::{generated}/validity/protos/vkCmdSetScissorWithCountEXT.txt[]
---
-endif::VK_EXT_extended_dynamic_state[]
-
-[open,refpage='VkPipelineViewportStateCreateFlags',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkPipelineViewportStateCreateFlags.txt[]
-
-tname:VkPipelineViewportStateCreateFlags is a bitmask type for setting a
-mask, but is currently reserved for future use.
---
-
-ifndef::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer,VK_NV_viewport_array2[]
-If a geometry shader is active and has an output variable decorated with
-code:ViewportIndex, the viewport transformation uses the viewport
-corresponding to the value assigned to code:ViewportIndex taken from an
-implementation-dependent vertex of each primitive.
-If code:ViewportIndex is outside the range zero to pname:viewportCount minus
-one for a primitive, or if the geometry shader did not assign a value to
-code:ViewportIndex for all vertices of a primitive due to flow control, the
-values resulting from the viewport transformation of the vertices of such
-primitives are undefined:.
-If no geometry shader is active, or if the geometry shader does not have an
-output decorated with code:ViewportIndex, the viewport numbered zero is used
-by the viewport transformation.
-endif::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer,VK_NV_viewport_array2[]
-
-ifdef::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer,VK_NV_viewport_array2[]
-ifdef::VK_NV_viewport_array2[]
-A _<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>>_ can: direct each primitive to zero or more viewports.
-The destination viewports for a primitive are selected by the last active
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> that has an output variable decorated with code:ViewportIndex
-(selecting a single viewport) or code:ViewportMaskNV (selecting multiple
-viewports).
-The viewport transform uses the viewport corresponding to either the value
-assigned to code:ViewportIndex or one of the bits set in
-code:ViewportMaskNV, and taken from an implementation-dependent vertex of
-each primitive.
-If code:ViewportIndex or any of the bits in code:ViewportMaskNV are outside
-the range zero to pname:viewportCount minus one for a primitive, or if the
-last active <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization
-shader stage>> did not assign a value to either code:ViewportIndex or
-code:ViewportMaskNV for all vertices of a primitive due to flow control, the
-values resulting from the viewport transformation of the vertices of such
-primitives are undefined:.
-If the last <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization
-shader stage>> does not have an output decorated with code:ViewportIndex or
-code:ViewportMaskNV, the viewport numbered zero is used by the viewport
-transformation.
-endif::VK_NV_viewport_array2[]
-ifndef::VK_NV_viewport_array2[]
-A _<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>>_ can: direct each primitive to one of several viewports.
-The destination viewport for a primitive is selected by the last active
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> that has an output variable decorated with code:ViewportIndex.
-The viewport transform uses the viewport corresponding to the value assigned
-to code:ViewportIndex, and taken from an implementation-dependent vertex of
-each primitive.
-If code:ViewportIndex is outside the range zero to pname:viewportCount minus
-one for a primitive, or if the last active
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>> did not assign a value to code:ViewportIndex for all vertices of a
-primitive due to flow control, the values resulting from the viewport
-transformation of the vertices of such primitives are undefined:.
-If the last <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization
-shader stage>> does not have an output decorated with code:ViewportIndex,
-the viewport numbered zero is used by the viewport transformation.
-endif::VK_NV_viewport_array2[]
-endif::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer,VK_NV_viewport_array2[]
-
-A single vertex can: be used in more than one individual primitive, in
-primitives such as ename:VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP.
-In this case, the viewport transformation is applied separately for each
-primitive.
-
-[open,refpage='vkCmdSetViewport',desc='Set the viewport dynamically for a command buffer',type='protos']
---
-To <<pipelines-dynamic-state, dynamically set>> the viewport transformation
-parameters, call:
-
-include::{generated}/api/protos/vkCmdSetViewport.txt[]
-
-  * pname:commandBuffer is the command buffer into which the command will be
-    recorded.
-  * pname:firstViewport is the index of the first viewport whose parameters
-    are updated by the command.
-  * pname:viewportCount is the number of viewports whose parameters are
-    updated by the command.
-  * pname:pViewports is a pointer to an array of slink:VkViewport structures
-    specifying viewport parameters.
-
-This command sets the viewport transformation parameters state for
-subsequent drawing commands when the graphics pipeline is created with
-ename:VK_DYNAMIC_STATE_VIEWPORT set in
-slink:VkPipelineDynamicStateCreateInfo::pname:pDynamicStates.
-Otherwise, this state is specified by the
-sname:VkPipelineViewportStateCreateInfo::pname:pViewports values used to
-create the currently active pipeline.
-
-The viewport parameters taken from element [eq]#i# of pname:pViewports
-replace the current state for the viewport index [eq]#pname:firstViewport
-{plus} i#, for [eq]#i# in [eq]#[0, pname:viewportCount)#.
-
-.Valid Usage
-****
-  * [[VUID-vkCmdSetViewport-firstViewport-01223]]
-    The sum of pname:firstViewport and pname:viewportCount must: be between
-    `1` and sname:VkPhysicalDeviceLimits::pname:maxViewports, inclusive
-  * [[VUID-vkCmdSetViewport-firstViewport-01224]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:firstViewport must: be `0`
-  * [[VUID-vkCmdSetViewport-viewportCount-01225]]
-    If the <<features-multiViewport,multiple viewports>> feature is not
-    enabled, pname:viewportCount must: be `1`
-ifdef::VK_NV_inherited_viewport_scissor[]
-  * [[VUID-vkCmdSetViewport-commandBuffer-04821]]
-    pname:commandBuffer must: not have
-    slink:VkCommandBufferInheritanceViewportScissorInfoNV::pname:viewportScissor2D
-    enabled
-endif::VK_NV_inherited_viewport_scissor[]
-****
-
-include::{generated}/validity/protos/vkCmdSetViewport.txt[]
---
-
-Both slink:VkPipelineViewportStateCreateInfo and flink:vkCmdSetViewport use
-sname:VkViewport to set the viewport transformation parameters.
-
-[open,refpage='VkViewport',desc='Structure specifying a viewport',type='structs']
---
-The sname:VkViewport structure is defined as:
-
-include::{generated}/api/structs/VkViewport.txt[]
-
-  * pname:x and pname:y are the viewport's upper left corner [eq]#(x,y)#.
-  * pname:width and pname:height are the viewport's width and height,
-    respectively.
-  * pname:minDepth and pname:maxDepth are the depth range for the viewport.
-
-[NOTE]
-.Note
-====
-Despite their names, pname:minDepth can: be less than, equal to, or greater
-than pname:maxDepth.
-====
-
-The framebuffer depth coordinate [eq]#pname:z~f~# may: be represented using
-either a fixed-point or floating-point representation.
-However, a floating-point representation must: be used if the depth/stencil
-attachment has a floating-point depth component.
-If an [eq]#m#-bit fixed-point representation is used, we assume that it
-represents each value latexmath:[\frac{k}{2^m - 1}], where [eq]#k {elem} {
-0, 1, ..., 2^m^-1 }#, as [eq]#k# (e.g. 1.0 is represented in binary as a
-string of all ones).
-
-The viewport parameters shown in the above equations are found from these
-values as
-
-  {empty}:: [eq]#o~x~ = pname:x {plus} pname:width / 2#
-  {empty}:: [eq]#o~y~ = pname:y {plus} pname:height / 2#
-  {empty}:: [eq]#o~z~ = pname:minDepth#
-  {empty}:: [eq]#p~x~ = pname:width#
-  {empty}:: [eq]#p~y~ = pname:height#
-  {empty}:: [eq]#p~z~ = pname:maxDepth - pname:minDepth#.
-
-ifdef::VK_QCOM_render_pass_transform[]
-If a render pass transform is enabled, the values [eq]#(p~x~,p~y~)# and
-[eq]#(o~x~, o~y~)# defining the viewport are transformed as described in
-<<vertexpostproc-renderpass-transform, render pass transform>> before
-participating in the viewport transform.
-endif::VK_QCOM_render_pass_transform[]
-
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
-The application can: specify a negative term for pname:height, which has the
-effect of negating the y coordinate in clip space before performing the
-transform.
-When using a negative pname:height, the application should: also adjust the
-pname:y value to point to the lower left corner of the viewport instead of
-the upper left corner.
-Using the negative pname:height allows the application to avoid having to
-negate the y component of the code:Position output from the last
-<<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
-stage>>.
-endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
-
-The width and height of the <<limits-maxViewportDimensions,
-implementation-dependent maximum viewport dimensions>> must: be greater than
-or equal to the width and height of the largest image which can: be created
-and attached to a framebuffer.
-
-The floating-point viewport bounds are represented with an
-<<limits-viewportSubPixelBits,implementation-dependent precision>>.
-
-.Valid Usage
-****
-  * [[VUID-VkViewport-width-01770]]
-    pname:width must: be greater than `0.0`
-  * [[VUID-VkViewport-width-01771]]
-    pname:width must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxViewportDimensions[0]
-ifndef::VK_VERSION_1_1,VK_KHR_maintenance1,VK_AMD_negative_viewport_height[]
-  * [[VUID-VkViewport-height-01772]]
-    pname:height must: be greater than `0.0`
-endif::VK_VERSION_1_1,VK_KHR_maintenance1,VK_AMD_negative_viewport_height[]
-  * [[VUID-VkViewport-height-01773]]
-    The absolute value of pname:height must: be less than or equal to
-    sname:VkPhysicalDeviceLimits::pname:maxViewportDimensions[1]
-  * [[VUID-VkViewport-x-01774]]
-    pname:x must: be greater than or equal to pname:viewportBoundsRange[0]
-  * [[VUID-VkViewport-x-01232]]
-    [eq]#(pname:x {plus} pname:width)# must: be less than or equal to
-    pname:viewportBoundsRange[1]
-  * [[VUID-VkViewport-y-01775]]
-    pname:y must: be greater than or equal to pname:viewportBoundsRange[0]
-ifdef::VK_VERSION_1_1,VK_KHR_maintenance1,VK_AMD_negative_viewport_height[]
-  * [[VUID-VkViewport-y-01776]]
-    pname:y must: be less than or equal to pname:viewportBoundsRange[1]
-  * [[VUID-VkViewport-y-01777]]
-    [eq]#(pname:y {plus} pname:height)# must: be greater than or equal to
-    pname:viewportBoundsRange[0]
-endif::VK_VERSION_1_1,VK_KHR_maintenance1,VK_AMD_negative_viewport_height[]
-  * [[VUID-VkViewport-y-01233]]
-    [eq]#(pname:y {plus} pname:height)# must: be less than or equal to
-    pname:viewportBoundsRange[1]
-ifdef::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-VkViewport-minDepth-01234]]
-    Unless `apiext:VK_EXT_depth_range_unrestricted` extension is enabled
-    pname:minDepth must: be between `0.0` and `1.0`, inclusive
-endif::VK_EXT_depth_range_unrestricted[]
-ifndef::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-VkViewport-minDepth-02540]]
-    pname:minDepth must: be between `0.0` and `1.0`, inclusive
-endif::VK_EXT_depth_range_unrestricted[]
-ifdef::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-VkViewport-maxDepth-01235]]
-    Unless `apiext:VK_EXT_depth_range_unrestricted` extension is enabled
-    pname:maxDepth must: be between `0.0` and `1.0`, inclusive
-endif::VK_EXT_depth_range_unrestricted[]
-ifndef::VK_EXT_depth_range_unrestricted[]
-  * [[VUID-VkViewport-maxDepth-02541]]
-    pname:maxDepth must: be between `0.0` and `1.0`, inclusive
-endif::VK_EXT_depth_range_unrestricted[]
-****
-
-include::{generated}/validity/structs/VkViewport.txt[]
---
diff --git a/registry/vulkan/chapters/video_decode_extensions.txt b/registry/vulkan/chapters/video_decode_extensions.txt
deleted file mode 100644
index 8ba6d63..0000000
--- a/registry/vulkan/chapters/video_decode_extensions.txt
+++ /dev/null
@@ -1,341 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[video-decode-operations]]
-== Video Decode Operations
-
-Before the application can start recording Vulkan command buffers for the
-Video Decode Operations, it must: do the following, beforehand:
-
-  . Ensure that the implementation can decode the Video Content by querying
-    the supported codec operations and profiles using
-    flink:vkGetPhysicalDeviceQueueFamilyProperties2.
-  . By using flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR and providing
-    one or more video profiles, choose the Vulkan formats supported by the
-    implementation.
-    The formats for <<decoded-output-picture,output>> and
-    <<reference-picture,reference>> pictures must: be queried and chosen
-    separately.
-    Refer to the section on
-    <<supported-video-input-output-dpb-formats-enumeration,enumeration of
-    supported video formats>>.
-  . Before creating an image to be used as a video picture resource, obtain
-    the supported image creation parameters by querying with
-    flink:vkGetPhysicalDeviceFormatProperties2 and
-    flink:vkGetPhysicalDeviceImageFormatProperties2 using one of the
-    reported formats and adding slink:VkVideoProfilesKHR to the pname:pNext
-    chain of slink:VkFormatProperties2.
-    When querying the parameters with
-    flink:vkGetPhysicalDeviceImageFormatProperties2 for images targeting
-    decoded <<decoded-output-picture,output>> and
-    <<reference-picture,reference (DPB)>> pictures, the
-    slink:VkPhysicalDeviceImageFormatInfo2::pname:usage field should contain
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR and
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR, respectively.
-  . Create none, some, or all of the required <<VkImage,images>> for the
-    <<decoded-output-picture,decoded output>> and
-    <<reference-picture,reference>> pictures.
-    More Video Picture Resources can: be created at some later point if
-    needed while processing the decoded content.
-    Also, if the decoded picture size is expected to change, the images can:
-    be created based on the maximum decoded content size required.
-  . Create the <<video-session,video session>> to be used for video decode
-    operations.
-    Before creating the Decode Video Session, the decode capabilities
-    should: be queried with flink:vkGetPhysicalDeviceVideoCapabilitiesKHR to
-    obtain the limits of the parameters allowed by the implementation for a
-    particular codec profile.
-  . Bind memory resources with the decode video session by calling
-    flink:vkBindVideoSessionMemoryKHR.
-    The video session cannot: be used until memory resources are allocated
-    and bound to it.
-    In order to determine the required memory sizes and heap types of the
-    device memory allocations, flink:vkGetVideoSessionMemoryRequirementsKHR
-    should: be called.
-  . Create one or more <<video-session-parameters-introduction,Session
-    Parameter objects>> for use across command buffer recording operations,
-    if required by the codec extension in use.
-    These objects must: be created against a <<video-session,video session>>
-    with the parameters required by the codec.
-    Each <<video-session-parameters-introduction,Session Parameter object>>
-    created is a child object of the associated <<video-session, Session
-    object>> and cannot: be bound in the command buffer with any other
-    <<video-session,Session Object>>.
-
-The recording of Video Decode Commands against a Vulkan command buffer
-consists of the following sequence:
-
-  . flink:vkCmdBeginVideoCodingKHR starts the recording of one or more Video
-    Decode operations in the command buffer.
-    For each Video Decode Command operation, a Video Session must: be bound
-    to the command buffer within this command.
-    This command establishes a Vulkan Video Decode Context that consists of
-    the bound Video Session Object, Session Parameters Object, and the
-    required Video Picture Resources.
-    The established Video Decode Context is in effect until the
-    flink:vkCmdEndVideoCodingKHR command is recorded.
-    If more Video Decode operations are to be required after the
-    flink:vkCmdEndVideoCodingKHR command, another Video Decode Context can:
-    be started with the flink:vkCmdBeginVideoCodingKHR command.
-  . flink:vkCmdDecodeVideoKHR specifies one or more compressed data buffers
-    to be decoded.
-    The slink:VkVideoDecodeInfoKHR parameters, and the codec extension
-    structures chained to this, specify the details of the decode operation.
-  . flink:vkCmdControlVideoCodingKHR records operations against the decoded
-    data, decoding device, or the Video Session state.
-  . flink:vkCmdEndVideoCodingKHR signals the end of the recording of the
-    Vulkan Video Decode Context, as established by
-    flink:vkCmdBeginVideoCodingKHR.
-
-In addition to the above, the following commands can: be recorded between
-flink:vkCmdBeginVideoCodingKHR and flink:vkCmdEndVideoCodingKHR:
-
-  * Query operations
-  * Global Memory Barriers
-  * Buffer Memory Barriers
-  * Image Memory Barriers (these must: be used to transition the Video
-    Picture Resources to the proper
-    ename:VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR and
-    ename:VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR layouts).
-  * Pipeline Barriers
-  * Events
-  * Timestamps
-  * Device Groups (device mask)
-
-The following Video Decode related commands must: be recorded *outside* the
-Vulkan Video Decode Context established with the
-flink:vkCmdBeginVideoCodingKHR and flink:vkCmdEndVideoCodingKHR commands:
-
-  * Sparse Memory Binding
-  * Copy Commands
-  * Clear Commands
-
-
-[[video-picture-decode-modes]]
-=== Video Picture Decode Modes
-
-There are a few ways that the flink:vkCmdDecodeVideoKHR can be configured
-for the Video Picture Decode Operations, based on:
-
-  * if the <<decoded-output-picture, output resource>> would need to be used
-    as <<reference-picture,Reference Picture>> for subsequent decode
-    operations and;
-  * if <<dpb-slot,DPB Slots>> are required for use as
-    <<reference-picture,Reference Pictures>> indexes.
-
-[[video-picture-decode-no-reference-picture-no-slot-update]]
-The most basic Video Picture Decode operation with the
-flink:vkCmdDecodeVideoKHR command is to output the decoded pixel data
-without using any DPB <<reference-picture,Reference Pictures>> and without
-updating any <<dpb-slot,DPB Slot's>> indexes.
-
-In this case, the following slink:VkVideoDecodeInfoKHR parameters must: be
-set:
-
-  * slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->pPictureResource->imageViewBinding
-    must: be a valid slink:VkImageView.
-    This slink:VkImageView represents the <<decoded-output-picture, output
-    resource>> where the decoded pixels will be populated after a successful
-    decode operation.
-  * slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->slotIndex must:
-    be an invalid <<dpb-slot,DPB Slot>> index (-1) since the decoded picture
-    is not intended to be used as a reference picture with subsequent video
-    decode operations.
-  * The value of the slink:VkVideoDecodeInfoKHR::pname:referenceSlotCount
-    can: be `0` and slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots can:
-    be `NULL`.
-  * If slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots is not `NULL`, it
-    can: still have entries representing <<dpb-slot,DPB Slot>> indexes with
-    a <<video-session-dpb-slot-states, Valid Picture Reference>>.
-    The codec extension selects the actual use of the
-    <<reference-picture,Reference Pictures>> by referring to a
-    <<dpb-slot,DPB Slot>> index with a <<video-session-dpb-slot-states,
-    Valid Picture Reference>>.
-
-[[video-picture-decode-with-references-no-slot-update]]
-
-Video Picture Decode operations with the flink:vkCmdDecodeVideoKHR command,
-requiring one or more <<reference-picture,Reference Pictures>> for the
-predictions of the values of samples for the <<decoded-output-picture,
-decoded output picture>> would require <<dpb-slot,DPB Slots>> with
-<<video-session-dpb-slot-states, Valid Picture Reference>>.
-
-In this case, the following slink:VkVideoDecodeInfoKHR parameters must: be
-set:
-
-  * slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->pPictureResource->imageViewBinding
-    must: be a valid slink:VkImageView.
-    This slink:VkImageView represents the <<decoded-output-picture, output
-    resource>> where the decoded pixels will be populated after a successful
-    decode operation.
-  * slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->slotIndex must:
-    be an invalid <<dpb-slot,DPB Slot>> index (-1) since the decoded picture
-    is not intended to be used as a reference picture with subsequent video
-    decode operations.
-  * The value of the slink:VkVideoDecodeInfoKHR::pname:referenceSlotCount
-    must: not be `0` and slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots
-    should represent at least the number of the reference slots required for
-    the decode operation.
-    The codec extension selects the actual use of the
-    <<reference-picture,Reference Pictures>> by referring to a
-    <<dpb-slot,DPB Slot>> index with a <<video-session-dpb-slot-states,
-    Valid Picture Reference>>.
-    If the implementation does not use an opaque DPB, each <<dpb-slot,DPB
-    slot>> representing a <<reference-picture,reference picture>> must:
-    refer to a valid <<VkImageView,image view>>.
-    The <<VkImageView,image views>> must: represent the same
-    <<resources-images, image resources>> that were used to create the
-    <<reference-picture,reference picture>> for the corresponding
-    <<dpb-slot,DPB Slot>> index.
-  * slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots can: still have
-    entries representing <<dpb-slot,DPB Slot>> indexes with a
-    <<video-session-dpb-slot-states, Valid Picture Reference>>.
-
-After the flink:vkCmdDecodeVideoKHR operation is completed successfully, the
-slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->pPictureResource->imageViewBinding
-pixel data will be updated with the decoded content.
-The operation will not update any <<dpb-slot,DPB Slot>> with
-<<reference-picture,Reference Pictures>> data.
-However, any <<dpb-slot,DPB Slot>> activation, invalidation, or deactivation
-operations requested via slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots
-are still going to be performed.
-
-image::images/DecodeSessionDpbDecodeWithOutputToVkImageViewNoReferencePictureSlotUpdate.svg[align="center",title="Decoding a Frame to VkImageView without a slot update for a *Reference Picture*",opts="{imageopts}"]
-
-
-[[video-picture-decode-with-reference-picture-and-slot-update]]
-==== Video Picture Decode with a <<reference-picture,Reference Picture>> slot update and using optional <<reference-picture,Reference Pictures>>
-
-When it is known that the picture to be decoded will be used as a
-<<reference-picture,reference picture>> for subsequent decode operations,
-one of the available <<dpb-slot,DPB Slots>> needs to be selected for
-<<video-session-activating-dpb-slot, activation and update>> operations as
-part of the flink:vkCmdDecodeVideoKHR command.
-
-Based on whether a decode operation
-<<video-picture-decode-with-references-no-slot-update, with reference
-pictures>> or <<video-picture-decode-no-reference-picture-no-slot-update,
-without reference pictures>> is required, the flink:vkCmdDecodeVideoKHR
-should be configured with parameters as described in the previous sections.
-In addition, one of the available <<dpb-slot,DPB Slots>> must: be selected
-by the application, activated with resources and then set-up for an update
-with the decode operation.
-
-In this case, the following slink:VkVideoDecodeInfoKHR parameters must: be
-set:
-
-  * slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->pPictureResource->imageViewBinding
-    must: be a valid slink:VkImageView.
-    This slink:VkImageView represents the <<decoded-output-picture, output
-    resource>> where the decoded pixels will be populated after a successful
-    decode operation.
-    If the implementation does not use an opaque DPB, both the
-    <<decoded-output-picture, output>> and <<reference-picture,reference
-    picture>> resource coincide.
-  * slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->slotIndex must:
-    be a valid <<dpb-slot,DPB Slot>> index selected by the application,
-    based on the currently available slots.
-  * slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots can: still have
-    entries representing <<dpb-slot,DPB Slot>> indexes with a
-    <<video-session-dpb-slot-states, Valid Picture Reference>>.
-
-After the flink:vkCmdDecodeVideoKHR operation has completed successfully,
-the decoded content will be available in the resource provided for
-slink:VkVideoDecodeInfoKHR::pname:pSetupReferenceSlot->pPictureResource->imageViewBinding.
-In addition, this operation will update the selected <<dpb-slot,DPB Slot>>
-with <<reference-picture,Reference Pictures>> data.
-Any other <<dpb-slot,DPB Slot>> activation,invalidation, or deactivation
-operation requested via the
-slink:VkVideoDecodeInfoKHR::pname:pReferenceSlots are going to be performed
-as well.
-
-image::images/DecodeSessionDpbDecodeWithOutputToReferencePictureSlot.svg[align="center",title="Decoding a Frame to VkImageView with an update to a <<reference-picture,Reference Pictures>> DPB Slot",opts="{imageopts}"]
-
-
-=== Video Decode Command Buffer Commands
-
-[open,refpage='vkCmdDecodeVideoKHR',desc='Decode a frame',type='protos']
---
-To decode a frame, call:
-
-include::{generated}/api/protos/vkCmdDecodeVideoKHR.txt[]
-
-  * pname:commandBuffer is the command buffer to be filled with this
-    function for decode frame command.
-  * pname:pFrameInfo is a pointer to a slink:VkVideoDecodeInfoKHR structure.
-
-include::{generated}/validity/protos/vkCmdDecodeVideoKHR.txt[]
---
-
-[open,refpage='VkVideoDecodeInfoKHR',desc='Structure specifying parameters of decoding a frame',type='structs']
---
-The slink:VkVideoDecodeInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoDecodeInfoKHR.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-    All the codec specific structures related to each frame(picture
-    parameters, quantization matrix, etc.) must: be chained here and pass to
-    decode session with the function call flink:vkCmdDecodeVideoKHR.
-  * pname:flags is a bitmask of elink:VkVideoDecodeFlagBitsKHR specifying
-    decode flags, reserved for future versions of this specification.
-  * pname:codedOffset is the coded offset of the decode operations.
-    The purpose of this field is interpreted based on the codec extension.
-ifdef::VK_EXT_video_decode_h264[]
-    When decoding content in H.264 field mode, the pname:codedOffset
-    specifies the line or picture field's offset within the image.
-endif::VK_EXT_video_decode_h264[]
-  * pname:codedExtent is the coded size of the decode operations.
-  * pname:srcBuffer is the source buffer that holds the encoded bitstream.
-  * pname:srcBufferOffset is the buffer offset where the valid encoded
-    bitstream starts in srcBuffer.
-    It must: meet the alignment requirement
-    pname:minBitstreamBufferOffsetAlignment within
-    slink:VkVideoCapabilitiesKHR queried with the
-    flink:vkGetPhysicalDeviceVideoCapabilitiesKHR function.
-  * pname:srcBufferRange is the size of the srcBuffer with valid encoded
-    bitstream, starting from pname:srcBufferOffset.
-    It must: meet the alignment requirement
-    pname:minBitstreamBufferSizeAlignment within
-    slink:VkVideoCapabilitiesKHR queried with the
-    flink:vkGetPhysicalDeviceVideoCapabilitiesKHR function.
-  * pname:dstPictureResource is the destination
-    <<decoded-output-picture,Decoded Output Picture>> Resource.
-  * pname:pSetupReferenceSlot is `NULL` or a pointer to a
-    slink:VkVideoReferenceSlotKHR structure used for generating a DPB
-    reference slot and Picture Resource.
-    pname:pSetupReferenceSlot->slotIndex specifies the slot index number to
-    use as a target for producing the DPB data.
-    pname:slotIndex must: reference a valid entry as specified in
-    slink:VkVideoBeginCodingInfoKHR via the pname:pReferenceSlots within the
-    flink:vkCmdBeginVideoCodingKHR command that established the Vulkan Video
-    Decode Context for this command.
-  * pname:referenceSlotCount is the number of the DPB Reference Pictures
-    that will be used when this decoding operation is executing.
-  * pname:pReferenceSlots is a pointer to an array of
-    slink:VkVideoReferenceSlotKHR structures specifying the DPB Reference
-    pictures that will be used when this decoding operation is executing.
-
-include::{generated}/validity/structs/VkVideoDecodeInfoKHR.txt[]
---
-
-[open,refpage='VkVideoDecodeFlagBitsKHR',desc='Video Decode Command Flags',type='enums']
---
-The flink:vkCmdDecodeVideoKHR flags are defined with the following
-enumeration:
-
-include::{generated}/api/enums/VkVideoDecodeFlagBitsKHR.txt[]
-
-  * ename:VK_VIDEO_DECODE_RESERVED_0_BIT_KHR The current version of the
-    specification has reserved this value for future use.
---
-
-[open,refpage='VkVideoDecodeFlagsKHR',desc='Bitmask specifying the video decode flink:vkCmdDecodeVideoKHR flags',type='flags']
---
-include::{generated}/api/flags/VkVideoDecodeFlagsKHR.txt[]
-
-tlink:VkVideoDecodeFlagsKHR is a bitmask type for setting a mask of zero or
-more elink:VkVideoDecodeFlagBitsKHR.
---
diff --git a/registry/vulkan/chapters/video_decode_h264_extensions.txt b/registry/vulkan/chapters/video_decode_h264_extensions.txt
deleted file mode 100644
index 7adb51d..0000000
--- a/registry/vulkan/chapters/video_decode_h264_extensions.txt
+++ /dev/null
@@ -1,343 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[decode-h264]]
-== Video Decode of AVC (ITU-T H.264)
-
-This extension adds H.264 codec specific structures needed for decode
-session to execute decode jobs which include H.264 sequence header, picture
-parameter header and quantization matrix etc.
-Unless otherwise noted, all references to the H.264 specification are to the
-2010 edition published by the ITU-T, dated March 2010.
-This specification is available at http://www.itu.int/rec/T-REC-H.264.
-
-
-=== H.264 decode profile
-
-A H.264 decode profile is specified using slink:VkVideoDecodeH264ProfileEXT
-chained to slink:VkVideoProfileKHR when the codec-operation in
-slink:VkVideoProfileKHR is
-ename:VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT.
-
-[open,refpage='VkVideoDecodeH264ProfileEXT',desc='Structure specifying H.264 decode profile',type='structs']
---
-The sname:VkVideoDecodeH264ProfileEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoDecodeH264ProfileEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:stdProfileIdc is a code:StdVideoH264ProfileIdc value specifying
-    the H.264 codec profile IDC
-  * pname:pictureLayout is a bitmask of
-    elink:VkVideoDecodeH264PictureLayoutFlagBitsEXT specifying the layout of
-    the decoded picture's contents depending on the nature (progressive vs.
-    interlaced) of the input content.
-
-[NOTE]
-.Note
-====
-When passing sname:VkVideoDecodeH264ProfileEXT to
-flink:vkCreateVideoSessionKHR in the pname:pNext chain of
-slink:VkVideoSessionCreateInfoKHR, requests for a pname:pictureLayout not
-supported by the implementation will result in failure of the command.
-====
-
-.Valid Usage
-****
-  * [[VUID-VkVideoDecodeH264ProfileEXT-pNext-06259]]
-    If the slink:VkVideoDecodeH264ProfileEXT structure is included in the
-    pname:pNext chain of the slink:VkVideoCapabilitiesKHR structure passed
-    to flink:vkGetPhysicalDeviceVideoCapabilitiesKHR, the value in
-    pname:pictureLayout is treated as a bitmask of requested picture
-    layouts.
-    It is always valid to use the value
-    ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT as the
-    implementation is guaranteed to support decoding of progressive content.
-  * [[VUID-VkVideoDecodeH264ProfileEXT-pNext-06260]]
-    If the slink:VkVideoDecodeH264ProfileEXT structure is included in the
-    pname:pNext chain of the slink:VkVideoSessionCreateInfoKHR structure
-    passed to flink:vkCreateVideoSessionKHR, the value in
-    pname:pictureLayout must: be exactly one of
-    ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT,
-    ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_EXT
-    or
-    ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_EXT.
-****
-
-include::{generated}/validity/structs/VkVideoDecodeH264ProfileEXT.txt[]
---
-
-[open,refpage='VkVideoDecodeH264PictureLayoutFlagsEXT',desc='Bitmask of VkVideoDecodeH264PictureLayoutFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkVideoDecodeH264PictureLayoutFlagsEXT.txt[]
-
-tname:VkVideoDecodeH264PictureLayoutFlagsEXT is a bitmask type for setting a
-mask of zero or more elink:VkVideoDecodeH264PictureLayoutFlagBitsEXT.
---
-
-[open,refpage='VkVideoDecodeH264PictureLayoutFlagBitsEXT',desc='H.264 video decode picture layout flags',type='enums']
---
-The H.264 video decode picture layout flags are defined with the following
-enum:
-
-include::{generated}/api/enums/VkVideoDecodeH264PictureLayoutFlagBitsEXT.txt[]
-
-  * ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_PROGRESSIVE_EXT specifies
-    support for progressive content.
-    This flag has the value `0`.
-  * ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_INTERLEAVED_LINES_BIT_EXT
-    specifies support for or use of a picture layout for interlaced content
-    where all lines belonging to the first field are decoded to the
-    even-numbered lines within the picture resource, and all lines belonging
-    to the second field are decoded to the odd-numbered lines within the
-    picture resource.
-  * ename:VK_VIDEO_DECODE_H264_PICTURE_LAYOUT_INTERLACED_SEPARATE_PLANES_BIT_EXT
-    specifies support for or use of a picture layout for interlaced content
-    where all lines belonging to the first field are grouped together in a
-    single plane, followed by another plane containing all lines belonging
-    to the second field.
---
-
-
-=== Selecting a H.264 decode profile
-
-When using flink:vkGetPhysicalDeviceVideoCapabilitiesKHR to query the
-capabilities for the input pname:pVideoProfile with
-pname:videoCodecOperation specified as
-ename:VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT, a
-slink:VkVideoDecodeH264ProfileEXT structure must: be chained to
-slink:VkVideoProfileKHR to select a H.264 decode profile.
-If supported, the implementation returns the capabilities associated with
-the specified H.264 decode profile.
-The requirement is similar when querying supported image formats using
-flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR.
-
-A supported H.264 decode profile must: be selected when creating a video
-session by chaining slink:VkVideoDecodeH264ProfileEXT to the
-slink:VkVideoProfileKHR field of slink:VkVideoSessionCreateInfoKHR.
-
-
-=== Capabilities
-
-[open,refpage='VkVideoDecodeH264CapabilitiesEXT',desc='Structure specifying H.264 decode capabilities',type='structs']
---
-When using flink:vkGetPhysicalDeviceVideoCapabilitiesKHR to query the
-capabilities for the input pname:pVideoProfile with
-pname:videoCodecOperation specified as
-ename:VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT, a
-slink:VkVideoDecodeH264CapabilitiesEXT structure must: be chained to
-slink:VkVideoCapabilitiesKHR to get this H.264 decode profile specific
-capabilities.
-
-The slink:VkVideoDecodeH264CapabilitiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoDecodeH264CapabilitiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxLevel is the maximum H.264 level supported by the device.
-  * pname:fieldOffsetGranularity - if Interlaced Video Content is suported,
-    the maximum field offset granularity supported for the picture resource.
-  * pname:stdExtensionVersion is a slink:VkExtensionProperties structure
-    specifying the H.264 extension name and version supported by this
-    implementation.
-
-include::{generated}/validity/structs/VkVideoDecodeH264CapabilitiesEXT.txt[]
---
-
-
-=== Create Information
-
-[open,refpage='VkVideoDecodeH264SessionCreateInfoEXT',desc='Structure specifies H.264 decode session creation parameters',type='structs']
---
-A slink:VkVideoDecodeH264SessionCreateInfoEXT structure can: be chained to
-slink:VkVideoSessionCreateInfoKHR when the function
-flink:vkCreateVideoSessionKHR is called to create a video session for H.264
-decode.
-
-The slink:VkVideoDecodeH264SessionCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoDecodeH264SessionCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:pStdExtensionVersion is a pointer to a slink:VkExtensionProperties
-    structure specifying the H.264 codec extensions defined in
-    code:StdVideoH264Extensions.
-
-include::{generated}/validity/structs/VkVideoDecodeH264SessionCreateInfoEXT.txt[]
---
-
-[open,refpage='VkVideoDecodeH264CreateFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkVideoDecodeH264CreateFlagsEXT.txt[]
-
-tname:VkVideoDecodeH264CreateFlagsEXT is a bitmask type for setting a mask,
-but is currently reserved for future use.
---
-
-
-=== Decoder Parameter Sets
-
-To reduce parameter traffic during decoding, the decoder parameter set
-object supports storing H.264 SPS/PPS parameter sets that may: be later
-referenced during decoding.
-
-[open,refpage='VkVideoDecodeH264SessionParametersCreateInfoEXT',desc='Structure specifies H.264 decoder parameter set information',type='structs']
---
-A slink:VkVideoDecodeH264SessionParametersCreateInfoEXT structure holding
-one H.264 SPS and at least one H.264 PPS paramater set must: be chained to
-slink:VkVideoSessionParametersCreateInfoKHR when calling
-flink:vkCreateVideoSessionParametersKHR to store these parameter set(s) with
-the decoder parameter set object for later reference.
-The provided H.264 SPS/PPS parameters must: be within the limits specified
-during decoder creation for the decoder specified in
-slink:VkVideoSessionParametersCreateInfoKHR.
-
-The slink:VkVideoDecodeH264SessionParametersCreateInfoEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkVideoDecodeH264SessionParametersCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxSpsStdCount is the maximum number of SPS parameters that the
-    sname:VkVideoSessionParametersKHR can contain.
-  * pname:maxPpsStdCount is the maximum number of PPS parameters that the
-    sname:VkVideoSessionParametersKHR can contain.
-  * pname:pParametersAddInfo is `NULL` or a pointer to a
-    slink:VkVideoDecodeH264SessionParametersAddInfoEXT structure specifying
-    H.264 parameters to add upon object creation.
-
-include::{generated}/validity/structs/VkVideoDecodeH264SessionParametersCreateInfoEXT.txt[]
---
-
-[open,refpage='VkVideoDecodeH264SessionParametersAddInfoEXT',desc='Structure specifies H.264 decoder parameter set information',type='structs']
---
-include::{generated}/api/structs/VkVideoDecodeH264SessionParametersAddInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:spsStdCount is the number of SPS elements in pname:pSpsStd.
-    Its value must: be less than or equal to the value of
-    pname:maxSpsStdCount.
-  * pname:pSpsStd is a pointer to an array of
-    code:StdVideoH264SequenceParameterSet structures representing H.264
-    sequence parameter sets.
-    Each element of the array must: have a unique H.264 SPS ID.
-  * pname:ppsStdCount is the number of PPS provided in pname:pPpsStd.
-    Its value must: be less than or equal to the value of
-    pname:maxPpsStdCount.
-  * pname:pPpsStd is a pointer to an array of
-    code:StdVideoH264PictureParameterSet structures representing H.264
-    picture parameter sets.
-    Each element of the array must: have a unique H.264 SPS-PPS ID pair.
-
-.Valid Usage
-****
-  * [[VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-spsStdCount-04822]]
-    The values of pname:spsStdCount and pname:ppsStdCount must: be less than
-    or equal to the values of pname:maxSpsStdCount and pname:maxPpsStdCount,
-    respectively
-  * [[VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-maxSpsStdCount-04823]]
-    When the pname:maxSpsStdCount 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.
-    ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made
-    to add additional data to this object at this point
-  * [[VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-maxPpsStdCount-04824]]
-    When the pname:maxPpsStdCount 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.
-    ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made
-    to add additional data to this object at this point
-  * [[VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-None-04825]]
-    Each entry to be added must: 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-VkVideoDecodeH264SessionParametersAddInfoEXT-None-04826]]
-    Parameter entries that already exist in Video Session Parameters object
-    with a particular SPS-PPS IDs cannot: be replaced nor updated
-  * [[VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-None-04827]]
-    When creating a new object using a Video Session Parameters as a
-    template, the array's parameters with the same SPS-PPS IDs as the ones
-    from the template take precedence
-  * [[VUID-VkVideoDecodeH264SessionParametersAddInfoEXT-None-04828]]
-    SPS/PPS parameters must: comply with the limits specified in
-    slink:VkVideoSessionCreateInfoKHR during Video Session creation
-****
-
-include::{generated}/validity/structs/VkVideoDecodeH264SessionParametersAddInfoEXT.txt[]
---
-
-
-=== Picture Decoding
-
-To decode a picture, the structure slink:VkVideoDecodeH264PictureInfoEXT
-may: be chained to slink:VkVideoDecodeInfoKHR when calling
-flink:vkCmdDecodeVideoKHR.
-
-[open,refpage='VkVideoDecodeH264PictureInfoEXT',desc='Structure specifies H.264 decode picture parameters when decoding a picture',type='structs']
---
-The structure slink:VkVideoDecodeH264PictureInfoEXT representing a picture
-decode operation is defined as:
-
-include::{generated}/api/structs/VkVideoDecodeH264PictureInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pStdPictureInfo is a pointer to a
-    code:StdVideoDecodeH264PictureInfo structure specifying the codec
-    standard specific picture information from the H.264 specification.
-  * pname:slicesCount is the number of slices in this picture.
-  * pname:pSlicesDataOffsets is a pointer to an array of pname:slicesCount
-    offsets indicating the start offset of each slice within the bitstream
-    buffer.
-
-include::{generated}/validity/structs/VkVideoDecodeH264PictureInfoEXT.txt[]
---
-
-[open,refpage='VkVideoDecodeH264DpbSlotInfoEXT',desc='Structure specifies H.264 decode DPB picture information',type='structs']
---
-The slink:VkVideoDecodeH264DpbSlotInfoEXT structure correlates a DPB Slot
-index with codec-specific information and is defined as:
-
-include::{generated}/api/structs/VkVideoDecodeH264DpbSlotInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pStdReferenceInfo is a pointer to a
-    code:StdVideoDecodeH264ReferenceInfo structure specifying the codec
-    standard specific picture reference information from the H.264
-    specification.
-
-include::{generated}/validity/structs/VkVideoDecodeH264DpbSlotInfoEXT.txt[]
---
-
-[open,refpage='VkVideoDecodeH264MvcEXT',desc='Structure specifies parameters of mvc views',type='structs']
---
-The slink:VkVideoDecodeH264MvcEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoDecodeH264MvcEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pStdMvc is a pointer to a code:StdVideoDecodeH264Mvc structure
-    specifying H.264 codec specification information for MVC.
-
-When the content type is H.264 MVC, a slink:VkVideoDecodeH264MvcEXT
-structure must: be chained to slink:VkVideoDecodeH264PictureInfoEXT.
-
-include::{generated}/validity/structs/VkVideoDecodeH264MvcEXT.txt[]
---
diff --git a/registry/vulkan/chapters/video_decode_h265_extensions.txt b/registry/vulkan/chapters/video_decode_h265_extensions.txt
deleted file mode 100644
index 28df08a..0000000
--- a/registry/vulkan/chapters/video_decode_h265_extensions.txt
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[decode-h265]]
-== Video Decode of HEVC (ITU-T H.265)
-
-This extension adds H.265 codec specific structures needed for decode
-session to execute decode jobs which include H.265 sequence header, picture
-parameter header and quantization matrix etc.
-Unless otherwise noted, all references to the H.265 specification are to the
-2013 edition published by the ITU-T, dated April 2013.
-This specification is available at http://www.itu.int/rec/T-REC-H.265.
-
-
-=== H.265 decode profile
-
-A H.265 decode profile is specified using slink:VkVideoDecodeH265ProfileEXT
-chained to slink:VkVideoProfileKHR when the codec-operation in
-slink:VkVideoProfileKHR is
-ename:VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT.
-
-[open,refpage='VkVideoDecodeH265ProfileEXT',desc='Structure specifying H.265 decode profile',type='structs']
---
-The slink:VkVideoDecodeH265ProfileEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoDecodeH265ProfileEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:stdProfileIdc is a code:StdVideoH265ProfileIdc value specifying
-    the H.265 codec profile IDC.
-
-include::{generated}/validity/structs/VkVideoDecodeH265ProfileEXT.txt[]
---
-
-
-=== Selecting an H.265 Profile
-
-When using flink:vkGetPhysicalDeviceVideoCapabilitiesKHR to query the
-capabilities for the input pname:pVideoProfile with
-pname:videoCodecOperation specified as
-ename:VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT, a
-slink:VkVideoDecodeH265ProfileEXT structure must: be chained to
-slink:VkVideoProfileKHR to select a H.265 decode profile.
-If supported, the implementation returns the capabilities associated with
-the specified H.265 decode profile.
-The requirement is similar when querying supported image formats using
-flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR.
-
-A supported H.265 decode profile must: be selected when creating a video
-session by chaining slink:VkVideoDecodeH265ProfileEXT to the
-slink:VkVideoProfileKHR field of slink:VkVideoSessionCreateInfoKHR.
-
-
-=== Capabilities
-
-[open,refpage='VkVideoDecodeH265CapabilitiesEXT',desc='Structure specifies H.265 decode capabilities parameters when decoding a frame',type='structs']
---
-When uses flink:vkGetPhysicalDeviceVideoCapabilitiesKHR to query the
-capabilities for the parameter pname:videoCodecOperation specified as
-ename:VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT,
-slink:VkVideoDecodeH265CapabilitiesEXT structure can: be chained to
-slink:VkVideoCapabilitiesKHR to get this H.265 extension specific
-capabilities.
-
-The slink:VkVideoDecodeH265CapabilitiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoDecodeH265CapabilitiesEXT.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxLevel is the maximum H.265 level supported by the device.
-  * pname:stdExtensionVersion is a slink:VkExtensionProperties structure
-    specifying the H.265 extension name and version supported by this
-    implementation.
-
-include::{generated}/validity/structs/VkVideoDecodeH265CapabilitiesEXT.txt[]
---
-
-
-=== Create Infomation
-
-[open,refpage='VkVideoDecodeH265SessionCreateInfoEXT',desc='Structure specifies H.265 decode session creation parameters',type='structs']
---
-A slink:VkVideoDecodeH265SessionCreateInfoEXT structure can: be chained to
-slink:VkVideoSessionCreateInfoKHR when the function
-flink:vkCreateVideoSessionKHR is called to create a video session for H.265
-decode operations.
-
-The slink:VkVideoDecodeH265SessionCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoDecodeH265SessionCreateInfoEXT.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:pStdExtensionVersion is a pointer to a slink:VkExtensionProperties
-    structure specifying H.265 codec extensions.
-
-include::{generated}/validity/structs/VkVideoDecodeH265SessionCreateInfoEXT.txt[]
---
-
-[open,refpage='VkVideoDecodeH265CreateFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkVideoDecodeH265CreateFlagsEXT.txt[]
-
-tname:VkVideoDecodeH265CreateFlagsEXT is a bitmask type for setting a mask,
-but is currently reserved for future use.
---
-
-
-=== Decoder Parameter Sets
-
-To reduce parameter traffic during decoding, the decoder parameter set
-object supports storing H.265 SPS/PPS parameter sets that may be later
-referenced during decoding.
-
-[open,refpage='VkVideoDecodeH265SessionParametersCreateInfoEXT',desc='Structure specifies H.265 decoder parameter set information',type='structs']
---
-A sname:VkVideoDecodeH265SessionParametersCreateInfoEXT structure holding
-one H.265 SPS and at least one H.265 PPS paramater set must: be chained to
-sname:VkVideoSessionParametersCreateInfoKHR when calling
-fname:vkCreateVideoSessionParametersKHR to store these parameter set(s) with
-the decoder parameter set object for later reference.
-The provided H.265 SPS/PPS parameters must: be within the limits specified
-during decoder creation for the decoder specified in
-sname:VkVideoSessionParametersCreateInfoKHR.
-
-The sname:VkVideoDecodeH265SessionParametersCreateInfoEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkVideoDecodeH265SessionParametersCreateInfoEXT.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxSpsStdCount is the maximum number of SPS parameters that the
-    sname:VkVideoSessionParametersKHR can contain.
-  * pname:maxPpsStdCount is the maximum number of PPS parameters that the
-    sname:VkVideoSessionParametersKHR can contain.
-  * pname:pParametersAddInfo is `NULL` or a pointer to a
-    slink:VkVideoDecodeH265SessionParametersAddInfoEXT structure specifying
-    H.265 parameters to add upon object creation.
-
-include::{generated}/validity/structs/VkVideoDecodeH265SessionParametersCreateInfoEXT.txt[]
---
-
-[open,refpage='VkVideoDecodeH265SessionParametersAddInfoEXT',desc='Structure specifies H.265 decoder parameter set information',type='structs']
---
-include::{generated}/api/structs/VkVideoDecodeH265SessionParametersAddInfoEXT.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:spsStdCount is the number of SPS elements in the pname:pSpsStd.
-    Its value must: be less than or equal to the value of
-    pname:maxSpsStdCount.
-  * pname:pSpsStd is a pointer to an array of
-    code:StdVideoH265SequenceParameterSet structures representing H.265
-    sequence parameter sets.
-    Each element of the array must: have a unique H.265 VPS-SPS ID pair.
-  * pname:ppsStdCount is the number of PPS provided in pname:pPpsStd.
-    Its value must: be less than or equal to the value of
-    pname:maxPpsStdCount.
-  * pname:pPpsStd is a pointer to an array of
-    code:StdVideoH265PictureParameterSet structures representing H.265
-    picture parameter sets.
-    Each element of the array entry must: have a unique H.265 VPS-SPS-PPS ID
-    tuple.
-
-.Valid Usage
-****
-  * [[VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-vpsStdCount-04829]]
-    The values of pname:vpsStdCount, pname:spsStdCount and pname:ppsStdCount
-    must: be less than or equal to the values of pname:maxVpsStdCount,
-    pname:maxSpsStdCount and pname:maxPpsStdCount, respectively
-  * [[VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-maxVpsStdCount-04830]]
-    When the pname:maxVpsStdCount 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.
-    ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made
-    to add additional data to this object at this point
-  * [[VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-maxSpsStdCount-04831]]
-    When the pname:maxSpsStdCount 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.
-    ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made
-    to add additional data to this object at this point
-  * [[VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-maxPpsStdCount-04832]]
-    When the pname:maxPpsStdCount 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.
-    ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made
-    to add additional data to this object at this point
-  * [[VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-None-04833]]
-    Each entry to be added must: 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-VkVideoDecodeH265SessionParametersAddInfoEXT-None-04834]]
-    Parameter entries that already exist in Video Session Parameters object
-    with a particular VPS-SPS-PPS IDs cannot: be replaced nor updated
-  * [[VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-None-04835]]
-    When creating a new object using a Video Session Parameters as a
-    template, the array's parameters with the same VPS-SPS-PPS IDs as the
-    ones from the template take precedence
-  * [[VUID-VkVideoDecodeH265SessionParametersAddInfoEXT-None-04836]]
-    VPS/SPS/PPS parameters must: comply with the limits specified in
-    slink:VkVideoSessionCreateInfoKHR during Video Session creation
-****
-
-include::{generated}/validity/structs/VkVideoDecodeH265SessionParametersAddInfoEXT.txt[]
---
-
-
-=== Picture Parameters
-
-[open,refpage='VkVideoDecodeH265PictureInfoEXT',desc='Structure specifies H.265 picture information when decoding a frame',type='structs']
---
-The slink:VkVideoDecodeH265PictureInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoDecodeH265PictureInfoEXT.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pStdPictureInfo is a pointer to a
-    code:StdVideoDecodeH265PictureInfo structure specifying codec standard
-    specific picture information from the H.265 specification.
-  * pname:slicesCount is the number of slices in this picture.
-  * pname:pSlicesDataOffsets is a pointer to an array of pname:slicesCount
-    offsets indicating the start offset of each slice within the bitstream
-    buffer.
-
-include::{generated}/validity/structs/VkVideoDecodeH265PictureInfoEXT.txt[]
---
-
-[open,refpage='VkVideoDecodeH265DpbSlotInfoEXT',desc='Structure specifies H.265 DPB information when decoding a frame',type='structs']
---
-The slink:VkVideoDecodeH265DpbSlotInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoDecodeH265DpbSlotInfoEXT.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pStdReferenceInfo is a pointer to a
-    code:StdVideoDecodeH265ReferenceInfo structure specifying the codec
-    standard specific picture reference information from the H.264
-    specification.
-
-include::{generated}/validity/structs/VkVideoDecodeH265DpbSlotInfoEXT.txt[]
---
-
diff --git a/registry/vulkan/chapters/video_encode_extensions.txt b/registry/vulkan/chapters/video_encode_extensions.txt
deleted file mode 100644
index 699ba6c..0000000
--- a/registry/vulkan/chapters/video_encode_extensions.txt
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[video-encode-operations]]
-== Video Encode Operations
-
-Before the application can start recording Vulkan command buffers for the
-Video Encode Operations, it must: do the following, beforehand:
-
-  . Ensure that the implementation can encode the Video Content by querying
-    the supported codec operations and profiles using
-    flink:vkGetPhysicalDeviceQueueFamilyProperties2.
-  . By using flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR and providing
-    one or more video profiles, choose the Vulkan formats supported by the
-    implementation.
-    The formats for <<input-encode-picture,input>> and
-    <<reference-picture,reference>> pictures must: be queried and chosen
-    separately.
-    Refer to the section on
-    <<supported-video-input-output-dpb-formats-enumeration,enumeration of
-    supported video formats>>.
-  . Before creating an image to be used as a video picture resource, obtain
-    the supported image creation parameters by querying with
-    flink:vkGetPhysicalDeviceFormatProperties2 and
-    flink:vkGetPhysicalDeviceImageFormatProperties2 using one of the
-    reported formats and adding slink:VkVideoProfilesKHR to the pname:pNext
-    chain of slink:VkFormatProperties2.
-    When querying the parameters with
-    flink:vkGetPhysicalDeviceImageFormatProperties2 for images targeting
-    <<input-encode-picture,input>> and <<reference-picture,reference (DPB)>>
-    pictures, the slink:VkPhysicalDeviceImageFormatInfo2::pname:usage field
-    should contain ename:VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR and
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR, respectively.
-  . Create none, some, or all of the required <<VkImage,images>> for the
-    <<input-encode-picture,input>> and <<reference-picture,reference>>
-    pictures.
-    More Video Picture Resources can: be created at some later point if
-    needed while processing the content to be encoded.
-    Also, if the size of the picture to be encoded is expected to change,
-    the images can: be created based on the maximum expected content size.
-  . Create the <<video-session,video session>> to be used for video encode
-    operations.
-    Before creating the Encode Video Session, the encode capabilities
-    should: be queried with flink:vkGetPhysicalDeviceVideoCapabilitiesKHR to
-    obtain the limits of the parameters allowed by the implementation for a
-    particular codec profile.
-  . Bind memory resources with the encode video session by calling
-    flink:vkBindVideoSessionMemoryKHR.
-    The video session cannot: be used until memory resources are allocated
-    and bound to it.
-    In order to determine the required memory sizes and heap types of the
-    device memory allocations, flink:vkGetVideoSessionMemoryRequirementsKHR
-    should: be called.
-  . Create one or more <<video-session-parameters-introduction,Session
-    Parameter objects>> for use across command buffer recording operations,
-    if required by the codec extension in use.
-    These objects must: be created against a <<video-session,video session>>
-    with the parameters required by the codec.
-    Each <<video-session-parameters-introduction,Session Parameter object>>
-    created is a child object of the associated <<video-session, Session
-    object>> and cannot: be bound in the command buffer with any other
-    <<video-session,Session Object>>.
-
-
-The recording of Video Encode Commands against a Vulkan Command Buffer
-consists of the following sequence:
-
-  . flink:vkCmdBeginVideoCodingKHR starts the recording of one or more Video
-    Encode operations in the command buffer.
-    For each Video Encode Command operation, a Video Session must: be bound
-    to the command buffer within this command.
-    This command establishes a Vulkan Video Encode Context that consists of
-    the bound Video Session Object, Session Parameters Object, and the
-    required Video Picture Resources.
-    The established Video Encode Context is in effect until the
-    flink:vkCmdEndVideoCodingKHR command is recorded.
-    If more Video Encode operations are to be required after the
-    flink:vkCmdEndVideoCodingKHR command, another Video Encode Context can:
-    be started with the flink:vkCmdBeginVideoCodingKHR command.
-  . flink:vkCmdEncodeVideoKHR specifies one or more frames to be encoded.
-    The slink:VkVideoEncodeInfoKHR parameters, and the codec extension
-    structures chained to this, specify the details of the encode operation.
-  . flink:vkCmdControlVideoCodingKHR records operations against the encoded
-    data, encoding device, or the Video Session state.
-  . flink:vkCmdEndVideoCodingKHR signals the end of the recording of the
-    Vulkan Video Encode Context, as established by
-    flink:vkCmdBeginVideoCodingKHR.
-
-In addition to the above, the following commands can: be recorded between
-flink:vkCmdBeginVideoCodingKHR and flink:vkCmdEndVideoCodingKHR:
-
-  * Query operations
-  * Global Memory Barriers
-  * Buffer Memory Barriers
-  * Image Memory Barriers (these must: be used to transition the Video
-    Picture Resources to the proper
-    ename:VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR and
-    ename:VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR layouts).
-  * Pipeline Barriers
-  * Events
-  * Timestamps
-  * Device Groups (device mask)
-
-The following Video Encode related commands must: be recorded *outside* the
-Vulkan Video Encode Context established with the
-flink:vkCmdBeginVideoCodingKHR and flink:vkCmdEndVideoCodingKHR commands:
-
-  * Sparse Memory Binding
-  * Copy Commands
-  * Clear Commands
-
-
-=== Video Encode Vulkan Command Buffer Commands
-
-[open,refpage='vkCmdEncodeVideoKHR',desc='Encode operation for bitstream generation',type='protos']
---
-To launch an encode operation that results in bitstream generation, call:
-
-include::{generated}/api/protos/vkCmdEncodeVideoKHR.txt[]
-
-  * pname:commandBuffer is the command buffer to be filled with this
-    function for encoding to generate a bitstream.
-  * pname:pEncodeInfo is a pointer to a slink:VkVideoEncodeInfoKHR
-    structure.
-
-include::{generated}/validity/protos/vkCmdEncodeVideoKHR.txt[]
---
-
-[open,refpage='VkVideoEncodeInfoKHR',desc='Structure to chain codec-specific structures to',type='structs']
---
-The slink:VkVideoEncodeInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeInfoKHR.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is a pointer to a structure extending this structure.
-    A codec-specific extension structure must: be chained to specify what
-    bitstream unit to generate with this encode operation.
-  * pname:flags is a bitmask of elink:VkVideoEncodeFlagBitsKHR specifying
-    encode flags, and is reserved for future versions of this specification.
-  * pname:qualityLevel is the coding quality level of the encoding.
-    It is defined by the codec-specific extensions.
-  * pname:codedExtent is the coded size of the encode operations.
-  * pname:dstBitstreamBuffer is the buffer where the encoded bitstream
-    output will be produced.
-  * pname:dstBitstreamBufferOffset is the offset in the
-    pname:dstBitstreamBuffer where the encoded bitstream output will start.
-    pname:dstBitstreamBufferOffset's value must: be aligned to
-    slink:VkVideoCapabilitiesKHR::pname:minBitstreamBufferOffsetAlignment,
-    as reported by the implementation.
-  * pname:dstBitstreamBufferMaxRange is the maximum size of the
-    pname:dstBitstreamBuffer that can be used while the encoded bitstream
-    output is produced.
-    pname:dstBitstreamBufferMaxRange's value must: be aligned to
-    slink:VkVideoCapabilitiesKHR::pname:minBitstreamBufferSizeAlignment, as
-    reported by the implementation.
-  * pname:srcPictureResource is the Picture Resource of the
-    <<input-encode-picture,Input Picture>> to be encoded by the operation.
-  * pname:pSetupReferenceSlot is a pointer to a
-    slink:VkVideoReferenceSlotKHR structure used for generating a
-    reconstructed reference slot and Picture Resource.
-    pname:pSetupReferenceSlot->slotIndex specifies the slot index number to
-    use as a target for producing the Reconstructed (DPB) data.
-    pname:pSetupReferenceSlot must: be one of the entries provided in
-    slink:VkVideoBeginCodingInfoKHR via the pname:pReferenceSlots within the
-    flink:vkCmdBeginVideoCodingKHR command that established the Vulkan Video
-    Encode Context for this command.
-  * pname:referenceSlotCount is the number of Reconstructed Reference
-    Pictures that will be used when this encoding operation is executing.
-  * pname:pReferenceSlots is `NULL` or a pointer to an array of
-    slink:VkVideoReferenceSlotKHR structures that will be used when this
-    encoding operation is executing.
-    Each entry in pname:pReferenceSlots must: be one of the entries provided
-    in slink:VkVideoBeginCodingInfoKHR via the pname:pReferenceSlots within
-    the flink:vkCmdBeginVideoCodingKHR command that established the Vulkan
-    Video Encode Context for this command.
-
-Multiple flink:vkCmdEncodeVideoKHR commands may: be recorded within a Vulkan
-Video Encode Context.
-The execution of each flink:vkCmdEncodeVideoKHR command will result in
-generating codec-specific bitstream units.
-These bitstream units are generated consecutively into the bitstream buffer
-specified in pname:dstBitstreamBuffer of slink:VkVideoEncodeInfoKHR within
-the flink:vkCmdBeginVideoCodingKHR command.
-The produced bitstream is the sum of all these bitstream units, including
-any padding between the bitstream units.
-Any bitstream padding must: be filled with data compliant to the codec
-standard so as not to cause any syntax errors during decoding of the
-bitstream units with the padding included.
-The range of the bitstream buffer written can: be queried via
-<<queries-video-encode-bitstream-buffer-range, video encode bitstream buffer
-range queries>>.
-
-include::{generated}/validity/structs/VkVideoEncodeInfoKHR.txt[]
---
-
-[open,refpage='VkVideoEncodeFlagBitsKHR',desc='Video Encode Command Flags',type='enums']
---
-The flink:vkCmdEncodeVideoKHR flags are defined with the following
-enumeration:
-
-include::{generated}/api/enums/VkVideoEncodeFlagBitsKHR.txt[]
-
-  * ename:VK_VIDEO_ENCODE_RESERVED_0_BIT_KHR The current version of the
-    specification has reserved this value for future use.
---
-
-[open,refpage='VkVideoEncodeFlagsKHR',desc='Bitmask specifying the video encode flink:vkCmdEncodeVideoKHR flags',type='flags']
---
-include::{generated}/api/flags/VkVideoEncodeFlagsKHR.txt[]
-
-tlink:VkVideoEncodeFlagsKHR is a bitmask type for setting a mask of zero or
-more elink:VkVideoEncodeFlagBitsKHR.
---
-
-[open,refpage='VkVideoEncodeRateControlInfoKHR',desc='Structure to set encode rate control parameters',type='structs']
---
-The slink:VkVideoEncodeRateControlInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeRateControlInfoKHR.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of
-    elink:VkVideoEncodeRateControlModeFlagBitsKHR specifying encode rate
-    control flags.
-  * pname:rateControlMode is a elink:VkVideoEncodeRateControlModeFlagBitsKHR
-    value specifying the encode rate control mode.
-  * pname:averageBitrate is the average bitrate in bits/second.
-    Valid when rate control is not
-    ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR.
-  * pname:peakToAverageBitrateRatio is the peak bitrate to average bitrate
-    in percentage.
-    Valid when rate control is
-    ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR.
-  * pname:frameRateNumerator is the numerator of the frame rate.
-    Valid when rate control is not
-    ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR.
-  * pname:frameRateDenominator is the denominator of the frame rate.
-    Valid when rate control is not
-    ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR.
-  * pname:virtualBufferSizeInMs is the leaky bucket model virtual buffer
-    size in milliseconds, with respect to peak bitrate.
-    Valid when rate control is not
-    ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR.
-    For example, virtual buffer size is (pname:virtualBufferSizeInMs *
-    pname:peakToAverageBitrateRatio * pname:averageBitrate / 100000).
-
-A codec-specific extension structure for further rate control parameter
-settings may: be chained to slink:VkVideoEncodeRateControlInfoKHR.
-
-include::{generated}/validity/structs/VkVideoEncodeRateControlInfoKHR.txt[]
---
-
-[open,refpage='VkVideoEncodeRateControlModeFlagBitsKHR',desc='Video encode rate control modes',type='enums']
---
-The rate control modes are defined with the following enums:
-
-include::{generated}/api/enums/VkVideoEncodeRateControlModeFlagBitsKHR.txt[]
-
-  * ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_NONE_BIT_KHR for disabling rate
-    control.
-  * ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_CBR_BIT_KHR for constant bitrate
-    rate control mode.
-  * ename:VK_VIDEO_ENCODE_RATE_CONTROL_MODE_VBR_BIT_KHR for variable bitrate
-    rate control mode.
---
-
-[open,refpage='VkVideoEncodeRateControlModeFlagsKHR',desc='Bitmask specifying the video encode flink:vkCmdControlVideoCodingKHR flags',type='flags']
---
-include::{generated}/api/flags/VkVideoEncodeRateControlModeFlagsKHR.txt[]
-
-tlink:VkVideoEncodeRateControlModeFlagsKHR is a bitmask type for setting a
-mask of zero or more elink:VkVideoEncodeRateControlModeFlagBitsKHR.
---
-
-[open,refpage='VkVideoEncodeRateControlFlagBitsKHR',desc='Video Encode Rate Control Flags',type='enums']
---
-The flink:vkCmdControlVideoCodingKHR flags are defined with the following
-enumeration:
-
-include::{generated}/api/enums/VkVideoEncodeRateControlFlagBitsKHR.txt[]
-
-  * ename:VK_VIDEO_ENCODE_RESERVED_0_BIT_KHR The current version of the
-    specification has reserved this value for future use.
---
-
-[open,refpage='VkVideoEncodeRateControlFlagsKHR',desc='Bitmask specifying the video encode flink:vkCmdControlVideoCodingKHR flags',type='flags']
---
-include::{generated}/api/flags/VkVideoEncodeRateControlFlagsKHR.txt[]
-
-tlink:VkVideoEncodeRateControlFlagsKHR is a bitmask type for setting a mask
-of zero or more elink:VkVideoEncodeRateControlFlagBitsKHR.
---
diff --git a/registry/vulkan/chapters/video_encode_h264_extensions.txt b/registry/vulkan/chapters/video_encode_h264_extensions.txt
deleted file mode 100644
index 50227ce..0000000
--- a/registry/vulkan/chapters/video_encode_h264_extensions.txt
+++ /dev/null
@@ -1,547 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[encode-h264]]
-== Encode H.264
-
-This extension adds H.264 codec specific structures/types needed to support
-H.264 encoding.
-Unless otherwise noted, all references to the H.264 specification are to the
-2010 edition published by the ITU-T, dated March 2010.
-This specification is available at http://www.itu.int/rec/T-REC-H.264.
-
-
-=== H.264 encode profile
-
-An H.264 encode profile is specified by including the
-slink:VkVideoEncodeH264ProfileEXT structure in the pname:pNext chain of the
-slink:VkVideoProfileKHR structure when
-slink:VkVideoProfileKHR::pname:videoCodecOperation is
-ename:VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT.
-
-[open,refpage='VkVideoEncodeH264ProfileEXT',desc='Structure specifying H.264 encode profile',type='structs']
---
-The slink:VkVideoEncodeH264ProfileEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH264ProfileEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:stdProfileIdc is a code:StdVideoH264ProfileIdc value specifying
-    the H.264 codec profile IDC.
-
-include::{generated}/validity/structs/VkVideoEncodeH264ProfileEXT.txt[]
---
-
-
-=== Capabilities
-
-[open,refpage='VkVideoEncodeH264CapabilitiesEXT',desc='Structure specifying H.264 encode capabilities',type='structs']
---
-When flink:vkGetPhysicalDeviceVideoCapabilitiesKHR is called to query the
-capabilities with parameter pname:videoCodecOperation specified as
-ename:VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT, a
-slink:VkVideoEncodeH264CapabilitiesEXT structure can: be chained to
-slink:VkVideoCapabilitiesKHR to retrieve H.264 extension specific
-capabilities.
-
-The slink:VkVideoEncodeH264CapabilitiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH264CapabilitiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of elink:VkVideoEncodeH264CapabilityFlagBitsEXT
-    describing supported encoding tools.
-  * pname:inputModeFlags is a bitmask of
-    elink:VkVideoEncodeH264InputModeFlagBitsEXT describing supported command
-    buffer input granularities/modes.
-  * pname:outputModeFlags is a bitmask of
-    elink:VkVideoEncodeH264OutputModeFlagBitsEXT describing supported output
-    (bitstream size reporting) granularities/modes.
-  * pname:maxPictureSizeInMbs reports the maximum encoded picture width and
-    height in Macroblocks.
-  * pname:minPictureSizeInMbs reports the minimum encoded picture width and
-    height in Macroblocks.
-  * pname:inputImageDataAlignment reports alignment of data that must: be
-    filled in the input image horizontally and vertically in pixels.
-    Max is 16: Data must: be filled up to Macroblock boundary (no
-    extrapolation/filling is supported by implementation).
-    Min is 1: The implementation will take care of all needed
-    extrapolation/filling up to the next Macroblock boundary.
-  * pname:maxNumL0ReferenceForP reports the maximum number of reference
-    pictures the encoder supports as list0 references for P pictures.
-  * pname:maxNumL0ReferenceForB reports the maximum number of reference
-    pictures the encoder supports as list0 references for B pictures.
-    Reports 0 if B pictures are not supported.
-  * pname:maxNumL1Reference reports the maximum number of reference pictures
-    the encoder supports as list1 references if B pictures are supported.
-    Reports 0 if B pictures are not supported.
-  * pname:qualityLevelCount is the number of discrete quality levels
-    supported.
-  * pname:stdExtensionVersion is the specific H.264 extension name and
-    version supported by this implementation.
-
-include::{generated}/validity/structs/VkVideoEncodeH264CapabilitiesEXT.txt[]
---
-
-[open,refpage='VkVideoEncodeH264CapabilityFlagsEXT',desc='Bitmask of VkVideoEncodeH264CapabilityFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkVideoEncodeH264CapabilityFlagsEXT.txt[]
-
-tname:VkVideoEncodeH264CapabilityFlagsEXT is a bitmask type for setting a
-mask of zero or more elink:VkVideoEncodeH264CapabilityFlagBitsEXT.
---
-
-[open,refpage='VkVideoEncodeH264CapabilityFlagBitsEXT',desc='Video encode H.264 capability flags',type='enums']
---
-Bits which may: be set in
-slink:VkVideoEncodeH264CapabilitiesEXT::pname:flags, indicating the encoding
-tools supported, are:
-
-include::{generated}/api/enums/VkVideoEncodeH264CapabilityFlagBitsEXT.txt[]
-
-  * ename:VK_VIDEO_ENCODE_H264_CAPABILITY_CABAC_BIT_EXT reports if CABAC
-    entropy coding is supported.
-  * ename:VK_VIDEO_ENCODE_H264_CAPABILITY_CAVLC_BIT_EXT reports if CAVLC
-    entropy coding is supported.
-    An implementation must: support at least one entropy coding mode.
-  * ename:VK_VIDEO_ENCODE_H264_CAPABILITY_WEIGHTED_BI_PRED_IMPLICIT_BIT_EXT
-    reports if using weighted_bipred_idc_flag from StdVideoH264PpsFlags is
-    supported.
-  * ename:VK_VIDEO_ENCODE_H264_CAPABILITY_TRANSFORM_8X8_BIT_EXT reports if
-    enabling transform_8x8_mode_flag in StdVideoH264PpsFlags is supported.
-  * ename:VK_VIDEO_ENCODE_H264_CAPABILITY_CHROMA_QP_OFFSET_BIT_EXT reports
-    if setting chroma_qp_index_offset in StdVideoH264PictureParameterSet is
-    supported.
-  * ename:VK_VIDEO_ENCODE_H264_CAPABILITY_SECOND_CHROMA_QP_OFFSET_BIT_EXT
-    reports if setting second_chroma_qp_index_offset in
-    StdVideoH264PictureParameterSet is supported.
-  * ename:VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_DISABLED_BIT_EXT
-    reports if using STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_DISABLED
-    from StdVideoH264DisableDeblockingFilterIdc is supported.
-  * ename:VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_ENABLED_BIT_EXT
-    reports if using STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_ENABLED
-    from StdVideoH264DisableDeblockingFilterIdc is supported.
-  * ename:VK_VIDEO_ENCODE_H264_CAPABILITY_DEBLOCKING_FILTER_PARTIAL_BIT_EXT
-    reports if using STD_VIDEO_H264_DISABLE_DEBLOCKING_FILTER_IDC_PARTIAL
-    from StdVideoH264DisableDeblockingFilterIdc is supported.
-    An implementation must: support at least one deblocking filter mode.
-  * ename:VK_VIDEO_ENCODE_H264_CAPABILITY_MULTIPLE_SLICE_PER_FRAME_BIT_EXT
-  * ename:VK_VIDEO_ENCODE_H264_CAPABILITY_EVENLY_DISTRIBUTED_SLICE_SIZE_BIT_EXT
---
-
-[open,refpage='VkVideoEncodeH264InputModeFlagsEXT',desc='Bitmask of VkVideoEncodeH264InputModeFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkVideoEncodeH264InputModeFlagsEXT.txt[]
-
-tname:VkVideoEncodeH264InputModeFlagsEXT is a bitmask type for setting a
-mask of zero or more elink:VkVideoEncodeH264InputModeFlagBitsEXT.
---
-
-[open,refpage='VkVideoEncodeH264InputModeFlagBitsEXT',desc='Video encode H.264 input modes',type='enums']
---
-The pname:inputModeFlags field reports the various commmand buffer input
-granularities supported by the implementation as follows:
-
-include::{generated}/api/enums/VkVideoEncodeH264InputModeFlagBitsEXT.txt[]
-
-  * ename:VK_VIDEO_ENCODE_H264_INPUT_MODE_FRAME_BIT_EXT indicates that a
-    single command buffer must: at least encode an entire frame.
-    Any non-VCL NALUs must: be encoded using the same command buffer as the
-    frame if ename:VK_VIDEO_ENCODE_H264_INPUT_MODE_NON_VCL_BIT_EXT is not
-    supported.
-  * ename:VK_VIDEO_ENCODE_H264_INPUT_MODE_SLICE_BIT_EXT indicates that a
-    single command buffer must: at least encode a single slice.
-    Any non-VCL NALUs must: be encoded using the same command buffer as the
-    first slice of the frame if
-    ename:VK_VIDEO_ENCODE_H264_INPUT_MODE_NON_VCL_BIT_EXT is not supported.
-  * ename:VK_VIDEO_ENCODE_H264_INPUT_MODE_NON_VCL_BIT_EXT indicates that a
-    single command buffer may: encode a non-VCL NALU by itself.
-
-An implementation must: support at least one of
-ename:VK_VIDEO_ENCODE_H264_INPUT_MODE_FRAME_BIT_EXT or
-ename:VK_VIDEO_ENCODE_H264_INPUT_MODE_SLICE_BIT_EXT.
---
-
-[open,refpage='VkVideoEncodeH264OutputModeFlagsEXT',desc='Bitmask of VkVideoEncodeH264OutputModeFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkVideoEncodeH264OutputModeFlagsEXT.txt[]
-
-tname:VkVideoEncodeH264OutputModeFlagsEXT is a bitmask type for setting a
-mask of zero or more elink:VkVideoEncodeH264InputModeFlagBitsEXT.
---
-
-[open,refpage='VkVideoEncodeH264OutputModeFlagBitsEXT',desc='Video encode H.264 output modes',type='enums']
---
-Bits which may: be set in
-slink:VkVideoEncodeH264CapabilitiesEXT::pname:outputModeFlags, indicating
-the minimum bitstream generation commands that must: be included between
-each flink:vkCmdBeginVideoCodingKHR and flink:vkCmdEndVideoCodingKHR pair
-(henceforth simply begin/end pair), are:
-
-include::{generated}/api/enums/VkVideoEncodeH264OutputModeFlagBitsEXT.txt[]
-
-  * ename:VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FRAME_BIT_EXT indicates that
-    calls to generate all NALUs of a frame must: be included within a single
-    begin/end pair.
-    Any non-VCL NALUs must: be encoded within the same begin/end pair if
-    ename:VK_VIDEO_ENCODE_H264_OUTPUT_MODE_NON_VCL_BIT_EXT is not supported.
-  * ename:VK_VIDEO_ENCODE_H264_OUTPUT_MODE_SLICE_BIT_EXT indicates that each
-    begin/end pair must: encode at least one slice.
-    Any non-VCL NALUs must: be encoded within the same begin/end pair as the
-    first slice of the frame if
-    ename:VK_VIDEO_ENCODE_H264_OUTPUT_MODE_NON_VCL_BIT_EXT is not supported.
-  * ename:VK_VIDEO_ENCODE_H264_OUTPUT_MODE_NON_VCL_BIT_EXT indicates that
-    each begin/end pair may: encode only a non-VCL NALU by itself.
-    An implementation must: support at least one of
-    ename:VK_VIDEO_ENCODE_H264_OUTPUT_MODE_FRAME_BIT_EXT or
-    ename:VK_VIDEO_ENCODE_H264_OUTPUT_MODE_SLICE_BIT_EXT.
-
-A single begin/end pair must: not encode more than a single frame.
-
-The bitstreams of NALUs generated within a single begin/end pair are written
-continuously into the same bitstream buffer (any padding between the NALUs
-must: be compliant to the H.264 standard).
-
-The supported input modes must: be coarser or equal to the supported output
-modes.
-For example, it is illegal to report slice input is supported but only frame
-output is supported.
-
-An implementation must: report one of the following combinations of
-input/output modes:
-
-  ** Input: Frame, Output: Frame
-  ** Input: Frame, Output: Frame and Non-VCL
-  ** Input: Frame, Output: Slice
-  ** Input: Frame, Output: Slice and Non-VCL
-  ** Input: Slice, Output: Slice
-  ** Input: Slice, Output: Slice and Non-VCL
-  ** Input: Frame and Non-VCL, Output: Frame and Non-VCL
-  ** Input: Frame and Non-VCL, Output: Slice and Non-VCL
-  ** Input: Slice and Non-VCL, Output: Slice and Non-VCL
---
-
-
-=== Create Information
-
-[open,refpage='VkVideoEncodeH264SessionCreateInfoEXT', desc='Structure specifies H.264 encoder creation parameters', type='structs']
---
-A slink:VkVideoEncodeH264SessionCreateInfoEXT structure must: be chained to
-slink:VkVideoSessionCreateInfoKHR when the function
-flink:vkCreateVideoSessionKHR is called with pname:videoCodecOperation in
-slink:VkVideoSessionCreateInfoKHR set to
-ename:VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT.
-
-The sname:VkVideoEncodeH264SessionCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH264SessionCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of tlink:VkVideoEncodeH264CreateFlagsEXT
-    specifying H.264 encoder creation flags.
-  * pname:maxPictureSizeInMbs specifies the syntax element
-    pic_width_in_mbs_minus1 + 1 and the syntax element
-    pic_height_in_map_units_minus1 + 1.
-  * pname:pStdExtensionVersion is a pointer to a slink:VkExtensionProperties
-    structure specifying H.264 codec extensions.
-
-include::{generated}/validity/structs/VkVideoEncodeH264SessionCreateInfoEXT.txt[]
---
-
-[open,refpage='VkVideoEncodeH264CreateFlagsEXT',desc='Bitmask specifying the video encode session creation flags',type='flags']
---
-include::{generated}/api/flags/VkVideoEncodeH264CreateFlagsEXT.txt[]
-
-tlink:VkVideoEncodeH264CreateFlagsEXT is a bitmask type for setting a mask
-of zero or more elink:VkVideoEncodeH264CreateFlagBitsEXT.
---
-
-[open,refpage='VkVideoEncodeH264CreateFlagBitsEXT',desc='Video encode session creation flags',type='enums']
---
-Bits which can: be set in
-slink:VkVideoEncodeH264SessionCreateInfoEXT::pname:flags are:
-
-include::{generated}/api/enums/VkVideoEncodeH264CreateFlagBitsEXT.txt[]
-
-  * ename:VK_VIDEO_ENCODE_H264_CREATE_DEFAULT_EXT is 0, and specifies no
-    additional creation flags.
-  * ename:VK_VIDEO_ENCODE_H264_CREATE_RESERVED_0_BIT_EXT The current version
-    of the specification has reserved this value for future use.
---
-
-
-=== Encoder Parameter Sets
-
-To reduce parameter traffic during encoding, the encoder parameter set
-object supports storing H.264 SPS/PPS parameter sets that may: be later
-referenced during encoding.
-
-[open,refpage='VkVideoEncodeH264SessionParametersCreateInfoEXT',desc='Structure specifies H.264 encoder parameter set information',type='structs']
---
-A slink:VkVideoEncodeH264SessionParametersCreateInfoEXT structure holding
-one H.264 SPS and at least one H.264 PPS paramater set must: be chained to
-slink:VkVideoSessionParametersCreateInfoKHR when calling
-flink:vkCreateVideoSessionParametersKHR to store these parameter set(s) with
-the encoder parameter set object for later reference.
-The provided H.264 SPS/PPS parameters must: be within the limits specified
-during encoder creation for the encoder specified in
-slink:VkVideoSessionParametersCreateInfoKHR.
-
-The slink:VkVideoEncodeH264SessionParametersCreateInfoEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH264SessionParametersCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxSpsStdCount is the maximum number of SPS parameters that the
-    sname:VkVideoSessionParametersKHR can contain.
-  * pname:maxPpsStdCount is the maximum number of PPS parameters that the
-    sname:VkVideoSessionParametersKHR can contain.
-  * pname:pParametersAddInfo is `NULL` or a pointer to a
-    sname:VkVideoEncodeH264SessionParametersAddInfoEXT structure specifying
-    H.264 parameters to add upon object creation.
-
-include::{generated}/validity/structs/VkVideoEncodeH264SessionParametersCreateInfoEXT.txt[]
---
-
-[open,refpage='VkVideoEncodeH264SessionParametersAddInfoEXT',desc='Structure specifies H.264 encoder parameter set information',type='structs']
---
-include::{generated}/api/structs/VkVideoEncodeH264SessionParametersAddInfoEXT.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:spsStdCount is the number of SPS elements in the pname:pSpsStd.
-    Its value must: be less than or equal to the value of
-    pname:maxSpsStdCount.
-  * pname:pSpsStd is a pointer to an array of
-    code:StdVideoH264SequenceParameterSet structures representing H.264
-    sequence parameter sets.
-    Each element of the array must: have a unique H.264 SPS ID.
-  * pname:ppsStdCount is the number of PPS provided in pname:pPpsStd.
-    Its value must: be less than or equal to the value of
-    pname:maxPpsStdCount.
-  * pname:pPpsStd is a pointer to an array of
-    code:StdVideoH264PictureParameterSet structures representing H.264
-    picture parameter sets.
-    Each element of the array must: have a unique H.264 SPS-PPS ID pair.
-
-.Valid Usage
-****
-  * [[VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-spsStdCount-04837]]
-    The values of pname:spsStdCount and pname:ppsStdCount must: be less than
-    or equal to the values of pname:maxSpsStdCount and pname:maxPpsStdCount,
-    respectively
-  * [[VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-maxSpsStdCount-04838]]
-    When the pname:maxSpsStdCount 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.
-    ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made
-    to add additional data to this object at this point
-  * [[VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-maxPpsStdCount-04839]]
-    When the pname:maxPpsStdCount 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.
-    ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made
-    to add additional data to this object at this point
-  * [[VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-None-04840]]
-    Each entry to be added must: 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-VkVideoEncodeH264SessionParametersAddInfoEXT-None-04841]]
-    Parameter entries that already exist in Video Session Parameters object
-    with a particular SPS-PPS IDs cannot: be replaced nor updated
-  * [[VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-None-04842]]
-    When creating a new object using a Video Session Parameters as a
-    template, the array's parameters with the same SPS-PPS IDs as the ones
-    from the template take precedence
-  * [[VUID-VkVideoEncodeH264SessionParametersAddInfoEXT-None-04843]]
-    SPS/PPS parameters must: comply with the limits specified in
-    slink:VkVideoSessionCreateInfoKHR during Video Session creation
-****
-
-include::{generated}/validity/structs/VkVideoEncodeH264SessionParametersAddInfoEXT.txt[]
---
-
-
-=== Frame Encoding
-
-In order to encode a frame, add a slink:VkVideoEncodeH264VclFrameInfoEXT
-structure to the pname:pNext chain of the slink:VkVideoEncodeInfoKHR
-structure passed to the flink:vkCmdEncodeVideoKHR command.
-
-[open,refpage='VkVideoEncodeH264VclFrameInfoEXT',desc='Structure specifies H.264 encode frame parameters',type='structs']
---
-The structure slink:VkVideoEncodeH264VclFrameInfoEXT representing a frame
-encode operation is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH264VclFrameInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:refDefaultFinalList0EntryCount is the default number of reference
-    List0 entries for all slices of this frame.
-    Each slice may: override this by providing its own List0 entries.
-  * pname:pRefDefaultFinalList0Entries is a pointer to an array of
-    slink:VkVideoEncodeH264DpbSlotInfoEXT structures providing information
-    for each reference List0 entry.
-    The entries provided must: be ordered after all reference List0
-    modification operations are applied (i.e. final list order).
-    The entires provided must: not reflect decoded picture marking
-    operations in this frame that are applicable to references; the impact
-    of such operations must: be reflected in future frame encode cmds.
-    The slot index in each entry must: match one of the slot indexes
-    provided in pname:pReferenceSlots of the slink:VkVideoEncodeInfoKHR
-    structure to which this structure is chained.
-  * pname:refDefaultFinalList1EntryCount is the default number of reference
-    List1 entries for all slices of this frame.
-    Each slice may: override this by providing its own List1 entries.
-  * pname:pRefDefaultFinalList1Entries is a pointer to an array of
-    slink:VkVideoEncodeH264DpbSlotInfoEXT structures providing information
-    related to each reference List1 entry.
-    The entries provided must: be ordered after all reference List1
-    modification operations are applied (i.e. final list order).
-    The entires provided must: not reflect decoded picture marking
-    operations in this frame that are applicable to references; the impact
-    of such operations must: be reflected in future frame encode cmds.
-    The slot index in each entry must: match one of the slot indexes
-    provided in pname:pReferenceSlots of the slink:VkVideoEncodeInfoKHR
-    structure to which this structure is chained.
-  * pname:naluSliceEntryCount is the number of NALUs in this frame.
-  * pname:pNaluSliceEntries is a pointer to an array of pname:naluCount
-    slink:VkVideoEncodeH264NaluSliceEXT structures that make up the frame.
-    This is an ordered sequence; the NALUs are generated consecutively in
-    the bitstream buffer (provided in pname:bitstreamBuffer in
-    slink:VkVideoBeginCodingInfoKHR) in the same order as in this array.
-  * pname:pCurrentPictureInfo is a pointer to a
-    slink:VkVideoEncodeH264DpbSlotInfoEXT structure specifying information
-    for the reconstructed picture for this frame.
-    Info provided must: reflect decoded picture marking operations in this
-    frame that are applicable to this frame.
-    The slot index in pCurrentPictureInfo must: match the slot index
-    provided in pname:pSetupReferenceSlot of slink:VkVideoEncodeInfoKHR
-    structure to which this structure is chained to.
-
-include::{generated}/validity/structs/VkVideoEncodeH264VclFrameInfoEXT.txt[]
---
-
-[open,refpage='VkVideoEncodeH264DpbSlotInfoEXT',desc='Structure specifies H.264 encode DPB picture information',type='structs']
---
-The slink:VkVideoEncodeH264DpbSlotInfoEXT structure correlates a DPB Slot
-index with codec-specific information and is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH264DpbSlotInfoEXT.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:slotIndex is the slot index for this picture.
-    pname:slotIndex must: match the pname:slotIndex in
-    pname:pSetupReferenceSlot of slink:VkVideoEncodeInfoKHR in the command
-    used to encode the corresponding picture.
-  * pname:pStdPictureInfo is a pointer to a
-    code:StdVideoEncodeH264PictureInfo structure specifying codec standard
-    specific syntax/information associated with this picture from the H.264
-    specification.
-
-include::{generated}/validity/structs/VkVideoEncodeH264DpbSlotInfoEXT.txt[]
---
-
-[open,refpage='VkVideoEncodeH264NaluSliceEXT',desc='Structure specifies H.264 encode slice NALU parameters',type='structs']
---
-The structure slink:VkVideoEncodeH264NaluSliceEXT representing a slice is
-defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH264NaluSliceEXT.txt[]
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pSliceHeaderStd is a pointer to a
-    code:StdVideoEncodeH264SliceHeader specifying the standard slice header
-    from the H.264 specification.
-  * pname:mbCount is the number of macroblocks in this slice.
-  * pname:refFinalList0EntryCount is the number of active references in
-    List0.
-    If zero, the default frame List0 provided in the enclosing
-    slink:VkVideoEncodeH264VclFrameInfoEXT is used.
-    If non-zero, it overrides the default frame List0 for this slice.
-  * pname:pRefFinalList0Entries is a pointer to a
-    slink:VkVideoEncodeH264DpbSlotInfoEXT specifying DPB information for the
-    active List0 references.
-    The same restrictions related to order of entries and decoded picture
-    marking operations described for List0 in
-    slink:VkVideoEncodeH264VclFrameInfoEXT apply here.
-  * pname:refFinalList1EntryCount is the number of active references in
-    List1.
-    If zero, the default frame List1 provided in the enclosing
-    slink:VkVideoEncodeH264VclFrameInfoEXT is used.
-    If non-zero, it overrides the default frame List1 for this slice.
-  * pname:pRefFinalList1Entries is a pointer to a
-    slink:VkVideoEncodeH264DpbSlotInfoEXT structure specifying DPB
-    information for the active List1 references.
-    The same restrictions related to order of entries and decoded picture
-    marking operations described for List1 in
-    slink:VkVideoEncodeH264VclFrameInfoEXT apply here.
-  * pname:precedingNaluBytes specifies the number of bytes consumed by
-    non-VCL NALUs inserted before this slice (not through this API).
-  * pname:minQp is the minimum quantization parameter when rate control is
-    enabled.
-  * pname:maxQp is the maximum quantization parameter when rate control is
-    enabled.
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-TODO: move pname:precedingNaluBytes, pname:minQp, and pname:maxQP to the
-Frame/SliceRC struct?
-====
-endif::editing-notes[]
-
-When rate control is disabled, pname:minQp and pname:maxQp must: be set to
-the same QP value.
-
-include::{generated}/validity/structs/VkVideoEncodeH264NaluSliceEXT.txt[]
---
-
-[open,refpage='VkVideoEncodeH264EmitPictureParametersEXT',desc='Structure specifies H.264 encode SPS NALU insertion parameters',type='structs']
---
-The structure slink:VkVideoEncodeH264EmitPictureParametersEXT is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH264EmitPictureParametersEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:spsId is the H.264 SPS ID for the H.264 SPS to insert in the
-    bitstream.
-    The SPS ID must: match the SPS provided in pname:spsStd of
-    slink:VkVideoEncodeH264SessionParametersCreateInfoEXT.
-    This is retrieved from the slink:VkVideoSessionParametersKHR object
-    provided in slink:VkVideoBeginCodingInfoKHR.
-  * pname:emitSpsEnable enables the emitting of the SPS structure with id of
-    pname:spsId.
-  * pname:ppsIdEntryCount is the number of entries in the
-    pname:ppsIdEntries.
-    If this parameter is `0` then no pps entries are going to be emitted in
-    the bitstream.
-  * pname:ppsIdEntries is a pointer to an array of H.264 PPS IDs for the
-    H.264 PPS to insert in the bitstream.
-    The PPS IDs must: match one of the IDs of the PPS(s) provided in
-    pname:pPpsStd of slink:VkVideoEncodeH264SessionParametersCreateInfoEXT
-    to identify the PPS parameter set to insert in the bitstream.
-    This is retrieved from the slink:VkVideoSessionParametersKHR object
-    provided in slink:VkVideoBeginCodingInfoKHR.
-
-include::{generated}/validity/structs/VkVideoEncodeH264EmitPictureParametersEXT.txt[]
---
diff --git a/registry/vulkan/chapters/video_encode_h265_extensions.txt b/registry/vulkan/chapters/video_encode_h265_extensions.txt
deleted file mode 100644
index b0b394f..0000000
--- a/registry/vulkan/chapters/video_encode_h265_extensions.txt
+++ /dev/null
@@ -1,512 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[encode-h265]]
-== Encode H.265
-
-This extension adds H.265 codec-specific structures/types needed to support
-H.265 video encoding.
-Unless otherwise noted, all references to the H.265 specification are to the
-2013 edition published by the ITU-T, dated April 2013.
-This specification is available at http://www.itu.int/rec/T-REC-H.265.
-
-
-=== H.265 encode profile
-
-An H.265 encode profile is specified by including the
-slink:VkVideoEncodeH265ProfileEXT structure in the pname:pNext chain of the
-slink:VkVideoProfileKHR structure when
-slink:VkVideoProfileKHR::pname:videoCodecOperation is
-ename:VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT.
-
-[open,refpage='VkVideoEncodeH265ProfileEXT',desc='Structure specifying H.265 encode profile',type='structs']
---
-The sname:VkVideoEncodeH265ProfileEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH265ProfileEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:stdProfileIdc is a code:StdVideoH265ProfileIdc value specifying
-    the H.265 codec profile IDC.
-
-include::{generated}/validity/structs/VkVideoEncodeH265ProfileEXT.txt[]
---
-
-
-=== Capabilities
-
-[open,refpage='VkVideoEncodeH265CapabilitiesEXT',desc='Structure specifying H.265 encode capabilities',type='structs']
---
-When calling flink:vkGetPhysicalDeviceVideoCapabilitiesKHR with
-pname:pVideoProfile->videoCodecOperation specified as
-ename:VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT, the
-slink:VkVideoEncodeH265CapabilitiesEXT structure must: be included in the
-pname:pNext chain of the slink:VkVideoCapabilitiesKHR structure to retrieve
-H.265-specific capabilities for video encoding.
-
-The sname:VkVideoEncodeH265CapabilitiesEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH265CapabilitiesEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:inputModeFlags is a bitmask of
-    elink:VkVideoEncodeH265InputModeFlagBitsEXT describing the command
-    buffer input granularities/modes supported by the implementation.
-  * pname:outputModeFlags is a bitmask of
-    elink:VkVideoEncodeH265OutputModeFlagBitsEXT describing the output
-    (bitstream size reporting) granularities/modes supported by the
-    implementation.
-  * pname:ctbSizes is a bitmask of elink:VkVideoEncodeH265CtbSizeFlagBitsEXT
-    describing the supported CTB sizes.
-  * pname:inputImageDataAlignment reports the alignment, in pixels, for the
-    width and height of the picture data within the images used in video
-    encoding.
-  * pname:maxNumL0ReferenceForP reports the maximum number of reference
-    pictures the implementation supports in the reference list L0 for P
-    pictures.
-  * pname:maxNumL0ReferenceForB reports the maximum number of reference
-    pictures the implementation supports in the reference list L0 for B
-    pictures.
-    The reported value is `0` if encoding of B pictures is not supported.
-  * pname:maxNumL1Reference reports the maximum number of reference pictures
-    the implementation supports in the reference list L1 if encoding of B
-    pictures is supported.
-    The reported value is `0` if encoding of B pictures is not supported.
-  * pname:maxNumSubLayers reports the maximum number of sublayers.
-  * pname:qualityLevelCount is the number of quality levels supported.
-  * pname:stdExtensionVersion is a slink:VkExtensionProperties structure in
-    which the H.265 extension name and version supported by the
-    implementation are returned.
-
-include::{generated}/validity/structs/VkVideoEncodeH265CapabilitiesEXT.txt[]
---
-
-[open,refpage='VkVideoEncodeH265CapabilityFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkVideoEncodeH265CapabilityFlagsEXT.txt[]
-
-tname:VkVideoEncodeH265CapabilityFlagsEXT is a bitmask type for setting a
-mask, but is currently reserved for future use.
-
-// ... a mask of zero or more elink:VkVideoEncodeH265CapabilityFlagBitsEXT.
---
-
-[open,refpage='VkVideoEncodeH265InputModeFlagsEXT',desc='Bitmask of VkVideoEncodeH265InputModeFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkVideoEncodeH265InputModeFlagsEXT.txt[]
-
-tname:VkVideoEncodeH265InputModeFlagsEXT is a bitmask type for setting a
-mask of zero or more elink:VkVideoEncodeH265InputModeFlagBitsEXT.
---
-
-[open,refpage='VkVideoEncodeH265InputModeFlagBitsEXT',desc='Video encode H.265 input modes',type='enums']
---
-Bits which may: be set in
-slink:VkVideoEncodeH265CapabilitiesEXT::pname:inputModeFlags, indicating the
-commmand buffer input granularities supported by the implementation, are:
-
-include::{generated}/api/enums/VkVideoEncodeH265InputModeFlagBitsEXT.txt[]
-
-  * ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_FRAME_BIT_EXT indicates that a
-    single command buffer must: at least encode an entire frame.
-    Any non-VCL NALUs must: be encoded using the same command buffer as the
-    frame if ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_NON_VCL_BIT_EXT is not
-    supported.
-  * ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_SLICE_BIT_EXT indicates that a
-    single command buffer must: at least encode a single slice.
-    Any non-VCL NALUs must: be encoded using the same command buffer as the
-    first slice of the frame if
-    ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_NON_VCL_BIT_EXT is not supported.
-  * ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_NON_VCL_BIT_EXT indicates that a
-    single command buffer may: encode a non-VCL NALU by itself.
-
-An implementation must: support at least one of
-ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_FRAME_BIT_EXT or
-ename:VK_VIDEO_ENCODE_H265_INPUT_MODE_SLICE_BIT_EXT.
---
-
-[open,refpage='VkVideoEncodeH265OutputModeFlagsEXT',desc='Bitmask of VkVideoEncodeH265OutputModeFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkVideoEncodeH265OutputModeFlagsEXT.txt[]
-
-tname:VkVideoEncodeH265OutputModeFlagsEXT is a bitmask type for setting a
-mask of zero or more elink:VkVideoEncodeH265OutputModeFlagBitsEXT.
---
-
-[open,refpage='VkVideoEncodeH265OutputModeFlagBitsEXT',desc='Video encode H.265 output modes',type='enums']
---
-Bits which may: be set in
-slink:VkVideoEncodeH265CapabilitiesEXT::pname:outputModeFlags, indicating
-the minimum bitstream generation commands that must: be included between
-each flink:vkCmdBeginVideoCodingKHR and flink:vkCmdEndVideoCodingKHR pair
-(henceforth simply begin/end pair), are:
-
-include::{generated}/api/enums/VkVideoEncodeH265OutputModeFlagBitsEXT.txt[]
-
-  * ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_FRAME_BIT_EXT indicates that
-    calls to generate all NALUs of a frame must: be included within a single
-    begin/end pair.
-    Any non-VCL NALUs must: be encoded within the same begin/end pair if
-    ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_NON_VCL_BIT_EXT is not supported.
-  * ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_SLICE_BIT_EXT indicates that each
-    begin/end pair must: encode at least one slice.
-    Any non-VCL NALUs must: be encoded within the same begin/end pair as the
-    first slice of the frame if
-    ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_NON_VCL_BIT_EXT is not supported.
-  * ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_NON_VCL_BIT_EXT indicates that
-    each begin/end pair may: encode only a non-VCL NALU by itself.
-    An implementation must: support at least one of
-    ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_FRAME_BIT_EXT or
-    ename:VK_VIDEO_ENCODE_H265_OUTPUT_MODE_SLICE_BIT_EXT.
-
-A single begin/end pair must: not encode more than a single frame.
-
-The bitstreams of NALUs generated within a single begin/end pair are written
-continuously into the same bitstream buffer (any padding between the NALUs
-must: be compliant to the H.265 standard).
-
-The supported input modes must: be coarser or equal to the supported output
-modes.
-For example, it is illegal to report slice input is supported but only frame
-output is supported.
-
-An implementation must: report one of the following combinations of
-input/output modes:
-
-  * Input: Frame, Output: Frame
-  * Input: Frame, Output: Frame and Non-VCL
-  * Input: Frame, Output: Slice
-  * Input: Frame, Output: Slice and Non-VCL
-  * Input: Slice, Output: Slice
-  * Input: Slice, Output: Slice and Non-VCL
-  * Input: Frame and Non-VCL, Output: Frame and Non-VCL
-  * Input: Frame and Non-VCL, Output: Slice and Non-VCL
-  * Input: Slice and Non-VCL, Output: Slice and Non-VCL
---
-
-[open,refpage='VkVideoEncodeH265CtbSizeFlagsEXT',desc='Bitmask of VkVideoEncodeH265CtbSizeFlagBitsEXT',type='flags']
---
-include::{generated}/api/flags/VkVideoEncodeH265CtbSizeFlagsEXT.txt[]
-
-tname:VkVideoEncodeH265CtbSizeFlagsEXT is a bitmask type for setting a mask
-of zero or more elink:VkVideoEncodeH265CtbSizeFlagBitsEXT.
---
-
-[open,refpage='VkVideoEncodeH265CtbSizeFlagBitsEXT',desc='Supported CTB sizes for H.265 video encode',type='enums']
---
-Bits which may: be set in
-slink:VkVideoEncodeH265CapabilitiesEXT::pname:ctbSizes, indicating the CTB
-sizes supported by the implementation, are:
-
-include::{generated}/api/enums/VkVideoEncodeH265CtbSizeFlagBitsEXT.txt[]
-
-  * ename:VK_VIDEO_ENCODE_H265_CTB_SIZE_8_BIT_EXT specifies that a CTB size
-    of 8x8 is supported.
-  * ename:VK_VIDEO_ENCODE_H265_CTB_SIZE_16_BIT_EXT specifies that a CTB size
-    of 16x16 is supported.
-  * ename:VK_VIDEO_ENCODE_H265_CTB_SIZE_32_BIT_EXT specifies that a CTB size
-    of 32x32 is supported.
-  * ename:VK_VIDEO_ENCODE_H265_CTB_SIZE_64_BIT_EXT specifies that a CTB size
-    of 64x64 is supported.
---
-
-
-=== Create Information
-
-[open,refpage='VkVideoEncodeH265SessionCreateInfoEXT', desc='Structure specifies H.265 encoder creation parameters', type='structs']
---
-When creating a Video Session object with
-slink:VkVideoSessionCreateInfoKHR::pname:pVideoProfile->videoCodecOperation
-specified as ename:VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_EXT, add a
-slink:VkVideoEncodeH265SessionCreateInfoEXT structure to the pname:pNext
-chain of the slink:VkVideoSessionCreateInfoKHR structure passed to
-flink:vkCreateVideoSessionKHR in order to specify the H.265-specific video
-encoder session creation parameters.
-
-The sname:VkVideoEncodeH265SessionCreateInfoEXT structure is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH265SessionCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:pStdExtensionVersion is a pointer to a slink:VkExtensionProperties
-    structure specifying the H.265 codec extension version.
-
-include::{generated}/validity/structs/VkVideoEncodeH265SessionCreateInfoEXT.txt[]
---
-
-[open,refpage='VkVideoEncodeH265CreateFlagsEXT',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkVideoEncodeH265CreateFlagsEXT.txt[]
-
-tname:VkVideoEncodeH265CreateFlagsEXT is a bitmask type for setting a mask,
-but is currently reserved for future use.
---
-
-
-=== Encoder H.265 Video Session Parameters Object
-
-When creating a Video Session Parameters object, add a
-slink:VkVideoEncodeH265SessionParametersCreateInfoEXT structure to the
-pname:pNext chain of the slink:VkVideoSessionParametersCreateInfoKHR
-structure passed to flink:vkCreateVideoSessionParametersKHR in order to
-specify the H.265-specific video encoder session parameters.
-
-[open,refpage='VkVideoEncodeH265SessionParametersCreateInfoEXT',desc='Structure specifies H.265 encoder parameter set info',type='structs']
---
-The sname:VkVideoEncodeH265SessionParametersCreateInfoEXT structure is
-defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH265SessionParametersCreateInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:maxVpsStdCount is the maximum number of entries of type
-    code:StdVideoH265VideoParameterSet within
-    sname:VkVideoSessionParametersKHR.
-  * pname:maxSpsStdCount is the maximum number of entries of type
-    code:StdVideoH265SequenceParameterSet within
-    sname:VkVideoSessionParametersKHR.
-  * pname:maxPpsStdCount is the maximum number of entries of type
-    code:StdVideoH265PictureParameterSet within
-    sname:VkVideoSessionParametersKHR.
-  * pname:pParametersAddInfo is `NULL` or a pointer to a
-    slink:VkVideoEncodeH265SessionParametersAddInfoEXT structure specifying
-    the video session parameters to add upon creation of this object.
-
-When a slink:VkVideoSessionParametersKHR object contains
-pname:maxVpsStdCount code:StdVideoH265VideoParameterSet entries, no
-additional code:StdVideoH265VideoParameterSet entries can be added to it,
-and ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made
-to add these entries.
-When a slink:VkVideoSessionParametersKHR object contains
-pname:maxSpsStdCount code:StdVideoH265SequenceParameterSet entries, no
-additional code:StdVideoH265SequenceParameterSet entries can be added to it,
-and ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made
-to add these entries.
-When a slink:VkVideoSessionParametersKHR object contains
-pname:maxPpsStdCount code:StdVideoH265PictureParameterSet entries, no
-additional code:StdVideoH265PictureParameterSet entries can be added to it,
-and ename:VK_ERROR_TOO_MANY_OBJECTS will be returned if an attempt is made
-to add these entries.
-
-include::{generated}/validity/structs/VkVideoEncodeH265SessionParametersCreateInfoEXT.txt[]
---
-
-[open,refpage='VkVideoEncodeH265SessionParametersAddInfoEXT',desc='Structure specifies H.265 encoder parameter set info',type='structs']
---
-The sname:VkVideoEncodeH265SessionParametersAddInfoEXT structure is defined
-as:
-
-include::{generated}/api/structs/VkVideoEncodeH265SessionParametersAddInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:vpsStdCount is the number of VPS elements in pname:pVpsStd.
-  * pname:pVpsStd is a pointer to an array of pname:vpsStdCount
-    code:StdVideoH265VideoParameterSet structures representing H.265 video
-    parameter sets.
-  * pname:spsStdCount is the number of SPS elements in pname:pSpsStd.
-  * pname:pSpsStd is a pointer to an array of pname:spsStdCount
-    code:StdVideoH265SequenceParameterSet structures representing H.265
-    sequence parameter sets.
-  * pname:ppsStdCount is the number of PPS elements in pname:pPpsStd.
-  * pname:pPpsStd is a pointer to an array of pname:ppsStdCount
-    code:StdVideoH265PictureParameterSet structures representing H.265
-    picture parameter sets.
-
-include::{generated}/validity/structs/VkVideoEncodeH265SessionParametersAddInfoEXT.txt[]
-
-.Valid Usage
-****
-  * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-vpsStdCount-06438]]
-    The values of pname:vpsStdCount, pname:spsStdCount and pname:ppsStdCount
-    must: be less than or equal to the values of
-    slink:VkVideoEncodeH265SessionParametersCreateInfoEXT::pname:maxVpsStdCount,
-    slink:VkVideoEncodeH265SessionParametersCreateInfoEXT:pname:maxSpsStdCount,
-    and
-    slink:VkVideoEncodeH265SessionParametersCreateInfoEXT:pname:maxPpsStdCount,
-    respectively
-  * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-pVpsStd-06439]]
-    Each code:StdVideoH265VideoParameterSet entry in pname:pVpsStd must:
-    have a unique H.265 VPS ID
-  * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-pSpsStd-06440]]
-    Each code:StdVideoH265SequenceParameterSet entry in pname:pSpsStd must:
-    have a unique H.265 VPS-SPS ID pair
-  * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-pPpsStd-06441]]
-    Each code:StdVideoH265PictureParameterSet entry in pname:pPpsStd must:
-    have a unique H.265 VPS-SPS-PPS ID tuple
-  * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-None-06442]]
-    Each entry to be added must: 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-VkVideoEncodeH265SessionParametersAddInfoEXT-None-06443]]
-    Parameter entries that already exist in Video Session Parameters object
-    with a particular VPS-SPS-PPS IDs must: not be replaced nor updated
-  * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-None-06444]]
-    When creating a new object using a Video Session Parameters as a
-    template, the array's parameters with the same VPS-SPS-PPS IDs as the
-    ones from the template take precedence
-  * [[VUID-VkVideoEncodeH265SessionParametersAddInfoEXT-None-06445]]
-    VPS/SPS/PPS parameters must: comply with the limits specified in
-    slink:VkVideoSessionCreateInfoKHR during Video Session creation
-****
---
-
-
-=== Frame Encoding
-
-In order to encode a frame, add a slink:VkVideoEncodeH265VclFrameInfoEXT
-structure to the pname:pNext chain of the slink:VkVideoEncodeInfoKHR
-structure passed to the flink:vkCmdEncodeVideoKHR command.
-
-[open,refpage='VkVideoEncodeH265VclFrameInfoEXT',desc='Structure specifies H.265 encode frame parameters',type='structs']
---
-The structure slink:VkVideoEncodeH265VclFrameInfoEXT representing a frame
-encode operation is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH265VclFrameInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:pReferenceFinalLists is `NULL` or a pointer to a
-    slink:VkVideoEncodeH265ReferenceListsEXT structure specifying the
-    reference lists to be used for the current picture.
-  * pname:naluSliceEntryCount is the number of slice NALUs in the frame.
-  * pname:pNaluSliceEntries is a pointer to an array of
-    slink:VkVideoEncodeH265NaluSliceEXT structures specifying the division
-    of the current picture into slices and the properties of these slices.
-  * pname:pCurrentPictureInfo is a pointer to a
-    code:StdVideoEncodeH265PictureInfo structure specifying the syntax and
-    other codec-specific information from the H.265 specification,
-    associated with this picture.
-
-include::{generated}/validity/structs/VkVideoEncodeH265VclFrameInfoEXT.txt[]
---
-
-[open,refpage='VkVideoEncodeH265NaluSliceEXT',desc='Structure specifies H.265 encode slice NALU parameters',type='structs']
---
-The structure slink:VkVideoEncodeH265NaluSliceEXT representing a slice is
-defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH265NaluSliceEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:ctbCount is the number of CTBs in this slice.
-  * pname:pReferenceFinalLists is `NULL` or a pointer to a
-    slink:VkVideoEncodeH265ReferenceListsEXT structure specifying the
-    reference lists to be used for the current slice.
-    If pname:pReferenceFinalLists is not `NULL`, these reference lists
-    override the reference lists provided in
-    slink:VkVideoEncodeH265VclFrameInfoEXT::pname:pReferenceFinalLists.
-  * pname:pSliceHeaderStd is a pointer to a
-    code:StdVideoEncodeH265SliceHeader structure specifying the slice header
-    for the current slice.
-
-include::{generated}/validity/structs/VkVideoEncodeH265NaluSliceEXT.txt[]
---
-
-[open,refpage='VkVideoEncodeH265DpbSlotInfoEXT',desc='Structure specifies H.265 encode decoded pic info',type='structs']
---
-The structure slink:VkVideoEncodeH265DpbSlotInfoEXT, representing a
-reconstructed picture that is being used as a reference picture, is defined
-as:
-
-include::{generated}/api/structs/VkVideoEncodeH265DpbSlotInfoEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:slotIndex is the <<dpb-slot, DPB Slot>> index for this picture.
-  * pname:pStdReferenceInfo is a pointer to a
-    code:StdVideoEncodeH265ReferenceInfo structure specifying the syntax and
-    other codec-specific information from the H.265 specification,
-    associated with this reference picture.
-
-include::{generated}/validity/structs/VkVideoEncodeH265DpbSlotInfoEXT.txt[]
---
-
-[open,refpage='VkVideoEncodeH265ReferenceListsEXT',desc='Structure specifies H.265 reference frame lists',type='structs']
---
-The structure slink:VkVideoEncodeH265ReferenceListsEXT representing
-reference lists is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH265ReferenceListsEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:referenceList0EntryCount is the number of reference pictures in
-    reference list L0 and is identical to
-    code:StdVideoEncodeH265SliceHeader::pname:num_ref_idx_l0_active_minus1 + 1.
-  * pname:pReferenceList0Entries is a pointer to an array of
-    pname:referenceList0EntryCount slink:VkVideoEncodeH265DpbSlotInfoEXT
-    structures specifying the reference list L0 entries for the current
-    picture.
-  * pname:referenceList1EntryCount is the number of reference pictures in
-    reference list L1 and is identical to
-    code:StdVideoEncodeH265SliceHeader::pname:num_ref_idx_l1_active_minus1 + 1.
-  * pname:pReferenceList1Entries is a pointer to an array of
-    pname:referenceList1EntryCount slink:VkVideoEncodeH265DpbSlotInfoEXT
-    structures specifying the reference list L1 entries for the current
-    picture.
-  * pname:pReferenceModifications is a pointer to a
-    code:StdVideoEncodeH265ReferenceModifications structure specifying
-    reference list modifications.
-
-include::{generated}/validity/structs/VkVideoEncodeH265ReferenceListsEXT.txt[]
---
-
-[open,refpage='VkVideoEncodeH265EmitPictureParametersEXT',desc='Structure specifies H.265 encode VPS NALU insertion parameters',type='structs']
---
-The structure slink:VkVideoEncodeH265EmitPictureParametersEXT is defined as:
-
-include::{generated}/api/structs/VkVideoEncodeH265EmitPictureParametersEXT.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:vpsId is the H.265 VPS ID for the H.265 VPS to insert in the
-    bitstream.
-    The VPS ID must: match the VPS provided in pname:vpsStd of
-    slink:VkVideoEncodeH265SessionParametersCreateInfoEXT.
-    This is retrieved from the slink:VkVideoSessionParametersKHR object
-    provided in slink:VkVideoBeginCodingInfoKHR.
-  * pname:spsId is the H.265 SPS ID for the H.265 SPS to insert in the
-    bitstream.
-    The SPS ID must: match one of the IDs of the SPS(s) provided in
-    pname:pSpsStd of slink:VkVideoEncodeH265SessionParametersCreateInfoEXT
-    to identify the SPS parameter set to insert in the bitstream.
-    This is retrieved from the slink:VkVideoSessionParametersKHR object
-    provided in slink:VkVideoBeginCodingInfoKHR.
-  * pname:emitVpsEnable enables the emitting of the VPS structure with id of
-    pname:vpsId.
-  * pname:emitSpsEnable enables the emitting of the SPS structure with id of
-    pname:spsId.
-  * pname:ppsIdEntryCount is the number of entries in the
-    pname:ppsIdEntries.
-    If this parameter is `0` then no pps entries are going to be emitted in
-    the bitstream.
-  * pname:ppsIdEntries is the H.265 PPS IDs for the H.265 PPS to insert in
-    the bitstream.
-    The PPS IDs must: match one of the IDs of the PPS(s) provided in
-    pname:pPpsStd of slink:VkVideoEncodeH265SessionParametersCreateInfoEXT
-    to identify the PPS parameter set to insert in the bitstream.
-    This is retrieved from the slink:VkVideoSessionParametersKHR object
-    provided in slink:VkVideoBeginCodingInfoKHR.
-
-include::{generated}/validity/structs/VkVideoEncodeH265EmitPictureParametersEXT.txt[]
---
diff --git a/registry/vulkan/chapters/video_extensions.txt b/registry/vulkan/chapters/video_extensions.txt
deleted file mode 100644
index 7d597a0..0000000
--- a/registry/vulkan/chapters/video_extensions.txt
+++ /dev/null
@@ -1,1657 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[video-decode-and-encode-operations]]
-= Video Decode and Encode Operations
-
-Vulkan implementations can: expose video decode and encode engines, which
-are independent from the graphics and compute engines.
-Video decode and encode is performed by recording video operations and
-submitting them to video decode and encode queues.
-Vulkan provides core support for video decode and encode and can: support a
-variety of video codecs through individual extensions built on the core
-video support.
-
-The subsections below detail the fundamental components and operation of
-Vulkan video.
-
-
-== Technical Terminology and Semantics
-
-
-[[video-picture-resources]]
-=== Video Picture Resources
-
-*Video Picture Resources* contain format information, can: be
-multidimensional and may: have associated metadata.
-The metadata can: include implementation-private details required for the
-decode or encode operations and application managed color-space related
-information.
-
-In Vulkan, a <<video-picture-resources,Video Picture Resource>> is
-represented by a slink:VkImage.
-The slink:VkImageView, representing the slink:VkImage, is used with the
-decode operations as <<decoded-output-picture,Output>> and <<dpb,Decoded
-Picture Buffer (DPB)>>, and with the encode operation as
-<<input-encode-picture,Input>> and <<reconstructed-pictures, Reconstructed>>
-<<video-picture-resources,Video Picture Resource>>.
-
-
-[[reference-picture]]
-=== Reference Picture
-
-Video *Reference Picture* is a <<video-picture-resources,Video Picture
-Resource>> that can: be used in the video decode or encode process to
-provide predictions of the values of samples in the subsequently decoded or
-encoded pictures.
-
-
-[[decoded-output-picture]]
-=== Decoded Output Picture
-
-The pixels resulting from the video decoding process are stored in a
-*Decoded Output Picture*, represented by a slink:VkImageView.
-This can: be shared with the <<dpb, Encoder Reconstructed or Decoder DPB>>
-<<video-picture-resources,Video Picture Resources>>.
-It can: also be used as an input for Video Encode, Graphics, Compute
-processing, or WSI presentation.
-
-
-[[input-encode-picture]]
-=== Input Picture to Encode
-
-The primary source of input pixels for the video encoding process is the
-*Input Picture to Encode*, represented by a slink:VkImageView.
-This can: be shared with the <<dpb, Encoder Reconstructed or Decoder DPB>>
-<<video-picture-resources,Video Picture Resources>>.
-It can: be a direct target of Video Decode, Graphics, Compute processing, or
-WSI presentation.
-
-
-[[dpb]]
-=== Decoded Picture Buffer (DPB)
-
-Previously decoded pictures are used by video codecs to provide predictions
-of the values of samples in the subsequently decoded pictures.
-At the decoder, such <<video-picture-resources,Video Picture Resources>> are
-stored in a *Decoded Picture Buffer (DPB)* as an indexed set of
-<<reference-picture,Reference Pictures>>.
-
-
-[[reconstructed-pictures]]
-=== Reconstructed Pictures
-
-An integral part of the video decoding pipeline is the reconstruction of
-pictures from the compressed stream.
-A similar stage exists in the video encoding pipeline as well.
-Such reconstructed pictures may: be used as <<reference-picture,Reference
-Pictures>> for subsequently decoded or encoded pictures.
-The correct use of such <<reference-picture,Reference Pictures>> is driven
-by the video compression standard, the implementation, and the
-application-specific use cases.
-
-This specification refers to the collection of the *Decoded Picture Buffer*
-and *Reconstructed Pictures* as <<dpb, Decoded Picture Buffer (DPB) Set>>,
-or only, *DPB*.
-
-
-[[dpb-slot]]
-=== Decoded Picture Buffer (DPB) Slot
-
-*Decoded Picture Buffer (DPB) Slot* represents a single or multi-layer
-indexed <<reference-picture,Reference Picture's>> entry within the
-<<video-session, Video Session's>> <<dpb,DPB Set>>.
-A valid <<dpb-slot,DPB Slot>> index starts from zero and goes up to the
-maximum of *N* - 1, where *N* is the number of <<reference-picture,Reference
-Picture>> entries requested for a <<video-session, Video Session>>.
-
-
-[[reference-metadata]]
-=== Reference Picture Metadata
-
-The opaque <<dpb-slot,DPB Slot>> state managed by the implementation may:
-contain *Reference Picture Metadata*, present when the
-<<video-picture-resources,picture resource>> associated with the
-<<dpb-slot,DPB Slot>> is used as a <<reference-picture,reference picture>>
-in one or more video decode or encode operations.
-
-An implementation or application may: have other Picture Metadata related to
-the Video Picture Resource or the DPB Slot, but such data is outside the
-scope of this specification.
-
-[NOTE]
-.Note:
-====
-The video decode or encode implementation does not maintain internal
-references to the <<reference-picture,Reference Pictures>>, beyond the
-<<reference-metadata,Reference Picture Metadata>>.
-It is the responsibility of the Vulkan Application to create, manage, and
-destroy, as well as to provide those Video Picture Resources, when required,
-during the decoding or encoding process.
-====
-
-
-[[color-space-metadata]]
-=== Color Space Metadata
-
-*Color Space Metadata* is the additional static or dynamic state associated
-with a <<video-picture-resources,Video Picture Resource>> specifying the
-color volume (the color primaries, white point, and luminance range) of the
-display that was used in mastering the video content.
-The use of *Color Space Metadata* is outside the scope of the current
-version of the video core specification.
-
-
-== Introduction
-
-This chapter discusses extensions supporting Video Decode or Encode
-operations.
-Video Decode and Encode operations are supported by queues with an
-advertised queue capability of ename:VK_QUEUE_VIDEO_DECODE_BIT_KHR and
-ename:VK_QUEUE_VIDEO_ENCODE_BIT_KHR, respectively.
-Video Decode or Encode queue operation support allows for Vulkan
-applications to cooperate closely with other graphics or compute operations
-seamlessly and efficiently, therefore improving the overall application
-performance.
-
-
-[[video-decode-queue]]
-=== Video Decode Queue
-
-`apiext:VK_KHR_video_decode_queue` adds a video decode queue type bit
-ename:VK_QUEUE_VIDEO_DECODE_BIT_KHR to elink:VkQueueFlagBits.
-As in the case of other queue types, an application must: use
-flink:vkGetPhysicalDeviceQueueFamilyProperties to query whether the physical
-device has support for the Video Decode Queue.
-When the implementation reports the ename:VK_QUEUE_VIDEO_DECODE_BIT_KHR bit
-for a queue family, it advertises general support for Vulkan queue
-operations described in <<devsandqueues, Devices and Queues>>.
-
-
-[[video-encode-queue]]
-=== Video Encode Queue
-
-`apiext:VK_KHR_video_encode_queue` adds a video encode queue type bit
-ename:VK_QUEUE_VIDEO_ENCODE_BIT_KHR to elink:VkQueueFlagBits.
-As in the case of other queue types, an application must: use
-flink:vkGetPhysicalDeviceQueueFamilyProperties to query whether the physical
-device has support for the Video Encode Queue.
-When the implementation reports the ename:VK_QUEUE_VIDEO_ENCODE_BIT_KHR bit
-for a queue family, it advertises general support for Vulkan queue
-operations described in <<devsandqueues, Devices and Queues>>.
-
-The rest of the chapter focuses, specifically, on Video Decode and Encode
-queue operations.
-
-
-[[video-session-introduction]]
-=== Video Session
-
-Before performing any video decoding or encoding operations, the application
-must: create a <<video-session,Video Session>> instance, of type
-slink:VkVideoSessionKHR.
-A <<video-session,Video Session>> instance is an immutable object and
-supports a single compression standard (for example, H.264, H.265, VP9, AV1,
-etc.).
-The implementation uses the slink:VkVideoSessionKHR object to maintain the
-video state for the video decode or video encode operation.
-A <<video-session,Video Session>> instance is created specifically:
-
-  * For a particular video compression standard;
-  * For video decoding or video encoding;
-  * With maximum supported decoded or encoded picture width/height;
-  * With the maximum number of supported <<dpb,DPB>> or
-    <<reconstructed-pictures,Reconstructed Pictures>> slots that can be
-    allocated;
-  * With the maximum number of <<reference-picture,Reference Pictures>> that
-    can: be used simultaneously for video decode or encode operations;
-  * Codec color and features profile;
-  * Color Space format description (not supported with this version of the
-    specification);
-
-slink:VkVideoSessionKHR represents a single video decode or encode stream.
-For each concurrently used stream, a separate instance of
-slink:VkVideoSessionKHR is required.
-After the application has finished with the processing of a stream, it can
-reuse the <<video-session,Video Session>> instance for another, provided
-that the configuration parameters between the two usages are compatible (as
-determined by the video compression standard in use).
-Once the slink:VkVideoSessionKHR instance has been created, the video
-compression standard and profiles, <<input-encode-picture,Input>> /
-<<decoded-output-picture,Output>> / <<dpb,DPB>> formats, and the settings
-like the maximum extent cannot: be changed.
-
-The values of the following slink:VkVideoSessionKHR parameters can: be
-updated each frame, subject to the restrictions imposed on parameter updates
-by the video compression standard in use:
-
-  * decoded or encoded picture size
-  * number of active <<dpb,DPB>> or <<reconstructed-pictures,Reconstructed
-    Picture>> slots
-  * number of <<reference-picture,Reference Pictures>> in use,
-  * color space and color space metadata
-  * color space metadata.
-
-The updated parameters must: not exceed the maximum limits specified when
-creating the slink:VkVideoSessionKHR instance.
-
-
-[[video-session-device-memory-heaps]]
-=== Video Session Device Memory Heaps
-
-After creating a <<video-session,Video Session>> instance, and before the
-object can be used for any of the decode or encode operations, the
-application must: allocate and bind device memory resources to the Video
-Session object.
-An implementation may: require one or more device memory heaps of different
-memory types, as reported by the
-flink:vkGetVideoSessionMemoryRequirementsKHR function, to be bound with the
-flink:vkBindVideoSessionMemoryKHR function to the <<video-session,Video
-Session>>, For more information about the *Video Session Device Memory*,
-please refer to the <<binding-session-memory, Binding the Session Object
-Device Memory>> section, below.
-
-
-[[video-session-parameters-introduction]]
-=== Video Session Parameters
-
-A lot of codec standards require parameters that are in use for the entire
-video stream.
-For example, H.264/AVC and HEVC standards require sequence and picture
-parameter sets (SPS and PPS) that apply to multiple Video Decode and Encode
-frames, layers, and sub-layers.
-Vulkan Video uses <<video-session-parameters,Video Session Parameters>>
-objects to store such standard parameters.
-The application creates one or more <<video-session-parameters,Video Session
-Parameters>> Objects against a <<video-session,Video Session>>, with a set
-of common Video Parameters that are required for the processing of the video
-content.
-During the object creation, the implementation stores the parameters to the
-created instance.
-During command buffer recording, it is the responsibility of the application
-to provide the <<video-session-parameters,Video Session Parameters>> object
-containing the parameters that are necessary for the processing the portion
-of the stream under consideration.
-
-
-[[video-picture-subresources]]
-=== Video Picture Subresources
-
-For <<video-picture-resources,Video Picture Resources>>, an application has
-the option to use single or multi-layer <<VkImage,images>> for
-<<resources-image-views,image views>>.
-The layer to be used during decode or encode operations can: be specified
-when the <<VkImageView,image view>> is being created with the
-slink:VkImageSubresourceRange::pname:baseArrayLayer parameter, and/or within
-the resource binding operations in command buffer by using the
-slink:VkVideoPictureResourceKHR::pname:baseArrayLayer parameter.
-
-[NOTE]
-.Note:
-====
-Both Video Decode and Encode operations only work with a single layer at the
-time.
-====
-
-The <<resources-image-views, Image views>> representing the
-<<input-encode-picture,Input>> / <<decoded-output-picture,Output>> /
-<<dpb,DPB>> <<video-picture-resources,Video Picture Resources>> could have
-been created with sizes bigger than the coded size that is used with Video
-Decode and Encode operations.
-This allows for the same Video Picture Resources to be reused when there is
-a change in the input video content resolution.
-The effective coded size of the <<video-picture-resources,Video Picture
-Resources>> used for Video Decode and Encode operations is provided with
-slink:VkVideoPictureResourceKHR::pname:extent parameter of each resource in
-use.
-
-[NOTE]
-.Note:
-====
-Many codec standards require the coded and <<video-picture-resources,Video
-Picture Resources'>> sizes to match.
-====
-
-
-[[dpb-picture-resources]]
-==== Video Session <<dpb,DPB and Reconstructed>> Video Picture Resources
-
-The video compression standard chosen may: require the use of
-<<reference-picture,Reference Pictures>>.
-In Vulkan Video, like any other <<video-picture-resources,Video Picture
-Resources>>, the <<reference-picture,Reference Pictures>> are represented
-with <<resources-image-views, Image Views>>.
-
-When an application requires <<reference-picture,Reference Picture
-Resources>>, it creates and then associates <<VkImageView,image views>>,
-representing these resources, with Video Session <<dpb-slot,DPB or
-Reconstructed slots>> while recording the command buffer.
-
-<<decoded-output-picture, Decoded output pictures>> may: be used as
-<<reference-picture,reference pictures>> in future video decode operations.
-The same pictures may: be used in texture sampling operations or in the
-(WSI) presentation pipeline.
-Representing the <<dpb-slot,DPB's Video Picture Resources>> by
-<<VkImageView,image views>> makes it possible to accommodate all these use
-cases in a "`zero-copy`" fashion.
-Also, it provides more fine-grained control of the application over the
-efficient usage of the DPB and Reconstructed <<VkDeviceMemory,Device Memory
-Resources>>.
-
-
-[[video-session-dpb-slot-resource-management]]
-==== Video Session <<dpb-slot,DPB and Reconstructed Slot>> Resource Management
-
-Before <<dpb-picture-resources, Video Picture Resources>> can be used as
-<<reference-picture,Reference Picture Resources>>, Video Session
-<<dpb-slot,DPB or Reconstructed Slots>> must: be associated with those
-resources.
-
-The application allocates a <<dpb-slot,DPB or Reconstructed Slot>> and
-associates it with a <<video-picture-resources,Video Picture Resource>> and
-then sets up the resource as a target of decode or encode operation.
-After successfully decoding or encoding a picture with the targeted
-<<dpb-slot,DPB or Reconstructed Slot>> , in addition to the
-<<reference-picture,Reference Picture>> pixel data, the implementation may:
-generate an opaque <<reference-metadata,Reference Picture Metadata>> for
-that video session Slot and its associated <<video-picture-resources,Video
-Picture Resource>>.
-
-Subsequently, one or more <<dpb-slot,DPB or Reconstructed video session
-Slots>>, along with their associated <<video-picture-resources,Video Picture
-Resources>>, can: be used as <<reference-picture,Reference Picture's>>
-source for the video decode or encode operations.
-
-If <<reference-picture,Reference Pictures>> were to be required for decoding
-or encoding of the video bitstream, the
-slink:VkVideoSessionCreateInfoKHR::pname:maxReferencePicturesSlotsCount
-must: be set to a value bigger than `0` when the instance of the
-<<video-session,Video Session>> object is created.
-
-Up to
-slink:VkVideoSessionCreateInfoKHR::pname:maxReferencePicturesSlotsCount
-slots can: be activated with <<video-picture-resources,Video Picture
-Resources>> for a video session and up to
-slink:VkVideoSessionCreateInfoKHR::pname:maxReferencePicturesActiveCount
-active slots can: be used as DPB or Reconstructed
-<<reference-picture,Reference Pictures>> within a single decode or encode
-operation.
-
-When the implementation is associating <<reference-metadata,Reference
-Picture Metadata>> with the <<video-picture-resources,Video Picture
-Resources>> themselves, such data must: be independent of the
-<<video-session,Video Session>> to allow for those
-<<video-picture-resources,Video Picture Resources>> to be shared with other
-Video Session instances.
-All of the <<video-session,Video Session>>-dependent
-<<reference-metadata,Reference Picture Metadata>> must: only be associated
-with the <<video-session,Video Session>> <<dpb-slot,DPB or Reconstructed
-Slots>>.
-
-The application with the help of the implementation is responsible for
-managing the individual <<dpb-slot,DPB, or Reconstructed Slots>> that belong
-to a single <<video-session,Video Session>> <<dpb,DPB set>>:
-
-  * The application maintains the Slot allocation and per-slot
-    <<reference-picture,Reference Picture>>
-    <<video-picture-resources,Resources>>;
-  * Implementation maintains global and per-slot opaque
-    <<reference-metadata,Reference Picture Metadata>>;
-
-The application also manages the mapping between the codec-specific picture
-IDs and <<dpb-slot,DPB Slots>>.
-
-When a Video Picture is decoded and is set as a
-<<reference-picture,Reference Picture>> against a Video Session
-<<dpb-slot,DPB Slot>>, or is encoded and a Reconstructed Video Picture
-Resource is associated with a Video Session <<dpb-slot,DPB Slot>> then:
-
-  * The <<video-picture-resources,Video Picture Resource>> associated with
-    the Slot is filled with the decoded or reconstructed pixel data;
-  * The implementation generates the <<dpb-slot,DPB Slot's>>
-    <<reference-metadata,Reference Picture Metadata>>;
-
-When a <<dpb-slot,DPB's Slot>> is deactivated, or a different
-<<video-picture-resources,Video Picture Resource>> is used with the Slot, or
-the content of the <<video-picture-resources,Video Picture Resource>> is
-modified, the <<reference-metadata,Reference Picture Metadata>> associated
-with the <<dpb-slot,DPB Slot>> gets invalidated by the implementation.
-Subsequent attempts to use such, invalidated, <<dpb,DPB>> Slot as a
-<<reference-picture,Reference>> source would produce undefined: results.
-
-
-[[video-session-dpb-picture-size-changes]]
-==== Video Session <<dpb-slot,DPB Slot>> subresources
-
-DPB <<reference-picture,Reference Picture's>> coded width and height can:
-change, dynamically, via slink:VkVideoPictureResourceKHR::pname:extent, and
-the picture parameters from the codec-specific extensions.
-When a <<dpb-slot,DPB Slot>> is activated as a <<reference-picture,Reference
-Picture>> and a decode or encode operation is performed against that slot,
-the coded extent can: be recorded by the implementation to the corresponding
-<<dpb-slot,DPB Slot's>> metadata state.
-Subsequently, when the <<reference-picture,Reference Pictures>> are used
-with the decoded <<decoded-output-picture, Output>> or encoded
-<<input-encode-picture, Input Picture>>, their coded extent can differ.
-Decoding or encoding pictures, using picture sizes, different from the
-previously produced <<reference-picture,Reference Pictures>> should: be used
-with care, not to conflict with the codec standard and the implementation's
-support for that.
-It is the responsibility of the application to ensure that valid <<dpb,DPB
-Set>> of <<reference-picture,Reference Pictures>> are in use, according to
-the codec standard.
-
-In addition, the <<video-picture-resources,Video Picture Resources>> extent
-cannot: exceed the slink:VkVideoSessionCreateInfoKHR::pname:maxCodedExtent.
-
-[NOTE]
-.Note:
-====
-Coding Standards such as VP9 and AV1 allow for images with different sizes
-to be used as <<reference-picture,Reference Pictures>>.
-Others, like H.264 and H.265, do not support <<reference-picture,Reference
-Pictures>> with different sizes.
-Using <<reference-picture,Reference Pictures>> with incompatible sizes with
-such standards would render undefined: results.
-====
-
-
-[[video-resource-management-by-application]]
-==== The application is in control of the allocation and use of the system resource
-
-In Vulkan Video, the application has complete control over how and when
-system resources are used.
-The Vulkan Video framework provides the following tools to ensure that
-device and host memory resources are used in an optimal way:
-
-  * The video application can: allocate or destroy the number of allocated
-    <<decoded-output-picture, Output>> or <<input-encode-picture, Input>>
-    Pictures, and can: grow, or shrink the DPB set of
-    <<reference-picture,Reference Pictures>>, dynamically, based on the
-    changing video content requirement.
-  * <<reference-picture,Reference Pictures>> can: be shared with the decoded
-    <<decoded-output-picture, Output>> or encoded <<input-encode-picture,
-    Input>> pictures.
-  * The application can: use <<sparsememory, sparse memory>> for the
-    <<VkImage,images>>, representing <<video-picture-resources,Video Picture
-    Resources>>.
-    The use of sparse memory would allow the application to remove the
-    <<VkDeviceMemory,Device Memory>> backing of the <<resources-images,
-    image resources>> when the <<dpb-slot,DPB Slot>> is not in active use.
-    Furthermore, if the <<features-sparseResidency,sparse residency
-    feature>> is supported by the implementation (see <<sparsememory,Sparse
-    Resources>>), then <<VkImage,images>> can be, partially, bound with the
-    resource memory.
-    This feature is particularly important when using video content with a
-    significant change of decoded or encoded resolution.
-  * If the implementation supports <<VkImage,image arrays>>, and
-    <<sparsememory, sparse memory resources>>, then the application can:
-    remove the <<VkDeviceMemory,Device Memory>> backing of <<VkImage,image
-    array>> layers that are not used by any <<dpb-slot,DPB Slots>>.
-
-
-[[video-session-dpb-binding-reconstructed-slot]]
-==== Using DPB and Reconstructed Slot's Associated Resources
-
-Before a <<dpb-slot,DPB Slot>> is to become *Valid* for use with a
-<<reference-picture,Reference Picture>>, it requires memory resources to be
-bound to it.
-
-Some of the memory resources required for the <<dpb-slot,DPB Slot>>, are
-opaquely managed by the implementation and, internally, allocated from the
-<<video-session-device-memory-heaps,Session's Device Memory Heaps>>.
-The application provides the <<resources-images, image resources>> of one or
-more <<reference-picture,Reference Pictures>>, in the
-slink:VkVideoBeginCodingInfoKHR::pname:pReferenceSlots as part of the
-flink:vkCmdBeginVideoCodingKHR command.
-
-If a <<dpb-slot,DPB Slot>> was already used with an <<resources-image-views,
-image view>>, and a new image view or a dlink:VK_NULL_HANDLE handle is used
-with that Slot, then the <<dpb-slot,DPB Slot's>> state will be invalidated
-by the implementation.
-If a <<dpb-slot,DPB Slot>> were to be reused with the same
-<<resources-image-views, image view>>, the state of the Slot would not
-change.
-
-
-[[video-session-activating-dpb-slot]]
-==== Video Session Activating DPB Slot as a Reference
-
-Before a <<dpb-slot,DPB Slot>> is to be used for a
-<<reference-picture,Reference Pictures>> index, it must: be activated.
-The activation of a <<dpb-slot,DPB Slot>> is done within the
-flink:vkCmdDecodeVideoKHR command's
-slink:VkVideoDecodeInfoKHR::pname:slotIndex field for the decode operations,
-and within the flink:vkCmdEncodeVideoKHR command's
-slink:VkVideoEncodeInfoKHR::pname:slotIndex field for the encode operations.
-
-While activating a Slot for DPB, it must: already have an associated
-<<resources-image-views, image view>>, within the
-slink:VkVideoBeginCodingInfoKHR::pname:pReferenceSlots in the
-flink:vkCmdBeginVideoCodingKHR command and <<VkDeviceMemory,Device Memory>>
-backing of the the <<resources-images, image resources>> must: be resident.
-
-When a <<dpb-slot,DPB Slot>> were to be activated, the
-slink:VkVideoDecodeInfoKHR::pname:slotIndex for decode, or
-slink:VkVideoDecodeInfoKHR::pname:slotIndex for encode, must: be set to the
-application's allocated <<dpb-slot,DPB Slot's index>>.
-When activating a <<dpb-slot,DPB Slot>>, the application will perform a
-decode or encode operation against its Slot's index in order to enable its
-state as a *Valid Picture Reference*.
-If a <<dpb-slot,DPB Slot>> is activated, but a decode or encode operation is
-not performed against that Slot's index, or the decode or encode operation
-was unsuccessful, then the <<dpb-slot,DPB Slot>> would remain in the
-*Invalid Picture Reference* state (see below the
-<<video-session-dpb-slot-states,DPB Slot States>>).
-
-By just providing a <<video-picture-resources,Video Picture Resources>> for
-a <<dpb-slot,DPB Slot>> within the
-slink:VkVideoBeginCodingInfoKHR::pname:pReferenceSlots, and without
-successfully performing a decode or encode operation against that Slot, the
-<<dpb-slot,DPB Slot's>> state cannot: be changed to *Valid Picture
-Reference*.
-If the <<dpb-slot,DPB Slots>> were already in *Valid Picture Reference*, and
-there is no <<video-picture-resources,Video Picture Resources>> associated
-with the <<dpb-slot,DPB Slot>> for a decode or encode operation, the state
-<<dpb-slot,DPB Slot>> would not change.
-However, if an application is referring to a valid <<dpb-slot,DPB Slot>> in
-its current decode or encode operations, then a valid
-<<resources-image-views, image view>> must: be provided for that Slot within
-slink:VkVideoPictureResourceKHR::pname:imageViewBinding for that decode or
-encode operation.
-
-
-[[video-session-invalidating-dpb-slot]]
-==== Video Session Invalidating DPB Slot's Reference State
-
-When a <<dpb-slot,DPB Slot>> is invalidated, its state is set to *Invalid
-Picture Reference*.
-Using a <<dpb-slot,DPB Slot>> as a <<reference-picture,Reference Picture>>
-index for video decode or encode operations while the Slot is in *Invalid
-Picture Reference* state would render undefined: results.
-
-
-[[video-session-dpb-slot-states]]
-==== Video Session <<dpb,DPB>> Slot States
-
-To help understand the valid use of the <<video-session,Video Session>>
-<<dpb,DPB>> and its resource management, this section aims to explain the
-different states and correct usage of <<dpb-slot,DPB Slots>>.
-
-There are four (4) states that a <<dpb-slot,DPB Slot>> could be in:
-
-  * Picture Reference Unused;
-  * Invalid Picture Reference;
-  * Updating Picture Reference;
-  * Valid Picture Reference;
-
-The different states are outlined within the
-<<video-session-dpb-slot-states-table,DPB Slot States>> and
-<<video-session-dpb-slot-states-flow-diagram, DPB Slot States Flow Diagram>>
-below.
-
-All DPB Slot management operations are performed via the
-slink:VkVideoDecodeInfoKHR::pname:slotIndex or
-slink:VkVideoEncodeInfoKHR::pname:slotIndex field.
-
-All DPB resource binding, invalidating, and activating Slot management
-operations are performed, by the implementation, *before* the decoding or
-encoding commands, based on the slink:VkVideoDecodeInfoKHR::pname:slotIndex
-or slink:VkVideoEncodeInfoKHR::pname:slotIndex field and the entries from
-the slink:VkVideoBeginCodingInfoKHR::pname:pReferenceSlots.
-The application cannot: move a DPB Slot from a *Picture Reference Unused* to
-*Updating Picture Reference* state, implicitly, within a decode or encode
-command operation.
-Such a DPB Slot must: first be transitioned to an *Invalid Picture
-Reference* state using slink:VkVideoDecodeInfoKHR::pname:slotIndex or
-slink:VkVideoEncodeInfoKHR::pname:slotIndex, as part of a decode command.
-For more details, see <<video-picture-decode-modes, Video Picture Decode
-Modes>>.
-
-When using <<sparsememory, sparse memory resources>>, it would be acceptable
-and valid behavior for the application to unbind the memory while the DPB
-Slot is any of the DPB Slot states, provided the command buffers, in a
-<<commandbuffers-lifecycle, pending state>>, do not reference any such
-<<video-picture-resources,Video Picture Resources>>.
-
-Accessing <<sparsememory-accessing-unbound, unbound regions>> of the
-<<sparsememory, sparse memory resources>> by the decoder or encoder,
-regardless if those are used as <<decoded-output-picture,Output>>,
-<<input-encode-picture,Input>>, <<dpb,DPB>> or
-<<reconstructed-pictures,Reconstructed>> <<video-picture-resources,Video
-Picture Resources>>, would render undefined: results.
-The slink:VkPhysicalDeviceSparseProperties::pname:residencyNonResidentStrict
-property reported by the implementation does not offer guarantees on the
-behavior of decode or encode operations when it comes to accessing
-<<sparsememory-accessing-unbound, unbound regions>>.
-However, both reads and writes are still considered safe and will not affect
-other resources or populated regions of the image.
-
-[[video-session-dpb-slot-states-table]]
-.Video Session <<dpb-slot,DPB Slot>> States
-[cols="10%h,30%,50%,10%",options="header"]
-|====
-| <<dpb-slot,DPB Slot>> State | Moving to <<dpb-slot,DPB Slot>> State | Exiting <<dpb-slot,DPB Slot>> State | Retain Video Picture Resource Memory
-
-| *Picture Reference Unused* |
-* Bind Device Memory; +
-* Reset decode or encode state; +
-* Invalidate, delete or unbind memory of a Picture Reference associated with Reference DPB Slot |
-* Activate Reference DPB Slot -> *Invalid Picture Reference* |
-Application Controlled
-
-| *Invalid Picture Reference* |
-* Activate Reference DPB Slot; +
-* Unsuccessful video decode or encode operation; |
-* Start decode or encode operation with an active Reference DPB Slot target -> *Updating Picture Reference*; +
-* Updating a Picture Resource outside the decoder or encoder or deleting or removing the memory binding(sparse) -> *Picture Reference Unused*; |
-Application Controlled
-
-| *Updating Picture Reference* |
-Start decode or encode operation with an active Reference DPB Slot target; |
-Decode or encode operation with an active Reference DPB Slot target Completed Successfully -> *Valid Picture Reference*; +
-Unsuccessful video decode or encode operation -> *Invalid Picture Reference* |
-Yes
-
-| *Valid Picture Reference* |
-Video decode or encode operation with an active Reference DPB Slot target Completed Successfully; |
-* Replace Reference DPB Slot -> *Invalid Picture Reference*; +
-* Invalidate, delete or unbind memory of a Picture Reference of the Reference DPB Slot -> *Picture Reference Unused*; |
-Yes
-|====
-
-[[video-session-dpb-slot-states-flow-diagram]]
-image::images/VideoDecodeSessionDpbStates.svg[align="center",title="DPB Slot States Flow Diagram",opts="{imageopts}"]
-
-
-[[video-physical-device-capabilities]]
-== Video Physical Device Capabilities
-
-
-[[supported-video-codec-operations-enumeration]]
-=== Supported Video Codec Operations Enumeration
-
-The structure slink:VkVideoQueueFamilyProperties2KHR may: be chained to
-slink:VkQueueFamilyProperties2 when calling
-flink:vkGetPhysicalDeviceQueueFamilyProperties2 to retrieve the video codec
-operations supported for the physical device queue family index.
-
-[open,refpage='VkVideoQueueFamilyProperties2KHR',desc='Structure specifying the codec video operations',type='structs']
---
-The slink:VkVideoQueueFamilyProperties2KHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoQueueFamilyProperties2KHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:videoCodecOperations is a bitmask of
-    elink:VkVideoCodecOperationFlagBitsKHR specifying supported video codec
-    operation(s).
-
-include::{generated}/validity/structs/VkVideoQueueFamilyProperties2KHR.txt[]
---
-
-[open,refpage='VkVideoCodecOperationFlagBitsKHR',desc='Video codec operation types',type='enums']
---
-The codec operations are defined with the
-elink:VkVideoCodecOperationFlagBitsKHR enum:
-
-include::{generated}/api/enums/VkVideoCodecOperationFlagBitsKHR.txt[]
-
-Each decode or encode codec-specific extension extends this enumeration with
-the appropriate bit corresponding to the extension's codec operation:
-
-  * ename:VK_VIDEO_CODEC_OPERATION_INVALID_BIT_KHR - No video operations are
-    supported for this queue family.
-ifdef::VK_EXT_video_encode_h264[]
-  * ename:VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_EXT - H.264 video encode
-    operations are supported by this queue family.
-endif::VK_EXT_video_encode_h264[]
-ifdef::VK_EXT_video_decode_h264[]
-  * ename:VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_EXT - H.264 video decode
-    operations are supported by this queue family.
-endif::VK_EXT_video_decode_h264[]
-ifdef::VK_EXT_video_decode_h265[]
-  * ename:VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_EXT - H.265 video decode
-    operations are supported by this queue family.
-endif::VK_EXT_video_decode_h265[]
---
-
-[open,refpage='VkVideoCodecOperationFlagsKHR',desc='Bitmask specifying the Video codec operations supported',type='flags']
---
-include::{generated}/api/flags/VkVideoCodecOperationFlagsKHR.txt[]
-
-tlink:VkVideoCodecOperationFlagsKHR is a bitmask type for setting a mask of
-zero or more elink:VkVideoCodecOperationFlagBitsKHR.
---
-
-
-[[video-profiles]]
-=== Video Profiles
-
-[open,refpage='VkVideoProfileKHR',desc='Structure specifying the codec video profile',type='structs']
---
-A video profile is defined by slink:VkVideoProfileKHR structure as:
-
-include::{generated}/api/structs/VkVideoProfileKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:videoCodecOperation is a elink:VkVideoCodecOperationFlagBitsKHR
-    value specifying a video codec operation.
-  * pname:chromaSubsampling is a bitmask of
-    elink:VkVideoChromaSubsamplingFlagBitsKHR specifying video chroma
-    subsampling information.
-  * pname:lumaBitDepth is a bitmask of
-    elink:VkVideoComponentBitDepthFlagBitsKHR specifying video luma bit
-    depth information.
-  * pname:chromaBitDepth is a bitmask of
-    elink:VkVideoComponentBitDepthFlagBitsKHR specifying video chroma bit
-    depth information.
-
-include::{generated}/validity/structs/VkVideoProfileKHR.txt[]
---
-
-[open,refpage='VkVideoChromaSubsamplingFlagBitsKHR',desc='Video chroma subsampling',type='enums']
---
-The video format chroma subsampling is defined with the following enums:
-
-include::{generated}/api/enums/VkVideoChromaSubsamplingFlagBitsKHR.txt[]
-
-  * ename:VK_VIDEO_CHROMA_SUBSAMPLING_MONOCHROME_BIT_KHR - the format is
-    monochrome.
-  * ename:VK_VIDEO_CHROMA_SUBSAMPLING_420_BIT_KHR - the format is 4:2:0
-    chroma subsampled.
-    The two chroma components are each subsampled at a factor of 2 both
-    horizontally and vertically.
-  * ename:VK_VIDEO_CHROMA_SUBSAMPLING_422_BIT_KHR - the format is 4:2:2
-    chroma subsampled.
-    The two chroma components are sampled at half the sample rate of luma.
-    The horizontal chroma resolution is halved.
-  * ename:VK_VIDEO_CHROMA_SUBSAMPLING_444_BIT_KHR - the format is 4:4:4
-    chroma sampled.
-    Each of the three YCbCr components have the same sample rate, thus there
-    is no chroma subsampling.
---
-
-[open,refpage='VkVideoChromaSubsamplingFlagsKHR',desc='Bitmask specifying the Video format chroma subsampling',type='flags']
---
-include::{generated}/api/flags/VkVideoChromaSubsamplingFlagsKHR.txt[]
-
-tlink:VkVideoChromaSubsamplingFlagsKHR is a bitmask type for setting a mask
-of zero or more elink:VkVideoChromaSubsamplingFlagBitsKHR.
---
-
-[open,refpage='VkVideoComponentBitDepthFlagBitsKHR',desc='Video component bit depth',type='enums']
---
-The video format component bit depth is defined with the following enums:
-
-include::{generated}/api/enums/VkVideoComponentBitDepthFlagBitsKHR.txt[]
-
-  * ename:VK_VIDEO_COMPONENT_BIT_DEPTH_8_BIT_KHR - the format component bit
-    depth is 8 bits.
-  * ename:VK_VIDEO_COMPONENT_BIT_DEPTH_10_BIT_KHR - the format component bit
-    depth is 10 bits.
-  * ename:VK_VIDEO_COMPONENT_BIT_DEPTH_12_BIT_KHR - the format component bit
-    depth is 12 bits.
---
-
-[open,refpage='VkVideoComponentBitDepthFlagsKHR',desc='Bitmask specifying the Video format component bit depth',type='flags']
---
-include::{generated}/api/flags/VkVideoComponentBitDepthFlagsKHR.txt[]
-
-tlink:VkVideoComponentBitDepthFlagsKHR is a bitmask type for setting a mask
-of zero or more elink:VkVideoComponentBitDepthFlagBitsKHR.
---
-
-A video profile is provided when querying capabilities or image formats for
-video using flink:vkGetPhysicalDeviceVideoCapabilitiesKHR or
-flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR, respectively.
-A video profile is also provided when creating resources (images, video
-sessions, etc.) used by video queues.
-Each instance of slink:VkVideoProfileKHR must: chain a codec-operation
-specific video profile extension structure, corresponding to the
-codec-operation specified in
-slink:VkVideoProfileKHR::pname:videoCodecOperation.
-Additional information is provided in each codec-operation-specific video
-extension.
-
-
-[[supported-video-decode-or-encode-capabilities]]
-=== Supported Video Decode or Encode Capabilities
-
-[open,refpage='vkGetPhysicalDeviceVideoCapabilitiesKHR',desc='Query video decode or encode capabilities',type='protos']
---
-To query video decode or encode capabilities for a specific codec, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceVideoCapabilitiesKHR.txt[]
-
-  * pname:physicalDevice is the physical device whose video decode or encode
-    capabilities will be queried.
-  * pname:pVideoProfile is a pointer to a slink:VkVideoProfileKHR structure
-    with a chained codec-operation specific video profile structure.
-  * pname:pCapabilities is a pointer to a slink:VkVideoCapabilitiesKHR
-    structure in which the capabilities are returned.
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceVideoCapabilitiesKHR.txt[]
---
-
-If pname:pVideoProfile and chained codec-operation specific profile is not
-supported, ename:VK_ERROR_FORMAT_NOT_SUPPORTED is returned.
-
-Otherwise, the implementation will fill pname:pCapabilities with
-capabilities associated with this video profile.
-
-
-[open,refpage='VkVideoCapabilitiesKHR',desc='Structure specifying parameters of video capabilities',type='structs']
---
-The slink:VkVideoCapabilitiesKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoCapabilitiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:capabilityFlags is a bitmask of elink:VkVideoCapabilityFlagBitsKHR
-    specifying capability flags.
-  * pname:minBitstreamBufferOffsetAlignment is the minimum alignment for the
-    input or output bitstream buffer offset.
-  * pname:minBitstreamBufferSizeAlignment is the minimum alignment for the
-    input or output bitstream buffer size
-  * pname:videoPictureExtentGranularity is the minimum size alignment of the
-    extent with the required padding for the decoded or encoded video
-    images.
-  * pname:minExtent is the minimum width and height of the decoded or
-    encoded video.
-  * pname:maxExtent is the maximum width and height of the decoded or
-    encoded video.
-  * pname:maxReferencePicturesSlotsCount is the maximum number of DPB Slots
-    supported by the implementation for a single video session instance.
-  * pname:maxReferencePicturesActiveCount is the maximum slots that can be
-    used as <<reference-picture,Reference Pictures>> with a single decode or
-    encode operation.
-
-include::{generated}/validity/structs/VkVideoCapabilitiesKHR.txt[]
---
-
-[open,refpage='VkVideoCapabilityFlagBitsKHR',desc='Video Decode and Encode Capability Flags',type='enums']
---
-The slink:VkVideoCapabilitiesKHR flags are defined with the following
-enumeration:
-
-include::{generated}/api/enums/VkVideoCapabilityFlagBitsKHR.txt[]
-
-  * ename:VK_VIDEO_CAPABILITY_PROTECTED_CONTENT_BIT_KHR - the decode or
-    encode session supports protected content.
-  * ename:VK_VIDEO_CAPABILITY_SEPARATE_REFERENCE_IMAGES_BIT_KHR - the DPB or
-    Reconstructed Video Picture Resources for the video session may: be
-    created as a separate slink:VkImage for each DPB picture.
-    If not supported, the DPB must: be created as single multi-layered image
-    where each layer represents one of the DPB Video Picture Resources.
---
-
-[open,refpage='VkVideoCapabilityFlagsKHR',desc='Bitmask specifying the Video Decode and Encode Capability Flags',type='flags']
---
-include::{generated}/api/flags/VkVideoCapabilityFlagsKHR.txt[]
-
-tlink:VkVideoCapabilityFlagsKHR is a bitmask type for setting a mask of zero
-or more elink:VkVideoCapabilityFlagBitsKHR.
---
-
-
-[[supported-video-input-output-dpb-formats-enumeration]]
-=== Enumeration of Supported Video Output, Input and DPB Formats
-
-[open,refpage='vkGetPhysicalDeviceVideoFormatPropertiesKHR',desc='Query supported Video Decode and Encode image formats',type='protos']
---
-To enumerate the supported output, input and DPB image formats for a
-specific codec operation and video profile, call:
-
-include::{generated}/api/protos/vkGetPhysicalDeviceVideoFormatPropertiesKHR.txt[]
-
-  * pname:physicalDevice is the physical device being queried.
-  * pname:pVideoFormatInfo is a pointer to a
-    slink:VkPhysicalDeviceVideoFormatInfoKHR structure specifying the codec
-    and video profile for which information is returned.
-  * pname:pVideoFormatPropertyCount is a pointer to an integer related to
-    the number of video format properties available or queried, as described
-    below.
-  * pname:pVideoFormatProperties is a pointer to an array of
-    slink:VkVideoFormatPropertiesKHR structures in which supported formats
-    are returned.
-
-If pname:pVideoFormatProperties is `NULL`, then the number of video format
-properties supported for the given pname:physicalDevice is returned in
-pname:pVideoFormatPropertyCount.
-Otherwise, pname:pVideoFormatPropertyCount must: point to a variable set by
-the user to the number of elements in the pname:pVideoFormatProperties
-array, and on return the variable is overwritten with the number of values
-actually written to pname:pVideoFormatProperties.
-If the value of pname:pVideoFormatPropertyCount is less than the number of
-video format properties supported, at most pname:pVideoFormatPropertyCount
-values will be written to pname:pVideoFormatProperties, and
-ename:VK_INCOMPLETE will be returned instead of ename:VK_SUCCESS, to
-indicate that not all the available values were returned.
-
-.Valid Usage
-****
-  * [[VUID-vkGetPhysicalDeviceVideoFormatPropertiesKHR-imageUsage-04844]]
-    The pname:imageUsage enum of slink:VkPhysicalDeviceVideoFormatInfoKHR
-    must: contain at least one of the following video image usage bit(s):
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR,
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR,
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR, or
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR
-****
-
-[NOTE]
-.Note:
-====
-For most use cases, only decode or encode related usage flags are going to
-be specified.
-For a use case such as transcode, if the image were to be shared between
-decode and encode session(s), then both decode and encode related usage
-flags can: be set.
-====
-
-include::{generated}/validity/protos/vkGetPhysicalDeviceVideoFormatPropertiesKHR.txt[]
---
-
-[open,refpage='VkPhysicalDeviceVideoFormatInfoKHR',desc='Structure specifying the codec video format',type='structs']
---
-The slink:VkPhysicalDeviceVideoFormatInfoKHR input structure is defined as:
-
-include::{generated}/api/structs/VkPhysicalDeviceVideoFormatInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:imageUsage is a bitmask of elink:VkImageUsageFlagBits specifying
-    intended video image usages.
-  * pname:pVideoProfiles is a pointer to a slink:VkVideoProfilesKHR
-    structure providing the video profile(s) of video session(s) that will
-    use the image.
-    For most use cases, the image is used by a single video session and a
-    single video profile is provided.
-    For a use case such as transcode, where a decode session output image
-    may: be used as encode input for one or more encode sessions, multiple
-    video profiles representing the video sessions that will share the image
-    may: be provided.
-
-include::{generated}/validity/structs/VkPhysicalDeviceVideoFormatInfoKHR.txt[]
---
-
-[open,refpage='VkVideoProfilesKHR',desc='Structure enumerating the video profiles',type='structs']
---
-The slink:VkVideoProfilesKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoProfilesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:profileCount is an integer which holds the number of video
-    profiles included in pname:pProfiles.
-  * pname:pProfiles is a pointer to an array of slink:VkVideoProfileKHR
-    structures.
-    Each slink:VkVideoProfileKHR structure must: chain the corresponding
-    codec-operation specific extension video profile structure.
-
-include::{generated}/validity/structs/VkVideoProfilesKHR.txt[]
---
-
-[open,refpage='VkVideoFormatPropertiesKHR',desc='Structure enumerating the video image formats',type='structs']
---
-The slink:VkVideoFormatPropertiesKHR output structure for
-flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR is defined as:
-
-include::{generated}/api/structs/VkVideoFormatPropertiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:format is one of the supported formats reported by the
-    implementation.
-
-If the pname:pVideoProfiles provided in input structure
-pname:pVideoFormatInfo are not supported,
-ename:VK_ERROR_FORMAT_NOT_SUPPORTED is returned.
-If the implementation requires an opaque video decode or encode DPB, then
-when querying with the corresponding video decode or encode DPB image usage
-in pname:imageUsage, only one image format is returned:
-ename:VK_FORMAT_UNDEFINED.
-
-include::{generated}/validity/structs/VkVideoFormatPropertiesKHR.txt[]
---
-
-Before creating an image, the application should obtain the supported image
-creation parameters by querying with
-flink:vkGetPhysicalDeviceFormatProperties2 or
-flink:vkGetPhysicalDeviceImageFormatProperties2 using one of the reported
-pname:pImageFormats and adding slink:VkVideoProfilesKHR to the pname:pNext
-chain of slink:VkFormatProperties2.
-
-
-[[video-session-objects]]
-== Video Session Objects
-
-
-[[video-session]]
-=== Video Session
-
-[open,refpage='VkVideoSessionKHR',desc='Opaque handle to a video session object',type='handles']
---
-Video session objects are abstracted and represented by
-slink:VkVideoSessionKHR handles:
-
-include::{generated}/api/handles/VkVideoSessionKHR.txt[]
---
-
-
-[[video-session-creation]]
-==== Creating a Video Session
-
-[open,refpage='vkCreateVideoSessionKHR',desc='Creates a video session object',type='protos']
---
-To create a video session object, call:
-
-include::{generated}/api/protos/vkCreateVideoSessionKHR.txt[]
-
-  * pname:device is the logical device that creates the decode or encode
-    session object.
-  * pname:pCreateInfo is a pointer to a slink:VkVideoSessionCreateInfoKHR
-    structure containing parameters specifying the creation of the decode or
-    encode session.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pVideoSession is a pointer to a slink:VkVideoSessionKHR structure
-    specifying the decode or encode video session object which will be
-    created by this function when it returns ename:VK_SUCCESS
-
-include::{generated}/validity/protos/vkCreateVideoSessionKHR.txt[]
---
-
-[open,refpage='VkVideoSessionCreateInfoKHR',desc='Structure specifying parameters of a newly created video decode session',type='structs']
---
-The slink:VkVideoSessionCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoSessionCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:queueFamilyIndex is the queue family of the created video session.
-  * pname:flags is a bitmask of elink:VkVideoSessionCreateFlagBitsKHR
-    specifying creation flags.
-  * pname:pVideoProfile is a pointer to a slink:VkVideoProfileKHR structure.
-  * pname:pictureFormat is the format of the <<resources-image-views, image
-    views>> representing decoded <<decoded-output-picture, Output>> or
-    encoded <<input-encode-picture, Input>> pictures.
-  * pname:maxCodedExtent is the maximum width and height of the coded
-    pictures that this instance will be able to support.
-  * pname:referencePicturesFormat is the format of the <<dpb, DPB>> image
-    views representing the <<reference-picture,Reference Pictures>>.
-  * pname:maxReferencePicturesSlotsCount is the maximum number of
-    <<dpb-slot,DPB Slots>> that can be activated with associated
-    <<video-picture-resources,Video Picture Resources>> for the created
-    video session.
-  * pname:maxReferencePicturesActiveCount is the maximum number of active
-    <<dpb-slot,DPB Slots>> that can be used as Dpb or Reconstructed
-    <<reference-picture,Reference Pictures>> within a single decode or
-    encode operation for the created video session.
-
-.Valid Usage
-****
-  * [[VUID-VkVideoSessionCreateInfoKHR-pVideoProfile-04845]]
-    pname:pVideoProfile must: be a pointer to a valid
-    slink:VkVideoProfileKHR structure whose pname:pNext chain must: include
-    a valid codec-specific profile structure
-  * [[VUID-VkVideoSessionCreateInfoKHR-maxReferencePicturesSlotsCount-04846]]
-    If <<reference-picture,Reference Pictures>> are required for use with
-    the created video session, the pname:maxReferencePicturesSlotsCount
-    must: be set to a value bigger than `0`
-  * [[VUID-VkVideoSessionCreateInfoKHR-maxReferencePicturesSlotsCount-04847]]
-    pname:maxReferencePicturesSlotsCount cannot: exceed the implementation
-    reported
-    slink:VkVideoCapabilitiesKHR::pname:maxReferencePicturesSlotsCount
-  * [[VUID-VkVideoSessionCreateInfoKHR-maxReferencePicturesActiveCount-04848]]
-    If <<reference-picture,Reference Pictures>> are required for use with
-    the created video session, the pname:maxReferencePicturesActiveCount
-    must: be set to a value bigger than `0`
-  * [[VUID-VkVideoSessionCreateInfoKHR-maxReferencePicturesActiveCount-04849]]
-    pname:maxReferencePicturesActiveCount cannot: exceed the implementation
-    reported
-    slink:VkVideoCapabilitiesKHR::pname:maxReferencePicturesActiveCount
-  * [[VUID-VkVideoSessionCreateInfoKHR-maxReferencePicturesActiveCount-04850]]
-    pname:maxReferencePicturesActiveCount cannot: exceed the
-    pname:maxReferencePicturesSlotsCount
-  * [[VUID-VkVideoSessionCreateInfoKHR-maxCodedExtent-04851]]
-    pname:maxCodedExtent cannot: be smaller than
-    slink:VkVideoCapabilitiesKHR::pname:minExtent and bigger than
-    slink:VkVideoCapabilitiesKHR::pname:maxExtent
-  * [[VUID-VkVideoSessionCreateInfoKHR-referencePicturesFormat-04852]]
-    pname:referencePicturesFormat must: be one of the supported formats in
-    slink:VkVideoFormatPropertiesKHR pname:format returned by the
-    flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR when the
-    slink:VkPhysicalDeviceVideoFormatInfoKHR pname:imageUsage contains
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR or
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR depending on the session
-    codec operation
-  * [[VUID-VkVideoSessionCreateInfoKHR-pictureFormat-04853]]
-    pname:pictureFormat for decode output must: be one of the supported
-    formats in slink:VkVideoFormatPropertiesKHR pname:format returned by the
-    flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR when the
-    slink:VkPhysicalDeviceVideoFormatInfoKHR pname:imageUsage contains
-    ename:VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR
-  * [[VUID-VkVideoSessionCreateInfoKHR-pictureFormat-04854]]
-    pname:pictureFormat targeting encode operations must: be one of the
-    supported formats in slink:VkVideoFormatPropertiesKHR pname:format
-    returned by the flink:vkGetPhysicalDeviceVideoFormatPropertiesKHR when
-    the slink:VkPhysicalDeviceVideoFormatInfoKHR pname:imageUsage contains
-    ename:VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR
-****
-
-include::{generated}/validity/structs/VkVideoSessionCreateInfoKHR.txt[]
---
-
-[open,refpage='VkVideoSessionCreateFlagBitsKHR',desc='Video decode or encode video session creation flags',type='enums']
---
-The decode or encode session creation flags defined with the following
-enums:
-
-include::{generated}/api/enums/VkVideoSessionCreateFlagBitsKHR.txt[]
-
-  * ename:VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR - create the
-    video session for use with protected video content
---
-
-[open,refpage='VkVideoSessionCreateFlagsKHR',desc='Bitmask specifying the video decode or encode video session creation flags',type='flags']
---
-include::{generated}/api/flags/VkVideoSessionCreateFlagsKHR.txt[]
-
-tlink:VkVideoSessionCreateFlagsKHR is a bitmask type for setting a mask of
-zero or more elink:VkVideoSessionCreateFlagBitsKHR.
---
-
-
-[[video-session-destruction]]
-=== Destroying a Video Session
-
-[open,refpage='vkDestroyVideoSessionKHR',desc='Destroy decode session object',type='protos']
---
-To destroy a decode session object, call:
-
-include::{generated}/api/protos/vkDestroyVideoSessionKHR.txt[]
-
-  * pname:device is the device that was used for the creation of the video
-    session.
-  * pname:videoSession is the decode or encode video session to be
-    destroyed.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-include::{generated}/validity/protos/vkDestroyVideoSessionKHR.txt[]
---
-
-
-[[video-session-memory-resource-management]]
-=== Video Session Memory Resource Management
-
-
-[[obtaining-video-session-memory-requirements]]
-==== Obtaining the Video Session Object Device Memory Requirements
-
-[open,refpage='vkGetVideoSessionMemoryRequirementsKHR',desc='Get Memory Requirements',type='protos']
---
-To get memory requirements for a video session, call:
-
-include::{generated}/api/protos/vkGetVideoSessionMemoryRequirementsKHR.txt[]
-
-  * pname:device is the logical device that owns the video session.
-  * pname:videoSession is the video session to query.
-  * pname:pVideoSessionMemoryRequirementsCount is a pointer to an integer
-    related to the number of memory heap requirements available or queried,
-    as described below.
-  * pname:pVideoSessionMemoryRequirements is `NULL` or a pointer to an array
-    of slink:VkVideoGetMemoryPropertiesKHR structures in which the memory
-    heap requirements of the video session are returned.
-
-If pname:pVideoSessionMemoryRequirements is `NULL`, then the number of
-memory heap types required for the video session is returned in
-pname:pVideoSessionMemoryRequirementsCount.
-Otherwise, pname:pVideoSessionMemoryRequirementsCount must: point to a
-variable set by the user with the number of elements in the
-pname:pVideoSessionMemoryRequirements array, and on return the variable is
-overwritten with the number of formats actually written to
-pname:pVideoSessionMemoryRequirements.
-If pname:pVideoSessionMemoryRequirementsCount is less than the number of
-memory heap types required for the video session, then at most
-pname:pVideoSessionMemoryRequirementsCount elements will be written to
-pname:pVideoSessionMemoryRequirements, and ename:VK_INCOMPLETE will be
-returned, instead of ename:VK_SUCCESS, to indicate that not all required
-memory heap types were returned.
-
-include::{generated}/validity/protos/vkGetVideoSessionMemoryRequirementsKHR.txt[]
---
-
-[open,refpage='VkVideoGetMemoryPropertiesKHR',desc='Structure specifying video session required memory heap type',type='structs']
---
-The slink:VkVideoGetMemoryPropertiesKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoGetMemoryPropertiesKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memoryBindIndex is the memory bind index of the memory heap type
-    described by the information returned in pname:pMemoryRequirements.
-  * pname:pMemoryRequirements is a pointer to a slink:VkMemoryRequirements2
-    structure in which the requested memory heap requirements for the heap
-    with index pname:memoryBindIndex are returned.
-
-include::{generated}/validity/structs/VkVideoGetMemoryPropertiesKHR.txt[]
---
-
-
-[[binding-session-memory]]
-==== Binding the Session Object Device Memory
-
-[open,refpage='vkBindVideoSessionMemoryKHR',desc='Bind Video Memory',type='protos']
---
-To attach memory to a video session object, call:
-
-include::{generated}/api/protos/vkBindVideoSessionMemoryKHR.txt[]
-
-  * pname:device is the logical device that owns the video session's memory.
-  * pname:videoSession is the video session to be bound with device memory.
-  * pname:videoSessionBindMemoryCount is the number of
-    pname:pVideoSessionBindMemories to be bound.
-  * pname:pVideoSessionBindMemories is a pointer to an array of
-    slink:VkVideoBindMemoryKHR structures specifying memory regions to be
-    bound to a device memory heap.
-
-include::{generated}/validity/protos/vkBindVideoSessionMemoryKHR.txt[]
---
-
-[open,refpage='VkVideoBindMemoryKHR',desc='Structure specifying device memory heap entry for video session object',type='structs']
---
-The slink:VkVideoBindMemoryKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoBindMemoryKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:memoryBindIndex is the index of the device memory heap returned in
-    slink:VkVideoGetMemoryPropertiesKHR::pname:memoryBindIndex from
-    flink:vkGetVideoSessionMemoryRequirementsKHR.
-  * pname:memory is the allocated device memory to be bound to the video
-    session's heap with index pname:memoryBindIndex.
-  * pname:memoryOffset is the start offset of the region of pname:memory
-    which is to be bound.
-  * pname:memorySize is the size in bytes of the region of pname:memory,
-    starting from pname:memoryOffset bytes, to be bound.
-
-
-include::{generated}/validity/structs/VkVideoBindMemoryKHR.txt[]
---
-
-
-[[video-session-parameters]]
-=== Video Session Parameters
-
-This specification supports several classes of preprocessed parameters
-stored in Video Session Parameters objects.
-The Video Session Parameters objects reduces the number of parameters being
-dispatched and then processed by the implementation while recording video
-command buffers.
-
-
-[[creating-video-session-parameters]]
-=== Creating Video Session Parameters
-
-[open,refpage='VkVideoSessionParametersKHR',desc='Opaque handle to a video video session parameters object',type='handles']
---
-Video session parameter objects are represented by
-slink:VkVideoSessionParametersKHR handles:
-
-include::{generated}/api/handles/VkVideoSessionParametersKHR.txt[]
---
-
-[open,refpage='vkCreateVideoSessionParametersKHR',desc='Creates video session video session parameter object',type='protos']
---
-To create a video session parameters object, call:
-
-include::{generated}/api/protos/vkCreateVideoSessionParametersKHR.txt[]
-
-  * pname:device is the logical device that was used for the creation of the
-    video session object.
-  * pname:pCreateInfo is a pointer to
-    slink:VkVideoSessionParametersCreateInfoKHR structure specifying the
-    video session parameters.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pVideoSessionParameters is a pointer to a
-    slink:VkVideoSessionParametersKHR handle in which the video session
-    parameters object is returned.
-
-include::{generated}/validity/protos/vkCreateVideoSessionParametersKHR.txt[]
---
-
-[open,refpage='VkVideoSessionParametersCreateInfoKHR',desc='Structure to set video session parameters',type='structs']
---
-The slink:VkVideoSessionParametersCreateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoSessionParametersCreateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:videoSessionParametersTemplate is dlink:VK_NULL_HANDLE or a valid
-    handle to a slink:VkVideoSessionParametersKHR object.
-    If this parameter represents a valid handle, then the underlying Video
-    Session Parameters object will be used as a template for constructing
-    the new video session parameters object.
-    All of the template object's current parameters will be inherited by the
-    new object in such a case.
-    Optionally, some of the template's parameters can be updated or new
-    parameters added to the newly constructed object via the
-    extension-specific parameters.
-  * pname:videoSession is the video session object against which the video
-    session parameters object is going to be created.
-
-.Valid Usage
-****
-  * [[VUID-VkVideoSessionParametersCreateInfoKHR-videoSessionParametersTemplate-04855]]
-    If pname:videoSessionParametersTemplate represents a valid handle, it
-    must: have been created against pname:videoSession
-****
-
-include::{generated}/validity/structs/VkVideoSessionParametersCreateInfoKHR.txt[]
---
-
-
-[[UpdatingVideoSessionParameters]]
-=== Updating the parameters of the Video Session Parameters object
-
-[open,refpage='vkUpdateVideoSessionParametersKHR',desc='Update video session video session parameter object',type='protos']
---
-To update, add, or remove video session parameters state, call:
-
-include::{generated}/api/protos/vkUpdateVideoSessionParametersKHR.txt[]
-
-  * pname:device is the logical device that was used for the creation of the
-    video session object.
-  * pname:videoSessionParameters is the video session object that is going
-    to be updated.
-  * pname:pUpdateInfo is a pointer to a
-    sname:VkVideoSessionParametersUpdateInfoKHR structure containing the
-    session parameters update information.
-
-include::{generated}/validity/protos/vkUpdateVideoSessionParametersKHR.txt[]
---
-
-[open,refpage='VkVideoSessionParametersUpdateInfoKHR',desc='Structure to update video session parameters',type='structs']
---
-The sname:VkVideoSessionParametersUpdateInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoSessionParametersUpdateInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:updateSequenceCount is the sequence number of the object update
-    with parameters, starting from `1` and incrementing the value by one
-    with each subsequent update.
-
-include::{generated}/validity/structs/VkVideoSessionParametersUpdateInfoKHR.txt[]
---
-
-
-[[destroying-video-session-parameters]]
-=== Destroying Video Session Parameters
-
-[open,refpage='vkDestroyVideoSessionParametersKHR',desc='Destroy video session parameters object',type='protos']
---
-To destroy a video session object, call:
-
-include::{generated}/api/protos/vkDestroyVideoSessionParametersKHR.txt[]
-
-  * pname:device is the device the video session was created with.
-  * pname:videoSessionParameters is the video session parameters object to
-    be destroyed.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-
-include::{generated}/validity/protos/vkDestroyVideoSessionParametersKHR.txt[]
---
-
-
-=== Video Encode and Decode commands
-
-[open,refpage='vkCmdBeginVideoCodingKHR',desc='Start decode jobs',type='protos']
---
-To start video decode or encode operations, call:
-
-include::{generated}/api/protos/vkCmdBeginVideoCodingKHR.txt[]
-
-  * pname:commandBuffer is the command buffer to be used when recording
-    commands for the video decode or encode operations.
-  * pname:pBeginInfo is a pointer to a slink:VkVideoBeginCodingInfoKHR
-    structure.
-
-include::{generated}/validity/protos/vkCmdBeginVideoCodingKHR.txt[]
---
-
-[open,refpage='VkVideoBeginCodingInfoKHR',desc='Structure specifying parameters of decode starts',type='structs']
---
-The slink:VkVideoBeginCodingInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoBeginCodingInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-  * pname:codecQualityPreset is a bitmask of
-    elink:VkVideoCodingQualityPresetFlagBitsKHR specifying the Video Decode
-    or Encode quality preset.
-  * pname:videoSession is the video session object to be bound for the
-    processing of the video commands.
-  * pname:videoSessionParameters is dlink:VK_NULL_HANDLE or a handle of a
-    slink:VkVideoSessionParametersKHR object to be used for the processing
-    of the video commands.
-    If dlink:VK_NULL_HANDLE, then no video session parameters apply to this
-    command buffer context.
-  * pname:referenceSlotCount is the number of reference slot entries
-    provided in pname:pReferenceSlots.
-  * pname:pReferenceSlots is a pointer to an array of
-    slink:VkVideoReferenceSlotKHR structures specifying reference slots,
-    used within the video command context between this
-    flink:vkCmdBeginVideoCodingKHR command and the
-    flink:vkCmdEndVideoCodingKHR commmand that follows.
-    Each reference slot provides a slot index and the
-    slink:VkVideoPictureResourceKHR specifying the reference picture
-    resource bound to this slot index.
-    A slot index must: not appear more than once in pname:pReferenceSlots in
-    a given command.
-
-.Valid Usage
-****
-  * [[VUID-VkVideoBeginCodingInfoKHR-referenceSlotCount-04856]]
-    slink:VkVideoBeginCodingInfoKHR::pname:referenceSlotCount must: not
-    exceed the value specified in
-    slink:VkVideoSessionCreateInfoKHR::pname:maxReferencePicturesSlotsCount
-    when creating the video session object that is being provided in
-    pname:videoSession
-  * [[VUID-VkVideoBeginCodingInfoKHR-videoSessionParameters-04857]]
-    If pname:videoSessionParameters is not dlink:VK_NULL_HANDLE, it must:
-    have been created using pname:videoSession as a parent object
-****
-
-include::{generated}/validity/structs/VkVideoBeginCodingInfoKHR.txt[]
---
-
-[open,refpage='VkVideoBeginCodingFlagsKHR',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkVideoBeginCodingFlagsKHR.txt[]
-
-tname:VkVideoBeginCodingFlagsKHR is a bitmask type for setting a mask, but
-is currently reserved for future use.
---
-
-[open,refpage='VkVideoCodingQualityPresetFlagBitsKHR',desc='Video codec profile types',type='enums']
---
-The decode preset types are defined with the following:
-
-include::{generated}/api/enums/VkVideoCodingQualityPresetFlagBitsKHR.txt[]
-
-  * ename:VK_VIDEO_CODING_QUALITY_PRESET_NORMAL_BIT_KHR defines normal
-    decode case.
-  * ename:VK_VIDEO_CODING_QUALITY_PRESET_POWER_BIT_KHR defines power
-    efficient case.
-  * ename:VK_VIDEO_CODING_QUALITY_PRESET_QUALITY_BIT_KHR defines quality
-    focus case.
---
-
-[open,refpage='VkVideoCodingQualityPresetFlagsKHR',desc='Bitmask of elink:VkVideoCodingQualityPresetFlagBitsKHR flags',type='flags']
---
-include::{generated}/api/flags/VkVideoCodingQualityPresetFlagsKHR.txt[]
-
-tlink:VkVideoCodingQualityPresetFlagsKHR is a bitmask type for setting a
-mask of zero or more elink:VkVideoCodingQualityPresetFlagBitsKHR.
---
-
-[open,refpage='VkVideoReferenceSlotKHR',desc='Structure specifying the reference picture slot',type='structs']
---
-The slink:VkVideoReferenceSlotKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoReferenceSlotKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:slotIndex is the unique reference slot index used for the encode
-    or decode operation.
-  * pname:pPictureResource is a pointer to a slink:VkVideoPictureResourceKHR
-    structure describing the picture resource bound to this slot index.
-
-include::{generated}/validity/structs/VkVideoReferenceSlotKHR.txt[]
---
-
-[open,refpage='VkVideoPictureResourceKHR',desc='Structure specifying the picture resources',type='structs']
---
-The slink:VkVideoPictureResourceKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoPictureResourceKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:codedOffset is the offset to be used for the picture resource.
-  * pname:codedExtent is the extent to be used for the picture resource.
-  * pname:baseArrayLayer is the first array layer to be accessed for the
-    Decode or Encode Operations.
-  * pname:imageViewBinding is a slink:VkImageView image view representing
-    this picture resource.
-
-include::{generated}/validity/structs/VkVideoPictureResourceKHR.txt[]
---
-
-
-=== End of the Video Session
-
-[open,refpage='vkCmdEndVideoCodingKHR',desc='End decode jobs',type='protos']
---
-To end video decode or encode operations, call:
-
-include::{generated}/api/protos/vkCmdEndVideoCodingKHR.txt[]
-
-  * pname:commandBuffer is the command buffer to be filled by this function.
-  * pname:pEndCodingInfo is a pointer to a slink:VkVideoEndCodingInfoKHR
-    structure.
-
-include::{generated}/validity/protos/vkCmdEndVideoCodingKHR.txt[]
---
-
-[open,refpage='VkVideoEndCodingInfoKHR',desc='Structure specifying the end of decode encode commands sequence',type='structs']
---
-The slink:VkVideoEndCodingInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoEndCodingInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is reserved for future use.
-
-include::{generated}/validity/structs/VkVideoEndCodingInfoKHR.txt[]
---
-
-[open,refpage='VkVideoEndCodingFlagsKHR',desc='Reserved for future use',type='flags']
---
-include::{generated}/api/flags/VkVideoEndCodingFlagsKHR.txt[]
-
-tname:VkVideoEndCodingFlagsKHR is a bitmask type for setting a mask, but is
-currently reserved for future use.
---
-
-
-=== Video Session Control Command
-
-[open,refpage='vkCmdControlVideoCodingKHR',desc='Set encode rate control parameters',type='protos']
---
-To apply dynamic controls to video decode or video operations, call:
-
-include::{generated}/api/protos/vkCmdControlVideoCodingKHR.txt[]
-
-  * pname:commandBuffer is the command buffer to be filled by this function
-    for setting encode rate control parameters.
-  * pname:pCodingControlInfo is a pointer to a
-    slink:VkVideoCodingControlInfoKHR structure.
-
-include::{generated}/validity/protos/vkCmdControlVideoCodingKHR.txt[]
---
-
-[open,refpage='VkVideoCodingControlInfoKHR',desc='Structure specifying parameters of decode starts',type='structs']
---
-The slink:VkVideoCodingControlInfoKHR structure is defined as:
-
-include::{generated}/api/structs/VkVideoCodingControlInfoKHR.txt[]
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-  * pname:flags is a bitmask of tlink:VkVideoCodingControlFlagsKHR
-    specifying control flags.
-
-include::{generated}/validity/structs/VkVideoCodingControlInfoKHR.txt[]
---
-
-[open,refpage='VkVideoCodingControlFlagBitsKHR',desc='Video Coding Control Command Flags',type='enums']
---
-The flink:vkCmdControlVideoCodingKHR flags are defined with the following
-enumeration:
-
-include::{generated}/api/enums/VkVideoCodingControlFlagBitsKHR.txt[]
-
-  * ename:VK_VIDEO_CODING_CONTROL_DEFAULT_KHR indicates a request for the
-    coding control paramaters to be applied to the current state of the
-    bound video session.
-  * ename:VK_VIDEO_CODING_CONTROL_RESET_BIT_KHR indicates a request for the
-    bound video session state to be reset before the coding control
-    parameters are applied.
-    The state after reset is identical to the state immediately after video
-    session creation.
---
-
-[open,refpage='VkVideoCodingControlFlagsKHR',desc='Bitmask specifying the Video Coding Control Command flink:vkCmdControlVideoCodingKHR flags',type='flags']
---
-include::{generated}/api/flags/VkVideoCodingControlFlagsKHR.txt[]
-
-tlink:VkVideoCodingControlFlagsKHR is a bitmask type for setting a mask of
-zero or more elink:VkVideoCodingControlFlagBitsKHR.
---
diff --git a/registry/vulkan/config/README.adoc b/registry/vulkan/config/README.adoc
deleted file mode 100644
index afe163e..0000000
--- a/registry/vulkan/config/README.adoc
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2015-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-= Vulkan Asciidoc Configuration Files
-
-== Macros
-
-The macros in `spec-macros.rb` and `spec-macros/extension.rb` are described
-in the "`Vulkan Documentation and Extensions: Procedures and Conventions`"
-document (see the link:../styleguide.txt[style guide].
-
-== Support for Math
-
-Asciidoctor is customized to insert KaTeX `<script>` tags from
-`math.js` for HTML5, and properly pass through math which has
-`\begin{}\/end{}` delimiters instead of $$\[\]\(\).
-
-For PDF builds, asciidoctor-mathematical is used to generate
-images.
-
-== Stylesheets
-
-`khronos.css` is the stylesheet used for HTML output.
-It is a slightly tweaked version of the Asciidoctor 'Colony' theme.
-
-== Chunked Spec Index
-
-`chunkindex` contains scripts for building and using a search index for the
-Vulkan chunked HTML specification.
-
-== Asciidoctor Extensions
-
-We use a number of Asciidoctor customizations written in Ruby, described
-briefly below.
-
-* `asciidoctor-mathematical-ext.rb` - make latexmath: blocks work in table cells
-* `extension-highlighter.rb` - one way of constructing a diff HTML document
-* `katex_replace.rb` - substitute KaTeX for MathJax in output HTML
-* `loadable_html.rb` - add some status messages for slow-loading documents
-* `rouge-extend-css.rb` - override parts of the 'rouge' highlighter CSS
-* `spec-macros.rb` - custom asciidoctor macros used in spec markup
-* `tilde_open_block.rb` - allow '~~~~' as an open block delimiter
-* `vuid-expander.rb` - add anchors to valid usage ID tags
-* `vu-to-json.rb` - extract valid usage statements to JSON as part of a dummy spec build
diff --git a/registry/vulkan/config/asciidoctor-mathematical-ext.rb b/registry/vulkan/config/asciidoctor-mathematical-ext.rb
deleted file mode 100644
index 62daf16..0000000
--- a/registry/vulkan/config/asciidoctor-mathematical-ext.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2018-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-require 'asciidoctor/extensions'
-
-# This script makes [latexmath] blocks work within table cells.
-# See https://github.com/asciidoctor/asciidoctor-pdf/issues/740
-
-Asciidoctor::Extensions.register do
-  treeprocessor do
-    process do |doc|
-      mathematicalProcessor = MathematicalTreeprocessor.new
-      (table_blocks = doc.find_by context: :table).each do |table|
-        (table.rows[:body] + table.rows[:foot]).each do |row|
-          row.each do |cell|
-            mathematicalProcessor.process cell.inner_document if cell.style == :asciidoc
-          end
-        end
-      end
-    end
-  end
-end
diff --git a/registry/vulkan/config/attribs.txt b/registry/vulkan/config/attribs.txt
deleted file mode 100644
index f3594ff..0000000
--- a/registry/vulkan/config/attribs.txt
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2015-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// Various special / math symbols, matching LaTeX names.
-// The pass:[+ ] notation avoids asciidoctor EOL treatment of the attribute.
-
-// Macro just to avoid typing the messy expression many times.
-// \' doesn't work in title, captions, link text, etc.
-:YCbCr: pass:q[Y′C~B~C~R~]
-:RGBprime: pass:q[R′G′B′]
-:prime: ′
-
-// Used when an italicized 'i' is wanted in the middle of an enum name,
-// such as `VK_IMAGE_ASPECT_PLANE__{ibit}__BIT`
-:ibit: _i_
-
-// Special symbols - not used in [eq] spans
-:sym1: ✓
-:sym2: †
-:sym3: ‡
-:reg: ®
-:trade: ™
-:harr: ↔
-
-// Math operators and logic symbols
-:times: ×
-:cdot: ⋅
-:plus: pass:[+ ]
-:geq: ≥
-:leq: ≤
-:neq: ≠
-:leftarrow: ←
-:uparrow: ↑
-:rightarrow: →
-:downarrow: ↓
-:elem: ∈
-:lnot: ¬
-:land: ∧
-:lor: ∨
-:oplus: ⊕
-:lceil: ⌈
-:rceil: ⌉
-:lfloor: ⌊
-:rfloor: ⌋
-:vert: |
-:partial: ∂
-:onehalf: ½
-:onequarter: ¼
-:ldots: …
-:forall: ∀
-:sqrt: √
-:inf: ∞
-:plusmn: ±
-
-// Greek letters
-:alpha: α
-:beta: β
-:gamma: γ
-:DeltaUpper: Δ
-:delta: δ
-:epsilon: ε
-:eta: η
-:theta: θ
-:lambda: λ
-:pi: π
-:rho: ρ
-:sigma: σ
-:tau: τ
-:phi: ϕ
-
-// Word break opportunity tag for HTML
-ifdef::backend-html5[]
-:wbro: pass:[<wbr>]
-endif::backend-html5[]
-ifndef::backend-html5[]
-:wbro:
-endif::backend-html5[]
-
-// header names
-:core_header: vulkan_core.h
-:full_header: vulkan.h
-
-// Placeholders for host synchronization block text
-:externsynctitle: Host Synchronization
-:externsyncprefix: Host access to
-
-// SPIR-V terms
-// macros are not case-sensitive but are defined as such for readability
-:ExecutionModel: code:Execution code:Model
-:ExecutionMode: code:Execution code:Mode
-:StorageClass: code:Storage code:Class
-
-// Human-readable names for XML 'specialuse' attributes, used in
-// chapters/extensions.txt for the <<extendingvulkan-specialuse-table>> table
-// as well as in some extension appendices.
-:cadsupport: CAD support
-:d3demulation: D3D support
-:devtools: Developer tools
-:debugging: Debugging tools
-:glemulation: OpenGL / ES support
-
-
-// URL prefix for the github repository containing the public specification,
-// used to generate links to separate extension proposal documents in
-// generated extension metadata.
-:specRepositoryURL: https://github.com/KhronosGroup/Vulkan-Docs/tree/main
diff --git a/registry/vulkan/config/chunkindex/README.adoc b/registry/vulkan/config/chunkindex/README.adoc
deleted file mode 100644
index b3eb47b..0000000
--- a/registry/vulkan/config/chunkindex/README.adoc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-ifdef::env-github[]
-:note-caption: :information_source:
-endif::[]
-
-= Index Building For Vulkan Chunked HTML Output
-
-This directory contains scripts which help a search index, and add a
-searchbox using this index into each page of the Vulkan chunked HTML
-specification output. These files include:
-
-[options="compact"]
-  * README.adoc - this file
-  * build-index.js - build a JSON search index from generate-index.rb output
-  * chunked.css - CSS for the searchbox
-  * chunked.js - Script to load and execute the searchbox
-  * custom.patch - Patch to generated HTML to include chunked.js / chunked.css
-  * generate-index.rb - generate an index of the HTML documents
-  * lunr.js - utility functions taken from the lunr package
-
-= Credits and Licenses
-
-The indexing tools and toolchain was created by Baldur Karlsson in
-    https://github.com/baldurk/vkdocs-chunked-builder
-Files created in that project are under the Apache 2.0 license.
-
-Portions of the chunked.js script are taken from
-    https://github.com/filamentgroup/loadJS/blob/master/loadJS.js
-These portions are copyright Scott Jehl, Filament Group, Inc., under an MIT
-license.
-
-The lunr.js script is taken from the 'lunr' npm package, version 2.3.8. It
-is copyright Oliver Nightingale, under an MIT license.
diff --git a/registry/vulkan/config/chunkindex/addscript.jsmarker b/registry/vulkan/config/chunkindex/addscript.jsmarker
deleted file mode 100644
index 387d7a8..0000000
--- a/registry/vulkan/config/chunkindex/addscript.jsmarker
+++ /dev/null
@@ -1,3 +0,0 @@
-<link href="chunked.css?4" rel="stylesheet">
-<script>var searchindexurl = 'search.index.js?4' + (document.title.replace(/[^0-9.]/g, ''));</script>
-<script src="chunked.js?4"></script>
diff --git a/registry/vulkan/config/chunkindex/addscript.searchboxmarker b/registry/vulkan/config/chunkindex/addscript.searchboxmarker
deleted file mode 100644
index 7d8bfb0..0000000
--- a/registry/vulkan/config/chunkindex/addscript.searchboxmarker
+++ /dev/null
@@ -1 +0,0 @@
-<div class="searchbox"><label for="searchbox">Search: </label><input id="searchbox" type="text" disabled="disabled" value="Loading Search Data" /><div id="resultsdiv"><ol id="results"></ol></div></div>
diff --git a/registry/vulkan/config/chunkindex/addscripts.sh b/registry/vulkan/config/chunkindex/addscripts.sh
deleted file mode 100755
index dadde98..0000000
--- a/registry/vulkan/config/chunkindex/addscripts.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-# Copyright 2020-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-# Replace marker comments in asciidoctor-generated HTML with JavaScript
-# and HTML supporting the searchbox.
-#
-# The marker comments are inserted by config/loadable_html/extension.rb,
-# and are a stable place to add these comments, unlike the previous
-# method of using 'patch'. That could fail when moving to new
-# asciidoctor versions and style files. This can still fail, but should
-# be more robust.
-#
-# Usage: addscripts.sh input-file output-file
-
-# Find path to the script, which is also the patch to the replacements
-path=`dirname $0`
-
-input=$1
-output=$2
-test -f $input || (echo "No input file $1" ; exit 1)
-
-# Replace the first marker comment with text in addscript.jsmarker
-# Replace the second marker comment with text in addscript.searchboxmarker
-
-cp $input $output
-sed -i -e '/<\!--ChunkedSearchJSMarker-->/r '"$path/addscript.jsmarker" \
-       -e '/<\!--ChunkedSearchboxMarker-->/r '"$path/addscript.searchboxmarker" \
-       $output
diff --git a/registry/vulkan/config/chunkindex/build-index.js b/registry/vulkan/config/chunkindex/build-index.js
deleted file mode 100644
index 99d7550..0000000
--- a/registry/vulkan/config/chunkindex/build-index.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2019 Baldur Karlsson
-//
-// SPDX-License-Identifier: Apache-2.0
-
-var lunr = require('lunr'),
-    stdin = process.stdin,
-    stdout = process.stdout,
-    buffer = []
-
-stdin.resume()
-stdin.setEncoding('utf8')
-
-stdin.on('data', function (data) {
-  buffer.push(data)
-})
-
-stdin.on('end', function () {
-  var documents = JSON.parse(buffer.join(''))
-
-  var idx = lunr(function () {
-    this.ref('id')
-    this.field('title')
-    this.field('body')
-
-    documents.forEach(function (doc) {
-      this.add(doc)
-    }, this)
-  })
-
-  stdout.write("var searchindex = " + JSON.stringify(idx) + ";\n")
-
-  var searchlookup = {};
-
-  for(var i=0; i < documents.length; i++) {
-    searchlookup[documents[i].id] = documents[i].title;
-  }
-
-  stdout.write("var searchlookup = " + JSON.stringify(searchlookup) + ";\n")
-})
diff --git a/registry/vulkan/config/chunkindex/chunked.css b/registry/vulkan/config/chunkindex/chunked.css
deleted file mode 100644
index 6bedffa..0000000
--- a/registry/vulkan/config/chunkindex/chunked.css
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Copyright (c) 2019 Baldur Karlsson
- *
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/*
-a.headerlink { display: none; text-decoration: none; }
-
-h2:hover a.headerlink { display: inline; }
-h3:hover a.headerlink { display: inline; }
-h4:hover a.headerlink { display: inline; }
-h5:hover a.headerlink { display: inline; }
-h6:hover a.headerlink { display: inline; }
-*/
-
-div.searchbox {
-  background-color: white;
-  margin-top: 20px;
-}
-
-@media only screen and (min-width: 768px) {
-  div#toc {
-    padding-top: 6em !important;
-  }
-
-  div.searchbox {
-    display: block;
-    position: fixed;
-    left: 0px;
-    max-width: 13.5em;
-    padding-left: 20px;
-    padding-top: 20px;
-    margin-top: 0px;
-    top: 0px;
-    /* border-bottom: 1px solid black; */
-    /* box-shadow: 0px 10px 20px -10px #444444; */
-    z-index: 1000;
-  }
-}
-
-@media only screen and (min-width: 1280px) {
-  div.searchbox {
-    max-width: 18em;
-  }
-
-  div.searchbox input {
-    width: 17em;
-  }
-}
-
-div.searchbox div.results {
-  border: 1px solid black;
-}
-
-div.searchbox label {
-  display: block;
-  width: 160px;
-}
-
-div.searchbox input {
-  margin-top: 0.5em;
-  margin-bottom: 0.5em;
-}
-
-ol#results li a {
-  text-overflow: ellipsis;
-  overflow: hidden;
-  display: block;
-}
-
-.link {
-  position: absolute;
-  z-index: 1000;
-  right: 4em;
-  margin-top: 0.5em;
-  display: none;
-}
-
-.listingblock:hover .link {
-  display: block;
-}
diff --git a/registry/vulkan/config/chunkindex/chunked.js b/registry/vulkan/config/chunkindex/chunked.js
deleted file mode 100644
index e7111e2..0000000
--- a/registry/vulkan/config/chunkindex/chunked.js
+++ /dev/null
@@ -1,170 +0,0 @@
-/*! loadJS: load a JS file asynchronously. [c]2014 @scottjehl, Filament Group, Inc. (Based on http://goo.gl/REQGQ by Paul Irish). Licensed MIT */
-(function( w ){
-        var loadJS = function( src, cb, ordered ){
-                "use strict";
-                var tmp;
-                var ref = w.document.getElementsByTagName( "script" )[ 0 ];
-                var script = w.document.createElement( "script" );
-
-                if (typeof(cb) === 'boolean') {
-                        tmp = ordered;
-                        ordered = cb;
-                        cb = tmp;
-                }
-
-                script.src = src;
-                script.async = !ordered;
-                ref.parentNode.insertBefore( script, ref );
-
-                if (cb && typeof(cb) === "function") {
-                        script.onload = cb;
-                }
-                return script;
-        };
-        // commonjs
-        if( typeof module !== "undefined" ){
-                module.exports = loadJS;
-        }
-        else {
-                w.loadJS = loadJS;
-        }
-}( typeof global !== "undefined" ? global : this ));
-/*! end loadJS */
-
-// Remaining portions of this file are
-//
-// Copyright (c) 2019 Baldur Karlsson
-//
-// SPDX-License-Identifier: Apache-2.0
-
-var searchengine = undefined;
-
-// scroll to the first <a> linking to a chapter
-function scrollChapter(element, chapter) {
-  for(var i=0; i < element.children.length; i++) {
-    if(element.children[i].nodeName == "A" && element.children[i].href.indexOf(chapter) >= 0) {
-      element.children[i].scrollIntoView(true);
-      return true;
-    }
-
-    if(scrollChapter(element.children[i], chapter))
-      return true;
-  }
-
-  return false;
-}
-
-var results = undefined;
-var searchbox = undefined;
-var searchTimeout = undefined;
-
-function clearSearch() {
-  while(results.children.length > 0) {
-    results.removeChild(results.children[0]);
-  }
-
-  document.getElementById("resultsdiv").classList.remove("results");
-}
-
-function doSearch() {
-  clearSearch();
-
-  var searchtext = searchbox.value;
-
-  if(searchtext == '')
-    return;
-
-  if(searchtext.indexOf(' ') == -1 && searchtext.indexOf('\t') == -1 && searchtext.indexOf('"') == -1)
-    searchtext = searchtext + ' ' + searchtext + '*';
-
-  searchtext = searchtext.replace(/"/g, '')
-
-  var searchresults = searchengine.search(searchtext);
-
-  if(searchresults.length == 0) {
-    var r = document.createElement('LI');
-    r.innerHTML = 'No results';
-
-    results.appendChild(r);
-  }
-
-  document.getElementById("resultsdiv").classList.add("results");
-
-  for(var i=0; i < 10 && i < searchresults.length; i++) {
-    var a = document.createElement('A');
-    a.setAttribute('href', searchresults[i].ref);
-    a.innerHTML = searchlookup[searchresults[i].ref];
-
-    var r = document.createElement('LI');
-    r.appendChild(a);
-
-    results.appendChild(r);
-  }
-}
-
-function searchInput(e) {
-  if(searchTimeout !== undefined)
-    clearTimeout(searchTimeout);
-
-  searchTimeout = setTimeout(doSearch, 50);
-}
-
-function searchKeyDown(e) {
-  if(e.keyCode == 27) {
-    // escape
-    if(searchTimeout !== undefined)
-      clearTimeout(searchTimeout);
-
-    searchbox.value = '';
-
-    clearSearch();
-  } else if(e.keyCode == 10 || e.keyCode == 13) {
-    // enter/return
-    doSearch();
-  } else if(e.keyCode == 8) {
-    clearSearch();
-
-    searchInput(e);
-  }
-}
-
-document.addEventListener("DOMContentLoaded", function(event) {
-  // get the chapter name from the current URL
-  var chap = window.location.pathname.replace(/.*\//, '');
-
-  var toc = document.getElementById("toc");
-
-  // Scroll the sidebar to the appropriate chapter
-  if(chap != "") {
-    scrollChapter(toc, chap);
-    toc.scrollTop -= 96;
-  }
-
-  // add anchor links to code blocks
-  var blocks = document.getElementsByClassName("listingblock")
-
-  for(var i=0; i < blocks.length; i++) {
-    if(blocks[i].id.length > 0) {
-      var a = document.createElement("A");
-      a.innerHTML = '\u00B6';
-      a.setAttribute('class', 'link');
-      a.setAttribute('href', '#' + blocks[i].id);
-
-      blocks[i].insertBefore(a, blocks[i].childNodes[0]);
-    }
-  }
-
-  results = document.getElementById('results');
-  searchbox = document.getElementById('searchbox');
-
-  loadJS("lunr.js", function() {
-    loadJS(searchindexurl, function() {
-      searchengine = lunr.Index.load(searchindex);
-
-      searchbox.value = '';
-      searchbox.disabled = false;
-      searchbox.addEventListener('keydown', searchKeyDown, false);
-      searchbox.addEventListener('input', searchInput, false);
-    }, true);
-  }, true);
-});
diff --git a/registry/vulkan/config/chunkindex/custom.patch b/registry/vulkan/config/chunkindex/custom.patch
deleted file mode 100644
index bc2b7ce..0000000
--- a/registry/vulkan/config/chunkindex/custom.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff --git a/vkspec.html b/vkspec.html
-index fbe650a..d665755 100644
---- a/vkspec.html
-+++ b/vkspec.html
-@@ -757,6 +757,9 @@ li > p > a[id^="VUID-"].link:hover { color: black; }
- <link rel="preload" href="../katex/fonts/KaTeX_Size3-Regular.woff2" as="font" type="font/woff2" crossorigin="">
- <link rel="preload" href="../katex/fonts/KaTeX_Size4-Regular.woff2" as="font" type="font/woff2" crossorigin="">
- <link rel="preload" href="../katex/fonts/KaTeX_Typewriter-Regular.woff2" as="font" type="font/woff2" crossorigin=""><link rel="stylesheet" href="../katex/katex.min.css">
-+<link href="chunked.css?4" rel="stylesheet">
-+<script>var searchindexurl = 'search.index.js?4' + (document.title.replace(/[^0-9.]/g, ''));</script>
-+<script src="chunked.js?4"></script>
- <style>
-     #loading_msg {
-         width: 100%;
-@@ -1318,6 +1322,7 @@ li > p > a[id^="VUID-"].link:hover { color: black; }
- </div>
- </div>
- <div id="loading_msg" class="hidden" hidden><p>Loading&hellip; please wait.</p></div>
-+<div class="searchbox"><label for="searchbox">Search: </label><input id="searchbox" type="text" disabled="disabled" value="Loading Search Data" /><div id="resultsdiv"><ol id="results"></ol></div></div>
- <div id="content" class="loadable" ><script>hideLoadableContent();</script>
- <div id="preamble">
- <div class="sectionbody">
diff --git a/registry/vulkan/config/chunkindex/generate-index.rb b/registry/vulkan/config/chunkindex/generate-index.rb
deleted file mode 100644
index bc59bc9..0000000
--- a/registry/vulkan/config/chunkindex/generate-index.rb
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env ruby
-#
-# Copyright (c) 2019 Baldur Karlsson
-#
-# SPDX-License-Identifier: Apache-2.0
-
-require 'pp'
-require 'json'
-
-data = []
-
-ARGV.each do |file|
-
-  curdata = nil
-  extappendix = false
-  curext = ""
-
-  File.readlines(file).each do |line|
-
-    text = line.gsub(/<\/?[^>]*>/, "")
-
-    # Special case - set up high quality results for given structs
-    if line =~ /div id="([vV][kK][^"]*)"/ then
-      id = $1
-
-      data << { :id => File.basename(file) + "#" + id, :title => id, :body => id }
-    end
-
-    if line =~ /h[0-9]\s*id="([^"]*)"/ then
-
-      id = $1
-
-      if curdata != nil then
-        data << curdata
-      end
-
-      if text =~ /Appendix.*Extensions/ then
-        extappendix = true
-      end
-
-      if extappendix and text =~ /^VK_.*/ then
-        curext = text
-      elsif curext != "" then
-        text = "#{curext.strip} - #{text}"
-      end
-
-      curdata = { :id => File.basename(file) + "#" + id, :title => text, :body => "" }
-    elsif curdata != nil then
-      curdata[:body] += " " + text
-    end
-
-  end
-
-  if curdata != nil then
-    data << curdata
-  end
-
-end
-
-puts JSON.generate(data)
diff --git a/registry/vulkan/config/chunkindex/lunr.js b/registry/vulkan/config/chunkindex/lunr.js
deleted file mode 100644
index c353765..0000000
--- a/registry/vulkan/config/chunkindex/lunr.js
+++ /dev/null
@@ -1,3475 +0,0 @@
-/**
- * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.8
- * Copyright (C) 2019 Oliver Nightingale
- * @license MIT
- */
-
-;(function(){
-
-/**
- * A convenience function for configuring and constructing
- * a new lunr Index.
- *
- * A lunr.Builder instance is created and the pipeline setup
- * with a trimmer, stop word filter and stemmer.
- *
- * This builder object is yielded to the configuration function
- * that is passed as a parameter, allowing the list of fields
- * and other builder parameters to be customised.
- *
- * All documents _must_ be added within the passed config function.
- *
- * @example
- * var idx = lunr(function () {
- *   this.field('title')
- *   this.field('body')
- *   this.ref('id')
- *
- *   documents.forEach(function (doc) {
- *     this.add(doc)
- *   }, this)
- * })
- *
- * @see {@link lunr.Builder}
- * @see {@link lunr.Pipeline}
- * @see {@link lunr.trimmer}
- * @see {@link lunr.stopWordFilter}
- * @see {@link lunr.stemmer}
- * @namespace {function} lunr
- */
-var lunr = function (config) {
-  var builder = new lunr.Builder
-
-  builder.pipeline.add(
-    lunr.trimmer,
-    lunr.stopWordFilter,
-    lunr.stemmer
-  )
-
-  builder.searchPipeline.add(
-    lunr.stemmer
-  )
-
-  config.call(builder, builder)
-  return builder.build()
-}
-
-lunr.version = "2.3.8"
-/*!
- * lunr.utils
- * Copyright (C) 2019 Oliver Nightingale
- */
-
-/**
- * A namespace containing utils for the rest of the lunr library
- * @namespace lunr.utils
- */
-lunr.utils = {}
-
-/**
- * Print a warning message to the console.
- *
- * @param {String} message The message to be printed.
- * @memberOf lunr.utils
- * @function
- */
-lunr.utils.warn = (function (global) {
-  /* eslint-disable no-console */
-  return function (message) {
-    if (global.console && console.warn) {
-      console.warn(message)
-    }
-  }
-  /* eslint-enable no-console */
-})(this)
-
-/**
- * Convert an object to a string.
- *
- * In the case of `null` and `undefined` the function returns
- * the empty string, in all other cases the result of calling
- * `toString` on the passed object is returned.
- *
- * @param {Any} obj The object to convert to a string.
- * @return {String} string representation of the passed object.
- * @memberOf lunr.utils
- */
-lunr.utils.asString = function (obj) {
-  if (obj === void 0 || obj === null) {
-    return ""
-  } else {
-    return obj.toString()
-  }
-}
-
-/**
- * Clones an object.
- *
- * Will create a copy of an existing object such that any mutations
- * on the copy cannot affect the original.
- *
- * Only shallow objects are supported, passing a nested object to this
- * function will cause a TypeError.
- *
- * Objects with primitives, and arrays of primitives are supported.
- *
- * @param {Object} obj The object to clone.
- * @return {Object} a clone of the passed object.
- * @throws {TypeError} when a nested object is passed.
- * @memberOf Utils
- */
-lunr.utils.clone = function (obj) {
-  if (obj === null || obj === undefined) {
-    return obj
-  }
-
-  var clone = Object.create(null),
-      keys = Object.keys(obj)
-
-  for (var i = 0; i < keys.length; i++) {
-    var key = keys[i],
-        val = obj[key]
-
-    if (Array.isArray(val)) {
-      clone[key] = val.slice()
-      continue
-    }
-
-    if (typeof val === 'string' ||
-        typeof val === 'number' ||
-        typeof val === 'boolean') {
-      clone[key] = val
-      continue
-    }
-
-    throw new TypeError("clone is not deep and does not support nested objects")
-  }
-
-  return clone
-}
-lunr.FieldRef = function (docRef, fieldName, stringValue) {
-  this.docRef = docRef
-  this.fieldName = fieldName
-  this._stringValue = stringValue
-}
-
-lunr.FieldRef.joiner = "/"
-
-lunr.FieldRef.fromString = function (s) {
-  var n = s.indexOf(lunr.FieldRef.joiner)
-
-  if (n === -1) {
-    throw "malformed field ref string"
-  }
-
-  var fieldRef = s.slice(0, n),
-      docRef = s.slice(n + 1)
-
-  return new lunr.FieldRef (docRef, fieldRef, s)
-}
-
-lunr.FieldRef.prototype.toString = function () {
-  if (this._stringValue == undefined) {
-    this._stringValue = this.fieldName + lunr.FieldRef.joiner + this.docRef
-  }
-
-  return this._stringValue
-}
-/*!
- * lunr.Set
- * Copyright (C) 2019 Oliver Nightingale
- */
-
-/**
- * A lunr set.
- *
- * @constructor
- */
-lunr.Set = function (elements) {
-  this.elements = Object.create(null)
-
-  if (elements) {
-    this.length = elements.length
-
-    for (var i = 0; i < this.length; i++) {
-      this.elements[elements[i]] = true
-    }
-  } else {
-    this.length = 0
-  }
-}
-
-/**
- * A complete set that contains all elements.
- *
- * @static
- * @readonly
- * @type {lunr.Set}
- */
-lunr.Set.complete = {
-  intersect: function (other) {
-    return other
-  },
-
-  union: function (other) {
-    return other
-  },
-
-  contains: function () {
-    return true
-  }
-}
-
-/**
- * An empty set that contains no elements.
- *
- * @static
- * @readonly
- * @type {lunr.Set}
- */
-lunr.Set.empty = {
-  intersect: function () {
-    return this
-  },
-
-  union: function (other) {
-    return other
-  },
-
-  contains: function () {
-    return false
-  }
-}
-
-/**
- * Returns true if this set contains the specified object.
- *
- * @param {object} object - Object whose presence in this set is to be tested.
- * @returns {boolean} - True if this set contains the specified object.
- */
-lunr.Set.prototype.contains = function (object) {
-  return !!this.elements[object]
-}
-
-/**
- * Returns a new set containing only the elements that are present in both
- * this set and the specified set.
- *
- * @param {lunr.Set} other - set to intersect with this set.
- * @returns {lunr.Set} a new set that is the intersection of this and the specified set.
- */
-
-lunr.Set.prototype.intersect = function (other) {
-  var a, b, elements, intersection = []
-
-  if (other === lunr.Set.complete) {
-    return this
-  }
-
-  if (other === lunr.Set.empty) {
-    return other
-  }
-
-  if (this.length < other.length) {
-    a = this
-    b = other
-  } else {
-    a = other
-    b = this
-  }
-
-  elements = Object.keys(a.elements)
-
-  for (var i = 0; i < elements.length; i++) {
-    var element = elements[i]
-    if (element in b.elements) {
-      intersection.push(element)
-    }
-  }
-
-  return new lunr.Set (intersection)
-}
-
-/**
- * Returns a new set combining the elements of this and the specified set.
- *
- * @param {lunr.Set} other - set to union with this set.
- * @return {lunr.Set} a new set that is the union of this and the specified set.
- */
-
-lunr.Set.prototype.union = function (other) {
-  if (other === lunr.Set.complete) {
-    return lunr.Set.complete
-  }
-
-  if (other === lunr.Set.empty) {
-    return this
-  }
-
-  return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements)))
-}
-/**
- * A function to calculate the inverse document frequency for
- * a posting. This is shared between the builder and the index
- *
- * @private
- * @param {object} posting - The posting for a given term
- * @param {number} documentCount - The total number of documents.
- */
-lunr.idf = function (posting, documentCount) {
-  var documentsWithTerm = 0
-
-  for (var fieldName in posting) {
-    if (fieldName == '_index') continue // Ignore the term index, its not a field
-    documentsWithTerm += Object.keys(posting[fieldName]).length
-  }
-
-  var x = (documentCount - documentsWithTerm + 0.5) / (documentsWithTerm + 0.5)
-
-  return Math.log(1 + Math.abs(x))
-}
-
-/**
- * A token wraps a string representation of a token
- * as it is passed through the text processing pipeline.
- *
- * @constructor
- * @param {string} [str=''] - The string token being wrapped.
- * @param {object} [metadata={}] - Metadata associated with this token.
- */
-lunr.Token = function (str, metadata) {
-  this.str = str || ""
-  this.metadata = metadata || {}
-}
-
-/**
- * Returns the token string that is being wrapped by this object.
- *
- * @returns {string}
- */
-lunr.Token.prototype.toString = function () {
-  return this.str
-}
-
-/**
- * A token update function is used when updating or optionally
- * when cloning a token.
- *
- * @callback lunr.Token~updateFunction
- * @param {string} str - The string representation of the token.
- * @param {Object} metadata - All metadata associated with this token.
- */
-
-/**
- * Applies the given function to the wrapped string token.
- *
- * @example
- * token.update(function (str, metadata) {
- *   return str.toUpperCase()
- * })
- *
- * @param {lunr.Token~updateFunction} fn - A function to apply to the token string.
- * @returns {lunr.Token}
- */
-lunr.Token.prototype.update = function (fn) {
-  this.str = fn(this.str, this.metadata)
-  return this
-}
-
-/**
- * Creates a clone of this token. Optionally a function can be
- * applied to the cloned token.
- *
- * @param {lunr.Token~updateFunction} [fn] - An optional function to apply to the cloned token.
- * @returns {lunr.Token}
- */
-lunr.Token.prototype.clone = function (fn) {
-  fn = fn || function (s) { return s }
-  return new lunr.Token (fn(this.str, this.metadata), this.metadata)
-}
-/*!
- * lunr.tokenizer
- * Copyright (C) 2019 Oliver Nightingale
- */
-
-/**
- * A function for splitting a string into tokens ready to be inserted into
- * the search index. Uses `lunr.tokenizer.separator` to split strings, change
- * the value of this property to change how strings are split into tokens.
- *
- * This tokenizer will convert its parameter to a string by calling `toString` and
- * then will split this string on the character in `lunr.tokenizer.separator`.
- * Arrays will have their elements converted to strings and wrapped in a lunr.Token.
- *
- * Optional metadata can be passed to the tokenizer, this metadata will be cloned and
- * added as metadata to every token that is created from the object to be tokenized.
- *
- * @static
- * @param {?(string|object|object[])} obj - The object to convert into tokens
- * @param {?object} metadata - Optional metadata to associate with every token
- * @returns {lunr.Token[]}
- * @see {@link lunr.Pipeline}
- */
-lunr.tokenizer = function (obj, metadata) {
-  if (obj == null || obj == undefined) {
-    return []
-  }
-
-  if (Array.isArray(obj)) {
-    return obj.map(function (t) {
-      return new lunr.Token(
-        lunr.utils.asString(t).toLowerCase(),
-        lunr.utils.clone(metadata)
-      )
-    })
-  }
-
-  var str = obj.toString().toLowerCase(),
-      len = str.length,
-      tokens = []
-
-  for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) {
-    var char = str.charAt(sliceEnd),
-        sliceLength = sliceEnd - sliceStart
-
-    if ((char.match(lunr.tokenizer.separator) || sliceEnd == len)) {
-
-      if (sliceLength > 0) {
-        var tokenMetadata = lunr.utils.clone(metadata) || {}
-        tokenMetadata["position"] = [sliceStart, sliceLength]
-        tokenMetadata["index"] = tokens.length
-
-        tokens.push(
-          new lunr.Token (
-            str.slice(sliceStart, sliceEnd),
-            tokenMetadata
-          )
-        )
-      }
-
-      sliceStart = sliceEnd + 1
-    }
-
-  }
-
-  return tokens
-}
-
-/**
- * The separator used to split a string into tokens. Override this property to change the behaviour of
- * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens.
- *
- * @static
- * @see lunr.tokenizer
- */
-lunr.tokenizer.separator = /[\s\-]+/
-/*!
- * lunr.Pipeline
- * Copyright (C) 2019 Oliver Nightingale
- */
-
-/**
- * lunr.Pipelines maintain an ordered list of functions to be applied to all
- * tokens in documents entering the search index and queries being ran against
- * the index.
- *
- * An instance of lunr.Index created with the lunr shortcut will contain a
- * pipeline with a stop word filter and an English language stemmer. Extra
- * functions can be added before or after either of these functions or these
- * default functions can be removed.
- *
- * When run the pipeline will call each function in turn, passing a token, the
- * index of that token in the original list of all tokens and finally a list of
- * all the original tokens.
- *
- * The output of functions in the pipeline will be passed to the next function
- * in the pipeline. To exclude a token from entering the index the function
- * should return undefined, the rest of the pipeline will not be called with
- * this token.
- *
- * For serialisation of pipelines to work, all functions used in an instance of
- * a pipeline should be registered with lunr.Pipeline. Registered functions can
- * then be loaded. If trying to load a serialised pipeline that uses functions
- * that are not registered an error will be thrown.
- *
- * If not planning on serialising the pipeline then registering pipeline functions
- * is not necessary.
- *
- * @constructor
- */
-lunr.Pipeline = function () {
-  this._stack = []
-}
-
-lunr.Pipeline.registeredFunctions = Object.create(null)
-
-/**
- * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token
- * string as well as all known metadata. A pipeline function can mutate the token string
- * or mutate (or add) metadata for a given token.
- *
- * A pipeline function can indicate that the passed token should be discarded by returning
- * null, undefined or an empty string. This token will not be passed to any downstream pipeline
- * functions and will not be added to the index.
- *
- * Multiple tokens can be returned by returning an array of tokens. Each token will be passed
- * to any downstream pipeline functions and all will returned tokens will be added to the index.
- *
- * Any number of pipeline functions may be chained together using a lunr.Pipeline.
- *
- * @interface lunr.PipelineFunction
- * @param {lunr.Token} token - A token from the document being processed.
- * @param {number} i - The index of this token in the complete list of tokens for this document/field.
- * @param {lunr.Token[]} tokens - All tokens for this document/field.
- * @returns {(?lunr.Token|lunr.Token[])}
- */
-
-/**
- * Register a function with the pipeline.
- *
- * Functions that are used in the pipeline should be registered if the pipeline
- * needs to be serialised, or a serialised pipeline needs to be loaded.
- *
- * Registering a function does not add it to a pipeline, functions must still be
- * added to instances of the pipeline for them to be used when running a pipeline.
- *
- * @param {lunr.PipelineFunction} fn - The function to check for.
- * @param {String} label - The label to register this function with
- */
-lunr.Pipeline.registerFunction = function (fn, label) {
-  if (label in this.registeredFunctions) {
-    lunr.utils.warn('Overwriting existing registered function: ' + label)
-  }
-
-  fn.label = label
-  lunr.Pipeline.registeredFunctions[fn.label] = fn
-}
-
-/**
- * Warns if the function is not registered as a Pipeline function.
- *
- * @param {lunr.PipelineFunction} fn - The function to check for.
- * @private
- */
-lunr.Pipeline.warnIfFunctionNotRegistered = function (fn) {
-  var isRegistered = fn.label && (fn.label in this.registeredFunctions)
-
-  if (!isRegistered) {
-    lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\n', fn)
-  }
-}
-
-/**
- * Loads a previously serialised pipeline.
- *
- * All functions to be loaded must already be registered with lunr.Pipeline.
- * If any function from the serialised data has not been registered then an
- * error will be thrown.
- *
- * @param {Object} serialised - The serialised pipeline to load.
- * @returns {lunr.Pipeline}
- */
-lunr.Pipeline.load = function (serialised) {
-  var pipeline = new lunr.Pipeline
-
-  serialised.forEach(function (fnName) {
-    var fn = lunr.Pipeline.registeredFunctions[fnName]
-
-    if (fn) {
-      pipeline.add(fn)
-    } else {
-      throw new Error('Cannot load unregistered function: ' + fnName)
-    }
-  })
-
-  return pipeline
-}
-
-/**
- * Adds new functions to the end of the pipeline.
- *
- * Logs a warning if the function has not been registered.
- *
- * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline.
- */
-lunr.Pipeline.prototype.add = function () {
-  var fns = Array.prototype.slice.call(arguments)
-
-  fns.forEach(function (fn) {
-    lunr.Pipeline.warnIfFunctionNotRegistered(fn)
-    this._stack.push(fn)
-  }, this)
-}
-
-/**
- * Adds a single function after a function that already exists in the
- * pipeline.
- *
- * Logs a warning if the function has not been registered.
- *
- * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.
- * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.
- */
-lunr.Pipeline.prototype.after = function (existingFn, newFn) {
-  lunr.Pipeline.warnIfFunctionNotRegistered(newFn)
-
-  var pos = this._stack.indexOf(existingFn)
-  if (pos == -1) {
-    throw new Error('Cannot find existingFn')
-  }
-
-  pos = pos + 1
-  this._stack.splice(pos, 0, newFn)
-}
-
-/**
- * Adds a single function before a function that already exists in the
- * pipeline.
- *
- * Logs a warning if the function has not been registered.
- *
- * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.
- * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.
- */
-lunr.Pipeline.prototype.before = function (existingFn, newFn) {
-  lunr.Pipeline.warnIfFunctionNotRegistered(newFn)
-
-  var pos = this._stack.indexOf(existingFn)
-  if (pos == -1) {
-    throw new Error('Cannot find existingFn')
-  }
-
-  this._stack.splice(pos, 0, newFn)
-}
-
-/**
- * Removes a function from the pipeline.
- *
- * @param {lunr.PipelineFunction} fn The function to remove from the pipeline.
- */
-lunr.Pipeline.prototype.remove = function (fn) {
-  var pos = this._stack.indexOf(fn)
-  if (pos == -1) {
-    return
-  }
-
-  this._stack.splice(pos, 1)
-}
-
-/**
- * Runs the current list of functions that make up the pipeline against the
- * passed tokens.
- *
- * @param {Array} tokens The tokens to run through the pipeline.
- * @returns {Array}
- */
-lunr.Pipeline.prototype.run = function (tokens) {
-  var stackLength = this._stack.length
-
-  for (var i = 0; i < stackLength; i++) {
-    var fn = this._stack[i]
-    var memo = []
-
-    for (var j = 0; j < tokens.length; j++) {
-      var result = fn(tokens[j], j, tokens)
-
-      if (result === null || result === void 0 || result === '') continue
-
-      if (Array.isArray(result)) {
-        for (var k = 0; k < result.length; k++) {
-          memo.push(result[k])
-        }
-      } else {
-        memo.push(result)
-      }
-    }
-
-    tokens = memo
-  }
-
-  return tokens
-}
-
-/**
- * Convenience method for passing a string through a pipeline and getting
- * strings out. This method takes care of wrapping the passed string in a
- * token and mapping the resulting tokens back to strings.
- *
- * @param {string} str - The string to pass through the pipeline.
- * @param {?object} metadata - Optional metadata to associate with the token
- * passed to the pipeline.
- * @returns {string[]}
- */
-lunr.Pipeline.prototype.runString = function (str, metadata) {
-  var token = new lunr.Token (str, metadata)
-
-  return this.run([token]).map(function (t) {
-    return t.toString()
-  })
-}
-
-/**
- * Resets the pipeline by removing any existing processors.
- *
- */
-lunr.Pipeline.prototype.reset = function () {
-  this._stack = []
-}
-
-/**
- * Returns a representation of the pipeline ready for serialisation.
- *
- * Logs a warning if the function has not been registered.
- *
- * @returns {Array}
- */
-lunr.Pipeline.prototype.toJSON = function () {
-  return this._stack.map(function (fn) {
-    lunr.Pipeline.warnIfFunctionNotRegistered(fn)
-
-    return fn.label
-  })
-}
-/*!
- * lunr.Vector
- * Copyright (C) 2019 Oliver Nightingale
- */
-
-/**
- * A vector is used to construct the vector space of documents and queries. These
- * vectors support operations to determine the similarity between two documents or
- * a document and a query.
- *
- * Normally no parameters are required for initializing a vector, but in the case of
- * loading a previously dumped vector the raw elements can be provided to the constructor.
- *
- * For performance reasons vectors are implemented with a flat array, where an elements
- * index is immediately followed by its value. E.g. [index, value, index, value]. This
- * allows the underlying array to be as sparse as possible and still offer decent
- * performance when being used for vector calculations.
- *
- * @constructor
- * @param {Number[]} [elements] - The flat list of element index and element value pairs.
- */
-lunr.Vector = function (elements) {
-  this._magnitude = 0
-  this.elements = elements || []
-}
-
-
-/**
- * Calculates the position within the vector to insert a given index.
- *
- * This is used internally by insert and upsert. If there are duplicate indexes then
- * the position is returned as if the value for that index were to be updated, but it
- * is the callers responsibility to check whether there is a duplicate at that index
- *
- * @param {Number} insertIdx - The index at which the element should be inserted.
- * @returns {Number}
- */
-lunr.Vector.prototype.positionForIndex = function (index) {
-  // For an empty vector the tuple can be inserted at the beginning
-  if (this.elements.length == 0) {
-    return 0
-  }
-
-  var start = 0,
-      end = this.elements.length / 2,
-      sliceLength = end - start,
-      pivotPoint = Math.floor(sliceLength / 2),
-      pivotIndex = this.elements[pivotPoint * 2]
-
-  while (sliceLength > 1) {
-    if (pivotIndex < index) {
-      start = pivotPoint
-    }
-
-    if (pivotIndex > index) {
-      end = pivotPoint
-    }
-
-    if (pivotIndex == index) {
-      break
-    }
-
-    sliceLength = end - start
-    pivotPoint = start + Math.floor(sliceLength / 2)
-    pivotIndex = this.elements[pivotPoint * 2]
-  }
-
-  if (pivotIndex == index) {
-    return pivotPoint * 2
-  }
-
-  if (pivotIndex > index) {
-    return pivotPoint * 2
-  }
-
-  if (pivotIndex < index) {
-    return (pivotPoint + 1) * 2
-  }
-}
-
-/**
- * Inserts an element at an index within the vector.
- *
- * Does not allow duplicates, will throw an error if there is already an entry
- * for this index.
- *
- * @param {Number} insertIdx - The index at which the element should be inserted.
- * @param {Number} val - The value to be inserted into the vector.
- */
-lunr.Vector.prototype.insert = function (insertIdx, val) {
-  this.upsert(insertIdx, val, function () {
-    throw "duplicate index"
-  })
-}
-
-/**
- * Inserts or updates an existing index within the vector.
- *
- * @param {Number} insertIdx - The index at which the element should be inserted.
- * @param {Number} val - The value to be inserted into the vector.
- * @param {function} fn - A function that is called for updates, the existing value and the
- * requested value are passed as arguments
- */
-lunr.Vector.prototype.upsert = function (insertIdx, val, fn) {
-  this._magnitude = 0
-  var position = this.positionForIndex(insertIdx)
-
-  if (this.elements[position] == insertIdx) {
-    this.elements[position + 1] = fn(this.elements[position + 1], val)
-  } else {
-    this.elements.splice(position, 0, insertIdx, val)
-  }
-}
-
-/**
- * Calculates the magnitude of this vector.
- *
- * @returns {Number}
- */
-lunr.Vector.prototype.magnitude = function () {
-  if (this._magnitude) return this._magnitude
-
-  var sumOfSquares = 0,
-      elementsLength = this.elements.length
-
-  for (var i = 1; i < elementsLength; i += 2) {
-    var val = this.elements[i]
-    sumOfSquares += val * val
-  }
-
-  return this._magnitude = Math.sqrt(sumOfSquares)
-}
-
-/**
- * Calculates the dot product of this vector and another vector.
- *
- * @param {lunr.Vector} otherVector - The vector to compute the dot product with.
- * @returns {Number}
- */
-lunr.Vector.prototype.dot = function (otherVector) {
-  var dotProduct = 0,
-      a = this.elements, b = otherVector.elements,
-      aLen = a.length, bLen = b.length,
-      aVal = 0, bVal = 0,
-      i = 0, j = 0
-
-  while (i < aLen && j < bLen) {
-    aVal = a[i], bVal = b[j]
-    if (aVal < bVal) {
-      i += 2
-    } else if (aVal > bVal) {
-      j += 2
-    } else if (aVal == bVal) {
-      dotProduct += a[i + 1] * b[j + 1]
-      i += 2
-      j += 2
-    }
-  }
-
-  return dotProduct
-}
-
-/**
- * Calculates the similarity between this vector and another vector.
- *
- * @param {lunr.Vector} otherVector - The other vector to calculate the
- * similarity with.
- * @returns {Number}
- */
-lunr.Vector.prototype.similarity = function (otherVector) {
-  return this.dot(otherVector) / this.magnitude() || 0
-}
-
-/**
- * Converts the vector to an array of the elements within the vector.
- *
- * @returns {Number[]}
- */
-lunr.Vector.prototype.toArray = function () {
-  var output = new Array (this.elements.length / 2)
-
-  for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) {
-    output[j] = this.elements[i]
-  }
-
-  return output
-}
-
-/**
- * A JSON serializable representation of the vector.
- *
- * @returns {Number[]}
- */
-lunr.Vector.prototype.toJSON = function () {
-  return this.elements
-}
-/* eslint-disable */
-/*!
- * lunr.stemmer
- * Copyright (C) 2019 Oliver Nightingale
- * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt
- */
-
-/**
- * lunr.stemmer is an english language stemmer, this is a JavaScript
- * implementation of the PorterStemmer taken from http://tartarus.org/~martin
- *
- * @static
- * @implements {lunr.PipelineFunction}
- * @param {lunr.Token} token - The string to stem
- * @returns {lunr.Token}
- * @see {@link lunr.Pipeline}
- * @function
- */
-lunr.stemmer = (function(){
-  var step2list = {
-      "ational" : "ate",
-      "tional" : "tion",
-      "enci" : "ence",
-      "anci" : "ance",
-      "izer" : "ize",
-      "bli" : "ble",
-      "alli" : "al",
-      "entli" : "ent",
-      "eli" : "e",
-      "ousli" : "ous",
-      "ization" : "ize",
-      "ation" : "ate",
-      "ator" : "ate",
-      "alism" : "al",
-      "iveness" : "ive",
-      "fulness" : "ful",
-      "ousness" : "ous",
-      "aliti" : "al",
-      "iviti" : "ive",
-      "biliti" : "ble",
-      "logi" : "log"
-    },
-
-    step3list = {
-      "icate" : "ic",
-      "ative" : "",
-      "alize" : "al",
-      "iciti" : "ic",
-      "ical" : "ic",
-      "ful" : "",
-      "ness" : ""
-    },
-
-    c = "[^aeiou]",          // consonant
-    v = "[aeiouy]",          // vowel
-    C = c + "[^aeiouy]*",    // consonant sequence
-    V = v + "[aeiou]*",      // vowel sequence
-
-    mgr0 = "^(" + C + ")?" + V + C,               // [C]VC... is m>0
-    meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$",  // [C]VC[V] is m=1
-    mgr1 = "^(" + C + ")?" + V + C + V + C,       // [C]VCVC... is m>1
-    s_v = "^(" + C + ")?" + v;                   // vowel in stem
-
-  var re_mgr0 = new RegExp(mgr0);
-  var re_mgr1 = new RegExp(mgr1);
-  var re_meq1 = new RegExp(meq1);
-  var re_s_v = new RegExp(s_v);
-
-  var re_1a = /^(.+?)(ss|i)es$/;
-  var re2_1a = /^(.+?)([^s])s$/;
-  var re_1b = /^(.+?)eed$/;
-  var re2_1b = /^(.+?)(ed|ing)$/;
-  var re_1b_2 = /.$/;
-  var re2_1b_2 = /(at|bl|iz)$/;
-  var re3_1b_2 = new RegExp("([^aeiouylsz])\\1$");
-  var re4_1b_2 = new RegExp("^" + C + v + "[^aeiouwxy]$");
-
-  var re_1c = /^(.+?[^aeiou])y$/;
-  var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
-
-  var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
-
-  var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
-  var re2_4 = /^(.+?)(s|t)(ion)$/;
-
-  var re_5 = /^(.+?)e$/;
-  var re_5_1 = /ll$/;
-  var re3_5 = new RegExp("^" + C + v + "[^aeiouwxy]$");
-
-  var porterStemmer = function porterStemmer(w) {
-    var stem,
-      suffix,
-      firstch,
-      re,
-      re2,
-      re3,
-      re4;
-
-    if (w.length < 3) { return w; }
-
-    firstch = w.substr(0,1);
-    if (firstch == "y") {
-      w = firstch.toUpperCase() + w.substr(1);
-    }
-
-    // Step 1a
-    re = re_1a
-    re2 = re2_1a;
-
-    if (re.test(w)) { w = w.replace(re,"$1$2"); }
-    else if (re2.test(w)) { w = w.replace(re2,"$1$2"); }
-
-    // Step 1b
-    re = re_1b;
-    re2 = re2_1b;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      re = re_mgr0;
-      if (re.test(fp[1])) {
-        re = re_1b_2;
-        w = w.replace(re,"");
-      }
-    } else if (re2.test(w)) {
-      var fp = re2.exec(w);
-      stem = fp[1];
-      re2 = re_s_v;
-      if (re2.test(stem)) {
-        w = stem;
-        re2 = re2_1b_2;
-        re3 = re3_1b_2;
-        re4 = re4_1b_2;
-        if (re2.test(w)) { w = w + "e"; }
-        else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,""); }
-        else if (re4.test(w)) { w = w + "e"; }
-      }
-    }
-
-    // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say)
-    re = re_1c;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      w = stem + "i";
-    }
-
-    // Step 2
-    re = re_2;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      suffix = fp[2];
-      re = re_mgr0;
-      if (re.test(stem)) {
-        w = stem + step2list[suffix];
-      }
-    }
-
-    // Step 3
-    re = re_3;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      suffix = fp[2];
-      re = re_mgr0;
-      if (re.test(stem)) {
-        w = stem + step3list[suffix];
-      }
-    }
-
-    // Step 4
-    re = re_4;
-    re2 = re2_4;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = re_mgr1;
-      if (re.test(stem)) {
-        w = stem;
-      }
-    } else if (re2.test(w)) {
-      var fp = re2.exec(w);
-      stem = fp[1] + fp[2];
-      re2 = re_mgr1;
-      if (re2.test(stem)) {
-        w = stem;
-      }
-    }
-
-    // Step 5
-    re = re_5;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = re_mgr1;
-      re2 = re_meq1;
-      re3 = re3_5;
-      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) {
-        w = stem;
-      }
-    }
-
-    re = re_5_1;
-    re2 = re_mgr1;
-    if (re.test(w) && re2.test(w)) {
-      re = re_1b_2;
-      w = w.replace(re,"");
-    }
-
-    // and turn initial Y back to y
-
-    if (firstch == "y") {
-      w = firstch.toLowerCase() + w.substr(1);
-    }
-
-    return w;
-  };
-
-  return function (token) {
-    return token.update(porterStemmer);
-  }
-})();
-
-lunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer')
-/*!
- * lunr.stopWordFilter
- * Copyright (C) 2019 Oliver Nightingale
- */
-
-/**
- * lunr.generateStopWordFilter builds a stopWordFilter function from the provided
- * list of stop words.
- *
- * The built in lunr.stopWordFilter is built using this generator and can be used
- * to generate custom stopWordFilters for applications or non English languages.
- *
- * @function
- * @param {Array} token The token to pass through the filter
- * @returns {lunr.PipelineFunction}
- * @see lunr.Pipeline
- * @see lunr.stopWordFilter
- */
-lunr.generateStopWordFilter = function (stopWords) {
-  var words = stopWords.reduce(function (memo, stopWord) {
-    memo[stopWord] = stopWord
-    return memo
-  }, {})
-
-  return function (token) {
-    if (token && words[token.toString()] !== token.toString()) return token
-  }
-}
-
-/**
- * lunr.stopWordFilter is an English language stop word list filter, any words
- * contained in the list will not be passed through the filter.
- *
- * This is intended to be used in the Pipeline. If the token does not pass the
- * filter then undefined will be returned.
- *
- * @function
- * @implements {lunr.PipelineFunction}
- * @params {lunr.Token} token - A token to check for being a stop word.
- * @returns {lunr.Token}
- * @see {@link lunr.Pipeline}
- */
-lunr.stopWordFilter = lunr.generateStopWordFilter([
-  'a',
-  'able',
-  'about',
-  'across',
-  'after',
-  'all',
-  'almost',
-  'also',
-  'am',
-  'among',
-  'an',
-  'and',
-  'any',
-  'are',
-  'as',
-  'at',
-  'be',
-  'because',
-  'been',
-  'but',
-  'by',
-  'can',
-  'cannot',
-  'could',
-  'dear',
-  'did',
-  'do',
-  'does',
-  'either',
-  'else',
-  'ever',
-  'every',
-  'for',
-  'from',
-  'get',
-  'got',
-  'had',
-  'has',
-  'have',
-  'he',
-  'her',
-  'hers',
-  'him',
-  'his',
-  'how',
-  'however',
-  'i',
-  'if',
-  'in',
-  'into',
-  'is',
-  'it',
-  'its',
-  'just',
-  'least',
-  'let',
-  'like',
-  'likely',
-  'may',
-  'me',
-  'might',
-  'most',
-  'must',
-  'my',
-  'neither',
-  'no',
-  'nor',
-  'not',
-  'of',
-  'off',
-  'often',
-  'on',
-  'only',
-  'or',
-  'other',
-  'our',
-  'own',
-  'rather',
-  'said',
-  'say',
-  'says',
-  'she',
-  'should',
-  'since',
-  'so',
-  'some',
-  'than',
-  'that',
-  'the',
-  'their',
-  'them',
-  'then',
-  'there',
-  'these',
-  'they',
-  'this',
-  'tis',
-  'to',
-  'too',
-  'twas',
-  'us',
-  'wants',
-  'was',
-  'we',
-  'were',
-  'what',
-  'when',
-  'where',
-  'which',
-  'while',
-  'who',
-  'whom',
-  'why',
-  'will',
-  'with',
-  'would',
-  'yet',
-  'you',
-  'your'
-])
-
-lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter')
-/*!
- * lunr.trimmer
- * Copyright (C) 2019 Oliver Nightingale
- */
-
-/**
- * lunr.trimmer is a pipeline function for trimming non word
- * characters from the beginning and end of tokens before they
- * enter the index.
- *
- * This implementation may not work correctly for non latin
- * characters and should either be removed or adapted for use
- * with languages with non-latin characters.
- *
- * @static
- * @implements {lunr.PipelineFunction}
- * @param {lunr.Token} token The token to pass through the filter
- * @returns {lunr.Token}
- * @see lunr.Pipeline
- */
-lunr.trimmer = function (token) {
-  return token.update(function (s) {
-    return s.replace(/^\W+/, '').replace(/\W+$/, '')
-  })
-}
-
-lunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer')
-/*!
- * lunr.TokenSet
- * Copyright (C) 2019 Oliver Nightingale
- */
-
-/**
- * A token set is used to store the unique list of all tokens
- * within an index. Token sets are also used to represent an
- * incoming query to the index, this query token set and index
- * token set are then intersected to find which tokens to look
- * up in the inverted index.
- *
- * A token set can hold multiple tokens, as in the case of the
- * index token set, or it can hold a single token as in the
- * case of a simple query token set.
- *
- * Additionally token sets are used to perform wildcard matching.
- * Leading, contained and trailing wildcards are supported, and
- * from this edit distance matching can also be provided.
- *
- * Token sets are implemented as a minimal finite state automata,
- * where both common prefixes and suffixes are shared between tokens.
- * This helps to reduce the space used for storing the token set.
- *
- * @constructor
- */
-lunr.TokenSet = function () {
-  this.final = false
-  this.edges = {}
-  this.id = lunr.TokenSet._nextId
-  lunr.TokenSet._nextId += 1
-}
-
-/**
- * Keeps track of the next, auto increment, identifier to assign
- * to a new tokenSet.
- *
- * TokenSets require a unique identifier to be correctly minimised.
- *
- * @private
- */
-lunr.TokenSet._nextId = 1
-
-/**
- * Creates a TokenSet instance from the given sorted array of words.
- *
- * @param {String[]} arr - A sorted array of strings to create the set from.
- * @returns {lunr.TokenSet}
- * @throws Will throw an error if the input array is not sorted.
- */
-lunr.TokenSet.fromArray = function (arr) {
-  var builder = new lunr.TokenSet.Builder
-
-  for (var i = 0, len = arr.length; i < len; i++) {
-    builder.insert(arr[i])
-  }
-
-  builder.finish()
-  return builder.root
-}
-
-/**
- * Creates a token set from a query clause.
- *
- * @private
- * @param {Object} clause - A single clause from lunr.Query.
- * @param {string} clause.term - The query clause term.
- * @param {number} [clause.editDistance] - The optional edit distance for the term.
- * @returns {lunr.TokenSet}
- */
-lunr.TokenSet.fromClause = function (clause) {
-  if ('editDistance' in clause) {
-    return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance)
-  } else {
-    return lunr.TokenSet.fromString(clause.term)
-  }
-}
-
-/**
- * Creates a token set representing a single string with a specified
- * edit distance.
- *
- * Insertions, deletions, substitutions and transpositions are each
- * treated as an edit distance of 1.
- *
- * Increasing the allowed edit distance will have a dramatic impact
- * on the performance of both creating and intersecting these TokenSets.
- * It is advised to keep the edit distance less than 3.
- *
- * @param {string} str - The string to create the token set from.
- * @param {number} editDistance - The allowed edit distance to match.
- * @returns {lunr.Vector}
- */
-lunr.TokenSet.fromFuzzyString = function (str, editDistance) {
-  var root = new lunr.TokenSet
-
-  var stack = [{
-    node: root,
-    editsRemaining: editDistance,
-    str: str
-  }]
-
-  while (stack.length) {
-    var frame = stack.pop()
-
-    // no edit
-    if (frame.str.length > 0) {
-      var char = frame.str.charAt(0),
-          noEditNode
-
-      if (char in frame.node.edges) {
-        noEditNode = frame.node.edges[char]
-      } else {
-        noEditNode = new lunr.TokenSet
-        frame.node.edges[char] = noEditNode
-      }
-
-      if (frame.str.length == 1) {
-        noEditNode.final = true
-      }
-
-      stack.push({
-        node: noEditNode,
-        editsRemaining: frame.editsRemaining,
-        str: frame.str.slice(1)
-      })
-    }
-
-    if (frame.editsRemaining == 0) {
-      continue
-    }
-
-    // insertion
-    if ("*" in frame.node.edges) {
-      var insertionNode = frame.node.edges["*"]
-    } else {
-      var insertionNode = new lunr.TokenSet
-      frame.node.edges["*"] = insertionNode
-    }
-
-    if (frame.str.length == 0) {
-      insertionNode.final = true
-    }
-
-    stack.push({
-      node: insertionNode,
-      editsRemaining: frame.editsRemaining - 1,
-      str: frame.str
-    })
-
-    // deletion
-    // can only do a deletion if we have enough edits remaining
-    // and if there are characters left to delete in the string
-    if (frame.str.length > 1) {
-      stack.push({
-        node: frame.node,
-        editsRemaining: frame.editsRemaining - 1,
-        str: frame.str.slice(1)
-      })
-    }
-
-    // deletion
-    // just removing the last character from the str
-    if (frame.str.length == 1) {
-      frame.node.final = true
-    }
-
-    // substitution
-    // can only do a substitution if we have enough edits remaining
-    // and if there are characters left to substitute
-    if (frame.str.length >= 1) {
-      if ("*" in frame.node.edges) {
-        var substitutionNode = frame.node.edges["*"]
-      } else {
-        var substitutionNode = new lunr.TokenSet
-        frame.node.edges["*"] = substitutionNode
-      }
-
-      if (frame.str.length == 1) {
-        substitutionNode.final = true
-      }
-
-      stack.push({
-        node: substitutionNode,
-        editsRemaining: frame.editsRemaining - 1,
-        str: frame.str.slice(1)
-      })
-    }
-
-    // transposition
-    // can only do a transposition if there are edits remaining
-    // and there are enough characters to transpose
-    if (frame.str.length > 1) {
-      var charA = frame.str.charAt(0),
-          charB = frame.str.charAt(1),
-          transposeNode
-
-      if (charB in frame.node.edges) {
-        transposeNode = frame.node.edges[charB]
-      } else {
-        transposeNode = new lunr.TokenSet
-        frame.node.edges[charB] = transposeNode
-      }
-
-      if (frame.str.length == 1) {
-        transposeNode.final = true
-      }
-
-      stack.push({
-        node: transposeNode,
-        editsRemaining: frame.editsRemaining - 1,
-        str: charA + frame.str.slice(2)
-      })
-    }
-  }
-
-  return root
-}
-
-/**
- * Creates a TokenSet from a string.
- *
- * The string may contain one or more wildcard characters (*)
- * that will allow wildcard matching when intersecting with
- * another TokenSet.
- *
- * @param {string} str - The string to create a TokenSet from.
- * @returns {lunr.TokenSet}
- */
-lunr.TokenSet.fromString = function (str) {
-  var node = new lunr.TokenSet,
-      root = node
-
-  /*
-   * Iterates through all characters within the passed string
-   * appending a node for each character.
-   *
-   * When a wildcard character is found then a self
-   * referencing edge is introduced to continually match
-   * any number of any characters.
-   */
-  for (var i = 0, len = str.length; i < len; i++) {
-    var char = str[i],
-        final = (i == len - 1)
-
-    if (char == "*") {
-      node.edges[char] = node
-      node.final = final
-
-    } else {
-      var next = new lunr.TokenSet
-      next.final = final
-
-      node.edges[char] = next
-      node = next
-    }
-  }
-
-  return root
-}
-
-/**
- * Converts this TokenSet into an array of strings
- * contained within the TokenSet.
- *
- * This is not intended to be used on a TokenSet that
- * contains wildcards, in these cases the results are
- * undefined and are likely to cause an infinite loop.
- *
- * @returns {string[]}
- */
-lunr.TokenSet.prototype.toArray = function () {
-  var words = []
-
-  var stack = [{
-    prefix: "",
-    node: this
-  }]
-
-  while (stack.length) {
-    var frame = stack.pop(),
-        edges = Object.keys(frame.node.edges),
-        len = edges.length
-
-    if (frame.node.final) {
-      /* In Safari, at this point the prefix is sometimes corrupted, see:
-       * https://github.com/olivernn/lunr.js/issues/279 Calling any
-       * String.prototype method forces Safari to "cast" this string to what
-       * it's supposed to be, fixing the bug. */
-      frame.prefix.charAt(0)
-      words.push(frame.prefix)
-    }
-
-    for (var i = 0; i < len; i++) {
-      var edge = edges[i]
-
-      stack.push({
-        prefix: frame.prefix.concat(edge),
-        node: frame.node.edges[edge]
-      })
-    }
-  }
-
-  return words
-}
-
-/**
- * Generates a string representation of a TokenSet.
- *
- * This is intended to allow TokenSets to be used as keys
- * in objects, largely to aid the construction and minimisation
- * of a TokenSet. As such it is not designed to be a human
- * friendly representation of the TokenSet.
- *
- * @returns {string}
- */
-lunr.TokenSet.prototype.toString = function () {
-  // NOTE: Using Object.keys here as this.edges is very likely
-  // to enter 'hash-mode' with many keys being added
-  //
-  // avoiding a for-in loop here as it leads to the function
-  // being de-optimised (at least in V8). From some simple
-  // benchmarks the performance is comparable, but allowing
-  // V8 to optimize may mean easy performance wins in the future.
-
-  if (this._str) {
-    return this._str
-  }
-
-  var str = this.final ? '1' : '0',
-      labels = Object.keys(this.edges).sort(),
-      len = labels.length
-
-  for (var i = 0; i < len; i++) {
-    var label = labels[i],
-        node = this.edges[label]
-
-    str = str + label + node.id
-  }
-
-  return str
-}
-
-/**
- * Returns a new TokenSet that is the intersection of
- * this TokenSet and the passed TokenSet.
- *
- * This intersection will take into account any wildcards
- * contained within the TokenSet.
- *
- * @param {lunr.TokenSet} b - An other TokenSet to intersect with.
- * @returns {lunr.TokenSet}
- */
-lunr.TokenSet.prototype.intersect = function (b) {
-  var output = new lunr.TokenSet,
-      frame = undefined
-
-  var stack = [{
-    qNode: b,
-    output: output,
-    node: this
-  }]
-
-  while (stack.length) {
-    frame = stack.pop()
-
-    // NOTE: As with the #toString method, we are using
-    // Object.keys and a for loop instead of a for-in loop
-    // as both of these objects enter 'hash' mode, causing
-    // the function to be de-optimised in V8
-    var qEdges = Object.keys(frame.qNode.edges),
-        qLen = qEdges.length,
-        nEdges = Object.keys(frame.node.edges),
-        nLen = nEdges.length
-
-    for (var q = 0; q < qLen; q++) {
-      var qEdge = qEdges[q]
-
-      for (var n = 0; n < nLen; n++) {
-        var nEdge = nEdges[n]
-
-        if (nEdge == qEdge || qEdge == '*') {
-          var node = frame.node.edges[nEdge],
-              qNode = frame.qNode.edges[qEdge],
-              final = node.final && qNode.final,
-              next = undefined
-
-          if (nEdge in frame.output.edges) {
-            // an edge already exists for this character
-            // no need to create a new node, just set the finality
-            // bit unless this node is already final
-            next = frame.output.edges[nEdge]
-            next.final = next.final || final
-
-          } else {
-            // no edge exists yet, must create one
-            // set the finality bit and insert it
-            // into the output
-            next = new lunr.TokenSet
-            next.final = final
-            frame.output.edges[nEdge] = next
-          }
-
-          stack.push({
-            qNode: qNode,
-            output: next,
-            node: node
-          })
-        }
-      }
-    }
-  }
-
-  return output
-}
-lunr.TokenSet.Builder = function () {
-  this.previousWord = ""
-  this.root = new lunr.TokenSet
-  this.uncheckedNodes = []
-  this.minimizedNodes = {}
-}
-
-lunr.TokenSet.Builder.prototype.insert = function (word) {
-  var node,
-      commonPrefix = 0
-
-  if (word < this.previousWord) {
-    throw new Error ("Out of order word insertion")
-  }
-
-  for (var i = 0; i < word.length && i < this.previousWord.length; i++) {
-    if (word[i] != this.previousWord[i]) break
-    commonPrefix++
-  }
-
-  this.minimize(commonPrefix)
-
-  if (this.uncheckedNodes.length == 0) {
-    node = this.root
-  } else {
-    node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child
-  }
-
-  for (var i = commonPrefix; i < word.length; i++) {
-    var nextNode = new lunr.TokenSet,
-        char = word[i]
-
-    node.edges[char] = nextNode
-
-    this.uncheckedNodes.push({
-      parent: node,
-      char: char,
-      child: nextNode
-    })
-
-    node = nextNode
-  }
-
-  node.final = true
-  this.previousWord = word
-}
-
-lunr.TokenSet.Builder.prototype.finish = function () {
-  this.minimize(0)
-}
-
-lunr.TokenSet.Builder.prototype.minimize = function (downTo) {
-  for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) {
-    var node = this.uncheckedNodes[i],
-        childKey = node.child.toString()
-
-    if (childKey in this.minimizedNodes) {
-      node.parent.edges[node.char] = this.minimizedNodes[childKey]
-    } else {
-      // Cache the key for this node since
-      // we know it can't change anymore
-      node.child._str = childKey
-
-      this.minimizedNodes[childKey] = node.child
-    }
-
-    this.uncheckedNodes.pop()
-  }
-}
-/*!
- * lunr.Index
- * Copyright (C) 2019 Oliver Nightingale
- */
-
-/**
- * An index contains the built index of all documents and provides a query interface
- * to the index.
- *
- * Usually instances of lunr.Index will not be created using this constructor, instead
- * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be
- * used to load previously built and serialized indexes.
- *
- * @constructor
- * @param {Object} attrs - The attributes of the built search index.
- * @param {Object} attrs.invertedIndex - An index of term/field to document reference.
- * @param {Object<string, lunr.Vector>} attrs.fieldVectors - Field vectors
- * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens.
- * @param {string[]} attrs.fields - The names of indexed document fields.
- * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms.
- */
-lunr.Index = function (attrs) {
-  this.invertedIndex = attrs.invertedIndex
-  this.fieldVectors = attrs.fieldVectors
-  this.tokenSet = attrs.tokenSet
-  this.fields = attrs.fields
-  this.pipeline = attrs.pipeline
-}
-
-/**
- * A result contains details of a document matching a search query.
- * @typedef {Object} lunr.Index~Result
- * @property {string} ref - The reference of the document this result represents.
- * @property {number} score - A number between 0 and 1 representing how similar this document is to the query.
- * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match.
- */
-
-/**
- * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple
- * query language which itself is parsed into an instance of lunr.Query.
- *
- * For programmatically building queries it is advised to directly use lunr.Query, the query language
- * is best used for human entered text rather than program generated text.
- *
- * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported
- * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello'
- * or 'world', though those that contain both will rank higher in the results.
- *
- * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can
- * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding
- * wildcards will increase the number of documents that will be found but can also have a negative
- * impact on query performance, especially with wildcards at the beginning of a term.
- *
- * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term
- * hello in the title field will match this query. Using a field not present in the index will lead
- * to an error being thrown.
- *
- * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term
- * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported
- * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2.
- * Avoid large values for edit distance to improve query performance.
- *
- * Each term also supports a presence modifier. By default a term's presence in document is optional, however
- * this can be changed to either required or prohibited. For a term's presence to be required in a document the
- * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and
- * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not
- * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'.
- *
- * To escape special characters the backslash character '\' can be used, this allows searches to include
- * characters that would normally be considered modifiers, e.g. `foo\~2` will search for a term "foo~2" instead
- * of attempting to apply a boost of 2 to the search term "foo".
- *
- * @typedef {string} lunr.Index~QueryString
- * @example <caption>Simple single term query</caption>
- * hello
- * @example <caption>Multiple term query</caption>
- * hello world
- * @example <caption>term scoped to a field</caption>
- * title:hello
- * @example <caption>term with a boost of 10</caption>
- * hello^10
- * @example <caption>term with an edit distance of 2</caption>
- * hello~2
- * @example <caption>terms with presence modifiers</caption>
- * -foo +bar baz
- */
-
-/**
- * Performs a search against the index using lunr query syntax.
- *
- * Results will be returned sorted by their score, the most relevant results
- * will be returned first.  For details on how the score is calculated, please see
- * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}.
- *
- * For more programmatic querying use lunr.Index#query.
- *
- * @param {lunr.Index~QueryString} queryString - A string containing a lunr query.
- * @throws {lunr.QueryParseError} If the passed query string cannot be parsed.
- * @returns {lunr.Index~Result[]}
- */
-lunr.Index.prototype.search = function (queryString) {
-  return this.query(function (query) {
-    var parser = new lunr.QueryParser(queryString, query)
-    parser.parse()
-  })
-}
-
-/**
- * A query builder callback provides a query object to be used to express
- * the query to perform on the index.
- *
- * @callback lunr.Index~queryBuilder
- * @param {lunr.Query} query - The query object to build up.
- * @this lunr.Query
- */
-
-/**
- * Performs a query against the index using the yielded lunr.Query object.
- *
- * If performing programmatic queries against the index, this method is preferred
- * over lunr.Index#search so as to avoid the additional query parsing overhead.
- *
- * A query object is yielded to the supplied function which should be used to
- * express the query to be run against the index.
- *
- * Note that although this function takes a callback parameter it is _not_ an
- * asynchronous operation, the callback is just yielded a query object to be
- * customized.
- *
- * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query.
- * @returns {lunr.Index~Result[]}
- */
-lunr.Index.prototype.query = function (fn) {
-  // for each query clause
-  // * process terms
-  // * expand terms from token set
-  // * find matching documents and metadata
-  // * get document vectors
-  // * score documents
-
-  var query = new lunr.Query(this.fields),
-      matchingFields = Object.create(null),
-      queryVectors = Object.create(null),
-      termFieldCache = Object.create(null),
-      requiredMatches = Object.create(null),
-      prohibitedMatches = Object.create(null)
-
-  /*
-   * To support field level boosts a query vector is created per
-   * field. An empty vector is eagerly created to support negated
-   * queries.
-   */
-  for (var i = 0; i < this.fields.length; i++) {
-    queryVectors[this.fields[i]] = new lunr.Vector
-  }
-
-  fn.call(query, query)
-
-  for (var i = 0; i < query.clauses.length; i++) {
-    /*
-     * Unless the pipeline has been disabled for this term, which is
-     * the case for terms with wildcards, we need to pass the clause
-     * term through the search pipeline. A pipeline returns an array
-     * of processed terms. Pipeline functions may expand the passed
-     * term, which means we may end up performing multiple index lookups
-     * for a single query term.
-     */
-    var clause = query.clauses[i],
-        terms = null,
-        clauseMatches = lunr.Set.complete
-
-    if (clause.usePipeline) {
-      terms = this.pipeline.runString(clause.term, {
-        fields: clause.fields
-      })
-    } else {
-      terms = [clause.term]
-    }
-
-    for (var m = 0; m < terms.length; m++) {
-      var term = terms[m]
-
-      /*
-       * Each term returned from the pipeline needs to use the same query
-       * clause object, e.g. the same boost and or edit distance. The
-       * simplest way to do this is to re-use the clause object but mutate
-       * its term property.
-       */
-      clause.term = term
-
-      /*
-       * From the term in the clause we create a token set which will then
-       * be used to intersect the indexes token set to get a list of terms
-       * to lookup in the inverted index
-       */
-      var termTokenSet = lunr.TokenSet.fromClause(clause),
-          expandedTerms = this.tokenSet.intersect(termTokenSet).toArray()
-
-      /*
-       * If a term marked as required does not exist in the tokenSet it is
-       * impossible for the search to return any matches. We set all the field
-       * scoped required matches set to empty and stop examining any further
-       * clauses.
-       */
-      if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) {
-        for (var k = 0; k < clause.fields.length; k++) {
-          var field = clause.fields[k]
-          requiredMatches[field] = lunr.Set.empty
-        }
-
-        break
-      }
-
-      for (var j = 0; j < expandedTerms.length; j++) {
-        /*
-         * For each term get the posting and termIndex, this is required for
-         * building the query vector.
-         */
-        var expandedTerm = expandedTerms[j],
-            posting = this.invertedIndex[expandedTerm],
-            termIndex = posting._index
-
-        for (var k = 0; k < clause.fields.length; k++) {
-          /*
-           * For each field that this query term is scoped by (by default
-           * all fields are in scope) we need to get all the document refs
-           * that have this term in that field.
-           *
-           * The posting is the entry in the invertedIndex for the matching
-           * term from above.
-           */
-          var field = clause.fields[k],
-              fieldPosting = posting[field],
-              matchingDocumentRefs = Object.keys(fieldPosting),
-              termField = expandedTerm + "/" + field,
-              matchingDocumentsSet = new lunr.Set(matchingDocumentRefs)
-
-          /*
-           * if the presence of this term is required ensure that the matching
-           * documents are added to the set of required matches for this clause.
-           *
-           */
-          if (clause.presence == lunr.Query.presence.REQUIRED) {
-            clauseMatches = clauseMatches.union(matchingDocumentsSet)
-
-            if (requiredMatches[field] === undefined) {
-              requiredMatches[field] = lunr.Set.complete
-            }
-          }
-
-          /*
-           * if the presence of this term is prohibited ensure that the matching
-           * documents are added to the set of prohibited matches for this field,
-           * creating that set if it does not yet exist.
-           */
-          if (clause.presence == lunr.Query.presence.PROHIBITED) {
-            if (prohibitedMatches[field] === undefined) {
-              prohibitedMatches[field] = lunr.Set.empty
-            }
-
-            prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet)
-
-            /*
-             * Prohibited matches should not be part of the query vector used for
-             * similarity scoring and no metadata should be extracted so we continue
-             * to the next field
-             */
-            continue
-          }
-
-          /*
-           * The query field vector is populated using the termIndex found for
-           * the term and a unit value with the appropriate boost applied.
-           * Using upsert because there could already be an entry in the vector
-           * for the term we are working with. In that case we just add the scores
-           * together.
-           */
-          queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b })
-
-          /**
-           * If we've already seen this term, field combo then we've already collected
-           * the matching documents and metadata, no need to go through all that again
-           */
-          if (termFieldCache[termField]) {
-            continue
-          }
-
-          for (var l = 0; l < matchingDocumentRefs.length; l++) {
-            /*
-             * All metadata for this term/field/document triple
-             * are then extracted and collected into an instance
-             * of lunr.MatchData ready to be returned in the query
-             * results
-             */
-            var matchingDocumentRef = matchingDocumentRefs[l],
-                matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field),
-                metadata = fieldPosting[matchingDocumentRef],
-                fieldMatch
-
-            if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) {
-              matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata)
-            } else {
-              fieldMatch.add(expandedTerm, field, metadata)
-            }
-
-          }
-
-          termFieldCache[termField] = true
-        }
-      }
-    }
-
-    /**
-     * If the presence was required we need to update the requiredMatches field sets.
-     * We do this after all fields for the term have collected their matches because
-     * the clause terms presence is required in _any_ of the fields not _all_ of the
-     * fields.
-     */
-    if (clause.presence === lunr.Query.presence.REQUIRED) {
-      for (var k = 0; k < clause.fields.length; k++) {
-        var field = clause.fields[k]
-        requiredMatches[field] = requiredMatches[field].intersect(clauseMatches)
-      }
-    }
-  }
-
-  /**
-   * Need to combine the field scoped required and prohibited
-   * matching documents into a global set of required and prohibited
-   * matches
-   */
-  var allRequiredMatches = lunr.Set.complete,
-      allProhibitedMatches = lunr.Set.empty
-
-  for (var i = 0; i < this.fields.length; i++) {
-    var field = this.fields[i]
-
-    if (requiredMatches[field]) {
-      allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field])
-    }
-
-    if (prohibitedMatches[field]) {
-      allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field])
-    }
-  }
-
-  var matchingFieldRefs = Object.keys(matchingFields),
-      results = [],
-      matches = Object.create(null)
-
-  /*
-   * If the query is negated (contains only prohibited terms)
-   * we need to get _all_ fieldRefs currently existing in the
-   * index. This is only done when we know that the query is
-   * entirely prohibited terms to avoid any cost of getting all
-   * fieldRefs unnecessarily.
-   *
-   * Additionally, blank MatchData must be created to correctly
-   * populate the results.
-   */
-  if (query.isNegated()) {
-    matchingFieldRefs = Object.keys(this.fieldVectors)
-
-    for (var i = 0; i < matchingFieldRefs.length; i++) {
-      var matchingFieldRef = matchingFieldRefs[i]
-      var fieldRef = lunr.FieldRef.fromString(matchingFieldRef)
-      matchingFields[matchingFieldRef] = new lunr.MatchData
-    }
-  }
-
-  for (var i = 0; i < matchingFieldRefs.length; i++) {
-    /*
-     * Currently we have document fields that match the query, but we
-     * need to return documents. The matchData and scores are combined
-     * from multiple fields belonging to the same document.
-     *
-     * Scores are calculated by field, using the query vectors created
-     * above, and combined into a final document score using addition.
-     */
-    var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]),
-        docRef = fieldRef.docRef
-
-    if (!allRequiredMatches.contains(docRef)) {
-      continue
-    }
-
-    if (allProhibitedMatches.contains(docRef)) {
-      continue
-    }
-
-    var fieldVector = this.fieldVectors[fieldRef],
-        score = queryVectors[fieldRef.fieldName].similarity(fieldVector),
-        docMatch
-
-    if ((docMatch = matches[docRef]) !== undefined) {
-      docMatch.score += score
-      docMatch.matchData.combine(matchingFields[fieldRef])
-    } else {
-      var match = {
-        ref: docRef,
-        score: score,
-        matchData: matchingFields[fieldRef]
-      }
-      matches[docRef] = match
-      results.push(match)
-    }
-  }
-
-  /*
-   * Sort the results objects by score, highest first.
-   */
-  return results.sort(function (a, b) {
-    return b.score - a.score
-  })
-}
-
-/**
- * Prepares the index for JSON serialization.
- *
- * The schema for this JSON blob will be described in a
- * separate JSON schema file.
- *
- * @returns {Object}
- */
-lunr.Index.prototype.toJSON = function () {
-  var invertedIndex = Object.keys(this.invertedIndex)
-    .sort()
-    .map(function (term) {
-      return [term, this.invertedIndex[term]]
-    }, this)
-
-  var fieldVectors = Object.keys(this.fieldVectors)
-    .map(function (ref) {
-      return [ref, this.fieldVectors[ref].toJSON()]
-    }, this)
-
-  return {
-    version: lunr.version,
-    fields: this.fields,
-    fieldVectors: fieldVectors,
-    invertedIndex: invertedIndex,
-    pipeline: this.pipeline.toJSON()
-  }
-}
-
-/**
- * Loads a previously serialized lunr.Index
- *
- * @param {Object} serializedIndex - A previously serialized lunr.Index
- * @returns {lunr.Index}
- */
-lunr.Index.load = function (serializedIndex) {
-  var attrs = {},
-      fieldVectors = {},
-      serializedVectors = serializedIndex.fieldVectors,
-      invertedIndex = Object.create(null),
-      serializedInvertedIndex = serializedIndex.invertedIndex,
-      tokenSetBuilder = new lunr.TokenSet.Builder,
-      pipeline = lunr.Pipeline.load(serializedIndex.pipeline)
-
-  if (serializedIndex.version != lunr.version) {
-    lunr.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + lunr.version + "' does not match serialized index '" + serializedIndex.version + "'")
-  }
-
-  for (var i = 0; i < serializedVectors.length; i++) {
-    var tuple = serializedVectors[i],
-        ref = tuple[0],
-        elements = tuple[1]
-
-    fieldVectors[ref] = new lunr.Vector(elements)
-  }
-
-  for (var i = 0; i < serializedInvertedIndex.length; i++) {
-    var tuple = serializedInvertedIndex[i],
-        term = tuple[0],
-        posting = tuple[1]
-
-    tokenSetBuilder.insert(term)
-    invertedIndex[term] = posting
-  }
-
-  tokenSetBuilder.finish()
-
-  attrs.fields = serializedIndex.fields
-
-  attrs.fieldVectors = fieldVectors
-  attrs.invertedIndex = invertedIndex
-  attrs.tokenSet = tokenSetBuilder.root
-  attrs.pipeline = pipeline
-
-  return new lunr.Index(attrs)
-}
-/*!
- * lunr.Builder
- * Copyright (C) 2019 Oliver Nightingale
- */
-
-/**
- * lunr.Builder performs indexing on a set of documents and
- * returns instances of lunr.Index ready for querying.
- *
- * All configuration of the index is done via the builder, the
- * fields to index, the document reference, the text processing
- * pipeline and document scoring parameters are all set on the
- * builder before indexing.
- *
- * @constructor
- * @property {string} _ref - Internal reference to the document reference field.
- * @property {string[]} _fields - Internal reference to the document fields to index.
- * @property {object} invertedIndex - The inverted index maps terms to document fields.
- * @property {object} documentTermFrequencies - Keeps track of document term frequencies.
- * @property {object} documentLengths - Keeps track of the length of documents added to the index.
- * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing.
- * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing.
- * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index.
- * @property {number} documentCount - Keeps track of the total number of documents indexed.
- * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75.
- * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2.
- * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space.
- * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index.
- */
-lunr.Builder = function () {
-  this._ref = "id"
-  this._fields = Object.create(null)
-  this._documents = Object.create(null)
-  this.invertedIndex = Object.create(null)
-  this.fieldTermFrequencies = {}
-  this.fieldLengths = {}
-  this.tokenizer = lunr.tokenizer
-  this.pipeline = new lunr.Pipeline
-  this.searchPipeline = new lunr.Pipeline
-  this.documentCount = 0
-  this._b = 0.75
-  this._k1 = 1.2
-  this.termIndex = 0
-  this.metadataWhitelist = []
-}
-
-/**
- * Sets the document field used as the document reference. Every document must have this field.
- * The type of this field in the document should be a string, if it is not a string it will be
- * coerced into a string by calling toString.
- *
- * The default ref is 'id'.
- *
- * The ref should _not_ be changed during indexing, it should be set before any documents are
- * added to the index. Changing it during indexing can lead to inconsistent results.
- *
- * @param {string} ref - The name of the reference field in the document.
- */
-lunr.Builder.prototype.ref = function (ref) {
-  this._ref = ref
-}
-
-/**
- * A function that is used to extract a field from a document.
- *
- * Lunr expects a field to be at the top level of a document, if however the field
- * is deeply nested within a document an extractor function can be used to extract
- * the right field for indexing.
- *
- * @callback fieldExtractor
- * @param {object} doc - The document being added to the index.
- * @returns {?(string|object|object[])} obj - The object that will be indexed for this field.
- * @example <caption>Extracting a nested field</caption>
- * function (doc) { return doc.nested.field }
- */
-
-/**
- * Adds a field to the list of document fields that will be indexed. Every document being
- * indexed should have this field. Null values for this field in indexed documents will
- * not cause errors but will limit the chance of that document being retrieved by searches.
- *
- * All fields should be added before adding documents to the index. Adding fields after
- * a document has been indexed will have no effect on already indexed documents.
- *
- * Fields can be boosted at build time. This allows terms within that field to have more
- * importance when ranking search results. Use a field boost to specify that matches within
- * one field are more important than other fields.
- *
- * @param {string} fieldName - The name of a field to index in all documents.
- * @param {object} attributes - Optional attributes associated with this field.
- * @param {number} [attributes.boost=1] - Boost applied to all terms within this field.
- * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document.
- * @throws {RangeError} fieldName cannot contain unsupported characters '/'
- */
-lunr.Builder.prototype.field = function (fieldName, attributes) {
-  if (/\//.test(fieldName)) {
-    throw new RangeError ("Field '" + fieldName + "' contains illegal character '/'")
-  }
-
-  this._fields[fieldName] = attributes || {}
-}
-
-/**
- * A parameter to tune the amount of field length normalisation that is applied when
- * calculating relevance scores. A value of 0 will completely disable any normalisation
- * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b
- * will be clamped to the range 0 - 1.
- *
- * @param {number} number - The value to set for this tuning parameter.
- */
-lunr.Builder.prototype.b = function (number) {
-  if (number < 0) {
-    this._b = 0
-  } else if (number > 1) {
-    this._b = 1
-  } else {
-    this._b = number
-  }
-}
-
-/**
- * A parameter that controls the speed at which a rise in term frequency results in term
- * frequency saturation. The default value is 1.2. Setting this to a higher value will give
- * slower saturation levels, a lower value will result in quicker saturation.
- *
- * @param {number} number - The value to set for this tuning parameter.
- */
-lunr.Builder.prototype.k1 = function (number) {
-  this._k1 = number
-}
-
-/**
- * Adds a document to the index.
- *
- * Before adding fields to the index the index should have been fully setup, with the document
- * ref and all fields to index already having been specified.
- *
- * The document must have a field name as specified by the ref (by default this is 'id') and
- * it should have all fields defined for indexing, though null or undefined values will not
- * cause errors.
- *
- * Entire documents can be boosted at build time. Applying a boost to a document indicates that
- * this document should rank higher in search results than other documents.
- *
- * @param {object} doc - The document to add to the index.
- * @param {object} attributes - Optional attributes associated with this document.
- * @param {number} [attributes.boost=1] - Boost applied to all terms within this document.
- */
-lunr.Builder.prototype.add = function (doc, attributes) {
-  var docRef = doc[this._ref],
-      fields = Object.keys(this._fields)
-
-  this._documents[docRef] = attributes || {}
-  this.documentCount += 1
-
-  for (var i = 0; i < fields.length; i++) {
-    var fieldName = fields[i],
-        extractor = this._fields[fieldName].extractor,
-        field = extractor ? extractor(doc) : doc[fieldName],
-        tokens = this.tokenizer(field, {
-          fields: [fieldName]
-        }),
-        terms = this.pipeline.run(tokens),
-        fieldRef = new lunr.FieldRef (docRef, fieldName),
-        fieldTerms = Object.create(null)
-
-    this.fieldTermFrequencies[fieldRef] = fieldTerms
-    this.fieldLengths[fieldRef] = 0
-
-    // store the length of this field for this document
-    this.fieldLengths[fieldRef] += terms.length
-
-    // calculate term frequencies for this field
-    for (var j = 0; j < terms.length; j++) {
-      var term = terms[j]
-
-      if (fieldTerms[term] == undefined) {
-        fieldTerms[term] = 0
-      }
-
-      fieldTerms[term] += 1
-
-      // add to inverted index
-      // create an initial posting if one doesn't exist
-      if (this.invertedIndex[term] == undefined) {
-        var posting = Object.create(null)
-        posting["_index"] = this.termIndex
-        this.termIndex += 1
-
-        for (var k = 0; k < fields.length; k++) {
-          posting[fields[k]] = Object.create(null)
-        }
-
-        this.invertedIndex[term] = posting
-      }
-
-      // add an entry for this term/fieldName/docRef to the invertedIndex
-      if (this.invertedIndex[term][fieldName][docRef] == undefined) {
-        this.invertedIndex[term][fieldName][docRef] = Object.create(null)
-      }
-
-      // store all whitelisted metadata about this token in the
-      // inverted index
-      for (var l = 0; l < this.metadataWhitelist.length; l++) {
-        var metadataKey = this.metadataWhitelist[l],
-            metadata = term.metadata[metadataKey]
-
-        if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) {
-          this.invertedIndex[term][fieldName][docRef][metadataKey] = []
-        }
-
-        this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata)
-      }
-    }
-
-  }
-}
-
-/**
- * Calculates the average document length for this index
- *
- * @private
- */
-lunr.Builder.prototype.calculateAverageFieldLengths = function () {
-
-  var fieldRefs = Object.keys(this.fieldLengths),
-      numberOfFields = fieldRefs.length,
-      accumulator = {},
-      documentsWithField = {}
-
-  for (var i = 0; i < numberOfFields; i++) {
-    var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),
-        field = fieldRef.fieldName
-
-    documentsWithField[field] || (documentsWithField[field] = 0)
-    documentsWithField[field] += 1
-
-    accumulator[field] || (accumulator[field] = 0)
-    accumulator[field] += this.fieldLengths[fieldRef]
-  }
-
-  var fields = Object.keys(this._fields)
-
-  for (var i = 0; i < fields.length; i++) {
-    var fieldName = fields[i]
-    accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName]
-  }
-
-  this.averageFieldLength = accumulator
-}
-
-/**
- * Builds a vector space model of every document using lunr.Vector
- *
- * @private
- */
-lunr.Builder.prototype.createFieldVectors = function () {
-  var fieldVectors = {},
-      fieldRefs = Object.keys(this.fieldTermFrequencies),
-      fieldRefsLength = fieldRefs.length,
-      termIdfCache = Object.create(null)
-
-  for (var i = 0; i < fieldRefsLength; i++) {
-    var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),
-        fieldName = fieldRef.fieldName,
-        fieldLength = this.fieldLengths[fieldRef],
-        fieldVector = new lunr.Vector,
-        termFrequencies = this.fieldTermFrequencies[fieldRef],
-        terms = Object.keys(termFrequencies),
-        termsLength = terms.length
-
-
-    var fieldBoost = this._fields[fieldName].boost || 1,
-        docBoost = this._documents[fieldRef.docRef].boost || 1
-
-    for (var j = 0; j < termsLength; j++) {
-      var term = terms[j],
-          tf = termFrequencies[term],
-          termIndex = this.invertedIndex[term]._index,
-          idf, score, scoreWithPrecision
-
-      if (termIdfCache[term] === undefined) {
-        idf = lunr.idf(this.invertedIndex[term], this.documentCount)
-        termIdfCache[term] = idf
-      } else {
-        idf = termIdfCache[term]
-      }
-
-      score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf)
-      score *= fieldBoost
-      score *= docBoost
-      scoreWithPrecision = Math.round(score * 1000) / 1000
-      // Converts 1.23456789 to 1.234.
-      // Reducing the precision so that the vectors take up less
-      // space when serialised. Doing it now so that they behave
-      // the same before and after serialisation. Also, this is
-      // the fastest approach to reducing a number's precision in
-      // JavaScript.
-
-      fieldVector.insert(termIndex, scoreWithPrecision)
-    }
-
-    fieldVectors[fieldRef] = fieldVector
-  }
-
-  this.fieldVectors = fieldVectors
-}
-
-/**
- * Creates a token set of all tokens in the index using lunr.TokenSet
- *
- * @private
- */
-lunr.Builder.prototype.createTokenSet = function () {
-  this.tokenSet = lunr.TokenSet.fromArray(
-    Object.keys(this.invertedIndex).sort()
-  )
-}
-
-/**
- * Builds the index, creating an instance of lunr.Index.
- *
- * This completes the indexing process and should only be called
- * once all documents have been added to the index.
- *
- * @returns {lunr.Index}
- */
-lunr.Builder.prototype.build = function () {
-  this.calculateAverageFieldLengths()
-  this.createFieldVectors()
-  this.createTokenSet()
-
-  return new lunr.Index({
-    invertedIndex: this.invertedIndex,
-    fieldVectors: this.fieldVectors,
-    tokenSet: this.tokenSet,
-    fields: Object.keys(this._fields),
-    pipeline: this.searchPipeline
-  })
-}
-
-/**
- * Applies a plugin to the index builder.
- *
- * A plugin is a function that is called with the index builder as its context.
- * Plugins can be used to customise or extend the behaviour of the index
- * in some way. A plugin is just a function, that encapsulated the custom
- * behaviour that should be applied when building the index.
- *
- * The plugin function will be called with the index builder as its argument, additional
- * arguments can also be passed when calling use. The function will be called
- * with the index builder as its context.
- *
- * @param {Function} plugin The plugin to apply.
- */
-lunr.Builder.prototype.use = function (fn) {
-  var args = Array.prototype.slice.call(arguments, 1)
-  args.unshift(this)
-  fn.apply(this, args)
-}
-/**
- * Contains and collects metadata about a matching document.
- * A single instance of lunr.MatchData is returned as part of every
- * lunr.Index~Result.
- *
- * @constructor
- * @param {string} term - The term this match data is associated with
- * @param {string} field - The field in which the term was found
- * @param {object} metadata - The metadata recorded about this term in this field
- * @property {object} metadata - A cloned collection of metadata associated with this document.
- * @see {@link lunr.Index~Result}
- */
-lunr.MatchData = function (term, field, metadata) {
-  var clonedMetadata = Object.create(null),
-      metadataKeys = Object.keys(metadata || {})
-
-  // Cloning the metadata to prevent the original
-  // being mutated during match data combination.
-  // Metadata is kept in an array within the inverted
-  // index so cloning the data can be done with
-  // Array#slice
-  for (var i = 0; i < metadataKeys.length; i++) {
-    var key = metadataKeys[i]
-    clonedMetadata[key] = metadata[key].slice()
-  }
-
-  this.metadata = Object.create(null)
-
-  if (term !== undefined) {
-    this.metadata[term] = Object.create(null)
-    this.metadata[term][field] = clonedMetadata
-  }
-}
-
-/**
- * An instance of lunr.MatchData will be created for every term that matches a
- * document. However only one instance is required in a lunr.Index~Result. This
- * method combines metadata from another instance of lunr.MatchData with this
- * objects metadata.
- *
- * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one.
- * @see {@link lunr.Index~Result}
- */
-lunr.MatchData.prototype.combine = function (otherMatchData) {
-  var terms = Object.keys(otherMatchData.metadata)
-
-  for (var i = 0; i < terms.length; i++) {
-    var term = terms[i],
-        fields = Object.keys(otherMatchData.metadata[term])
-
-    if (this.metadata[term] == undefined) {
-      this.metadata[term] = Object.create(null)
-    }
-
-    for (var j = 0; j < fields.length; j++) {
-      var field = fields[j],
-          keys = Object.keys(otherMatchData.metadata[term][field])
-
-      if (this.metadata[term][field] == undefined) {
-        this.metadata[term][field] = Object.create(null)
-      }
-
-      for (var k = 0; k < keys.length; k++) {
-        var key = keys[k]
-
-        if (this.metadata[term][field][key] == undefined) {
-          this.metadata[term][field][key] = otherMatchData.metadata[term][field][key]
-        } else {
-          this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key])
-        }
-
-      }
-    }
-  }
-}
-
-/**
- * Add metadata for a term/field pair to this instance of match data.
- *
- * @param {string} term - The term this match data is associated with
- * @param {string} field - The field in which the term was found
- * @param {object} metadata - The metadata recorded about this term in this field
- */
-lunr.MatchData.prototype.add = function (term, field, metadata) {
-  if (!(term in this.metadata)) {
-    this.metadata[term] = Object.create(null)
-    this.metadata[term][field] = metadata
-    return
-  }
-
-  if (!(field in this.metadata[term])) {
-    this.metadata[term][field] = metadata
-    return
-  }
-
-  var metadataKeys = Object.keys(metadata)
-
-  for (var i = 0; i < metadataKeys.length; i++) {
-    var key = metadataKeys[i]
-
-    if (key in this.metadata[term][field]) {
-      this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key])
-    } else {
-      this.metadata[term][field][key] = metadata[key]
-    }
-  }
-}
-/**
- * A lunr.Query provides a programmatic way of defining queries to be performed
- * against a {@link lunr.Index}.
- *
- * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method
- * so the query object is pre-initialized with the right index fields.
- *
- * @constructor
- * @property {lunr.Query~Clause[]} clauses - An array of query clauses.
- * @property {string[]} allFields - An array of all available fields in a lunr.Index.
- */
-lunr.Query = function (allFields) {
-  this.clauses = []
-  this.allFields = allFields
-}
-
-/**
- * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause.
- *
- * This allows wildcards to be added to the beginning and end of a term without having to manually do any string
- * concatenation.
- *
- * The wildcard constants can be bitwise combined to select both leading and trailing wildcards.
- *
- * @constant
- * @default
- * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour
- * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists
- * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists
- * @see lunr.Query~Clause
- * @see lunr.Query#clause
- * @see lunr.Query#term
- * @example <caption>query term with trailing wildcard</caption>
- * query.term('foo', { wildcard: lunr.Query.wildcard.TRAILING })
- * @example <caption>query term with leading and trailing wildcard</caption>
- * query.term('foo', {
- *   wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING
- * })
- */
-
-lunr.Query.wildcard = new String ("*")
-lunr.Query.wildcard.NONE = 0
-lunr.Query.wildcard.LEADING = 1
-lunr.Query.wildcard.TRAILING = 2
-
-/**
- * Constants for indicating what kind of presence a term must have in matching documents.
- *
- * @constant
- * @enum {number}
- * @see lunr.Query~Clause
- * @see lunr.Query#clause
- * @see lunr.Query#term
- * @example <caption>query term with required presence</caption>
- * query.term('foo', { presence: lunr.Query.presence.REQUIRED })
- */
-lunr.Query.presence = {
-  /**
-   * Term's presence in a document is optional, this is the default value.
-   */
-  OPTIONAL: 1,
-
-  /**
-   * Term's presence in a document is required, documents that do not contain
-   * this term will not be returned.
-   */
-  REQUIRED: 2,
-
-  /**
-   * Term's presence in a document is prohibited, documents that do contain
-   * this term will not be returned.
-   */
-  PROHIBITED: 3
-}
-
-/**
- * A single clause in a {@link lunr.Query} contains a term and details on how to
- * match that term against a {@link lunr.Index}.
- *
- * @typedef {Object} lunr.Query~Clause
- * @property {string[]} fields - The fields in an index this clause should be matched against.
- * @property {number} [boost=1] - Any boost that should be applied when matching this clause.
- * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be.
- * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline.
- * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended.
- * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents.
- */
-
-/**
- * Adds a {@link lunr.Query~Clause} to this query.
- *
- * Unless the clause contains the fields to be matched all fields will be matched. In addition
- * a default boost of 1 is applied to the clause.
- *
- * @param {lunr.Query~Clause} clause - The clause to add to this query.
- * @see lunr.Query~Clause
- * @returns {lunr.Query}
- */
-lunr.Query.prototype.clause = function (clause) {
-  if (!('fields' in clause)) {
-    clause.fields = this.allFields
-  }
-
-  if (!('boost' in clause)) {
-    clause.boost = 1
-  }
-
-  if (!('usePipeline' in clause)) {
-    clause.usePipeline = true
-  }
-
-  if (!('wildcard' in clause)) {
-    clause.wildcard = lunr.Query.wildcard.NONE
-  }
-
-  if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) {
-    clause.term = "*" + clause.term
-  }
-
-  if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) {
-    clause.term = "" + clause.term + "*"
-  }
-
-  if (!('presence' in clause)) {
-    clause.presence = lunr.Query.presence.OPTIONAL
-  }
-
-  this.clauses.push(clause)
-
-  return this
-}
-
-/**
- * A negated query is one in which every clause has a presence of
- * prohibited. These queries require some special processing to return
- * the expected results.
- *
- * @returns boolean
- */
-lunr.Query.prototype.isNegated = function () {
-  for (var i = 0; i < this.clauses.length; i++) {
-    if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) {
-      return false
-    }
-  }
-
-  return true
-}
-
-/**
- * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause}
- * to the list of clauses that make up this query.
- *
- * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion
- * to a token or token-like string should be done before calling this method.
- *
- * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an
- * array, each term in the array will share the same options.
- *
- * @param {object|object[]} term - The term(s) to add to the query.
- * @param {object} [options] - Any additional properties to add to the query clause.
- * @returns {lunr.Query}
- * @see lunr.Query#clause
- * @see lunr.Query~Clause
- * @example <caption>adding a single term to a query</caption>
- * query.term("foo")
- * @example <caption>adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard</caption>
- * query.term("foo", {
- *   fields: ["title"],
- *   boost: 10,
- *   wildcard: lunr.Query.wildcard.TRAILING
- * })
- * @example <caption>using lunr.tokenizer to convert a string to tokens before using them as terms</caption>
- * query.term(lunr.tokenizer("foo bar"))
- */
-lunr.Query.prototype.term = function (term, options) {
-  if (Array.isArray(term)) {
-    term.forEach(function (t) { this.term(t, lunr.utils.clone(options)) }, this)
-    return this
-  }
-
-  var clause = options || {}
-  clause.term = term.toString()
-
-  this.clause(clause)
-
-  return this
-}
-lunr.QueryParseError = function (message, start, end) {
-  this.name = "QueryParseError"
-  this.message = message
-  this.start = start
-  this.end = end
-}
-
-lunr.QueryParseError.prototype = new Error
-lunr.QueryLexer = function (str) {
-  this.lexemes = []
-  this.str = str
-  this.length = str.length
-  this.pos = 0
-  this.start = 0
-  this.escapeCharPositions = []
-}
-
-lunr.QueryLexer.prototype.run = function () {
-  var state = lunr.QueryLexer.lexText
-
-  while (state) {
-    state = state(this)
-  }
-}
-
-lunr.QueryLexer.prototype.sliceString = function () {
-  var subSlices = [],
-      sliceStart = this.start,
-      sliceEnd = this.pos
-
-  for (var i = 0; i < this.escapeCharPositions.length; i++) {
-    sliceEnd = this.escapeCharPositions[i]
-    subSlices.push(this.str.slice(sliceStart, sliceEnd))
-    sliceStart = sliceEnd + 1
-  }
-
-  subSlices.push(this.str.slice(sliceStart, this.pos))
-  this.escapeCharPositions.length = 0
-
-  return subSlices.join('')
-}
-
-lunr.QueryLexer.prototype.emit = function (type) {
-  this.lexemes.push({
-    type: type,
-    str: this.sliceString(),
-    start: this.start,
-    end: this.pos
-  })
-
-  this.start = this.pos
-}
-
-lunr.QueryLexer.prototype.escapeCharacter = function () {
-  this.escapeCharPositions.push(this.pos - 1)
-  this.pos += 1
-}
-
-lunr.QueryLexer.prototype.next = function () {
-  if (this.pos >= this.length) {
-    return lunr.QueryLexer.EOS
-  }
-
-  var char = this.str.charAt(this.pos)
-  this.pos += 1
-  return char
-}
-
-lunr.QueryLexer.prototype.width = function () {
-  return this.pos - this.start
-}
-
-lunr.QueryLexer.prototype.ignore = function () {
-  if (this.start == this.pos) {
-    this.pos += 1
-  }
-
-  this.start = this.pos
-}
-
-lunr.QueryLexer.prototype.backup = function () {
-  this.pos -= 1
-}
-
-lunr.QueryLexer.prototype.acceptDigitRun = function () {
-  var char, charCode
-
-  do {
-    char = this.next()
-    charCode = char.charCodeAt(0)
-  } while (charCode > 47 && charCode < 58)
-
-  if (char != lunr.QueryLexer.EOS) {
-    this.backup()
-  }
-}
-
-lunr.QueryLexer.prototype.more = function () {
-  return this.pos < this.length
-}
-
-lunr.QueryLexer.EOS = 'EOS'
-lunr.QueryLexer.FIELD = 'FIELD'
-lunr.QueryLexer.TERM = 'TERM'
-lunr.QueryLexer.EDIT_DISTANCE = 'EDIT_DISTANCE'
-lunr.QueryLexer.BOOST = 'BOOST'
-lunr.QueryLexer.PRESENCE = 'PRESENCE'
-
-lunr.QueryLexer.lexField = function (lexer) {
-  lexer.backup()
-  lexer.emit(lunr.QueryLexer.FIELD)
-  lexer.ignore()
-  return lunr.QueryLexer.lexText
-}
-
-lunr.QueryLexer.lexTerm = function (lexer) {
-  if (lexer.width() > 1) {
-    lexer.backup()
-    lexer.emit(lunr.QueryLexer.TERM)
-  }
-
-  lexer.ignore()
-
-  if (lexer.more()) {
-    return lunr.QueryLexer.lexText
-  }
-}
-
-lunr.QueryLexer.lexEditDistance = function (lexer) {
-  lexer.ignore()
-  lexer.acceptDigitRun()
-  lexer.emit(lunr.QueryLexer.EDIT_DISTANCE)
-  return lunr.QueryLexer.lexText
-}
-
-lunr.QueryLexer.lexBoost = function (lexer) {
-  lexer.ignore()
-  lexer.acceptDigitRun()
-  lexer.emit(lunr.QueryLexer.BOOST)
-  return lunr.QueryLexer.lexText
-}
-
-lunr.QueryLexer.lexEOS = function (lexer) {
-  if (lexer.width() > 0) {
-    lexer.emit(lunr.QueryLexer.TERM)
-  }
-}
-
-// This matches the separator used when tokenising fields
-// within a document. These should match otherwise it is
-// not possible to search for some tokens within a document.
-//
-// It is possible for the user to change the separator on the
-// tokenizer so it _might_ clash with any other of the special
-// characters already used within the search string, e.g. :.
-//
-// This means that it is possible to change the separator in
-// such a way that makes some words unsearchable using a search
-// string.
-lunr.QueryLexer.termSeparator = lunr.tokenizer.separator
-
-lunr.QueryLexer.lexText = function (lexer) {
-  while (true) {
-    var char = lexer.next()
-
-    if (char == lunr.QueryLexer.EOS) {
-      return lunr.QueryLexer.lexEOS
-    }
-
-    // Escape character is '\'
-    if (char.charCodeAt(0) == 92) {
-      lexer.escapeCharacter()
-      continue
-    }
-
-    if (char == ":") {
-      return lunr.QueryLexer.lexField
-    }
-
-    if (char == "~") {
-      lexer.backup()
-      if (lexer.width() > 0) {
-        lexer.emit(lunr.QueryLexer.TERM)
-      }
-      return lunr.QueryLexer.lexEditDistance
-    }
-
-    if (char == "^") {
-      lexer.backup()
-      if (lexer.width() > 0) {
-        lexer.emit(lunr.QueryLexer.TERM)
-      }
-      return lunr.QueryLexer.lexBoost
-    }
-
-    // "+" indicates term presence is required
-    // checking for length to ensure that only
-    // leading "+" are considered
-    if (char == "+" && lexer.width() === 1) {
-      lexer.emit(lunr.QueryLexer.PRESENCE)
-      return lunr.QueryLexer.lexText
-    }
-
-    // "-" indicates term presence is prohibited
-    // checking for length to ensure that only
-    // leading "-" are considered
-    if (char == "-" && lexer.width() === 1) {
-      lexer.emit(lunr.QueryLexer.PRESENCE)
-      return lunr.QueryLexer.lexText
-    }
-
-    if (char.match(lunr.QueryLexer.termSeparator)) {
-      return lunr.QueryLexer.lexTerm
-    }
-  }
-}
-
-lunr.QueryParser = function (str, query) {
-  this.lexer = new lunr.QueryLexer (str)
-  this.query = query
-  this.currentClause = {}
-  this.lexemeIdx = 0
-}
-
-lunr.QueryParser.prototype.parse = function () {
-  this.lexer.run()
-  this.lexemes = this.lexer.lexemes
-
-  var state = lunr.QueryParser.parseClause
-
-  while (state) {
-    state = state(this)
-  }
-
-  return this.query
-}
-
-lunr.QueryParser.prototype.peekLexeme = function () {
-  return this.lexemes[this.lexemeIdx]
-}
-
-lunr.QueryParser.prototype.consumeLexeme = function () {
-  var lexeme = this.peekLexeme()
-  this.lexemeIdx += 1
-  return lexeme
-}
-
-lunr.QueryParser.prototype.nextClause = function () {
-  var completedClause = this.currentClause
-  this.query.clause(completedClause)
-  this.currentClause = {}
-}
-
-lunr.QueryParser.parseClause = function (parser) {
-  var lexeme = parser.peekLexeme()
-
-  if (lexeme == undefined) {
-    return
-  }
-
-  switch (lexeme.type) {
-    case lunr.QueryLexer.PRESENCE:
-      return lunr.QueryParser.parsePresence
-    case lunr.QueryLexer.FIELD:
-      return lunr.QueryParser.parseField
-    case lunr.QueryLexer.TERM:
-      return lunr.QueryParser.parseTerm
-    default:
-      var errorMessage = "expected either a field or a term, found " + lexeme.type
-
-      if (lexeme.str.length >= 1) {
-        errorMessage += " with value '" + lexeme.str + "'"
-      }
-
-      throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)
-  }
-}
-
-lunr.QueryParser.parsePresence = function (parser) {
-  var lexeme = parser.consumeLexeme()
-
-  if (lexeme == undefined) {
-    return
-  }
-
-  switch (lexeme.str) {
-    case "-":
-      parser.currentClause.presence = lunr.Query.presence.PROHIBITED
-      break
-    case "+":
-      parser.currentClause.presence = lunr.Query.presence.REQUIRED
-      break
-    default:
-      var errorMessage = "unrecognised presence operator'" + lexeme.str + "'"
-      throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)
-  }
-
-  var nextLexeme = parser.peekLexeme()
-
-  if (nextLexeme == undefined) {
-    var errorMessage = "expecting term or field, found nothing"
-    throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)
-  }
-
-  switch (nextLexeme.type) {
-    case lunr.QueryLexer.FIELD:
-      return lunr.QueryParser.parseField
-    case lunr.QueryLexer.TERM:
-      return lunr.QueryParser.parseTerm
-    default:
-      var errorMessage = "expecting term or field, found '" + nextLexeme.type + "'"
-      throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)
-  }
-}
-
-lunr.QueryParser.parseField = function (parser) {
-  var lexeme = parser.consumeLexeme()
-
-  if (lexeme == undefined) {
-    return
-  }
-
-  if (parser.query.allFields.indexOf(lexeme.str) == -1) {
-    var possibleFields = parser.query.allFields.map(function (f) { return "'" + f + "'" }).join(', '),
-        errorMessage = "unrecognised field '" + lexeme.str + "', possible fields: " + possibleFields
-
-    throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)
-  }
-
-  parser.currentClause.fields = [lexeme.str]
-
-  var nextLexeme = parser.peekLexeme()
-
-  if (nextLexeme == undefined) {
-    var errorMessage = "expecting term, found nothing"
-    throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)
-  }
-
-  switch (nextLexeme.type) {
-    case lunr.QueryLexer.TERM:
-      return lunr.QueryParser.parseTerm
-    default:
-      var errorMessage = "expecting term, found '" + nextLexeme.type + "'"
-      throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)
-  }
-}
-
-lunr.QueryParser.parseTerm = function (parser) {
-  var lexeme = parser.consumeLexeme()
-
-  if (lexeme == undefined) {
-    return
-  }
-
-  parser.currentClause.term = lexeme.str.toLowerCase()
-
-  if (lexeme.str.indexOf("*") != -1) {
-    parser.currentClause.usePipeline = false
-  }
-
-  var nextLexeme = parser.peekLexeme()
-
-  if (nextLexeme == undefined) {
-    parser.nextClause()
-    return
-  }
-
-  switch (nextLexeme.type) {
-    case lunr.QueryLexer.TERM:
-      parser.nextClause()
-      return lunr.QueryParser.parseTerm
-    case lunr.QueryLexer.FIELD:
-      parser.nextClause()
-      return lunr.QueryParser.parseField
-    case lunr.QueryLexer.EDIT_DISTANCE:
-      return lunr.QueryParser.parseEditDistance
-    case lunr.QueryLexer.BOOST:
-      return lunr.QueryParser.parseBoost
-    case lunr.QueryLexer.PRESENCE:
-      parser.nextClause()
-      return lunr.QueryParser.parsePresence
-    default:
-      var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'"
-      throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)
-  }
-}
-
-lunr.QueryParser.parseEditDistance = function (parser) {
-  var lexeme = parser.consumeLexeme()
-
-  if (lexeme == undefined) {
-    return
-  }
-
-  var editDistance = parseInt(lexeme.str, 10)
-
-  if (isNaN(editDistance)) {
-    var errorMessage = "edit distance must be numeric"
-    throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)
-  }
-
-  parser.currentClause.editDistance = editDistance
-
-  var nextLexeme = parser.peekLexeme()
-
-  if (nextLexeme == undefined) {
-    parser.nextClause()
-    return
-  }
-
-  switch (nextLexeme.type) {
-    case lunr.QueryLexer.TERM:
-      parser.nextClause()
-      return lunr.QueryParser.parseTerm
-    case lunr.QueryLexer.FIELD:
-      parser.nextClause()
-      return lunr.QueryParser.parseField
-    case lunr.QueryLexer.EDIT_DISTANCE:
-      return lunr.QueryParser.parseEditDistance
-    case lunr.QueryLexer.BOOST:
-      return lunr.QueryParser.parseBoost
-    case lunr.QueryLexer.PRESENCE:
-      parser.nextClause()
-      return lunr.QueryParser.parsePresence
-    default:
-      var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'"
-      throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)
-  }
-}
-
-lunr.QueryParser.parseBoost = function (parser) {
-  var lexeme = parser.consumeLexeme()
-
-  if (lexeme == undefined) {
-    return
-  }
-
-  var boost = parseInt(lexeme.str, 10)
-
-  if (isNaN(boost)) {
-    var errorMessage = "boost must be numeric"
-    throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)
-  }
-
-  parser.currentClause.boost = boost
-
-  var nextLexeme = parser.peekLexeme()
-
-  if (nextLexeme == undefined) {
-    parser.nextClause()
-    return
-  }
-
-  switch (nextLexeme.type) {
-    case lunr.QueryLexer.TERM:
-      parser.nextClause()
-      return lunr.QueryParser.parseTerm
-    case lunr.QueryLexer.FIELD:
-      parser.nextClause()
-      return lunr.QueryParser.parseField
-    case lunr.QueryLexer.EDIT_DISTANCE:
-      return lunr.QueryParser.parseEditDistance
-    case lunr.QueryLexer.BOOST:
-      return lunr.QueryParser.parseBoost
-    case lunr.QueryLexer.PRESENCE:
-      parser.nextClause()
-      return lunr.QueryParser.parsePresence
-    default:
-      var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'"
-      throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)
-  }
-}
-
-  /**
-   * export the module via AMD, CommonJS or as a browser global
-   * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
-   */
-  ;(function (root, factory) {
-    if (typeof define === 'function' && define.amd) {
-      // AMD. Register as an anonymous module.
-      define(factory)
-    } else if (typeof exports === 'object') {
-      /**
-       * Node. Does not work with strict CommonJS, but
-       * only CommonJS-like enviroments that support module.exports,
-       * like Node.
-       */
-      module.exports = factory()
-    } else {
-      // Browser globals (root is window)
-      root.lunr = factory()
-    }
-  }(this, function () {
-    /**
-     * Just return a value to define the module export.
-     * This example returns an object, but the module
-     * can return a function as the exported value.
-     */
-    return lunr
-  }))
-})();
diff --git a/registry/vulkan/config/copyright-ccby.txt b/registry/vulkan/config/copyright-ccby.txt
deleted file mode 100644
index 1ffed4b..0000000
--- a/registry/vulkan/config/copyright-ccby.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Copyright 2014-2021 The Khronos Group Inc.
-
-SPDX-License-Identifier: CC-BY-4.0
diff --git a/registry/vulkan/config/extension-highlighter.rb b/registry/vulkan/config/extension-highlighter.rb
deleted file mode 100644
index b557a01..0000000
--- a/registry/vulkan/config/extension-highlighter.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright 2016-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-RUBY_ENGINE == 'opal' ? (require 'extension-highlighter/extension') : (require_relative 'extension-highlighter/extension')
-
-Extensions.register do
-  preprocessor ExtensionHighlighterPreprocessor
-  postprocessor AddHighlighterCSS
-end
diff --git a/registry/vulkan/config/extension-highlighter/extension.rb b/registry/vulkan/config/extension-highlighter/extension.rb
deleted file mode 100644
index 62e9a6c..0000000
--- a/registry/vulkan/config/extension-highlighter/extension.rb
+++ /dev/null
@@ -1,303 +0,0 @@
-# Copyright 2016-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'
-
-include ::Asciidoctor
-
-module Asciidoctor
-
-# Duplicate of "AnyListRx" defined by asciidoctor
-# Detects the start of any list item.
-#
-# NOTE we only have to check as far as the blank character because we know it means non-whitespace follows.
-HighlighterAnyListRx = /^(?:#{CG_BLANK}*(?:-|([*.\u2022])\1{0,4}|\d+\.|[a-zA-Z]\.|[IVXivx]+\))#{CG_BLANK}|#{CG_BLANK}*.*?(?::{2,4}|;;)(?:$|#{CG_BLANK})|<?\d+>#{CG_BLANK})/
-
-class ExtensionHighlighterPreprocessorReader < PreprocessorReader
-  def initialize document, diff_extensions, data = nil, cursor = nil
-    super(document, data, cursor)
-    @status_stack = []
-    @diff_extensions = diff_extensions
-    @tracking_target = nil
-  end
-
-  # This overrides the default preprocessor reader conditional logic such
-  # that any extensions which need highlighting and are enabled have their
-  # ifdefs left intact.
-  def preprocess_conditional_directive directive, target, delimiter, text
-    # If we're tracking a target for highlighting already, don't need to do
-    # additional processing unless we hit the end of that conditional
-    # section
-    # NOTE: This will break if for some absurd reason someone nests the same
-    # conditional inside itself.
-    if @tracking_target != nil && directive == 'endif' && @tracking_target == target.downcase
-      @tracking_target = nil
-    elsif @tracking_target
-      return super(directive, target, delimiter, text)
-    end
-
-    # If it's an ifdef or ifndef, push the directive onto a stack
-    # If it's an endif, pop the last one off.
-    # This is done to apply the next bit of logic to both the start and end
-    # of an conditional block correctly
-    status = directive
-    if directive == 'endif'
-      status = @status_stack.pop
-    else
-      @status_stack.push status
-    end
-
-    # If the status is negative, we need to still include the conditional
-    # text for the highlighter, so we replace the requirement for the
-    # extension attribute in question to be not defined with an
-    # always-undefined attribute, so that it evaluates to true when it needs
-    # to.
-    # Undefined attribute is currently just the extension with "_undefined"
-    # appended to it.
-    modified_target = target.downcase
-    if status == 'ifndef'
-      @diff_extensions.each do | extension |
-        modified_target.gsub!(extension, extension + '_undefined')
-      end
-    end
-
-    # Call the original preprocessor
-    result = super(directive, modified_target, delimiter, text)
-
-    # If any of the extensions are in the target, and the conditional text
-    # isn't flagged to be skipped, return false to prevent the preprocessor
-    # from removing the line from the processed source.
-    unless @skipping
-      @diff_extensions.each do | extension |
-        if target.downcase.include?(extension)
-          if directive != 'endif'
-            @tracking_target = target.downcase
-          end
-          return false
-        end
-      end
-    end
-    return result
-  end
-
-  # Identical to preprocess_conditional_directive, but older versions of
-  # Asciidoctor used a different name, so this is there to override the same
-  # method in older versions.
-  # This is a pure c+p job for awkward inheritance reasons (see use of
-  # the super() keyword :|)
-  # At some point, will rewrite to avoid this mess, but this fixes things
-  # for now without breaking things for anyone.
-  def preprocess_conditional_inclusion directive, target, delimiter, text
-    # If we're tracking a target for highlighting already, don't need to do
-    # additional processing unless we hit the end of that conditional
-    # section
-    # NOTE: This will break if for some absurd reason someone nests the same
-    # conditional inside itself.
-    if @tracking_target != nil && directive == 'endif' && @tracking_target == target.downcase
-      @tracking_target = nil
-    elsif @tracking_target
-      return super(directive, target, delimiter, text)
-    end
-
-    # If it's an ifdef or ifndef, push the directive onto a stack
-    # If it's an endif, pop the last one off.
-    # This is done to apply the next bit of logic to both the start and end
-    # of an conditional block correctly
-    status = directive
-    if directive == 'endif'
-      status = @status_stack.pop
-    else
-      @status_stack.push status
-    end
-
-    # If the status is negative, we need to still include the conditional
-    # text for the highlighter, so we replace the requirement for the
-    # extension attribute in question to be not defined with an
-    # always-undefined attribute, so that it evaluates to true when it needs
-    # to.
-    # Undefined attribute is currently just the extension with "_undefined"
-    # appended to it.
-    modified_target = target.downcase
-    if status == 'ifndef'
-      @diff_extensions.each do | extension |
-        modified_target.gsub!(extension, extension + '_undefined')
-      end
-    end
-
-    # Call the original preprocessor
-    result = super(directive, modified_target, delimiter, text)
-
-    # If any of the extensions are in the target, and the conditional text
-    # isn't flagged to be skipped, return false to prevent the preprocessor
-    # from removing the line from the processed source.
-    unless @skipping
-      @diff_extensions.each do | extension |
-        if target.downcase.include?(extension)
-          if directive != 'endif'
-            @tracking_target = target.downcase
-          end
-          return false
-        end
-      end
-    end
-    return result
-  end
-end
-
-class Highlighter
-  def initialize
-    @delimiter_stack = []
-    @current_anchor = 1
-  end
-
-  def highlight_marks line, previous_line, next_line
-    if !(line.start_with? 'endif')
-      # Any intact "ifdefs" are sections added by an extension, and
-      # "ifndefs" are sections removed.
-      # Currently don't track *which* extension(s) is/are responsible for
-      # the addition or removal - though it would be possible to add it.
-      if line.start_with? 'ifdef'
-        role = 'added'
-      else # if line.start_with? 'ifndef'
-        role = 'removed'
-      end
-
-      # Create an anchor with the current anchor number
-      anchor = '[[difference' + @current_anchor.to_s + ']]'
-
-      # Figure out which markup to use based on the surrounding text
-      # This is robust enough as far as I can tell, though we may want to do
-      # something more generic later since currently it relies on the fact
-      # that if you start inside a list or paragraph, you'll end in the same
-      # list or paragraph and not cross to other blocks.
-      # In practice it *might just work* but it also might not.
-      # May need to consider what to do about this in future - maybe just
-      # use open blocks for everything?
-      highlight_delimiter = :inline
-      if (HighlighterAnyListRx.match(next_line) != nil)
-        # NOTE: There's a corner case here that should never be hit (famous last words)
-        # If a line in the middle of a paragraph begins with an asterisk and
-        # then whitespace, this will think it's a list item and use the
-        # wrong delimiter.
-        # That shouldn't be a problem in practice though, it just might look
-        # a little weird.
-        highlight_delimiter = :list
-      elsif previous_line.strip.empty?
-        highlight_delimiter = :block
-      end
-
-      # Add the delimiter to the stack for the matching 'endif' to consume
-      @delimiter_stack.push highlight_delimiter
-
-      # Add an appropriate method of delimiting the highlighted areas based
-      # on the surrounding text determined above.
-      if highlight_delimiter == :block
-        return ['', anchor, ":role: #{role}", '']
-      elsif highlight_delimiter == :list
-        return ['', anchor, "[.#{role}]", '~~~~~~~~~~~~~~~~~~~~', '']
-      else #if highlight_delimiter == :inline
-        return [anchor + ' [.' + role + ']##']
-      end
-    else  # if !(line.start_with? 'endif')
-      # Increment the anchor when we see a matching endif, and generate a
-      # link to the next diff section
-      @current_anchor = @current_anchor + 1
-      anchor_link = '<<difference' + @current_anchor.to_s + ', =>>>'
-
-      # Close the delimited area according to the previously determined
-      # delimiter
-      highlight_delimiter = @delimiter_stack.pop
-      if highlight_delimiter == :block
-        return [anchor_link, '', ':role:', '']
-      elsif highlight_delimiter == :list
-        return [anchor_link, '~~~~~~~~~~~~~~~~~~~~', '']
-      else #if highlight_delimiter == :inline
-        return [anchor_link + '##']
-      end
-    end
-  end
-end
-
-# Preprocessor hook to iterate over ifdefs to prevent them from affecting asciidoctor's processing.
-class ExtensionHighlighterPreprocessor < Extensions::Preprocessor
-  def process document, reader
-
-    # Only attempt to highlight extensions that are also enabled - if one
-    # isn't, warn about it and skip highlighting that extension.
-    diff_extensions = document.attributes['diff_extensions'].downcase.split(' ')
-    actual_diff_extensions = []
-    diff_extensions.each do | extension |
-      if document.attributes.has_key?(extension)
-        actual_diff_extensions << extension
-      else
-        puts 'The ' + extension + ' extension is not enabled - changes will not be highlighted.'
-      end
-    end
-
-    # Create a new reader to return, which leaves extension ifdefs that need highlighting intact beyond the preprocess step.
-    extension_preprocessor_reader = ExtensionHighlighterPreprocessorReader.new(document, actual_diff_extensions, reader.lines)
-
-    highlighter = Highlighter.new
-    new_lines = []
-
-    # Store the old lines so we can reference them in a non-trivial fashion
-    old_lines = extension_preprocessor_reader.read_lines()
-    old_lines.each_index do | index |
-
-      # Grab the previously processed line
-      # This is used by the highlighter to figure out if the highlight will
-      # be inline, or part of a block.
-      if index > 0
-        previous_line = old_lines[index - 1]
-      else
-        previous_line = ''
-      end
-
-      # Current line to process
-      line = old_lines[index]
-
-      # Grab the next line to process
-      # This is used by the highlighter to figure out if the highlight is
-      # between list elements or not - which need special handling.
-      if index < (old_lines.length - 1)
-        next_line = old_lines[index + 1]
-      else
-        next_line = ''
-      end
-
-      # Highlight any preprocessor directives that were left intact by the
-      # custom preprocessor reader.
-      if line.start_with?( 'ifdef::', 'ifndef::', 'endif::')
-        new_lines += highlighter.highlight_marks(line, previous_line, next_line)
-      else
-        new_lines << line
-      end
-    end
-
-    # Return a new reader after preprocessing - this takes care of creating
-    # the AST from the new source.
-    Reader.new(new_lines)
-  end
-end
-
-class AddHighlighterCSS < Extensions::Postprocessor
-  HighlighterStyleCSS = [
-    '.added {',
-    '    background-color: lime;',
-    '    border-color: green;',
-    '    padding:1px;',
-    '}',
-    '.removed {',
-    '    background-color: pink;',
-    '    border-color: red;',
-    '    padding:1px;',
-    '}',
-    '</style>']
-
-  def process document, output
-    output.sub! '</style>', HighlighterStyleCSS.join("\n")
-  end
-end
-
-end
diff --git a/registry/vulkan/config/fonts/mplus1p-regular-fallback.ttf b/registry/vulkan/config/fonts/mplus1p-regular-fallback.ttf
deleted file mode 100644
index d9d2e3d..0000000
--- a/registry/vulkan/config/fonts/mplus1p-regular-fallback.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/config/katex_replace.rb b/registry/vulkan/config/katex_replace.rb
deleted file mode 100644
index f134b39..0000000
--- a/registry/vulkan/config/katex_replace.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright 2016-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-#require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'
-RUBY_ENGINE == 'opal' ? (require 'katex_replace/extension') : (require_relative 'katex_replace/extension')
-
-# All the inline macros we need
-Asciidoctor::Extensions.register do
-    postprocessor ReplaceMathjaxWithKatex
-end
diff --git a/registry/vulkan/config/katex_replace/extension.rb b/registry/vulkan/config/katex_replace/extension.rb
deleted file mode 100644
index ad4948f..0000000
--- a/registry/vulkan/config/katex_replace/extension.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2016-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'
-
-include ::Asciidoctor
-
-class ReplaceMathjaxWithKatex < Extensions::Postprocessor
-
-  MathJaXScript = /<script type="text\/x-mathjax-config">((?!<\/script>).)+<\/script>/m
-  MathJaXCDN = /<script src="https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/mathjax\/[0-9].[0-9].[0-9]\/MathJax.js\?config=[-_A-Za-z]+"><\/script>/m
-
-  def process document, output
-
-    if document.attr? 'stem'
-      katexpath = document.attr 'katexpath'
-
-      katexScript = '
-<!-- dragged in by font-awesome css included by asciidoctor, but preloaded in this extension for convenience -->
-<link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2?v=4.7.0" as="font" type="font/woff2" crossorigin="">
-
-<!-- Note: Chrome needs crossorigin="" even for same-origin fonts -->
-<link rel="preload" href="../katex/fonts/KaTeX_Main-Bold.woff2" as="font" type="font/woff2" crossorigin="">
-<link rel="preload" href="../katex/fonts/KaTeX_Main-Italic.woff2" as="font" type="font/woff2" crossorigin="">
-<link rel="preload" href="../katex/fonts/KaTeX_Main-Regular.woff2" as="font" type="font/woff2" crossorigin="">
-<link rel="preload" href="../katex/fonts/KaTeX_Math-Italic.woff2" as="font" type="font/woff2" crossorigin="">
-<link rel="preload" href="../katex/fonts/KaTeX_Size1-Regular.woff2" as="font" type="font/woff2" crossorigin="">
-<link rel="preload" href="../katex/fonts/KaTeX_Size2-Regular.woff2" as="font" type="font/woff2" crossorigin="">
-<link rel="preload" href="../katex/fonts/KaTeX_Size3-Regular.woff2" as="font" type="font/woff2" crossorigin="">
-<link rel="preload" href="../katex/fonts/KaTeX_Size4-Regular.woff2" as="font" type="font/woff2" crossorigin="">
-<link rel="preload" href="../katex/fonts/KaTeX_Typewriter-Regular.woff2" as="font" type="font/woff2" crossorigin="">'
-
-      # Load KaTeX stylesheet, but we no longer run a script to convert math
-      # using KaTeX, since that's now done at spec generation time.
-      katexScript += '<link rel="stylesheet" href="' + katexpath + '/katex.min.css">'
-
-      output.sub! MathJaXScript, ''
-      output.sub! MathJaXCDN, ''
-      output.sub! /(?=<\/head>)/, katexScript
-    end
-    output
-  end
-end
diff --git a/registry/vulkan/config/khronos.css b/registry/vulkan/config/khronos.css
deleted file mode 100644
index 2530f3d..0000000
--- a/registry/vulkan/config/khronos.css
+++ /dev/null
@@ -1,732 +0,0 @@
-/*! normalize.css v2.1.2 | MIT License | git.io/normalize */
-/* ========================================================================== HTML5 display definitions ========================================================================== */
-/** Correct `block` display not defined in IE 8/9. */
-article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; }
-
-/** Correct `inline-block` display not defined in IE 8/9. */
-audio, canvas, video { display: inline-block; }
-
-/** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */
-audio:not([controls]) { display: none; height: 0; }
-
-/** Address `[hidden]` styling not present in IE 8/9. Hide the `template` element in IE, Safari, and Firefox < 22. */
-[hidden], template { display: none; }
-
-script { display: none !important; }
-
-/* ========================================================================== Base ========================================================================== */
-/** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */
-html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ }
-
-/** Remove default margin. */
-body { margin: 0; }
-
-/* ========================================================================== Links ========================================================================== */
-/** Remove the gray background color from active links in IE 10. */
-a { background: transparent; }
-
-/** Address `outline` inconsistency between Chrome and other browsers. */
-a:focus { outline: thin dotted; }
-
-/** Improve readability when focused and also mouse hovered in all browsers. */
-a:active, a:hover { outline: 0; }
-
-/* ========================================================================== Typography ========================================================================== */
-/** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. */
-h1 { font-size: 2em; margin: 0.67em 0; }
-
-/** Address styling not present in IE 8/9, Safari 5, and Chrome. */
-abbr[title] { border-bottom: 1px dotted; }
-
-/** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */
-b, strong { font-weight: bold; }
-
-/** Address styling not present in Safari 5 and Chrome. */
-dfn { font-style: italic; }
-
-/** Address differences between Firefox and other browsers. */
-hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; }
-
-/** Address styling not present in IE 8/9. */
-mark { background: #ff0; color: #000; }
-
-/** Correct font family set oddly in Safari 5 and Chrome. */
-code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; }
-
-/** Improve readability of pre-formatted text in all browsers. */
-pre { white-space: pre-wrap; }
-
-/** Set consistent quote types. */
-q { quotes: "\201C" "\201D" "\2018" "\2019"; }
-
-/** Address inconsistent and variable font size in all browsers. */
-small { font-size: 80%; }
-
-/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */
-sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
-
-sup { top: -0.5em; }
-
-sub { bottom: -0.25em; }
-
-/* ========================================================================== Embedded content ========================================================================== */
-/** Remove border when inside `a` element in IE 8/9. */
-img { border: 0; }
-
-/** Correct overflow displayed oddly in IE 9. */
-svg:not(:root) { overflow: hidden; }
-
-/* ========================================================================== Figures ========================================================================== */
-/** Address margin not present in IE 8/9 and Safari 5. */
-figure { margin: 0; }
-
-/* ========================================================================== Forms ========================================================================== */
-/** Define consistent border, margin, and padding. */
-fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; }
-
-/** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so people aren't caught out if they zero out fieldsets. */
-legend { border: 0; /* 1 */ padding: 0; /* 2 */ }
-
-/** 1. Correct font family not being inherited in all browsers. 2. Correct font size not being inherited in all browsers. 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */
-button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ }
-
-/** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */
-button, input { line-height: normal; }
-
-/** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. Correct `select` style inheritance in Firefox 4+ and Opera. */
-button, select { text-transform: none; }
-
-/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */
-button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ }
-
-/** Re-set default cursor for disabled elements. */
-button[disabled], html input[disabled] { cursor: default; }
-
-/** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess padding in IE 8/9. */
-input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ }
-
-/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */
-input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; }
-
-/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */
-input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
-
-/** Remove inner padding and border in Firefox 4+. */
-button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
-
-/** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and alignment in all browsers. */
-textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ }
-
-/* ========================================================================== Tables ========================================================================== */
-/** Remove most spacing between table cells. */
-table { border-collapse: collapse; border-spacing: 0; }
-
-meta.foundation-mq-small { font-family: "only screen and (min-width: 768px)"; width: 768px; }
-
-meta.foundation-mq-medium { font-family: "only screen and (min-width:1280px)"; width: 1280px; }
-
-meta.foundation-mq-large { font-family: "only screen and (min-width:1440px)"; width: 1440px; }
-
-*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }
-
-html, body { font-size: 100%; }
-
-body { background: #fff; color: #222; padding: 0; margin: 0; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-weight: normal; font-style: normal; line-height: 1; position: relative; cursor: auto; }
-
-a:hover { cursor: pointer; }
-
-img, object, embed { max-width: 100%; height: auto; }
-
-object, embed { height: 100%; }
-
-img { -ms-interpolation-mode: bicubic; }
-
-#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { max-width: none !important; }
-
-.left { float: left !important; }
-
-.right { float: right !important; }
-
-.text-left { text-align: left !important; }
-
-.text-right { text-align: right !important; }
-
-.text-center { text-align: center !important; }
-
-.text-justify { text-align: justify !important; }
-
-.hide { display: none; }
-
-.antialiased { -webkit-font-smoothing: antialiased; }
-
-img { display: inline-block; vertical-align: middle; }
-
-textarea { height: auto; min-height: 50px; }
-
-select { width: 100%; }
-
-object, svg { display: inline-block; vertical-align: middle; }
-
-.center { margin-left: auto; margin-right: auto; }
-
-.spread { width: 100%; }
-
-p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; }
-
-.subheader, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { line-height: 1.4; color: black; font-weight: 300; margin-top: 0.2em; margin-bottom: 0.5em; }
-
-/* Typography resets */
-div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; }
-
-/* Default Link Styles */
-a { color: #0068b0; text-decoration: none; line-height: inherit; }
-a:hover, a:focus { color: #333; }
-a img { border: none; }
-
-/* Default paragraph styles */
-p { font-family: Noto, sans-serif; font-weight: normal; font-size: 1em; line-height: 1.6; margin-bottom: 0.75em; text-rendering: optimizeLegibility; }
-p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; }
-
-/* Default header styles */
-h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: Noto, sans-serif; font-weight: normal; font-style: normal; color: black; text-rendering: optimizeLegibility; margin-top: 0.5em; margin-bottom: 0.5em; line-height: 1.2125em; }
-h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: #4d4d4d; line-height: 0; }
-
-h1 { font-size: 2.125em; }
-
-h2 { font-size: 1.6875em; }
-
-h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; }
-
-h4 { font-size: 1.125em; }
-
-h5 { font-size: 1.125em; }
-
-h6 { font-size: 1em; }
-
-hr { border: solid #ddd; border-width: 1px 0 0; clear: both; margin: 1.25em 0 1.1875em; height: 0; }
-
-/* Helpful Typography Defaults */
-em, i { font-style: italic; line-height: inherit; }
-
-strong, b { font-weight: bold; line-height: inherit; }
-
-small { font-size: 60%; line-height: inherit; }
-
-code { font-family: Consolas, "Liberation Mono", Courier, monospace; font-weight: normal; color: #264357; }
-
-/* Lists */
-ul, ol, dl { font-size: 1em; line-height: 1.6; margin-bottom: 0.75em; list-style-position: outside; font-family: Noto, sans-serif; }
-
-ul, ol { margin-left: 1.5em; }
-ul.no-bullet, ol.no-bullet { margin-left: 1.5em; }
-
-/* Unordered Lists */
-ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* Override nested font-size change */ }
-ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; }
-ul.square { list-style-type: square; }
-ul.circle { list-style-type: circle; }
-ul.disc { list-style-type: disc; }
-ul.no-bullet { list-style: none; }
-
-/* Ordered Lists */
-ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; }
-
-/* Definition Lists */
-dl dt { margin-bottom: 0.3em; font-weight: bold; }
-dl dd { margin-bottom: 0.75em; }
-
-/* Abbreviations */
-abbr, acronym { text-transform: uppercase; font-size: 90%; color: black; border-bottom: 1px dotted #ddd; cursor: help; }
-
-abbr { text-transform: none; }
-
-/* Blockquotes */
-blockquote { margin: 0 0 0.75em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #ddd; }
-blockquote cite { display: block; font-size: 0.8125em; color: #365E7A; }
-blockquote cite:before { content: "\2014 \0020"; }
-blockquote cite a, blockquote cite a:visited { color: #365E7A; }
-
-blockquote, blockquote p { line-height: 1.6; color: #333; }
-
-/* Microformats */
-.vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid #ddd; padding: 0.625em 0.75em; }
-.vcard li { margin: 0; display: block; }
-.vcard .fn { font-weight: bold; font-size: 0.9375em; }
-
-.vevent .summary { font-weight: bold; }
-.vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: none; padding: 0 0.0625em; }
-
-@media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; }
-  h1 { font-size: 2.75em; }
-  h2 { font-size: 2.3125em; }
-  h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; }
-  h4 { font-size: 1.4375em; } }
-/* Tables */
-table { background: #fff; margin-bottom: 1.25em; border: solid 1px #d8d8ce; }
-table thead, table tfoot { background: #eee; font-weight: bold; }
-table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: inherit; color: #222; text-align: left; }
-table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: #6d6e71; }
-table tr.even, table tr.alt, table tr:nth-of-type(even) { background: #f8f8f8; }
-table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.4; }
-
-body { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; tab-size: 4; }
-
-h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; }
-
-a:hover, a:focus { text-decoration: underline; }
-
-.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { content: " "; display: table; }
-.clearfix:after, .float-group:after { clear: both; }
-
-*:not(pre) > code { font-size: inherit; font-style: normal !important; letter-spacing: 0; padding: 0; background-color: transparent; -webkit-border-radius: 0; border-radius: 0; line-height: inherit; word-wrap: break-word; }
-*:not(pre) > code.nobreak { word-wrap: normal; }
-*:not(pre) > code.nowrap { white-space: nowrap; }
-
-pre, pre > code { line-height: 1.6; color: #264357; font-family: Consolas, "Liberation Mono", Courier, monospace; font-weight: normal; }
-
-em em { font-style: normal; }
-
-strong strong { font-weight: normal; }
-
-.keyseq { color: #333333; }
-
-kbd { font-family: Consolas, "Liberation Mono", Courier, monospace; display: inline-block; color: black; font-size: 0.65em; line-height: 1.45; background-color: #f7f7f7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; margin: 0 0.15em; padding: 0.2em 0.5em; vertical-align: middle; position: relative; top: -0.1em; white-space: nowrap; }
-
-.keyseq kbd:first-child { margin-left: 0; }
-
-.keyseq kbd:last-child { margin-right: 0; }
-
-.menuseq, .menuref { color: #000; }
-
-.menuseq b:not(.caret), .menuref { font-weight: inherit; }
-
-.menuseq { word-spacing: -0.02em; }
-.menuseq b.caret { font-size: 1.25em; line-height: 0.8; }
-.menuseq i.caret { font-weight: bold; text-align: center; width: 0.45em; }
-
-b.button:before, b.button:after { position: relative; top: -1px; font-weight: normal; }
-
-b.button:before { content: "["; padding: 0 3px 0 2px; }
-
-b.button:after { content: "]"; padding: 0 2px 0 3px; }
-
-#header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 1.5em; padding-right: 1.5em; }
-#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " "; display: table; }
-#header:after, #content:after, #footnotes:after, #footer:after { clear: both; }
-
-#content { margin-top: 1.25em; }
-
-#content:before { content: none; }
-
-#header > h1:first-child { color: black; margin-top: 2.25rem; margin-bottom: 0; }
-#header > h1:first-child + #toc { margin-top: 8px; border-top: 1px solid #ddd; }
-#header > h1:only-child, body.toc2 #header > h1:nth-last-child(2) { border-bottom: 1px solid #ddd; padding-bottom: 8px; }
-#header .details { border-bottom: 1px solid #ddd; line-height: 1.45; padding-top: 0.25em; padding-bottom: 0.25em; padding-left: 0.25em; color: #365E7A; display: -ms-flexbox; display: -webkit-flex; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; }
-#header .details span:first-child { margin-left: -0.125em; }
-#header .details span.email a { color: #333; }
-#header .details br { display: none; }
-#header .details br + span:before { content: "\00a0\2013\00a0"; }
-#header .details br + span.author:before { content: "\00a0\22c5\00a0"; color: #333; }
-#header .details br + span#revremark:before { content: "\00a0|\00a0"; }
-#header #revnumber { text-transform: capitalize; }
-#header #revnumber:after { content: "\00a0"; }
-
-#content > h1:first-child:not([class]) { color: black; border-bottom: 1px solid #ddd; padding-bottom: 8px; margin-top: 0; padding-top: 1rem; margin-bottom: 1.25rem; }
-
-#toc { border-bottom: 0 solid #ddd; padding-bottom: 0.5em; }
-#toc > ul { margin-left: 0.125em; }
-#toc ul.sectlevel0 > li > a { font-style: italic; }
-#toc ul.sectlevel0 ul.sectlevel1 { margin: 0.5em 0; }
-#toc ul { font-family: Noto, sans-serif; list-style-type: none; }
-#toc li { line-height: 1.3334; margin-top: 0.3334em; }
-#toc a { text-decoration: none; }
-#toc a:active { text-decoration: underline; }
-
-#toctitle { color: black; font-size: 1.2em; }
-
-@media only screen and (min-width: 768px) { #toctitle { font-size: 1.375em; }
-  body.toc2 { padding-left: 15em; padding-right: 0; }
-  #toc.toc2 { margin-top: 0 !important; background-color: #fff; position: fixed; width: 15em; left: 0; top: 0; border-right: 1px solid #ddd; border-top-width: 0 !important; border-bottom-width: 0 !important; z-index: 1000; padding: 1.25em 1em; height: 100%; overflow: auto; }
-  #toc.toc2 #toctitle { margin-top: 0; margin-bottom: 0.8rem; font-size: 1.2em; }
-  #toc.toc2 > ul { font-size: 0.9em; margin-bottom: 0; }
-  #toc.toc2 ul ul { margin-left: 0; padding-left: 1em; }
-  #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; }
-  body.toc2.toc-right { padding-left: 0; padding-right: 15em; }
-  body.toc2.toc-right #toc.toc2 { border-right-width: 0; border-left: 1px solid #ddd; left: auto; right: 0; } }
-@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; padding-right: 0; }
-  #toc.toc2 { width: 20em; }
-  #toc.toc2 #toctitle { font-size: 1.375em; }
-  #toc.toc2 > ul { font-size: 0.95em; }
-  #toc.toc2 ul ul { padding-left: 1.25em; }
-  body.toc2.toc-right { padding-left: 0; padding-right: 20em; } }
-#content #toc { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: #fff; -webkit-border-radius: 0; border-radius: 0; }
-#content #toc > :first-child { margin-top: 0; }
-#content #toc > :last-child { margin-bottom: 0; }
-
-#footer { max-width: 100%; background-color: none; padding: 1.25em; }
-
-#footer-text { color: black; line-height: 1.44; }
-
-#content { margin-bottom: 0.625em; }
-
-.sect1 { padding-bottom: 0.625em; }
-
-@media only screen and (min-width: 768px) { #content { margin-bottom: 1.25em; }
-  .sect1 { padding-bottom: 1.25em; } }
-.sect1:last-child { padding-bottom: 0; }
-
-.sect1 + .sect1 { border-top: 0 solid #ddd; }
-
-#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { position: absolute; z-index: 1001; width: 1.5ex; margin-left: -1.5ex; display: block; text-decoration: none !important; visibility: hidden; text-align: center; font-weight: normal; }
-#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { content: "\00A7"; font-size: 0.85em; display: block; padding-top: 0.1em; }
-#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; }
-#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { color: black; text-decoration: none; }
-#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: black; }
-
-.audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .videoblock { margin-bottom: 1.25em; }
-
-.admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-rendering: optimizeLegibility; text-align: left; }
-
-table.tableblock > caption.title { white-space: nowrap; overflow: visible; max-width: 0; }
-
-.paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { color: black; }
-
-table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-size: inherit; }
-
-.admonitionblock > table { border-collapse: separate; border: 0; background: none; width: 100%; }
-.admonitionblock > table td.icon { text-align: center; width: 80px; }
-.admonitionblock > table td.icon img { max-width: initial; }
-.admonitionblock > table td.icon .title { font-weight: bold; font-family: Noto, sans-serif; text-transform: uppercase; }
-.admonitionblock > table td.content { padding-left: 1.125em; padding-right: 1.25em; border-left: 1px solid #ddd; color: #365E7A; }
-.admonitionblock > table td.content > :last-child > :last-child { margin-bottom: 0; }
-
-.exampleblock > .content { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: #fff; -webkit-border-radius: 0; border-radius: 0; }
-.exampleblock > .content > :first-child { margin-top: 0; }
-.exampleblock > .content > :last-child { margin-bottom: 0; }
-
-.sidebarblock { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: #fff; -webkit-border-radius: 0; border-radius: 0; }
-.sidebarblock > :first-child { margin-top: 0; }
-.sidebarblock > :last-child { margin-bottom: 0; }
-.sidebarblock > .content > .title { color: black; margin-top: 0; }
-
-.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; }
-
-.literalblock pre, .listingblock pre:not(.highlight), .listingblock pre[class="highlight"], .listingblock pre[class^="highlight "], .listingblock pre.CodeRay, .listingblock pre.prettyprint { background: #eee; }
-.sidebarblock .literalblock pre, .sidebarblock .listingblock pre:not(.highlight), .sidebarblock .listingblock pre[class="highlight"], .sidebarblock .listingblock pre[class^="highlight "], .sidebarblock .listingblock pre.CodeRay, .sidebarblock .listingblock pre.prettyprint { background: #f2f1f1; }
-
-.literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { border: 1px hidden #666; -webkit-border-radius: 0; border-radius: 0; word-wrap: break-word; padding: 1.25em 1.5625em 1.125em 1.5625em; font-size: 0.8125em; }
-.literalblock pre.nowrap, .literalblock pre[class].nowrap, .listingblock pre.nowrap, .listingblock pre[class].nowrap { overflow-x: auto; white-space: pre; word-wrap: normal; }
-@media only screen and (min-width: 768px) { .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { font-size: 0.90625em; } }
-@media only screen and (min-width: 1280px) { .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { font-size: 1em; } }
-
-.literalblock.output pre { color: #eee; background-color: #264357; }
-
-.listingblock pre.highlightjs { padding: 0; }
-.listingblock pre.highlightjs > code { padding: 1.25em 1.5625em 1.125em 1.5625em; -webkit-border-radius: 0; border-radius: 0; }
-
-.listingblock > .content { position: relative; }
-
-.listingblock code[data-lang]:before { display: none; content: attr(data-lang); position: absolute; font-size: 0.75em; top: 0.425rem; right: 0.5rem; line-height: 1; text-transform: uppercase; color: #999; }
-
-.listingblock:hover code[data-lang]:before { display: block; }
-
-.listingblock.terminal pre .command:before { content: attr(data-prompt); padding-right: 0.5em; color: #999; }
-
-.listingblock.terminal pre .command:not([data-prompt]):before { content: "$"; }
-
-table.pyhltable { border-collapse: separate; border: 0; margin-bottom: 0; background: none; }
-
-table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; line-height: 1.6; }
-
-table.pyhltable td.code { padding-left: .75em; padding-right: 0; }
-
-pre.pygments .lineno, table.pyhltable td:not(.code) { color: #999; padding-left: 0; padding-right: .5em; border-right: 1px solid #ddd; }
-
-pre.pygments .lineno { display: inline-block; margin-right: .25em; }
-
-table.pyhltable .linenodiv { background: none !important; padding-right: 0 !important; }
-
-.quoteblock { margin: 0 1em 0.75em 1.5em; display: table; }
-.quoteblock > .title { margin-left: -1.5em; margin-bottom: 0.75em; }
-.quoteblock blockquote, .quoteblock blockquote p { color: #333; font-size: 1.15rem; line-height: 1.75; word-spacing: 0.1em; letter-spacing: 0; font-style: italic; text-align: justify; }
-.quoteblock blockquote { margin: 0; padding: 0; border: 0; }
-.quoteblock blockquote:before { content: "\201c"; float: left; font-size: 2.75em; font-weight: bold; line-height: 0.6em; margin-left: -0.6em; color: black; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); }
-.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; }
-.quoteblock .attribution { margin-top: 0.5em; margin-right: 0.5ex; text-align: right; }
-.quoteblock .quoteblock { margin-left: 0; margin-right: 0; padding: 0.5em 0; border-left: 3px solid #365E7A; }
-.quoteblock .quoteblock blockquote { padding: 0 0 0 0.75em; }
-.quoteblock .quoteblock blockquote:before { display: none; }
-
-.verseblock { margin: 0 1em 0.75em 1em; }
-.verseblock pre { font-family: "Open Sans", "DejaVu Sans", sans; font-size: 1.15rem; color: #333; font-weight: 300; text-rendering: optimizeLegibility; }
-.verseblock pre strong { font-weight: 400; }
-.verseblock .attribution { margin-top: 1.25rem; margin-left: 0.5ex; }
-
-.quoteblock .attribution, .verseblock .attribution { font-size: 0.8125em; line-height: 1.45; font-style: italic; }
-.quoteblock .attribution br, .verseblock .attribution br { display: none; }
-.quoteblock .attribution cite, .verseblock .attribution cite { display: block; letter-spacing: -0.025em; color: #365E7A; }
-
-.quoteblock.abstract { margin: 0 0 0.75em 0; display: block; }
-.quoteblock.abstract blockquote, .quoteblock.abstract blockquote p { text-align: left; word-spacing: 0; }
-.quoteblock.abstract blockquote:before, .quoteblock.abstract blockquote p:first-of-type:before { display: none; }
-
-table.tableblock { max-width: 100%; border-collapse: separate; }
-table.tableblock td > .paragraph:last-child p > p:last-child, table.tableblock th > p:last-child, table.tableblock td > p:last-child { margin-bottom: 0; }
-
-table.tableblock, th.tableblock, td.tableblock { border: 0 solid #d8d8ce; }
-
-table.grid-all > thead > tr > .tableblock, table.grid-all > tbody > tr > .tableblock { border-width: 0 1px 1px 0; }
-
-table.grid-all > tfoot > tr > .tableblock { border-width: 1px 1px 0 0; }
-
-table.grid-cols > * > tr > .tableblock { border-width: 0 1px 0 0; }
-
-table.grid-rows > thead > tr > .tableblock, table.grid-rows > tbody > tr > .tableblock { border-width: 0 0 1px 0; }
-
-table.grid-rows > tfoot > tr > .tableblock { border-width: 1px 0 0 0; }
-
-table.grid-all > * > tr > .tableblock:last-child, table.grid-cols > * > tr > .tableblock:last-child { border-right-width: 0; }
-
-table.grid-all > tbody > tr:last-child > .tableblock, table.grid-all > thead:last-child > tr > .tableblock, table.grid-rows > tbody > tr:last-child > .tableblock, table.grid-rows > thead:last-child > tr > .tableblock { border-bottom-width: 0; }
-
-table.frame-all { border-width: 1px; }
-
-table.frame-sides { border-width: 0 1px; }
-
-table.frame-topbot { border-width: 1px 0; }
-
-th.halign-left, td.halign-left { text-align: left; }
-
-th.halign-right, td.halign-right { text-align: right; }
-
-th.halign-center, td.halign-center { text-align: center; }
-
-th.valign-top, td.valign-top { vertical-align: top; }
-
-th.valign-bottom, td.valign-bottom { vertical-align: bottom; }
-
-th.valign-middle, td.valign-middle { vertical-align: middle; }
-
-table thead th, table tfoot th { font-weight: bold; }
-
-tbody tr th { display: table-cell; line-height: 1.4; background: #eee; }
-
-tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { color: #222; font-weight: bold; }
-
-p.tableblock > code:only-child { background: none; padding: 0; }
-
-p.tableblock { font-size: 1em; }
-
-td > div.verse { white-space: pre; }
-
-ol { margin-left: 1.75em; }
-
-ul li ol { margin-left: 1.5em; }
-
-dl dd { margin-left: 1.125em; }
-
-dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; }
-
-ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { margin-bottom: 0.375em; }
-
-ul.checklist, ul.none, ol.none, ul.no-bullet, ol.no-bullet, ol.unnumbered, ul.unstyled, ol.unstyled { list-style-type: none; }
-
-ul.no-bullet, ol.no-bullet, ol.unnumbered { margin-left: 0.625em; }
-
-ul.unstyled, ol.unstyled { margin-left: 0; }
-
-ul.checklist { margin-left: 0.625em; }
-
-ul.checklist li > p:first-child > .fa-square-o:first-child, ul.checklist li > p:first-child > .fa-check-square-o:first-child { width: 1.25em; font-size: 0.8em; position: relative; bottom: 0.125em; }
-
-ul.checklist li > p:first-child > input[type="checkbox"]:first-child { margin-right: 0.25em; }
-
-ul.inline { display: -ms-flexbox; display: -webkit-box; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; list-style: none; margin: 0 0 0.375em -0.75em; }
-
-ul.inline > li { margin-left: 0.75em; }
-
-.unstyled dl dt { font-weight: normal; font-style: normal; }
-
-ol.arabic { list-style-type: decimal; }
-
-ol.decimal { list-style-type: decimal-leading-zero; }
-
-ol.loweralpha { list-style-type: lower-alpha; }
-
-ol.upperalpha { list-style-type: upper-alpha; }
-
-ol.lowerroman { list-style-type: lower-roman; }
-
-ol.upperroman { list-style-type: upper-roman; }
-
-ol.lowergreek { list-style-type: lower-greek; }
-
-.hdlist > table, .colist > table { border: 0; background: none; }
-.hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; }
-
-td.hdlist1, td.hdlist2 { vertical-align: top; padding: 0 0.625em; }
-
-td.hdlist1 { font-weight: bold; padding-bottom: 0.75em; }
-
-.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; }
-
-.colist > table tr > td:first-of-type { padding: 0.4em 0.75em 0 0.75em; line-height: 1; vertical-align: top; }
-.colist > table tr > td:first-of-type img { max-width: initial; }
-.colist > table tr > td:last-of-type { padding: 0.25em 0; }
-
-.thumb, .th { line-height: 0; display: inline-block; border: solid 4px #fff; -webkit-box-shadow: 0 0 0 1px #ddd; box-shadow: 0 0 0 1px #ddd; }
-
-.imageblock.left, .imageblock[style*="float: left"] { margin: 0.25em 0.625em 1.25em 0; }
-.imageblock.right, .imageblock[style*="float: right"] { margin: 0.25em 0 1.25em 0.625em; }
-.imageblock > .title { margin-bottom: 0; }
-.imageblock.thumb, .imageblock.th { border-width: 6px; }
-.imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; }
-
-.image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; display: inline-block; line-height: 0; }
-.image.left { margin-right: 0.625em; }
-.image.right { margin-left: 0.625em; }
-
-a.image { text-decoration: none; display: inline-block; }
-a.image object { pointer-events: none; }
-
-sup.footnote, sup.footnoteref { font-size: 0.875em; position: static; vertical-align: super; }
-sup.footnote a, sup.footnoteref a { text-decoration: none; }
-sup.footnote a:active, sup.footnoteref a:active { text-decoration: underline; }
-
-#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; }
-#footnotes hr { width: 20%; min-width: 6.25em; margin: -0.25em 0 0.75em 0; border-width: 1px 0 0 0; }
-#footnotes .footnote { padding: 0 0.375em 0 0.225em; line-height: 1.3334; font-size: 0.875em; margin-left: 1.2em; margin-bottom: 0.2em; }
-#footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: none; margin-left: -1.05em; }
-#footnotes .footnote:last-of-type { margin-bottom: 0; }
-#content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 0; }
-
-.gist .file-data > table { border: 0; background: #fff; width: 100%; margin-bottom: 0; }
-.gist .file-data > table td.line-data { width: 99%; }
-
-div.unbreakable { page-break-inside: avoid; }
-
-.big { font-size: larger; }
-
-.small { font-size: smaller; }
-
-.underline { text-decoration: underline; }
-
-.overline { text-decoration: overline; }
-
-.line-through { text-decoration: line-through; }
-
-.aqua { color: #00bfbf; }
-
-.aqua-background { background-color: #00fafa; }
-
-.black { color: black; }
-
-.black-background { background-color: black; }
-
-.blue { color: #0000bf; }
-
-.blue-background { background-color: #0000fa; }
-
-.fuchsia { color: #bf00bf; }
-
-.fuchsia-background { background-color: #fa00fa; }
-
-.gray { color: #606060; }
-
-.gray-background { background-color: #7d7d7d; }
-
-.green { color: #006000; }
-
-.green-background { background-color: #007d00; }
-
-.lime { color: #00bf00; }
-
-.lime-background { background-color: #00fa00; }
-
-.maroon { color: #600000; }
-
-.maroon-background { background-color: #7d0000; }
-
-.navy { color: #000060; }
-
-.navy-background { background-color: #00007d; }
-
-.olive { color: #606000; }
-
-.olive-background { background-color: #7d7d00; }
-
-.purple { color: #600060; }
-
-.purple-background { background-color: #7d007d; }
-
-.red { color: #bf0000; }
-
-.red-background { background-color: #fa0000; }
-
-.silver { color: #909090; }
-
-.silver-background { background-color: #bcbcbc; }
-
-.teal { color: #006060; }
-
-.teal-background { background-color: #007d7d; }
-
-.white { color: #bfbfbf; }
-
-.white-background { background-color: #fafafa; }
-
-.yellow { color: #bfbf00; }
-
-.yellow-background { background-color: #fafa00; }
-
-span.icon > .fa { cursor: default; }
-a span.icon > .fa { cursor: inherit; }
-
-.admonitionblock td.icon [class^="fa icon-"] { font-size: 2.5em; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; }
-.admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #29475c; }
-.admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); color: #111; }
-.admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #bf6900; }
-.admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #bf3400; }
-.admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #bf0000; }
-
-.conum[data-value] { display: inline-block; color: #fff !important; background-color: black; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; font-size: 0.75em; width: 1.67em; height: 1.67em; line-height: 1.67em; font-family: "Open Sans", "DejaVu Sans", sans-serif; font-style: normal; font-weight: bold; }
-.conum[data-value] * { color: #fff !important; }
-.conum[data-value] + b { display: none; }
-.conum[data-value]:after { content: attr(data-value); }
-pre .conum[data-value] { position: relative; top: -0.125em; }
-
-b.conum * { color: inherit !important; }
-
-.conum:not([data-value]):empty { display: none; }
-
-h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { border-bottom: 1px solid #ddd; }
-
-.sect1 { padding-bottom: 0; }
-
-#toctitle { color: #00406F; font-weight: normal; margin-top: 1.5em; }
-
-.sidebarblock { border-color: #aaa; }
-
-code { -webkit-border-radius: 4px; border-radius: 4px; }
-
-p.tableblock.header { color: #6d6e71; }
-
-.literalblock pre, .listingblock pre { background: #eee; }
-
-/* From https://github.com/KhronosGroup/Vulkan-Docs/pull/901 */
-a code { color: inherit; }
-
-/* From https://github.com/KhronosGroup/Vulkan-Docs/pull/1157 */
-/* Make VUID anchor handles*/
-li > p > a[id^="VUID-"] { visibility: hidden; position: absolute; z-index: 1001; width: 2.2ex; margin-left: -2.2ex; display: block; text-decoration: none !important; text-align: center; font-weight: normal; }
-
-li > p > a[id^="VUID-"]:before { content: "\00A7"; font-size: 1em; display: block; padding-top: 0em; background: #fff; }
-
-li > p:hover > a[id^="VUID-"], li > p > a[id^="VUID-"]:hover { visibility: visible; }
-
-li > p > a[id^="VUID-"].link { color: black; text-decoration: none; }
-
-/* TODO: not quite sure what these two do */
-li > p > a[id^="VUID-"].link:hover { color: black; }
-
-.vuid { color: #4d4d4d; font-family: monospace; }
diff --git a/registry/vulkan/config/loadable_html.rb b/registry/vulkan/config/loadable_html.rb
deleted file mode 100644
index 4fcb945..0000000
--- a/registry/vulkan/config/loadable_html.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright 2016-2018 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-#require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'
-RUBY_ENGINE == 'opal' ? (require 'loadable_html/extension') : (require_relative 'loadable_html/extension')
-
-# All the inline macros we need
-Asciidoctor::Extensions.register do
-    postprocessor MakeHtmlLoadable
-end
diff --git a/registry/vulkan/config/loadable_html/extension.rb b/registry/vulkan/config/loadable_html/extension.rb
deleted file mode 100644
index 84cbe62..0000000
--- a/registry/vulkan/config/loadable_html/extension.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-# Copyright 2016-2018 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-# This script adds CSS and markup to indicate the document is (perhaps
-# slowly) loading. It also inserts HTML comments marking where JavaScript
-# and HTML specific to the chunked HTML output target should be inserted.
-
-require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'
-
-include ::Asciidoctor
-
-class MakeHtmlLoadable < Extensions::Postprocessor
-
-  def process document, output
-
-    if document.attr? 'stem'
-
-      loading_msg = '<div id="loading_msg" class="hidden" hidden><p>Loading&hellip; please wait.</p></div>'
-      loadable_class = 'class="loadable"'
-
-      loaded_script = '
-<!--ChunkedSearchJSMarker-->
-<style>
-    #loading_msg {
-        width: 100%;
-        margin-left: auto;
-        margin-right: auto;
-        margin-top: 1ex;
-        margin-bottom: 1ex;
-        max-width: 62.5em;
-        position: relative;
-        padding-left: 1.5em;
-        padding-right: 1.5em;
-    }
-    .hidden {display: none;}
-</style>
-<script>
-    function hideElement(e){
-        e.setAttribute("hidden", "");
-        e.classList.add("hidden");
-    }
-
-    function unhideElement(e){
-        e.classList.remove("hidden");
-        e.removeAttribute("hidden");
-    }
-
-    function hideLoadableContent(){
-        unhideElement( document.getElementById("loading_msg") );
-        for( var loadable of document.getElementsByClassName("loadable") ) hideElement(loadable);
-    }
-
-    function unhideLoadableContent(){
-        hideElement( document.getElementById("loading_msg") );
-        for( var loadable of document.getElementsByClassName("loadable") ) unhideElement(loadable);
-    }
-
-    window.addEventListener("load", unhideLoadableContent);
-</script>
-'
-
-      hide_script = '<script>hideLoadableContent();</script>'
-
-      output.sub! /(?=<\/head>)/, loaded_script
-      output.sub! /(<div id="content")/, '\1' + " " + loadable_class + " "
-      output.sub! /(<div id="content".*?>)/, '\1' + hide_script
-      output.sub! /(?=<div id="content")/, loading_msg + "\n" + "<!--ChunkedSearchboxMarker-->\n"
-    end
-    output
-  end
-end
diff --git a/registry/vulkan/config/makeSubmit.py b/registry/vulkan/config/makeSubmit.py
deleted file mode 100755
index a79c2ef..0000000
--- a/registry/vulkan/config/makeSubmit.py
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright 2016-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-# Build Promoter submission package for a specified extension or extensions.
-# This consists of one spec with the extension(s) and all dependencies,
-# one with just the dependencies, and an htmldiff of them.
-#
-# This script lives in config/, but is executed from the parent directory.
-#
-# Usage: makeSubmit extension targets
-
-import argparse, copy, io, os, pdb, re, string, subprocess, sys
-
-def enQuote(str):
-    return '"' + str + '"'
-
-# Make a single submission target. Several are needed per document.
-#
-# outDir - where to generate intermediate and final documents
-# extensionList - list of extensions to include
-# submitName - base name of final HTML file
-# title - document title
-# target - default 'html'
-def makeTarget(outDir, extensionList, submitName, title, target):
-    print('make clean_generated')
-    print('make OUTDIR=' + outDir,
-          'IMAGEOPTS=',
-          'EXTENSIONS="' + ' '.join(extensionList) + '"',
-          'APITITLE="' + title + '"', target)
-    # Rename into submission directory
-    outFile = outDir + '/html/' + submitName + '.html'
-    print('mv', outDir + '/html/vkspec.html', enQuote(outFile))
-    # No longer needed
-    # print('mv -n', outDir + '/katex', 'out/submit/')
-
-    return outFile
-
-# Make submission for a list of required extension names
-def makeSubmit(submitName, required, target='html'):
-    global extensions
-
-    deps = []
-    for name in required:
-        if name in extensions.keys():
-            for depname in extensions[name]:
-                if (depname not in required and depname not in deps):
-                    deps.append(depname)
-
-    print('echo Required extensions:', ' '.join(required))
-    print('echo Dependent extensions:', ' '.join(deps))
-    print('')
-
-    # Generate shell commands to build the specs
-    outDir = 'submit'
-    print('mkdir -p', outDir)
-
-    # Generate spec with required extensions + dependencies
-    newSpec = makeTarget(outDir, required + deps, submitName,
-                         submitName, target)
-
-    # Generate base spec with just dependencies
-    baseSpec = makeTarget(outDir, deps, 'deps-' + submitName,
-                          '(with only dependencies of ' + submitName + ')',
-                          target)
-
-    # # Reorganize and rename them, and generate the diff spec
-    print('')
-    print('cd scripts/htmldiff')
-    print('./htmldiff',
-          enQuote('../../' + baseSpec),
-          enQuote('../../' + newSpec),
-          '>',
-           enQuote('../../submit/html/diff-' + submitName + '.html'))
-    print('cd ../../')
-
-if __name__ == '__main__':
-    parser = argparse.ArgumentParser()
-
-    parser.add_argument('-extension', action='append',
-                        default=[],
-                        help='Specify a required extension or extensions to add to targets')
-    parser.add_argument('-genpath', action='store',
-                        default='gen',
-                        help='Path to directory containing generated extDependency.py module')
-    parser.add_argument('-title', action='store',
-                        default='vkspec',
-                        help='Set the document title')
-
-    results = parser.parse_args()
-
-    # Look for extDependency.py in the specified directory
-    sys.path.insert(0, results.genpath)
-
-    # Ensure gen/extDependency.py is up-to-date before we import it.
-    subprocess.check_call(['make', 'GENERATED=' + results.genpath, 'extDependency'])
-
-    from extDependency import *
-
-    makeSubmit(results.title, results.extension)
diff --git a/registry/vulkan/config/mathtest.txt b/registry/vulkan/config/mathtest.txt
deleted file mode 100644
index 02ff24d..0000000
--- a/registry/vulkan/config/mathtest.txt
+++ /dev/null
@@ -1,953 +0,0 @@
-// Copyright 2015-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: Apache-2.0
-
-= Math Test
-
-This file (vkmath.txt) contains all the latexmath blocks and inlines in the
-Vulkan spec and style guide, so we can see how they're rendered with
-different methods and output formats.
-
-== File chapters/fundamentals.txt
-
-=== latexmath block 1
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = { c \over { 2^b - 1 } }
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 2
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = \max\left( {c \over {2^{b-1} - 1}}, -1.0 \right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-== File chapters/interfaces.txt
-
-=== latexmath inline 1
-
-latexmath:[(x,y,z,\frac{1}{w})]
-
-=== latexmath inline 2
-
-latexmath:[\frac{1}{w}]
-
-== File chapters/primsrast.txt
-
-=== latexmath block 3
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-s = {1 \over 2} + { \left( x_p - x_f \right) \over \text{size} }
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-t = {1 \over 2} + { \left( y_p - y_f \right) \over \text{size} }
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 4
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-t = {{( \mathbf{p}_r - \mathbf{p}_a ) \cdot ( \mathbf{p}_b - \mathbf{p}_a )}
-    \over {\| \mathbf{p}_b - \mathbf{p}_a \|^2 }}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 5
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = {{ (1-t) {f_a / w_a} + t { f_b / w_b} } \over
-    {(1-t) / w_a + t / w_b }}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 6
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-a = -{1 \over 2}\sum_{i=0}^{n-1}
-      x_f^i y_f^{i \oplus 1} -
-      x_f^{i \oplus 1} y_f^i
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath inline 3
-
-latexmath:[x_f^i] and latexmath:[y_f^i]
-
-=== latexmath block 7
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-a = {{\mathrm{A}(p p_b p_c)} \over {\mathrm{A}(p_a p_b p_c)}}, \quad
-b = {{\mathrm{A}(p p_a p_c)} \over {\mathrm{A}(p_a p_b p_c)}}, \quad
-c = {{\mathrm{A}(p p_a p_b)} \over {\mathrm{A}(p_a p_b p_c)}},
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 8
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = { a {f_a / w_a} + b {f_b / w_b} + c {f_c / w_c} } \over
-    { {a / w_a} + {b / w_b} + {c / w_c} }
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-== File chapters/fundamentals.txt
-
-=== latexmath block 9
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = { c \over { 2^b - 1 } }
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 10
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = \max\left( {c \over {2^{b-1} - 1}}, -1.0 \right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-== File chapters/interfaces.txt
-
-=== latexmath inline 4
-
-latexmath:[(x,y,z,\frac{1}{w})]
-
-=== latexmath inline 5
-
-latexmath:[\frac{1}{w}].
-
-== File chapters/primsrast.txt
-
-=== latexmath block 11
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-s = {1 \over 2} + { \left( x_p - x_f \right) \over \text{size} }
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-t = {1 \over 2} + { \left( y_p - y_f \right) \over \text{size} }
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 12
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-t = {{( \mathbf{p}_r - \mathbf{p}_a ) \cdot ( \mathbf{p}_b - \mathbf{p}_a )}
-    \over {\| \mathbf{p}_b - \mathbf{p}_a \|^2 }}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 13
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = {{ (1-t) {f_a / w_a} + t { f_b / w_b} } \over
-    {(1-t) / w_a + t / w_b }}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 14
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-a = -{1 \over 2}\sum_{i=0}^{n-1}
-      x_f^i y_f^{i \oplus 1} -
-      x_f^{i \oplus 1} y_f^i
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath inline 6
-
-latexmath:[x_f^i] and latexmath:[y_f^i]
-
-=== latexmath block 15
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-a = {{\mathrm{A}(p p_b p_c)} \over {\mathrm{A}(p_a p_b p_c)}}, \quad
-b = {{\mathrm{A}(p p_a p_c)} \over {\mathrm{A}(p_a p_b p_c)}}, \quad
-c = {{\mathrm{A}(p p_a p_b)} \over {\mathrm{A}(p_a p_b p_c)}},
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 16
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = { a {f_a / w_a} + b {f_b / w_b} + c {f_c / w_c} } \over
-    { {a / w_a} + {b / w_b} + {c / w_c} }
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 17
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-f = \sum_{i=1}^{n} a_i f_i
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath inline 7
-
-latexmath:[\sum_{i=1}^{n}a_i = 1].
-
-=== latexmath block 18
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-m = \sqrt{ \left({{\partial z_f} \over {\partial x_f}}\right)^2
-        +  \left({{\partial z_f} \over {\partial y_f}}\right)^2}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 19
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-m = \max\left( \left| {{\partial z_f} \over {\partial x_f}} \right|,
-               \left| {{\partial z_f} \over {\partial y_f}} \right| \right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 20
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-o =
-\begin{cases}
-    m \times depthBiasSlopeFactor +
-         r \times depthBiasConstantFactor  & depthBiasClamp = 0\ or\ NaN \\
-    \min(m \times depthBiasSlopeFactor +
-         r \times depthBiasConstantFactor,
-         depthBiasClamp)                   & depthBiasClamp > 0  \\
-    \max(m \times depthBiasSlopeFactor +
-         r \times depthBiasConstantFactor,
-         depthBiasClamp)                   & depthBiasClamp < 0  \\
-\end{cases}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-== File chapters/tessellation.txt
-
-=== latexmath inline 8
-
-latexmath:[\frac{1}{n}, \frac{2}{n}, \ldots, \frac{n-1}{n}]
-
-== File chapters/textures.txt
-
-=== latexmath block 21
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-N               & = 9  & \text{number of mantissa bits per component} \\
-B               & = 15 & \text{exponent bias} \\
-E_{max}         & = 31 & \text{maximum possible biased exponent value} \\
-sharedexp_{max} & = \frac{(2^N-1)}{2^N} \times 2^{(E_{max}-B)}
-\end{aligned}
-+++++++++++++++++++
-
-=== latexmath block 22
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-exp' =
-  \begin{cases}
-    \left \lfloor \log_2(max_{clamped}) \right \rfloor + (B+1)
-      & \text{for}\  max_{clamped} > 2^{-(B+1)} \\
-    0
-      & \text{for}\  max_{clamped} \leq 2^{-(B+1)}
-  \end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-=== latexmath block 23
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-max_{shared} =
-\left \lfloor
-\frac{max_{clamped}}{2^{(exp'-B-N)}}+\frac{1}{2}
-\right \rfloor
-\end{aligned}
-+++++++++++++++++++
-
-=== latexmath block 24
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-exp_{shared} =
-  \begin{cases}
-    exp'   & \text{for}\  0 \leq max_{shared} < 2^N \\
-    exp'+1 & \text{for}\  max_{shared} = 2^N
-  \end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-=== latexmath block 25
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-red_{shared} & =
-    \left \lfloor
-    \frac{red_{clamped}}{2^{(exp_{shared}-B-N)}}+ \frac{1}{2}
-    \right \rfloor \\
-green_{shared} & =
-    \left \lfloor
-    \frac{green_{clamped}}{2^{(exp_{shared}-B-N)}}+ \frac{1}{2}
-    \right \rfloor \\
-blue_{shared} & =
-    \left \lfloor
-    \frac{blue_{clamped}}{2^{(exp_{shared}-B-N)}}+ \frac{1}{2}
-    \right \rfloor
-\end{aligned}
-+++++++++++++++++++
-
-=== latexmath block 26
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-D & = 1.0 &
-  \begin{cases}
-    D_{ref} \leq D & \text{for LEQUAL}   \\
-    D_{ref} \geq D & \text{for GEQUAL}   \\
-    D_{ref} < D    & \text{for LESS}     \\
-    D_{ref} > D    & \text{for GREATER}  \\
-    D_{ref} = D    & \text{for EQUAL}    \\
-    D_{ref} \neq D & \text{for NOTEQUAL} \\
-    true           & \text{for ALWAYS}   \\
-    false          & \text{for NEVER}
-  \end{cases} \\
-D & = 0.0 & \text{otherwise}
-\end{aligned}
-+++++++++++++++++++
-
-=== latexmath block 27
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-C'_{rgba}[R] & =
-  \begin{cases}
-    C_{rgba}[R] & \text{for RED swizzle}   \\
-    C_{rgba}[G] & \text{for GREEN swizzle} \\
-    C_{rgba}[B] & \text{for BLUE swizzle}  \\
-    C_{rgba}[A] & \text{for ALPHA swizzle} \\
-    0           & \text{for ZERO swizzle}  \\
-    one         & \text{for ONE swizzle} \\
-    C_{rgba}[R] & \text{for IDENTITY swizzle}
-  \end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-=== latexmath block 28
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-C_{rgba}[R] & \text{is the RED component} \\
-C_{rgba}[G] & \text{is the GREEN component} \\
-C_{rgba}[B] & \text{is the BLUE component} \\
-C_{rgba}[A] & \text{is the ALPHA component} \\
-one         & = 1.0\text{f}  & \text{for floating point components} \\
-one         & = 1              & \text{for integer components}
-\end{aligned}
-+++++++++++++++++++
-
-=== latexmath block 29
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-dPdx_{i_1,j_0} & = dPdx_{i_0,j_0} & = P_{i_1,j_0} - P_{i_0,j_0}  \\
-dPdx_{i_1,j_1} & = dPdx_{i_0,j_1} & = P_{i_1,j_1} - P_{i_0,j_1}  \\
-\\
-dPdy_{i_0,j_1} & = dPdy_{i_0,j_0} & = P_{i_0,j_1} - P_{i_0,j_0}  \\
-dPdy_{i_1,j_1} & = dPdy_{i_1,j_0} & = P_{i_1,j_1} - P_{i_1,j_0}
-\end{aligned}
-+++++++++++++++++++
-
-=== latexmath block 30
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-dPdx & =
-  \begin{cases}
-    dPdx_{i_0,j_0} & \text{preferred}\\
-    dPdx_{i_0,j_1}
-  \end{cases} \\
-dPdy & =
-  \begin{cases}
-    dPdy_{i_0,j_0} & \text{preferred}\\
-    dPdy_{i_1,j_0}
-  \end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-=== latexmath block 31
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-s       & = \frac{s}{q},       & \text{for 1D, 2D, or 3D image} \\
-\\
-t       & = \frac{t}{q},       & \text{for 2D or 3D image} \\
-\\
-r       & = \frac{r}{q},       & \text{for 3D image} \\
-\\
-D_{ref} & = \frac{D_{ref}}{q}, & \text{if provided}
-\end{aligned}
-+++++++++++++++++++
-
-
-=== latexmath block 32
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-\partial{s}/\partial{x} & = dPdx(s), & \partial{s}/\partial{y} & = dPdy(s), & \text{for 1D, 2D, Cube, or 3D image} \\
-\partial{t}/\partial{x} & = dPdx(t), & \partial{t}/\partial{y} & = dPdy(t), & \text{for 2D, Cube, or 3D image} \\
-\partial{u}/\partial{x} & = dPdx(u), & \partial{u}/\partial{y} & = dPdy(u), & \text{for Cube or 3D image}
-\end{aligned}
-+++++++++++++++++++
-
-=== latexmath block 33
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-s_{face} & =
-    \frac{1}{2} \times \frac{s_c}{|r_c|} + \frac{1}{2} \\
-t_{face} & =
-    \frac{1}{2} \times \frac{t_c}{|r_c|} + \frac{1}{2} \\
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 34
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\frac{\partial{s_{face}}}{\partial{x}} &=
-    \frac{\partial}{\partial{x}} \left ( \frac{1}{2} \times \frac{s_{c}}{|r_{c}|}
-    + \frac{1}{2}\right ) \\
-\frac{\partial{s_{face}}}{\partial{x}} &=
-    \frac{1}{2} \times \frac{\partial}{\partial{x}}
-    \left ( \frac{s_{c}}{|r_{c}|}  \right ) \\
-\frac{\partial{s_{face}}}{\partial{x}} &=
-    \frac{1}{2} \times
-    \left (
-    \frac{
-      |r_{c}| \times \partial{s_c}/\partial{x}
-      -s_c \times {\partial{r_{c}}}/{\partial{x}}}
-    {\left ( r_{c} \right )^2}
-    \right )
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 35
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\frac{\partial{s_{face}}}{\partial{y}} &=
-    \frac{1}{2} \times
-    \left (
-    \frac{
-      |r_{c}| \times \partial{s_c}/\partial{y}
-      -s_c \times {\partial{r_{c}}}/{\partial{y}}}
-    {\left ( r_{c} \right )^2}
-    \right )\\
-\frac{\partial{t_{face}}}{\partial{x}} &=
-    \frac{1}{2} \times
-    \left (
-    \frac{
-      |r_{c}| \times \partial{t_c}/\partial{x}
-      -t_c \times {\partial{r_{c}}}/{\partial{x}}}
-    {\left ( r_{c} \right )^2}
-    \right ) \\
-\frac{\partial{t_{face}}}{\partial{y}} &=
-    \frac{1}{2} \times
-    \left (
-    \frac{
-       |r_{c}| \times \partial{t_c}/\partial{y}
-      -t_c \times {\partial{r_{c}}}/{\partial{y}}}
-    {\left ( r_{c} \right )^2}
-    \right )
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 36
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\rho_{x} & = \sqrt{ m_{ux} ^{2} + m_{vx} ^{2} + m_{wx} ^{2} } \\
-\rho_{y} & = \sqrt{ m_{uy} ^{2} + m_{vy} ^{2} + m_{wy} ^{2} }
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 37
-
-  {empty}:: [eq]#f~x~# is continuous and monotonically increasing in each of
-     [eq]#m~ux~#, [eq]#m~vx~#, and [eq]#m~wx~#
-  {empty}:: [eq]#f~y~# is continuous and monotonically increasing in each of
-     [eq]#m~uy~#, [eq]#m~vy~#, and [eq]#m~wy~#
-  {empty}:: [eq]#max({vert}m~ux~{vert}, {vert}m~vx~{vert},
-     {vert}m~wx~{vert}) {leq} f~x~ {leq} {vert}m~ux~{vert} {plus}
-     {vert}m~vx~{vert} {plus} {vert}m~wx~{vert}#
-  {empty}:: [eq]#max({vert}m~uy~{vert}, {vert}m~vy~{vert},
-     {vert}m~wy~{vert}) {leq} f~y~ {leq} {vert}m~uy~{vert} {plus}
-     {vert}m~vy~{vert} {plus} {vert}m~wy~{vert}#
-
-=== latexmath block 38
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-N & = \min \left (\left \lceil \frac{\rho_{max}}{\rho_{min}}  \right \rceil ,max_{Aniso} \right )
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 39
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\lambda_{base}(x,y) & =
-  \begin{cases}
-    shaderOp.Lod                                 & \text{(from optional SPIR-V operand)} \\
-    \log_2 \left ( \frac{\rho_{max}}{N} \right ) & \text{otherwise}
-  \end{cases} \\
-\lambda'(x,y)       & = \lambda_{base} + \mathbin{clamp}(sampler.bias + shaderOp.bias,-maxSamplerLodBias,maxSamplerLodBias) \\
-\lambda             & =
-  \begin{cases}
-    lod_{max}, & \lambda' > lod_{max} \\
-    \lambda',  & lod_{min} \leq \lambda' \leq lod_{max} \\
-    lod_{min}, & \lambda' < lod_{min} \\
-    undefined, & lod_{min} > lod_{max} \\
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 40
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-sampler.bias       & = mipLodBias & \text{(from sampler descriptor)} \\
-shaderOp.bias      & =
-  \begin{cases}
-    Bias & \text{(from optional SPIR-V operand)} \\
-    0    & \text{otherwise}
-  \end{cases} \\
-sampler.lod_{min}  & = minLod & \text{(from sampler descriptor)} \\
-shaderOp.lod_{min} & =
-  \begin{cases}
-    MinLod & \text{(from optional SPIR-V operand)} \\
-    0      & \text{otherwise}
-  \end{cases} \\
-\\
-lod_{min}          & = \max(sampler.lod_{min}, shaderOp.lod_{min}) \\
-lod_{max}          & = maxLod & \text{(from sampler descriptor)}
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 41
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-d =
-  \begin{cases}
-    level_{base},     & \lambda \leq \frac{1}{2} \\[.5em]
-    nearest(\lambda), & \lambda > \frac{1}{2},
-                        level_{base} + \lambda \leq
-                        q + \frac{1}{2} \\[.5em]
-    q,                & \lambda > \frac{1}{2},
-                        level_{base} + \lambda > q + \frac{1}{2}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 42
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-nearest(\lambda) & =
-  \begin{cases}
-    \left \lceil level_{base}+\lambda + \frac{1}{2}\right \rceil - 1, &
-        \text{preferred} \\
-    \left \lfloor level_{base}+\lambda + \frac{1}{2}\right \rfloor,   &
-        \text{alternative}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 43
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-d_{hi} & =
-  \begin{cases}
-    q,                                                 & level_{base} + \lambda \geq q \\
-    \left \lfloor level_{base}+\lambda \right \rfloor, & \text{otherwise}
-  \end{cases} \\
-d_{lo} & =
-  \begin{cases}
-    q,        & level_{base} + \lambda \geq q \\
-    d_{hi}+1, & \text{otherwise}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 44
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-u(x,y) & = s(x,y) \times width_{level} \\
-v(x,y) & =
-  \begin{cases}
-    0                         & \text{for 1D images} \\
-    t(x,y) \times height_{level} & \text{otherwise}
-  \end{cases} \\
-w(x,y) & =
-  \begin{cases}
-    0                         & \text{for 2D or Cube images} \\
-    r(x,y) \times depth_{level}  & \text{otherwise}
-  \end{cases} \\
-\\
-a(x,y) & =
-  \begin{cases}
-    a(x,y)                    & \text{for array images} \\
-    0                         & \text{otherwise}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 45
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\mathbin{RNE}(a) & =
-  \begin{cases}
-    \mathbin{roundTiesToEven}(a)                  & \text{preferred, from IEEE Std 754-2008 Floating-Point Arithmetic} \\
-    \left \lfloor a + \frac{1}{2} \right \rfloor & \text{alternative}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 46
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-i &=
-  \begin{cases}
-    i \bmod size                                & \text{for repeat} \\
-    (size-1) - \mathbin{mirror}
-        ((i \bmod (2 \times size)) - size)      & \text{for mirrored repeat} \\
-    \mathbin{clamp}(i,0,size-1)                  & \text{for clamp to edge} \\
-    \mathbin{clamp}(i,-1,size)                   & \text{for clamp to border} \\
-    \mathbin{clamp}(\mathbin{mirror}(i),0,size-1) & \text{for mirror clamp to edge}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-
-=== latexmath block 47
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-& \mathbin{mirror}(n) =
-  \begin{cases}
-    n      & \text{for}\  n \geq 0 \\
-    -(1+n) & \text{otherwise}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 48
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau[R] &= \tau_{i0j1}[level_{base}][comp] \\
-\tau[G] &= \tau_{i1j1}[level_{base}][comp] \\
-\tau[B] &= \tau_{i1j0}[level_{base}][comp] \\
-\tau[A] &= \tau_{i0j0}[level_{base}][comp]
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 49
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau[level_{base}][comp] &=
-  \begin{cases}
-    \tau[level_{base}][R], & \text{for}\  comp = 0 \\
-    \tau[level_{base}][G], & \text{for}\  comp = 1 \\
-    \tau[level_{base}][B], & \text{for}\  comp = 2 \\
-    \tau[level_{base}][A], & \text{for}\  comp = 3
-  \end{cases}\\
-comp & \,\text{from SPIR-V operand Component}
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 50
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau[level] &=
-  \begin{cases}
-     \tau_{ijk}[level], & \text{for 3D image} \\
-     \tau_{ij}[level],  & \text{for 2D or Cube image} \\
-     \tau_{i}[level],   & \text{for 1D image}
-   \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 51
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau_{3D}[level] & = (1-\alpha)(1-\beta)(1-\gamma)\tau_{i0j0k0}[level] \\
-          & \, + (\alpha)(1-\beta)(1-\gamma)\tau_{i1j0k0}[level] \\
-          & \, + (1-\alpha)(\beta)(1-\gamma)\tau_{i0j1k0}[level] \\
-          & \, + (\alpha)(\beta)(1-\gamma)\tau_{i1j1k0}[level]   \\
-          & \, + (1-\alpha)(1-\beta)(\gamma)\tau_{i0j0k1}[level] \\
-          & \, + (\alpha)(1-\beta)(\gamma)\tau_{i1j0k1}[level]   \\
-          & \, + (1-\alpha)(\beta)(\gamma)\tau_{i0j1k1}[level]   \\
-          & \, + (\alpha)(\beta)(\gamma)\tau_{i1j1k1}[level]
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 52
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau_{2D}[level] & = (1-\alpha)(1-\beta)\tau_{i0j0}[level] \\
-          & \, + (\alpha)(1-\beta)\tau_{i1j0}[level] \\
-          & \, + (1-\alpha)(\beta)\tau_{i0j1}[level] \\
-          & \, + (\alpha)(\beta)\tau_{i1j1}[level]
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 53
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau_{1D}[level] & = (1-\alpha)\tau_{i0}[level] \\
-          & \, + (\alpha)\tau_{i1}[level]
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 54
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau[level] &=
-  \begin{cases}
-     \tau_{3D}[level], & \text{for 3D image} \\
-     \tau_{2D}[level], & \text{for 2D or Cube image} \\
-     \tau_{1D}[level], & \text{for 1D image}
-   \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 55
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau &=
-  \begin{cases}
-    \tau[d], & \text{for mip mode BASE or NEAREST} \\
-    (1-\delta)\tau[d_{hi}]+\delta\tau[d_{lo}], & \text{for mip mode LINEAR}
-  \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 56
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau_{2Daniso} & =
-     \frac{1}{N}\sum_{i=1}^{N}
-     {\tau_{2D}\left (
-       u \left ( x - \frac{1}{2} + \frac{i}{N+1} , y \right ),
-         \left ( v \left (x-\frac{1}{2}+\frac{i}{N+1} \right ), y
-\right )
-     \right )},
-     & \text{when}\  \rho_{x} > \rho_{y} \\
-\tau_{2Daniso} &=
-     \frac{1}{N}\sum_{i=1}^{N}
-     {\tau_{2D}\left (
-        u \left  ( x, y - \frac{1}{2} + \frac{i}{N+1} \right ),
-          \left ( v \left (x,y-\frac{1}{2}+\frac{i}{N+1} \right )
-\right )
-     \right )},
-     & \text{when}\  \rho_{y} \geq \rho_{x}
-\end{aligned}
-++++++++++++++++++++++++
-
-== File chapters/vertexpostproc.txt
-
-=== latexmath block 57
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\begin{array}{c}
--w_c \leq x_c \leq w_c \\
--w_c \leq y_c \leq w_c \\
-0 \leq z_c \leq w_c
-\end{array}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 58
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\left(\begin{array}{c}
-x_c \\
-y_c \\
-z_c \\
-w_c
-\end{array}\right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath block 59
-
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-\left(
-        \begin{array}{c}
-                x_d \\
-                y_d \\
-                z_d
-        \end{array}
-\right) =
-\left(
-        \begin{array}{c}
-                \frac{x_c}{w_c} \\
-                \frac{y_c}{w_c} \\
-                \frac{z_c}{w_c}
-        \end{array}
-\right)
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-=== latexmath inline 12
-
-latexmath:[\frac{k}{2^m - 1}]
-
-== File chapters/VK_IMG_filter_cubic/filter_cubic_texel_filtering.txt
-
-=== latexmath block 60
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-cinterp(\tau_0, \tau_1, \tau_2, \tau_3, \omega) =
-\frac{1}{2}
-\begin{bmatrix}1 & \omega & \omega^2 & \omega^3 \end{bmatrix}
-\times
-\begin{bmatrix}
- 0 &  2 &  0 &  0 \\
--1 &  0 &  1 &  0 \\
- 2 & -5 &  4 &  1 \\
--1 &  3 & -3 &  1
-\end{bmatrix}
-\times
-\begin{bmatrix}
-\tau_0 \\
-\tau_1 \\
-\tau_2 \\
-\tau_3
-\end{bmatrix}
-\end{aligned}
-++++++++++++++++++++++++
-
-=== latexmath block 61
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-\tau[level] &=
-  \begin{cases}
-     \tau_{2D}[level], & \text{for 2D image} \\
-     \tau_{1D}[level], & \text{for 1D image}
-   \end{cases}
-\end{aligned}
-++++++++++++++++++++++++
-
-== File chapters/VK_IMG_filter_cubic/filter_cubic_texel_selection.txt
-
-=== latexmath block 62
-
-[latexmath]
-++++++++++++++++++++++++
-\begin{aligned}
-i_{0}  & = \left \lfloor u - \frac{3}{2} \right \rfloor & i_{1} & = i_{0} + 1 & i_{2} & = i_{1} + 1 & i_{3} & = i_{2} + 1 \\[1em]
-j_{0}  & = \left \lfloor u - \frac{3}{2} \right \rfloor & j_{1} & = j_{0} + 1 & j_{2} & = j_{1} + 1 & j_{3} & = j_{2} + 1 \\
-\\
-\alpha & = \mathbin{frac} \left ( u - \frac{1}{2} \right ) \\[1em]
-\beta  & = \mathbin{frac} \left ( v - \frac{1}{2} \right )
-\end{aligned}
-++++++++++++++++++++++++
-
-== File style/writing.txt
-
-=== latexmath inline 13
-
-latexmath:[[0,1\]]
-
-=== latexmath inline 14
-
-latexmath:[\frac{1 - \frac{x}{2}}{x - 1}]
-
-=== latexmath inline 15
-
-latexmath:[\mathbf{c} = t \mathbf{c}_1 + (1-t) \mathbf{c}_2.]
-
-=== latexmath block 63
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-c_{RGB} & =
-  \begin{cases}
-    \frac{c_{sRGB}}{12.92}                              & \text{for}\  c_{sRGB} \leq 0.04045 \\
-    \left ( \frac{c_{sRGB}+0.055}{1.055} \right )^{2.4} & \text{for}\  c_{sRGB} > 0.04045
-  \end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-=== latexmath block 64
-
-[latexmath]
-+++++++++++++++++++
-V =
-  \begin{cases}
-    (-1)^S \times 0.0,                      & E = 0, M = 0     \\
-    (-1)^S \times 2^{-14} \times { M \over 2^{10} },
-                                            & E = 0,  M \neq 0 \\
-    (-1)^S \times 2^{E-15} \times { \left( 1 + { M \over 2^{10} } \right) },
-                                            & 0 < E < 31       \\
-    (-1)^S \times Inf,             & E = 31, M = 0             \\
-    NaN,                           & E = 31, M \neq 0
-  \end{cases}
-+++++++++++++++++++
diff --git a/registry/vulkan/config/optimize-pdf b/registry/vulkan/config/optimize-pdf
deleted file mode 100755
index 2eb2c02..0000000
--- a/registry/vulkan/config/optimize-pdf
+++ /dev/null
@@ -1,99 +0,0 @@
-#!/bin/bash
-
-# Copyright (C) 2014-2016 OpenDevise Inc. and the Asciidoctor Project
-
-# 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.
-
-# Optimizes and compresses the specified PDF using Ghostscript (gs).
-#
-# [NOTE]
-# You need at least Ghostscript 9.10 in order for page labels defined in the
-# PDF to be preserved (e.g., front matter pages numbered using roman numerals).
-
-if [ -z $1 ]; then
-   echo "Please supply a PDF file to optimize"
-   exit 1
-fi
-
-if [ -z $GS ]; then
-  GS=gs
-fi
-
-FILE=$1
-FILE_BASENAME=${FILE%.pdf}
-FILE_OPTIMIZED=$FILE_BASENAME-optimized.pdf
-FILE_PDFMARK=
-if [ -f "$FILE_BASENAME.pdfmark" ]; then
-  FILE_PDFMARK="$FILE_BASENAME.pdfmark"
-fi
-DOWNSAMPLE_IMAGES=true
-if [ -z $IMAGE_DPI ]; then
-  #IMAGE_DPI=150
-  IMAGE_DPI=300
-fi
-
-# /prepress defaults (see http://ghostscript.com/doc/current/Ps2pdf.htm)
-# -d{Color,Gray,Mono}ImageDownsampleType=/Bicubic
-# -dAutoFilter{Color,Gray}Images=true
-# -dOptimize=true
-# -dEmbedAllFonts=true
-# -dSubsetFonts=true
-# -dColorConversionStrategy=/LeaveColorUnchanged
-# -dUCRandBGInfo=/Preserve
-# -dCompressPages=true
-#
-# other unused settings
-# -r72
-#
-# for info about pdfmarks, see http://milan.kupcevic.net/ghostscript-ps-pdf
-#
-# to convert to grayscale, add the following (though doesn't always work)
-#
-# -dProcessColorModel=/DeviceGray \
-# -dColorConversionStrategy=/Gray \
-
-ERRFILE=$FILE_BASENAME-ERRS.optimize
-"$GS" -q -dNOPAUSE -dBATCH -dSAFER -dNOOUTERSAVE \
-  -sDEVICE=pdfwrite \
-  -dPDFSETTINGS=/prepress \
-  -dPrinted=false \
-  -dCannotEmbedFontPolicy=/Warning \
-  -dDownsampleColorImages=$DOWNSAMPLE_IMAGES \
-  -dColorImageResolution=$IMAGE_DPI \
-  -dDownsampleGrayImages=$DOWNSAMPLE_IMAGES \
-  -dGrayImageResolution=$IMAGE_DPI \
-  -dDownsampleMonoImages=$DOWNSAMPLE_IMAGES \
-  -dMonoImageResolution=$IMAGE_DPI \
-  -sOutputFile="$FILE_OPTIMIZED" \
-  "$FILE" $FILE_PDFMARK 2> $ERRFILE
-
-status=$?
-if test $status -ne 0 ; then
-    echo "$0: $GS return status = $status, aborting"
-elif grep -q Error $ERRFILE ; then
-    echo "$0: $GS succeeded but found Error in $ERRFILE (follows), aborting"
-    echo '---------- Errors from $GS ----------'
-    grep Error $ERRFILE
-    echo '-------------------------------------'
-    status=1
-else
-    rm -f $ERRFILE
-fi
-
-exit $status
diff --git a/registry/vulkan/config/rouge-extend-css.rb b/registry/vulkan/config/rouge-extend-css.rb
deleted file mode 100644
index c396216..0000000
--- a/registry/vulkan/config/rouge-extend-css.rb
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-# Khronos overrides for Rouge 'github' theme CSS for accessibility.
-# See (note that this code is evolving, works as of asciidoctor 2.0.12):
-# https://github.com/asciidoctor/asciidoctor/blob/master/lib/asciidoctor/syntax_highlighter/rouge.rb
-
-include ::Asciidoctor
-
-class ExtendedRougeSyntaxHighlighter < (Asciidoctor::SyntaxHighlighter.for 'rouge')
-  register_for 'rouge'
-
-  # Insert rouge stylesheet from super
-  # Then replace many 'github' theme colors for accessibility compliance
-  # It would be better to use rouge's stylesheet factory, if it has one
-  def docinfo location, doc, opts
-    overrides = %(<style>
-/* Khronos overrides for Rouge 'github' theme for accessibility */
-/* Basically everything is overridden, but it's unclear how to add a new Rouge theme */
-/* Codelike overrides */
-pre.rouge .cm, pre.rouge .cp, pre.rouge .c1, pre.rouge .cs,
-pre.rouge .c, pre.rouge .ch, pre.rouge .cd, pre.rouge .cpf,
-pre.rouge .gh, pre.rouge .bp {
-  color: #5f5f5f;
-}
-/* Numberlike overrides */
-pre.rouge .mf, pre.rouge .mh, pre.rouge .il, pre.rouge .mi,
-pre.rouge .mo, pre.rouge .m, pre.rouge .mb, pre.rouge .mx {
-  color: #007f7f;
-}
-/* Namelike overrides */
-pre.rouge .ne, pre.rouge .nf, pre.rouge .fm, pre.rouge .nl {
-  color: #5f0000;
-}
-/* Other things ANDI warns about - unsure of their purposes */
-pre.rouge .go, pre.rouge .gu {
-  color: #727272;
-}
-pre.rouge .sr {
-  color: #008512;
-}
-pre.rouge .na, pre.rouge .nb {
-  color: #007f7f;
-}
-pre.rouge .no, pre.rouge .vc, pre.rouge .vg, pre.rouge .vi,
-pre.rouge .nv, pre.rouge .vm {
-  color: #007f7f;
-}
-pre.rouge .w {
-  color: #727272;
-}
-</style>)
-
-    # super can return either <style> or <link> markup, both work
-    %(#{super}
-#{overrides})
-  end
-end
-
diff --git a/registry/vulkan/config/spec-macros.rb b/registry/vulkan/config/spec-macros.rb
deleted file mode 100644
index 13aa5a1..0000000
--- a/registry/vulkan/config/spec-macros.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright 2016-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-#require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'
-RUBY_ENGINE == 'opal' ? (require 'spec-macros/extension') : (require_relative 'spec-macros/extension')
-
-# All the inline macros we need
-Asciidoctor::Extensions.register do
-    inline_macro CanInlineMacro
-    inline_macro CannotInlineMacro
-    inline_macro MayInlineMacro
-    inline_macro MustInlineMacro
-    inline_macro OptionalInlineMacro
-    inline_macro OptionallyInlineMacro
-    inline_macro RequiredInlineMacro
-    inline_macro ShouldInlineMacro
-    inline_macro ReflinkInlineMacro
-    inline_macro ApiextInlineMacro
-    inline_macro FlinkInlineMacro
-    inline_macro FnameInlineMacro
-    inline_macro FtextInlineMacro
-    inline_macro SnameInlineMacro
-    inline_macro SlinkInlineMacro
-    inline_macro StextInlineMacro
-    inline_macro EnameInlineMacro
-    inline_macro ElinkInlineMacro
-    inline_macro EtextInlineMacro
-    inline_macro PnameInlineMacro
-    inline_macro PtextInlineMacro
-    inline_macro DnameInlineMacro
-    inline_macro DlinkInlineMacro
-    inline_macro TnameInlineMacro
-    inline_macro TlinkInlineMacro
-    inline_macro BasetypeInlineMacro
-    inline_macro CodeInlineMacro
-    inline_macro AttrInlineMacro
-    inline_macro TagInlineMacro
-    inline_macro UndefinedInlineMacro
-end
diff --git a/registry/vulkan/config/spec-macros/extension.rb b/registry/vulkan/config/spec-macros/extension.rb
deleted file mode 100644
index adfe2e2..0000000
--- a/registry/vulkan/config/spec-macros/extension.rb
+++ /dev/null
@@ -1,307 +0,0 @@
-# Copyright 2016-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'
-
-include ::Asciidoctor
-
-# This is the generated map of API interfaces in this spec build
-require 'api.rb'
-$apiNames = APInames.new
-
-class SpecInlineMacroBase < Extensions::InlineMacroProcessor
-    use_dsl
-    using_format :short
-end
-
-class NormativeInlineMacroBase < SpecInlineMacroBase
-    def text
-        'normative'
-    end
-
-    def process parent, target, attributes
-        create_inline parent, :quoted, '<strong class="purple">' + text + '</strong>'
-    end
-end
-
-class LinkInlineMacroBase < SpecInlineMacroBase
-    # Check if a link macro target exists - overridden by specific macros
-    # Default assumption is that it does exist
-    def exists? target
-      return true
-    end
-
-    def process parent, target, attributes
-      if not exists? target
-        # If the macro target isn't in this build, but has an alias,
-        # substitute that alias as the argument.
-        # Otherwise, turn the (attempted) link into text, and complain.
-        if $apiNames.nonexistent.has_key? target
-          oldtarget = target
-          target = $apiNames.nonexistent[oldtarget]
-          msg = 'Rewriting nonexistent link macro target: ' + @name.to_s + ':' + oldtarget + ' to ' + target
-          Asciidoctor::LoggerManager.logger.info msg
-          # Fall through
-        else
-          # Suppress warnings for apiext: macros as this is such a common case
-          if @name.to_s != 'apiext'
-            msg = 'Textifying unknown link macro target: ' + @name.to_s + ':' + target
-            Asciidoctor::LoggerManager.logger.warn msg
-          end
-          return create_inline parent, :quoted, '<code>' + target + '</code>'
-        end
-      end
-
-      if parent.document.attributes['cross-file-links']
-        return Inline.new(parent, :anchor, target, :type => :link, :target => (target + '.html'))
-      else
-        return Inline.new(parent, :anchor, target, :type => :xref, :target => ('#' + target), :attributes => {'fragment' => target, 'refid' => target})
-      end
-    end
-end
-
-class CodeInlineMacroBase < SpecInlineMacroBase
-    def process parent, target, attributes
-        create_inline parent, :quoted, '<code>' + target.gsub('&#8594;', '-&gt;') + '</code>'
-    end
-end
-
-class StrongInlineMacroBase < SpecInlineMacroBase
-    def process parent, target, attributes
-        create_inline parent, :quoted, '<code>' + target.gsub('&#8594;', '-&gt;') + '</code>'
-    end
-end
-
-class ParamInlineMacroBase < SpecInlineMacroBase
-    def process parent, target, attributes
-         create_inline parent, :quoted, '<code>' + target.gsub('&#8594;', '-&gt;') + '</code>'
-    end
-end
-
-class CanInlineMacro < NormativeInlineMacroBase
-    named :can
-    match /can:(\w*)/
-
-    def text
-        'can'
-    end
-end
-
-class CannotInlineMacro < NormativeInlineMacroBase
-    named :cannot
-    match /cannot:(\w*)/
-
-    def text
-        'cannot'
-    end
-end
-
-class MayInlineMacro < NormativeInlineMacroBase
-    named :may
-    match /may:(\w*)/
-
-    def text
-        'may'
-    end
-end
-
-class MustInlineMacro < NormativeInlineMacroBase
-    named :must
-    match /must:(\w*)/
-
-    def text
-        'must'
-    end
-end
-
-class OptionalInlineMacro < NormativeInlineMacroBase
-    named :optional
-    match /optional:(\w*)/
-
-    def text
-        'optional'
-    end
-end
-
-class OptionallyInlineMacro < NormativeInlineMacroBase
-    named :optionally
-    match /optionally:(\w*)/
-
-    def text
-        'optionally'
-    end
-end
-
-class RequiredInlineMacro < NormativeInlineMacroBase
-    named :required
-    match /required:(\w*)/
-
-    def text
-        'required'
-    end
-end
-
-class ShouldInlineMacro < NormativeInlineMacroBase
-    named :should
-    match /should:(\w*)/
-
-    def text
-        'should'
-    end
-end
-
-# Generic reference page link to any entity with an anchor/refpage
-class ReflinkInlineMacro < LinkInlineMacroBase
-    named :reflink
-    match /reflink:(\w+)/
-end
-
-# Link to an extension appendix/refpage
-class ApiextInlineMacro < LinkInlineMacroBase
-    named :apiext
-    match /apiext:(\w+)/
-
-    def exists? target
-        $apiNames.features.has_key? target
-    end
-end
-
-class FlinkInlineMacro < LinkInlineMacroBase
-    named :flink
-    match /flink:(\w+)/
-
-    def exists? target
-        $apiNames.protos.has_key? target
-    end
-end
-
-class FnameInlineMacro < CodeInlineMacroBase
-    named :fname
-    match /fname:(\w+)/
-end
-
-class FtextInlineMacro < CodeInlineMacroBase
-    named :ftext
-    match /ftext:([\w\*]+)/
-end
-
-class SnameInlineMacro < CodeInlineMacroBase
-    named :sname
-    match /sname:(\w+)/
-end
-
-class SlinkInlineMacro < LinkInlineMacroBase
-    named :slink
-    match /slink:(\w+)/
-
-    def exists? target
-        $apiNames.structs.has_key? target or $apiNames.handles.has_key? target
-    end
-end
-
-class StextInlineMacro < CodeInlineMacroBase
-    named :stext
-    match /stext:([\w\*]+)/
-end
-
-class EnameInlineMacro < CodeInlineMacroBase
-    named :ename
-    match /ename:(\w+)/
-
-    def exists? target
-        $apiNames.consts.has_key? target
-    end
-end
-
-class ElinkInlineMacro < LinkInlineMacroBase
-    named :elink
-    match /elink:(\w+)/
-
-    def exists? target
-        $apiNames.enums.has_key? target
-    end
-end
-
-class EtextInlineMacro < CodeInlineMacroBase
-    named :etext
-    match /etext:([\w\*]+)/
-end
-
-# this does not handle any [] at the moment
-
-class PnameInlineMacro < ParamInlineMacroBase
-    named :pname
-    match /pname:(\w+((\.|&#8594;)\w+)*)/
-end
-
-class PtextInlineMacro < ParamInlineMacroBase
-    named :ptext
-    match /ptext:([\w\*]+((\.|&#8594;)[\w\*]+)*)/
-end
-
-class DnameInlineMacro < CodeInlineMacroBase
-    named :dname
-    match /dname:(\w+)/
-end
-
-class DlinkInlineMacro < LinkInlineMacroBase
-    named :dlink
-    match /dlink:(\w+)/
-
-    def exists? target
-        $apiNames.defines.has_key? target
-    end
-end
-
-class TnameInlineMacro < CodeInlineMacroBase
-    named :tname
-    match /tname:(\w+)/
-end
-
-class TlinkInlineMacro < LinkInlineMacroBase
-    named :tlink
-    match /tlink:(\w+)/
-
-    def exists? target
-        $apiNames.flags.has_key? target or
-            $apiNames.funcpointers.has_key? target or
-            $apiNames.defines.has_key? target
-    end
-end
-
-class BasetypeInlineMacro < CodeInlineMacroBase
-    named :basetype
-    match /basetype:(\w+)/
-end
-
-# This doesn't include the full range of code: use
-# It allows imbedded periods (field separators) and wildcards if followed by
-# another word, and an ending wildcard.
-
-class CodeInlineMacro < CodeInlineMacroBase
-    named :code
-    match /code:(\w+([.*]\w+)*\**)/
-end
-
-# The tag: and attr: macros are only used in registry.txt
-
-class TagInlineMacro < StrongInlineMacroBase
-    named :tag
-    match /tag:(\w+)/
-end
-
-class AttrInlineMacro < StrongInlineMacroBase
-    named :attr
-    match /attr:(\w+)/
-end
-
-# Does nothing - just markup that we've considered the use case
-class UndefinedInlineMacro < SpecInlineMacroBase
-    named :undefined
-    match /undefined:/
-
-    def process parent, target, attributes
-        create_inline parent, :quoted, 'undefined'
-    end
-end
diff --git a/registry/vulkan/config/themes/pdf-theme.yml b/registry/vulkan/config/themes/pdf-theme.yml
deleted file mode 100644
index 445573f..0000000
--- a/registry/vulkan/config/themes/pdf-theme.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2020-2021 The Khronos Group Inc.
-# SPDX-License-Identifier: MIT
-
-# Vulkan spec PDF stylesheet
-
-extends: default
-
-# The font handling is equivalent to the bundled default-with-fallback-font-theme.yml,
-# but uses a local copy of the M+ 1p Fallback font until asciidoctor-pdf
-# updates theirs. The local copy includes a few more special characters used
-# in the spec.
-font:
-  catalog:
-    merge: true
-    # M+ 1p supports Latin, Latin-1 Supplement, Latin Extended, Greek, Cyrillic, Vietnamese, Japanese & an assortment of symbols
-    # It also provides arrows for ->, <-, => and <= replacements in case these glyphs are missing from font
-    M+ 1p Fallback: mplus1p-regular-fallback.ttf
-    Noto Emoji: GEM_FONTS_DIR/notoemoji-subset.ttf
-  fallbacks: [M+ 1p Fallback, Noto Emoji]
-
-# Add chapter names to the page footer
-footer:
-  recto:
-    right:
-      content: '{chapter-title} | {page-number}'
-  verso:
-    left:
-      content: '{page-number} | {chapter-title}'
-
-# Add a role for VUID tags
-role:
-  vuid:
-    font_family: $literal_font_family
-    font_size: round($base_font_size * 0.85)
-    font_color: 808080
diff --git a/registry/vulkan/config/tilde_open_block.rb b/registry/vulkan/config/tilde_open_block.rb
deleted file mode 100644
index 0372897..0000000
--- a/registry/vulkan/config/tilde_open_block.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright 2018-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'
-
-include ::Asciidoctor
-
-module Asciidoctor
-
-# This addition to the parser class overrides the "is_delimited_block?"
-# method of the core parser, adding a new block delimiter of "~~~~" for open
-# blocks, which can be extended to an arbitrary number of braces to allow
-# nesting them, which is a limitation of the existing "only two dashes"
-# delimiter: https://github.com/asciidoctor/asciidoctor/issues/1121
-# The choice of tildes is based on comments in that bug.
-
-class Parser
-  # Storing the original method so we can still call it from the overriding
-  # version
-  @OLD_is_delimited_block = method(:is_delimited_block?)
-
-  # Logic here matches the original Parser#is_delimited_block? method, see
-  # there for details of base implementation.
-  def self.is_delimited_block? line, return_match_data = false
-    # Quick check for a single brace character before forwarding to the
-    # original parser method.
-    if line[0] != '~'
-      return @OLD_is_delimited_block.(line, return_match_data)
-    else
-      line_len = line.length
-      if line_len <= 4
-        tip = line
-        tl = line_len
-      else
-        tip = line[0..3]
-        tl = 4
-      end
-
-      # Hardcoded tilde delimiter, since that's the only thing this
-      # function deals with.
-      if tip == '~~~~'
-        # tip is the full line when delimiter is minimum length
-        if tl < 4 || tl == line_len
-          if return_match_data
-            context = :open
-            masq = ['comment', 'example', 'literal', 'listing', 'pass', 'quote', 'sidebar', 'source', 'verse', 'admonition', 'abstract', 'partintro'].to_set
-            BlockMatchData.new(context, masq, tip, tip)
-          else
-            true
-          end
-        elsif %(#{tip}#{tip[-1..-1] * (line_len - tl)}) == line
-          if return_match_data
-            context = :open
-            masq = ['comment', 'example', 'literal', 'listing', 'pass', 'quote', 'sidebar', 'source', 'verse', 'admonition', 'abstract', 'partintro'].to_set
-            BlockMatchData.new(context, masq, tip, line)
-          else
-            true
-          end
-        else
-          nil
-        end
-      else
-        nil
-      end
-    end
-  end
-end
-
-end
diff --git a/registry/vulkan/config/vu-to-json.rb b/registry/vulkan/config/vu-to-json.rb
deleted file mode 100644
index 2940bbc..0000000
--- a/registry/vulkan/config/vu-to-json.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright 2016-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-RUBY_ENGINE == 'opal' ? (require 'vu-to-json/extension') : (require_relative 'vu-to-json/extension')
-
-Extensions.register do
-  preprocessor ValidUsageToJsonPreprocessor
-  treeprocessor ValidUsageToJsonTreeprocessor
-end
diff --git a/registry/vulkan/config/vu-to-json/extension.rb b/registry/vulkan/config/vu-to-json/extension.rb
deleted file mode 100644
index c78cae7..0000000
--- a/registry/vulkan/config/vu-to-json/extension.rb
+++ /dev/null
@@ -1,274 +0,0 @@
-# Copyright 2016-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'
-
-include ::Asciidoctor
-
-module Asciidoctor
-
-class ValidUsageToJsonPreprocessorReader < PreprocessorReader
-  def process_line line
-    if line.start_with?( 'ifdef::VK_', 'ifndef::VK_', 'endif::VK_')
-      # Turn extension ifdefs into list items for when we're processing VU later.
-      return super('* ' + line)
-    else
-      return super(line)
-    end
-  end
-end
-
-# Preprocessor hook to iterate over ifdefs to prevent them from affecting asciidoctor's processing.
-class ValidUsageToJsonPreprocessor < Extensions::Preprocessor
-
-  def process document, reader
-    # Create a new reader to return, which handles turning the extension ifdefs into something else.
-    extension_preprocessor_reader = ValidUsageToJsonPreprocessorReader.new(document, reader.lines)
-
-    detected_vuid_list = []
-    extension_stack = []
-    in_validusage = :outside
-
-    # Despite replacing lines in the overridden preprocessor reader, a
-    # FIXME in Reader#peek_line suggests that this doesn't work, the new lines are simply discarded.
-    # So we just run over the new lines and do the replacement again.
-    new_lines = extension_preprocessor_reader.read_lines().flat_map do | line |
-
-      # Track whether we're in a VU block or not
-      if line.start_with?(".Valid Usage")
-        in_validusage = :about_to_enter  # About to enter VU
-      elsif in_validusage == :about_to_enter and line == '****'
-        in_validusage = :inside   # Entered VU block
-        extension_stack.each
-      elsif in_validusage == :inside and line == '****'
-        in_validusage = :outside   # Exited VU block
-      end
-
-      # Track extensions outside of the VU
-      if in_validusage == :outside and line.start_with?( 'ifdef::VK_', 'ifndef::VK_') and line.end_with?( '[]')
-        extension_stack.push line
-      elsif in_validusage == :outside and line.start_with?( 'endif::VK_')
-        extension_stack.pop
-      end
-
-      if in_validusage == :inside and line == '****'
-        # Write out the extension stack as bullets after this line
-        returned_lines = [line]
-        extension_stack.each do | extension |
-          returned_lines << ('* ' + extension)
-          # Add extra blank line to avoid this item absorbing any markup such as attributes on the next line
-          returned_lines << ''
-        end
-        returned_lines
-      elsif in_validusage == :inside and line.start_with?( 'ifdef::VK_', 'ifndef::VK_', 'endif::VK_') and line.end_with?('[]')
-        # Turn extension ifdefs into list items for when we're processing VU later.
-        ['* ' + line]
-      elsif in_validusage == :outside and line.start_with?( 'ifdef::VK_', 'ifndef::VK_', 'endif::VK_') and line.end_with?('[]')
-        # Remove the extension defines from the new lines, as we've dealt with them
-        []
-      elsif line.match(/\[\[(VUID-([^-]+)-[^\]]+)\]\]/)
-        # Add all the VUIDs into an array to guarantee they're all caught later.
-        detected_vuid_list << line.match(/(VUID-([^-]+)-[^\]]+)/)[0]
-        [line]
-      else
-        [line]
-      end
-    end
-
-    # Stash the detected vuids into a document attribute
-    document.set_attribute('detected_vuid_list', detected_vuid_list.join("\n"))
-
-    # Return a new reader after preprocessing
-    Reader.new(new_lines)
-  end
-end
-
-require 'json'
-class ValidUsageToJsonTreeprocessor < Extensions::Treeprocessor
-  def process document
-    map = {}
-
-    # Get the global vuid list
-    detected_vuid_list = document.attr('detected_vuid_list').split("\n")
-
-    map['version info'] = {
-      'schema version' => 2,
-      'api version' => document.attr('revnumber'),
-      'comment' => document.attr('revremark'),
-      'date' => document.attr('revdate')
-    }
-
-    map['validation'] = {}
-
-    error_found = false
-
-    # Need to find all valid usage blocks within a structure or function ref page section
-
-    # This is a list of all refpage types that may contain VUs
-    vu_refpage_types = [
-            'builtins',
-            'funcpointers',
-            'protos',
-            'spirv',
-            'structs',
-        ]
-
-    # Find all the open blocks
-    (document.find_by context: :open).each do |openblock|
-      # Filter out anything that's not a refpage
-      if openblock.attributes['refpage']
-        if vu_refpage_types.include? openblock.attributes['type']
-          parent = openblock.attributes['refpage']
-          # Find all the sidebars
-          (openblock.find_by context: :sidebar).each do |sidebar|
-            # Filter only the valid usage sidebars
-            if sidebar.title == "Valid Usage" || sidebar.title == "Valid Usage (Implicit)"
-              extensions = []
-              # There should be only one block - but just in case...
-              sidebar.blocks.each do |list|
-                # Iterate through all the items in the block, tracking which extensions are enabled/disabled.
-
-                attribute_replacements = list.attributes[:attribute_entries]
-
-                list.blocks.each do |item|
-                  if item.text.start_with?('ifdef::VK_')
-                    extensions << '(' + item.text[('ifdef::'.length)..-3] + ')'                # Look for "ifdef" directives and add them to the list of extensions
-                  elsif item.text.start_with?('ifndef::VK_')
-                    extensions << '!(' + item.text[('ifndef::'.length)..-3] + ')'              # Ditto for "ifndef" directives
-                  elsif item.text.start_with?('endif::VK_')
-                    extensions.slice!(-1)                                                      # Remove the last element when encountering an endif
-                  else
-                    item_text = item.text.clone
-
-                    # Replace the refpage if it's present
-                    item_text.gsub!(/\{refpage\}/i, parent)
-
-                    # Replace any attributes specified on the list (e.g. stageMask)
-                    if attribute_replacements
-                      attribute_replacements.each do |replacement|
-                        replacement_str = '\{' + replacement.name + '\}'
-                        replacement_regex = Regexp.new(replacement_str, Regexp::IGNORECASE)
-                        item_text.gsub!(replacement_regex, replacement.value)
-                      end
-                    end
-
-                    match = nil
-                    if item.text == item_text
-                      # The VUID will have been converted to a href in the general case, so find that
-                      match = /<a id=\"(VUID-[^"]+)\"[^>]*><\/a>(.*)/m.match(item_text)
-                    else
-                      # If we're doing manual attribute replacement, have to find the text of the anchor
-                      match = /\[\[(VUID-[^\]]+)\]\](.*)/m.match(item_text) # Otherwise, look for the VUID.
-                    end
-
-                    if (match != nil)
-                      vuid     = match[1]
-                      text     = match[2].gsub("\n", ' ')  # Have to forcibly remove newline characters; for some reason they're translated to the literally '\n' when converting to json.
-
-                      # Delete the vuid from the detected vuid list, so we know it's been extracted successfully
-                      if item.text == item_text
-                        # Simple if the item text hasn't been modified
-                        detected_vuid_list.delete(match[1])
-                      else
-                        # If the item text has been modified, get the vuid from the unmodified text
-                        detected_vuid_list.delete(/\[\[(VUID-([^-]+)-[^\]]+)\]\](.*)/m.match(item.text)[1])
-                      end
-
-                      # Generate the table entry
-                      entry = {'vuid' => vuid, 'text' => text}
-
-                      # Initialize the database if necessary
-                      if map['validation'][parent] == nil
-                        map['validation'][parent] = {}
-                      end
-
-                      # Figure out the name of the section the entry will be added in
-                      if extensions == []
-                        entry_section = 'core'
-                      else
-                        entry_section = extensions.join('+')
-                      end
-
-                      # Initialize the entry section if necessary
-                      if map['validation'][parent][entry_section] == nil
-                        map['validation'][parent][entry_section] = []
-                      end
-
-                      # Check for duplicate entries
-                      if map['validation'][parent][entry_section].include? entry
-                        error_found = true
-                        puts "VU Extraction Treeprocessor: ERROR - Valid Usage statement '#{entry}' is duplicated in the specification with VUID '#{vuid}'."
-                      end
-
-                      # Add the entry
-                      map['validation'][parent][entry_section] << entry
-
-                    else
-                      puts "VU Extraction Treeprocessor: WARNING - Valid Usage statement without a VUID found: "
-                      puts item_text
-                    end
-                  end
-                end
-              end
-            end
-          end
-
-        end
-      end
-    end
-
-    # Print out a list of VUIDs that were not extracted
-    if detected_vuid_list.length != 0
-      error_found = true
-      puts 'VU Extraction Treeprocessor: ERROR - Extraction failure'
-      puts
-      puts 'Some VUIDs were not successfully extracted from the specification.'
-      puts 'This is usually down to them appearing outside of a refpage (open)'
-      puts 'block; try checking where they are included.'
-      puts 'The following VUIDs were not extracted:'
-      detected_vuid_list.each do |vuid|
-        puts "\t * " + vuid
-      end
-    end
-
-    # Generate the json
-    json = JSON.pretty_generate(map)
-    outfile = document.attr('json_output')
-
-    # Verify the json against the schema, if the required gem is installed
-    begin
-      require 'json-schema'
-
-      # Read the schema in and validate against it
-      schema = IO.read(File.join(File.dirname(__FILE__), 'vu_schema.json'))
-      errors = JSON::Validator.fully_validate(schema, json, :errors_as_objects => true)
-
-      # Output errors if there were any
-      if errors != []
-        error_found = true
-        puts 'VU Extraction JSON Validator: ERROR - Validation of the json schema failed'
-        puts
-        puts 'It is likely that there is an invalid or malformed entry in the specification text,'
-        puts 'see below error messages for details, and use their VUIDs and text to correlate them to their location in the specification.'
-        puts
-
-        errors.each do |error|
-          puts error.to_s
-        end
-      end
-    rescue LoadError
-      puts 'VU Extraction JSON Validator: WARNING - "json-schema" gem missing - skipping verification of json output'
-      # error handling code here
-    end
-
-    # Write the file and exit - no further processing required.
-    IO.write(outfile, json)
-
-    if (error_found)
-      exit! 1
-    end
-    exit! 0
-  end
-end
-end
diff --git a/registry/vulkan/config/vu-to-json/vu_schema.json b/registry/vulkan/config/vu-to-json/vu_schema.json
deleted file mode 100644
index 23b248f..0000000
--- a/registry/vulkan/config/vu-to-json/vu_schema.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-	"$schema": "http://json-schema.org/draft-04/schema#",
-	"title": "Command and Structure Validation in Vulkan",
-	"description": "A database of validatable commands and structures in the Vulkan API",
-	"type": "object",
-	"additionalProperties": false,
-	"properties": {
-		"version info": {
-			"additionalProperties": false,
-			"properties": { 
-				"schema version": {"type": "integer", "const": 2},
-				"api version": {"type": "string"},
-				"comment": {"type": "string"},
-				"date": {"type": "string"}
-			},
-			"required": [
-				"schema version",
-				"api version",
-				"comment",
-				"date"
-			]
-		},
-		"validation": {
-			"patternProperties": {
-				"^[vV]k[A-Z][A-Za-z0-9]+$": {
-					"title": "Vulkan Command or Structure",
-					"description": "Validation information for a structure or command in the Vulkan API",
-					"patternProperties": {
-						"^[\\w+!|]+$": {
-							"type": "array",
-							"uniqueItems": true,
-							"minItems": 1,
-							"items":
-							{
-								"title": "Valid Usage Statement",
-								"description": "A valid usage statement",
-								"type": "object",
-								"additionalProperties": false,
-								"properties": {
-									"vuid": {
-										"title": "Valid Usage ID",
-										"description": "String identifier for a valid usage statement, corresponding to an anchor in the spec for that statement",
-										"type": "string",
-										"pattern": "VUID-[vV]k[A-Z][A-Za-z0-9]+-[A-Za-z0-9-]*[A-Za-z0-9]"
-									},
-									"text": {
-										"title": "Valid Usage Text",
-										"description": "HTML formatted string of the valid usage statement text",
-										"type": "string"
-									}
-								},
-								"required": [
-									"vuid",
-									"text"
-								]
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/registry/vulkan/config/vuid-expander.rb b/registry/vulkan/config/vuid-expander.rb
deleted file mode 100644
index e279b1b..0000000
--- a/registry/vulkan/config/vuid-expander.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2020-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'
-
-include ::Asciidoctor
-
-class VUIDExpanderTreeprocessor < Extensions::Treeprocessor
-  def process document
-    # Find all list items inside Valid Usage sidebar blocks
-    document.find_by(context: :sidebar).each do |sidebar|
-      # Get sidebar title from instance variable to avoid side-effects from substitutions
-      if sidebar.title? and sidebar.instance_variable_get(:@title).start_with? "Valid Usage"
-        sidebar.find_by(context: :list_item) do |item|
-            # Get item text directly from instance variable to avoid inline substitutions
-            original_text = item.instance_variable_get(:@text)
-            # Find VUID anchor and append with matching VUID-styled text and line break
-            item.text = original_text.gsub(/(\[\[(VUID-[^\]]*)\]\])/, "\\1 [vuid]#\\2# +\n")
-        end
-      end
-    end
-    nil
-  end
-end
-
-Extensions.register do
-  treeprocessor VUIDExpanderTreeprocessor
-end
diff --git a/registry/vulkan/gen-script-docs.sh b/registry/vulkan/gen-script-docs.sh
deleted file mode 100755
index ef65d53..0000000
--- a/registry/vulkan/gen-script-docs.sh
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/bin/sh
-# Copyright 2019-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-# Generate documentation for the python scripts in this repo, using pdoc3:
-# https://pdoc3.github.io/pdoc/
-#
-# Output is under out/python-docs
-
-set -e
-
-# Pipe in some paths. We'll convert them to module names and document them.
-pathsToDocs() {
-    grep -v "test_" | \
-    grep -v "__init__.py" | \
-    sed -e 's/[.]py//' -e 's:/:.:g' | \
-    xargs --verbose pdoc3 --html --force --output-dir $1
-}
-
-# Main body of script
-(
-    cd $(dirname $0)
-    # Needed to complete the build - can't import genRef.py without it.
-    make gen/api.py
-
-    SPECDIR=$(pwd)
-    OUTDIR=$(pwd)/out/python-docs
-    INDEX=$OUTDIR/index.html
-    mkdir -p $OUTDIR
-    cp scripts/__init__.py.docs scripts/__init__.py
-    export PYTHONPATH=${SPECDIR}/scripts
-    (
-        # # scripts under specification
-        cd $SPECDIR/scripts
-        ls *.py
-
-        # Generate the index files
-        # echo "scripts"
-        echo "scripts.spec_tools"
-
-    ) | pathsToDocs $OUTDIR
-
-    # Generate a simple index file, since generating one with pdoc3 chokes on the Retired directory.
-    echo "<html><body><h1>Python modules</h2><ul>" > $INDEX
-    (
-        cd $SPECDIR/scripts
-        ls *.py
-    ) | while read -r fn; do
-        MODNAME=$(echo $fn | sed -r  's/([a-zA-Z_]+)([.]py)?/\1/')
-        if [ -f $OUTDIR/$MODNAME.html ]; then
-            # Only make non-dead links
-            echo "<li><a href=$MODNAME.html>$MODNAME</a></li>" >> $INDEX
-        fi
-    done
-    echo "<li><a href=spec_tools/index.html>spec_tools</a></li>" >> $INDEX
-    echo "</ul></body></html>" >> $INDEX
-
-    # Move index files to a more useful place
-    rm -rf $OUTDIR/spec_tools
-    mv $OUTDIR/scripts/spec_tools $OUTDIR/spec_tools
-    # delete duplicate generated files
-    rm -rf $OUTDIR/scripts
-
-    rm -f scripts/__init__.py
-)
diff --git a/registry/vulkan/images/DecodeSessionDpbDecodeWithOutputToReferencePictureSlot.svg b/registry/vulkan/images/DecodeSessionDpbDecodeWithOutputToReferencePictureSlot.svg
deleted file mode 100644
index f58a57d..0000000
--- a/registry/vulkan/images/DecodeSessionDpbDecodeWithOutputToReferencePictureSlot.svg
+++ /dev/null
@@ -1,696 +0,0 @@
-<?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"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.1"
-   id="svg2"
-   xml:space="preserve"
-   width="690"
-   height="400"
-   viewBox="32 80 690 400"><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"><linearGradient
-       id="linearGradient14225"><stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop14227" /><stop
-         style="stop-color:#000000;stop-opacity:0;"
-         offset="1"
-         id="stop14229" /></linearGradient><marker
-       style="overflow:visible"
-       id="marker10521"
-       refX="0"
-       refY="0"
-       orient="auto"><path
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         id="path10523" /></marker><marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker10431"
-       style="overflow:visible"><path
-         id="path10433"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" /></marker><marker
-       style="overflow:visible"
-       id="marker9980"
-       refX="0"
-       refY="0"
-       orient="auto"><path
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         id="path9982" /></marker><marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9848"
-       style="overflow:visible"><path
-         id="path9850"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" /></marker><marker
-       style="overflow:visible"
-       id="marker9520"
-       refX="0"
-       refY="0"
-       orient="auto"><path
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         id="path9522" /></marker><marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9422"
-       style="overflow:visible"><path
-         id="path9424"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" /></marker><marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9412"
-       style="overflow:visible"><path
-         id="path9414"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" /></marker><marker
-       style="overflow:visible"
-       id="Arrow1Send"
-       refX="0"
-       refY="0"
-       orient="auto"><path
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         id="path8951" /></marker><clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath404"><path
-         d="M 1.4305e-5,0 960.00001,0 l 0,540 L 1.4305e-5,540 Z"
-         id="path402"
-         style="clip-rule:evenodd" /></clipPath><linearGradient
-       xlink:href="#linearGradient14225"
-       id="linearGradient14233"
-       x1="532"
-       y1="350"
-       x2="592"
-       y2="350"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-50,-70.000014)" /><marker
-       style="overflow:visible"
-       id="marker9980-1"
-       refX="0"
-       refY="0"
-       orient="auto"><path
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         id="path9982-1" /></marker></defs><rect
-     y="199.99998"
-     x="42"
-     height="160"
-     width="520"
-     id="rect10661"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="100.1"
-     x="572"
-     height="79.900002"
-     width="140"
-     id="rect10415"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="229.99998"
-     x="332"
-     height="110"
-     width="30"
-     id="rect8500-7"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><path
-     style="fill:#cccccc;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     d="m 342,145 0,75 -5,0 10,10 10,-10 -5,0 0,-75 210,0 0,5 10,-10 -10,-10 0,5 -250,0 0,10 z"
-     id="path14627" /><rect
-     y="90"
-     x="192"
-     height="100"
-     width="120"
-     id="rect9622"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><path
-     id="path9624"
-     d="m 312,140 -50,-50 0,30 -70,0 0,40 70,0 0,30 50,-50"
-     style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
-     style="fill:#cccccc;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     d="m 72,230 0,-60 110,0 0,-5 10,10 -10,10 0,-5 -10,0 0,50 -10,0 0,-50 -50,0 0,50 -10,0 0,-50 -20,0 0,50 -10,0"
-     id="path14625" /><rect
-     y="229.99998"
-     x="62"
-     height="110"
-     width="30"
-     id="rect8498"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="229.99998"
-     x="92"
-     height="110"
-     width="30"
-     id="rect8500"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="229.99998"
-     x="122"
-     height="110"
-     width="30"
-     id="rect8502"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="229.99998"
-     x="152"
-     height="110"
-     width="30"
-     id="rect8504"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="229.99998"
-     x="182"
-     height="110"
-     width="30"
-     id="rect8506"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="229.99998"
-     x="212"
-     height="110"
-     width="30"
-     id="rect8508"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="229.99998"
-     x="242"
-     height="110"
-     width="30"
-     id="rect8510"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="229.99998"
-     x="272"
-     height="110"
-     width="30"
-     id="rect8512"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="229.99998"
-     x="302"
-     height="110"
-     width="30"
-     id="rect8498-2"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     ry="0"
-     y="229.99998"
-     x="362"
-     height="110"
-     width="30"
-     id="rect8502-0"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="229.99998"
-     x="392"
-     height="110"
-     width="30"
-     id="rect8504-9"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="229.99998"
-     x="422"
-     height="110"
-     width="30"
-     id="rect8506-3"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="229.99998"
-     x="452"
-     height="110"
-     width="30"
-     id="rect8508-6"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><path
-     style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient14233);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     d="m 480,227.99999 0,2 0,112 30,0 4,0 30,0 0,-114 -30,0 -4,0 -30,0 z m 4,4 26,0 0,106 -26,0 0,-106 z m 30,0 26,0 0,106 -26,0 0,-106 z"
-     id="rect8510-0" /><text
-     id="text8569"
-     y="329.9996"
-     x="77.007317"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="329.9996"
-       x="76.907318"
-       id="tspan8571">0</tspan></text>
-<text
-     id="text8577"
-     y="329.9996"
-     x="106.87183"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="329.9996"
-       x="106.77182"
-       id="tspan8579">1</tspan></text>
-<text
-     id="text8581"
-     y="329.9996"
-     x="137.20508"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="329.9996"
-       x="137.10507"
-       id="tspan8583">2</tspan></text>
-<text
-     id="text8585"
-     y="329.9996"
-     x="167.03296"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="329.9996"
-       x="166.93295"
-       id="tspan8587">3</tspan></text>
-<text
-     id="text8589"
-     y="329.9996"
-     x="197.05859"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="329.9996"
-       x="196.95859"
-       id="tspan8591">4</tspan></text>
-<text
-     id="text8593"
-     y="329.9996"
-     x="227.08057"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="329.9996"
-       x="226.98056"
-       id="tspan8595">5</tspan></text>
-<text
-     id="text8597"
-     y="329.9996"
-     x="256.95239"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="329.9996"
-       x="256.85239"
-       id="tspan8599">6</tspan></text>
-<text
-     id="text8601"
-     y="329.9996"
-     x="287.0293"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="329.9996"
-       x="286.92929"
-       id="tspan8603">7</tspan></text>
-<text
-     id="text8605"
-     y="329.9996"
-     x="317.00732"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="329.9996"
-       x="316.90732"
-       id="tspan8607">8</tspan></text>
-<text
-     id="text8609"
-     y="329.9996"
-     x="347.05859"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="329.9996"
-       x="346.95859"
-       id="tspan8611">9</tspan></text>
-<text
-     id="text8613"
-     y="329.9996"
-     x="376.67773"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="329.9996"
-       x="376.57773"
-       id="tspan8615">.</tspan></text>
-<text
-     id="text8617"
-     y="329.9996"
-     x="406.87183"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="329.9996"
-       x="406.77182"
-       id="tspan8619">.</tspan></text>
-<text
-     id="text8621"
-     y="329.9996"
-     x="436.93042"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       style="letter-spacing:0px"
-       y="329.9996"
-       x="436.83041"
-       id="tspan8623">.</tspan></text>
-<text
-     id="text8625"
-     y="329.9996"
-     x="466.78027"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       style="letter-spacing:0px"
-       y="329.9996"
-       x="466.6803"
-       id="tspan8627">.</tspan></text>
-<text
-     id="text8629"
-     y="329.9996"
-     x="496.60083"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       style="letter-spacing:0px"
-       y="329.9996"
-       x="496.50085"
-       id="tspan8631">.</tspan></text>
-<text
-     id="text8633"
-     y="329.9996"
-     x="526.83521"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       style="letter-spacing:0px"
-       y="329.9996"
-       x="526.73523"
-       id="tspan8635">.</tspan></text>
-<text
-     id="text8871"
-     y="219.99998"
-     x="247.57275"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       style="font-size:17.5px;letter-spacing:0px"
-       y="219.99998"
-       x="247.47275"
-       id="tspan8873">Dpb slots</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:-0.2px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#b3b3b3;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;"
-     x="167.56763"
-     y="270"
-     id="text14174-3"><tspan
-       id="tspan14176-4"
-       x="167.46762"
-       y="270"
-       style="text-align:center;text-anchor:middle;stroke:#b3b3b3;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stroke-linejoin:round;">Valid picture</tspan><tspan
-       x="167.46762"
-       y="301.25"
-       id="tspan14178-0"
-       style="text-align:center;text-anchor:middle;stroke:#b3b3b3;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stroke-linejoin:round;">references</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:-0.2px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="167.56763"
-     y="270"
-     id="text14174"><tspan
-       id="tspan14176"
-       x="167.46762"
-       y="270"
-       style="text-align:center;text-anchor:middle">Valid picture</tspan><tspan
-       x="167.46762"
-       y="301.25"
-       id="tspan14178"
-       style="text-align:center;text-anchor:middle">references</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;"
-     x="406.57883"
-     y="269.7695"
-     id="text14180-3"><tspan
-       id="tspan14182-9"
-       x="406.47882"
-       y="269.7695">Unused picture</tspan><tspan
-       x="406.47882"
-       y="301.0195"
-       id="tspan14184-1">references</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="406.57886"
-     y="269.7695"
-     id="text14180"><tspan
-       id="tspan14182"
-       x="406.47885"
-       y="269.7695">Unused picture</tspan><tspan
-       x="406.47885"
-       y="301.0195"
-       id="tspan14184">references</tspan></text>
-<g
-     transform="matrix(1.3333333,0,0,-1.3333333,-212.33581,674.35391)"
-     id="g398"><g
-       clip-path="url(#clipPath404)"
-       id="g400" /></g><text
-     id="text8573"
-     y="460"
-     x="142"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="460"
-       x="142"
-       id="tspan8575" /></text>
-<rect
-     y="380"
-     x="62"
-     height="30"
-     width="30"
-     id="rect8920"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="380"
-     x="92"
-     height="30"
-     width="30"
-     id="rect8922"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><path
-     id="path8926"
-     d="m 77,379.99999 0,-32"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9422)" /><path
-     id="path8928"
-     d="m 107,379.99999 0,-32"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send)" /><path
-     id="path8930"
-     d="m 137,379.99999 0,-10 30,0 0,-22"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9412)" /><rect
-     y="380"
-     x="122"
-     height="30"
-     width="30"
-     id="rect8924"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     y="380"
-     x="532.00012"
-     height="30"
-     width="30"
-     id="rect9510"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><path
-     id="path9512"
-     d="m 547,379.99999 0,-10 -200,0 0,-22"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9520)" /><text
-     id="text9614"
-     y="401.5242"
-     x="295.31128"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       style="font-size:17.5px;letter-spacing:0px"
-       y="401.5242"
-       x="295.31128"
-       id="tspan9616">VkVideoReferenceSlotsKHRs</tspan></text>
-<text
-     id="text9626"
-     y="149.32007"
-     x="247.53848"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       style="letter-spacing:0px"
-       y="149.32007"
-       x="247.43848"
-       id="tspan9628">Decode</tspan></text>
-<text
-     id="text9964"
-     y="388"
-     x="486.00012"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       style="font-size:17.5px;letter-spacing:0px"
-       y="388"
-       x="485.90012"
-       id="tspan9966">slotIndex</tspan></text>
-<text
-     id="text9968"
-     y="260"
-     x="222"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="260"
-       x="222"
-       id="tspan9970" /></text>
-<path
-     id="path9972"
-     d="m 192,434.99998 -115,0 0,-16"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9980)" /><text
-     id="text10056"
-     y="452.80588"
-     x="117.51691"
-     style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:17.5px;line-height:125%;font-family:sans-serif;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:middle;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     xml:space="preserve"><tspan
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:17.5px;line-height:125%;font-family:sans-serif;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:middle;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       y="452.80588"
-       x="117.4169"
-       id="tspan10058">pReferenceSlots</tspan></text>
-<text
-     id="text10411"
-     y="710.146"
-     x="-323.39304"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"
-     transform="matrix(0,-1,1,0,0,0)"><tspan
-       style="font-size:17.5px;letter-spacing:0px"
-       y="710.146"
-       x="-323.49304"
-       id="tspan10413">dstPictureResource</tspan></text>
-<text
-     id="text10417"
-     y="131.32198"
-     x="642.00842"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       style="letter-spacing:0px"
-       y="131.32198"
-       x="641.90845"
-       id="tspan10419">Decoded</tspan><tspan
-       style="letter-spacing:0px"
-       id="tspan10421"
-       y="162.57198"
-       x="641.90845">image</tspan></text>
-<path
-     id="path10513"
-     d="m 562,395 30,0 0,-206"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:12, 4;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker10521)" /><text
-     id="text10657"
-     y="583.05688"
-     x="-289.40112"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"
-     transform="matrix(0,-1,1,0,0,0)"><tspan
-       style="font-size:17.5px;letter-spacing:0px"
-       y="583.05688"
-       x="-289.5011"
-       id="tspan10659">pPictureResource</tspan></text>
-<text
-     id="text10706"
-     y="245.99998"
-     x="606"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       style="font-style:italic;font-size:15px;letter-spacing:0px"
-       y="245.99998"
-       x="606"
-       id="tspan10708">Only if</tspan><tspan
-       id="tspan10756"
-       style="font-style:italic;font-size:15px;letter-spacing:0px"
-       y="264.75"
-       x="606">the same</tspan><tspan
-       style="font-style:italic;font-size:15px;letter-spacing:0px"
-       id="tspan10710"
-       y="283.5"
-       x="606">picture</tspan><tspan
-       style="font-style:italic;font-size:15px;letter-spacing:0px"
-       id="tspan10712"
-       y="302.25"
-       x="606">resource</tspan><tspan
-       style="font-style:italic;font-size:15px;letter-spacing:0px"
-       id="tspan10714"
-       y="321"
-       x="606">is used</tspan><tspan
-       id="tspan10762"
-       style="font-style:italic;font-size:15px;letter-spacing:0px"
-       y="339.75"
-       x="606">for the</tspan><tspan
-       style="font-style:italic;font-size:15px;letter-spacing:0px"
-       id="tspan10716"
-       y="358.5"
-       x="606">decode</tspan><tspan
-       id="tspan10760"
-       style="font-style:italic;font-size:15px;letter-spacing:0px"
-       y="377.25"
-       x="606">Dpb and</tspan><tspan
-       style="font-style:italic;font-size:15px;letter-spacing:0px"
-       id="tspan10718"
-       y="396"
-       x="606">output</tspan><tspan
-       style="font-style:italic;font-size:15px;letter-spacing:0px"
-       id="tspan10720"
-       y="414.75"
-       x="606">image</tspan></text>
-<path
-     id="path10722"
-     d="m 592,210 20,19.99999"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:4,4;stroke-dashoffset:0" /><rect
-     ry="0"
-     y="229.99998"
-     x="602"
-     height="192"
-     width="79"
-     id="rect10758"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:4,4;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect14235"
-     width="240"
-     height="30"
-     x="192"
-     y="420" /><text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="312.18799"
-     y="441.52405"
-     id="text14237"><tspan
-       id="tspan14239"
-       x="312.08798"
-       y="441.52405"
-       style="font-size:17.5px;text-align:center;text-anchor:middle">VkVideoDecodeInfoKHR</tspan></text>
-<text
-     id="text10056-1"
-     y="452.80588"
-     x="527.51691"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       style="font-size:17.5px;letter-spacing:0px"
-       y="452.80588"
-       x="527.41687"
-       id="tspan10058-3">pSetupReferenceSlot</tspan></text>
-<path
-     id="path9972-0"
-     d="m 432,434.99998 115,0 0,-16"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9980-1)" /><path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker10521)"
-     d="m 312,450 0,20 380,0 0,-282"
-     id="path14623" /><path
-     style="fill:#cccccc;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     d="m 182,100 0,-5 10,10 -10,10 0,-5 -20,0 0,-10 z"
-     id="path14629" /><g
-     transform="translate(-1.3165542,0)"
-     id="g10096"><path
-       d="m 39.766092,94.146902 c 0,-5.92 27.68666,-10.72 61.839998,-10.72 34.14666,0 61.84,4.8 61.84,10.72 l 0,42.879988 c 0,5.92 -27.69334,10.72 -61.84,10.72 -34.153338,0 -61.839998,-4.8 -61.839998,-10.72 z"
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       id="path392" /><path
-       d="m 163.44609,94.146902 c 0,5.919998 -27.69334,10.719988 -61.84,10.719988 -34.153338,0 -61.839998,-4.79999 -61.839998,-10.719988"
-       style="fill:none;stroke:#000000;stroke-width:1.27999997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
-       id="path394" /><path
-       d="m 39.766092,94.146902 c 0,-5.92 27.68666,-10.72 61.839998,-10.72 34.14666,0 61.84,4.8 61.84,10.72 l 0,42.879988 c 0,5.92 -27.69334,10.72 -61.84,10.72 -34.153338,0 -61.839998,-4.8 -61.839998,-10.72 z"
-       style="fill:none;stroke:#000000;stroke-width:1.27999997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
-       id="path396" /><text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="101.2219"
-       y="130.51297"
-       id="text10060"><tspan
-         style="letter-spacing:0px"
-         id="tspan10062"
-         x="101.1219"
-         y="130.51297">Bitstream</tspan></text>
-</g></svg>
diff --git a/registry/vulkan/images/DecodeSessionDpbDecodeWithOutputToVkImageViewNoReferencePictureSlotUpdate.svg b/registry/vulkan/images/DecodeSessionDpbDecodeWithOutputToVkImageViewNoReferencePictureSlotUpdate.svg
deleted file mode 100644
index f2b7d22..0000000
--- a/registry/vulkan/images/DecodeSessionDpbDecodeWithOutputToVkImageViewNoReferencePictureSlotUpdate.svg
+++ /dev/null
@@ -1,593 +0,0 @@
-<?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"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   viewBox="32 80 690 400"
-   height="400"
-   width="690"
-   xml:space="preserve"
-   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"><linearGradient
-       id="linearGradient14225"><stop
-         id="stop14227"
-         offset="0"
-         style="stop-color:#000000;stop-opacity:1;" /><stop
-         id="stop14229"
-         offset="1"
-         style="stop-color:#000000;stop-opacity:0;" /></linearGradient><marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker10521"
-       style="overflow:visible"><path
-         id="path10523"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" /></marker><marker
-       style="overflow:visible"
-       id="marker10431"
-       refX="0"
-       refY="0"
-       orient="auto"><path
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         id="path10433" /></marker><marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9980"
-       style="overflow:visible"><path
-         id="path9982"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" /></marker><marker
-       style="overflow:visible"
-       id="marker9848"
-       refX="0"
-       refY="0"
-       orient="auto"><path
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         id="path9850" /></marker><marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9520"
-       style="overflow:visible"><path
-         id="path9522"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" /></marker><marker
-       style="overflow:visible"
-       id="marker9422"
-       refX="0"
-       refY="0"
-       orient="auto"><path
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         id="path9424" /></marker><marker
-       style="overflow:visible"
-       id="marker9412"
-       refX="0"
-       refY="0"
-       orient="auto"><path
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         id="path9414" /></marker><marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Send"
-       style="overflow:visible"><path
-         id="path8951"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" /></marker><clipPath
-       id="clipPath404"
-       clipPathUnits="userSpaceOnUse"><path
-         style="clip-rule:evenodd"
-         id="path402"
-         d="M 1.4305e-5,0 960.00001,0 l 0,540 L 1.4305e-5,540 Z" /></clipPath><linearGradient
-       gradientTransform="translate(-50,-70.000014)"
-       gradientUnits="userSpaceOnUse"
-       y2="350"
-       x2="592"
-       y1="350"
-       x1="532"
-       id="linearGradient14233"
-       xlink:href="#linearGradient14225" /><marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9980-1"
-       style="overflow:visible"><path
-         id="path9982-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" /></marker></defs><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect10661"
-     width="520"
-     height="160"
-     x="42"
-     y="199.99998" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect10415"
-     width="140"
-     height="79.900002"
-     x="572"
-     y="100.1" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8500-7"
-     width="30"
-     height="110"
-     x="332"
-     y="229.99998" /><path
-     id="path14627"
-     d="m 562,145 0,5 10,-10 -10,-10 0,5 -250,0 0,10 z"
-     style="fill:#cccccc;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect9622"
-     width="120"
-     height="100"
-     x="192"
-     y="90" /><path
-     style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-     d="m 312,140 -50,-50 0,30 -70,0 0,40 70,0 0,30 50,-50"
-     id="path9624" /><path
-     id="path14625"
-     d="m 72,230 0,-60 110,0 0,-5 10,10 -10,10 0,-5 -10,0 0,50 -10,0 0,-50 -50,0 0,50 -10,0 0,-50 -20,0 0,50 -10,0"
-     style="fill:#cccccc;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8498"
-     width="30"
-     height="110"
-     x="62"
-     y="229.99998" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8500"
-     width="30"
-     height="110"
-     x="92"
-     y="229.99998" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8502"
-     width="30"
-     height="110"
-     x="122"
-     y="229.99998" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8504"
-     width="30"
-     height="110"
-     x="152"
-     y="229.99998" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8506"
-     width="30"
-     height="110"
-     x="182"
-     y="229.99998" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8508"
-     width="30"
-     height="110"
-     x="212"
-     y="229.99998" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8510"
-     width="30"
-     height="110"
-     x="242"
-     y="229.99998" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8512"
-     width="30"
-     height="110"
-     x="272"
-     y="229.99998" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8498-2"
-     width="30"
-     height="110"
-     x="302"
-     y="229.99998" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8502-0"
-     width="30"
-     height="110"
-     x="362"
-     y="229.99998"
-     ry="0" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8504-9"
-     width="30"
-     height="110"
-     x="392"
-     y="229.99998" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8506-3"
-     width="30"
-     height="110"
-     x="422"
-     y="229.99998" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8508-6"
-     width="30"
-     height="110"
-     x="452"
-     y="229.99998" /><path
-     id="rect8510-0"
-     d="m 480,227.99999 0,2 0,112 30,0 4,0 30,0 0,-114 -30,0 -4,0 -30,0 z m 4,4 26,0 0,106 -26,0 0,-106 z m 30,0 26,0 0,106 -26,0 0,-106 z"
-     style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient14233);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="77.007317"
-     y="329.9996"
-     id="text8569"><tspan
-       id="tspan8571"
-       x="76.907318"
-       y="329.9996">0</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="106.87183"
-     y="329.9996"
-     id="text8577"><tspan
-       id="tspan8579"
-       x="106.77182"
-       y="329.9996">1</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="137.20508"
-     y="329.9996"
-     id="text8581"><tspan
-       id="tspan8583"
-       x="137.10507"
-       y="329.9996">2</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="167.03296"
-     y="329.9996"
-     id="text8585"><tspan
-       id="tspan8587"
-       x="166.93295"
-       y="329.9996">3</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="197.05859"
-     y="329.9996"
-     id="text8589"><tspan
-       id="tspan8591"
-       x="196.95859"
-       y="329.9996">4</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="227.08057"
-     y="329.9996"
-     id="text8593"><tspan
-       id="tspan8595"
-       x="226.98056"
-       y="329.9996">5</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="256.95239"
-     y="329.9996"
-     id="text8597"><tspan
-       id="tspan8599"
-       x="256.85239"
-       y="329.9996">6</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="287.0293"
-     y="329.9996"
-     id="text8601"><tspan
-       id="tspan8603"
-       x="286.92929"
-       y="329.9996">7</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="317.00732"
-     y="329.9996"
-     id="text8605"><tspan
-       id="tspan8607"
-       x="316.90732"
-       y="329.9996">8</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="347.05859"
-     y="329.9996"
-     id="text8609"><tspan
-       id="tspan8611"
-       x="346.95859"
-       y="329.9996">9</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="376.67773"
-     y="329.9996"
-     id="text8613"><tspan
-       id="tspan8615"
-       x="376.57773"
-       y="329.9996">.</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="406.87183"
-     y="329.9996"
-     id="text8617"><tspan
-       id="tspan8619"
-       x="406.77182"
-       y="329.9996">.</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="436.93042"
-     y="329.9996"
-     id="text8621"><tspan
-       id="tspan8623"
-       x="436.83041"
-       y="329.9996"
-       style="letter-spacing:0px">.</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="466.78027"
-     y="329.9996"
-     id="text8625"><tspan
-       id="tspan8627"
-       x="466.6803"
-       y="329.9996"
-       style="letter-spacing:0px">.</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="496.60083"
-     y="329.9996"
-     id="text8629"><tspan
-       id="tspan8631"
-       x="496.50085"
-       y="329.9996"
-       style="letter-spacing:0px">.</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="526.83521"
-     y="329.9996"
-     id="text8633"><tspan
-       id="tspan8635"
-       x="526.73523"
-       y="329.9996"
-       style="letter-spacing:0px">.</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="247.57275"
-     y="219.99998"
-     id="text8871"><tspan
-       id="tspan8873"
-       x="247.47275"
-       y="219.99998"
-       style="font-size:17.5px;letter-spacing:0px">Dpb slots</tspan></text>
-<text
-     id="text14174-3"
-     y="270"
-     x="167.56763"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:-0.2px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#b3b3b3;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;"
-     xml:space="preserve"><tspan
-       style="text-align:center;text-anchor:middle;stroke:#b3b3b3;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stroke-linejoin:round;"
-       y="270"
-       x="167.46762"
-       id="tspan14176-4">Valid picture</tspan><tspan
-       style="text-align:center;text-anchor:middle;stroke:#b3b3b3;stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;stroke-linejoin:round;"
-       id="tspan14178-0"
-       y="301.25"
-       x="167.46762">references</tspan></text>
-<text
-     id="text14174"
-     y="270"
-     x="167.56763"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:start;letter-spacing:-0.2px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       style="text-align:center;text-anchor:middle"
-       y="270"
-       x="167.46762"
-       id="tspan14176">Valid picture</tspan><tspan
-       style="text-align:center;text-anchor:middle"
-       id="tspan14178"
-       y="301.25"
-       x="167.46762">references</tspan></text>
-<text
-     id="text14180-3"
-     y="269.7695"
-     x="406.57883"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;"
-     xml:space="preserve"><tspan
-       y="269.7695"
-       x="406.47882"
-       id="tspan14182-9">Unused picture</tspan><tspan
-       id="tspan14184-1"
-       y="301.0195"
-       x="406.47882">references</tspan></text>
-<text
-     id="text14180"
-     y="269.7695"
-     x="406.57886"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       y="269.7695"
-       x="406.47885"
-       id="tspan14182">Unused picture</tspan><tspan
-       id="tspan14184"
-       y="301.0195"
-       x="406.47885">references</tspan></text>
-<g
-     id="g398"
-     transform="matrix(1.3333333,0,0,-1.3333333,-212.33581,674.35391)"><g
-       id="g400"
-       clip-path="url(#clipPath404)" /></g><text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="142"
-     y="460"
-     id="text8573"><tspan
-       id="tspan8575"
-       x="142"
-       y="460" /></text>
-<rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8920"
-     width="30"
-     height="30"
-     x="62"
-     y="380" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8922"
-     width="30"
-     height="30"
-     x="92"
-     y="380" /><path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9422)"
-     d="m 77,379.99999 0,-32"
-     id="path8926" /><path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send)"
-     d="m 107,379.99999 0,-32"
-     id="path8928" /><path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9412)"
-     d="m 137,379.99999 0,-10 30,0 0,-22"
-     id="path8930" /><rect
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     id="rect8924"
-     width="30"
-     height="30"
-     x="122"
-     y="380" /><text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:15px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="295.31128"
-     y="401.5242"
-     id="text9614"><tspan
-       id="tspan9616"
-       x="295.31128"
-       y="401.5242"
-       style="font-size:17.5px;letter-spacing:0px">VkVideoReferenceSlotsKHRs</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="247.53848"
-     y="149.32007"
-     id="text9626"><tspan
-       id="tspan9628"
-       x="247.43848"
-       y="149.32007"
-       style="letter-spacing:0px">Decode</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="222"
-     y="260"
-     id="text9968"><tspan
-       id="tspan9970"
-       x="222"
-       y="260" /></text>
-<path
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9980)"
-     d="m 192,434.99998 -115,0 0,-16"
-     id="path9972" /><text
-     xml:space="preserve"
-     style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:17.5px;line-height:125%;font-family:sans-serif;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:middle;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-     x="117.51691"
-     y="452.32742"
-     id="text10056"><tspan
-       id="tspan10058"
-       x="117.4169"
-       y="452.32742"
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:17.5px;line-height:125%;font-family:sans-serif;text-indent:0;text-align:center;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:middle;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate">pReferenceSlots</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="519.72882"
-     y="452.32742"
-     id="text10411"><tspan
-       id="tspan10413"
-       x="519.62885"
-       y="452.32742"
-       style="font-size:17.5px;letter-spacing:0px">dstPictureResource</tspan></text>
-<text
-     xml:space="preserve"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     x="642.00842"
-     y="131.32198"
-     id="text10417"><tspan
-       id="tspan10419"
-       x="641.90845"
-       y="131.32198"
-       style="letter-spacing:0px">Decoded</tspan><tspan
-       x="641.90845"
-       y="162.57198"
-       id="tspan10421"
-       style="letter-spacing:0px">image</tspan></text>
-<rect
-     y="420"
-     x="192"
-     height="30"
-     width="240"
-     id="rect14235"
-     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /><text
-     id="text14237"
-     y="441.52405"
-     x="312.18799"
-     style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-     xml:space="preserve"><tspan
-       style="font-size:17.5px;text-align:center;text-anchor:middle"
-       y="441.52405"
-       x="312.08798"
-       id="tspan14239">VkVideoDecodeInfoKHR</tspan></text>
-<path
-     id="path14623"
-     d="m 432,435 210,0 0,-247"
-     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker10521)" /><path
-     id="path14629"
-     d="m 182,100 0,-5 10,10 -10,10 0,-5 -20,0 0,-10 z"
-     style="fill:#cccccc;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /><g
-     id="g10096"
-     transform="translate(-1.3165542,0)"><path
-       id="path392"
-       style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:none"
-       d="m 39.766092,94.146902 c 0,-5.92 27.68666,-10.72 61.839998,-10.72 34.14666,0 61.84,4.8 61.84,10.72 l 0,42.879988 c 0,5.92 -27.69334,10.72 -61.84,10.72 -34.153338,0 -61.839998,-4.8 -61.839998,-10.72 z" /><path
-       id="path394"
-       style="fill:none;stroke:#000000;stroke-width:1.27999997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
-       d="m 163.44609,94.146902 c 0,5.919998 -27.69334,10.719988 -61.84,10.719988 -34.153338,0 -61.839998,-4.79999 -61.839998,-10.719988" /><path
-       id="path396"
-       style="fill:none;stroke:#000000;stroke-width:1.27999997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
-       d="m 39.766092,94.146902 c 0,-5.92 27.68666,-10.72 61.839998,-10.72 34.14666,0 61.84,4.8 61.84,10.72 l 0,42.879988 c 0,5.92 -27.69334,10.72 -61.84,10.72 -34.153338,0 -61.839998,-4.8 -61.839998,-10.72 z" /><text
-       id="text10060"
-       y="130.51297"
-       x="101.2219"
-       style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       xml:space="preserve"><tspan
-         y="130.51297"
-         x="101.1219"
-         id="tspan10062"
-         style="letter-spacing:0px">Bitstream</tspan></text>
-</g></svg>
diff --git a/registry/vulkan/images/README.adoc b/registry/vulkan/images/README.adoc
deleted file mode 100644
index 1783431..0000000
--- a/registry/vulkan/images/README.adoc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2014-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-= Diagrams
-
-Diagrams in this folder have been created with Inkscape, using a restricted
-color palette (white, black, 50% gray and pure red), one choice of dotted
-vs. solid lines, and only two text sizes (10 and 12) using the generic
-"sans serif" font family.
-
-Size 10 fonts should only be used for incidental text for labelling in the
-middle of the diagram as an identifying mark (e.g. an example sample point);
-prefer size 12 fonts wherever possible.
-Smaller sizes are unreadable at default zoom, and larger sizes stick out and
-are jarring within the context of the specification.
-
-All diagrams are sized 1:1 so that no additional rescaling is required in
-the Specification, which would affect the font sizes.
-
-If adding any new diagrams, please try to maintain consistency with the rest
-of these diagrams in order to aid consistency and readability of the Vulkan
-specification.
-Inkscape does not need to be used, but is recommended as a powerful free
-tool for generating vector diagrams, and is known to generate diagrams
-compatible with the rest of the Vulkan toolchain.
-If using other tools, please ensure that the diagram renders correctly in
-popular browsers and in the PDF generation path for the specification.
-
-
-
-== UTF-8 Characters
-
-At the moment, the PDF conversion path only supports the Windows-1252
-character set, as we are currently using the standard fonts built into every
-PDF viewer - such that we don't have to embed a different font.
-Unfortunately these only support Windows-1252, which is a highly limited
-character set.
-
-As such, characters not in that set will not display properly when present
-in an SVG, and will fire a warning when building the PDF.
-Luckily, Inkscape has an "Object to path" function built in, which will
-convert text to a raw path, allowing these characters to be supported.
-
-Please ensure that you build the PDF before submitting any new images,
-particularly with non-standard characters, in order to catch such errors.
diff --git a/registry/vulkan/images/VideoDecodeSessionDpbStates.svg b/registry/vulkan/images/VideoDecodeSessionDpbStates.svg
deleted file mode 100644
index a9899c1..0000000
--- a/registry/vulkan/images/VideoDecodeSessionDpbStates.svg
+++ /dev/null
@@ -1,431 +0,0 @@
-<?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"
-   width="1280"
-   height="720"
-   viewBox="0 0 1280 720.00001"
-   id="svg6344"
-   version="1.1">
-  <defs
-     id="defs6346">
-    <marker
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="marker5602"
-       style="overflow:visible;">
-      <path
-         id="path5604"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <marker
-       style="overflow:visible;"
-       id="marker12421"
-       refX="0.0"
-       refY="0.0"
-       orient="auto">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path12423" />
-    </marker>
-    <marker
-       style="overflow:visible;"
-       id="marker11667"
-       refX="0.0"
-       refY="0.0"
-       orient="auto">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path11669" />
-    </marker>
-    <marker
-       style="overflow:visible;"
-       id="marker11475"
-       refX="0.0"
-       refY="0.0"
-       orient="auto">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path11477" />
-    </marker>
-    <marker
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;">
-      <path
-         id="path8523"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-7"
-       style="overflow:visible">
-      <path
-         id="path8523-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-02"
-       style="overflow:visible">
-      <path
-         id="path8523-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-02-5"
-       style="overflow:visible">
-      <path
-         id="path8523-3-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-  </defs>
-  <metadata
-     id="metadata6349">
-    <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>
-  <g
-     id="layer1"
-     transform="translate(0,-332.36216)">
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="499.45706"
-       y="399.25888"
-       id="text6896"><tspan
-         x="499.35706"
-         y="399.25888"
-         id="tspan7012">New decode session Dpb</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="499.57913"
-       y="539.25891"
-       id="text6904"><tspan
-         x="499.47913"
-         y="539.25891"
-         id="tspan7014">Unused picture reference</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="499.43875"
-       y="679.25891"
-       id="text6904-2"><tspan
-         x="499.33875"
-         y="679.25891"
-         id="tspan7016">Invalid picture reference</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="499.57913"
-       y="819.25891"
-       id="text6904-0"><tspan
-         x="499.47913"
-         y="819.25891"
-         id="tspan7018">Updating picture reference</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="500.5679"
-       y="999.25891"
-       id="text6904-3"><tspan
-         x="500.4679"
-         y="999.25891"
-         id="tspan7020">Valid picture reference</tspan></text>
-    <rect
-       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       id="rect7084"
-       width="360"
-       height="40"
-       x="320.00027"
-       y="372.36191" />
-    <rect
-       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       id="rect7086"
-       width="360"
-       height="40"
-       x="320.00027"
-       y="512.36194" />
-    <rect
-       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       id="rect7088"
-       width="360"
-       height="40"
-       x="320.00027"
-       y="652.36194" />
-    <rect
-       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       id="rect7090"
-       width="360"
-       height="40"
-       x="320.00027"
-       y="792.36194" />
-    <rect
-       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       id="rect7092"
-       width="360"
-       height="40"
-       x="320.00027"
-       y="972.36194" />
-    <path
-       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 500,412.36188 0,92"
-       id="path8508" />
-    <path
-       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-7);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 500,552.36188 0,92"
-       id="path8508-2" />
-    <path
-       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-02);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 500,692.36188 0,92"
-       id="path8508-7" />
-    <path
-       style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-02-5);color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 500,832.36188 0,131.99995"
-       id="path8508-7-2" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker11475)"
-       d="m 680,992.36189 340,0 0,-320 -332,0"
-       id="path11431" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 680,812.36189 340,0"
-       id="path11851" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker11667)"
-       d="m 320,992.36189 -300,0 0,-459.99999 292,0"
-       id="path11853" />
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 320,672.36189 -300,0"
-       id="path11855" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       x="499.14578"
-       y="469.25885"
-       id="text6990"><tspan
-         x="499.04578"
-         y="469.25885"
-         id="tspan7022">Bind memory</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       x="500.20779"
-       y="609.25891"
-       id="text6994"><tspan
-         id="tspan6996"
-         x="500.10779"
-         y="609.25891">Activate reference Dpb slot</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       x="499.07864"
-       y="749.25891"
-       id="text6998"><tspan
-         id="tspan7000"
-         x="498.97864"
-         y="749.25891">Decode to a reference Dpb slot</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       x="500.46414"
-       y="893.63391"
-       id="text7048"><tspan
-         id="tspan7050"
-         x="500.36414"
-         y="893.63391">On successful decode operation completion,</tspan><tspan
-         x="500.36414"
-         y="924.88391"
-         id="tspan7052">set the slot as a reference picture with valid metadata</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="499.14578"
-       y="469.25885"
-       id="text6990-3"><tspan
-         x="499.04578"
-         y="469.25885"
-         id="tspan7022-1">Bind memory</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="500.20779"
-       y="609.25891"
-       id="text6994-9"><tspan
-         id="tspan6996-4"
-         x="500.10779"
-         y="609.25891">Activate reference Dpb slot</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="499.07864"
-       y="749.25891"
-       id="text6998-7"><tspan
-         id="tspan7000-8"
-         x="498.97864"
-         y="749.25891">Decode to a reference Dpb slot</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="500.46414"
-       y="893.63391"
-       id="text7048-4"><tspan
-         id="tspan7050-5"
-         x="500.36414"
-         y="893.63391">On successful decode operation completion,</tspan><tspan
-         x="500.36414"
-         y="924.88391"
-         id="tspan7052-0">set the slot as a reference picture with valid metadata</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       x="167.46216"
-       y="523.63391"
-       id="text7054-3"><tspan
-         id="tspan7056-6"
-         x="167.36215"
-         y="523.63391">Deactivate</tspan><tspan
-         x="167.36215"
-         y="554.88391"
-         id="tspan7070-1">reference Dpb slot</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       x="863.51117"
-       y="803.63391"
-       id="text7058-0"><tspan
-         id="tspan7060-6"
-         x="863.41119"
-         y="803.63391">Unsuccessful video</tspan><tspan
-         x="863.41119"
-         y="834.88391"
-         id="tspan7074-3">decode operation</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       x="863.09003"
-       y="983.63397"
-       id="text7062-2"><tspan
-         id="tspan7064-0"
-         x="862.99005"
-         y="983.63397">Invalidate</tspan><tspan
-         x="862.99005"
-         y="1014.884"
-         id="tspan7068-6">reference Dpb slot</tspan></text>
-    <path
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:12, 12;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 2,572.36216 1268,0"
-       id="path5364" />
-    <g
-       id="g5966"
-       transform="translate(9.9999974,-20.000007)">
-      <path
-         id="path5366"
-         d="m 849.99971,592.36217 0,60"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5602)" />
-      <path
-         id="path5368"
-         d="m 849.99971,592.36217 0,-60"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12421)" />
-    </g>
-    <g
-       id="g6010"
-       transform="translate(0,-13.103047)">
-      <text
-         id="text5810"
-         y="552.36218"
-         x="1074"
-         style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           id="tspan5814"
-           y="552.36218"
-           x="1073.9">Deactivated reference Dpb slot</tspan></text>
-      <text
-         id="text5816"
-         y="632.36218"
-         x="1074"
-         style="font-style:normal;font-weight:normal;font-size:25px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         xml:space="preserve"><tspan
-           y="632.36218"
-           x="1073.9"
-           id="tspan5818">Activated reference Dpb slot</tspan></text>
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Italic';text-align:center;letter-spacing:-0.2px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="1174"
-       y="747.93225"
-       id="text6016"><tspan
-         id="tspan6018"
-         x="1173.9"
-         y="747.93225">The picture</tspan><tspan
-         x="1173.9"
-         y="779.18225"
-         id="tspan6020">resource's</tspan><tspan
-         x="1173.9"
-         y="810.43225"
-         id="tspan6024">memory must</tspan><tspan
-         x="1173.9"
-         y="841.68225"
-         id="tspan6028">be resident</tspan><tspan
-         x="1173.9"
-         y="872.93225"
-         id="tspan6030">within these</tspan><tspan
-         x="1173.9"
-         y="904.18225"
-         id="tspan6032">states of</tspan><tspan
-         x="1173.9"
-         y="935.43225"
-         id="tspan6034">the slot</tspan></text>
-    <g
-       id="g6062"
-       transform="translate(0,-20.000007)">
-      <path
-         id="path6040"
-         d="m 1040,692.36216 c 40,0 0,160 40,160"
-         style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
-      <path
-         id="path6040-6"
-         d="m 1040,1012.3622 c 40,0 0,-160.00004 40,-160.00004"
-         style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    </g>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/accelstruct.svg b/registry/vulkan/images/accelstruct.svg
deleted file mode 100644
index 175ff40..0000000
--- a/registry/vulkan/images/accelstruct.svg
+++ /dev/null
@@ -1,325 +0,0 @@
-<?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"
-   width="122.6349mm"
-   height="111.36717mm"
-   viewBox="0 0 122.6349 111.36717"
-   version="1.1"
-   id="svg4035"
-   inkscape:version="0.92.3 (2405546, 2018-03-11)"
-   sodipodi:docname="accelstruct.svg">
-  <defs
-     id="defs4029">
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker5699"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path5697"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path4902"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4902-7"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-1"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4902-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4902-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.4"
-     inkscape:cx="205.45633"
-     inkscape:cy="48.906685"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="2560"
-     inkscape:window-height="1538"
-     inkscape:window-x="-8"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0" />
-  <metadata
-     id="metadata4032">
-    <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>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-36.531136,-66.301968)">
-    <rect
-       id="rect4037"
-       width="117.55059"
-       height="33.639881"
-       x="39.498512"
-       y="66.434525"
-       style="fill:#cecece;fill-opacity:1;stroke:#000000;stroke-width:0.26511249;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <rect
-       id="rect4037-1"
-       width="34.855381"
-       height="33.760372"
-       x="54.720116"
-       y="143.83646"
-       style="fill:#cecece;fill-opacity:1;stroke:#000000;stroke-width:0.14462024;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <rect
-       id="rect4037-1-1"
-       width="34.855381"
-       height="33.760372"
-       x="120.36967"
-       y="143.83646"
-       style="fill:#cecece;fill-opacity:1;stroke:#000000;stroke-width:0.14462024;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.26511249;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect4874"
-       width="34.206844"
-       height="21.355652"
-       x="36.663692"
-       y="109.68093"
-       ry="6.6145835" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.26511249;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect4874-5"
-       width="34.206844"
-       height="21.355654"
-       x="82.682297"
-       y="109.68093"
-       ry="6.6145835" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.26511249;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="rect4874-4"
-       width="34.206844"
-       height="21.355654"
-       x="124.82664"
-       y="109.68093"
-       ry="6.6145835" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="m 53.861607,100.45238 v 9.07143"
-       id="path4897"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend-2)"
-       d="m 100.35268,100.00656 v 9.07143"
-       id="path4897-7"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend-1)"
-       d="m 141.17411,100.38454 v 9.07144"
-       id="path4897-3"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.30833337;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)"
-       d="m 137.20536,131.26903 v 12.31946"
-       id="path4897-4"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5699)"
-       d="m 52.727677,131.25744 v 7.18155 h 18.898811 v 5.29166"
-       id="path5689"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.2711173px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 100.35268,130.50149 v 7.9375 H 71.626488"
-       id="path5743"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="46.680061"
-       y="85.333328"
-       id="text5747"><tspan
-         sodipodi:role="line"
-         x="46.680061"
-         y="85.333328"
-         style="font-size:6.3499999px;stroke-width:0.26458332"
-         id="tspan5749">Top-Level Acceleration Structure</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:0.75;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="55.942436"
-       y="153.21938"
-       id="text5747-1"><tspan
-         sodipodi:role="line"
-         x="55.942436"
-         y="153.21938"
-         style="font-size:4.93888903px;line-height:0px;stroke-width:0.26458332"
-         id="tspan5749-5">Bottom-Level</tspan><tspan
-         sodipodi:role="line"
-         x="55.942436"
-         y="161.15688"
-         style="font-size:4.93888903px;line-height:0px;stroke-width:0.26458332"
-         id="tspan5773">Acceleration</tspan><tspan
-         sodipodi:role="line"
-         x="55.942436"
-         y="169.09438"
-         style="font-size:4.93888903px;line-height:0px;stroke-width:0.26458332"
-         id="tspan5777">Structure</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:0.75;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="120.77655"
-       y="153.21938"
-       id="text5747-1-2"><tspan
-         sodipodi:role="line"
-         x="120.77655"
-         y="153.21938"
-         style="font-size:4.93888903px;line-height:0px;stroke-width:0.26458332"
-         id="tspan5749-5-0">Bottom-Level</tspan><tspan
-         sodipodi:role="line"
-         x="120.77655"
-         y="161.15688"
-         style="font-size:4.93888903px;line-height:0px;stroke-width:0.26458332"
-         id="tspan5773-3">Acceleration</tspan><tspan
-         sodipodi:role="line"
-         x="120.77655"
-         y="169.09438"
-         style="font-size:4.93888903px;line-height:0px;stroke-width:0.26458332"
-         id="tspan5777-3">Structure</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="41.388393"
-       y="117.02173"
-       id="text5810"><tspan
-         sodipodi:role="line"
-         id="tspan5808"
-         x="41.388393"
-         y="117.02173"
-         style="stroke-width:0.26458332">Transform</tspan><tspan
-         sodipodi:role="line"
-         x="41.388393"
-         y="122.31339"
-         style="stroke-width:0.26458332"
-         id="tspan5812">and shading</tspan><tspan
-         sodipodi:role="line"
-         x="41.388393"
-         y="127.60506"
-         style="stroke-width:0.26458332"
-         id="tspan5814">information</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="87.024742"
-       y="117.02173"
-       id="text5810-7"><tspan
-         sodipodi:role="line"
-         id="tspan5808-6"
-         x="87.024742"
-         y="117.02173"
-         style="stroke-width:0.26458332">Transform</tspan><tspan
-         sodipodi:role="line"
-         x="87.024742"
-         y="122.31339"
-         style="stroke-width:0.26458332"
-         id="tspan5812-7">and shading</tspan><tspan
-         sodipodi:role="line"
-         x="87.024742"
-         y="127.60506"
-         style="stroke-width:0.26458332"
-         id="tspan5814-8">information</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="129.92503"
-       y="117.02173"
-       id="text5810-73"><tspan
-         sodipodi:role="line"
-         id="tspan5808-5"
-         x="129.92503"
-         y="117.02173"
-         style="stroke-width:0.26458332">Transform</tspan><tspan
-         sodipodi:role="line"
-         x="129.92503"
-         y="122.31339"
-         style="stroke-width:0.26458332"
-         id="tspan5812-1">and shading</tspan><tspan
-         sodipodi:role="line"
-         x="129.92503"
-         y="127.60506"
-         style="stroke-width:0.26458332"
-         id="tspan5814-80">information</tspan></text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/base_image_sample_grid.svg b/registry/vulkan/images/base_image_sample_grid.svg
deleted file mode 100644
index 17d0832..0000000
--- a/registry/vulkan/images/base_image_sample_grid.svg
+++ /dev/null
@@ -1,666 +0,0 @@
-<?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"
-   width="706.10547"
-   height="384.11328"
-   viewBox="0 0 186.82375 101.62997"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="base_image_sample_grid.svg">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path977"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path977-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481-0" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.48"
-     inkscape:cx="212.25143"
-     inkscape:cy="203.48463"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="-8"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     fit-margin-left="1"
-     units="px"
-     inkscape:snap-center="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid12"
-       originx="0.79995428"
-       originy="-29.882412"
-       dotted="false" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-6.9498988,47.8249)">
-    <g
-       id="g1953"
-       transform="translate(-2.6458349,-3.056108e-6)">
-      <text
-         id="text121"
-         y="-32.729179"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="-32.729179"
-           x="34.208187"
-           id="tspan119"
-           sodipodi:role="line">3</tspan></text>
-      <text
-         id="text121-3"
-         y="-14.208342"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="-14.208342"
-           x="34.208187"
-           id="tspan119-1"
-           sodipodi:role="line">2</tspan></text>
-      <text
-         id="text121-0"
-         y="4.3124924"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="4.3124924"
-           x="34.208187"
-           id="tspan119-4"
-           sodipodi:role="line">1</tspan></text>
-      <text
-         id="text121-33"
-         y="22.833326"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="22.833326"
-           x="34.208187"
-           id="tspan119-6"
-           sodipodi:role="line">0</tspan></text>
-      <text
-         id="text121-6"
-         y="36.062492"
-         x="47.437355"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="47.437355"
-           id="tspan119-11"
-           sodipodi:role="line">0</tspan></text>
-      <text
-         id="text121-30"
-         y="36.062492"
-         x="65.958191"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="65.958191"
-           id="tspan119-47"
-           sodipodi:role="line">1</tspan></text>
-      <text
-         id="text121-1"
-         y="36.062492"
-         x="84.479027"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="84.479027"
-           id="tspan119-9"
-           sodipodi:role="line">2</tspan></text>
-      <text
-         id="text121-8"
-         y="36.062492"
-         x="102.99986"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="102.99986"
-           id="tspan119-7"
-           sodipodi:role="line">3</tspan></text>
-      <text
-         id="text121-4"
-         y="36.062492"
-         x="121.52069"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="121.52069"
-           id="tspan119-0"
-           sodipodi:role="line">4</tspan></text>
-      <text
-         id="text121-7"
-         y="36.062492"
-         x="140.04152"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="140.04152"
-           id="tspan119-8"
-           sodipodi:role="line">5</tspan></text>
-      <text
-         id="text121-79"
-         y="36.062492"
-         x="158.56236"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="158.56236"
-           id="tspan119-16"
-           sodipodi:role="line">6</tspan></text>
-      <text
-         id="text121-31"
-         y="36.062492"
-         x="177.08319"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="177.08319"
-           id="tspan119-09"
-           sodipodi:role="line">7</tspan></text>
-      <text
-         id="text121-3-7"
-         y="-5.1587644"
-         x="34.4366"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-           y="-5.1587644"
-           x="34.4366"
-           id="tspan119-1-8"
-           sodipodi:role="line">j</tspan></text>
-      <text
-         id="text121-3-7-3"
-         y="37.611752"
-         x="113.4819"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-           y="37.611752"
-           x="113.4819"
-           id="tspan119-1-8-7"
-           sodipodi:role="line">i</tspan></text>
-      <g
-         style="stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none"
-         transform="matrix(1.7500001,0,0,1.7500001,-25.323064,-72.260449)"
-         id="g1463">
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517"
-           cx="42.333332"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7"
-           cx="52.916668"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-78"
-           cx="63.5"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-9"
-           cx="74.083336"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-0"
-           cx="84.666664"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-0"
-           cx="95.25"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-1"
-           cx="105.83334"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-7"
-           cx="116.41666"
-           cy="21.833345"
-           r="0.52778977" />
-        <path
-           style="fill:none;stroke:#808080;stroke-width:0.15119047;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 37.041666,16.541679 h 84.666664 l 1e-5,42.333333 H 37.041671 l -5e-6,-42.333333 m 10.583334,0 4e-6,42.333333 m 10.583332,0 -4e-6,-42.333333 m 10.583332,0 8e-6,42.333333 m 10.583336,0 -8e-6,-42.333333 m 10.583336,0 v 42.333333 m 10.583334,0 -1e-5,-42.333333 m 10.58333,0 1e-5,42.333333 M 121.70834,48.291681 H 37.041671 m -4e-6,-10.583336 h 84.666663 m 0,-10.583332 H 37.041667"
-           id="path1171"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="ccccccccccccccccccccccccc" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-6"
-           cx="42.333332"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-3"
-           cx="52.916668"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-78-9"
-           cx="63.5"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-9-1"
-           cx="74.083336"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-0-6"
-           cx="84.666664"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-0-8"
-           cx="95.25"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-1-5"
-           cx="105.83334"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-7-5"
-           cx="116.41665"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-4"
-           cx="42.333332"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-2"
-           cx="52.916668"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-78-3"
-           cx="63.5"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-9-0"
-           cx="74.083336"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-0-9"
-           cx="84.666664"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-0-1"
-           cx="95.25"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-1-9"
-           cx="105.83334"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-7-7"
-           cx="116.41665"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-14"
-           cx="42.333332"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-4"
-           cx="52.916668"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-78-7"
-           cx="63.5"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-9-8"
-           cx="74.083336"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-0-7"
-           cx="84.666664"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-0-9"
-           cx="95.25"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-1-4"
-           cx="105.83334"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-7-52"
-           cx="116.41665"
-           cy="53.583344"
-           r="0.52778977" />
-      </g>
-      <g
-         transform="translate(-23.812502,2.2e-6)"
-         id="g1370">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="54.556301"
-           y="45.537884"
-           id="text121-09-74"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18"
-             x="54.556301"
-             y="45.537884"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="213.32181"
-           y="45.538918"
-           id="text121-09-74-5"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18-0"
-             x="213.32181"
-             y="45.538918"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">8.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           id="path972"
-           inkscape:connector-curvature="0" />
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="137.32748"
-           y="45.122406"
-           id="text121-3-7-3-3"><tspan
-             sodipodi:role="line"
-             id="tspan119-1-8-7-2"
-             x="137.32748"
-             y="45.122406"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">u</tspan></text>
-      </g>
-      <g
-         transform="translate(-23.812505,7.9375005)"
-         id="g1471">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="54.556301"
-           y="45.537884"
-           id="text121-09-74-7"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18-1"
-             x="54.556301"
-             y="45.537884"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="213.32181"
-           y="45.538918"
-           id="text121-09-74-5-4"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18-0-9"
-             x="213.32181"
-             y="45.538918"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)"
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           id="path972-8"
-           inkscape:connector-curvature="0" />
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="137.32748"
-           y="45.122406"
-           id="text121-3-7-3-3-5"><tspan
-             sodipodi:role="line"
-             id="tspan119-1-8-7-2-2"
-             x="137.32748"
-             y="45.122406"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">s</tspan></text>
-      </g>
-      <g
-         transform="translate(-23.812501,2.6458339)"
-         id="g1597">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="44.034977"
-           y="-47.066288"
-           id="text121-09"><tspan
-             sodipodi:role="line"
-             id="tspan119-67"
-             x="44.034977"
-             y="-47.066288"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">4.0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="43.972965"
-           y="32.308716"
-           id="text121-09-7"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-1"
-             x="43.972965"
-             y="32.308716"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-        <path
-           inkscape:connector-curvature="0"
-           id="path1473"
-           d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)" />
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="46.93816"
-           y="-7.8045983"
-           id="text121-3-7-8"><tspan
-             sodipodi:role="line"
-             id="tspan119-1-8-3"
-             x="46.93816"
-             y="-7.8045983"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">v</tspan></text>
-      </g>
-      <g
-         id="g1613-5"
-         transform="translate(-34.395835,2.6458339)">
-        <g
-           id="g1802">
-          <text
-             xml:space="preserve"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             x="44.034977"
-             y="-47.066288"
-             id="text1601-4"><tspan
-               sodipodi:role="line"
-               id="tspan1599-1"
-               x="44.034977"
-               y="-47.066288"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1.0</tspan></text>
-          <text
-             xml:space="preserve"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             x="43.972965"
-             y="32.308716"
-             id="text1605-6"><tspan
-               sodipodi:role="line"
-               id="tspan1603-7"
-               x="43.972965"
-               y="32.308716"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-          <path
-             inkscape:connector-curvature="0"
-             id="path1607-6"
-             d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835"
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483-7)" />
-          <text
-             xml:space="preserve"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             x="46.93816"
-             y="-7.8045983"
-             id="text1611-4"><tspan
-               sodipodi:role="line"
-               id="tspan1609-3"
-               x="46.93816"
-               y="-7.8045983"
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">t</tspan></text>
-        </g>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/bresenham.svg b/registry/vulkan/images/bresenham.svg
deleted file mode 100644
index ca05bcb..0000000
--- a/registry/vulkan/images/bresenham.svg
+++ /dev/null
@@ -1,488 +0,0 @@
-<?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"
-   width="391.00003"
-   height="321.00003"
-   viewBox="0 0 103.4521 84.931256"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
-   sodipodi:docname="bresenham.svg">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mend"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path2950"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(-0.6)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path977-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481-0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mstart"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path2320"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2639"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2637"
-         inkscape:connector-curvature="0" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.48"
-     inkscape:cx="208.25234"
-     inkscape:cy="168.34984"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="935"
-     inkscape:window-x="-8"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0"
-     fit-margin-top="20"
-     fit-margin-right="20"
-     fit-margin-bottom="20"
-     fit-margin-left="20"
-     units="px"
-     inkscape:snap-center="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid12"
-       originx="-23.680211"
-       originy="-47.4927"
-       dotted="false" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-31.430062,48.736474)">
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 101.67694,-43.312516 36.85402,21.510402"
-       id="path2597"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <g
-       id="g1463"
-       transform="matrix(1.7500001,0,0,1.7500001,-27.968899,-72.260452)"
-       style="stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none">
-      <circle
-         r="0.52778977"
-         cy="21.833345"
-         cx="42.333332"
-         id="path4517"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="21.833345"
-         cx="52.916668"
-         id="path4517-7"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="21.833345"
-         cx="63.5"
-         id="path4517-78"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="21.833345"
-         cx="74.083336"
-         id="path4517-7-9"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="21.833345"
-         cx="84.666664"
-         id="path4517-0"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="ccccccccccccccccccccc"
-         inkscape:connector-curvature="0"
-         id="path1171"
-         d="m 37.041666,16.541677 h 52.916665 v 42.333331 l -52.91666,4e-6 -5e-6,-42.333333 m 10.583334,0 4e-6,42.333333 m 10.583332,0 -4e-6,-42.333333 m 10.583332,0 8e-6,42.333333 m 10.583336,0 -8e-6,-42.333333 m 10.583336,0 v 42.333333 m -5e-6,-10.583337 H 37.041666 m 10e-7,-10.58333 52.916664,-2e-6 m 0,-10.583333 -52.916664,3e-6"
-         style="fill:none;stroke:#808080;stroke-width:0.15119047;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="32.416679"
-         cx="42.333332"
-         id="path4517-6"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="32.416679"
-         cx="52.916668"
-         id="path4517-7-3"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="32.416679"
-         cx="63.5"
-         id="path4517-78-9"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="32.416679"
-         cx="74.083336"
-         id="path4517-7-9-1"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="32.416679"
-         cx="84.666664"
-         id="path4517-0-6"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="43.000011"
-         cx="42.333332"
-         id="path4517-4"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="43.000011"
-         cx="52.916668"
-         id="path4517-7-2"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="43.000011"
-         cx="63.5"
-         id="path4517-78-3"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="43.000011"
-         cx="74.083336"
-         id="path4517-7-9-0"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="43.000011"
-         cx="84.666664"
-         id="path4517-0-9"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="53.583344"
-         cx="42.333332"
-         id="path4517-14"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="53.583344"
-         cx="52.916668"
-         id="path4517-7-4"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="53.583344"
-         cx="63.5"
-         id="path4517-78-7"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="53.583344"
-         cx="74.083336"
-         id="path4517-7-9-8"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="53.583344"
-         cx="84.666664"
-         id="path4517-0-7"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    </g>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 120.19778,-43.312516 46.114437,30.770819"
-       id="path2597-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 83.156105,-43.312516 36.85402,2.9895682"
-       id="path2597-1"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 64.635271,-43.312516 36.85402,-15.531266"
-       id="path2597-1-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 46.114437,-43.312516 -9.260417,9.260417"
-       id="path2597-1-9-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 129.45819,-34.052099 64.635271,30.770819"
-       id="path2597-1-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 129.45819,-15.531266 83.156105,30.770819"
-       id="path2597-1-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 129.45819,2.9895688 101.67694,30.770819"
-       id="path2597-1-9-68"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 129.45819,21.510402 -9.26042,9.260417"
-       id="path2597-1-9-68-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 64.635271,-43.312516 36.85402,-15.531265"
-       id="path2597-1-9-4"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 36.85402,-34.052099 64.82292,64.822918"
-       id="path2597-1-9-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 36.85402,-15.531266 83.156105,30.770819"
-       id="path2597-1-9-2-0"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 36.85402,2.9895681 64.635271,30.770819"
-       id="path2597-1-9-2-0-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 36.85402,21.510402 9.260417,9.260417"
-       id="path2597-1-9-2-0-7-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 36.85402,-34.052099 64.82292,64.822918"
-       id="path2597-1-9-2-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 46.114437,-43.312516 120.19777,30.770819"
-       id="path2597-1-9-2-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 64.635271,-43.312516 129.45819,21.510402"
-       id="path2597-1-9-2-8-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 83.156105,-43.312516 129.45819,2.9895681"
-       id="path2597-1-9-2-8-2-4"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 101.67694,-43.312516 27.78125,27.78125"
-       id="path2597-1-9-2-8-2-4-0"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.3321186;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.99635576, 0.99635576;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 120.19777,-43.312516 9.26042,9.260417"
-       id="path2597-1-9-2-8-2-4-0-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.52999997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
-       d="M 42.145687,20.187485 118.87486,-39.343766"
-       id="path819"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <g
-       id="g3490"
-       transform="translate(11.90625,10.583333)"
-       style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path2597-1-9-2-0-7-9-3"
-         d="m 32.88527,9.6041515 2.645834,2.6458335"
-         style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:0.33205208;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path2597-1-9-2-0-7-9-3-2"
-         d="M 35.531104,9.6041515 32.88527,12.249985"
-         style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:0.33205208;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    </g>
-    <g
-       id="g3490-6"
-       transform="translate(30.427084,-7.9375001)"
-       style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path2597-1-9-2-0-7-9-3-1"
-         d="m 32.88527,9.6041515 2.645834,2.6458335"
-         style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:0.33205208;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path2597-1-9-2-0-7-9-3-2-0"
-         d="M 35.531104,9.6041515 32.88527,12.249985"
-         style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:0.33205208;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    </g>
-    <g
-       id="g3490-6-5"
-       transform="translate(48.947918,-26.458334)"
-       style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path2597-1-9-2-0-7-9-3-1-3"
-         d="m 32.88527,9.6041515 2.645834,2.6458335"
-         style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:0.33205208;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path2597-1-9-2-0-7-9-3-2-0-8"
-         d="M 35.531104,9.6041515 32.88527,12.249985"
-         style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:0.33205208;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    </g>
-    <g
-       id="g3490-6-5-0"
-       transform="translate(67.468751,-44.979168)"
-       style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-opacity:1">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path2597-1-9-2-0-7-9-3-1-3-9"
-         d="m 32.88527,9.6041515 2.645834,2.6458335"
-         style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:0.33205208;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path2597-1-9-2-0-7-9-3-2-0-8-0"
-         d="M 35.531104,9.6041515 32.88527,12.249985"
-         style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:0.33205208;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    </g>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/chromasamples_420_xcosited_ycosited.svg b/registry/vulkan/images/chromasamples_420_xcosited_ycosited.svg
deleted file mode 100644
index 586ca58..0000000
--- a/registry/vulkan/images/chromasamples_420_xcosited_ycosited.svg
+++ /dev/null
@@ -1,388 +0,0 @@
-<?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"
-   version="1.1"
-   viewBox="0 0 186.82375 101.62997"
-   height="384.11328"
-   width="706.10547">
-  <defs>
-    <marker
-       id="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"       
-       style="overflow:visible">
-      <path         
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       id="marker1483"
-       style="overflow:visible"
-       refX="0"
-       refY="0"
-       orient="auto">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z" />
-    </marker>
-    <marker
-       style="overflow:visible"
-       id="marker1483-7"
-       refX="0"
-       refY="0"
-       orient="auto">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z" />
-    </marker>
-    <marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"       
-       style="overflow:visible">
-      <path
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-  </defs>
-  <g transform="translate(-6.9498988,47.8249)">
-    <g transform="translate(-2.6458349,-3.056108e-6)">
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="-32.729179"><tspan
-           x="34.208187"
-           y="-32.729179"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">3</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="-14.208342"><tspan
-           x="34.208187"
-           y="-14.208342"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">2</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="4.3124924"><tspan
-           x="34.208187"
-           y="4.3124924"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="22.833326"><tspan
-           x="34.208187"
-           y="22.833326"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="47.437355"
-         y="36.062492"><tspan
-           x="47.437355"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="65.958191"
-         y="36.062492"><tspan
-           x="65.958191"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="84.479027"
-         y="36.062492"><tspan
-           x="84.479027"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">2</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="102.99986"
-         y="36.062492"><tspan
-           x="102.99986"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">3</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="121.52069"
-         y="36.062492"><tspan
-           x="121.52069"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">4</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="140.04152"
-         y="36.062492"><tspan
-           x="140.04152"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">5</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="158.56236"
-         y="36.062492"><tspan
-           x="158.56236"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">6</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="177.08319"
-         y="36.062492"><tspan
-           x="177.08319"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">7</tspan></text>
-      <text
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.4366"
-         y="-5.1587644"><tspan
-           x="34.4366"
-           y="-5.1587644"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">j</tspan></text>
-      <text
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="113.4819"
-         y="37.611752"><tspan
-           x="113.4819"
-           y="37.611752"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">i</tspan></text>
-      <g transform="translate(-25.323064 -72.260449) scale(1.75 1.75) translate(37.041666 16.541679) scale(0.25 0.25) scale(42.333333 42.333333)">
-        <path style="fill:none;stroke:black;stroke-width:0.01;stroke-linecap:square"
-              d="M0,0 H8 M0,1 H8 M0,2 H8 M0,3 H8 M0,4 H8 M0,0 V4 M1,0 V4 M2,0 V4 M3,0 V4 M4,0 V4 M5,0 V4 M6,0 V4 M7,0 V4 M8,0 V4" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="3.5" r="0.05" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square;stroke-dasharray:0.1,0.1;stroke-dashoffset:0.05"
-              d="M-0.5,0.5 h8 m-8,2 h8 m-8,2 h8m-8,-4 v4 m2,-4 v4 m2,-4 v4 m2,-4 v4 m2,-4 v4" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 0.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 2.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 4.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 6.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 0.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 2.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 4.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 6.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-      </g>
-      <g transform="translate(-23.812502,2.2e-6)">
-        <text
-           y="45.537884"
-           x="54.556301"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.537884"
-             x="54.556301">0.0</tspan></text>
-        <text
-           y="45.538918"
-           x="213.32181"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.538918"
-             x="213.32181">8.0</tspan></text>
-        <path
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-        <text
-           y="45.122406"
-           x="137.32748"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="45.122406"
-             x="137.32748">u</tspan></text>
-      </g>
-      <g transform="translate(-23.812505,7.9375005)">
-        <text
-           y="45.537884"
-           x="54.556301"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.537884"
-             x="54.556301">0.0</tspan></text>
-        <text
-           y="45.538918"
-           x="213.32181"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.538918"
-             x="213.32181">1.0</tspan></text>
-        <path
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)" />
-        <text
-           y="45.122406"
-           x="137.32748"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="45.122406"
-             x="137.32748">s</tspan></text>
-      </g>
-      <g transform="translate(-23.812501,2.6458339)">
-        <text
-           y="-47.066288"
-           x="44.034977"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="-47.066288"
-             x="44.034977">4.0</tspan></text>
-        <text
-           y="32.308716"
-           x="43.972965"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="32.308716"
-             x="43.972965">0.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-           d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835" />
-        <text
-           y="-7.8045983"
-           x="46.93816"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="-7.8045983"
-             x="46.93816">v</tspan></text>
-      </g>
-      <g transform="translate(-34.395835,2.6458339)">
-        <g>
-          <text
-             y="-47.066288"
-             x="44.034977"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-               y="-47.066288"
-               x="44.034977">1.0</tspan></text>
-          <text             
-             y="32.308716"
-             x="43.972965"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-               y="32.308716"
-               x="43.972965">0.0</tspan></text>
-          <path
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483-7)"
-             d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835" />
-          <text
-             y="-7.8045983"
-             x="46.93816"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-               y="-7.8045983"
-               x="46.93816">t</tspan></text>
-        </g>
-      </g>
-    </g>
-    <g transform="translate(-7.6312708e-7,-3.9209711e-6)">
-      <g transform="translate(1 -1)">
-        <text
-           y="-16.854183"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,1</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="83.156105"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="83.156105"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,1</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,1</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="157.23944"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="157.23944"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,1</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="83.156097"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="83.156097"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="157.23943"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="157.23943"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,0</tspan></tspan></text>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/chromasamples_420_xcosited_ymidpoint.svg b/registry/vulkan/images/chromasamples_420_xcosited_ymidpoint.svg
deleted file mode 100644
index 1c6b316..0000000
--- a/registry/vulkan/images/chromasamples_420_xcosited_ymidpoint.svg
+++ /dev/null
@@ -1,390 +0,0 @@
-<?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"
-   version="1.1"
-   viewBox="0 0 186.82375 101.62997"
-   height="384.11328"
-   width="706.10547">
-  <defs>
-    <marker
-       id="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"       
-       style="overflow:visible">
-      <path         
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       id="marker1483"
-       style="overflow:visible"
-       refX="0"
-       refY="0"
-       orient="auto">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z" />
-    </marker>
-    <marker
-       style="overflow:visible"
-       id="marker1483-7"
-       refX="0"
-       refY="0"
-       orient="auto">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z" />
-    </marker>
-    <marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"       
-       style="overflow:visible">
-      <path
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-  </defs>
-  <g transform="translate(-6.9498988,47.8249)">
-    <g transform="translate(-2.6458349,-3.056108e-6)">
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="-32.729179"><tspan
-           x="34.208187"
-           y="-32.729179"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">3</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="-14.208342"><tspan
-           x="34.208187"
-           y="-14.208342"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">2</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="4.3124924"><tspan
-           x="34.208187"
-           y="4.3124924"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="22.833326"><tspan
-           x="34.208187"
-           y="22.833326"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="47.437355"
-         y="36.062492"><tspan
-           x="47.437355"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="65.958191"
-         y="36.062492"><tspan
-           x="65.958191"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="84.479027"
-         y="36.062492"><tspan
-           x="84.479027"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">2</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="102.99986"
-         y="36.062492"><tspan
-           x="102.99986"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">3</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="121.52069"
-         y="36.062492"><tspan
-           x="121.52069"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">4</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="140.04152"
-         y="36.062492"><tspan
-           x="140.04152"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">5</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="158.56236"
-         y="36.062492"><tspan
-           x="158.56236"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">6</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="177.08319"
-         y="36.062492"><tspan
-           x="177.08319"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">7</tspan></text>
-      <text
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.4366"
-         y="-5.1587644"><tspan
-           x="34.4366"
-           y="-5.1587644"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">j</tspan></text>
-      <text
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="113.4819"
-         y="37.611752"><tspan
-           x="113.4819"
-           y="37.611752"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">i</tspan></text>
-      <g transform="translate(-25.323064 -72.260449) scale(1.75 1.75) translate(37.041666 16.541679) scale(0.25 0.25) scale(42.333333 42.333333)">
-        <path style="fill:none;stroke:black;stroke-width:0.01;stroke-linecap:square"
-              d="M0,0 H8 M0,1 H8 M0,2 H8 M0,3 H8 M0,4 H8 M0,0 V4 M1,0 V4 M2,0 V4 M3,0 V4 M4,0 V4 M5,0 V4 M6,0 V4 M7,0 V4 M8,0 V4" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="3.5" r="0.05" />
-        <g transform="translate(0 -0.5)">
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square;stroke-dasharray:0.1,0.1;stroke-dashoffset:0.05"
-                d="M-0.5,0.5 h8 m-8,2 h8 m-8,2 h8m-8,-4 v4 m2,-4 v4 m2,-4 v4 m2,-4 v4 m2,-4 v4" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 0.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 2.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 4.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 6.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 0.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 2.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 4.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 6.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        </g>
-      </g>
-      <g transform="translate(-23.812502,2.2e-6)">
-        <text
-           y="45.537884"
-           x="54.556301"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.537884"
-             x="54.556301">0.0</tspan></text>
-        <text
-           y="45.538918"
-           x="213.32181"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.538918"
-             x="213.32181">8.0</tspan></text>
-        <path
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-        <text
-           y="45.122406"
-           x="137.32748"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="45.122406"
-             x="137.32748">u</tspan></text>
-      </g>
-      <g transform="translate(-23.812505,7.9375005)">
-        <text
-           y="45.537884"
-           x="54.556301"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.537884"
-             x="54.556301">0.0</tspan></text>
-        <text
-           y="45.538918"
-           x="213.32181"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.538918"
-             x="213.32181">1.0</tspan></text>
-        <path
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)" />
-        <text
-           y="45.122406"
-           x="137.32748"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="45.122406"
-             x="137.32748">s</tspan></text>
-      </g>
-      <g transform="translate(-23.812501,2.6458339)">
-        <text
-           y="-47.066288"
-           x="44.034977"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="-47.066288"
-             x="44.034977">4.0</tspan></text>
-        <text
-           y="32.308716"
-           x="43.972965"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="32.308716"
-             x="43.972965">0.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-           d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835" />
-        <text
-           y="-7.8045983"
-           x="46.93816"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="-7.8045983"
-             x="46.93816">v</tspan></text>
-      </g>
-      <g transform="translate(-34.395835,2.6458339)">
-        <g>
-          <text
-             y="-47.066288"
-             x="44.034977"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-               y="-47.066288"
-               x="44.034977">1.0</tspan></text>
-          <text             
-             y="32.308716"
-             x="43.972965"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-               y="32.308716"
-               x="43.972965">0.0</tspan></text>
-          <path
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483-7)"
-             d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835" />
-          <text
-             y="-7.8045983"
-             x="46.93816"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-               y="-7.8045983"
-               x="46.93816">t</tspan></text>
-        </g>
-      </g>
-    </g>
-    <g transform="translate(-7.6312708e-7,-3.9209711e-6)">
-      <g transform="translate(1 -10.26041625)">
-        <text
-           y="-16.854183"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,1</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="83.156105"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="83.156105"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,1</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,1</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="157.23944"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="157.23944"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,1</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="83.156097"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="83.156097"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="157.23943"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="157.23943"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,0</tspan></tspan></text>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/chromasamples_420_xmidpoint_ycosited.svg b/registry/vulkan/images/chromasamples_420_xmidpoint_ycosited.svg
deleted file mode 100644
index b73f668..0000000
--- a/registry/vulkan/images/chromasamples_420_xmidpoint_ycosited.svg
+++ /dev/null
@@ -1,390 +0,0 @@
-<?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"
-   version="1.1"
-   viewBox="0 0 186.82375 101.62997"
-   height="384.11328"
-   width="706.10547">
-  <defs>
-    <marker
-       id="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"       
-       style="overflow:visible">
-      <path         
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       id="marker1483"
-       style="overflow:visible"
-       refX="0"
-       refY="0"
-       orient="auto">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z" />
-    </marker>
-    <marker
-       style="overflow:visible"
-       id="marker1483-7"
-       refX="0"
-       refY="0"
-       orient="auto">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z" />
-    </marker>
-    <marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"       
-       style="overflow:visible">
-      <path
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-  </defs>
-  <g transform="translate(-6.9498988,47.8249)">
-    <g transform="translate(-2.6458349,-3.056108e-6)">
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="-32.729179"><tspan
-           x="34.208187"
-           y="-32.729179"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">3</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="-14.208342"><tspan
-           x="34.208187"
-           y="-14.208342"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">2</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="4.3124924"><tspan
-           x="34.208187"
-           y="4.3124924"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="22.833326"><tspan
-           x="34.208187"
-           y="22.833326"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="47.437355"
-         y="36.062492"><tspan
-           x="47.437355"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="65.958191"
-         y="36.062492"><tspan
-           x="65.958191"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="84.479027"
-         y="36.062492"><tspan
-           x="84.479027"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">2</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="102.99986"
-         y="36.062492"><tspan
-           x="102.99986"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">3</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="121.52069"
-         y="36.062492"><tspan
-           x="121.52069"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">4</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="140.04152"
-         y="36.062492"><tspan
-           x="140.04152"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">5</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="158.56236"
-         y="36.062492"><tspan
-           x="158.56236"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">6</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="177.08319"
-         y="36.062492"><tspan
-           x="177.08319"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">7</tspan></text>
-      <text
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.4366"
-         y="-5.1587644"><tspan
-           x="34.4366"
-           y="-5.1587644"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">j</tspan></text>
-      <text
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="113.4819"
-         y="37.611752"><tspan
-           x="113.4819"
-           y="37.611752"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">i</tspan></text>
-      <g transform="translate(-25.323064 -72.260449) scale(1.75 1.75) translate(37.041666 16.541679) scale(0.25 0.25) scale(42.333333 42.333333)">
-        <path style="fill:none;stroke:black;stroke-width:0.01;stroke-linecap:square"
-              d="M0,0 H8 M0,1 H8 M0,2 H8 M0,3 H8 M0,4 H8 M0,0 V4 M1,0 V4 M2,0 V4 M3,0 V4 M4,0 V4 M5,0 V4 M6,0 V4 M7,0 V4 M8,0 V4" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="3.5" r="0.05" />
-        <g transform="translate(0.5 0.0)">
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square;stroke-dasharray:0.1,0.1;stroke-dashoffset:0.05"
-                d="M-0.5,0.5 h8 m-8,2 h8 m-8,2 h8m-8,-4 v4 m2,-4 v4 m2,-4 v4 m2,-4 v4 m2,-4 v4" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 0.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 2.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 4.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 6.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 0.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 2.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 4.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 6.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        </g>
-      </g>
-      <g transform="translate(-23.812502,2.2e-6)">
-        <text
-           y="45.537884"
-           x="54.556301"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.537884"
-             x="54.556301">0.0</tspan></text>
-        <text
-           y="45.538918"
-           x="213.32181"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.538918"
-             x="213.32181">8.0</tspan></text>
-        <path
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-        <text
-           y="45.122406"
-           x="137.32748"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="45.122406"
-             x="137.32748">u</tspan></text>
-      </g>
-      <g transform="translate(-23.812505,7.9375005)">
-        <text
-           y="45.537884"
-           x="54.556301"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.537884"
-             x="54.556301">0.0</tspan></text>
-        <text
-           y="45.538918"
-           x="213.32181"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.538918"
-             x="213.32181">1.0</tspan></text>
-        <path
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)" />
-        <text
-           y="45.122406"
-           x="137.32748"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="45.122406"
-             x="137.32748">s</tspan></text>
-      </g>
-      <g transform="translate(-23.812501,2.6458339)">
-        <text
-           y="-47.066288"
-           x="44.034977"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="-47.066288"
-             x="44.034977">4.0</tspan></text>
-        <text
-           y="32.308716"
-           x="43.972965"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="32.308716"
-             x="43.972965">0.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-           d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835" />
-        <text
-           y="-7.8045983"
-           x="46.93816"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="-7.8045983"
-             x="46.93816">v</tspan></text>
-      </g>
-      <g transform="translate(-34.395835,2.6458339)">
-        <g>
-          <text
-             y="-47.066288"
-             x="44.034977"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-               y="-47.066288"
-               x="44.034977">1.0</tspan></text>
-          <text             
-             y="32.308716"
-             x="43.972965"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-               y="32.308716"
-               x="43.972965">0.0</tspan></text>
-          <path
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483-7)"
-             d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835" />
-          <text
-             y="-7.8045983"
-             x="46.93816"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-               y="-7.8045983"
-               x="46.93816">t</tspan></text>
-        </g>
-      </g>
-    </g>
-    <g transform="translate(-7.6312708e-7,-3.9209711e-6)">
-      <g transform="translate(10.26041625 -1)">
-        <text
-           y="-16.854183"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,1</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="83.156105"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="83.156105"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,1</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,1</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="157.23944"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="157.23944"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,1</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="83.156097"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="83.156097"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="157.23943"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="157.23943"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,0</tspan></tspan></text>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/chromasamples_420_xmidpoint_ymidpoint.svg b/registry/vulkan/images/chromasamples_420_xmidpoint_ymidpoint.svg
deleted file mode 100644
index 31e9b68..0000000
--- a/registry/vulkan/images/chromasamples_420_xmidpoint_ymidpoint.svg
+++ /dev/null
@@ -1,390 +0,0 @@
-<?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"
-   version="1.1"
-   viewBox="0 0 186.82375 101.62997"
-   height="384.11328"
-   width="706.10547">
-  <defs>
-    <marker
-       id="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"       
-       style="overflow:visible">
-      <path         
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       id="marker1483"
-       style="overflow:visible"
-       refX="0"
-       refY="0"
-       orient="auto">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z" />
-    </marker>
-    <marker
-       style="overflow:visible"
-       id="marker1483-7"
-       refX="0"
-       refY="0"
-       orient="auto">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z" />
-    </marker>
-    <marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"       
-       style="overflow:visible">
-      <path
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-  </defs>
-  <g transform="translate(-6.9498988,47.8249)">
-    <g transform="translate(-2.6458349,-3.056108e-6)">
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="-32.729179"><tspan
-           x="34.208187"
-           y="-32.729179"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">3</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="-14.208342"><tspan
-           x="34.208187"
-           y="-14.208342"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">2</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="4.3124924"><tspan
-           x="34.208187"
-           y="4.3124924"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="22.833326"><tspan
-           x="34.208187"
-           y="22.833326"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="47.437355"
-         y="36.062492"><tspan
-           x="47.437355"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="65.958191"
-         y="36.062492"><tspan
-           x="65.958191"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="84.479027"
-         y="36.062492"><tspan
-           x="84.479027"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">2</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="102.99986"
-         y="36.062492"><tspan
-           x="102.99986"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">3</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="121.52069"
-         y="36.062492"><tspan
-           x="121.52069"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">4</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="140.04152"
-         y="36.062492"><tspan
-           x="140.04152"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">5</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="158.56236"
-         y="36.062492"><tspan
-           x="158.56236"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">6</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="177.08319"
-         y="36.062492"><tspan
-           x="177.08319"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">7</tspan></text>
-      <text
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.4366"
-         y="-5.1587644"><tspan
-           x="34.4366"
-           y="-5.1587644"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">j</tspan></text>
-      <text
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="113.4819"
-         y="37.611752"><tspan
-           x="113.4819"
-           y="37.611752"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">i</tspan></text>
-      <g transform="translate(-25.323064 -72.260449) scale(1.75 1.75) translate(37.041666 16.541679) scale(0.25 0.25) scale(42.333333 42.333333)">
-        <path style="fill:none;stroke:black;stroke-width:0.01;stroke-linecap:square"
-              d="M0,0 H8 M0,1 H8 M0,2 H8 M0,3 H8 M0,4 H8 M0,0 V4 M1,0 V4 M2,0 V4 M3,0 V4 M4,0 V4 M5,0 V4 M6,0 V4 M7,0 V4 M8,0 V4" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="3.5" r="0.05" />
-        <g transform="translate(0.5 -0.5)">
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square;stroke-dasharray:0.1,0.1;stroke-dashoffset:0.05"
-                d="M-0.5,0.5 h8 m-8,2 h8 m-8,2 h8m-8,-4 v4 m2,-4 v4 m2,-4 v4 m2,-4 v4 m2,-4 v4" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 0.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 2.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 4.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 6.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 0.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 2.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 4.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 6.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        </g>
-      </g>
-      <g transform="translate(-23.812502,2.2e-6)">
-        <text
-           y="45.537884"
-           x="54.556301"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.537884"
-             x="54.556301">0.0</tspan></text>
-        <text
-           y="45.538918"
-           x="213.32181"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.538918"
-             x="213.32181">8.0</tspan></text>
-        <path
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-        <text
-           y="45.122406"
-           x="137.32748"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="45.122406"
-             x="137.32748">u</tspan></text>
-      </g>
-      <g transform="translate(-23.812505,7.9375005)">
-        <text
-           y="45.537884"
-           x="54.556301"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.537884"
-             x="54.556301">0.0</tspan></text>
-        <text
-           y="45.538918"
-           x="213.32181"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.538918"
-             x="213.32181">1.0</tspan></text>
-        <path
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)" />
-        <text
-           y="45.122406"
-           x="137.32748"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="45.122406"
-             x="137.32748">s</tspan></text>
-      </g>
-      <g transform="translate(-23.812501,2.6458339)">
-        <text
-           y="-47.066288"
-           x="44.034977"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="-47.066288"
-             x="44.034977">4.0</tspan></text>
-        <text
-           y="32.308716"
-           x="43.972965"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="32.308716"
-             x="43.972965">0.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-           d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835" />
-        <text
-           y="-7.8045983"
-           x="46.93816"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="-7.8045983"
-             x="46.93816">v</tspan></text>
-      </g>
-      <g transform="translate(-34.395835,2.6458339)">
-        <g>
-          <text
-             y="-47.066288"
-             x="44.034977"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-               y="-47.066288"
-               x="44.034977">1.0</tspan></text>
-          <text             
-             y="32.308716"
-             x="43.972965"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-               y="32.308716"
-               x="43.972965">0.0</tspan></text>
-          <path
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483-7)"
-             d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835" />
-          <text
-             y="-7.8045983"
-             x="46.93816"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-               y="-7.8045983"
-               x="46.93816">t</tspan></text>
-        </g>
-      </g>
-    </g>
-    <g transform="translate(-7.6312708e-7,-3.9209711e-6)">
-      <g transform="translate(10.26041625 -10.26041625)">
-        <text
-           y="-16.854183"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,1</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="83.156105"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="83.156105"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,1</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,1</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="157.23944"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="157.23944"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,1</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="83.156097"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="83.156097"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="157.23943"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="157.23943"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,0</tspan></tspan></text>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/chromasamples_422_cosited.svg b/registry/vulkan/images/chromasamples_422_cosited.svg
deleted file mode 100644
index ea34dc1..0000000
--- a/registry/vulkan/images/chromasamples_422_cosited.svg
+++ /dev/null
@@ -1,468 +0,0 @@
-<?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"
-   version="1.1"
-   viewBox="0 0 186.82375 101.62997"
-   height="384.11328"
-   width="706.10547">
-  <defs>
-    <marker
-       id="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"       
-       style="overflow:visible">
-      <path         
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       id="marker1483"
-       style="overflow:visible"
-       refX="0"
-       refY="0"
-       orient="auto">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z" />
-    </marker>
-    <marker
-       style="overflow:visible"
-       id="marker1483-7"
-       refX="0"
-       refY="0"
-       orient="auto">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z" />
-    </marker>
-    <marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"       
-       style="overflow:visible">
-      <path
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-  </defs>
-  <g transform="translate(-6.9498988,47.8249)">
-    <g transform="translate(-2.6458349,-3.056108e-6)">
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="-32.729179"><tspan
-           x="34.208187"
-           y="-32.729179"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">3</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="-14.208342"><tspan
-           x="34.208187"
-           y="-14.208342"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">2</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="4.3124924"><tspan
-           x="34.208187"
-           y="4.3124924"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="22.833326"><tspan
-           x="34.208187"
-           y="22.833326"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="47.437355"
-         y="36.062492"><tspan
-           x="47.437355"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="65.958191"
-         y="36.062492"><tspan
-           x="65.958191"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="84.479027"
-         y="36.062492"><tspan
-           x="84.479027"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">2</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="102.99986"
-         y="36.062492"><tspan
-           x="102.99986"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">3</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="121.52069"
-         y="36.062492"><tspan
-           x="121.52069"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">4</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="140.04152"
-         y="36.062492"><tspan
-           x="140.04152"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">5</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="158.56236"
-         y="36.062492"><tspan
-           x="158.56236"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">6</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="177.08319"
-         y="36.062492"><tspan
-           x="177.08319"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">7</tspan></text>
-      <text
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.4366"
-         y="-5.1587644"><tspan
-           x="34.4366"
-           y="-5.1587644"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">j</tspan></text>
-      <text
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="113.4819"
-         y="37.611752"><tspan
-           x="113.4819"
-           y="37.611752"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">i</tspan></text>
-      <g transform="translate(-25.323064 -72.260449) scale(1.75 1.75) translate(37.041666 16.541679) scale(0.25 0.25) scale(42.333333 42.333333)">
-        <path style="fill:none;stroke:black;stroke-width:0.01;stroke-linecap:square"
-              d="M0,0 H8 M0,1 H8 M0,2 H8 M0,3 H8 M0,4 H8 M0,0 V4 M1,0 V4 M2,0 V4 M3,0 V4 M4,0 V4 M5,0 V4 M6,0 V4 M7,0 V4 M8,0 V4" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="3.5" r="0.05" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square;stroke-dasharray:0.1,0.1;stroke-dashoffset:0.05"
-              d="M-0.5,0 h8 m-8,1 h8 m-8,1 h8 m-8,1 h8 m-8,1 h8 m-8,-4 v4 m2,-4 v4 m2,-4 v4 m2,-4 v4 m2,-4 v4" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 0.5,0.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 2.5,0.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 4.5,0.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 6.5,0.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 0.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 2.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 4.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 6.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 0.5,2.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 2.5,2.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 4.5,2.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 6.5,2.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 0.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 2.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 4.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-              d="M 6.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-      </g>
-      <g transform="translate(-23.812502,2.2e-6)">
-        <text
-           y="45.537884"
-           x="54.556301"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.537884"
-             x="54.556301">0.0</tspan></text>
-        <text
-           y="45.538918"
-           x="213.32181"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.538918"
-             x="213.32181">8.0</tspan></text>
-        <path
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-        <text
-           y="45.122406"
-           x="137.32748"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="45.122406"
-             x="137.32748">u</tspan></text>
-      </g>
-      <g transform="translate(-23.812505,7.9375005)">
-        <text
-           y="45.537884"
-           x="54.556301"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.537884"
-             x="54.556301">0.0</tspan></text>
-        <text
-           y="45.538918"
-           x="213.32181"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.538918"
-             x="213.32181">1.0</tspan></text>
-        <path
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)" />
-        <text
-           y="45.122406"
-           x="137.32748"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="45.122406"
-             x="137.32748">s</tspan></text>
-      </g>
-      <g transform="translate(-23.812501,2.6458339)">
-        <text
-           y="-47.066288"
-           x="44.034977"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="-47.066288"
-             x="44.034977">4.0</tspan></text>
-        <text
-           y="32.308716"
-           x="43.972965"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="32.308716"
-             x="43.972965">0.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-           d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835" />
-        <text
-           y="-7.8045983"
-           x="46.93816"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="-7.8045983"
-             x="46.93816">v</tspan></text>
-      </g>
-      <g transform="translate(-34.395835,2.6458339)">
-        <g>
-          <text
-             y="-47.066288"
-             x="44.034977"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-               y="-47.066288"
-               x="44.034977">1.0</tspan></text>
-          <text             
-             y="32.308716"
-             x="43.972965"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-               y="32.308716"
-               x="43.972965">0.0</tspan></text>
-          <path
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483-7)"
-             d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835" />
-          <text
-             y="-7.8045983"
-             x="46.93816"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-               y="-7.8045983"
-               x="46.93816">t</tspan></text>
-        </g>
-      </g>
-    </g>
-    <g transform="translate(-7.6312708e-7,-3.9209711e-6)">
-      <g transform="translate(1 -1)">
-        <text
-           y="-16.854183"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,2</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="83.156105"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="83.156105"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,2</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,2</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="157.23944"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="157.23944"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,2</tspan></tspan></text>
-        <text
-           y="1.6666511"
-           x="46.114433"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="1.6666511"
-             x="46.114433"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,1</tspan></tspan></text>
-        <text
-           y="1.6666511"
-           x="83.15609"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="1.6666511"
-             x="83.15609"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,1</tspan></tspan></text>
-        <text
-           y="1.6666511"
-           x="120.19776"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="1.6666511"
-             x="120.19776"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,1</tspan></tspan></text>
-        <text
-           y="1.6666511"
-           x="157.23943"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="1.6666511"
-             x="157.23943"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,1</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="83.156097"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="83.156097"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="157.23943"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="157.23943"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,0</tspan></tspan></text>
-        <text
-           y="-35.375011"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-35.375011"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,3</tspan></tspan></text>
-        <text
-           y="-35.375011"
-           x="83.156105"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-35.375011"
-             x="83.156105"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,3</tspan></tspan></text>
-        <text
-           y="-35.375011"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-35.375011"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,3</tspan></tspan></text>
-        <text
-           y="-35.375011"
-           x="157.23944"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-35.375011"
-             x="157.23944"><tspan               
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,3</tspan></tspan></text>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/chromasamples_422_midpoint.svg b/registry/vulkan/images/chromasamples_422_midpoint.svg
deleted file mode 100644
index c82a4e5..0000000
--- a/registry/vulkan/images/chromasamples_422_midpoint.svg
+++ /dev/null
@@ -1,475 +0,0 @@
-<?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"
-   version="1.1"
-   viewBox="0 0 186.82375 101.62997"
-   height="384.11328"
-   width="706.10547">
-  <defs>
-    <marker
-       id="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"       
-       style="overflow:visible">
-      <path         
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       id="marker1483"
-       style="overflow:visible"
-       refX="0"
-       refY="0"
-       orient="auto">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z" />
-    </marker>
-    <marker
-       style="overflow:visible"
-       id="marker1483-7"
-       refX="0"
-       refY="0"
-       orient="auto">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z" />
-    </marker>
-    <marker
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"       
-       style="overflow:visible">
-      <path
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-  </defs>
-  <g transform="translate(-6.9498988,47.8249)">
-    <g transform="translate(-2.6458349,-3.056108e-6)">
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="-32.729179"><tspan
-           x="34.208187"
-           y="-32.729179"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">3</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="-14.208342"><tspan
-           x="34.208187"
-           y="-14.208342"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">2</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="4.3124924"><tspan
-           x="34.208187"
-           y="4.3124924"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.208187"
-         y="22.833326"><tspan
-           x="34.208187"
-           y="22.833326"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="47.437355"
-         y="36.062492"><tspan
-           x="47.437355"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="65.958191"
-         y="36.062492"><tspan
-           x="65.958191"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="84.479027"
-         y="36.062492"><tspan
-           x="84.479027"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">2</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="102.99986"
-         y="36.062492"><tspan
-           x="102.99986"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">3</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="121.52069"
-         y="36.062492"><tspan
-           x="121.52069"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">4</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="140.04152"
-         y="36.062492"><tspan
-           x="140.04152"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">5</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="158.56236"
-         y="36.062492"><tspan
-           x="158.56236"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">6</tspan></text>
-      <text
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="177.08319"
-         y="36.062492"><tspan
-           x="177.08319"
-           y="36.062492"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">7</tspan></text>
-      <text
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="34.4366"
-         y="-5.1587644"><tspan
-           x="34.4366"
-           y="-5.1587644"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">j</tspan></text>
-      <text
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         x="113.4819"
-         y="37.611752"><tspan
-           x="113.4819"
-           y="37.611752"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">i</tspan></text>
-      <g
-          transform="translate(-25.323064 -72.260449) scale(1.75 1.75) translate(37.041666 16.541679) scale(0.25 0.25) scale(42.333333 42.333333)">
-        <path style="fill:none;stroke:black;stroke-width:0.01;stroke-linecap:square"
-              d="M0,0 H8 M0,1 H8 M0,2 H8 M0,3 H8 M0,4 H8 M0,0 V4 M1,0 V4 M2,0 V4 M3,0 V4 M4,0 V4 M5,0 V4 M6,0 V4 M7,0 V4 M8,0 V4" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="0.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="1.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="2.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="0.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="1.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="2.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="3.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="4.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="5.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="6.5" cy="3.5" r="0.05" />
-        <circle style="fill:black;stroke:none" cx="7.5" cy="3.5" r="0.05" />
-        <g transform="translate(0.5 0.0)">
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square;stroke-dasharray:0.1,0.1;stroke-dashoffset:0.05"
-                d="M-0.5,0 h8 m-8,1 h8 m-8,1 h8 m-8,1 h8 m-8,1 h8 m-8,-4 v4 m2,-4 v4 m2,-4 v4 m2,-4 v4 m2,-4 v4" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 0.5,0.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 2.5,0.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 4.5,0.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 6.5,0.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 0.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 2.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 4.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 6.5,1.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 0.5,2.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 2.5,2.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 4.5,2.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 6.5,2.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 0.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 2.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 4.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-          <path style="fill:none;stroke:red;stroke-width:0.02;stroke-linecap:square"
-                d="M 6.5,3.5 m-0.08,-0.08 l0.16,0.16 m-0.16,0 l0.16,-0.16 m-0.08,0.08" />
-        </g>
-      </g>
-      <g transform="translate(-23.812502,2.2e-6)">
-        <text
-           y="45.537884"
-           x="54.556301"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.537884"
-             x="54.556301">0.0</tspan></text>
-        <text
-           y="45.538918"
-           x="213.32181"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.538918"
-             x="213.32181">8.0</tspan></text>
-        <path
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-        <text
-           y="45.122406"
-           x="137.32748"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="45.122406"
-             x="137.32748">u</tspan></text>
-      </g>
-      <g transform="translate(-23.812505,7.9375005)">
-        <text
-           y="45.537884"
-           x="54.556301"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           xml:space="preserve"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.537884"
-             x="54.556301">0.0</tspan></text>
-        <text
-           y="45.538918"
-           x="213.32181"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           xml:space="preserve"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="45.538918"
-             x="213.32181">1.0</tspan></text>
-        <path
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)" />
-        <text
-           y="45.122406"
-           x="137.32748"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="45.122406"
-             x="137.32748">s</tspan></text>
-      </g>
-      <g transform="translate(-23.812501,2.6458339)">
-        <text
-           y="-47.066288"
-           x="44.034977"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="-47.066288"
-             x="44.034977">4.0</tspan></text>
-        <text
-           y="32.308716"
-           x="43.972965"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-             y="32.308716"
-             x="43.972965">0.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-           d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835" />
-        <text
-           y="-7.8045983"
-           x="46.93816"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-             y="-7.8045983"
-             x="46.93816">v</tspan></text>
-      </g>
-      <g transform="translate(-34.395835,2.6458339)">
-        <g>
-          <text
-             y="-47.066288"
-             x="44.034977"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-               y="-47.066288"
-               x="44.034977">1.0</tspan></text>
-          <text
-             y="32.308716"
-             x="43.972965"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-               y="32.308716"
-               x="43.972965">0.0</tspan></text>
-          <path
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483-7)"
-             d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835" />
-          <text
-             y="-7.8045983"
-             x="46.93816"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             xml:space="preserve"><tspan
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-               y="-7.8045983"
-               x="46.93816">t</tspan></text>
-        </g>
-      </g>
-    </g>
-    <g transform="translate(-7.6312708e-7,-3.9209711e-6)">
-      <g transform="translate(10.26041625 -1)">
-        <text
-           y="-16.854183"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,2</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="83.156105"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="83.156105"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,2</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,2</tspan></tspan></text>
-        <text
-           y="-16.854183"
-           x="157.23944"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-16.854183"
-             x="157.23944"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,2</tspan></tspan></text>
-        <text
-           y="1.6666511"
-           x="46.114433"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="1.6666511"
-             x="46.114433"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,1</tspan></tspan></text>
-        <text
-           y="1.6666511"
-           x="83.15609"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="1.6666511"
-             x="83.15609"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,1</tspan></tspan></text>
-        <text
-           y="1.6666511"
-           x="120.19776"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="1.6666511"
-             x="120.19776"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,1</tspan></tspan></text>
-        <text
-           y="1.6666511"
-           x="157.23943"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="1.6666511"
-             x="157.23943"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,1</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="83.156097"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="83.156097"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,0</tspan></tspan></text>
-        <text
-           y="20.187485"
-           x="157.23943"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="20.187485"
-             x="157.23943"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,0</tspan></tspan></text>
-        <text
-           y="-35.375011"
-           x="46.114437"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-35.375011"
-             x="46.114437"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 0,3</tspan></tspan></text>
-        <text
-           y="-35.375011"
-           x="83.156105"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-35.375011"
-             x="83.156105"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 1,3</tspan></tspan></text>
-        <text
-           y="-35.375011"
-           x="120.19777"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-35.375011"
-             x="120.19777"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 2,3</tspan></tspan></text>
-        <text
-           y="-35.375011"
-           x="157.23944"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332"><tspan
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke-width:0.26458332"
-             y="-35.375011"
-             x="157.23944"><tspan               
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;stroke-width:0.26458332"> 3,3</tspan></tspan></text>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/commandbuffer_lifecycle.svg b/registry/vulkan/images/commandbuffer_lifecycle.svg
deleted file mode 100644
index be6623f..0000000
--- a/registry/vulkan/images/commandbuffer_lifecycle.svg
+++ /dev/null
@@ -1,501 +0,0 @@
-<?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"
-   width="224.63503mm"
-   height="92.592918mm"
-   viewBox="0 0 224.63503 92.592918"
-   version="1.1"
-   id="svg8"
-   sodipodi:docname="commandbuffer_lifecycle.svg"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker5741"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path5739"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker5571"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path5569"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3457"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3455"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker3373"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path3371"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker1404"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1402"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mstart"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path968"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1320"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1318"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker1274"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path1272"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker1246"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1244"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path971"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker1274-3"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         id="path1272-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.4142136"
-     inkscape:cx="405.79858"
-     inkscape:cy="139.11401"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:measure-start="245,915"
-     inkscape:measure-end="570,915"
-     showguides="false"
-     fit-margin-left="1"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid907"
-       originx="3.8383438"
-       originy="-212.72305" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(3.8383438,8.3159637)">
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.38502529;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-68-2-5"
-       width="63.499996"
-       height="7.9375005"
-       x="76.729164"
-       y="7.8066287" />
-    <text
-       id="text823-4-2-9-4-7-9-2"
-       y="13.361835"
-       x="108.38303"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-4"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496"
-         y="13.361835"
-         x="108.38303"
-         sodipodi:role="line">Initial</tspan></text>
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.38502529;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-68-2-5-2"
-       width="63.499996"
-       height="7.9375005"
-       x="156.10417"
-       y="37.57225" />
-    <text
-       id="text823-4-2-9-4-7-9-2-0"
-       y="43.12746"
-       x="187.75806"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-4-2"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496"
-         y="43.12746"
-         x="187.75806"
-         sodipodi:role="line">Recording</tspan></text>
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.38502529;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-68-2-5-7"
-       width="63.499996"
-       height="7.9375005"
-       x="23.151045"
-       y="73.291" />
-    <text
-       id="text823-4-2-9-4-7-9-2-7"
-       y="78.846207"
-       x="54.804928"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-4-0"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496"
-         y="78.846207"
-         x="54.804928"
-         sodipodi:role="line">Pending</tspan></text>
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.38502529;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-68-2-5-1"
-       width="63.499996"
-       height="7.9375005"
-       x="130.3073"
-       y="73.291" />
-    <text
-       id="text823-4-2-9-4-7-9-2-9"
-       y="78.846207"
-       x="161.96117"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-4-9"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496"
-         y="78.846207"
-         x="161.96117"
-         sodipodi:role="line">Executable</tspan></text>
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.38502529;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-68-2-5-9"
-       width="63.499996"
-       height="7.9375005"
-       x="-2.6458311"
-       y="37.57225" />
-    <text
-       id="text823-4-2-9-4-7-9-2-6"
-       y="43.12746"
-       x="29.008045"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-4-93"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496"
-         y="43.12746"
-         x="29.008045"
-         sodipodi:role="line">Invalid</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="108.47915"
-       y="-4.0996227"
-       id="text905"><tspan
-         sodipodi:role="line"
-         id="tspan903"
-         x="108.47915"
-         y="-4.0996227"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">Allocate</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39749998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="m 140.22916,11.775377 c 17.40186,4.563534 31.44429,11.931433 37.70313,25.796877"
-       id="path911"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687497;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749987,1.58749987;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#marker1404)"
-       d="M 76.72917,11.775375 C 59.32731,16.338909 45.28488,23.706809 39.02604,37.572252"
-       id="path911-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1246)"
-       d="m 177.93228,45.509753 c -2.5839,12.275404 -13.84985,21.278544 -31.74999,27.781249"
-       id="path928"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687497;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749987,1.58749987;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#Arrow1Mstart)"
-       d="m 39.02604,45.509753 c 2.5839,12.275404 13.849846,21.278544 31.749991,27.781249"
-       id="path928-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.42705935px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1274)"
-       d="m 130.30729,77.259753 c -14.77333,2.532909 -29.48724,2.761692 -43.65625,0"
-       id="path945"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.42705935px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1274-3)"
-       d="m 86.651035,75.275378 c 14.773335,-2.532915 29.487245,-2.761695 43.656255,0"
-       id="path945-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687497;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749987,1.58749987;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1320)"
-       d="m 156.10417,39.556628 c -33.57471,-4.289783 -37.71018,-13.456659 -47.625,-23.8125"
-       id="path3349"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687497;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58749987,1.58749987;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker3373)"
-       d="M 144.19792,73.291002 C 129.70275,39.163626 116.89927,24.895373 108.47917,15.744128"
-       id="path3363"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3457)"
-       d="M 108.47917,-2.1152472 V 7.8066273"
-       id="path3447"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="164.04166"
-       y="19.712879"
-       id="text905-5"><tspan
-         sodipodi:role="line"
-         id="tspan903-4"
-         x="164.04166"
-         y="19.712879"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687496">Begin</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="171.97917"
-       y="63.369129"
-       id="text905-5-4"><tspan
-         sodipodi:role="line"
-         id="tspan903-4-1"
-         x="171.97917"
-         y="63.369129"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687496">End</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="108.47915"
-       y="83.212875"
-       id="text905-5-4-3"><tspan
-         sodipodi:role="line"
-         id="tspan903-4-1-1"
-         x="108.47915"
-         y="83.212875"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">Submission</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="107.73502"
-       y="71.306633"
-       id="text905-5-4-3-1"><tspan
-         sodipodi:role="line"
-         id="tspan903-4-1-1-9"
-         x="108.47916"
-         y="71.306633"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">Completion </tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none"
-       x="44.979168"
-       y="61.38475"
-       id="text4726"><tspan
-         sodipodi:role="line"
-         x="44.979168"
-         y="61.38475"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;writing-mode:lr-tb;text-anchor:end;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732">Completion with</tspan><tspan
-         sodipodi:role="line"
-         x="44.979168"
-         y="66.676414"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;writing-mode:lr-tb;text-anchor:end;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan11757">One Time Submit</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="52.916664"
-       y="19.712879"
-       id="text905-6"><tspan
-         sodipodi:role="line"
-         x="52.916664"
-         y="19.712879"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;writing-mode:lr-tb;text-anchor:end;stroke-width:0.39687496"
-         id="tspan3709">Reset</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="116.41668"
-       y="21.697252"
-       id="text905-6-3"><tspan
-         sodipodi:role="line"
-         x="116.41668"
-         y="21.697252"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687496"
-         id="tspan3709-2">Reset</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker5571)"
-       d="M 156.10416,41.541003 H 60.854164"
-       id="path5557"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687499;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875, 1.5875;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker5741)"
-       d="M 140.22916,73.291002 C 126.33855,47.494128 119.0625,41.677088 60.854164,41.541003"
-       id="path5559"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="74.744797"
-       y="47.494129"
-       id="text905-6-3-4"><tspan
-         sodipodi:role="line"
-         x="74.744797"
-         y="47.494129"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496"
-         id="tspan3709-2-2">Invalidate</tspan></text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/fragment_mask.svg b/registry/vulkan/images/fragment_mask.svg
deleted file mode 100644
index 3141035..0000000
--- a/registry/vulkan/images/fragment_mask.svg
+++ /dev/null
@@ -1,422 +0,0 @@
-<?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"
-   width="113.50448mm"
-   height="43.381195mm"
-   viewBox="0 0 113.50448 43.381195"
-   version="1.1"
-   id="svg2745"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="fragment_mask.svg">
-  <defs
-     id="defs2739" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.979899"
-     inkscape:cx="268.47568"
-     inkscape:cy="27.580632"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:measure-start="465,840"
-     inkscape:measure-end="525,730"
-     fit-margin-left="1"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="1672"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3290"
-       originx="-75.481983"
-       originy="-197.30522" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata2742">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-75.481984,-56.313591)">
-    <rect
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4980"
-       width="15.875"
-       height="6.614583"
-       x="171.97917"
-       y="72.104164" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4982"
-       width="15.875"
-       height="6.614583"
-       x="171.97917"
-       y="78.71875" />
-    <path
-       style="fill:#ff0000;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 108.47917,66.8125 C 87.312504,98.562495 87.312504,98.562495 87.312504,98.562495 h 42.333336 z"
-       id="path4959"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 97.895833,57.552083 C 76.729173,89.302078 76.729173,89.302078 76.729173,89.302078 H 119.06251 Z"
-       id="path4959-2"
-       inkscape:connector-curvature="0" />
-    <g
-       transform="translate(-68.791667,6.6145833)"
-       id="g4020-9"
-       style="stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none">
-      <circle
-         r="0.52778977"
-         cy="70.78125"
-         cx="178.59375"
-         id="path4517-78-7-8-8-9-0-5"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="76.072914"
-         cx="189.17708"
-         id="path4517-78-7-8-8-9-0-3-0"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="81.364586"
-         cx="173.30208"
-         id="path4517-78-7-8-8-9-0-4-3"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="86.65625"
-         cx="183.88542"
-         id="path4517-78-7-8-8-9-0-7-9"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    </g>
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4722"
-       width="21.148586"
-       height="40.992329"
-       x="134.9375"
-       y="57.552082"
-       ry="1.2710052e-006" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="145.52083"
-       y="62.84375"
-       id="text4726"><tspan
-         sodipodi:role="line"
-         x="145.52083"
-         y="62.84375"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4728">Color</tspan><tspan
-         sodipodi:role="line"
-         x="145.52083"
-         y="68.135414"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732">Samples</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 134.9375,72.104167 h 21.16666"
-       id="path4734"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 145.52083,72.104167 V 98.5625"
-       id="path4736"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="140.22917"
-       y="77.395836"
-       id="text4726-8"><tspan
-         sodipodi:role="line"
-         x="140.22917"
-         y="77.395836"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2">0</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 134.9375,78.71875 h 21.16666"
-       id="path4801"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 134.9375,85.333333 h 21.16666"
-       id="path4803"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 134.9375,91.947917 h 21.16666"
-       id="path4805"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="150.8125"
-       y="97.239586"
-       id="text4726-8-3"><tspan
-         sodipodi:role="line"
-         x="150.8125"
-         y="97.239586"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-5">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="140.22917"
-       y="84.010414"
-       id="text4726-8-2"><tspan
-         sodipodi:role="line"
-         x="140.22917"
-         y="84.010414"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-3">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="150.8125"
-       y="77.395836"
-       id="text4726-8-2-1"><tspan
-         sodipodi:role="line"
-         x="150.8125"
-         y="77.395836"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-3-2">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="150.8125"
-       y="90.625"
-       id="text4726-8-2-9"><tspan
-         sodipodi:role="line"
-         x="150.8125"
-         y="90.625"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-3-3">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="140.22917"
-       y="90.625"
-       id="text4726-8-2-0"><tspan
-         sodipodi:role="line"
-         x="140.22917"
-         y="90.625"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-3-0">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="150.8125"
-       y="84.010414"
-       id="text4726-8-2-0-2"><tspan
-         sodipodi:role="line"
-         x="150.8125"
-         y="84.010414"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-3-0-7">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="140.22917"
-       y="97.239586"
-       id="text4726-8-2-0-0"><tspan
-         sodipodi:role="line"
-         x="140.22917"
-         y="97.239586"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-3-0-6">3</tspan></text>
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4722-1"
-       width="26.458307"
-       height="40.992329"
-       x="161.39584"
-       y="57.552086"
-       ry="1.2710052e-006" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="174.625"
-       y="62.84375"
-       id="text4726-6"><tspan
-         sodipodi:role="line"
-         x="174.625"
-         y="62.84375"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4728-4">Color</tspan><tspan
-         sodipodi:role="line"
-         x="174.625"
-         y="68.135414"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-0">Fragments</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 161.39584,72.104167 h 26.45833"
-       id="path4734-1"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 171.97917,72.104167 V 98.5625"
-       id="path4736-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="166.68752"
-       y="77.395836"
-       id="text4726-8-0"><tspan
-         sodipodi:role="line"
-         x="166.68752"
-         y="77.395836"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-0">0</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 161.39584,78.71875 h 26.45833"
-       id="path4801-3"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 161.39584,85.333333 h 26.45833"
-       id="path4803-2"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 161.39584,91.947916 h 26.45833"
-       id="path4805-4"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="166.68752"
-       y="84.010414"
-       id="text4726-8-2-4"><tspan
-         sodipodi:role="line"
-         x="166.68752"
-         y="84.010414"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-3-9">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="166.68752"
-       y="90.625"
-       id="text4726-8-2-0-4"><tspan
-         sodipodi:role="line"
-         x="166.68752"
-         y="90.625"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-3-0-3">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-       x="166.68752"
-       y="97.239594"
-       id="text4726-8-2-0-0-7"><tspan
-         sodipodi:role="line"
-         x="166.68752"
-         y="97.239594"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-3-0-6-4">3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="179.91667"
-       y="90.625008"
-       id="text4986"><tspan
-         sodipodi:role="line"
-         id="tspan4984"
-         x="179.91667"
-         y="90.625008"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Unused</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="179.91667"
-       y="97.239586"
-       id="text4986-3"><tspan
-         sodipodi:role="line"
-         id="tspan4984-2"
-         x="179.91667"
-         y="97.239586"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Unused</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none"
-       x="101.86459"
-       y="87.979172"
-       id="text4726-8-7"><tspan
-         sodipodi:role="line"
-         x="101.86459"
-         y="87.979172"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-7">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none"
-       x="123.03125"
-       y="82.687508"
-       id="text4726-8-7-5"><tspan
-         sodipodi:role="line"
-         x="123.03125"
-         y="82.687508"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-7-8">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none"
-       x="107.15625"
-       y="77.395836"
-       id="text4726-8-7-1"><tspan
-         sodipodi:role="line"
-         x="107.15625"
-         y="77.395836"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-7-1">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none"
-       x="117.73959"
-       y="93.270836"
-       id="text4726-8-7-4"><tspan
-         sodipodi:role="line"
-         x="117.73959"
-         y="93.270836"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none"
-         id="tspan4732-2-7-7">3</tspan></text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/innerquad.svg b/registry/vulkan/images/innerquad.svg
deleted file mode 100644
index 04a6a19..0000000
--- a/registry/vulkan/images/innerquad.svg
+++ /dev/null
@@ -1,700 +0,0 @@
-<?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"
-   width="213.40439mm"
-   height="82.336044mm"
-   viewBox="0 0 213.40439 82.336044"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="innerquad.svg">
-  <defs
-     id="defs8647" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="417.43978"
-     inkscape:cy="37.024591"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="-8"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="85.351053"
-       originy="-193.77742" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(85.351047,-20.886535)">
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.39687496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 42.333339,42.999989 c 0,31.75 0,31.75 0,31.75"
-       id="path2102"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.39687496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 58.20834,42.999989 c 0,31.75 0,31.75 0,31.75"
-       id="path2104"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.39687496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 74.083339,42.999989 c 0,31.75 0,31.75 0,31.75"
-       id="path2106"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.39687496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 89.958339,42.999989 c 0,31.75 0,31.75 0,31.75"
-       id="path2108"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.39687496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 26.458339,58.874988 c 79.375001,0 79.375001,0 79.375001,0"
-       id="path2110"
-       inkscape:connector-curvature="0" />
-    <rect
-       id="rect3703-2"
-       width="111.125"
-       height="63.499981"
-       x="10.583337"
-       y="27.124992"
-       style="opacity:0.88500001;fill:none;stroke:#000000;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 26.458336,27.124995 V 42.99998"
-       id="path9655"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 42.333337,27.124994 V 42.99998"
-       id="path9655-4"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 58.208337,27.124994 V 42.99998"
-       id="path9655-2"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 105.83334,42.99998 h 15.87499"
-       id="path9693"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 10.583337,42.999995 H 26.458335"
-       id="path9693-1"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="5.5028787"
-       y="25.213295"
-       id="text5070-2-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3"
-         x="5.5028787"
-         y="25.213295"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(0,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="116.35319"
-       y="25.102877"
-       id="text5070-2-2-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-4"
-         x="116.35319"
-         y="25.102877"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(1,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="5.313765"
-       y="94.580177"
-       id="text5070-2-2-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-3"
-         x="5.313765"
-         y="94.580177"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(0,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="116.56095"
-       y="94.66819"
-       id="text5070-2-2-6-0"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-4-0"
-         x="116.56095"
-         y="94.66819"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(1,0)</tspan></text>
-    <g
-       id="g2002"
-       transform="matrix(1.5,0,0,1.5,-46.79366,-77.20566)">
-      <circle
-         r="0.52778977"
-         cy="69.582268"
-         cx="38.289722"
-         id="path4517"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="69.582268"
-         cx="48.873055"
-         id="path4517-7"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="69.582268"
-         cx="59.456387"
-         id="path4517-78"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="69.582268"
-         cx="70.039726"
-         id="path4517-7-9"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="69.582268"
-         cx="80.623055"
-         id="path4517-0"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="80.165604"
-         cx="38.289722"
-         id="path4517-5"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="80.165604"
-         cx="48.873055"
-         id="path4517-7-8"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="80.165604"
-         cx="59.456387"
-         id="path4517-78-7"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="80.165604"
-         cx="70.039726"
-         id="path4517-7-9-2"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="80.165604"
-         cx="80.623055"
-         id="path4517-0-0"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="90.74894"
-         cx="38.289722"
-         id="path4517-9"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="90.74894"
-         cx="48.873055"
-         id="path4517-7-87"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="69.582268"
-         cx="91.20639"
-         id="path4517-78-70"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="69.582268"
-         cx="101.78973"
-         id="path4517-7-9-7"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="69.582268"
-         cx="112.37305"
-         id="path4517-0-7"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="80.165604"
-         cx="91.20639"
-         id="path4517-78-7-5"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="80.165604"
-         cx="101.78973"
-         id="path4517-7-9-2-4"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="80.165604"
-         cx="112.37305"
-         id="path4517-0-0-0"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="90.74894"
-         cx="101.78973"
-         id="path4517-7-9-4-3"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="90.74894"
-         cx="112.37306"
-         id="path4517-0-6-7"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-111.9183"
-         cx="38.256454"
-         id="path4517-56"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-111.9183"
-         cx="48.83979"
-         id="path4517-7-2"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-111.9183"
-         cx="59.423122"
-         id="path4517-78-0"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-111.9183"
-         cx="70.006462"
-         id="path4517-7-9-8"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-111.9183"
-         cx="80.58979"
-         id="path4517-0-70"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-101.33495"
-         cx="38.256454"
-         id="path4517-5-6"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-101.33495"
-         cx="48.83979"
-         id="path4517-7-8-9"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-101.33495"
-         cx="59.423122"
-         id="path4517-78-7-9"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-101.33495"
-         cx="70.006462"
-         id="path4517-7-9-2-3"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-101.33495"
-         cx="80.58979"
-         id="path4517-0-0-4"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-90.751633"
-         cx="38.256454"
-         id="path4517-9-3"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-90.751633"
-         cx="48.83979"
-         id="path4517-7-87-0"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-111.9183"
-         cx="91.173119"
-         id="path4517-78-70-1"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-111.9183"
-         cx="101.75645"
-         id="path4517-7-9-7-7"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-111.9183"
-         cx="112.33977"
-         id="path4517-0-7-0"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-101.33495"
-         cx="91.173119"
-         id="path4517-78-7-5-9"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-101.33495"
-         cx="101.75645"
-         id="path4517-7-9-2-4-1"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-101.33495"
-         cx="112.33977"
-         id="path4517-0-0-0-1"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-90.751633"
-         cx="101.75645"
-         id="path4517-7-9-4-3-6"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-      <circle
-         transform="scale(1,-1)"
-         r="0.52778977"
-         cy="-90.751633"
-         cx="112.33979"
-         id="path4517-0-6-7-6"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555797;stroke-opacity:1" />
-    </g>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 74.083339,27.124989 V 42.999975"
-       id="path9655-2-8"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 89.95834,27.124989 V 42.999975"
-       id="path9655-2-6"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 105.83334,27.124989 V 42.999975"
-       id="path9655-2-7"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 26.458339,74.749989 V 90.624975"
-       id="path9655-2-1"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 42.33334,74.749989 V 90.624975"
-       id="path9655-2-4"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 58.20834,74.749989 V 90.624975"
-       id="path9655-2-2"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 74.083339,74.749989 V 90.624975"
-       id="path9655-2-88"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 89.95834,74.749989 V 90.624975"
-       id="path9655-2-0"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 105.83334,74.749989 V 90.624975"
-       id="path9655-2-23"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 105.83334,58.874988 h 15.87499"
-       id="path9693-6"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 105.83334,74.749989 h 15.87501"
-       id="path9693-9"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 10.58334,74.749989 H 26.458333"
-       id="path9693-0"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M 10.58334,58.874988 H 26.458333"
-       id="path9693-5"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.39687496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 26.458339,42.999989 c 79.375001,0 79.375001,0 79.375001,0 v 31.75 H 26.458339 v -31.75"
-       id="path2100"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g9727"
-       transform="matrix(1.5,0,0,1.5,-136.08449,-54.396465)">
-      <circle
-         r="0.52778977"
-         cy="64.922615"
-         cx="37.797619"
-         id="path4517-564"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="64.922615"
-         cx="48.380951"
-         id="path4517-7-24"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="64.922615"
-         cx="58.964283"
-         id="path4517-78-1"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="64.922615"
-         cx="69.547615"
-         id="path4517-7-9-77"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="64.922615"
-         cx="80.130943"
-         id="path4517-0-5"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="75.505951"
-         cx="37.797619"
-         id="path4517-5-1"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="75.505951"
-         cx="48.380951"
-         id="path4517-7-8-7"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="75.505951"
-         cx="58.964283"
-         id="path4517-78-7-8"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="75.505951"
-         cx="69.547615"
-         id="path4517-7-9-2-8"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="75.505951"
-         cx="80.130943"
-         id="path4517-0-0-1"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="86.089287"
-         cx="37.797619"
-         id="path4517-9-5"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="86.089287"
-         cx="48.380951"
-         id="path4517-7-87-3"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="86.089287"
-         cx="58.964283"
-         id="path4517-78-0-2"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="86.089287"
-         cx="69.547615"
-         id="path4517-7-9-4"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-      <circle
-         r="0.52778977"
-         cy="86.089287"
-         cx="80.130951"
-         id="path4517-0-6"
-         style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.10555796;stroke-opacity:1" />
-    </g>
-    <rect
-       id="rect3703-2-4"
-       width="63.499992"
-       height="31.75"
-       x="-79.375"
-       y="42.999996"
-       style="opacity:0.88500001;fill:none;stroke:#000000;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -63.500001,42.999996 v 31.75"
-       id="path9655-0"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M -47.625,42.999995 V 74.749994"
-       id="path9655-4-6"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="M -31.749997,42.999995 V 74.749994"
-       id="path9655-2-9"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -31.749997,58.874995 h 15.874998"
-       id="path9693-62"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.39687496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -63.500001,58.874995 h 31.749999"
-       id="path9695"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -79.375,58.874995 h 15.874999"
-       id="path9693-1-9"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="-84.45546"
-       y="41.088295"
-       id="text5070-2-2-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36"
-         x="-84.45546"
-         y="41.088295"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(0,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="-21.031706"
-       y="41.176315"
-       id="text5070-2-2-6-1"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-4-6"
-         x="-21.031706"
-         y="41.176315"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(1,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="-84.644569"
-       y="78.903603"
-       id="text5070-2-2-5-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-3-4"
-         x="-84.644569"
-         y="78.903603"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(0,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="-21.220816"
-       y="78.991623"
-       id="text5070-2-2-6-0-4"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-4-0-3"
-         x="-21.220816"
-         y="78.991623"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(1,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="-52.295326"
-       y="85.413338"
-       id="text2799"><tspan
-         sodipodi:role="line"
-         id="tspan2797"
-         x="-52.295326"
-         y="85.413338"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687496">(a)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="61.65501"
-       y="101.37095"
-       id="text2799-0"><tspan
-         sodipodi:role="line"
-         id="tspan2797-0"
-         x="61.65501"
-         y="101.37095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687496">(b)</tspan></text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/innertri.svg b/registry/vulkan/images/innertri.svg
deleted file mode 100644
index 0868a3f..0000000
--- a/registry/vulkan/images/innertri.svg
+++ /dev/null
@@ -1,565 +0,0 @@
-<?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"
-   width="180.51871mm"
-   height="75.629333mm"
-   viewBox="0 0 180.5187 75.629333"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="innertri.svg">
-  <defs
-     id="defs8647" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="243.40083"
-     inkscape:cy="90.033505"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="-8"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="66.42264"
-       originy="-193.13802" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(66.422641,-28.232645)">
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.39687499px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m -26.458331,61.520827 -15.875,23.812499 h 31.750001 z"
-       id="path5083"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-       x="-33.922741"
-       y="44.355228"
-       id="text5070-2-2-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36"
-         x="-33.922741"
-         y="44.355228"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687499">(0,1,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-       x="-29.592077"
-       y="102.01035"
-       id="text2799"><tspan
-         sodipodi:role="line"
-         id="tspan2797"
-         x="-29.592077"
-         y="102.01035"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499">(a)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-       x="65.757034"
-       y="99.802383"
-       id="text2799-0"><tspan
-         sodipodi:role="line"
-         id="tspan2797-0"
-         x="65.757034"
-         y="99.802383"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687499">(b)</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8"
-       cx="-26.461729"
-       cy="45.642532"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6"
-       cx="-34.399227"
-       cy="57.548782"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-9"
-       cx="-42.336727"
-       cy="69.455032"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-99"
-       cx="-50.274231"
-       cy="81.361282"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-7"
-       cx="58.204929"
-       cy="-93.274124"
-       r="0.79168469"
-       transform="scale(-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-5"
-       cx="18.517424"
-       cy="57.548782"
-       r="0.79168469"
-       transform="scale(-1,1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-9-6"
-       cx="10.579925"
-       cy="69.45504"
-       r="0.79168469"
-       transform="scale(-1,1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-99-1"
-       cx="2.6424396"
-       cy="81.361282"
-       r="0.79168469"
-       transform="scale(-1,1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-7-4"
-       cx="5.2882776"
-       cy="-93.274124"
-       r="0.79168469"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-7-44"
-       cx="42.329926"
-       cy="-93.274124"
-       r="0.79168469"
-       transform="scale(-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-7-9"
-       cx="26.454931"
-       cy="-93.274124"
-       r="0.79168469"
-       transform="scale(-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-7-7"
-       cx="10.579925"
-       cy="-93.274124"
-       r="0.79168469"
-       transform="scale(-1)" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687499px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M -26.458331,45.645828 C -58.20833,93.270825 -58.20833,93.270825 -58.20833,93.270825 H 5.2916687 Z"
-       id="path4959"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1"
-       cx="-26.461729"
-       cy="61.517532"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-4"
-       cx="-18.524229"
-       cy="73.423782"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-9"
-       cx="-34.399231"
-       cy="-73.430374"
-       r="0.79168469"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-9-1"
-       cx="-42.336735"
-       cy="-85.336624"
-       r="0.79168469"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-9-4"
-       cx="10.57994"
-       cy="-85.336624"
-       r="0.79168469"
-       transform="scale(-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-7-44-8"
-       cx="26.454931"
-       cy="-85.336624"
-       r="0.79168469"
-       transform="scale(-1)" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -18.520831,57.552077 -7.9375,3.96875"
-       id="path5087"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -10.58333,69.458327 -7.937501,3.96875"
-       id="path5089"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -2.6458313,81.364576 c -7.9374987,3.96875 -7.9374987,3.96875 -7.9374987,3.96875"
-       id="path5091"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -10.58333,93.270825 c 0,-7.937499 0,-7.937499 0,-7.937499"
-       id="path5093"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -26.458331,93.270825 c 0,-7.937499 0,-7.937499 0,-7.937499"
-       id="path5095"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -42.333331,93.270825 c 0,-7.937499 0,-7.937499 0,-7.937499"
-       id="path5097"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -50.27083,81.364576 c 7.937499,3.96875 7.937499,3.96875 7.937499,3.96875"
-       id="path5099"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -42.333331,69.458327 c 7.937501,3.96875 7.937501,3.96875 7.937501,3.96875"
-       id="path5101"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m -34.39583,57.552077 c 7.937499,3.96875 7.937499,3.96875 7.937499,3.96875"
-       id="path5103"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-       x="-2.1713245"
-       y="97.675507"
-       id="text5070-2-2-9-3"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-1"
-         x="-2.1713245"
-         y="97.675507"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687499">(1,0,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-       x="-65.716164"
-       y="97.612831"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="-65.716164"
-         y="97.612831"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687499">(0,0,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-       x="58.681427"
-       y="32.448986"
-       id="text5070-2-2-9-8"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-3"
-         x="58.681427"
-         y="32.448986"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687499">(0,1,0)</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-1"
-       cx="66.142441"
-       cy="33.736286"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-3"
-       cx="58.204941"
-       cy="45.642536"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-9-2"
-       cx="50.267445"
-       cy="57.548786"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-99-3"
-       cx="42.329937"
-       cy="69.455032"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-7-99"
-       cx="-34.399239"
-       cy="-81.367874"
-       r="0.79168469"
-       transform="scale(-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-5-5"
-       cx="-74.086746"
-       cy="45.642536"
-       r="0.79168469"
-       transform="scale(-1,1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-9-6-3"
-       cx="-82.024246"
-       cy="57.54879"
-       r="0.79168469"
-       transform="scale(-1,1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-99-1-9"
-       cx="-89.961716"
-       cy="69.455032"
-       r="0.79168469"
-       transform="scale(-1,1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-7-4-3"
-       cx="97.892448"
-       cy="-81.367874"
-       r="0.79168469"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-7"
-       cx="66.142441"
-       cy="49.611282"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-4-2"
-       cx="74.079941"
-       cy="61.517532"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-9-9"
-       cx="58.204941"
-       cy="-61.524132"
-       r="0.79168469"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-9-1-9"
-       cx="50.267433"
-       cy="-73.430374"
-       r="0.79168469"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-9-4-8"
-       cx="-82.024231"
-       cy="-73.430374"
-       r="0.79168469"
-       transform="scale(-1)" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.39687499;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 66.145837,61.520831 54.239585,79.380206 h 23.8125 z"
-       id="path5083-8-8"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-7-4"
-       cx="66.142441"
-       cy="61.517532"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-9-9-2"
-       cx="54.236198"
-       cy="-79.395912"
-       r="0.79168469"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-9-9-2-3"
-       cx="78.061111"
-       cy="-79.395912"
-       r="0.79168469"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-7-7"
-       cx="50.267433"
-       cy="73.423782"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-4-2-4"
-       cx="58.204929"
-       cy="85.33004"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-9-9-5"
-       cx="42.329937"
-       cy="-85.336632"
-       r="0.79168469"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-7-45"
-       cx="82.017433"
-       cy="73.423782"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-4-2-6"
-       cx="89.954933"
-       cy="85.330025"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-9-9-4"
-       cx="74.079948"
-       cy="-85.336632"
-       r="0.79168469"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-4-2-60"
-       cx="105.82993"
-       cy="93.267532"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-9-9-45"
-       cx="89.954941"
-       cy="-93.274124"
-       r="0.79168469"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-4-2-7"
-       cx="42.329937"
-       cy="93.267525"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-9-9-1"
-       cx="26.454943"
-       cy="-93.274124"
-       r="0.79168469"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-4-2-1"
-       cx="58.204937"
-       cy="93.267532"
-       r="0.79168469" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15833695;stroke-opacity:1"
-       id="path4517-78-7-8-8-6-1-9-9-20"
-       cx="74.079941"
-       cy="-93.274124"
-       r="0.79168469"
-       transform="scale(1,-1)" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.39687499;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 66.145834,49.614578 42.333335,85.333328 H 89.958334 Z"
-       id="path6079"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687499px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 66.145834,33.739578 26.458336,93.270827 h 79.374994 z"
-       id="path6081"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 74.083334,45.645828 -7.9375,3.96875 -7.937499,-3.96875 v 0"
-       id="path6083"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 50.270834,57.552078 7.937501,3.96875 h 7.937499 7.9375 l 7.937501,-3.96875"
-       id="path6085"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 89.958334,69.458328 -7.937499,3.96875 -3.968751,5.953125 -3.96875,5.953125 v 7.937499"
-       id="path6087"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 42.333335,69.458328 7.937499,3.96875 3.96875,5.953125 3.968751,5.953125 v 7.937499"
-       id="path6089"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 34.395835,81.364578 7.9375,3.96875 v 7.937499"
-       id="path6091"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.396875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.5875,1.5875;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 97.895834,81.364578 -7.9375,3.96875 v 7.937499"
-       id="path6093"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-       x="98.370346"
-       y="97.675514"
-       id="text5070-2-2-9-3-3"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-1-2"
-         x="98.370346"
-         y="97.675514"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687499">(1,0,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-       x="19.148937"
-       y="97.811272"
-       id="text5070-2-2-9-9-1"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5"
-         x="19.148937"
-         y="97.811272"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke-width:0.39687499">(0,0,1)</tspan></text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/non_strict_lines.svg b/registry/vulkan/images/non_strict_lines.svg
deleted file mode 100644
index 0474685..0000000
--- a/registry/vulkan/images/non_strict_lines.svg
+++ /dev/null
@@ -1,244 +0,0 @@
-<?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"
-   width="152.70503mm"
-   height="83.873383mm"
-   viewBox="0 0 152.70503 83.873383"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="non_strict_lines.svg">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2639"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2637"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mstart"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path2320"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path2323"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="88.14801"
-     inkscape:cy="136.35995"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="1672"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0"
-     fit-margin-left="1"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1">
-    <inkscape:grid
-       type="xygrid"
-       id="grid815"
-       originx="-7.219306"
-       originy="-184.92629" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-7.2193063,-28.200331)">
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.52916664px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 32.980582,89.448147 133.52226,31.239815 V 52.406479 L 32.980582,110.61481 Z"
-       id="path817"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.52999997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="M 32.980582,100.03148 133.52226,41.823147"
-       id="path819"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.52916664"
-       x="76.729164"
-       y="61.520836"
-       id="text2799"><tspan
-         sodipodi:role="line"
-         id="tspan2797"
-         x="76.729164"
-         y="61.520836"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;writing-mode:lr-tb;text-anchor:end;stroke-width:0.52916664">Edge 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.52916664"
-       x="89.958336"
-       y="82.687508"
-       id="text2799-6"><tspan
-         sodipodi:role="line"
-         id="tspan2797-0"
-         x="89.958336"
-         y="82.687508"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.52916664">Edge 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.52916664"
-       x="134.9375"
-       y="32.416672"
-       id="text2799-4"><tspan
-         sodipodi:role="line"
-         id="tspan2797-02"
-         x="134.9375"
-         y="32.416672"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.52916664">Edge 3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.52916664"
-       x="31.75"
-       y="109.14584"
-       id="text2799-38"><tspan
-         sodipodi:role="line"
-         id="tspan2797-4"
-         x="31.75"
-         y="109.14584"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;writing-mode:lr-tb;text-anchor:end;stroke-width:0.52916664">Edge 2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.52916664"
-       x="27.599689"
-       y="101.60439"
-       id="text2799-67"
-       transform="rotate(-30.47281)"><tspan
-         sodipodi:role="line"
-         id="tspan2797-1"
-         x="27.599689"
-         y="101.60439"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.52916664">Original</tspan><tspan
-         sodipodi:role="line"
-         x="27.599689"
-         y="106.89606"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.52916664"
-         id="tspan1613">Line</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.21111594;stroke-opacity:1"
-       id="path4517-78-7-8-8-9"
-       cx="133.52223"
-       cy="41.823147"
-       r="1.0555795" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.21111594;stroke-opacity:1"
-       id="path4517-78-7-8-8-9-0"
-       cx="32.980579"
-       cy="100.03149"
-       r="1.0555795" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.52916664"
-       x="136.16811"
-       y="41.823147"
-       id="text2799-3"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9"
-         x="136.16811"
-         y="41.823147"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.52916664">(Xb,Yb,Zb)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.52916664"
-       x="30.334751"
-       y="100.03149"
-       id="text2799-3-5"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-1"
-         x="30.334751"
-         y="100.03149"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:end;writing-mode:lr-tb;text-anchor:end;stroke-width:0.52916664">(Xa,Ya,Za)</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.52899997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58699992,1.58699992;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#marker2639)"
-       d="M 115.00141,41.823147 V 62.989813"
-       id="path2597"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.52916664"
-       x="104.41809"
-       y="33.885647"
-       id="text2799-7"><tspan
-         sodipodi:role="line"
-         id="tspan2797-7"
-         x="104.41809"
-         y="33.885647"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.52916664">Line</tspan><tspan
-         sodipodi:role="line"
-         x="104.41809"
-         y="39.177315"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.52916664"
-         id="tspan2695">Width</tspan></text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/pipeline.svg b/registry/vulkan/images/pipeline.svg
deleted file mode 100644
index bf223ae..0000000
--- a/registry/vulkan/images/pipeline.svg
+++ /dev/null
@@ -1,1492 +0,0 @@
-<?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"
-   width="775.12067"
-   height="418"
-   viewBox="0 0 775.12066 418"
-   version="1.1"
-   id="svg8"
-   sodipodi:docname="pipeline.svg"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker18097"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart">
-      <path
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path18095"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker17835"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart">
-      <path
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path17833"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17557"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path17555"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker17291"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path17289"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker16647"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path16645"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker16415"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path16413"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker16189"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path16187"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker15937"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path15935"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker12928"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path12926"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker11520"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path11518"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker11322"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path11320"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker11128"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path11126"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker10596"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path10594"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9866"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path9864"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9512"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path9510"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker8090"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path8088"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker7360"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path7358"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker7066"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path7064"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker5106"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path5104"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker7066-0"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path7064-8" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker7208-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path7206-1" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-01"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-8"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7-8"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9-7"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-01-3"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-8-44"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mstart-3"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path1382-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker5200-6"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path5198-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-01-3-1"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-8-44-8"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7-8-7"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9-7-8"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7-8-7-7"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9-7-8-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7-8-7-7-5"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9-7-8-5-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7-8-7-7-0"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9-7-8-5-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7-8-7-7-0-51"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9-7-8-5-2-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9512-2"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path9510-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2"
-     inkscape:cx="802.95319"
-     inkscape:cy="160.46629"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:snap-center="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1137"
-     inkscape:window-x="478"
-     inkscape:window-y="424"
-     inkscape:window-maximized="0"
-     showguides="false"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     fit-margin-left="1"
-     units="in"
-     inkscape:snap-others="true"
-     inkscape:snap-nodes="true"
-     inkscape:object-nodes="true"
-     height="7.5in">
-    <inkscape:grid
-       type="xygrid"
-       id="grid817"
-       originx="153.62068"
-       originy="-783.5" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(38.615418,2.1124474)">
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-1-2-4"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="269.3876" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-9-8"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994741"
-       y="159.38759" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-1"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="129.38759" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-9"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="99.387589" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="59.387589" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="-0.6124118" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994738"
-       y="29.387552" />
-    <text
-       id="text823"
-       y="74.351746"
-       x="84.9011"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="74.351746"
-         x="84.9011"
-         sodipodi:role="line">Vertex Shader</tspan></text>
-    <text
-       id="text823-4"
-       y="14.133646"
-       x="84.634171"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="14.133646"
-         x="84.634171"
-         sodipodi:role="line">Draw</tspan></text>
-    <text
-       id="text823-4-2"
-       y="43.111511"
-       x="84.539764"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="43.111511"
-         x="84.539764"
-         sodipodi:role="line">Input Assembler</tspan></text>
-    <text
-       id="text823-7"
-       y="114.35175"
-       x="84.985733"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825-4"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="114.35175"
-         x="84.985733"
-         sodipodi:role="line">Tessellation Control Shader</tspan></text>
-    <text
-       id="text823-4-2-6-3"
-       y="144.35175"
-       x="84.985733"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-1-5"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="144.35175"
-         x="84.985733"
-         sodipodi:role="line">Tessellation Primitive Generator</tspan></text>
-    <text
-       id="text823-7-0"
-       y="174.35175"
-       x="84.985733"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825-4-7"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="174.35175"
-         x="84.985733"
-         sodipodi:role="line">Tessellation Evaluation Shader</tspan></text>
-    <text
-       id="text823-4-2-8"
-       y="284.1662"
-       x="84.930397"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-9"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="284.1662"
-         x="84.930397"
-         sodipodi:role="line">Rasterization</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5106)"
-       d="m 85.005262,89.387553 -119.999999,-10e-7 V 229.38755 h 120"
-       id="path4474"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccc" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1"
-       width="220"
-       height="20"
-       x="245.00526"
-       y="-0.61244744" />
-    <text
-       id="text823-4-2-9-4-7"
-       y="14.384297"
-       x="354.53976"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="14.384297"
-         x="354.53976"
-         sodipodi:role="line">Indirect Buffer</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker7360)"
-       d="m 235.00526,309.38755 v 60 h -40"
-       id="path7350"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker8090)"
-       d="m 245.00526,344.38755 h -5 v -5 h -10 v 5 h -35"
-       id="path8837"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccc" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect8983"
-       width="220"
-       height="165"
-       x="245.00526"
-       y="99.38755" />
-    <text
-       id="text823-4-2-9-4-7-9-85"
-       y="112.9813"
-       x="354.63092"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-7"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="112.9813"
-         x="354.63092"
-         sodipodi:role="line">Descriptor Sets</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker7066-0);marker-end:url(#marker7208-7)"
-       d="m 245.00526,399.38755 h -50"
-       id="path7056-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9512)"
-       d="m 245.00526,9.3875524 h -50"
-       id="path9502"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9866)"
-       d="m 245.00526,44.387553 h -50"
-       id="path9856"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker7066);marker-end:url(#marker10596)"
-       d="m 245.00526,309.38755 h -20 v -5 h -10 v 5 h -20"
-       id="path10568"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 245.00526,64.387553 h -25 v -20"
-       id="path11116"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker11128)"
-       d="m 220.00526,109.38755 h -25"
-       id="path11118"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker11322)"
-       d="m 220.00526,169.38755 h -25"
-       id="path11312"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker11520)"
-       d="m 220.00526,209.38755 h -25"
-       id="path11510"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker12928);marker-end:url(#marker15937)"
-       d="m 195.00526,334.38755 h 25 l 0,-264.999997 h -25"
-       id="path15909"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 250.00526,129.38755 h -30"
-       id="path16167"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 250.00526,149.38755 h -30"
-       id="path16169"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 250.00526,169.38755 h -30"
-       id="path16171"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 250.00526,189.38755 h -30"
-       id="path16173"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker16647)"
-       d="m 220.00526,209.38755 h 30"
-       id="path16175"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker16189)"
-       d="m 220.00526,229.38755 h 30"
-       id="path16177"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker16415)"
-       d="m 220.00526,249.38755 h 30"
-       id="path16179"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023"
-       d="M 625.00526,19.387552 V 169.38755"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033)"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17281"
-       d="m 490.00526,179.38755 h 25"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17291)"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17547"
-       d="m 460.00526,129.38755 h 30 v 120 h -30"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17557)"
-       sodipodi:nodetypes="cccc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17817"
-       d="m 460.00526,149.38755 h 30"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17819"
-       d="m 460.00526,169.38755 h 30"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17821"
-       d="m 460.00526,189.38755 h 30"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17823"
-       d="m 460.00526,209.38755 h 30"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker18097)"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17825"
-       d="m 460.00526,229.38755 h 30"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker17835)"
-       sodipodi:nodetypes="cc" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect8983-1"
-       width="220.00002"
-       height="115.00001"
-       x="515.00525"
-       y="299.38754" />
-    <text
-       id="text823-4-2-9-4-7-9-85-3"
-       y="318.07571"
-       x="624.95642"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-7-3"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="318.07571"
-         x="624.95642"
-         sodipodi:role="line">Legend</tspan></text>
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1"
-       d="m 85.005263,19.387552 v 9.728741"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3)" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-3"
-       d="m 85.005263,79.387552 v 20"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-01)"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4"
-       d="m 85.005263,49.387552 v 9.728741"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37)" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0"
-       d="m 85.005263,119.38755 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7)" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0-9"
-       d="m 85.005263,149.52318 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7-8)" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-9-8-4"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="199.38759" />
-    <text
-       id="text823-7-9-09"
-       y="213.11151"
-       x="84.611382"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825-4-0-5"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="213.11151"
-         x="84.611382"
-         sodipodi:role="line">Geometry Shader</tspan></text>
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-3-2"
-       d="m 85.005265,179.38755 v 20"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-01-3)"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Mstart-3);marker-end:url(#marker5200-6)"
-       d="m 85.005263,189.38755 h -120"
-       id="path4476-0"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-1-2"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994741"
-       y="239.38759" />
-    <text
-       id="text823-4-8-5"
-       y="252.89015"
-       x="85.522842"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-9-2"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="252.89015"
-         x="85.522842"
-         sodipodi:role="line">Vertex Post-Processing</tspan></text>
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-3-2-4"
-       d="m 85.005263,219.38755 v 20"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-01-3-1)"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0-9-1"
-       d="m 85.005265,259.52318 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7-8-7)" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0-9-1-8"
-       d="m 85.005265,289.52318 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7-8-7-7)" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-1-2-4-1"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="299.3876" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-9-8-4-1"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="329.3876" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0-9-1-8-6"
-       d="m 85.005265,319.52318 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7-8-7-7-5)" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0-9-1-8-3"
-       d="m 85.005265,349.52318 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7-8-7-7-0)" />
-    <text
-       id="text823-4-5-3"
-       y="313.07571"
-       x="84.63092"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-7-4"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="313.07571"
-         x="84.63092"
-         sodipodi:role="line">Early Per-Fragment Tests</tspan></text>
-    <text
-       id="text823-7-9-0-6"
-       y="343.07571"
-       x="84.334686"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825-4-0-0-3"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="343.07571"
-         x="84.334686"
-         sodipodi:role="line">Fragment Shader</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-1-2-4-1-2"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="359.3876" />
-    <text
-       id="text823-4-5-5-7"
-       y="372.8576"
-       x="84.63092"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-7-7-9"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="372.8576"
-         x="84.63092"
-         sodipodi:role="line">Late Per-Fragment Tests</tspan></text>
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0-9-1-8-3-2"
-       d="m 85.005265,379.52318 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7-8-7-7-0-51)" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-1-2-4-1-2-2"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="389.3876" />
-    <text
-       id="text823-4-2-9-4-3"
-       y="403.07571"
-       x="84.956436"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-4"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="403.07571"
-         x="84.956436"
-         sodipodi:role="line">Blending</tspan></text>
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-0"
-       width="220"
-       height="20"
-       x="245.00526"
-       y="59.387554" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6"
-       width="220"
-       height="20"
-       x="245.00526"
-       y="39.387554" />
-    <text
-       id="text823-4-2-9-4-7-1"
-       y="54.384296"
-       x="354.53976"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-2"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="54.384296"
-         x="354.53976"
-         sodipodi:role="line">Index Buffer</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-3"
-       y="74.3843"
-       x="355.19733"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-9"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="74.3843"
-         x="355.19733"
-         sodipodi:role="line">Vertex Buffers</tspan></text>
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="119.38755" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-2"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="139.38754" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-3"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="159.38754" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-1"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="179.38754" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-34"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="199.38757" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-7"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="219.38757" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-5"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="239.38757" />
-    <text
-       id="text823-4-2-9-4-7-9-65"
-       y="134.35175"
-       x="354.63092"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-92"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="134.35175"
-         x="354.63092"
-         sodipodi:role="line">Push Constants</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-9-3-0"
-       y="154.38429"
-       x="354.70255"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-9-7"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="154.38429"
-         x="354.70255"
-         sodipodi:role="line">Uniform Buffers</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-9-2-2"
-       y="174.38429"
-       x="354.70255"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-4-3"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="174.38429"
-         x="354.70255"
-         sodipodi:role="line">Uniform Texel Buffers</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-9-8-2"
-       y="193.0757"
-       x="354.84579"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-1"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="193.0757"
-         x="354.84579"
-         sodipodi:role="line">Sampled Images</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-9-8-0-8"
-       y="213.10826"
-       x="354.84579"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-4-5"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="213.10826"
-         x="354.84579"
-         sodipodi:role="line">Storage Buffers</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-9-8-8-1"
-       y="233.10826"
-       x="354.84579"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-5-5"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="233.10826"
-         x="354.84579"
-         sodipodi:role="line">Storage Texel Buffers</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-9-8-05-4"
-       y="252.9455"
-       x="354.84579"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-3-6"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="252.9455"
-         x="354.84579"
-         sodipodi:role="line">Storage Images</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-0"
-       width="220.00002"
-       height="19.999928"
-       x="515.00525"
-       y="169.38756" />
-    <text
-       id="text823-0"
-       y="184.35172"
-       x="624.90112"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825-8"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="184.35172"
-         x="624.90112"
-         sodipodi:role="line">Compute Shader</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-6"
-       width="220.00002"
-       height="19.999928"
-       x="515.00525"
-       y="-0.61240721" />
-    <text
-       id="text823-4-0"
-       y="13.11151"
-       x="624.93042"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-2"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="13.11151"
-         x="624.93042"
-         sodipodi:role="line">Dispatch</tspan></text>
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-6"
-       width="220"
-       height="20"
-       x="245.00526"
-       y="299.38754" />
-    <text
-       id="text823-4-2-9-4-7-9-8-05-4-5"
-       y="312.9455"
-       x="354.84576"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-3-6-4"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="312.9455"
-         x="354.84576"
-         sodipodi:role="line">Depth/Stencil Attachments</tspan></text>
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-6-4"
-       width="220"
-       height="20"
-       x="245.00526"
-       y="329.38754" />
-    <text
-       id="text823-4-2-9-4-7-9-8-05-4-5-3"
-       y="342.9455"
-       x="354.84576"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-3-6-4-0"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="342.9455"
-         x="354.84576"
-         sodipodi:role="line">Input Attachments</tspan></text>
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-6-2"
-       width="220"
-       height="20"
-       x="245.00526"
-       y="389.38754" />
-    <text
-       id="text823-4-2-9-4-7-9-8-05-4-5-6"
-       y="402.9455"
-       x="354.84576"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-3-6-4-6"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="402.9455"
-         x="354.84576"
-         sodipodi:role="line">Color Attachments</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-26"
-       width="210.00002"
-       height="20.00001"
-       x="520.00525"
-       y="329.38754" />
-    <text
-       id="text823-4-8"
-       y="344.13358"
-       x="624.63416"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-1"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="344.13358"
-         x="624.63416"
-         sodipodi:role="line">Fixed Function Stage</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-0-5"
-       width="210.00002"
-       height="20.00001"
-       x="520.00525"
-       y="359.38754" />
-    <text
-       id="text823-0-2"
-       y="373.11151"
-       x="624.61139"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825-8-5"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="373.11151"
-         x="624.61139"
-         sodipodi:role="line">Shader Stage</tspan></text>
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-5-0"
-       width="210.00002"
-       height="19.999994"
-       x="520.00525"
-       y="389.38757" />
-    <text
-       id="text823-4-2-9-4-7-9-8-05-4-9"
-       y="402.9455"
-       x="624.84583"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-3-6-42"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="402.9455"
-         x="624.84583"
-         sodipodi:role="line">Resource</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9512-2)"
-       d="m 465.00526,9.3875526 h 50"
-       id="path9502-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/pipelinemesh.svg b/registry/vulkan/images/pipelinemesh.svg
deleted file mode 100644
index 0647d2f..0000000
--- a/registry/vulkan/images/pipelinemesh.svg
+++ /dev/null
@@ -1,1776 +0,0 @@
-<?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"
-   width="874.4707"
-   height="448"
-   viewBox="0 0 874.4707 448"
-   version="1.1"
-   id="svg8"
-   sodipodi:docname="pipelinemesh.svg"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker19523"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path19521"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker15681"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path15679"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker15357"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         id="path15355"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker15027"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path15025"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker11209"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         id="path11207"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker10921"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path10919"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker10639"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         id="path10637"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker10363"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path10361"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker9769"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path9767"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9511"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         id="path9509"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker18097"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart">
-      <path
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path18095"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker17835"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart">
-      <path
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path17833"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17557"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path17555"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker17291"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path17289"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker16647"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path16645"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker16415"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path16413"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker16189"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path16187"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker15937"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path15935"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker12928"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path12926"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker11520"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path11518"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker11322"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path11320"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker11128"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path11126"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker10596"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path10594"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9866"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path9864"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9512"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path9510"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker8090"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path8088"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker7360"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path7358"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker7066"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path7064"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker5106"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path5104"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker7066-0"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path7064-8" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker7208-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path7206-1" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-01"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-8"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7-8"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9-7"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-01-3"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-8-44"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mstart-3"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path1382-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker5200-6"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path5198-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-01-3-1"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-8-44-8"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7-8-7"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9-7-8"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7-8-7-7"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9-7-8-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7-8-7-7-5"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9-7-8-5-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7-8-7-7-0"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9-7-8-5-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker17033-3-37-7-8-7-7-0-51"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path17031-7-0-9-7-8-5-2-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9512-2"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path9510-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="555.30883"
-     inkscape:cy="54.623986"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:snap-center="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1137"
-     inkscape:window-x="1578"
-     inkscape:window-y="348"
-     inkscape:window-maximized="0"
-     showguides="false"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     fit-margin-left="1"
-     units="in"
-     inkscape:snap-others="true"
-     inkscape:snap-nodes="true"
-     inkscape:object-nodes="true"
-     height="7.5in">
-    <inkscape:grid
-       type="xygrid"
-       id="grid817"
-       originx="152.97068"
-       originy="-753.5" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(37.965418,2.1124474)">
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-1-2-4"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="299.3876" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-9-8"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994741"
-       y="179.38759" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-1"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="149.38759" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-9"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="119.38759" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="79.387589" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="-0.6124118" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89600003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994738"
-       y="49.38755" />
-    <text
-       id="text823"
-       y="94.351753"
-       x="84.9011"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="94.351753"
-         x="84.9011"
-         sodipodi:role="line">Vertex Shader</tspan></text>
-    <text
-       id="text823-4"
-       y="14.133646"
-       x="84.634171"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="14.133646"
-         x="84.634171"
-         sodipodi:role="line">Draw</tspan></text>
-    <text
-       id="text823-4-2"
-       y="63.111511"
-       x="84.539764"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="63.111511"
-         x="84.539764"
-         sodipodi:role="line">Input Assembler</tspan></text>
-    <text
-       id="text823-7"
-       y="134.35175"
-       x="84.985733"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825-4"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="134.35175"
-         x="84.985733"
-         sodipodi:role="line">Tessellation Control Shader</tspan></text>
-    <text
-       id="text823-4-2-6-3"
-       y="164.35175"
-       x="84.985733"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-1-5"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="164.35175"
-         x="84.985733"
-         sodipodi:role="line">Tessellation Primitive Generator</tspan></text>
-    <text
-       id="text823-7-0"
-       y="194.35175"
-       x="84.985733"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825-4-7"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="194.35175"
-         x="84.985733"
-         sodipodi:role="line">Tessellation Evaluation Shader</tspan></text>
-    <text
-       id="text823-4-2-8"
-       y="314.1662"
-       x="84.930397"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-9"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="314.1662"
-         x="84.930397"
-         sodipodi:role="line">Rasterization</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5106)"
-       d="M 85.005262,109.38755 H -34.994737 v 140 h 120"
-       id="path4474"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccc" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1"
-       width="220"
-       height="20"
-       x="245.00526"
-       y="-0.61244744" />
-    <text
-       id="text823-4-2-9-4-7"
-       y="14.384297"
-       x="354.53976"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="14.384297"
-         x="354.53976"
-         sodipodi:role="line">Indirect Buffer</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker7360)"
-       d="m 235.00526,339.38755 v 60 h -40"
-       id="path7350"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker8090)"
-       d="m 245.00526,374.38755 h -5 v -5 h -10 v 5 h -35"
-       id="path8837"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccc" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect8983"
-       width="220"
-       height="165"
-       x="245.00526"
-       y="99.38755" />
-    <text
-       id="text823-4-2-9-4-7-9-85"
-       y="112.9813"
-       x="354.63092"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-7"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="112.9813"
-         x="354.63092"
-         sodipodi:role="line">Descriptor Sets</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker7066-0);marker-end:url(#marker7208-7)"
-       d="m 245.00526,429.38755 h -50"
-       id="path7056-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9512)"
-       d="m 245.00526,9.3875524 h -50"
-       id="path9502"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9866)"
-       d="m 220.00526,59.387553 h -25"
-       id="path9856"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker7066);marker-end:url(#marker10596)"
-       d="m 245.00526,339.38755 h -20 v -5 h -10 v 5 h -20"
-       id="path10568"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 245.00526,49.387553 h -25 v 20 h 25"
-       id="path11116"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker11128)"
-       d="m 220.00526,129.38755 h -25"
-       id="path11118"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker11322)"
-       d="m 220.00526,189.38755 h -25"
-       id="path11312"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker11520)"
-       d="m 220.00526,229.38755 h -25"
-       id="path11510"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker12928);marker-end:url(#marker15937)"
-       d="m 195.00526,364.38755 h 25 V 89.387553 h -25"
-       id="path15909"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 250.00526,129.38755 h -30"
-       id="path16167"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 250.00526,149.38755 h -30"
-       id="path16169"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 250.00526,169.38755 h -30"
-       id="path16171"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 250.00526,189.38755 h -30"
-       id="path16173"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker16647)"
-       d="m 220.00526,209.38755 h 30"
-       id="path16175"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker16189)"
-       d="m 220.00526,229.38755 h 30"
-       id="path16177"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker16415)"
-       d="m 220.00526,249.38755 h 30"
-       id="path16179"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17281"
-       d="M 490.00526,129.38755 V 59.387553 h 90 v -5 h 10 v 5 h 105"
-       style="fill:none;stroke:#000000;stroke-width:1.02551627;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17291)"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17547"
-       d="m 460.00526,129.38755 h 30 v 120 h -30"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17557)"
-       sodipodi:nodetypes="cccc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17817"
-       d="m 460.00526,149.38755 h 30"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17819"
-       d="m 460.00526,169.38755 h 30"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17821"
-       d="m 460.00526,189.38755 h 30"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17823"
-       d="m 460.00526,209.38755 h 30"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker18097)"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17825"
-       d="m 460.00526,229.38755 h 30"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker17835)"
-       sodipodi:nodetypes="cc" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect8983-1"
-       width="220.00002"
-       height="115.00001"
-       x="615.00525"
-       y="329.38754" />
-    <text
-       id="text823-4-2-9-4-7-9-85-3"
-       y="348.07571"
-       x="724.95642"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-7-3"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="348.07571"
-         x="724.95642"
-         sodipodi:role="line">Legend</tspan></text>
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1"
-       d="m 85.005262,19.387553 10e-7,29.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3)"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-3"
-       d="m 85.005263,99.38755 v 20"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-01)"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4"
-       d="m 85.005263,69.387552 v 9.728741"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37)" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0"
-       d="m 85.005263,139.38755 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7)" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0-9"
-       d="m 85.005263,169.52318 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7-8)" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-9-8-4"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="219.38759" />
-    <text
-       id="text823-7-9-09"
-       y="233.11151"
-       x="84.611382"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825-4-0-5"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="233.11151"
-         x="84.611382"
-         sodipodi:role="line">Geometry Shader</tspan></text>
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-3-2"
-       d="m 85.005265,199.38755 v 20"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-01-3)"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Mstart-3);marker-end:url(#marker5200-6)"
-       d="m 85.005263,209.38755 h -120"
-       id="path4476-0"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-1-2"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994741"
-       y="269.38757" />
-    <text
-       id="text823-4-8-5"
-       y="282.89014"
-       x="85.522842"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-9-2"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="282.89014"
-         x="85.522842"
-         sodipodi:role="line">Vertex Post-Processing</tspan></text>
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-3-2-4"
-       d="m 85.005263,239.38755 v 20"
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-01-3-1)"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0-9-1"
-       d="m 85.005265,289.52318 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7-8-7)" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0-9-1-8"
-       d="m 85.005265,319.52318 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7-8-7-7)" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-1-2-4-1"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="329.3876" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-9-8-4-1"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="359.3876" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0-9-1-8-6"
-       d="m 85.005265,349.52318 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7-8-7-7-5)" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0-9-1-8-3"
-       d="m 85.005265,379.52318 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7-8-7-7-0)" />
-    <text
-       id="text823-4-5-3"
-       y="343.07571"
-       x="84.63092"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-7-4"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="343.07571"
-         x="84.63092"
-         sodipodi:role="line">Early Per-Fragment Tests</tspan></text>
-    <text
-       id="text823-7-9-0-6"
-       y="373.07571"
-       x="84.334686"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825-4-0-0-3"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="373.07571"
-         x="84.334686"
-         sodipodi:role="line">Fragment Shader</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-1-2-4-1-2"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="389.3876" />
-    <text
-       id="text823-4-5-5-7"
-       y="402.8576"
-       x="84.63092"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-7-7-9"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="402.8576"
-         x="84.63092"
-         sodipodi:role="line">Late Per-Fragment Tests</tspan></text>
-    <path
-       inkscape:connector-curvature="0"
-       id="path17023-1-4-0-9-1-8-3-2"
-       d="m 85.005265,409.52318 v 9.72874"
-       style="fill:none;stroke:#000000;stroke-width:0.87524033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17033-3-37-7-8-7-7-0-51)" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-1-2-4-1-2-2"
-       width="220.00002"
-       height="19.999928"
-       x="-24.994745"
-       y="419.3876" />
-    <text
-       id="text823-4-2-9-4-3"
-       y="433.07571"
-       x="84.956436"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-4"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="433.07571"
-         x="84.956436"
-         sodipodi:role="line">Blending</tspan></text>
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-0"
-       width="220"
-       height="20"
-       x="245.00526"
-       y="59.387554" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6"
-       width="220"
-       height="20"
-       x="245.00526"
-       y="39.387554" />
-    <text
-       id="text823-4-2-9-4-7-1"
-       y="54.384296"
-       x="354.53976"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-2"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="54.384296"
-         x="354.53976"
-         sodipodi:role="line">Index Buffer</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-3"
-       y="74.3843"
-       x="355.19733"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-9"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="74.3843"
-         x="355.19733"
-         sodipodi:role="line">Vertex Buffers</tspan></text>
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="119.38755" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-2"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="139.38754" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-3"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="159.38754" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-1"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="179.38754" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-34"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="199.38757" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-7"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="219.38757" />
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-5"
-       width="210.00002"
-       height="19.999994"
-       x="250.00526"
-       y="239.38757" />
-    <text
-       id="text823-4-2-9-4-7-9-65"
-       y="134.35175"
-       x="354.63092"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-92"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="134.35175"
-         x="354.63092"
-         sodipodi:role="line">Push Constants</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-9-3-0"
-       y="154.38429"
-       x="354.70255"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-9-7"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="154.38429"
-         x="354.70255"
-         sodipodi:role="line">Uniform Buffers</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-9-2-2"
-       y="174.38429"
-       x="354.70255"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-4-3"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="174.38429"
-         x="354.70255"
-         sodipodi:role="line">Uniform Texel Buffers</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-9-8-2"
-       y="193.0757"
-       x="354.84579"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-1"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="193.0757"
-         x="354.84579"
-         sodipodi:role="line">Sampled Images</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-9-8-0-8"
-       y="213.10826"
-       x="354.84579"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-4-5"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="213.10826"
-         x="354.84579"
-         sodipodi:role="line">Storage Buffers</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-9-8-8-1"
-       y="233.10826"
-       x="354.84579"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-5-5"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="233.10826"
-         x="354.84579"
-         sodipodi:role="line">Storage Texel Buffers</tspan></text>
-    <text
-       id="text823-4-2-9-4-7-9-8-05-4"
-       y="252.9455"
-       x="354.84579"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-3-6"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="252.9455"
-         x="354.84579"
-         sodipodi:role="line">Storage Images</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89600003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-0"
-       width="140.00005"
-       height="19.999928"
-       x="515.00525"
-       y="119.38759" />
-    <text
-       id="text823-0"
-       y="134.35175"
-       x="584.98572"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825-8"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="134.35175"
-         x="584.98572"
-         sodipodi:role="line">Task Shader</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89600003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-6"
-       width="140.00005"
-       height="19.999928"
-       x="515.00525"
-       y="-0.61240721" />
-    <text
-       id="text823-4-0"
-       y="13.111511"
-       x="584.93042"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-2"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="13.111511"
-         x="584.93042"
-         sodipodi:role="line">DrawMeshTasks</tspan></text>
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-6"
-       width="220"
-       height="20"
-       x="245.00526"
-       y="329.38754" />
-    <text
-       id="text823-4-2-9-4-7-9-8-05-4-5"
-       y="342.9455"
-       x="354.84576"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-3-6-4"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="342.9455"
-         x="354.84576"
-         sodipodi:role="line">Depth/Stencil Attachments</tspan></text>
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-6-4"
-       width="220"
-       height="20"
-       x="245.00526"
-       y="359.38754" />
-    <text
-       id="text823-4-2-9-4-7-9-8-05-4-5-3"
-       y="372.9455"
-       x="354.84576"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-3-6-4-0"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="372.9455"
-         x="354.84576"
-         sodipodi:role="line">Input Attachments</tspan></text>
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-6-2"
-       width="220"
-       height="20"
-       x="245.00526"
-       y="419.38754" />
-    <text
-       id="text823-4-2-9-4-7-9-8-05-4-5-6"
-       y="432.9455"
-       x="354.84576"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-3-6-4-6"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="432.9455"
-         x="354.84576"
-         sodipodi:role="line">Color Attachments</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-26"
-       width="210.00002"
-       height="20.00001"
-       x="620.00525"
-       y="359.38754" />
-    <text
-       id="text823-4-8"
-       y="374.13358"
-       x="724.63416"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-1"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="374.13358"
-         x="724.63416"
-         sodipodi:role="line">Fixed Function Stage</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89574087;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-0-5"
-       width="210.00002"
-       height="20.00001"
-       x="620.00525"
-       y="389.38754" />
-    <text
-       id="text823-0-2"
-       y="403.11151"
-       x="724.61139"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825-8-5"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="403.11151"
-         x="724.61139"
-         sodipodi:role="line">Shader Stage</tspan></text>
-    <rect
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-4-3-6-1-6-7-5-0"
-       width="210.00002"
-       height="19.999994"
-       x="620.00525"
-       y="419.38757" />
-    <text
-       id="text823-4-2-9-4-7-9-8-05-4-9"
-       y="432.9455"
-       x="724.84583"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-2-5-6-26-5-3-6-42"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="432.9455"
-         x="724.84583"
-         sodipodi:role="line"> Resource</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9512-2)"
-       d="m 465.00526,9.3875526 h 50"
-       id="path9502-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89600003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-0-0"
-       width="140.00005"
-       height="19.999928"
-       x="695.00519"
-       y="49.387558" />
-    <text
-       id="text823-0-5"
-       y="63.111511"
-       x="764.61139"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         id="tspan825-8-6"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         y="63.111511"
-         x="764.61139"
-         sodipodi:role="line">Compute Shader</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89600003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-6-0"
-       width="140.00005"
-       height="19.999928"
-       x="695.00519"
-       y="-0.61240697" />
-    <text
-       id="text823-4-0-3"
-       y="13.111515"
-       x="764.93036"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-2-2"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="13.111515"
-         x="764.93036"
-         sodipodi:role="line">Dispatch</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.89600003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-3-0-8"
-       width="140.00005"
-       height="19.999928"
-       x="514.35425"
-       y="219.38757" />
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89600003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-9"
-       width="140.00002"
-       height="19.999928"
-       x="515.00525"
-       y="89.387589" />
-    <text
-       id="text823-4-2-83"
-       y="104.35175"
-       x="584.98572"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-4"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="104.35175"
-         x="584.98572"
-         sodipodi:role="line">Task Assembler</tspan></text>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.89600003;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-2-9-1"
-       width="140.00002"
-       height="19.999928"
-       x="514.35425"
-       y="189.38757" />
-    <text
-       id="text823-4-2-83-4"
-       y="204.35175"
-       x="584.33472"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-4-8"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="204.35175"
-         x="584.33472"
-         sodipodi:role="line">Mesh Assembler</tspan></text>
-    <text
-       id="text823-4-2-83-4-8"
-       y="234.35173"
-       x="583.68372"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986"
-       xml:space="preserve"><tspan
-         id="tspan825-6-0-4-8-9"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:1.26999986"
-         y="234.35173"
-         x="583.68372"
-         sodipodi:role="line">Mesh Shader</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker9511)"
-       d="m 585.00526,19.387553 v 70"
-       id="path9501"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker9769)"
-       d="m 585.00526,109.38755 v 10"
-       id="path9759"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker10363)"
-       d="m 585.00526,79.387553 h 80 v 69.999997 h -80"
-       id="path10353"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker10639)"
-       d="m 585.00526,139.38755 v 50"
-       id="path10629"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker10921)"
-       d="m 584.3542,209.38753 v 10"
-       id="path10911"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker11209)"
-       d="m 585.00526,239.38755 v 40 h -360 v -5 h -10 v 5 h -20"
-       id="path11199"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker15027)"
-       d="M 490.00526,9.3875526 V 29.387553 h 90 v -5 h 10 v 5 h 85 V 9.3875526 h 20"
-       id="path15017"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker15357)"
-       d="m 490.00526,129.38755 23.98327,-0.0793"
-       id="path15347"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker15681)"
-       d="m 489.3542,229.38753 24.69038,0.0769"
-       id="path15671"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker19523)"
-       d="m 760.00526,19.387553 0,30"
-       id="path21617"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/pixel_index_1x1.svg b/registry/vulkan/images/pixel_index_1x1.svg
deleted file mode 100644
index badc184..0000000
--- a/registry/vulkan/images/pixel_index_1x1.svg
+++ /dev/null
@@ -1,183 +0,0 @@
-<?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"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   sodipodi:docname="pixel_index_1x1.svg"
-   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
-   id="svg8"
-   version="1.1"
-   viewBox="0 0 27.77969 26.901191"
-   height="101.67381"
-   width="104.99409">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker1483"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path1481"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:collect="always"
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="Arrow1Lend"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path977" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     inkscape:document-rotation="0"
-     inkscape:snap-center="true"
-     units="px"
-     fit-margin-left="1"
-     fit-margin-bottom="1"
-     fit-margin-right="1"
-     fit-margin-top="1"
-     inkscape:window-maximized="0"
-     inkscape:window-y="0"
-     inkscape:window-x="0"
-     inkscape:window-height="1018"
-     inkscape:window-width="960"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     showgrid="true"
-     inkscape:current-layer="layer1"
-     inkscape:document-units="px"
-     inkscape:cy="13.121973"
-     inkscape:cx="4.4991286"
-     inkscape:zoom="2.0930361"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base">
-    <inkscape:grid
-       dotted="false"
-       originy="-89.436898"
-       originx="-20.366723"
-       id="grid12"
-       type="xygrid" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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>
-  <g
-     transform="translate(-28.116567,-11.729621)"
-     id="layer1"
-     inkscape:groupmode="layer"
-     inkscape:label="Layer 1">
-    <path
-       sodipodi:nodetypes="ccccc"
-       inkscape:connector-curvature="0"
-       id="path1171"
-       d="m 36.854018,12.251027 18.520828,1.8e-5 v 18.520833 l -18.520817,-0.001 -1.1e-5,-18.519799"
-       style="fill:none;stroke:#808080;stroke-width:0.264583;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <g
-       id="g271"
-       transform="translate(-22.751249,-5.5676023)">
-      <text
-         id="text121-3-7-8-0"
-         y="43.525604"
-         x="69.692329"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82223px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           id="tspan265"
-           sodipodi:role="line"
-           x="69.692329"
-           y="43.525604">x</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="67.711052"
-         y="42.973698"
-         id="text121-3-7-8-9-1"><tspan
-           style="stroke-width:0.264583"
-           sodipodi:role="line"
-           id="tspan239-0"
-           x="67.711052"
-           y="42.973698">f</tspan></text>
-    </g>
-    <path
-       sodipodi:nodetypes="cccc"
-       inkscape:connector-curvature="0"
-       id="path972"
-       d="m 36.854018,36.062494 6.614579,10e-4 m 5.291666,0 6.614583,-9.1e-5"
-       style="fill:none;stroke:#000000;stroke-width:0.132291px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-    <path
-       sodipodi:nodetypes="cccc"
-       style="fill:none;stroke:#000000;stroke-width:0.132291px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-       d="m 31.562353,30.77186 -2e-6,-6.614583 m 0,-5.291666 3e-6,-6.614582"
-       id="path1473"
-       inkscape:connector-curvature="0" />
-    <g
-       transform="translate(0.83905268,0.28766514)"
-       id="g545">
-      <g
-         transform="translate(-3.7341421,26.933758)"
-         id="g277">
-        <text
-           id="text121-3-7-8"
-           y="-4.0993972"
-           x="35.296494"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-           xml:space="preserve"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.264583"
-             y="-4.0993972"
-             x="35.296494"
-             id="tspan119-1-8-3"
-             sodipodi:role="line">y</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-           x="33.31522"
-           y="-4.6513033"
-           id="text121-3-7-8-9"><tspan
-             sodipodi:role="line"
-             id="tspan239"
-             x="33.31522"
-             y="-4.6513033">f</tspan></text>
-      </g>
-    </g>
-    <text
-       transform="scale(0.98828059,1.0118584)"
-       style="stroke-width:0.00380337"
-       id="text23"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.779236"
-       x="45.329342">0</text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/pixel_index_1x2.svg b/registry/vulkan/images/pixel_index_1x2.svg
deleted file mode 100644
index 5ae23af..0000000
--- a/registry/vulkan/images/pixel_index_1x2.svg
+++ /dev/null
@@ -1,188 +0,0 @@
-<?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"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   sodipodi:docname="pixel_index_1x2.svg"
-   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
-   id="svg8"
-   version="1.1"
-   viewBox="0 0 27.779696 45.528409"
-   height="172.07588"
-   width="104.99412">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker1483"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path1481"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:collect="always"
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="Arrow1Lend"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path977" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     showguides="false"
-     inkscape:document-rotation="0"
-     inkscape:snap-center="true"
-     units="px"
-     fit-margin-left="1"
-     fit-margin-bottom="1"
-     fit-margin-right="1"
-     fit-margin-top="1"
-     inkscape:window-maximized="0"
-     inkscape:window-y="0"
-     inkscape:window-x="954"
-     inkscape:window-height="1010"
-     inkscape:window-width="958"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     showgrid="true"
-     inkscape:current-layer="layer1"
-     inkscape:document-units="px"
-     inkscape:cy="-15.114603"
-     inkscape:cx="29.873733"
-     inkscape:zoom="1.48"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base">
-    <inkscape:grid
-       dotted="false"
-       originy="-70.809709"
-       originx="-20.366718"
-       id="grid12"
-       type="xygrid" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-28.116567,6.8975958)"
-     id="layer1"
-     inkscape:groupmode="layer"
-     inkscape:label="Layer 1">
-    <path
-       sodipodi:nodetypes="ccccccc"
-       inkscape:connector-curvature="0"
-       id="path1171"
-       d="m 36.854017,-6.2698068 h 18.520834 l 10e-7,37.0416328 -18.520823,-0.001 -1.2e-5,-37.0406328 m 18.520835,18.5208318 -18.520823,-10e-4"
-       style="fill:none;stroke:#808080;stroke-width:0.264583;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <g
-       id="g271"
-       transform="translate(-22.751244,-5.5676207)">
-      <text
-         id="text121-3-7-8-0"
-         y="43.525604"
-         x="69.692329"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82223px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           id="tspan265"
-           sodipodi:role="line"
-           x="69.692329"
-           y="43.525604">x</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="67.711052"
-         y="42.973698"
-         id="text121-3-7-8-9-1"><tspan
-           style="stroke-width:0.264583"
-           sodipodi:role="line"
-           id="tspan239-0"
-           x="67.711052"
-           y="42.973698">f</tspan></text>
-    </g>
-    <path
-       sodipodi:nodetypes="cccc"
-       inkscape:connector-curvature="0"
-       id="path972"
-       d="m 36.854018,36.062494 6.614584,10e-4 m 5.291667,0 6.614583,-6.3e-5"
-       style="fill:none;stroke:#000000;stroke-width:0.132291px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-    <path
-       sodipodi:nodetypes="cccc"
-       style="fill:none;stroke:#000000;stroke-width:0.187088px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-       d="m 31.562353,30.77186 -3e-6,-15.875 m 0,-5.2916663 4e-6,-15.8750005"
-       id="path1473"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g277"
-       transform="translate(-2.8950905,17.961006)">
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="35.296494"
-         y="-4.0993972"
-         id="text121-3-7-8"><tspan
-           sodipodi:role="line"
-           id="tspan119-1-8-3"
-           x="35.296494"
-           y="-4.0993972"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.264583">y</tspan></text>
-      <text
-         id="text121-3-7-8-9"
-         y="-4.6513033"
-         x="33.31522"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           y="-4.6513033"
-           x="33.31522"
-           id="tspan239"
-           sodipodi:role="line">f</tspan></text>
-    </g>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.674101"
-       x="45.329342">0</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-7"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="4.4754329"
-       x="45.329346">1</text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/pixel_index_1x4.svg b/registry/vulkan/images/pixel_index_1x4.svg
deleted file mode 100644
index 87e8f78..0000000
--- a/registry/vulkan/images/pixel_index_1x4.svg
+++ /dev/null
@@ -1,202 +0,0 @@
-<?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"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   sodipodi:docname="pixel_index_1x4.svg"
-   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
-   id="svg8"
-   version="1.1"
-   viewBox="0 0 27.779696 82.720522"
-   height="312.6445"
-   width="104.99412">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker1483"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path1481"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:collect="always"
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="Arrow1Lend"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path977" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     inkscape:document-rotation="0"
-     inkscape:snap-center="true"
-     units="px"
-     fit-margin-left="1"
-     fit-margin-bottom="1"
-     fit-margin-right="1"
-     fit-margin-top="1"
-     inkscape:window-maximized="0"
-     inkscape:window-y="0"
-     inkscape:window-x="954"
-     inkscape:window-height="1010"
-     inkscape:window-width="958"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     showgrid="true"
-     inkscape:current-layer="layer1"
-     inkscape:document-units="px"
-     inkscape:cy="285.32692"
-     inkscape:cx="152.58531"
-     inkscape:zoom="1.48"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base">
-    <inkscape:grid
-       dotted="false"
-       originy="-33.617598"
-       originx="-20.366717"
-       id="grid12"
-       type="xygrid" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-28.116567,44.089711)"
-     id="layer1"
-     inkscape:groupmode="layer"
-     inkscape:label="Layer 1">
-    <path
-       sodipodi:nodetypes="ccccccccccc"
-       inkscape:connector-curvature="0"
-       id="path1171"
-       d="m 36.85402,-43.312509 18.520832,10e-4 v 74.083335 l -18.520823,-0.001 -9e-6,-74.083337 m 18.520832,55.563536 -18.520823,-10e-4 m -7e-6,-18.5208395 18.52083,0.00101 m 0,-18.5208335 -18.52083,-9.73e-4"
-       style="fill:none;stroke:#808080;stroke-width:0.264583;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <g
-       id="g271"
-       transform="translate(-22.751244,-5.5676207)">
-      <text
-         id="text121-3-7-8-0"
-         y="43.525604"
-         x="69.692329"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82223px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           id="tspan265"
-           sodipodi:role="line"
-           x="69.692329"
-           y="43.525604">x</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="67.711052"
-         y="42.973698"
-         id="text121-3-7-8-9-1"><tspan
-           style="stroke-width:0.264583"
-           sodipodi:role="line"
-           id="tspan239-0"
-           x="67.711052"
-           y="42.973698">f</tspan></text>
-    </g>
-    <path
-       sodipodi:nodetypes="cccc"
-       inkscape:connector-curvature="0"
-       id="path972"
-       d="m 36.854018,36.062494 6.614584,10e-4 m 5.291667,0 6.614583,-6.3e-5"
-       style="fill:none;stroke:#000000;stroke-width:0.132291px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-       d="M 31.562353,30.77186 V -3.6239751 m 10e-7,-5.2916661 V -43.311476"
-       id="path1473"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g277"
-       transform="translate(-2.9074896,-0.27595285)">
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="35.296494"
-         y="-4.0993972"
-         id="text121-3-7-8"><tspan
-           sodipodi:role="line"
-           id="tspan119-1-8-3"
-           x="35.296494"
-           y="-4.0993972"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.264583">y</tspan></text>
-      <text
-         id="text121-3-7-8-9"
-         y="-4.6513033"
-         x="33.31522"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           y="-4.6513033"
-           x="33.31522"
-           id="tspan239"
-           sodipodi:role="line">f</tspan></text>
-    </g>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.525417"
-       x="45.329342">0</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-7"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="4.3267488"
-       x="45.329346">1</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-2"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-13.977032"
-       x="45.32935">2</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-8"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-32.385925"
-       x="45.329346">3</text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/pixel_index_2x1.svg b/registry/vulkan/images/pixel_index_2x1.svg
deleted file mode 100644
index 6a9ee26..0000000
--- a/registry/vulkan/images/pixel_index_2x1.svg
+++ /dev/null
@@ -1,191 +0,0 @@
-<?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"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   sodipodi:docname="pixel_index_2x1.svg"
-   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
-   id="svg8"
-   version="1.1"
-   viewBox="0 0 46.406909 26.901191"
-   height="101.67381"
-   width="175.39618">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker1483"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path1481"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:collect="always"
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="Arrow1Lend"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path977" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     inkscape:document-rotation="0"
-     inkscape:snap-center="true"
-     units="px"
-     fit-margin-left="1"
-     fit-margin-bottom="1"
-     fit-margin-right="1"
-     fit-margin-top="1"
-     inkscape:window-maximized="0"
-     inkscape:window-y="0"
-     inkscape:window-x="0"
-     inkscape:window-height="1018"
-     inkscape:window-width="960"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     showgrid="true"
-     inkscape:current-layer="layer1"
-     inkscape:document-units="px"
-     inkscape:cy="-37.066166"
-     inkscape:cx="161.67627"
-     inkscape:zoom="1.48"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base">
-    <inkscape:grid
-       dotted="false"
-       originy="-89.436907"
-       originx="-20.366719"
-       id="grid12"
-       type="xygrid" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-28.116567,-11.729621)"
-     id="layer1"
-     inkscape:groupmode="layer"
-     inkscape:label="Layer 1">
-    <path
-       sodipodi:nodetypes="ccccccc"
-       inkscape:connector-curvature="0"
-       id="path1171"
-       d="m 36.854018,12.251027 37.041663,9e-6 v 18.520833 l -37.041652,-10e-4 -1.1e-5,-18.519799 m 18.520834,0 1.1e-5,18.519799"
-       style="fill:none;stroke:#808080;stroke-width:0.264583;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <g
-       id="g271"
-       transform="translate(-13.49083,-5.5676114)">
-      <text
-         id="text121-3-7-8-0"
-         y="43.525604"
-         x="69.692329"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82223px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           id="tspan265"
-           sodipodi:role="line"
-           x="69.692329"
-           y="43.525604">x</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="67.711052"
-         y="42.973698"
-         id="text121-3-7-8-9-1"><tspan
-           style="stroke-width:0.264583"
-           sodipodi:role="line"
-           id="tspan239-0"
-           x="67.711052"
-           y="42.973698">f</tspan></text>
-    </g>
-    <path
-       sodipodi:nodetypes="cccc"
-       inkscape:connector-curvature="0"
-       id="path972"
-       d="m 36.854018,36.062494 15.874997,10e-4 m 5.291667,0 15.874999,-4.1e-5"
-       style="fill:none;stroke:#000000;stroke-width:0.187088px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-    <path
-       sodipodi:nodetypes="cccc"
-       style="fill:none;stroke:#000000;stroke-width:0.132291px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-       d="m 31.562353,30.77186 -2e-6,-6.614583 m 0,-5.291666 3e-6,-6.614582"
-       id="path1473"
-       inkscape:connector-curvature="0" />
-    <g
-       transform="translate(0.83905268,0.28766514)"
-       id="g545">
-      <g
-         transform="translate(-3.7341421,26.933758)"
-         id="g277">
-        <text
-           id="text121-3-7-8"
-           y="-4.0993972"
-           x="35.296494"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-           xml:space="preserve"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.264583"
-             y="-4.0993972"
-             x="35.296494"
-             id="tspan119-1-8-3"
-             sodipodi:role="line">y</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-           x="33.31522"
-           y="-4.6513033"
-           id="text121-3-7-8-9"><tspan
-             sodipodi:role="line"
-             id="tspan239"
-             x="33.31522"
-             y="-4.6513033">f</tspan></text>
-      </g>
-    </g>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.779236"
-       x="45.329342">0</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-7"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.884348"
-       x="64.069801">1</text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/pixel_index_2x2.svg b/registry/vulkan/images/pixel_index_2x2.svg
deleted file mode 100644
index 67474cf..0000000
--- a/registry/vulkan/images/pixel_index_2x2.svg
+++ /dev/null
@@ -1,203 +0,0 @@
-<?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"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="175.39619"
-   height="172.07588"
-   viewBox="0 0 46.406913 45.528409"
-   version="1.1"
-   id="svg8"
-   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
-   sodipodi:docname="pixel_index_2x2.svg">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path977"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.48"
-     inkscape:cx="169.6136"
-     inkscape:cy="69.828393"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1018"
-     inkscape:window-x="-1926"
-     inkscape:window-y="-6"
-     inkscape:window-maximized="1"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     fit-margin-left="1"
-     units="px"
-     inkscape:snap-center="true"
-     inkscape:document-rotation="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid12"
-       originx="-20.366717"
-       originy="-70.809709"
-       dotted="false" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-28.116567,6.8975975)">
-    <path
-       style="fill:none;stroke:#808080;stroke-width:0.264583;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 36.854018,-6.2698085 h 37.041668 l 10e-7,37.0416345 -37.041658,-0.001 -1.1e-5,-37.0406345 m 18.520834,0 1.1e-5,37.0406345 m 18.520824,-18.519802 -37.041658,-10e-4"
-       id="path1171"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccc" />
-    <g
-       transform="translate(-13.490826,-5.5676219)"
-       id="g271">
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82223px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="69.692329"
-         y="43.525604"
-         id="text121-3-7-8-0"><tspan
-           y="43.525604"
-           x="69.692329"
-           sodipodi:role="line"
-           id="tspan265">x</tspan></text>
-      <text
-         id="text121-3-7-8-9-1"
-         y="42.973698"
-         x="67.711052"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           y="42.973698"
-           x="67.711052"
-           id="tspan239-0"
-           sodipodi:role="line"
-           style="stroke-width:0.264583">f</tspan></text>
-    </g>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.187088px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="m 36.854018,36.062494 15.875002,10e-4 m 5.291666,0 15.875001,-3.1e-5"
-       id="path972"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccc" />
-    <path
-       sodipodi:nodetypes="cccc"
-       inkscape:connector-curvature="0"
-       id="path1473"
-       d="m 31.562353,30.77186 -1e-6,-15.875001 m 0,-5.2916671 2e-6,-15.8750004"
-       style="fill:none;stroke:#000000;stroke-width:0.187088px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)" />
-    <g
-       transform="translate(-2.8950893,17.961004)"
-       id="g277">
-      <text
-         id="text121-3-7-8"
-         y="-4.0993972"
-         x="35.296494"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.264583"
-           y="-4.0993972"
-           x="35.296494"
-           id="tspan119-1-8-3"
-           sodipodi:role="line">y</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="33.31522"
-         y="-4.6513033"
-         id="text121-3-7-8-9"><tspan
-           sodipodi:role="line"
-           id="tspan239"
-           x="33.31522"
-           y="-4.6513033">f</tspan></text>
-    </g>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.674099"
-       x="45.329342">0</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-7"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.779211"
-       x="64.069809">1</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-2"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="4.4754314"
-       x="45.32935">2</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-8"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="4.3703194"
-       x="64.069809">3</text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/pixel_index_2x4.svg b/registry/vulkan/images/pixel_index_2x4.svg
deleted file mode 100644
index 2fb6e49..0000000
--- a/registry/vulkan/images/pixel_index_2x4.svg
+++ /dev/null
@@ -1,234 +0,0 @@
-<?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"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   sodipodi:docname="pixel_index_2x4.svg"
-   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
-   id="svg8"
-   version="1.1"
-   viewBox="0 0 46.406913 82.720522"
-   height="312.6445"
-   width="175.39619">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker1483"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path1481"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:collect="always"
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="Arrow1Lend"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path977" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     inkscape:document-rotation="0"
-     inkscape:snap-center="true"
-     units="px"
-     fit-margin-left="1"
-     fit-margin-bottom="1"
-     fit-margin-right="1"
-     fit-margin-top="1"
-     inkscape:window-maximized="1"
-     inkscape:window-y="-6"
-     inkscape:window-x="-1926"
-     inkscape:window-height="1018"
-     inkscape:window-width="1920"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     showgrid="true"
-     inkscape:current-layer="layer1"
-     inkscape:document-units="px"
-     inkscape:cy="208.74124"
-     inkscape:cx="196.91567"
-     inkscape:zoom="1.48"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base">
-    <inkscape:grid
-       dotted="false"
-       originy="-33.617599"
-       originx="-20.366716"
-       id="grid12"
-       type="xygrid" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-28.116567,44.089711)"
-     id="layer1"
-     inkscape:groupmode="layer"
-     inkscape:label="Layer 1">
-    <path
-       sodipodi:nodetypes="ccccccccccccc"
-       inkscape:connector-curvature="0"
-       id="path1171"
-       d="m 36.85402,-43.312509 37.041667,10e-4 v 74.083335 l -37.041658,-0.001 -9e-6,-74.083337 m 18.520836,0 7e-6,74.083337 m 18.520824,-18.519802 -37.041658,-10e-4 m -7e-6,-18.5208395 37.041665,0.00101 m 0,-18.5208335 -37.041665,-9.76e-4"
-       style="fill:none;stroke:#808080;stroke-width:0.264583;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <g
-       id="g271"
-       transform="translate(-13.490826,-5.5676219)">
-      <text
-         id="text121-3-7-8-0"
-         y="43.525604"
-         x="69.692329"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82223px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           id="tspan265"
-           sodipodi:role="line"
-           x="69.692329"
-           y="43.525604">x</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="67.711052"
-         y="42.973698"
-         id="text121-3-7-8-9-1"><tspan
-           style="stroke-width:0.264583"
-           sodipodi:role="line"
-           id="tspan239-0"
-           x="67.711052"
-           y="42.973698">f</tspan></text>
-    </g>
-    <path
-       sodipodi:nodetypes="cccc"
-       inkscape:connector-curvature="0"
-       id="path972"
-       d="m 36.854018,36.062494 15.875002,10e-4 m 5.291666,0 15.875001,-3.1e-5"
-       style="fill:none;stroke:#000000;stroke-width:0.187088px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-       d="M 31.562353,30.77186 V -3.6239751 m 10e-7,-5.2916661 V -43.311476"
-       id="path1473"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g277"
-       transform="translate(-2.9074896,-0.27595285)">
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="35.296494"
-         y="-4.0993972"
-         id="text121-3-7-8"><tspan
-           sodipodi:role="line"
-           id="tspan119-1-8-3"
-           x="35.296494"
-           y="-4.0993972"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.264583">y</tspan></text>
-      <text
-         id="text121-3-7-8-9"
-         y="-4.6513033"
-         x="33.31522"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           y="-4.6513033"
-           x="33.31522"
-           id="tspan239"
-           sodipodi:role="line">f</tspan></text>
-    </g>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.525415"
-       x="45.329342">0</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-7"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.630529"
-       x="64.069809">1</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-2"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="4.3267484"
-       x="45.32935">2</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-8"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="4.2216382"
-       x="64.069809">3</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-1"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-14.082145"
-       x="64.069801">5</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="letter-spacing:0px;stroke-width:0.00380336"
-       id="text23-11"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-14.082145"
-       x="45.329342">4</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-27"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-32.385925"
-       x="64.069809">7</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-77"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-32.385925"
-       x="45.329342">6</text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/pixel_index_4x1.svg b/registry/vulkan/images/pixel_index_4x1.svg
deleted file mode 100644
index cd94695..0000000
--- a/registry/vulkan/images/pixel_index_4x1.svg
+++ /dev/null
@@ -1,207 +0,0 @@
-<?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"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   sodipodi:docname="pixel_index_4x1.svg"
-   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
-   id="svg8"
-   version="1.1"
-   viewBox="0 0 83.599029 26.901193"
-   height="101.67381"
-   width="315.96481">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker1483"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path1481"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:collect="always"
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="Arrow1Lend"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path977" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     inkscape:document-rotation="0"
-     inkscape:snap-center="true"
-     units="px"
-     fit-margin-left="1"
-     fit-margin-bottom="1"
-     fit-margin-right="1"
-     fit-margin-top="1"
-     inkscape:window-maximized="0"
-     inkscape:window-y="0"
-     inkscape:window-x="0"
-     inkscape:window-height="1018"
-     inkscape:window-width="960"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     showgrid="true"
-     inkscape:current-layer="layer1"
-     inkscape:document-units="px"
-     inkscape:cy="-24.670431"
-     inkscape:cx="169.31763"
-     inkscape:zoom="2.0930361"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base">
-    <inkscape:grid
-       dotted="false"
-       originy="-89.436916"
-       originx="-20.366717"
-       id="grid12"
-       type="xygrid" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     transform="translate(-28.116567,-11.729621)"
-     id="layer1"
-     inkscape:groupmode="layer"
-     inkscape:label="Layer 1">
-    <path
-       sodipodi:nodetypes="ccccccccccc"
-       inkscape:connector-curvature="0"
-       id="path1171"
-       d="m 36.854018,12.251027 h 74.083332 l 1e-5,18.520799 -74.083331,-0.001 -1.1e-5,-18.519799 m 18.520834,0 1.1e-5,18.519799 m 18.520832,0 -1e-5,-18.519799 m 18.520834,0 1.5e-5,18.519799"
-       style="fill:none;stroke:#808080;stroke-width:0.264583;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <g
-       id="g271"
-       transform="translate(5.0424113,-5.8514966)">
-      <text
-         id="text121-3-7-8-0"
-         y="43.525604"
-         x="69.692329"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82223px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           id="tspan265"
-           sodipodi:role="line"
-           x="69.692329"
-           y="43.525604">x</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="67.711052"
-         y="42.973698"
-         id="text121-3-7-8-9-1"><tspan
-           style="stroke-width:0.264583"
-           sodipodi:role="line"
-           id="tspan239-0"
-           x="67.711052"
-           y="42.973698">f</tspan></text>
-    </g>
-    <path
-       sodipodi:nodetypes="cccc"
-       inkscape:connector-curvature="0"
-       id="path972"
-       d="m 36.854018,36.062494 34.395836,10e-4 m 5.291669,0 h 34.395837"
-       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-    <path
-       sodipodi:nodetypes="cccc"
-       style="fill:none;stroke:#000000;stroke-width:0.132291px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-       d="m 31.562353,30.77186 -2e-6,-6.614583 m 0,-5.291666 3e-6,-6.614582"
-       id="path1473"
-       inkscape:connector-curvature="0" />
-    <g
-       transform="translate(0.83905268,0.28766514)"
-       id="g545">
-      <g
-         transform="translate(-3.7341421,26.933758)"
-         id="g277">
-        <text
-           id="text121-3-7-8"
-           y="-4.0993972"
-           x="35.296494"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-           xml:space="preserve"><tspan
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.264583"
-             y="-4.0993972"
-             x="35.296494"
-             id="tspan119-1-8-3"
-             sodipodi:role="line">y</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-           x="33.31522"
-           y="-4.6513033"
-           id="text121-3-7-8-9"><tspan
-             sodipodi:role="line"
-             id="tspan239"
-             x="33.31522"
-             y="-4.6513033">f</tspan></text>
-      </g>
-    </g>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.779238"
-       x="45.329342">0</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-7"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.88435"
-       x="64.069809">1</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-2"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.88435"
-       x="82.810272">2</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-8"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.779238"
-       x="101.55073">3</text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/pixel_index_4x2.svg b/registry/vulkan/images/pixel_index_4x2.svg
deleted file mode 100644
index 9ae27fe..0000000
--- a/registry/vulkan/images/pixel_index_4x2.svg
+++ /dev/null
@@ -1,235 +0,0 @@
-<?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"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   sodipodi:docname="pixel_index_4x2.svg"
-   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
-   id="svg8"
-   version="1.1"
-   viewBox="0 0 83.599029 45.528413"
-   height="172.0759"
-   width="315.96481">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker1483"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path1481"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:collect="always"
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="Arrow1Lend"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path977" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     inkscape:document-rotation="0"
-     inkscape:snap-center="true"
-     units="px"
-     fit-margin-left="1"
-     fit-margin-bottom="1"
-     fit-margin-right="1"
-     fit-margin-top="1"
-     inkscape:window-maximized="0"
-     inkscape:window-y="0"
-     inkscape:window-x="0"
-     inkscape:window-height="1018"
-     inkscape:window-width="960"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     showgrid="true"
-     inkscape:current-layer="layer1"
-     inkscape:document-units="px"
-     inkscape:cy="106.05324"
-     inkscape:cx="172.63552"
-     inkscape:zoom="1.7437838"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base">
-    <inkscape:grid
-       dotted="false"
-       originy="-70.809709"
-       originx="-20.366716"
-       id="grid12"
-       type="xygrid" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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>
-  <g
-     transform="translate(-28.116567,6.8975986)"
-     id="layer1"
-     inkscape:groupmode="layer"
-     inkscape:label="Layer 1">
-    <path
-       sodipodi:nodetypes="ccccccccccccc"
-       inkscape:connector-curvature="0"
-       id="path1171"
-       d="m 36.854019,-6.2698096 h 74.083331 l 1e-5,37.0416356 -74.083331,-0.001 -10e-6,-37.0406356 m 18.520834,0 10e-6,37.0406356 m 18.520832,0 -8e-6,-37.0406356 m 18.520833,0 1.4e-5,37.0406356 m 18.520826,-18.519802 -74.083331,-10e-4"
-       style="fill:none;stroke:#808080;stroke-width:0.264583;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <g
-       id="g271"
-       transform="translate(5.0424113,-5.8514966)">
-      <text
-         id="text121-3-7-8-0"
-         y="43.525604"
-         x="69.692329"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82223px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           id="tspan265"
-           sodipodi:role="line"
-           x="69.692329"
-           y="43.525604">x</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="67.711052"
-         y="42.973698"
-         id="text121-3-7-8-9-1"><tspan
-           style="stroke-width:0.264583"
-           sodipodi:role="line"
-           id="tspan239-0"
-           x="67.711052"
-           y="42.973698">f</tspan></text>
-    </g>
-    <path
-       sodipodi:nodetypes="cccc"
-       inkscape:connector-curvature="0"
-       id="path972"
-       d="m 36.854018,36.062494 34.395836,10e-4 m 5.291669,0 h 34.395837"
-       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-    <path
-       sodipodi:nodetypes="cccc"
-       style="fill:none;stroke:#000000;stroke-width:0.187088px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-       d="m 31.562353,30.77186 -1e-6,-15.875002 m 0,-5.2916673 2e-6,-15.8750003"
-       id="path1473"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g277"
-       transform="translate(-2.9074907,18.244879)">
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="35.296494"
-         y="-4.0993972"
-         id="text121-3-7-8"><tspan
-           sodipodi:role="line"
-           id="tspan119-1-8-3"
-           x="35.296494"
-           y="-4.0993972"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.264583">y</tspan></text>
-      <text
-         id="text121-3-7-8-9"
-         y="-4.6513033"
-         x="33.31522"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           y="-4.6513033"
-           x="33.31522"
-           id="tspan239"
-           sodipodi:role="line">f</tspan></text>
-    </g>
-    <text
-       x="45.329342"
-       y="22.674097"
-       fill="#ff0000"
-       font-size="4.18372px"
-       id="text23"
-       style="stroke-width:0.00380336"
-       transform="scale(0.98828058,1.0118584)">0</text>
-    <text
-       x="64.069809"
-       y="22.779209"
-       fill="#ff0000"
-       font-size="4.18372px"
-       id="text23-7"
-       style="stroke-width:0.00380336"
-       transform="scale(0.98828058,1.0118584)">1</text>
-    <text
-       x="82.810272"
-       y="22.779209"
-       fill="#ff0000"
-       font-size="4.18372px"
-       id="text23-2"
-       style="stroke-width:0.00380336"
-       transform="scale(0.98828058,1.0118584)">2</text>
-    <text
-       x="101.55073"
-       y="22.674097"
-       fill="#ff0000"
-       font-size="4.18372px"
-       id="text23-8"
-       style="stroke-width:0.00380336"
-       transform="scale(0.98828058,1.0118584)">3</text>
-    <text
-       x="101.55073"
-       y="4.370317"
-       fill="#ff0000"
-       font-size="4.18372px"
-       id="text23-27"
-       style="stroke-width:0.00380336"
-       transform="scale(0.98828058,1.0118584)">7</text>
-    <text
-       x="82.810265"
-       y="4.370317"
-       fill="#ff0000"
-       font-size="4.18372px"
-       id="text23-77"
-       style="stroke-width:0.00380336"
-       transform="scale(0.98828058,1.0118584)">6</text>
-    <text
-       x="64.069801"
-       y="4.370317"
-       fill="#ff0000"
-       font-size="4.18372px"
-       id="text23-1"
-       style="stroke-width:0.00380336"
-       transform="scale(0.98828058,1.0118584)">5</text>
-    <text
-       x="45.329342"
-       y="4.370317"
-       fill="#ff0000"
-       font-size="4.18372px"
-       id="text23-11"
-       style="letter-spacing:0px;stroke-width:0.00380336"
-       transform="scale(0.98828058,1.0118584)">4</text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/pixel_index_4x4.svg b/registry/vulkan/images/pixel_index_4x4.svg
deleted file mode 100644
index 73c0738..0000000
--- a/registry/vulkan/images/pixel_index_4x4.svg
+++ /dev/null
@@ -1,298 +0,0 @@
-<?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"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="315.96481"
-   height="312.6445"
-   viewBox="0 0 83.599029 82.720522"
-   version="1.1"
-   id="svg8"
-   inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
-   sodipodi:docname="pixel_index_4x4.svg">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path977"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2.0930361"
-     inkscape:cx="170.48768"
-     inkscape:cy="152.56606"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:window-width="960"
-     inkscape:window-height="1018"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     fit-margin-left="1"
-     units="px"
-     inkscape:snap-center="true"
-     inkscape:document-rotation="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid12"
-       originx="-20.366714"
-       originy="-33.617597"
-       dotted="false" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-28.116566,44.089714)">
-    <path
-       style="fill:none;stroke:#808080;stroke-width:0.264583;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 36.85402,-43.312509 74.08334,10e-4 v 74.083335 l -74.083331,-0.001 -9e-6,-74.083337 m 18.520836,0 7e-6,74.083337 m 18.520832,0 -7e-6,-74.083337 m 18.520832,0 1.4e-5,74.083337 m 18.520826,-18.519802 -74.083331,-10e-4 m -7e-6,-18.5208395 74.083338,0.00103 m 0,-18.5208335 -74.083338,-0.001"
-       id="path1171"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccc" />
-    <g
-       transform="translate(5.0424113,-5.8514966)"
-       id="g271">
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82223px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="69.692329"
-         y="43.525604"
-         id="text121-3-7-8-0"><tspan
-           y="43.525604"
-           x="69.692329"
-           sodipodi:role="line"
-           id="tspan265">x</tspan></text>
-      <text
-         id="text121-3-7-8-9-1"
-         y="42.973698"
-         x="67.711052"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           y="42.973698"
-           x="67.711052"
-           id="tspan239-0"
-           sodipodi:role="line"
-           style="stroke-width:0.264583">f</tspan></text>
-    </g>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-       d="m 36.854018,36.062494 34.395836,10e-4 m 5.291669,0 h 34.395837"
-       id="path972"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path1473"
-       d="M 31.562353,30.77186 V -3.6239751 m 10e-7,-5.2916661 V -43.311476"
-       style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)" />
-    <g
-       transform="translate(-2.9074896,-0.27595285)"
-       id="g277">
-      <text
-         id="text121-3-7-8"
-         y="-4.0993972"
-         x="35.296494"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.82222px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.264583"
-           y="-4.0993972"
-           x="35.296494"
-           id="tspan119-1-8-3"
-           sodipodi:role="line">y</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
-         x="33.31522"
-         y="-4.6513033"
-         id="text121-3-7-8-9"><tspan
-           sodipodi:role="line"
-           id="tspan239"
-           x="33.31522"
-           y="-4.6513033">f</tspan></text>
-    </g>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.777164"
-       x="45.30484">0</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-7"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.882277"
-       x="64.045311">1</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-2"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.882277"
-       x="82.785767">2</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-8"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="22.777164"
-       x="101.52623">3</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-27"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="4.4733834"
-       x="101.52623">7</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-77"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="4.4733834"
-       x="82.785759">6</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="stroke-width:0.00380336"
-       id="text23-1"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="4.4733834"
-       x="64.045296">5</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="letter-spacing:0px;stroke-width:0.00380336"
-       id="text23-11"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="4.4733834"
-       x="45.30484">4</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="letter-spacing:0px;stroke-width:0.00380336"
-       id="text23-86"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-13.858997"
-       x="45.288502">8</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="letter-spacing:0px;stroke-width:0.00380336"
-       id="text23-7-0"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-13.753885"
-       x="64.028969">9</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="letter-spacing:0px;stroke-width:0.00380336"
-       id="text23-2-7"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-13.828354"
-       x="81.334328">10</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="letter-spacing:0px;stroke-width:0.00380336"
-       id="text23-8-8"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-13.822226"
-       x="100.15957">11</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="letter-spacing:0px;stroke-width:0.00380336"
-       id="text23-27-2"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-32.157669"
-       x="100.08501">15</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="letter-spacing:0px;stroke-width:0.00380336"
-       id="text23-77-7"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-32.126007"
-       x="81.297562">14</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="letter-spacing:0px;stroke-width:0.00380336"
-       id="text23-1-9"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-32.131111"
-       x="62.613274">13</text>
-    <text
-       transform="scale(0.98828058,1.0118584)"
-       style="letter-spacing:0px;stroke-width:0.00380336"
-       id="text23-11-4"
-       font-size="4.18372px"
-       fill="#ff0000"
-       y="-32.099449"
-       x="43.851364">12</text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_key_adjacency_edge.svg b/registry/vulkan/images/primitive_topology_key_adjacency_edge.svg
deleted file mode 100644
index 0ab1a88..0000000
--- a/registry/vulkan/images/primitive_topology_key_adjacency_edge.svg
+++ /dev/null
@@ -1,77 +0,0 @@
-<?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"
-   width="82"
-   height="3"
-   viewBox="0 0 82.000001 3.0000001"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
-   sodipodi:docname="primitive_topology_key_adjacency_edge.svg">
-  <defs
-     id="defs8647" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2.8284271"
-     inkscape:cx="-161.7899"
-     inkscape:cy="-70.775023"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="2233"
-     inkscape:window-height="1343"
-     inkscape:window-x="392"
-     inkscape:window-y="296"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-309"
-       originy="-623.50003" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-321.53439,204.53503)">
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 322.53439,-203.03503 h 80"
-       id="path2033"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_key_edge.svg b/registry/vulkan/images/primitive_topology_key_edge.svg
deleted file mode 100644
index d954122..0000000
--- a/registry/vulkan/images/primitive_topology_key_edge.svg
+++ /dev/null
@@ -1,77 +0,0 @@
-<?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"
-   width="82"
-   height="3"
-   viewBox="0 0 82.000001 3.0000001"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
-   sodipodi:docname="primitive_topology_key_edge.svg">
-  <defs
-     id="defs8647" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2.8284271"
-     inkscape:cx="-155.7795"
-     inkscape:cy="-4.5582473"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="2262"
-     inkscape:window-height="1507"
-     inkscape:window-x="482"
-     inkscape:window-y="385"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-309"
-       originy="-648.50003" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-321.53439,229.53503)">
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 322.53439,-228.03503 h 80"
-       id="path2033-1"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_key_provoking_vertex.svg b/registry/vulkan/images/primitive_topology_key_provoking_vertex.svg
deleted file mode 100644
index bfeca33..0000000
--- a/registry/vulkan/images/primitive_topology_key_provoking_vertex.svg
+++ /dev/null
@@ -1,83 +0,0 @@
-<?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"
-   width="15.714849"
-   height="10.938762"
-   viewBox="0 0 15.714849 10.938762"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
-   sodipodi:docname="primitive_topology_key_provoking_vertex.svg">
-  <defs
-     id="defs8647" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2.8284271"
-     inkscape:cx="-138.70844"
-     inkscape:cy="-55.865628"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="2595"
-     inkscape:window-height="1495"
-     inkscape:window-x="481"
-     inkscape:window-y="191"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-90.509107"
-       originy="-595.50917" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-103.0435,184.48292)">
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-8"
-       cx="107.53439"
-       cy="-178.03505"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#fa0000;stroke-width:1.00157475;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 107.53439,-178.035 10,-5"
-       id="path4672"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_key_vertex.svg b/registry/vulkan/images/primitive_topology_key_vertex.svg
deleted file mode 100644
index 9f71fcb..0000000
--- a/registry/vulkan/images/primitive_topology_key_vertex.svg
+++ /dev/null
@@ -1,78 +0,0 @@
-<?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"
-   width="8.9817867"
-   height="8.9817867"
-   viewBox="0 0 8.9817868 8.981787"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
-   sodipodi:docname="primitive_topology_key_vertex.svg">
-  <defs
-     id="defs8647" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2.8284271"
-     inkscape:cx="100.2616"
-     inkscape:cy="-104.45147"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-90.50911"
-       originy="-645.50922" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-103.0435,232.526)">
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-3"
-       cx="107.53439"
-       cy="-228.03511"
-       r="3.4908931" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_key_vertex_number.svg b/registry/vulkan/images/primitive_topology_key_vertex_number.svg
deleted file mode 100644
index 35b432f..0000000
--- a/registry/vulkan/images/primitive_topology_key_vertex_number.svg
+++ /dev/null
@@ -1,83 +0,0 @@
-<?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"
-   width="9.578125"
-   height="13.875"
-   viewBox="0 0 9.5781251 13.875"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
-   sodipodi:docname="primitive_topology_key_vertex_number.svg">
-  <defs
-     id="defs8647" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2.8284271"
-     inkscape:cx="78.58644"
-     inkscape:cy="-69.568388"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-90.367191"
-       originy="-618.75784" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-102.90158,210.66786)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="107.53439"
-       y="-198.03505"
-       id="text5070-2-2-9-9-41-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1-5"
-         x="107.53439"
-         y="-198.03505"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_key_winding_order.svg b/registry/vulkan/images/primitive_topology_key_winding_order.svg
deleted file mode 100644
index 139675d..0000000
--- a/registry/vulkan/images/primitive_topology_key_winding_order.svg
+++ /dev/null
@@ -1,141 +0,0 @@
-<?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"
-   width="55.063816"
-   height="46.178829"
-   viewBox="0 0 55.063817 46.17883"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
-   sodipodi:docname="primitive_topology_key_winding_order.svg">
-  <defs
-     id="defs8647">
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-0"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-6"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-6"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-80"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890-0"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2.8284271"
-     inkscape:cx="-140.55056"
-     inkscape:cy="-8.4326646"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-307.02933"
-       originy="-566.46097" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-319.56371,190.6748)">
-    <g
-       id="g4389-89"
-       transform="translate(255,-44.999995)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-79"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-1)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-3"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-6)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-9"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-80)" />
-    </g>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_line_list.svg b/registry/vulkan/images/primitive_topology_line_list.svg
deleted file mode 100644
index ff4710d..0000000
--- a/registry/vulkan/images/primitive_topology_line_list.svg
+++ /dev/null
@@ -1,278 +0,0 @@
-<?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"
-   width="89.898438"
-   height="107.35807"
-   viewBox="0 0 89.898439 107.35807"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_line_list.svg">
-  <defs
-     id="defs8647">
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible;"
-       id="marker5891"
-       refX="0.0"
-       refY="0.0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path5889" />
-    </marker>
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect5887"
-       effect="bspline" />
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path5594"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect5583"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect5395"
-       effect="bspline" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect5371"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="8.9402749"
-     inkscape:cx="44.90625"
-     inkscape:cy="53.682942"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-74.976564"
-       originy="-495.50911" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-87.510956,180.90228)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-168.0351"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="92.534393"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-88.035103"
-       id="text5070-2-2-9-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6"
-         x="92.534393"
-         y="-88.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-168.0351"
-       id="text5070-2-2-9-9-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4"
-         x="172.53439"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-88.035103"
-       id="text5070-2-2-9-9-77"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5"
-         x="172.53439"
-         y="-88.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2"
-       cx="172.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-4"
-       cx="172.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 92.534393,-158.0351 H 172.53439"
-       id="path2033"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 92.534393,-78.035103 H 172.53439"
-       id="path2033-5"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="92.534393"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-8"
-       cx="92.534393"
-       cy="-158.0351"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 92.534392,-158.0351 c 3.334534,-1.66727 6.667865,-3.33393 9.999998,-5"
-       id="path5369"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5371"
-       inkscape:original-d="m 92.534392,-158.0351 c 3.334333,-1.66767 6.667667,-3.33433 9.999998,-5" />
-    <path
-       inkscape:original-d="m 92.534392,-78.0351 c 3.334333,-1.66767 6.667667,-3.33433 9.999998,-5"
-       inkscape:path-effect="#path-effect5395"
-       inkscape:connector-curvature="0"
-       id="path5393"
-       d="m 92.534392,-78.0351 c 3.334534,-1.667267 6.667865,-3.333933 9.999998,-5"
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="m 107.53439,-163.0351 c 16.66767,0 33.33433,0 50,0"
-       id="path5581"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5583"
-       inkscape:original-d="m 107.53439,-163.0351 c 16.66767,-0.001 33.33433,-0.001 50,0" />
-    <path
-       inkscape:original-d="m 107.53439,-83.0351 c 16.66767,-0.001 33.33433,-0.001 50,0"
-       inkscape:path-effect="#path-effect5887"
-       inkscape:connector-curvature="0"
-       id="path5885"
-       d="m 107.53439,-83.0351 c 16.66767,0 33.33433,0 50,0"
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5891)" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_line_list_last.svg b/registry/vulkan/images/primitive_topology_line_list_last.svg
deleted file mode 100644
index f1afd4b..0000000
--- a/registry/vulkan/images/primitive_topology_line_list_last.svg
+++ /dev/null
@@ -1,278 +0,0 @@
-<?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"
-   width="89.898438"
-   height="107.35807"
-   viewBox="0 0 89.898439 107.35807"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_line_list_last.svg">
-  <defs
-     id="defs8647">
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible;"
-       id="marker5891"
-       refX="0.0"
-       refY="0.0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path5889" />
-    </marker>
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect5887"
-       effect="bspline" />
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path5594"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect5583"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect5395"
-       effect="bspline" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect5371"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="8.9402749"
-     inkscape:cx="24.772641"
-     inkscape:cy="53.682942"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1155"
-     inkscape:window-x="0"
-     inkscape:window-y="1"
-     inkscape:window-maximized="1"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-74.976564"
-       originy="-495.50911" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-87.510956,180.90228)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-168.0351"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="92.534393"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-88.035103"
-       id="text5070-2-2-9-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6"
-         x="92.534393"
-         y="-88.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-168.0351"
-       id="text5070-2-2-9-9-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4"
-         x="172.53439"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-88.035103"
-       id="text5070-2-2-9-9-77"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5"
-         x="172.53439"
-         y="-88.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 92.534393,-158.0351 H 172.53439"
-       id="path2033"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 92.534393,-78.035103 H 172.53439"
-       id="path2033-5"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-4"
-       cx="172.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="92.534393"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-8"
-       cx="92.534393"
-       cy="-158.0351"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 172.53439,-158.0351 c -3.33453,-1.66727 -6.66787,-3.33393 -10,-5"
-       id="path5369"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5371"
-       inkscape:original-d="m 172.53439,-158.0351 c -3.33433,-1.66767 -6.66767,-3.33433 -10,-5" />
-    <path
-       inkscape:original-d="m 172.53439,-78.0351 c -3.33433,-1.66767 -6.66767,-3.33433 -10,-5"
-       inkscape:path-effect="#path-effect5395"
-       inkscape:connector-curvature="0"
-       id="path5393"
-       d="m 172.53439,-78.0351 c -3.33453,-1.667266 -6.66787,-3.333934 -10,-5"
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="m 107.53439,-163.0351 c 16.66767,0 33.33433,0 50,0"
-       id="path5581"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect5583"
-       inkscape:original-d="m 107.53439,-163.0351 c 16.66767,-0.001 33.33433,-0.001 50,0" />
-    <path
-       inkscape:original-d="m 107.53439,-83.0351 c 16.66767,-0.001 33.33433,-0.001 50,0"
-       inkscape:path-effect="#path-effect5887"
-       inkscape:connector-curvature="0"
-       id="path5885"
-       d="m 107.53439,-83.0351 c 16.66767,0 33.33433,0 50,0"
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5891)" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2"
-       cx="172.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_line_list_with_adjacency.svg b/registry/vulkan/images/primitive_topology_line_list_with_adjacency.svg
deleted file mode 100644
index 2976295..0000000
--- a/registry/vulkan/images/primitive_topology_line_list_with_adjacency.svg
+++ /dev/null
@@ -1,356 +0,0 @@
-<?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"
-   width="250.5625"
-   height="107.36588"
-   viewBox="0 0 250.5625 107.36588"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_line_list_with_adjacency.svg">
-  <defs
-     id="defs8647">
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible;"
-       id="marker9663"
-       refX="0.0"
-       refY="0.0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path9661" />
-    </marker>
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect9659"
-       effect="bspline" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect9655"
-       effect="bspline" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect9645"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path5594"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect9609"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-3"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-0"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="5.7069807"
-     inkscape:cx="125.23828"
-     inkscape:cy="53.682935"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="5.4921875"
-       originy="-495.5091" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-7.0422058,180.9101)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="12.534393"
-       y="-168.0351"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="12.534393"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-168.0351"
-       id="text5070-2-2-9-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6"
-         x="172.53439"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-168.0351"
-       id="text5070-2-2-9-9-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4"
-         x="92.534393"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="252.53439"
-       y="-168.0351"
-       id="text5070-2-2-9-9-77"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5"
-         x="252.53439"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8"
-       cx="12.534393"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2"
-       cx="172.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-5-0"
-       cx="252.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="12.534393"
-       y="-88.035088"
-       id="text5070-2-2-9-9-0"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1"
-         x="12.534393"
-         y="-88.035088"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-88.035088"
-       id="text5070-2-2-9-9-7-3"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-8"
-         x="172.53439"
-         y="-88.035088"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">6</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-88.035088"
-       id="text5070-2-2-9-9-6-4"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-1"
-         x="92.534393"
-         y="-88.035088"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="252.53439"
-       y="-88.035088"
-       id="text5070-2-2-9-9-77-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-3"
-         x="252.53439"
-         y="-88.035088"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">7</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-7"
-       cx="12.534393"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-4"
-       cx="172.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-5-0-2"
-       cx="252.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 12.534393,-158.0351 h 80 m 79.999997,0 h 80"
-       id="path2031"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 92.534393,-158.0351 H 172.53439"
-       id="path2033"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 12.534393,-78.035103 h 80 m 79.999997,0 h 80"
-       id="path2031-2"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 92.534393,-78.035103 H 172.53439"
-       id="path2033-5"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="92.534393"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-9"
-       cx="92.534393"
-       cy="-78.035118"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="m 107.5344,-83.035117 c 16.66766,0 33.33433,0 50,0"
-       id="path9607"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect9609"
-       inkscape:original-d="m 107.5344,-83.035117 c 16.66766,-0.001 33.33433,-0.001 50,0" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 92.534393,-78.03512 c 3.334531,-1.667265 6.667866,-3.333932 9.999997,-4.999997"
-       id="path9643"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect9645"
-       inkscape:original-d="m 92.534393,-78.03512 c 3.334334,-1.66766 6.667667,-3.33433 9.999997,-4.999997" />
-    <path
-       inkscape:original-d="m 107.5344,-163.03511 c 16.66766,-0.001 33.33433,-0.001 50,0"
-       inkscape:path-effect="#path-effect9655"
-       inkscape:connector-curvature="0"
-       id="path9653"
-       d="m 107.5344,-163.03511 c 16.66766,0 33.33433,0 50,0"
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker9663)" />
-    <path
-       inkscape:original-d="m 92.534393,-158.03512 c 3.334334,-1.66766 6.667667,-3.33433 9.999997,-4.99999"
-       inkscape:path-effect="#path-effect9659"
-       inkscape:connector-curvature="0"
-       id="path9657"
-       d="m 92.534393,-158.03512 c 3.334532,-1.66726 6.667868,-3.33393 9.999997,-4.99999"
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_line_list_with_adjacency_last.svg b/registry/vulkan/images/primitive_topology_line_list_with_adjacency_last.svg
deleted file mode 100644
index 938b50b..0000000
--- a/registry/vulkan/images/primitive_topology_line_list_with_adjacency_last.svg
+++ /dev/null
@@ -1,356 +0,0 @@
-<?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"
-   width="250.5625"
-   height="107.36588"
-   viewBox="0 0 250.5625 107.36588"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_line_list_with_adjacency_last.svg">
-  <defs
-     id="defs8647">
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible;"
-       id="marker9663"
-       refX="0.0"
-       refY="0.0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path9661" />
-    </marker>
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect9659"
-       effect="bspline" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect9655"
-       effect="bspline" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect9645"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path5594"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect9609"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-3"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-0"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="5.7069807"
-     inkscape:cx="125.23828"
-     inkscape:cy="53.682935"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1155"
-     inkscape:window-x="0"
-     inkscape:window-y="1"
-     inkscape:window-maximized="1"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="5.4921875"
-       originy="-495.5091" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-7.0422058,180.9101)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="12.534393"
-       y="-168.0351"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="12.534393"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-168.0351"
-       id="text5070-2-2-9-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6"
-         x="172.53439"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-168.0351"
-       id="text5070-2-2-9-9-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4"
-         x="92.534393"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="252.53439"
-       y="-168.0351"
-       id="text5070-2-2-9-9-77"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5"
-         x="252.53439"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8"
-       cx="12.534393"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-5-0"
-       cx="252.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="12.534393"
-       y="-88.035088"
-       id="text5070-2-2-9-9-0"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1"
-         x="12.534393"
-         y="-88.035088"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-88.035088"
-       id="text5070-2-2-9-9-7-3"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-8"
-         x="172.53439"
-         y="-88.035088"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">6</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-88.035088"
-       id="text5070-2-2-9-9-6-4"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-1"
-         x="92.534393"
-         y="-88.035088"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="252.53439"
-       y="-88.035088"
-       id="text5070-2-2-9-9-77-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-3"
-         x="252.53439"
-         y="-88.035088"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">7</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-7"
-       cx="12.534393"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-5-0-2"
-       cx="252.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 12.534393,-158.0351 h 80 m 79.999997,0 h 80"
-       id="path2031"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 92.534393,-158.0351 H 172.53439"
-       id="path2033"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2"
-       cx="172.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 12.534393,-78.035103 h 80 m 79.999997,0 h 80"
-       id="path2031-2"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 92.534393,-78.035103 H 172.53439"
-       id="path2033-5"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-4"
-       cx="172.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="92.534393"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-9"
-       cx="92.534393"
-       cy="-78.035118"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="m 107.5344,-83.035117 c 16.66766,0 33.33433,0 50,0"
-       id="path9607"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect9609"
-       inkscape:original-d="m 107.5344,-83.035117 c 16.66766,-0.001 33.33433,-0.001 50,0" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 172.53439,-78.035117 c -3.33453,-1.667265 -6.66786,-3.333931 -9.99999,-4.999997"
-       id="path9643"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect9645"
-       inkscape:original-d="m 172.53439,-78.035117 c -3.33433,-1.66766 -6.66766,-3.33433 -9.99999,-4.999997" />
-    <path
-       inkscape:original-d="m 107.5344,-163.03511 c 16.66766,-0.001 33.33433,-0.001 50,0"
-       inkscape:path-effect="#path-effect9655"
-       inkscape:connector-curvature="0"
-       id="path9653"
-       d="m 107.5344,-163.03511 c 16.66766,0 33.33433,0 50,0"
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker9663)" />
-    <path
-       inkscape:original-d="m 172.53439,-158.03512 c -3.33433,-1.66766 -6.66766,-3.33433 -9.99999,-4.99999"
-       inkscape:path-effect="#path-effect9659"
-       inkscape:connector-curvature="0"
-       id="path9657"
-       d="m 172.53439,-158.03512 c -3.33453,-1.66726 -6.66786,-3.33393 -9.99999,-4.99999"
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_line_strip.svg b/registry/vulkan/images/primitive_topology_line_strip.svg
deleted file mode 100644
index a54fabb..0000000
--- a/registry/vulkan/images/primitive_topology_line_strip.svg
+++ /dev/null
@@ -1,348 +0,0 @@
-<?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"
-   width="249.89841"
-   height="27.365885"
-   viewBox="0 0 249.89841 27.365885"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_line_strip.svg">
-  <defs
-     id="defs8647">
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="marker17322"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path17320"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect17318"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible;"
-       id="marker16960"
-       refX="0.0"
-       refY="0.0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path16958" />
-    </marker>
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect16956"
-       effect="bspline" />
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path879"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect16309"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect16305"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect16301"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect16297"
-       effect="bspline" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect16293"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-1"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="5.7213473"
-     inkscape:cx="124.90623"
-     inkscape:cy="13.682937"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-314.97657"
-       originy="-495.50911" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-327.51096,100.9101)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53439"
-       y="-88.035095"
-       id="text5070-2-2-9-9-8"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-9"
-         x="332.53439"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="492.53439"
-       y="-88.035095"
-       id="text5070-2-2-9-9-7-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-6"
-         x="492.53439"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="-88.035095"
-       id="text5070-2-2-9-9-6-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-8"
-         x="412.53439"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="572.53436"
-       y="-88.035095"
-       id="text5070-2-2-9-9-77-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-1"
-         x="572.53436"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-5-0-7"
-       cx="572.53436"
-       cy="-78.035103"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 332.53439,-78.0351 240,-5e-6"
-       id="path2085"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="332.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-9"
-       cx="412.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-1"
-       cx="492.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 332.53439,-78.035105 c 3.33453,-1.667265 6.66787,-3.333935 10,-5"
-       id="path16291"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect16293"
-       inkscape:original-d="m 332.53439,-78.035105 c 3.33433,-1.667667 6.66767,-3.334334 10,-5" />
-    <path
-       inkscape:original-d="m 412.53439,-78.035105 c 3.33433,-1.66766 6.66767,-3.33433 10,-5"
-       inkscape:path-effect="#path-effect16297"
-       inkscape:connector-curvature="0"
-       id="path16295"
-       d="m 412.53439,-78.035105 c 3.33453,-1.667264 6.66787,-3.333934 10,-5"
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 492.53439,-78.035105 c 3.33453,-1.667264 6.66787,-3.333934 10,-5"
-       id="path16299"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect16301"
-       inkscape:original-d="m 492.53439,-78.035105 c 3.33433,-1.66766 6.66767,-3.33433 10,-5" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="m 347.53439,-83.035105 c 16.66767,0 33.33433,0 50,0"
-       id="path16307"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect16309"
-       inkscape:original-d="m 347.53439,-83.035105 c 16.66767,-0.001 33.33433,-0.001 50,0" />
-    <path
-       inkscape:original-d="m 427.53439,-83.035105 c 16.66767,-0.001 33.33433,-0.001 50,0"
-       inkscape:path-effect="#path-effect16956"
-       inkscape:connector-curvature="0"
-       id="path16954"
-       d="m 427.53439,-83.035105 c 16.66767,0 33.33433,0 50,0"
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker16960)" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker17322)"
-       d="m 507.53439,-83.035105 c 16.66767,0 33.33433,0 50,0"
-       id="path17316"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect17318"
-       inkscape:original-d="m 507.53439,-83.035105 c 16.66767,-0.001 33.33433,-0.001 50,0" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_line_strip_last.svg b/registry/vulkan/images/primitive_topology_line_strip_last.svg
deleted file mode 100644
index 3675568..0000000
--- a/registry/vulkan/images/primitive_topology_line_strip_last.svg
+++ /dev/null
@@ -1,415 +0,0 @@
-<?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"
-   width="249.89841"
-   height="27.365885"
-   viewBox="0 0 249.89841 27.365885"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_line_strip_last.svg">
-  <defs
-     id="defs8647">
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect16289"
-       effect="bspline" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect16285"
-       effect="bspline" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect16277"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="marker15787"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path15785"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect15783"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible;"
-       id="marker15347"
-       refX="0.0"
-       refY="0.0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path15345" />
-    </marker>
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect15343"
-       effect="bspline" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect15333"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect15318"
-       effect="bspline" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect15314"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path879"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lend"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path873"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.8) rotate(180) translate(12.5,0)" />
-    </marker>
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect15228"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect15118"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect15114"
-       effect="bspline" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect15071"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-1"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="5.7213473"
-     inkscape:cx="124.90623"
-     inkscape:cy="13.682936"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1155"
-     inkscape:window-x="0"
-     inkscape:window-y="1"
-     inkscape:window-maximized="1"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-314.97657"
-       originy="-495.50911" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-327.51096,100.9101)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53439"
-       y="-88.035095"
-       id="text5070-2-2-9-9-8"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-9"
-         x="332.53439"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="492.53439"
-       y="-88.035095"
-       id="text5070-2-2-9-9-7-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-6"
-         x="492.53439"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="-88.035095"
-       id="text5070-2-2-9-9-6-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-8"
-         x="412.53439"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="572.53436"
-       y="-88.035095"
-       id="text5070-2-2-9-9-77-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-1"
-         x="572.53436"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-5-0-7"
-       cx="332.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 332.53439,-78.0351 240,-5e-6"
-       id="path2085"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="-412.53439"
-       cy="-78.035103"
-       r="3.4908931"
-       transform="scale(-1,1)" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-9"
-       cx="-492.53439"
-       cy="-78.035103"
-       r="3.4908931"
-       transform="scale(-1,1)" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-1"
-       cx="-572.53436"
-       cy="-78.03511"
-       r="3.4908931"
-       transform="scale(-1,1)" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="m 347.53439,-83.035105 c 16.66767,0 33.33433,0 50,0"
-       id="path15226"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect15228"
-       inkscape:original-d="m 347.53439,-83.035105 c 16.66767,-0.001 33.33433,-0.001 50,0" />
-    <path
-       inkscape:original-d="m 427.53439,-83.035105 c 16.66767,-0.001 33.33433,-0.001 50,0"
-       inkscape:path-effect="#path-effect15343"
-       inkscape:connector-curvature="0"
-       id="path15341"
-       d="m 427.53439,-83.035105 c 16.66767,0 33.33433,0 50,0"
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker15347)" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker15787)"
-       d="m 507.53439,-83.035105 c 16.66767,0 33.33433,0 50,0"
-       id="path15781"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect15783"
-       inkscape:original-d="m 507.53439,-83.035105 c 16.66767,-0.001 33.33433,-0.001 50,0" />
-    <path
-       style="fill:none;stroke:#fa0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 412.53439,-78.035105 c -3.33293,-1.666465 -6.66627,-3.333135 -10,-5"
-       id="path16275"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect16277"
-       inkscape:original-d="m 412.53439,-78.035105 c -3.33233,-1.667667 -6.66567,-3.334334 -10,-5" />
-    <path
-       inkscape:original-d="m 492.53439,-78.035105 c -3.33233,-1.667667 -6.66567,-3.334334 -10,-5"
-       inkscape:path-effect="#path-effect16285"
-       inkscape:connector-curvature="0"
-       id="path16283"
-       d="m 492.53439,-78.035105 c -3.33293,-1.666465 -6.66627,-3.333135 -10,-5"
-       style="fill:none;stroke:#fa0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       inkscape:original-d="m 572.53439,-78.035105 c -3.33233,-1.667667 -6.66567,-3.334334 -10,-5"
-       inkscape:path-effect="#path-effect16289"
-       inkscape:connector-curvature="0"
-       id="path16287"
-       d="m 572.53439,-78.035105 c -3.33293,-1.666465 -6.66627,-3.333135 -10,-5"
-       style="fill:none;stroke:#fa0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_line_strip_with_adjacency.svg b/registry/vulkan/images/primitive_topology_line_strip_with_adjacency.svg
deleted file mode 100644
index aeecd76..0000000
--- a/registry/vulkan/images/primitive_topology_line_strip_with_adjacency.svg
+++ /dev/null
@@ -1,346 +0,0 @@
-<?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"
-   width="409.96866"
-   height="27.365885"
-   viewBox="0 0 409.96867 27.365885"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_line_strip_with_adjacency.svg">
-  <defs
-     id="defs8647">
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect11628"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect11624"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect11620"
-       effect="bspline" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect11616"
-       effect="bspline" />
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path5594"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect11574"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect11552"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-7"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="3.4729165"
-     inkscape:cx="204.84761"
-     inkscape:cy="13.682936"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-314.97657"
-       originy="-495.50911" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-327.51096,100.9101)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53439"
-       y="-88.035095"
-       id="text5070-2-2-9-9-8"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-9"
-         x="332.53439"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="492.53439"
-       y="-88.035095"
-       id="text5070-2-2-9-9-7-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-6"
-         x="492.53439"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="-88.035095"
-       id="text5070-2-2-9-9-6-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-8"
-         x="412.53439"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="572.53436"
-       y="-88.035095"
-       id="text5070-2-2-9-9-77-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-1"
-         x="572.53436"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-8"
-       cx="332.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="652.53436"
-       y="-88.035103"
-       id="text5070-2-2-9-9-7-7-4"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-6-9"
-         x="652.53436"
-         y="-88.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="732.5343"
-       y="-88.035103"
-       id="text5070-2-2-9-9-77-5-0"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-1-5"
-         x="732.5343"
-         y="-88.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-2-2"
-       cx="652.53436"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-5-0-7-1"
-       cx="732.5343"
-       cy="-78.035103"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 332.53439,-78.035103 h 80 m 240,0 h 80"
-       id="path2083"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 412.53439,-78.035103 h 240"
-       id="path2085"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="412.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-9"
-       cx="492.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-6"
-       cx="572.53442"
-       cy="-78.035103"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 412.53439,-78.035105 c 3.33453,-1.667265 6.66787,-3.333935 10,-5"
-       id="path11550"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect11552"
-       inkscape:original-d="m 412.53439,-78.035105 c 3.33433,-1.667667 6.66767,-3.334334 10,-5" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="m 427.53439,-83.035105 c 16.66767,0 33.33433,0 50,0"
-       id="path11572"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect11574"
-       inkscape:original-d="m 427.53439,-83.035105 c 16.66767,-0.001 33.33433,-0.001 50,0" />
-    <path
-       inkscape:original-d="m 492.53439,-78.035105 c 3.33433,-1.667667 6.66767,-3.334334 10,-5"
-       inkscape:path-effect="#path-effect11616"
-       inkscape:connector-curvature="0"
-       id="path11614"
-       d="m 492.53439,-78.035105 c 3.33453,-1.667265 6.66787,-3.333935 10,-5"
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       inkscape:original-d="m 507.53439,-83.035105 c 16.66767,-0.001 33.33433,-0.001 50,0"
-       inkscape:path-effect="#path-effect11620"
-       inkscape:connector-curvature="0"
-       id="path11618"
-       d="m 507.53439,-83.035105 c 16.66767,0 33.33433,0 50,0"
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
-    <path
-       style="fill:none;stroke:#f50000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 572.53439,-78.035105 c 3.33453,-1.667265 6.66787,-3.333935 10,-5"
-       id="path11622"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect11624"
-       inkscape:original-d="m 572.53439,-78.035105 c 3.33433,-1.667667 6.66767,-3.334334 10,-5" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="m 587.53439,-83.035105 c 16.66767,0 33.33433,0 50,0"
-       id="path11626"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect11628"
-       inkscape:original-d="m 587.53439,-83.035105 c 16.66767,-0.001 33.33433,-0.001 50,0" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_line_strip_with_adjacency_last.svg b/registry/vulkan/images/primitive_topology_line_strip_with_adjacency_last.svg
deleted file mode 100644
index 986b1b4..0000000
--- a/registry/vulkan/images/primitive_topology_line_strip_with_adjacency_last.svg
+++ /dev/null
@@ -1,346 +0,0 @@
-<?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"
-   width="409.96866"
-   height="27.365885"
-   viewBox="0 0 409.96867 27.365885"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_line_strip_with_adjacency_last.svg">
-  <defs
-     id="defs8647">
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect11628"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect11624"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect11620"
-       effect="bspline" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect11616"
-       effect="bspline" />
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path5594"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect11574"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect11552"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-7"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="3.4729165"
-     inkscape:cx="204.84761"
-     inkscape:cy="13.682937"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1155"
-     inkscape:window-x="0"
-     inkscape:window-y="1"
-     inkscape:window-maximized="1"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-314.97657"
-       originy="-495.50911" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-327.51096,100.9101)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53439"
-       y="-88.035095"
-       id="text5070-2-2-9-9-8"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-9"
-         x="332.53439"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="492.53439"
-       y="-88.035095"
-       id="text5070-2-2-9-9-7-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-6"
-         x="492.53439"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="-88.035095"
-       id="text5070-2-2-9-9-6-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-8"
-         x="412.53439"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="572.53436"
-       y="-88.035095"
-       id="text5070-2-2-9-9-77-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-1"
-         x="572.53436"
-         y="-88.035095"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-8"
-       cx="332.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="652.53436"
-       y="-88.035103"
-       id="text5070-2-2-9-9-7-7-4"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-6-9"
-         x="652.53436"
-         y="-88.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="732.5343"
-       y="-88.035103"
-       id="text5070-2-2-9-9-77-5-0"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-1-5"
-         x="732.5343"
-         y="-88.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-5-0-7-1"
-       cx="732.5343"
-       cy="-78.035103"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 332.53439,-78.035103 h 80 m 240,0 h 80"
-       id="path2083"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 412.53439,-78.035103 h 240"
-       id="path2085"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-2-2"
-       cx="652.53436"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="412.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-9"
-       cx="492.53439"
-       cy="-78.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-6"
-       cx="572.53442"
-       cy="-78.035103"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 492.53439,-78.035105 c -3.33453,-1.667265 -6.66787,-3.333935 -10,-5"
-       id="path11550"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect11552"
-       inkscape:original-d="m 492.53439,-78.035105 c -3.33433,-1.667667 -6.66767,-3.334334 -10,-5" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="m 427.53439,-83.035105 c 16.66767,0 33.33433,0 50,0"
-       id="path11572"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect11574"
-       inkscape:original-d="m 427.53439,-83.035105 c 16.66767,-0.001 33.33433,-0.001 50,0" />
-    <path
-       inkscape:original-d="m 572.53439,-78.035105 c -3.33433,-1.667667 -6.66767,-3.334334 -10,-5"
-       inkscape:path-effect="#path-effect11616"
-       inkscape:connector-curvature="0"
-       id="path11614"
-       d="m 572.53439,-78.035105 c -3.33453,-1.667265 -6.66787,-3.333935 -10,-5"
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       inkscape:original-d="m 507.53439,-83.035105 c 16.66767,-0.001 33.33433,-0.001 50,0"
-       inkscape:path-effect="#path-effect11620"
-       inkscape:connector-curvature="0"
-       id="path11618"
-       d="m 507.53439,-83.035105 c 16.66767,0 33.33433,0 50,0"
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 652.53439,-78.035105 c -3.33453,-1.667265 -6.66787,-3.333935 -10,-5"
-       id="path11622"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect11624"
-       inkscape:original-d="m 652.53439,-78.035105 c -3.33433,-1.667667 -6.66767,-3.334334 -10,-5" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="m 587.53439,-83.035105 c 16.66767,0 33.33433,0 50,0"
-       id="path11626"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect11628"
-       inkscape:original-d="m 587.53439,-83.035105 c 16.66767,-0.001 33.33433,-0.001 50,0" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_point_list.svg b/registry/vulkan/images/primitive_topology_point_list.svg
deleted file mode 100644
index 44c1371..0000000
--- a/registry/vulkan/images/primitive_topology_point_list.svg
+++ /dev/null
@@ -1,877 +0,0 @@
-<?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"
-   width="200.14062"
-   height="147.16275"
-   viewBox="0 0 200.14063 147.16275"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
-   sodipodi:docname="primitive_topology_point_list.svg">
-  <defs
-     id="defs8647">
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6742"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6462"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2335"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart">
-      <path
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2333"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Torso"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Torso"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <g
-         id="g1107"
-         transform="scale(0.7)"
-         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
-        <path
-           id="path1093"
-           d="m -4.7792281,-3.239542 c 2.350374,0.3659393 5.30026732,1.9375477 5.03715532,3.62748546 C -0.00518779,2.0778819 -2.2126741,2.6176539 -4.5630471,2.2517169 -6.9134221,1.8857769 -8.521035,0.75201414 -8.257922,-0.93792336 -7.994809,-2.6278615 -7.1296041,-3.6054813 -4.7792281,-3.239542 Z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path1095"
-           d="M 4.4598789,0.08866574 C -2.5564571,-4.378332 5.2248769,-3.9061806 -0.84829578,-8.7197331"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path1097"
-           d="M 4.9298719,0.05752074 C -1.3872731,1.7494689 1.8027579,5.4782079 -4.9448731,7.5462725"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <rect
-           id="rect1099"
-           transform="matrix(0.527536,-0.849533,0.887668,0.460484,0,0)"
-           y="-1.7408575"
-           x="-10.391706"
-           height="2.7608147"
-           width="2.6366582"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" />
-        <rect
-           id="rect1101"
-           transform="matrix(0.671205,-0.741272,0.790802,0.612072,0,0)"
-           y="-7.9629307"
-           x="4.9587269"
-           height="2.8614161"
-           width="2.7327356"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" />
-        <path
-           id="path1103"
-           transform="matrix(0,-1.109517,1.109517,0,25.96648,19.71619)"
-           d="m 16.779951,-28.685045 a 0.60731727,0.60731727 0 1 0 -1.214634,0 0.60731727,0.60731727 0 1 0 1.214634,0 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path1105"
-           transform="matrix(0,-1.109517,1.109517,0,26.8245,16.99126)"
-           d="m 16.779951,-28.685045 a 0.60731727,0.60731727 0 1 0 -1.214634,0 0.60731727,0.60731727 0 1 0 1.214634,0 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-      </g>
-    </marker>
-    <marker
-       inkscape:stockid="Tail"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Tail"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <g
-         id="g929"
-         transform="scale(-1.2)"
-         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
-        <path
-           id="path917"
-           d="M -3.8048674,-3.9585227 0.54352094,0"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path919"
-           d="M -1.2866832,-3.9585227 3.0617053,0"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path921"
-           d="M 1.3053582,-3.9585227 5.6537466,0"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path923"
-           d="M -3.8048674,4.1775838 0.54352094,0.21974226"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path925"
-           d="M -1.2866832,4.1775838 3.0617053,0.21974226"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path927"
-           d="M 1.3053582,4.1775838 5.6537466,0.21974226"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-      </g>
-    </marker>
-    <marker
-       inkscape:stockid="Legs"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Legs"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <g
-         id="g1090"
-         transform="scale(-0.7)"
-         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
-        <g
-           id="g1084"
-           transform="matrix(0,-1,-1,0,20.70862,21.31391)"
-           style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
-          <path
-             id="path1080"
-             d="m 21.22125,20.67536 c -6.910151,4.721157 -2.454525,6.606844 -5.841071,13.443235"
-             style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-             inkscape:connector-curvature="0" />
-          <path
-             id="path1082"
-             d="m 21.39811,20.54812 c -1.360509,8.347524 3.536072,8.76994 4.505041,13.824958"
-             style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-             inkscape:connector-curvature="0" />
-        </g>
-        <path
-           id="path1086"
-           d="m -14.09007,-6.7318716 -0.922168,4.043383 3.962751,-1.22307 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path1088"
-           d="m -15.215679,4.5567534 1.874127,3.699613 2.266874,-3.472855 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-      </g>
-    </marker>
-    <marker
-       inkscape:stockid="Scissors"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Scissors"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="schere"
-         d="M 9.0898857,-3.6061018 C 8.1198849,-4.7769976 6.3697607,-4.7358294 5.0623558,-4.2327734 l -8.2124046,3.0779029 c -2.3882933,-1.3067135 -4.7482873,-0.9325372 -4.7482873,-1.5687873 0,-0.4973164 0.4566662,-0.3883222 0.3883068,-1.6831941 -0.065635,-1.2432767 -1.3635771,-2.1630796 -2.5903987,-2.0816435 -1.227271,-0.00735 -2.499439,0.9331613 -2.510341,2.2300611 -0.09143,1.3063864 1.007209,2.5196896 2.306764,2.6052316 1.5223406,0.2266616 4.218258,-0.6955566 5.482945,1.57086006 -0.9422847,1.73825774 -2.6140244,1.74307674 -4.1255107,1.65607034 -1.2548743,-0.072235 -2.7620933,0.2873979 -3.3606483,1.5208605 -0.578367,1.1820862 -0.0112,2.8646022 1.316749,3.226412 1.3401912,0.4918277 3.1806689,-0.129711 3.4993722,-1.6707242 0.2456585,-1.187823 -0.5953659,-1.7459574 -0.2725074,-2.1771537 0.2436135,-0.32536 1.7907806,-0.1368452 4.5471053,-1.3748244 L 5.6763468,4.2330688 C 6.8000164,4.5467672 8.1730685,4.5362646 9.1684433,3.4313614 l -9.22008423,-3.48508362 z m -18.3078016,-1.900504 c 1.294559,0.7227998 1.1888392,2.6835702 -0.1564272,3.0632889 -1.2165179,0.423661 -2.7710269,-0.7589694 -2.3831779,-2.0774648 0.227148,-1.0818519 1.653387,-1.480632 2.5396051,-0.9858241 z m 0.056264,8.0173649 c 1.3508301,0.4988648 1.1214429,2.7844356 -0.2522207,3.091609 -0.9110594,0.3163391 -2.2135494,-0.1387976 -2.3056964,-1.2121394 -0.177609,-1.305055 1.356085,-2.4841482 2.5579171,-1.8794696 z"
-         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="TriangleInS"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="TriangleInS"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1020"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(-0.2)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="DiamondS"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="DiamondS"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path966"
-         d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.2)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Send"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Send"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path914"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mend"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path908"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(-0.6)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="TriangleInM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="TriangleInM"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1017"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(-0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path884"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-4"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-9" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-6"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-8" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-0"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-5" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-5" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-9"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-2" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-0"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-4" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-6"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-8"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-7" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-6-3"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-0-2" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-8-3"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-7-1" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1-9"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99-5" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75-9"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3-1" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-2"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-53" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-5"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-6" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-88"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1-9-3"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99-5-6" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75-9-2"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3-1-7" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-2-4"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-53-9" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-5-1"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-6-6" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1-9-3-5"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99-5-6-2" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75-9-2-5"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3-1-7-1" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2.8284272"
-     inkscape:cx="118.95274"
-     inkscape:cy="44.306863"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="64.835941"
-       originy="-455.50911" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(52.301544,180.70697)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="12.534395"
-       y="-108.03511"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="12.534395"
-         y="-108.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="142.53439"
-       y="-118.03511"
-       id="text5070-2-2-9-9-1"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3"
-         x="142.53439"
-         y="-118.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="-47.465607"
-       y="-148.03511"
-       id="text5070-2-2-9-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6"
-         x="-47.465607"
-         y="-148.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="52.534393"
-       y="-168.0351"
-       id="text5070-2-2-9-9-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4"
-         x="52.534393"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-48.03511"
-       id="text5070-2-2-9-9-77"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5"
-         x="92.534393"
-         y="-48.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8"
-       cx="142.53439"
-       cy="-108.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91"
-       cx="52.534393"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2"
-       cx="92.534393"
-       cy="-38.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25"
-       cx="-47.465607"
-       cy="-138.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-5"
-       cx="12.534393"
-       cy="-98.03511"
-       r="3.4908931" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
-       x="572.53442"
-       y="-168.03511"
-       id="text11340"><tspan
-         sodipodi:role="line"
-         id="tspan11338"
-         x="572.53442"
-         y="-131.5419" /></text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_triangle_fan.svg b/registry/vulkan/images/primitive_topology_triangle_fan.svg
deleted file mode 100644
index 79315f8..0000000
--- a/registry/vulkan/images/primitive_topology_triangle_fan.svg
+++ /dev/null
@@ -1,472 +0,0 @@
-<?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"
-   width="169.79558"
-   height="104.11718"
-   viewBox="0 0 169.79558 104.11718"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_triangle_fan.svg">
-  <defs
-     id="defs8647">
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect17027"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect17023"
-       effect="bspline" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect16947"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6742"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6462"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1-9"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99-5" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75-9"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3-1" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-9-0"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         id="path890-9-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-2"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-53" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-5"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-6" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-7"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         id="path890-92"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-7"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-7-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-9-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="8.4447374"
-     inkscape:cx="84.839197"
-     inkscape:cy="52.066398"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-235.50911"
-       originy="-498.75781" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-248.0435,180.9101)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53439"
-       y="-78.035103"
-       id="text5070-2-2-9-9-75"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-68"
-         x="332.53439"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="-78.035103"
-       id="text5070-2-2-9-9-1-4"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3-6"
-         x="412.53439"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="292.53439"
-       y="-168.0351"
-       id="text5070-2-2-9-9-7-4"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-3"
-         x="292.53439"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="252.53439"
-       y="-78.035103"
-       id="text5070-2-2-9-9-6-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-4"
-         x="252.53439"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="372.53439"
-       y="-168.0351"
-       id="text5070-2-2-9-9-77-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-2"
-         x="372.53439"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-0"
-       cx="412.53439"
-       cy="-98.035095"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 252.53439,-98.0351 40,-59.99999 h 80 l 40,59.99999 z m 40,-59.99999 40,59.99999 40,-59.99999"
-       id="path875-4"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g4389-3"
-       transform="translate(200,6.6621094e-6)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-1"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-2)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-2"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-5)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-1"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-7)" />
-    </g>
-    <g
-       transform="translate(279.66144,0.68117665)"
-       id="g4389-5-5">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-6-6"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-1-9)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-4-3"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-75-9)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-0-9"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-9-0)" />
-    </g>
-    <g
-       id="g7055"
-       transform="translate(30,-9.9999914)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744)" />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
-       x="572.53442"
-       y="-168.03511"
-       id="text11340"><tspan
-         sodipodi:role="line"
-         id="tspan11338"
-         x="572.53442"
-         y="-132.64449" /></text>
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="292.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-9"
-       cx="252.53439"
-       cy="-98.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-9-7"
-       cx="332.53439"
-       cy="-98.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-9-6"
-       cx="372.53439"
-       cy="158.03511"
-       r="3.4908931"
-       transform="scale(1,-1)" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 252.53439,-98.03511 c 3.21845,-1.609226 6.66787,-3.33393 10,-5"
-       id="path16945"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect16947"
-       inkscape:original-d="m 252.53439,-98.03511 c 3.20124,-1.643652 6.66767,-3.33433 10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 292.53439,-158.03511 c 3.33373,1.66687 6.66707,3.33353 10,5"
-       id="path17025"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect17027"
-       inkscape:original-d="m 292.53439,-158.03511 c 3.33433,1.66567 6.66767,3.33233 10,5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 372.53439,-158.03511 v 12"
-       id="path17029"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_triangle_fan_last.svg b/registry/vulkan/images/primitive_topology_triangle_fan_last.svg
deleted file mode 100644
index 7fcf9cb..0000000
--- a/registry/vulkan/images/primitive_topology_triangle_fan_last.svg
+++ /dev/null
@@ -1,472 +0,0 @@
-<?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"
-   width="169.79558"
-   height="104.11718"
-   viewBox="0 0 169.79558 104.11718"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_triangle_fan_last.svg">
-  <defs
-     id="defs8647">
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect17027"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect17023"
-       effect="bspline" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect16947"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6742"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6462"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1-9"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99-5" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75-9"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3-1" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-9-0"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         id="path890-9-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-2"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-53" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-5"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-6" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-7"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         id="path890-92"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-7"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-7-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-9-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="8.4447374"
-     inkscape:cx="84.839197"
-     inkscape:cy="52.066398"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1155"
-     inkscape:window-x="0"
-     inkscape:window-y="1"
-     inkscape:window-maximized="1"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-235.50911"
-       originy="-498.75781" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-248.0435,180.9101)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53439"
-       y="-78.035103"
-       id="text5070-2-2-9-9-75"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-68"
-         x="332.53439"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="-78.035103"
-       id="text5070-2-2-9-9-1-4"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3-6"
-         x="412.53439"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="292.53439"
-       y="-168.0351"
-       id="text5070-2-2-9-9-7-4"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-3"
-         x="292.53439"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="252.53439"
-       y="-78.035103"
-       id="text5070-2-2-9-9-6-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-4"
-         x="252.53439"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="372.53439"
-       y="-168.0351"
-       id="text5070-2-2-9-9-77-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-2"
-         x="372.53439"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 252.53439,-98.0351 40,-59.99999 h 80 l 40,59.99999 z m 40,-59.99999 40,59.99999 40,-59.99999"
-       id="path875-4"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-0"
-       cx="412.53439"
-       cy="-98.035095"
-       r="3.4908931" />
-    <g
-       id="g4389-3"
-       transform="translate(200,6.6621094e-6)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-1"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-2)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-2"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-5)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-1"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-7)" />
-    </g>
-    <g
-       transform="translate(279.66144,0.68117665)"
-       id="g4389-5-5">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-6-6"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-1-9)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-4-3"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-75-9)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-0-9"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-9-0)" />
-    </g>
-    <g
-       id="g7055"
-       transform="translate(30,-9.9999914)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744)" />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
-       x="572.53442"
-       y="-168.03511"
-       id="text11340"><tspan
-         sodipodi:role="line"
-         id="tspan11338"
-         x="572.53442"
-         y="-132.64449" /></text>
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="292.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-9"
-       cx="252.53439"
-       cy="-98.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-9-7"
-       cx="332.53439"
-       cy="-98.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-9-6"
-       cx="372.53439"
-       cy="158.03511"
-       r="3.4908931"
-       transform="scale(1,-1)" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 412.53439,-98.03511 c -3.21845,-1.609226 -6.66787,-3.33393 -10,-5"
-       id="path16945"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect16947"
-       inkscape:original-d="m 412.53439,-98.03511 c -3.20124,-1.643652 -6.66767,-3.33433 -10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 372.53439,-158.03511 c -3.33373,1.66687 -6.66707,3.33353 -10,5"
-       id="path17025"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect17027"
-       inkscape:original-d="m 372.53439,-158.03511 c -3.33433,1.66567 -6.66767,3.33233 -10,5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 292.53439,-158.03511 v 12"
-       id="path17029"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_triangle_list.svg b/registry/vulkan/images/primitive_topology_triangle_list.svg
deleted file mode 100644
index 86fbe83..0000000
--- a/registry/vulkan/images/primitive_topology_triangle_list.svg
+++ /dev/null
@@ -1,395 +0,0 @@
-<?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"
-   width="210.32816"
-   height="104.11718"
-   viewBox="0 0 210.32816 104.11718"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_triangle_list.svg">
-  <defs
-     id="defs8647">
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect18703"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect18651"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-2-4"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-53-9" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-5-1"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-6-6" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-7-3"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         id="path890-92-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6462-51"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6742-54"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="6.8002841"
-     inkscape:cx="105.09767"
-     inkscape:cy="52.066398"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-474.97657"
-       originy="-498.75782" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-487.51096,180.9101)">
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 612.53439,-158.0351 40,59.999997 40,-59.999997 z"
-       id="path11344"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="572.53442"
-       y="-78.035103"
-       id="text5070-2-2-9-9-75-8"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-68-4"
-         x="572.53442"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="532.53436"
-       y="-168.03508"
-       id="text5070-2-2-9-9-7-4-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-3-1"
-         x="532.53436"
-         y="-168.03508"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="492.53439"
-       y="-78.035103"
-       id="text5070-2-2-9-9-6-2-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-4-0"
-         x="492.53439"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-9-3"
-       cx="532.53436"
-       cy="-158.03508"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-0-0"
-       cx="572.53442"
-       cy="-98.035103"
-       r="3.4908931" />
-    <g
-       id="g4389-3-6"
-       transform="translate(440,2.147998e-5)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-1-8"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-2-4)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-2-7"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-5-1)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-1-0"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-7-3)" />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="612.53442"
-       y="-168.0351"
-       id="text5070-2-2-9-9-75-8-3"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-68-4-4"
-         x="612.53442"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="652.53442"
-       y="-78.035103"
-       id="text5070-2-2-9-9-1-4-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3-6-1"
-         x="652.53442"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="692.53442"
-       y="-168.0351"
-       id="text5070-2-2-9-9-77-2-4"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-2-0"
-         x="692.53442"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-0-3"
-       cx="652.53442"
-       cy="-98.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-0-0-6"
-       cx="692.53442"
-       cy="-158.0351"
-       r="3.4908931" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
-       x="572.53442"
-       y="-168.03511"
-       id="text11340"><tspan
-         sodipodi:role="line"
-         id="tspan11338"
-         x="572.53442"
-         y="-132.64449" /></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 492.53439,-98.035095 40,-59.999995 40,59.999995 z"
-       id="path11342"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g7055"
-       transform="translate(350.00001,-10)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-5)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-4)" />
-    </g>
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97"
-       cx="492.53439"
-       cy="-98.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="612.53442"
-       cy="-158.0351"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 492.53439,-98.0351 c 3.33453,-1.667265 6.66787,-3.33393 10,-5"
-       id="path18649"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect18651"
-       inkscape:original-d="m 492.53439,-98.0351 c 3.33433,-1.667667 6.66767,-3.33433 10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 612.53439,-158.0351 c 3.29595,1.64798 6.66707,3.33353 10,5"
-       id="path18701"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect18703"
-       inkscape:original-d="m 612.53439,-158.0351 c 3.32464,1.5906 6.66767,3.33233 10,5" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_triangle_list_last.svg b/registry/vulkan/images/primitive_topology_triangle_list_last.svg
deleted file mode 100644
index c9b7b58..0000000
--- a/registry/vulkan/images/primitive_topology_triangle_list_last.svg
+++ /dev/null
@@ -1,417 +0,0 @@
-<?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"
-   width="210.32816"
-   height="104.11718"
-   viewBox="0 0 210.32816 104.11718"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_triangle_list_last.svg">
-  <defs
-     id="defs8647">
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect19538"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect19486"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect18703"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect18651"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-2-4"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-53-9" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-5-1"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-6-6" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-7-3"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         id="path890-92-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6462-51"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6742-54"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="6.8002841"
-     inkscape:cx="105.09767"
-     inkscape:cy="52.066398"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1155"
-     inkscape:window-x="0"
-     inkscape:window-y="1"
-     inkscape:window-maximized="1"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false"
-     inkscape:snap-nodes="true"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="-474.97657"
-       originy="-498.75782" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-487.51096,180.9101)">
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 612.53439,-158.0351 40,59.999997 40,-59.999997 z"
-       id="path11344"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="572.53442"
-       y="-78.035103"
-       id="text5070-2-2-9-9-75-8"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-68-4"
-         x="572.53442"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="532.53436"
-       y="-168.03508"
-       id="text5070-2-2-9-9-7-4-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-3-1"
-         x="532.53436"
-         y="-168.03508"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="492.53439"
-       y="-78.035103"
-       id="text5070-2-2-9-9-6-2-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-4-0"
-         x="492.53439"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-9-3"
-       cx="532.53436"
-       cy="-158.03508"
-       r="3.4908931" />
-    <g
-       id="g4389-3-6"
-       transform="translate(440,2.147998e-5)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-1-8"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-2-4)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-2-7"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-5-1)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-1-0"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-7-3)" />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="612.53442"
-       y="-168.0351"
-       id="text5070-2-2-9-9-75-8-3"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-68-4-4"
-         x="612.53442"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="652.53442"
-       y="-78.035103"
-       id="text5070-2-2-9-9-1-4-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3-6-1"
-         x="652.53442"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="692.53442"
-       y="-168.0351"
-       id="text5070-2-2-9-9-77-2-4"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-2-0"
-         x="692.53442"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-0-3"
-       cx="652.53442"
-       cy="-98.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-0-0-6"
-       cx="692.53442"
-       cy="-158.0351"
-       r="3.4908931" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
-       x="572.53442"
-       y="-168.03511"
-       id="text11340"><tspan
-         sodipodi:role="line"
-         id="tspan11338"
-         x="572.53442"
-         y="-132.64449" /></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 492.53439,-98.035095 40,-59.999995 40,59.999995 z"
-       id="path11342"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-0-0"
-       cx="572.53442"
-       cy="-98.035103"
-       r="3.4908931" />
-    <g
-       id="g7055"
-       transform="translate(350.00001,-10)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-5)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-4)" />
-    </g>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97"
-       cx="492.53439"
-       cy="-98.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="612.53442"
-       cy="-158.0351"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 572.53439,-98.0351 c -3.33453,-1.667265 -6.66787,-3.33393 -10,-5"
-       id="path18649"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect18651"
-       inkscape:original-d="m 572.53439,-98.0351 c -3.33433,-1.667667 -6.66767,-3.33433 -10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 652.53439,-98.0351 c 0,-3.94922 0,-7.89745 0,-11.84467"
-       id="path19536"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect19538"
-       inkscape:original-d="m 652.53439,-98.0351 c 10e-4,-3.94922 10e-4,-7.89745 0,-11.84467" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_triangle_list_with_adjacency.svg b/registry/vulkan/images/primitive_topology_triangle_list_with_adjacency.svg
deleted file mode 100644
index fc240d4..0000000
--- a/registry/vulkan/images/primitive_topology_triangle_list_with_adjacency.svg
+++ /dev/null
@@ -1,502 +0,0 @@
-<?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"
-   width="409.51437"
-   height="165.99219"
-   viewBox="0 0 409.51438 165.99219"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_triangle_list_with_adjacency.svg">
-  <defs
-     id="defs8647">
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect20425"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect20373"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469-6" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="3.4752572"
-     inkscape:cx="204.72593"
-     inkscape:cy="83.003907"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="4.4908931"
-       originy="-436.88283" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-8.0435002,180.91011)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="52.534393"
-       y="-78.03511"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="52.534393"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="132.53439"
-       y="-78.03511"
-       id="text5070-2-2-9-9-1"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3"
-         x="132.53439"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-168.03511"
-       id="text5070-2-2-9-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6"
-         x="92.534393"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="12.534393"
-       y="-168.03511"
-       id="text5070-2-2-9-9-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4"
-         x="12.534393"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-18.03511"
-       id="text5070-2-2-9-9-41"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1"
-         x="92.534393"
-         y="-18.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-168.03511"
-       id="text5070-2-2-9-9-77"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5"
-         x="172.53439"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8"
-       cx="12.534393"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91"
-       cx="92.534393"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2"
-       cx="172.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25"
-       cx="132.53439"
-       cy="-98.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-80"
-       cx="92.534393"
-       cy="-38.035107"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 12.534393,-158.03511 80,120.000002 79.999997,-120.000002 z"
-       id="path1690"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 52.534393,-98.035108 40,-60.000002 39.999997,60.000002 z"
-       id="path1700"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="292.53439"
-       y="-106.41011"
-       id="text5070-2-2-9-9-54"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-0"
-         x="292.53439"
-         y="-106.41011"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">6</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="372.53442"
-       y="-106.4023"
-       id="text5070-2-2-9-9-1-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3-0"
-         x="372.53442"
-         y="-106.4023"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">8</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53442"
-       y="-16.16011"
-       id="text5070-2-2-9-9-7-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-2"
-         x="332.53442"
-         y="-16.16011"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">10</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="252.53439"
-       y="-16.363235"
-       id="text5070-2-2-9-9-6-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-1"
-         x="252.53439"
-         y="-16.363235"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">11</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53442"
-       y="-166.64449"
-       id="text5070-2-2-9-9-41-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1-7"
-         x="332.53442"
-         y="-166.64449"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">7</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53442"
-       y="-16.402298"
-       id="text5070-2-2-9-9-77-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-8"
-         x="412.53442"
-         y="-16.402298"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">9</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-7"
-       cx="252.53439"
-       cy="38.03511"
-       r="3.4908931"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-3"
-       cx="332.53442"
-       cy="38.03511"
-       r="3.4908931"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-2"
-       cx="412.53442"
-       cy="38.03511"
-       r="3.4908931"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-6"
-       cx="372.53442"
-       cy="98.03511"
-       r="3.4908931"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-80-2"
-       cx="332.53442"
-       cy="158.03511"
-       r="3.4908931"
-       transform="scale(1,-1)" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 252.53439,-38.03511 80,-120 80,120 z"
-       id="path1690-4"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 292.53439,-98.03511 40,60 40,-60 z"
-       id="path1700-3"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g4389"
-       transform="translate(2.0000015e-7,-2.5e-6)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
-    </g>
-    <g
-       transform="translate(30.000003,49.999997)"
-       id="g7055-4">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3-3"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-8)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9-3"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471-7)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3-1"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-8)" />
-    </g>
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="292.53439"
-       cy="-98.035088"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97"
-       cx="52.534393"
-       cy="-98.035095"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 52.534393,-98.035092 c 3.334533,-1.667266 6.667869,-3.333938 10,-4.999998"
-       id="path20371"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect20373"
-       inkscape:original-d="m 52.534393,-98.035092 c 3.334333,-1.667667 6.667667,-3.334338 10,-4.999998" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 292.53439,-98.035092 c 3.33374,1.666869 6.66707,3.333535 10,5"
-       id="path20423"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect20425"
-       inkscape:original-d="m 292.53439,-98.035092 c 3.33434,1.665666 6.66767,3.332333 10,5" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_triangle_list_with_adjacency_last.svg b/registry/vulkan/images/primitive_topology_triangle_list_with_adjacency_last.svg
deleted file mode 100644
index 236238b..0000000
--- a/registry/vulkan/images/primitive_topology_triangle_list_with_adjacency_last.svg
+++ /dev/null
@@ -1,513 +0,0 @@
-<?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"
-   width="409.51437"
-   height="165.99219"
-   viewBox="0 0 409.51438 165.99219"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_triangle_list_with_adjacency_last.svg">
-  <defs
-     id="defs8647">
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect21296"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect20425"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect20373"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469-6" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="3.4752572"
-     inkscape:cx="204.72593"
-     inkscape:cy="83.003907"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1155"
-     inkscape:window-x="0"
-     inkscape:window-y="1"
-     inkscape:window-maximized="1"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false"
-     inkscape:snap-global="true">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="4.4908931"
-       originy="-436.88283" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-8.0435002,180.91011)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="52.534393"
-       y="-78.03511"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="52.534393"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="132.53439"
-       y="-78.03511"
-       id="text5070-2-2-9-9-1"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3"
-         x="132.53439"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-168.03511"
-       id="text5070-2-2-9-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6"
-         x="92.534393"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="12.534393"
-       y="-168.03511"
-       id="text5070-2-2-9-9-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4"
-         x="12.534393"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-18.03511"
-       id="text5070-2-2-9-9-41"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1"
-         x="92.534393"
-         y="-18.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-168.03511"
-       id="text5070-2-2-9-9-77"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5"
-         x="172.53439"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8"
-       cx="12.534393"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91"
-       cx="92.534393"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2"
-       cx="172.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-80"
-       cx="92.534393"
-       cy="-38.035107"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 12.534393,-158.03511 80,120.000002 79.999997,-120.000002 z"
-       id="path1690"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 52.534393,-98.035108 40,-60.000002 39.999997,60.000002 z"
-       id="path1700"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25"
-       cx="132.53439"
-       cy="-98.03511"
-       r="3.4908931" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="292.53439"
-       y="-106.41011"
-       id="text5070-2-2-9-9-54"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-0"
-         x="292.53439"
-         y="-106.41011"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">6</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="372.53442"
-       y="-106.4023"
-       id="text5070-2-2-9-9-1-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3-0"
-         x="372.53442"
-         y="-106.4023"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">8</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53442"
-       y="-16.16011"
-       id="text5070-2-2-9-9-7-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-2"
-         x="332.53442"
-         y="-16.16011"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">10</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="252.53439"
-       y="-16.363235"
-       id="text5070-2-2-9-9-6-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-1"
-         x="252.53439"
-         y="-16.363235"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">11</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53442"
-       y="-166.64449"
-       id="text5070-2-2-9-9-41-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1-7"
-         x="332.53442"
-         y="-166.64449"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">7</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53442"
-       y="-16.402298"
-       id="text5070-2-2-9-9-77-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-8"
-         x="412.53442"
-         y="-16.402298"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">9</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-7"
-       cx="252.53439"
-       cy="38.03511"
-       r="3.4908931"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-2"
-       cx="412.53442"
-       cy="38.03511"
-       r="3.4908931"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-6"
-       cx="372.53442"
-       cy="98.03511"
-       r="3.4908931"
-       transform="scale(1,-1)" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-80-2"
-       cx="332.53442"
-       cy="158.03511"
-       r="3.4908931"
-       transform="scale(1,-1)" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 252.53439,-38.03511 80,-120 80,120 z"
-       id="path1690-4"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 292.53439,-98.03511 40,60 40,-60 z"
-       id="path1700-3"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-3"
-       cx="332.53442"
-       cy="38.03511"
-       r="3.4908931"
-       transform="scale(1,-1)" />
-    <g
-       id="g4389"
-       transform="translate(2.0000015e-7,-2.5e-6)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
-    </g>
-    <g
-       transform="translate(30.000003,49.999997)"
-       id="g7055-4">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3-3"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-8)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9-3"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471-7)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3-1"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-8)" />
-    </g>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="292.53439"
-       cy="-98.035088"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97"
-       cx="52.534393"
-       cy="-98.035095"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 132.53439,-98.035092 c -3.33453,-1.667265 -6.66786,-3.333928 -10,-4.999998"
-       id="path20371"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect20373"
-       inkscape:original-d="m 132.53439,-98.035092 c -3.33433,-1.667667 -6.66766,-3.334338 -10,-4.999998" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 332.53439,-38.03509 c 0,-4.18888 0,-8.37676 0,-12.56364"
-       id="path21294"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect21296"
-       inkscape:original-d="m 332.53439,-38.03509 c 0.001,-4.18888 0.001,-8.37676 0,-12.56364" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_triangle_strip.svg b/registry/vulkan/images/primitive_topology_triangle_strip.svg
deleted file mode 100644
index 964174d..0000000
--- a/registry/vulkan/images/primitive_topology_triangle_strip.svg
+++ /dev/null
@@ -1,1092 +0,0 @@
-<?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"
-   width="170.32812"
-   height="104.11719"
-   viewBox="0 0 170.32813 104.11719"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_triangle_strip.svg">
-  <defs
-     id="defs8647">
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect15046"
-       effect="bspline" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect15034"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect14676"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6742"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6462"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2335"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart">
-      <path
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2333"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Torso"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Torso"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <g
-         id="g1107"
-         transform="scale(0.7)"
-         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
-        <path
-           id="path1093"
-           d="m -4.7792281,-3.239542 c 2.350374,0.3659393 5.30026732,1.9375477 5.03715532,3.62748546 C -0.00518779,2.0778819 -2.2126741,2.6176539 -4.5630471,2.2517169 -6.9134221,1.8857769 -8.521035,0.75201414 -8.257922,-0.93792336 -7.994809,-2.6278615 -7.1296041,-3.6054813 -4.7792281,-3.239542 Z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path1095"
-           d="M 4.4598789,0.08866574 C -2.5564571,-4.378332 5.2248769,-3.9061806 -0.84829578,-8.7197331"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path1097"
-           d="M 4.9298719,0.05752074 C -1.3872731,1.7494689 1.8027579,5.4782079 -4.9448731,7.5462725"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <rect
-           id="rect1099"
-           transform="matrix(0.527536,-0.849533,0.887668,0.460484,0,0)"
-           y="-1.7408575"
-           x="-10.391706"
-           height="2.7608147"
-           width="2.6366582"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" />
-        <rect
-           id="rect1101"
-           transform="matrix(0.671205,-0.741272,0.790802,0.612072,0,0)"
-           y="-7.9629307"
-           x="4.9587269"
-           height="2.8614161"
-           width="2.7327356"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" />
-        <path
-           id="path1103"
-           transform="matrix(0,-1.109517,1.109517,0,25.96648,19.71619)"
-           d="m 16.779951,-28.685045 a 0.60731727,0.60731727 0 1 0 -1.214634,0 0.60731727,0.60731727 0 1 0 1.214634,0 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path1105"
-           transform="matrix(0,-1.109517,1.109517,0,26.8245,16.99126)"
-           d="m 16.779951,-28.685045 a 0.60731727,0.60731727 0 1 0 -1.214634,0 0.60731727,0.60731727 0 1 0 1.214634,0 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-      </g>
-    </marker>
-    <marker
-       inkscape:stockid="Tail"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Tail"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <g
-         id="g929"
-         transform="scale(-1.2)"
-         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
-        <path
-           id="path917"
-           d="M -3.8048674,-3.9585227 0.54352094,0"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path919"
-           d="M -1.2866832,-3.9585227 3.0617053,0"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path921"
-           d="M 1.3053582,-3.9585227 5.6537466,0"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path923"
-           d="M -3.8048674,4.1775838 0.54352094,0.21974226"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path925"
-           d="M -1.2866832,4.1775838 3.0617053,0.21974226"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path927"
-           d="M 1.3053582,4.1775838 5.6537466,0.21974226"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-      </g>
-    </marker>
-    <marker
-       inkscape:stockid="Legs"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Legs"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <g
-         id="g1090"
-         transform="scale(-0.7)"
-         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
-        <g
-           id="g1084"
-           transform="matrix(0,-1,-1,0,20.70862,21.31391)"
-           style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
-          <path
-             id="path1080"
-             d="m 21.22125,20.67536 c -6.910151,4.721157 -2.454525,6.606844 -5.841071,13.443235"
-             style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-             inkscape:connector-curvature="0" />
-          <path
-             id="path1082"
-             d="m 21.39811,20.54812 c -1.360509,8.347524 3.536072,8.76994 4.505041,13.824958"
-             style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-             inkscape:connector-curvature="0" />
-        </g>
-        <path
-           id="path1086"
-           d="m -14.09007,-6.7318716 -0.922168,4.043383 3.962751,-1.22307 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path1088"
-           d="m -15.215679,4.5567534 1.874127,3.699613 2.266874,-3.472855 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-      </g>
-    </marker>
-    <marker
-       inkscape:stockid="Scissors"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Scissors"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="schere"
-         d="M 9.0898857,-3.6061018 C 8.1198849,-4.7769976 6.3697607,-4.7358294 5.0623558,-4.2327734 l -8.2124046,3.0779029 c -2.3882933,-1.3067135 -4.7482873,-0.9325372 -4.7482873,-1.5687873 0,-0.4973164 0.4566662,-0.3883222 0.3883068,-1.6831941 -0.065635,-1.2432767 -1.3635771,-2.1630796 -2.5903987,-2.0816435 -1.227271,-0.00735 -2.499439,0.9331613 -2.510341,2.2300611 -0.09143,1.3063864 1.007209,2.5196896 2.306764,2.6052316 1.5223406,0.2266616 4.218258,-0.6955566 5.482945,1.57086006 -0.9422847,1.73825774 -2.6140244,1.74307674 -4.1255107,1.65607034 -1.2548743,-0.072235 -2.7620933,0.2873979 -3.3606483,1.5208605 -0.578367,1.1820862 -0.0112,2.8646022 1.316749,3.226412 1.3401912,0.4918277 3.1806689,-0.129711 3.4993722,-1.6707242 0.2456585,-1.187823 -0.5953659,-1.7459574 -0.2725074,-2.1771537 0.2436135,-0.32536 1.7907806,-0.1368452 4.5471053,-1.3748244 L 5.6763468,4.2330688 C 6.8000164,4.5467672 8.1730685,4.5362646 9.1684433,3.4313614 l -9.22008423,-3.48508362 z m -18.3078016,-1.900504 c 1.294559,0.7227998 1.1888392,2.6835702 -0.1564272,3.0632889 -1.2165179,0.423661 -2.7710269,-0.7589694 -2.3831779,-2.0774648 0.227148,-1.0818519 1.653387,-1.480632 2.5396051,-0.9858241 z m 0.056264,8.0173649 c 1.3508301,0.4988648 1.1214429,2.7844356 -0.2522207,3.091609 -0.9110594,0.3163391 -2.2135494,-0.1387976 -2.3056964,-1.2121394 -0.177609,-1.305055 1.356085,-2.4841482 2.5579171,-1.8794696 z"
-         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="TriangleInS"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="TriangleInS"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1020"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(-0.2)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="DiamondS"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="DiamondS"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path966"
-         d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.2)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Send"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Send"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path914"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mend"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path908"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(-0.6)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="TriangleInM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="TriangleInM"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1017"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(-0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path884"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-4"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-9" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-6"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-8" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-0"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-5" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-5" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-9"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-2" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-0"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-4" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-9"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         id="path890-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-6"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-8"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-7" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-6-3"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-0-2" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-8-3"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-7-1" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1-9"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99-5" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75-9"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3-1" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-2"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-53" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-5"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-6" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469-6" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-88"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1-9-3"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99-5-6" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75-9-2"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3-1-7" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-2-4"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-53-9" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-5-1"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-6-6" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1-9-3-5"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99-5-6-2" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75-9-2-5"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3-1-7-1" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-9"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="8.4291088"
-     inkscape:cx="84.97902"
-     inkscape:cy="52.066407"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="5.0234376"
-       originy="-498.75782" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-7.5109558,180.91011)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="12.534393"
-       y="-78.03511"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="12.534393"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-78.035103"
-       id="text5070-2-2-9-9-1"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3"
-         x="172.53439"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-78.035103"
-       id="text5070-2-2-9-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6"
-         x="92.534393"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="52.534393"
-       y="-168.0351"
-       id="text5070-2-2-9-9-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4"
-         x="52.534393"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="132.53439"
-       y="-168.03511"
-       id="text5070-2-2-9-9-77"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5"
-         x="132.53439"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8"
-       cx="172.53439"
-       cy="-98.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2"
-       cx="132.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 12.534393,-98.035106 40,-59.999994 h 79.999997 l 40,59.999994 z m 40,-59.999994 39.999997,59.999994 40,-59.999994"
-       id="path875"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g4389"
-       transform="translate(-40,-2.5e-6)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
-    </g>
-    <g
-       transform="translate(39.661444,0.68117295)"
-       id="g4389-5">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-6"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-1)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-4"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-75)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-0"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-9)" />
-    </g>
-    <g
-       transform="translate(-210,-10.000003)"
-       id="g7055-4">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3-3"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-8)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9-3"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471-7)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3-1"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-8)" />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
-       x="572.53442"
-       y="-168.03511"
-       id="text11340"><tspan
-         sodipodi:role="line"
-         id="tspan11338"
-         x="572.53442"
-         y="-132.64449" /></text>
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97"
-       cx="12.872943"
-       cy="-98.716286"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97-3"
-       cx="92.534393"
-       cy="-98.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="52.534393"
-       cy="-158.0351"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#f50000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 12.534393,-98.035103 c 3.334534,-1.667266 6.667869,-3.333937 10.000001,-4.999997"
-       id="path14674"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect14676"
-       inkscape:original-d="m 12.534393,-98.035103 c 3.334334,-1.667666 6.667667,-3.334337 10.000001,-4.999997" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 52.534394,-158.0351 c 3.33373,1.66687 6.667065,3.33353 10,5"
-       id="path15032"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect15034"
-       inkscape:original-d="m 52.534394,-158.0351 c 3.334333,1.66566 6.667666,3.33233 10,5" />
-    <path
-       inkscape:original-d="m 92.534393,-98.035103 c 3.334334,-1.667666 6.667667,-3.334337 9.999997,-4.999997"
-       inkscape:path-effect="#path-effect15046"
-       inkscape:connector-curvature="0"
-       id="path15044"
-       d="m 92.534393,-98.035103 c 3.334534,-1.667266 6.667869,-3.333937 9.999997,-4.999997"
-       style="fill:none;stroke:#f50000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_triangle_strip_last.svg b/registry/vulkan/images/primitive_topology_triangle_strip_last.svg
deleted file mode 100644
index cde5f46..0000000
--- a/registry/vulkan/images/primitive_topology_triangle_strip_last.svg
+++ /dev/null
@@ -1,1092 +0,0 @@
-<?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"
-   width="170.32812"
-   height="104.11719"
-   viewBox="0 0 170.32813 104.11719"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_triangle_strip_last.svg">
-  <defs
-     id="defs8647">
-    <inkscape:path-effect
-       only_selected="false"
-       apply_with_weight="true"
-       apply_no_weight="true"
-       helper_size="0"
-       steps="2"
-       weight="33.333333"
-       is_visible="true"
-       id="path-effect15046"
-       effect="bspline" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect15034"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect14676"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6742"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path6462"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2335"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart">
-      <path
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2333"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Torso"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Torso"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <g
-         id="g1107"
-         transform="scale(0.7)"
-         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
-        <path
-           id="path1093"
-           d="m -4.7792281,-3.239542 c 2.350374,0.3659393 5.30026732,1.9375477 5.03715532,3.62748546 C -0.00518779,2.0778819 -2.2126741,2.6176539 -4.5630471,2.2517169 -6.9134221,1.8857769 -8.521035,0.75201414 -8.257922,-0.93792336 -7.994809,-2.6278615 -7.1296041,-3.6054813 -4.7792281,-3.239542 Z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path1095"
-           d="M 4.4598789,0.08866574 C -2.5564571,-4.378332 5.2248769,-3.9061806 -0.84829578,-8.7197331"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path1097"
-           d="M 4.9298719,0.05752074 C -1.3872731,1.7494689 1.8027579,5.4782079 -4.9448731,7.5462725"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <rect
-           id="rect1099"
-           transform="matrix(0.527536,-0.849533,0.887668,0.460484,0,0)"
-           y="-1.7408575"
-           x="-10.391706"
-           height="2.7608147"
-           width="2.6366582"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" />
-        <rect
-           id="rect1101"
-           transform="matrix(0.671205,-0.741272,0.790802,0.612072,0,0)"
-           y="-7.9629307"
-           x="4.9587269"
-           height="2.8614161"
-           width="2.7327356"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" />
-        <path
-           id="path1103"
-           transform="matrix(0,-1.109517,1.109517,0,25.96648,19.71619)"
-           d="m 16.779951,-28.685045 a 0.60731727,0.60731727 0 1 0 -1.214634,0 0.60731727,0.60731727 0 1 0 1.214634,0 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path1105"
-           transform="matrix(0,-1.109517,1.109517,0,26.8245,16.99126)"
-           d="m 16.779951,-28.685045 a 0.60731727,0.60731727 0 1 0 -1.214634,0 0.60731727,0.60731727 0 1 0 1.214634,0 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-      </g>
-    </marker>
-    <marker
-       inkscape:stockid="Tail"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Tail"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <g
-         id="g929"
-         transform="scale(-1.2)"
-         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
-        <path
-           id="path917"
-           d="M -3.8048674,-3.9585227 0.54352094,0"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path919"
-           d="M -1.2866832,-3.9585227 3.0617053,0"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path921"
-           d="M 1.3053582,-3.9585227 5.6537466,0"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path923"
-           d="M -3.8048674,4.1775838 0.54352094,0.21974226"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path925"
-           d="M -1.2866832,4.1775838 3.0617053,0.21974226"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path927"
-           d="M 1.3053582,4.1775838 5.6537466,0.21974226"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-      </g>
-    </marker>
-    <marker
-       inkscape:stockid="Legs"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Legs"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <g
-         id="g1090"
-         transform="scale(-0.7)"
-         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
-        <g
-           id="g1084"
-           transform="matrix(0,-1,-1,0,20.70862,21.31391)"
-           style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
-          <path
-             id="path1080"
-             d="m 21.22125,20.67536 c -6.910151,4.721157 -2.454525,6.606844 -5.841071,13.443235"
-             style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-             inkscape:connector-curvature="0" />
-          <path
-             id="path1082"
-             d="m 21.39811,20.54812 c -1.360509,8.347524 3.536072,8.76994 4.505041,13.824958"
-             style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-             inkscape:connector-curvature="0" />
-        </g>
-        <path
-           id="path1086"
-           d="m -14.09007,-6.7318716 -0.922168,4.043383 3.962751,-1.22307 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path1088"
-           d="m -15.215679,4.5567534 1.874127,3.699613 2.266874,-3.472855 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-           inkscape:connector-curvature="0" />
-      </g>
-    </marker>
-    <marker
-       inkscape:stockid="Scissors"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Scissors"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="schere"
-         d="M 9.0898857,-3.6061018 C 8.1198849,-4.7769976 6.3697607,-4.7358294 5.0623558,-4.2327734 l -8.2124046,3.0779029 c -2.3882933,-1.3067135 -4.7482873,-0.9325372 -4.7482873,-1.5687873 0,-0.4973164 0.4566662,-0.3883222 0.3883068,-1.6831941 -0.065635,-1.2432767 -1.3635771,-2.1630796 -2.5903987,-2.0816435 -1.227271,-0.00735 -2.499439,0.9331613 -2.510341,2.2300611 -0.09143,1.3063864 1.007209,2.5196896 2.306764,2.6052316 1.5223406,0.2266616 4.218258,-0.6955566 5.482945,1.57086006 -0.9422847,1.73825774 -2.6140244,1.74307674 -4.1255107,1.65607034 -1.2548743,-0.072235 -2.7620933,0.2873979 -3.3606483,1.5208605 -0.578367,1.1820862 -0.0112,2.8646022 1.316749,3.226412 1.3401912,0.4918277 3.1806689,-0.129711 3.4993722,-1.6707242 0.2456585,-1.187823 -0.5953659,-1.7459574 -0.2725074,-2.1771537 0.2436135,-0.32536 1.7907806,-0.1368452 4.5471053,-1.3748244 L 5.6763468,4.2330688 C 6.8000164,4.5467672 8.1730685,4.5362646 9.1684433,3.4313614 l -9.22008423,-3.48508362 z m -18.3078016,-1.900504 c 1.294559,0.7227998 1.1888392,2.6835702 -0.1564272,3.0632889 -1.2165179,0.423661 -2.7710269,-0.7589694 -2.3831779,-2.0774648 0.227148,-1.0818519 1.653387,-1.480632 2.5396051,-0.9858241 z m 0.056264,8.0173649 c 1.3508301,0.4988648 1.1214429,2.7844356 -0.2522207,3.091609 -0.9110594,0.3163391 -2.2135494,-0.1387976 -2.3056964,-1.2121394 -0.177609,-1.305055 1.356085,-2.4841482 2.5579171,-1.8794696 z"
-         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="TriangleInS"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="TriangleInS"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1020"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(-0.2)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="DiamondS"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="DiamondS"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path966"
-         d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(0.2)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Send"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Send"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path914"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mend"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path908"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(-0.6)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="TriangleInM"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="TriangleInM"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1017"
-         d="M 5.77,0 -2.88,5 V -5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="scale(-0.4)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path884"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-4"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-9" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-6"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-8" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-0"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-5" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-5" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-9"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-2" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-0"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-4" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-9"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         id="path890-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-6"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-8"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-7" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-6-3"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-0-2" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-8-3"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-7-1" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1-9"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99-5" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75-9"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3-1" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-2"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-53" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-5"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-6" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469-6" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-88"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1-9-3"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99-5-6" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75-9-2"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3-1-7" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-2-4"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-53-9" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-5-1"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-6-6" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-1-9-3-5"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-99-5-6-2" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-75-9-2-5"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3-1-7-1" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-9"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="8.4172201"
-     inkscape:cx="85.097656"
-     inkscape:cy="52.066407"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1155"
-     inkscape:window-x="0"
-     inkscape:window-y="1"
-     inkscape:window-maximized="1"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="5.0234376"
-       originy="-498.75782" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-7.5109558,180.91011)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="12.534393"
-       y="-78.03511"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="12.534393"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-78.035103"
-       id="text5070-2-2-9-9-1"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3"
-         x="172.53439"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-78.035103"
-       id="text5070-2-2-9-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6"
-         x="92.534393"
-         y="-78.035103"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="52.534393"
-       y="-168.0351"
-       id="text5070-2-2-9-9-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4"
-         x="52.534393"
-         y="-168.0351"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="132.53439"
-       y="-168.03511"
-       id="text5070-2-2-9-9-77"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5"
-         x="132.53439"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 12.534393,-98.035106 40,-59.999994 h 79.999997 l 40,59.999994 z m 40,-59.999994 39.999997,59.999994 40,-59.999994"
-       id="path875"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2"
-       cx="132.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8"
-       cx="172.53439"
-       cy="-98.035103"
-       r="3.4908931" />
-    <g
-       id="g4389"
-       transform="translate(-40,-2.5e-6)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
-    </g>
-    <g
-       transform="translate(39.661444,0.68117295)"
-       id="g4389-5">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-6"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-1)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-4"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-75)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-0"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-9)" />
-    </g>
-    <g
-       transform="translate(-210,-10.000003)"
-       id="g7055-4">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3-3"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-8)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9-3"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471-7)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3-1"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-8)" />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
-       x="572.53442"
-       y="-168.03511"
-       id="text11340"><tspan
-         sodipodi:role="line"
-         id="tspan11338"
-         x="572.53442"
-         y="-132.64449" /></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97"
-       cx="12.872943"
-       cy="-98.716286"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97-3"
-       cx="92.534393"
-       cy="-98.035103"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3"
-       cx="52.534393"
-       cy="-158.0351"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 92.534393,-98.035103 c -3.334534,-1.667266 -6.667869,-3.333937 -10.000001,-4.999997"
-       id="path14674"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect14676"
-       inkscape:original-d="m 92.534393,-98.035103 c -3.334334,-1.667666 -6.667667,-3.334337 -10.000001,-4.999997" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 133.53439,-158.0351 c -3.33373,1.66686 -6.66706,3.33353 -10,5"
-       id="path15032"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect15034"
-       inkscape:original-d="m 133.53439,-158.0351 c -3.33433,1.66566 -6.66766,3.33233 -10,5" />
-    <path
-       inkscape:original-d="m 172.53439,-98.035103 c -3.33433,-1.667666 -6.66766,-3.334337 -9.99999,-4.999997"
-       inkscape:path-effect="#path-effect15046"
-       inkscape:connector-curvature="0"
-       id="path15044"
-       d="m 172.53439,-98.035103 c -3.33453,-1.667266 -6.66786,-3.333937 -9.99999,-4.999997"
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_triangle_strip_with_adjacency.svg b/registry/vulkan/images/primitive_topology_triangle_strip_with_adjacency.svg
deleted file mode 100644
index 5defb88..0000000
--- a/registry/vulkan/images/primitive_topology_triangle_strip_with_adjacency.svg
+++ /dev/null
@@ -1,1846 +0,0 @@
-<?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"
-   width="613.95959"
-   height="463.875"
-   viewBox="0 0 613.9596 463.875"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_triangle_strip_with_adjacency.svg">
-  <defs
-     id="defs8647">
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24990"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24986"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24982"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24978"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24974"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24970"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24966"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24962"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24958"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24666"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469-6" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471-7-8"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469-6-7" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-7"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-07"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471-7-4"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469-6-5" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-1"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-4"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471-7-0"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469-6-9" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-8"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-8"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-8"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-5"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-2"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890-4"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-6"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-2"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-1"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-55"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-6"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-2"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-6"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-11"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-8"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890-7"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-3"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-7"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-7"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-9"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890-71"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-70"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-71"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-2"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-0"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-79"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-7"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#fe0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-6"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-7"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-4"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-74"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-1"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-9"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-29"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-15"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-41"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-8"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-3"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-69"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-0"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-5-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-0-8"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-5-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-0-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-5-27"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-0-88"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="4.5916511"
-     inkscape:cx="415.89334"
-     inkscape:cy="107.69634"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="4.490893"
-       originy="-198.75781" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-8.0435002,240.66792)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="52.534393"
-       y="-78.03511"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="52.534393"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="132.53439"
-       y="-78.03511"
-       id="text5070-2-2-9-9-1"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3"
-         x="132.53439"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-168.03511"
-       id="text5070-2-2-9-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6"
-         x="92.534393"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="12.534393"
-       y="-168.03511"
-       id="text5070-2-2-9-9-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4"
-         x="12.534393"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-168.03511"
-       id="text5070-2-2-9-9-41"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1"
-         x="172.53439"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-18.035109"
-       id="text5070-2-2-9-9-77"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5"
-         x="92.534393"
-         y="-18.035109"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="-168.03511"
-       id="text5070-2-2-9-9-7-8"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-7"
-         x="412.53439"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="492.53439"
-       y="-168.03511"
-       id="text5070-2-2-9-9-41-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1-4"
-         x="492.53439"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">6</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="452.53439"
-       y="-228.03511"
-       id="text5070-2-2-9-9-6-1-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-4"
-         x="452.53439"
-         y="-228.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="532.53436"
-       y="-78.03511"
-       id="text5070-2-2-9-9-6-1-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7"
-         x="532.53436"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">7</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="221.96489"
-       id="text5070-2-2-9-9-6-1-7-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1"
-         x="172.53439"
-         y="221.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">7</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="212.53439"
-       y="161.96489"
-       id="text5070-2-2-9-9-6-1-7-9-3"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-4"
-         x="212.53439"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">8</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="252.53439"
-       y="71.96489"
-       id="text5070-2-2-9-9-6-1-7-9-8"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-7"
-         x="252.53439"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">9</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="492.53439"
-       y="221.96489"
-       id="text5070-2-2-9-9-6-1-7-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-5"
-         x="492.53439"
-         y="221.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">7</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="532.53436"
-       y="161.96489"
-       id="text5070-2-2-9-9-6-1-7-9-3-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-4-6"
-         x="532.53436"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">8</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="572.53436"
-       y="71.96489"
-       id="text5070-2-2-9-9-6-1-7-9-8-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-7-6"
-         x="572.53436"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">10</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="532.53436"
-       y="11.964892"
-       id="text5070-2-2-9-9-6-1-7-9-8-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-7-6-5"
-         x="532.53436"
-         y="11.964892"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">9</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="612.53436"
-       y="161.96489"
-       id="text5070-2-2-9-9-6-1-7-9-8-9-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-7-6-6"
-         x="612.53436"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">11</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8"
-       cx="12.534393"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91"
-       cx="92.534393"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2"
-       cx="172.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25"
-       cx="132.53439"
-       cy="-98.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-80"
-       cx="92.534393"
-       cy="-38.035107"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-2"
-       cx="332.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-9"
-       cx="492.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-1"
-       cx="452.53439"
-       cy="-98.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-80-9"
-       cx="412.53439"
-       cy="-38.035107"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-5"
-       cx="452.53439"
-       cy="-218.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-1"
-       cx="532.53442"
-       cy="-98.035118"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-2-7"
-       cx="12.534395"
-       cy="81.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-80-9-8"
-       cx="92.534393"
-       cy="201.96487"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-5-9"
-       cx="132.53439"
-       cy="21.964891"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-1-0"
-       cx="212.53442"
-       cy="141.96487"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-1-0-8"
-       cx="172.53439"
-       cy="201.96487"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-1-0-6"
-       cx="252.53439"
-       cy="81.964874"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-2-7-9"
-       cx="332.53439"
-       cy="81.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-80-9-8-2"
-       cx="412.53439"
-       cy="201.96487"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-5-9-0"
-       cx="452.53442"
-       cy="21.964899"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-1-0-9"
-       cx="532.53442"
-       cy="141.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-1-0-8-1"
-       cx="492.53442"
-       cy="201.96487"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-1-0-6-1"
-       cx="572.53436"
-       cy="81.964867"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-5-9-0-9"
-       cx="532.53442"
-       cy="21.964895"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-5-9-0-3"
-       cx="612.53442"
-       cy="141.96489"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 12.534393,-158.03511 80,120.000002 79.999997,-120.000002 z"
-       id="path1690"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 332.53439,-158.03511 80,120.000002 40,-60 h 80 l -80,-120.000002 -40,60 z"
-       id="path1694"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 12.534393,81.964892 80,119.999998 39.999997,-60 40,60 80,-119.999998 h -80 l -40,-60 -39.999997,60 z"
-       id="path1696"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 332.53439,81.964892 h 80 l 40,-60 40,60 40,-60 80,119.999998 h -80 l -40,60 -40,-60 -40,60 z"
-       id="path1698"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 52.534393,-98.035108 40,-60.000002 39.999997,60.000002 z"
-       id="path1700"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 372.53439,-98.035108 40,-60.000002 h 80 l -40,60.000002 z m 40,-60.000002 40,60.000002"
-       id="path1702"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 52.534393,141.96489 40,-59.999998 h 79.999997 l 40,59.999998 h -80 z m 40,-59.999998 39.999997,59.999998 40,-59.999998"
-       id="path1706"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 372.53439,141.96489 40,-59.999998 h 160 l -40,59.999998 z m 40,-59.999998 40,59.999998 40,-59.999998 40,59.999998"
-       id="path1712"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="372.53439"
-       y="-78.03511"
-       id="text5070-2-2-9-9-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-20"
-         x="372.53439"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="452.53439"
-       y="-78.03511"
-       id="text5070-2-2-9-9-1-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3-9"
-         x="452.53439"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53439"
-       y="-168.03511"
-       id="text5070-2-2-9-9-6-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-2"
-         x="332.53439"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="-18.035109"
-       id="text5070-2-2-9-9-77-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-2"
-         x="412.53439"
-         y="-18.035109"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="71.96489"
-       id="text5070-2-2-9-9-7-8-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-7-8"
-         x="92.534393"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="71.96489"
-       id="text5070-2-2-9-9-41-2-93"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1-4-4"
-         x="172.53439"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">6</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="132.53438"
-       y="11.964892"
-       id="text5070-2-2-9-9-6-1-2-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-4-4"
-         x="132.53438"
-         y="11.964892"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="52.534393"
-       y="161.96489"
-       id="text5070-2-2-9-9-5-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-20-4"
-         x="52.534393"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="132.53438"
-       y="161.96489"
-       id="text5070-2-2-9-9-1-9-4"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3-9-9"
-         x="132.53438"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="12.534393"
-       y="71.96489"
-       id="text5070-2-2-9-9-6-5-0"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-2-8"
-         x="12.534393"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="221.96489"
-       id="text5070-2-2-9-9-77-5-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-2-6"
-         x="92.534393"
-         y="221.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="71.96489"
-       id="text5070-2-2-9-9-7-8-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-7-9"
-         x="412.53439"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="492.53439"
-       y="71.96489"
-       id="text5070-2-2-9-9-41-2-97"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1-4-81"
-         x="492.53439"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">6</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="452.53436"
-       y="11.964892"
-       id="text5070-2-2-9-9-6-1-2-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-4-7"
-         x="452.53436"
-         y="11.964892"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="372.53439"
-       y="161.96489"
-       id="text5070-2-2-9-9-5-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-20-0"
-         x="372.53439"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="452.53436"
-       y="161.96489"
-       id="text5070-2-2-9-9-1-9-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3-9-8"
-         x="452.53436"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53439"
-       y="71.96489"
-       id="text5070-2-2-9-9-6-5-07"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-2-1"
-         x="332.53439"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="221.96487"
-       id="text5070-2-2-9-9-77-5-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-2-1"
-         x="412.53439"
-         y="221.96487"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <g
-       transform="translate(150,-10.00001)"
-       id="g7055-4">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3-3"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-8)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9-3"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471-7)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3-1"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-8)" />
-    </g>
-    <g
-       transform="translate(-170,229.99999)"
-       id="g7055-4-8">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3-3-3"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-8-0)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9-3-7"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471-7-8)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3-1-8"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-8-7)" />
-    </g>
-    <g
-       transform="translate(150,229.99999)"
-       id="g7055-4-7">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3-3-9"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-8-07)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9-3-8"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471-7-4)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3-1-9"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-8-4)" />
-    </g>
-    <g
-       transform="translate(230,229.99999)"
-       id="g7055-4-9">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3-3-36"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-8-1)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9-3-75"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471-7-0)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3-1-5"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-8-5)" />
-    </g>
-    <g
-       id="g4389"
-       transform="translate(1.000012e-7,-1e-5)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
-    </g>
-    <g
-       id="g4389-8"
-       transform="translate(320,-1e-5)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-7"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-8)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-4"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-8)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-2)" />
-    </g>
-    <g
-       id="g4389-0"
-       transform="translate(1.0000121e-7,239.99999)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-9"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-6)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-8"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-1)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-6"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-6)" />
-    </g>
-    <g
-       id="g4389-9"
-       transform="translate(80,239.99999)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-4"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-2)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-5"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-11)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-0"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-8)" />
-    </g>
-    <g
-       id="g4389-3"
-       transform="translate(320,239.99999)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-1"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-3)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-2"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-7)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-28"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-9)" />
-    </g>
-    <g
-       id="g4389-1"
-       transform="translate(400,239.99999)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-3"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-7)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-0"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-71)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-1"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-0)" />
-    </g>
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0"
-       cx="412.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-5-3"
-       cx="372.53439"
-       cy="-98.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-5"
-       cx="52.534393"
-       cy="-98.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97-2"
-       cx="52.534393"
-       cy="141.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97-6"
-       cx="132.53439"
-       cy="141.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97-0"
-       cx="372.53439"
-       cy="141.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97-26"
-       cx="452.53439"
-       cy="141.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-1-1"
-       cx="92.534393"
-       cy="81.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-1"
-       cx="412.53439"
-       cy="81.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-1-2"
-       cx="492.53439"
-       cy="81.96489"
-       r="3.4908931" />
-    <circle
-       r="3.4908931"
-       cy="81.96489"
-       cx="172.53439"
-       id="circle9368"
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 52.534393,-98.03511 c 3.334534,-1.667267 6.667866,-3.33393 10,-5"
-       id="path24664"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24666"
-       inkscape:original-d="m 52.534393,-98.03511 c 3.334333,-1.66767 6.667667,-3.33433 10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 372.53439,-98.03511 c 3.53989,-1.769946 6.66787,-3.33393 10,-5"
-       id="path24956"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24958"
-       inkscape:original-d="m 372.53439,-98.03511 c 3.53813,-1.77347 6.66767,-3.33433 10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 412.53439,-158.03511 c 3.33374,1.66687 6.66707,3.33353 10,5"
-       id="path24960"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24962"
-       inkscape:original-d="m 412.53439,-158.03511 c 3.33434,1.66567 6.66767,3.33233 10,5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 52.534393,141.96489 c 3.334534,-1.66727 6.667866,-3.33393 10,-5"
-       id="path24964"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24966"
-       inkscape:original-d="m 52.534393,141.96489 c 3.334333,-1.66767 6.667667,-3.33433 10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 92.534393,81.96489 c 3.333734,1.666868 6.667065,3.333534 9.999997,5"
-       id="path24968"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24970"
-       inkscape:original-d="m 92.534393,81.96489 c 3.334333,1.66567 6.667667,3.33233 9.999997,5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 132.53439,141.96489 c 3.33454,-1.66727 6.66787,-3.33393 10,-5"
-       id="path24972"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24974"
-       inkscape:original-d="m 132.53439,141.96489 c 3.33434,-1.66767 6.66767,-3.33433 10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 372.53439,141.96489 c 3.33454,-1.66727 6.66787,-3.33393 10,-5"
-       id="path24976"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24978"
-       inkscape:original-d="m 372.53439,141.96489 c 3.33434,-1.66767 6.66767,-3.33433 10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 412.53439,81.96489 c 3.33374,1.66687 6.66707,3.333534 10,5"
-       id="path24980"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24982"
-       inkscape:original-d="m 412.53439,81.96489 c 3.33434,1.66567 6.66767,3.33233 10,5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 452.53439,141.96489 c 3.33454,-1.66727 6.66787,-3.33393 10,-5"
-       id="path24984"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24986"
-       inkscape:original-d="m 452.53439,141.96489 c 3.33434,-1.66767 6.66767,-3.33433 10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 492.53439,81.96489 c 3.33374,1.66687 6.66707,3.333534 10,5"
-       id="path24988"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24990"
-       inkscape:original-d="m 492.53439,81.96489 c 3.33434,1.66567 6.66767,3.33233 10,5" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/primitive_topology_triangle_strip_with_adjacency_last.svg b/registry/vulkan/images/primitive_topology_triangle_strip_with_adjacency_last.svg
deleted file mode 100644
index e23948a..0000000
--- a/registry/vulkan/images/primitive_topology_triangle_strip_with_adjacency_last.svg
+++ /dev/null
@@ -1,1846 +0,0 @@
-<?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"
-   width="613.95959"
-   height="463.875"
-   viewBox="0 0 613.9596 463.875"
-   version="1.1"
-   id="svg8653"
-   inkscape:version="0.92.2 5c3e80d, 2017-08-06"
-   sodipodi:docname="primitive_topology_triangle_strip_with_adjacency_last.svg">
-  <defs
-     id="defs8647">
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24990"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24986"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24982"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24978"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24974"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24970"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24966"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24962"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24958"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <inkscape:path-effect
-       effect="bspline"
-       id="path-effect24666"
-       is_visible="true"
-       weight="33.333333"
-       steps="2"
-       helper_size="0"
-       apply_no_weight="true"
-       apply_with_weight="true"
-       only_selected="false" />
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469-6" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471-7-8"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469-6-7" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-7"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-07"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471-7-4"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469-6-5" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-1"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-4"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2471-7-0"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mstart"
-       inkscape:collect="always">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2469-6-9" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-8"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-8"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-8"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-5"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-2"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890-4"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-6"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-2"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-1"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-55"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-6"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-2"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-6"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-11"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-3"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-8"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890-7"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-3"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-7"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-7"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-9"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890-71"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker3039-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path3037-70"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker2891-71"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend">
-      <path
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path2889-2"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend-0"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path890-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-79"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-7"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#fe0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-6"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-7"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-4"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-74"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-1"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-9"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-29"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-15"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-41"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-8"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6464-8-13-5-3"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6462-2-3-3-69"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-0"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-5-2"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-0-8"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-5-5"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-0-5"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker6744-8-2-5-27"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path6742-9-67-0-88"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#fb0000;fill-opacity:1;fill-rule:evenodd;stroke:#fb0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="5.366358"
-     inkscape:cx="118.66396"
-     inkscape:cy="99.021623"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1155"
-     inkscape:window-x="0"
-     inkscape:window-y="1"
-     inkscape:window-maximized="1"
-     fit-margin-top="1"
-     fit-margin-left="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:snap-object-midpoints="true"
-     units="px"
-     borderlayer="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid9626"
-       originx="4.490893"
-       originy="-198.75781" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata8650">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-8.0435002,240.66792)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="52.534393"
-       y="-78.03511"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="52.534393"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="132.53439"
-       y="-78.03511"
-       id="text5070-2-2-9-9-1"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3"
-         x="132.53439"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-168.03511"
-       id="text5070-2-2-9-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6"
-         x="92.534393"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="12.534393"
-       y="-168.03511"
-       id="text5070-2-2-9-9-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4"
-         x="12.534393"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="-168.03511"
-       id="text5070-2-2-9-9-41"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1"
-         x="172.53439"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="-18.035109"
-       id="text5070-2-2-9-9-77"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5"
-         x="92.534393"
-         y="-18.035109"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="-168.03511"
-       id="text5070-2-2-9-9-7-8"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-7"
-         x="412.53439"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="492.53439"
-       y="-168.03511"
-       id="text5070-2-2-9-9-41-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1-4"
-         x="492.53439"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">6</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="452.53439"
-       y="-228.03511"
-       id="text5070-2-2-9-9-6-1-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-4"
-         x="452.53439"
-         y="-228.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="532.53436"
-       y="-78.03511"
-       id="text5070-2-2-9-9-6-1-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7"
-         x="532.53436"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">7</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="221.96489"
-       id="text5070-2-2-9-9-6-1-7-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1"
-         x="172.53439"
-         y="221.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">7</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="212.53439"
-       y="161.96489"
-       id="text5070-2-2-9-9-6-1-7-9-3"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-4"
-         x="212.53439"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">8</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="252.53439"
-       y="71.96489"
-       id="text5070-2-2-9-9-6-1-7-9-8"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-7"
-         x="252.53439"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">9</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="492.53439"
-       y="221.96489"
-       id="text5070-2-2-9-9-6-1-7-9-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-5"
-         x="492.53439"
-         y="221.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">7</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="532.53436"
-       y="161.96489"
-       id="text5070-2-2-9-9-6-1-7-9-3-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-4-6"
-         x="532.53436"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">8</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="572.53436"
-       y="71.96489"
-       id="text5070-2-2-9-9-6-1-7-9-8-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-7-6"
-         x="572.53436"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">10</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="532.53436"
-       y="11.964892"
-       id="text5070-2-2-9-9-6-1-7-9-8-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-7-6-5"
-         x="532.53436"
-         y="11.964892"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">9</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="612.53436"
-       y="161.96489"
-       id="text5070-2-2-9-9-6-1-7-9-8-9-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-7-1-7-6-6"
-         x="612.53436"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">11</tspan></text>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8"
-       cx="12.534393"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91"
-       cx="92.534393"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2"
-       cx="172.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-80"
-       cx="92.534393"
-       cy="-38.035107"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-2"
-       cx="332.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-80-9"
-       cx="412.53439"
-       cy="-38.035107"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-5"
-       cx="452.53439"
-       cy="-218.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-1"
-       cx="532.53442"
-       cy="-98.035118"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-2-7"
-       cx="12.534395"
-       cy="81.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-80-9-8"
-       cx="92.534393"
-       cy="201.96487"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-5-9"
-       cx="132.53439"
-       cy="21.964891"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-1-0-8"
-       cx="172.53439"
-       cy="201.96487"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 12.534393,81.964892 80,119.999998 39.999997,-60 40,60 80,-119.999998 h -80 l -40,-60 -39.999997,60 z"
-       id="path1696"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-1-0-6"
-       cx="252.53439"
-       cy="81.964874"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-8-2-7-9"
-       cx="332.53439"
-       cy="81.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-80-9-8-2"
-       cx="412.53439"
-       cy="201.96487"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-5-9-0"
-       cx="452.53442"
-       cy="21.964899"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-1-0-8-1"
-       cx="492.53442"
-       cy="201.96487"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-5-9-0-9"
-       cx="532.53442"
-       cy="21.964895"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-5-9-0-3"
-       cx="612.53442"
-       cy="141.96489"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 12.534393,-158.03511 80,120.000002 79.999997,-120.000002 z"
-       id="path1690"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 332.53439,-158.03511 80,120.000002 40,-60 h 80 l -80,-120.000002 -40,60 z"
-       id="path1694"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 332.53439,81.964892 h 80 l 40,-60 40,60 40,-60 80,119.999998 h -80 l -40,60 -40,-60 -40,60 z"
-       id="path1698"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 52.534393,-98.035108 40,-60.000002 39.999997,60.000002 z"
-       id="path1700"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25"
-       cx="132.53439"
-       cy="-98.03511"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 372.53439,-98.035108 40,-60.000002 h 80 l -40,60.000002 z m 40,-60.000002 40,60.000002"
-       id="path1702"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-2-9"
-       cx="492.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-1"
-       cx="452.53439"
-       cy="-98.03511"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 52.534393,141.96489 40,-59.999998 h 79.999997 l 40,59.999998 h -80 z m 40,-59.999998 39.999997,59.999998 40,-59.999998"
-       id="path1706"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-1-0"
-       cx="212.53442"
-       cy="141.96487"
-       r="3.4908931" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 372.53439,141.96489 40,-59.999998 h 160 l -40,59.999998 z m 40,-59.999998 40,59.999998 40,-59.999998 40,59.999998"
-       id="path1712"
-       inkscape:connector-curvature="0" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-25-1-0-6-1"
-       cx="572.53436"
-       cy="81.964867"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-1-0-9"
-       cx="532.53442"
-       cy="141.96489"
-       r="3.4908931" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="372.53439"
-       y="-78.03511"
-       id="text5070-2-2-9-9-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-20"
-         x="372.53439"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="452.53439"
-       y="-78.03511"
-       id="text5070-2-2-9-9-1-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3-9"
-         x="452.53439"
-         y="-78.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53439"
-       y="-168.03511"
-       id="text5070-2-2-9-9-6-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-2"
-         x="332.53439"
-         y="-168.03511"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="-18.035109"
-       id="text5070-2-2-9-9-77-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-2"
-         x="412.53439"
-         y="-18.035109"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="71.96489"
-       id="text5070-2-2-9-9-7-8-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-7-8"
-         x="92.534393"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="172.53439"
-       y="71.96489"
-       id="text5070-2-2-9-9-41-2-93"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1-4-4"
-         x="172.53439"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">6</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="132.53438"
-       y="11.964892"
-       id="text5070-2-2-9-9-6-1-2-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-4-4"
-         x="132.53438"
-         y="11.964892"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="52.534393"
-       y="161.96489"
-       id="text5070-2-2-9-9-5-5"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-20-4"
-         x="52.534393"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="132.53438"
-       y="161.96489"
-       id="text5070-2-2-9-9-1-9-4"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3-9-9"
-         x="132.53438"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="12.534393"
-       y="71.96489"
-       id="text5070-2-2-9-9-6-5-0"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-2-8"
-         x="12.534393"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="92.534393"
-       y="221.96489"
-       id="text5070-2-2-9-9-77-5-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-2-6"
-         x="92.534393"
-         y="221.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="71.96489"
-       id="text5070-2-2-9-9-7-8-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-6-7-9"
-         x="412.53439"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="492.53439"
-       y="71.96489"
-       id="text5070-2-2-9-9-41-2-97"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-1-4-81"
-         x="492.53439"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">6</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="452.53436"
-       y="11.964892"
-       id="text5070-2-2-9-9-6-1-2-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-3-4-7"
-         x="452.53436"
-         y="11.964892"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">5</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="372.53439"
-       y="161.96489"
-       id="text5070-2-2-9-9-5-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-20-0"
-         x="372.53439"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="452.53436"
-       y="161.96489"
-       id="text5070-2-2-9-9-1-9-6"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-3-9-8"
-         x="452.53436"
-         y="161.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">4</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="332.53439"
-       y="71.96489"
-       id="text5070-2-2-9-9-6-5-07"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-4-2-1"
-         x="332.53439"
-         y="71.96489"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.16427398"
-       x="412.53439"
-       y="221.96487"
-       id="text5070-2-2-9-9-77-5-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9-5-2-1"
-         x="412.53439"
-         y="221.96487"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:1.16427398">3</tspan></text>
-    <g
-       transform="translate(150,-10.00001)"
-       id="g7055-4">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3-3"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-8)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9-3"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471-7)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3-1"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-8)" />
-    </g>
-    <g
-       transform="translate(-170,229.99999)"
-       id="g7055-4-8">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3-3-3"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-8-0)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9-3-7"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471-7-8)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3-1-8"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-8-7)" />
-    </g>
-    <g
-       transform="translate(150,229.99999)"
-       id="g7055-4-7">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3-3-9"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-8-07)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9-3-8"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471-7-4)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3-1-9"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-8-4)" />
-    </g>
-    <g
-       transform="translate(230,229.99999)"
-       id="g7055-4-9">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-08-3-3-36"
-         d="m 277.53439,-133.0351 20,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6464-8-1)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-9-9-3-75"
-         d="m 307.53439,-103.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker2471-7-0)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2-3-1-5"
-         d="m 327.53439,-143.0351 h -50"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker6744-8-5)" />
-    </g>
-    <g
-       id="g4389"
-       transform="translate(1.000012e-7,-1e-5)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
-    </g>
-    <g
-       id="g4389-8"
-       transform="translate(320,-1e-5)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-7"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-8)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-4"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-8)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-2"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-2)" />
-    </g>
-    <g
-       id="g4389-0"
-       transform="translate(1.0000121e-7,239.99999)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-9"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-6)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-8"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-1)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-6"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-6)" />
-    </g>
-    <g
-       id="g4389-9"
-       transform="translate(80,239.99999)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-4"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-2)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-5"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-11)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-0"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-8)" />
-    </g>
-    <g
-       id="g4389-3"
-       transform="translate(320,239.99999)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-1"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-3)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-2"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-7)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-28"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-9)" />
-    </g>
-    <g
-       id="g4389-1"
-       transform="translate(400,239.99999)">
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1868-3"
-         d="m 67.534393,-113.0351 20,-30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3039-7)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1870-0"
-         d="m 97.534393,-143.0351 19.999997,30"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker2891-71)" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path1872-1"
-         d="M 117.53439,-103.0351 H 67.534393"
-         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend-0)" />
-    </g>
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0"
-       cx="412.53439"
-       cy="-158.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-5-3"
-       cx="372.53439"
-       cy="-98.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-5"
-       cx="52.534393"
-       cy="-98.03511"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97-2"
-       cx="52.534393"
-       cy="141.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97-6"
-       cx="132.53439"
-       cy="141.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97-0"
-       cx="372.53439"
-       cy="141.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-97-26"
-       cx="452.53439"
-       cy="141.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-1-1"
-       cx="92.534393"
-       cy="81.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-1"
-       cx="412.53439"
-       cy="81.96489"
-       r="3.4908931" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5-91-0-3-1-2"
-       cx="492.53439"
-       cy="81.96489"
-       r="3.4908931" />
-    <circle
-       r="3.4908931"
-       cy="81.96489"
-       cx="172.53439"
-       id="circle9368"
-       style="fill:#f20000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 132.53439,-98.03511 c -3.33453,-1.667266 -6.66786,-3.33393 -10,-5"
-       id="path24664"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24666"
-       inkscape:original-d="m 132.53439,-98.03511 c -3.33433,-1.66767 -6.66766,-3.33433 -10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 452.53439,-98.03511 c -3.53989,-1.769946 -6.66787,-3.33393 -10,-5"
-       id="path24956"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24958"
-       inkscape:original-d="m 452.53439,-98.03511 c -3.53813,-1.77347 -6.66767,-3.33433 -10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 492.53439,-158.03511 c -3.33374,1.66687 -6.66707,3.33353 -10,5"
-       id="path24960"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24962"
-       inkscape:original-d="m 492.53439,-158.03511 c -3.33434,1.66567 -6.66767,3.33233 -10,5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 132.53439,141.96489 c -3.33453,-1.66727 -6.66786,-3.33393 -10,-5"
-       id="path24964"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24966"
-       inkscape:original-d="m 132.53439,141.96489 c -3.33433,-1.66767 -6.66766,-3.33433 -10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 172.53439,81.96489 c -3.33373,1.666867 -6.66706,3.333533 -9.99999,5"
-       id="path24968"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24970"
-       inkscape:original-d="m 172.53439,81.96489 c -3.33433,1.66567 -6.66766,3.33233 -9.99999,5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 212.53439,141.96489 c -3.33454,-1.66727 -6.66787,-3.33393 -10,-5"
-       id="path24972"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24974"
-       inkscape:original-d="m 212.53439,141.96489 c -3.33434,-1.66767 -6.66767,-3.33433 -10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 452.53439,141.96489 c -3.33454,-1.66727 -6.66787,-3.33393 -10,-5"
-       id="path24976"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24978"
-       inkscape:original-d="m 452.53439,141.96489 c -3.33434,-1.66767 -6.66767,-3.33433 -10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 492.53439,81.96489 c -3.33374,1.66687 -6.66707,3.333534 -10,5"
-       id="path24980"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24982"
-       inkscape:original-d="m 492.53439,81.96489 c -3.33434,1.66567 -6.66767,3.33233 -10,5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 532.53439,141.96489 c -3.33454,-1.66727 -6.66787,-3.33393 -10,-5"
-       id="path24984"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24986"
-       inkscape:original-d="m 532.53439,141.96489 c -3.33434,-1.66767 -6.66767,-3.33433 -10,-5" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 572.53439,81.96489 c -3.33374,1.66687 -6.66707,3.333534 -10,5"
-       id="path24988"
-       inkscape:connector-curvature="0"
-       inkscape:path-effect="#path-effect24990"
-       inkscape:original-d="m 572.53439,81.96489 c -3.33434,1.66567 -6.66767,3.33233 -10,5" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/ray_intersection_candidate.svg b/registry/vulkan/images/ray_intersection_candidate.svg
deleted file mode 100644
index 13cb7c2..0000000
--- a/registry/vulkan/images/ray_intersection_candidate.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
-  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-
-<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="-125 20 450 100">
-  <defs>
-    <marker id="lineend" viewBox="0 0 1 3" refX="1" refY="1.5" markerWidth="1" markerHeight="3" orient="auto">
-      <rect width="1" height="3" x="0" y="0" fill="black" />
-    </marker>
-    <!-- The VKSpec SVG to PDF doesn't like auto-start-reverse -->
-    <marker id="linestart" viewBox="0 0 1 3" refX="0" refY="1.5" markerWidth="1" markerHeight="3" orient="auto">
-      <rect width="1" height="3" x="0" y="0" fill="black" />
-    </marker>
-    <marker id="arrow" viewBox="0 0 2 3" refX="1" refY="1.5" markerWidth="3" markerHeight="4" orient="auto">
-      <path d="M 0 0.5 l 0.5 -0.5 l 1.5 1.5 l -1.5 1.5 l -0.5 -0.5 l 1 -1 z" style="fill:black;" stroke-linecap="butt" />
-    </marker>
-  </defs>
-
-  <line x1="200" y1="50" x2="250" y2="37.5" style="stroke:black;stroke-width:2;" stroke-dasharray="3,3" />
-  <circle fill="#008000" r="3" cx="200" cy="50" />
-  <line x1="150" y1="62.5" x2="200" y2="50" style="stroke:black;stroke-width:2;" />
-  <path d="M 150 100 L 100 50 L 200 25 z" fill="#FF8080" opacity="0.75" stroke="none" />
-  <circle fill="#FF0000" r="3" cx="150" cy="62.5" />
-  <line x1="100" y1="75" x2="150" y2="62.5" style="stroke:black;stroke-width:2;" />
-  <circle fill="#0000FF" r="3" cx="100" cy="75" />
-  <line x1="50" y1="87.5" x2="100" y2="75" style="stroke:black;stroke-width:2;" stroke-dasharray="3,3" />
-  <path d="M 0 100 l 25 -6.125 l 25 -6.125" style="stroke:black;stroke-width:2;" marker-end="url(#lineend)" marker-mid="url(#arrow)" marker-start="url(#linestart)"/>
-  <line x1="-50" y1="112.5" x2="0" y2="100" style="stroke:black;stroke-width:2;" stroke-dasharray="3,3" />
-  <text x="-3.75" y="93" style="font-style:normal;font-weight:bold;font-size:11px;font-family:serif;">o</text>
-  <text x="20" y="86.875" style="font-style:normal;font-weight:bold;font-size:11px;font-family:serif;">d</text>
-  <text x="82.5" y="90" style="font-style:normal;font-weight:bold;font-size:11px;font-family:serif;">o</text>
-  <text x="90" y="91" style="font-style:italic;font-weight:normal;font-size:11px;font-family:serif;">+</text>
-  <text x="100" y="90" style="font-style:italic;font-weight:normal;font-size:11px;font-family:serif;">t</text>
-  <text x="104" y="92" style="font-style:italic;font-weight:normal;font-size:6px;font-family:serif;">min</text>
-  <text x="115" y="90" style="font-style:normal;font-weight:bold;font-size:11px;font-family:serif;">d</text>
-  <text x="134.5" y="55" style="font-style:normal;font-weight:bold;font-size:11px;font-family:serif;">o</text>
-  <text x="141" y="56" style="font-style:italic;font-weight:normal;font-size:11px;font-family:serif;">+</text>
-  <text x="150" y="55" style="font-style:italic;font-weight:normal;font-size:11px;font-family:serif;">t</text>
-  <text x="155" y="55" style="font-style:normal;font-weight:bold;font-size:11px;font-family:serif;">d</text>
-  <text x="182.5" y="65" style="font-style:normal;font-weight:bold;font-size:11px;font-family:serif;">o</text>
-  <text x="190" y="66" style="font-style:italic;font-weight:normal;font-size:11px;font-family:serif;">+</text>
-  <text x="200" y="65" style="font-style:italic;font-weight:normal;font-size:11px;font-family:serif;">t</text>
-  <text x="204" y="67" style="font-style:italic;font-weight:normal;font-size:6px;font-family:serif;">max</text>
-  <text x="216" y="65" style="font-style:normal;font-weight:bold;font-size:11px;font-family:serif;">d</text>
-</svg>
diff --git a/registry/vulkan/images/ray_tracing_execution.svg b/registry/vulkan/images/ray_tracing_execution.svg
deleted file mode 100644
index 079f41c..0000000
--- a/registry/vulkan/images/ray_tracing_execution.svg
+++ /dev/null
@@ -1,414 +0,0 @@
-<?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"
-   width="454.53473"
-   height="183.80112"
-   viewBox="0 0 454.53472 183.80112"
-   version="1.1"
-   id="svg8"
-   sodipodi:docname="ray_tracing_execution.svg"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9512-2-2-4-7"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path9510-2-3-81-1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9512-2-2-4-7-1"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path9510-2-3-81-1-2"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9512-2-2-8-1-7-0"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path9510-2-3-8-2-1-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9512-2-2-8-1-7-05"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path9510-2-3-8-2-1-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9512-2-2-8-1-7-05-1"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path9510-2-3-8-2-1-3-9"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9512-2-2-4-7-13"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path9510-2-3-81-1-8"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker9512-2-2-4-7-1-3"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path9510-2-3-81-1-2-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2.0000001"
-     inkscape:cx="263.45186"
-     inkscape:cy="204.85377"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:snap-center="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1001"
-     inkscape:window-x="-9"
-     inkscape:window-y="-9"
-     inkscape:window-maximized="0"
-     showguides="false"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     fit-margin-left="1"
-     units="in"
-     inkscape:snap-others="true"
-     inkscape:snap-nodes="true"
-     inkscape:object-nodes="true"
-     height="7.5in">
-    <inkscape:grid
-       type="xygrid"
-       id="grid817"
-       originx="79.262856"
-       originy="-1225.558" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-35.742392,209.97146)">
-    <g
-       id="g1684"
-       transform="translate(76.761047,177.11848)">
-      <rect
-         y="-385.62808"
-         x="196.64136"
-         height="47.54937"
-         width="98.349922"
-         id="rect815-1-6-5-1-3-2-0"
-         style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.92372322;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         x="246.41849"
-         y="-357.55588"
-         id="text823-0-2-6-1-7-2-1"><tspan
-           y="-357.55588"
-           x="246.41849"
-           id="tspan981"
-           sodipodi:role="line">Any-Hit</tspan></text>
-    </g>
-    <g
-       transform="translate(-36.358826,-133.79857)"
-       id="g988-3">
-      <g
-         id="g4763">
-        <rect
-           style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.92372322;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-           id="rect815-1-6-5-1-3-2-0-7"
-           width="98.349922"
-           height="47.54937"
-           x="191.76122"
-           y="-74.711029" />
-        <text
-           id="text823-0-2-6-1-7-2-1-1"
-           y="-46.1577"
-           x="241.06639"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-           xml:space="preserve"><tspan
-             sodipodi:role="line"
-             id="tspan8376"
-             x="241.06639"
-             y="-46.1577">Intersection</tspan></text>
-      </g>
-    </g>
-    <text
-       id="text823-0-2-6-1-7-2-1-9-1"
-       y="-113.86218"
-       x="438.78833"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan6495"
-         x="438.78833"
-         y="-113.86218">Hit?</tspan></text>
-    <g
-       id="g7686"
-       transform="translate(-211.72239,-23.523486)">
-      <rect
-         y="-184.80975"
-         x="600.11108"
-         height="47.54937"
-         width="98.349922"
-         id="rect815-1-6-5-1-3-0-9"
-         style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.92372322;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-         x="649.0517"
-         y="-156.07088"
-         id="text823-0-2-6-1-7-4-9"><tspan
-           y="-156.07088"
-           x="649.0517"
-           id="tspan6645"
-           sodipodi:role="line">Closest Hit</tspan></text>
-    </g>
-    <g
-       transform="translate(196.84052,-0.4705565)"
-       id="g988-3-6">
-      <g
-         id="g4763-9">
-        <rect
-           style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.92372322;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-           id="rect815-1-6-5-1-3-2-0-7-3"
-           width="98.349922"
-           height="47.54937"
-           x="191.76122"
-           y="-74.711029" />
-        <text
-           id="text823-0-2-6-1-7-2-1-1-5"
-           y="-46.144676"
-           x="240.56183"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-           xml:space="preserve"><tspan
-             sodipodi:role="line"
-             id="tspan6647"
-             x="240.56183"
-             y="-46.144676">Miss</tspan></text>
-      </g>
-    </g>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9512-2-2-4-7)"
-       d="m 439.07803,-95.453012 v 17.927004"
-       id="path9502-8-53-6-5"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <rect
-       style="fill:none;stroke:#000000;stroke-width:1.44848073;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect3643-7-6"
-       width="54.151859"
-       height="54.151859"
-       x="354.16718"
-       y="78.002197"
-       transform="matrix(0.90285598,-0.42994311,0.90285598,0.42994311,0,0)" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9512-2-2-4-7-1)"
-       d="m 439.07803,-142.01745 v -16.38351"
-       id="path9502-8-53-6-5-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <text
-       id="text823-0-2-6-1-7-2-1-5-2-2"
-       y="-145.3622"
-       x="431.07803"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan9812-5-3"
-         x="431.07803"
-         y="-145.3622">Y</tspan></text>
-    <text
-       id="text823-0-2-6-1-7-2-1-5-1-3"
-       y="-82.515198"
-       x="431.065"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         sodipodi:role="line"
-         id="tspan10386-33"
-         x="431.065"
-         y="-82.515198">N</tspan></text>
-    <g
-       id="g988-0"
-       transform="translate(-277.43985,-72.408014)">
-      <g
-         id="g1576">
-        <rect
-           style="fill:#ffffff;fill-opacity:1;stroke:#ff0000;stroke-width:0.92372322;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-           id="rect815-1-6-5-1-3-2-0-6"
-           width="98.349922"
-           height="47.54937"
-           x="314.6441"
-           y="-70.14447" />
-        <text
-           id="text823-0-2-6-1-7-2-1-8"
-           y="-50.072266"
-           x="364.42123"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-           xml:space="preserve"><tspan
-             y="-50.072266"
-             x="364.42123"
-             id="tspan1568"
-             sodipodi:role="line">Ray</tspan><tspan
-             y="-33.405598"
-             x="364.42123"
-             id="tspan1570"
-             sodipodi:role="line">Generation</tspan></text>
-      </g>
-    </g>
-    <rect
-       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.92372322;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect815-1-6-3"
-       width="215.34993"
-       height="47.54937"
-       x="155.40239"
-       y="-142.5096" />
-    <text
-       id="text823-0-2-6"
-       y="-130.43739"
-       x="263.56888"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.33333302px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.26999986;stroke-miterlimit:4;stroke-dasharray:none"
-       xml:space="preserve"><tspan
-         y="-130.43739"
-         x="263.56888"
-         id="tspan947-5"
-         sodipodi:role="line">Acceleration</tspan><tspan
-         id="tspan1116"
-         y="-113.77073"
-         x="263.56888"
-         sodipodi:role="line">Structure</tspan><tspan
-         id="tspan1118"
-         y="-97.104057"
-         x="263.56888"
-         sodipodi:role="line">Traversal</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9512-2-2-8-1-7-0)"
-       d="m 135.82735,-118.73491 h 17.927"
-       id="path9502-8-53-7-5-7-6"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9512-2-2-8-1-7-05)"
-       d="M 370.25969,-118.73523 H 388.1867"
-       id="path9502-8-53-7-5-7-0"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9512-2-2-8-1-7-05-1)"
-       d="m 254.12852,-184.73491 h 17.92701"
-       id="path9502-8-53-7-5-7-0-2"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9512-2-2-4-7-13)"
-       d="m 323.17953,-161.4009 v 17.927"
-       id="path9502-8-53-6-5-25"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9512-2-2-4-7-1-3)"
-       d="m 204.70756,-142.77917 v -16.38351"
-       id="path9502-8-53-6-5-2-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc"
-       inkscape:transform-center-x="-208"
-       inkscape:transform-center-y="18.485341" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/sample_count_1.svg b/registry/vulkan/images/sample_count_1.svg
deleted file mode 100644
index bfae69c..0000000
--- a/registry/vulkan/images/sample_count_1.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg width="160" height="160" viewBox="-500 -500 11000 11000" xmlns="http://www.w3.org/2000/svg" version="1.1">
-	<desc>VK_SAMPLE_COUNT_1_BIT</desc>
-	<defs>
-		<marker id="Triangle" viewBox="0 0 10 10" refX="0" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="8" orient="auto">
-			<path d="M 0 0 L 10 5 L 0 10 z" />
-		</marker>
-	</defs>
-	<g>
-		<!-- Axises -->
-		<line x1="00000" x2="10000" y1="00000" y2="00000" stroke-width="00050" stroke="black" marker-end="url(#Triangle)" />
-		<line x1="00000" x2="00000" y1="00000" y2="10000" stroke-width="00050" stroke="black" marker-end="url(#Triangle)" />
-		<!-- Helper-lines -->
-		<line x1="00000" x2="10000" y1="10000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="10000" x2="10000" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Helper-lines horizontal -->
-		<line x1="00000" x2="10000" y1="05000" y2="05000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Helper-lines vertical -->
-		<line x1="05000" x2="05000" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Dots -->
-		<circle cx="05000" cy="05000" r="00200" fill="black" /><text x="05000" y="05000" fill="red" font-size="01100" transform="translate(00200 -00200)">0</text>
-	</g>
-</svg>
diff --git a/registry/vulkan/images/sample_count_16.svg b/registry/vulkan/images/sample_count_16.svg
deleted file mode 100644
index ce38c9b..0000000
--- a/registry/vulkan/images/sample_count_16.svg
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg width="160" height="160" viewBox="-500 -500 11000 11000" xmlns="http://www.w3.org/2000/svg" version="1.1">
-	<desc>VK_SAMPLE_COUNT_16_BIT</desc>
-	<defs>
-		<marker id="Triangle" viewBox="0 0 10 10" refX="0" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="8" orient="auto">
-			<path d="M 0 0 L 10 5 L 0 10 z" />
-		</marker>
-	</defs>
-	<g>
-		<!-- Axises -->
-		<line x1="00000" x2="10000" y1="00000" y2="00000" stroke-width="00050" stroke="black" marker-end="url(#Triangle)" />
-		<line x1="00000" x2="00000" y1="00000" y2="10000" stroke-width="00050" stroke="black" marker-end="url(#Triangle)" />
-		<!-- Helper-lines -->
-		<line x1="00000" x2="10000" y1="10000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="10000" x2="10000" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Helper-lines horizontal -->
-		<line x1="00000" x2="10000" y1="00000" y2="00000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="00625" y2="00625" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="01250" y2="01250" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="01875" y2="01875" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="02500" y2="02500" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="03125" y2="03125" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="03750" y2="03750" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="04375" y2="04375" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="05000" y2="05000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="05625" y2="05625" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="06250" y2="06250" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="06875" y2="06875" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="07500" y2="07500" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="08125" y2="08125" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="08750" y2="08750" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="09375" y2="09375" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Helper-lines vertical -->
-		<line x1="00000" x2="00000" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00625" x2="00625" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="01250" x2="01250" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="01875" x2="01875" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="02500" x2="02500" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="03125" x2="03125" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="03750" x2="03750" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="04375" x2="04375" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="05000" x2="05000" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="05625" x2="05625" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="06250" x2="06250" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="06875" x2="06875" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="07500" x2="07500" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="08125" x2="08125" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="08750" x2="08750" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="09375" x2="09375" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Dots -->
-		<circle cx="05625" cy="05625" r="00200" fill="black" /><text x="05625" y="05625" fill="red" font-size="01100" transform="translate(00200 -00200)">0</text>
-		<circle cx="04375" cy="03125" r="00200" fill="black" /><text x="04375" y="03125" fill="red" font-size="01100" transform="translate(00200 -00200)">1</text>
-		<circle cx="03125" cy="06250" r="00200" fill="black" /><text x="03125" y="06250" fill="red" font-size="01100" transform="translate(00200 -00200)">2</text>
-		<circle cx="07500" cy="04375" r="00200" fill="black" /><text x="07500" y="04375" fill="red" font-size="01100" transform="translate(00200 -00200)">3</text>
-		<circle cx="01875" cy="03750" r="00200" fill="black" /><text x="01875" y="03750" fill="red" font-size="01100" transform="translate(00200 -00200)">4</text>
-		<circle cx="06250" cy="08125" r="00200" fill="black" /><text x="06250" y="08125" fill="red" font-size="01100" transform="translate(00200 -00200)">5</text>
-		<circle cx="08125" cy="06875" r="00200" fill="black" /><text x="08125" y="06875" fill="red" font-size="01100" transform="translate(00200 -00200)">6</text>
-		<circle cx="06875" cy="01875" r="00200" fill="black" /><text x="06875" y="01875" fill="red" font-size="01100" transform="translate(00200 -00200)">7</text>
-		<circle cx="03750" cy="08750" r="00200" fill="black" /><text x="03750" y="08750" fill="red" font-size="01100" transform="translate(00200 -00200)">8</text>
-		<circle cx="05000" cy="00625" r="00200" fill="black" /><text x="05000" y="00625" fill="red" font-size="01100" transform="translate(00400  00400)">9</text>
-		<circle cx="02500" cy="01250" r="00200" fill="black" /><text x="02500" y="01250" fill="red" font-size="01100" transform="translate(00200 -00200)">10</text>
-		<circle cx="01250" cy="07500" r="00200" fill="black" /><text x="01250" y="07500" fill="red" font-size="01100" transform="translate(00200 -00200)">11</text>
-		<circle cx="00000" cy="05000" r="00200" fill="black" /><text x="00000" y="05000" fill="red" font-size="01100" transform="translate(00200 -00200)">12</text>
-		<circle cx="09375" cy="02500" r="00200" fill="black" /><text x="09375" y="02500" fill="red" font-size="01100" transform="translate(00000 -00400)">13</text>
-		<circle cx="08750" cy="09375" r="00200" fill="black" /><text x="08750" y="09375" fill="red" font-size="01100" transform="translate(00200 -00200)">14</text>
-		<circle cx="00625" cy="00000" r="00200" fill="black" /><text x="00625" y="00000" fill="red" font-size="01100" transform="translate(00200  00800)">15</text>
-	</g>
-</svg>
diff --git a/registry/vulkan/images/sample_count_2.svg b/registry/vulkan/images/sample_count_2.svg
deleted file mode 100644
index 91fd4d9..0000000
--- a/registry/vulkan/images/sample_count_2.svg
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg width="160" height="160" viewBox="-500 -500 11000 11000" xmlns="http://www.w3.org/2000/svg" version="1.1">
-	<desc>VK_SAMPLE_COUNT_2_BIT</desc>
-	<defs>
-		<marker id="Triangle" viewBox="0 0 10 10" refX="0" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="8" orient="auto">
-			<path d="M 0 0 L 10 5 L 0 10 z" />
-		</marker>
-	</defs>
-	<g>
-		<!-- Axises -->
-		<line x1="00000" x2="10000" y1="00000" y2="00000" stroke-width="00050" stroke="black" marker-end="url(#Triangle)" />
-		<line x1="00000" x2="00000" y1="00000" y2="10000" stroke-width="00050" stroke="black" marker-end="url(#Triangle)" />
-		<!-- Helper-lines -->
-		<line x1="00000" x2="10000" y1="10000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="10000" x2="10000" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Helper-lines horizontal -->
-		<line x1="00000" x2="10000" y1="02500" y2="02500" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="07500" y2="07500" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Helper-lines vertical -->
-		<line x1="02500" x2="02500" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="07500" x2="07500" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Dots -->
-		<circle cx="07500" cy="07500" r="00200" fill="black" /><text x="07500" y="07500" fill="red" font-size="01100" transform="translate(00200 -00200)">0</text>
-		<circle cx="02500" cy="02500" r="00200" fill="black" /><text x="02500" y="02500" fill="red" font-size="01100" transform="translate(00200 -00200)">1</text>
-	</g>
-</svg>
diff --git a/registry/vulkan/images/sample_count_4.svg b/registry/vulkan/images/sample_count_4.svg
deleted file mode 100644
index f4bcc7e..0000000
--- a/registry/vulkan/images/sample_count_4.svg
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg width="160" height="160" viewBox="-500 -500 11000 11000" xmlns="http://www.w3.org/2000/svg" version="1.1">
-	<desc>VK_SAMPLE_COUNT_4_BIT</desc>
-	<defs>
-		<marker id="Triangle" viewBox="0 0 10 10" refX="0" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="8" orient="auto">
-			<path d="M 0 0 L 10 5 L 0 10 z" />
-		</marker>
-	</defs>
-	<g>
-		<!-- Axises -->
-		<line x1="00000" x2="10000" y1="00000" y2="00000" stroke-width="00050" stroke="black" marker-end="url(#Triangle)" />
-		<line x1="00000" x2="00000" y1="00000" y2="10000" stroke-width="00050" stroke="black" marker-end="url(#Triangle)" />
-		<!-- Helper-lines -->
-		<line x1="00000" x2="10000" y1="10000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="10000" x2="10000" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Helper-lines horizontal -->
-		<line x1="00000" x2="10000" y1="01250" y2="01250" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="03750" y2="03750" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="06250" y2="06250" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="08750" y2="08750" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Helper-lines vertical -->
-		<line x1="01250" x2="01250" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="03750" x2="03750" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="06250" x2="06250" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="08750" x2="08750" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Dots -->
-		<circle cx="03750" cy="01250" r="00200" fill="black" /><text x="03750" y="01250" fill="red" font-size="01100" transform="translate(00200 -00200)">0</text>
-		<circle cx="08750" cy="03750" r="00200" fill="black" /><text x="08750" y="03750" fill="red" font-size="01100" transform="translate(00200 -00200)">1</text>
-		<circle cx="01250" cy="06250" r="00200" fill="black" /><text x="01250" y="06250" fill="red" font-size="01100" transform="translate(00200 -00200)">2</text>
-		<circle cx="06250" cy="08750" r="00200" fill="black" /><text x="06250" y="08750" fill="red" font-size="01100" transform="translate(00200 -00200)">3</text>
-	</g>
-</svg>
diff --git a/registry/vulkan/images/sample_count_8.svg b/registry/vulkan/images/sample_count_8.svg
deleted file mode 100644
index 0a86371..0000000
--- a/registry/vulkan/images/sample_count_8.svg
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg width="160" height="160" viewBox="-500 -500 11000 11000" xmlns="http://www.w3.org/2000/svg" version="1.1">
-	<desc>VK_SAMPLE_COUNT_8_BIT</desc>
-	<defs>
-		<marker id="Triangle" viewBox="0 0 10 10" refX="0" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="8" orient="auto">
-			<path d="M 0 0 L 10 5 L 0 10 z" />
-		</marker>
-	</defs>
-	<g>
-		<!-- Axises -->
-		<line x1="00000" x2="10000" y1="00000" y2="00000" stroke-width="00050" stroke="black" marker-end="url(#Triangle)" />
-		<line x1="00000" x2="00000" y1="00000" y2="10000" stroke-width="00050" stroke="black" marker-end="url(#Triangle)" />
-		<!-- Helper-lines -->
-		<line x1="00000" x2="10000" y1="10000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="10000" x2="10000" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Helper-lines horizontal -->
-		<line x1="00000" x2="10000" y1="00625" y2="00625" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="01875" y2="01875" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="03125" y2="03125" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="04375" y2="04375" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="05625" y2="05625" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="06875" y2="06875" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="08125" y2="08125" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="00000" x2="10000" y1="09375" y2="09375" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Helper-lines vertical -->
-		<line x1="00625" x2="00625" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="01875" x2="01875" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="03125" x2="03125" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="04375" x2="04375" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="05625" x2="05625" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="06875" x2="06875" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="08125" x2="08125" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<line x1="09375" x2="09375" y1="00000" y2="10000" stroke-width="00010" stroke="black" stroke-dasharray="00100" />
-		<!-- Dots -->
-		<circle cx="05625" cy="03125" r="00200" fill="black" /><text x="05625" y="03125" fill="red" font-size="01100" transform="translate(00200 -00200)">0</text>
-		<circle cx="04375" cy="06875" r="00200" fill="black" /><text x="04375" y="06875" fill="red" font-size="01100" transform="translate(00200 -00200)">1</text>
-		<circle cx="08125" cy="05625" r="00200" fill="black" /><text x="08125" y="05625" fill="red" font-size="01100" transform="translate(00200 -00200)">2</text>
-		<circle cx="03125" cy="01875" r="00200" fill="black" /><text x="03125" y="01875" fill="red" font-size="01100" transform="translate(00200 -00200)">3</text>
-		<circle cx="01875" cy="08125" r="00200" fill="black" /><text x="01875" y="08125" fill="red" font-size="01100" transform="translate(00200 -00200)">4</text>
-		<circle cx="00625" cy="04375" r="00200" fill="black" /><text x="00625" y="04375" fill="red" font-size="01100" transform="translate(00200 -00200)">5</text>
-		<circle cx="06875" cy="09375" r="00200" fill="black" /><text x="06875" y="09375" fill="red" font-size="01100" transform="translate(00200 -00200)">6</text>
-		<circle cx="09375" cy="00625" r="00200" fill="black" /><text x="09375" y="00625" fill="red" font-size="01100" transform="translate(00200  00700)">7</text>
-	</g>
-</svg>
diff --git a/registry/vulkan/images/sparseimage.svg b/registry/vulkan/images/sparseimage.svg
deleted file mode 100644
index 1cf04ea..0000000
--- a/registry/vulkan/images/sparseimage.svg
+++ /dev/null
@@ -1,361 +0,0 @@
-<?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"
-   width="213.37727mm"
-   height="140.93106mm"
-   viewBox="0 0 213.37728 140.93106"
-   version="1.1"
-   id="svg5072"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="sparseimage.svg">
-  <defs
-     id="defs5066" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="312.27341"
-     inkscape:cy="211.10847"
-     inkscape:document-units="mm"
-     inkscape:current-layer="g1301"
-     showgrid="true"
-     inkscape:measure-start="50,1040"
-     inkscape:measure-end="50,900"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     fit-margin-left="1"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="1672"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid5617"
-       originx="5.8699871"
-       originy="-141.02337" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5069">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(5.8699864,-15.045569)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="39.6875"
-       y="19.1875"
-       id="text7094"><tspan
-         sodipodi:role="line"
-         id="tspan7092"
-         x="39.6875"
-         y="19.1875"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Array Layer 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="97.895836"
-       y="19.187496"
-       id="text7094-5"><tspan
-         sodipodi:role="line"
-         id="tspan7092-3"
-         x="97.895836"
-         y="19.187496"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Array Layer 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="156.10417"
-       y="19.187496"
-       id="text7094-6"><tspan
-         sodipodi:role="line"
-         id="tspan7092-0"
-         x="156.10417"
-         y="19.187496"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Array Layer 2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="48.291668"
-       id="text7094-67"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="48.291668"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="53.583336"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156">Level 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="93.270836"
-       id="text7094-67-1"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="93.270836"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152-2">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="98.5625"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-6">Level 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="138.25"
-       id="text7094-67-2"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="138.25"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152-4">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="143.54167"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-0">Level 3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="119.72918"
-       id="text7094-67-2-8"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="119.72918"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152-4-0">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="125.02084"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-0-1">Level 2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="154.125"
-       id="text7094-67-2-1"><tspan
-         sodipodi:role="line"
-         x="2.6458333"
-         y="154.125"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-0-4">Mip Tail</tspan></text>
-    <g
-       id="g1301"
-       transform="translate(1.3229072,-3.1985317e-5)">
-      <rect
-         y="147.51044"
-         x="150.8125"
-         height="5.2916665"
-         width="5.2916665"
-         id="rect6319-7-9-4"
-         style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="139.57294"
-         x="150.8125"
-         height="5.2916675"
-         width="5.2916675"
-         id="rect5619-4-1-6-6-0-6-8"
-         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:1.05999995,1.05999995;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="131.63542"
-         x="150.8125"
-         height="5.2916675"
-         width="5.2916675"
-         id="rect5619-6-8-6-5-2"
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="125.02087"
-         x="149.48959"
-         height="29.104164"
-         width="55.5625"
-         id="rect8983-1"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:1.05833327,1.05833327;stroke-dashoffset:0;stroke-opacity:1" />
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="177.27084"
-         y="128.98961"
-         id="text823-4-2-9-4-7-9-85-3"><tspan
-           sodipodi:role="line"
-           x="177.27084"
-           y="128.98961"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3">Legend</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="135.6042"
-         id="text823-4-2-9-4-7-9-85-3-6"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="135.6042"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4">Image Pixel Data</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="143.5417"
-         id="text823-4-2-9-4-7-9-85-3-6-5"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="143.5417"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4-2">Sparse Memory Block</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="151.4792"
-         id="text823-4-2-9-4-7-9-85-3-6-6"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="151.4792"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4-1">Mip Tail Data</tspan></text>
-      <path
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="M 11.90626,21.833365 H 64.822927 V 74.750031 H 11.90626 Z m 5.291667,0 V 74.750031 M 27.78126,21.833365 v 52.916666 m -5.291667,0 V 21.833365 m 10.583334,0 v 52.916666 m 5.291666,0 V 21.833365 m 5.291667,0 v 52.916666 m 5.291667,0 V 21.833365 m 5.291666,0 v 52.916666 m 5.291667,0 V 21.833365 m 5.291667,5.291666 H 11.90626 m 0,5.291667 h 52.916667 m 0,5.291667 H 11.90626 m 0,5.291666 h 52.916667 m 0,5.291667 H 11.90626 m 0,5.291667 h 52.916667 m 0,5.291666 H 11.90626 m 0,5.291667 h 52.916667 m 0,5.291667 H 11.90626"
-         id="path1236"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="M 70.114593,21.833366 H 123.03125 V 74.750031 H 70.114593 Z m 5.29167,0 V 74.750031 M 85.989596,21.833366 v 52.916665 m -5.291669,0 V 21.833366 m 10.583336,0 v 52.916665 m 5.291661,0 V 21.833366 m 5.291666,0 v 52.916665 m 5.29167,0 V 21.833366 m 5.29166,0 v 52.916665 m 5.29167,0 V 21.833366 m 5.29166,5.291666 H 70.114593 m 0,5.291666 h 52.916657 m 0,5.291667 H 70.114593 m 0,5.291666 h 52.916657 m 0,5.291667 H 70.114593 m 0,5.291667 h 52.916657 m 0,5.291666 H 70.114593 m 0,5.291667 h 52.916657 m 0,5.291667 H 70.114593"
-         id="path1236-3"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 128.32292,21.833365 h 52.91667 v 52.916666 h -52.91667 z m 5.29167,0 v 52.916666 m 10.58333,-52.916666 v 52.916666 m -5.29166,0 V 21.833365 m 10.58333,0 v 52.916666 m 5.29167,0 V 21.833365 m 5.29166,0 v 52.916666 m 5.29167,0 V 21.833365 m 5.29167,0 v 52.916666 m 5.29166,0 V 21.833365 m 5.29167,5.291666 h -52.91667 m 0,5.291667 h 52.91667 m 0,5.291667 h -52.91667 m 0,5.291666 h 52.91667 m 0,5.291667 h -52.91667 m 0,5.291667 h 52.91667 m 0,5.291666 h -52.91667 m 0,5.291667 h 52.91667 m 0,5.291667 h -52.91667"
-         id="path1236-1"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path1299"
-         d="M 11.90626,80.041698 H 38.364398 V 106.49984 H 11.90626 Z m 5.291628,0 V 106.49984 M 22.489515,80.041698 V 106.49984 M 27.781142,80.041698 V 106.49984 M 33.07277,80.041698 v 26.458142 m -21.16651,-5.29163 h 26.458138 m 0,-5.291628 H 11.90626 m 0,-5.291627 h 26.458138 m 0,-5.29163 H 11.90626"
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path1299-5"
-         d="M 70.114593,80.041698 H 96.572734 V 106.49984 H 70.114593 Z m 5.29163,0 V 106.49984 M 80.69785,80.041698 v 26.458142 m 5.291627,-26.458142 v 26.458142 m 5.291627,-26.458142 v 26.458142 m -21.166511,-5.29163 h 26.458141 m 0,-5.291628 H 70.114593 m 0,-5.291627 h 26.458141 m 0,-5.29163 H 70.114593"
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-      <path
-         id="path1299-7"
-         d="m 128.32292,80.041698 h 26.45814 v 26.458142 h -26.45814 z m 5.29163,0 v 26.458142 m 5.29163,-26.458142 v 26.458142 m 5.29162,-26.458142 v 26.458142 m 5.29163,-26.458142 v 26.458142 m -21.16651,-5.29163 h 26.45814 m 0,-5.291628 h -26.45814 m 0,-5.291627 h 26.45814 m 0,-5.29163 h -26.45814"
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#ff0000;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 11.90626,148.83337 h 10.583332 v 5.29167 H 11.90626 Z m 5.291667,0 v 5.29167"
-         id="path1160"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833334, 1.05833334;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 18.52084,143.54172 h 3.96875 V 132.95838 H 11.90626 v 3.96875 m 5.29166,0 v -3.96875 m 1.32292,5.29167 h 3.96875"
-         id="path1094-0"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 17.19792,143.54172 v -6.61459 m 1.32292,1.32292 h -6.61458 m 6.61458,5.29167 h -6.61458 v -6.61459 h 6.61458 v 6.61459"
-         id="path1111-1"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 11.90626,114.43753 v 13.22916 H 25.13542 V 114.43753 H 11.90626 m 5.291659,0 v 13.22916 m 5.291671,0 v -13.22916 m -10.58333,2.64584 h 13.22916 m -13.22916,5.29166 h 13.22916"
-         id="path1124-3"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833335, 1.05833335;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 25.13543,127.66669 h 2.645831 V 111.7917 H 11.90626 v 2.64584 m 5.29167,-2.64584 v 2.64584 m 5.29166,-2.64584 v 2.64584 m 5.291671,2.64583 H 25.13543 m 2.645831,5.29166 H 25.13543"
-         id="path1141-9"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#ff0000;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 70.114594,148.83338 h 10.583332 v 5.29167 H 70.114594 Z m 5.291666,0 v 5.29167"
-         id="path1160-3"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833335, 1.05833335;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 76.729174,143.54171 h 3.96875 v -10.58334 h -10.58333 v 3.96875 m 5.29166,0 v -3.96875 m 1.32292,5.29167 h 3.96875"
-         id="path1094-0-5"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 75.406254,143.54171 v -6.61459 m 1.32292,1.32292 h -6.61458 m 6.61458,5.29167 h -6.61458 v -6.61459 h 6.61458 v 6.61459"
-         id="path1111-1-6"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 70.114594,114.43754 v 13.22916 h 13.22916 v -13.22916 h -13.22916 m 5.291659,0 v 13.22916 m 5.291671,0 v -13.22916 m -10.58333,2.64584 h 13.22916 m -13.22916,5.29166 h 13.22916"
-         id="path1124-3-4"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833336, 1.05833336;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 83.343764,127.6667 h 2.645831 V 111.79171 H 70.114594 v 2.64584 m 5.29167,-2.64584 v 2.64584 m 5.29166,-2.64584 v 2.64584 m 5.291671,2.64583 h -2.645831 m 2.645831,5.29166 h -2.645831"
-         id="path1141-9-1"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#ff0000;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 128.32293,148.83338 h 10.58333 v 5.29167 h -10.58333 z m 5.29167,0 v 5.29167"
-         id="path1160-0"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833335, 1.05833335;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 134.93751,143.54171 h 3.96875 v -10.58334 h -10.58333 v 3.96875 m 5.29166,0 v -3.96875 m 1.32292,5.29167 h 3.96875"
-         id="path1094-0-9"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 133.61459,143.54171 v -6.61459 m 1.32292,1.32292 h -6.61458 m 6.61458,5.29167 h -6.61458 v -6.61459 h 6.61458 v 6.61459"
-         id="path1111-1-1"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 128.32293,114.43754 v 13.22916 h 13.22916 v -13.22916 h -13.22916 m 5.29166,0 v 13.22916 m 5.29167,0 v -13.22916 m -10.58333,2.64584 h 13.22916 m -13.22916,5.29166 h 13.22916"
-         id="path1124-3-5"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833336, 1.05833336;stroke-dashoffset:0;stroke-opacity:1"
-         d="m 141.5521,127.6667 h 2.64583 v -15.87499 h -15.875 v 2.64584 m 5.29167,-2.64584 v 2.64584 m 5.29166,-2.64584 v 2.64584 m 5.29167,2.64583 h -2.64583 m 2.64583,5.29166 h -2.64583"
-         id="path1141-9-5"
-         inkscape:connector-curvature="0" />
-    </g>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/sparseimage_alignedmipsize.svg b/registry/vulkan/images/sparseimage_alignedmipsize.svg
deleted file mode 100644
index db50839..0000000
--- a/registry/vulkan/images/sparseimage_alignedmipsize.svg
+++ /dev/null
@@ -1,270 +0,0 @@
-<?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"
-   width="213.37727mm"
-   height="126.98255mm"
-   viewBox="0 0 213.37728 126.98255"
-   version="1.1"
-   id="svg5072"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="sparseimage_alignedmipsize.svg">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.4"
-     inkscape:cx="320.51149"
-     inkscape:cy="359.79403"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:measure-start="50,1040"
-     inkscape:measure-end="50,900"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     fit-margin-left="1"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="1672"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid5617"
-       originx="5.8699868"
-       originy="-154.97188" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5069">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(5.8699862,-15.045569)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="39.6875"
-       y="19.1875"
-       id="text7094"><tspan
-         sodipodi:role="line"
-         id="tspan7092"
-         x="39.6875"
-         y="19.1875"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Array Layer 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="97.895836"
-       y="19.187496"
-       id="text7094-5"><tspan
-         sodipodi:role="line"
-         id="tspan7092-3"
-         x="97.895836"
-         y="19.187496"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Array Layer 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="156.10417"
-       y="19.187496"
-       id="text7094-6"><tspan
-         sodipodi:role="line"
-         id="tspan7092-0"
-         x="156.10417"
-         y="19.187496"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Array Layer 2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="48.291668"
-       id="text7094-67"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="48.291668"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="53.583336"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156">Level 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="93.270836"
-       id="text7094-67-1"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="93.270836"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152-2">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="98.5625"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-6">Level 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458337"
-       y="127.66666"
-       id="text7094-67-2-1"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="127.66666"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-0-4">Mip Tail</tspan></text>
-    <g
-       transform="translate(1.3229068,-13.229199)"
-       id="g1301">
-      <rect
-         y="147.51044"
-         x="150.8125"
-         height="5.2916665"
-         width="5.2916665"
-         id="rect6319-7-9-4"
-         style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="139.57294"
-         x="150.8125"
-         height="5.2916675"
-         width="5.2916675"
-         id="rect5619-4-1-6-6-0-6-8"
-         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:1.05999995,1.05999995;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="131.63542"
-         x="150.8125"
-         height="5.2916675"
-         width="5.2916675"
-         id="rect5619-6-8-6-5-2"
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="125.02087"
-         x="149.48959"
-         height="29.104164"
-         width="55.5625"
-         id="rect8983-1"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.265;stroke-miterlimit:4;stroke-dasharray:1.06,1.06;stroke-dashoffset:0;stroke-opacity:1" />
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="177.27084"
-         y="128.98961"
-         id="text823-4-2-9-4-7-9-85-3"><tspan
-           sodipodi:role="line"
-           x="177.27084"
-           y="128.98961"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3">Legend</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="135.6042"
-         id="text823-4-2-9-4-7-9-85-3-6"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="135.6042"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4">Image Pixel Data</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="143.5417"
-         id="text823-4-2-9-4-7-9-85-3-6-5"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="143.5417"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4-2">Sparse Memory Block</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="151.4792"
-         id="text823-4-2-9-4-7-9-85-3-6-6"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="151.4792"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4-1">Mip Tail Data</tspan></text>
-    </g>
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 13.229167,21.833334 H 66.145833 V 74.75 H 13.229167 Z m 5.291667,0 V 74.75 M 29.104167,21.833334 V 74.75 m -5.291667,0 V 21.833334 m 10.583334,0 V 74.75 m 5.291666,0 V 21.833334 m 5.291666,0 V 74.75 m 5.291667,0 V 21.833334 m 5.291667,0 V 74.75 m 5.291666,0 V 21.833334 M 66.145833,27.125 H 13.229167 m 0,5.291667 h 52.916666 m 0,5.291667 H 13.229167 m 0,5.291666 h 52.916666 m 0,5.291667 H 13.229167 m 0,5.291667 h 52.916666 m 0,5.291666 H 13.229167 m 0,5.291667 h 52.916666 m 0,5.291667 H 13.229167"
-       id="path1236"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 71.437501,21.833335 H 124.35416 V 74.75 H 71.437501 Z m 5.291667,0 V 74.75 M 87.312501,21.833335 V 74.75 m -5.291667,0 V 21.833335 m 10.583334,0 V 74.75 m 5.291666,0 V 21.833335 m 5.291666,0 V 74.75 m 5.29167,0 V 21.833335 m 5.29166,0 V 74.75 m 5.29167,0 V 21.833335 m 5.29166,5.291666 H 71.437501 m 0,5.291666 h 52.916659 m 0,5.291667 H 71.437501 m 0,5.291666 h 52.916659 m 0,5.291667 H 71.437501 m 0,5.291667 h 52.916659 m 0,5.291666 H 71.437501 m 0,5.291667 h 52.916659 m 0,5.291667 H 71.437501"
-       id="path1236-3"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 129.64583,21.833334 H 182.5625 V 74.75 h -52.91667 z m 5.29167,0 V 74.75 M 145.52083,21.833334 V 74.75 m -5.29166,0 V 21.833334 m 10.58333,0 V 74.75 m 5.29167,0 V 21.833334 m 5.29166,0 V 74.75 m 5.29167,0 V 21.833334 m 5.29167,0 V 74.75 m 5.29166,0 V 21.833334 M 182.5625,27.125 h -52.91667 m 0,5.291667 h 52.91667 m 0,5.291667 h -52.91667 m 0,5.291666 h 52.91667 m 0,5.291667 h -52.91667 m 0,5.291667 h 52.91667 m 0,5.291666 h -52.91667 m 0,5.291667 h 52.91667 m 0,5.291667 h -52.91667"
-       id="path1236-1"
-       inkscape:connector-curvature="0" />
-    <path
-       id="path1299"
-       d="M 13.229167,80.041667 H 39.687305 V 106.49981 H 13.229167 Z m 5.291628,0 v 26.458143 m 5.291627,-26.458143 v 26.458143 m 5.291627,-26.458143 v 26.458143 m 5.291628,-26.458143 v 26.458143 m -21.16651,-5.29163 h 26.458138 m 0,-5.291631 H 13.229167 m 0,-5.291627 h 26.458138 m 0,-5.291628 H 13.229167"
-       style="fill:#808080;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
-       inkscape:connector-curvature="0" />
-    <path
-       id="path1299-5"
-       d="M 71.437501,80.041667 H 97.895639 V 106.49981 H 71.437501 Z m 5.291628,0 v 26.458143 m 5.291627,-26.458143 v 26.458143 m 5.291627,-26.458143 v 26.458143 m 5.291628,-26.458143 v 26.458143 m -21.16651,-5.29163 h 26.458138 m 0,-5.291631 H 71.437501 m 0,-5.291627 h 26.458138 m 0,-5.291628 H 71.437501"
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       inkscape:connector-curvature="0" />
-    <path
-       id="path1299-7"
-       d="m 129.64583,80.041667 h 26.45814 v 26.458143 h -26.45814 z m 5.29163,0 v 26.458143 m 5.29163,-26.458143 v 26.458143 m 5.29162,-26.458143 v 26.458143 m 5.29163,-26.458143 v 26.458143 m -21.16651,-5.29163 h 26.45814 m 0,-5.291631 h -26.45814 m 0,-5.291627 h 26.45814 m 0,-5.291628 h -26.45814"
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       inkscape:connector-curvature="0" />
-    <path
-       id="path1299-6"
-       d="m 13.229167,111.79167 15.875001,-3e-5 v 26.45815 l -15.875001,3e-5 z m 5.291629,0 v 26.45815 m 5.291627,-26.45815 v 26.45815 m -10.583256,-5.29163 15.875001,-3e-5 m 0,-5.29164 -15.875001,3e-5 m 0,-5.29162 15.875001,-3e-5 m 0,-5.29163 -15.875001,3e-5"
-       style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccc" />
-    <path
-       id="path1299-6-4"
-       d="m 71.437501,111.79167 15.875001,-3e-5 v 26.45815 l -15.875001,3e-5 z m 5.291628,0 v 26.45815 m 5.291628,-26.45815 v 26.45815 m -10.583256,-5.29163 15.875001,-3e-5 m 0,-5.29164 -15.875001,3e-5 m 0,-5.29162 15.875001,-3e-5 m 0,-5.29163 -15.875001,3e-5"
-       style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccc" />
-    <path
-       id="path1299-6-8"
-       d="m 129.64583,111.79167 15.875,-3e-5 v 26.45815 l -15.875,3e-5 z m 5.29163,0 v 26.45815 m 5.29162,-26.45815 v 26.45815 m -10.58325,-5.29163 15.875,-3e-5 m 0,-5.29164 -15.875,3e-5 m 0,-5.29162 15.875,-3e-5 m 0,-5.29163 -15.875,3e-5"
-       style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccc" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/sparseimage_alignedmipsize_singlemiptail.svg b/registry/vulkan/images/sparseimage_alignedmipsize_singlemiptail.svg
deleted file mode 100644
index 74707a3..0000000
--- a/registry/vulkan/images/sparseimage_alignedmipsize_singlemiptail.svg
+++ /dev/null
@@ -1,260 +0,0 @@
-<?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"
-   width="213.37727mm"
-   height="126.98255mm"
-   viewBox="0 0 213.37728 126.98255"
-   version="1.1"
-   id="svg5072"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="sparseimage_alignedmipsize_singlemiptail.svg">
-  <defs
-     id="defs5066" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.4"
-     inkscape:cx="386.2212"
-     inkscape:cy="333.12919"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:measure-start="50,1040"
-     inkscape:measure-end="50,900"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     fit-margin-left="1"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="-8"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid5617"
-       originx="5.8699868"
-       originy="-154.97188" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5069">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(5.8699862,-15.045569)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="39.6875"
-       y="19.1875"
-       id="text7094"><tspan
-         sodipodi:role="line"
-         id="tspan7092"
-         x="39.6875"
-         y="19.1875"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Array Layer 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="97.895836"
-       y="19.187496"
-       id="text7094-5"><tspan
-         sodipodi:role="line"
-         id="tspan7092-3"
-         x="97.895836"
-         y="19.187496"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Array Layer 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="156.10417"
-       y="19.187496"
-       id="text7094-6"><tspan
-         sodipodi:role="line"
-         id="tspan7092-0"
-         x="156.10417"
-         y="19.187496"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Array Layer 2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="48.291668"
-       id="text7094-67"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="48.291668"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="53.583336"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156">Level 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="93.270836"
-       id="text7094-67-1"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="93.270836"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152-2">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="98.5625"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-6">Level 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458337"
-       y="127.66666"
-       id="text7094-67-2-1"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="127.66666"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-0-4">Mip Tail</tspan></text>
-    <g
-       transform="translate(1.3229068,-13.229199)"
-       id="g1301">
-      <rect
-         y="147.51044"
-         x="150.8125"
-         height="5.2916665"
-         width="5.2916665"
-         id="rect6319-7-9-4"
-         style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="139.57294"
-         x="150.8125"
-         height="5.2916675"
-         width="5.2916675"
-         id="rect5619-4-1-6-6-0-6-8"
-         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:1.05833327,1.05833327;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="131.63542"
-         x="150.8125"
-         height="5.2916675"
-         width="5.2916675"
-         id="rect5619-6-8-6-5-2"
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="125.02087"
-         x="149.48959"
-         height="29.104164"
-         width="55.5625"
-         id="rect8983-1"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:1.05999995,1.05999995;stroke-dashoffset:0;stroke-opacity:1" />
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="177.27084"
-         y="128.98961"
-         id="text823-4-2-9-4-7-9-85-3"><tspan
-           sodipodi:role="line"
-           x="177.27084"
-           y="128.98961"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3">Legend</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="135.6042"
-         id="text823-4-2-9-4-7-9-85-3-6"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="135.6042"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4">Image Pixel Data</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="143.5417"
-         id="text823-4-2-9-4-7-9-85-3-6-5"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="143.5417"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4-2">Sparse Memory Block</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="151.4792"
-         id="text823-4-2-9-4-7-9-85-3-6-6"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="151.4792"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4-1">Mip Tail Data</tspan></text>
-    </g>
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 13.229167,21.833334 H 66.145833 V 74.75 H 13.229167 Z m 5.291667,0 V 74.75 M 29.104167,21.833334 V 74.75 m -5.291667,0 V 21.833334 m 10.583334,0 V 74.75 m 5.291666,0 V 21.833334 m 5.291666,0 V 74.75 m 5.291667,0 V 21.833334 m 5.291667,0 V 74.75 m 5.291666,0 V 21.833334 M 66.145833,27.125 H 13.229167 m 0,5.291666 h 52.916666 m 0,5.291667 H 13.229167 m 0,5.291666 h 52.916666 m 0,5.291667 H 13.229167 m 0,5.291668 h 52.916666 m 0,5.291666 H 13.229167 m 0,5.291667 h 52.916666 m 0,5.291667 H 13.229167"
-       id="path1236"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 71.4375,21.833335 h 52.91666 V 74.75 H 71.4375 Z m 5.291669,0 V 74.75 M 87.312502,21.833335 V 74.75 m -5.291669,0 V 21.833335 m 10.583336,0 V 74.75 m 5.291664,0 V 21.833335 m 5.291667,0 V 74.75 m 5.29167,0 V 21.833335 m 5.29166,0 V 74.75 m 5.29167,0 V 21.833335 m 5.29166,5.291666 H 71.4375 m 0,5.291665 h 52.91666 m 0,5.291667 H 71.4375 m 0,5.291666 h 52.91666 m 0,5.291667 H 71.4375 m 0,5.291668 h 52.91666 m 0,5.291666 H 71.4375 m 0,5.291667 h 52.91666 m 0,5.291667 H 71.4375"
-       id="path1236-3"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 129.64583,21.833334 H 182.5625 V 74.75 h -52.91667 z m 5.29167,0 V 74.75 M 145.52083,21.833334 V 74.75 m -5.29166,0 V 21.833334 m 10.58333,0 V 74.75 m 5.29167,0 V 21.833334 m 5.29166,0 V 74.75 m 5.29167,0 V 21.833334 m 5.29167,0 V 74.75 m 5.29166,0 V 21.833334 M 182.5625,27.125 h -52.91667 m 0,5.291666 h 52.91667 m 0,5.291667 h -52.91667 m 0,5.291666 h 52.91667 m 0,5.291667 h -52.91667 m 0,5.291668 h 52.91667 m 0,5.291666 h -52.91667 m 0,5.291667 h 52.91667 m 0,5.291667 h -52.91667"
-       id="path1236-1"
-       inkscape:connector-curvature="0" />
-    <path
-       id="path1299"
-       d="M 13.229167,80.041667 H 39.687304 V 106.49981 H 13.229167 Z m 5.291628,0 v 26.458143 m 5.291627,-26.458143 v 26.458143 m 5.291627,-26.458143 v 26.458143 m 5.291628,-26.458143 v 26.458143 m -21.16651,-5.29163 h 26.458137 m 0,-5.291629 H 13.229167 m 0,-5.291627 h 26.458137 m 0,-5.29163 H 13.229167"
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       inkscape:connector-curvature="0" />
-    <path
-       id="path1299-5"
-       d="M 71.4375,80.041667 H 97.895643 V 106.49981 H 71.4375 Z m 5.291629,0 V 106.49981 M 82.020756,80.041667 V 106.49981 M 87.312383,80.041667 V 106.49981 M 92.60401,80.041667 V 106.49981 M 71.4375,101.20818 h 26.458143 m 0,-5.291629 H 71.4375 m 0,-5.291627 h 26.458143 m 0,-5.29163 H 71.4375"
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       inkscape:connector-curvature="0" />
-    <path
-       id="path1299-7"
-       d="m 129.64583,80.041667 h 26.45814 v 26.458143 h -26.45814 z m 5.29163,0 v 26.458143 m 5.29163,-26.458143 v 26.458143 m 5.29162,-26.458143 v 26.458143 m 5.29163,-26.458143 v 26.458143 m -21.16651,-5.29163 h 26.45814 m 0,-5.291629 h -26.45814 m 0,-5.291627 h 26.45814 m 0,-5.29163 h -26.45814"
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 13.229167,111.79167 h 47.625 V 138.25 h -47.625 z m 5.291667,0 V 138.25 M 29.104167,111.79167 V 138.25 m -5.291667,0 v -26.45833 m 10.583334,0 V 138.25 m 5.291666,0 v -26.45833 m 5.291666,0 V 138.25 m 5.291667,0 v -26.45833 m 5.291667,0 V 138.25 m 5.291667,-21.16666 h -47.625 m 0,5.29166 h 47.625 m 0,5.29167 h -47.625 m 0,5.29167 h 47.625"
-       id="path1236-7"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccccccccccccccc" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/sparseimage_multiaspect.svg b/registry/vulkan/images/sparseimage_multiaspect.svg
deleted file mode 100644
index 810fbf6..0000000
--- a/registry/vulkan/images/sparseimage_multiaspect.svg
+++ /dev/null
@@ -1,339 +0,0 @@
-<?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"
-   width="163.10645mm"
-   height="156.29341mm"
-   viewBox="0 0 163.10645 156.29341"
-   version="1.1"
-   id="svg5072"
-   sodipodi:docname="sparseimage_multiaspect.svg"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)">
-  <defs
-     id="defs5066" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.4142136"
-     inkscape:cx="287.95243"
-     inkscape:cy="224.95974"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:measure-start="50,1040"
-     inkscape:measure-end="50,900"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     fit-margin-left="1"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="1672"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0"
-     showguides="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid5617"
-       originx="5.8699862"
-       originy="-125.73543" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5069">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(5.8699859,-14.971155)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="39.6875"
-       y="19.1875"
-       id="text7094"><tspan
-         sodipodi:role="line"
-         id="tspan7092"
-         x="39.6875"
-         y="19.1875"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Depth</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="97.895836"
-       y="19.187496"
-       id="text7094-5"><tspan
-         sodipodi:role="line"
-         id="tspan7092-3"
-         x="97.895836"
-         y="19.187496"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Stencil</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="48.291668"
-       id="text7094-67"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="48.291668"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="53.583336"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156">Level 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="93.270836"
-       id="text7094-67-1"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="93.270836"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152-2">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="98.5625"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-6">Level 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.645834"
-       y="148.83334"
-       id="text7094-67-2"><tspan
-         sodipodi:role="line"
-         x="2.645834"
-         y="148.83334"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152-4">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458342"
-         y="154.12502"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-0">Level 3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458337"
-       y="125.02084"
-       id="text7094-67-2-8"><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="125.02084"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152-4-0">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.645834"
-         y="130.31252"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-0-1">Level 2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.645834"
-       y="170"
-       id="text7094-67-2-1"><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="170"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-0-4">Mip Tail</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="142.875"
-       y="78.71875"
-       id="text7094-67-2-1-1"><tspan
-         sodipodi:role="line"
-         x="142.875"
-         y="78.71875"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-0-4-5">Mip Tail</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="142.875"
-       y="19.187498"
-       id="text7094-4"><tspan
-         sodipodi:role="line"
-         id="tspan7092-8"
-         x="142.875"
-         y="19.187498"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Metadata</tspan></text>
-    <g
-       transform="translate(-48.947927,15.874963)"
-       id="g1301">
-      <rect
-         y="147.51044"
-         x="150.8125"
-         height="5.2916665"
-         width="5.2916665"
-         id="rect6319-7-9-4"
-         style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="139.57294"
-         x="150.8125"
-         height="5.2916675"
-         width="5.2916675"
-         id="rect5619-4-1-6-6-0-6-8"
-         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:1.05999995,1.05999995;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="131.63542"
-         x="150.8125"
-         height="5.2916675"
-         width="5.2916675"
-         id="rect5619-6-8-6-5-2"
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="125.02087"
-         x="149.48959"
-         height="29.104164"
-         width="55.5625"
-         id="rect8983-1"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:1.05833327,1.05833327;stroke-dashoffset:0;stroke-opacity:1" />
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="177.27084"
-         y="128.98961"
-         id="text823-4-2-9-4-7-9-85-3"><tspan
-           sodipodi:role="line"
-           x="177.27084"
-           y="128.98961"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3">Legend</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="135.6042"
-         id="text823-4-2-9-4-7-9-85-3-6"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="135.6042"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4">Image Pixel Data</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="143.5417"
-         id="text823-4-2-9-4-7-9-85-3-6-5"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="143.5417"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4-2">Sparse Memory Block</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="151.4792"
-         id="text823-4-2-9-4-7-9-85-3-6-6"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="151.4792"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4-1">Mip Tail Data</tspan></text>
-    </g>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26499999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05999995, 1.05999995;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 84.666666,138.25 h 7.9375 V 117.08333 H 71.437499 v 7.9375 m 10.583336,0 v -7.9375 m 2.645833,10.58334 h 7.9375"
-       id="path1094"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 82.020834,138.25 v -13.22917 m 2.645833,2.64584 H 71.4375 M 84.666665,138.25 H 71.437498 V 125.02083 H 84.666667 V 138.25"
-       id="path1111"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 71.437498,85.333322 V 111.79166 H 97.895831 V 85.333322 H 71.437498 m 10.583336,0 v 26.458338 m 10.583333,0 V 85.333322 M 71.4375,90.624992 H 97.895834 M 71.4375,101.20833 h 26.458334"
-       id="path1124"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833328, 1.05833328;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 97.89584,111.79166 h 5.29166 V 80.041662 H 71.437502 v 5.29167 m 10.583336,-5.29167 v 5.29167 m 10.583334,-5.29167 v 5.29167 m 10.583328,5.29166 h -5.29166 m 5.29166,10.583338 h -5.29166"
-       id="path1141"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#ff0000;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 71.437498,159.41666 h 21.166667 v 10.58333 H 71.437498 Z m 10.583336,0 0,10.58334"
-       id="path1158"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#ff0000;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 13.229167,164.70833 h 10.583332 v 5.29166 H 13.229167 Z m 5.291667,0 0,5.29167"
-       id="path1160"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833333, 1.05833333;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 19.843747,154.125 h 3.96875 v -10.58334 h -10.58333 v 3.96875 m 5.29166,0 v -3.96875 m 1.32292,5.29167 h 3.96875"
-       id="path1094-0"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 18.520827,154.125 v -6.61459 m 1.32292,1.32292 h -6.61458 m 6.61458,5.29167 h -6.61458 v -6.61459 h 6.61458 v 6.61459"
-       id="path1111-1"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 13.229167,119.72916 v 13.22917 H 26.458326 V 119.72916 H 13.229167 m 5.291659,0 v 13.22917 m 5.291671,0 v -13.22917 m -10.58333,2.64584 h 13.229159 m -13.229159,5.29167 h 13.229159"
-       id="path1124-3"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833334, 1.05833334;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 26.458337,132.95833 h 2.64583 v -15.875 h -15.875 v 2.64584 m 5.29167,-2.64584 v 2.64584 m 5.29166,-2.64584 v 2.64584 m 5.29167,2.64583 h -2.64583 m 2.64583,5.29167 h -2.64583"
-       id="path1141-9"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 13.229167,80.041662 H 39.6875 V 106.5 H 13.229167 V 80.041662 m 5.291667,0 V 106.5 M 23.8125,80.041662 V 106.5 M 29.104167,80.041662 V 106.5 M 34.395834,80.041662 V 106.5 M 13.229167,101.20833 H 39.6875 m 0,-5.291668 H 13.229167 m 0,-5.291667 H 39.6875 m 0,-5.291666 H 13.229167"
-       id="path1204"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;stroke:#000000;stroke-width:0.26458333;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
-       d="m 71.4375,21.83333 h 52.91667 V 74.750015 H 71.4375 V 21.83333 m 10.583334,0 V 74.750015 M 92.604166,21.83333 V 74.750015 M 103.1875,21.83333 V 74.750015 M 113.77084,21.83333 V 74.750015 M 71.4375,64.166665 h 52.91667 m 0,-10.583335 H 71.4375 m 0,-10.583334 h 52.91667 m 0,-10.583332 H 71.4375"
-       id="path1204-2"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
-       d="M 13.229167,21.83333 H 66.145833 V 74.749996 H 13.229167 Z m 5.291667,0 V 74.749996 M 29.104167,21.83333 v 52.916666 m -5.291667,0 V 21.83333 m 10.583334,0 v 52.916666 m 5.291666,0 V 21.83333 m 5.291667,0 v 52.916666 m 5.291666,0 V 21.83333 m 5.291667,0 v 52.916666 m 5.291667,0 V 21.83333 m 5.291666,5.291666 H 13.229167 m 0,5.291667 h 52.916666 m 0,5.291667 H 13.229167 m 0,5.291666 h 52.916666 m 0,5.291667 H 13.229167 m 0,5.291667 h 52.916666 m 0,5.291666 H 13.229167 m 0,5.291667 h 52.916666 m 0,5.291667 H 13.229167"
-       id="path1236"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.64583,21.83333 h 26.45834 v 52.916664 h -26.45834 z m 5.29167,0 V 74.749994 M 145.52083,21.83333 v 52.916664 m -5.29167,0 V 21.83333 m 10.58334,0 v 52.916664 m 5.29167,-47.624998 h -26.45834 m 0,5.291667 h 26.45834 m 0,5.291667 h -26.45834 m 0,5.291666 h 26.45834 m 0,5.291668 h -26.45834 m 0,5.29167 h 26.45834 m 0,5.29166 h -26.45834 m 0,5.29167 h 26.45834 m 0,5.29167 h -26.45834"
-       id="path1236-8"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccccccccccccccccc" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/sparseimage_singlemiptail.svg b/registry/vulkan/images/sparseimage_singlemiptail.svg
deleted file mode 100644
index 70533e0..0000000
--- a/registry/vulkan/images/sparseimage_singlemiptail.svg
+++ /dev/null
@@ -1,352 +0,0 @@
-<?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"
-   width="213.37727mm"
-   height="140.93106mm"
-   viewBox="0 0 213.37728 140.93106"
-   version="1.1"
-   id="svg5072"
-   sodipodi:docname="sparseimage_singlemiptail.svg"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)">
-  <defs
-     id="defs5066" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.4"
-     inkscape:cx="395.52786"
-     inkscape:cy="210.32605"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:measure-start="50,1040"
-     inkscape:measure-end="50,900"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-grids="true"
-     inkscape:snap-text-baseline="true"
-     fit-margin-left="1"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="1672"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid5617"
-       originx="5.869987"
-       originy="-141.02337" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5069">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(5.8699864,-15.045569)">
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="39.6875"
-       y="19.1875"
-       id="text7094"><tspan
-         sodipodi:role="line"
-         id="tspan7092"
-         x="39.6875"
-         y="19.1875"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Array Layer 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="97.895836"
-       y="19.187496"
-       id="text7094-5"><tspan
-         sodipodi:role="line"
-         id="tspan7092-3"
-         x="97.895836"
-         y="19.187496"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Array Layer 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="156.10417"
-       y="19.187496"
-       id="text7094-6"><tspan
-         sodipodi:role="line"
-         id="tspan7092-0"
-         x="156.10417"
-         y="19.187496"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">Array Layer 2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="48.291668"
-       id="text7094-67"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="48.291668"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="53.583336"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156">Level 0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="93.270836"
-       id="text7094-67-1"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="93.270836"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152-2">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="98.5625"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-6">Level 1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="138.25"
-       id="text7094-67-2"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="138.25"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152-4">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="143.54167"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-0">Level 3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="119.72918"
-       id="text7094-67-2-8"><tspan
-         sodipodi:role="line"
-         x="2.6458335"
-         y="119.72918"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7152-4-0">Mip</tspan><tspan
-         sodipodi:role="line"
-         x="2.6458337"
-         y="125.02084"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-0-1">Level 2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="2.6458335"
-       y="154.125"
-       id="text7094-67-2-1"><tspan
-         sodipodi:role="line"
-         x="2.6458333"
-         y="154.125"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-         id="tspan7156-0-4">Mip Tail</tspan></text>
-    <g
-       transform="translate(1.3229071,-3.1985317e-5)"
-       id="g1301">
-      <rect
-         y="147.51044"
-         x="150.8125"
-         height="5.2916665"
-         width="5.2916665"
-         id="rect6319-7-9-4"
-         style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="139.57294"
-         x="150.8125"
-         height="5.2916675"
-         width="5.2916675"
-         id="rect5619-4-1-6-6-0-6-8"
-         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.26499999;stroke-miterlimit:4;stroke-dasharray:1.05999995,1.05999995;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="131.63542"
-         x="150.8125"
-         height="5.2916675"
-         width="5.2916675"
-         id="rect5619-6-8-6-5-2"
-         style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         y="125.02087"
-         x="149.48959"
-         height="29.104164"
-         width="55.5625"
-         id="rect8983-1"
-         style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-miterlimit:4;stroke-dasharray:1.05833327,1.05833327;stroke-dashoffset:0;stroke-opacity:1" />
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="177.27084"
-         y="128.98961"
-         id="text823-4-2-9-4-7-9-85-3"><tspan
-           sodipodi:role="line"
-           x="177.27084"
-           y="128.98961"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3">Legend</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="135.6042"
-         id="text823-4-2-9-4-7-9-85-3-6"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="135.6042"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4">Image Pixel Data</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="143.5417"
-         id="text823-4-2-9-4-7-9-85-3-6-5"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="143.5417"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4-2">Sparse Memory Block</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499"
-         x="157.42709"
-         y="151.4792"
-         id="text823-4-2-9-4-7-9-85-3-6-6"><tspan
-           sodipodi:role="line"
-           x="157.42709"
-           y="151.4792"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.39687499"
-           id="tspan825-6-0-2-5-6-26-7-3-4-1">Mip Tail Data</tspan></text>
-    </g>
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 13.229167,21.833333 H 66.145834 V 74.749999 H 13.229167 Z m 5.291667,0 V 74.749999 M 29.104168,21.833333 v 52.916666 m -5.291668,0 V 21.833333 m 10.583334,0 v 52.916666 m 5.291667,0 V 21.833333 m 5.291666,0 v 52.916666 m 5.291667,0 V 21.833333 m 5.291667,0 v 52.916666 m 5.291666,0 V 21.833333 m 5.291667,5.291666 H 13.229167 m 0,5.291667 h 52.916667 m 0,5.291667 H 13.229167 m 0,5.291666 h 52.916667 m 0,5.291667 H 13.229167 m 0,5.291667 h 52.916667 m 0,5.291666 H 13.229167 m 0,5.291667 h 52.916667 m 0,5.291667 H 13.229167"
-       id="path1236"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 71.437501,21.833334 H 124.35417 V 74.749999 H 71.437501 Z m 5.291669,0 V 74.749999 M 87.312503,21.833334 v 52.916665 m -5.291669,0 V 21.833334 m 10.583336,0 v 52.916665 m 5.291657,0 V 21.833334 m 5.291673,0 v 52.916665 m 5.29167,0 V 21.833334 m 5.29166,0 v 52.916665 m 5.29168,0 V 21.833334 M 124.35417,27.125 H 71.437501 m 0,5.291666 h 52.916669 m 0,5.291667 H 71.437501 m 0,5.291666 h 52.916669 m 0,5.291667 H 71.437501 m 0,5.291667 h 52.916669 m 0,5.291666 H 71.437501 m 0,5.291667 h 52.916669 m 0,5.291667 H 71.437501"
-       id="path1236-3"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.64584,21.833333 h 52.91667 v 52.916666 h -52.91667 z m 5.29167,0 v 52.916666 m 10.58333,-52.916666 v 52.916666 m -5.29166,0 V 21.833333 m 10.58333,0 v 52.916666 m 5.29167,0 V 21.833333 m 5.29166,0 v 52.916666 m 5.29167,0 V 21.833333 m 5.29167,0 v 52.916666 m 5.29166,0 V 21.833333 m 5.29167,5.291666 h -52.91667 m 0,5.291667 h 52.91667 m 0,5.291667 h -52.91667 m 0,5.291666 h 52.91667 m 0,5.291667 h -52.91667 m 0,5.291667 h 52.91667 m 0,5.291666 h -52.91667 m 0,5.291667 h 52.91667 m 0,5.291667 h -52.91667"
-       id="path1236-1"
-       inkscape:connector-curvature="0" />
-    <path
-       id="path1299"
-       d="M 13.229167,80.041666 H 39.687305 V 106.49981 H 13.229167 Z m 5.291628,0 V 106.49981 M 23.812422,80.041666 V 106.49981 M 29.10405,80.041666 v 26.458144 m 5.291628,-26.458144 v 26.458144 m -21.166511,-5.29163 h 26.458138 m 0,-5.29163 H 13.229167 m 0,-5.291627 h 26.458138 m 0,-5.29163 H 13.229167"
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       inkscape:connector-curvature="0" />
-    <path
-       id="path1299-5"
-       d="M 71.437501,80.041666 H 97.895647 V 106.49981 H 71.437501 Z m 5.291629,0 v 26.458144 m 5.291627,-26.458144 v 26.458144 m 5.291627,-26.458144 v 26.458144 m 5.291627,-26.458144 v 26.458144 m -21.16651,-5.29163 h 26.458146 m 0,-5.29163 H 71.437501 m 0,-5.291627 h 26.458146 m 0,-5.29163 H 71.437501"
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       inkscape:connector-curvature="0" />
-    <path
-       id="path1299-7"
-       d="m 129.64584,80.041666 h 26.45814 v 26.458144 h -26.45814 z m 5.29163,0 v 26.458144 m 5.29163,-26.458144 v 26.458144 m 5.29162,-26.458144 v 26.458144 m 5.29163,-26.458144 v 26.458144 m -21.16651,-5.29163 h 26.45814 m 0,-5.29163 h -26.45814 m 0,-5.291627 h 26.45814 m 0,-5.29163 h -26.45814"
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.25399813px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833335, 1.05833335;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 19.843748,143.5417 h 3.96875 V 132.95836 H 13.229167 v 3.96875 m 5.29166,0 v -3.96875 m 1.322921,5.29167 h 3.96875"
-       id="path1094-0"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 18.520827,143.5417 v -6.61459 m 1.322921,1.32292 h -6.614581 m 6.614581,5.29167 h -6.614581 v -6.61459 h 6.614581 v 6.61459"
-       id="path1111-1"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 13.229167,114.43752 v 13.22916 h 13.22916 v -13.22916 h -13.22916 m 5.291659,0 v 13.22916 m 5.291672,0 v -13.22916 m -10.583331,2.64584 h 13.22916 m -13.22916,5.29166 h 13.22916"
-       id="path1124-3"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833336, 1.05833336;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 26.458338,127.66668 h 2.64583 V 111.79169 H 13.229167 v 2.64584 m 5.29167,-2.64584 v 2.64584 m 5.291661,-2.64584 v 2.64584 m 5.29167,2.64583 h -2.64583 m 2.64583,5.29166 h -2.64583"
-       id="path1141-9"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833336, 1.05833336;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 78.052081,143.54169 h 3.96875 v -10.58334 h -10.58333 v 3.96875 m 5.291661,0 v -3.96875 m 1.322919,5.29167 h 3.96875"
-       id="path1094-0-5"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 76.729162,143.54169 v -6.61459 m 1.322919,1.32292 h -6.61458 m 6.61458,5.29167 h -6.61458 v -6.61459 h 6.61458 v 6.61459"
-       id="path1111-1-6"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 71.437501,114.43751 v 13.22916 H 84.666662 V 114.43751 H 71.437501 m 5.291661,0 v 13.22916 m 5.291669,0 v -13.22916 m -10.58333,2.64584 h 13.229161 m -13.229161,5.29166 h 13.229161"
-       id="path1124-3-4"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833337, 1.05833337;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 84.666673,127.66667 h 2.64583 V 111.79168 H 71.437501 v 2.64584 m 5.291672,-2.64584 v 2.64584 m 5.291658,-2.64584 v 2.64584 m 5.291672,2.64583 h -2.64583 m 2.64583,5.29166 h -2.64583"
-       id="path1141-9-1"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833336, 1.05833336;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 136.26043,143.54169 h 3.96875 v -10.58334 h -10.58333 v 3.96875 m 5.29166,0 v -3.96875 m 1.32292,5.29167 h 3.96875"
-       id="path1094-0-9"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 134.93751,143.54169 v -6.61459 m 1.32292,1.32292 h -6.61458 m 6.61458,5.29167 h -6.61458 v -6.61459 h 6.61458 v 6.61459"
-       id="path1111-1-1"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 129.64585,114.43751 v 13.22916 h 13.22916 v -13.22916 h -13.22916 m 5.29166,0 v 13.22916 m 5.29167,0 v -13.22916 m -10.58333,2.64584 h 13.22916 m -13.22916,5.29166 h 13.22916"
-       id="path1124-3-5"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.05833337, 1.05833337;stroke-dashoffset:0;stroke-opacity:1"
-       d="m 142.87502,127.66667 h 2.64583 v -15.87499 h -15.875 v 2.64584 m 5.29167,-2.64584 v 2.64584 m 5.29166,-2.64584 v 2.64584 m 5.29167,2.64583 h -2.64583 m 2.64583,5.29166 h -2.64583"
-       id="path1141-9-5"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 13.229168,148.83333 h 31.75 l 10e-7,5.29167 H 13.229168 Z m 5.291667,0 v 5.29167 m 10.583333,-5.29167 v 5.29167 m -5.291667,0 v -5.29167 m 10.583333,0 v 5.29167 m 5.291667,0 v -5.29167"
-       id="path1236-4"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccc" />
-  </g>
-</svg>
diff --git a/registry/vulkan/images/tessparam.svg b/registry/vulkan/images/tessparam.svg
deleted file mode 100644
index 42279f0..0000000
--- a/registry/vulkan/images/tessparam.svg
+++ /dev/null
@@ -1,467 +0,0 @@
-<?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"
-   width="158.03326mm"
-   height="140.22618mm"
-   viewBox="0 0 158.03326 140.22618"
-   version="1.1"
-   id="svg3252"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="tessparam.svg">
-  <defs
-     id="defs3246">
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1632"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mstart"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1629"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="227.37134"
-     inkscape:cy="188.15798"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="1672"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0"
-     fit-margin-left="1"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3797"
-       originx="-70.89992"
-       originy="-158.47658" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata3249">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-70.899921,1.7027598)">
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 188.9636,20.372957 -15.87499,23.812497 h 31.75 z"
-       id="path5083"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 188.9636,4.497957 c -31.74999,47.624997 -31.74999,47.624997 -31.74999,47.624997 h 63.5 z"
-       id="path4959"
-       inkscape:connector-curvature="0" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect5129"
-       width="31.750002"
-       height="31.750002"
-       x="89.744835"
-       y="12.435457" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect5129-4"
-       width="47.624992"
-       height="47.624992"
-       x="81.80735"
-       y="4.4979587" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.43237,127.5292 h 47.625"
-       id="path5163"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.43237,119.59171 h 47.625"
-       id="path5165"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.43237,111.6542 h 47.625"
-       id="path5167"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.43237,103.7167 h 47.625"
-       id="path5169"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.43237,95.779205 h 47.625"
-       id="path5171"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.43237,87.841704 h 47.625"
-       id="path5173"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:15.875px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="139.35422"
-       y="64.029213"
-       id="text5179"><tspan
-         sodipodi:role="line"
-         id="tspan5177"
-         x="139.35422"
-         y="78.512459"
-         style="stroke-width:0.39687496" /></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="153.24486"
-       y="81.888588"
-       id="text2799"><tspan
-         sodipodi:role="line"
-         id="tspan2797"
-         x="153.24486"
-         y="81.888588"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(no edge)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="129.43236"
-       y="77.91983"
-       id="text2799-3"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9"
-         x="129.43236"
-         y="77.91983"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(0,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="177.05736"
-       y="77.91983"
-       id="text2799-3-1"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-7"
-         x="177.05736"
-         y="77.91983"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(1,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="129.43236"
-       y="131.49797"
-       id="text2799-3-1-8"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-7-2"
-         x="129.43236"
-         y="131.49797"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(0,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="177.05736"
-       y="131.49796"
-       id="text2799-3-1-7"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-7-0"
-         x="177.05736"
-         y="131.49796"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(1,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="188.96361"
-       y="2.5135815"
-       id="text5070-2-2-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36"
-         x="188.96361"
-         y="2.5135815"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(0,1,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="220.71503"
-       y="55.833858"
-       id="text5070-2-2-9-3"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-1"
-         x="220.71503"
-         y="55.833858"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(1,0,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="157.17018"
-       y="55.771183"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="157.17018"
-         y="55.771183"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(0,0,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="81.807327"
-       y="2.5135815"
-       id="text2799-3-7"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-70"
-         x="81.807327"
-         y="2.5135815"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(0,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="129.43236"
-       y="2.5135815"
-       id="text2799-3-1-5"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-7-3"
-         x="129.43236"
-         y="2.5135815"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(1,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="81.807327"
-       y="56.091732"
-       id="text2799-3-1-8-0"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-7-2-0"
-         x="81.807327"
-         y="56.091732"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(0,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="129.43236"
-       y="56.091721"
-       id="text2799-3-1-7-3"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-7-0-2"
-         x="129.43236"
-         y="56.091721"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(1,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="113.55736"
-       y="105.70109"
-       id="text2799-38"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6"
-         x="113.55736"
-         y="105.70109"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="153.24486"
-       y="131.49796"
-       id="text2799-38-8"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4"
-         x="153.24486"
-         y="131.49796"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL1</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39700006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.58800024,1.58800024;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)"
-       d="M 119.51048,79.904208 V 127.52921"
-       id="path8332"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="75.854202"
-       y="28.310455"
-       id="text2799-38-88"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-9"
-         x="75.854202"
-         y="28.310455"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="105.61983"
-       y="56.091705"
-       id="text2799-38-8-5"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0"
-         x="105.61983"
-         y="56.091705"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="105.61983"
-       y="2.5135815"
-       id="text2799-38-8-5-0"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-5"
-         x="105.61983"
-         y="2.5135815"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="135.38548"
-       y="28.310455"
-       id="text2799-38-8-5-1"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-6"
-         x="135.38548"
-         y="28.310455"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="105.61983"
-       y="16.404205"
-       id="text2799-38-8-5-3"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-9"
-         x="105.61983"
-         y="16.404205"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">IL0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="95.697983"
-       y="28.310455"
-       id="text2799-38-8-5-7"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-0"
-         x="95.697983"
-         y="28.310455"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">IL1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="167.13547"
-       y="28.310455"
-       id="text2799-38-88-3"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-9-9"
-         x="167.13547"
-         y="28.310455"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="210.79172"
-       y="28.310455"
-       id="text2799-38-8-5-1-8"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-6-8"
-         x="210.79172"
-         y="28.310455"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="188.96361"
-       y="56.091709"
-       id="text2799-38-8-5-2"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-56"
-         x="188.96361"
-         y="56.091709"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="188.96361"
-       y="36.247959"
-       id="text2799-38-8-5-3-1"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-9-0"
-         x="188.96361"
-         y="36.247959"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">IL0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="105.61983"
-       y="62.04483"
-       id="text2799-30"><tspan
-         sodipodi:role="line"
-         id="tspan2797-0"
-         x="105.61983"
-         y="62.04483"
-         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">Quads</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="188.96361"
-       y="62.04483"
-       id="text2799-30-4"><tspan
-         sodipodi:role="line"
-         id="tspan2797-0-8"
-         x="188.96361"
-         y="62.04483"
-         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">Triangles</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="153.24486"
-       y="137.45108"
-       id="text2799-30-5"><tspan
-         sodipodi:role="line"
-         id="tspan2797-0-80"
-         x="153.24486"
-         y="137.45108"
-         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">Isolines</tspan></text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/tessparamUL.svg b/registry/vulkan/images/tessparamUL.svg
deleted file mode 100644
index 779e538..0000000
--- a/registry/vulkan/images/tessparamUL.svg
+++ /dev/null
@@ -1,467 +0,0 @@
-<?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"
-   width="158.03326mm"
-   height="140.2262mm"
-   viewBox="0 0 158.03326 140.2262"
-   version="1.1"
-   id="svg3252"
-   sodipodi:docname="tessparamUL.svg"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)">
-  <defs
-     id="defs3246">
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mend"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1632"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mstart"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Mstart"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         id="path1629"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(0.4,0,0,0.4,4,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="62.03704"
-     inkscape:cy="267.41508"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="1672"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0"
-     fit-margin-left="1"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3797"
-       originx="-70.89992"
-       originy="-158.47658" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata3249">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-70.899921,1.7027646)">
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 188.9636,35.609765 173.08861,11.797268 h 31.75 z"
-       id="path5083"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 188.9636,51.484765 C 157.21361,3.859768 157.21361,3.859768 157.21361,3.859768 h 63.5 z"
-       id="path4959"
-       inkscape:connector-curvature="0" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect5129"
-       width="31.750002"
-       height="31.750002"
-       x="89.744835"
-       y="12.435458" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.39687496;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect5129-4"
-       width="47.624992"
-       height="47.624992"
-       x="81.80735"
-       y="4.4979596" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.64583,80.041678 h 47.625"
-       id="path5163"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.64583,119.72918 h 47.625"
-       id="path5165"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.64583,111.79168 h 47.625"
-       id="path5167"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.64583,103.85418 h 47.625"
-       id="path5169"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.64583,95.916678 h 47.625"
-       id="path5171"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.39687496px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 129.64583,87.979178 h 47.625"
-       id="path5173"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-weight:normal;font-size:15.875px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="139.35422"
-       y="64.029213"
-       id="text5179"><tspan
-         sodipodi:role="line"
-         id="tspan5177"
-         x="139.35422"
-         y="78.512459"
-         style="stroke-width:0.39687496" /></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="153.45833"
-       y="127.66668"
-       id="text2799"><tspan
-         sodipodi:role="line"
-         id="tspan2797"
-         x="153.45833"
-         y="127.66668"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(no edge)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="129.43236"
-       y="131.49797"
-       id="text2799-3"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9"
-         x="129.43236"
-         y="131.49797"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(0,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="177.05736"
-       y="131.49797"
-       id="text2799-3-1"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-7"
-         x="177.05736"
-         y="131.49797"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(1,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="129.43236"
-       y="77.91983"
-       id="text2799-3-1-8"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-7-2"
-         x="129.43236"
-         y="77.91983"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(0,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="177.05736"
-       y="77.919846"
-       id="text2799-3-1-7"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-7-0"
-         x="177.05736"
-         y="77.919846"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(1,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="188.96361"
-       y="55.833851"
-       id="text5070-2-2-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36"
-         x="188.96361"
-         y="55.833851"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(0,1,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="220.71503"
-       y="2.5135767"
-       id="text5070-2-2-9-3"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-1"
-         x="220.71503"
-         y="2.5135767"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(1,0,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="157.17018"
-       y="2.5762503"
-       id="text5070-2-2-9-9"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-3-36-9"
-         x="157.17018"
-         y="2.5762503"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke-width:0.39687496">(0,0,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="81.807327"
-       y="56.091728"
-       id="text2799-3-7"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-70"
-         x="81.807327"
-         y="56.091728"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(0,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="129.43236"
-       y="56.091728"
-       id="text2799-3-1-5"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-7-3"
-         x="129.43236"
-         y="56.091728"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(1,1)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="81.807327"
-       y="2.5135767"
-       id="text2799-3-1-8-0"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-7-2-0"
-         x="81.807327"
-         y="2.5135767"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(0,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="129.43236"
-       y="2.5135882"
-       id="text2799-3-1-7-3"><tspan
-         sodipodi:role="line"
-         id="tspan2797-9-7-0-2"
-         x="129.43236"
-         y="2.5135882"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">(1,0)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="113.55736"
-       y="105.70109"
-       id="text2799-38"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6"
-         x="113.55736"
-         y="105.70109"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="153.24486"
-       y="131.49796"
-       id="text2799-38-8"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4"
-         x="153.24486"
-         y="131.49796"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL1</tspan></text>
-    <path
-       style="fill:none;stroke:#000000;stroke-width:0.397;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:1.588,1.588;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)"
-       d="M 119.51048,79.904209 V 127.52921"
-       id="path8332"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="75.854202"
-       y="28.310457"
-       id="text2799-38-88"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-9"
-         x="75.854202"
-         y="28.310457"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="105.61983"
-       y="56.091705"
-       id="text2799-38-8-5"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0"
-         x="105.61983"
-         y="56.091705"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL3</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="105.61983"
-       y="2.5135825"
-       id="text2799-38-8-5-0"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-5"
-         x="105.61983"
-         y="2.5135825"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="135.38548"
-       y="28.310457"
-       id="text2799-38-8-5-1"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-6"
-         x="135.38548"
-         y="28.310457"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="105.61983"
-       y="16.404207"
-       id="text2799-38-8-5-3"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-9"
-         x="105.61983"
-         y="16.404207"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">IL0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="95.697983"
-       y="28.310457"
-       id="text2799-38-8-5-7"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-0"
-         x="95.697983"
-         y="28.310457"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">IL1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="167.13547"
-       y="28.310457"
-       id="text2799-38-88-3"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-9-9"
-         x="167.13547"
-         y="28.310457"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="210.79172"
-       y="28.310457"
-       id="text2799-38-8-5-1-8"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-6-8"
-         x="210.79172"
-         y="28.310457"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL2</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="188.96361"
-       y="2.5135882"
-       id="text2799-38-8-5-2"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-56"
-         x="188.96361"
-         y="2.5135882"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">OL1</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="188.96361"
-       y="22.357338"
-       id="text2799-38-8-5-3-1"><tspan
-         sodipodi:role="line"
-         id="tspan2797-6-4-0-9-0"
-         x="188.96361"
-         y="22.357338"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">IL0</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="105.61983"
-       y="62.04483"
-       id="text2799-30"><tspan
-         sodipodi:role="line"
-         id="tspan2797-0"
-         x="105.61983"
-         y="62.04483"
-         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">Quads</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="188.96361"
-       y="62.04483"
-       id="text2799-30-4"><tspan
-         sodipodi:role="line"
-         id="tspan2797-0-8"
-         x="188.96361"
-         y="62.04483"
-         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">Triangles</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687496"
-       x="153.24486"
-       y="137.45108"
-       id="text2799-30-5"><tspan
-         sodipodi:role="line"
-         id="tspan2797-0-80"
-         x="153.24486"
-         y="137.45108"
-         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.39687496">Isolines</tspan></text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/vulkantexture0-corner-alternative-a-ll.svg b/registry/vulkan/images/vulkantexture0-corner-alternative-a-ll.svg
deleted file mode 100644
index e25a550..0000000
--- a/registry/vulkan/images/vulkantexture0-corner-alternative-a-ll.svg
+++ /dev/null
@@ -1,1174 +0,0 @@
-<?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"
-   width="706.10547"
-   height="384.11328"
-   viewBox="0 0 186.82375 101.62997"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
-   sodipodi:docname="vulkantexture0-corner-alternative-a-ll.svg">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="marker2415"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path2413"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible;"
-       id="marker1517"
-       refX="0.0"
-       refY="0.0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path1515" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Lend"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path1144"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(1.1) rotate(180) translate(1,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1073"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1071"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path977-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481-0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker2415-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path2413-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483-7-3"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 z"
-         id="path1481-0-6" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 z"
-         id="path1481"
-         inkscape:connector-curvature="0" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2.13"
-     inkscape:cx="363.68234"
-     inkscape:cy="168.13361"
-     inkscape:document-units="px"
-     inkscape:current-layer="g3888"
-     showgrid="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:window-width="2252"
-     inkscape:window-height="1477"
-     inkscape:window-x="586"
-     inkscape:window-y="360"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     fit-margin-left="1"
-     units="px"
-     inkscape:snap-center="false"
-     inkscape:snap-global="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid12"
-       originx="0.79995428"
-       originy="-29.882412"
-       dotted="false" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-6.9498988,47.8249)">
-    <g
-       id="g3888">
-      <text
-         id="text121-6"
-         y="36.062489"
-         x="44.791519"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="36.062489"
-           x="44.791519"
-           id="tspan119-11"
-           sodipodi:role="line">0</tspan></text>
-      <text
-         id="text121-30"
-         y="36.062489"
-         x="63.312355"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="36.062489"
-           x="63.312355"
-           id="tspan119-47"
-           sodipodi:role="line">1</tspan></text>
-      <text
-         id="text121-1"
-         y="36.062489"
-         x="81.833191"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="36.062489"
-           x="81.833191"
-           id="tspan119-9"
-           sodipodi:role="line">2</tspan></text>
-      <text
-         id="text121-8"
-         y="36.062489"
-         x="100.35403"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="36.062489"
-           x="100.35403"
-           id="tspan119-7"
-           sodipodi:role="line">3</tspan></text>
-      <text
-         id="text121-4"
-         y="36.062489"
-         x="118.87486"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="36.062489"
-           x="118.87486"
-           id="tspan119-0"
-           sodipodi:role="line">4</tspan></text>
-      <text
-         id="text121-7"
-         y="36.062489"
-         x="137.39569"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="36.062489"
-           x="137.39569"
-           id="tspan119-8"
-           sodipodi:role="line">5</tspan></text>
-      <text
-         id="text121-79"
-         y="36.062489"
-         x="155.91653"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="36.062489"
-           x="155.91653"
-           id="tspan119-16"
-           sodipodi:role="line">6</tspan></text>
-      <text
-         id="text121-31"
-         y="36.062489"
-         x="174.43736"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="36.062489"
-           x="174.43736"
-           id="tspan119-09"
-           sodipodi:role="line">7</tspan></text>
-      <text
-         id="text121-3-7-3"
-         y="37.611748"
-         x="110.83607"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;writing-mode:lr-tb;text-anchor:middle"
-           y="37.611748"
-           x="110.83607"
-           id="tspan119-1-8-7"
-           sodipodi:role="line">i</tspan></text>
-      <text
-         id="text121-09-74"
-         y="45.537884"
-         x="28.097963"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="45.537884"
-           x="28.097963"
-           id="tspan119-67-18"
-           sodipodi:role="line">0.0</tspan></text>
-      <text
-         id="text121-09-74-5"
-         y="45.538918"
-         x="178.39691"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="45.538918"
-           x="178.39691"
-           id="tspan119-67-18-0"
-           sodipodi:role="line">7.0</tspan></text>
-      <path
-         inkscape:connector-curvature="0"
-         id="path972"
-         d="m 46.370385,43.993174 h 62.452355 m 4.6261,2e-6 h 62.45235"
-         style="fill:none;stroke:#000000;stroke-width:0.26458335;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker1483-7)" />
-      <text
-         id="text121-3-7-3-3"
-         y="45.122406"
-         x="110.86915"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;writing-mode:lr-tb;text-anchor:middle"
-           y="45.122406"
-           x="110.86915"
-           id="tspan119-1-8-7-2"
-           sodipodi:role="line">u</tspan></text>
-      <text
-         id="text121-09-74-7"
-         y="53.47538"
-         x="28.097961"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="53.47538"
-           x="28.097961"
-           id="tspan119-67-18-1"
-           sodipodi:role="line">0.0</tspan></text>
-      <text
-         id="text121-09-74-5-4"
-         y="53.476414"
-         x="178.39691"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="53.476414"
-           x="178.39691"
-           id="tspan119-67-18-0-9"
-           sodipodi:role="line">1.0</tspan></text>
-      <path
-         inkscape:connector-curvature="0"
-         id="path972-8"
-         d="m 46.370382,51.944306 h 62.452358 m 4.6261,2e-6 h 62.45235"
-         style="fill:none;stroke:#000000;stroke-width:0.26458335;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend-0)" />
-      <text
-         id="text121-3-7-3-3-5"
-         y="53.059902"
-         x="110.86914"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;writing-mode:lr-tb;text-anchor:middle"
-           y="53.059902"
-           x="110.86914"
-           id="tspan119-1-8-7-2-2"
-           sodipodi:role="line">s</tspan></text>
-      <g
-         id="g3616">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-           x="31.562353"
-           y="-32.729183"
-           id="text121"><tspan
-             sodipodi:role="line"
-             id="tspan119"
-             x="31.562353"
-             y="-32.729183"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">3</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-           x="31.562353"
-           y="-14.208344"
-           id="text121-3"><tspan
-             sodipodi:role="line"
-             id="tspan119-1"
-             x="31.562353"
-             y="-14.208344"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">2</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-           x="31.562353"
-           y="4.3124895"
-           id="text121-0"><tspan
-             sodipodi:role="line"
-             id="tspan119-4"
-             x="31.562353"
-             y="4.3124895"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">1</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-           x="31.562353"
-           y="22.833323"
-           id="text121-33"><tspan
-             sodipodi:role="line"
-             id="tspan119-6"
-             x="31.562353"
-             y="22.833323"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
-           x="31.790766"
-           y="-5.1587672"
-           id="text121-3-7"><tspan
-             sodipodi:role="line"
-             id="tspan119-1-8"
-             x="31.790766"
-             y="-5.1587672"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;writing-mode:lr-tb;text-anchor:middle">j</tspan></text>
-      </g>
-      <path
-         sodipodi:nodetypes="cc"
-         style="fill:#000000;stroke:#000000;stroke-width:0.26458335;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker2415-4)"
-         d="m 138.95715,21.362502 11.90625,0"
-         id="path2429-6"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 149.99415,19.474237 h -0.38861 v -0.241846 q -0.16743,0.144694 -0.34933,0.22531 -0.1819,0.08062 -0.39481,0.08062 -0.41341,0 -0.65732,-0.318327 -0.24185,-0.318327 -0.24185,-0.882633 0,-0.293522 0.0827,-0.522966 0.0847,-0.229443 0.22738,-0.390674 0.14056,-0.157096 0.3266,-0.239778 0.1881,-0.08268 0.3886,-0.08268 0.1819,0 0.32246,0.04548 0.14056,0.04547 0.29559,0.12609 v -0.107487 h 0.38861 z m -0.38861,-0.568441 v -1.314648 q -0.15709,-0.07028 -0.28112,-0.101286 -0.12402,-0.03307 -0.27078,-0.03307 -0.3266,0 -0.5085,0.227377 -0.1819,0.227376 -0.1819,0.644921 0,0.411345 0.14056,0.626319 0.14056,0.212907 0.45062,0.212907 0.16537,0 0.33486,-0.07235 0.1695,-0.07441 0.31626,-0.19017 z"
-         style="font-size:4.23333311px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal'"
-         id="path1089"
-         inkscape:connector-curvature="0" />
-      <g
-         transform="translate(0,-0.5291654)"
-         id="g3789">
-        <path
-           style="fill:none;stroke:#ff0000;stroke-width:0.30418205px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1517)"
-           d="M 138.6988,21.49061 65.777117,3.8028339"
-           id="path1842"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="cc" />
-        <g
-           id="g3589"
-           transform="matrix(1,0,0,-1,3.1750002,24.485338)">
-          <path
-             d="m 100.72287,12.249991 h -0.34236 q -0.14534,0.235774 -0.239,0.510305 -0.0937,0.274531 -0.0937,0.573286 0,0.306828 0.0743,0.591048 0.0743,0.285836 0.21801,0.561981 0.13726,0.261613 0.32782,0.495772 0.19217,0.234158 0.4231,0.445708 h 0.36496 v -0.01616 q -0.18409,-0.135656 -0.38434,-0.34397 -0.19863,-0.208322 -0.3585,-0.460244 -0.16311,-0.256767 -0.26646,-0.566827 -0.10174,-0.308444 -0.10174,-0.6508 0,-0.350429 0.10174,-0.637879 0.10173,-0.289066 0.27614,-0.486082 z"
-             style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-             id="path1095"
-             inkscape:connector-curvature="0" />
-          <path
-             d="m 103.46979,12.915325 h -2.24146 l 1.46309,2.404569 h 0.42633 z m -0.35366,0.259997 -0.2713,1.863582 -1.13042,-1.863582 z"
-             style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-             id="path1097"
-             inkscape:connector-curvature="0" />
-          <path
-             d="m 104.70195,15.336043 -0.0727,-0.314903 h -0.34236 l 0.0727,0.314903 z m -0.16148,-0.616888 -0.41665,-1.80383 h -0.30359 l 0.41664,1.80383 z"
-             style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-             id="path1099"
-             inkscape:connector-curvature="0" />
-          <path
-             d="m 105.47872,13.375569 -0.70087,-1.057753 h -0.23577 l 0.52322,1.057753 z"
-             style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-             id="path1101"
-             inkscape:connector-curvature="0" />
-          <path
-             d="m 107.98502,12.915325 h -2.24146 l 1.46309,2.404569 h 0.42633 z m -0.35366,0.259997 -0.2713,1.863582 -1.13042,-1.863582 z"
-             style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-             id="path1103"
-             inkscape:connector-curvature="0" />
-          <path
-             d="m 109.38352,15.02114 h -0.34559 l 0.0727,0.314903 h 0.34559 z m -0.51677,-2.149416 q -0.0727,-0.313289 -0.25838,-0.476392 -0.1841,-0.163105 -0.45863,-0.163105 -0.0646,0 -0.16956,0.01297 -0.10497,0.01297 -0.17279,0.0323 l 0.063,0.276146 h 0.0161 q 0.0468,-0.021 0.11142,-0.04038 0.063,-0.02098 0.14696,-0.02098 0.11304,0 0.18894,0.03553 0.0775,0.03391 0.12596,0.10336 0.0468,0.06783 0.0775,0.169562 0.0307,0.100125 0.0549,0.209936 l 0.33751,1.464705 h -0.37627 l 0.0565,0.243847 h 0.6831 z"
-             style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-             id="path1105"
-             inkscape:connector-curvature="0" />
-          <path
-             d="m 110.65766,14.344502 q 0,-0.305214 -0.0759,-0.597509 -0.0759,-0.29068 -0.2164,-0.555522 -0.1405,-0.264841 -0.33267,-0.500614 -0.19217,-0.237389 -0.41825,-0.440866 h -0.36497 v 0.01616 q 0.18572,0.138875 0.38273,0.342357 0.19863,0.201861 0.36012,0.461857 0.1841,0.297139 0.27615,0.595894 0.092,0.298755 0.092,0.621731 0,0.343972 -0.10173,0.633038 -0.10012,0.29068 -0.27614,0.490925 v 0.01616 h 0.34235 q 0.14372,-0.234158 0.23739,-0.508689 0.0953,-0.272916 0.0953,-0.5749 z"
-             style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-             id="path1107"
-             inkscape:connector-curvature="0" />
-        </g>
-      </g>
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="42.333332"
-         d="m 42.861122,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="21.833345"
-         cx="42.333332"
-         id="path4517"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="52.916668"
-         d="m 53.444458,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="21.833345"
-         cx="52.916668"
-         id="path4517-7"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="63.5"
-         d="m 64.02779,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="21.833345"
-         cx="63.5"
-         id="path4517-78"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="74.083336"
-         d="m 74.611126,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="21.833345"
-         cx="74.083336"
-         id="path4517-7-9"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="84.666664"
-         d="m 85.194454,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="21.833345"
-         cx="84.666664"
-         id="path4517-0"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="95.25"
-         d="m 95.77779,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="21.833345"
-         cx="95.25"
-         id="path4517-7-0"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="105.83334"
-         d="m 106.36113,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="21.833345"
-         cx="105.83334"
-         id="path4517-1"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="116.41666"
-         d="m 116.94445,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="21.833345"
-         cx="116.41666"
-         id="path4517-7-7"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path4001"
-         d="M 46.354042,21.403099 H 175.91759 l 2e-5,-55.744758 H 46.35405 l -8e-6,55.744758"
-         style="fill:none;stroke:#808080;stroke-width:0.21462008;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path3999"
-         d="m 64.882195,21.263491 7e-6,-55.597833"
-         style="fill:none;stroke:#808080;stroke-width:0.22925246;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path3997"
-         d="m 83.4101,-34.334342 -7e-6,55.597833"
-         style="fill:none;stroke:#808080;stroke-width:0.22925246;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path3995"
-         d="m 101.938,21.263491 2e-5,-55.597833"
-         style="fill:none;stroke:#808080;stroke-width:0.22925246;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path3993"
-         d="m 120.46594,-34.334342 -1e-5,55.597833"
-         style="fill:none;stroke:#808080;stroke-width:0.22925246;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path3991"
-         d="M 138.99384,21.263491 V -34.334342"
-         style="fill:none;stroke:#808080;stroke-width:0.22925246;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path3989"
-         d="m 157.52174,-34.334342 -1e-5,55.597833"
-         style="fill:none;stroke:#808080;stroke-width:0.22925246;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path3985"
-         d="M 175.63671,-15.804515 H 46.370365"
-         style="fill:none;stroke:#808080;stroke-width:0.24724816;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path3983"
-         d="M 46.370358,2.733655 H 175.63669"
-         style="fill:none;stroke:#808080;stroke-width:0.24724816;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="42.333332"
-         d="m 42.861122,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="32.416679"
-         cx="42.333332"
-         id="path4517-6"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="52.916668"
-         d="m 53.444458,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="32.416679"
-         cx="52.916668"
-         id="path4517-7-3"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="63.5"
-         d="m 64.02779,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="32.416679"
-         cx="63.5"
-         id="path4517-78-9"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="74.083336"
-         d="m 74.611126,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="32.416679"
-         cx="74.083336"
-         id="path4517-7-9-1"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="84.666664"
-         d="m 85.194454,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="32.416679"
-         cx="84.666664"
-         id="path4517-0-6"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="95.25"
-         d="m 95.77779,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="32.416679"
-         cx="95.25"
-         id="path4517-7-0-8"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="105.83334"
-         d="m 106.36113,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="32.416679"
-         cx="105.83334"
-         id="path4517-1-5"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="116.41665"
-         d="m 116.94444,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="32.416679"
-         cx="116.41665"
-         id="path4517-7-7-5"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="42.333332"
-         d="m 42.861122,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="43.000011"
-         cx="42.333332"
-         id="path4517-4"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="52.916668"
-         d="m 53.444458,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="43.000011"
-         cx="52.916668"
-         id="path4517-7-2"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="63.5"
-         d="m 64.02779,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="43.000011"
-         cx="63.5"
-         id="path4517-78-3"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="74.083336"
-         d="m 74.611126,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="43.000011"
-         cx="74.083336"
-         id="path4517-7-9-0"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="84.666664"
-         d="m 85.194454,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="43.000011"
-         cx="84.666664"
-         id="path4517-0-9"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="95.25"
-         d="m 95.77779,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="43.000011"
-         cx="95.25"
-         id="path4517-7-0-1"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="105.83334"
-         d="m 106.36113,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="43.000011"
-         cx="105.83334"
-         id="path4517-1-9"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="116.41665"
-         d="m 116.94444,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-         r="0.52778977"
-         cy="43.000011"
-         cx="116.41665"
-         id="path4517-7-7-7"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="42.333332"
-         d="m 42.861122,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-         r="0.52778977"
-         cy="53.583344"
-         cx="42.333332"
-         id="path4517-14"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="52.916668"
-         d="m 53.444458,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-         r="0.52778977"
-         cy="53.583344"
-         cx="52.916668"
-         id="path4517-7-4"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="63.5"
-         d="m 64.02779,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-         r="0.52778977"
-         cy="53.583344"
-         cx="63.5"
-         id="path4517-78-7"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="74.083336"
-         d="m 74.611126,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-         r="0.52778977"
-         cy="53.583344"
-         cx="74.083336"
-         id="path4517-7-9-8"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="84.666664"
-         d="m 85.194454,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-         r="0.52778977"
-         cy="53.583344"
-         cx="84.666664"
-         id="path4517-0-7"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="95.25"
-         d="m 95.77779,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-         r="0.52778977"
-         cy="53.583344"
-         cx="95.25"
-         id="path4517-7-0-9"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="105.83334"
-         d="m 106.36113,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-         r="0.52778977"
-         cy="53.583344"
-         cx="105.83334"
-         id="path4517-1-4"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <circle
-         transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)"
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="116.41665"
-         d="m 116.94444,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-         r="0.52778977"
-         cy="53.583344"
-         cx="116.41665"
-         id="path4517-7-7-52"
-         style="fill:#000000;fill-opacity:1;stroke:none" />
-      <path
-         sodipodi:nodetypes="cc"
-         inkscape:connector-curvature="0"
-         id="path3054-3"
-         d="M 150.88949,7.2579058 V 21.607707"
-         style="fill:none;stroke:#808080;stroke-width:0.16467975;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path3054"
-         d="m 138.98324,9.3395719 h 14.55208"
-         style="fill:none;stroke:#808080;stroke-width:0.13229167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
-      <rect
-         transform="scale(1,-1)"
-         y="-9.6041584"
-         x="58.020679"
-         height="37.041668"
-         width="37.041668"
-         id="rect1609"
-         style="fill:none;stroke:#ff0000;stroke-width:0.5291667;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.11666671, 2.11666671;stroke-dashoffset:0" />
-      <rect
-         transform="scale(1,-1)"
-         y="-28.124992"
-         x="132.10402"
-         height="37.041668"
-         width="37.041668"
-         id="rect1609-6"
-         style="fill:none;stroke:#ff0000;stroke-width:0.5291667;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.11666671, 2.11666671;stroke-dashoffset:0" />
-      <path
-         d="m 142.6419,12.250012 q 0,0.417545 -0.27906,0.690397 -0.27698,0.272852 -0.70073,0.272852 -0.1633,0 -0.3452,-0.04547 -0.1819,-0.04547 -0.31212,-0.132291 v 0.983919 h -0.38861 v -3.079917 q 0,-0.463021 0.26045,-0.725537 0.26252,-0.2625172 0.72347,-0.2625172 0.18603,0 0.339,0.04548 0.15503,0.04341 0.27698,0.1384922 0.11783,0.08888 0.1881,0.231511 0.0703,0.142627 0.0703,0.330729 0,0.262516 -0.14469,0.458887 -0.14262,0.194303 -0.40514,0.270784 v 0.03514 q 0.32866,0.05374 0.52296,0.26045 0.19431,0.204639 0.19431,0.5271 z m -0.40101,-0.01034 q 0,-0.183969 -0.0724,-0.297657 -0.0703,-0.115755 -0.19017,-0.179834 -0.12196,-0.06615 -0.27285,-0.08888 -0.1509,-0.02274 -0.30179,-0.02274 h -0.0744 v -0.33073 h 0.0744 q 0.13642,0 0.27078,-0.02894 0.13436,-0.03101 0.21497,-0.09302 0.0951,-0.07028 0.14056,-0.171566 0.0475,-0.101286 0.0475,-0.276986 0,-0.23151 -0.14262,-0.351399 -0.14263,-0.11989 -0.36794,-0.11989 -0.1509,0 -0.25838,0.05581 -0.10749,0.05374 -0.1757,0.144694 -0.0661,0.09095 -0.0971,0.212907 -0.031,0.119889 -0.031,0.248047 v 1.781804 q 0.13642,0.07855 0.29145,0.111621 0.15503,0.03101 0.30386,0.03101 0.30799,0 0.47336,-0.161231 0.16743,-0.163297 0.16743,-0.46302 z"
-         style="font-size:4.23333311px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal'"
-         id="path1092"
-         inkscape:connector-curvature="0" />
-      <path
-         sodipodi:nodetypes="cc"
-         style="fill:#000000;stroke:#000000;stroke-width:0.26458335;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker2415)"
-         d="m 138.98319,21.245824 0,-11.9062496"
-         id="path2429"
-         inkscape:connector-curvature="0" />
-      <g
-         id="g3740">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-           x="138.71861"
-           y="6.2589712"
-           id="text5070-2-1"><tspan
-             sodipodi:role="line"
-             id="tspan5068-0-6"
-             x="138.71861"
-             y="6.2589712"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000"
-               id="tspan7821"> i0j1</tspan></tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-           x="157.23944"
-           y="6.2589712"
-           id="text5070-2-1-7"><tspan
-             y="6.2589712"
-             x="157.23944"
-             id="tspan4060"
-             sodipodi:role="line"
-             style="font-size:3.52777696px;line-height:0"> i1j1</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-           x="138.71861"
-           y="24.779802"
-           id="text5070-2-1-0"><tspan
-             y="24.779802"
-             x="138.71861"
-             id="tspan4064"
-             sodipodi:role="line"
-             style="font-size:3.52777696px;line-height:0"> i0j0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-           x="157.23944"
-           y="24.779802"
-           id="text5070-2-1-2"><tspan
-             y="24.779802"
-             x="157.23944"
-             id="tspan4054"
-             sodipodi:role="line"
-             style="font-size:3.52777696px;line-height:0"> i1j0</tspan><tspan
-             y="26.980595"
-             x="157.23944"
-             id="tspan4056"
-             sodipodi:role="line"
-             style="font-size:3.52777696px;line-height:0"> </tspan></text>
-      </g>
-      <g
-         id="g3768">
-        <circle
-           style="fill:#ff0000;fill-opacity:1;stroke:none"
-           id="path4517-0-8"
-           cx="150.62486"
-           cy="-22.145849"
-           r="0.92363214"
-           d="m 151.54849,-22.145849 c 0,0.510108 -0.41352,0.923632 -0.92363,0.923632 -0.51011,0 -0.92363,-0.413524 -0.92363,-0.923632 0,-0.510108 0.41352,-0.923632 0.92363,-0.923632 0.51011,0 0.92363,0.413524 0.92363,0.923632 z"
-           sodipodi:cx="150.62486"
-           sodipodi:cy="-22.145849"
-           sodipodi:rx="0.92363214"
-           sodipodi:ry="0.92363214"
-           transform="matrix(1,0,0,-1,0,-12.541691)" />
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-           x="152.21477"
-           y="10.830611"
-           id="text5070-2"><tspan
-             sodipodi:role="line"
-             id="tspan5068-0"
-             x="152.21477"
-             y="10.830611"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1">(u,v)</tspan></text>
-      </g>
-      <g
-         id="g3754">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-           x="64.635269"
-           y="-16.495201"
-           id="text5070-2-1-06"><tspan
-             y="-16.495201"
-             x="64.635269"
-             id="tspan4046"
-             sodipodi:role="line"
-             style="font-size:3.52777696px;line-height:0.34999999"> i0j1'</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-           x="83.156105"
-           y="-16.495201"
-           id="text5070-2-1-25"><tspan
-             y="-16.495201"
-             x="83.156105"
-             id="tspan4048"
-             sodipodi:role="line"
-             style="font-size:3.52777696px;line-height:0.34999999"> i1j1'</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-           x="64.635269"
-           y="2.0256376"
-           id="text5070-2-1-75"><tspan
-             y="2.0256376"
-             x="64.635269"
-             id="tspan4044"
-             sodipodi:role="line"
-             style="font-size:3.52777696px;line-height:0.34999999"> i0j0'</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-           x="83.156105"
-           y="2.0256376"
-           id="text5070-2-1-3"><tspan
-             y="2.0256376"
-             x="83.156105"
-             id="tspan4050"
-             sodipodi:role="line"
-             style="font-size:3.52777696px;line-height:0.34999999"> i1j0'</tspan></text>
-      </g>
-      <text
-         id="text121-09"
-         y="-35.953781"
-         x="17.576641"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="-35.953781"
-           x="17.576641"
-           id="tspan119-67"
-           sodipodi:role="line">3.0</tspan></text>
-      <text
-         id="text121-09-7"
-         y="25.429537"
-         x="17.514629"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-           y="25.429537"
-           x="17.514629"
-           id="tspan119-67-1"
-           sodipodi:role="line">0.0</tspan></text>
-      <path
-         style="fill:none;stroke:#000000;stroke-width:0.26458335;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker1483)"
-         d="M 20.993481,21.52766 V -4.4080825 m 1e-6,-3.990115 V -34.333941"
-         id="path1473"
-         inkscape:connector-curvature="0" />
-      <text
-         id="text121-3-7-8"
-         y="-5.1587696"
-         x="20.479824"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;writing-mode:lr-tb;text-anchor:middle"
-           y="-5.1587696"
-           x="20.479824"
-           id="tspan119-1-8-3"
-           sodipodi:role="line">v</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         x="6.9933071"
-         y="-35.953781"
-         id="text1601-4"><tspan
-           sodipodi:role="line"
-           id="tspan1599-1"
-           x="6.9933071"
-           y="-35.953781"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">1.0</tspan></text>
-      <text
-         xml:space="preserve"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-         x="6.9312954"
-         y="25.429537"
-         id="text1605-6"><tspan
-           sodipodi:role="line"
-           id="tspan1603-7"
-           x="6.9312954"
-           y="25.429537"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">0.0</tspan></text>
-      <path
-         inkscape:connector-curvature="0"
-         id="path1607-6"
-         d="M 10.381221,21.52766 V -4.4080825 m 10e-7,-3.990115 V -34.333941"
-         style="fill:none;stroke:#000000;stroke-width:0.26458335;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker1483-7)" />
-      <text
-         xml:space="preserve"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
-         x="9.8964901"
-         y="-5.1587696"
-         id="text1611-4"><tspan
-           sodipodi:role="line"
-           id="tspan1609-3"
-           x="9.8964901"
-           y="-5.1587696"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;writing-mode:lr-tb;text-anchor:middle">t</tspan></text>
-    </g>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/vulkantexture0-ll.svg b/registry/vulkan/images/vulkantexture0-ll.svg
deleted file mode 100644
index 765293d..0000000
--- a/registry/vulkan/images/vulkantexture0-ll.svg
+++ /dev/null
@@ -1,1215 +0,0 @@
-<?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"
-   width="706.10547"
-   height="384.11328"
-   viewBox="0 0 186.82375 101.62997"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
-   sodipodi:docname="vulkantexture0-ll.svg">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="marker2415"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path2413"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible;"
-       id="marker1517"
-       refX="0.0"
-       refY="0.0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path1515" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path1132"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Lend"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path1144"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(1.1) rotate(180) translate(1,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1073"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1071"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path977"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path977-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481-0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker2415-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path2413-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2"
-     inkscape:cx="409.64232"
-     inkscape:cy="185.01098"
-     inkscape:document-units="px"
-     inkscape:current-layer="g3740"
-     showgrid="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="1057"
-     inkscape:window-x="1928"
-     inkscape:window-y="31"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     fit-margin-left="1"
-     units="px"
-     inkscape:snap-center="false"
-     inkscape:snap-global="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid12"
-       originx="0.79995428"
-       originy="-29.882412"
-       dotted="false" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-6.9498988,47.8249)">
-    <g
-       id="g3888">
-      <g
-         id="g3699">
-        <g
-           id="g3675">
-          <text
-             id="text121-6"
-             y="36.062489"
-             x="44.791519"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="36.062489"
-               x="44.791519"
-               id="tspan119-11"
-               sodipodi:role="line">0</tspan></text>
-          <text
-             id="text121-30"
-             y="36.062489"
-             x="63.312355"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="36.062489"
-               x="63.312355"
-               id="tspan119-47"
-               sodipodi:role="line">1</tspan></text>
-          <text
-             id="text121-1"
-             y="36.062489"
-             x="81.833191"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="36.062489"
-               x="81.833191"
-               id="tspan119-9"
-               sodipodi:role="line">2</tspan></text>
-          <text
-             id="text121-8"
-             y="36.062489"
-             x="100.35403"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="36.062489"
-               x="100.35403"
-               id="tspan119-7"
-               sodipodi:role="line">3</tspan></text>
-          <text
-             id="text121-4"
-             y="36.062489"
-             x="118.87486"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="36.062489"
-               x="118.87486"
-               id="tspan119-0"
-               sodipodi:role="line">4</tspan></text>
-          <text
-             id="text121-7"
-             y="36.062489"
-             x="137.39569"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="36.062489"
-               x="137.39569"
-               id="tspan119-8"
-               sodipodi:role="line">5</tspan></text>
-          <text
-             id="text121-79"
-             y="36.062489"
-             x="155.91653"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="36.062489"
-               x="155.91653"
-               id="tspan119-16"
-               sodipodi:role="line">6</tspan></text>
-          <text
-             id="text121-31"
-             y="36.062489"
-             x="174.43736"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="36.062489"
-               x="174.43736"
-               id="tspan119-09"
-               sodipodi:role="line">7</tspan></text>
-          <text
-             id="text121-3-7-3"
-             y="37.611748"
-             x="110.83607"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;writing-mode:lr-tb;text-anchor:middle"
-               y="37.611748"
-               x="110.83607"
-               id="tspan119-1-8-7"
-               sodipodi:role="line">i</tspan></text>
-        </g>
-        <g
-           id="g3666">
-          <text
-             id="text121-09-74"
-             y="45.537884"
-             x="28.097963"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="45.537884"
-               x="28.097963"
-               id="tspan119-67-18"
-               sodipodi:role="line">0.0</tspan></text>
-          <text
-             id="text121-09-74-5"
-             y="45.538918"
-             x="186.86346"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="45.538918"
-               x="186.86346"
-               id="tspan119-67-18-0"
-               sodipodi:role="line">8.0</tspan></text>
-          <path
-             inkscape:connector-curvature="0"
-             id="path972"
-             d="m 36.854018,43.999991 h 71.437502 m 5.29167,2e-6 h 71.4375"
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
-          <text
-             id="text121-3-7-3-3"
-             y="45.122406"
-             x="110.86915"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;writing-mode:lr-tb;text-anchor:middle"
-               y="45.122406"
-               x="110.86915"
-               id="tspan119-1-8-7-2"
-               sodipodi:role="line">u</tspan></text>
-        </g>
-        <g
-           id="g3657">
-          <text
-             id="text121-09-74-7"
-             y="53.47538"
-             x="28.097961"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="53.47538"
-               x="28.097961"
-               id="tspan119-67-18-1"
-               sodipodi:role="line">0.0</tspan></text>
-          <text
-             id="text121-09-74-5-4"
-             y="53.476414"
-             x="186.86346"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="53.476414"
-               x="186.86346"
-               id="tspan119-67-18-0-9"
-               sodipodi:role="line">1.0</tspan></text>
-          <path
-             inkscape:connector-curvature="0"
-             id="path972-8"
-             d="m 36.854015,51.937489 h 71.437505 m 5.29167,2e-6 h 71.4375"
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)" />
-          <text
-             id="text121-3-7-3-3-5"
-             y="53.059902"
-             x="110.86914"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;writing-mode:lr-tb;text-anchor:middle"
-               y="53.059902"
-               x="110.86914"
-               id="tspan119-1-8-7-2-2"
-               sodipodi:role="line">s</tspan></text>
-        </g>
-      </g>
-      <g
-         id="g3628">
-        <g
-           id="g3616">
-          <text
-             id="text121"
-             y="-32.729183"
-             x="31.562353"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="-32.729183"
-               x="31.562353"
-               id="tspan119"
-               sodipodi:role="line">3</tspan></text>
-          <text
-             id="text121-3"
-             y="-14.208344"
-             x="31.562353"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="-14.208344"
-               x="31.562353"
-               id="tspan119-1"
-               sodipodi:role="line">2</tspan></text>
-          <text
-             id="text121-0"
-             y="4.3124895"
-             x="31.562353"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="4.3124895"
-               x="31.562353"
-               id="tspan119-4"
-               sodipodi:role="line">1</tspan></text>
-          <text
-             id="text121-33"
-             y="22.833323"
-             x="31.562353"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="22.833323"
-               x="31.562353"
-               id="tspan119-6"
-               sodipodi:role="line">0</tspan></text>
-          <text
-             id="text121-3-7"
-             y="-5.1587672"
-             x="31.790766"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;writing-mode:lr-tb;text-anchor:middle"
-               y="-5.1587672"
-               x="31.790766"
-               id="tspan119-1-8"
-               sodipodi:role="line">j</tspan></text>
-        </g>
-        <g
-           id="g3607">
-          <text
-             id="text121-09"
-             y="-44.420456"
-             x="17.576641"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="-44.420456"
-               x="17.576641"
-               id="tspan119-67"
-               sodipodi:role="line">4.0</tspan></text>
-          <text
-             id="text121-09-7"
-             y="34.954548"
-             x="17.514629"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
-               y="34.954548"
-               x="17.514629"
-               id="tspan119-67-1"
-               sodipodi:role="line">0.0</tspan></text>
-          <path
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)"
-             d="M 20.979018,30.770823 V -3.6250121 m 1e-6,-5.2916661 V -43.312513"
-             id="path1473"
-             inkscape:connector-curvature="0" />
-          <text
-             id="text121-3-7-8"
-             y="-5.1587677"
-             x="20.479824"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;writing-mode:lr-tb;text-anchor:middle"
-               y="-5.1587677"
-               x="20.479824"
-               id="tspan119-1-8-3"
-               sodipodi:role="line">v</tspan></text>
-        </g>
-        <g
-           id="g3598">
-          <text
-             xml:space="preserve"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             x="6.9933071"
-             y="-44.420456"
-             id="text1601-4"><tspan
-               sodipodi:role="line"
-               id="tspan1599-1"
-               x="6.9933071"
-               y="-44.420456"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">1.0</tspan></text>
-          <text
-             xml:space="preserve"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             x="6.9312954"
-             y="34.954548"
-             id="text1605-6"><tspan
-               sodipodi:role="line"
-               id="tspan1603-7"
-               x="6.9312954"
-               y="34.954548"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start">0.0</tspan></text>
-          <path
-             inkscape:connector-curvature="0"
-             id="path1607-6"
-             d="M 10.395684,30.770823 V -3.6250121 m 1e-6,-5.2916661 V -43.312513"
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483-7)" />
-          <text
-             xml:space="preserve"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
-             x="9.8964901"
-             y="-5.1587677"
-             id="text1611-4"><tspan
-               sodipodi:role="line"
-               id="tspan1609-3"
-               x="9.8964901"
-               y="-5.1587677"
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';text-align:center;writing-mode:lr-tb;text-anchor:middle">t</tspan></text>
-        </g>
-      </g>
-      <g
-         id="g3695">
-        <path
-           inkscape:connector-curvature="0"
-           id="path2429-6"
-           d="m 129.43215,30.887503 11.90625,0"
-           style="fill:#000000;stroke:#000000;stroke-width:0.26458335;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker2415-4)"
-           sodipodi:nodetypes="cc" />
-        <path
-           inkscape:connector-curvature="0"
-           id="path1089"
-           style="font-size:4.23333311px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal'"
-           d="m 145.23168,32.17424 h -0.38861 v -0.241846 q -0.16743,0.144694 -0.34933,0.22531 -0.1819,0.08062 -0.39481,0.08062 -0.41341,0 -0.65732,-0.318327 -0.24185,-0.318327 -0.24185,-0.882633 0,-0.293522 0.0827,-0.522966 0.0847,-0.229443 0.22738,-0.390674 0.14056,-0.157096 0.3266,-0.239778 0.1881,-0.08268 0.3886,-0.08268 0.1819,0 0.32246,0.04548 0.14056,0.04547 0.29559,0.12609 v -0.107487 h 0.38861 z m -0.38861,-0.568441 v -1.314648 q -0.15709,-0.07028 -0.28112,-0.101286 -0.12402,-0.03307 -0.27078,-0.03307 -0.3266,0 -0.5085,0.227377 -0.1819,0.227376 -0.1819,0.644921 0,0.411345 0.14056,0.626319 0.14056,0.212907 0.45062,0.212907 0.16537,0 0.33486,-0.07235 0.1695,-0.07441 0.31626,-0.19017 z" />
-      </g>
-      <g
-         id="g3800">
-        <g
-           id="g3789">
-          <path
-             sodipodi:nodetypes="cc"
-             inkscape:connector-curvature="0"
-             id="path1842"
-             d="M 138.6988,21.49061 65.777117,3.8028339"
-             style="fill:none;stroke:#ff0000;stroke-width:0.30418205px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1517)" />
-          <g
-             transform="matrix(1,0,0,-1,3.1750002,24.485338)"
-             id="g3589">
-            <path
-               inkscape:connector-curvature="0"
-               id="path1095"
-               style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-               d="m 100.72287,12.249991 h -0.34236 q -0.14534,0.235774 -0.239,0.510305 -0.0937,0.274531 -0.0937,0.573286 0,0.306828 0.0743,0.591048 0.0743,0.285836 0.21801,0.561981 0.13726,0.261613 0.32782,0.495772 0.19217,0.234158 0.4231,0.445708 h 0.36496 v -0.01616 q -0.18409,-0.135656 -0.38434,-0.34397 -0.19863,-0.208322 -0.3585,-0.460244 -0.16311,-0.256767 -0.26646,-0.566827 -0.10174,-0.308444 -0.10174,-0.6508 0,-0.350429 0.10174,-0.637879 0.10173,-0.289066 0.27614,-0.486082 z" />
-            <path
-               inkscape:connector-curvature="0"
-               id="path1097"
-               style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-               d="m 103.46979,12.915325 h -2.24146 l 1.46309,2.404569 h 0.42633 z m -0.35366,0.259997 -0.2713,1.863582 -1.13042,-1.863582 z" />
-            <path
-               inkscape:connector-curvature="0"
-               id="path1099"
-               style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-               d="m 104.70195,15.336043 -0.0727,-0.314903 h -0.34236 l 0.0727,0.314903 z m -0.16148,-0.616888 -0.41665,-1.80383 h -0.30359 l 0.41664,1.80383 z" />
-            <path
-               inkscape:connector-curvature="0"
-               id="path1101"
-               style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-               d="m 105.47872,13.375569 -0.70087,-1.057753 h -0.23577 l 0.52322,1.057753 z" />
-            <path
-               inkscape:connector-curvature="0"
-               id="path1103"
-               style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-               d="m 107.98502,12.915325 h -2.24146 l 1.46309,2.404569 h 0.42633 z m -0.35366,0.259997 -0.2713,1.863582 -1.13042,-1.863582 z" />
-            <path
-               inkscape:connector-curvature="0"
-               id="path1105"
-               style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-               d="m 109.38352,15.02114 h -0.34559 l 0.0727,0.314903 h 0.34559 z m -0.51677,-2.149416 q -0.0727,-0.313289 -0.25838,-0.476392 -0.1841,-0.163105 -0.45863,-0.163105 -0.0646,0 -0.16956,0.01297 -0.10497,0.01297 -0.17279,0.0323 l 0.063,0.276146 h 0.0161 q 0.0468,-0.021 0.11142,-0.04038 0.063,-0.02098 0.14696,-0.02098 0.11304,0 0.18894,0.03553 0.0775,0.03391 0.12596,0.10336 0.0468,0.06783 0.0775,0.169562 0.0307,0.100125 0.0549,0.209936 l 0.33751,1.464705 h -0.37627 l 0.0565,0.243847 h 0.6831 z" />
-            <path
-               inkscape:connector-curvature="0"
-               id="path1107"
-               style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-               d="m 110.65766,14.344502 q 0,-0.305214 -0.0759,-0.597509 -0.0759,-0.29068 -0.2164,-0.555522 -0.1405,-0.264841 -0.33267,-0.500614 -0.19217,-0.237389 -0.41825,-0.440866 h -0.36497 v 0.01616 q 0.18572,0.138875 0.38273,0.342357 0.19863,0.201861 0.36012,0.461857 0.1841,0.297139 0.27615,0.595894 0.092,0.298755 0.092,0.621731 0,0.343972 -0.10173,0.633038 -0.10012,0.29068 -0.27614,0.490925 v 0.01616 h 0.34235 q 0.14372,-0.234158 0.23739,-0.508689 0.0953,-0.272916 0.0953,-0.5749 z" />
-          </g>
-        </g>
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517"
-           cx="42.333332"
-           cy="21.833345"
-           r="0.52778977"
-           d="m 42.861122,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="42.333332"
-           sodipodi:cy="21.833345"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7"
-           cx="52.916668"
-           cy="21.833345"
-           r="0.52778977"
-           d="m 53.444458,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="52.916668"
-           sodipodi:cy="21.833345"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-78"
-           cx="63.5"
-           cy="21.833345"
-           r="0.52778977"
-           d="m 64.02779,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="63.5"
-           sodipodi:cy="21.833345"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-9"
-           cx="74.083336"
-           cy="21.833345"
-           r="0.52778977"
-           d="m 74.611126,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="74.083336"
-           sodipodi:cy="21.833345"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-0"
-           cx="84.666664"
-           cy="21.833345"
-           r="0.52778977"
-           d="m 85.194454,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="84.666664"
-           sodipodi:cy="21.833345"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-0"
-           cx="95.25"
-           cy="21.833345"
-           r="0.52778977"
-           d="m 95.77779,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="95.25"
-           sodipodi:cy="21.833345"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-1"
-           cx="105.83334"
-           cy="21.833345"
-           r="0.52778977"
-           d="m 106.36113,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="105.83334"
-           sodipodi:cy="21.833345"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-7"
-           cx="116.41666"
-           cy="21.833345"
-           r="0.52778977"
-           d="m 116.94445,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="116.41666"
-           sodipodi:cy="21.833345"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <path
-           style="fill:none;stroke:#808080;stroke-width:0.26458335;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-           d="m 36.85402,30.770821 h 148.16667 l 2e-5,-74.083337 H 36.854029 l -9e-6,74.083337 m 18.520836,0 7e-6,-74.083337 m 18.520832,0 -7e-6,74.083337 m 18.520832,0 1.4e-5,-74.083337 m 18.520836,0 -1e-5,74.083337 m 18.52084,0 v -74.083337 m 18.52083,0 -1e-5,74.083337 m 18.52082,0 2e-5,-74.083337 m 18.52085,18.52083 H 36.854029 m -7e-6,18.5208395 H 185.02069 m 0,18.5208325 H 36.854022"
-           id="path1171"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="ccccccccccccccccccccccccc" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-6"
-           cx="42.333332"
-           cy="32.416679"
-           r="0.52778977"
-           d="m 42.861122,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="42.333332"
-           sodipodi:cy="32.416679"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-3"
-           cx="52.916668"
-           cy="32.416679"
-           r="0.52778977"
-           d="m 53.444458,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="52.916668"
-           sodipodi:cy="32.416679"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-78-9"
-           cx="63.5"
-           cy="32.416679"
-           r="0.52778977"
-           d="m 64.02779,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="63.5"
-           sodipodi:cy="32.416679"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-9-1"
-           cx="74.083336"
-           cy="32.416679"
-           r="0.52778977"
-           d="m 74.611126,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="74.083336"
-           sodipodi:cy="32.416679"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-0-6"
-           cx="84.666664"
-           cy="32.416679"
-           r="0.52778977"
-           d="m 85.194454,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="84.666664"
-           sodipodi:cy="32.416679"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-0-8"
-           cx="95.25"
-           cy="32.416679"
-           r="0.52778977"
-           d="m 95.77779,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="95.25"
-           sodipodi:cy="32.416679"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-1-5"
-           cx="105.83334"
-           cy="32.416679"
-           r="0.52778977"
-           d="m 106.36113,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="105.83334"
-           sodipodi:cy="32.416679"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-7-5"
-           cx="116.41665"
-           cy="32.416679"
-           r="0.52778977"
-           d="m 116.94444,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="116.41665"
-           sodipodi:cy="32.416679"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-4"
-           cx="42.333332"
-           cy="43.000011"
-           r="0.52778977"
-           d="m 42.861122,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="42.333332"
-           sodipodi:cy="43.000011"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-2"
-           cx="52.916668"
-           cy="43.000011"
-           r="0.52778977"
-           d="m 53.444458,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="52.916668"
-           sodipodi:cy="43.000011"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-78-3"
-           cx="63.5"
-           cy="43.000011"
-           r="0.52778977"
-           d="m 64.02779,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="63.5"
-           sodipodi:cy="43.000011"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-9-0"
-           cx="74.083336"
-           cy="43.000011"
-           r="0.52778977"
-           d="m 74.611126,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="74.083336"
-           sodipodi:cy="43.000011"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-0-9"
-           cx="84.666664"
-           cy="43.000011"
-           r="0.52778977"
-           d="m 85.194454,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="84.666664"
-           sodipodi:cy="43.000011"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-0-1"
-           cx="95.25"
-           cy="43.000011"
-           r="0.52778977"
-           d="m 95.77779,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="95.25"
-           sodipodi:cy="43.000011"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-1-9"
-           cx="105.83334"
-           cy="43.000011"
-           r="0.52778977"
-           d="m 106.36113,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="105.83334"
-           sodipodi:cy="43.000011"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-7-7"
-           cx="116.41665"
-           cy="43.000011"
-           r="0.52778977"
-           d="m 116.94444,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z"
-           sodipodi:cx="116.41665"
-           sodipodi:cy="43.000011"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-14"
-           cx="42.333332"
-           cy="53.583344"
-           r="0.52778977"
-           d="m 42.861122,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-           sodipodi:cx="42.333332"
-           sodipodi:cy="53.583344"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-4"
-           cx="52.916668"
-           cy="53.583344"
-           r="0.52778977"
-           d="m 53.444458,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-           sodipodi:cx="52.916668"
-           sodipodi:cy="53.583344"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-78-7"
-           cx="63.5"
-           cy="53.583344"
-           r="0.52778977"
-           d="m 64.02779,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-           sodipodi:cx="63.5"
-           sodipodi:cy="53.583344"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-9-8"
-           cx="74.083336"
-           cy="53.583344"
-           r="0.52778977"
-           d="m 74.611126,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-           sodipodi:cx="74.083336"
-           sodipodi:cy="53.583344"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-0-7"
-           cx="84.666664"
-           cy="53.583344"
-           r="0.52778977"
-           d="m 85.194454,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-           sodipodi:cx="84.666664"
-           sodipodi:cy="53.583344"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-0-9"
-           cx="95.25"
-           cy="53.583344"
-           r="0.52778977"
-           d="m 95.77779,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-           sodipodi:cx="95.25"
-           sodipodi:cy="53.583344"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-1-4"
-           cx="105.83334"
-           cy="53.583344"
-           r="0.52778977"
-           d="m 106.36113,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-           sodipodi:cx="105.83334"
-           sodipodi:cy="53.583344"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none"
-           id="path4517-7-7-52"
-           cx="116.41665"
-           cy="53.583344"
-           r="0.52778977"
-           d="m 116.94444,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z"
-           sodipodi:cx="116.41665"
-           sodipodi:cy="53.583344"
-           sodipodi:rx="0.52778977"
-           sodipodi:ry="0.52778977"
-           transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718761)" />
-        <path
-           style="fill:none;stroke:#808080;stroke-width:0.16467975;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-           d="M 141.36444,16.782908 V 31.13271"
-           id="path3054-3"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="cc" />
-        <path
-           style="fill:none;stroke:#808080;stroke-width:0.13229167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-           d="m 129.45819,18.864575 h 14.55208"
-           id="path3054"
-           inkscape:connector-curvature="0" />
-        <rect
-           style="fill:none;stroke:#ff0000;stroke-width:0.5291667;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.11666671, 2.11666671;stroke-dashoffset:0"
-           id="rect1609"
-           width="37.041668"
-           height="37.041668"
-           x="58.020679"
-           y="-9.6041584"
-           transform="scale(1,-1)" />
-        <rect
-           style="fill:none;stroke:#ff0000;stroke-width:0.5291667;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.11666671, 2.11666671;stroke-dashoffset:0"
-           id="rect1609-6"
-           width="37.041668"
-           height="37.041668"
-           x="132.10402"
-           y="-28.124992"
-           transform="scale(1,-1)" />
-        <g
-           id="g3736">
-          <path
-             d="m 130.47105,15.425011 q 0,0.417545 -0.27906,0.690397 -0.27698,0.272851 -0.70073,0.272851 -0.1633,0 -0.3452,-0.04547 -0.1819,-0.04547 -0.31212,-0.132291 v 0.983919 h -0.38861 v -3.079915 q 0,-0.463021 0.26045,-0.725537 0.26252,-0.262517 0.72347,-0.262517 0.18603,0 0.339,0.04548 0.15503,0.04341 0.27698,0.138492 0.11783,0.08888 0.1881,0.231511 0.0703,0.142627 0.0703,0.330729 0,0.262516 -0.14469,0.458887 -0.14262,0.194303 -0.40514,0.270784 v 0.03514 q 0.32866,0.05374 0.52296,0.260449 0.19431,0.204639 0.19431,0.5271 z m -0.40101,-0.01034 q 0,-0.183969 -0.0724,-0.297657 -0.0703,-0.115755 -0.19017,-0.179834 -0.12196,-0.06615 -0.27285,-0.08888 -0.1509,-0.02274 -0.30179,-0.02274 h -0.0744 v -0.330729 h 0.0744 q 0.13642,0 0.27078,-0.02894 0.13436,-0.03101 0.21497,-0.09302 0.0951,-0.07028 0.14056,-0.171566 0.0475,-0.101286 0.0475,-0.276986 0,-0.23151 -0.14262,-0.351399 -0.14263,-0.11989 -0.36794,-0.11989 -0.1509,0 -0.25838,0.05581 -0.10749,0.05374 -0.1757,0.144694 -0.0661,0.09095 -0.0971,0.212907 -0.031,0.119889 -0.031,0.248047 v 1.781803 q 0.13642,0.07855 0.29145,0.111621 0.15503,0.03101 0.30386,0.03101 0.30799,0 0.47336,-0.161231 0.16743,-0.163297 0.16743,-0.46302 z"
-             style="font-size:4.23333311px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:1.25;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal'"
-             id="path1092"
-             inkscape:connector-curvature="0" />
-          <path
-             sodipodi:nodetypes="cc"
-             style="fill:#000000;stroke:#000000;stroke-width:0.26458335;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker2415)"
-             d="m 129.45819,30.770825 0,-11.90625"
-             id="path2429"
-             inkscape:connector-curvature="0" />
-        </g>
-        <g
-           id="g3740">
-          <text
-             id="text5070-2-1"
-             y="6.2589712"
-             x="138.71861"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1"
-               y="6.2589712"
-               x="138.71861"
-               id="tspan5068-0-6"
-               sodipodi:role="line"><tspan
-                 id="tspan7821"
-                 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000"> i0j1</tspan></tspan></text>
-          <text
-             id="text5070-2-1-7"
-             y="6.2589712"
-             x="157.23944"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               sodipodi:role="line"
-               id="tspan4060"
-               x="157.23944"
-               y="6.2589712"
-               style="font-size:3.52777696px;line-height:1.25"> i1j1</tspan></text>
-          <text
-             id="text5070-2-1-0"
-             y="24.779802"
-             x="138.71861"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               sodipodi:role="line"
-               id="tspan4064"
-               x="138.71861"
-               y="24.779802"
-               style="font-size:3.52777696px;line-height:1.25"> i0j0</tspan></text>
-          <text
-             id="text5070-2-1-2"
-             y="24.779802"
-             x="157.23944"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               sodipodi:role="line"
-               id="tspan4054"
-               x="157.23944"
-               y="24.779802"
-               style="font-size:3.52777696px;line-height:1.25"> i1j0</tspan><tspan
-               sodipodi:role="line"
-               id="tspan4056"
-               x="157.23944"
-               y="29.189524"
-               style="font-size:3.52777696px;line-height:1.25"> </tspan></text>
-        </g>
-        <g
-           id="g3778">
-          <path
-             sodipodi:nodetypes="cc"
-             inkscape:connector-curvature="0"
-             id="path1063"
-             d="m 150.36028,9.868741 -8.20209,8.202084"
-             style="fill:none;stroke:#ff0000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)" />
-          <g
-             id="g3773">
-            <circle
-               style="fill:#ff0000;fill-opacity:1;stroke:none"
-               id="path4517-0-8-5"
-               cx="141.36444"
-               cy="-31.406267"
-               r="0.92363214"
-               d="m 142.28807,-31.406267 c 0,0.510108 -0.41352,0.923632 -0.92363,0.923632 -0.51011,0 -0.92363,-0.413524 -0.92363,-0.923632 0,-0.510108 0.41352,-0.923632 0.92363,-0.923632 0.51011,0 0.92363,0.413524 0.92363,0.923632 z"
-               sodipodi:cx="141.36444"
-               sodipodi:cy="-31.406267"
-               sodipodi:rx="0.92363214"
-               sodipodi:ry="0.92363214"
-               transform="matrix(1,0,0,-1,0,-12.541691)" />
-            <text
-               xml:space="preserve"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-               x="143.54691"
-               y="20.09103"
-               id="text5070"><tspan
-                 sodipodi:role="line"
-                 id="tspan5068"
-                 x="143.54691"
-                 y="20.09103"
-                 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1">(u-0.5,v-0.5)</tspan></text>
-          </g>
-          <g
-             id="g3768">
-            <circle
-               style="fill:#ff0000;fill-opacity:1;stroke:none"
-               id="path4517-0-8"
-               cx="150.62486"
-               cy="-22.145849"
-               r="0.92363214"
-               d="m 151.54849,-22.145849 c 0,0.510108 -0.41352,0.923632 -0.92363,0.923632 -0.51011,0 -0.92363,-0.413524 -0.92363,-0.923632 0,-0.510108 0.41352,-0.923632 0.92363,-0.923632 0.51011,0 0.92363,0.413524 0.92363,0.923632 z"
-               sodipodi:cx="150.62486"
-               sodipodi:cy="-22.145849"
-               sodipodi:rx="0.92363214"
-               sodipodi:ry="0.92363214"
-               transform="matrix(1,0,0,-1,0,-12.541691)" />
-            <text
-               xml:space="preserve"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-               x="152.21477"
-               y="10.830611"
-               id="text5070-2"><tspan
-                 sodipodi:role="line"
-                 id="tspan5068-0"
-                 x="152.21477"
-                 y="10.830611"
-                 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1">(u,v)</tspan></text>
-          </g>
-        </g>
-        <g
-           id="g3754">
-          <text
-             id="text5070-2-1-06"
-             y="-16.495201"
-             x="64.635269"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               sodipodi:role="line"
-               id="tspan4046"
-               x="64.635269"
-               y="-16.495201"
-               style="font-size:3.52777696px;line-height:0.34999999"> i0j1'</tspan></text>
-          <text
-             id="text5070-2-1-25"
-             y="-16.495201"
-             x="83.156105"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               sodipodi:role="line"
-               id="tspan4048"
-               x="83.156105"
-               y="-16.495201"
-               style="font-size:3.52777696px;line-height:0.34999999"> i1j1'</tspan></text>
-          <text
-             id="text5070-2-1-75"
-             y="2.0256376"
-             x="64.635269"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               sodipodi:role="line"
-               id="tspan4044"
-               x="64.635269"
-               y="2.0256376"
-               style="font-size:3.52777696px;line-height:0.34999999"> i0j0'</tspan></text>
-          <text
-             id="text5070-2-1-3"
-             y="2.0256376"
-             x="83.156105"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-             xml:space="preserve"><tspan
-               sodipodi:role="line"
-               id="tspan4050"
-               x="83.156105"
-               y="2.0256376"
-               style="font-size:3.52777696px;line-height:0.34999999"> i1j0'</tspan></text>
-        </g>
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/vulkantexture0.svg b/registry/vulkan/images/vulkantexture0.svg
deleted file mode 100644
index b3c1d6c..0000000
--- a/registry/vulkan/images/vulkantexture0.svg
+++ /dev/null
@@ -1,1005 +0,0 @@
-<?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"
-   width="706.10547"
-   height="384.11328"
-   viewBox="0 0 186.82375 101.62997"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="vulkantexture0.svg">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="marker2415"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path2413"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible;"
-       id="marker1517"
-       refX="0.0"
-       refY="0.0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path1515" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Mend"
-       style="overflow:visible;"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path1132"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Lend"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path1144"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(1.1) rotate(180) translate(1,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1073"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1071"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path977"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path977-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481-0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker2415-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path2413-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1.4142136"
-     inkscape:cx="409.64232"
-     inkscape:cy="244.46273"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="1672"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     fit-margin-left="1"
-     units="px"
-     inkscape:snap-center="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid12"
-       originx="0.79995428"
-       originy="-29.882412"
-       dotted="false" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-6.9498988,47.8249)">
-    <path
-       style="fill:none;stroke:#808080;stroke-width:0.13229167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 141.36444,-24.791682 v -9.260417"
-       id="path3054-3"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       style="fill:none;stroke:#808080;stroke-width:0.13229167;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
-       d="m 129.45819,-31.406266 h 14.55208"
-       id="path3054"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g1953"
-       transform="translate(-2.6458349,-3.056108e-6)">
-      <text
-         id="text121"
-         y="-32.729179"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="-32.729179"
-           x="34.208187"
-           id="tspan119"
-           sodipodi:role="line">3</tspan></text>
-      <text
-         id="text121-3"
-         y="-14.208342"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="-14.208342"
-           x="34.208187"
-           id="tspan119-1"
-           sodipodi:role="line">2</tspan></text>
-      <text
-         id="text121-0"
-         y="4.3124924"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="4.3124924"
-           x="34.208187"
-           id="tspan119-4"
-           sodipodi:role="line">1</tspan></text>
-      <text
-         id="text121-33"
-         y="22.833326"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="22.833326"
-           x="34.208187"
-           id="tspan119-6"
-           sodipodi:role="line">0</tspan></text>
-      <text
-         id="text121-6"
-         y="36.062492"
-         x="47.437355"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="47.437355"
-           id="tspan119-11"
-           sodipodi:role="line">0</tspan></text>
-      <text
-         id="text121-30"
-         y="36.062492"
-         x="65.958191"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="65.958191"
-           id="tspan119-47"
-           sodipodi:role="line">1</tspan></text>
-      <text
-         id="text121-1"
-         y="36.062492"
-         x="84.479027"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="84.479027"
-           id="tspan119-9"
-           sodipodi:role="line">2</tspan></text>
-      <text
-         id="text121-8"
-         y="36.062492"
-         x="102.99986"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="102.99986"
-           id="tspan119-7"
-           sodipodi:role="line">3</tspan></text>
-      <text
-         id="text121-4"
-         y="36.062492"
-         x="121.52069"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="121.52069"
-           id="tspan119-0"
-           sodipodi:role="line">4</tspan></text>
-      <text
-         id="text121-7"
-         y="36.062492"
-         x="140.04152"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="140.04152"
-           id="tspan119-8"
-           sodipodi:role="line">5</tspan></text>
-      <text
-         id="text121-79"
-         y="36.062492"
-         x="158.56236"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="158.56236"
-           id="tspan119-16"
-           sodipodi:role="line">6</tspan></text>
-      <text
-         id="text121-31"
-         y="36.062492"
-         x="177.08319"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="177.08319"
-           id="tspan119-09"
-           sodipodi:role="line">7</tspan></text>
-      <text
-         id="text121-3-7"
-         y="-5.1587644"
-         x="34.4366"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-           y="-5.1587644"
-           x="34.4366"
-           id="tspan119-1-8"
-           sodipodi:role="line">j</tspan></text>
-      <text
-         id="text121-3-7-3"
-         y="37.611752"
-         x="113.4819"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-           y="37.611752"
-           x="113.4819"
-           id="tspan119-1-8-7"
-           sodipodi:role="line">i</tspan></text>
-      <g
-         style="stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none"
-         transform="matrix(1.7500001,0,0,1.7500001,-25.323064,-72.260449)"
-         id="g1463">
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517"
-           cx="42.333332"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7"
-           cx="52.916668"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-78"
-           cx="63.5"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-9"
-           cx="74.083336"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-0"
-           cx="84.666664"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-0"
-           cx="95.25"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-1"
-           cx="105.83334"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-7"
-           cx="116.41666"
-           cy="21.833345"
-           r="0.52778977" />
-        <path
-           style="fill:none;stroke:#808080;stroke-width:0.15119047;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 37.041666,16.541679 h 84.666664 l 1e-5,42.333333 H 37.041671 l -5e-6,-42.333333 m 10.583334,0 4e-6,42.333333 m 10.583332,0 -4e-6,-42.333333 m 10.583332,0 8e-6,42.333333 m 10.583336,0 -8e-6,-42.333333 m 10.583336,0 v 42.333333 m 10.583334,0 -1e-5,-42.333333 m 10.58333,0 1e-5,42.333333 M 121.70834,48.291681 H 37.041671 m -4e-6,-10.583336 h 84.666663 m 0,-10.583332 H 37.041667"
-           id="path1171"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="ccccccccccccccccccccccccc" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-6"
-           cx="42.333332"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-3"
-           cx="52.916668"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-78-9"
-           cx="63.5"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-9-1"
-           cx="74.083336"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-0-6"
-           cx="84.666664"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-0-8"
-           cx="95.25"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-1-5"
-           cx="105.83334"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-7-5"
-           cx="116.41665"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-4"
-           cx="42.333332"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-2"
-           cx="52.916668"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-78-3"
-           cx="63.5"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-9-0"
-           cx="74.083336"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-0-9"
-           cx="84.666664"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-0-1"
-           cx="95.25"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-1-9"
-           cx="105.83334"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-7-7"
-           cx="116.41665"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-14"
-           cx="42.333332"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-4"
-           cx="52.916668"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-78-7"
-           cx="63.5"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-9-8"
-           cx="74.083336"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-0-7"
-           cx="84.666664"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-0-9"
-           cx="95.25"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-1-4"
-           cx="105.83334"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-7-52"
-           cx="116.41665"
-           cy="53.583344"
-           r="0.52778977" />
-      </g>
-      <g
-         transform="translate(-23.812502,2.2e-6)"
-         id="g1370">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="54.556301"
-           y="45.537884"
-           id="text121-09-74"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18"
-             x="54.556301"
-             y="45.537884"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="213.32181"
-           y="45.538918"
-           id="text121-09-74-5"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18-0"
-             x="213.32181"
-             y="45.538918"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">8.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           id="path972"
-           inkscape:connector-curvature="0" />
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="137.32748"
-           y="45.122406"
-           id="text121-3-7-3-3"><tspan
-             sodipodi:role="line"
-             id="tspan119-1-8-7-2"
-             x="137.32748"
-             y="45.122406"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">u</tspan></text>
-      </g>
-      <g
-         transform="translate(-23.812505,7.9375005)"
-         id="g1471">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="54.556301"
-           y="45.537884"
-           id="text121-09-74-7"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18-1"
-             x="54.556301"
-             y="45.537884"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="213.32181"
-           y="45.538918"
-           id="text121-09-74-5-4"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18-0-9"
-             x="213.32181"
-             y="45.538918"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)"
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           id="path972-8"
-           inkscape:connector-curvature="0" />
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="137.32748"
-           y="45.122406"
-           id="text121-3-7-3-3-5"><tspan
-             sodipodi:role="line"
-             id="tspan119-1-8-7-2-2"
-             x="137.32748"
-             y="45.122406"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">s</tspan></text>
-      </g>
-      <g
-         transform="translate(-23.812501,2.6458339)"
-         id="g1597">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="44.034977"
-           y="-47.066288"
-           id="text121-09"><tspan
-             sodipodi:role="line"
-             id="tspan119-67"
-             x="44.034977"
-             y="-47.066288"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">4.0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="43.972965"
-           y="32.308716"
-           id="text121-09-7"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-1"
-             x="43.972965"
-             y="32.308716"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-        <path
-           inkscape:connector-curvature="0"
-           id="path1473"
-           d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)" />
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="46.93816"
-           y="-7.8045983"
-           id="text121-3-7-8"><tspan
-             sodipodi:role="line"
-             id="tspan119-1-8-3"
-             x="46.93816"
-             y="-7.8045983"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">v</tspan></text>
-      </g>
-      <g
-         id="g1613-5"
-         transform="translate(-34.395835,2.6458339)">
-        <g
-           id="g1802">
-          <text
-             xml:space="preserve"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             x="44.034977"
-             y="-47.066288"
-             id="text1601-4"><tspan
-               sodipodi:role="line"
-               id="tspan1599-1"
-               x="44.034977"
-               y="-47.066288"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1.0</tspan></text>
-          <text
-             xml:space="preserve"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             x="43.972965"
-             y="32.308716"
-             id="text1605-6"><tspan
-               sodipodi:role="line"
-               id="tspan1603-7"
-               x="43.972965"
-               y="32.308716"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-          <path
-             inkscape:connector-curvature="0"
-             id="path1607-6"
-             d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835"
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483-7)" />
-          <text
-             xml:space="preserve"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             x="46.93816"
-             y="-7.8045983"
-             id="text1611-4"><tspan
-               sodipodi:role="line"
-               id="tspan1609-3"
-               x="46.93816"
-               y="-7.8045983"
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">t</tspan></text>
-        </g>
-      </g>
-    </g>
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:0.52916668;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:2.11666671,2.11666671;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect1609"
-       width="37.041668"
-       height="37.041668"
-       x="58.020679"
-       y="-22.145849" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:0.52916668;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:2.11666671,2.11666671;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect1609-6"
-       width="37.041668"
-       height="37.041668"
-       x="132.10402"
-       y="-40.666683" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1517)"
-       d="M 138.7186,-34.0521 84.479021,-16.060432"
-       id="path1842"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458335;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8"
-       cx="150.62486"
-       cy="-22.145849"
-       r="0.92363214" />
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.26458335;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       id="path4517-0-8-5"
-       cx="141.36444"
-       cy="-31.406267"
-       r="0.92363214" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
-       d="m 150.36028,-22.410432 -8.20209,-8.202084"
-       id="path1063"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path2429"
-       d="m 129.45819,-43.312516 0,11.90625"
-       style="fill:#000000;stroke:#000000;stroke-width:0.26458335;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2415)"
-       sodipodi:nodetypes="cc" />
-    <g
-       aria-label="β"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       id="text4435-7"
-       transform="translate(39.406026,-59.711681)">
-      <path
-         d="m 91.06502,15.340827 q 0,0.417545 -0.279053,0.690397 -0.276985,0.272851 -0.700732,0.272851 -0.163298,0 -0.345199,-0.04547 -0.181901,-0.04547 -0.312125,-0.132291 v 0.983919 h -0.388607 v -3.079915 q 0,-0.463021 0.260449,-0.725537 0.262517,-0.262517 0.72347,-0.262517 0.186035,0 0.338998,0.04548 0.155029,0.04341 0.276985,0.138492 0.117823,0.08888 0.188103,0.231511 0.07028,0.142627 0.07028,0.330729 0,0.262516 -0.144694,0.458887 -0.142626,0.194303 -0.405143,0.270784 v 0.03514 q 0.328662,0.05374 0.522966,0.260449 0.194303,0.204639 0.194303,0.5271 z m -0.401009,-0.01034 q 0,-0.183969 -0.07235,-0.297657 -0.07028,-0.115755 -0.190169,-0.179834 -0.121957,-0.06615 -0.272852,-0.08888 -0.150895,-0.02274 -0.30179,-0.02274 h -0.07441 v -0.330729 h 0.07441 q 0.136426,0 0.270784,-0.02894 0.134359,-0.03101 0.214974,-0.09302 0.09508,-0.07028 0.14056,-0.171566 0.04754,-0.101286 0.04754,-0.276986 0,-0.23151 -0.142627,-0.351399 -0.142627,-0.11989 -0.367937,-0.11989 -0.150895,0 -0.258382,0.05581 -0.107487,0.05374 -0.1757,0.144694 -0.06614,0.09095 -0.09715,0.212907 -0.03101,0.119889 -0.03101,0.248047 v 1.781803 q 0.136426,0.07855 0.291455,0.111621 0.155029,0.03101 0.303857,0.03101 0.307992,0 0.473356,-0.161231 0.167432,-0.163297 0.167432,-0.46302 z"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke-width:0.26458332"
-         id="path1092"
-         inkscape:connector-curvature="0" />
-    </g>
-    <path
-       inkscape:connector-curvature="0"
-       id="path2429-6"
-       d="m 129.45819,-24.791682 11.90625,0"
-       style="fill:#000000;stroke:#000000;stroke-width:0.26458335;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2415-4)"
-       sodipodi:nodetypes="cc" />
-    <g
-       aria-label="α"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       id="text4435"
-       transform="translate(39.583579,-51.952863)">
-      <path
-         d="M 89.567652,28.315626 H 89.179045 V 28.07378 q -0.167432,0.144694 -0.349333,0.22531 -0.181901,0.08062 -0.394808,0.08062 -0.413411,0 -0.657324,-0.318327 -0.241845,-0.318327 -0.241845,-0.882633 0,-0.293522 0.08268,-0.522966 0.08475,-0.229443 0.227376,-0.390674 0.14056,-0.157096 0.326595,-0.239778 0.188102,-0.08268 0.388607,-0.08268 0.181901,0 0.322461,0.04548 0.14056,0.04547 0.295589,0.12609 v -0.107487 h 0.388607 z m -0.388607,-0.568441 v -1.314648 q -0.157096,-0.07028 -0.28112,-0.101286 -0.124023,-0.03307 -0.270784,-0.03307 -0.326595,0 -0.508496,0.227377 -0.181901,0.227376 -0.181901,0.644921 0,0.411345 0.14056,0.626319 0.140559,0.212907 0.450618,0.212907 0.165365,0 0.334863,-0.07235 0.169499,-0.07441 0.31626,-0.19017 z"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke-width:0.26458332"
-         id="path1089"
-         inkscape:connector-curvature="0" />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="138.71861"
-       y="-35.375015"
-       id="text5070-2-1"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-6"
-         x="138.71861"
-         y="-35.375015"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke-width:0.26458332"
-           id="tspan7821"> i0j0</tspan></tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="157.23944"
-       y="-35.375015"
-       id="text5070-2-1-7"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-6-0"
-         x="157.23944"
-         y="-35.375015"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke-width:0.26458332"
-           id="tspan7821-1"> i1j0</tspan></tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="138.71861"
-       y="-16.854183"
-       id="text5070-2-1-0"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-6-9"
-         x="138.71861"
-         y="-16.854183"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke-width:0.26458332"
-           id="tspan7821-8"> i0j1</tspan></tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="157.23944"
-       y="-16.854183"
-       id="text5070-2-1-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-6-6"
-         x="157.23944"
-         y="-16.854183"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke-width:0.26458332"
-           id="tspan7821-9"> i1j1</tspan></tspan></text>
-    <g
-       aria-label="(Δi,Δj)"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       id="text5070-2-2"
-       transform="matrix(1.5625,0,0,1.5625,-11.182435,-64.739243)">
-      <path
-         d="m 71.619395,25.566439 h -0.219108 q -0.09302,-0.150895 -0.152962,-0.326595 -0.05994,-0.1757 -0.05994,-0.366903 0,-0.19637 0.04754,-0.378271 0.04754,-0.182935 0.139527,-0.359668 0.08785,-0.167432 0.209806,-0.317294 0.12299,-0.149861 0.270784,-0.285253 h 0.233578 v 0.01034 q -0.117822,0.08682 -0.24598,0.220141 -0.127124,0.133326 -0.229443,0.294556 -0.104387,0.164331 -0.170532,0.362769 -0.06511,0.197404 -0.06511,0.416512 0,0.224275 0.06511,0.408243 0.06511,0.185002 0.176733,0.311092 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1095"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 73.377427,25.140625 h -1.434538 l 0.936377,-1.538924 h 0.272852 z m -0.226343,-0.166398 -0.173633,-1.192692 -0.72347,1.192692 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1097"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 74.166009,23.591366 -0.04651,0.201538 H 73.90039 l 0.04651,-0.201538 z m -0.103353,0.394808 -0.26665,1.154451 h -0.194303 l 0.26665,-1.154451 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1099"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 74.663137,24.846069 -0.448552,0.676962 H 74.06369 l 0.334863,-0.676962 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1101"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 76.267173,25.140625 h -1.434538 l 0.936377,-1.538924 h 0.272852 z m -0.226343,-0.166398 -0.173632,-1.192692 -0.723471,1.192692 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1103"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 77.162209,23.792904 h -0.221175 l 0.04651,-0.201538 h 0.221175 z M 76.83148,25.16853 q -0.04651,0.200505 -0.165365,0.304891 -0.117822,0.104387 -0.293522,0.104387 -0.04134,0 -0.10852,-0.0083 -0.06718,-0.0083 -0.110588,-0.02067 l 0.04031,-0.176734 h 0.01033 q 0.02997,0.01344 0.07131,0.02584 0.04031,0.01343 0.09405,0.01343 0.07235,0 0.120922,-0.02274 0.04961,-0.0217 0.08062,-0.06615 0.02997,-0.04341 0.04961,-0.10852 0.01964,-0.06408 0.03514,-0.134359 l 0.216007,-0.937411 h -0.240812 l 0.03617,-0.156062 h 0.437182 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1105"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 77.977663,24.225952 q 0,0.195337 -0.04858,0.382406 -0.04858,0.186035 -0.138493,0.355534 -0.08992,0.169498 -0.212907,0.320393 -0.12299,0.151929 -0.267684,0.282154 h -0.233577 v -0.01034 q 0.118856,-0.08888 0.244946,-0.219108 0.127124,-0.129191 0.230477,-0.295589 0.117822,-0.190169 0.176733,-0.381372 0.05891,-0.191203 0.05891,-0.397908 0,-0.220142 -0.06511,-0.405144 -0.06408,-0.186035 -0.176733,-0.314192 v -0.01034 h 0.219108 q 0.09198,0.149861 0.151929,0.325561 0.06098,0.174666 0.06098,0.367936 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1107"
-         inkscape:connector-curvature="0" />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="143.54691"
-       y="-30.420969"
-       id="text5070"><tspan
-         sodipodi:role="line"
-         id="tspan5068"
-         x="143.54691"
-         y="-30.420969"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332">(u-0.5, v-0.5)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="152.21477"
-       y="-21.160551"
-       id="text5070-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0"
-         x="152.21477"
-         y="-21.160551"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332">(u, v)</tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="64.635269"
-       y="-16.854183"
-       id="text5070-2-1-06"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-6-3"
-         x="64.635269"
-         y="-16.854183"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke-width:0.26458332"
-           id="tspan7821-86"> i0j0'</tspan></tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="83.156105"
-       y="-16.854183"
-       id="text5070-2-1-25"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-6-7"
-         x="83.156105"
-         y="-16.854183"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke-width:0.26458332"
-           id="tspan7821-7"> i1j0'</tspan></tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="64.635269"
-       y="1.6666514"
-       id="text5070-2-1-75"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-6-2"
-         x="64.635269"
-         y="1.6666514"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke-width:0.26458332"
-           id="tspan7821-3"> i0j1'</tspan></tspan></text>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="83.156105"
-       y="1.6666514"
-       id="text5070-2-1-3"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-6-8"
-         x="83.156105"
-         y="1.6666514"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke-width:0.26458332"
-           id="tspan7821-4"> i1j1'</tspan></tspan></text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/vulkantexture1-ll.svg b/registry/vulkan/images/vulkantexture1-ll.svg
deleted file mode 100644
index e5dc411..0000000
--- a/registry/vulkan/images/vulkantexture1-ll.svg
+++ /dev/null
@@ -1,1008 +0,0 @@
-<?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"
-   width="706.10547"
-   height="384.11328"
-   viewBox="0 0 186.82375 101.62997"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
-   sodipodi:docname="vulkantexture1-ll.svg">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="marker2415"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path2413"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible;"
-       id="marker1517"
-       refX="0.0"
-       refY="0.0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path1515" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Lend"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path1144"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(1.1) rotate(180) translate(1,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1073"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1071"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path977"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path977-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481-0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker2415-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path2413-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2"
-     inkscape:cx="423.62557"
-     inkscape:cy="183.39269"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:window-width="2199"
-     inkscape:window-height="1151"
-     inkscape:window-x="356"
-     inkscape:window-y="398"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     fit-margin-left="1"
-     units="px"
-     inkscape:snap-center="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid12"
-       originx="0.79995428"
-       originy="-29.882412"
-       dotted="false" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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 />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-6.9498988,47.8249)">
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1517)"
-       d="M 157.23948,2.9895792 102.99988,-15.002089"
-       id="path1842"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <g
-       id="g1953"
-       transform="translate(-2.6458349,-3.056108e-6)">
-      <text
-         id="text121"
-         y="-32.729179"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="-32.729179"
-           x="34.208187"
-           id="tspan119"
-           sodipodi:role="line">3</tspan></text>
-      <text
-         id="text121-3"
-         y="-14.208342"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="-14.208342"
-           x="34.208187"
-           id="tspan119-1"
-           sodipodi:role="line">2</tspan></text>
-      <text
-         id="text121-0"
-         y="4.3124924"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="4.3124924"
-           x="34.208187"
-           id="tspan119-4"
-           sodipodi:role="line">1</tspan></text>
-      <text
-         id="text121-33"
-         y="22.833326"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="22.833326"
-           x="34.208187"
-           id="tspan119-6"
-           sodipodi:role="line">0</tspan></text>
-      <text
-         id="text121-6"
-         y="36.062492"
-         x="47.437355"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="47.437355"
-           id="tspan119-11"
-           sodipodi:role="line">0</tspan></text>
-      <text
-         id="text121-30"
-         y="36.062492"
-         x="65.958191"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="65.958191"
-           id="tspan119-47"
-           sodipodi:role="line">1</tspan></text>
-      <text
-         id="text121-1"
-         y="36.062492"
-         x="84.479027"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="84.479027"
-           id="tspan119-9"
-           sodipodi:role="line">2</tspan></text>
-      <text
-         id="text121-8"
-         y="36.062492"
-         x="102.99986"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="102.99986"
-           id="tspan119-7"
-           sodipodi:role="line">3</tspan></text>
-      <text
-         id="text121-4"
-         y="36.062492"
-         x="121.52069"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="121.52069"
-           id="tspan119-0"
-           sodipodi:role="line">4</tspan></text>
-      <text
-         id="text121-7"
-         y="36.062492"
-         x="140.04152"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="140.04152"
-           id="tspan119-8"
-           sodipodi:role="line">5</tspan></text>
-      <text
-         id="text121-79"
-         y="36.062492"
-         x="158.56236"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="158.56236"
-           id="tspan119-16"
-           sodipodi:role="line">6</tspan></text>
-      <text
-         id="text121-31"
-         y="36.062492"
-         x="177.08319"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="177.08319"
-           id="tspan119-09"
-           sodipodi:role="line">7</tspan></text>
-      <text
-         id="text121-3-7"
-         y="-5.1587644"
-         x="34.4366"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-           y="-5.1587644"
-           x="34.4366"
-           id="tspan119-1-8"
-           sodipodi:role="line">j</tspan></text>
-      <text
-         id="text121-3-7-3"
-         y="37.611752"
-         x="113.4819"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-           y="37.611752"
-           x="113.4819"
-           id="tspan119-1-8-7"
-           sodipodi:role="line">i</tspan></text>
-      <g
-         transform="translate(-23.812502,2.2e-6)"
-         id="g1370">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="54.556301"
-           y="45.537884"
-           id="text121-09-74"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18"
-             x="54.556301"
-             y="45.537884"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="213.32181"
-           y="45.538918"
-           id="text121-09-74-5"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18-0"
-             x="213.32181"
-             y="45.538918"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">8.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           id="path972"
-           inkscape:connector-curvature="0" />
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="137.32748"
-           y="45.122406"
-           id="text121-3-7-3-3"><tspan
-             sodipodi:role="line"
-             id="tspan119-1-8-7-2"
-             x="137.32748"
-             y="45.122406"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">u</tspan></text>
-      </g>
-      <g
-         transform="translate(-23.812505,7.9375005)"
-         id="g1471">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="54.556301"
-           y="45.537884"
-           id="text121-09-74-7"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18-1"
-             x="54.556301"
-             y="45.537884"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="213.32181"
-           y="45.538918"
-           id="text121-09-74-5-4"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18-0-9"
-             x="213.32181"
-             y="45.538918"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)"
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           id="path972-8"
-           inkscape:connector-curvature="0" />
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="137.32748"
-           y="45.122406"
-           id="text121-3-7-3-3-5"><tspan
-             sodipodi:role="line"
-             id="tspan119-1-8-7-2-2"
-             x="137.32748"
-             y="45.122406"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">s</tspan></text>
-      </g>
-      <g
-         transform="translate(-23.812501,2.6458339)"
-         id="g1597">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="44.034977"
-           y="-47.066288"
-           id="text121-09"><tspan
-             sodipodi:role="line"
-             id="tspan119-67"
-             x="44.034977"
-             y="-47.066288"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">4.0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="43.972965"
-           y="32.308716"
-           id="text121-09-7"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-1"
-             x="43.972965"
-             y="32.308716"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-        <path
-           inkscape:connector-curvature="0"
-           id="path1473"
-           d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)" />
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="46.93816"
-           y="-7.8045983"
-           id="text121-3-7-8"><tspan
-             sodipodi:role="line"
-             id="tspan119-1-8-3"
-             x="46.93816"
-             y="-7.8045983"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">v</tspan></text>
-      </g>
-      <g
-         id="g1613-5"
-         transform="translate(-34.395835,2.6458339)">
-        <g
-           id="g1802">
-          <text
-             xml:space="preserve"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             x="44.034977"
-             y="-47.066288"
-             id="text1601-4"><tspan
-               sodipodi:role="line"
-               id="tspan1599-1"
-               x="44.034977"
-               y="-47.066288"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1.0</tspan></text>
-          <text
-             xml:space="preserve"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             x="43.972965"
-             y="32.308716"
-             id="text1605-6"><tspan
-               sodipodi:role="line"
-               id="tspan1603-7"
-               x="43.972965"
-               y="32.308716"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-          <path
-             inkscape:connector-curvature="0"
-             id="path1607-6"
-             d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835"
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483-7)" />
-          <text
-             xml:space="preserve"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             x="46.93816"
-             y="-7.8045983"
-             id="text1611-4"><tspan
-               sodipodi:role="line"
-               id="tspan1609-3"
-               x="46.93816"
-               y="-7.8045983"
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">t</tspan></text>
-        </g>
-      </g>
-    </g>
-    <g
-       style="stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none"
-       transform="matrix(1.7500001,0,0,-1.7500001,-27.968899,59.718765)"
-       id="g1463">
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="42.333332"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517"
-         cx="42.333332"
-         cy="21.833345"
-         r="0.52778977"
-         d="m 42.861122,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="52.916668"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7"
-         cx="52.916668"
-         cy="21.833345"
-         r="0.52778977"
-         d="m 53.444458,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="63.5"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-78"
-         cx="63.5"
-         cy="21.833345"
-         r="0.52778977"
-         d="m 64.02779,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="74.083336"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-9"
-         cx="74.083336"
-         cy="21.833345"
-         r="0.52778977"
-         d="m 74.611126,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="84.666664"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-0"
-         cx="84.666664"
-         cy="21.833345"
-         r="0.52778977"
-         d="m 85.194454,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="95.25"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-0"
-         cx="95.25"
-         cy="21.833345"
-         r="0.52778977"
-         d="m 95.77779,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="105.83334"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-1"
-         cx="105.83334"
-         cy="21.833345"
-         r="0.52778977"
-         d="m 106.36113,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="21.833345"
-         sodipodi:cx="116.41666"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-7"
-         cx="116.41666"
-         cy="21.833345"
-         r="0.52778977"
-         d="m 116.94445,21.833345 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-        <path transform="translate(37.041666 16.541679) scale(0.25 0.25) scale(42.333333 42.333333)" style="fill:none;stroke:#808080;stroke-width:0.015;stroke-linecap:square"
-              d="M0,0 H8 M0,1 H8 M0,2 H8 M0,3 H8 M0,4 H8 M0,0 V4 M1,0 V4 M2,0 V4 M3,0 V4 M4,0 V4 M5,0 V4 M6,0 V4 M7,0 V4 M8,0 V4" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="42.333332"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-6"
-         cx="42.333332"
-         cy="32.416679"
-         r="0.52778977"
-         d="m 42.861122,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="52.916668"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-3"
-         cx="52.916668"
-         cy="32.416679"
-         r="0.52778977"
-         d="m 53.444458,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="63.5"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-78-9"
-         cx="63.5"
-         cy="32.416679"
-         r="0.52778977"
-         d="m 64.02779,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="74.083336"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-9-1"
-         cx="74.083336"
-         cy="32.416679"
-         r="0.52778977"
-         d="m 74.611126,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="84.666664"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-0-6"
-         cx="84.666664"
-         cy="32.416679"
-         r="0.52778977"
-         d="m 85.194454,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="95.25"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-0-8"
-         cx="95.25"
-         cy="32.416679"
-         r="0.52778977"
-         d="m 95.77779,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="105.83334"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-1-5"
-         cx="105.83334"
-         cy="32.416679"
-         r="0.52778977"
-         d="m 106.36113,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="32.416679"
-         sodipodi:cx="116.41665"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-7-5"
-         cx="116.41665"
-         cy="32.416679"
-         r="0.52778977"
-         d="m 116.94444,32.416679 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="42.333332"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-4"
-         cx="42.333332"
-         cy="43.000011"
-         r="0.52778977"
-         d="m 42.861122,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="52.916668"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-2"
-         cx="52.916668"
-         cy="43.000011"
-         r="0.52778977"
-         d="m 53.444458,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="63.5"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-78-3"
-         cx="63.5"
-         cy="43.000011"
-         r="0.52778977"
-         d="m 64.02779,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="74.083336"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-9-0"
-         cx="74.083336"
-         cy="43.000011"
-         r="0.52778977"
-         d="m 74.611126,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="84.666664"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-0-9"
-         cx="84.666664"
-         cy="43.000011"
-         r="0.52778977"
-         d="m 85.194454,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="95.25"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-0-1"
-         cx="95.25"
-         cy="43.000011"
-         r="0.52778977"
-         d="m 95.77779,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="105.83334"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-1-9"
-         cx="105.83334"
-         cy="43.000011"
-         r="0.52778977"
-         d="m 106.36113,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="43.000011"
-         sodipodi:cx="116.41665"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-7-7"
-         cx="116.41665"
-         cy="43.000011"
-         r="0.52778977"
-         d="m 116.94444,43.000011 c 0,0.291491 -0.2363,0.52779 -0.52779,0.52779 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.52779 0,-0.29149 0.2363,-0.527789 0.52779,-0.527789 0.29149,0 0.52779,0.236299 0.52779,0.527789 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="42.333332"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-14"
-         cx="42.333332"
-         cy="53.583344"
-         r="0.52778977"
-         d="m 42.861122,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="52.916668"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-4"
-         cx="52.916668"
-         cy="53.583344"
-         r="0.52778977"
-         d="m 53.444458,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="63.5"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-78-7"
-         cx="63.5"
-         cy="53.583344"
-         r="0.52778977"
-         d="m 64.02779,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="74.083336"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-9-8"
-         cx="74.083336"
-         cy="53.583344"
-         r="0.52778977"
-         d="m 74.611126,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="84.666664"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-0-7"
-         cx="84.666664"
-         cy="53.583344"
-         r="0.52778977"
-         d="m 85.194454,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="95.25"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-0-9"
-         cx="95.25"
-         cy="53.583344"
-         r="0.52778977"
-         d="m 95.77779,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="105.83334"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-1-4"
-         cx="105.83334"
-         cy="53.583344"
-         r="0.52778977"
-         d="m 106.36113,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z" />
-      <circle
-         sodipodi:ry="0.52778977"
-         sodipodi:rx="0.52778977"
-         sodipodi:cy="53.583344"
-         sodipodi:cx="116.41665"
-         style="fill:#000000;fill-opacity:1;stroke:none"
-         id="path4517-7-7-52"
-         cx="116.41665"
-         cy="53.583344"
-         r="0.52778977"
-         d="m 116.94444,53.583344 c 0,0.29149 -0.2363,0.527789 -0.52779,0.527789 -0.29149,0 -0.52779,-0.236299 -0.52779,-0.527789 0,-0.291491 0.2363,-0.52779 0.52779,-0.52779 0.29149,0 0.52779,0.236299 0.52779,0.52779 z" />
-    </g>
-    <rect
-       style="fill:none;stroke:#ff0000;stroke-width:0.5291667;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.11666671, 2.11666671;stroke-dashoffset:0"
-       id="rect1609"
-       width="18.520826"
-       height="18.520876"
-       x="86.066528"
-       y="-0.079162598"
-       transform="scale(1,-1)" />
-    <rect
-       style="fill:none;stroke:#ff0000;stroke-width:0.5291667;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.11666671, 2.11666671;stroke-dashoffset:0"
-       id="rect1609-6"
-       width="18.520836"
-       height="18.520834"
-       x="141.62901"
-       y="-18.600004"
-       transform="scale(1,-1)" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-       x="155.65187"
-       y="7.3173094"
-       id="text5070-2-1-0"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-6-9"
-         x="155.65187"
-         y="7.3173094"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000"
-           id="tspan7821-8"> ij</tspan></tspan></text>
-    <g
-       aria-label="(Δi,Δj)"
-       style="font-size:10.58333302px;font-style:normal;font-weight:normal;line-height:1.25;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:sans-serif"
-       id="text5070-2-2"
-       transform="matrix(1.5625,0,0,1.5625,-1.1282694,-44.645549)">
-      <path
-         d="m 71.619395,25.566439 h -0.219108 q -0.09302,-0.150895 -0.152962,-0.326595 -0.05994,-0.1757 -0.05994,-0.366903 0,-0.19637 0.04754,-0.378271 0.04754,-0.182935 0.139527,-0.359668 0.08785,-0.167432 0.209806,-0.317294 0.12299,-0.149861 0.270784,-0.285253 h 0.233578 v 0.01034 q -0.117822,0.08682 -0.24598,0.220141 -0.127124,0.133326 -0.229443,0.294556 -0.104387,0.164331 -0.170532,0.362769 -0.06511,0.197404 -0.06511,0.416512 0,0.224275 0.06511,0.408243 0.06511,0.185002 0.176733,0.311092 z"
-         style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-         id="path1095"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 73.377427,25.140625 h -1.434538 l 0.936377,-1.538924 h 0.272852 z m -0.226343,-0.166398 -0.173633,-1.192692 -0.72347,1.192692 z"
-         style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-         id="path1097"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 74.166009,23.591366 -0.04651,0.201538 H 73.90039 l 0.04651,-0.201538 z m -0.103353,0.394808 -0.26665,1.154451 h -0.194303 l 0.26665,-1.154451 z"
-         style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-         id="path1099"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 74.663137,24.846069 -0.448552,0.676962 H 74.06369 l 0.334863,-0.676962 z"
-         style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-         id="path1101"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 76.267173,25.140625 h -1.434538 l 0.936377,-1.538924 h 0.272852 z m -0.226343,-0.166398 -0.173632,-1.192692 -0.723471,1.192692 z"
-         style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-         id="path1103"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 77.162209,23.792904 h -0.221175 l 0.04651,-0.201538 h 0.221175 z M 76.83148,25.16853 q -0.04651,0.200505 -0.165365,0.304891 -0.117822,0.104387 -0.293522,0.104387 -0.04134,0 -0.10852,-0.0083 -0.06718,-0.0083 -0.110588,-0.02067 l 0.04031,-0.176734 h 0.01033 q 0.02997,0.01344 0.07131,0.02584 0.04031,0.01343 0.09405,0.01343 0.07235,0 0.120922,-0.02274 0.04961,-0.0217 0.08062,-0.06615 0.02997,-0.04341 0.04961,-0.10852 0.01964,-0.06408 0.03514,-0.134359 l 0.216007,-0.937411 h -0.240812 l 0.03617,-0.156062 h 0.437182 z"
-         style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-         id="path1105"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 77.977663,24.225952 q 0,0.195337 -0.04858,0.382406 -0.04858,0.186035 -0.138493,0.355534 -0.08992,0.169498 -0.212907,0.320393 -0.12299,0.151929 -0.267684,0.282154 h -0.233577 v -0.01034 q 0.118856,-0.08888 0.244946,-0.219108 0.127124,-0.129191 0.230477,-0.295589 0.117822,-0.190169 0.176733,-0.381372 0.05891,-0.191203 0.05891,-0.397908 0,-0.220142 -0.06511,-0.405144 -0.06408,-0.186035 -0.176733,-0.314192 v -0.01034 h 0.219108 q 0.09198,0.149861 0.151929,0.325561 0.06098,0.174666 0.06098,0.367936 z"
-         style="font-size:2.11666656px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic'"
-         id="path1107"
-         inkscape:connector-curvature="0" />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-       x="99.560272"
-       y="-10.14519"
-       id="text5070-2-1-3"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-6-8"
-         x="99.560272"
-         y="-10.14519"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000"
-           id="tspan7821-4"> ij'</tspan></tspan></text>
-    <circle
-       style="fill:#ff0000;fill-opacity:1;stroke:none"
-       id="path4517-0-8"
-       cx="150.62486"
-       cy="-22.145849"
-       r="0.92363214"
-       d="m 151.54849,-22.145849 c 0,0.510108 -0.41352,0.923632 -0.92363,0.923632 -0.51011,0 -0.92363,-0.413524 -0.92363,-0.923632 0,-0.510108 0.41352,-0.923632 0.92363,-0.923632 0.51011,0 0.92363,0.413524 0.92363,0.923632 z"
-       sodipodi:cx="150.62486"
-       sodipodi:cy="-22.145849"
-       sodipodi:rx="0.92363214"
-       sodipodi:ry="0.92363214"
-       transform="matrix(1,0,0,-1,0,-12.541691)" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
-       x="151.68561"
-       y="10.830611"
-       id="text5070-2"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0"
-         x="151.68561"
-         y="10.830611"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1">(u,v)</tspan></text>
-  </g>
-</svg>
diff --git a/registry/vulkan/images/vulkantexture1.svg b/registry/vulkan/images/vulkantexture1.svg
deleted file mode 100644
index fc5a04a..0000000
--- a/registry/vulkan/images/vulkantexture1.svg
+++ /dev/null
@@ -1,827 +0,0 @@
-<?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"
-   width="706.10547"
-   height="384.11328"
-   viewBox="0 0 186.82375 101.62997"
-   version="1.1"
-   id="svg8"
-   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
-   sodipodi:docname="vulkantexture1.svg">
-  <defs
-     id="defs2">
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="marker2415"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path2413"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
-         transform="scale(0.4) rotate(180) translate(10,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible;"
-       id="marker1517"
-       refX="0.0"
-       refY="0.0"
-       orient="auto"
-       inkscape:stockid="Arrow1Mend"
-       inkscape:collect="always">
-      <path
-         transform="scale(0.4) rotate(180) translate(10,0)"
-         style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         id="path1515" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow2Lend"
-       style="overflow:visible;"
-       inkscape:isstock="true">
-      <path
-         id="path1144"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#ff0000;fill-opacity:1"
-         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
-         transform="scale(1.1) rotate(180) translate(1,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1073"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1071"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend"
-       inkscape:collect="always">
-      <path
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible"
-       inkscape:isstock="true"
-       inkscape:collect="always">
-      <path
-         id="path977"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend-0"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path977-6"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
-    </marker>
-    <marker
-       inkscape:isstock="true"
-       style="overflow:visible"
-       id="marker1483-7"
-       refX="0"
-       refY="0"
-       orient="auto"
-       inkscape:stockid="Arrow1Lend">
-      <path
-         inkscape:connector-curvature="0"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         id="path1481-0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="marker2415-4"
-       style="overflow:visible"
-       inkscape:isstock="true">
-      <path
-         inkscape:connector-curvature="0"
-         id="path2413-3"
-         d="M 0,0 5,-5 -12.5,0 5,5 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
-         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
-    </marker>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2"
-     inkscape:cx="423.62557"
-     inkscape:cy="223.39269"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:snap-object-midpoints="true"
-     inkscape:snap-text-baseline="true"
-     inkscape:window-width="1680"
-     inkscape:window-height="987"
-     inkscape:window-x="1672"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="0"
-     fit-margin-top="1"
-     fit-margin-right="1"
-     fit-margin-bottom="1"
-     fit-margin-left="1"
-     units="px"
-     inkscape:snap-center="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid12"
-       originx="0.79995428"
-       originy="-29.882412"
-       dotted="false" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata5">
-    <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>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-6.9498988,47.8249)">
-    <g
-       id="g1953"
-       transform="translate(-2.6458349,-3.056108e-6)">
-      <text
-         id="text121"
-         y="-32.729179"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="-32.729179"
-           x="34.208187"
-           id="tspan119"
-           sodipodi:role="line">3</tspan></text>
-      <text
-         id="text121-3"
-         y="-14.208342"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="-14.208342"
-           x="34.208187"
-           id="tspan119-1"
-           sodipodi:role="line">2</tspan></text>
-      <text
-         id="text121-0"
-         y="4.3124924"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="4.3124924"
-           x="34.208187"
-           id="tspan119-4"
-           sodipodi:role="line">1</tspan></text>
-      <text
-         id="text121-33"
-         y="22.833326"
-         x="34.208187"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="22.833326"
-           x="34.208187"
-           id="tspan119-6"
-           sodipodi:role="line">0</tspan></text>
-      <text
-         id="text121-6"
-         y="36.062492"
-         x="47.437355"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="47.437355"
-           id="tspan119-11"
-           sodipodi:role="line">0</tspan></text>
-      <text
-         id="text121-30"
-         y="36.062492"
-         x="65.958191"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="65.958191"
-           id="tspan119-47"
-           sodipodi:role="line">1</tspan></text>
-      <text
-         id="text121-1"
-         y="36.062492"
-         x="84.479027"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="84.479027"
-           id="tspan119-9"
-           sodipodi:role="line">2</tspan></text>
-      <text
-         id="text121-8"
-         y="36.062492"
-         x="102.99986"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="102.99986"
-           id="tspan119-7"
-           sodipodi:role="line">3</tspan></text>
-      <text
-         id="text121-4"
-         y="36.062492"
-         x="121.52069"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="121.52069"
-           id="tspan119-0"
-           sodipodi:role="line">4</tspan></text>
-      <text
-         id="text121-7"
-         y="36.062492"
-         x="140.04152"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="140.04152"
-           id="tspan119-8"
-           sodipodi:role="line">5</tspan></text>
-      <text
-         id="text121-79"
-         y="36.062492"
-         x="158.56236"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="158.56236"
-           id="tspan119-16"
-           sodipodi:role="line">6</tspan></text>
-      <text
-         id="text121-31"
-         y="36.062492"
-         x="177.08319"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332"
-           y="36.062492"
-           x="177.08319"
-           id="tspan119-09"
-           sodipodi:role="line">7</tspan></text>
-      <text
-         id="text121-3-7"
-         y="-5.1587644"
-         x="34.4366"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-           y="-5.1587644"
-           x="34.4366"
-           id="tspan119-1-8"
-           sodipodi:role="line">j</tspan></text>
-      <text
-         id="text121-3-7-3"
-         y="37.611752"
-         x="113.4819"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-         xml:space="preserve"><tspan
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332"
-           y="37.611752"
-           x="113.4819"
-           id="tspan119-1-8-7"
-           sodipodi:role="line">i</tspan></text>
-      <g
-         style="stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none"
-         transform="matrix(1.7500001,0,0,1.7500001,-25.323064,-72.260449)"
-         id="g1463">
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517"
-           cx="42.333332"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7"
-           cx="52.916668"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-78"
-           cx="63.5"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-9"
-           cx="74.083336"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-0"
-           cx="84.666664"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-0"
-           cx="95.25"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-1"
-           cx="105.83334"
-           cy="21.833345"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-7"
-           cx="116.41666"
-           cy="21.833345"
-           r="0.52778977" />
-        <path
-           style="fill:none;stroke:#808080;stroke-width:0.15119047;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           d="m 37.041666,16.541679 h 84.666664 l 1e-5,42.333333 H 37.041671 l -5e-6,-42.333333 m 10.583334,0 4e-6,42.333333 m 10.583332,0 -4e-6,-42.333333 m 10.583332,0 8e-6,42.333333 m 10.583336,0 -8e-6,-42.333333 m 10.583336,0 v 42.333333 m 10.583334,0 -1e-5,-42.333333 m 10.58333,0 1e-5,42.333333 M 121.70834,48.291681 H 37.041671 m -4e-6,-10.583336 h 84.666663 m 0,-10.583332 H 37.041667"
-           id="path1171"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="ccccccccccccccccccccccccc" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-6"
-           cx="42.333332"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-3"
-           cx="52.916668"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-78-9"
-           cx="63.5"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-9-1"
-           cx="74.083336"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-0-6"
-           cx="84.666664"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-0-8"
-           cx="95.25"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-1-5"
-           cx="105.83334"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-7-5"
-           cx="116.41665"
-           cy="32.416679"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-4"
-           cx="42.333332"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-2"
-           cx="52.916668"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-78-3"
-           cx="63.5"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-9-0"
-           cx="74.083336"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-0-9"
-           cx="84.666664"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-0-1"
-           cx="95.25"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-1-9"
-           cx="105.83334"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-7-7"
-           cx="116.41665"
-           cy="43.000011"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-14"
-           cx="42.333332"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-4"
-           cx="52.916668"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-78-7"
-           cx="63.5"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-9-8"
-           cx="74.083336"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-0-7"
-           cx="84.666664"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-0-9"
-           cx="95.25"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-1-4"
-           cx="105.83334"
-           cy="53.583344"
-           r="0.52778977" />
-        <circle
-           style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.15119047;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           id="path4517-7-7-52"
-           cx="116.41665"
-           cy="53.583344"
-           r="0.52778977" />
-      </g>
-      <g
-         transform="translate(-23.812502,2.2e-6)"
-         id="g1370">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="54.556301"
-           y="45.537884"
-           id="text121-09-74"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18"
-             x="54.556301"
-             y="45.537884"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="213.32181"
-           y="45.538918"
-           id="text121-09-74-5"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18-0"
-             x="213.32181"
-             y="45.538918"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">8.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           id="path972"
-           inkscape:connector-curvature="0" />
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="137.32748"
-           y="45.122406"
-           id="text121-3-7-3-3"><tspan
-             sodipodi:role="line"
-             id="tspan119-1-8-7-2"
-             x="137.32748"
-             y="45.122406"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">u</tspan></text>
-      </g>
-      <g
-         transform="translate(-23.812505,7.9375005)"
-         id="g1471">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="54.556301"
-           y="45.537884"
-           id="text121-09-74-7"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18-1"
-             x="54.556301"
-             y="45.537884"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="213.32181"
-           y="45.538918"
-           id="text121-09-74-5-4"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-18-0-9"
-             x="213.32181"
-             y="45.538918"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1.0</tspan></text>
-        <path
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)"
-           d="m 63.312355,43.999992 h 71.437505 m 5.29167,2e-6 h 71.4375"
-           id="path972-8"
-           inkscape:connector-curvature="0" />
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="137.32748"
-           y="45.122406"
-           id="text121-3-7-3-3-5"><tspan
-             sodipodi:role="line"
-             id="tspan119-1-8-7-2-2"
-             x="137.32748"
-             y="45.122406"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">s</tspan></text>
-      </g>
-      <g
-         transform="translate(-23.812501,2.6458339)"
-         id="g1597">
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="44.034977"
-           y="-47.066288"
-           id="text121-09"><tspan
-             sodipodi:role="line"
-             id="tspan119-67"
-             x="44.034977"
-             y="-47.066288"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">4.0</tspan></text>
-        <text
-           xml:space="preserve"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="43.972965"
-           y="32.308716"
-           id="text121-09-7"><tspan
-             sodipodi:role="line"
-             id="tspan119-67-1"
-             x="43.972965"
-             y="32.308716"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-        <path
-           inkscape:connector-curvature="0"
-           id="path1473"
-           d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835"
-           style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483)" />
-        <text
-           xml:space="preserve"
-           style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-           x="46.93816"
-           y="-7.8045983"
-           id="text121-3-7-8"><tspan
-             sodipodi:role="line"
-             id="tspan119-1-8-3"
-             x="46.93816"
-             y="-7.8045983"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">v</tspan></text>
-      </g>
-      <g
-         id="g1613-5"
-         transform="translate(-34.395835,2.6458339)">
-        <g
-           id="g1802">
-          <text
-             xml:space="preserve"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             x="44.034977"
-             y="-47.066288"
-             id="text1601-4"><tspan
-               sodipodi:role="line"
-               id="tspan1599-1"
-               x="44.034977"
-               y="-47.066288"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">1.0</tspan></text>
-          <text
-             xml:space="preserve"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             x="43.972965"
-             y="32.308716"
-             id="text1605-6"><tspan
-               sodipodi:role="line"
-               id="tspan1603-7"
-               x="43.972965"
-               y="32.308716"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">0.0</tspan></text>
-          <path
-             inkscape:connector-curvature="0"
-             id="path1607-6"
-             d="M 47.437354,28.124992 V -6.2708429 m 10e-7,-5.2916661 v -34.395835"
-             style="fill:none;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1483-7)" />
-          <text
-             xml:space="preserve"
-             style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-             x="46.93816"
-             y="-7.8045983"
-             id="text1611-4"><tspan
-               sodipodi:role="line"
-               id="tspan1609-3"
-               x="46.93816"
-               y="-7.8045983"
-               style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333359px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">t</tspan></text>
-        </g>
-      </g>
-    </g>
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:0.5291667;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:2.11666671, 2.11666671;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect1609"
-       width="18.520826"
-       height="18.520876"
-       x="76.541519"
-       y="-3.6250155" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:0.5291667;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:2.11666671, 2.11666671;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect1609-6"
-       width="18.520836"
-       height="18.520834"
-       x="132.10402"
-       y="-22.145849" />
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker1517)"
-       d="M 138.71861,-15.531266 84.479023,2.4604027"
-       id="path1842"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="138.71861"
-       y="-16.854183"
-       id="text5070-2-1-0"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-6-9"
-         x="138.71861"
-         y="-16.854183"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke-width:0.26458332"
-           id="tspan7821-8"> ij</tspan></tspan></text>
-    <g
-       aria-label="(Δi,Δj)"
-       style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       id="text5070-2-2"
-       transform="matrix(1.5625,0,0,1.5625,-11.182435,-46.21841)">
-      <path
-         d="m 71.619395,25.566439 h -0.219108 q -0.09302,-0.150895 -0.152962,-0.326595 -0.05994,-0.1757 -0.05994,-0.366903 0,-0.19637 0.04754,-0.378271 0.04754,-0.182935 0.139527,-0.359668 0.08785,-0.167432 0.209806,-0.317294 0.12299,-0.149861 0.270784,-0.285253 h 0.233578 v 0.01034 q -0.117822,0.08682 -0.24598,0.220141 -0.127124,0.133326 -0.229443,0.294556 -0.104387,0.164331 -0.170532,0.362769 -0.06511,0.197404 -0.06511,0.416512 0,0.224275 0.06511,0.408243 0.06511,0.185002 0.176733,0.311092 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1095"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 73.377427,25.140625 h -1.434538 l 0.936377,-1.538924 h 0.272852 z m -0.226343,-0.166398 -0.173633,-1.192692 -0.72347,1.192692 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1097"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 74.166009,23.591366 -0.04651,0.201538 H 73.90039 l 0.04651,-0.201538 z m -0.103353,0.394808 -0.26665,1.154451 h -0.194303 l 0.26665,-1.154451 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1099"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 74.663137,24.846069 -0.448552,0.676962 H 74.06369 l 0.334863,-0.676962 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1101"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 76.267173,25.140625 h -1.434538 l 0.936377,-1.538924 h 0.272852 z m -0.226343,-0.166398 -0.173632,-1.192692 -0.723471,1.192692 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1103"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 77.162209,23.792904 h -0.221175 l 0.04651,-0.201538 h 0.221175 z M 76.83148,25.16853 q -0.04651,0.200505 -0.165365,0.304891 -0.117822,0.104387 -0.293522,0.104387 -0.04134,0 -0.10852,-0.0083 -0.06718,-0.0083 -0.110588,-0.02067 l 0.04031,-0.176734 h 0.01033 q 0.02997,0.01344 0.07131,0.02584 0.04031,0.01343 0.09405,0.01343 0.07235,0 0.120922,-0.02274 0.04961,-0.0217 0.08062,-0.06615 0.02997,-0.04341 0.04961,-0.10852 0.01964,-0.06408 0.03514,-0.134359 l 0.216007,-0.937411 h -0.240812 l 0.03617,-0.156062 h 0.437182 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1105"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 77.977663,24.225952 q 0,0.195337 -0.04858,0.382406 -0.04858,0.186035 -0.138493,0.355534 -0.08992,0.169498 -0.212907,0.320393 -0.12299,0.151929 -0.267684,0.282154 h -0.233577 v -0.01034 q 0.118856,-0.08888 0.244946,-0.219108 0.127124,-0.129191 0.230477,-0.295589 0.117822,-0.190169 0.176733,-0.381372 0.05891,-0.191203 0.05891,-0.397908 0,-0.220142 -0.06511,-0.405144 -0.06408,-0.186035 -0.176733,-0.314192 v -0.01034 h 0.219108 q 0.09198,0.149861 0.151929,0.325561 0.06098,0.174666 0.06098,0.367936 z"
-         style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:2.11666656px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"
-         id="path1107"
-         inkscape:connector-curvature="0" />
-    </g>
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
-       x="83.156105"
-       y="1.6666514"
-       id="text5070-2-1-3"><tspan
-         sodipodi:role="line"
-         id="tspan5068-0-6-8"
-         x="83.156105"
-         y="1.6666514"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f40000;fill-opacity:1;stroke-width:0.26458332"><tspan
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52777743px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;stroke-width:0.26458332"
-           id="tspan7821-4"> ij'</tspan></tspan></text>
-  </g>
-</svg>
diff --git a/registry/vulkan/installRelease b/registry/vulkan/installRelease
deleted file mode 100755
index 6353a00..0000000
--- a/registry/vulkan/installRelease
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env bash
-#
-# Copyright 2016-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-# Install release build with buildRelease into /promoters
-#
-# Essentially replaced by genRelease
-
-# Root of the Vulkan git repo
-root=/home/tree/git/vulkan
-
-# Directory with generated specs (core and core+WSI)
-genspec=$root/out
-
-# Promoter Vulkan directory in SVN
-svnroot=/home/tree/khronos
-promo=$svnroot/promoters/specs/candidates/vulkan
-
-# Directory name for this release
-date=`date +%Y%m%d`
-
-install=$promo/$date
-if test -d $install ; then
-    echo "Target directory $install already exists, may overwrite! Continuing..."
-else
-    echo "Creating target directory $install"
-    mkdir $install
-fi
-
-# Copy various files
-cp $genspec/promoter.html $install/index.html
-mkdir $install/core $install/wsi
-cp -rp $genspec/core $genspec/wsi $genspec/df $install
-
-echo "**** Specs are copied to $install"
-echo "**** Please ensure that:"
-echo "**** * The right files are all there"
-echo "**** * The Data Format spec is also there"
-echo "**** * Everything is added to SVN and committed to the server"
-echo "You can get there by:"
-echo "cd $promo"
-echo "svn add $date"
diff --git a/registry/vulkan/katex/README.md b/registry/vulkan/katex/README.md
deleted file mode 100644
index 5868416..0000000
--- a/registry/vulkan/katex/README.md
+++ /dev/null
@@ -1,91 +0,0 @@
-# [<img src="https://katex.org/img/katex-logo-black.svg" width="130" alt="KaTeX">](https://katex.org/)
-[![npm](https://img.shields.io/npm/v/katex.svg)](https://www.npmjs.com/package/katex)
-[![CircleCI](https://circleci.com/gh/KaTeX/KaTeX.svg?style=shield)](https://circleci.com/gh/KaTeX/KaTeX)
-[![codecov](https://codecov.io/gh/KaTeX/KaTeX/branch/master/graph/badge.svg)](https://codecov.io/gh/KaTeX/KaTeX)
-[![Join the chat at https://gitter.im/KaTeX/KaTeX](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/KaTeX/KaTeX?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-[![Dependabot Status](https://api.dependabot.com/badges/status?host=github&repo=KaTeX/KaTeX)](https://dependabot.com)
-[![jsDelivr](https://data.jsdelivr.com/v1/package/npm/katex/badge?style=rounded)](https://www.jsdelivr.com/package/npm/katex)
-![](https://img.badgesize.io/KaTeX/KaTeX/v0.11.1/dist/katex.min.js?compression=gzip)
-
-KaTeX is a fast, easy-to-use JavaScript library for TeX math rendering on the web.
-
- * **Fast:** KaTeX renders its math synchronously and doesn't need to reflow the page. See how it compares to a competitor in [this speed test](http://www.intmath.com/cg5/katex-mathjax-comparison.php).
- * **Print quality:** KaTeX's layout is based on Donald Knuth's TeX, the gold standard for math typesetting.
- * **Self contained:** KaTeX has no dependencies and can easily be bundled with your website resources.
- * **Server side rendering:** KaTeX produces the same output regardless of browser or environment, so you can pre-render expressions using Node.js and send them as plain HTML.
-
-KaTeX is compatible with all major browsers, including Chrome, Safari, Firefox, Opera, Edge, and IE 9–11.
-
-KaTeX supports much (but not all) of LaTeX and many LaTeX packages. See the [list of supported functions](https://katex.org/docs/supported.html).
-
-Try out KaTeX [on the demo page](https://katex.org/#demo)!
-
-## Getting started
-
-### Starter template
-
-```html
-<!DOCTYPE html>
-<!-- KaTeX requires the use of the HTML5 doctype. Without it, KaTeX may not render properly -->
-<html>
-  <head>
-    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.css" integrity="sha384-zB1R0rpPzHqg7Kpt0Aljp8JPLqbXI3bhnPWROx27a9N0Ll6ZP/+DiW/UqRcLbRjq" crossorigin="anonymous">
-
-    <!-- The loading of KaTeX is deferred to speed up page rendering -->
-    <script defer src="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.js" integrity="sha384-y23I5Q6l+B6vatafAwxRu/0oK/79VlbSz7Q9aiSZUvyWYIYsd+qj+o24G5ZU2zJz" crossorigin="anonymous"></script>
-
-    <!-- To automatically render math in text elements, include the auto-render extension: -->
-    <script defer src="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/contrib/auto-render.min.js" integrity="sha384-kWPLUVMOks5AQFrykwIup5lo0m3iMkkHrD0uJ4H5cjeGihAutqP0yW0J6dpFiVkI" crossorigin="anonymous"
-        onload="renderMathInElement(document.body);"></script>
-  </head>
-  ...
-</html>
-```
-
-You can also [download KaTeX](https://github.com/KaTeX/KaTeX/releases) and host it yourself.
-
-For details on how to configure auto-render extension, refer to [the documentation](https://katex.org/docs/autorender.html).
-
-### API
-
-Call `katex.render` to render a TeX expression directly into a DOM element.
-For example:
-
-```js
-katex.render("c = \\pm\\sqrt{a^2 + b^2}", element, {
-    throwOnError: false
-});
-```
-
-Call `katex.renderToString` to generate an HTML string of the rendered math,
-e.g., for server-side rendering.  For example:
-
-```js
-var html = katex.renderToString("c = \\pm\\sqrt{a^2 + b^2}", {
-    throwOnError: false
-});
-// '<span class="katex">...</span>'
-```
-
-Make sure to include the CSS and font files in both cases.
-If you are doing all rendering on the server, there is no need to include the
-JavaScript on the client.
-
-The examples above use the `throwOnError: false` option, which renders invalid
-inputs as the TeX source code in red (by default), with the error message as
-hover text.  For other available options, see the
-[API documentation](https://katex.org/docs/api.html),
-[options documentation](https://katex.org/docs/options.html), and
-[handling errors documentation](https://katex.org/docs/error.html).
-
-## Demo and Documentation
-
-Learn more about using KaTeX [on the website](https://katex.org)!
-
-## Contributing
-
-See [CONTRIBUTING.md](CONTRIBUTING.md)
-
-## License
-
-KaTeX is licensed under the [MIT License](http://opensource.org/licenses/MIT).
diff --git a/registry/vulkan/katex/contrib/auto-render.js b/registry/vulkan/katex/contrib/auto-render.js
deleted file mode 100644
index d31cc7c..0000000
--- a/registry/vulkan/katex/contrib/auto-render.js
+++ /dev/null
@@ -1,339 +0,0 @@
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory(require("katex"));
-	else if(typeof define === 'function' && define.amd)
-		define(["katex"], factory);
-	else if(typeof exports === 'object')
-		exports["renderMathInElement"] = factory(require("katex"));
-	else
-		root["renderMathInElement"] = factory(root["katex"]);
-})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__0__) {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// define __esModule on exports
-/******/ 	__webpack_require__.r = function(exports) {
-/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/ 		}
-/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
-/******/ 	};
-/******/
-/******/ 	// create a fake namespace object
-/******/ 	// mode & 1: value is a module id, require it
-/******/ 	// mode & 2: merge all properties of value into the ns
-/******/ 	// mode & 4: return value when already ns object
-/******/ 	// mode & 8|1: behave like require
-/******/ 	__webpack_require__.t = function(value, mode) {
-/******/ 		if(mode & 1) value = __webpack_require__(value);
-/******/ 		if(mode & 8) return value;
-/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/ 		var ns = Object.create(null);
-/******/ 		__webpack_require__.r(ns);
-/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/ 		return ns;
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "";
-/******/
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 1);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports) {
-
-module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
-
-/***/ }),
-/* 1 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-
-// EXTERNAL MODULE: external "katex"
-var external_katex_ = __webpack_require__(0);
-var external_katex_default = /*#__PURE__*/__webpack_require__.n(external_katex_);
-
-// CONCATENATED MODULE: ./contrib/auto-render/splitAtDelimiters.js
-/* eslint no-constant-condition:0 */
-var findEndOfMath = function findEndOfMath(delimiter, text, startIndex) {
-  // Adapted from
-  // https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx
-  var index = startIndex;
-  var braceLevel = 0;
-  var delimLength = delimiter.length;
-
-  while (index < text.length) {
-    var character = text[index];
-
-    if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) {
-      return index;
-    } else if (character === "\\") {
-      index++;
-    } else if (character === "{") {
-      braceLevel++;
-    } else if (character === "}") {
-      braceLevel--;
-    }
-
-    index++;
-  }
-
-  return -1;
-};
-
-var splitAtDelimiters = function splitAtDelimiters(startData, leftDelim, rightDelim, display) {
-  var finalData = [];
-
-  for (var i = 0; i < startData.length; i++) {
-    if (startData[i].type === "text") {
-      var text = startData[i].data;
-      var lookingForLeft = true;
-      var currIndex = 0;
-      var nextIndex = void 0;
-      nextIndex = text.indexOf(leftDelim);
-
-      if (nextIndex !== -1) {
-        currIndex = nextIndex;
-        finalData.push({
-          type: "text",
-          data: text.slice(0, currIndex)
-        });
-        lookingForLeft = false;
-      }
-
-      while (true) {
-        if (lookingForLeft) {
-          nextIndex = text.indexOf(leftDelim, currIndex);
-
-          if (nextIndex === -1) {
-            break;
-          }
-
-          finalData.push({
-            type: "text",
-            data: text.slice(currIndex, nextIndex)
-          });
-          currIndex = nextIndex;
-        } else {
-          nextIndex = findEndOfMath(rightDelim, text, currIndex + leftDelim.length);
-
-          if (nextIndex === -1) {
-            break;
-          }
-
-          finalData.push({
-            type: "math",
-            data: text.slice(currIndex + leftDelim.length, nextIndex),
-            rawData: text.slice(currIndex, nextIndex + rightDelim.length),
-            display: display
-          });
-          currIndex = nextIndex + rightDelim.length;
-        }
-
-        lookingForLeft = !lookingForLeft;
-      }
-
-      finalData.push({
-        type: "text",
-        data: text.slice(currIndex)
-      });
-    } else {
-      finalData.push(startData[i]);
-    }
-  }
-
-  return finalData;
-};
-
-/* harmony default export */ var auto_render_splitAtDelimiters = (splitAtDelimiters);
-// CONCATENATED MODULE: ./contrib/auto-render/auto-render.js
-/* eslint no-console:0 */
-
-
-
-var auto_render_splitWithDelimiters = function splitWithDelimiters(text, delimiters) {
-  var data = [{
-    type: "text",
-    data: text
-  }];
-
-  for (var i = 0; i < delimiters.length; i++) {
-    var delimiter = delimiters[i];
-    data = auto_render_splitAtDelimiters(data, delimiter.left, delimiter.right, delimiter.display || false);
-  }
-
-  return data;
-};
-/* Note: optionsCopy is mutated by this method. If it is ever exposed in the
- * API, we should copy it before mutating.
- */
-
-
-var auto_render_renderMathInText = function renderMathInText(text, optionsCopy) {
-  var data = auto_render_splitWithDelimiters(text, optionsCopy.delimiters);
-  var fragment = document.createDocumentFragment();
-
-  for (var i = 0; i < data.length; i++) {
-    if (data[i].type === "text") {
-      fragment.appendChild(document.createTextNode(data[i].data));
-    } else {
-      var span = document.createElement("span");
-      var math = data[i].data; // Override any display mode defined in the settings with that
-      // defined by the text itself
-
-      optionsCopy.displayMode = data[i].display;
-
-      try {
-        if (optionsCopy.preProcess) {
-          math = optionsCopy.preProcess(math);
-        }
-
-        external_katex_default.a.render(math, span, optionsCopy);
-      } catch (e) {
-        if (!(e instanceof external_katex_default.a.ParseError)) {
-          throw e;
-        }
-
-        optionsCopy.errorCallback("KaTeX auto-render: Failed to parse `" + data[i].data + "` with ", e);
-        fragment.appendChild(document.createTextNode(data[i].rawData));
-        continue;
-      }
-
-      fragment.appendChild(span);
-    }
-  }
-
-  return fragment;
-};
-
-var renderElem = function renderElem(elem, optionsCopy) {
-  for (var i = 0; i < elem.childNodes.length; i++) {
-    var childNode = elem.childNodes[i];
-
-    if (childNode.nodeType === 3) {
-      // Text node
-      var frag = auto_render_renderMathInText(childNode.textContent, optionsCopy);
-      i += frag.childNodes.length - 1;
-      elem.replaceChild(frag, childNode);
-    } else if (childNode.nodeType === 1) {
-      (function () {
-        // Element node
-        var className = ' ' + childNode.className + ' ';
-        var shouldRender = optionsCopy.ignoredTags.indexOf(childNode.nodeName.toLowerCase()) === -1 && optionsCopy.ignoredClasses.every(function (x) {
-          return className.indexOf(' ' + x + ' ') === -1;
-        });
-
-        if (shouldRender) {
-          renderElem(childNode, optionsCopy);
-        }
-      })();
-    } // Otherwise, it's something else, and ignore it.
-
-  }
-};
-
-var renderMathInElement = function renderMathInElement(elem, options) {
-  if (!elem) {
-    throw new Error("No element provided to render");
-  }
-
-  var optionsCopy = {}; // Object.assign(optionsCopy, option)
-
-  for (var option in options) {
-    if (options.hasOwnProperty(option)) {
-      optionsCopy[option] = options[option];
-    }
-  } // default options
-
-
-  optionsCopy.delimiters = optionsCopy.delimiters || [{
-    left: "$$",
-    right: "$$",
-    display: true
-  }, {
-    left: "\\(",
-    right: "\\)",
-    display: false
-  }, // LaTeX uses $…$, but it ruins the display of normal `$` in text:
-  // {left: "$", right: "$", display: false},
-  //  \[…\] must come last in this array. Otherwise, renderMathInElement
-  //  will search for \[ before it searches for $$ or  \(
-  // That makes it susceptible to finding a \\[0.3em] row delimiter and
-  // treating it as if it were the start of a KaTeX math zone.
-  {
-    left: "\\[",
-    right: "\\]",
-    display: true
-  }];
-  optionsCopy.ignoredTags = optionsCopy.ignoredTags || ["script", "noscript", "style", "textarea", "pre", "code"];
-  optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || [];
-  optionsCopy.errorCallback = optionsCopy.errorCallback || console.error; // Enable sharing of global macros defined via `\gdef` between different
-  // math elements within a single call to `renderMathInElement`.
-
-  optionsCopy.macros = optionsCopy.macros || {};
-  renderElem(elem, optionsCopy);
-};
-
-/* harmony default export */ var auto_render = __webpack_exports__["default"] = (renderMathInElement);
-
-/***/ })
-/******/ ])["default"];
-});
\ No newline at end of file
diff --git a/registry/vulkan/katex/contrib/auto-render.min.js b/registry/vulkan/katex/contrib/auto-render.min.js
deleted file mode 100644
index 3a6d663..0000000
--- a/registry/vulkan/katex/contrib/auto-render.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(t,r){t.exports=e},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n),a=function(e,t,r){for(var n=r,o=0,a=e.length;n<t.length;){var i=t[n];if(o<=0&&t.slice(n,n+a)===e)return n;"\\"===i?n++:"{"===i?o++:"}"===i&&o--,n++}return-1},i=function(e,t,r,n){for(var o=[],i=0;i<e.length;i++)if("text"===e[i].type){var l=e[i].data,d=!0,s=0,f=void 0;for(-1!==(f=l.indexOf(t))&&(s=f,o.push({type:"text",data:l.slice(0,s)}),d=!1);;){if(d){if(-1===(f=l.indexOf(t,s)))break;o.push({type:"text",data:l.slice(s,f)}),s=f}else{if(-1===(f=a(r,l,s+t.length)))break;o.push({type:"math",data:l.slice(s+t.length,f),rawData:l.slice(s,f+r.length),display:n}),s=f+r.length}d=!d}o.push({type:"text",data:l.slice(s)})}else o.push(e[i]);return o},l=function(e,t){for(var r=function(e,t){for(var r=[{type:"text",data:e}],n=0;n<t.length;n++){var o=t[n];r=i(r,o.left,o.right,o.display||!1)}return r}(e,t.delimiters),n=document.createDocumentFragment(),a=0;a<r.length;a++)if("text"===r[a].type)n.appendChild(document.createTextNode(r[a].data));else{var l=document.createElement("span"),d=r[a].data;t.displayMode=r[a].display;try{t.preProcess&&(d=t.preProcess(d)),o.a.render(d,l,t)}catch(e){if(!(e instanceof o.a.ParseError))throw e;t.errorCallback("KaTeX auto-render: Failed to parse `"+r[a].data+"` with ",e),n.appendChild(document.createTextNode(r[a].rawData));continue}n.appendChild(l)}return n};t.default=function(e,t){if(!e)throw new Error("No element provided to render");var r={};for(var n in t)t.hasOwnProperty(n)&&(r[n]=t[n]);r.delimiters=r.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\[",right:"\\]",display:!0}],r.ignoredTags=r.ignoredTags||["script","noscript","style","textarea","pre","code"],r.ignoredClasses=r.ignoredClasses||[],r.errorCallback=r.errorCallback||console.error,r.macros=r.macros||{},function e(t,r){for(var n=0;n<t.childNodes.length;n++){var o=t.childNodes[n];if(3===o.nodeType){var a=l(o.textContent,r);n+=a.childNodes.length-1,t.replaceChild(a,o)}else 1===o.nodeType&&function(){var t=" "+o.className+" ";-1===r.ignoredTags.indexOf(o.nodeName.toLowerCase())&&r.ignoredClasses.every(function(e){return-1===t.indexOf(" "+e+" ")})&&e(o,r)}()}}(e,r)}}]).default});
\ No newline at end of file
diff --git a/registry/vulkan/katex/contrib/auto-render.mjs b/registry/vulkan/katex/contrib/auto-render.mjs
deleted file mode 100644
index 58de8b6..0000000
--- a/registry/vulkan/katex/contrib/auto-render.mjs
+++ /dev/null
@@ -1,215 +0,0 @@
-import katex from '../katex.mjs';
-
-/* eslint no-constant-condition:0 */
-const findEndOfMath = function findEndOfMath(delimiter, text, startIndex) {
-  // Adapted from
-  // https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx
-  let index = startIndex;
-  let braceLevel = 0;
-  const delimLength = delimiter.length;
-
-  while (index < text.length) {
-    const character = text[index];
-
-    if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) {
-      return index;
-    } else if (character === "\\") {
-      index++;
-    } else if (character === "{") {
-      braceLevel++;
-    } else if (character === "}") {
-      braceLevel--;
-    }
-
-    index++;
-  }
-
-  return -1;
-};
-
-const splitAtDelimiters = function splitAtDelimiters(startData, leftDelim, rightDelim, display) {
-  const finalData = [];
-
-  for (let i = 0; i < startData.length; i++) {
-    if (startData[i].type === "text") {
-      const text = startData[i].data;
-      let lookingForLeft = true;
-      let currIndex = 0;
-      let nextIndex;
-      nextIndex = text.indexOf(leftDelim);
-
-      if (nextIndex !== -1) {
-        currIndex = nextIndex;
-        finalData.push({
-          type: "text",
-          data: text.slice(0, currIndex)
-        });
-        lookingForLeft = false;
-      }
-
-      while (true) {
-        if (lookingForLeft) {
-          nextIndex = text.indexOf(leftDelim, currIndex);
-
-          if (nextIndex === -1) {
-            break;
-          }
-
-          finalData.push({
-            type: "text",
-            data: text.slice(currIndex, nextIndex)
-          });
-          currIndex = nextIndex;
-        } else {
-          nextIndex = findEndOfMath(rightDelim, text, currIndex + leftDelim.length);
-
-          if (nextIndex === -1) {
-            break;
-          }
-
-          finalData.push({
-            type: "math",
-            data: text.slice(currIndex + leftDelim.length, nextIndex),
-            rawData: text.slice(currIndex, nextIndex + rightDelim.length),
-            display: display
-          });
-          currIndex = nextIndex + rightDelim.length;
-        }
-
-        lookingForLeft = !lookingForLeft;
-      }
-
-      finalData.push({
-        type: "text",
-        data: text.slice(currIndex)
-      });
-    } else {
-      finalData.push(startData[i]);
-    }
-  }
-
-  return finalData;
-};
-
-/* eslint no-console:0 */
-
-const splitWithDelimiters = function splitWithDelimiters(text, delimiters) {
-  let data = [{
-    type: "text",
-    data: text
-  }];
-
-  for (let i = 0; i < delimiters.length; i++) {
-    const delimiter = delimiters[i];
-    data = splitAtDelimiters(data, delimiter.left, delimiter.right, delimiter.display || false);
-  }
-
-  return data;
-};
-/* Note: optionsCopy is mutated by this method. If it is ever exposed in the
- * API, we should copy it before mutating.
- */
-
-
-const renderMathInText = function renderMathInText(text, optionsCopy) {
-  const data = splitWithDelimiters(text, optionsCopy.delimiters);
-  const fragment = document.createDocumentFragment();
-
-  for (let i = 0; i < data.length; i++) {
-    if (data[i].type === "text") {
-      fragment.appendChild(document.createTextNode(data[i].data));
-    } else {
-      const span = document.createElement("span");
-      let math = data[i].data; // Override any display mode defined in the settings with that
-      // defined by the text itself
-
-      optionsCopy.displayMode = data[i].display;
-
-      try {
-        if (optionsCopy.preProcess) {
-          math = optionsCopy.preProcess(math);
-        }
-
-        katex.render(math, span, optionsCopy);
-      } catch (e) {
-        if (!(e instanceof katex.ParseError)) {
-          throw e;
-        }
-
-        optionsCopy.errorCallback("KaTeX auto-render: Failed to parse `" + data[i].data + "` with ", e);
-        fragment.appendChild(document.createTextNode(data[i].rawData));
-        continue;
-      }
-
-      fragment.appendChild(span);
-    }
-  }
-
-  return fragment;
-};
-
-const renderElem = function renderElem(elem, optionsCopy) {
-  for (let i = 0; i < elem.childNodes.length; i++) {
-    const childNode = elem.childNodes[i];
-
-    if (childNode.nodeType === 3) {
-      // Text node
-      const frag = renderMathInText(childNode.textContent, optionsCopy);
-      i += frag.childNodes.length - 1;
-      elem.replaceChild(frag, childNode);
-    } else if (childNode.nodeType === 1) {
-      // Element node
-      const className = ' ' + childNode.className + ' ';
-      const shouldRender = optionsCopy.ignoredTags.indexOf(childNode.nodeName.toLowerCase()) === -1 && optionsCopy.ignoredClasses.every(x => className.indexOf(' ' + x + ' ') === -1);
-
-      if (shouldRender) {
-        renderElem(childNode, optionsCopy);
-      }
-    } // Otherwise, it's something else, and ignore it.
-
-  }
-};
-
-const renderMathInElement = function renderMathInElement(elem, options) {
-  if (!elem) {
-    throw new Error("No element provided to render");
-  }
-
-  const optionsCopy = {}; // Object.assign(optionsCopy, option)
-
-  for (const option in options) {
-    if (options.hasOwnProperty(option)) {
-      optionsCopy[option] = options[option];
-    }
-  } // default options
-
-
-  optionsCopy.delimiters = optionsCopy.delimiters || [{
-    left: "$$",
-    right: "$$",
-    display: true
-  }, {
-    left: "\\(",
-    right: "\\)",
-    display: false
-  }, // LaTeX uses $…$, but it ruins the display of normal `$` in text:
-  // {left: "$", right: "$", display: false},
-  //  \[…\] must come last in this array. Otherwise, renderMathInElement
-  //  will search for \[ before it searches for $$ or  \(
-  // That makes it susceptible to finding a \\[0.3em] row delimiter and
-  // treating it as if it were the start of a KaTeX math zone.
-  {
-    left: "\\[",
-    right: "\\]",
-    display: true
-  }];
-  optionsCopy.ignoredTags = optionsCopy.ignoredTags || ["script", "noscript", "style", "textarea", "pre", "code"];
-  optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || [];
-  optionsCopy.errorCallback = optionsCopy.errorCallback || console.error; // Enable sharing of global macros defined via `\gdef` between different
-  // math elements within a single call to `renderMathInElement`.
-
-  optionsCopy.macros = optionsCopy.macros || {};
-  renderElem(elem, optionsCopy);
-};
-
-export default renderMathInElement;
diff --git a/registry/vulkan/katex/contrib/copy-tex.css b/registry/vulkan/katex/contrib/copy-tex.css
deleted file mode 100644
index 90801d8..0000000
--- a/registry/vulkan/katex/contrib/copy-tex.css
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Force selection of entire .katex/.katex-display blocks, so that we can
- * copy/paste the entire source code.  If you omit this CSS, partial
- * selections of a formula will work, but will copy the ugly HTML
- * representation instead of the LaTeX source code.  (Full selections will
- * still produce the LaTeX source code.)
- */
-.katex,
-.katex-display {
-    user-select: all;
-    -moz-user-select: all;
-    -webkit-user-select: all;
-    -ms-user-select: all;
-}
-
diff --git a/registry/vulkan/katex/contrib/copy-tex.js b/registry/vulkan/katex/contrib/copy-tex.js
deleted file mode 100644
index 4649f8f..0000000
--- a/registry/vulkan/katex/contrib/copy-tex.js
+++ /dev/null
@@ -1,213 +0,0 @@
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory();
-	else if(typeof define === 'function' && define.amd)
-		define([], factory);
-	else {
-		var a = factory();
-		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
-	}
-})((typeof self !== 'undefined' ? self : this), function() {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// define __esModule on exports
-/******/ 	__webpack_require__.r = function(exports) {
-/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/ 		}
-/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
-/******/ 	};
-/******/
-/******/ 	// create a fake namespace object
-/******/ 	// mode & 1: value is a module id, require it
-/******/ 	// mode & 2: merge all properties of value into the ns
-/******/ 	// mode & 4: return value when already ns object
-/******/ 	// mode & 8|1: behave like require
-/******/ 	__webpack_require__.t = function(value, mode) {
-/******/ 		if(mode & 1) value = __webpack_require__(value);
-/******/ 		if(mode & 8) return value;
-/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/ 		var ns = Object.create(null);
-/******/ 		__webpack_require__.r(ns);
-/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/ 		return ns;
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "";
-/******/
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 1);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports, __webpack_require__) {
-
-// extracted by mini-css-extract-plugin
-
-/***/ }),
-/* 1 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-
-// EXTERNAL MODULE: ./contrib/copy-tex/copy-tex.css
-var copy_tex = __webpack_require__(0);
-
-// CONCATENATED MODULE: ./contrib/copy-tex/katex2tex.js
-// Set these to how you want inline and display math to be delimited.
-var defaultCopyDelimiters = {
-  inline: ['$', '$'],
-  // alternative: ['\(', '\)']
-  display: ['$$', '$$'] // alternative: ['\[', '\]']
-
-}; // Replace .katex elements with their TeX source (<annotation> element).
-// Modifies fragment in-place.  Useful for writing your own 'copy' handler,
-// as in copy-tex.js.
-
-var katexReplaceWithTex = function katexReplaceWithTex(fragment, copyDelimiters) {
-  if (copyDelimiters === void 0) {
-    copyDelimiters = defaultCopyDelimiters;
-  }
-
-  // Remove .katex-html blocks that are preceded by .katex-mathml blocks
-  // (which will get replaced below).
-  var katexHtml = fragment.querySelectorAll('.katex-mathml + .katex-html');
-
-  for (var i = 0; i < katexHtml.length; i++) {
-    var element = katexHtml[i];
-
-    if (element.remove) {
-      element.remove(null);
-    } else {
-      element.parentNode.removeChild(element);
-    }
-  } // Replace .katex-mathml elements with their annotation (TeX source)
-  // descendant, with inline delimiters.
-
-
-  var katexMathml = fragment.querySelectorAll('.katex-mathml');
-
-  for (var _i = 0; _i < katexMathml.length; _i++) {
-    var _element = katexMathml[_i];
-
-    var texSource = _element.querySelector('annotation');
-
-    if (texSource) {
-      if (_element.replaceWith) {
-        _element.replaceWith(texSource);
-      } else {
-        _element.parentNode.replaceChild(texSource, _element);
-      }
-
-      texSource.innerHTML = copyDelimiters.inline[0] + texSource.innerHTML + copyDelimiters.inline[1];
-    }
-  } // Switch display math to display delimiters.
-
-
-  var displays = fragment.querySelectorAll('.katex-display annotation');
-
-  for (var _i2 = 0; _i2 < displays.length; _i2++) {
-    var _element2 = displays[_i2];
-    _element2.innerHTML = copyDelimiters.display[0] + _element2.innerHTML.substr(copyDelimiters.inline[0].length, _element2.innerHTML.length - copyDelimiters.inline[0].length - copyDelimiters.inline[1].length) + copyDelimiters.display[1];
-  }
-
-  return fragment;
-};
-/* harmony default export */ var katex2tex = (katexReplaceWithTex);
-// CONCATENATED MODULE: ./contrib/copy-tex/copy-tex.js
- // Global copy handler to modify behavior on .katex elements.
-
-document.addEventListener('copy', function (event) {
-  var selection = window.getSelection();
-
-  if (selection.isCollapsed) {
-    return; // default action OK if selection is empty
-  }
-
-  var fragment = selection.getRangeAt(0).cloneContents();
-
-  if (!fragment.querySelector('.katex-mathml')) {
-    return; // default action OK if no .katex-mathml elements
-  } // Preserve usual HTML copy/paste behavior.
-
-
-  var html = [];
-
-  for (var i = 0; i < fragment.childNodes.length; i++) {
-    html.push(fragment.childNodes[i].outerHTML);
-  }
-
-  event.clipboardData.setData('text/html', html.join('')); // Rewrite plain-text version.
-
-  event.clipboardData.setData('text/plain', katex2tex(fragment).textContent); // Prevent normal copy handling.
-
-  event.preventDefault();
-});
-// CONCATENATED MODULE: ./contrib/copy-tex/copy-tex.webpack.js
-/**
- * This is the webpack entry point for KaTeX. As ECMAScript doesn't support
- * CSS modules natively, a separate entry point is used.
- */
-
-
-
-/***/ })
-/******/ ])["default"];
-});
\ No newline at end of file
diff --git a/registry/vulkan/katex/contrib/copy-tex.min.css b/registry/vulkan/katex/contrib/copy-tex.min.css
deleted file mode 100644
index 555ed11..0000000
--- a/registry/vulkan/katex/contrib/copy-tex.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.katex,.katex-display{user-select:all;-moz-user-select:all;-webkit-user-select:all;-ms-user-select:all}
diff --git a/registry/vulkan/katex/contrib/copy-tex.min.js b/registry/vulkan/katex/contrib/copy-tex.min.js
deleted file mode 100644
index e0354d6..0000000
--- a/registry/vulkan/katex/contrib/copy-tex.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}("undefined"!=typeof self?self:this,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=1)}([function(e,t,n){},function(e,t,n){"use strict";n.r(t);n(0);var r={inline:["$","$"],display:["$$","$$"]},o=function(e,t){void 0===t&&(t=r);for(var n=e.querySelectorAll(".katex-mathml + .katex-html"),o=0;o<n.length;o++){var l=n[o];l.remove?l.remove(null):l.parentNode.removeChild(l)}for(var i=e.querySelectorAll(".katex-mathml"),a=0;a<i.length;a++){var u=i[a],f=u.querySelector("annotation");f&&(u.replaceWith?u.replaceWith(f):u.parentNode.replaceChild(f,u),f.innerHTML=t.inline[0]+f.innerHTML+t.inline[1])}for(var c=e.querySelectorAll(".katex-display annotation"),d=0;d<c.length;d++){var p=c[d];p.innerHTML=t.display[0]+p.innerHTML.substr(t.inline[0].length,p.innerHTML.length-t.inline[0].length-t.inline[1].length)+t.display[1]}return e};document.addEventListener("copy",function(e){var t=window.getSelection();if(!t.isCollapsed){var n=t.getRangeAt(0).cloneContents();if(n.querySelector(".katex-mathml")){for(var r=[],l=0;l<n.childNodes.length;l++)r.push(n.childNodes[l].outerHTML);e.clipboardData.setData("text/html",r.join("")),e.clipboardData.setData("text/plain",o(n).textContent),e.preventDefault()}}})}]).default});
\ No newline at end of file
diff --git a/registry/vulkan/katex/contrib/copy-tex.mjs b/registry/vulkan/katex/contrib/copy-tex.mjs
deleted file mode 100644
index b6ed1ee..0000000
--- a/registry/vulkan/katex/contrib/copy-tex.mjs
+++ /dev/null
@@ -1,85 +0,0 @@
-// Set these to how you want inline and display math to be delimited.
-const defaultCopyDelimiters = {
-  inline: ['$', '$'],
-  // alternative: ['\(', '\)']
-  display: ['$$', '$$'] // alternative: ['\[', '\]']
-
-}; // Replace .katex elements with their TeX source (<annotation> element).
-// Modifies fragment in-place.  Useful for writing your own 'copy' handler,
-// as in copy-tex.js.
-
-const katexReplaceWithTex = function katexReplaceWithTex(fragment, copyDelimiters) {
-  if (copyDelimiters === void 0) {
-    copyDelimiters = defaultCopyDelimiters;
-  }
-
-  // Remove .katex-html blocks that are preceded by .katex-mathml blocks
-  // (which will get replaced below).
-  const katexHtml = fragment.querySelectorAll('.katex-mathml + .katex-html');
-
-  for (let i = 0; i < katexHtml.length; i++) {
-    const element = katexHtml[i];
-
-    if (element.remove) {
-      element.remove(null);
-    } else {
-      element.parentNode.removeChild(element);
-    }
-  } // Replace .katex-mathml elements with their annotation (TeX source)
-  // descendant, with inline delimiters.
-
-
-  const katexMathml = fragment.querySelectorAll('.katex-mathml');
-
-  for (let i = 0; i < katexMathml.length; i++) {
-    const element = katexMathml[i];
-    const texSource = element.querySelector('annotation');
-
-    if (texSource) {
-      if (element.replaceWith) {
-        element.replaceWith(texSource);
-      } else {
-        element.parentNode.replaceChild(texSource, element);
-      }
-
-      texSource.innerHTML = copyDelimiters.inline[0] + texSource.innerHTML + copyDelimiters.inline[1];
-    }
-  } // Switch display math to display delimiters.
-
-
-  const displays = fragment.querySelectorAll('.katex-display annotation');
-
-  for (let i = 0; i < displays.length; i++) {
-    const element = displays[i];
-    element.innerHTML = copyDelimiters.display[0] + element.innerHTML.substr(copyDelimiters.inline[0].length, element.innerHTML.length - copyDelimiters.inline[0].length - copyDelimiters.inline[1].length) + copyDelimiters.display[1];
-  }
-
-  return fragment;
-};
-
-document.addEventListener('copy', function (event) {
-  const selection = window.getSelection();
-
-  if (selection.isCollapsed) {
-    return; // default action OK if selection is empty
-  }
-
-  const fragment = selection.getRangeAt(0).cloneContents();
-
-  if (!fragment.querySelector('.katex-mathml')) {
-    return; // default action OK if no .katex-mathml elements
-  } // Preserve usual HTML copy/paste behavior.
-
-
-  const html = [];
-
-  for (let i = 0; i < fragment.childNodes.length; i++) {
-    html.push(fragment.childNodes[i].outerHTML);
-  }
-
-  event.clipboardData.setData('text/html', html.join('')); // Rewrite plain-text version.
-
-  event.clipboardData.setData('text/plain', katexReplaceWithTex(fragment).textContent); // Prevent normal copy handling.
-
-  event.preventDefault();
-});
diff --git a/registry/vulkan/katex/contrib/mathtex-script-type.js b/registry/vulkan/katex/contrib/mathtex-script-type.js
deleted file mode 100644
index daa01a6..0000000
--- a/registry/vulkan/katex/contrib/mathtex-script-type.js
+++ /dev/null
@@ -1,137 +0,0 @@
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory(require("katex"));
-	else if(typeof define === 'function' && define.amd)
-		define(["katex"], factory);
-	else {
-		var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]);
-		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
-	}
-})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__0__) {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// define __esModule on exports
-/******/ 	__webpack_require__.r = function(exports) {
-/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/ 		}
-/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
-/******/ 	};
-/******/
-/******/ 	// create a fake namespace object
-/******/ 	// mode & 1: value is a module id, require it
-/******/ 	// mode & 2: merge all properties of value into the ns
-/******/ 	// mode & 4: return value when already ns object
-/******/ 	// mode & 8|1: behave like require
-/******/ 	__webpack_require__.t = function(value, mode) {
-/******/ 		if(mode & 1) value = __webpack_require__(value);
-/******/ 		if(mode & 8) return value;
-/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/ 		var ns = Object.create(null);
-/******/ 		__webpack_require__.r(ns);
-/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/ 		return ns;
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "";
-/******/
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 1);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports) {
-
-module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
-
-/***/ }),
-/* 1 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
-/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__);
-
-var scripts = document.body.getElementsByTagName("script");
-scripts = Array.prototype.slice.call(scripts);
-scripts.forEach(function (script) {
-  if (!script.type || !script.type.match(/math\/tex/i)) {
-    return -1;
-  }
-
-  var display = script.type.match(/mode\s*=\s*display(;|\s|\n|$)/) != null;
-  var katexElement = document.createElement(display ? "div" : "span");
-  katexElement.setAttribute("class", display ? "equation" : "inline-equation");
-
-  try {
-    katex__WEBPACK_IMPORTED_MODULE_0___default.a.render(script.text, katexElement, {
-      displayMode: display
-    });
-  } catch (err) {
-    //console.error(err); linter doesn't like this
-    katexElement.textContent = script.text;
-  }
-
-  script.parentNode.replaceChild(katexElement, script);
-});
-
-/***/ })
-/******/ ])["default"];
-});
\ No newline at end of file
diff --git a/registry/vulkan/katex/contrib/mathtex-script-type.min.js b/registry/vulkan/katex/contrib/mathtex-script-type.min.js
deleted file mode 100644
index ae9f528..0000000
--- a/registry/vulkan/katex/contrib/mathtex-script-type.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("katex"));else if("function"==typeof define&&define.amd)define(["katex"],t);else{var r="object"==typeof exports?t(require("katex")):t(e.katex);for(var n in r)("object"==typeof exports?exports:e)[n]=r[n]}}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(t,r){t.exports=e},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n),u=document.body.getElementsByTagName("script");(u=Array.prototype.slice.call(u)).forEach(function(e){if(!e.type||!e.type.match(/math\/tex/i))return-1;var t=null!=e.type.match(/mode\s*=\s*display(;|\s|\n|$)/),r=document.createElement(t?"div":"span");r.setAttribute("class",t?"equation":"inline-equation");try{o.a.render(e.text,r,{displayMode:t})}catch(t){r.textContent=e.text}e.parentNode.replaceChild(r,e)})}]).default});
\ No newline at end of file
diff --git a/registry/vulkan/katex/contrib/mathtex-script-type.mjs b/registry/vulkan/katex/contrib/mathtex-script-type.mjs
deleted file mode 100644
index 7cfb90e..0000000
--- a/registry/vulkan/katex/contrib/mathtex-script-type.mjs
+++ /dev/null
@@ -1,24 +0,0 @@
-import katex from '../katex.mjs';
-
-let scripts = document.body.getElementsByTagName("script");
-scripts = Array.prototype.slice.call(scripts);
-scripts.forEach(function (script) {
-  if (!script.type || !script.type.match(/math\/tex/i)) {
-    return -1;
-  }
-
-  const display = script.type.match(/mode\s*=\s*display(;|\s|\n|$)/) != null;
-  const katexElement = document.createElement(display ? "div" : "span");
-  katexElement.setAttribute("class", display ? "equation" : "inline-equation");
-
-  try {
-    katex.render(script.text, katexElement, {
-      displayMode: display
-    });
-  } catch (err) {
-    //console.error(err); linter doesn't like this
-    katexElement.textContent = script.text;
-  }
-
-  script.parentNode.replaceChild(katexElement, script);
-});
diff --git a/registry/vulkan/katex/contrib/mhchem.js b/registry/vulkan/katex/contrib/mhchem.js
deleted file mode 100644
index f84566e..0000000
--- a/registry/vulkan/katex/contrib/mhchem.js
+++ /dev/null
@@ -1,3241 +0,0 @@
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory(require("katex"));
-	else if(typeof define === 'function' && define.amd)
-		define(["katex"], factory);
-	else {
-		var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]);
-		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
-	}
-})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__0__) {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// define __esModule on exports
-/******/ 	__webpack_require__.r = function(exports) {
-/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/ 		}
-/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
-/******/ 	};
-/******/
-/******/ 	// create a fake namespace object
-/******/ 	// mode & 1: value is a module id, require it
-/******/ 	// mode & 2: merge all properties of value into the ns
-/******/ 	// mode & 4: return value when already ns object
-/******/ 	// mode & 8|1: behave like require
-/******/ 	__webpack_require__.t = function(value, mode) {
-/******/ 		if(mode & 1) value = __webpack_require__(value);
-/******/ 		if(mode & 8) return value;
-/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/ 		var ns = Object.create(null);
-/******/ 		__webpack_require__.r(ns);
-/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/ 		return ns;
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "";
-/******/
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 1);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports) {
-
-module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
-
-/***/ }),
-/* 1 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
-/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__);
-/* eslint-disable */
-
-/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
-
-/* vim: set ts=2 et sw=2 tw=80: */
-
-/*************************************************************
- *
- *  KaTeX mhchem.js
- *
- *  This file implements a KaTeX version of mhchem version 3.3.0.
- *  It is adapted from MathJax/extensions/TeX/mhchem.js
- *  It differs from the MathJax version as follows:
- *    1. The interface is changed so that it can be called from KaTeX, not MathJax.
- *    2. \rlap and \llap are replaced with \mathrlap and \mathllap.
- *    3. Four lines of code are edited in order to use \raisebox instead of \raise.
- *    4. The reaction arrow code is simplified. All reaction arrows are rendered
- *       using KaTeX extensible arrows instead of building non-extensible arrows.
- *    5. \tripledash vertical alignment is slightly adjusted.
- *
- *    This code, as other KaTeX code, is released under the MIT license.
- * 
- * /*************************************************************
- *
- *  MathJax/extensions/TeX/mhchem.js
- *
- *  Implements the \ce command for handling chemical formulas
- *  from the mhchem LaTeX package.
- *
- *  ---------------------------------------------------------------------
- *
- *  Copyright (c) 2011-2015 The MathJax Consortium
- *  Copyright (c) 2015-2018 Martin Hensel
- *
- *  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.
- */
-//
-// Coding Style
-//   - use '' for identifiers that can by minified/uglified
-//   - use "" for strings that need to stay untouched
-// version: "3.3.0" for MathJax and KaTeX
-// Add \ce, \pu, and \tripledash to the KaTeX macros.
-katex__WEBPACK_IMPORTED_MODULE_0___default.a.__defineMacro("\\ce", function (context) {
-  return chemParse(context.consumeArgs(1)[0], "ce");
-});
-
-katex__WEBPACK_IMPORTED_MODULE_0___default.a.__defineMacro("\\pu", function (context) {
-  return chemParse(context.consumeArgs(1)[0], "pu");
-}); //  Needed for \bond for the ~ forms
-//  Raise by 2.56mu, not 2mu. We're raising a hyphen-minus, U+002D, not 
-//  a mathematical minus, U+2212. So we need that extra 0.56.
-
-
-katex__WEBPACK_IMPORTED_MODULE_0___default.a.__defineMacro("\\tripledash", "{\\vphantom{-}\\raisebox{2.56mu}{$\\mkern2mu" + "\\tiny\\text{-}\\mkern1mu\\text{-}\\mkern1mu\\text{-}\\mkern2mu$}}");
-
- //
-//  This is the main function for handing the \ce and \pu commands.
-//  It takes the argument to \ce or \pu and returns the corresponding TeX string.
-//
-
-var chemParse = function chemParse(tokens, stateMachine) {
-  // Recreate the argument string from KaTeX's array of tokens.
-  var str = "";
-  var expectedLoc = tokens[tokens.length - 1].loc.start;
-
-  for (var i = tokens.length - 1; i >= 0; i--) {
-    if (tokens[i].loc.start > expectedLoc) {
-      // context.consumeArgs has eaten a space.
-      str += " ";
-      expectedLoc = tokens[i].loc.start;
-    }
-
-    str += tokens[i].text;
-    expectedLoc += tokens[i].text.length;
-  }
-
-  var tex = texify.go(mhchemParser.go(str, stateMachine));
-  return tex;
-}; //
-// Core parser for mhchem syntax  (recursive)
-//
-
-/** @type {MhchemParser} */
-
-
-var mhchemParser = {
-  //
-  // Parses mchem \ce syntax
-  //
-  // Call like
-  //   go("H2O");
-  //
-  go: function go(input, stateMachine) {
-    if (!input) {
-      return [];
-    }
-
-    if (stateMachine === undefined) {
-      stateMachine = 'ce';
-    }
-
-    var state = '0'; //
-    // String buffers for parsing:
-    //
-    // buffer.a == amount
-    // buffer.o == element
-    // buffer.b == left-side superscript
-    // buffer.p == left-side subscript
-    // buffer.q == right-side subscript
-    // buffer.d == right-side superscript
-    //
-    // buffer.r == arrow
-    // buffer.rdt == arrow, script above, type
-    // buffer.rd == arrow, script above, content
-    // buffer.rqt == arrow, script below, type
-    // buffer.rq == arrow, script below, content
-    //
-    // buffer.text_
-    // buffer.rm
-    // etc.
-    //
-    // buffer.parenthesisLevel == int, starting at 0
-    // buffer.sb == bool, space before
-    // buffer.beginsWithBond == bool
-    //
-    // These letters are also used as state names.
-    //
-    // Other states:
-    // 0 == begin of main part (arrow/operator unlikely)
-    // 1 == next entity
-    // 2 == next entity (arrow/operator unlikely)
-    // 3 == next atom
-    // c == macro
-    //
-
-    /** @type {Buffer} */
-
-    var buffer = {};
-    buffer['parenthesisLevel'] = 0;
-    input = input.replace(/\n/g, " ");
-    input = input.replace(/[\u2212\u2013\u2014\u2010]/g, "-");
-    input = input.replace(/[\u2026]/g, "..."); //
-    // Looks through mhchemParser.transitions, to execute a matching action
-    // (recursive)
-    //
-
-    var lastInput;
-    var watchdog = 10;
-    /** @type {ParserOutput[]} */
-
-    var output = [];
-
-    while (true) {
-      if (lastInput !== input) {
-        watchdog = 10;
-        lastInput = input;
-      } else {
-        watchdog--;
-      } //
-      // Find actions in transition table
-      //
-
-
-      var machine = mhchemParser.stateMachines[stateMachine];
-      var t = machine.transitions[state] || machine.transitions['*'];
-
-      iterateTransitions: for (var i = 0; i < t.length; i++) {
-        var matches = mhchemParser.patterns.match_(t[i].pattern, input);
-
-        if (matches) {
-          //
-          // Execute actions
-          //
-          var task = t[i].task;
-
-          for (var iA = 0; iA < task.action_.length; iA++) {
-            var o; //
-            // Find and execute action
-            //
-
-            if (machine.actions[task.action_[iA].type_]) {
-              o = machine.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);
-            } else if (mhchemParser.actions[task.action_[iA].type_]) {
-              o = mhchemParser.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);
-            } else {
-              throw ["MhchemBugA", "mhchem bug A. Please report. (" + task.action_[iA].type_ + ")"]; // Trying to use non-existing action
-            } //
-            // Add output
-            //
-
-
-            mhchemParser.concatArray(output, o);
-          } //
-          // Set next state,
-          // Shorten input,
-          // Continue with next character
-          //   (= apply only one transition per position)
-          //
-
-
-          state = task.nextState || state;
-
-          if (input.length > 0) {
-            if (!task.revisit) {
-              input = matches.remainder;
-            }
-
-            if (!task.toContinue) {
-              break iterateTransitions;
-            }
-          } else {
-            return output;
-          }
-        }
-      } //
-      // Prevent infinite loop
-      //
-
-
-      if (watchdog <= 0) {
-        throw ["MhchemBugU", "mhchem bug U. Please report."]; // Unexpected character
-      }
-    }
-  },
-  concatArray: function concatArray(a, b) {
-    if (b) {
-      if (Array.isArray(b)) {
-        for (var iB = 0; iB < b.length; iB++) {
-          a.push(b[iB]);
-        }
-      } else {
-        a.push(b);
-      }
-    }
-  },
-  patterns: {
-    //
-    // Matching patterns
-    // either regexps or function that return null or {match_:"a", remainder:"bc"}
-    //
-    patterns: {
-      // property names must not look like integers ("2") for correct property traversal order, later on
-      'empty': /^$/,
-      'else': /^./,
-      'else2': /^./,
-      'space': /^\s/,
-      'space A': /^\s(?=[A-Z\\$])/,
-      'space$': /^\s$/,
-      'a-z': /^[a-z]/,
-      'x': /^x/,
-      'x$': /^x$/,
-      'i$': /^i$/,
-      'letters': /^(?:[a-zA-Z\u03B1-\u03C9\u0391-\u03A9?@]|(?:\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))))+/,
-      '\\greek': /^\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))/,
-      'one lowercase latin letter $': /^(?:([a-z])(?:$|[^a-zA-Z]))$/,
-      '$one lowercase latin letter$ $': /^\$(?:([a-z])(?:$|[^a-zA-Z]))\$$/,
-      'one lowercase greek letter $': /^(?:\$?[\u03B1-\u03C9]\$?|\$?\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\s*\$?)(?:\s+|\{\}|(?![a-zA-Z]))$/,
-      'digits': /^[0-9]+/,
-      '-9.,9': /^[+\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))/,
-      '-9.,9 no missing 0': /^[+\-]?[0-9]+(?:[.,][0-9]+)?/,
-      '(-)(9.,9)(e)(99)': function e99(input) {
-        var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))?(\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))\))?(?:([eE]|\s*(\*|x|\\times|\u00D7)\s*10\^)([+\-]?[0-9]+|\{[+\-]?[0-9]+\}))?/);
-
-        if (m && m[0]) {
-          return {
-            match_: m.splice(1),
-            remainder: input.substr(m[0].length)
-          };
-        }
-
-        return null;
-      },
-      '(-)(9)^(-9)': function _(input) {
-        var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+)?)\^([+\-]?[0-9]+|\{[+\-]?[0-9]+\})/);
-
-        if (m && m[0]) {
-          return {
-            match_: m.splice(1),
-            remainder: input.substr(m[0].length)
-          };
-        }
-
-        return null;
-      },
-      'state of aggregation $': function stateOfAggregation$(input) {
-        // ... or crystal system
-        var a = mhchemParser.patterns.findObserveGroups(input, "", /^\([a-z]{1,3}(?=[\),])/, ")", ""); // (aq), (aq,$\infty$), (aq, sat)
-
-        if (a && a.remainder.match(/^($|[\s,;\)\]\}])/)) {
-          return a;
-        } //  AND end of 'phrase'
-
-
-        var m = input.match(/^(?:\((?:\\ca\s?)?\$[amothc]\$\))/); // OR crystal system ($o$) (\ca$c$)
-
-        if (m) {
-          return {
-            match_: m[0],
-            remainder: input.substr(m[0].length)
-          };
-        }
-
-        return null;
-      },
-      '_{(state of aggregation)}$': /^_\{(\([a-z]{1,3}\))\}/,
-      '{[(': /^(?:\\\{|\[|\()/,
-      ')]}': /^(?:\)|\]|\\\})/,
-      ', ': /^[,;]\s*/,
-      ',': /^[,;]/,
-      '.': /^[.]/,
-      '. ': /^([.\u22C5\u00B7\u2022])\s*/,
-      '...': /^\.\.\.(?=$|[^.])/,
-      '* ': /^([*])\s*/,
-      '^{(...)}': function _(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "^{", "", "", "}");
-      },
-      '^($...$)': function $$(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "^", "$", "$", "");
-      },
-      '^a': /^\^([0-9]+|[^\\_])/,
-      '^\\x{}{}': function x(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true);
-      },
-      '^\\x{}': function x(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", "");
-      },
-      '^\\x': /^\^(\\[a-zA-Z]+)\s*/,
-      '^(-1)': /^\^(-?\d+)/,
-      '\'': /^'/,
-      '_{(...)}': function _(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "_{", "", "", "}");
-      },
-      '_($...$)': function _$$(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "_", "$", "$", "");
-      },
-      '_9': /^_([+\-]?[0-9]+|[^\\])/,
-      '_\\x{}{}': function _X(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true);
-      },
-      '_\\x{}': function _X(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", "");
-      },
-      '_\\x': /^_(\\[a-zA-Z]+)\s*/,
-      '^_': /^(?:\^(?=_)|\_(?=\^)|[\^_]$)/,
-      '{}': /^\{\}/,
-      '{...}': function _(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "", "{", "}", "");
-      },
-      '{(...)}': function _(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "{", "", "", "}");
-      },
-      '$...$': function $$(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "", "$", "$", "");
-      },
-      '${(...)}$': function $$(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "${", "", "", "}$");
-      },
-      '$(...)$': function $$(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "$", "", "", "$");
-      },
-      '=<>': /^[=<>]/,
-      '#': /^[#\u2261]/,
-      '+': /^\+/,
-      '-$': /^-(?=[\s_},;\]/]|$|\([a-z]+\))/,
-      // -space -, -; -] -/ -$ -state-of-aggregation
-      '-9': /^-(?=[0-9])/,
-      '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/,
-      '-': /^-/,
-      'pm-operator': /^(?:\\pm|\$\\pm\$|\+-|\+\/-)/,
-      'operator': /^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/,
-      'arrowUpDown': /^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/,
-      '\\bond{(...)}': function bond(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\bond{", "", "", "}");
-      },
-      '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/,
-      'CMT': /^[CMT](?=\[)/,
-      '[(...)]': function _(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "[", "", "", "]");
-      },
-      '1st-level escape': /^(&|\\\\|\\hline)\s*/,
-      '\\,': /^(?:\\[,\ ;:])/,
-      // \\x - but output no space before
-      '\\x{}{}': function x(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true);
-      },
-      '\\x{}': function x(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "");
-      },
-      '\\ca': /^\\ca(?:\s+|(?![a-zA-Z]))/,
-      '\\x': /^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/,
-      'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,
-      // only those with numbers in front, because the others will be formatted correctly anyway
-      'others': /^[\/~|]/,
-      '\\frac{(...)}': function frac(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\frac{", "", "", "}", "{", "", "", "}");
-      },
-      '\\overset{(...)}': function overset(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\overset{", "", "", "}", "{", "", "", "}");
-      },
-      "\\underset{(...)}": function underset(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\underset{", "", "", "}", "{", "", "", "}");
-      },
-      "\\underbrace{(...)}": function underbrace(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\underbrace{", "", "", "}_", "{", "", "", "}");
-      },
-      '\\color{(...)}0': function color0(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}");
-      },
-      '\\color{(...)}{(...)}1': function color1(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}", "{", "", "", "}");
-      },
-      '\\color(...){(...)}2': function color2(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\color", "\\", "", /^(?=\{)/, "{", "", "", "}");
-      },
-      '\\ce{(...)}': function ce(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\ce{", "", "", "}");
-      },
-      'oxidation$': /^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,
-      'd-oxidation$': /^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,
-      // 0 could be oxidation or charge
-      'roman numeral': /^[IVX]+/,
-      '1/2$': /^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/,
-      'amount': function amount(input) {
-        var match; // e.g. 2, 0.5, 1/2, -2, n/2, +;  $a$ could be added later in parsing
-
-        match = input.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/);
-
-        if (match) {
-          return {
-            match_: match[0],
-            remainder: input.substr(match[0].length)
-          };
-        }
-
-        var a = mhchemParser.patterns.findObserveGroups(input, "", "$", "$", "");
-
-        if (a) {
-          // e.g. $2n-1$, $-$
-          match = a.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/);
-
-          if (match) {
-            return {
-              match_: match[0],
-              remainder: input.substr(match[0].length)
-            };
-          }
-        }
-
-        return null;
-      },
-      'amount2': function amount2(input) {
-        return this['amount'](input);
-      },
-      '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/,
-      'formula$': function formula$(input) {
-        if (input.match(/^\([a-z]+\)$/)) {
-          return null;
-        } // state of aggregation = no formula
-
-
-        var match = input.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/);
-
-        if (match) {
-          return {
-            match_: match[0],
-            remainder: input.substr(match[0].length)
-          };
-        }
-
-        return null;
-      },
-      'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,
-      '/': /^\s*(\/)\s*/,
-      '//': /^\s*(\/\/)\s*/,
-      '*': /^\s*[*.]\s*/
-    },
-    findObserveGroups: function findObserveGroups(input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) {
-      /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */
-      var _match = function _match(input, pattern) {
-        if (typeof pattern === "string") {
-          if (input.indexOf(pattern) !== 0) {
-            return null;
-          }
-
-          return pattern;
-        } else {
-          var match = input.match(pattern);
-
-          if (!match) {
-            return null;
-          }
-
-          return match[0];
-        }
-      };
-      /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */
-
-
-      var _findObserveGroups = function _findObserveGroups(input, i, endChars) {
-        var braces = 0;
-
-        while (i < input.length) {
-          var a = input.charAt(i);
-
-          var match = _match(input.substr(i), endChars);
-
-          if (match !== null && braces === 0) {
-            return {
-              endMatchBegin: i,
-              endMatchEnd: i + match.length
-            };
-          } else if (a === "{") {
-            braces++;
-          } else if (a === "}") {
-            if (braces === 0) {
-              throw ["ExtraCloseMissingOpen", "Extra close brace or missing open brace"];
-            } else {
-              braces--;
-            }
-          }
-
-          i++;
-        }
-
-        if (braces > 0) {
-          return null;
-        }
-
-        return null;
-      };
-
-      var match = _match(input, begExcl);
-
-      if (match === null) {
-        return null;
-      }
-
-      input = input.substr(match.length);
-      match = _match(input, begIncl);
-
-      if (match === null) {
-        return null;
-      }
-
-      var e = _findObserveGroups(input, match.length, endIncl || endExcl);
-
-      if (e === null) {
-        return null;
-      }
-
-      var match1 = input.substring(0, endIncl ? e.endMatchEnd : e.endMatchBegin);
-
-      if (!(beg2Excl || beg2Incl)) {
-        return {
-          match_: match1,
-          remainder: input.substr(e.endMatchEnd)
-        };
-      } else {
-        var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl);
-
-        if (group2 === null) {
-          return null;
-        }
-        /** @type {string[]} */
-
-
-        var matchRet = [match1, group2.match_];
-        return {
-          match_: combine ? matchRet.join("") : matchRet,
-          remainder: group2.remainder
-        };
-      }
-    },
-    //
-    // Matching function
-    // e.g. match("a", input) will look for the regexp called "a" and see if it matches
-    // returns null or {match_:"a", remainder:"bc"}
-    //
-    match_: function match_(m, input) {
-      var pattern = mhchemParser.patterns.patterns[m];
-
-      if (pattern === undefined) {
-        throw ["MhchemBugP", "mhchem bug P. Please report. (" + m + ")"]; // Trying to use non-existing pattern
-      } else if (typeof pattern === "function") {
-        return mhchemParser.patterns.patterns[m](input); // cannot use cached var pattern here, because some pattern functions need this===mhchemParser
-      } else {
-        // RegExp
-        var match = input.match(pattern);
-
-        if (match) {
-          var mm;
-
-          if (match[2]) {
-            mm = [match[1], match[2]];
-          } else if (match[1]) {
-            mm = match[1];
-          } else {
-            mm = match[0];
-          }
-
-          return {
-            match_: mm,
-            remainder: input.substr(match[0].length)
-          };
-        }
-
-        return null;
-      }
-    }
-  },
-  //
-  // Generic state machine actions
-  //
-  actions: {
-    'a=': function a(buffer, m) {
-      buffer.a = (buffer.a || "") + m;
-    },
-    'b=': function b(buffer, m) {
-      buffer.b = (buffer.b || "") + m;
-    },
-    'p=': function p(buffer, m) {
-      buffer.p = (buffer.p || "") + m;
-    },
-    'o=': function o(buffer, m) {
-      buffer.o = (buffer.o || "") + m;
-    },
-    'q=': function q(buffer, m) {
-      buffer.q = (buffer.q || "") + m;
-    },
-    'd=': function d(buffer, m) {
-      buffer.d = (buffer.d || "") + m;
-    },
-    'rm=': function rm(buffer, m) {
-      buffer.rm = (buffer.rm || "") + m;
-    },
-    'text=': function text(buffer, m) {
-      buffer.text_ = (buffer.text_ || "") + m;
-    },
-    'insert': function insert(buffer, m, a) {
-      return {
-        type_: a
-      };
-    },
-    'insert+p1': function insertP1(buffer, m, a) {
-      return {
-        type_: a,
-        p1: m
-      };
-    },
-    'insert+p1+p2': function insertP1P2(buffer, m, a) {
-      return {
-        type_: a,
-        p1: m[0],
-        p2: m[1]
-      };
-    },
-    'copy': function copy(buffer, m) {
-      return m;
-    },
-    'rm': function rm(buffer, m) {
-      return {
-        type_: 'rm',
-        p1: m || ""
-      };
-    },
-    'text': function text(buffer, m) {
-      return mhchemParser.go(m, 'text');
-    },
-    '{text}': function text(buffer, m) {
-      var ret = ["{"];
-      mhchemParser.concatArray(ret, mhchemParser.go(m, 'text'));
-      ret.push("}");
-      return ret;
-    },
-    'tex-math': function texMath(buffer, m) {
-      return mhchemParser.go(m, 'tex-math');
-    },
-    'tex-math tight': function texMathTight(buffer, m) {
-      return mhchemParser.go(m, 'tex-math tight');
-    },
-    'bond': function bond(buffer, m, k) {
-      return {
-        type_: 'bond',
-        kind_: k || m
-      };
-    },
-    'color0-output': function color0Output(buffer, m) {
-      return {
-        type_: 'color0',
-        color: m[0]
-      };
-    },
-    'ce': function ce(buffer, m) {
-      return mhchemParser.go(m);
-    },
-    '1/2': function _(buffer, m) {
-      /** @type {ParserOutput[]} */
-      var ret = [];
-
-      if (m.match(/^[+\-]/)) {
-        ret.push(m.substr(0, 1));
-        m = m.substr(1);
-      }
-
-      var n = m.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/);
-      n[1] = n[1].replace(/\$/g, "");
-      ret.push({
-        type_: 'frac',
-        p1: n[1],
-        p2: n[2]
-      });
-
-      if (n[3]) {
-        n[3] = n[3].replace(/\$/g, "");
-        ret.push({
-          type_: 'tex-math',
-          p1: n[3]
-        });
-      }
-
-      return ret;
-    },
-    '9,9': function _(buffer, m) {
-      return mhchemParser.go(m, '9,9');
-    }
-  },
-  //
-  // createTransitions
-  // convert  { 'letter': { 'state': { action_: 'output' } } }  to  { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] }
-  // with expansion of 'a|b' to 'a' and 'b' (at 2 places)
-  //
-  createTransitions: function createTransitions(o) {
-    var pattern, state;
-    /** @type {string[]} */
-
-    var stateArray;
-    var i; //
-    // 1. Collect all states
-    //
-
-    /** @type {Transitions} */
-
-    var transitions = {};
-
-    for (pattern in o) {
-      for (state in o[pattern]) {
-        stateArray = state.split("|");
-        o[pattern][state].stateArray = stateArray;
-
-        for (i = 0; i < stateArray.length; i++) {
-          transitions[stateArray[i]] = [];
-        }
-      }
-    } //
-    // 2. Fill states
-    //
-
-
-    for (pattern in o) {
-      for (state in o[pattern]) {
-        stateArray = o[pattern][state].stateArray || [];
-
-        for (i = 0; i < stateArray.length; i++) {
-          //
-          // 2a. Normalize actions into array:  'text=' ==> [{type_:'text='}]
-          // (Note to myself: Resolving the function here would be problematic. It would need .bind (for *this*) and currying (for *option*).)
-          //
-
-          /** @type {any} */
-          var p = o[pattern][state];
-
-          if (p.action_) {
-            p.action_ = [].concat(p.action_);
-
-            for (var k = 0; k < p.action_.length; k++) {
-              if (typeof p.action_[k] === "string") {
-                p.action_[k] = {
-                  type_: p.action_[k]
-                };
-              }
-            }
-          } else {
-            p.action_ = [];
-          } //
-          // 2.b Multi-insert
-          //
-
-
-          var patternArray = pattern.split("|");
-
-          for (var j = 0; j < patternArray.length; j++) {
-            if (stateArray[i] === '*') {
-              // insert into all
-              for (var t in transitions) {
-                transitions[t].push({
-                  pattern: patternArray[j],
-                  task: p
-                });
-              }
-            } else {
-              transitions[stateArray[i]].push({
-                pattern: patternArray[j],
-                task: p
-              });
-            }
-          }
-        }
-      }
-    }
-
-    return transitions;
-  },
-  stateMachines: {}
-}; //
-// Definition of state machines
-//
-
-mhchemParser.stateMachines = {
-  //
-  // \ce state machines
-  //
-  //#region ce
-  'ce': {
-    // main parser
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {
-          action_: 'output'
-        }
-      },
-      'else': {
-        '0|1|2': {
-          action_: 'beginsWithBond=false',
-          revisit: true,
-          toContinue: true
-        }
-      },
-      'oxidation$': {
-        '0': {
-          action_: 'oxidation-output'
-        }
-      },
-      'CMT': {
-        'r': {
-          action_: 'rdt=',
-          nextState: 'rt'
-        },
-        'rd': {
-          action_: 'rqt=',
-          nextState: 'rdt'
-        }
-      },
-      'arrowUpDown': {
-        '0|1|2|as': {
-          action_: ['sb=false', 'output', 'operator'],
-          nextState: '1'
-        }
-      },
-      'uprightEntities': {
-        '0|1|2': {
-          action_: ['o=', 'output'],
-          nextState: '1'
-        }
-      },
-      'orbital': {
-        '0|1|2|3': {
-          action_: 'o=',
-          nextState: 'o'
-        }
-      },
-      '->': {
-        '0|1|2|3': {
-          action_: 'r=',
-          nextState: 'r'
-        },
-        'a|as': {
-          action_: ['output', 'r='],
-          nextState: 'r'
-        },
-        '*': {
-          action_: ['output', 'r='],
-          nextState: 'r'
-        }
-      },
-      '+': {
-        'o': {
-          action_: 'd= kv',
-          nextState: 'd'
-        },
-        'd|D': {
-          action_: 'd=',
-          nextState: 'd'
-        },
-        'q': {
-          action_: 'd=',
-          nextState: 'qd'
-        },
-        'qd|qD': {
-          action_: 'd=',
-          nextState: 'qd'
-        },
-        'dq': {
-          action_: ['output', 'd='],
-          nextState: 'd'
-        },
-        '3': {
-          action_: ['sb=false', 'output', 'operator'],
-          nextState: '0'
-        }
-      },
-      'amount': {
-        '0|2': {
-          action_: 'a=',
-          nextState: 'a'
-        }
-      },
-      'pm-operator': {
-        '0|1|2|a|as': {
-          action_: ['sb=false', 'output', {
-            type_: 'operator',
-            option: '\\pm'
-          }],
-          nextState: '0'
-        }
-      },
-      'operator': {
-        '0|1|2|a|as': {
-          action_: ['sb=false', 'output', 'operator'],
-          nextState: '0'
-        }
-      },
-      '-$': {
-        'o|q': {
-          action_: ['charge or bond', 'output'],
-          nextState: 'qd'
-        },
-        'd': {
-          action_: 'd=',
-          nextState: 'd'
-        },
-        'D': {
-          action_: ['output', {
-            type_: 'bond',
-            option: "-"
-          }],
-          nextState: '3'
-        },
-        'q': {
-          action_: 'd=',
-          nextState: 'qd'
-        },
-        'qd': {
-          action_: 'd=',
-          nextState: 'qd'
-        },
-        'qD|dq': {
-          action_: ['output', {
-            type_: 'bond',
-            option: "-"
-          }],
-          nextState: '3'
-        }
-      },
-      '-9': {
-        '3|o': {
-          action_: ['output', {
-            type_: 'insert',
-            option: 'hyphen'
-          }],
-          nextState: '3'
-        }
-      },
-      '- orbital overlap': {
-        'o': {
-          action_: ['output', {
-            type_: 'insert',
-            option: 'hyphen'
-          }],
-          nextState: '2'
-        },
-        'd': {
-          action_: ['output', {
-            type_: 'insert',
-            option: 'hyphen'
-          }],
-          nextState: '2'
-        }
-      },
-      '-': {
-        '0|1|2': {
-          action_: [{
-            type_: 'output',
-            option: 1
-          }, 'beginsWithBond=true', {
-            type_: 'bond',
-            option: "-"
-          }],
-          nextState: '3'
-        },
-        '3': {
-          action_: {
-            type_: 'bond',
-            option: "-"
-          }
-        },
-        'a': {
-          action_: ['output', {
-            type_: 'insert',
-            option: 'hyphen'
-          }],
-          nextState: '2'
-        },
-        'as': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, {
-            type_: 'bond',
-            option: "-"
-          }],
-          nextState: '3'
-        },
-        'b': {
-          action_: 'b='
-        },
-        'o': {
-          action_: {
-            type_: '- after o/d',
-            option: false
-          },
-          nextState: '2'
-        },
-        'q': {
-          action_: {
-            type_: '- after o/d',
-            option: false
-          },
-          nextState: '2'
-        },
-        'd|qd|dq': {
-          action_: {
-            type_: '- after o/d',
-            option: true
-          },
-          nextState: '2'
-        },
-        'D|qD|p': {
-          action_: ['output', {
-            type_: 'bond',
-            option: "-"
-          }],
-          nextState: '3'
-        }
-      },
-      'amount2': {
-        '1|3': {
-          action_: 'a=',
-          nextState: 'a'
-        }
-      },
-      'letters': {
-        '0|1|2|3|a|as|b|p|bp|o': {
-          action_: 'o=',
-          nextState: 'o'
-        },
-        'q|dq': {
-          action_: ['output', 'o='],
-          nextState: 'o'
-        },
-        'd|D|qd|qD': {
-          action_: 'o after d',
-          nextState: 'o'
-        }
-      },
-      'digits': {
-        'o': {
-          action_: 'q=',
-          nextState: 'q'
-        },
-        'd|D': {
-          action_: 'q=',
-          nextState: 'dq'
-        },
-        'q': {
-          action_: ['output', 'o='],
-          nextState: 'o'
-        },
-        'a': {
-          action_: 'o=',
-          nextState: 'o'
-        }
-      },
-      'space A': {
-        'b|p|bp': {}
-      },
-      'space': {
-        'a': {
-          nextState: 'as'
-        },
-        '0': {
-          action_: 'sb=false'
-        },
-        '1|2': {
-          action_: 'sb=true'
-        },
-        'r|rt|rd|rdt|rdq': {
-          action_: 'output',
-          nextState: '0'
-        },
-        '*': {
-          action_: ['output', 'sb=true'],
-          nextState: '1'
-        }
-      },
-      '1st-level escape': {
-        '1|2': {
-          action_: ['output', {
-            type_: 'insert+p1',
-            option: '1st-level escape'
-          }]
-        },
-        '*': {
-          action_: ['output', {
-            type_: 'insert+p1',
-            option: '1st-level escape'
-          }],
-          nextState: '0'
-        }
-      },
-      '[(...)]': {
-        'r|rt': {
-          action_: 'rd=',
-          nextState: 'rd'
-        },
-        'rd|rdt': {
-          action_: 'rq=',
-          nextState: 'rdq'
-        }
-      },
-      '...': {
-        'o|d|D|dq|qd|qD': {
-          action_: ['output', {
-            type_: 'bond',
-            option: "..."
-          }],
-          nextState: '3'
-        },
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 1
-          }, {
-            type_: 'insert',
-            option: 'ellipsis'
-          }],
-          nextState: '1'
-        }
-      },
-      '. |* ': {
-        '*': {
-          action_: ['output', {
-            type_: 'insert',
-            option: 'addition compound'
-          }],
-          nextState: '1'
-        }
-      },
-      'state of aggregation $': {
-        '*': {
-          action_: ['output', 'state of aggregation'],
-          nextState: '1'
-        }
-      },
-      '{[(': {
-        'a|as|o': {
-          action_: ['o=', 'output', 'parenthesisLevel++'],
-          nextState: '2'
-        },
-        '0|1|2|3': {
-          action_: ['o=', 'output', 'parenthesisLevel++'],
-          nextState: '2'
-        },
-        '*': {
-          action_: ['output', 'o=', 'output', 'parenthesisLevel++'],
-          nextState: '2'
-        }
-      },
-      ')]}': {
-        '0|1|2|3|b|p|bp|o': {
-          action_: ['o=', 'parenthesisLevel--'],
-          nextState: 'o'
-        },
-        'a|as|d|D|q|qd|qD|dq': {
-          action_: ['output', 'o=', 'parenthesisLevel--'],
-          nextState: 'o'
-        }
-      },
-      ', ': {
-        '*': {
-          action_: ['output', 'comma'],
-          nextState: '0'
-        }
-      },
-      '^_': {
-        // ^ and _ without a sensible argument
-        '*': {}
-      },
-      '^{(...)}|^($...$)': {
-        '0|1|2|as': {
-          action_: 'b=',
-          nextState: 'b'
-        },
-        'p': {
-          action_: 'b=',
-          nextState: 'bp'
-        },
-        '3|o': {
-          action_: 'd= kv',
-          nextState: 'D'
-        },
-        'q': {
-          action_: 'd=',
-          nextState: 'qD'
-        },
-        'd|D|qd|qD|dq': {
-          action_: ['output', 'd='],
-          nextState: 'D'
-        }
-      },
-      '^a|^\\x{}{}|^\\x{}|^\\x|\'': {
-        '0|1|2|as': {
-          action_: 'b=',
-          nextState: 'b'
-        },
-        'p': {
-          action_: 'b=',
-          nextState: 'bp'
-        },
-        '3|o': {
-          action_: 'd= kv',
-          nextState: 'd'
-        },
-        'q': {
-          action_: 'd=',
-          nextState: 'qd'
-        },
-        'd|qd|D|qD': {
-          action_: 'd='
-        },
-        'dq': {
-          action_: ['output', 'd='],
-          nextState: 'd'
-        }
-      },
-      '_{(state of aggregation)}$': {
-        'd|D|q|qd|qD|dq': {
-          action_: ['output', 'q='],
-          nextState: 'q'
-        }
-      },
-      '_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x': {
-        '0|1|2|as': {
-          action_: 'p=',
-          nextState: 'p'
-        },
-        'b': {
-          action_: 'p=',
-          nextState: 'bp'
-        },
-        '3|o': {
-          action_: 'q=',
-          nextState: 'q'
-        },
-        'd|D': {
-          action_: 'q=',
-          nextState: 'dq'
-        },
-        'q|qd|qD|dq': {
-          action_: ['output', 'q='],
-          nextState: 'q'
-        }
-      },
-      '=<>': {
-        '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'bond'],
-          nextState: '3'
-        }
-      },
-      '#': {
-        '0|1|2|3|a|as|o': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, {
-            type_: 'bond',
-            option: "#"
-          }],
-          nextState: '3'
-        }
-      },
-      '{}': {
-        '*': {
-          action_: {
-            type_: 'output',
-            option: 1
-          },
-          nextState: '1'
-        }
-      },
-      '{...}': {
-        '0|1|2|3|a|as|b|p|bp': {
-          action_: 'o=',
-          nextState: 'o'
-        },
-        'o|d|D|q|qd|qD|dq': {
-          action_: ['output', 'o='],
-          nextState: 'o'
-        }
-      },
-      '$...$': {
-        'a': {
-          action_: 'a='
-        },
-        // 2$n$
-        '0|1|2|3|as|b|p|bp|o': {
-          action_: 'o=',
-          nextState: 'o'
-        },
-        // not 'amount'
-        'as|o': {
-          action_: 'o='
-        },
-        'q|d|D|qd|qD|dq': {
-          action_: ['output', 'o='],
-          nextState: 'o'
-        }
-      },
-      '\\bond{(...)}': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'bond'],
-          nextState: "3"
-        }
-      },
-      '\\frac{(...)}': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 1
-          }, 'frac-output'],
-          nextState: '3'
-        }
-      },
-      '\\overset{(...)}': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'overset-output'],
-          nextState: '3'
-        }
-      },
-      "\\underset{(...)}": {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'underset-output'],
-          nextState: '3'
-        }
-      },
-      "\\underbrace{(...)}": {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'underbrace-output'],
-          nextState: '3'
-        }
-      },
-      '\\color{(...)}{(...)}1|\\color(...){(...)}2': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'color-output'],
-          nextState: '3'
-        }
-      },
-      '\\color{(...)}0': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'color0-output']
-        }
-      },
-      '\\ce{(...)}': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'ce'],
-          nextState: '3'
-        }
-      },
-      '\\,': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 1
-          }, 'copy'],
-          nextState: '1'
-        }
-      },
-      '\\x{}{}|\\x{}|\\x': {
-        '0|1|2|3|a|as|b|p|bp|o|c0': {
-          action_: ['o=', 'output'],
-          nextState: '3'
-        },
-        '*': {
-          action_: ['output', 'o=', 'output'],
-          nextState: '3'
-        }
-      },
-      'others': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 1
-          }, 'copy'],
-          nextState: '3'
-        }
-      },
-      'else2': {
-        'a': {
-          action_: 'a to o',
-          nextState: 'o',
-          revisit: true
-        },
-        'as': {
-          action_: ['output', 'sb=true'],
-          nextState: '1',
-          revisit: true
-        },
-        'r|rt|rd|rdt|rdq': {
-          action_: ['output'],
-          nextState: '0',
-          revisit: true
-        },
-        '*': {
-          action_: ['output', 'copy'],
-          nextState: '3'
-        }
-      }
-    }),
-    actions: {
-      'o after d': function oAfterD(buffer, m) {
-        var ret;
-
-        if ((buffer.d || "").match(/^[0-9]+$/)) {
-          var tmp = buffer.d;
-          buffer.d = undefined;
-          ret = this['output'](buffer);
-          buffer.b = tmp;
-        } else {
-          ret = this['output'](buffer);
-        }
-
-        mhchemParser.actions['o='](buffer, m);
-        return ret;
-      },
-      'd= kv': function dKv(buffer, m) {
-        buffer.d = m;
-        buffer.dType = 'kv';
-      },
-      'charge or bond': function chargeOrBond(buffer, m) {
-        if (buffer['beginsWithBond']) {
-          /** @type {ParserOutput[]} */
-          var ret = [];
-          mhchemParser.concatArray(ret, this['output'](buffer));
-          mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-"));
-          return ret;
-        } else {
-          buffer.d = m;
-        }
-      },
-      '- after o/d': function afterOD(buffer, m, isAfterD) {
-        var c1 = mhchemParser.patterns.match_('orbital', buffer.o || "");
-        var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || "");
-        var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || "");
-        var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || "");
-        var hyphenFollows = m === "-" && (c1 && c1.remainder === "" || c2 || c3 || c4);
-
-        if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) {
-          buffer.o = '$' + buffer.o + '$';
-        }
-        /** @type {ParserOutput[]} */
-
-
-        var ret = [];
-
-        if (hyphenFollows) {
-          mhchemParser.concatArray(ret, this['output'](buffer));
-          ret.push({
-            type_: 'hyphen'
-          });
-        } else {
-          c1 = mhchemParser.patterns.match_('digits', buffer.d || "");
-
-          if (isAfterD && c1 && c1.remainder === '') {
-            mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m));
-            mhchemParser.concatArray(ret, this['output'](buffer));
-          } else {
-            mhchemParser.concatArray(ret, this['output'](buffer));
-            mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-"));
-          }
-        }
-
-        return ret;
-      },
-      'a to o': function aToO(buffer) {
-        buffer.o = buffer.a;
-        buffer.a = undefined;
-      },
-      'sb=true': function sbTrue(buffer) {
-        buffer.sb = true;
-      },
-      'sb=false': function sbFalse(buffer) {
-        buffer.sb = false;
-      },
-      'beginsWithBond=true': function beginsWithBondTrue(buffer) {
-        buffer['beginsWithBond'] = true;
-      },
-      'beginsWithBond=false': function beginsWithBondFalse(buffer) {
-        buffer['beginsWithBond'] = false;
-      },
-      'parenthesisLevel++': function parenthesisLevel(buffer) {
-        buffer['parenthesisLevel']++;
-      },
-      'parenthesisLevel--': function parenthesisLevel(buffer) {
-        buffer['parenthesisLevel']--;
-      },
-      'state of aggregation': function stateOfAggregation(buffer, m) {
-        return {
-          type_: 'state of aggregation',
-          p1: mhchemParser.go(m, 'o')
-        };
-      },
-      'comma': function comma(buffer, m) {
-        var a = m.replace(/\s*$/, '');
-        var withSpace = a !== m;
-
-        if (withSpace && buffer['parenthesisLevel'] === 0) {
-          return {
-            type_: 'comma enumeration L',
-            p1: a
-          };
-        } else {
-          return {
-            type_: 'comma enumeration M',
-            p1: a
-          };
-        }
-      },
-      'output': function output(buffer, m, entityFollows) {
-        // entityFollows:
-        //   undefined = if we have nothing else to output, also ignore the just read space (buffer.sb)
-        //   1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1)
-        //   2 = 1 + the entity can have an amount, so output a\, instead of converting it to o (can only apply to states a|as)
-
-        /** @type {ParserOutput | ParserOutput[]} */
-        var ret;
-
-        if (!buffer.r) {
-          ret = [];
-
-          if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) {//ret = [];
-          } else {
-            if (buffer.sb) {
-              ret.push({
-                type_: 'entitySkip'
-              });
-            }
-
-            if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows !== 2) {
-              buffer.o = buffer.a;
-              buffer.a = undefined;
-            } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) {
-              buffer.o = buffer.a;
-              buffer.d = buffer.b;
-              buffer.q = buffer.p;
-              buffer.a = buffer.b = buffer.p = undefined;
-            } else {
-              if (buffer.o && buffer.dType === 'kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || "")) {
-                buffer.dType = 'oxidation';
-              } else if (buffer.o && buffer.dType === 'kv' && !buffer.q) {
-                buffer.dType = undefined;
-              }
-            }
-
-            ret.push({
-              type_: 'chemfive',
-              a: mhchemParser.go(buffer.a, 'a'),
-              b: mhchemParser.go(buffer.b, 'bd'),
-              p: mhchemParser.go(buffer.p, 'pq'),
-              o: mhchemParser.go(buffer.o, 'o'),
-              q: mhchemParser.go(buffer.q, 'pq'),
-              d: mhchemParser.go(buffer.d, buffer.dType === 'oxidation' ? 'oxidation' : 'bd'),
-              dType: buffer.dType
-            });
-          }
-        } else {
-          // r
-
-          /** @type {ParserOutput[]} */
-          var rd;
-
-          if (buffer.rdt === 'M') {
-            rd = mhchemParser.go(buffer.rd, 'tex-math');
-          } else if (buffer.rdt === 'T') {
-            rd = [{
-              type_: 'text',
-              p1: buffer.rd || ""
-            }];
-          } else {
-            rd = mhchemParser.go(buffer.rd);
-          }
-          /** @type {ParserOutput[]} */
-
-
-          var rq;
-
-          if (buffer.rqt === 'M') {
-            rq = mhchemParser.go(buffer.rq, 'tex-math');
-          } else if (buffer.rqt === 'T') {
-            rq = [{
-              type_: 'text',
-              p1: buffer.rq || ""
-            }];
-          } else {
-            rq = mhchemParser.go(buffer.rq);
-          }
-
-          ret = {
-            type_: 'arrow',
-            r: buffer.r,
-            rd: rd,
-            rq: rq
-          };
-        }
-
-        for (var p in buffer) {
-          if (p !== 'parenthesisLevel' && p !== 'beginsWithBond') {
-            delete buffer[p];
-          }
-        }
-
-        return ret;
-      },
-      'oxidation-output': function oxidationOutput(buffer, m) {
-        var ret = ["{"];
-        mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation'));
-        ret.push("}");
-        return ret;
-      },
-      'frac-output': function fracOutput(buffer, m) {
-        return {
-          type_: 'frac-ce',
-          p1: mhchemParser.go(m[0]),
-          p2: mhchemParser.go(m[1])
-        };
-      },
-      'overset-output': function oversetOutput(buffer, m) {
-        return {
-          type_: 'overset',
-          p1: mhchemParser.go(m[0]),
-          p2: mhchemParser.go(m[1])
-        };
-      },
-      'underset-output': function undersetOutput(buffer, m) {
-        return {
-          type_: 'underset',
-          p1: mhchemParser.go(m[0]),
-          p2: mhchemParser.go(m[1])
-        };
-      },
-      'underbrace-output': function underbraceOutput(buffer, m) {
-        return {
-          type_: 'underbrace',
-          p1: mhchemParser.go(m[0]),
-          p2: mhchemParser.go(m[1])
-        };
-      },
-      'color-output': function colorOutput(buffer, m) {
-        return {
-          type_: 'color',
-          color1: m[0],
-          color2: mhchemParser.go(m[1])
-        };
-      },
-      'r=': function r(buffer, m) {
-        buffer.r = m;
-      },
-      'rdt=': function rdt(buffer, m) {
-        buffer.rdt = m;
-      },
-      'rd=': function rd(buffer, m) {
-        buffer.rd = m;
-      },
-      'rqt=': function rqt(buffer, m) {
-        buffer.rqt = m;
-      },
-      'rq=': function rq(buffer, m) {
-        buffer.rq = m;
-      },
-      'operator': function operator(buffer, m, p1) {
-        return {
-          type_: 'operator',
-          kind_: p1 || m
-        };
-      }
-    }
-  },
-  'a': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {}
-      },
-      '1/2$': {
-        '0': {
-          action_: '1/2'
-        }
-      },
-      'else': {
-        '0': {
-          nextState: '1',
-          revisit: true
-        }
-      },
-      '$(...)$': {
-        '*': {
-          action_: 'tex-math tight',
-          nextState: '1'
-        }
-      },
-      ',': {
-        '*': {
-          action_: {
-            type_: 'insert',
-            option: 'commaDecimal'
-          }
-        }
-      },
-      'else2': {
-        '*': {
-          action_: 'copy'
-        }
-      }
-    }),
-    actions: {}
-  },
-  'o': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {}
-      },
-      '1/2$': {
-        '0': {
-          action_: '1/2'
-        }
-      },
-      'else': {
-        '0': {
-          nextState: '1',
-          revisit: true
-        }
-      },
-      'letters': {
-        '*': {
-          action_: 'rm'
-        }
-      },
-      '\\ca': {
-        '*': {
-          action_: {
-            type_: 'insert',
-            option: 'circa'
-          }
-        }
-      },
-      '\\x{}{}|\\x{}|\\x': {
-        '*': {
-          action_: 'copy'
-        }
-      },
-      '${(...)}$|$(...)$': {
-        '*': {
-          action_: 'tex-math'
-        }
-      },
-      '{(...)}': {
-        '*': {
-          action_: '{text}'
-        }
-      },
-      'else2': {
-        '*': {
-          action_: 'copy'
-        }
-      }
-    }),
-    actions: {}
-  },
-  'text': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {
-          action_: 'output'
-        }
-      },
-      '{...}': {
-        '*': {
-          action_: 'text='
-        }
-      },
-      '${(...)}$|$(...)$': {
-        '*': {
-          action_: 'tex-math'
-        }
-      },
-      '\\greek': {
-        '*': {
-          action_: ['output', 'rm']
-        }
-      },
-      '\\,|\\x{}{}|\\x{}|\\x': {
-        '*': {
-          action_: ['output', 'copy']
-        }
-      },
-      'else': {
-        '*': {
-          action_: 'text='
-        }
-      }
-    }),
-    actions: {
-      'output': function output(buffer) {
-        if (buffer.text_) {
-          /** @type {ParserOutput} */
-          var ret = {
-            type_: 'text',
-            p1: buffer.text_
-          };
-
-          for (var p in buffer) {
-            delete buffer[p];
-          }
-
-          return ret;
-        }
-      }
-    }
-  },
-  'pq': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {}
-      },
-      'state of aggregation $': {
-        '*': {
-          action_: 'state of aggregation'
-        }
-      },
-      'i$': {
-        '0': {
-          nextState: '!f',
-          revisit: true
-        }
-      },
-      '(KV letters),': {
-        '0': {
-          action_: 'rm',
-          nextState: '0'
-        }
-      },
-      'formula$': {
-        '0': {
-          nextState: 'f',
-          revisit: true
-        }
-      },
-      '1/2$': {
-        '0': {
-          action_: '1/2'
-        }
-      },
-      'else': {
-        '0': {
-          nextState: '!f',
-          revisit: true
-        }
-      },
-      '${(...)}$|$(...)$': {
-        '*': {
-          action_: 'tex-math'
-        }
-      },
-      '{(...)}': {
-        '*': {
-          action_: 'text'
-        }
-      },
-      'a-z': {
-        'f': {
-          action_: 'tex-math'
-        }
-      },
-      'letters': {
-        '*': {
-          action_: 'rm'
-        }
-      },
-      '-9.,9': {
-        '*': {
-          action_: '9,9'
-        }
-      },
-      ',': {
-        '*': {
-          action_: {
-            type_: 'insert+p1',
-            option: 'comma enumeration S'
-          }
-        }
-      },
-      '\\color{(...)}{(...)}1|\\color(...){(...)}2': {
-        '*': {
-          action_: 'color-output'
-        }
-      },
-      '\\color{(...)}0': {
-        '*': {
-          action_: 'color0-output'
-        }
-      },
-      '\\ce{(...)}': {
-        '*': {
-          action_: 'ce'
-        }
-      },
-      '\\,|\\x{}{}|\\x{}|\\x': {
-        '*': {
-          action_: 'copy'
-        }
-      },
-      'else2': {
-        '*': {
-          action_: 'copy'
-        }
-      }
-    }),
-    actions: {
-      'state of aggregation': function stateOfAggregation(buffer, m) {
-        return {
-          type_: 'state of aggregation subscript',
-          p1: mhchemParser.go(m, 'o')
-        };
-      },
-      'color-output': function colorOutput(buffer, m) {
-        return {
-          type_: 'color',
-          color1: m[0],
-          color2: mhchemParser.go(m[1], 'pq')
-        };
-      }
-    }
-  },
-  'bd': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {}
-      },
-      'x$': {
-        '0': {
-          nextState: '!f',
-          revisit: true
-        }
-      },
-      'formula$': {
-        '0': {
-          nextState: 'f',
-          revisit: true
-        }
-      },
-      'else': {
-        '0': {
-          nextState: '!f',
-          revisit: true
-        }
-      },
-      '-9.,9 no missing 0': {
-        '*': {
-          action_: '9,9'
-        }
-      },
-      '.': {
-        '*': {
-          action_: {
-            type_: 'insert',
-            option: 'electron dot'
-          }
-        }
-      },
-      'a-z': {
-        'f': {
-          action_: 'tex-math'
-        }
-      },
-      'x': {
-        '*': {
-          action_: {
-            type_: 'insert',
-            option: 'KV x'
-          }
-        }
-      },
-      'letters': {
-        '*': {
-          action_: 'rm'
-        }
-      },
-      '\'': {
-        '*': {
-          action_: {
-            type_: 'insert',
-            option: 'prime'
-          }
-        }
-      },
-      '${(...)}$|$(...)$': {
-        '*': {
-          action_: 'tex-math'
-        }
-      },
-      '{(...)}': {
-        '*': {
-          action_: 'text'
-        }
-      },
-      '\\color{(...)}{(...)}1|\\color(...){(...)}2': {
-        '*': {
-          action_: 'color-output'
-        }
-      },
-      '\\color{(...)}0': {
-        '*': {
-          action_: 'color0-output'
-        }
-      },
-      '\\ce{(...)}': {
-        '*': {
-          action_: 'ce'
-        }
-      },
-      '\\,|\\x{}{}|\\x{}|\\x': {
-        '*': {
-          action_: 'copy'
-        }
-      },
-      'else2': {
-        '*': {
-          action_: 'copy'
-        }
-      }
-    }),
-    actions: {
-      'color-output': function colorOutput(buffer, m) {
-        return {
-          type_: 'color',
-          color1: m[0],
-          color2: mhchemParser.go(m[1], 'bd')
-        };
-      }
-    }
-  },
-  'oxidation': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {}
-      },
-      'roman numeral': {
-        '*': {
-          action_: 'roman-numeral'
-        }
-      },
-      '${(...)}$|$(...)$': {
-        '*': {
-          action_: 'tex-math'
-        }
-      },
-      'else': {
-        '*': {
-          action_: 'copy'
-        }
-      }
-    }),
-    actions: {
-      'roman-numeral': function romanNumeral(buffer, m) {
-        return {
-          type_: 'roman numeral',
-          p1: m || ""
-        };
-      }
-    }
-  },
-  'tex-math': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {
-          action_: 'output'
-        }
-      },
-      '\\ce{(...)}': {
-        '*': {
-          action_: ['output', 'ce']
-        }
-      },
-      '{...}|\\,|\\x{}{}|\\x{}|\\x': {
-        '*': {
-          action_: 'o='
-        }
-      },
-      'else': {
-        '*': {
-          action_: 'o='
-        }
-      }
-    }),
-    actions: {
-      'output': function output(buffer) {
-        if (buffer.o) {
-          /** @type {ParserOutput} */
-          var ret = {
-            type_: 'tex-math',
-            p1: buffer.o
-          };
-
-          for (var p in buffer) {
-            delete buffer[p];
-          }
-
-          return ret;
-        }
-      }
-    }
-  },
-  'tex-math tight': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {
-          action_: 'output'
-        }
-      },
-      '\\ce{(...)}': {
-        '*': {
-          action_: ['output', 'ce']
-        }
-      },
-      '{...}|\\,|\\x{}{}|\\x{}|\\x': {
-        '*': {
-          action_: 'o='
-        }
-      },
-      '-|+': {
-        '*': {
-          action_: 'tight operator'
-        }
-      },
-      'else': {
-        '*': {
-          action_: 'o='
-        }
-      }
-    }),
-    actions: {
-      'tight operator': function tightOperator(buffer, m) {
-        buffer.o = (buffer.o || "") + "{" + m + "}";
-      },
-      'output': function output(buffer) {
-        if (buffer.o) {
-          /** @type {ParserOutput} */
-          var ret = {
-            type_: 'tex-math',
-            p1: buffer.o
-          };
-
-          for (var p in buffer) {
-            delete buffer[p];
-          }
-
-          return ret;
-        }
-      }
-    }
-  },
-  '9,9': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {}
-      },
-      ',': {
-        '*': {
-          action_: 'comma'
-        }
-      },
-      'else': {
-        '*': {
-          action_: 'copy'
-        }
-      }
-    }),
-    actions: {
-      'comma': function comma() {
-        return {
-          type_: 'commaDecimal'
-        };
-      }
-    }
-  },
-  //#endregion
-  //
-  // \pu state machines
-  //
-  //#region pu
-  'pu': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {
-          action_: 'output'
-        }
-      },
-      'space$': {
-        '*': {
-          action_: ['output', 'space']
-        }
-      },
-      '{[(|)]}': {
-        '0|a': {
-          action_: 'copy'
-        }
-      },
-      '(-)(9)^(-9)': {
-        '0': {
-          action_: 'number^',
-          nextState: 'a'
-        }
-      },
-      '(-)(9.,9)(e)(99)': {
-        '0': {
-          action_: 'enumber',
-          nextState: 'a'
-        }
-      },
-      'space': {
-        '0|a': {}
-      },
-      'pm-operator': {
-        '0|a': {
-          action_: {
-            type_: 'operator',
-            option: '\\pm'
-          },
-          nextState: '0'
-        }
-      },
-      'operator': {
-        '0|a': {
-          action_: 'copy',
-          nextState: '0'
-        }
-      },
-      '//': {
-        'd': {
-          action_: 'o=',
-          nextState: '/'
-        }
-      },
-      '/': {
-        'd': {
-          action_: 'o=',
-          nextState: '/'
-        }
-      },
-      '{...}|else': {
-        '0|d': {
-          action_: 'd=',
-          nextState: 'd'
-        },
-        'a': {
-          action_: ['space', 'd='],
-          nextState: 'd'
-        },
-        '/|q': {
-          action_: 'q=',
-          nextState: 'q'
-        }
-      }
-    }),
-    actions: {
-      'enumber': function enumber(buffer, m) {
-        /** @type {ParserOutput[]} */
-        var ret = [];
-
-        if (m[0] === "+-" || m[0] === "+/-") {
-          ret.push("\\pm ");
-        } else if (m[0]) {
-          ret.push(m[0]);
-        }
-
-        if (m[1]) {
-          mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));
-
-          if (m[2]) {
-            if (m[2].match(/[,.]/)) {
-              mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9'));
-            } else {
-              ret.push(m[2]);
-            }
-          }
-
-          m[3] = m[4] || m[3];
-
-          if (m[3]) {
-            m[3] = m[3].trim();
-
-            if (m[3] === "e" || m[3].substr(0, 1) === "*") {
-              ret.push({
-                type_: 'cdot'
-              });
-            } else {
-              ret.push({
-                type_: 'times'
-              });
-            }
-          }
-        }
-
-        if (m[3]) {
-          ret.push("10^{" + m[5] + "}");
-        }
-
-        return ret;
-      },
-      'number^': function number(buffer, m) {
-        /** @type {ParserOutput[]} */
-        var ret = [];
-
-        if (m[0] === "+-" || m[0] === "+/-") {
-          ret.push("\\pm ");
-        } else if (m[0]) {
-          ret.push(m[0]);
-        }
-
-        mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));
-        ret.push("^{" + m[2] + "}");
-        return ret;
-      },
-      'operator': function operator(buffer, m, p1) {
-        return {
-          type_: 'operator',
-          kind_: p1 || m
-        };
-      },
-      'space': function space() {
-        return {
-          type_: 'pu-space-1'
-        };
-      },
-      'output': function output(buffer) {
-        /** @type {ParserOutput | ParserOutput[]} */
-        var ret;
-        var md = mhchemParser.patterns.match_('{(...)}', buffer.d || "");
-
-        if (md && md.remainder === '') {
-          buffer.d = md.match_;
-        }
-
-        var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || "");
-
-        if (mq && mq.remainder === '') {
-          buffer.q = mq.match_;
-        }
-
-        if (buffer.d) {
-          buffer.d = buffer.d.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C");
-          buffer.d = buffer.d.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F");
-        }
-
-        if (buffer.q) {
-          // fraction
-          buffer.q = buffer.q.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C");
-          buffer.q = buffer.q.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F");
-          var b5 = {
-            d: mhchemParser.go(buffer.d, 'pu'),
-            q: mhchemParser.go(buffer.q, 'pu')
-          };
-
-          if (buffer.o === '//') {
-            ret = {
-              type_: 'pu-frac',
-              p1: b5.d,
-              p2: b5.q
-            };
-          } else {
-            ret = b5.d;
-
-            if (b5.d.length > 1 || b5.q.length > 1) {
-              ret.push({
-                type_: ' / '
-              });
-            } else {
-              ret.push({
-                type_: '/'
-              });
-            }
-
-            mhchemParser.concatArray(ret, b5.q);
-          }
-        } else {
-          // no fraction
-          ret = mhchemParser.go(buffer.d, 'pu-2');
-        }
-
-        for (var p in buffer) {
-          delete buffer[p];
-        }
-
-        return ret;
-      }
-    }
-  },
-  'pu-2': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {
-          action_: 'output'
-        }
-      },
-      '*': {
-        '*': {
-          action_: ['output', 'cdot'],
-          nextState: '0'
-        }
-      },
-      '\\x': {
-        '*': {
-          action_: 'rm='
-        }
-      },
-      'space': {
-        '*': {
-          action_: ['output', 'space'],
-          nextState: '0'
-        }
-      },
-      '^{(...)}|^(-1)': {
-        '1': {
-          action_: '^(-1)'
-        }
-      },
-      '-9.,9': {
-        '0': {
-          action_: 'rm=',
-          nextState: '0'
-        },
-        '1': {
-          action_: '^(-1)',
-          nextState: '0'
-        }
-      },
-      '{...}|else': {
-        '*': {
-          action_: 'rm=',
-          nextState: '1'
-        }
-      }
-    }),
-    actions: {
-      'cdot': function cdot() {
-        return {
-          type_: 'tight cdot'
-        };
-      },
-      '^(-1)': function _(buffer, m) {
-        buffer.rm += "^{" + m + "}";
-      },
-      'space': function space() {
-        return {
-          type_: 'pu-space-2'
-        };
-      },
-      'output': function output(buffer) {
-        /** @type {ParserOutput | ParserOutput[]} */
-        var ret = [];
-
-        if (buffer.rm) {
-          var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || "");
-
-          if (mrm && mrm.remainder === '') {
-            ret = mhchemParser.go(mrm.match_, 'pu');
-          } else {
-            ret = {
-              type_: 'rm',
-              p1: buffer.rm
-            };
-          }
-        }
-
-        for (var p in buffer) {
-          delete buffer[p];
-        }
-
-        return ret;
-      }
-    }
-  },
-  'pu-9,9': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '0': {
-          action_: 'output-0'
-        },
-        'o': {
-          action_: 'output-o'
-        }
-      },
-      ',': {
-        '0': {
-          action_: ['output-0', 'comma'],
-          nextState: 'o'
-        }
-      },
-      '.': {
-        '0': {
-          action_: ['output-0', 'copy'],
-          nextState: 'o'
-        }
-      },
-      'else': {
-        '*': {
-          action_: 'text='
-        }
-      }
-    }),
-    actions: {
-      'comma': function comma() {
-        return {
-          type_: 'commaDecimal'
-        };
-      },
-      'output-0': function output0(buffer) {
-        /** @type {ParserOutput[]} */
-        var ret = [];
-        buffer.text_ = buffer.text_ || "";
-
-        if (buffer.text_.length > 4) {
-          var a = buffer.text_.length % 3;
-
-          if (a === 0) {
-            a = 3;
-          }
-
-          for (var i = buffer.text_.length - 3; i > 0; i -= 3) {
-            ret.push(buffer.text_.substr(i, 3));
-            ret.push({
-              type_: '1000 separator'
-            });
-          }
-
-          ret.push(buffer.text_.substr(0, a));
-          ret.reverse();
-        } else {
-          ret.push(buffer.text_);
-        }
-
-        for (var p in buffer) {
-          delete buffer[p];
-        }
-
-        return ret;
-      },
-      'output-o': function outputO(buffer) {
-        /** @type {ParserOutput[]} */
-        var ret = [];
-        buffer.text_ = buffer.text_ || "";
-
-        if (buffer.text_.length > 4) {
-          var a = buffer.text_.length - 3;
-
-          for (var i = 0; i < a; i += 3) {
-            ret.push(buffer.text_.substr(i, 3));
-            ret.push({
-              type_: '1000 separator'
-            });
-          }
-
-          ret.push(buffer.text_.substr(i));
-        } else {
-          ret.push(buffer.text_);
-        }
-
-        for (var p in buffer) {
-          delete buffer[p];
-        }
-
-        return ret;
-      }
-    } //#endregion
-
-  }
-}; //
-// texify: Take MhchemParser output and convert it to TeX
-//
-
-/** @type {Texify} */
-
-var texify = {
-  go: function go(input, isInner) {
-    // (recursive, max 4 levels)
-    if (!input) {
-      return "";
-    }
-
-    var res = "";
-    var cee = false;
-
-    for (var i = 0; i < input.length; i++) {
-      var inputi = input[i];
-
-      if (typeof inputi === "string") {
-        res += inputi;
-      } else {
-        res += texify._go2(inputi);
-
-        if (inputi.type_ === '1st-level escape') {
-          cee = true;
-        }
-      }
-    }
-
-    if (!isInner && !cee && res) {
-      res = "{" + res + "}";
-    }
-
-    return res;
-  },
-  _goInner: function _goInner(input) {
-    if (!input) {
-      return input;
-    }
-
-    return texify.go(input, true);
-  },
-  _go2: function _go2(buf) {
-    /** @type {undefined | string} */
-    var res;
-
-    switch (buf.type_) {
-      case 'chemfive':
-        res = "";
-        var b5 = {
-          a: texify._goInner(buf.a),
-          b: texify._goInner(buf.b),
-          p: texify._goInner(buf.p),
-          o: texify._goInner(buf.o),
-          q: texify._goInner(buf.q),
-          d: texify._goInner(buf.d)
-        }; //
-        // a
-        //
-
-        if (b5.a) {
-          if (b5.a.match(/^[+\-]/)) {
-            b5.a = "{" + b5.a + "}";
-          }
-
-          res += b5.a + "\\,";
-        } //
-        // b and p
-        //
-
-
-        if (b5.b || b5.p) {
-          res += "{\\vphantom{X}}";
-          res += "^{\\hphantom{" + (b5.b || "") + "}}_{\\hphantom{" + (b5.p || "") + "}}";
-          res += "{\\vphantom{X}}";
-          res += "^{\\smash[t]{\\vphantom{2}}\\mathllap{" + (b5.b || "") + "}}";
-          res += "_{\\vphantom{2}\\mathllap{\\smash[t]{" + (b5.p || "") + "}}}";
-        } //
-        // o
-        //
-
-
-        if (b5.o) {
-          if (b5.o.match(/^[+\-]/)) {
-            b5.o = "{" + b5.o + "}";
-          }
-
-          res += b5.o;
-        } //
-        // q and d
-        //
-
-
-        if (buf.dType === 'kv') {
-          if (b5.d || b5.q) {
-            res += "{\\vphantom{X}}";
-          }
-
-          if (b5.d) {
-            res += "^{" + b5.d + "}";
-          }
-
-          if (b5.q) {
-            res += "_{\\smash[t]{" + b5.q + "}}";
-          }
-        } else if (buf.dType === 'oxidation') {
-          if (b5.d) {
-            res += "{\\vphantom{X}}";
-            res += "^{" + b5.d + "}";
-          }
-
-          if (b5.q) {
-            res += "{\\vphantom{X}}";
-            res += "_{\\smash[t]{" + b5.q + "}}";
-          }
-        } else {
-          if (b5.q) {
-            res += "{\\vphantom{X}}";
-            res += "_{\\smash[t]{" + b5.q + "}}";
-          }
-
-          if (b5.d) {
-            res += "{\\vphantom{X}}";
-            res += "^{" + b5.d + "}";
-          }
-        }
-
-        break;
-
-      case 'rm':
-        res = "\\mathrm{" + buf.p1 + "}";
-        break;
-
-      case 'text':
-        if (buf.p1.match(/[\^_]/)) {
-          buf.p1 = buf.p1.replace(" ", "~").replace("-", "\\text{-}");
-          res = "\\mathrm{" + buf.p1 + "}";
-        } else {
-          res = "\\text{" + buf.p1 + "}";
-        }
-
-        break;
-
-      case 'roman numeral':
-        res = "\\mathrm{" + buf.p1 + "}";
-        break;
-
-      case 'state of aggregation':
-        res = "\\mskip2mu " + texify._goInner(buf.p1);
-        break;
-
-      case 'state of aggregation subscript':
-        res = "\\mskip1mu " + texify._goInner(buf.p1);
-        break;
-
-      case 'bond':
-        res = texify._getBond(buf.kind_);
-
-        if (!res) {
-          throw ["MhchemErrorBond", "mhchem Error. Unknown bond type (" + buf.kind_ + ")"];
-        }
-
-        break;
-
-      case 'frac':
-        var c = "\\frac{" + buf.p1 + "}{" + buf.p2 + "}";
-        res = "\\mathchoice{\\textstyle" + c + "}{" + c + "}{" + c + "}{" + c + "}";
-        break;
-
-      case 'pu-frac':
-        var d = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}";
-        res = "\\mathchoice{\\textstyle" + d + "}{" + d + "}{" + d + "}{" + d + "}";
-        break;
-
-      case 'tex-math':
-        res = buf.p1 + " ";
-        break;
-
-      case 'frac-ce':
-        res = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}";
-        break;
-
-      case 'overset':
-        res = "\\overset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}";
-        break;
-
-      case 'underset':
-        res = "\\underset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}";
-        break;
-
-      case 'underbrace':
-        res = "\\underbrace{" + texify._goInner(buf.p1) + "}_{" + texify._goInner(buf.p2) + "}";
-        break;
-
-      case 'color':
-        res = "{\\color{" + buf.color1 + "}{" + texify._goInner(buf.color2) + "}}";
-        break;
-
-      case 'color0':
-        res = "\\color{" + buf.color + "}";
-        break;
-
-      case 'arrow':
-        var b6 = {
-          rd: texify._goInner(buf.rd),
-          rq: texify._goInner(buf.rq)
-        };
-
-        var arrow = "\\x" + texify._getArrow(buf.r);
-
-        if (b6.rq) {
-          arrow += "[{" + b6.rq + "}]";
-        }
-
-        if (b6.rd) {
-          arrow += "{" + b6.rd + "}";
-        } else {
-          arrow += "{}";
-        }
-
-        res = arrow;
-        break;
-
-      case 'operator':
-        res = texify._getOperator(buf.kind_);
-        break;
-
-      case '1st-level escape':
-        res = buf.p1 + " "; // &, \\\\, \\hlin
-
-        break;
-
-      case 'space':
-        res = " ";
-        break;
-
-      case 'entitySkip':
-        res = "~";
-        break;
-
-      case 'pu-space-1':
-        res = "~";
-        break;
-
-      case 'pu-space-2':
-        res = "\\mkern3mu ";
-        break;
-
-      case '1000 separator':
-        res = "\\mkern2mu ";
-        break;
-
-      case 'commaDecimal':
-        res = "{,}";
-        break;
-
-      case 'comma enumeration L':
-        res = "{" + buf.p1 + "}\\mkern6mu ";
-        break;
-
-      case 'comma enumeration M':
-        res = "{" + buf.p1 + "}\\mkern3mu ";
-        break;
-
-      case 'comma enumeration S':
-        res = "{" + buf.p1 + "}\\mkern1mu ";
-        break;
-
-      case 'hyphen':
-        res = "\\text{-}";
-        break;
-
-      case 'addition compound':
-        res = "\\,{\\cdot}\\,";
-        break;
-
-      case 'electron dot':
-        res = "\\mkern1mu \\bullet\\mkern1mu ";
-        break;
-
-      case 'KV x':
-        res = "{\\times}";
-        break;
-
-      case 'prime':
-        res = "\\prime ";
-        break;
-
-      case 'cdot':
-        res = "\\cdot ";
-        break;
-
-      case 'tight cdot':
-        res = "\\mkern1mu{\\cdot}\\mkern1mu ";
-        break;
-
-      case 'times':
-        res = "\\times ";
-        break;
-
-      case 'circa':
-        res = "{\\sim}";
-        break;
-
-      case '^':
-        res = "uparrow";
-        break;
-
-      case 'v':
-        res = "downarrow";
-        break;
-
-      case 'ellipsis':
-        res = "\\ldots ";
-        break;
-
-      case '/':
-        res = "/";
-        break;
-
-      case ' / ':
-        res = "\\,/\\,";
-        break;
-
-      default:
-        assertNever(buf);
-        throw ["MhchemBugT", "mhchem bug T. Please report."];
-      // Missing texify rule or unknown MhchemParser output
-    }
-
-    assertString(res);
-    return res;
-  },
-  _getArrow: function _getArrow(a) {
-    switch (a) {
-      case "->":
-        return "rightarrow";
-
-      case "\u2192":
-        return "rightarrow";
-
-      case "\u27F6":
-        return "rightarrow";
-
-      case "<-":
-        return "leftarrow";
-
-      case "<->":
-        return "leftrightarrow";
-
-      case "<-->":
-        return "rightleftarrows";
-
-      case "<=>":
-        return "rightleftharpoons";
-
-      case "\u21CC":
-        return "rightleftharpoons";
-
-      case "<=>>":
-        return "rightequilibrium";
-
-      case "<<=>":
-        return "leftequilibrium";
-
-      default:
-        assertNever(a);
-        throw ["MhchemBugT", "mhchem bug T. Please report."];
-    }
-  },
-  _getBond: function _getBond(a) {
-    switch (a) {
-      case "-":
-        return "{-}";
-
-      case "1":
-        return "{-}";
-
-      case "=":
-        return "{=}";
-
-      case "2":
-        return "{=}";
-
-      case "#":
-        return "{\\equiv}";
-
-      case "3":
-        return "{\\equiv}";
-
-      case "~":
-        return "{\\tripledash}";
-
-      case "~-":
-        return "{\\mathrlap{\\raisebox{-.1em}{$-$}}\\raisebox{.1em}{$\\tripledash$}}";
-
-      case "~=":
-        return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";
-
-      case "~--":
-        return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";
-
-      case "-~-":
-        return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$-$}}\\tripledash}";
-
-      case "...":
-        return "{{\\cdot}{\\cdot}{\\cdot}}";
-
-      case "....":
-        return "{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}";
-
-      case "->":
-        return "{\\rightarrow}";
-
-      case "<-":
-        return "{\\leftarrow}";
-
-      case "<":
-        return "{<}";
-
-      case ">":
-        return "{>}";
-
-      default:
-        assertNever(a);
-        throw ["MhchemBugT", "mhchem bug T. Please report."];
-    }
-  },
-  _getOperator: function _getOperator(a) {
-    switch (a) {
-      case "+":
-        return " {}+{} ";
-
-      case "-":
-        return " {}-{} ";
-
-      case "=":
-        return " {}={} ";
-
-      case "<":
-        return " {}<{} ";
-
-      case ">":
-        return " {}>{} ";
-
-      case "<<":
-        return " {}\\ll{} ";
-
-      case ">>":
-        return " {}\\gg{} ";
-
-      case "\\pm":
-        return " {}\\pm{} ";
-
-      case "\\approx":
-        return " {}\\approx{} ";
-
-      case "$\\approx$":
-        return " {}\\approx{} ";
-
-      case "v":
-        return " \\downarrow{} ";
-
-      case "(v)":
-        return " \\downarrow{} ";
-
-      case "^":
-        return " \\uparrow{} ";
-
-      case "(^)":
-        return " \\uparrow{} ";
-
-      default:
-        assertNever(a);
-        throw ["MhchemBugT", "mhchem bug T. Please report."];
-    }
-  }
-}; //
-// Helpers for code anaylsis
-// Will show type error at calling position
-//
-
-/** @param {number} a */
-
-function assertNever(a) {}
-/** @param {string} a */
-
-
-function assertString(a) {}
-
-/***/ })
-/******/ ])["default"];
-});
\ No newline at end of file
diff --git a/registry/vulkan/katex/contrib/mhchem.min.js b/registry/vulkan/katex/contrib/mhchem.min.js
deleted file mode 100644
index 8fd9cca..0000000
--- a/registry/vulkan/katex/contrib/mhchem.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e(require("katex"));else if("function"==typeof define&&define.amd)define(["katex"],e);else{var n="object"==typeof exports?e(require("katex")):e(t.katex);for(var o in n)("object"==typeof exports?exports:t)[o]=n[o]}}("undefined"!=typeof self?self:this,function(t){return function(t){var e={};function n(o){if(e[o])return e[o].exports;var a=e[o]={i:o,l:!1,exports:{}};return t[o].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return n.m=t,n.c=e,n.d=function(t,e,o){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:o})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)n.d(o,a,function(e){return t[e]}.bind(null,a));return o},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=1)}([function(e,n){e.exports=t},function(t,e,n){"use strict";n.r(e);var o=n(0),a=n.n(o);a.a.__defineMacro("\\ce",function(t){return r(t.consumeArgs(1)[0],"ce")}),a.a.__defineMacro("\\pu",function(t){return r(t.consumeArgs(1)[0],"pu")}),a.a.__defineMacro("\\tripledash","{\\vphantom{-}\\raisebox{2.56mu}{$\\mkern2mu\\tiny\\text{-}\\mkern1mu\\text{-}\\mkern1mu\\text{-}\\mkern2mu$}}");var r=function(t,e){for(var n="",o=t[t.length-1].loc.start,a=t.length-1;a>=0;a--)t[a].loc.start>o&&(n+=" ",o=t[a].loc.start),n+=t[a].text,o+=t[a].text.length;return c.go(i.go(n,e))},i={go:function(t,e){if(!t)return[];void 0===e&&(e="ce");var n,o="0",a={};a.parenthesisLevel=0,t=(t=(t=t.replace(/\n/g," ")).replace(/[\u2212\u2013\u2014\u2010]/g,"-")).replace(/[\u2026]/g,"...");for(var r=10,c=[];;){n!==t?(r=10,n=t):r--;var u=i.stateMachines[e],p=u.transitions[o]||u.transitions["*"];t:for(var s=0;s<p.length;s++){var _=i.patterns.match_(p[s].pattern,t);if(_){for(var d=p[s].task,m=0;m<d.action_.length;m++){var l;if(u.actions[d.action_[m].type_])l=u.actions[d.action_[m].type_](a,_.match_,d.action_[m].option);else{if(!i.actions[d.action_[m].type_])throw["MhchemBugA","mhchem bug A. Please report. ("+d.action_[m].type_+")"];l=i.actions[d.action_[m].type_](a,_.match_,d.action_[m].option)}i.concatArray(c,l)}if(o=d.nextState||o,!(t.length>0))return c;if(d.revisit||(t=_.remainder),!d.toContinue)break t}}if(r<=0)throw["MhchemBugU","mhchem bug U. Please report."]}},concatArray:function(t,e){if(e)if(Array.isArray(e))for(var n=0;n<e.length;n++)t.push(e[n]);else t.push(e)},patterns:{patterns:{empty:/^$/,else:/^./,else2:/^./,space:/^\s/,"space A":/^\s(?=[A-Z\\$])/,space$:/^\s$/,"a-z":/^[a-z]/,x:/^x/,x$:/^x$/,i$:/^i$/,letters:/^(?:[a-zA-Z\u03B1-\u03C9\u0391-\u03A9?@]|(?:\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))))+/,"\\greek":/^\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))/,"one lowercase latin letter $":/^(?:([a-z])(?:$|[^a-zA-Z]))$/,"$one lowercase latin letter$ $":/^\$(?:([a-z])(?:$|[^a-zA-Z]))\$$/,"one lowercase greek letter $":/^(?:\$?[\u03B1-\u03C9]\$?|\$?\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\s*\$?)(?:\s+|\{\}|(?![a-zA-Z]))$/,digits:/^[0-9]+/,"-9.,9":/^[+\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))/,"-9.,9 no missing 0":/^[+\-]?[0-9]+(?:[.,][0-9]+)?/,"(-)(9.,9)(e)(99)":function(t){var e=t.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))?(\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))\))?(?:([eE]|\s*(\*|x|\\times|\u00D7)\s*10\^)([+\-]?[0-9]+|\{[+\-]?[0-9]+\}))?/);return e&&e[0]?{match_:e.splice(1),remainder:t.substr(e[0].length)}:null},"(-)(9)^(-9)":function(t){var e=t.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+)?)\^([+\-]?[0-9]+|\{[+\-]?[0-9]+\})/);return e&&e[0]?{match_:e.splice(1),remainder:t.substr(e[0].length)}:null},"state of aggregation $":function(t){var e=i.patterns.findObserveGroups(t,"",/^\([a-z]{1,3}(?=[\),])/,")","");if(e&&e.remainder.match(/^($|[\s,;\)\]\}])/))return e;var n=t.match(/^(?:\((?:\\ca\s?)?\$[amothc]\$\))/);return n?{match_:n[0],remainder:t.substr(n[0].length)}:null},"_{(state of aggregation)}$":/^_\{(\([a-z]{1,3}\))\}/,"{[(":/^(?:\\\{|\[|\()/,")]}":/^(?:\)|\]|\\\})/,", ":/^[,;]\s*/,",":/^[,;]/,".":/^[.]/,". ":/^([.\u22C5\u00B7\u2022])\s*/,"...":/^\.\.\.(?=$|[^.])/,"* ":/^([*])\s*/,"^{(...)}":function(t){return i.patterns.findObserveGroups(t,"^{","","","}")},"^($...$)":function(t){return i.patterns.findObserveGroups(t,"^","$","$","")},"^a":/^\^([0-9]+|[^\\_])/,"^\\x{}{}":function(t){return i.patterns.findObserveGroups(t,"^",/^\\[a-zA-Z]+\{/,"}","","","{","}","",!0)},"^\\x{}":function(t){return i.patterns.findObserveGroups(t,"^",/^\\[a-zA-Z]+\{/,"}","")},"^\\x":/^\^(\\[a-zA-Z]+)\s*/,"^(-1)":/^\^(-?\d+)/,"'":/^'/,"_{(...)}":function(t){return i.patterns.findObserveGroups(t,"_{","","","}")},"_($...$)":function(t){return i.patterns.findObserveGroups(t,"_","$","$","")},_9:/^_([+\-]?[0-9]+|[^\\])/,"_\\x{}{}":function(t){return i.patterns.findObserveGroups(t,"_",/^\\[a-zA-Z]+\{/,"}","","","{","}","",!0)},"_\\x{}":function(t){return i.patterns.findObserveGroups(t,"_",/^\\[a-zA-Z]+\{/,"}","")},"_\\x":/^_(\\[a-zA-Z]+)\s*/,"^_":/^(?:\^(?=_)|\_(?=\^)|[\^_]$)/,"{}":/^\{\}/,"{...}":function(t){return i.patterns.findObserveGroups(t,"","{","}","")},"{(...)}":function(t){return i.patterns.findObserveGroups(t,"{","","","}")},"$...$":function(t){return i.patterns.findObserveGroups(t,"","$","$","")},"${(...)}$":function(t){return i.patterns.findObserveGroups(t,"${","","","}$")},"$(...)$":function(t){return i.patterns.findObserveGroups(t,"$","","","$")},"=<>":/^[=<>]/,"#":/^[#\u2261]/,"+":/^\+/,"-$":/^-(?=[\s_},;\]\/]|$|\([a-z]+\))/,"-9":/^-(?=[0-9])/,"- orbital overlap":/^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/,"-":/^-/,"pm-operator":/^(?:\\pm|\$\\pm\$|\+-|\+\/-)/,operator:/^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/,arrowUpDown:/^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/,"\\bond{(...)}":function(t){return i.patterns.findObserveGroups(t,"\\bond{","","","}")},"->":/^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/,CMT:/^[CMT](?=\[)/,"[(...)]":function(t){return i.patterns.findObserveGroups(t,"[","","","]")},"1st-level escape":/^(&|\\\\|\\hline)\s*/,"\\,":/^(?:\\[,\ ;:])/,"\\x{}{}":function(t){return i.patterns.findObserveGroups(t,"",/^\\[a-zA-Z]+\{/,"}","","","{","}","",!0)},"\\x{}":function(t){return i.patterns.findObserveGroups(t,"",/^\\[a-zA-Z]+\{/,"}","")},"\\ca":/^\\ca(?:\s+|(?![a-zA-Z]))/,"\\x":/^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/,orbital:/^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,others:/^[\/~|]/,"\\frac{(...)}":function(t){return i.patterns.findObserveGroups(t,"\\frac{","","","}","{","","","}")},"\\overset{(...)}":function(t){return i.patterns.findObserveGroups(t,"\\overset{","","","}","{","","","}")},"\\underset{(...)}":function(t){return i.patterns.findObserveGroups(t,"\\underset{","","","}","{","","","}")},"\\underbrace{(...)}":function(t){return i.patterns.findObserveGroups(t,"\\underbrace{","","","}_","{","","","}")},"\\color{(...)}0":function(t){return i.patterns.findObserveGroups(t,"\\color{","","","}")},"\\color{(...)}{(...)}1":function(t){return i.patterns.findObserveGroups(t,"\\color{","","","}","{","","","}")},"\\color(...){(...)}2":function(t){return i.patterns.findObserveGroups(t,"\\color","\\","",/^(?=\{)/,"{","","","}")},"\\ce{(...)}":function(t){return i.patterns.findObserveGroups(t,"\\ce{","","","}")},oxidation$:/^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"d-oxidation$":/^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"roman numeral":/^[IVX]+/,"1/2$":/^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/,amount:function(t){var e;if(e=t.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/))return{match_:e[0],remainder:t.substr(e[0].length)};var n=i.patterns.findObserveGroups(t,"","$","$","");return n&&(e=n.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/))?{match_:e[0],remainder:t.substr(e[0].length)}:null},amount2:function(t){return this.amount(t)},"(KV letters),":/^(?:[A-Z][a-z]{0,2}|i)(?=,)/,formula$:function(t){if(t.match(/^\([a-z]+\)$/))return null;var e=t.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/);return e?{match_:e[0],remainder:t.substr(e[0].length)}:null},uprightEntities:/^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,"/":/^\s*(\/)\s*/,"//":/^\s*(\/\/)\s*/,"*":/^\s*[*.]\s*/},findObserveGroups:function(t,e,n,o,a,r,i,c,u,p){var s=function(t,e){if("string"==typeof e)return 0!==t.indexOf(e)?null:e;var n=t.match(e);return n?n[0]:null},_=s(t,e);if(null===_)return null;if(t=t.substr(_.length),null===(_=s(t,n)))return null;var d=function(t,e,n){for(var o=0;e<t.length;){var a=t.charAt(e),r=s(t.substr(e),n);if(null!==r&&0===o)return{endMatchBegin:e,endMatchEnd:e+r.length};if("{"===a)o++;else if("}"===a){if(0===o)throw["ExtraCloseMissingOpen","Extra close brace or missing open brace"];o--}e++}return null}(t,_.length,o||a);if(null===d)return null;var m=t.substring(0,o?d.endMatchEnd:d.endMatchBegin);if(r||i){var l=this.findObserveGroups(t.substr(d.endMatchEnd),r,i,c,u);if(null===l)return null;var f=[m,l.match_];return{match_:p?f.join(""):f,remainder:l.remainder}}return{match_:m,remainder:t.substr(d.endMatchEnd)}},match_:function(t,e){var n=i.patterns.patterns[t];if(void 0===n)throw["MhchemBugP","mhchem bug P. Please report. ("+t+")"];if("function"==typeof n)return i.patterns.patterns[t](e);var o=e.match(n);return o?{match_:o[2]?[o[1],o[2]]:o[1]?o[1]:o[0],remainder:e.substr(o[0].length)}:null}},actions:{"a=":function(t,e){t.a=(t.a||"")+e},"b=":function(t,e){t.b=(t.b||"")+e},"p=":function(t,e){t.p=(t.p||"")+e},"o=":function(t,e){t.o=(t.o||"")+e},"q=":function(t,e){t.q=(t.q||"")+e},"d=":function(t,e){t.d=(t.d||"")+e},"rm=":function(t,e){t.rm=(t.rm||"")+e},"text=":function(t,e){t.text_=(t.text_||"")+e},insert:function(t,e,n){return{type_:n}},"insert+p1":function(t,e,n){return{type_:n,p1:e}},"insert+p1+p2":function(t,e,n){return{type_:n,p1:e[0],p2:e[1]}},copy:function(t,e){return e},rm:function(t,e){return{type_:"rm",p1:e||""}},text:function(t,e){return i.go(e,"text")},"{text}":function(t,e){var n=["{"];return i.concatArray(n,i.go(e,"text")),n.push("}"),n},"tex-math":function(t,e){return i.go(e,"tex-math")},"tex-math tight":function(t,e){return i.go(e,"tex-math tight")},bond:function(t,e,n){return{type_:"bond",kind_:n||e}},"color0-output":function(t,e){return{type_:"color0",color:e[0]}},ce:function(t,e){return i.go(e)},"1/2":function(t,e){var n=[];e.match(/^[+\-]/)&&(n.push(e.substr(0,1)),e=e.substr(1));var o=e.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/);return o[1]=o[1].replace(/\$/g,""),n.push({type_:"frac",p1:o[1],p2:o[2]}),o[3]&&(o[3]=o[3].replace(/\$/g,""),n.push({type_:"tex-math",p1:o[3]})),n},"9,9":function(t,e){return i.go(e,"9,9")}},createTransitions:function(t){var e,n,o,a,r={};for(e in t)for(n in t[e])for(o=n.split("|"),t[e][n].stateArray=o,a=0;a<o.length;a++)r[o[a]]=[];for(e in t)for(n in t[e])for(o=t[e][n].stateArray||[],a=0;a<o.length;a++){var i=t[e][n];if(i.action_){i.action_=[].concat(i.action_);for(var c=0;c<i.action_.length;c++)"string"==typeof i.action_[c]&&(i.action_[c]={type_:i.action_[c]})}else i.action_=[];for(var u=e.split("|"),p=0;p<u.length;p++)if("*"===o[a])for(var s in r)r[s].push({pattern:u[p],task:i});else r[o[a]].push({pattern:u[p],task:i})}return r},stateMachines:{}};i.stateMachines={ce:{transitions:i.createTransitions({empty:{"*":{action_:"output"}},else:{"0|1|2":{action_:"beginsWithBond=false",revisit:!0,toContinue:!0}},oxidation$:{0:{action_:"oxidation-output"}},CMT:{r:{action_:"rdt=",nextState:"rt"},rd:{action_:"rqt=",nextState:"rdt"}},arrowUpDown:{"0|1|2|as":{action_:["sb=false","output","operator"],nextState:"1"}},uprightEntities:{"0|1|2":{action_:["o=","output"],nextState:"1"}},orbital:{"0|1|2|3":{action_:"o=",nextState:"o"}},"->":{"0|1|2|3":{action_:"r=",nextState:"r"},"a|as":{action_:["output","r="],nextState:"r"},"*":{action_:["output","r="],nextState:"r"}},"+":{o:{action_:"d= kv",nextState:"d"},"d|D":{action_:"d=",nextState:"d"},q:{action_:"d=",nextState:"qd"},"qd|qD":{action_:"d=",nextState:"qd"},dq:{action_:["output","d="],nextState:"d"},3:{action_:["sb=false","output","operator"],nextState:"0"}},amount:{"0|2":{action_:"a=",nextState:"a"}},"pm-operator":{"0|1|2|a|as":{action_:["sb=false","output",{type_:"operator",option:"\\pm"}],nextState:"0"}},operator:{"0|1|2|a|as":{action_:["sb=false","output","operator"],nextState:"0"}},"-$":{"o|q":{action_:["charge or bond","output"],nextState:"qd"},d:{action_:"d=",nextState:"d"},D:{action_:["output",{type_:"bond",option:"-"}],nextState:"3"},q:{action_:"d=",nextState:"qd"},qd:{action_:"d=",nextState:"qd"},"qD|dq":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},"-9":{"3|o":{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"3"}},"- orbital overlap":{o:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},d:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"}},"-":{"0|1|2":{action_:[{type_:"output",option:1},"beginsWithBond=true",{type_:"bond",option:"-"}],nextState:"3"},3:{action_:{type_:"bond",option:"-"}},a:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},as:{action_:[{type_:"output",option:2},{type_:"bond",option:"-"}],nextState:"3"},b:{action_:"b="},o:{action_:{type_:"- after o/d",option:!1},nextState:"2"},q:{action_:{type_:"- after o/d",option:!1},nextState:"2"},"d|qd|dq":{action_:{type_:"- after o/d",option:!0},nextState:"2"},"D|qD|p":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},amount2:{"1|3":{action_:"a=",nextState:"a"}},letters:{"0|1|2|3|a|as|b|p|bp|o":{action_:"o=",nextState:"o"},"q|dq":{action_:["output","o="],nextState:"o"},"d|D|qd|qD":{action_:"o after d",nextState:"o"}},digits:{o:{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},q:{action_:["output","o="],nextState:"o"},a:{action_:"o=",nextState:"o"}},"space A":{"b|p|bp":{}},space:{a:{nextState:"as"},0:{action_:"sb=false"},"1|2":{action_:"sb=true"},"r|rt|rd|rdt|rdq":{action_:"output",nextState:"0"},"*":{action_:["output","sb=true"],nextState:"1"}},"1st-level escape":{"1|2":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}]},"*":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}],nextState:"0"}},"[(...)]":{"r|rt":{action_:"rd=",nextState:"rd"},"rd|rdt":{action_:"rq=",nextState:"rdq"}},"...":{"o|d|D|dq|qd|qD":{action_:["output",{type_:"bond",option:"..."}],nextState:"3"},"*":{action_:[{type_:"output",option:1},{type_:"insert",option:"ellipsis"}],nextState:"1"}},". |* ":{"*":{action_:["output",{type_:"insert",option:"addition compound"}],nextState:"1"}},"state of aggregation $":{"*":{action_:["output","state of aggregation"],nextState:"1"}},"{[(":{"a|as|o":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"0|1|2|3":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"*":{action_:["output","o=","output","parenthesisLevel++"],nextState:"2"}},")]}":{"0|1|2|3|b|p|bp|o":{action_:["o=","parenthesisLevel--"],nextState:"o"},"a|as|d|D|q|qd|qD|dq":{action_:["output","o=","parenthesisLevel--"],nextState:"o"}},", ":{"*":{action_:["output","comma"],nextState:"0"}},"^_":{"*":{}},"^{(...)}|^($...$)":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"D"},q:{action_:"d=",nextState:"qD"},"d|D|qd|qD|dq":{action_:["output","d="],nextState:"D"}},"^a|^\\x{}{}|^\\x{}|^\\x|'":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"d"},q:{action_:"d=",nextState:"qd"},"d|qd|D|qD":{action_:"d="},dq:{action_:["output","d="],nextState:"d"}},"_{(state of aggregation)}$":{"d|D|q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x":{"0|1|2|as":{action_:"p=",nextState:"p"},b:{action_:"p=",nextState:"bp"},"3|o":{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},"q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"=<>":{"0|1|2|3|a|as|o|q|d|D|qd|qD|dq":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"#":{"0|1|2|3|a|as|o":{action_:[{type_:"output",option:2},{type_:"bond",option:"#"}],nextState:"3"}},"{}":{"*":{action_:{type_:"output",option:1},nextState:"1"}},"{...}":{"0|1|2|3|a|as|b|p|bp":{action_:"o=",nextState:"o"},"o|d|D|q|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"$...$":{a:{action_:"a="},"0|1|2|3|as|b|p|bp|o":{action_:"o=",nextState:"o"},"as|o":{action_:"o="},"q|d|D|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"\\bond{(...)}":{"*":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"\\frac{(...)}":{"*":{action_:[{type_:"output",option:1},"frac-output"],nextState:"3"}},"\\overset{(...)}":{"*":{action_:[{type_:"output",option:2},"overset-output"],nextState:"3"}},"\\underset{(...)}":{"*":{action_:[{type_:"output",option:2},"underset-output"],nextState:"3"}},"\\underbrace{(...)}":{"*":{action_:[{type_:"output",option:2},"underbrace-output"],nextState:"3"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:[{type_:"output",option:2},"color-output"],nextState:"3"}},"\\color{(...)}0":{"*":{action_:[{type_:"output",option:2},"color0-output"]}},"\\ce{(...)}":{"*":{action_:[{type_:"output",option:2},"ce"],nextState:"3"}},"\\,":{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"1"}},"\\x{}{}|\\x{}|\\x":{"0|1|2|3|a|as|b|p|bp|o|c0":{action_:["o=","output"],nextState:"3"},"*":{action_:["output","o=","output"],nextState:"3"}},others:{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"3"}},else2:{a:{action_:"a to o",nextState:"o",revisit:!0},as:{action_:["output","sb=true"],nextState:"1",revisit:!0},"r|rt|rd|rdt|rdq":{action_:["output"],nextState:"0",revisit:!0},"*":{action_:["output","copy"],nextState:"3"}}}),actions:{"o after d":function(t,e){var n;if((t.d||"").match(/^[0-9]+$/)){var o=t.d;t.d=void 0,n=this.output(t),t.b=o}else n=this.output(t);return i.actions["o="](t,e),n},"d= kv":function(t,e){t.d=e,t.dType="kv"},"charge or bond":function(t,e){if(t.beginsWithBond){var n=[];return i.concatArray(n,this.output(t)),i.concatArray(n,i.actions.bond(t,e,"-")),n}t.d=e},"- after o/d":function(t,e,n){var o=i.patterns.match_("orbital",t.o||""),a=i.patterns.match_("one lowercase greek letter $",t.o||""),r=i.patterns.match_("one lowercase latin letter $",t.o||""),c=i.patterns.match_("$one lowercase latin letter$ $",t.o||""),u="-"===e&&(o&&""===o.remainder||a||r||c);!u||t.a||t.b||t.p||t.d||t.q||o||!r||(t.o="$"+t.o+"$");var p=[];return u?(i.concatArray(p,this.output(t)),p.push({type_:"hyphen"})):(o=i.patterns.match_("digits",t.d||""),n&&o&&""===o.remainder?(i.concatArray(p,i.actions["d="](t,e)),i.concatArray(p,this.output(t))):(i.concatArray(p,this.output(t)),i.concatArray(p,i.actions.bond(t,e,"-")))),p},"a to o":function(t){t.o=t.a,t.a=void 0},"sb=true":function(t){t.sb=!0},"sb=false":function(t){t.sb=!1},"beginsWithBond=true":function(t){t.beginsWithBond=!0},"beginsWithBond=false":function(t){t.beginsWithBond=!1},"parenthesisLevel++":function(t){t.parenthesisLevel++},"parenthesisLevel--":function(t){t.parenthesisLevel--},"state of aggregation":function(t,e){return{type_:"state of aggregation",p1:i.go(e,"o")}},comma:function(t,e){var n=e.replace(/\s*$/,"");return n!==e&&0===t.parenthesisLevel?{type_:"comma enumeration L",p1:n}:{type_:"comma enumeration M",p1:n}},output:function(t,e,n){var o,a,r;t.r?(a="M"===t.rdt?i.go(t.rd,"tex-math"):"T"===t.rdt?[{type_:"text",p1:t.rd||""}]:i.go(t.rd),r="M"===t.rqt?i.go(t.rq,"tex-math"):"T"===t.rqt?[{type_:"text",p1:t.rq||""}]:i.go(t.rq),o={type_:"arrow",r:t.r,rd:a,rq:r}):(o=[],(t.a||t.b||t.p||t.o||t.q||t.d||n)&&(t.sb&&o.push({type_:"entitySkip"}),t.o||t.q||t.d||t.b||t.p||2===n?t.o||t.q||t.d||!t.b&&!t.p?t.o&&"kv"===t.dType&&i.patterns.match_("d-oxidation$",t.d||"")?t.dType="oxidation":t.o&&"kv"===t.dType&&!t.q&&(t.dType=void 0):(t.o=t.a,t.d=t.b,t.q=t.p,t.a=t.b=t.p=void 0):(t.o=t.a,t.a=void 0),o.push({type_:"chemfive",a:i.go(t.a,"a"),b:i.go(t.b,"bd"),p:i.go(t.p,"pq"),o:i.go(t.o,"o"),q:i.go(t.q,"pq"),d:i.go(t.d,"oxidation"===t.dType?"oxidation":"bd"),dType:t.dType})));for(var c in t)"parenthesisLevel"!==c&&"beginsWithBond"!==c&&delete t[c];return o},"oxidation-output":function(t,e){var n=["{"];return i.concatArray(n,i.go(e,"oxidation")),n.push("}"),n},"frac-output":function(t,e){return{type_:"frac-ce",p1:i.go(e[0]),p2:i.go(e[1])}},"overset-output":function(t,e){return{type_:"overset",p1:i.go(e[0]),p2:i.go(e[1])}},"underset-output":function(t,e){return{type_:"underset",p1:i.go(e[0]),p2:i.go(e[1])}},"underbrace-output":function(t,e){return{type_:"underbrace",p1:i.go(e[0]),p2:i.go(e[1])}},"color-output":function(t,e){return{type_:"color",color1:e[0],color2:i.go(e[1])}},"r=":function(t,e){t.r=e},"rdt=":function(t,e){t.rdt=e},"rd=":function(t,e){t.rd=e},"rqt=":function(t,e){t.rqt=e},"rq=":function(t,e){t.rq=e},operator:function(t,e,n){return{type_:"operator",kind_:n||e}}}},a:{transitions:i.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},"$(...)$":{"*":{action_:"tex-math tight",nextState:"1"}},",":{"*":{action_:{type_:"insert",option:"commaDecimal"}}},else2:{"*":{action_:"copy"}}}),actions:{}},o:{transitions:i.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},letters:{"*":{action_:"rm"}},"\\ca":{"*":{action_:{type_:"insert",option:"circa"}}},"\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"{text}"}},else2:{"*":{action_:"copy"}}}),actions:{}},text:{transitions:i.createTransitions({empty:{"*":{action_:"output"}},"{...}":{"*":{action_:"text="}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"\\greek":{"*":{action_:["output","rm"]}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:["output","copy"]}},else:{"*":{action_:"text="}}}),actions:{output:function(t){if(t.text_){var e={type_:"text",p1:t.text_};for(var n in t)delete t[n];return e}}}},pq:{transitions:i.createTransitions({empty:{"*":{}},"state of aggregation $":{"*":{action_:"state of aggregation"}},i$:{0:{nextState:"!f",revisit:!0}},"(KV letters),":{0:{action_:"rm",nextState:"0"}},formula$:{0:{nextState:"f",revisit:!0}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"!f",revisit:!0}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"a-z":{f:{action_:"tex-math"}},letters:{"*":{action_:"rm"}},"-9.,9":{"*":{action_:"9,9"}},",":{"*":{action_:{type_:"insert+p1",option:"comma enumeration S"}}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"state of aggregation":function(t,e){return{type_:"state of aggregation subscript",p1:i.go(e,"o")}},"color-output":function(t,e){return{type_:"color",color1:e[0],color2:i.go(e[1],"pq")}}}},bd:{transitions:i.createTransitions({empty:{"*":{}},x$:{0:{nextState:"!f",revisit:!0}},formula$:{0:{nextState:"f",revisit:!0}},else:{0:{nextState:"!f",revisit:!0}},"-9.,9 no missing 0":{"*":{action_:"9,9"}},".":{"*":{action_:{type_:"insert",option:"electron dot"}}},"a-z":{f:{action_:"tex-math"}},x:{"*":{action_:{type_:"insert",option:"KV x"}}},letters:{"*":{action_:"rm"}},"'":{"*":{action_:{type_:"insert",option:"prime"}}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"color-output":function(t,e){return{type_:"color",color1:e[0],color2:i.go(e[1],"bd")}}}},oxidation:{transitions:i.createTransitions({empty:{"*":{}},"roman numeral":{"*":{action_:"roman-numeral"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},else:{"*":{action_:"copy"}}}),actions:{"roman-numeral":function(t,e){return{type_:"roman numeral",p1:e||""}}}},"tex-math":{transitions:i.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},else:{"*":{action_:"o="}}}),actions:{output:function(t){if(t.o){var e={type_:"tex-math",p1:t.o};for(var n in t)delete t[n];return e}}}},"tex-math tight":{transitions:i.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},"-|+":{"*":{action_:"tight operator"}},else:{"*":{action_:"o="}}}),actions:{"tight operator":function(t,e){t.o=(t.o||"")+"{"+e+"}"},output:function(t){if(t.o){var e={type_:"tex-math",p1:t.o};for(var n in t)delete t[n];return e}}}},"9,9":{transitions:i.createTransitions({empty:{"*":{}},",":{"*":{action_:"comma"}},else:{"*":{action_:"copy"}}}),actions:{comma:function(){return{type_:"commaDecimal"}}}},pu:{transitions:i.createTransitions({empty:{"*":{action_:"output"}},space$:{"*":{action_:["output","space"]}},"{[(|)]}":{"0|a":{action_:"copy"}},"(-)(9)^(-9)":{0:{action_:"number^",nextState:"a"}},"(-)(9.,9)(e)(99)":{0:{action_:"enumber",nextState:"a"}},space:{"0|a":{}},"pm-operator":{"0|a":{action_:{type_:"operator",option:"\\pm"},nextState:"0"}},operator:{"0|a":{action_:"copy",nextState:"0"}},"//":{d:{action_:"o=",nextState:"/"}},"/":{d:{action_:"o=",nextState:"/"}},"{...}|else":{"0|d":{action_:"d=",nextState:"d"},a:{action_:["space","d="],nextState:"d"},"/|q":{action_:"q=",nextState:"q"}}}),actions:{enumber:function(t,e){var n=[];return"+-"===e[0]||"+/-"===e[0]?n.push("\\pm "):e[0]&&n.push(e[0]),e[1]&&(i.concatArray(n,i.go(e[1],"pu-9,9")),e[2]&&(e[2].match(/[,.]/)?i.concatArray(n,i.go(e[2],"pu-9,9")):n.push(e[2])),e[3]=e[4]||e[3],e[3]&&(e[3]=e[3].trim(),"e"===e[3]||"*"===e[3].substr(0,1)?n.push({type_:"cdot"}):n.push({type_:"times"}))),e[3]&&n.push("10^{"+e[5]+"}"),n},"number^":function(t,e){var n=[];return"+-"===e[0]||"+/-"===e[0]?n.push("\\pm "):e[0]&&n.push(e[0]),i.concatArray(n,i.go(e[1],"pu-9,9")),n.push("^{"+e[2]+"}"),n},operator:function(t,e,n){return{type_:"operator",kind_:n||e}},space:function(){return{type_:"pu-space-1"}},output:function(t){var e,n=i.patterns.match_("{(...)}",t.d||"");n&&""===n.remainder&&(t.d=n.match_);var o=i.patterns.match_("{(...)}",t.q||"");if(o&&""===o.remainder&&(t.q=o.match_),t.d&&(t.d=t.d.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),t.d=t.d.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F")),t.q){t.q=t.q.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),t.q=t.q.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F");var a={d:i.go(t.d,"pu"),q:i.go(t.q,"pu")};"//"===t.o?e={type_:"pu-frac",p1:a.d,p2:a.q}:(e=a.d,a.d.length>1||a.q.length>1?e.push({type_:" / "}):e.push({type_:"/"}),i.concatArray(e,a.q))}else e=i.go(t.d,"pu-2");for(var r in t)delete t[r];return e}}},"pu-2":{transitions:i.createTransitions({empty:{"*":{action_:"output"}},"*":{"*":{action_:["output","cdot"],nextState:"0"}},"\\x":{"*":{action_:"rm="}},space:{"*":{action_:["output","space"],nextState:"0"}},"^{(...)}|^(-1)":{1:{action_:"^(-1)"}},"-9.,9":{0:{action_:"rm=",nextState:"0"},1:{action_:"^(-1)",nextState:"0"}},"{...}|else":{"*":{action_:"rm=",nextState:"1"}}}),actions:{cdot:function(){return{type_:"tight cdot"}},"^(-1)":function(t,e){t.rm+="^{"+e+"}"},space:function(){return{type_:"pu-space-2"}},output:function(t){var e=[];if(t.rm){var n=i.patterns.match_("{(...)}",t.rm||"");e=n&&""===n.remainder?i.go(n.match_,"pu"):{type_:"rm",p1:t.rm}}for(var o in t)delete t[o];return e}}},"pu-9,9":{transitions:i.createTransitions({empty:{0:{action_:"output-0"},o:{action_:"output-o"}},",":{0:{action_:["output-0","comma"],nextState:"o"}},".":{0:{action_:["output-0","copy"],nextState:"o"}},else:{"*":{action_:"text="}}}),actions:{comma:function(){return{type_:"commaDecimal"}},"output-0":function(t){var e=[];if(t.text_=t.text_||"",t.text_.length>4){var n=t.text_.length%3;0===n&&(n=3);for(var o=t.text_.length-3;o>0;o-=3)e.push(t.text_.substr(o,3)),e.push({type_:"1000 separator"});e.push(t.text_.substr(0,n)),e.reverse()}else e.push(t.text_);for(var a in t)delete t[a];return e},"output-o":function(t){var e=[];if(t.text_=t.text_||"",t.text_.length>4){for(var n=t.text_.length-3,o=0;o<n;o+=3)e.push(t.text_.substr(o,3)),e.push({type_:"1000 separator"});e.push(t.text_.substr(o))}else e.push(t.text_);for(var a in t)delete t[a];return e}}}};var c={go:function(t,e){if(!t)return"";for(var n="",o=!1,a=0;a<t.length;a++){var r=t[a];"string"==typeof r?n+=r:(n+=c._go2(r),"1st-level escape"===r.type_&&(o=!0))}return e||o||!n||(n="{"+n+"}"),n},_goInner:function(t){return t?c.go(t,!0):t},_go2:function(t){var e;switch(t.type_){case"chemfive":e="";var n={a:c._goInner(t.a),b:c._goInner(t.b),p:c._goInner(t.p),o:c._goInner(t.o),q:c._goInner(t.q),d:c._goInner(t.d)};n.a&&(n.a.match(/^[+\-]/)&&(n.a="{"+n.a+"}"),e+=n.a+"\\,"),(n.b||n.p)&&(e+="{\\vphantom{X}}",e+="^{\\hphantom{"+(n.b||"")+"}}_{\\hphantom{"+(n.p||"")+"}}",e+="{\\vphantom{X}}",e+="^{\\smash[t]{\\vphantom{2}}\\mathllap{"+(n.b||"")+"}}",e+="_{\\vphantom{2}\\mathllap{\\smash[t]{"+(n.p||"")+"}}}"),n.o&&(n.o.match(/^[+\-]/)&&(n.o="{"+n.o+"}"),e+=n.o),"kv"===t.dType?((n.d||n.q)&&(e+="{\\vphantom{X}}"),n.d&&(e+="^{"+n.d+"}"),n.q&&(e+="_{\\smash[t]{"+n.q+"}}")):"oxidation"===t.dType?(n.d&&(e+="{\\vphantom{X}}",e+="^{"+n.d+"}"),n.q&&(e+="{\\vphantom{X}}",e+="_{\\smash[t]{"+n.q+"}}")):(n.q&&(e+="{\\vphantom{X}}",e+="_{\\smash[t]{"+n.q+"}}"),n.d&&(e+="{\\vphantom{X}}",e+="^{"+n.d+"}"));break;case"rm":e="\\mathrm{"+t.p1+"}";break;case"text":t.p1.match(/[\^_]/)?(t.p1=t.p1.replace(" ","~").replace("-","\\text{-}"),e="\\mathrm{"+t.p1+"}"):e="\\text{"+t.p1+"}";break;case"roman numeral":e="\\mathrm{"+t.p1+"}";break;case"state of aggregation":e="\\mskip2mu "+c._goInner(t.p1);break;case"state of aggregation subscript":e="\\mskip1mu "+c._goInner(t.p1);break;case"bond":if(!(e=c._getBond(t.kind_)))throw["MhchemErrorBond","mhchem Error. Unknown bond type ("+t.kind_+")"];break;case"frac":var o="\\frac{"+t.p1+"}{"+t.p2+"}";e="\\mathchoice{\\textstyle"+o+"}{"+o+"}{"+o+"}{"+o+"}";break;case"pu-frac":var a="\\frac{"+c._goInner(t.p1)+"}{"+c._goInner(t.p2)+"}";e="\\mathchoice{\\textstyle"+a+"}{"+a+"}{"+a+"}{"+a+"}";break;case"tex-math":e=t.p1+" ";break;case"frac-ce":e="\\frac{"+c._goInner(t.p1)+"}{"+c._goInner(t.p2)+"}";break;case"overset":e="\\overset{"+c._goInner(t.p1)+"}{"+c._goInner(t.p2)+"}";break;case"underset":e="\\underset{"+c._goInner(t.p1)+"}{"+c._goInner(t.p2)+"}";break;case"underbrace":e="\\underbrace{"+c._goInner(t.p1)+"}_{"+c._goInner(t.p2)+"}";break;case"color":e="{\\color{"+t.color1+"}{"+c._goInner(t.color2)+"}}";break;case"color0":e="\\color{"+t.color+"}";break;case"arrow":var r={rd:c._goInner(t.rd),rq:c._goInner(t.rq)},i="\\x"+c._getArrow(t.r);r.rq&&(i+="[{"+r.rq+"}]"),e=i+=r.rd?"{"+r.rd+"}":"{}";break;case"operator":e=c._getOperator(t.kind_);break;case"1st-level escape":e=t.p1+" ";break;case"space":e=" ";break;case"entitySkip":case"pu-space-1":e="~";break;case"pu-space-2":e="\\mkern3mu ";break;case"1000 separator":e="\\mkern2mu ";break;case"commaDecimal":e="{,}";break;case"comma enumeration L":e="{"+t.p1+"}\\mkern6mu ";break;case"comma enumeration M":e="{"+t.p1+"}\\mkern3mu ";break;case"comma enumeration S":e="{"+t.p1+"}\\mkern1mu ";break;case"hyphen":e="\\text{-}";break;case"addition compound":e="\\,{\\cdot}\\,";break;case"electron dot":e="\\mkern1mu \\bullet\\mkern1mu ";break;case"KV x":e="{\\times}";break;case"prime":e="\\prime ";break;case"cdot":e="\\cdot ";break;case"tight cdot":e="\\mkern1mu{\\cdot}\\mkern1mu ";break;case"times":e="\\times ";break;case"circa":e="{\\sim}";break;case"^":e="uparrow";break;case"v":e="downarrow";break;case"ellipsis":e="\\ldots ";break;case"/":e="/";break;case" / ":e="\\,/\\,";break;default:throw["MhchemBugT","mhchem bug T. Please report."]}return e},_getArrow:function(t){switch(t){case"->":case"\u2192":case"\u27f6":return"rightarrow";case"<-":return"leftarrow";case"<->":return"leftrightarrow";case"<--\x3e":return"rightleftarrows";case"<=>":case"\u21cc":return"rightleftharpoons";case"<=>>":return"rightequilibrium";case"<<=>":return"leftequilibrium";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getBond:function(t){switch(t){case"-":case"1":return"{-}";case"=":case"2":return"{=}";case"#":case"3":return"{\\equiv}";case"~":return"{\\tripledash}";case"~-":return"{\\mathrlap{\\raisebox{-.1em}{$-$}}\\raisebox{.1em}{$\\tripledash$}}";case"~=":case"~--":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";case"-~-":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$-$}}\\tripledash}";case"...":return"{{\\cdot}{\\cdot}{\\cdot}}";case"....":return"{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}";case"->":return"{\\rightarrow}";case"<-":return"{\\leftarrow}";case"<":return"{<}";case">":return"{>}";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getOperator:function(t){switch(t){case"+":return" {}+{} ";case"-":return" {}-{} ";case"=":return" {}={} ";case"<":return" {}<{} ";case">":return" {}>{} ";case"<<":return" {}\\ll{} ";case">>":return" {}\\gg{} ";case"\\pm":return" {}\\pm{} ";case"\\approx":case"$\\approx$":return" {}\\approx{} ";case"v":case"(v)":return" \\downarrow{} ";case"^":case"(^)":return" \\uparrow{} ";default:throw["MhchemBugT","mhchem bug T. Please report."]}}}}]).default});
\ No newline at end of file
diff --git a/registry/vulkan/katex/contrib/mhchem.mjs b/registry/vulkan/katex/contrib/mhchem.mjs
deleted file mode 100644
index 46241b5..0000000
--- a/registry/vulkan/katex/contrib/mhchem.mjs
+++ /dev/null
@@ -1,3109 +0,0 @@
-import katex from '../katex.mjs';
-
-/* eslint-disable */
-
-/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
-
-/* vim: set ts=2 et sw=2 tw=80: */
-
-/*************************************************************
- *
- *  KaTeX mhchem.js
- *
- *  This file implements a KaTeX version of mhchem version 3.3.0.
- *  It is adapted from MathJax/extensions/TeX/mhchem.js
- *  It differs from the MathJax version as follows:
- *    1. The interface is changed so that it can be called from KaTeX, not MathJax.
- *    2. \rlap and \llap are replaced with \mathrlap and \mathllap.
- *    3. Four lines of code are edited in order to use \raisebox instead of \raise.
- *    4. The reaction arrow code is simplified. All reaction arrows are rendered
- *       using KaTeX extensible arrows instead of building non-extensible arrows.
- *    5. \tripledash vertical alignment is slightly adjusted.
- *
- *    This code, as other KaTeX code, is released under the MIT license.
- * 
- * /*************************************************************
- *
- *  MathJax/extensions/TeX/mhchem.js
- *
- *  Implements the \ce command for handling chemical formulas
- *  from the mhchem LaTeX package.
- *
- *  ---------------------------------------------------------------------
- *
- *  Copyright (c) 2011-2015 The MathJax Consortium
- *  Copyright (c) 2015-2018 Martin Hensel
- *
- *  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.
- */
-//
-// Coding Style
-//   - use '' for identifiers that can by minified/uglified
-//   - use "" for strings that need to stay untouched
-// version: "3.3.0" for MathJax and KaTeX
-// Add \ce, \pu, and \tripledash to the KaTeX macros.
-katex.__defineMacro("\\ce", function (context) {
-  return chemParse(context.consumeArgs(1)[0], "ce");
-});
-
-katex.__defineMacro("\\pu", function (context) {
-  return chemParse(context.consumeArgs(1)[0], "pu");
-}); //  Needed for \bond for the ~ forms
-//  Raise by 2.56mu, not 2mu. We're raising a hyphen-minus, U+002D, not 
-//  a mathematical minus, U+2212. So we need that extra 0.56.
-
-
-katex.__defineMacro("\\tripledash", "{\\vphantom{-}\\raisebox{2.56mu}{$\\mkern2mu" + "\\tiny\\text{-}\\mkern1mu\\text{-}\\mkern1mu\\text{-}\\mkern2mu$}}");
-//  This is the main function for handing the \ce and \pu commands.
-//  It takes the argument to \ce or \pu and returns the corresponding TeX string.
-//
-
-var chemParse = function chemParse(tokens, stateMachine) {
-  // Recreate the argument string from KaTeX's array of tokens.
-  var str = "";
-  var expectedLoc = tokens[tokens.length - 1].loc.start;
-
-  for (var i = tokens.length - 1; i >= 0; i--) {
-    if (tokens[i].loc.start > expectedLoc) {
-      // context.consumeArgs has eaten a space.
-      str += " ";
-      expectedLoc = tokens[i].loc.start;
-    }
-
-    str += tokens[i].text;
-    expectedLoc += tokens[i].text.length;
-  }
-
-  var tex = texify.go(mhchemParser.go(str, stateMachine));
-  return tex;
-}; //
-// Core parser for mhchem syntax  (recursive)
-//
-
-/** @type {MhchemParser} */
-
-
-var mhchemParser = {
-  //
-  // Parses mchem \ce syntax
-  //
-  // Call like
-  //   go("H2O");
-  //
-  go: function go(input, stateMachine) {
-    if (!input) {
-      return [];
-    }
-
-    if (stateMachine === undefined) {
-      stateMachine = 'ce';
-    }
-
-    var state = '0'; //
-    // String buffers for parsing:
-    //
-    // buffer.a == amount
-    // buffer.o == element
-    // buffer.b == left-side superscript
-    // buffer.p == left-side subscript
-    // buffer.q == right-side subscript
-    // buffer.d == right-side superscript
-    //
-    // buffer.r == arrow
-    // buffer.rdt == arrow, script above, type
-    // buffer.rd == arrow, script above, content
-    // buffer.rqt == arrow, script below, type
-    // buffer.rq == arrow, script below, content
-    //
-    // buffer.text_
-    // buffer.rm
-    // etc.
-    //
-    // buffer.parenthesisLevel == int, starting at 0
-    // buffer.sb == bool, space before
-    // buffer.beginsWithBond == bool
-    //
-    // These letters are also used as state names.
-    //
-    // Other states:
-    // 0 == begin of main part (arrow/operator unlikely)
-    // 1 == next entity
-    // 2 == next entity (arrow/operator unlikely)
-    // 3 == next atom
-    // c == macro
-    //
-
-    /** @type {Buffer} */
-
-    var buffer = {};
-    buffer['parenthesisLevel'] = 0;
-    input = input.replace(/\n/g, " ");
-    input = input.replace(/[\u2212\u2013\u2014\u2010]/g, "-");
-    input = input.replace(/[\u2026]/g, "..."); //
-    // Looks through mhchemParser.transitions, to execute a matching action
-    // (recursive)
-    //
-
-    var lastInput;
-    var watchdog = 10;
-    /** @type {ParserOutput[]} */
-
-    var output = [];
-
-    while (true) {
-      if (lastInput !== input) {
-        watchdog = 10;
-        lastInput = input;
-      } else {
-        watchdog--;
-      } //
-      // Find actions in transition table
-      //
-
-
-      var machine = mhchemParser.stateMachines[stateMachine];
-      var t = machine.transitions[state] || machine.transitions['*'];
-
-      iterateTransitions: for (var i = 0; i < t.length; i++) {
-        var matches = mhchemParser.patterns.match_(t[i].pattern, input);
-
-        if (matches) {
-          //
-          // Execute actions
-          //
-          var task = t[i].task;
-
-          for (var iA = 0; iA < task.action_.length; iA++) {
-            var o; //
-            // Find and execute action
-            //
-
-            if (machine.actions[task.action_[iA].type_]) {
-              o = machine.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);
-            } else if (mhchemParser.actions[task.action_[iA].type_]) {
-              o = mhchemParser.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);
-            } else {
-              throw ["MhchemBugA", "mhchem bug A. Please report. (" + task.action_[iA].type_ + ")"]; // Trying to use non-existing action
-            } //
-            // Add output
-            //
-
-
-            mhchemParser.concatArray(output, o);
-          } //
-          // Set next state,
-          // Shorten input,
-          // Continue with next character
-          //   (= apply only one transition per position)
-          //
-
-
-          state = task.nextState || state;
-
-          if (input.length > 0) {
-            if (!task.revisit) {
-              input = matches.remainder;
-            }
-
-            if (!task.toContinue) {
-              break iterateTransitions;
-            }
-          } else {
-            return output;
-          }
-        }
-      } //
-      // Prevent infinite loop
-      //
-
-
-      if (watchdog <= 0) {
-        throw ["MhchemBugU", "mhchem bug U. Please report."]; // Unexpected character
-      }
-    }
-  },
-  concatArray: function concatArray(a, b) {
-    if (b) {
-      if (Array.isArray(b)) {
-        for (var iB = 0; iB < b.length; iB++) {
-          a.push(b[iB]);
-        }
-      } else {
-        a.push(b);
-      }
-    }
-  },
-  patterns: {
-    //
-    // Matching patterns
-    // either regexps or function that return null or {match_:"a", remainder:"bc"}
-    //
-    patterns: {
-      // property names must not look like integers ("2") for correct property traversal order, later on
-      'empty': /^$/,
-      'else': /^./,
-      'else2': /^./,
-      'space': /^\s/,
-      'space A': /^\s(?=[A-Z\\$])/,
-      'space$': /^\s$/,
-      'a-z': /^[a-z]/,
-      'x': /^x/,
-      'x$': /^x$/,
-      'i$': /^i$/,
-      'letters': /^(?:[a-zA-Z\u03B1-\u03C9\u0391-\u03A9?@]|(?:\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))))+/,
-      '\\greek': /^\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))/,
-      'one lowercase latin letter $': /^(?:([a-z])(?:$|[^a-zA-Z]))$/,
-      '$one lowercase latin letter$ $': /^\$(?:([a-z])(?:$|[^a-zA-Z]))\$$/,
-      'one lowercase greek letter $': /^(?:\$?[\u03B1-\u03C9]\$?|\$?\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\s*\$?)(?:\s+|\{\}|(?![a-zA-Z]))$/,
-      'digits': /^[0-9]+/,
-      '-9.,9': /^[+\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))/,
-      '-9.,9 no missing 0': /^[+\-]?[0-9]+(?:[.,][0-9]+)?/,
-      '(-)(9.,9)(e)(99)': function e99(input) {
-        var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))?(\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))\))?(?:([eE]|\s*(\*|x|\\times|\u00D7)\s*10\^)([+\-]?[0-9]+|\{[+\-]?[0-9]+\}))?/);
-
-        if (m && m[0]) {
-          return {
-            match_: m.splice(1),
-            remainder: input.substr(m[0].length)
-          };
-        }
-
-        return null;
-      },
-      '(-)(9)^(-9)': function _(input) {
-        var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+)?)\^([+\-]?[0-9]+|\{[+\-]?[0-9]+\})/);
-
-        if (m && m[0]) {
-          return {
-            match_: m.splice(1),
-            remainder: input.substr(m[0].length)
-          };
-        }
-
-        return null;
-      },
-      'state of aggregation $': function stateOfAggregation$(input) {
-        // ... or crystal system
-        var a = mhchemParser.patterns.findObserveGroups(input, "", /^\([a-z]{1,3}(?=[\),])/, ")", ""); // (aq), (aq,$\infty$), (aq, sat)
-
-        if (a && a.remainder.match(/^($|[\s,;\)\]\}])/)) {
-          return a;
-        } //  AND end of 'phrase'
-
-
-        var m = input.match(/^(?:\((?:\\ca\s?)?\$[amothc]\$\))/); // OR crystal system ($o$) (\ca$c$)
-
-        if (m) {
-          return {
-            match_: m[0],
-            remainder: input.substr(m[0].length)
-          };
-        }
-
-        return null;
-      },
-      '_{(state of aggregation)}$': /^_\{(\([a-z]{1,3}\))\}/,
-      '{[(': /^(?:\\\{|\[|\()/,
-      ')]}': /^(?:\)|\]|\\\})/,
-      ', ': /^[,;]\s*/,
-      ',': /^[,;]/,
-      '.': /^[.]/,
-      '. ': /^([.\u22C5\u00B7\u2022])\s*/,
-      '...': /^\.\.\.(?=$|[^.])/,
-      '* ': /^([*])\s*/,
-      '^{(...)}': function _(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "^{", "", "", "}");
-      },
-      '^($...$)': function $$(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "^", "$", "$", "");
-      },
-      '^a': /^\^([0-9]+|[^\\_])/,
-      '^\\x{}{}': function x(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true);
-      },
-      '^\\x{}': function x(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", "");
-      },
-      '^\\x': /^\^(\\[a-zA-Z]+)\s*/,
-      '^(-1)': /^\^(-?\d+)/,
-      '\'': /^'/,
-      '_{(...)}': function _(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "_{", "", "", "}");
-      },
-      '_($...$)': function _$$(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "_", "$", "$", "");
-      },
-      '_9': /^_([+\-]?[0-9]+|[^\\])/,
-      '_\\x{}{}': function _X(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true);
-      },
-      '_\\x{}': function _X(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", "");
-      },
-      '_\\x': /^_(\\[a-zA-Z]+)\s*/,
-      '^_': /^(?:\^(?=_)|\_(?=\^)|[\^_]$)/,
-      '{}': /^\{\}/,
-      '{...}': function _(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "", "{", "}", "");
-      },
-      '{(...)}': function _(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "{", "", "", "}");
-      },
-      '$...$': function $$(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "", "$", "$", "");
-      },
-      '${(...)}$': function $$(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "${", "", "", "}$");
-      },
-      '$(...)$': function $$(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "$", "", "", "$");
-      },
-      '=<>': /^[=<>]/,
-      '#': /^[#\u2261]/,
-      '+': /^\+/,
-      '-$': /^-(?=[\s_},;\]/]|$|\([a-z]+\))/,
-      // -space -, -; -] -/ -$ -state-of-aggregation
-      '-9': /^-(?=[0-9])/,
-      '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/,
-      '-': /^-/,
-      'pm-operator': /^(?:\\pm|\$\\pm\$|\+-|\+\/-)/,
-      'operator': /^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/,
-      'arrowUpDown': /^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/,
-      '\\bond{(...)}': function bond(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\bond{", "", "", "}");
-      },
-      '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/,
-      'CMT': /^[CMT](?=\[)/,
-      '[(...)]': function _(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "[", "", "", "]");
-      },
-      '1st-level escape': /^(&|\\\\|\\hline)\s*/,
-      '\\,': /^(?:\\[,\ ;:])/,
-      // \\x - but output no space before
-      '\\x{}{}': function x(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true);
-      },
-      '\\x{}': function x(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "");
-      },
-      '\\ca': /^\\ca(?:\s+|(?![a-zA-Z]))/,
-      '\\x': /^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/,
-      'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,
-      // only those with numbers in front, because the others will be formatted correctly anyway
-      'others': /^[\/~|]/,
-      '\\frac{(...)}': function frac(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\frac{", "", "", "}", "{", "", "", "}");
-      },
-      '\\overset{(...)}': function overset(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\overset{", "", "", "}", "{", "", "", "}");
-      },
-      '\\underset{(...)}': function underset(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\underset{", "", "", "}", "{", "", "", "}");
-      },
-      '\\underbrace{(...)}': function underbrace(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\underbrace{", "", "", "}_", "{", "", "", "}");
-      },
-      '\\color{(...)}0': function color0(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}");
-      },
-      '\\color{(...)}{(...)}1': function color1(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}", "{", "", "", "}");
-      },
-      '\\color(...){(...)}2': function color2(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\color", "\\", "", /^(?=\{)/, "{", "", "", "}");
-      },
-      '\\ce{(...)}': function ce(input) {
-        return mhchemParser.patterns.findObserveGroups(input, "\\ce{", "", "", "}");
-      },
-      'oxidation$': /^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,
-      'd-oxidation$': /^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,
-      // 0 could be oxidation or charge
-      'roman numeral': /^[IVX]+/,
-      '1/2$': /^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/,
-      'amount': function amount(input) {
-        var match; // e.g. 2, 0.5, 1/2, -2, n/2, +;  $a$ could be added later in parsing
-
-        match = input.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/);
-
-        if (match) {
-          return {
-            match_: match[0],
-            remainder: input.substr(match[0].length)
-          };
-        }
-
-        var a = mhchemParser.patterns.findObserveGroups(input, "", "$", "$", "");
-
-        if (a) {
-          // e.g. $2n-1$, $-$
-          match = a.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/);
-
-          if (match) {
-            return {
-              match_: match[0],
-              remainder: input.substr(match[0].length)
-            };
-          }
-        }
-
-        return null;
-      },
-      'amount2': function amount2(input) {
-        return this['amount'](input);
-      },
-      '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/,
-      'formula$': function formula$(input) {
-        if (input.match(/^\([a-z]+\)$/)) {
-          return null;
-        } // state of aggregation = no formula
-
-
-        var match = input.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/);
-
-        if (match) {
-          return {
-            match_: match[0],
-            remainder: input.substr(match[0].length)
-          };
-        }
-
-        return null;
-      },
-      'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,
-      '/': /^\s*(\/)\s*/,
-      '//': /^\s*(\/\/)\s*/,
-      '*': /^\s*[*.]\s*/
-    },
-    findObserveGroups: function findObserveGroups(input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) {
-      /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */
-      var _match = function _match(input, pattern) {
-        if (typeof pattern === "string") {
-          if (input.indexOf(pattern) !== 0) {
-            return null;
-          }
-
-          return pattern;
-        } else {
-          var match = input.match(pattern);
-
-          if (!match) {
-            return null;
-          }
-
-          return match[0];
-        }
-      };
-      /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */
-
-
-      var _findObserveGroups = function _findObserveGroups(input, i, endChars) {
-        var braces = 0;
-
-        while (i < input.length) {
-          var a = input.charAt(i);
-
-          var match = _match(input.substr(i), endChars);
-
-          if (match !== null && braces === 0) {
-            return {
-              endMatchBegin: i,
-              endMatchEnd: i + match.length
-            };
-          } else if (a === "{") {
-            braces++;
-          } else if (a === "}") {
-            if (braces === 0) {
-              throw ["ExtraCloseMissingOpen", "Extra close brace or missing open brace"];
-            } else {
-              braces--;
-            }
-          }
-
-          i++;
-        }
-
-        if (braces > 0) {
-          return null;
-        }
-
-        return null;
-      };
-
-      var match = _match(input, begExcl);
-
-      if (match === null) {
-        return null;
-      }
-
-      input = input.substr(match.length);
-      match = _match(input, begIncl);
-
-      if (match === null) {
-        return null;
-      }
-
-      var e = _findObserveGroups(input, match.length, endIncl || endExcl);
-
-      if (e === null) {
-        return null;
-      }
-
-      var match1 = input.substring(0, endIncl ? e.endMatchEnd : e.endMatchBegin);
-
-      if (!(beg2Excl || beg2Incl)) {
-        return {
-          match_: match1,
-          remainder: input.substr(e.endMatchEnd)
-        };
-      } else {
-        var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl);
-
-        if (group2 === null) {
-          return null;
-        }
-        /** @type {string[]} */
-
-
-        var matchRet = [match1, group2.match_];
-        return {
-          match_: combine ? matchRet.join("") : matchRet,
-          remainder: group2.remainder
-        };
-      }
-    },
-    //
-    // Matching function
-    // e.g. match("a", input) will look for the regexp called "a" and see if it matches
-    // returns null or {match_:"a", remainder:"bc"}
-    //
-    match_: function match_(m, input) {
-      var pattern = mhchemParser.patterns.patterns[m];
-
-      if (pattern === undefined) {
-        throw ["MhchemBugP", "mhchem bug P. Please report. (" + m + ")"]; // Trying to use non-existing pattern
-      } else if (typeof pattern === "function") {
-        return mhchemParser.patterns.patterns[m](input); // cannot use cached var pattern here, because some pattern functions need this===mhchemParser
-      } else {
-        // RegExp
-        var match = input.match(pattern);
-
-        if (match) {
-          var mm;
-
-          if (match[2]) {
-            mm = [match[1], match[2]];
-          } else if (match[1]) {
-            mm = match[1];
-          } else {
-            mm = match[0];
-          }
-
-          return {
-            match_: mm,
-            remainder: input.substr(match[0].length)
-          };
-        }
-
-        return null;
-      }
-    }
-  },
-  //
-  // Generic state machine actions
-  //
-  actions: {
-    'a=': function a(buffer, m) {
-      buffer.a = (buffer.a || "") + m;
-    },
-    'b=': function b(buffer, m) {
-      buffer.b = (buffer.b || "") + m;
-    },
-    'p=': function p(buffer, m) {
-      buffer.p = (buffer.p || "") + m;
-    },
-    'o=': function o(buffer, m) {
-      buffer.o = (buffer.o || "") + m;
-    },
-    'q=': function q(buffer, m) {
-      buffer.q = (buffer.q || "") + m;
-    },
-    'd=': function d(buffer, m) {
-      buffer.d = (buffer.d || "") + m;
-    },
-    'rm=': function rm(buffer, m) {
-      buffer.rm = (buffer.rm || "") + m;
-    },
-    'text=': function text(buffer, m) {
-      buffer.text_ = (buffer.text_ || "") + m;
-    },
-    'insert': function insert(buffer, m, a) {
-      return {
-        type_: a
-      };
-    },
-    'insert+p1': function insertP1(buffer, m, a) {
-      return {
-        type_: a,
-        p1: m
-      };
-    },
-    'insert+p1+p2': function insertP1P2(buffer, m, a) {
-      return {
-        type_: a,
-        p1: m[0],
-        p2: m[1]
-      };
-    },
-    'copy': function copy(buffer, m) {
-      return m;
-    },
-    'rm': function rm(buffer, m) {
-      return {
-        type_: 'rm',
-        p1: m || ""
-      };
-    },
-    'text': function text(buffer, m) {
-      return mhchemParser.go(m, 'text');
-    },
-    '{text}': function text(buffer, m) {
-      var ret = ["{"];
-      mhchemParser.concatArray(ret, mhchemParser.go(m, 'text'));
-      ret.push("}");
-      return ret;
-    },
-    'tex-math': function texMath(buffer, m) {
-      return mhchemParser.go(m, 'tex-math');
-    },
-    'tex-math tight': function texMathTight(buffer, m) {
-      return mhchemParser.go(m, 'tex-math tight');
-    },
-    'bond': function bond(buffer, m, k) {
-      return {
-        type_: 'bond',
-        kind_: k || m
-      };
-    },
-    'color0-output': function color0Output(buffer, m) {
-      return {
-        type_: 'color0',
-        color: m[0]
-      };
-    },
-    'ce': function ce(buffer, m) {
-      return mhchemParser.go(m);
-    },
-    '1/2': function _(buffer, m) {
-      /** @type {ParserOutput[]} */
-      var ret = [];
-
-      if (m.match(/^[+\-]/)) {
-        ret.push(m.substr(0, 1));
-        m = m.substr(1);
-      }
-
-      var n = m.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/);
-      n[1] = n[1].replace(/\$/g, "");
-      ret.push({
-        type_: 'frac',
-        p1: n[1],
-        p2: n[2]
-      });
-
-      if (n[3]) {
-        n[3] = n[3].replace(/\$/g, "");
-        ret.push({
-          type_: 'tex-math',
-          p1: n[3]
-        });
-      }
-
-      return ret;
-    },
-    '9,9': function _(buffer, m) {
-      return mhchemParser.go(m, '9,9');
-    }
-  },
-  //
-  // createTransitions
-  // convert  { 'letter': { 'state': { action_: 'output' } } }  to  { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] }
-  // with expansion of 'a|b' to 'a' and 'b' (at 2 places)
-  //
-  createTransitions: function createTransitions(o) {
-    var pattern, state;
-    /** @type {string[]} */
-
-    var stateArray;
-    var i; //
-    // 1. Collect all states
-    //
-
-    /** @type {Transitions} */
-
-    var transitions = {};
-
-    for (pattern in o) {
-      for (state in o[pattern]) {
-        stateArray = state.split("|");
-        o[pattern][state].stateArray = stateArray;
-
-        for (i = 0; i < stateArray.length; i++) {
-          transitions[stateArray[i]] = [];
-        }
-      }
-    } //
-    // 2. Fill states
-    //
-
-
-    for (pattern in o) {
-      for (state in o[pattern]) {
-        stateArray = o[pattern][state].stateArray || [];
-
-        for (i = 0; i < stateArray.length; i++) {
-          //
-          // 2a. Normalize actions into array:  'text=' ==> [{type_:'text='}]
-          // (Note to myself: Resolving the function here would be problematic. It would need .bind (for *this*) and currying (for *option*).)
-          //
-
-          /** @type {any} */
-          var p = o[pattern][state];
-
-          if (p.action_) {
-            p.action_ = [].concat(p.action_);
-
-            for (var k = 0; k < p.action_.length; k++) {
-              if (typeof p.action_[k] === "string") {
-                p.action_[k] = {
-                  type_: p.action_[k]
-                };
-              }
-            }
-          } else {
-            p.action_ = [];
-          } //
-          // 2.b Multi-insert
-          //
-
-
-          var patternArray = pattern.split("|");
-
-          for (var j = 0; j < patternArray.length; j++) {
-            if (stateArray[i] === '*') {
-              // insert into all
-              for (var t in transitions) {
-                transitions[t].push({
-                  pattern: patternArray[j],
-                  task: p
-                });
-              }
-            } else {
-              transitions[stateArray[i]].push({
-                pattern: patternArray[j],
-                task: p
-              });
-            }
-          }
-        }
-      }
-    }
-
-    return transitions;
-  },
-  stateMachines: {}
-}; //
-// Definition of state machines
-//
-
-mhchemParser.stateMachines = {
-  //
-  // \ce state machines
-  //
-  //#region ce
-  'ce': {
-    // main parser
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {
-          action_: 'output'
-        }
-      },
-      'else': {
-        '0|1|2': {
-          action_: 'beginsWithBond=false',
-          revisit: true,
-          toContinue: true
-        }
-      },
-      'oxidation$': {
-        '0': {
-          action_: 'oxidation-output'
-        }
-      },
-      'CMT': {
-        'r': {
-          action_: 'rdt=',
-          nextState: 'rt'
-        },
-        'rd': {
-          action_: 'rqt=',
-          nextState: 'rdt'
-        }
-      },
-      'arrowUpDown': {
-        '0|1|2|as': {
-          action_: ['sb=false', 'output', 'operator'],
-          nextState: '1'
-        }
-      },
-      'uprightEntities': {
-        '0|1|2': {
-          action_: ['o=', 'output'],
-          nextState: '1'
-        }
-      },
-      'orbital': {
-        '0|1|2|3': {
-          action_: 'o=',
-          nextState: 'o'
-        }
-      },
-      '->': {
-        '0|1|2|3': {
-          action_: 'r=',
-          nextState: 'r'
-        },
-        'a|as': {
-          action_: ['output', 'r='],
-          nextState: 'r'
-        },
-        '*': {
-          action_: ['output', 'r='],
-          nextState: 'r'
-        }
-      },
-      '+': {
-        'o': {
-          action_: 'd= kv',
-          nextState: 'd'
-        },
-        'd|D': {
-          action_: 'd=',
-          nextState: 'd'
-        },
-        'q': {
-          action_: 'd=',
-          nextState: 'qd'
-        },
-        'qd|qD': {
-          action_: 'd=',
-          nextState: 'qd'
-        },
-        'dq': {
-          action_: ['output', 'd='],
-          nextState: 'd'
-        },
-        '3': {
-          action_: ['sb=false', 'output', 'operator'],
-          nextState: '0'
-        }
-      },
-      'amount': {
-        '0|2': {
-          action_: 'a=',
-          nextState: 'a'
-        }
-      },
-      'pm-operator': {
-        '0|1|2|a|as': {
-          action_: ['sb=false', 'output', {
-            type_: 'operator',
-            option: '\\pm'
-          }],
-          nextState: '0'
-        }
-      },
-      'operator': {
-        '0|1|2|a|as': {
-          action_: ['sb=false', 'output', 'operator'],
-          nextState: '0'
-        }
-      },
-      '-$': {
-        'o|q': {
-          action_: ['charge or bond', 'output'],
-          nextState: 'qd'
-        },
-        'd': {
-          action_: 'd=',
-          nextState: 'd'
-        },
-        'D': {
-          action_: ['output', {
-            type_: 'bond',
-            option: "-"
-          }],
-          nextState: '3'
-        },
-        'q': {
-          action_: 'd=',
-          nextState: 'qd'
-        },
-        'qd': {
-          action_: 'd=',
-          nextState: 'qd'
-        },
-        'qD|dq': {
-          action_: ['output', {
-            type_: 'bond',
-            option: "-"
-          }],
-          nextState: '3'
-        }
-      },
-      '-9': {
-        '3|o': {
-          action_: ['output', {
-            type_: 'insert',
-            option: 'hyphen'
-          }],
-          nextState: '3'
-        }
-      },
-      '- orbital overlap': {
-        'o': {
-          action_: ['output', {
-            type_: 'insert',
-            option: 'hyphen'
-          }],
-          nextState: '2'
-        },
-        'd': {
-          action_: ['output', {
-            type_: 'insert',
-            option: 'hyphen'
-          }],
-          nextState: '2'
-        }
-      },
-      '-': {
-        '0|1|2': {
-          action_: [{
-            type_: 'output',
-            option: 1
-          }, 'beginsWithBond=true', {
-            type_: 'bond',
-            option: "-"
-          }],
-          nextState: '3'
-        },
-        '3': {
-          action_: {
-            type_: 'bond',
-            option: "-"
-          }
-        },
-        'a': {
-          action_: ['output', {
-            type_: 'insert',
-            option: 'hyphen'
-          }],
-          nextState: '2'
-        },
-        'as': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, {
-            type_: 'bond',
-            option: "-"
-          }],
-          nextState: '3'
-        },
-        'b': {
-          action_: 'b='
-        },
-        'o': {
-          action_: {
-            type_: '- after o/d',
-            option: false
-          },
-          nextState: '2'
-        },
-        'q': {
-          action_: {
-            type_: '- after o/d',
-            option: false
-          },
-          nextState: '2'
-        },
-        'd|qd|dq': {
-          action_: {
-            type_: '- after o/d',
-            option: true
-          },
-          nextState: '2'
-        },
-        'D|qD|p': {
-          action_: ['output', {
-            type_: 'bond',
-            option: "-"
-          }],
-          nextState: '3'
-        }
-      },
-      'amount2': {
-        '1|3': {
-          action_: 'a=',
-          nextState: 'a'
-        }
-      },
-      'letters': {
-        '0|1|2|3|a|as|b|p|bp|o': {
-          action_: 'o=',
-          nextState: 'o'
-        },
-        'q|dq': {
-          action_: ['output', 'o='],
-          nextState: 'o'
-        },
-        'd|D|qd|qD': {
-          action_: 'o after d',
-          nextState: 'o'
-        }
-      },
-      'digits': {
-        'o': {
-          action_: 'q=',
-          nextState: 'q'
-        },
-        'd|D': {
-          action_: 'q=',
-          nextState: 'dq'
-        },
-        'q': {
-          action_: ['output', 'o='],
-          nextState: 'o'
-        },
-        'a': {
-          action_: 'o=',
-          nextState: 'o'
-        }
-      },
-      'space A': {
-        'b|p|bp': {}
-      },
-      'space': {
-        'a': {
-          nextState: 'as'
-        },
-        '0': {
-          action_: 'sb=false'
-        },
-        '1|2': {
-          action_: 'sb=true'
-        },
-        'r|rt|rd|rdt|rdq': {
-          action_: 'output',
-          nextState: '0'
-        },
-        '*': {
-          action_: ['output', 'sb=true'],
-          nextState: '1'
-        }
-      },
-      '1st-level escape': {
-        '1|2': {
-          action_: ['output', {
-            type_: 'insert+p1',
-            option: '1st-level escape'
-          }]
-        },
-        '*': {
-          action_: ['output', {
-            type_: 'insert+p1',
-            option: '1st-level escape'
-          }],
-          nextState: '0'
-        }
-      },
-      '[(...)]': {
-        'r|rt': {
-          action_: 'rd=',
-          nextState: 'rd'
-        },
-        'rd|rdt': {
-          action_: 'rq=',
-          nextState: 'rdq'
-        }
-      },
-      '...': {
-        'o|d|D|dq|qd|qD': {
-          action_: ['output', {
-            type_: 'bond',
-            option: "..."
-          }],
-          nextState: '3'
-        },
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 1
-          }, {
-            type_: 'insert',
-            option: 'ellipsis'
-          }],
-          nextState: '1'
-        }
-      },
-      '. |* ': {
-        '*': {
-          action_: ['output', {
-            type_: 'insert',
-            option: 'addition compound'
-          }],
-          nextState: '1'
-        }
-      },
-      'state of aggregation $': {
-        '*': {
-          action_: ['output', 'state of aggregation'],
-          nextState: '1'
-        }
-      },
-      '{[(': {
-        'a|as|o': {
-          action_: ['o=', 'output', 'parenthesisLevel++'],
-          nextState: '2'
-        },
-        '0|1|2|3': {
-          action_: ['o=', 'output', 'parenthesisLevel++'],
-          nextState: '2'
-        },
-        '*': {
-          action_: ['output', 'o=', 'output', 'parenthesisLevel++'],
-          nextState: '2'
-        }
-      },
-      ')]}': {
-        '0|1|2|3|b|p|bp|o': {
-          action_: ['o=', 'parenthesisLevel--'],
-          nextState: 'o'
-        },
-        'a|as|d|D|q|qd|qD|dq': {
-          action_: ['output', 'o=', 'parenthesisLevel--'],
-          nextState: 'o'
-        }
-      },
-      ', ': {
-        '*': {
-          action_: ['output', 'comma'],
-          nextState: '0'
-        }
-      },
-      '^_': {
-        // ^ and _ without a sensible argument
-        '*': {}
-      },
-      '^{(...)}|^($...$)': {
-        '0|1|2|as': {
-          action_: 'b=',
-          nextState: 'b'
-        },
-        'p': {
-          action_: 'b=',
-          nextState: 'bp'
-        },
-        '3|o': {
-          action_: 'd= kv',
-          nextState: 'D'
-        },
-        'q': {
-          action_: 'd=',
-          nextState: 'qD'
-        },
-        'd|D|qd|qD|dq': {
-          action_: ['output', 'd='],
-          nextState: 'D'
-        }
-      },
-      '^a|^\\x{}{}|^\\x{}|^\\x|\'': {
-        '0|1|2|as': {
-          action_: 'b=',
-          nextState: 'b'
-        },
-        'p': {
-          action_: 'b=',
-          nextState: 'bp'
-        },
-        '3|o': {
-          action_: 'd= kv',
-          nextState: 'd'
-        },
-        'q': {
-          action_: 'd=',
-          nextState: 'qd'
-        },
-        'd|qd|D|qD': {
-          action_: 'd='
-        },
-        'dq': {
-          action_: ['output', 'd='],
-          nextState: 'd'
-        }
-      },
-      '_{(state of aggregation)}$': {
-        'd|D|q|qd|qD|dq': {
-          action_: ['output', 'q='],
-          nextState: 'q'
-        }
-      },
-      '_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x': {
-        '0|1|2|as': {
-          action_: 'p=',
-          nextState: 'p'
-        },
-        'b': {
-          action_: 'p=',
-          nextState: 'bp'
-        },
-        '3|o': {
-          action_: 'q=',
-          nextState: 'q'
-        },
-        'd|D': {
-          action_: 'q=',
-          nextState: 'dq'
-        },
-        'q|qd|qD|dq': {
-          action_: ['output', 'q='],
-          nextState: 'q'
-        }
-      },
-      '=<>': {
-        '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'bond'],
-          nextState: '3'
-        }
-      },
-      '#': {
-        '0|1|2|3|a|as|o': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, {
-            type_: 'bond',
-            option: "#"
-          }],
-          nextState: '3'
-        }
-      },
-      '{}': {
-        '*': {
-          action_: {
-            type_: 'output',
-            option: 1
-          },
-          nextState: '1'
-        }
-      },
-      '{...}': {
-        '0|1|2|3|a|as|b|p|bp': {
-          action_: 'o=',
-          nextState: 'o'
-        },
-        'o|d|D|q|qd|qD|dq': {
-          action_: ['output', 'o='],
-          nextState: 'o'
-        }
-      },
-      '$...$': {
-        'a': {
-          action_: 'a='
-        },
-        // 2$n$
-        '0|1|2|3|as|b|p|bp|o': {
-          action_: 'o=',
-          nextState: 'o'
-        },
-        // not 'amount'
-        'as|o': {
-          action_: 'o='
-        },
-        'q|d|D|qd|qD|dq': {
-          action_: ['output', 'o='],
-          nextState: 'o'
-        }
-      },
-      '\\bond{(...)}': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'bond'],
-          nextState: "3"
-        }
-      },
-      '\\frac{(...)}': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 1
-          }, 'frac-output'],
-          nextState: '3'
-        }
-      },
-      '\\overset{(...)}': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'overset-output'],
-          nextState: '3'
-        }
-      },
-      '\\underset{(...)}': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'underset-output'],
-          nextState: '3'
-        }
-      },
-      '\\underbrace{(...)}': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'underbrace-output'],
-          nextState: '3'
-        }
-      },
-      '\\color{(...)}{(...)}1|\\color(...){(...)}2': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'color-output'],
-          nextState: '3'
-        }
-      },
-      '\\color{(...)}0': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'color0-output']
-        }
-      },
-      '\\ce{(...)}': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 2
-          }, 'ce'],
-          nextState: '3'
-        }
-      },
-      '\\,': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 1
-          }, 'copy'],
-          nextState: '1'
-        }
-      },
-      '\\x{}{}|\\x{}|\\x': {
-        '0|1|2|3|a|as|b|p|bp|o|c0': {
-          action_: ['o=', 'output'],
-          nextState: '3'
-        },
-        '*': {
-          action_: ['output', 'o=', 'output'],
-          nextState: '3'
-        }
-      },
-      'others': {
-        '*': {
-          action_: [{
-            type_: 'output',
-            option: 1
-          }, 'copy'],
-          nextState: '3'
-        }
-      },
-      'else2': {
-        'a': {
-          action_: 'a to o',
-          nextState: 'o',
-          revisit: true
-        },
-        'as': {
-          action_: ['output', 'sb=true'],
-          nextState: '1',
-          revisit: true
-        },
-        'r|rt|rd|rdt|rdq': {
-          action_: ['output'],
-          nextState: '0',
-          revisit: true
-        },
-        '*': {
-          action_: ['output', 'copy'],
-          nextState: '3'
-        }
-      }
-    }),
-    actions: {
-      'o after d': function oAfterD(buffer, m) {
-        var ret;
-
-        if ((buffer.d || "").match(/^[0-9]+$/)) {
-          var tmp = buffer.d;
-          buffer.d = undefined;
-          ret = this['output'](buffer);
-          buffer.b = tmp;
-        } else {
-          ret = this['output'](buffer);
-        }
-
-        mhchemParser.actions['o='](buffer, m);
-        return ret;
-      },
-      'd= kv': function dKv(buffer, m) {
-        buffer.d = m;
-        buffer.dType = 'kv';
-      },
-      'charge or bond': function chargeOrBond(buffer, m) {
-        if (buffer['beginsWithBond']) {
-          /** @type {ParserOutput[]} */
-          var ret = [];
-          mhchemParser.concatArray(ret, this['output'](buffer));
-          mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-"));
-          return ret;
-        } else {
-          buffer.d = m;
-        }
-      },
-      '- after o/d': function afterOD(buffer, m, isAfterD) {
-        var c1 = mhchemParser.patterns.match_('orbital', buffer.o || "");
-        var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || "");
-        var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || "");
-        var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || "");
-        var hyphenFollows = m === "-" && (c1 && c1.remainder === "" || c2 || c3 || c4);
-
-        if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) {
-          buffer.o = '$' + buffer.o + '$';
-        }
-        /** @type {ParserOutput[]} */
-
-
-        var ret = [];
-
-        if (hyphenFollows) {
-          mhchemParser.concatArray(ret, this['output'](buffer));
-          ret.push({
-            type_: 'hyphen'
-          });
-        } else {
-          c1 = mhchemParser.patterns.match_('digits', buffer.d || "");
-
-          if (isAfterD && c1 && c1.remainder === '') {
-            mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m));
-            mhchemParser.concatArray(ret, this['output'](buffer));
-          } else {
-            mhchemParser.concatArray(ret, this['output'](buffer));
-            mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-"));
-          }
-        }
-
-        return ret;
-      },
-      'a to o': function aToO(buffer) {
-        buffer.o = buffer.a;
-        buffer.a = undefined;
-      },
-      'sb=true': function sbTrue(buffer) {
-        buffer.sb = true;
-      },
-      'sb=false': function sbFalse(buffer) {
-        buffer.sb = false;
-      },
-      'beginsWithBond=true': function beginsWithBondTrue(buffer) {
-        buffer['beginsWithBond'] = true;
-      },
-      'beginsWithBond=false': function beginsWithBondFalse(buffer) {
-        buffer['beginsWithBond'] = false;
-      },
-      'parenthesisLevel++': function parenthesisLevel(buffer) {
-        buffer['parenthesisLevel']++;
-      },
-      'parenthesisLevel--': function parenthesisLevel(buffer) {
-        buffer['parenthesisLevel']--;
-      },
-      'state of aggregation': function stateOfAggregation(buffer, m) {
-        return {
-          type_: 'state of aggregation',
-          p1: mhchemParser.go(m, 'o')
-        };
-      },
-      'comma': function comma(buffer, m) {
-        var a = m.replace(/\s*$/, '');
-        var withSpace = a !== m;
-
-        if (withSpace && buffer['parenthesisLevel'] === 0) {
-          return {
-            type_: 'comma enumeration L',
-            p1: a
-          };
-        } else {
-          return {
-            type_: 'comma enumeration M',
-            p1: a
-          };
-        }
-      },
-      'output': function output(buffer, m, entityFollows) {
-        // entityFollows:
-        //   undefined = if we have nothing else to output, also ignore the just read space (buffer.sb)
-        //   1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1)
-        //   2 = 1 + the entity can have an amount, so output a\, instead of converting it to o (can only apply to states a|as)
-
-        /** @type {ParserOutput | ParserOutput[]} */
-        var ret;
-
-        if (!buffer.r) {
-          ret = [];
-
-          if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) ; else {
-            if (buffer.sb) {
-              ret.push({
-                type_: 'entitySkip'
-              });
-            }
-
-            if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows !== 2) {
-              buffer.o = buffer.a;
-              buffer.a = undefined;
-            } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) {
-              buffer.o = buffer.a;
-              buffer.d = buffer.b;
-              buffer.q = buffer.p;
-              buffer.a = buffer.b = buffer.p = undefined;
-            } else {
-              if (buffer.o && buffer.dType === 'kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || "")) {
-                buffer.dType = 'oxidation';
-              } else if (buffer.o && buffer.dType === 'kv' && !buffer.q) {
-                buffer.dType = undefined;
-              }
-            }
-
-            ret.push({
-              type_: 'chemfive',
-              a: mhchemParser.go(buffer.a, 'a'),
-              b: mhchemParser.go(buffer.b, 'bd'),
-              p: mhchemParser.go(buffer.p, 'pq'),
-              o: mhchemParser.go(buffer.o, 'o'),
-              q: mhchemParser.go(buffer.q, 'pq'),
-              d: mhchemParser.go(buffer.d, buffer.dType === 'oxidation' ? 'oxidation' : 'bd'),
-              dType: buffer.dType
-            });
-          }
-        } else {
-          // r
-
-          /** @type {ParserOutput[]} */
-          var rd;
-
-          if (buffer.rdt === 'M') {
-            rd = mhchemParser.go(buffer.rd, 'tex-math');
-          } else if (buffer.rdt === 'T') {
-            rd = [{
-              type_: 'text',
-              p1: buffer.rd || ""
-            }];
-          } else {
-            rd = mhchemParser.go(buffer.rd);
-          }
-          /** @type {ParserOutput[]} */
-
-
-          var rq;
-
-          if (buffer.rqt === 'M') {
-            rq = mhchemParser.go(buffer.rq, 'tex-math');
-          } else if (buffer.rqt === 'T') {
-            rq = [{
-              type_: 'text',
-              p1: buffer.rq || ""
-            }];
-          } else {
-            rq = mhchemParser.go(buffer.rq);
-          }
-
-          ret = {
-            type_: 'arrow',
-            r: buffer.r,
-            rd: rd,
-            rq: rq
-          };
-        }
-
-        for (var p in buffer) {
-          if (p !== 'parenthesisLevel' && p !== 'beginsWithBond') {
-            delete buffer[p];
-          }
-        }
-
-        return ret;
-      },
-      'oxidation-output': function oxidationOutput(buffer, m) {
-        var ret = ["{"];
-        mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation'));
-        ret.push("}");
-        return ret;
-      },
-      'frac-output': function fracOutput(buffer, m) {
-        return {
-          type_: 'frac-ce',
-          p1: mhchemParser.go(m[0]),
-          p2: mhchemParser.go(m[1])
-        };
-      },
-      'overset-output': function oversetOutput(buffer, m) {
-        return {
-          type_: 'overset',
-          p1: mhchemParser.go(m[0]),
-          p2: mhchemParser.go(m[1])
-        };
-      },
-      'underset-output': function undersetOutput(buffer, m) {
-        return {
-          type_: 'underset',
-          p1: mhchemParser.go(m[0]),
-          p2: mhchemParser.go(m[1])
-        };
-      },
-      'underbrace-output': function underbraceOutput(buffer, m) {
-        return {
-          type_: 'underbrace',
-          p1: mhchemParser.go(m[0]),
-          p2: mhchemParser.go(m[1])
-        };
-      },
-      'color-output': function colorOutput(buffer, m) {
-        return {
-          type_: 'color',
-          color1: m[0],
-          color2: mhchemParser.go(m[1])
-        };
-      },
-      'r=': function r(buffer, m) {
-        buffer.r = m;
-      },
-      'rdt=': function rdt(buffer, m) {
-        buffer.rdt = m;
-      },
-      'rd=': function rd(buffer, m) {
-        buffer.rd = m;
-      },
-      'rqt=': function rqt(buffer, m) {
-        buffer.rqt = m;
-      },
-      'rq=': function rq(buffer, m) {
-        buffer.rq = m;
-      },
-      'operator': function operator(buffer, m, p1) {
-        return {
-          type_: 'operator',
-          kind_: p1 || m
-        };
-      }
-    }
-  },
-  'a': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {}
-      },
-      '1/2$': {
-        '0': {
-          action_: '1/2'
-        }
-      },
-      'else': {
-        '0': {
-          nextState: '1',
-          revisit: true
-        }
-      },
-      '$(...)$': {
-        '*': {
-          action_: 'tex-math tight',
-          nextState: '1'
-        }
-      },
-      ',': {
-        '*': {
-          action_: {
-            type_: 'insert',
-            option: 'commaDecimal'
-          }
-        }
-      },
-      'else2': {
-        '*': {
-          action_: 'copy'
-        }
-      }
-    }),
-    actions: {}
-  },
-  'o': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {}
-      },
-      '1/2$': {
-        '0': {
-          action_: '1/2'
-        }
-      },
-      'else': {
-        '0': {
-          nextState: '1',
-          revisit: true
-        }
-      },
-      'letters': {
-        '*': {
-          action_: 'rm'
-        }
-      },
-      '\\ca': {
-        '*': {
-          action_: {
-            type_: 'insert',
-            option: 'circa'
-          }
-        }
-      },
-      '\\x{}{}|\\x{}|\\x': {
-        '*': {
-          action_: 'copy'
-        }
-      },
-      '${(...)}$|$(...)$': {
-        '*': {
-          action_: 'tex-math'
-        }
-      },
-      '{(...)}': {
-        '*': {
-          action_: '{text}'
-        }
-      },
-      'else2': {
-        '*': {
-          action_: 'copy'
-        }
-      }
-    }),
-    actions: {}
-  },
-  'text': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {
-          action_: 'output'
-        }
-      },
-      '{...}': {
-        '*': {
-          action_: 'text='
-        }
-      },
-      '${(...)}$|$(...)$': {
-        '*': {
-          action_: 'tex-math'
-        }
-      },
-      '\\greek': {
-        '*': {
-          action_: ['output', 'rm']
-        }
-      },
-      '\\,|\\x{}{}|\\x{}|\\x': {
-        '*': {
-          action_: ['output', 'copy']
-        }
-      },
-      'else': {
-        '*': {
-          action_: 'text='
-        }
-      }
-    }),
-    actions: {
-      'output': function output(buffer) {
-        if (buffer.text_) {
-          /** @type {ParserOutput} */
-          var ret = {
-            type_: 'text',
-            p1: buffer.text_
-          };
-
-          for (var p in buffer) {
-            delete buffer[p];
-          }
-
-          return ret;
-        }
-      }
-    }
-  },
-  'pq': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {}
-      },
-      'state of aggregation $': {
-        '*': {
-          action_: 'state of aggregation'
-        }
-      },
-      'i$': {
-        '0': {
-          nextState: '!f',
-          revisit: true
-        }
-      },
-      '(KV letters),': {
-        '0': {
-          action_: 'rm',
-          nextState: '0'
-        }
-      },
-      'formula$': {
-        '0': {
-          nextState: 'f',
-          revisit: true
-        }
-      },
-      '1/2$': {
-        '0': {
-          action_: '1/2'
-        }
-      },
-      'else': {
-        '0': {
-          nextState: '!f',
-          revisit: true
-        }
-      },
-      '${(...)}$|$(...)$': {
-        '*': {
-          action_: 'tex-math'
-        }
-      },
-      '{(...)}': {
-        '*': {
-          action_: 'text'
-        }
-      },
-      'a-z': {
-        'f': {
-          action_: 'tex-math'
-        }
-      },
-      'letters': {
-        '*': {
-          action_: 'rm'
-        }
-      },
-      '-9.,9': {
-        '*': {
-          action_: '9,9'
-        }
-      },
-      ',': {
-        '*': {
-          action_: {
-            type_: 'insert+p1',
-            option: 'comma enumeration S'
-          }
-        }
-      },
-      '\\color{(...)}{(...)}1|\\color(...){(...)}2': {
-        '*': {
-          action_: 'color-output'
-        }
-      },
-      '\\color{(...)}0': {
-        '*': {
-          action_: 'color0-output'
-        }
-      },
-      '\\ce{(...)}': {
-        '*': {
-          action_: 'ce'
-        }
-      },
-      '\\,|\\x{}{}|\\x{}|\\x': {
-        '*': {
-          action_: 'copy'
-        }
-      },
-      'else2': {
-        '*': {
-          action_: 'copy'
-        }
-      }
-    }),
-    actions: {
-      'state of aggregation': function stateOfAggregation(buffer, m) {
-        return {
-          type_: 'state of aggregation subscript',
-          p1: mhchemParser.go(m, 'o')
-        };
-      },
-      'color-output': function colorOutput(buffer, m) {
-        return {
-          type_: 'color',
-          color1: m[0],
-          color2: mhchemParser.go(m[1], 'pq')
-        };
-      }
-    }
-  },
-  'bd': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {}
-      },
-      'x$': {
-        '0': {
-          nextState: '!f',
-          revisit: true
-        }
-      },
-      'formula$': {
-        '0': {
-          nextState: 'f',
-          revisit: true
-        }
-      },
-      'else': {
-        '0': {
-          nextState: '!f',
-          revisit: true
-        }
-      },
-      '-9.,9 no missing 0': {
-        '*': {
-          action_: '9,9'
-        }
-      },
-      '.': {
-        '*': {
-          action_: {
-            type_: 'insert',
-            option: 'electron dot'
-          }
-        }
-      },
-      'a-z': {
-        'f': {
-          action_: 'tex-math'
-        }
-      },
-      'x': {
-        '*': {
-          action_: {
-            type_: 'insert',
-            option: 'KV x'
-          }
-        }
-      },
-      'letters': {
-        '*': {
-          action_: 'rm'
-        }
-      },
-      '\'': {
-        '*': {
-          action_: {
-            type_: 'insert',
-            option: 'prime'
-          }
-        }
-      },
-      '${(...)}$|$(...)$': {
-        '*': {
-          action_: 'tex-math'
-        }
-      },
-      '{(...)}': {
-        '*': {
-          action_: 'text'
-        }
-      },
-      '\\color{(...)}{(...)}1|\\color(...){(...)}2': {
-        '*': {
-          action_: 'color-output'
-        }
-      },
-      '\\color{(...)}0': {
-        '*': {
-          action_: 'color0-output'
-        }
-      },
-      '\\ce{(...)}': {
-        '*': {
-          action_: 'ce'
-        }
-      },
-      '\\,|\\x{}{}|\\x{}|\\x': {
-        '*': {
-          action_: 'copy'
-        }
-      },
-      'else2': {
-        '*': {
-          action_: 'copy'
-        }
-      }
-    }),
-    actions: {
-      'color-output': function colorOutput(buffer, m) {
-        return {
-          type_: 'color',
-          color1: m[0],
-          color2: mhchemParser.go(m[1], 'bd')
-        };
-      }
-    }
-  },
-  'oxidation': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {}
-      },
-      'roman numeral': {
-        '*': {
-          action_: 'roman-numeral'
-        }
-      },
-      '${(...)}$|$(...)$': {
-        '*': {
-          action_: 'tex-math'
-        }
-      },
-      'else': {
-        '*': {
-          action_: 'copy'
-        }
-      }
-    }),
-    actions: {
-      'roman-numeral': function romanNumeral(buffer, m) {
-        return {
-          type_: 'roman numeral',
-          p1: m || ""
-        };
-      }
-    }
-  },
-  'tex-math': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {
-          action_: 'output'
-        }
-      },
-      '\\ce{(...)}': {
-        '*': {
-          action_: ['output', 'ce']
-        }
-      },
-      '{...}|\\,|\\x{}{}|\\x{}|\\x': {
-        '*': {
-          action_: 'o='
-        }
-      },
-      'else': {
-        '*': {
-          action_: 'o='
-        }
-      }
-    }),
-    actions: {
-      'output': function output(buffer) {
-        if (buffer.o) {
-          /** @type {ParserOutput} */
-          var ret = {
-            type_: 'tex-math',
-            p1: buffer.o
-          };
-
-          for (var p in buffer) {
-            delete buffer[p];
-          }
-
-          return ret;
-        }
-      }
-    }
-  },
-  'tex-math tight': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {
-          action_: 'output'
-        }
-      },
-      '\\ce{(...)}': {
-        '*': {
-          action_: ['output', 'ce']
-        }
-      },
-      '{...}|\\,|\\x{}{}|\\x{}|\\x': {
-        '*': {
-          action_: 'o='
-        }
-      },
-      '-|+': {
-        '*': {
-          action_: 'tight operator'
-        }
-      },
-      'else': {
-        '*': {
-          action_: 'o='
-        }
-      }
-    }),
-    actions: {
-      'tight operator': function tightOperator(buffer, m) {
-        buffer.o = (buffer.o || "") + "{" + m + "}";
-      },
-      'output': function output(buffer) {
-        if (buffer.o) {
-          /** @type {ParserOutput} */
-          var ret = {
-            type_: 'tex-math',
-            p1: buffer.o
-          };
-
-          for (var p in buffer) {
-            delete buffer[p];
-          }
-
-          return ret;
-        }
-      }
-    }
-  },
-  '9,9': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {}
-      },
-      ',': {
-        '*': {
-          action_: 'comma'
-        }
-      },
-      'else': {
-        '*': {
-          action_: 'copy'
-        }
-      }
-    }),
-    actions: {
-      'comma': function comma() {
-        return {
-          type_: 'commaDecimal'
-        };
-      }
-    }
-  },
-  //#endregion
-  //
-  // \pu state machines
-  //
-  //#region pu
-  'pu': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {
-          action_: 'output'
-        }
-      },
-      'space$': {
-        '*': {
-          action_: ['output', 'space']
-        }
-      },
-      '{[(|)]}': {
-        '0|a': {
-          action_: 'copy'
-        }
-      },
-      '(-)(9)^(-9)': {
-        '0': {
-          action_: 'number^',
-          nextState: 'a'
-        }
-      },
-      '(-)(9.,9)(e)(99)': {
-        '0': {
-          action_: 'enumber',
-          nextState: 'a'
-        }
-      },
-      'space': {
-        '0|a': {}
-      },
-      'pm-operator': {
-        '0|a': {
-          action_: {
-            type_: 'operator',
-            option: '\\pm'
-          },
-          nextState: '0'
-        }
-      },
-      'operator': {
-        '0|a': {
-          action_: 'copy',
-          nextState: '0'
-        }
-      },
-      '//': {
-        'd': {
-          action_: 'o=',
-          nextState: '/'
-        }
-      },
-      '/': {
-        'd': {
-          action_: 'o=',
-          nextState: '/'
-        }
-      },
-      '{...}|else': {
-        '0|d': {
-          action_: 'd=',
-          nextState: 'd'
-        },
-        'a': {
-          action_: ['space', 'd='],
-          nextState: 'd'
-        },
-        '/|q': {
-          action_: 'q=',
-          nextState: 'q'
-        }
-      }
-    }),
-    actions: {
-      'enumber': function enumber(buffer, m) {
-        /** @type {ParserOutput[]} */
-        var ret = [];
-
-        if (m[0] === "+-" || m[0] === "+/-") {
-          ret.push("\\pm ");
-        } else if (m[0]) {
-          ret.push(m[0]);
-        }
-
-        if (m[1]) {
-          mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));
-
-          if (m[2]) {
-            if (m[2].match(/[,.]/)) {
-              mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9'));
-            } else {
-              ret.push(m[2]);
-            }
-          }
-
-          m[3] = m[4] || m[3];
-
-          if (m[3]) {
-            m[3] = m[3].trim();
-
-            if (m[3] === "e" || m[3].substr(0, 1) === "*") {
-              ret.push({
-                type_: 'cdot'
-              });
-            } else {
-              ret.push({
-                type_: 'times'
-              });
-            }
-          }
-        }
-
-        if (m[3]) {
-          ret.push("10^{" + m[5] + "}");
-        }
-
-        return ret;
-      },
-      'number^': function number(buffer, m) {
-        /** @type {ParserOutput[]} */
-        var ret = [];
-
-        if (m[0] === "+-" || m[0] === "+/-") {
-          ret.push("\\pm ");
-        } else if (m[0]) {
-          ret.push(m[0]);
-        }
-
-        mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));
-        ret.push("^{" + m[2] + "}");
-        return ret;
-      },
-      'operator': function operator(buffer, m, p1) {
-        return {
-          type_: 'operator',
-          kind_: p1 || m
-        };
-      },
-      'space': function space() {
-        return {
-          type_: 'pu-space-1'
-        };
-      },
-      'output': function output(buffer) {
-        /** @type {ParserOutput | ParserOutput[]} */
-        var ret;
-        var md = mhchemParser.patterns.match_('{(...)}', buffer.d || "");
-
-        if (md && md.remainder === '') {
-          buffer.d = md.match_;
-        }
-
-        var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || "");
-
-        if (mq && mq.remainder === '') {
-          buffer.q = mq.match_;
-        }
-
-        if (buffer.d) {
-          buffer.d = buffer.d.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C");
-          buffer.d = buffer.d.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F");
-        }
-
-        if (buffer.q) {
-          // fraction
-          buffer.q = buffer.q.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C");
-          buffer.q = buffer.q.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F");
-          var b5 = {
-            d: mhchemParser.go(buffer.d, 'pu'),
-            q: mhchemParser.go(buffer.q, 'pu')
-          };
-
-          if (buffer.o === '//') {
-            ret = {
-              type_: 'pu-frac',
-              p1: b5.d,
-              p2: b5.q
-            };
-          } else {
-            ret = b5.d;
-
-            if (b5.d.length > 1 || b5.q.length > 1) {
-              ret.push({
-                type_: ' / '
-              });
-            } else {
-              ret.push({
-                type_: '/'
-              });
-            }
-
-            mhchemParser.concatArray(ret, b5.q);
-          }
-        } else {
-          // no fraction
-          ret = mhchemParser.go(buffer.d, 'pu-2');
-        }
-
-        for (var p in buffer) {
-          delete buffer[p];
-        }
-
-        return ret;
-      }
-    }
-  },
-  'pu-2': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '*': {
-          action_: 'output'
-        }
-      },
-      '*': {
-        '*': {
-          action_: ['output', 'cdot'],
-          nextState: '0'
-        }
-      },
-      '\\x': {
-        '*': {
-          action_: 'rm='
-        }
-      },
-      'space': {
-        '*': {
-          action_: ['output', 'space'],
-          nextState: '0'
-        }
-      },
-      '^{(...)}|^(-1)': {
-        '1': {
-          action_: '^(-1)'
-        }
-      },
-      '-9.,9': {
-        '0': {
-          action_: 'rm=',
-          nextState: '0'
-        },
-        '1': {
-          action_: '^(-1)',
-          nextState: '0'
-        }
-      },
-      '{...}|else': {
-        '*': {
-          action_: 'rm=',
-          nextState: '1'
-        }
-      }
-    }),
-    actions: {
-      'cdot': function cdot() {
-        return {
-          type_: 'tight cdot'
-        };
-      },
-      '^(-1)': function _(buffer, m) {
-        buffer.rm += "^{" + m + "}";
-      },
-      'space': function space() {
-        return {
-          type_: 'pu-space-2'
-        };
-      },
-      'output': function output(buffer) {
-        /** @type {ParserOutput | ParserOutput[]} */
-        var ret = [];
-
-        if (buffer.rm) {
-          var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || "");
-
-          if (mrm && mrm.remainder === '') {
-            ret = mhchemParser.go(mrm.match_, 'pu');
-          } else {
-            ret = {
-              type_: 'rm',
-              p1: buffer.rm
-            };
-          }
-        }
-
-        for (var p in buffer) {
-          delete buffer[p];
-        }
-
-        return ret;
-      }
-    }
-  },
-  'pu-9,9': {
-    transitions: mhchemParser.createTransitions({
-      'empty': {
-        '0': {
-          action_: 'output-0'
-        },
-        'o': {
-          action_: 'output-o'
-        }
-      },
-      ',': {
-        '0': {
-          action_: ['output-0', 'comma'],
-          nextState: 'o'
-        }
-      },
-      '.': {
-        '0': {
-          action_: ['output-0', 'copy'],
-          nextState: 'o'
-        }
-      },
-      'else': {
-        '*': {
-          action_: 'text='
-        }
-      }
-    }),
-    actions: {
-      'comma': function comma() {
-        return {
-          type_: 'commaDecimal'
-        };
-      },
-      'output-0': function output0(buffer) {
-        /** @type {ParserOutput[]} */
-        var ret = [];
-        buffer.text_ = buffer.text_ || "";
-
-        if (buffer.text_.length > 4) {
-          var a = buffer.text_.length % 3;
-
-          if (a === 0) {
-            a = 3;
-          }
-
-          for (var i = buffer.text_.length - 3; i > 0; i -= 3) {
-            ret.push(buffer.text_.substr(i, 3));
-            ret.push({
-              type_: '1000 separator'
-            });
-          }
-
-          ret.push(buffer.text_.substr(0, a));
-          ret.reverse();
-        } else {
-          ret.push(buffer.text_);
-        }
-
-        for (var p in buffer) {
-          delete buffer[p];
-        }
-
-        return ret;
-      },
-      'output-o': function outputO(buffer) {
-        /** @type {ParserOutput[]} */
-        var ret = [];
-        buffer.text_ = buffer.text_ || "";
-
-        if (buffer.text_.length > 4) {
-          var a = buffer.text_.length - 3;
-
-          for (var i = 0; i < a; i += 3) {
-            ret.push(buffer.text_.substr(i, 3));
-            ret.push({
-              type_: '1000 separator'
-            });
-          }
-
-          ret.push(buffer.text_.substr(i));
-        } else {
-          ret.push(buffer.text_);
-        }
-
-        for (var p in buffer) {
-          delete buffer[p];
-        }
-
-        return ret;
-      }
-    } //#endregion
-
-  }
-}; //
-// texify: Take MhchemParser output and convert it to TeX
-//
-
-/** @type {Texify} */
-
-var texify = {
-  go: function go(input, isInner) {
-    // (recursive, max 4 levels)
-    if (!input) {
-      return "";
-    }
-
-    var res = "";
-    var cee = false;
-
-    for (var i = 0; i < input.length; i++) {
-      var inputi = input[i];
-
-      if (typeof inputi === "string") {
-        res += inputi;
-      } else {
-        res += texify._go2(inputi);
-
-        if (inputi.type_ === '1st-level escape') {
-          cee = true;
-        }
-      }
-    }
-
-    if (!isInner && !cee && res) {
-      res = "{" + res + "}";
-    }
-
-    return res;
-  },
-  _goInner: function _goInner(input) {
-    if (!input) {
-      return input;
-    }
-
-    return texify.go(input, true);
-  },
-  _go2: function _go2(buf) {
-    /** @type {undefined | string} */
-    var res;
-
-    switch (buf.type_) {
-      case 'chemfive':
-        res = "";
-        var b5 = {
-          a: texify._goInner(buf.a),
-          b: texify._goInner(buf.b),
-          p: texify._goInner(buf.p),
-          o: texify._goInner(buf.o),
-          q: texify._goInner(buf.q),
-          d: texify._goInner(buf.d)
-        }; //
-        // a
-        //
-
-        if (b5.a) {
-          if (b5.a.match(/^[+\-]/)) {
-            b5.a = "{" + b5.a + "}";
-          }
-
-          res += b5.a + "\\,";
-        } //
-        // b and p
-        //
-
-
-        if (b5.b || b5.p) {
-          res += "{\\vphantom{X}}";
-          res += "^{\\hphantom{" + (b5.b || "") + "}}_{\\hphantom{" + (b5.p || "") + "}}";
-          res += "{\\vphantom{X}}";
-          res += "^{\\smash[t]{\\vphantom{2}}\\mathllap{" + (b5.b || "") + "}}";
-          res += "_{\\vphantom{2}\\mathllap{\\smash[t]{" + (b5.p || "") + "}}}";
-        } //
-        // o
-        //
-
-
-        if (b5.o) {
-          if (b5.o.match(/^[+\-]/)) {
-            b5.o = "{" + b5.o + "}";
-          }
-
-          res += b5.o;
-        } //
-        // q and d
-        //
-
-
-        if (buf.dType === 'kv') {
-          if (b5.d || b5.q) {
-            res += "{\\vphantom{X}}";
-          }
-
-          if (b5.d) {
-            res += "^{" + b5.d + "}";
-          }
-
-          if (b5.q) {
-            res += "_{\\smash[t]{" + b5.q + "}}";
-          }
-        } else if (buf.dType === 'oxidation') {
-          if (b5.d) {
-            res += "{\\vphantom{X}}";
-            res += "^{" + b5.d + "}";
-          }
-
-          if (b5.q) {
-            res += "{\\vphantom{X}}";
-            res += "_{\\smash[t]{" + b5.q + "}}";
-          }
-        } else {
-          if (b5.q) {
-            res += "{\\vphantom{X}}";
-            res += "_{\\smash[t]{" + b5.q + "}}";
-          }
-
-          if (b5.d) {
-            res += "{\\vphantom{X}}";
-            res += "^{" + b5.d + "}";
-          }
-        }
-
-        break;
-
-      case 'rm':
-        res = "\\mathrm{" + buf.p1 + "}";
-        break;
-
-      case 'text':
-        if (buf.p1.match(/[\^_]/)) {
-          buf.p1 = buf.p1.replace(" ", "~").replace("-", "\\text{-}");
-          res = "\\mathrm{" + buf.p1 + "}";
-        } else {
-          res = "\\text{" + buf.p1 + "}";
-        }
-
-        break;
-
-      case 'roman numeral':
-        res = "\\mathrm{" + buf.p1 + "}";
-        break;
-
-      case 'state of aggregation':
-        res = "\\mskip2mu " + texify._goInner(buf.p1);
-        break;
-
-      case 'state of aggregation subscript':
-        res = "\\mskip1mu " + texify._goInner(buf.p1);
-        break;
-
-      case 'bond':
-        res = texify._getBond(buf.kind_);
-
-        if (!res) {
-          throw ["MhchemErrorBond", "mhchem Error. Unknown bond type (" + buf.kind_ + ")"];
-        }
-
-        break;
-
-      case 'frac':
-        var c = "\\frac{" + buf.p1 + "}{" + buf.p2 + "}";
-        res = "\\mathchoice{\\textstyle" + c + "}{" + c + "}{" + c + "}{" + c + "}";
-        break;
-
-      case 'pu-frac':
-        var d = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}";
-        res = "\\mathchoice{\\textstyle" + d + "}{" + d + "}{" + d + "}{" + d + "}";
-        break;
-
-      case 'tex-math':
-        res = buf.p1 + " ";
-        break;
-
-      case 'frac-ce':
-        res = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}";
-        break;
-
-      case 'overset':
-        res = "\\overset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}";
-        break;
-
-      case 'underset':
-        res = "\\underset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}";
-        break;
-
-      case 'underbrace':
-        res = "\\underbrace{" + texify._goInner(buf.p1) + "}_{" + texify._goInner(buf.p2) + "}";
-        break;
-
-      case 'color':
-        res = "{\\color{" + buf.color1 + "}{" + texify._goInner(buf.color2) + "}}";
-        break;
-
-      case 'color0':
-        res = "\\color{" + buf.color + "}";
-        break;
-
-      case 'arrow':
-        var b6 = {
-          rd: texify._goInner(buf.rd),
-          rq: texify._goInner(buf.rq)
-        };
-
-        var arrow = "\\x" + texify._getArrow(buf.r);
-
-        if (b6.rq) {
-          arrow += "[{" + b6.rq + "}]";
-        }
-
-        if (b6.rd) {
-          arrow += "{" + b6.rd + "}";
-        } else {
-          arrow += "{}";
-        }
-
-        res = arrow;
-        break;
-
-      case 'operator':
-        res = texify._getOperator(buf.kind_);
-        break;
-
-      case '1st-level escape':
-        res = buf.p1 + " "; // &, \\\\, \\hlin
-
-        break;
-
-      case 'space':
-        res = " ";
-        break;
-
-      case 'entitySkip':
-        res = "~";
-        break;
-
-      case 'pu-space-1':
-        res = "~";
-        break;
-
-      case 'pu-space-2':
-        res = "\\mkern3mu ";
-        break;
-
-      case '1000 separator':
-        res = "\\mkern2mu ";
-        break;
-
-      case 'commaDecimal':
-        res = "{,}";
-        break;
-
-      case 'comma enumeration L':
-        res = "{" + buf.p1 + "}\\mkern6mu ";
-        break;
-
-      case 'comma enumeration M':
-        res = "{" + buf.p1 + "}\\mkern3mu ";
-        break;
-
-      case 'comma enumeration S':
-        res = "{" + buf.p1 + "}\\mkern1mu ";
-        break;
-
-      case 'hyphen':
-        res = "\\text{-}";
-        break;
-
-      case 'addition compound':
-        res = "\\,{\\cdot}\\,";
-        break;
-
-      case 'electron dot':
-        res = "\\mkern1mu \\bullet\\mkern1mu ";
-        break;
-
-      case 'KV x':
-        res = "{\\times}";
-        break;
-
-      case 'prime':
-        res = "\\prime ";
-        break;
-
-      case 'cdot':
-        res = "\\cdot ";
-        break;
-
-      case 'tight cdot':
-        res = "\\mkern1mu{\\cdot}\\mkern1mu ";
-        break;
-
-      case 'times':
-        res = "\\times ";
-        break;
-
-      case 'circa':
-        res = "{\\sim}";
-        break;
-
-      case '^':
-        res = "uparrow";
-        break;
-
-      case 'v':
-        res = "downarrow";
-        break;
-
-      case 'ellipsis':
-        res = "\\ldots ";
-        break;
-
-      case '/':
-        res = "/";
-        break;
-
-      case ' / ':
-        res = "\\,/\\,";
-        break;
-
-      default:
-        throw ["MhchemBugT", "mhchem bug T. Please report."];
-      // Missing texify rule or unknown MhchemParser output
-    }
-    return res;
-  },
-  _getArrow: function _getArrow(a) {
-    switch (a) {
-      case "->":
-        return "rightarrow";
-
-      case "\u2192":
-        return "rightarrow";
-
-      case "\u27F6":
-        return "rightarrow";
-
-      case "<-":
-        return "leftarrow";
-
-      case "<->":
-        return "leftrightarrow";
-
-      case "<-->":
-        return "rightleftarrows";
-
-      case "<=>":
-        return "rightleftharpoons";
-
-      case "\u21CC":
-        return "rightleftharpoons";
-
-      case "<=>>":
-        return "rightequilibrium";
-
-      case "<<=>":
-        return "leftequilibrium";
-
-      default:
-        throw ["MhchemBugT", "mhchem bug T. Please report."];
-    }
-  },
-  _getBond: function _getBond(a) {
-    switch (a) {
-      case "-":
-        return "{-}";
-
-      case "1":
-        return "{-}";
-
-      case "=":
-        return "{=}";
-
-      case "2":
-        return "{=}";
-
-      case "#":
-        return "{\\equiv}";
-
-      case "3":
-        return "{\\equiv}";
-
-      case "~":
-        return "{\\tripledash}";
-
-      case "~-":
-        return "{\\mathrlap{\\raisebox{-.1em}{$-$}}\\raisebox{.1em}{$\\tripledash$}}";
-
-      case "~=":
-        return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";
-
-      case "~--":
-        return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";
-
-      case "-~-":
-        return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$-$}}\\tripledash}";
-
-      case "...":
-        return "{{\\cdot}{\\cdot}{\\cdot}}";
-
-      case "....":
-        return "{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}";
-
-      case "->":
-        return "{\\rightarrow}";
-
-      case "<-":
-        return "{\\leftarrow}";
-
-      case "<":
-        return "{<}";
-
-      case ">":
-        return "{>}";
-
-      default:
-        throw ["MhchemBugT", "mhchem bug T. Please report."];
-    }
-  },
-  _getOperator: function _getOperator(a) {
-    switch (a) {
-      case "+":
-        return " {}+{} ";
-
-      case "-":
-        return " {}-{} ";
-
-      case "=":
-        return " {}={} ";
-
-      case "<":
-        return " {}<{} ";
-
-      case ">":
-        return " {}>{} ";
-
-      case "<<":
-        return " {}\\ll{} ";
-
-      case ">>":
-        return " {}\\gg{} ";
-
-      case "\\pm":
-        return " {}\\pm{} ";
-
-      case "\\approx":
-        return " {}\\approx{} ";
-
-      case "$\\approx$":
-        return " {}\\approx{} ";
-
-      case "v":
-        return " \\downarrow{} ";
-
-      case "(v)":
-        return " \\downarrow{} ";
-
-      case "^":
-        return " \\uparrow{} ";
-
-      case "(^)":
-        return " \\uparrow{} ";
-
-      default:
-        throw ["MhchemBugT", "mhchem bug T. Please report."];
-    }
-  }
-}; //
diff --git a/registry/vulkan/katex/contrib/render-a11y-string.js b/registry/vulkan/katex/contrib/render-a11y-string.js
deleted file mode 100644
index 34643ec..0000000
--- a/registry/vulkan/katex/contrib/render-a11y-string.js
+++ /dev/null
@@ -1,858 +0,0 @@
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory(require("katex"));
-	else if(typeof define === 'function' && define.amd)
-		define(["katex"], factory);
-	else {
-		var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]);
-		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
-	}
-})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__0__) {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// define __esModule on exports
-/******/ 	__webpack_require__.r = function(exports) {
-/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/ 		}
-/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
-/******/ 	};
-/******/
-/******/ 	// create a fake namespace object
-/******/ 	// mode & 1: value is a module id, require it
-/******/ 	// mode & 2: merge all properties of value into the ns
-/******/ 	// mode & 4: return value when already ns object
-/******/ 	// mode & 8|1: behave like require
-/******/ 	__webpack_require__.t = function(value, mode) {
-/******/ 		if(mode & 1) value = __webpack_require__(value);
-/******/ 		if(mode & 8) return value;
-/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/ 		var ns = Object.create(null);
-/******/ 		__webpack_require__.r(ns);
-/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/ 		return ns;
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "";
-/******/
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 1);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports) {
-
-module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
-
-/***/ }),
-/* 1 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
-/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__);
-/**
- * renderA11yString returns a readable string.
- *
- * In some cases the string will have the proper semantic math
- * meaning,:
- *   renderA11yString("\\frac{1}{2}"")
- *   -> "start fraction, 1, divided by, 2, end fraction"
- *
- * However, other cases do not:
- *   renderA11yString("f(x) = x^2")
- *   -> "f, left parenthesis, x, right parenthesis, equals, x, squared"
- *
- * The commas in the string aim to increase ease of understanding
- * when read by a screenreader.
- */
-// NOTE: since we're importing types here these files won't actually be
-// included in the build.
-// $FlowIgnore: we import the types directly anyways
-
-var stringMap = {
-  "(": "left parenthesis",
-  ")": "right parenthesis",
-  "[": "open bracket",
-  "]": "close bracket",
-  "\\{": "left brace",
-  "\\}": "right brace",
-  "\\lvert": "open vertical bar",
-  "\\rvert": "close vertical bar",
-  "|": "vertical bar",
-  "\\uparrow": "up arrow",
-  "\\Uparrow": "up arrow",
-  "\\downarrow": "down arrow",
-  "\\Downarrow": "down arrow",
-  "\\updownarrow": "up down arrow",
-  "\\leftarrow": "left arrow",
-  "\\Leftarrow": "left arrow",
-  "\\rightarrow": "right arrow",
-  "\\Rightarrow": "right arrow",
-  "\\langle": "open angle",
-  "\\rangle": "close angle",
-  "\\lfloor": "open floor",
-  "\\rfloor": "close floor",
-  "\\int": "integral",
-  "\\intop": "integral",
-  "\\lim": "limit",
-  "\\ln": "natural log",
-  "\\log": "log",
-  "\\sin": "sine",
-  "\\cos": "cosine",
-  "\\tan": "tangent",
-  "\\cot": "cotangent",
-  "\\sum": "sum",
-  "/": "slash",
-  ",": "comma",
-  ".": "point",
-  "-": "negative",
-  "+": "plus",
-  "~": "tilde",
-  ":": "colon",
-  "?": "question mark",
-  "'": "apostrophe",
-  "\\%": "percent",
-  " ": "space",
-  "\\ ": "space",
-  "\\$": "dollar sign",
-  "\\angle": "angle",
-  "\\degree": "degree",
-  "\\circ": "circle",
-  "\\vec": "vector",
-  "\\triangle": "triangle",
-  "\\pi": "pi",
-  "\\prime": "prime",
-  "\\infty": "infinity",
-  "\\alpha": "alpha",
-  "\\beta": "beta",
-  "\\gamma": "gamma",
-  "\\omega": "omega",
-  "\\theta": "theta",
-  "\\sigma": "sigma",
-  "\\lambda": "lambda",
-  "\\tau": "tau",
-  "\\Delta": "delta",
-  "\\delta": "delta",
-  "\\mu": "mu",
-  "\\rho": "rho",
-  "\\nabla": "del",
-  "\\ell": "ell",
-  "\\ldots": "dots",
-  // TODO: add entries for all accents
-  "\\hat": "hat",
-  "\\acute": "acute"
-};
-var powerMap = {
-  "prime": "prime",
-  "degree": "degrees",
-  "circle": "degrees",
-  "2": "squared",
-  "3": "cubed"
-};
-var openMap = {
-  "|": "open vertical bar",
-  ".": ""
-};
-var closeMap = {
-  "|": "close vertical bar",
-  ".": ""
-};
-var binMap = {
-  "+": "plus",
-  "-": "minus",
-  "\\pm": "plus minus",
-  "\\cdot": "dot",
-  "*": "times",
-  "/": "divided by",
-  "\\times": "times",
-  "\\div": "divided by",
-  "\\circ": "circle",
-  "\\bullet": "bullet"
-};
-var relMap = {
-  "=": "equals",
-  "\\approx": "approximately equals",
-  "≠": "does not equal",
-  "\\geq": "is greater than or equal to",
-  "\\ge": "is greater than or equal to",
-  "\\leq": "is less than or equal to",
-  "\\le": "is less than or equal to",
-  ">": "is greater than",
-  "<": "is less than",
-  "\\leftarrow": "left arrow",
-  "\\Leftarrow": "left arrow",
-  "\\rightarrow": "right arrow",
-  "\\Rightarrow": "right arrow",
-  ":": "colon"
-};
-var accentUnderMap = {
-  "\\underleftarrow": "left arrow",
-  "\\underrightarrow": "right arrow",
-  "\\underleftrightarrow": "left-right arrow",
-  "\\undergroup": "group",
-  "\\underlinesegment": "line segment",
-  "\\utilde": "tilde"
-};
-
-var buildString = function buildString(str, type, a11yStrings) {
-  if (!str) {
-    return;
-  }
-
-  var ret;
-
-  if (type === "open") {
-    ret = str in openMap ? openMap[str] : stringMap[str] || str;
-  } else if (type === "close") {
-    ret = str in closeMap ? closeMap[str] : stringMap[str] || str;
-  } else if (type === "bin") {
-    ret = binMap[str] || str;
-  } else if (type === "rel") {
-    ret = relMap[str] || str;
-  } else {
-    ret = stringMap[str] || str;
-  } // If the text to add is a number and there is already a string
-  // in the list and the last string is a number then we should
-  // combine them into a single number
-
-
-  if (/^\d+$/.test(ret) && a11yStrings.length > 0 && // TODO(kevinb): check that the last item in a11yStrings is a string
-  // I think we might be able to drop the nested arrays, which would make
-  // this easier to type - $FlowFixMe
-  /^\d+$/.test(a11yStrings[a11yStrings.length - 1])) {
-    a11yStrings[a11yStrings.length - 1] += ret;
-  } else if (ret) {
-    a11yStrings.push(ret);
-  }
-};
-
-var buildRegion = function buildRegion(a11yStrings, callback) {
-  var regionStrings = [];
-  a11yStrings.push(regionStrings);
-  callback(regionStrings);
-};
-
-var handleObject = function handleObject(tree, a11yStrings, atomType) {
-  // Everything else is assumed to be an object...
-  switch (tree.type) {
-    case "accent":
-      {
-        buildRegion(a11yStrings, function (a11yStrings) {
-          buildA11yStrings(tree.base, a11yStrings, atomType);
-          a11yStrings.push("with");
-          buildString(tree.label, "normal", a11yStrings);
-          a11yStrings.push("on top");
-        });
-        break;
-      }
-
-    case "accentUnder":
-      {
-        buildRegion(a11yStrings, function (a11yStrings) {
-          buildA11yStrings(tree.base, a11yStrings, atomType);
-          a11yStrings.push("with");
-          buildString(accentUnderMap[tree.label], "normal", a11yStrings);
-          a11yStrings.push("underneath");
-        });
-        break;
-      }
-
-    case "accent-token":
-      {
-        // Used internally by accent symbols.
-        break;
-      }
-
-    case "atom":
-      {
-        var text = tree.text;
-
-        switch (tree.family) {
-          case "bin":
-            {
-              buildString(text, "bin", a11yStrings);
-              break;
-            }
-
-          case "close":
-            {
-              buildString(text, "close", a11yStrings);
-              break;
-            }
-          // TODO(kevinb): figure out what should be done for inner
-
-          case "inner":
-            {
-              buildString(tree.text, "inner", a11yStrings);
-              break;
-            }
-
-          case "open":
-            {
-              buildString(text, "open", a11yStrings);
-              break;
-            }
-
-          case "punct":
-            {
-              buildString(text, "punct", a11yStrings);
-              break;
-            }
-
-          case "rel":
-            {
-              buildString(text, "rel", a11yStrings);
-              break;
-            }
-
-          default:
-            {
-              tree.family;
-              throw new Error("\"" + tree.family + "\" is not a valid atom type");
-            }
-        }
-
-        break;
-      }
-
-    case "color":
-      {
-        var color = tree.color.replace(/katex-/, "");
-        buildRegion(a11yStrings, function (regionStrings) {
-          regionStrings.push("start color " + color);
-          buildA11yStrings(tree.body, regionStrings, atomType);
-          regionStrings.push("end color " + color);
-        });
-        break;
-      }
-
-    case "color-token":
-      {
-        // Used by \color, \colorbox, and \fcolorbox but not directly rendered.
-        // It's a leaf node and has no children so just break.
-        break;
-      }
-
-    case "delimsizing":
-      {
-        if (tree.delim && tree.delim !== ".") {
-          buildString(tree.delim, "normal", a11yStrings);
-        }
-
-        break;
-      }
-
-    case "genfrac":
-      {
-        buildRegion(a11yStrings, function (regionStrings) {
-          // genfrac can have unbalanced delimiters
-          var leftDelim = tree.leftDelim,
-              rightDelim = tree.rightDelim; // NOTE: Not sure if this is a safe assumption
-          // hasBarLine true -> fraction, false -> binomial
-
-          if (tree.hasBarLine) {
-            regionStrings.push("start fraction");
-            leftDelim && buildString(leftDelim, "open", regionStrings);
-            buildA11yStrings(tree.numer, regionStrings, atomType);
-            regionStrings.push("divided by");
-            buildA11yStrings(tree.denom, regionStrings, atomType);
-            rightDelim && buildString(rightDelim, "close", regionStrings);
-            regionStrings.push("end fraction");
-          } else {
-            regionStrings.push("start binomial");
-            leftDelim && buildString(leftDelim, "open", regionStrings);
-            buildA11yStrings(tree.numer, regionStrings, atomType);
-            regionStrings.push("over");
-            buildA11yStrings(tree.denom, regionStrings, atomType);
-            rightDelim && buildString(rightDelim, "close", regionStrings);
-            regionStrings.push("end binomial");
-          }
-        });
-        break;
-      }
-
-    case "kern":
-      {
-        // No op: we don't attempt to present kerning information
-        // to the screen reader.
-        break;
-      }
-
-    case "leftright":
-      {
-        buildRegion(a11yStrings, function (regionStrings) {
-          buildString(tree.left, "open", regionStrings);
-          buildA11yStrings(tree.body, regionStrings, atomType);
-          buildString(tree.right, "close", regionStrings);
-        });
-        break;
-      }
-
-    case "leftright-right":
-      {
-        // TODO: double check that this is a no-op
-        break;
-      }
-
-    case "lap":
-      {
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "mathord":
-      {
-        buildString(tree.text, "normal", a11yStrings);
-        break;
-      }
-
-    case "op":
-      {
-        var body = tree.body,
-            name = tree.name;
-
-        if (body) {
-          buildA11yStrings(body, a11yStrings, atomType);
-        } else if (name) {
-          buildString(name, "normal", a11yStrings);
-        }
-
-        break;
-      }
-
-    case "op-token":
-      {
-        // Used internally by operator symbols.
-        buildString(tree.text, atomType, a11yStrings);
-        break;
-      }
-
-    case "ordgroup":
-      {
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "overline":
-      {
-        buildRegion(a11yStrings, function (a11yStrings) {
-          a11yStrings.push("start overline");
-          buildA11yStrings(tree.body, a11yStrings, atomType);
-          a11yStrings.push("end overline");
-        });
-        break;
-      }
-
-    case "phantom":
-      {
-        a11yStrings.push("empty space");
-        break;
-      }
-
-    case "raisebox":
-      {
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "rule":
-      {
-        a11yStrings.push("rectangle");
-        break;
-      }
-
-    case "sizing":
-      {
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "spacing":
-      {
-        a11yStrings.push("space");
-        break;
-      }
-
-    case "styling":
-      {
-        // We ignore the styling and just pass through the contents
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "sqrt":
-      {
-        buildRegion(a11yStrings, function (regionStrings) {
-          var body = tree.body,
-              index = tree.index;
-
-          if (index) {
-            var indexString = flatten(buildA11yStrings(index, [], atomType)).join(",");
-
-            if (indexString === "3") {
-              regionStrings.push("cube root of");
-              buildA11yStrings(body, regionStrings, atomType);
-              regionStrings.push("end cube root");
-              return;
-            }
-
-            regionStrings.push("root");
-            regionStrings.push("start index");
-            buildA11yStrings(index, regionStrings, atomType);
-            regionStrings.push("end index");
-            return;
-          }
-
-          regionStrings.push("square root of");
-          buildA11yStrings(body, regionStrings, atomType);
-          regionStrings.push("end square root");
-        });
-        break;
-      }
-
-    case "supsub":
-      {
-        var base = tree.base,
-            sub = tree.sub,
-            sup = tree.sup;
-        var isLog = false;
-
-        if (base) {
-          buildA11yStrings(base, a11yStrings, atomType);
-          isLog = base.type === "op" && base.name === "\\log";
-        }
-
-        if (sub) {
-          var regionName = isLog ? "base" : "subscript";
-          buildRegion(a11yStrings, function (regionStrings) {
-            regionStrings.push("start " + regionName);
-            buildA11yStrings(sub, regionStrings, atomType);
-            regionStrings.push("end " + regionName);
-          });
-        }
-
-        if (sup) {
-          buildRegion(a11yStrings, function (regionStrings) {
-            var supString = flatten(buildA11yStrings(sup, [], atomType)).join(",");
-
-            if (supString in powerMap) {
-              regionStrings.push(powerMap[supString]);
-              return;
-            }
-
-            regionStrings.push("start superscript");
-            buildA11yStrings(sup, regionStrings, atomType);
-            regionStrings.push("end superscript");
-          });
-        }
-
-        break;
-      }
-
-    case "text":
-      {
-        // TODO: handle other fonts
-        if (tree.font === "\\textbf") {
-          buildRegion(a11yStrings, function (regionStrings) {
-            regionStrings.push("start bold text");
-            buildA11yStrings(tree.body, regionStrings, atomType);
-            regionStrings.push("end bold text");
-          });
-          break;
-        }
-
-        buildRegion(a11yStrings, function (regionStrings) {
-          regionStrings.push("start text");
-          buildA11yStrings(tree.body, regionStrings, atomType);
-          regionStrings.push("end text");
-        });
-        break;
-      }
-
-    case "textord":
-      {
-        buildString(tree.text, atomType, a11yStrings);
-        break;
-      }
-
-    case "smash":
-      {
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "enclose":
-      {
-        // TODO: create a map for these.
-        // TODO: differentiate between a body with a single atom, e.g.
-        // "cancel a" instead of "start cancel, a, end cancel"
-        if (/cancel/.test(tree.label)) {
-          buildRegion(a11yStrings, function (regionStrings) {
-            regionStrings.push("start cancel");
-            buildA11yStrings(tree.body, regionStrings, atomType);
-            regionStrings.push("end cancel");
-          });
-          break;
-        } else if (/box/.test(tree.label)) {
-          buildRegion(a11yStrings, function (regionStrings) {
-            regionStrings.push("start box");
-            buildA11yStrings(tree.body, regionStrings, atomType);
-            regionStrings.push("end box");
-          });
-          break;
-        } else if (/sout/.test(tree.label)) {
-          buildRegion(a11yStrings, function (regionStrings) {
-            regionStrings.push("start strikeout");
-            buildA11yStrings(tree.body, regionStrings, atomType);
-            regionStrings.push("end strikeout");
-          });
-          break;
-        }
-
-        throw new Error("KaTeX-a11y: enclose node with " + tree.label + " not supported yet");
-      }
-
-    case "vphantom":
-      {
-        throw new Error("KaTeX-a11y: vphantom not implemented yet");
-      }
-
-    case "hphantom":
-      {
-        throw new Error("KaTeX-a11y: hphantom not implemented yet");
-      }
-
-    case "operatorname":
-      {
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "array":
-      {
-        throw new Error("KaTeX-a11y: array not implemented yet");
-      }
-
-    case "raw":
-      {
-        throw new Error("KaTeX-a11y: raw not implemented yet");
-      }
-
-    case "size":
-      {
-        // Although there are nodes of type "size" in the parse tree, they have
-        // no semantic meaning and should be ignored.
-        break;
-      }
-
-    case "url":
-      {
-        throw new Error("KaTeX-a11y: url not implemented yet");
-      }
-
-    case "tag":
-      {
-        throw new Error("KaTeX-a11y: tag not implemented yet");
-      }
-
-    case "verb":
-      {
-        buildString("start verbatim", "normal", a11yStrings);
-        buildString(tree.body, "normal", a11yStrings);
-        buildString("end verbatim", "normal", a11yStrings);
-        break;
-      }
-
-    case "environment":
-      {
-        throw new Error("KaTeX-a11y: environment not implemented yet");
-      }
-
-    case "horizBrace":
-      {
-        buildString("start " + tree.label.slice(1), "normal", a11yStrings);
-        buildA11yStrings(tree.base, a11yStrings, atomType);
-        buildString("end " + tree.label.slice(1), "normal", a11yStrings);
-        break;
-      }
-
-    case "infix":
-      {
-        // All infix nodes are replace with other nodes.
-        break;
-      }
-
-    case "includegraphics":
-      {
-        throw new Error("KaTeX-a11y: includegraphics not implemented yet");
-      }
-
-    case "font":
-      {
-        // TODO: callout the start/end of specific fonts
-        // TODO: map \BBb{N} to "the naturals" or something like that
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "href":
-      {
-        throw new Error("KaTeX-a11y: href not implemented yet");
-      }
-
-    case "cr":
-      {
-        // This is used by environments.
-        throw new Error("KaTeX-a11y: cr not implemented yet");
-      }
-
-    case "underline":
-      {
-        buildRegion(a11yStrings, function (a11yStrings) {
-          a11yStrings.push("start underline");
-          buildA11yStrings(tree.body, a11yStrings, atomType);
-          a11yStrings.push("end underline");
-        });
-        break;
-      }
-
-    case "xArrow":
-      {
-        throw new Error("KaTeX-a11y: xArrow not implemented yet");
-      }
-
-    case "mclass":
-      {
-        // \neq and \ne are macros so we let "htmlmathml" render the mathmal
-        // side of things and extract the text from that.
-        var _atomType = tree.mclass.slice(1); // $FlowFixMe: drop the leading "m" from the values in mclass
-
-
-        buildA11yStrings(tree.body, a11yStrings, _atomType);
-        break;
-      }
-
-    case "mathchoice":
-      {
-        // TODO: track which which style we're using, e.g. dispaly, text, etc.
-        // default to text style if even that may not be the correct style
-        buildA11yStrings(tree.text, a11yStrings, atomType);
-        break;
-      }
-
-    case "htmlmathml":
-      {
-        buildA11yStrings(tree.mathml, a11yStrings, atomType);
-        break;
-      }
-
-    case "middle":
-      {
-        buildString(tree.delim, atomType, a11yStrings);
-        break;
-      }
-
-    default:
-      tree.type;
-      throw new Error("KaTeX a11y un-recognized type: " + tree.type);
-  }
-};
-
-var buildA11yStrings = function buildA11yStrings(tree, a11yStrings, atomType) {
-  if (a11yStrings === void 0) {
-    a11yStrings = [];
-  }
-
-  if (tree instanceof Array) {
-    for (var i = 0; i < tree.length; i++) {
-      buildA11yStrings(tree[i], a11yStrings, atomType);
-    }
-  } else {
-    handleObject(tree, a11yStrings, atomType);
-  }
-
-  return a11yStrings;
-};
-
-var flatten = function flatten(array) {
-  var result = [];
-  array.forEach(function (item) {
-    if (item instanceof Array) {
-      result = result.concat(flatten(item));
-    } else {
-      result.push(item);
-    }
-  });
-  return result;
-};
-
-var renderA11yString = function renderA11yString(text, settings) {
-  var tree = katex__WEBPACK_IMPORTED_MODULE_0___default.a.__parse(text, settings);
-
-  var a11yStrings = buildA11yStrings(tree, [], "normal");
-  return flatten(a11yStrings).join(", ");
-};
-
-/* harmony default export */ __webpack_exports__["default"] = (renderA11yString);
-
-/***/ })
-/******/ ])["default"];
-});
\ No newline at end of file
diff --git a/registry/vulkan/katex/contrib/render-a11y-string.min.js b/registry/vulkan/katex/contrib/render-a11y-string.min.js
deleted file mode 100644
index 0dcac27..0000000
--- a/registry/vulkan/katex/contrib/render-a11y-string.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r(require("katex"));else if("function"==typeof define&&define.amd)define(["katex"],r);else{var t="object"==typeof exports?r(require("katex")):r(e.katex);for(var a in t)("object"==typeof exports?exports:e)[a]=t[a]}}("undefined"!=typeof self?self:this,function(e){return function(e){var r={};function t(a){if(r[a])return r[a].exports;var o=r[a]={i:a,l:!1,exports:{}};return e[a].call(o.exports,o,o.exports,t),o.l=!0,o.exports}return t.m=e,t.c=r,t.d=function(e,r,a){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:a})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(t.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var o in e)t.d(a,o,function(r){return e[r]}.bind(null,o));return a},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=1)}([function(r,t){r.exports=e},function(e,r,t){"use strict";t.r(r);var a=t(0),o=t.n(a),n={"(":"left parenthesis",")":"right parenthesis","[":"open bracket","]":"close bracket","\\{":"left brace","\\}":"right brace","\\lvert":"open vertical bar","\\rvert":"close vertical bar","|":"vertical bar","\\uparrow":"up arrow","\\Uparrow":"up arrow","\\downarrow":"down arrow","\\Downarrow":"down arrow","\\updownarrow":"up down arrow","\\leftarrow":"left arrow","\\Leftarrow":"left arrow","\\rightarrow":"right arrow","\\Rightarrow":"right arrow","\\langle":"open angle","\\rangle":"close angle","\\lfloor":"open floor","\\rfloor":"close floor","\\int":"integral","\\intop":"integral","\\lim":"limit","\\ln":"natural log","\\log":"log","\\sin":"sine","\\cos":"cosine","\\tan":"tangent","\\cot":"cotangent","\\sum":"sum","/":"slash",",":"comma",".":"point","-":"negative","+":"plus","~":"tilde",":":"colon","?":"question mark","'":"apostrophe","\\%":"percent"," ":"space","\\ ":"space","\\$":"dollar sign","\\angle":"angle","\\degree":"degree","\\circ":"circle","\\vec":"vector","\\triangle":"triangle","\\pi":"pi","\\prime":"prime","\\infty":"infinity","\\alpha":"alpha","\\beta":"beta","\\gamma":"gamma","\\omega":"omega","\\theta":"theta","\\sigma":"sigma","\\lambda":"lambda","\\tau":"tau","\\Delta":"delta","\\delta":"delta","\\mu":"mu","\\rho":"rho","\\nabla":"del","\\ell":"ell","\\ldots":"dots","\\hat":"hat","\\acute":"acute"},s={prime:"prime",degree:"degrees",circle:"degrees",2:"squared",3:"cubed"},i={"|":"open vertical bar",".":""},l={"|":"close vertical bar",".":""},c={"+":"plus","-":"minus","\\pm":"plus minus","\\cdot":"dot","*":"times","/":"divided by","\\times":"times","\\div":"divided by","\\circ":"circle","\\bullet":"bullet"},u={"=":"equals","\\approx":"approximately equals","\u2260":"does not equal","\\geq":"is greater than or equal to","\\ge":"is greater than or equal to","\\leq":"is less than or equal to","\\le":"is less than or equal to",">":"is greater than","<":"is less than","\\leftarrow":"left arrow","\\Leftarrow":"left arrow","\\rightarrow":"right arrow","\\Rightarrow":"right arrow",":":"colon"},p={"\\underleftarrow":"left arrow","\\underrightarrow":"right arrow","\\underleftrightarrow":"left-right arrow","\\undergroup":"group","\\underlinesegment":"line segment","\\utilde":"tilde"},d=function(e,r,t){var a;e&&(/^\d+$/.test(a="open"===r?e in i?i[e]:n[e]||e:"close"===r?e in l?l[e]:n[e]||e:"bin"===r?c[e]||e:"rel"===r?u[e]||e:n[e]||e)&&t.length>0&&/^\d+$/.test(t[t.length-1])?t[t.length-1]+=a:a&&t.push(a))},b=function(e,r){var t=[];e.push(t),r(t)},h=function(e,r,t){switch(e.type){case"accent":b(r,function(r){f(e.base,r,t),r.push("with"),d(e.label,"normal",r),r.push("on top")});break;case"accentUnder":b(r,function(r){f(e.base,r,t),r.push("with"),d(p[e.label],"normal",r),r.push("underneath")});break;case"accent-token":break;case"atom":var a=e.text;switch(e.family){case"bin":d(a,"bin",r);break;case"close":d(a,"close",r);break;case"inner":d(e.text,"inner",r);break;case"open":d(a,"open",r);break;case"punct":d(a,"punct",r);break;case"rel":d(a,"rel",r);break;default:throw e.family,new Error('"'+e.family+'" is not a valid atom type')}break;case"color":var o=e.color.replace(/katex-/,"");b(r,function(r){r.push("start color "+o),f(e.body,r,t),r.push("end color "+o)});break;case"color-token":break;case"delimsizing":e.delim&&"."!==e.delim&&d(e.delim,"normal",r);break;case"genfrac":b(r,function(r){var a=e.leftDelim,o=e.rightDelim;e.hasBarLine?(r.push("start fraction"),a&&d(a,"open",r),f(e.numer,r,t),r.push("divided by"),f(e.denom,r,t),o&&d(o,"close",r),r.push("end fraction")):(r.push("start binomial"),a&&d(a,"open",r),f(e.numer,r,t),r.push("over"),f(e.denom,r,t),o&&d(o,"close",r),r.push("end binomial"))});break;case"kern":break;case"leftright":b(r,function(r){d(e.left,"open",r),f(e.body,r,t),d(e.right,"close",r)});break;case"leftright-right":break;case"lap":f(e.body,r,t);break;case"mathord":d(e.text,"normal",r);break;case"op":var n=e.body,i=e.name;n?f(n,r,t):i&&d(i,"normal",r);break;case"op-token":d(e.text,t,r);break;case"ordgroup":f(e.body,r,t);break;case"overline":b(r,function(r){r.push("start overline"),f(e.body,r,t),r.push("end overline")});break;case"phantom":r.push("empty space");break;case"raisebox":f(e.body,r,t);break;case"rule":r.push("rectangle");break;case"sizing":f(e.body,r,t);break;case"spacing":r.push("space");break;case"styling":f(e.body,r,t);break;case"sqrt":b(r,function(r){var a=e.body,o=e.index;if(o)return"3"===m(f(o,[],t)).join(",")?(r.push("cube root of"),f(a,r,t),void r.push("end cube root")):(r.push("root"),r.push("start index"),f(o,r,t),void r.push("end index"));r.push("square root of"),f(a,r,t),r.push("end square root")});break;case"supsub":var l=e.base,c=e.sub,u=e.sup,h=!1;if(l&&(f(l,r,t),h="op"===l.type&&"\\log"===l.name),c){var y=h?"base":"subscript";b(r,function(e){e.push("start "+y),f(c,e,t),e.push("end "+y)})}u&&b(r,function(e){var r=m(f(u,[],t)).join(",");r in s?e.push(s[r]):(e.push("start superscript"),f(u,e,t),e.push("end superscript"))});break;case"text":if("\\textbf"===e.font){b(r,function(r){r.push("start bold text"),f(e.body,r,t),r.push("end bold text")});break}b(r,function(r){r.push("start text"),f(e.body,r,t),r.push("end text")});break;case"textord":d(e.text,t,r);break;case"smash":f(e.body,r,t);break;case"enclose":if(/cancel/.test(e.label)){b(r,function(r){r.push("start cancel"),f(e.body,r,t),r.push("end cancel")});break}if(/box/.test(e.label)){b(r,function(r){r.push("start box"),f(e.body,r,t),r.push("end box")});break}if(/sout/.test(e.label)){b(r,function(r){r.push("start strikeout"),f(e.body,r,t),r.push("end strikeout")});break}throw new Error("KaTeX-a11y: enclose node with "+e.label+" not supported yet");case"vphantom":throw new Error("KaTeX-a11y: vphantom not implemented yet");case"hphantom":throw new Error("KaTeX-a11y: hphantom not implemented yet");case"operatorname":f(e.body,r,t);break;case"array":throw new Error("KaTeX-a11y: array not implemented yet");case"raw":throw new Error("KaTeX-a11y: raw not implemented yet");case"size":break;case"url":throw new Error("KaTeX-a11y: url not implemented yet");case"tag":throw new Error("KaTeX-a11y: tag not implemented yet");case"verb":d("start verbatim","normal",r),d(e.body,"normal",r),d("end verbatim","normal",r);break;case"environment":throw new Error("KaTeX-a11y: environment not implemented yet");case"horizBrace":d("start "+e.label.slice(1),"normal",r),f(e.base,r,t),d("end "+e.label.slice(1),"normal",r);break;case"infix":break;case"includegraphics":throw new Error("KaTeX-a11y: includegraphics not implemented yet");case"font":f(e.body,r,t);break;case"href":throw new Error("KaTeX-a11y: href not implemented yet");case"cr":throw new Error("KaTeX-a11y: cr not implemented yet");case"underline":b(r,function(r){r.push("start underline"),f(e.body,r,t),r.push("end underline")});break;case"xArrow":throw new Error("KaTeX-a11y: xArrow not implemented yet");case"mclass":var g=e.mclass.slice(1);f(e.body,r,g);break;case"mathchoice":f(e.text,r,t);break;case"htmlmathml":f(e.mathml,r,t);break;case"middle":d(e.delim,t,r);break;default:throw e.type,new Error("KaTeX a11y un-recognized type: "+e.type)}},f=function e(r,t,a){if(void 0===t&&(t=[]),r instanceof Array)for(var o=0;o<r.length;o++)e(r[o],t,a);else h(r,t,a);return t},m=function e(r){var t=[];return r.forEach(function(r){r instanceof Array?t=t.concat(e(r)):t.push(r)}),t};r.default=function(e,r){var t=o.a.__parse(e,r),a=f(t,[],"normal");return m(a).join(", ")}}]).default});
\ No newline at end of file
diff --git a/registry/vulkan/katex/contrib/render-a11y-string.mjs b/registry/vulkan/katex/contrib/render-a11y-string.mjs
deleted file mode 100644
index fc63bfc..0000000
--- a/registry/vulkan/katex/contrib/render-a11y-string.mjs
+++ /dev/null
@@ -1,741 +0,0 @@
-import katex from '../katex.mjs';
-
-/**
- * renderA11yString returns a readable string.
- *
- * In some cases the string will have the proper semantic math
- * meaning,:
- *   renderA11yString("\\frac{1}{2}"")
- *   -> "start fraction, 1, divided by, 2, end fraction"
- *
- * However, other cases do not:
- *   renderA11yString("f(x) = x^2")
- *   -> "f, left parenthesis, x, right parenthesis, equals, x, squared"
- *
- * The commas in the string aim to increase ease of understanding
- * when read by a screenreader.
- */
-const stringMap = {
-  "(": "left parenthesis",
-  ")": "right parenthesis",
-  "[": "open bracket",
-  "]": "close bracket",
-  "\\{": "left brace",
-  "\\}": "right brace",
-  "\\lvert": "open vertical bar",
-  "\\rvert": "close vertical bar",
-  "|": "vertical bar",
-  "\\uparrow": "up arrow",
-  "\\Uparrow": "up arrow",
-  "\\downarrow": "down arrow",
-  "\\Downarrow": "down arrow",
-  "\\updownarrow": "up down arrow",
-  "\\leftarrow": "left arrow",
-  "\\Leftarrow": "left arrow",
-  "\\rightarrow": "right arrow",
-  "\\Rightarrow": "right arrow",
-  "\\langle": "open angle",
-  "\\rangle": "close angle",
-  "\\lfloor": "open floor",
-  "\\rfloor": "close floor",
-  "\\int": "integral",
-  "\\intop": "integral",
-  "\\lim": "limit",
-  "\\ln": "natural log",
-  "\\log": "log",
-  "\\sin": "sine",
-  "\\cos": "cosine",
-  "\\tan": "tangent",
-  "\\cot": "cotangent",
-  "\\sum": "sum",
-  "/": "slash",
-  ",": "comma",
-  ".": "point",
-  "-": "negative",
-  "+": "plus",
-  "~": "tilde",
-  ":": "colon",
-  "?": "question mark",
-  "'": "apostrophe",
-  "\\%": "percent",
-  " ": "space",
-  "\\ ": "space",
-  "\\$": "dollar sign",
-  "\\angle": "angle",
-  "\\degree": "degree",
-  "\\circ": "circle",
-  "\\vec": "vector",
-  "\\triangle": "triangle",
-  "\\pi": "pi",
-  "\\prime": "prime",
-  "\\infty": "infinity",
-  "\\alpha": "alpha",
-  "\\beta": "beta",
-  "\\gamma": "gamma",
-  "\\omega": "omega",
-  "\\theta": "theta",
-  "\\sigma": "sigma",
-  "\\lambda": "lambda",
-  "\\tau": "tau",
-  "\\Delta": "delta",
-  "\\delta": "delta",
-  "\\mu": "mu",
-  "\\rho": "rho",
-  "\\nabla": "del",
-  "\\ell": "ell",
-  "\\ldots": "dots",
-  // TODO: add entries for all accents
-  "\\hat": "hat",
-  "\\acute": "acute"
-};
-const powerMap = {
-  "prime": "prime",
-  "degree": "degrees",
-  "circle": "degrees",
-  "2": "squared",
-  "3": "cubed"
-};
-const openMap = {
-  "|": "open vertical bar",
-  ".": ""
-};
-const closeMap = {
-  "|": "close vertical bar",
-  ".": ""
-};
-const binMap = {
-  "+": "plus",
-  "-": "minus",
-  "\\pm": "plus minus",
-  "\\cdot": "dot",
-  "*": "times",
-  "/": "divided by",
-  "\\times": "times",
-  "\\div": "divided by",
-  "\\circ": "circle",
-  "\\bullet": "bullet"
-};
-const relMap = {
-  "=": "equals",
-  "\\approx": "approximately equals",
-  "≠": "does not equal",
-  "\\geq": "is greater than or equal to",
-  "\\ge": "is greater than or equal to",
-  "\\leq": "is less than or equal to",
-  "\\le": "is less than or equal to",
-  ">": "is greater than",
-  "<": "is less than",
-  "\\leftarrow": "left arrow",
-  "\\Leftarrow": "left arrow",
-  "\\rightarrow": "right arrow",
-  "\\Rightarrow": "right arrow",
-  ":": "colon"
-};
-const accentUnderMap = {
-  "\\underleftarrow": "left arrow",
-  "\\underrightarrow": "right arrow",
-  "\\underleftrightarrow": "left-right arrow",
-  "\\undergroup": "group",
-  "\\underlinesegment": "line segment",
-  "\\utilde": "tilde"
-};
-
-const buildString = (str, type, a11yStrings) => {
-  if (!str) {
-    return;
-  }
-
-  let ret;
-
-  if (type === "open") {
-    ret = str in openMap ? openMap[str] : stringMap[str] || str;
-  } else if (type === "close") {
-    ret = str in closeMap ? closeMap[str] : stringMap[str] || str;
-  } else if (type === "bin") {
-    ret = binMap[str] || str;
-  } else if (type === "rel") {
-    ret = relMap[str] || str;
-  } else {
-    ret = stringMap[str] || str;
-  } // If the text to add is a number and there is already a string
-  // in the list and the last string is a number then we should
-  // combine them into a single number
-
-
-  if (/^\d+$/.test(ret) && a11yStrings.length > 0 && // TODO(kevinb): check that the last item in a11yStrings is a string
-  // I think we might be able to drop the nested arrays, which would make
-  // this easier to type - $FlowFixMe
-  /^\d+$/.test(a11yStrings[a11yStrings.length - 1])) {
-    a11yStrings[a11yStrings.length - 1] += ret;
-  } else if (ret) {
-    a11yStrings.push(ret);
-  }
-};
-
-const buildRegion = (a11yStrings, callback) => {
-  const regionStrings = [];
-  a11yStrings.push(regionStrings);
-  callback(regionStrings);
-};
-
-const handleObject = (tree, a11yStrings, atomType) => {
-  // Everything else is assumed to be an object...
-  switch (tree.type) {
-    case "accent":
-      {
-        buildRegion(a11yStrings, a11yStrings => {
-          buildA11yStrings(tree.base, a11yStrings, atomType);
-          a11yStrings.push("with");
-          buildString(tree.label, "normal", a11yStrings);
-          a11yStrings.push("on top");
-        });
-        break;
-      }
-
-    case "accentUnder":
-      {
-        buildRegion(a11yStrings, a11yStrings => {
-          buildA11yStrings(tree.base, a11yStrings, atomType);
-          a11yStrings.push("with");
-          buildString(accentUnderMap[tree.label], "normal", a11yStrings);
-          a11yStrings.push("underneath");
-        });
-        break;
-      }
-
-    case "accent-token":
-      {
-        // Used internally by accent symbols.
-        break;
-      }
-
-    case "atom":
-      {
-        const text = tree.text;
-
-        switch (tree.family) {
-          case "bin":
-            {
-              buildString(text, "bin", a11yStrings);
-              break;
-            }
-
-          case "close":
-            {
-              buildString(text, "close", a11yStrings);
-              break;
-            }
-          // TODO(kevinb): figure out what should be done for inner
-
-          case "inner":
-            {
-              buildString(tree.text, "inner", a11yStrings);
-              break;
-            }
-
-          case "open":
-            {
-              buildString(text, "open", a11yStrings);
-              break;
-            }
-
-          case "punct":
-            {
-              buildString(text, "punct", a11yStrings);
-              break;
-            }
-
-          case "rel":
-            {
-              buildString(text, "rel", a11yStrings);
-              break;
-            }
-
-          default:
-            {
-              tree.family;
-              throw new Error(`"${tree.family}" is not a valid atom type`);
-            }
-        }
-
-        break;
-      }
-
-    case "color":
-      {
-        const color = tree.color.replace(/katex-/, "");
-        buildRegion(a11yStrings, regionStrings => {
-          regionStrings.push("start color " + color);
-          buildA11yStrings(tree.body, regionStrings, atomType);
-          regionStrings.push("end color " + color);
-        });
-        break;
-      }
-
-    case "color-token":
-      {
-        // Used by \color, \colorbox, and \fcolorbox but not directly rendered.
-        // It's a leaf node and has no children so just break.
-        break;
-      }
-
-    case "delimsizing":
-      {
-        if (tree.delim && tree.delim !== ".") {
-          buildString(tree.delim, "normal", a11yStrings);
-        }
-
-        break;
-      }
-
-    case "genfrac":
-      {
-        buildRegion(a11yStrings, regionStrings => {
-          // genfrac can have unbalanced delimiters
-          const leftDelim = tree.leftDelim,
-                rightDelim = tree.rightDelim; // NOTE: Not sure if this is a safe assumption
-          // hasBarLine true -> fraction, false -> binomial
-
-          if (tree.hasBarLine) {
-            regionStrings.push("start fraction");
-            leftDelim && buildString(leftDelim, "open", regionStrings);
-            buildA11yStrings(tree.numer, regionStrings, atomType);
-            regionStrings.push("divided by");
-            buildA11yStrings(tree.denom, regionStrings, atomType);
-            rightDelim && buildString(rightDelim, "close", regionStrings);
-            regionStrings.push("end fraction");
-          } else {
-            regionStrings.push("start binomial");
-            leftDelim && buildString(leftDelim, "open", regionStrings);
-            buildA11yStrings(tree.numer, regionStrings, atomType);
-            regionStrings.push("over");
-            buildA11yStrings(tree.denom, regionStrings, atomType);
-            rightDelim && buildString(rightDelim, "close", regionStrings);
-            regionStrings.push("end binomial");
-          }
-        });
-        break;
-      }
-
-    case "kern":
-      {
-        // No op: we don't attempt to present kerning information
-        // to the screen reader.
-        break;
-      }
-
-    case "leftright":
-      {
-        buildRegion(a11yStrings, regionStrings => {
-          buildString(tree.left, "open", regionStrings);
-          buildA11yStrings(tree.body, regionStrings, atomType);
-          buildString(tree.right, "close", regionStrings);
-        });
-        break;
-      }
-
-    case "leftright-right":
-      {
-        // TODO: double check that this is a no-op
-        break;
-      }
-
-    case "lap":
-      {
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "mathord":
-      {
-        buildString(tree.text, "normal", a11yStrings);
-        break;
-      }
-
-    case "op":
-      {
-        const body = tree.body,
-              name = tree.name;
-
-        if (body) {
-          buildA11yStrings(body, a11yStrings, atomType);
-        } else if (name) {
-          buildString(name, "normal", a11yStrings);
-        }
-
-        break;
-      }
-
-    case "op-token":
-      {
-        // Used internally by operator symbols.
-        buildString(tree.text, atomType, a11yStrings);
-        break;
-      }
-
-    case "ordgroup":
-      {
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "overline":
-      {
-        buildRegion(a11yStrings, function (a11yStrings) {
-          a11yStrings.push("start overline");
-          buildA11yStrings(tree.body, a11yStrings, atomType);
-          a11yStrings.push("end overline");
-        });
-        break;
-      }
-
-    case "phantom":
-      {
-        a11yStrings.push("empty space");
-        break;
-      }
-
-    case "raisebox":
-      {
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "rule":
-      {
-        a11yStrings.push("rectangle");
-        break;
-      }
-
-    case "sizing":
-      {
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "spacing":
-      {
-        a11yStrings.push("space");
-        break;
-      }
-
-    case "styling":
-      {
-        // We ignore the styling and just pass through the contents
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "sqrt":
-      {
-        buildRegion(a11yStrings, regionStrings => {
-          const body = tree.body,
-                index = tree.index;
-
-          if (index) {
-            const indexString = flatten(buildA11yStrings(index, [], atomType)).join(",");
-
-            if (indexString === "3") {
-              regionStrings.push("cube root of");
-              buildA11yStrings(body, regionStrings, atomType);
-              regionStrings.push("end cube root");
-              return;
-            }
-
-            regionStrings.push("root");
-            regionStrings.push("start index");
-            buildA11yStrings(index, regionStrings, atomType);
-            regionStrings.push("end index");
-            return;
-          }
-
-          regionStrings.push("square root of");
-          buildA11yStrings(body, regionStrings, atomType);
-          regionStrings.push("end square root");
-        });
-        break;
-      }
-
-    case "supsub":
-      {
-        const base = tree.base,
-              sub = tree.sub,
-              sup = tree.sup;
-        let isLog = false;
-
-        if (base) {
-          buildA11yStrings(base, a11yStrings, atomType);
-          isLog = base.type === "op" && base.name === "\\log";
-        }
-
-        if (sub) {
-          const regionName = isLog ? "base" : "subscript";
-          buildRegion(a11yStrings, function (regionStrings) {
-            regionStrings.push(`start ${regionName}`);
-            buildA11yStrings(sub, regionStrings, atomType);
-            regionStrings.push(`end ${regionName}`);
-          });
-        }
-
-        if (sup) {
-          buildRegion(a11yStrings, function (regionStrings) {
-            const supString = flatten(buildA11yStrings(sup, [], atomType)).join(",");
-
-            if (supString in powerMap) {
-              regionStrings.push(powerMap[supString]);
-              return;
-            }
-
-            regionStrings.push("start superscript");
-            buildA11yStrings(sup, regionStrings, atomType);
-            regionStrings.push("end superscript");
-          });
-        }
-
-        break;
-      }
-
-    case "text":
-      {
-        // TODO: handle other fonts
-        if (tree.font === "\\textbf") {
-          buildRegion(a11yStrings, function (regionStrings) {
-            regionStrings.push("start bold text");
-            buildA11yStrings(tree.body, regionStrings, atomType);
-            regionStrings.push("end bold text");
-          });
-          break;
-        }
-
-        buildRegion(a11yStrings, function (regionStrings) {
-          regionStrings.push("start text");
-          buildA11yStrings(tree.body, regionStrings, atomType);
-          regionStrings.push("end text");
-        });
-        break;
-      }
-
-    case "textord":
-      {
-        buildString(tree.text, atomType, a11yStrings);
-        break;
-      }
-
-    case "smash":
-      {
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "enclose":
-      {
-        // TODO: create a map for these.
-        // TODO: differentiate between a body with a single atom, e.g.
-        // "cancel a" instead of "start cancel, a, end cancel"
-        if (/cancel/.test(tree.label)) {
-          buildRegion(a11yStrings, function (regionStrings) {
-            regionStrings.push("start cancel");
-            buildA11yStrings(tree.body, regionStrings, atomType);
-            regionStrings.push("end cancel");
-          });
-          break;
-        } else if (/box/.test(tree.label)) {
-          buildRegion(a11yStrings, function (regionStrings) {
-            regionStrings.push("start box");
-            buildA11yStrings(tree.body, regionStrings, atomType);
-            regionStrings.push("end box");
-          });
-          break;
-        } else if (/sout/.test(tree.label)) {
-          buildRegion(a11yStrings, function (regionStrings) {
-            regionStrings.push("start strikeout");
-            buildA11yStrings(tree.body, regionStrings, atomType);
-            regionStrings.push("end strikeout");
-          });
-          break;
-        }
-
-        throw new Error(`KaTeX-a11y: enclose node with ${tree.label} not supported yet`);
-      }
-
-    case "vphantom":
-      {
-        throw new Error("KaTeX-a11y: vphantom not implemented yet");
-      }
-
-    case "hphantom":
-      {
-        throw new Error("KaTeX-a11y: hphantom not implemented yet");
-      }
-
-    case "operatorname":
-      {
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "array":
-      {
-        throw new Error("KaTeX-a11y: array not implemented yet");
-      }
-
-    case "raw":
-      {
-        throw new Error("KaTeX-a11y: raw not implemented yet");
-      }
-
-    case "size":
-      {
-        // Although there are nodes of type "size" in the parse tree, they have
-        // no semantic meaning and should be ignored.
-        break;
-      }
-
-    case "url":
-      {
-        throw new Error("KaTeX-a11y: url not implemented yet");
-      }
-
-    case "tag":
-      {
-        throw new Error("KaTeX-a11y: tag not implemented yet");
-      }
-
-    case "verb":
-      {
-        buildString(`start verbatim`, "normal", a11yStrings);
-        buildString(tree.body, "normal", a11yStrings);
-        buildString(`end verbatim`, "normal", a11yStrings);
-        break;
-      }
-
-    case "environment":
-      {
-        throw new Error("KaTeX-a11y: environment not implemented yet");
-      }
-
-    case "horizBrace":
-      {
-        buildString(`start ${tree.label.slice(1)}`, "normal", a11yStrings);
-        buildA11yStrings(tree.base, a11yStrings, atomType);
-        buildString(`end ${tree.label.slice(1)}`, "normal", a11yStrings);
-        break;
-      }
-
-    case "infix":
-      {
-        // All infix nodes are replace with other nodes.
-        break;
-      }
-
-    case "includegraphics":
-      {
-        throw new Error("KaTeX-a11y: includegraphics not implemented yet");
-      }
-
-    case "font":
-      {
-        // TODO: callout the start/end of specific fonts
-        // TODO: map \BBb{N} to "the naturals" or something like that
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "href":
-      {
-        throw new Error("KaTeX-a11y: href not implemented yet");
-      }
-
-    case "cr":
-      {
-        // This is used by environments.
-        throw new Error("KaTeX-a11y: cr not implemented yet");
-      }
-
-    case "underline":
-      {
-        buildRegion(a11yStrings, function (a11yStrings) {
-          a11yStrings.push("start underline");
-          buildA11yStrings(tree.body, a11yStrings, atomType);
-          a11yStrings.push("end underline");
-        });
-        break;
-      }
-
-    case "xArrow":
-      {
-        throw new Error("KaTeX-a11y: xArrow not implemented yet");
-      }
-
-    case "mclass":
-      {
-        // \neq and \ne are macros so we let "htmlmathml" render the mathmal
-        // side of things and extract the text from that.
-        const atomType = tree.mclass.slice(1); // $FlowFixMe: drop the leading "m" from the values in mclass
-
-        buildA11yStrings(tree.body, a11yStrings, atomType);
-        break;
-      }
-
-    case "mathchoice":
-      {
-        // TODO: track which which style we're using, e.g. dispaly, text, etc.
-        // default to text style if even that may not be the correct style
-        buildA11yStrings(tree.text, a11yStrings, atomType);
-        break;
-      }
-
-    case "htmlmathml":
-      {
-        buildA11yStrings(tree.mathml, a11yStrings, atomType);
-        break;
-      }
-
-    case "middle":
-      {
-        buildString(tree.delim, atomType, a11yStrings);
-        break;
-      }
-
-    default:
-      tree.type;
-      throw new Error("KaTeX a11y un-recognized type: " + tree.type);
-  }
-};
-
-const buildA11yStrings = function buildA11yStrings(tree, a11yStrings, atomType) {
-  if (a11yStrings === void 0) {
-    a11yStrings = [];
-  }
-
-  if (tree instanceof Array) {
-    for (let i = 0; i < tree.length; i++) {
-      buildA11yStrings(tree[i], a11yStrings, atomType);
-    }
-  } else {
-    handleObject(tree, a11yStrings, atomType);
-  }
-
-  return a11yStrings;
-};
-
-const flatten = function flatten(array) {
-  let result = [];
-  array.forEach(function (item) {
-    if (item instanceof Array) {
-      result = result.concat(flatten(item));
-    } else {
-      result.push(item);
-    }
-  });
-  return result;
-};
-
-const renderA11yString = function renderA11yString(text, settings) {
-  const tree = katex.__parse(text, settings);
-
-  const a11yStrings = buildA11yStrings(tree, [], "normal");
-  return flatten(a11yStrings).join(", ");
-};
-
-export default renderA11yString;
diff --git a/registry/vulkan/katex/fonts/KaTeX_AMS-Regular.ttf b/registry/vulkan/katex/fonts/KaTeX_AMS-Regular.ttf
deleted file mode 100644
index afcd2eb..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_AMS-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_AMS-Regular.woff b/registry/vulkan/katex/fonts/KaTeX_AMS-Regular.woff
deleted file mode 100644
index 4f57515..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_AMS-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_AMS-Regular.woff2 b/registry/vulkan/katex/fonts/KaTeX_AMS-Regular.woff2
deleted file mode 100644
index b982d6e..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_AMS-Regular.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Bold.ttf b/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Bold.ttf
deleted file mode 100644
index f84148d..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Bold.woff b/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Bold.woff
deleted file mode 100644
index ab56ab7..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Bold.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Bold.woff2 b/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Bold.woff2
deleted file mode 100644
index 710c261..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Bold.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Regular.ttf b/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Regular.ttf
deleted file mode 100644
index 97814db..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Regular.woff b/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Regular.woff
deleted file mode 100644
index aec8a33..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Regular.woff2 b/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Regular.woff2
deleted file mode 100644
index ee5193d..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Caligraphic-Regular.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Fraktur-Bold.ttf b/registry/vulkan/katex/fonts/KaTeX_Fraktur-Bold.ttf
deleted file mode 100644
index 483a7cd..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Fraktur-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Fraktur-Bold.woff b/registry/vulkan/katex/fonts/KaTeX_Fraktur-Bold.woff
deleted file mode 100644
index 189fea5..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Fraktur-Bold.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Fraktur-Bold.woff2 b/registry/vulkan/katex/fonts/KaTeX_Fraktur-Bold.woff2
deleted file mode 100644
index dc3bd4c..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Fraktur-Bold.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Fraktur-Regular.ttf b/registry/vulkan/katex/fonts/KaTeX_Fraktur-Regular.ttf
deleted file mode 100644
index 9aa5f67..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Fraktur-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Fraktur-Regular.woff b/registry/vulkan/katex/fonts/KaTeX_Fraktur-Regular.woff
deleted file mode 100644
index d01450e..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Fraktur-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Fraktur-Regular.woff2 b/registry/vulkan/katex/fonts/KaTeX_Fraktur-Regular.woff2
deleted file mode 100644
index 7eeba37..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Fraktur-Regular.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Main-Bold.ttf b/registry/vulkan/katex/fonts/KaTeX_Main-Bold.ttf
deleted file mode 100644
index dc0185a..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Main-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Main-Bold.woff b/registry/vulkan/katex/fonts/KaTeX_Main-Bold.woff
deleted file mode 100644
index acf48e6..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Main-Bold.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Main-Bold.woff2 b/registry/vulkan/katex/fonts/KaTeX_Main-Bold.woff2
deleted file mode 100644
index cf5abab..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Main-Bold.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Main-BoldItalic.ttf b/registry/vulkan/katex/fonts/KaTeX_Main-BoldItalic.ttf
deleted file mode 100644
index 4346f17..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Main-BoldItalic.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Main-BoldItalic.woff b/registry/vulkan/katex/fonts/KaTeX_Main-BoldItalic.woff
deleted file mode 100644
index d2cfe4e..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Main-BoldItalic.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Main-BoldItalic.woff2 b/registry/vulkan/katex/fonts/KaTeX_Main-BoldItalic.woff2
deleted file mode 100644
index d0178f4..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Main-BoldItalic.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Main-Italic.ttf b/registry/vulkan/katex/fonts/KaTeX_Main-Italic.ttf
deleted file mode 100644
index f2c3eba..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Main-Italic.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Main-Italic.woff b/registry/vulkan/katex/fonts/KaTeX_Main-Italic.woff
deleted file mode 100644
index 1184295..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Main-Italic.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Main-Italic.woff2 b/registry/vulkan/katex/fonts/KaTeX_Main-Italic.woff2
deleted file mode 100644
index aa05e14..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Main-Italic.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Main-Regular.ttf b/registry/vulkan/katex/fonts/KaTeX_Main-Regular.ttf
deleted file mode 100644
index 8acb365..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Main-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Main-Regular.woff b/registry/vulkan/katex/fonts/KaTeX_Main-Regular.woff
deleted file mode 100644
index 9f8228f..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Main-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Main-Regular.woff2 b/registry/vulkan/katex/fonts/KaTeX_Main-Regular.woff2
deleted file mode 100644
index e3f71eb..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Main-Regular.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Math-BoldItalic.ttf b/registry/vulkan/katex/fonts/KaTeX_Math-BoldItalic.ttf
deleted file mode 100644
index a645df6..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Math-BoldItalic.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Math-BoldItalic.woff b/registry/vulkan/katex/fonts/KaTeX_Math-BoldItalic.woff
deleted file mode 100644
index 87d4f22..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Math-BoldItalic.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Math-BoldItalic.woff2 b/registry/vulkan/katex/fonts/KaTeX_Math-BoldItalic.woff2
deleted file mode 100644
index 83b4996..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Math-BoldItalic.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Math-Italic.ttf b/registry/vulkan/katex/fonts/KaTeX_Math-Italic.ttf
deleted file mode 100644
index 9c38359..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Math-Italic.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Math-Italic.woff b/registry/vulkan/katex/fonts/KaTeX_Math-Italic.woff
deleted file mode 100644
index 959746e..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Math-Italic.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Math-Italic.woff2 b/registry/vulkan/katex/fonts/KaTeX_Math-Italic.woff2
deleted file mode 100644
index e3ea522..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Math-Italic.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Bold.ttf b/registry/vulkan/katex/fonts/KaTeX_SansSerif-Bold.ttf
deleted file mode 100644
index ff10851..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Bold.woff b/registry/vulkan/katex/fonts/KaTeX_SansSerif-Bold.woff
deleted file mode 100644
index f0d6ea7..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Bold.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Bold.woff2 b/registry/vulkan/katex/fonts/KaTeX_SansSerif-Bold.woff2
deleted file mode 100644
index 4cf8f14..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Bold.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Italic.ttf b/registry/vulkan/katex/fonts/KaTeX_SansSerif-Italic.ttf
deleted file mode 100644
index 3dd7671..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Italic.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Italic.woff b/registry/vulkan/katex/fonts/KaTeX_SansSerif-Italic.woff
deleted file mode 100644
index 9da0dfe..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Italic.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Italic.woff2 b/registry/vulkan/katex/fonts/KaTeX_SansSerif-Italic.woff2
deleted file mode 100644
index ce19ae0..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Italic.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Regular.ttf b/registry/vulkan/katex/fonts/KaTeX_SansSerif-Regular.ttf
deleted file mode 100644
index f117cd6..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Regular.woff b/registry/vulkan/katex/fonts/KaTeX_SansSerif-Regular.woff
deleted file mode 100644
index 6ed9878..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Regular.woff2 b/registry/vulkan/katex/fonts/KaTeX_SansSerif-Regular.woff2
deleted file mode 100644
index 2761149..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_SansSerif-Regular.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Script-Regular.ttf b/registry/vulkan/katex/fonts/KaTeX_Script-Regular.ttf
deleted file mode 100644
index e6f3454..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Script-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Script-Regular.woff b/registry/vulkan/katex/fonts/KaTeX_Script-Regular.woff
deleted file mode 100644
index 4a48e65..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Script-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Script-Regular.woff2 b/registry/vulkan/katex/fonts/KaTeX_Script-Regular.woff2
deleted file mode 100644
index b0aed19..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Script-Regular.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Size1-Regular.ttf b/registry/vulkan/katex/fonts/KaTeX_Size1-Regular.ttf
deleted file mode 100644
index 37faa0f..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Size1-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Size1-Regular.woff b/registry/vulkan/katex/fonts/KaTeX_Size1-Regular.woff
deleted file mode 100644
index 0832f7a..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Size1-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Size1-Regular.woff2 b/registry/vulkan/katex/fonts/KaTeX_Size1-Regular.woff2
deleted file mode 100644
index 483e7b6..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Size1-Regular.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Size2-Regular.ttf b/registry/vulkan/katex/fonts/KaTeX_Size2-Regular.ttf
deleted file mode 100644
index cf32623..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Size2-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Size2-Regular.woff b/registry/vulkan/katex/fonts/KaTeX_Size2-Regular.woff
deleted file mode 100644
index 14f6485..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Size2-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Size2-Regular.woff2 b/registry/vulkan/katex/fonts/KaTeX_Size2-Regular.woff2
deleted file mode 100644
index 5ff7060..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Size2-Regular.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Size3-Regular.ttf b/registry/vulkan/katex/fonts/KaTeX_Size3-Regular.ttf
deleted file mode 100644
index ff7e2b9..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Size3-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Size3-Regular.woff b/registry/vulkan/katex/fonts/KaTeX_Size3-Regular.woff
deleted file mode 100644
index d3626ce..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Size3-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Size3-Regular.woff2 b/registry/vulkan/katex/fonts/KaTeX_Size3-Regular.woff2
deleted file mode 100644
index e45ca49..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Size3-Regular.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Size4-Regular.ttf b/registry/vulkan/katex/fonts/KaTeX_Size4-Regular.ttf
deleted file mode 100644
index 3034091..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Size4-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Size4-Regular.woff b/registry/vulkan/katex/fonts/KaTeX_Size4-Regular.woff
deleted file mode 100644
index 93c57a6..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Size4-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Size4-Regular.woff2 b/registry/vulkan/katex/fonts/KaTeX_Size4-Regular.woff2
deleted file mode 100644
index 53b65af..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Size4-Regular.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Typewriter-Regular.ttf b/registry/vulkan/katex/fonts/KaTeX_Typewriter-Regular.ttf
deleted file mode 100644
index 2fd8529..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Typewriter-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Typewriter-Regular.woff b/registry/vulkan/katex/fonts/KaTeX_Typewriter-Regular.woff
deleted file mode 100644
index e90fa2b..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Typewriter-Regular.woff
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/fonts/KaTeX_Typewriter-Regular.woff2 b/registry/vulkan/katex/fonts/KaTeX_Typewriter-Regular.woff2
deleted file mode 100644
index e40ab15..0000000
--- a/registry/vulkan/katex/fonts/KaTeX_Typewriter-Regular.woff2
+++ /dev/null
Binary files differ
diff --git a/registry/vulkan/katex/katex.css b/registry/vulkan/katex/katex.css
deleted file mode 100644
index 7c97e92..0000000
--- a/registry/vulkan/katex/katex.css
+++ /dev/null
@@ -1,1012 +0,0 @@
-/* stylelint-disable font-family-no-missing-generic-family-keyword */
-@font-face {
-  font-family: 'KaTeX_AMS';
-  src: url(fonts/KaTeX_AMS-Regular.woff2) format('woff2'), url(fonts/KaTeX_AMS-Regular.woff) format('woff'), url(fonts/KaTeX_AMS-Regular.ttf) format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Caligraphic';
-  src: url(fonts/KaTeX_Caligraphic-Bold.woff2) format('woff2'), url(fonts/KaTeX_Caligraphic-Bold.woff) format('woff'), url(fonts/KaTeX_Caligraphic-Bold.ttf) format('truetype');
-  font-weight: bold;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Caligraphic';
-  src: url(fonts/KaTeX_Caligraphic-Regular.woff2) format('woff2'), url(fonts/KaTeX_Caligraphic-Regular.woff) format('woff'), url(fonts/KaTeX_Caligraphic-Regular.ttf) format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Fraktur';
-  src: url(fonts/KaTeX_Fraktur-Bold.woff2) format('woff2'), url(fonts/KaTeX_Fraktur-Bold.woff) format('woff'), url(fonts/KaTeX_Fraktur-Bold.ttf) format('truetype');
-  font-weight: bold;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Fraktur';
-  src: url(fonts/KaTeX_Fraktur-Regular.woff2) format('woff2'), url(fonts/KaTeX_Fraktur-Regular.woff) format('woff'), url(fonts/KaTeX_Fraktur-Regular.ttf) format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Main';
-  src: url(fonts/KaTeX_Main-Bold.woff2) format('woff2'), url(fonts/KaTeX_Main-Bold.woff) format('woff'), url(fonts/KaTeX_Main-Bold.ttf) format('truetype');
-  font-weight: bold;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Main';
-  src: url(fonts/KaTeX_Main-BoldItalic.woff2) format('woff2'), url(fonts/KaTeX_Main-BoldItalic.woff) format('woff'), url(fonts/KaTeX_Main-BoldItalic.ttf) format('truetype');
-  font-weight: bold;
-  font-style: italic;
-}
-@font-face {
-  font-family: 'KaTeX_Main';
-  src: url(fonts/KaTeX_Main-Italic.woff2) format('woff2'), url(fonts/KaTeX_Main-Italic.woff) format('woff'), url(fonts/KaTeX_Main-Italic.ttf) format('truetype');
-  font-weight: normal;
-  font-style: italic;
-}
-@font-face {
-  font-family: 'KaTeX_Main';
-  src: url(fonts/KaTeX_Main-Regular.woff2) format('woff2'), url(fonts/KaTeX_Main-Regular.woff) format('woff'), url(fonts/KaTeX_Main-Regular.ttf) format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Math';
-  src: url(fonts/KaTeX_Math-BoldItalic.woff2) format('woff2'), url(fonts/KaTeX_Math-BoldItalic.woff) format('woff'), url(fonts/KaTeX_Math-BoldItalic.ttf) format('truetype');
-  font-weight: bold;
-  font-style: italic;
-}
-@font-face {
-  font-family: 'KaTeX_Math';
-  src: url(fonts/KaTeX_Math-Italic.woff2) format('woff2'), url(fonts/KaTeX_Math-Italic.woff) format('woff'), url(fonts/KaTeX_Math-Italic.ttf) format('truetype');
-  font-weight: normal;
-  font-style: italic;
-}
-@font-face {
-  font-family: 'KaTeX_SansSerif';
-  src: url(fonts/KaTeX_SansSerif-Bold.woff2) format('woff2'), url(fonts/KaTeX_SansSerif-Bold.woff) format('woff'), url(fonts/KaTeX_SansSerif-Bold.ttf) format('truetype');
-  font-weight: bold;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_SansSerif';
-  src: url(fonts/KaTeX_SansSerif-Italic.woff2) format('woff2'), url(fonts/KaTeX_SansSerif-Italic.woff) format('woff'), url(fonts/KaTeX_SansSerif-Italic.ttf) format('truetype');
-  font-weight: normal;
-  font-style: italic;
-}
-@font-face {
-  font-family: 'KaTeX_SansSerif';
-  src: url(fonts/KaTeX_SansSerif-Regular.woff2) format('woff2'), url(fonts/KaTeX_SansSerif-Regular.woff) format('woff'), url(fonts/KaTeX_SansSerif-Regular.ttf) format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Script';
-  src: url(fonts/KaTeX_Script-Regular.woff2) format('woff2'), url(fonts/KaTeX_Script-Regular.woff) format('woff'), url(fonts/KaTeX_Script-Regular.ttf) format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Size1';
-  src: url(fonts/KaTeX_Size1-Regular.woff2) format('woff2'), url(fonts/KaTeX_Size1-Regular.woff) format('woff'), url(fonts/KaTeX_Size1-Regular.ttf) format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Size2';
-  src: url(fonts/KaTeX_Size2-Regular.woff2) format('woff2'), url(fonts/KaTeX_Size2-Regular.woff) format('woff'), url(fonts/KaTeX_Size2-Regular.ttf) format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Size3';
-  src: url(fonts/KaTeX_Size3-Regular.woff2) format('woff2'), url(fonts/KaTeX_Size3-Regular.woff) format('woff'), url(fonts/KaTeX_Size3-Regular.ttf) format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Size4';
-  src: url(fonts/KaTeX_Size4-Regular.woff2) format('woff2'), url(fonts/KaTeX_Size4-Regular.woff) format('woff'), url(fonts/KaTeX_Size4-Regular.ttf) format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'KaTeX_Typewriter';
-  src: url(fonts/KaTeX_Typewriter-Regular.woff2) format('woff2'), url(fonts/KaTeX_Typewriter-Regular.woff) format('woff'), url(fonts/KaTeX_Typewriter-Regular.ttf) format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-.katex {
-  font: normal 1.21em KaTeX_Main, Times New Roman, serif;
-  line-height: 1.2;
-  text-indent: 0;
-  text-rendering: auto;
-}
-.katex * {
-  -ms-high-contrast-adjust: none !important;
-}
-.katex .katex-version::after {
-  content: "0.11.1";
-}
-.katex .katex-mathml {
-  position: absolute;
-  clip: rect(1px, 1px, 1px, 1px);
-  padding: 0;
-  border: 0;
-  height: 1px;
-  width: 1px;
-  overflow: hidden;
-}
-.katex .katex-html {
-  /* \newline is an empty block at top level, between .base elements */
-}
-.katex .katex-html > .newline {
-  display: block;
-}
-.katex .base {
-  position: relative;
-  display: inline-block;
-  white-space: nowrap;
-  width: min-content;
-}
-.katex .strut {
-  display: inline-block;
-}
-.katex .textbf {
-  font-weight: bold;
-}
-.katex .textit {
-  font-style: italic;
-}
-.katex .textrm {
-  font-family: KaTeX_Main;
-}
-.katex .textsf {
-  font-family: KaTeX_SansSerif;
-}
-.katex .texttt {
-  font-family: KaTeX_Typewriter;
-}
-.katex .mathdefault {
-  font-family: KaTeX_Math;
-  font-style: italic;
-}
-.katex .mathit {
-  font-family: KaTeX_Main;
-  font-style: italic;
-}
-.katex .mathrm {
-  font-style: normal;
-}
-.katex .mathbf {
-  font-family: KaTeX_Main;
-  font-weight: bold;
-}
-.katex .boldsymbol {
-  font-family: KaTeX_Math;
-  font-weight: bold;
-  font-style: italic;
-}
-.katex .amsrm {
-  font-family: KaTeX_AMS;
-}
-.katex .mathbb,
-.katex .textbb {
-  font-family: KaTeX_AMS;
-}
-.katex .mathcal {
-  font-family: KaTeX_Caligraphic;
-}
-.katex .mathfrak,
-.katex .textfrak {
-  font-family: KaTeX_Fraktur;
-}
-.katex .mathtt {
-  font-family: KaTeX_Typewriter;
-}
-.katex .mathscr,
-.katex .textscr {
-  font-family: KaTeX_Script;
-}
-.katex .mathsf,
-.katex .textsf {
-  font-family: KaTeX_SansSerif;
-}
-.katex .mathboldsf,
-.katex .textboldsf {
-  font-family: KaTeX_SansSerif;
-  font-weight: bold;
-}
-.katex .mathitsf,
-.katex .textitsf {
-  font-family: KaTeX_SansSerif;
-  font-style: italic;
-}
-.katex .mainrm {
-  font-family: KaTeX_Main;
-  font-style: normal;
-}
-.katex .vlist-t {
-  display: inline-table;
-  table-layout: fixed;
-}
-.katex .vlist-r {
-  display: table-row;
-}
-.katex .vlist {
-  display: table-cell;
-  vertical-align: bottom;
-  position: relative;
-}
-.katex .vlist > span {
-  display: block;
-  height: 0;
-  position: relative;
-}
-.katex .vlist > span > span {
-  display: inline-block;
-}
-.katex .vlist > span > .pstrut {
-  overflow: hidden;
-  width: 0;
-}
-.katex .vlist-t2 {
-  margin-right: -2px;
-}
-.katex .vlist-s {
-  display: table-cell;
-  vertical-align: bottom;
-  font-size: 1px;
-  width: 2px;
-  min-width: 2px;
-}
-.katex .msupsub {
-  text-align: left;
-}
-.katex .mfrac > span > span {
-  text-align: center;
-}
-.katex .mfrac .frac-line {
-  display: inline-block;
-  width: 100%;
-  border-bottom-style: solid;
-}
-.katex .mfrac .frac-line,
-.katex .overline .overline-line,
-.katex .underline .underline-line,
-.katex .hline,
-.katex .hdashline,
-.katex .rule {
-  min-height: 1px;
-}
-.katex .mspace {
-  display: inline-block;
-}
-.katex .llap,
-.katex .rlap,
-.katex .clap {
-  width: 0;
-  position: relative;
-}
-.katex .llap > .inner,
-.katex .rlap > .inner,
-.katex .clap > .inner {
-  position: absolute;
-}
-.katex .llap > .fix,
-.katex .rlap > .fix,
-.katex .clap > .fix {
-  display: inline-block;
-}
-.katex .llap > .inner {
-  right: 0;
-}
-.katex .rlap > .inner,
-.katex .clap > .inner {
-  left: 0;
-}
-.katex .clap > .inner > span {
-  margin-left: -50%;
-  margin-right: 50%;
-}
-.katex .rule {
-  display: inline-block;
-  border: solid 0;
-  position: relative;
-}
-.katex .overline .overline-line,
-.katex .underline .underline-line,
-.katex .hline {
-  display: inline-block;
-  width: 100%;
-  border-bottom-style: solid;
-}
-.katex .hdashline {
-  display: inline-block;
-  width: 100%;
-  border-bottom-style: dashed;
-}
-.katex .sqrt > .root {
-  margin-left: 0.27777778em;
-  margin-right: -0.55555556em;
-}
-.katex .sizing.reset-size1.size1,
-.katex .fontsize-ensurer.reset-size1.size1 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size1.size2,
-.katex .fontsize-ensurer.reset-size1.size2 {
-  font-size: 1.2em;
-}
-.katex .sizing.reset-size1.size3,
-.katex .fontsize-ensurer.reset-size1.size3 {
-  font-size: 1.4em;
-}
-.katex .sizing.reset-size1.size4,
-.katex .fontsize-ensurer.reset-size1.size4 {
-  font-size: 1.6em;
-}
-.katex .sizing.reset-size1.size5,
-.katex .fontsize-ensurer.reset-size1.size5 {
-  font-size: 1.8em;
-}
-.katex .sizing.reset-size1.size6,
-.katex .fontsize-ensurer.reset-size1.size6 {
-  font-size: 2em;
-}
-.katex .sizing.reset-size1.size7,
-.katex .fontsize-ensurer.reset-size1.size7 {
-  font-size: 2.4em;
-}
-.katex .sizing.reset-size1.size8,
-.katex .fontsize-ensurer.reset-size1.size8 {
-  font-size: 2.88em;
-}
-.katex .sizing.reset-size1.size9,
-.katex .fontsize-ensurer.reset-size1.size9 {
-  font-size: 3.456em;
-}
-.katex .sizing.reset-size1.size10,
-.katex .fontsize-ensurer.reset-size1.size10 {
-  font-size: 4.148em;
-}
-.katex .sizing.reset-size1.size11,
-.katex .fontsize-ensurer.reset-size1.size11 {
-  font-size: 4.976em;
-}
-.katex .sizing.reset-size2.size1,
-.katex .fontsize-ensurer.reset-size2.size1 {
-  font-size: 0.83333333em;
-}
-.katex .sizing.reset-size2.size2,
-.katex .fontsize-ensurer.reset-size2.size2 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size2.size3,
-.katex .fontsize-ensurer.reset-size2.size3 {
-  font-size: 1.16666667em;
-}
-.katex .sizing.reset-size2.size4,
-.katex .fontsize-ensurer.reset-size2.size4 {
-  font-size: 1.33333333em;
-}
-.katex .sizing.reset-size2.size5,
-.katex .fontsize-ensurer.reset-size2.size5 {
-  font-size: 1.5em;
-}
-.katex .sizing.reset-size2.size6,
-.katex .fontsize-ensurer.reset-size2.size6 {
-  font-size: 1.66666667em;
-}
-.katex .sizing.reset-size2.size7,
-.katex .fontsize-ensurer.reset-size2.size7 {
-  font-size: 2em;
-}
-.katex .sizing.reset-size2.size8,
-.katex .fontsize-ensurer.reset-size2.size8 {
-  font-size: 2.4em;
-}
-.katex .sizing.reset-size2.size9,
-.katex .fontsize-ensurer.reset-size2.size9 {
-  font-size: 2.88em;
-}
-.katex .sizing.reset-size2.size10,
-.katex .fontsize-ensurer.reset-size2.size10 {
-  font-size: 3.45666667em;
-}
-.katex .sizing.reset-size2.size11,
-.katex .fontsize-ensurer.reset-size2.size11 {
-  font-size: 4.14666667em;
-}
-.katex .sizing.reset-size3.size1,
-.katex .fontsize-ensurer.reset-size3.size1 {
-  font-size: 0.71428571em;
-}
-.katex .sizing.reset-size3.size2,
-.katex .fontsize-ensurer.reset-size3.size2 {
-  font-size: 0.85714286em;
-}
-.katex .sizing.reset-size3.size3,
-.katex .fontsize-ensurer.reset-size3.size3 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size3.size4,
-.katex .fontsize-ensurer.reset-size3.size4 {
-  font-size: 1.14285714em;
-}
-.katex .sizing.reset-size3.size5,
-.katex .fontsize-ensurer.reset-size3.size5 {
-  font-size: 1.28571429em;
-}
-.katex .sizing.reset-size3.size6,
-.katex .fontsize-ensurer.reset-size3.size6 {
-  font-size: 1.42857143em;
-}
-.katex .sizing.reset-size3.size7,
-.katex .fontsize-ensurer.reset-size3.size7 {
-  font-size: 1.71428571em;
-}
-.katex .sizing.reset-size3.size8,
-.katex .fontsize-ensurer.reset-size3.size8 {
-  font-size: 2.05714286em;
-}
-.katex .sizing.reset-size3.size9,
-.katex .fontsize-ensurer.reset-size3.size9 {
-  font-size: 2.46857143em;
-}
-.katex .sizing.reset-size3.size10,
-.katex .fontsize-ensurer.reset-size3.size10 {
-  font-size: 2.96285714em;
-}
-.katex .sizing.reset-size3.size11,
-.katex .fontsize-ensurer.reset-size3.size11 {
-  font-size: 3.55428571em;
-}
-.katex .sizing.reset-size4.size1,
-.katex .fontsize-ensurer.reset-size4.size1 {
-  font-size: 0.625em;
-}
-.katex .sizing.reset-size4.size2,
-.katex .fontsize-ensurer.reset-size4.size2 {
-  font-size: 0.75em;
-}
-.katex .sizing.reset-size4.size3,
-.katex .fontsize-ensurer.reset-size4.size3 {
-  font-size: 0.875em;
-}
-.katex .sizing.reset-size4.size4,
-.katex .fontsize-ensurer.reset-size4.size4 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size4.size5,
-.katex .fontsize-ensurer.reset-size4.size5 {
-  font-size: 1.125em;
-}
-.katex .sizing.reset-size4.size6,
-.katex .fontsize-ensurer.reset-size4.size6 {
-  font-size: 1.25em;
-}
-.katex .sizing.reset-size4.size7,
-.katex .fontsize-ensurer.reset-size4.size7 {
-  font-size: 1.5em;
-}
-.katex .sizing.reset-size4.size8,
-.katex .fontsize-ensurer.reset-size4.size8 {
-  font-size: 1.8em;
-}
-.katex .sizing.reset-size4.size9,
-.katex .fontsize-ensurer.reset-size4.size9 {
-  font-size: 2.16em;
-}
-.katex .sizing.reset-size4.size10,
-.katex .fontsize-ensurer.reset-size4.size10 {
-  font-size: 2.5925em;
-}
-.katex .sizing.reset-size4.size11,
-.katex .fontsize-ensurer.reset-size4.size11 {
-  font-size: 3.11em;
-}
-.katex .sizing.reset-size5.size1,
-.katex .fontsize-ensurer.reset-size5.size1 {
-  font-size: 0.55555556em;
-}
-.katex .sizing.reset-size5.size2,
-.katex .fontsize-ensurer.reset-size5.size2 {
-  font-size: 0.66666667em;
-}
-.katex .sizing.reset-size5.size3,
-.katex .fontsize-ensurer.reset-size5.size3 {
-  font-size: 0.77777778em;
-}
-.katex .sizing.reset-size5.size4,
-.katex .fontsize-ensurer.reset-size5.size4 {
-  font-size: 0.88888889em;
-}
-.katex .sizing.reset-size5.size5,
-.katex .fontsize-ensurer.reset-size5.size5 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size5.size6,
-.katex .fontsize-ensurer.reset-size5.size6 {
-  font-size: 1.11111111em;
-}
-.katex .sizing.reset-size5.size7,
-.katex .fontsize-ensurer.reset-size5.size7 {
-  font-size: 1.33333333em;
-}
-.katex .sizing.reset-size5.size8,
-.katex .fontsize-ensurer.reset-size5.size8 {
-  font-size: 1.6em;
-}
-.katex .sizing.reset-size5.size9,
-.katex .fontsize-ensurer.reset-size5.size9 {
-  font-size: 1.92em;
-}
-.katex .sizing.reset-size5.size10,
-.katex .fontsize-ensurer.reset-size5.size10 {
-  font-size: 2.30444444em;
-}
-.katex .sizing.reset-size5.size11,
-.katex .fontsize-ensurer.reset-size5.size11 {
-  font-size: 2.76444444em;
-}
-.katex .sizing.reset-size6.size1,
-.katex .fontsize-ensurer.reset-size6.size1 {
-  font-size: 0.5em;
-}
-.katex .sizing.reset-size6.size2,
-.katex .fontsize-ensurer.reset-size6.size2 {
-  font-size: 0.6em;
-}
-.katex .sizing.reset-size6.size3,
-.katex .fontsize-ensurer.reset-size6.size3 {
-  font-size: 0.7em;
-}
-.katex .sizing.reset-size6.size4,
-.katex .fontsize-ensurer.reset-size6.size4 {
-  font-size: 0.8em;
-}
-.katex .sizing.reset-size6.size5,
-.katex .fontsize-ensurer.reset-size6.size5 {
-  font-size: 0.9em;
-}
-.katex .sizing.reset-size6.size6,
-.katex .fontsize-ensurer.reset-size6.size6 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size6.size7,
-.katex .fontsize-ensurer.reset-size6.size7 {
-  font-size: 1.2em;
-}
-.katex .sizing.reset-size6.size8,
-.katex .fontsize-ensurer.reset-size6.size8 {
-  font-size: 1.44em;
-}
-.katex .sizing.reset-size6.size9,
-.katex .fontsize-ensurer.reset-size6.size9 {
-  font-size: 1.728em;
-}
-.katex .sizing.reset-size6.size10,
-.katex .fontsize-ensurer.reset-size6.size10 {
-  font-size: 2.074em;
-}
-.katex .sizing.reset-size6.size11,
-.katex .fontsize-ensurer.reset-size6.size11 {
-  font-size: 2.488em;
-}
-.katex .sizing.reset-size7.size1,
-.katex .fontsize-ensurer.reset-size7.size1 {
-  font-size: 0.41666667em;
-}
-.katex .sizing.reset-size7.size2,
-.katex .fontsize-ensurer.reset-size7.size2 {
-  font-size: 0.5em;
-}
-.katex .sizing.reset-size7.size3,
-.katex .fontsize-ensurer.reset-size7.size3 {
-  font-size: 0.58333333em;
-}
-.katex .sizing.reset-size7.size4,
-.katex .fontsize-ensurer.reset-size7.size4 {
-  font-size: 0.66666667em;
-}
-.katex .sizing.reset-size7.size5,
-.katex .fontsize-ensurer.reset-size7.size5 {
-  font-size: 0.75em;
-}
-.katex .sizing.reset-size7.size6,
-.katex .fontsize-ensurer.reset-size7.size6 {
-  font-size: 0.83333333em;
-}
-.katex .sizing.reset-size7.size7,
-.katex .fontsize-ensurer.reset-size7.size7 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size7.size8,
-.katex .fontsize-ensurer.reset-size7.size8 {
-  font-size: 1.2em;
-}
-.katex .sizing.reset-size7.size9,
-.katex .fontsize-ensurer.reset-size7.size9 {
-  font-size: 1.44em;
-}
-.katex .sizing.reset-size7.size10,
-.katex .fontsize-ensurer.reset-size7.size10 {
-  font-size: 1.72833333em;
-}
-.katex .sizing.reset-size7.size11,
-.katex .fontsize-ensurer.reset-size7.size11 {
-  font-size: 2.07333333em;
-}
-.katex .sizing.reset-size8.size1,
-.katex .fontsize-ensurer.reset-size8.size1 {
-  font-size: 0.34722222em;
-}
-.katex .sizing.reset-size8.size2,
-.katex .fontsize-ensurer.reset-size8.size2 {
-  font-size: 0.41666667em;
-}
-.katex .sizing.reset-size8.size3,
-.katex .fontsize-ensurer.reset-size8.size3 {
-  font-size: 0.48611111em;
-}
-.katex .sizing.reset-size8.size4,
-.katex .fontsize-ensurer.reset-size8.size4 {
-  font-size: 0.55555556em;
-}
-.katex .sizing.reset-size8.size5,
-.katex .fontsize-ensurer.reset-size8.size5 {
-  font-size: 0.625em;
-}
-.katex .sizing.reset-size8.size6,
-.katex .fontsize-ensurer.reset-size8.size6 {
-  font-size: 0.69444444em;
-}
-.katex .sizing.reset-size8.size7,
-.katex .fontsize-ensurer.reset-size8.size7 {
-  font-size: 0.83333333em;
-}
-.katex .sizing.reset-size8.size8,
-.katex .fontsize-ensurer.reset-size8.size8 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size8.size9,
-.katex .fontsize-ensurer.reset-size8.size9 {
-  font-size: 1.2em;
-}
-.katex .sizing.reset-size8.size10,
-.katex .fontsize-ensurer.reset-size8.size10 {
-  font-size: 1.44027778em;
-}
-.katex .sizing.reset-size8.size11,
-.katex .fontsize-ensurer.reset-size8.size11 {
-  font-size: 1.72777778em;
-}
-.katex .sizing.reset-size9.size1,
-.katex .fontsize-ensurer.reset-size9.size1 {
-  font-size: 0.28935185em;
-}
-.katex .sizing.reset-size9.size2,
-.katex .fontsize-ensurer.reset-size9.size2 {
-  font-size: 0.34722222em;
-}
-.katex .sizing.reset-size9.size3,
-.katex .fontsize-ensurer.reset-size9.size3 {
-  font-size: 0.40509259em;
-}
-.katex .sizing.reset-size9.size4,
-.katex .fontsize-ensurer.reset-size9.size4 {
-  font-size: 0.46296296em;
-}
-.katex .sizing.reset-size9.size5,
-.katex .fontsize-ensurer.reset-size9.size5 {
-  font-size: 0.52083333em;
-}
-.katex .sizing.reset-size9.size6,
-.katex .fontsize-ensurer.reset-size9.size6 {
-  font-size: 0.5787037em;
-}
-.katex .sizing.reset-size9.size7,
-.katex .fontsize-ensurer.reset-size9.size7 {
-  font-size: 0.69444444em;
-}
-.katex .sizing.reset-size9.size8,
-.katex .fontsize-ensurer.reset-size9.size8 {
-  font-size: 0.83333333em;
-}
-.katex .sizing.reset-size9.size9,
-.katex .fontsize-ensurer.reset-size9.size9 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size9.size10,
-.katex .fontsize-ensurer.reset-size9.size10 {
-  font-size: 1.20023148em;
-}
-.katex .sizing.reset-size9.size11,
-.katex .fontsize-ensurer.reset-size9.size11 {
-  font-size: 1.43981481em;
-}
-.katex .sizing.reset-size10.size1,
-.katex .fontsize-ensurer.reset-size10.size1 {
-  font-size: 0.24108004em;
-}
-.katex .sizing.reset-size10.size2,
-.katex .fontsize-ensurer.reset-size10.size2 {
-  font-size: 0.28929605em;
-}
-.katex .sizing.reset-size10.size3,
-.katex .fontsize-ensurer.reset-size10.size3 {
-  font-size: 0.33751205em;
-}
-.katex .sizing.reset-size10.size4,
-.katex .fontsize-ensurer.reset-size10.size4 {
-  font-size: 0.38572806em;
-}
-.katex .sizing.reset-size10.size5,
-.katex .fontsize-ensurer.reset-size10.size5 {
-  font-size: 0.43394407em;
-}
-.katex .sizing.reset-size10.size6,
-.katex .fontsize-ensurer.reset-size10.size6 {
-  font-size: 0.48216008em;
-}
-.katex .sizing.reset-size10.size7,
-.katex .fontsize-ensurer.reset-size10.size7 {
-  font-size: 0.57859209em;
-}
-.katex .sizing.reset-size10.size8,
-.katex .fontsize-ensurer.reset-size10.size8 {
-  font-size: 0.69431051em;
-}
-.katex .sizing.reset-size10.size9,
-.katex .fontsize-ensurer.reset-size10.size9 {
-  font-size: 0.83317261em;
-}
-.katex .sizing.reset-size10.size10,
-.katex .fontsize-ensurer.reset-size10.size10 {
-  font-size: 1em;
-}
-.katex .sizing.reset-size10.size11,
-.katex .fontsize-ensurer.reset-size10.size11 {
-  font-size: 1.19961427em;
-}
-.katex .sizing.reset-size11.size1,
-.katex .fontsize-ensurer.reset-size11.size1 {
-  font-size: 0.20096463em;
-}
-.katex .sizing.reset-size11.size2,
-.katex .fontsize-ensurer.reset-size11.size2 {
-  font-size: 0.24115756em;
-}
-.katex .sizing.reset-size11.size3,
-.katex .fontsize-ensurer.reset-size11.size3 {
-  font-size: 0.28135048em;
-}
-.katex .sizing.reset-size11.size4,
-.katex .fontsize-ensurer.reset-size11.size4 {
-  font-size: 0.32154341em;
-}
-.katex .sizing.reset-size11.size5,
-.katex .fontsize-ensurer.reset-size11.size5 {
-  font-size: 0.36173633em;
-}
-.katex .sizing.reset-size11.size6,
-.katex .fontsize-ensurer.reset-size11.size6 {
-  font-size: 0.40192926em;
-}
-.katex .sizing.reset-size11.size7,
-.katex .fontsize-ensurer.reset-size11.size7 {
-  font-size: 0.48231511em;
-}
-.katex .sizing.reset-size11.size8,
-.katex .fontsize-ensurer.reset-size11.size8 {
-  font-size: 0.57877814em;
-}
-.katex .sizing.reset-size11.size9,
-.katex .fontsize-ensurer.reset-size11.size9 {
-  font-size: 0.69453376em;
-}
-.katex .sizing.reset-size11.size10,
-.katex .fontsize-ensurer.reset-size11.size10 {
-  font-size: 0.83360129em;
-}
-.katex .sizing.reset-size11.size11,
-.katex .fontsize-ensurer.reset-size11.size11 {
-  font-size: 1em;
-}
-.katex .delimsizing.size1 {
-  font-family: KaTeX_Size1;
-}
-.katex .delimsizing.size2 {
-  font-family: KaTeX_Size2;
-}
-.katex .delimsizing.size3 {
-  font-family: KaTeX_Size3;
-}
-.katex .delimsizing.size4 {
-  font-family: KaTeX_Size4;
-}
-.katex .delimsizing.mult .delim-size1 > span {
-  font-family: KaTeX_Size1;
-}
-.katex .delimsizing.mult .delim-size4 > span {
-  font-family: KaTeX_Size4;
-}
-.katex .nulldelimiter {
-  display: inline-block;
-  width: 0.12em;
-}
-.katex .delimcenter {
-  position: relative;
-}
-.katex .op-symbol {
-  position: relative;
-}
-.katex .op-symbol.small-op {
-  font-family: KaTeX_Size1;
-}
-.katex .op-symbol.large-op {
-  font-family: KaTeX_Size2;
-}
-.katex .op-limits > .vlist-t {
-  text-align: center;
-}
-.katex .accent > .vlist-t {
-  text-align: center;
-}
-.katex .accent .accent-body {
-  position: relative;
-}
-.katex .accent .accent-body:not(.accent-full) {
-  width: 0;
-}
-.katex .overlay {
-  display: block;
-}
-.katex .mtable .vertical-separator {
-  display: inline-block;
-  min-width: 1px;
-}
-.katex .mtable .arraycolsep {
-  display: inline-block;
-}
-.katex .mtable .col-align-c > .vlist-t {
-  text-align: center;
-}
-.katex .mtable .col-align-l > .vlist-t {
-  text-align: left;
-}
-.katex .mtable .col-align-r > .vlist-t {
-  text-align: right;
-}
-.katex .svg-align {
-  text-align: left;
-}
-.katex svg {
-  display: block;
-  position: absolute;
-  width: 100%;
-  height: inherit;
-  fill: currentColor;
-  stroke: currentColor;
-  fill-rule: nonzero;
-  fill-opacity: 1;
-  stroke-width: 1;
-  stroke-linecap: butt;
-  stroke-linejoin: miter;
-  stroke-miterlimit: 4;
-  stroke-dasharray: none;
-  stroke-dashoffset: 0;
-  stroke-opacity: 1;
-}
-.katex svg path {
-  stroke: none;
-}
-.katex img {
-  border-style: none;
-  min-width: 0;
-  min-height: 0;
-  max-width: none;
-  max-height: none;
-}
-.katex .stretchy {
-  width: 100%;
-  display: block;
-  position: relative;
-  overflow: hidden;
-}
-.katex .stretchy::before,
-.katex .stretchy::after {
-  content: "";
-}
-.katex .hide-tail {
-  width: 100%;
-  position: relative;
-  overflow: hidden;
-}
-.katex .halfarrow-left {
-  position: absolute;
-  left: 0;
-  width: 50.2%;
-  overflow: hidden;
-}
-.katex .halfarrow-right {
-  position: absolute;
-  right: 0;
-  width: 50.2%;
-  overflow: hidden;
-}
-.katex .brace-left {
-  position: absolute;
-  left: 0;
-  width: 25.1%;
-  overflow: hidden;
-}
-.katex .brace-center {
-  position: absolute;
-  left: 25%;
-  width: 50%;
-  overflow: hidden;
-}
-.katex .brace-right {
-  position: absolute;
-  right: 0;
-  width: 25.1%;
-  overflow: hidden;
-}
-.katex .x-arrow-pad {
-  padding: 0 0.5em;
-}
-.katex .x-arrow,
-.katex .mover,
-.katex .munder {
-  text-align: center;
-}
-.katex .boxpad {
-  padding: 0 0.3em 0 0.3em;
-}
-.katex .fbox,
-.katex .fcolorbox {
-  box-sizing: border-box;
-  border: 0.04em solid;
-}
-.katex .cancel-pad {
-  padding: 0 0.2em 0 0.2em;
-}
-.katex .cancel-lap {
-  margin-left: -0.2em;
-  margin-right: -0.2em;
-}
-.katex .sout {
-  border-bottom-style: solid;
-  border-bottom-width: 0.08em;
-}
-.katex-display {
-  display: block;
-  margin: 1em 0;
-  text-align: center;
-}
-.katex-display > .katex {
-  display: block;
-  text-align: center;
-  white-space: nowrap;
-}
-.katex-display > .katex > .katex-html {
-  display: block;
-  position: relative;
-}
-.katex-display > .katex > .katex-html > .tag {
-  position: absolute;
-  right: 0;
-}
-.katex-display.leqno > .katex > .katex-html > .tag {
-  left: 0;
-  right: auto;
-}
-.katex-display.fleqn > .katex {
-  text-align: left;
-}
-
diff --git a/registry/vulkan/katex/katex.js b/registry/vulkan/katex/katex.js
deleted file mode 100644
index 2aa2c91..0000000
--- a/registry/vulkan/katex/katex.js
+++ /dev/null
@@ -1,17425 +0,0 @@
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory();
-	else if(typeof define === 'function' && define.amd)
-		define([], factory);
-	else if(typeof exports === 'object')
-		exports["katex"] = factory();
-	else
-		root["katex"] = factory();
-})((typeof self !== 'undefined' ? self : this), function() {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// define __esModule on exports
-/******/ 	__webpack_require__.r = function(exports) {
-/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
-/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
-/******/ 		}
-/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
-/******/ 	};
-/******/
-/******/ 	// create a fake namespace object
-/******/ 	// mode & 1: value is a module id, require it
-/******/ 	// mode & 2: merge all properties of value into the ns
-/******/ 	// mode & 4: return value when already ns object
-/******/ 	// mode & 8|1: behave like require
-/******/ 	__webpack_require__.t = function(value, mode) {
-/******/ 		if(mode & 1) value = __webpack_require__(value);
-/******/ 		if(mode & 8) return value;
-/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
-/******/ 		var ns = Object.create(null);
-/******/ 		__webpack_require__.r(ns);
-/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
-/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
-/******/ 		return ns;
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "";
-/******/
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 1);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports, __webpack_require__) {
-
-// extracted by mini-css-extract-plugin
-
-/***/ }),
-/* 1 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-
-// EXTERNAL MODULE: ./src/katex.less
-var katex = __webpack_require__(0);
-
-// CONCATENATED MODULE: ./src/SourceLocation.js
-/**
- * Lexing or parsing positional information for error reporting.
- * This object is immutable.
- */
-var SourceLocation =
-/*#__PURE__*/
-function () {
-  // The + prefix indicates that these fields aren't writeable
-  // Lexer holding the input string.
-  // Start offset, zero-based inclusive.
-  // End offset, zero-based exclusive.
-  function SourceLocation(lexer, start, end) {
-    this.lexer = void 0;
-    this.start = void 0;
-    this.end = void 0;
-    this.lexer = lexer;
-    this.start = start;
-    this.end = end;
-  }
-  /**
-   * Merges two `SourceLocation`s from location providers, given they are
-   * provided in order of appearance.
-   * - Returns the first one's location if only the first is provided.
-   * - Returns a merged range of the first and the last if both are provided
-   *   and their lexers match.
-   * - Otherwise, returns null.
-   */
-
-
-  SourceLocation.range = function range(first, second) {
-    if (!second) {
-      return first && first.loc;
-    } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) {
-      return null;
-    } else {
-      return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end);
-    }
-  };
-
-  return SourceLocation;
-}();
-
-
-// CONCATENATED MODULE: ./src/Token.js
-
-/**
- * Interface required to break circular dependency between Token, Lexer, and
- * ParseError.
- */
-
-/**
- * The resulting token returned from `lex`.
- *
- * It consists of the token text plus some position information.
- * The position information is essentially a range in an input string,
- * but instead of referencing the bare input string, we refer to the lexer.
- * That way it is possible to attach extra metadata to the input string,
- * like for example a file name or similar.
- *
- * The position information is optional, so it is OK to construct synthetic
- * tokens if appropriate. Not providing available position information may
- * lead to degraded error reporting, though.
- */
-var Token_Token =
-/*#__PURE__*/
-function () {
-  function Token(text, // the text of this token
-  loc) {
-    this.text = void 0;
-    this.loc = void 0;
-    this.text = text;
-    this.loc = loc;
-  }
-  /**
-   * Given a pair of tokens (this and endToken), compute a `Token` encompassing
-   * the whole input range enclosed by these two.
-   */
-
-
-  var _proto = Token.prototype;
-
-  _proto.range = function range(endToken, // last token of the range, inclusive
-  text) // the text of the newly constructed token
-  {
-    return new Token(text, SourceLocation.range(this, endToken));
-  };
-
-  return Token;
-}();
-// CONCATENATED MODULE: ./src/ParseError.js
-
-
-/**
- * This is the ParseError class, which is the main error thrown by KaTeX
- * functions when something has gone wrong. This is used to distinguish internal
- * errors from errors in the expression that the user provided.
- *
- * If possible, a caller should provide a Token or ParseNode with information
- * about where in the source string the problem occurred.
- */
-var ParseError = // Error position based on passed-in Token or ParseNode.
-function ParseError(message, // The error message
-token) // An object providing position information
-{
-  this.position = void 0;
-  var error = "KaTeX parse error: " + message;
-  var start;
-  var loc = token && token.loc;
-
-  if (loc && loc.start <= loc.end) {
-    // If we have the input and a position, make the error a bit fancier
-    // Get the input
-    var input = loc.lexer.input; // Prepend some information
-
-    start = loc.start;
-    var end = loc.end;
-
-    if (start === input.length) {
-      error += " at end of input: ";
-    } else {
-      error += " at position " + (start + 1) + ": ";
-    } // Underline token in question using combining underscores
-
-
-    var underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332"); // Extract some context from the input and add it to the error
-
-    var left;
-
-    if (start > 15) {
-      left = "…" + input.slice(start - 15, start);
-    } else {
-      left = input.slice(0, start);
-    }
-
-    var right;
-
-    if (end + 15 < input.length) {
-      right = input.slice(end, end + 15) + "…";
-    } else {
-      right = input.slice(end);
-    }
-
-    error += left + underlined + right;
-  } // Some hackery to make ParseError a prototype of Error
-  // See http://stackoverflow.com/a/8460753
-
-
-  var self = new Error(error);
-  self.name = "ParseError"; // $FlowFixMe
-
-  self.__proto__ = ParseError.prototype; // $FlowFixMe
-
-  self.position = start;
-  return self;
-}; // $FlowFixMe More hackery
-
-
-ParseError.prototype.__proto__ = Error.prototype;
-/* harmony default export */ var src_ParseError = (ParseError);
-// CONCATENATED MODULE: ./src/utils.js
-/**
- * This file contains a list of utility functions which are useful in other
- * files.
- */
-
-/**
- * Return whether an element is contained in a list
- */
-var contains = function contains(list, elem) {
-  return list.indexOf(elem) !== -1;
-};
-/**
- * Provide a default value if a setting is undefined
- * NOTE: Couldn't use `T` as the output type due to facebook/flow#5022.
- */
-
-
-var deflt = function deflt(setting, defaultIfUndefined) {
-  return setting === undefined ? defaultIfUndefined : setting;
-}; // hyphenate and escape adapted from Facebook's React under Apache 2 license
-
-
-var uppercase = /([A-Z])/g;
-
-var hyphenate = function hyphenate(str) {
-  return str.replace(uppercase, "-$1").toLowerCase();
-};
-
-var ESCAPE_LOOKUP = {
-  "&": "&amp;",
-  ">": "&gt;",
-  "<": "&lt;",
-  "\"": "&quot;",
-  "'": "&#x27;"
-};
-var ESCAPE_REGEX = /[&><"']/g;
-/**
- * Escapes text to prevent scripting attacks.
- */
-
-function utils_escape(text) {
-  return String(text).replace(ESCAPE_REGEX, function (match) {
-    return ESCAPE_LOOKUP[match];
-  });
-}
-/**
- * Sometimes we want to pull out the innermost element of a group. In most
- * cases, this will just be the group itself, but when ordgroups and colors have
- * a single element, we want to pull that out.
- */
-
-
-var getBaseElem = function getBaseElem(group) {
-  if (group.type === "ordgroup") {
-    if (group.body.length === 1) {
-      return getBaseElem(group.body[0]);
-    } else {
-      return group;
-    }
-  } else if (group.type === "color") {
-    if (group.body.length === 1) {
-      return getBaseElem(group.body[0]);
-    } else {
-      return group;
-    }
-  } else if (group.type === "font") {
-    return getBaseElem(group.body);
-  } else {
-    return group;
-  }
-};
-/**
- * TeXbook algorithms often reference "character boxes", which are simply groups
- * with a single character in them. To decide if something is a character box,
- * we find its innermost group, and see if it is a single character.
- */
-
-
-var utils_isCharacterBox = function isCharacterBox(group) {
-  var baseElem = getBaseElem(group); // These are all they types of groups which hold single characters
-
-  return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "atom";
-};
-
-var assert = function assert(value) {
-  if (!value) {
-    throw new Error('Expected non-null, but got ' + String(value));
-  }
-
-  return value;
-};
-/**
- * Return the protocol of a URL, or "_relative" if the URL does not specify a
- * protocol (and thus is relative).
- */
-
-var protocolFromUrl = function protocolFromUrl(url) {
-  var protocol = /^\s*([^\\/#]*?)(?::|&#0*58|&#x0*3a)/i.exec(url);
-  return protocol != null ? protocol[1] : "_relative";
-};
-/* harmony default export */ var utils = ({
-  contains: contains,
-  deflt: deflt,
-  escape: utils_escape,
-  hyphenate: hyphenate,
-  getBaseElem: getBaseElem,
-  isCharacterBox: utils_isCharacterBox,
-  protocolFromUrl: protocolFromUrl
-});
-// CONCATENATED MODULE: ./src/Settings.js
-/* eslint no-console:0 */
-
-/**
- * This is a module for storing settings passed into KaTeX. It correctly handles
- * default settings.
- */
-
-
-
-
-/**
- * The main Settings object
- *
- * The current options stored are:
- *  - displayMode: Whether the expression should be typeset as inline math
- *                 (false, the default), meaning that the math starts in
- *                 \textstyle and is placed in an inline-block); or as display
- *                 math (true), meaning that the math starts in \displaystyle
- *                 and is placed in a block with vertical margin.
- */
-var Settings_Settings =
-/*#__PURE__*/
-function () {
-  function Settings(options) {
-    this.displayMode = void 0;
-    this.output = void 0;
-    this.leqno = void 0;
-    this.fleqn = void 0;
-    this.throwOnError = void 0;
-    this.errorColor = void 0;
-    this.macros = void 0;
-    this.minRuleThickness = void 0;
-    this.colorIsTextColor = void 0;
-    this.strict = void 0;
-    this.trust = void 0;
-    this.maxSize = void 0;
-    this.maxExpand = void 0;
-    // allow null options
-    options = options || {};
-    this.displayMode = utils.deflt(options.displayMode, false);
-    this.output = utils.deflt(options.output, "htmlAndMathml");
-    this.leqno = utils.deflt(options.leqno, false);
-    this.fleqn = utils.deflt(options.fleqn, false);
-    this.throwOnError = utils.deflt(options.throwOnError, true);
-    this.errorColor = utils.deflt(options.errorColor, "#cc0000");
-    this.macros = options.macros || {};
-    this.minRuleThickness = Math.max(0, utils.deflt(options.minRuleThickness, 0));
-    this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false);
-    this.strict = utils.deflt(options.strict, "warn");
-    this.trust = utils.deflt(options.trust, false);
-    this.maxSize = Math.max(0, utils.deflt(options.maxSize, Infinity));
-    this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000));
-  }
-  /**
-   * Report nonstrict (non-LaTeX-compatible) input.
-   * Can safely not be called if `this.strict` is false in JavaScript.
-   */
-
-
-  var _proto = Settings.prototype;
-
-  _proto.reportNonstrict = function reportNonstrict(errorCode, errorMsg, token) {
-    var strict = this.strict;
-
-    if (typeof strict === "function") {
-      // Allow return value of strict function to be boolean or string
-      // (or null/undefined, meaning no further processing).
-      strict = strict(errorCode, errorMsg, token);
-    }
-
-    if (!strict || strict === "ignore") {
-      return;
-    } else if (strict === true || strict === "error") {
-      throw new src_ParseError("LaTeX-incompatible input and strict mode is set to 'error': " + (errorMsg + " [" + errorCode + "]"), token);
-    } else if (strict === "warn") {
-      typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (errorMsg + " [" + errorCode + "]"));
-    } else {
-      // won't happen in type-safe code
-      typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]"));
-    }
-  }
-  /**
-   * Check whether to apply strict (LaTeX-adhering) behavior for unusual
-   * input (like `\\`).  Unlike `nonstrict`, will not throw an error;
-   * instead, "error" translates to a return value of `true`, while "ignore"
-   * translates to a return value of `false`.  May still print a warning:
-   * "warn" prints a warning and returns `false`.
-   * This is for the second category of `errorCode`s listed in the README.
-   */
-  ;
-
-  _proto.useStrictBehavior = function useStrictBehavior(errorCode, errorMsg, token) {
-    var strict = this.strict;
-
-    if (typeof strict === "function") {
-      // Allow return value of strict function to be boolean or string
-      // (or null/undefined, meaning no further processing).
-      // But catch any exceptions thrown by function, treating them
-      // like "error".
-      try {
-        strict = strict(errorCode, errorMsg, token);
-      } catch (error) {
-        strict = "error";
-      }
-    }
-
-    if (!strict || strict === "ignore") {
-      return false;
-    } else if (strict === true || strict === "error") {
-      return true;
-    } else if (strict === "warn") {
-      typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (errorMsg + " [" + errorCode + "]"));
-      return false;
-    } else {
-      // won't happen in type-safe code
-      typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]"));
-      return false;
-    }
-  }
-  /**
-   * Check whether to test potentially dangerous input, and return
-   * `true` (trusted) or `false` (untrusted).  The sole argument `context`
-   * should be an object with `command` field specifying the relevant LaTeX
-   * command (as a string starting with `\`), and any other arguments, etc.
-   * If `context` has a `url` field, a `protocol` field will automatically
-   * get added by this function (changing the specified object).
-   */
-  ;
-
-  _proto.isTrusted = function isTrusted(context) {
-    if (context.url && !context.protocol) {
-      context.protocol = utils.protocolFromUrl(context.url);
-    }
-
-    var trust = typeof this.trust === "function" ? this.trust(context) : this.trust;
-    return Boolean(trust);
-  };
-
-  return Settings;
-}();
-
-
-// CONCATENATED MODULE: ./src/Style.js
-/**
- * This file contains information and classes for the various kinds of styles
- * used in TeX. It provides a generic `Style` class, which holds information
- * about a specific style. It then provides instances of all the different kinds
- * of styles possible, and provides functions to move between them and get
- * information about them.
- */
-
-/**
- * The main style class. Contains a unique id for the style, a size (which is
- * the same for cramped and uncramped version of a style), and a cramped flag.
- */
-var Style =
-/*#__PURE__*/
-function () {
-  function Style(id, size, cramped) {
-    this.id = void 0;
-    this.size = void 0;
-    this.cramped = void 0;
-    this.id = id;
-    this.size = size;
-    this.cramped = cramped;
-  }
-  /**
-   * Get the style of a superscript given a base in the current style.
-   */
-
-
-  var _proto = Style.prototype;
-
-  _proto.sup = function sup() {
-    return Style_styles[_sup[this.id]];
-  }
-  /**
-   * Get the style of a subscript given a base in the current style.
-   */
-  ;
-
-  _proto.sub = function sub() {
-    return Style_styles[_sub[this.id]];
-  }
-  /**
-   * Get the style of a fraction numerator given the fraction in the current
-   * style.
-   */
-  ;
-
-  _proto.fracNum = function fracNum() {
-    return Style_styles[_fracNum[this.id]];
-  }
-  /**
-   * Get the style of a fraction denominator given the fraction in the current
-   * style.
-   */
-  ;
-
-  _proto.fracDen = function fracDen() {
-    return Style_styles[_fracDen[this.id]];
-  }
-  /**
-   * Get the cramped version of a style (in particular, cramping a cramped style
-   * doesn't change the style).
-   */
-  ;
-
-  _proto.cramp = function cramp() {
-    return Style_styles[_cramp[this.id]];
-  }
-  /**
-   * Get a text or display version of this style.
-   */
-  ;
-
-  _proto.text = function text() {
-    return Style_styles[_text[this.id]];
-  }
-  /**
-   * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle)
-   */
-  ;
-
-  _proto.isTight = function isTight() {
-    return this.size >= 2;
-  };
-
-  return Style;
-}(); // Export an interface for type checking, but don't expose the implementation.
-// This way, no more styles can be generated.
-
-
-// IDs of the different styles
-var D = 0;
-var Dc = 1;
-var T = 2;
-var Tc = 3;
-var S = 4;
-var Sc = 5;
-var SS = 6;
-var SSc = 7; // Instances of the different styles
-
-var Style_styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)]; // Lookup tables for switching from one style to another
-
-var _sup = [S, Sc, S, Sc, SS, SSc, SS, SSc];
-var _sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc];
-var _fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc];
-var _fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc];
-var _cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc];
-var _text = [D, Dc, T, Tc, T, Tc, T, Tc]; // We only export some of the styles.
-
-/* harmony default export */ var src_Style = ({
-  DISPLAY: Style_styles[D],
-  TEXT: Style_styles[T],
-  SCRIPT: Style_styles[S],
-  SCRIPTSCRIPT: Style_styles[SS]
-});
-// CONCATENATED MODULE: ./src/unicodeScripts.js
-/*
- * This file defines the Unicode scripts and script families that we
- * support. To add new scripts or families, just add a new entry to the
- * scriptData array below. Adding scripts to the scriptData array allows
- * characters from that script to appear in \text{} environments.
- */
-
-/**
- * Each script or script family has a name and an array of blocks.
- * Each block is an array of two numbers which specify the start and
- * end points (inclusive) of a block of Unicode codepoints.
- */
-
-/**
- * Unicode block data for the families of scripts we support in \text{}.
- * Scripts only need to appear here if they do not have font metrics.
- */
-var scriptData = [{
-  // Latin characters beyond the Latin-1 characters we have metrics for.
-  // Needed for Czech, Hungarian and Turkish text, for example.
-  name: 'latin',
-  blocks: [[0x0100, 0x024f], // Latin Extended-A and Latin Extended-B
-  [0x0300, 0x036f]]
-}, {
-  // The Cyrillic script used by Russian and related languages.
-  // A Cyrillic subset used to be supported as explicitly defined
-  // symbols in symbols.js
-  name: 'cyrillic',
-  blocks: [[0x0400, 0x04ff]]
-}, {
-  // The Brahmic scripts of South and Southeast Asia
-  // Devanagari (0900–097F)
-  // Bengali (0980–09FF)
-  // Gurmukhi (0A00–0A7F)
-  // Gujarati (0A80–0AFF)
-  // Oriya (0B00–0B7F)
-  // Tamil (0B80–0BFF)
-  // Telugu (0C00–0C7F)
-  // Kannada (0C80–0CFF)
-  // Malayalam (0D00–0D7F)
-  // Sinhala (0D80–0DFF)
-  // Thai (0E00–0E7F)
-  // Lao (0E80–0EFF)
-  // Tibetan (0F00–0FFF)
-  // Myanmar (1000–109F)
-  name: 'brahmic',
-  blocks: [[0x0900, 0x109F]]
-}, {
-  name: 'georgian',
-  blocks: [[0x10A0, 0x10ff]]
-}, {
-  // Chinese and Japanese.
-  // The "k" in cjk is for Korean, but we've separated Korean out
-  name: "cjk",
-  blocks: [[0x3000, 0x30FF], // CJK symbols and punctuation, Hiragana, Katakana
-  [0x4E00, 0x9FAF], // CJK ideograms
-  [0xFF00, 0xFF60]]
-}, {
-  // Korean
-  name: 'hangul',
-  blocks: [[0xAC00, 0xD7AF]]
-}];
-/**
- * Given a codepoint, return the name of the script or script family
- * it is from, or null if it is not part of a known block
- */
-
-function scriptFromCodepoint(codepoint) {
-  for (var i = 0; i < scriptData.length; i++) {
-    var script = scriptData[i];
-
-    for (var _i = 0; _i < script.blocks.length; _i++) {
-      var block = script.blocks[_i];
-
-      if (codepoint >= block[0] && codepoint <= block[1]) {
-        return script.name;
-      }
-    }
-  }
-
-  return null;
-}
-/**
- * A flattened version of all the supported blocks in a single array.
- * This is an optimization to make supportedCodepoint() fast.
- */
-
-var allBlocks = [];
-scriptData.forEach(function (s) {
-  return s.blocks.forEach(function (b) {
-    return allBlocks.push.apply(allBlocks, b);
-  });
-});
-/**
- * Given a codepoint, return true if it falls within one of the
- * scripts or script families defined above and false otherwise.
- *
- * Micro benchmarks shows that this is faster than
- * /[\u3000-\u30FF\u4E00-\u9FAF\uFF00-\uFF60\uAC00-\uD7AF\u0900-\u109F]/.test()
- * in Firefox, Chrome and Node.
- */
-
-function supportedCodepoint(codepoint) {
-  for (var i = 0; i < allBlocks.length; i += 2) {
-    if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) {
-      return true;
-    }
-  }
-
-  return false;
-}
-// CONCATENATED MODULE: ./src/svgGeometry.js
-/**
- * This file provides support to domTree.js and delimiter.js.
- * It's a storehouse of path geometry for SVG images.
- */
-// In all paths below, the viewBox-to-em scale is 1000:1.
-var hLinePad = 80; // padding above a sqrt viniculum. Prevents image cropping.
-// The viniculum of a \sqrt can be made thicker by a KaTeX rendering option.
-// Think of variable extraViniculum as two detours in the SVG path.
-// The detour begins at the lower left of the area labeled extraViniculum below.
-// The detour proceeds one extraViniculum distance up and slightly to the right,
-// displacing the radiused corner between surd and viniculum. The radius is
-// traversed as usual, then the detour resumes. It goes right, to the end of
-// the very long viniculumn, then down one extraViniculum distance,
-// after which it resumes regular path geometry for the radical.
-
-/*                                                  viniculum
-                                                   /
-         /▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒←extraViniculum
-        / █████████████████████←0.04em (40 unit) std viniculum thickness
-       / /
-      / /
-     / /\
-    / / surd
-*/
-
-var sqrtMain = function sqrtMain(extraViniculum, hLinePad) {
-  // sqrtMain path geometry is from glyph U221A in the font KaTeX Main
-  return "M95," + (622 + extraViniculum + hLinePad) + "\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl" + extraViniculum / 2.075 + " -" + extraViniculum + "\nc5.3,-9.3,12,-14,20,-14\nH400000v" + (40 + extraViniculum) + "H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM" + (834 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z";
-};
-
-var sqrtSize1 = function sqrtSize1(extraViniculum, hLinePad) {
-  // size1 is from glyph U221A in the font KaTeX_Size1-Regular
-  return "M263," + (601 + extraViniculum + hLinePad) + "c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl" + extraViniculum / 2.084 + " -" + extraViniculum + "\nc4.7,-7.3,11,-11,19,-11\nH40000v" + (40 + extraViniculum) + "H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z";
-};
-
-var sqrtSize2 = function sqrtSize2(extraViniculum, hLinePad) {
-  // size2 is from glyph U221A in the font KaTeX_Size2-Regular
-  return "M983 " + (10 + extraViniculum + hLinePad) + "\nl" + extraViniculum / 3.13 + " -" + extraViniculum + "\nc4,-6.7,10,-10,18,-10 H400000v" + (40 + extraViniculum) + "\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z";
-};
-
-var sqrtSize3 = function sqrtSize3(extraViniculum, hLinePad) {
-  // size3 is from glyph U221A in the font KaTeX_Size3-Regular
-  return "M424," + (2398 + extraViniculum + hLinePad) + "\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl" + extraViniculum / 4.223 + " -" + extraViniculum + "c4,-6.7,10,-10,18,-10 H400000\nv" + (40 + extraViniculum) + "H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M" + (1001 + extraViniculum) + " " + hLinePad + "\nh400000v" + (40 + extraViniculum) + "h-400000z";
-};
-
-var sqrtSize4 = function sqrtSize4(extraViniculum, hLinePad) {
-  // size4 is from glyph U221A in the font KaTeX_Size4-Regular
-  return "M473," + (2713 + extraViniculum + hLinePad) + "\nc339.3,-1799.3,509.3,-2700,510,-2702 l" + extraViniculum / 5.298 + " -" + extraViniculum + "\nc3.3,-7.3,9.3,-11,18,-11 H400000v" + (40 + extraViniculum) + "H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "H1017.7z";
-};
-
-var sqrtTall = function sqrtTall(extraViniculum, hLinePad, viewBoxHeight) {
-  // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular
-  // One path edge has a variable length. It runs vertically from the viniculumn
-  // to a point near (14 units) the bottom of the surd. The viniculum
-  // is normally 40 units thick. So the length of the line in question is:
-  var vertSegment = viewBoxHeight - 54 - hLinePad - extraViniculum;
-  return "M702 " + (extraViniculum + hLinePad) + "H400000" + (40 + extraViniculum) + "\nH742v" + vertSegment + "l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 " + hLinePad + "H400000v" + (40 + extraViniculum) + "H742z";
-};
-
-var sqrtPath = function sqrtPath(size, extraViniculum, viewBoxHeight) {
-  extraViniculum = 1000 * extraViniculum; // Convert from document ems to viewBox.
-
-  var path = "";
-
-  switch (size) {
-    case "sqrtMain":
-      path = sqrtMain(extraViniculum, hLinePad);
-      break;
-
-    case "sqrtSize1":
-      path = sqrtSize1(extraViniculum, hLinePad);
-      break;
-
-    case "sqrtSize2":
-      path = sqrtSize2(extraViniculum, hLinePad);
-      break;
-
-    case "sqrtSize3":
-      path = sqrtSize3(extraViniculum, hLinePad);
-      break;
-
-    case "sqrtSize4":
-      path = sqrtSize4(extraViniculum, hLinePad);
-      break;
-
-    case "sqrtTall":
-      path = sqrtTall(extraViniculum, hLinePad, viewBoxHeight);
-  }
-
-  return path;
-};
-var svgGeometry_path = {
-  // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main
-  doubleleftarrow: "M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",
-  // doublerightarrow is from glyph U+21D2 in font KaTeX Main
-  doublerightarrow: "M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",
-  // leftarrow is from glyph U+2190 in font KaTeX Main
-  leftarrow: "M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",
-  // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular
-  leftbrace: "M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",
-  leftbraceunder: "M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",
-  // overgroup is from the MnSymbol package (public domain)
-  leftgroup: "M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",
-  leftgroupunder: "M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",
-  // Harpoons are from glyph U+21BD in font KaTeX Main
-  leftharpoon: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",
-  leftharpoonplus: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",
-  leftharpoondown: "M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",
-  leftharpoondownplus: "M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",
-  // hook is from glyph U+21A9 in font KaTeX Main
-  lefthook: "M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",
-  leftlinesegment: "M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",
-  leftmapsto: "M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",
-  // tofrom is from glyph U+21C4 in font KaTeX AMS Regular
-  leftToFrom: "M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",
-  longequal: "M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",
-  midbrace: "M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",
-  midbraceunder: "M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",
-  oiintSize1: "M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",
-  oiintSize2: "M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",
-  oiiintSize1: "M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",
-  oiiintSize2: "M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",
-  rightarrow: "M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",
-  rightbrace: "M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",
-  rightbraceunder: "M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",
-  rightgroup: "M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",
-  rightgroupunder: "M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",
-  rightharpoon: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",
-  rightharpoonplus: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",
-  rightharpoondown: "M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",
-  rightharpoondownplus: "M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",
-  righthook: "M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",
-  rightlinesegment: "M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",
-  rightToFrom: "M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",
-  // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular
-  twoheadleftarrow: "M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",
-  twoheadrightarrow: "M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",
-  // tilde1 is a modified version of a glyph from the MnSymbol package
-  tilde1: "M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",
-  // ditto tilde2, tilde3, & tilde4
-  tilde2: "M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",
-  tilde3: "M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",
-  tilde4: "M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",
-  // vec is from glyph U+20D7 in font KaTeX Main
-  vec: "M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",
-  // widehat1 is a modified version of a glyph from the MnSymbol package
-  widehat1: "M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",
-  // ditto widehat2, widehat3, & widehat4
-  widehat2: "M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",
-  widehat3: "M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",
-  widehat4: "M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",
-  // widecheck paths are all inverted versions of widehat
-  widecheck1: "M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",
-  widecheck2: "M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",
-  widecheck3: "M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",
-  widecheck4: "M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",
-  // The next ten paths support reaction arrows from the mhchem package.
-  // Arrows for \ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX
-  // baraboveleftarrow is mostly from from glyph U+2190 in font KaTeX Main
-  baraboveleftarrow: "M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",
-  // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main
-  rightarrowabovebar: "M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",
-  // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end.
-  // Ref from mhchem.sty: \rlap{\raisebox{-.22ex}{$\kern0.5em
-  baraboveshortleftharpoon: "M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",
-  rightharpoonaboveshortbar: "M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",
-  shortbaraboveleftharpoon: "M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",
-  shortrightharpoonabovebar: "M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"
-};
-// CONCATENATED MODULE: ./src/tree.js
-
-
-/**
- * This node represents a document fragment, which contains elements, but when
- * placed into the DOM doesn't have any representation itself. It only contains
- * children and doesn't have any DOM node properties.
- */
-var tree_DocumentFragment =
-/*#__PURE__*/
-function () {
-  // HtmlDomNode
-  // Never used; needed for satisfying interface.
-  function DocumentFragment(children) {
-    this.children = void 0;
-    this.classes = void 0;
-    this.height = void 0;
-    this.depth = void 0;
-    this.maxFontSize = void 0;
-    this.style = void 0;
-    this.children = children;
-    this.classes = [];
-    this.height = 0;
-    this.depth = 0;
-    this.maxFontSize = 0;
-    this.style = {};
-  }
-
-  var _proto = DocumentFragment.prototype;
-
-  _proto.hasClass = function hasClass(className) {
-    return utils.contains(this.classes, className);
-  }
-  /** Convert the fragment into a node. */
-  ;
-
-  _proto.toNode = function toNode() {
-    var frag = document.createDocumentFragment();
-
-    for (var i = 0; i < this.children.length; i++) {
-      frag.appendChild(this.children[i].toNode());
-    }
-
-    return frag;
-  }
-  /** Convert the fragment into HTML markup. */
-  ;
-
-  _proto.toMarkup = function toMarkup() {
-    var markup = ""; // Simply concatenate the markup for the children together.
-
-    for (var i = 0; i < this.children.length; i++) {
-      markup += this.children[i].toMarkup();
-    }
-
-    return markup;
-  }
-  /**
-   * Converts the math node into a string, similar to innerText. Applies to
-   * MathDomNode's only.
-   */
-  ;
-
-  _proto.toText = function toText() {
-    // To avoid this, we would subclass documentFragment separately for
-    // MathML, but polyfills for subclassing is expensive per PR 1469.
-    // $FlowFixMe: Only works for ChildType = MathDomNode.
-    var toText = function toText(child) {
-      return child.toText();
-    };
-
-    return this.children.map(toText).join("");
-  };
-
-  return DocumentFragment;
-}();
-// CONCATENATED MODULE: ./src/domTree.js
-/**
- * These objects store the data about the DOM nodes we create, as well as some
- * extra data. They can then be transformed into real DOM nodes with the
- * `toNode` function or HTML markup using `toMarkup`. They are useful for both
- * storing extra properties on the nodes, as well as providing a way to easily
- * work with the DOM.
- *
- * Similar functions for working with MathML nodes exist in mathMLTree.js.
- *
- * TODO: refactor `span` and `anchor` into common superclass when
- * target environments support class inheritance
- */
-
-
-
-
-
-/**
- * Create an HTML className based on a list of classes. In addition to joining
- * with spaces, we also remove empty classes.
- */
-var createClass = function createClass(classes) {
-  return classes.filter(function (cls) {
-    return cls;
-  }).join(" ");
-};
-
-var initNode = function initNode(classes, options, style) {
-  this.classes = classes || [];
-  this.attributes = {};
-  this.height = 0;
-  this.depth = 0;
-  this.maxFontSize = 0;
-  this.style = style || {};
-
-  if (options) {
-    if (options.style.isTight()) {
-      this.classes.push("mtight");
-    }
-
-    var color = options.getColor();
-
-    if (color) {
-      this.style.color = color;
-    }
-  }
-};
-/**
- * Convert into an HTML node
- */
-
-
-var _toNode = function toNode(tagName) {
-  var node = document.createElement(tagName); // Apply the class
-
-  node.className = createClass(this.classes); // Apply inline styles
-
-  for (var style in this.style) {
-    if (this.style.hasOwnProperty(style)) {
-      // $FlowFixMe Flow doesn't seem to understand span.style's type.
-      node.style[style] = this.style[style];
-    }
-  } // Apply attributes
-
-
-  for (var attr in this.attributes) {
-    if (this.attributes.hasOwnProperty(attr)) {
-      node.setAttribute(attr, this.attributes[attr]);
-    }
-  } // Append the children, also as HTML nodes
-
-
-  for (var i = 0; i < this.children.length; i++) {
-    node.appendChild(this.children[i].toNode());
-  }
-
-  return node;
-};
-/**
- * Convert into an HTML markup string
- */
-
-
-var _toMarkup = function toMarkup(tagName) {
-  var markup = "<" + tagName; // Add the class
-
-  if (this.classes.length) {
-    markup += " class=\"" + utils.escape(createClass(this.classes)) + "\"";
-  }
-
-  var styles = ""; // Add the styles, after hyphenation
-
-  for (var style in this.style) {
-    if (this.style.hasOwnProperty(style)) {
-      styles += utils.hyphenate(style) + ":" + this.style[style] + ";";
-    }
-  }
-
-  if (styles) {
-    markup += " style=\"" + utils.escape(styles) + "\"";
-  } // Add the attributes
-
-
-  for (var attr in this.attributes) {
-    if (this.attributes.hasOwnProperty(attr)) {
-      markup += " " + attr + "=\"" + utils.escape(this.attributes[attr]) + "\"";
-    }
-  }
-
-  markup += ">"; // Add the markup of the children, also as markup
-
-  for (var i = 0; i < this.children.length; i++) {
-    markup += this.children[i].toMarkup();
-  }
-
-  markup += "</" + tagName + ">";
-  return markup;
-}; // Making the type below exact with all optional fields doesn't work due to
-// - https://github.com/facebook/flow/issues/4582
-// - https://github.com/facebook/flow/issues/5688
-// However, since *all* fields are optional, $Shape<> works as suggested in 5688
-// above.
-// This type does not include all CSS properties. Additional properties should
-// be added as needed.
-
-
-/**
- * This node represents a span node, with a className, a list of children, and
- * an inline style. It also contains information about its height, depth, and
- * maxFontSize.
- *
- * Represents two types with different uses: SvgSpan to wrap an SVG and DomSpan
- * otherwise. This typesafety is important when HTML builders access a span's
- * children.
- */
-var domTree_Span =
-/*#__PURE__*/
-function () {
-  function Span(classes, children, options, style) {
-    this.children = void 0;
-    this.attributes = void 0;
-    this.classes = void 0;
-    this.height = void 0;
-    this.depth = void 0;
-    this.width = void 0;
-    this.maxFontSize = void 0;
-    this.style = void 0;
-    initNode.call(this, classes, options, style);
-    this.children = children || [];
-  }
-  /**
-   * Sets an arbitrary attribute on the span. Warning: use this wisely. Not
-   * all browsers support attributes the same, and having too many custom
-   * attributes is probably bad.
-   */
-
-
-  var _proto = Span.prototype;
-
-  _proto.setAttribute = function setAttribute(attribute, value) {
-    this.attributes[attribute] = value;
-  };
-
-  _proto.hasClass = function hasClass(className) {
-    return utils.contains(this.classes, className);
-  };
-
-  _proto.toNode = function toNode() {
-    return _toNode.call(this, "span");
-  };
-
-  _proto.toMarkup = function toMarkup() {
-    return _toMarkup.call(this, "span");
-  };
-
-  return Span;
-}();
-/**
- * This node represents an anchor (<a>) element with a hyperlink.  See `span`
- * for further details.
- */
-
-var domTree_Anchor =
-/*#__PURE__*/
-function () {
-  function Anchor(href, classes, children, options) {
-    this.children = void 0;
-    this.attributes = void 0;
-    this.classes = void 0;
-    this.height = void 0;
-    this.depth = void 0;
-    this.maxFontSize = void 0;
-    this.style = void 0;
-    initNode.call(this, classes, options);
-    this.children = children || [];
-    this.setAttribute('href', href);
-  }
-
-  var _proto2 = Anchor.prototype;
-
-  _proto2.setAttribute = function setAttribute(attribute, value) {
-    this.attributes[attribute] = value;
-  };
-
-  _proto2.hasClass = function hasClass(className) {
-    return utils.contains(this.classes, className);
-  };
-
-  _proto2.toNode = function toNode() {
-    return _toNode.call(this, "a");
-  };
-
-  _proto2.toMarkup = function toMarkup() {
-    return _toMarkup.call(this, "a");
-  };
-
-  return Anchor;
-}();
-/**
- * This node represents an image embed (<img>) element.
- */
-
-var domTree_Img =
-/*#__PURE__*/
-function () {
-  function Img(src, alt, style) {
-    this.src = void 0;
-    this.alt = void 0;
-    this.classes = void 0;
-    this.height = void 0;
-    this.depth = void 0;
-    this.maxFontSize = void 0;
-    this.style = void 0;
-    this.alt = alt;
-    this.src = src;
-    this.classes = ["mord"];
-    this.style = style;
-  }
-
-  var _proto3 = Img.prototype;
-
-  _proto3.hasClass = function hasClass(className) {
-    return utils.contains(this.classes, className);
-  };
-
-  _proto3.toNode = function toNode() {
-    var node = document.createElement("img");
-    node.src = this.src;
-    node.alt = this.alt;
-    node.className = "mord"; // Apply inline styles
-
-    for (var style in this.style) {
-      if (this.style.hasOwnProperty(style)) {
-        // $FlowFixMe
-        node.style[style] = this.style[style];
-      }
-    }
-
-    return node;
-  };
-
-  _proto3.toMarkup = function toMarkup() {
-    var markup = "<img  src='" + this.src + " 'alt='" + this.alt + "' "; // Add the styles, after hyphenation
-
-    var styles = "";
-
-    for (var style in this.style) {
-      if (this.style.hasOwnProperty(style)) {
-        styles += utils.hyphenate(style) + ":" + this.style[style] + ";";
-      }
-    }
-
-    if (styles) {
-      markup += " style=\"" + utils.escape(styles) + "\"";
-    }
-
-    markup += "'/>";
-    return markup;
-  };
-
-  return Img;
-}();
-var iCombinations = {
-  'î': "\u0131\u0302",
-  'ï': "\u0131\u0308",
-  'í': "\u0131\u0301",
-  // 'ī': '\u0131\u0304', // enable when we add Extended Latin
-  'ì': "\u0131\u0300"
-};
-/**
- * A symbol node contains information about a single symbol. It either renders
- * to a single text node, or a span with a single text node in it, depending on
- * whether it has CSS classes, styles, or needs italic correction.
- */
-
-var domTree_SymbolNode =
-/*#__PURE__*/
-function () {
-  function SymbolNode(text, height, depth, italic, skew, width, classes, style) {
-    this.text = void 0;
-    this.height = void 0;
-    this.depth = void 0;
-    this.italic = void 0;
-    this.skew = void 0;
-    this.width = void 0;
-    this.maxFontSize = void 0;
-    this.classes = void 0;
-    this.style = void 0;
-    this.text = text;
-    this.height = height || 0;
-    this.depth = depth || 0;
-    this.italic = italic || 0;
-    this.skew = skew || 0;
-    this.width = width || 0;
-    this.classes = classes || [];
-    this.style = style || {};
-    this.maxFontSize = 0; // Mark text from non-Latin scripts with specific classes so that we
-    // can specify which fonts to use.  This allows us to render these
-    // characters with a serif font in situations where the browser would
-    // either default to a sans serif or render a placeholder character.
-    // We use CSS class names like cjk_fallback, hangul_fallback and
-    // brahmic_fallback. See ./unicodeScripts.js for the set of possible
-    // script names
-
-    var script = scriptFromCodepoint(this.text.charCodeAt(0));
-
-    if (script) {
-      this.classes.push(script + "_fallback");
-    }
-
-    if (/[îïíì]/.test(this.text)) {
-      // add ī when we add Extended Latin
-      this.text = iCombinations[this.text];
-    }
-  }
-
-  var _proto4 = SymbolNode.prototype;
-
-  _proto4.hasClass = function hasClass(className) {
-    return utils.contains(this.classes, className);
-  }
-  /**
-   * Creates a text node or span from a symbol node. Note that a span is only
-   * created if it is needed.
-   */
-  ;
-
-  _proto4.toNode = function toNode() {
-    var node = document.createTextNode(this.text);
-    var span = null;
-
-    if (this.italic > 0) {
-      span = document.createElement("span");
-      span.style.marginRight = this.italic + "em";
-    }
-
-    if (this.classes.length > 0) {
-      span = span || document.createElement("span");
-      span.className = createClass(this.classes);
-    }
-
-    for (var style in this.style) {
-      if (this.style.hasOwnProperty(style)) {
-        span = span || document.createElement("span"); // $FlowFixMe Flow doesn't seem to understand span.style's type.
-
-        span.style[style] = this.style[style];
-      }
-    }
-
-    if (span) {
-      span.appendChild(node);
-      return span;
-    } else {
-      return node;
-    }
-  }
-  /**
-   * Creates markup for a symbol node.
-   */
-  ;
-
-  _proto4.toMarkup = function toMarkup() {
-    // TODO(alpert): More duplication than I'd like from
-    // span.prototype.toMarkup and symbolNode.prototype.toNode...
-    var needsSpan = false;
-    var markup = "<span";
-
-    if (this.classes.length) {
-      needsSpan = true;
-      markup += " class=\"";
-      markup += utils.escape(createClass(this.classes));
-      markup += "\"";
-    }
-
-    var styles = "";
-
-    if (this.italic > 0) {
-      styles += "margin-right:" + this.italic + "em;";
-    }
-
-    for (var style in this.style) {
-      if (this.style.hasOwnProperty(style)) {
-        styles += utils.hyphenate(style) + ":" + this.style[style] + ";";
-      }
-    }
-
-    if (styles) {
-      needsSpan = true;
-      markup += " style=\"" + utils.escape(styles) + "\"";
-    }
-
-    var escaped = utils.escape(this.text);
-
-    if (needsSpan) {
-      markup += ">";
-      markup += escaped;
-      markup += "</span>";
-      return markup;
-    } else {
-      return escaped;
-    }
-  };
-
-  return SymbolNode;
-}();
-/**
- * SVG nodes are used to render stretchy wide elements.
- */
-
-var SvgNode =
-/*#__PURE__*/
-function () {
-  function SvgNode(children, attributes) {
-    this.children = void 0;
-    this.attributes = void 0;
-    this.children = children || [];
-    this.attributes = attributes || {};
-  }
-
-  var _proto5 = SvgNode.prototype;
-
-  _proto5.toNode = function toNode() {
-    var svgNS = "http://www.w3.org/2000/svg";
-    var node = document.createElementNS(svgNS, "svg"); // Apply attributes
-
-    for (var attr in this.attributes) {
-      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-        node.setAttribute(attr, this.attributes[attr]);
-      }
-    }
-
-    for (var i = 0; i < this.children.length; i++) {
-      node.appendChild(this.children[i].toNode());
-    }
-
-    return node;
-  };
-
-  _proto5.toMarkup = function toMarkup() {
-    var markup = "<svg"; // Apply attributes
-
-    for (var attr in this.attributes) {
-      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-        markup += " " + attr + "='" + this.attributes[attr] + "'";
-      }
-    }
-
-    markup += ">";
-
-    for (var i = 0; i < this.children.length; i++) {
-      markup += this.children[i].toMarkup();
-    }
-
-    markup += "</svg>";
-    return markup;
-  };
-
-  return SvgNode;
-}();
-var domTree_PathNode =
-/*#__PURE__*/
-function () {
-  function PathNode(pathName, alternate) {
-    this.pathName = void 0;
-    this.alternate = void 0;
-    this.pathName = pathName;
-    this.alternate = alternate; // Used only for \sqrt
-  }
-
-  var _proto6 = PathNode.prototype;
-
-  _proto6.toNode = function toNode() {
-    var svgNS = "http://www.w3.org/2000/svg";
-    var node = document.createElementNS(svgNS, "path");
-
-    if (this.alternate) {
-      node.setAttribute("d", this.alternate);
-    } else {
-      node.setAttribute("d", svgGeometry_path[this.pathName]);
-    }
-
-    return node;
-  };
-
-  _proto6.toMarkup = function toMarkup() {
-    if (this.alternate) {
-      return "<path d='" + this.alternate + "'/>";
-    } else {
-      return "<path d='" + svgGeometry_path[this.pathName] + "'/>";
-    }
-  };
-
-  return PathNode;
-}();
-var LineNode =
-/*#__PURE__*/
-function () {
-  function LineNode(attributes) {
-    this.attributes = void 0;
-    this.attributes = attributes || {};
-  }
-
-  var _proto7 = LineNode.prototype;
-
-  _proto7.toNode = function toNode() {
-    var svgNS = "http://www.w3.org/2000/svg";
-    var node = document.createElementNS(svgNS, "line"); // Apply attributes
-
-    for (var attr in this.attributes) {
-      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-        node.setAttribute(attr, this.attributes[attr]);
-      }
-    }
-
-    return node;
-  };
-
-  _proto7.toMarkup = function toMarkup() {
-    var markup = "<line";
-
-    for (var attr in this.attributes) {
-      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-        markup += " " + attr + "='" + this.attributes[attr] + "'";
-      }
-    }
-
-    markup += "/>";
-    return markup;
-  };
-
-  return LineNode;
-}();
-function assertSymbolDomNode(group) {
-  if (group instanceof domTree_SymbolNode) {
-    return group;
-  } else {
-    throw new Error("Expected symbolNode but got " + String(group) + ".");
-  }
-}
-function assertSpan(group) {
-  if (group instanceof domTree_Span) {
-    return group;
-  } else {
-    throw new Error("Expected span<HtmlDomNode> but got " + String(group) + ".");
-  }
-}
-// CONCATENATED MODULE: ./submodules/katex-fonts/fontMetricsData.js
-// This file is GENERATED by buildMetrics.sh. DO NOT MODIFY.
-/* harmony default export */ var fontMetricsData = ({
-  "AMS-Regular": {
-    "65": [0, 0.68889, 0, 0, 0.72222],
-    "66": [0, 0.68889, 0, 0, 0.66667],
-    "67": [0, 0.68889, 0, 0, 0.72222],
-    "68": [0, 0.68889, 0, 0, 0.72222],
-    "69": [0, 0.68889, 0, 0, 0.66667],
-    "70": [0, 0.68889, 0, 0, 0.61111],
-    "71": [0, 0.68889, 0, 0, 0.77778],
-    "72": [0, 0.68889, 0, 0, 0.77778],
-    "73": [0, 0.68889, 0, 0, 0.38889],
-    "74": [0.16667, 0.68889, 0, 0, 0.5],
-    "75": [0, 0.68889, 0, 0, 0.77778],
-    "76": [0, 0.68889, 0, 0, 0.66667],
-    "77": [0, 0.68889, 0, 0, 0.94445],
-    "78": [0, 0.68889, 0, 0, 0.72222],
-    "79": [0.16667, 0.68889, 0, 0, 0.77778],
-    "80": [0, 0.68889, 0, 0, 0.61111],
-    "81": [0.16667, 0.68889, 0, 0, 0.77778],
-    "82": [0, 0.68889, 0, 0, 0.72222],
-    "83": [0, 0.68889, 0, 0, 0.55556],
-    "84": [0, 0.68889, 0, 0, 0.66667],
-    "85": [0, 0.68889, 0, 0, 0.72222],
-    "86": [0, 0.68889, 0, 0, 0.72222],
-    "87": [0, 0.68889, 0, 0, 1.0],
-    "88": [0, 0.68889, 0, 0, 0.72222],
-    "89": [0, 0.68889, 0, 0, 0.72222],
-    "90": [0, 0.68889, 0, 0, 0.66667],
-    "107": [0, 0.68889, 0, 0, 0.55556],
-    "165": [0, 0.675, 0.025, 0, 0.75],
-    "174": [0.15559, 0.69224, 0, 0, 0.94666],
-    "240": [0, 0.68889, 0, 0, 0.55556],
-    "295": [0, 0.68889, 0, 0, 0.54028],
-    "710": [0, 0.825, 0, 0, 2.33334],
-    "732": [0, 0.9, 0, 0, 2.33334],
-    "770": [0, 0.825, 0, 0, 2.33334],
-    "771": [0, 0.9, 0, 0, 2.33334],
-    "989": [0.08167, 0.58167, 0, 0, 0.77778],
-    "1008": [0, 0.43056, 0.04028, 0, 0.66667],
-    "8245": [0, 0.54986, 0, 0, 0.275],
-    "8463": [0, 0.68889, 0, 0, 0.54028],
-    "8487": [0, 0.68889, 0, 0, 0.72222],
-    "8498": [0, 0.68889, 0, 0, 0.55556],
-    "8502": [0, 0.68889, 0, 0, 0.66667],
-    "8503": [0, 0.68889, 0, 0, 0.44445],
-    "8504": [0, 0.68889, 0, 0, 0.66667],
-    "8513": [0, 0.68889, 0, 0, 0.63889],
-    "8592": [-0.03598, 0.46402, 0, 0, 0.5],
-    "8594": [-0.03598, 0.46402, 0, 0, 0.5],
-    "8602": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8603": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8606": [0.01354, 0.52239, 0, 0, 1.0],
-    "8608": [0.01354, 0.52239, 0, 0, 1.0],
-    "8610": [0.01354, 0.52239, 0, 0, 1.11111],
-    "8611": [0.01354, 0.52239, 0, 0, 1.11111],
-    "8619": [0, 0.54986, 0, 0, 1.0],
-    "8620": [0, 0.54986, 0, 0, 1.0],
-    "8621": [-0.13313, 0.37788, 0, 0, 1.38889],
-    "8622": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8624": [0, 0.69224, 0, 0, 0.5],
-    "8625": [0, 0.69224, 0, 0, 0.5],
-    "8630": [0, 0.43056, 0, 0, 1.0],
-    "8631": [0, 0.43056, 0, 0, 1.0],
-    "8634": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8635": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8638": [0.19444, 0.69224, 0, 0, 0.41667],
-    "8639": [0.19444, 0.69224, 0, 0, 0.41667],
-    "8642": [0.19444, 0.69224, 0, 0, 0.41667],
-    "8643": [0.19444, 0.69224, 0, 0, 0.41667],
-    "8644": [0.1808, 0.675, 0, 0, 1.0],
-    "8646": [0.1808, 0.675, 0, 0, 1.0],
-    "8647": [0.1808, 0.675, 0, 0, 1.0],
-    "8648": [0.19444, 0.69224, 0, 0, 0.83334],
-    "8649": [0.1808, 0.675, 0, 0, 1.0],
-    "8650": [0.19444, 0.69224, 0, 0, 0.83334],
-    "8651": [0.01354, 0.52239, 0, 0, 1.0],
-    "8652": [0.01354, 0.52239, 0, 0, 1.0],
-    "8653": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8654": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8655": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8666": [0.13667, 0.63667, 0, 0, 1.0],
-    "8667": [0.13667, 0.63667, 0, 0, 1.0],
-    "8669": [-0.13313, 0.37788, 0, 0, 1.0],
-    "8672": [-0.064, 0.437, 0, 0, 1.334],
-    "8674": [-0.064, 0.437, 0, 0, 1.334],
-    "8705": [0, 0.825, 0, 0, 0.5],
-    "8708": [0, 0.68889, 0, 0, 0.55556],
-    "8709": [0.08167, 0.58167, 0, 0, 0.77778],
-    "8717": [0, 0.43056, 0, 0, 0.42917],
-    "8722": [-0.03598, 0.46402, 0, 0, 0.5],
-    "8724": [0.08198, 0.69224, 0, 0, 0.77778],
-    "8726": [0.08167, 0.58167, 0, 0, 0.77778],
-    "8733": [0, 0.69224, 0, 0, 0.77778],
-    "8736": [0, 0.69224, 0, 0, 0.72222],
-    "8737": [0, 0.69224, 0, 0, 0.72222],
-    "8738": [0.03517, 0.52239, 0, 0, 0.72222],
-    "8739": [0.08167, 0.58167, 0, 0, 0.22222],
-    "8740": [0.25142, 0.74111, 0, 0, 0.27778],
-    "8741": [0.08167, 0.58167, 0, 0, 0.38889],
-    "8742": [0.25142, 0.74111, 0, 0, 0.5],
-    "8756": [0, 0.69224, 0, 0, 0.66667],
-    "8757": [0, 0.69224, 0, 0, 0.66667],
-    "8764": [-0.13313, 0.36687, 0, 0, 0.77778],
-    "8765": [-0.13313, 0.37788, 0, 0, 0.77778],
-    "8769": [-0.13313, 0.36687, 0, 0, 0.77778],
-    "8770": [-0.03625, 0.46375, 0, 0, 0.77778],
-    "8774": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8776": [-0.01688, 0.48312, 0, 0, 0.77778],
-    "8778": [0.08167, 0.58167, 0, 0, 0.77778],
-    "8782": [0.06062, 0.54986, 0, 0, 0.77778],
-    "8783": [0.06062, 0.54986, 0, 0, 0.77778],
-    "8785": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8786": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8787": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8790": [0, 0.69224, 0, 0, 0.77778],
-    "8791": [0.22958, 0.72958, 0, 0, 0.77778],
-    "8796": [0.08198, 0.91667, 0, 0, 0.77778],
-    "8806": [0.25583, 0.75583, 0, 0, 0.77778],
-    "8807": [0.25583, 0.75583, 0, 0, 0.77778],
-    "8808": [0.25142, 0.75726, 0, 0, 0.77778],
-    "8809": [0.25142, 0.75726, 0, 0, 0.77778],
-    "8812": [0.25583, 0.75583, 0, 0, 0.5],
-    "8814": [0.20576, 0.70576, 0, 0, 0.77778],
-    "8815": [0.20576, 0.70576, 0, 0, 0.77778],
-    "8816": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8817": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8818": [0.22958, 0.72958, 0, 0, 0.77778],
-    "8819": [0.22958, 0.72958, 0, 0, 0.77778],
-    "8822": [0.1808, 0.675, 0, 0, 0.77778],
-    "8823": [0.1808, 0.675, 0, 0, 0.77778],
-    "8828": [0.13667, 0.63667, 0, 0, 0.77778],
-    "8829": [0.13667, 0.63667, 0, 0, 0.77778],
-    "8830": [0.22958, 0.72958, 0, 0, 0.77778],
-    "8831": [0.22958, 0.72958, 0, 0, 0.77778],
-    "8832": [0.20576, 0.70576, 0, 0, 0.77778],
-    "8833": [0.20576, 0.70576, 0, 0, 0.77778],
-    "8840": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8841": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8842": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8843": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8847": [0.03517, 0.54986, 0, 0, 0.77778],
-    "8848": [0.03517, 0.54986, 0, 0, 0.77778],
-    "8858": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8859": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8861": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8862": [0, 0.675, 0, 0, 0.77778],
-    "8863": [0, 0.675, 0, 0, 0.77778],
-    "8864": [0, 0.675, 0, 0, 0.77778],
-    "8865": [0, 0.675, 0, 0, 0.77778],
-    "8872": [0, 0.69224, 0, 0, 0.61111],
-    "8873": [0, 0.69224, 0, 0, 0.72222],
-    "8874": [0, 0.69224, 0, 0, 0.88889],
-    "8876": [0, 0.68889, 0, 0, 0.61111],
-    "8877": [0, 0.68889, 0, 0, 0.61111],
-    "8878": [0, 0.68889, 0, 0, 0.72222],
-    "8879": [0, 0.68889, 0, 0, 0.72222],
-    "8882": [0.03517, 0.54986, 0, 0, 0.77778],
-    "8883": [0.03517, 0.54986, 0, 0, 0.77778],
-    "8884": [0.13667, 0.63667, 0, 0, 0.77778],
-    "8885": [0.13667, 0.63667, 0, 0, 0.77778],
-    "8888": [0, 0.54986, 0, 0, 1.11111],
-    "8890": [0.19444, 0.43056, 0, 0, 0.55556],
-    "8891": [0.19444, 0.69224, 0, 0, 0.61111],
-    "8892": [0.19444, 0.69224, 0, 0, 0.61111],
-    "8901": [0, 0.54986, 0, 0, 0.27778],
-    "8903": [0.08167, 0.58167, 0, 0, 0.77778],
-    "8905": [0.08167, 0.58167, 0, 0, 0.77778],
-    "8906": [0.08167, 0.58167, 0, 0, 0.77778],
-    "8907": [0, 0.69224, 0, 0, 0.77778],
-    "8908": [0, 0.69224, 0, 0, 0.77778],
-    "8909": [-0.03598, 0.46402, 0, 0, 0.77778],
-    "8910": [0, 0.54986, 0, 0, 0.76042],
-    "8911": [0, 0.54986, 0, 0, 0.76042],
-    "8912": [0.03517, 0.54986, 0, 0, 0.77778],
-    "8913": [0.03517, 0.54986, 0, 0, 0.77778],
-    "8914": [0, 0.54986, 0, 0, 0.66667],
-    "8915": [0, 0.54986, 0, 0, 0.66667],
-    "8916": [0, 0.69224, 0, 0, 0.66667],
-    "8918": [0.0391, 0.5391, 0, 0, 0.77778],
-    "8919": [0.0391, 0.5391, 0, 0, 0.77778],
-    "8920": [0.03517, 0.54986, 0, 0, 1.33334],
-    "8921": [0.03517, 0.54986, 0, 0, 1.33334],
-    "8922": [0.38569, 0.88569, 0, 0, 0.77778],
-    "8923": [0.38569, 0.88569, 0, 0, 0.77778],
-    "8926": [0.13667, 0.63667, 0, 0, 0.77778],
-    "8927": [0.13667, 0.63667, 0, 0, 0.77778],
-    "8928": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8929": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8934": [0.23222, 0.74111, 0, 0, 0.77778],
-    "8935": [0.23222, 0.74111, 0, 0, 0.77778],
-    "8936": [0.23222, 0.74111, 0, 0, 0.77778],
-    "8937": [0.23222, 0.74111, 0, 0, 0.77778],
-    "8938": [0.20576, 0.70576, 0, 0, 0.77778],
-    "8939": [0.20576, 0.70576, 0, 0, 0.77778],
-    "8940": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8941": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8994": [0.19444, 0.69224, 0, 0, 0.77778],
-    "8995": [0.19444, 0.69224, 0, 0, 0.77778],
-    "9416": [0.15559, 0.69224, 0, 0, 0.90222],
-    "9484": [0, 0.69224, 0, 0, 0.5],
-    "9488": [0, 0.69224, 0, 0, 0.5],
-    "9492": [0, 0.37788, 0, 0, 0.5],
-    "9496": [0, 0.37788, 0, 0, 0.5],
-    "9585": [0.19444, 0.68889, 0, 0, 0.88889],
-    "9586": [0.19444, 0.74111, 0, 0, 0.88889],
-    "9632": [0, 0.675, 0, 0, 0.77778],
-    "9633": [0, 0.675, 0, 0, 0.77778],
-    "9650": [0, 0.54986, 0, 0, 0.72222],
-    "9651": [0, 0.54986, 0, 0, 0.72222],
-    "9654": [0.03517, 0.54986, 0, 0, 0.77778],
-    "9660": [0, 0.54986, 0, 0, 0.72222],
-    "9661": [0, 0.54986, 0, 0, 0.72222],
-    "9664": [0.03517, 0.54986, 0, 0, 0.77778],
-    "9674": [0.11111, 0.69224, 0, 0, 0.66667],
-    "9733": [0.19444, 0.69224, 0, 0, 0.94445],
-    "10003": [0, 0.69224, 0, 0, 0.83334],
-    "10016": [0, 0.69224, 0, 0, 0.83334],
-    "10731": [0.11111, 0.69224, 0, 0, 0.66667],
-    "10846": [0.19444, 0.75583, 0, 0, 0.61111],
-    "10877": [0.13667, 0.63667, 0, 0, 0.77778],
-    "10878": [0.13667, 0.63667, 0, 0, 0.77778],
-    "10885": [0.25583, 0.75583, 0, 0, 0.77778],
-    "10886": [0.25583, 0.75583, 0, 0, 0.77778],
-    "10887": [0.13597, 0.63597, 0, 0, 0.77778],
-    "10888": [0.13597, 0.63597, 0, 0, 0.77778],
-    "10889": [0.26167, 0.75726, 0, 0, 0.77778],
-    "10890": [0.26167, 0.75726, 0, 0, 0.77778],
-    "10891": [0.48256, 0.98256, 0, 0, 0.77778],
-    "10892": [0.48256, 0.98256, 0, 0, 0.77778],
-    "10901": [0.13667, 0.63667, 0, 0, 0.77778],
-    "10902": [0.13667, 0.63667, 0, 0, 0.77778],
-    "10933": [0.25142, 0.75726, 0, 0, 0.77778],
-    "10934": [0.25142, 0.75726, 0, 0, 0.77778],
-    "10935": [0.26167, 0.75726, 0, 0, 0.77778],
-    "10936": [0.26167, 0.75726, 0, 0, 0.77778],
-    "10937": [0.26167, 0.75726, 0, 0, 0.77778],
-    "10938": [0.26167, 0.75726, 0, 0, 0.77778],
-    "10949": [0.25583, 0.75583, 0, 0, 0.77778],
-    "10950": [0.25583, 0.75583, 0, 0, 0.77778],
-    "10955": [0.28481, 0.79383, 0, 0, 0.77778],
-    "10956": [0.28481, 0.79383, 0, 0, 0.77778],
-    "57350": [0.08167, 0.58167, 0, 0, 0.22222],
-    "57351": [0.08167, 0.58167, 0, 0, 0.38889],
-    "57352": [0.08167, 0.58167, 0, 0, 0.77778],
-    "57353": [0, 0.43056, 0.04028, 0, 0.66667],
-    "57356": [0.25142, 0.75726, 0, 0, 0.77778],
-    "57357": [0.25142, 0.75726, 0, 0, 0.77778],
-    "57358": [0.41951, 0.91951, 0, 0, 0.77778],
-    "57359": [0.30274, 0.79383, 0, 0, 0.77778],
-    "57360": [0.30274, 0.79383, 0, 0, 0.77778],
-    "57361": [0.41951, 0.91951, 0, 0, 0.77778],
-    "57366": [0.25142, 0.75726, 0, 0, 0.77778],
-    "57367": [0.25142, 0.75726, 0, 0, 0.77778],
-    "57368": [0.25142, 0.75726, 0, 0, 0.77778],
-    "57369": [0.25142, 0.75726, 0, 0, 0.77778],
-    "57370": [0.13597, 0.63597, 0, 0, 0.77778],
-    "57371": [0.13597, 0.63597, 0, 0, 0.77778]
-  },
-  "Caligraphic-Regular": {
-    "48": [0, 0.43056, 0, 0, 0.5],
-    "49": [0, 0.43056, 0, 0, 0.5],
-    "50": [0, 0.43056, 0, 0, 0.5],
-    "51": [0.19444, 0.43056, 0, 0, 0.5],
-    "52": [0.19444, 0.43056, 0, 0, 0.5],
-    "53": [0.19444, 0.43056, 0, 0, 0.5],
-    "54": [0, 0.64444, 0, 0, 0.5],
-    "55": [0.19444, 0.43056, 0, 0, 0.5],
-    "56": [0, 0.64444, 0, 0, 0.5],
-    "57": [0.19444, 0.43056, 0, 0, 0.5],
-    "65": [0, 0.68333, 0, 0.19445, 0.79847],
-    "66": [0, 0.68333, 0.03041, 0.13889, 0.65681],
-    "67": [0, 0.68333, 0.05834, 0.13889, 0.52653],
-    "68": [0, 0.68333, 0.02778, 0.08334, 0.77139],
-    "69": [0, 0.68333, 0.08944, 0.11111, 0.52778],
-    "70": [0, 0.68333, 0.09931, 0.11111, 0.71875],
-    "71": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487],
-    "72": [0, 0.68333, 0.00965, 0.11111, 0.84452],
-    "73": [0, 0.68333, 0.07382, 0, 0.54452],
-    "74": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778],
-    "75": [0, 0.68333, 0.01445, 0.05556, 0.76195],
-    "76": [0, 0.68333, 0, 0.13889, 0.68972],
-    "77": [0, 0.68333, 0, 0.13889, 1.2009],
-    "78": [0, 0.68333, 0.14736, 0.08334, 0.82049],
-    "79": [0, 0.68333, 0.02778, 0.11111, 0.79611],
-    "80": [0, 0.68333, 0.08222, 0.08334, 0.69556],
-    "81": [0.09722, 0.68333, 0, 0.11111, 0.81667],
-    "82": [0, 0.68333, 0, 0.08334, 0.8475],
-    "83": [0, 0.68333, 0.075, 0.13889, 0.60556],
-    "84": [0, 0.68333, 0.25417, 0, 0.54464],
-    "85": [0, 0.68333, 0.09931, 0.08334, 0.62583],
-    "86": [0, 0.68333, 0.08222, 0, 0.61278],
-    "87": [0, 0.68333, 0.08222, 0.08334, 0.98778],
-    "88": [0, 0.68333, 0.14643, 0.13889, 0.7133],
-    "89": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834],
-    "90": [0, 0.68333, 0.07944, 0.13889, 0.72473]
-  },
-  "Fraktur-Regular": {
-    "33": [0, 0.69141, 0, 0, 0.29574],
-    "34": [0, 0.69141, 0, 0, 0.21471],
-    "38": [0, 0.69141, 0, 0, 0.73786],
-    "39": [0, 0.69141, 0, 0, 0.21201],
-    "40": [0.24982, 0.74947, 0, 0, 0.38865],
-    "41": [0.24982, 0.74947, 0, 0, 0.38865],
-    "42": [0, 0.62119, 0, 0, 0.27764],
-    "43": [0.08319, 0.58283, 0, 0, 0.75623],
-    "44": [0, 0.10803, 0, 0, 0.27764],
-    "45": [0.08319, 0.58283, 0, 0, 0.75623],
-    "46": [0, 0.10803, 0, 0, 0.27764],
-    "47": [0.24982, 0.74947, 0, 0, 0.50181],
-    "48": [0, 0.47534, 0, 0, 0.50181],
-    "49": [0, 0.47534, 0, 0, 0.50181],
-    "50": [0, 0.47534, 0, 0, 0.50181],
-    "51": [0.18906, 0.47534, 0, 0, 0.50181],
-    "52": [0.18906, 0.47534, 0, 0, 0.50181],
-    "53": [0.18906, 0.47534, 0, 0, 0.50181],
-    "54": [0, 0.69141, 0, 0, 0.50181],
-    "55": [0.18906, 0.47534, 0, 0, 0.50181],
-    "56": [0, 0.69141, 0, 0, 0.50181],
-    "57": [0.18906, 0.47534, 0, 0, 0.50181],
-    "58": [0, 0.47534, 0, 0, 0.21606],
-    "59": [0.12604, 0.47534, 0, 0, 0.21606],
-    "61": [-0.13099, 0.36866, 0, 0, 0.75623],
-    "63": [0, 0.69141, 0, 0, 0.36245],
-    "65": [0, 0.69141, 0, 0, 0.7176],
-    "66": [0, 0.69141, 0, 0, 0.88397],
-    "67": [0, 0.69141, 0, 0, 0.61254],
-    "68": [0, 0.69141, 0, 0, 0.83158],
-    "69": [0, 0.69141, 0, 0, 0.66278],
-    "70": [0.12604, 0.69141, 0, 0, 0.61119],
-    "71": [0, 0.69141, 0, 0, 0.78539],
-    "72": [0.06302, 0.69141, 0, 0, 0.7203],
-    "73": [0, 0.69141, 0, 0, 0.55448],
-    "74": [0.12604, 0.69141, 0, 0, 0.55231],
-    "75": [0, 0.69141, 0, 0, 0.66845],
-    "76": [0, 0.69141, 0, 0, 0.66602],
-    "77": [0, 0.69141, 0, 0, 1.04953],
-    "78": [0, 0.69141, 0, 0, 0.83212],
-    "79": [0, 0.69141, 0, 0, 0.82699],
-    "80": [0.18906, 0.69141, 0, 0, 0.82753],
-    "81": [0.03781, 0.69141, 0, 0, 0.82699],
-    "82": [0, 0.69141, 0, 0, 0.82807],
-    "83": [0, 0.69141, 0, 0, 0.82861],
-    "84": [0, 0.69141, 0, 0, 0.66899],
-    "85": [0, 0.69141, 0, 0, 0.64576],
-    "86": [0, 0.69141, 0, 0, 0.83131],
-    "87": [0, 0.69141, 0, 0, 1.04602],
-    "88": [0, 0.69141, 0, 0, 0.71922],
-    "89": [0.18906, 0.69141, 0, 0, 0.83293],
-    "90": [0.12604, 0.69141, 0, 0, 0.60201],
-    "91": [0.24982, 0.74947, 0, 0, 0.27764],
-    "93": [0.24982, 0.74947, 0, 0, 0.27764],
-    "94": [0, 0.69141, 0, 0, 0.49965],
-    "97": [0, 0.47534, 0, 0, 0.50046],
-    "98": [0, 0.69141, 0, 0, 0.51315],
-    "99": [0, 0.47534, 0, 0, 0.38946],
-    "100": [0, 0.62119, 0, 0, 0.49857],
-    "101": [0, 0.47534, 0, 0, 0.40053],
-    "102": [0.18906, 0.69141, 0, 0, 0.32626],
-    "103": [0.18906, 0.47534, 0, 0, 0.5037],
-    "104": [0.18906, 0.69141, 0, 0, 0.52126],
-    "105": [0, 0.69141, 0, 0, 0.27899],
-    "106": [0, 0.69141, 0, 0, 0.28088],
-    "107": [0, 0.69141, 0, 0, 0.38946],
-    "108": [0, 0.69141, 0, 0, 0.27953],
-    "109": [0, 0.47534, 0, 0, 0.76676],
-    "110": [0, 0.47534, 0, 0, 0.52666],
-    "111": [0, 0.47534, 0, 0, 0.48885],
-    "112": [0.18906, 0.52396, 0, 0, 0.50046],
-    "113": [0.18906, 0.47534, 0, 0, 0.48912],
-    "114": [0, 0.47534, 0, 0, 0.38919],
-    "115": [0, 0.47534, 0, 0, 0.44266],
-    "116": [0, 0.62119, 0, 0, 0.33301],
-    "117": [0, 0.47534, 0, 0, 0.5172],
-    "118": [0, 0.52396, 0, 0, 0.5118],
-    "119": [0, 0.52396, 0, 0, 0.77351],
-    "120": [0.18906, 0.47534, 0, 0, 0.38865],
-    "121": [0.18906, 0.47534, 0, 0, 0.49884],
-    "122": [0.18906, 0.47534, 0, 0, 0.39054],
-    "8216": [0, 0.69141, 0, 0, 0.21471],
-    "8217": [0, 0.69141, 0, 0, 0.21471],
-    "58112": [0, 0.62119, 0, 0, 0.49749],
-    "58113": [0, 0.62119, 0, 0, 0.4983],
-    "58114": [0.18906, 0.69141, 0, 0, 0.33328],
-    "58115": [0.18906, 0.69141, 0, 0, 0.32923],
-    "58116": [0.18906, 0.47534, 0, 0, 0.50343],
-    "58117": [0, 0.69141, 0, 0, 0.33301],
-    "58118": [0, 0.62119, 0, 0, 0.33409],
-    "58119": [0, 0.47534, 0, 0, 0.50073]
-  },
-  "Main-Bold": {
-    "33": [0, 0.69444, 0, 0, 0.35],
-    "34": [0, 0.69444, 0, 0, 0.60278],
-    "35": [0.19444, 0.69444, 0, 0, 0.95833],
-    "36": [0.05556, 0.75, 0, 0, 0.575],
-    "37": [0.05556, 0.75, 0, 0, 0.95833],
-    "38": [0, 0.69444, 0, 0, 0.89444],
-    "39": [0, 0.69444, 0, 0, 0.31944],
-    "40": [0.25, 0.75, 0, 0, 0.44722],
-    "41": [0.25, 0.75, 0, 0, 0.44722],
-    "42": [0, 0.75, 0, 0, 0.575],
-    "43": [0.13333, 0.63333, 0, 0, 0.89444],
-    "44": [0.19444, 0.15556, 0, 0, 0.31944],
-    "45": [0, 0.44444, 0, 0, 0.38333],
-    "46": [0, 0.15556, 0, 0, 0.31944],
-    "47": [0.25, 0.75, 0, 0, 0.575],
-    "48": [0, 0.64444, 0, 0, 0.575],
-    "49": [0, 0.64444, 0, 0, 0.575],
-    "50": [0, 0.64444, 0, 0, 0.575],
-    "51": [0, 0.64444, 0, 0, 0.575],
-    "52": [0, 0.64444, 0, 0, 0.575],
-    "53": [0, 0.64444, 0, 0, 0.575],
-    "54": [0, 0.64444, 0, 0, 0.575],
-    "55": [0, 0.64444, 0, 0, 0.575],
-    "56": [0, 0.64444, 0, 0, 0.575],
-    "57": [0, 0.64444, 0, 0, 0.575],
-    "58": [0, 0.44444, 0, 0, 0.31944],
-    "59": [0.19444, 0.44444, 0, 0, 0.31944],
-    "60": [0.08556, 0.58556, 0, 0, 0.89444],
-    "61": [-0.10889, 0.39111, 0, 0, 0.89444],
-    "62": [0.08556, 0.58556, 0, 0, 0.89444],
-    "63": [0, 0.69444, 0, 0, 0.54305],
-    "64": [0, 0.69444, 0, 0, 0.89444],
-    "65": [0, 0.68611, 0, 0, 0.86944],
-    "66": [0, 0.68611, 0, 0, 0.81805],
-    "67": [0, 0.68611, 0, 0, 0.83055],
-    "68": [0, 0.68611, 0, 0, 0.88194],
-    "69": [0, 0.68611, 0, 0, 0.75555],
-    "70": [0, 0.68611, 0, 0, 0.72361],
-    "71": [0, 0.68611, 0, 0, 0.90416],
-    "72": [0, 0.68611, 0, 0, 0.9],
-    "73": [0, 0.68611, 0, 0, 0.43611],
-    "74": [0, 0.68611, 0, 0, 0.59444],
-    "75": [0, 0.68611, 0, 0, 0.90138],
-    "76": [0, 0.68611, 0, 0, 0.69166],
-    "77": [0, 0.68611, 0, 0, 1.09166],
-    "78": [0, 0.68611, 0, 0, 0.9],
-    "79": [0, 0.68611, 0, 0, 0.86388],
-    "80": [0, 0.68611, 0, 0, 0.78611],
-    "81": [0.19444, 0.68611, 0, 0, 0.86388],
-    "82": [0, 0.68611, 0, 0, 0.8625],
-    "83": [0, 0.68611, 0, 0, 0.63889],
-    "84": [0, 0.68611, 0, 0, 0.8],
-    "85": [0, 0.68611, 0, 0, 0.88472],
-    "86": [0, 0.68611, 0.01597, 0, 0.86944],
-    "87": [0, 0.68611, 0.01597, 0, 1.18888],
-    "88": [0, 0.68611, 0, 0, 0.86944],
-    "89": [0, 0.68611, 0.02875, 0, 0.86944],
-    "90": [0, 0.68611, 0, 0, 0.70277],
-    "91": [0.25, 0.75, 0, 0, 0.31944],
-    "92": [0.25, 0.75, 0, 0, 0.575],
-    "93": [0.25, 0.75, 0, 0, 0.31944],
-    "94": [0, 0.69444, 0, 0, 0.575],
-    "95": [0.31, 0.13444, 0.03194, 0, 0.575],
-    "97": [0, 0.44444, 0, 0, 0.55902],
-    "98": [0, 0.69444, 0, 0, 0.63889],
-    "99": [0, 0.44444, 0, 0, 0.51111],
-    "100": [0, 0.69444, 0, 0, 0.63889],
-    "101": [0, 0.44444, 0, 0, 0.52708],
-    "102": [0, 0.69444, 0.10903, 0, 0.35139],
-    "103": [0.19444, 0.44444, 0.01597, 0, 0.575],
-    "104": [0, 0.69444, 0, 0, 0.63889],
-    "105": [0, 0.69444, 0, 0, 0.31944],
-    "106": [0.19444, 0.69444, 0, 0, 0.35139],
-    "107": [0, 0.69444, 0, 0, 0.60694],
-    "108": [0, 0.69444, 0, 0, 0.31944],
-    "109": [0, 0.44444, 0, 0, 0.95833],
-    "110": [0, 0.44444, 0, 0, 0.63889],
-    "111": [0, 0.44444, 0, 0, 0.575],
-    "112": [0.19444, 0.44444, 0, 0, 0.63889],
-    "113": [0.19444, 0.44444, 0, 0, 0.60694],
-    "114": [0, 0.44444, 0, 0, 0.47361],
-    "115": [0, 0.44444, 0, 0, 0.45361],
-    "116": [0, 0.63492, 0, 0, 0.44722],
-    "117": [0, 0.44444, 0, 0, 0.63889],
-    "118": [0, 0.44444, 0.01597, 0, 0.60694],
-    "119": [0, 0.44444, 0.01597, 0, 0.83055],
-    "120": [0, 0.44444, 0, 0, 0.60694],
-    "121": [0.19444, 0.44444, 0.01597, 0, 0.60694],
-    "122": [0, 0.44444, 0, 0, 0.51111],
-    "123": [0.25, 0.75, 0, 0, 0.575],
-    "124": [0.25, 0.75, 0, 0, 0.31944],
-    "125": [0.25, 0.75, 0, 0, 0.575],
-    "126": [0.35, 0.34444, 0, 0, 0.575],
-    "168": [0, 0.69444, 0, 0, 0.575],
-    "172": [0, 0.44444, 0, 0, 0.76666],
-    "176": [0, 0.69444, 0, 0, 0.86944],
-    "177": [0.13333, 0.63333, 0, 0, 0.89444],
-    "184": [0.17014, 0, 0, 0, 0.51111],
-    "198": [0, 0.68611, 0, 0, 1.04166],
-    "215": [0.13333, 0.63333, 0, 0, 0.89444],
-    "216": [0.04861, 0.73472, 0, 0, 0.89444],
-    "223": [0, 0.69444, 0, 0, 0.59722],
-    "230": [0, 0.44444, 0, 0, 0.83055],
-    "247": [0.13333, 0.63333, 0, 0, 0.89444],
-    "248": [0.09722, 0.54167, 0, 0, 0.575],
-    "305": [0, 0.44444, 0, 0, 0.31944],
-    "338": [0, 0.68611, 0, 0, 1.16944],
-    "339": [0, 0.44444, 0, 0, 0.89444],
-    "567": [0.19444, 0.44444, 0, 0, 0.35139],
-    "710": [0, 0.69444, 0, 0, 0.575],
-    "711": [0, 0.63194, 0, 0, 0.575],
-    "713": [0, 0.59611, 0, 0, 0.575],
-    "714": [0, 0.69444, 0, 0, 0.575],
-    "715": [0, 0.69444, 0, 0, 0.575],
-    "728": [0, 0.69444, 0, 0, 0.575],
-    "729": [0, 0.69444, 0, 0, 0.31944],
-    "730": [0, 0.69444, 0, 0, 0.86944],
-    "732": [0, 0.69444, 0, 0, 0.575],
-    "733": [0, 0.69444, 0, 0, 0.575],
-    "915": [0, 0.68611, 0, 0, 0.69166],
-    "916": [0, 0.68611, 0, 0, 0.95833],
-    "920": [0, 0.68611, 0, 0, 0.89444],
-    "923": [0, 0.68611, 0, 0, 0.80555],
-    "926": [0, 0.68611, 0, 0, 0.76666],
-    "928": [0, 0.68611, 0, 0, 0.9],
-    "931": [0, 0.68611, 0, 0, 0.83055],
-    "933": [0, 0.68611, 0, 0, 0.89444],
-    "934": [0, 0.68611, 0, 0, 0.83055],
-    "936": [0, 0.68611, 0, 0, 0.89444],
-    "937": [0, 0.68611, 0, 0, 0.83055],
-    "8211": [0, 0.44444, 0.03194, 0, 0.575],
-    "8212": [0, 0.44444, 0.03194, 0, 1.14999],
-    "8216": [0, 0.69444, 0, 0, 0.31944],
-    "8217": [0, 0.69444, 0, 0, 0.31944],
-    "8220": [0, 0.69444, 0, 0, 0.60278],
-    "8221": [0, 0.69444, 0, 0, 0.60278],
-    "8224": [0.19444, 0.69444, 0, 0, 0.51111],
-    "8225": [0.19444, 0.69444, 0, 0, 0.51111],
-    "8242": [0, 0.55556, 0, 0, 0.34444],
-    "8407": [0, 0.72444, 0.15486, 0, 0.575],
-    "8463": [0, 0.69444, 0, 0, 0.66759],
-    "8465": [0, 0.69444, 0, 0, 0.83055],
-    "8467": [0, 0.69444, 0, 0, 0.47361],
-    "8472": [0.19444, 0.44444, 0, 0, 0.74027],
-    "8476": [0, 0.69444, 0, 0, 0.83055],
-    "8501": [0, 0.69444, 0, 0, 0.70277],
-    "8592": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8593": [0.19444, 0.69444, 0, 0, 0.575],
-    "8594": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8595": [0.19444, 0.69444, 0, 0, 0.575],
-    "8596": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8597": [0.25, 0.75, 0, 0, 0.575],
-    "8598": [0.19444, 0.69444, 0, 0, 1.14999],
-    "8599": [0.19444, 0.69444, 0, 0, 1.14999],
-    "8600": [0.19444, 0.69444, 0, 0, 1.14999],
-    "8601": [0.19444, 0.69444, 0, 0, 1.14999],
-    "8636": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8637": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8640": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8641": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8656": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8657": [0.19444, 0.69444, 0, 0, 0.70277],
-    "8658": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8659": [0.19444, 0.69444, 0, 0, 0.70277],
-    "8660": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8661": [0.25, 0.75, 0, 0, 0.70277],
-    "8704": [0, 0.69444, 0, 0, 0.63889],
-    "8706": [0, 0.69444, 0.06389, 0, 0.62847],
-    "8707": [0, 0.69444, 0, 0, 0.63889],
-    "8709": [0.05556, 0.75, 0, 0, 0.575],
-    "8711": [0, 0.68611, 0, 0, 0.95833],
-    "8712": [0.08556, 0.58556, 0, 0, 0.76666],
-    "8715": [0.08556, 0.58556, 0, 0, 0.76666],
-    "8722": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8723": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8725": [0.25, 0.75, 0, 0, 0.575],
-    "8726": [0.25, 0.75, 0, 0, 0.575],
-    "8727": [-0.02778, 0.47222, 0, 0, 0.575],
-    "8728": [-0.02639, 0.47361, 0, 0, 0.575],
-    "8729": [-0.02639, 0.47361, 0, 0, 0.575],
-    "8730": [0.18, 0.82, 0, 0, 0.95833],
-    "8733": [0, 0.44444, 0, 0, 0.89444],
-    "8734": [0, 0.44444, 0, 0, 1.14999],
-    "8736": [0, 0.69224, 0, 0, 0.72222],
-    "8739": [0.25, 0.75, 0, 0, 0.31944],
-    "8741": [0.25, 0.75, 0, 0, 0.575],
-    "8743": [0, 0.55556, 0, 0, 0.76666],
-    "8744": [0, 0.55556, 0, 0, 0.76666],
-    "8745": [0, 0.55556, 0, 0, 0.76666],
-    "8746": [0, 0.55556, 0, 0, 0.76666],
-    "8747": [0.19444, 0.69444, 0.12778, 0, 0.56875],
-    "8764": [-0.10889, 0.39111, 0, 0, 0.89444],
-    "8768": [0.19444, 0.69444, 0, 0, 0.31944],
-    "8771": [0.00222, 0.50222, 0, 0, 0.89444],
-    "8776": [0.02444, 0.52444, 0, 0, 0.89444],
-    "8781": [0.00222, 0.50222, 0, 0, 0.89444],
-    "8801": [0.00222, 0.50222, 0, 0, 0.89444],
-    "8804": [0.19667, 0.69667, 0, 0, 0.89444],
-    "8805": [0.19667, 0.69667, 0, 0, 0.89444],
-    "8810": [0.08556, 0.58556, 0, 0, 1.14999],
-    "8811": [0.08556, 0.58556, 0, 0, 1.14999],
-    "8826": [0.08556, 0.58556, 0, 0, 0.89444],
-    "8827": [0.08556, 0.58556, 0, 0, 0.89444],
-    "8834": [0.08556, 0.58556, 0, 0, 0.89444],
-    "8835": [0.08556, 0.58556, 0, 0, 0.89444],
-    "8838": [0.19667, 0.69667, 0, 0, 0.89444],
-    "8839": [0.19667, 0.69667, 0, 0, 0.89444],
-    "8846": [0, 0.55556, 0, 0, 0.76666],
-    "8849": [0.19667, 0.69667, 0, 0, 0.89444],
-    "8850": [0.19667, 0.69667, 0, 0, 0.89444],
-    "8851": [0, 0.55556, 0, 0, 0.76666],
-    "8852": [0, 0.55556, 0, 0, 0.76666],
-    "8853": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8854": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8855": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8856": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8857": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8866": [0, 0.69444, 0, 0, 0.70277],
-    "8867": [0, 0.69444, 0, 0, 0.70277],
-    "8868": [0, 0.69444, 0, 0, 0.89444],
-    "8869": [0, 0.69444, 0, 0, 0.89444],
-    "8900": [-0.02639, 0.47361, 0, 0, 0.575],
-    "8901": [-0.02639, 0.47361, 0, 0, 0.31944],
-    "8902": [-0.02778, 0.47222, 0, 0, 0.575],
-    "8968": [0.25, 0.75, 0, 0, 0.51111],
-    "8969": [0.25, 0.75, 0, 0, 0.51111],
-    "8970": [0.25, 0.75, 0, 0, 0.51111],
-    "8971": [0.25, 0.75, 0, 0, 0.51111],
-    "8994": [-0.13889, 0.36111, 0, 0, 1.14999],
-    "8995": [-0.13889, 0.36111, 0, 0, 1.14999],
-    "9651": [0.19444, 0.69444, 0, 0, 1.02222],
-    "9657": [-0.02778, 0.47222, 0, 0, 0.575],
-    "9661": [0.19444, 0.69444, 0, 0, 1.02222],
-    "9667": [-0.02778, 0.47222, 0, 0, 0.575],
-    "9711": [0.19444, 0.69444, 0, 0, 1.14999],
-    "9824": [0.12963, 0.69444, 0, 0, 0.89444],
-    "9825": [0.12963, 0.69444, 0, 0, 0.89444],
-    "9826": [0.12963, 0.69444, 0, 0, 0.89444],
-    "9827": [0.12963, 0.69444, 0, 0, 0.89444],
-    "9837": [0, 0.75, 0, 0, 0.44722],
-    "9838": [0.19444, 0.69444, 0, 0, 0.44722],
-    "9839": [0.19444, 0.69444, 0, 0, 0.44722],
-    "10216": [0.25, 0.75, 0, 0, 0.44722],
-    "10217": [0.25, 0.75, 0, 0, 0.44722],
-    "10815": [0, 0.68611, 0, 0, 0.9],
-    "10927": [0.19667, 0.69667, 0, 0, 0.89444],
-    "10928": [0.19667, 0.69667, 0, 0, 0.89444],
-    "57376": [0.19444, 0.69444, 0, 0, 0]
-  },
-  "Main-BoldItalic": {
-    "33": [0, 0.69444, 0.11417, 0, 0.38611],
-    "34": [0, 0.69444, 0.07939, 0, 0.62055],
-    "35": [0.19444, 0.69444, 0.06833, 0, 0.94444],
-    "37": [0.05556, 0.75, 0.12861, 0, 0.94444],
-    "38": [0, 0.69444, 0.08528, 0, 0.88555],
-    "39": [0, 0.69444, 0.12945, 0, 0.35555],
-    "40": [0.25, 0.75, 0.15806, 0, 0.47333],
-    "41": [0.25, 0.75, 0.03306, 0, 0.47333],
-    "42": [0, 0.75, 0.14333, 0, 0.59111],
-    "43": [0.10333, 0.60333, 0.03306, 0, 0.88555],
-    "44": [0.19444, 0.14722, 0, 0, 0.35555],
-    "45": [0, 0.44444, 0.02611, 0, 0.41444],
-    "46": [0, 0.14722, 0, 0, 0.35555],
-    "47": [0.25, 0.75, 0.15806, 0, 0.59111],
-    "48": [0, 0.64444, 0.13167, 0, 0.59111],
-    "49": [0, 0.64444, 0.13167, 0, 0.59111],
-    "50": [0, 0.64444, 0.13167, 0, 0.59111],
-    "51": [0, 0.64444, 0.13167, 0, 0.59111],
-    "52": [0.19444, 0.64444, 0.13167, 0, 0.59111],
-    "53": [0, 0.64444, 0.13167, 0, 0.59111],
-    "54": [0, 0.64444, 0.13167, 0, 0.59111],
-    "55": [0.19444, 0.64444, 0.13167, 0, 0.59111],
-    "56": [0, 0.64444, 0.13167, 0, 0.59111],
-    "57": [0, 0.64444, 0.13167, 0, 0.59111],
-    "58": [0, 0.44444, 0.06695, 0, 0.35555],
-    "59": [0.19444, 0.44444, 0.06695, 0, 0.35555],
-    "61": [-0.10889, 0.39111, 0.06833, 0, 0.88555],
-    "63": [0, 0.69444, 0.11472, 0, 0.59111],
-    "64": [0, 0.69444, 0.09208, 0, 0.88555],
-    "65": [0, 0.68611, 0, 0, 0.86555],
-    "66": [0, 0.68611, 0.0992, 0, 0.81666],
-    "67": [0, 0.68611, 0.14208, 0, 0.82666],
-    "68": [0, 0.68611, 0.09062, 0, 0.87555],
-    "69": [0, 0.68611, 0.11431, 0, 0.75666],
-    "70": [0, 0.68611, 0.12903, 0, 0.72722],
-    "71": [0, 0.68611, 0.07347, 0, 0.89527],
-    "72": [0, 0.68611, 0.17208, 0, 0.8961],
-    "73": [0, 0.68611, 0.15681, 0, 0.47166],
-    "74": [0, 0.68611, 0.145, 0, 0.61055],
-    "75": [0, 0.68611, 0.14208, 0, 0.89499],
-    "76": [0, 0.68611, 0, 0, 0.69777],
-    "77": [0, 0.68611, 0.17208, 0, 1.07277],
-    "78": [0, 0.68611, 0.17208, 0, 0.8961],
-    "79": [0, 0.68611, 0.09062, 0, 0.85499],
-    "80": [0, 0.68611, 0.0992, 0, 0.78721],
-    "81": [0.19444, 0.68611, 0.09062, 0, 0.85499],
-    "82": [0, 0.68611, 0.02559, 0, 0.85944],
-    "83": [0, 0.68611, 0.11264, 0, 0.64999],
-    "84": [0, 0.68611, 0.12903, 0, 0.7961],
-    "85": [0, 0.68611, 0.17208, 0, 0.88083],
-    "86": [0, 0.68611, 0.18625, 0, 0.86555],
-    "87": [0, 0.68611, 0.18625, 0, 1.15999],
-    "88": [0, 0.68611, 0.15681, 0, 0.86555],
-    "89": [0, 0.68611, 0.19803, 0, 0.86555],
-    "90": [0, 0.68611, 0.14208, 0, 0.70888],
-    "91": [0.25, 0.75, 0.1875, 0, 0.35611],
-    "93": [0.25, 0.75, 0.09972, 0, 0.35611],
-    "94": [0, 0.69444, 0.06709, 0, 0.59111],
-    "95": [0.31, 0.13444, 0.09811, 0, 0.59111],
-    "97": [0, 0.44444, 0.09426, 0, 0.59111],
-    "98": [0, 0.69444, 0.07861, 0, 0.53222],
-    "99": [0, 0.44444, 0.05222, 0, 0.53222],
-    "100": [0, 0.69444, 0.10861, 0, 0.59111],
-    "101": [0, 0.44444, 0.085, 0, 0.53222],
-    "102": [0.19444, 0.69444, 0.21778, 0, 0.4],
-    "103": [0.19444, 0.44444, 0.105, 0, 0.53222],
-    "104": [0, 0.69444, 0.09426, 0, 0.59111],
-    "105": [0, 0.69326, 0.11387, 0, 0.35555],
-    "106": [0.19444, 0.69326, 0.1672, 0, 0.35555],
-    "107": [0, 0.69444, 0.11111, 0, 0.53222],
-    "108": [0, 0.69444, 0.10861, 0, 0.29666],
-    "109": [0, 0.44444, 0.09426, 0, 0.94444],
-    "110": [0, 0.44444, 0.09426, 0, 0.64999],
-    "111": [0, 0.44444, 0.07861, 0, 0.59111],
-    "112": [0.19444, 0.44444, 0.07861, 0, 0.59111],
-    "113": [0.19444, 0.44444, 0.105, 0, 0.53222],
-    "114": [0, 0.44444, 0.11111, 0, 0.50167],
-    "115": [0, 0.44444, 0.08167, 0, 0.48694],
-    "116": [0, 0.63492, 0.09639, 0, 0.385],
-    "117": [0, 0.44444, 0.09426, 0, 0.62055],
-    "118": [0, 0.44444, 0.11111, 0, 0.53222],
-    "119": [0, 0.44444, 0.11111, 0, 0.76777],
-    "120": [0, 0.44444, 0.12583, 0, 0.56055],
-    "121": [0.19444, 0.44444, 0.105, 0, 0.56166],
-    "122": [0, 0.44444, 0.13889, 0, 0.49055],
-    "126": [0.35, 0.34444, 0.11472, 0, 0.59111],
-    "163": [0, 0.69444, 0, 0, 0.86853],
-    "168": [0, 0.69444, 0.11473, 0, 0.59111],
-    "176": [0, 0.69444, 0, 0, 0.94888],
-    "184": [0.17014, 0, 0, 0, 0.53222],
-    "198": [0, 0.68611, 0.11431, 0, 1.02277],
-    "216": [0.04861, 0.73472, 0.09062, 0, 0.88555],
-    "223": [0.19444, 0.69444, 0.09736, 0, 0.665],
-    "230": [0, 0.44444, 0.085, 0, 0.82666],
-    "248": [0.09722, 0.54167, 0.09458, 0, 0.59111],
-    "305": [0, 0.44444, 0.09426, 0, 0.35555],
-    "338": [0, 0.68611, 0.11431, 0, 1.14054],
-    "339": [0, 0.44444, 0.085, 0, 0.82666],
-    "567": [0.19444, 0.44444, 0.04611, 0, 0.385],
-    "710": [0, 0.69444, 0.06709, 0, 0.59111],
-    "711": [0, 0.63194, 0.08271, 0, 0.59111],
-    "713": [0, 0.59444, 0.10444, 0, 0.59111],
-    "714": [0, 0.69444, 0.08528, 0, 0.59111],
-    "715": [0, 0.69444, 0, 0, 0.59111],
-    "728": [0, 0.69444, 0.10333, 0, 0.59111],
-    "729": [0, 0.69444, 0.12945, 0, 0.35555],
-    "730": [0, 0.69444, 0, 0, 0.94888],
-    "732": [0, 0.69444, 0.11472, 0, 0.59111],
-    "733": [0, 0.69444, 0.11472, 0, 0.59111],
-    "915": [0, 0.68611, 0.12903, 0, 0.69777],
-    "916": [0, 0.68611, 0, 0, 0.94444],
-    "920": [0, 0.68611, 0.09062, 0, 0.88555],
-    "923": [0, 0.68611, 0, 0, 0.80666],
-    "926": [0, 0.68611, 0.15092, 0, 0.76777],
-    "928": [0, 0.68611, 0.17208, 0, 0.8961],
-    "931": [0, 0.68611, 0.11431, 0, 0.82666],
-    "933": [0, 0.68611, 0.10778, 0, 0.88555],
-    "934": [0, 0.68611, 0.05632, 0, 0.82666],
-    "936": [0, 0.68611, 0.10778, 0, 0.88555],
-    "937": [0, 0.68611, 0.0992, 0, 0.82666],
-    "8211": [0, 0.44444, 0.09811, 0, 0.59111],
-    "8212": [0, 0.44444, 0.09811, 0, 1.18221],
-    "8216": [0, 0.69444, 0.12945, 0, 0.35555],
-    "8217": [0, 0.69444, 0.12945, 0, 0.35555],
-    "8220": [0, 0.69444, 0.16772, 0, 0.62055],
-    "8221": [0, 0.69444, 0.07939, 0, 0.62055]
-  },
-  "Main-Italic": {
-    "33": [0, 0.69444, 0.12417, 0, 0.30667],
-    "34": [0, 0.69444, 0.06961, 0, 0.51444],
-    "35": [0.19444, 0.69444, 0.06616, 0, 0.81777],
-    "37": [0.05556, 0.75, 0.13639, 0, 0.81777],
-    "38": [0, 0.69444, 0.09694, 0, 0.76666],
-    "39": [0, 0.69444, 0.12417, 0, 0.30667],
-    "40": [0.25, 0.75, 0.16194, 0, 0.40889],
-    "41": [0.25, 0.75, 0.03694, 0, 0.40889],
-    "42": [0, 0.75, 0.14917, 0, 0.51111],
-    "43": [0.05667, 0.56167, 0.03694, 0, 0.76666],
-    "44": [0.19444, 0.10556, 0, 0, 0.30667],
-    "45": [0, 0.43056, 0.02826, 0, 0.35778],
-    "46": [0, 0.10556, 0, 0, 0.30667],
-    "47": [0.25, 0.75, 0.16194, 0, 0.51111],
-    "48": [0, 0.64444, 0.13556, 0, 0.51111],
-    "49": [0, 0.64444, 0.13556, 0, 0.51111],
-    "50": [0, 0.64444, 0.13556, 0, 0.51111],
-    "51": [0, 0.64444, 0.13556, 0, 0.51111],
-    "52": [0.19444, 0.64444, 0.13556, 0, 0.51111],
-    "53": [0, 0.64444, 0.13556, 0, 0.51111],
-    "54": [0, 0.64444, 0.13556, 0, 0.51111],
-    "55": [0.19444, 0.64444, 0.13556, 0, 0.51111],
-    "56": [0, 0.64444, 0.13556, 0, 0.51111],
-    "57": [0, 0.64444, 0.13556, 0, 0.51111],
-    "58": [0, 0.43056, 0.0582, 0, 0.30667],
-    "59": [0.19444, 0.43056, 0.0582, 0, 0.30667],
-    "61": [-0.13313, 0.36687, 0.06616, 0, 0.76666],
-    "63": [0, 0.69444, 0.1225, 0, 0.51111],
-    "64": [0, 0.69444, 0.09597, 0, 0.76666],
-    "65": [0, 0.68333, 0, 0, 0.74333],
-    "66": [0, 0.68333, 0.10257, 0, 0.70389],
-    "67": [0, 0.68333, 0.14528, 0, 0.71555],
-    "68": [0, 0.68333, 0.09403, 0, 0.755],
-    "69": [0, 0.68333, 0.12028, 0, 0.67833],
-    "70": [0, 0.68333, 0.13305, 0, 0.65277],
-    "71": [0, 0.68333, 0.08722, 0, 0.77361],
-    "72": [0, 0.68333, 0.16389, 0, 0.74333],
-    "73": [0, 0.68333, 0.15806, 0, 0.38555],
-    "74": [0, 0.68333, 0.14028, 0, 0.525],
-    "75": [0, 0.68333, 0.14528, 0, 0.76888],
-    "76": [0, 0.68333, 0, 0, 0.62722],
-    "77": [0, 0.68333, 0.16389, 0, 0.89666],
-    "78": [0, 0.68333, 0.16389, 0, 0.74333],
-    "79": [0, 0.68333, 0.09403, 0, 0.76666],
-    "80": [0, 0.68333, 0.10257, 0, 0.67833],
-    "81": [0.19444, 0.68333, 0.09403, 0, 0.76666],
-    "82": [0, 0.68333, 0.03868, 0, 0.72944],
-    "83": [0, 0.68333, 0.11972, 0, 0.56222],
-    "84": [0, 0.68333, 0.13305, 0, 0.71555],
-    "85": [0, 0.68333, 0.16389, 0, 0.74333],
-    "86": [0, 0.68333, 0.18361, 0, 0.74333],
-    "87": [0, 0.68333, 0.18361, 0, 0.99888],
-    "88": [0, 0.68333, 0.15806, 0, 0.74333],
-    "89": [0, 0.68333, 0.19383, 0, 0.74333],
-    "90": [0, 0.68333, 0.14528, 0, 0.61333],
-    "91": [0.25, 0.75, 0.1875, 0, 0.30667],
-    "93": [0.25, 0.75, 0.10528, 0, 0.30667],
-    "94": [0, 0.69444, 0.06646, 0, 0.51111],
-    "95": [0.31, 0.12056, 0.09208, 0, 0.51111],
-    "97": [0, 0.43056, 0.07671, 0, 0.51111],
-    "98": [0, 0.69444, 0.06312, 0, 0.46],
-    "99": [0, 0.43056, 0.05653, 0, 0.46],
-    "100": [0, 0.69444, 0.10333, 0, 0.51111],
-    "101": [0, 0.43056, 0.07514, 0, 0.46],
-    "102": [0.19444, 0.69444, 0.21194, 0, 0.30667],
-    "103": [0.19444, 0.43056, 0.08847, 0, 0.46],
-    "104": [0, 0.69444, 0.07671, 0, 0.51111],
-    "105": [0, 0.65536, 0.1019, 0, 0.30667],
-    "106": [0.19444, 0.65536, 0.14467, 0, 0.30667],
-    "107": [0, 0.69444, 0.10764, 0, 0.46],
-    "108": [0, 0.69444, 0.10333, 0, 0.25555],
-    "109": [0, 0.43056, 0.07671, 0, 0.81777],
-    "110": [0, 0.43056, 0.07671, 0, 0.56222],
-    "111": [0, 0.43056, 0.06312, 0, 0.51111],
-    "112": [0.19444, 0.43056, 0.06312, 0, 0.51111],
-    "113": [0.19444, 0.43056, 0.08847, 0, 0.46],
-    "114": [0, 0.43056, 0.10764, 0, 0.42166],
-    "115": [0, 0.43056, 0.08208, 0, 0.40889],
-    "116": [0, 0.61508, 0.09486, 0, 0.33222],
-    "117": [0, 0.43056, 0.07671, 0, 0.53666],
-    "118": [0, 0.43056, 0.10764, 0, 0.46],
-    "119": [0, 0.43056, 0.10764, 0, 0.66444],
-    "120": [0, 0.43056, 0.12042, 0, 0.46389],
-    "121": [0.19444, 0.43056, 0.08847, 0, 0.48555],
-    "122": [0, 0.43056, 0.12292, 0, 0.40889],
-    "126": [0.35, 0.31786, 0.11585, 0, 0.51111],
-    "163": [0, 0.69444, 0, 0, 0.76909],
-    "168": [0, 0.66786, 0.10474, 0, 0.51111],
-    "176": [0, 0.69444, 0, 0, 0.83129],
-    "184": [0.17014, 0, 0, 0, 0.46],
-    "198": [0, 0.68333, 0.12028, 0, 0.88277],
-    "216": [0.04861, 0.73194, 0.09403, 0, 0.76666],
-    "223": [0.19444, 0.69444, 0.10514, 0, 0.53666],
-    "230": [0, 0.43056, 0.07514, 0, 0.71555],
-    "248": [0.09722, 0.52778, 0.09194, 0, 0.51111],
-    "305": [0, 0.43056, 0, 0.02778, 0.32246],
-    "338": [0, 0.68333, 0.12028, 0, 0.98499],
-    "339": [0, 0.43056, 0.07514, 0, 0.71555],
-    "567": [0.19444, 0.43056, 0, 0.08334, 0.38403],
-    "710": [0, 0.69444, 0.06646, 0, 0.51111],
-    "711": [0, 0.62847, 0.08295, 0, 0.51111],
-    "713": [0, 0.56167, 0.10333, 0, 0.51111],
-    "714": [0, 0.69444, 0.09694, 0, 0.51111],
-    "715": [0, 0.69444, 0, 0, 0.51111],
-    "728": [0, 0.69444, 0.10806, 0, 0.51111],
-    "729": [0, 0.66786, 0.11752, 0, 0.30667],
-    "730": [0, 0.69444, 0, 0, 0.83129],
-    "732": [0, 0.66786, 0.11585, 0, 0.51111],
-    "733": [0, 0.69444, 0.1225, 0, 0.51111],
-    "915": [0, 0.68333, 0.13305, 0, 0.62722],
-    "916": [0, 0.68333, 0, 0, 0.81777],
-    "920": [0, 0.68333, 0.09403, 0, 0.76666],
-    "923": [0, 0.68333, 0, 0, 0.69222],
-    "926": [0, 0.68333, 0.15294, 0, 0.66444],
-    "928": [0, 0.68333, 0.16389, 0, 0.74333],
-    "931": [0, 0.68333, 0.12028, 0, 0.71555],
-    "933": [0, 0.68333, 0.11111, 0, 0.76666],
-    "934": [0, 0.68333, 0.05986, 0, 0.71555],
-    "936": [0, 0.68333, 0.11111, 0, 0.76666],
-    "937": [0, 0.68333, 0.10257, 0, 0.71555],
-    "8211": [0, 0.43056, 0.09208, 0, 0.51111],
-    "8212": [0, 0.43056, 0.09208, 0, 1.02222],
-    "8216": [0, 0.69444, 0.12417, 0, 0.30667],
-    "8217": [0, 0.69444, 0.12417, 0, 0.30667],
-    "8220": [0, 0.69444, 0.1685, 0, 0.51444],
-    "8221": [0, 0.69444, 0.06961, 0, 0.51444],
-    "8463": [0, 0.68889, 0, 0, 0.54028]
-  },
-  "Main-Regular": {
-    "32": [0, 0, 0, 0, 0.25],
-    "33": [0, 0.69444, 0, 0, 0.27778],
-    "34": [0, 0.69444, 0, 0, 0.5],
-    "35": [0.19444, 0.69444, 0, 0, 0.83334],
-    "36": [0.05556, 0.75, 0, 0, 0.5],
-    "37": [0.05556, 0.75, 0, 0, 0.83334],
-    "38": [0, 0.69444, 0, 0, 0.77778],
-    "39": [0, 0.69444, 0, 0, 0.27778],
-    "40": [0.25, 0.75, 0, 0, 0.38889],
-    "41": [0.25, 0.75, 0, 0, 0.38889],
-    "42": [0, 0.75, 0, 0, 0.5],
-    "43": [0.08333, 0.58333, 0, 0, 0.77778],
-    "44": [0.19444, 0.10556, 0, 0, 0.27778],
-    "45": [0, 0.43056, 0, 0, 0.33333],
-    "46": [0, 0.10556, 0, 0, 0.27778],
-    "47": [0.25, 0.75, 0, 0, 0.5],
-    "48": [0, 0.64444, 0, 0, 0.5],
-    "49": [0, 0.64444, 0, 0, 0.5],
-    "50": [0, 0.64444, 0, 0, 0.5],
-    "51": [0, 0.64444, 0, 0, 0.5],
-    "52": [0, 0.64444, 0, 0, 0.5],
-    "53": [0, 0.64444, 0, 0, 0.5],
-    "54": [0, 0.64444, 0, 0, 0.5],
-    "55": [0, 0.64444, 0, 0, 0.5],
-    "56": [0, 0.64444, 0, 0, 0.5],
-    "57": [0, 0.64444, 0, 0, 0.5],
-    "58": [0, 0.43056, 0, 0, 0.27778],
-    "59": [0.19444, 0.43056, 0, 0, 0.27778],
-    "60": [0.0391, 0.5391, 0, 0, 0.77778],
-    "61": [-0.13313, 0.36687, 0, 0, 0.77778],
-    "62": [0.0391, 0.5391, 0, 0, 0.77778],
-    "63": [0, 0.69444, 0, 0, 0.47222],
-    "64": [0, 0.69444, 0, 0, 0.77778],
-    "65": [0, 0.68333, 0, 0, 0.75],
-    "66": [0, 0.68333, 0, 0, 0.70834],
-    "67": [0, 0.68333, 0, 0, 0.72222],
-    "68": [0, 0.68333, 0, 0, 0.76389],
-    "69": [0, 0.68333, 0, 0, 0.68056],
-    "70": [0, 0.68333, 0, 0, 0.65278],
-    "71": [0, 0.68333, 0, 0, 0.78472],
-    "72": [0, 0.68333, 0, 0, 0.75],
-    "73": [0, 0.68333, 0, 0, 0.36111],
-    "74": [0, 0.68333, 0, 0, 0.51389],
-    "75": [0, 0.68333, 0, 0, 0.77778],
-    "76": [0, 0.68333, 0, 0, 0.625],
-    "77": [0, 0.68333, 0, 0, 0.91667],
-    "78": [0, 0.68333, 0, 0, 0.75],
-    "79": [0, 0.68333, 0, 0, 0.77778],
-    "80": [0, 0.68333, 0, 0, 0.68056],
-    "81": [0.19444, 0.68333, 0, 0, 0.77778],
-    "82": [0, 0.68333, 0, 0, 0.73611],
-    "83": [0, 0.68333, 0, 0, 0.55556],
-    "84": [0, 0.68333, 0, 0, 0.72222],
-    "85": [0, 0.68333, 0, 0, 0.75],
-    "86": [0, 0.68333, 0.01389, 0, 0.75],
-    "87": [0, 0.68333, 0.01389, 0, 1.02778],
-    "88": [0, 0.68333, 0, 0, 0.75],
-    "89": [0, 0.68333, 0.025, 0, 0.75],
-    "90": [0, 0.68333, 0, 0, 0.61111],
-    "91": [0.25, 0.75, 0, 0, 0.27778],
-    "92": [0.25, 0.75, 0, 0, 0.5],
-    "93": [0.25, 0.75, 0, 0, 0.27778],
-    "94": [0, 0.69444, 0, 0, 0.5],
-    "95": [0.31, 0.12056, 0.02778, 0, 0.5],
-    "97": [0, 0.43056, 0, 0, 0.5],
-    "98": [0, 0.69444, 0, 0, 0.55556],
-    "99": [0, 0.43056, 0, 0, 0.44445],
-    "100": [0, 0.69444, 0, 0, 0.55556],
-    "101": [0, 0.43056, 0, 0, 0.44445],
-    "102": [0, 0.69444, 0.07778, 0, 0.30556],
-    "103": [0.19444, 0.43056, 0.01389, 0, 0.5],
-    "104": [0, 0.69444, 0, 0, 0.55556],
-    "105": [0, 0.66786, 0, 0, 0.27778],
-    "106": [0.19444, 0.66786, 0, 0, 0.30556],
-    "107": [0, 0.69444, 0, 0, 0.52778],
-    "108": [0, 0.69444, 0, 0, 0.27778],
-    "109": [0, 0.43056, 0, 0, 0.83334],
-    "110": [0, 0.43056, 0, 0, 0.55556],
-    "111": [0, 0.43056, 0, 0, 0.5],
-    "112": [0.19444, 0.43056, 0, 0, 0.55556],
-    "113": [0.19444, 0.43056, 0, 0, 0.52778],
-    "114": [0, 0.43056, 0, 0, 0.39167],
-    "115": [0, 0.43056, 0, 0, 0.39445],
-    "116": [0, 0.61508, 0, 0, 0.38889],
-    "117": [0, 0.43056, 0, 0, 0.55556],
-    "118": [0, 0.43056, 0.01389, 0, 0.52778],
-    "119": [0, 0.43056, 0.01389, 0, 0.72222],
-    "120": [0, 0.43056, 0, 0, 0.52778],
-    "121": [0.19444, 0.43056, 0.01389, 0, 0.52778],
-    "122": [0, 0.43056, 0, 0, 0.44445],
-    "123": [0.25, 0.75, 0, 0, 0.5],
-    "124": [0.25, 0.75, 0, 0, 0.27778],
-    "125": [0.25, 0.75, 0, 0, 0.5],
-    "126": [0.35, 0.31786, 0, 0, 0.5],
-    "160": [0, 0, 0, 0, 0.25],
-    "167": [0.19444, 0.69444, 0, 0, 0.44445],
-    "168": [0, 0.66786, 0, 0, 0.5],
-    "172": [0, 0.43056, 0, 0, 0.66667],
-    "176": [0, 0.69444, 0, 0, 0.75],
-    "177": [0.08333, 0.58333, 0, 0, 0.77778],
-    "182": [0.19444, 0.69444, 0, 0, 0.61111],
-    "184": [0.17014, 0, 0, 0, 0.44445],
-    "198": [0, 0.68333, 0, 0, 0.90278],
-    "215": [0.08333, 0.58333, 0, 0, 0.77778],
-    "216": [0.04861, 0.73194, 0, 0, 0.77778],
-    "223": [0, 0.69444, 0, 0, 0.5],
-    "230": [0, 0.43056, 0, 0, 0.72222],
-    "247": [0.08333, 0.58333, 0, 0, 0.77778],
-    "248": [0.09722, 0.52778, 0, 0, 0.5],
-    "305": [0, 0.43056, 0, 0, 0.27778],
-    "338": [0, 0.68333, 0, 0, 1.01389],
-    "339": [0, 0.43056, 0, 0, 0.77778],
-    "567": [0.19444, 0.43056, 0, 0, 0.30556],
-    "710": [0, 0.69444, 0, 0, 0.5],
-    "711": [0, 0.62847, 0, 0, 0.5],
-    "713": [0, 0.56778, 0, 0, 0.5],
-    "714": [0, 0.69444, 0, 0, 0.5],
-    "715": [0, 0.69444, 0, 0, 0.5],
-    "728": [0, 0.69444, 0, 0, 0.5],
-    "729": [0, 0.66786, 0, 0, 0.27778],
-    "730": [0, 0.69444, 0, 0, 0.75],
-    "732": [0, 0.66786, 0, 0, 0.5],
-    "733": [0, 0.69444, 0, 0, 0.5],
-    "915": [0, 0.68333, 0, 0, 0.625],
-    "916": [0, 0.68333, 0, 0, 0.83334],
-    "920": [0, 0.68333, 0, 0, 0.77778],
-    "923": [0, 0.68333, 0, 0, 0.69445],
-    "926": [0, 0.68333, 0, 0, 0.66667],
-    "928": [0, 0.68333, 0, 0, 0.75],
-    "931": [0, 0.68333, 0, 0, 0.72222],
-    "933": [0, 0.68333, 0, 0, 0.77778],
-    "934": [0, 0.68333, 0, 0, 0.72222],
-    "936": [0, 0.68333, 0, 0, 0.77778],
-    "937": [0, 0.68333, 0, 0, 0.72222],
-    "8211": [0, 0.43056, 0.02778, 0, 0.5],
-    "8212": [0, 0.43056, 0.02778, 0, 1.0],
-    "8216": [0, 0.69444, 0, 0, 0.27778],
-    "8217": [0, 0.69444, 0, 0, 0.27778],
-    "8220": [0, 0.69444, 0, 0, 0.5],
-    "8221": [0, 0.69444, 0, 0, 0.5],
-    "8224": [0.19444, 0.69444, 0, 0, 0.44445],
-    "8225": [0.19444, 0.69444, 0, 0, 0.44445],
-    "8230": [0, 0.12, 0, 0, 1.172],
-    "8242": [0, 0.55556, 0, 0, 0.275],
-    "8407": [0, 0.71444, 0.15382, 0, 0.5],
-    "8463": [0, 0.68889, 0, 0, 0.54028],
-    "8465": [0, 0.69444, 0, 0, 0.72222],
-    "8467": [0, 0.69444, 0, 0.11111, 0.41667],
-    "8472": [0.19444, 0.43056, 0, 0.11111, 0.63646],
-    "8476": [0, 0.69444, 0, 0, 0.72222],
-    "8501": [0, 0.69444, 0, 0, 0.61111],
-    "8592": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8593": [0.19444, 0.69444, 0, 0, 0.5],
-    "8594": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8595": [0.19444, 0.69444, 0, 0, 0.5],
-    "8596": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8597": [0.25, 0.75, 0, 0, 0.5],
-    "8598": [0.19444, 0.69444, 0, 0, 1.0],
-    "8599": [0.19444, 0.69444, 0, 0, 1.0],
-    "8600": [0.19444, 0.69444, 0, 0, 1.0],
-    "8601": [0.19444, 0.69444, 0, 0, 1.0],
-    "8614": [0.011, 0.511, 0, 0, 1.0],
-    "8617": [0.011, 0.511, 0, 0, 1.126],
-    "8618": [0.011, 0.511, 0, 0, 1.126],
-    "8636": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8637": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8640": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8641": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8652": [0.011, 0.671, 0, 0, 1.0],
-    "8656": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8657": [0.19444, 0.69444, 0, 0, 0.61111],
-    "8658": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8659": [0.19444, 0.69444, 0, 0, 0.61111],
-    "8660": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8661": [0.25, 0.75, 0, 0, 0.61111],
-    "8704": [0, 0.69444, 0, 0, 0.55556],
-    "8706": [0, 0.69444, 0.05556, 0.08334, 0.5309],
-    "8707": [0, 0.69444, 0, 0, 0.55556],
-    "8709": [0.05556, 0.75, 0, 0, 0.5],
-    "8711": [0, 0.68333, 0, 0, 0.83334],
-    "8712": [0.0391, 0.5391, 0, 0, 0.66667],
-    "8715": [0.0391, 0.5391, 0, 0, 0.66667],
-    "8722": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8723": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8725": [0.25, 0.75, 0, 0, 0.5],
-    "8726": [0.25, 0.75, 0, 0, 0.5],
-    "8727": [-0.03472, 0.46528, 0, 0, 0.5],
-    "8728": [-0.05555, 0.44445, 0, 0, 0.5],
-    "8729": [-0.05555, 0.44445, 0, 0, 0.5],
-    "8730": [0.2, 0.8, 0, 0, 0.83334],
-    "8733": [0, 0.43056, 0, 0, 0.77778],
-    "8734": [0, 0.43056, 0, 0, 1.0],
-    "8736": [0, 0.69224, 0, 0, 0.72222],
-    "8739": [0.25, 0.75, 0, 0, 0.27778],
-    "8741": [0.25, 0.75, 0, 0, 0.5],
-    "8743": [0, 0.55556, 0, 0, 0.66667],
-    "8744": [0, 0.55556, 0, 0, 0.66667],
-    "8745": [0, 0.55556, 0, 0, 0.66667],
-    "8746": [0, 0.55556, 0, 0, 0.66667],
-    "8747": [0.19444, 0.69444, 0.11111, 0, 0.41667],
-    "8764": [-0.13313, 0.36687, 0, 0, 0.77778],
-    "8768": [0.19444, 0.69444, 0, 0, 0.27778],
-    "8771": [-0.03625, 0.46375, 0, 0, 0.77778],
-    "8773": [-0.022, 0.589, 0, 0, 1.0],
-    "8776": [-0.01688, 0.48312, 0, 0, 0.77778],
-    "8781": [-0.03625, 0.46375, 0, 0, 0.77778],
-    "8784": [-0.133, 0.67, 0, 0, 0.778],
-    "8801": [-0.03625, 0.46375, 0, 0, 0.77778],
-    "8804": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8805": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8810": [0.0391, 0.5391, 0, 0, 1.0],
-    "8811": [0.0391, 0.5391, 0, 0, 1.0],
-    "8826": [0.0391, 0.5391, 0, 0, 0.77778],
-    "8827": [0.0391, 0.5391, 0, 0, 0.77778],
-    "8834": [0.0391, 0.5391, 0, 0, 0.77778],
-    "8835": [0.0391, 0.5391, 0, 0, 0.77778],
-    "8838": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8839": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8846": [0, 0.55556, 0, 0, 0.66667],
-    "8849": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8850": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8851": [0, 0.55556, 0, 0, 0.66667],
-    "8852": [0, 0.55556, 0, 0, 0.66667],
-    "8853": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8854": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8855": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8856": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8857": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8866": [0, 0.69444, 0, 0, 0.61111],
-    "8867": [0, 0.69444, 0, 0, 0.61111],
-    "8868": [0, 0.69444, 0, 0, 0.77778],
-    "8869": [0, 0.69444, 0, 0, 0.77778],
-    "8872": [0.249, 0.75, 0, 0, 0.867],
-    "8900": [-0.05555, 0.44445, 0, 0, 0.5],
-    "8901": [-0.05555, 0.44445, 0, 0, 0.27778],
-    "8902": [-0.03472, 0.46528, 0, 0, 0.5],
-    "8904": [0.005, 0.505, 0, 0, 0.9],
-    "8942": [0.03, 0.9, 0, 0, 0.278],
-    "8943": [-0.19, 0.31, 0, 0, 1.172],
-    "8945": [-0.1, 0.82, 0, 0, 1.282],
-    "8968": [0.25, 0.75, 0, 0, 0.44445],
-    "8969": [0.25, 0.75, 0, 0, 0.44445],
-    "8970": [0.25, 0.75, 0, 0, 0.44445],
-    "8971": [0.25, 0.75, 0, 0, 0.44445],
-    "8994": [-0.14236, 0.35764, 0, 0, 1.0],
-    "8995": [-0.14236, 0.35764, 0, 0, 1.0],
-    "9136": [0.244, 0.744, 0, 0, 0.412],
-    "9137": [0.244, 0.744, 0, 0, 0.412],
-    "9651": [0.19444, 0.69444, 0, 0, 0.88889],
-    "9657": [-0.03472, 0.46528, 0, 0, 0.5],
-    "9661": [0.19444, 0.69444, 0, 0, 0.88889],
-    "9667": [-0.03472, 0.46528, 0, 0, 0.5],
-    "9711": [0.19444, 0.69444, 0, 0, 1.0],
-    "9824": [0.12963, 0.69444, 0, 0, 0.77778],
-    "9825": [0.12963, 0.69444, 0, 0, 0.77778],
-    "9826": [0.12963, 0.69444, 0, 0, 0.77778],
-    "9827": [0.12963, 0.69444, 0, 0, 0.77778],
-    "9837": [0, 0.75, 0, 0, 0.38889],
-    "9838": [0.19444, 0.69444, 0, 0, 0.38889],
-    "9839": [0.19444, 0.69444, 0, 0, 0.38889],
-    "10216": [0.25, 0.75, 0, 0, 0.38889],
-    "10217": [0.25, 0.75, 0, 0, 0.38889],
-    "10222": [0.244, 0.744, 0, 0, 0.412],
-    "10223": [0.244, 0.744, 0, 0, 0.412],
-    "10229": [0.011, 0.511, 0, 0, 1.609],
-    "10230": [0.011, 0.511, 0, 0, 1.638],
-    "10231": [0.011, 0.511, 0, 0, 1.859],
-    "10232": [0.024, 0.525, 0, 0, 1.609],
-    "10233": [0.024, 0.525, 0, 0, 1.638],
-    "10234": [0.024, 0.525, 0, 0, 1.858],
-    "10236": [0.011, 0.511, 0, 0, 1.638],
-    "10815": [0, 0.68333, 0, 0, 0.75],
-    "10927": [0.13597, 0.63597, 0, 0, 0.77778],
-    "10928": [0.13597, 0.63597, 0, 0, 0.77778],
-    "57376": [0.19444, 0.69444, 0, 0, 0]
-  },
-  "Math-BoldItalic": {
-    "65": [0, 0.68611, 0, 0, 0.86944],
-    "66": [0, 0.68611, 0.04835, 0, 0.8664],
-    "67": [0, 0.68611, 0.06979, 0, 0.81694],
-    "68": [0, 0.68611, 0.03194, 0, 0.93812],
-    "69": [0, 0.68611, 0.05451, 0, 0.81007],
-    "70": [0, 0.68611, 0.15972, 0, 0.68889],
-    "71": [0, 0.68611, 0, 0, 0.88673],
-    "72": [0, 0.68611, 0.08229, 0, 0.98229],
-    "73": [0, 0.68611, 0.07778, 0, 0.51111],
-    "74": [0, 0.68611, 0.10069, 0, 0.63125],
-    "75": [0, 0.68611, 0.06979, 0, 0.97118],
-    "76": [0, 0.68611, 0, 0, 0.75555],
-    "77": [0, 0.68611, 0.11424, 0, 1.14201],
-    "78": [0, 0.68611, 0.11424, 0, 0.95034],
-    "79": [0, 0.68611, 0.03194, 0, 0.83666],
-    "80": [0, 0.68611, 0.15972, 0, 0.72309],
-    "81": [0.19444, 0.68611, 0, 0, 0.86861],
-    "82": [0, 0.68611, 0.00421, 0, 0.87235],
-    "83": [0, 0.68611, 0.05382, 0, 0.69271],
-    "84": [0, 0.68611, 0.15972, 0, 0.63663],
-    "85": [0, 0.68611, 0.11424, 0, 0.80027],
-    "86": [0, 0.68611, 0.25555, 0, 0.67778],
-    "87": [0, 0.68611, 0.15972, 0, 1.09305],
-    "88": [0, 0.68611, 0.07778, 0, 0.94722],
-    "89": [0, 0.68611, 0.25555, 0, 0.67458],
-    "90": [0, 0.68611, 0.06979, 0, 0.77257],
-    "97": [0, 0.44444, 0, 0, 0.63287],
-    "98": [0, 0.69444, 0, 0, 0.52083],
-    "99": [0, 0.44444, 0, 0, 0.51342],
-    "100": [0, 0.69444, 0, 0, 0.60972],
-    "101": [0, 0.44444, 0, 0, 0.55361],
-    "102": [0.19444, 0.69444, 0.11042, 0, 0.56806],
-    "103": [0.19444, 0.44444, 0.03704, 0, 0.5449],
-    "104": [0, 0.69444, 0, 0, 0.66759],
-    "105": [0, 0.69326, 0, 0, 0.4048],
-    "106": [0.19444, 0.69326, 0.0622, 0, 0.47083],
-    "107": [0, 0.69444, 0.01852, 0, 0.6037],
-    "108": [0, 0.69444, 0.0088, 0, 0.34815],
-    "109": [0, 0.44444, 0, 0, 1.0324],
-    "110": [0, 0.44444, 0, 0, 0.71296],
-    "111": [0, 0.44444, 0, 0, 0.58472],
-    "112": [0.19444, 0.44444, 0, 0, 0.60092],
-    "113": [0.19444, 0.44444, 0.03704, 0, 0.54213],
-    "114": [0, 0.44444, 0.03194, 0, 0.5287],
-    "115": [0, 0.44444, 0, 0, 0.53125],
-    "116": [0, 0.63492, 0, 0, 0.41528],
-    "117": [0, 0.44444, 0, 0, 0.68102],
-    "118": [0, 0.44444, 0.03704, 0, 0.56666],
-    "119": [0, 0.44444, 0.02778, 0, 0.83148],
-    "120": [0, 0.44444, 0, 0, 0.65903],
-    "121": [0.19444, 0.44444, 0.03704, 0, 0.59028],
-    "122": [0, 0.44444, 0.04213, 0, 0.55509],
-    "915": [0, 0.68611, 0.15972, 0, 0.65694],
-    "916": [0, 0.68611, 0, 0, 0.95833],
-    "920": [0, 0.68611, 0.03194, 0, 0.86722],
-    "923": [0, 0.68611, 0, 0, 0.80555],
-    "926": [0, 0.68611, 0.07458, 0, 0.84125],
-    "928": [0, 0.68611, 0.08229, 0, 0.98229],
-    "931": [0, 0.68611, 0.05451, 0, 0.88507],
-    "933": [0, 0.68611, 0.15972, 0, 0.67083],
-    "934": [0, 0.68611, 0, 0, 0.76666],
-    "936": [0, 0.68611, 0.11653, 0, 0.71402],
-    "937": [0, 0.68611, 0.04835, 0, 0.8789],
-    "945": [0, 0.44444, 0, 0, 0.76064],
-    "946": [0.19444, 0.69444, 0.03403, 0, 0.65972],
-    "947": [0.19444, 0.44444, 0.06389, 0, 0.59003],
-    "948": [0, 0.69444, 0.03819, 0, 0.52222],
-    "949": [0, 0.44444, 0, 0, 0.52882],
-    "950": [0.19444, 0.69444, 0.06215, 0, 0.50833],
-    "951": [0.19444, 0.44444, 0.03704, 0, 0.6],
-    "952": [0, 0.69444, 0.03194, 0, 0.5618],
-    "953": [0, 0.44444, 0, 0, 0.41204],
-    "954": [0, 0.44444, 0, 0, 0.66759],
-    "955": [0, 0.69444, 0, 0, 0.67083],
-    "956": [0.19444, 0.44444, 0, 0, 0.70787],
-    "957": [0, 0.44444, 0.06898, 0, 0.57685],
-    "958": [0.19444, 0.69444, 0.03021, 0, 0.50833],
-    "959": [0, 0.44444, 0, 0, 0.58472],
-    "960": [0, 0.44444, 0.03704, 0, 0.68241],
-    "961": [0.19444, 0.44444, 0, 0, 0.6118],
-    "962": [0.09722, 0.44444, 0.07917, 0, 0.42361],
-    "963": [0, 0.44444, 0.03704, 0, 0.68588],
-    "964": [0, 0.44444, 0.13472, 0, 0.52083],
-    "965": [0, 0.44444, 0.03704, 0, 0.63055],
-    "966": [0.19444, 0.44444, 0, 0, 0.74722],
-    "967": [0.19444, 0.44444, 0, 0, 0.71805],
-    "968": [0.19444, 0.69444, 0.03704, 0, 0.75833],
-    "969": [0, 0.44444, 0.03704, 0, 0.71782],
-    "977": [0, 0.69444, 0, 0, 0.69155],
-    "981": [0.19444, 0.69444, 0, 0, 0.7125],
-    "982": [0, 0.44444, 0.03194, 0, 0.975],
-    "1009": [0.19444, 0.44444, 0, 0, 0.6118],
-    "1013": [0, 0.44444, 0, 0, 0.48333]
-  },
-  "Math-Italic": {
-    "65": [0, 0.68333, 0, 0.13889, 0.75],
-    "66": [0, 0.68333, 0.05017, 0.08334, 0.75851],
-    "67": [0, 0.68333, 0.07153, 0.08334, 0.71472],
-    "68": [0, 0.68333, 0.02778, 0.05556, 0.82792],
-    "69": [0, 0.68333, 0.05764, 0.08334, 0.7382],
-    "70": [0, 0.68333, 0.13889, 0.08334, 0.64306],
-    "71": [0, 0.68333, 0, 0.08334, 0.78625],
-    "72": [0, 0.68333, 0.08125, 0.05556, 0.83125],
-    "73": [0, 0.68333, 0.07847, 0.11111, 0.43958],
-    "74": [0, 0.68333, 0.09618, 0.16667, 0.55451],
-    "75": [0, 0.68333, 0.07153, 0.05556, 0.84931],
-    "76": [0, 0.68333, 0, 0.02778, 0.68056],
-    "77": [0, 0.68333, 0.10903, 0.08334, 0.97014],
-    "78": [0, 0.68333, 0.10903, 0.08334, 0.80347],
-    "79": [0, 0.68333, 0.02778, 0.08334, 0.76278],
-    "80": [0, 0.68333, 0.13889, 0.08334, 0.64201],
-    "81": [0.19444, 0.68333, 0, 0.08334, 0.79056],
-    "82": [0, 0.68333, 0.00773, 0.08334, 0.75929],
-    "83": [0, 0.68333, 0.05764, 0.08334, 0.6132],
-    "84": [0, 0.68333, 0.13889, 0.08334, 0.58438],
-    "85": [0, 0.68333, 0.10903, 0.02778, 0.68278],
-    "86": [0, 0.68333, 0.22222, 0, 0.58333],
-    "87": [0, 0.68333, 0.13889, 0, 0.94445],
-    "88": [0, 0.68333, 0.07847, 0.08334, 0.82847],
-    "89": [0, 0.68333, 0.22222, 0, 0.58056],
-    "90": [0, 0.68333, 0.07153, 0.08334, 0.68264],
-    "97": [0, 0.43056, 0, 0, 0.52859],
-    "98": [0, 0.69444, 0, 0, 0.42917],
-    "99": [0, 0.43056, 0, 0.05556, 0.43276],
-    "100": [0, 0.69444, 0, 0.16667, 0.52049],
-    "101": [0, 0.43056, 0, 0.05556, 0.46563],
-    "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959],
-    "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697],
-    "104": [0, 0.69444, 0, 0, 0.57616],
-    "105": [0, 0.65952, 0, 0, 0.34451],
-    "106": [0.19444, 0.65952, 0.05724, 0, 0.41181],
-    "107": [0, 0.69444, 0.03148, 0, 0.5206],
-    "108": [0, 0.69444, 0.01968, 0.08334, 0.29838],
-    "109": [0, 0.43056, 0, 0, 0.87801],
-    "110": [0, 0.43056, 0, 0, 0.60023],
-    "111": [0, 0.43056, 0, 0.05556, 0.48472],
-    "112": [0.19444, 0.43056, 0, 0.08334, 0.50313],
-    "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641],
-    "114": [0, 0.43056, 0.02778, 0.05556, 0.45116],
-    "115": [0, 0.43056, 0, 0.05556, 0.46875],
-    "116": [0, 0.61508, 0, 0.08334, 0.36111],
-    "117": [0, 0.43056, 0, 0.02778, 0.57246],
-    "118": [0, 0.43056, 0.03588, 0.02778, 0.48472],
-    "119": [0, 0.43056, 0.02691, 0.08334, 0.71592],
-    "120": [0, 0.43056, 0, 0.02778, 0.57153],
-    "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028],
-    "122": [0, 0.43056, 0.04398, 0.05556, 0.46505],
-    "915": [0, 0.68333, 0.13889, 0.08334, 0.61528],
-    "916": [0, 0.68333, 0, 0.16667, 0.83334],
-    "920": [0, 0.68333, 0.02778, 0.08334, 0.76278],
-    "923": [0, 0.68333, 0, 0.16667, 0.69445],
-    "926": [0, 0.68333, 0.07569, 0.08334, 0.74236],
-    "928": [0, 0.68333, 0.08125, 0.05556, 0.83125],
-    "931": [0, 0.68333, 0.05764, 0.08334, 0.77986],
-    "933": [0, 0.68333, 0.13889, 0.05556, 0.58333],
-    "934": [0, 0.68333, 0, 0.08334, 0.66667],
-    "936": [0, 0.68333, 0.11, 0.05556, 0.61222],
-    "937": [0, 0.68333, 0.05017, 0.08334, 0.7724],
-    "945": [0, 0.43056, 0.0037, 0.02778, 0.6397],
-    "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563],
-    "947": [0.19444, 0.43056, 0.05556, 0, 0.51773],
-    "948": [0, 0.69444, 0.03785, 0.05556, 0.44444],
-    "949": [0, 0.43056, 0, 0.08334, 0.46632],
-    "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375],
-    "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653],
-    "952": [0, 0.69444, 0.02778, 0.08334, 0.46944],
-    "953": [0, 0.43056, 0, 0.05556, 0.35394],
-    "954": [0, 0.43056, 0, 0, 0.57616],
-    "955": [0, 0.69444, 0, 0, 0.58334],
-    "956": [0.19444, 0.43056, 0, 0.02778, 0.60255],
-    "957": [0, 0.43056, 0.06366, 0.02778, 0.49398],
-    "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375],
-    "959": [0, 0.43056, 0, 0.05556, 0.48472],
-    "960": [0, 0.43056, 0.03588, 0, 0.57003],
-    "961": [0.19444, 0.43056, 0, 0.08334, 0.51702],
-    "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285],
-    "963": [0, 0.43056, 0.03588, 0, 0.57141],
-    "964": [0, 0.43056, 0.1132, 0.02778, 0.43715],
-    "965": [0, 0.43056, 0.03588, 0.02778, 0.54028],
-    "966": [0.19444, 0.43056, 0, 0.08334, 0.65417],
-    "967": [0.19444, 0.43056, 0, 0.05556, 0.62569],
-    "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139],
-    "969": [0, 0.43056, 0.03588, 0, 0.62245],
-    "977": [0, 0.69444, 0, 0.08334, 0.59144],
-    "981": [0.19444, 0.69444, 0, 0.08334, 0.59583],
-    "982": [0, 0.43056, 0.02778, 0, 0.82813],
-    "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702],
-    "1013": [0, 0.43056, 0, 0.05556, 0.4059]
-  },
-  "Math-Regular": {
-    "65": [0, 0.68333, 0, 0.13889, 0.75],
-    "66": [0, 0.68333, 0.05017, 0.08334, 0.75851],
-    "67": [0, 0.68333, 0.07153, 0.08334, 0.71472],
-    "68": [0, 0.68333, 0.02778, 0.05556, 0.82792],
-    "69": [0, 0.68333, 0.05764, 0.08334, 0.7382],
-    "70": [0, 0.68333, 0.13889, 0.08334, 0.64306],
-    "71": [0, 0.68333, 0, 0.08334, 0.78625],
-    "72": [0, 0.68333, 0.08125, 0.05556, 0.83125],
-    "73": [0, 0.68333, 0.07847, 0.11111, 0.43958],
-    "74": [0, 0.68333, 0.09618, 0.16667, 0.55451],
-    "75": [0, 0.68333, 0.07153, 0.05556, 0.84931],
-    "76": [0, 0.68333, 0, 0.02778, 0.68056],
-    "77": [0, 0.68333, 0.10903, 0.08334, 0.97014],
-    "78": [0, 0.68333, 0.10903, 0.08334, 0.80347],
-    "79": [0, 0.68333, 0.02778, 0.08334, 0.76278],
-    "80": [0, 0.68333, 0.13889, 0.08334, 0.64201],
-    "81": [0.19444, 0.68333, 0, 0.08334, 0.79056],
-    "82": [0, 0.68333, 0.00773, 0.08334, 0.75929],
-    "83": [0, 0.68333, 0.05764, 0.08334, 0.6132],
-    "84": [0, 0.68333, 0.13889, 0.08334, 0.58438],
-    "85": [0, 0.68333, 0.10903, 0.02778, 0.68278],
-    "86": [0, 0.68333, 0.22222, 0, 0.58333],
-    "87": [0, 0.68333, 0.13889, 0, 0.94445],
-    "88": [0, 0.68333, 0.07847, 0.08334, 0.82847],
-    "89": [0, 0.68333, 0.22222, 0, 0.58056],
-    "90": [0, 0.68333, 0.07153, 0.08334, 0.68264],
-    "97": [0, 0.43056, 0, 0, 0.52859],
-    "98": [0, 0.69444, 0, 0, 0.42917],
-    "99": [0, 0.43056, 0, 0.05556, 0.43276],
-    "100": [0, 0.69444, 0, 0.16667, 0.52049],
-    "101": [0, 0.43056, 0, 0.05556, 0.46563],
-    "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959],
-    "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697],
-    "104": [0, 0.69444, 0, 0, 0.57616],
-    "105": [0, 0.65952, 0, 0, 0.34451],
-    "106": [0.19444, 0.65952, 0.05724, 0, 0.41181],
-    "107": [0, 0.69444, 0.03148, 0, 0.5206],
-    "108": [0, 0.69444, 0.01968, 0.08334, 0.29838],
-    "109": [0, 0.43056, 0, 0, 0.87801],
-    "110": [0, 0.43056, 0, 0, 0.60023],
-    "111": [0, 0.43056, 0, 0.05556, 0.48472],
-    "112": [0.19444, 0.43056, 0, 0.08334, 0.50313],
-    "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641],
-    "114": [0, 0.43056, 0.02778, 0.05556, 0.45116],
-    "115": [0, 0.43056, 0, 0.05556, 0.46875],
-    "116": [0, 0.61508, 0, 0.08334, 0.36111],
-    "117": [0, 0.43056, 0, 0.02778, 0.57246],
-    "118": [0, 0.43056, 0.03588, 0.02778, 0.48472],
-    "119": [0, 0.43056, 0.02691, 0.08334, 0.71592],
-    "120": [0, 0.43056, 0, 0.02778, 0.57153],
-    "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028],
-    "122": [0, 0.43056, 0.04398, 0.05556, 0.46505],
-    "915": [0, 0.68333, 0.13889, 0.08334, 0.61528],
-    "916": [0, 0.68333, 0, 0.16667, 0.83334],
-    "920": [0, 0.68333, 0.02778, 0.08334, 0.76278],
-    "923": [0, 0.68333, 0, 0.16667, 0.69445],
-    "926": [0, 0.68333, 0.07569, 0.08334, 0.74236],
-    "928": [0, 0.68333, 0.08125, 0.05556, 0.83125],
-    "931": [0, 0.68333, 0.05764, 0.08334, 0.77986],
-    "933": [0, 0.68333, 0.13889, 0.05556, 0.58333],
-    "934": [0, 0.68333, 0, 0.08334, 0.66667],
-    "936": [0, 0.68333, 0.11, 0.05556, 0.61222],
-    "937": [0, 0.68333, 0.05017, 0.08334, 0.7724],
-    "945": [0, 0.43056, 0.0037, 0.02778, 0.6397],
-    "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563],
-    "947": [0.19444, 0.43056, 0.05556, 0, 0.51773],
-    "948": [0, 0.69444, 0.03785, 0.05556, 0.44444],
-    "949": [0, 0.43056, 0, 0.08334, 0.46632],
-    "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375],
-    "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653],
-    "952": [0, 0.69444, 0.02778, 0.08334, 0.46944],
-    "953": [0, 0.43056, 0, 0.05556, 0.35394],
-    "954": [0, 0.43056, 0, 0, 0.57616],
-    "955": [0, 0.69444, 0, 0, 0.58334],
-    "956": [0.19444, 0.43056, 0, 0.02778, 0.60255],
-    "957": [0, 0.43056, 0.06366, 0.02778, 0.49398],
-    "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375],
-    "959": [0, 0.43056, 0, 0.05556, 0.48472],
-    "960": [0, 0.43056, 0.03588, 0, 0.57003],
-    "961": [0.19444, 0.43056, 0, 0.08334, 0.51702],
-    "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285],
-    "963": [0, 0.43056, 0.03588, 0, 0.57141],
-    "964": [0, 0.43056, 0.1132, 0.02778, 0.43715],
-    "965": [0, 0.43056, 0.03588, 0.02778, 0.54028],
-    "966": [0.19444, 0.43056, 0, 0.08334, 0.65417],
-    "967": [0.19444, 0.43056, 0, 0.05556, 0.62569],
-    "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139],
-    "969": [0, 0.43056, 0.03588, 0, 0.62245],
-    "977": [0, 0.69444, 0, 0.08334, 0.59144],
-    "981": [0.19444, 0.69444, 0, 0.08334, 0.59583],
-    "982": [0, 0.43056, 0.02778, 0, 0.82813],
-    "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702],
-    "1013": [0, 0.43056, 0, 0.05556, 0.4059]
-  },
-  "SansSerif-Bold": {
-    "33": [0, 0.69444, 0, 0, 0.36667],
-    "34": [0, 0.69444, 0, 0, 0.55834],
-    "35": [0.19444, 0.69444, 0, 0, 0.91667],
-    "36": [0.05556, 0.75, 0, 0, 0.55],
-    "37": [0.05556, 0.75, 0, 0, 1.02912],
-    "38": [0, 0.69444, 0, 0, 0.83056],
-    "39": [0, 0.69444, 0, 0, 0.30556],
-    "40": [0.25, 0.75, 0, 0, 0.42778],
-    "41": [0.25, 0.75, 0, 0, 0.42778],
-    "42": [0, 0.75, 0, 0, 0.55],
-    "43": [0.11667, 0.61667, 0, 0, 0.85556],
-    "44": [0.10556, 0.13056, 0, 0, 0.30556],
-    "45": [0, 0.45833, 0, 0, 0.36667],
-    "46": [0, 0.13056, 0, 0, 0.30556],
-    "47": [0.25, 0.75, 0, 0, 0.55],
-    "48": [0, 0.69444, 0, 0, 0.55],
-    "49": [0, 0.69444, 0, 0, 0.55],
-    "50": [0, 0.69444, 0, 0, 0.55],
-    "51": [0, 0.69444, 0, 0, 0.55],
-    "52": [0, 0.69444, 0, 0, 0.55],
-    "53": [0, 0.69444, 0, 0, 0.55],
-    "54": [0, 0.69444, 0, 0, 0.55],
-    "55": [0, 0.69444, 0, 0, 0.55],
-    "56": [0, 0.69444, 0, 0, 0.55],
-    "57": [0, 0.69444, 0, 0, 0.55],
-    "58": [0, 0.45833, 0, 0, 0.30556],
-    "59": [0.10556, 0.45833, 0, 0, 0.30556],
-    "61": [-0.09375, 0.40625, 0, 0, 0.85556],
-    "63": [0, 0.69444, 0, 0, 0.51945],
-    "64": [0, 0.69444, 0, 0, 0.73334],
-    "65": [0, 0.69444, 0, 0, 0.73334],
-    "66": [0, 0.69444, 0, 0, 0.73334],
-    "67": [0, 0.69444, 0, 0, 0.70278],
-    "68": [0, 0.69444, 0, 0, 0.79445],
-    "69": [0, 0.69444, 0, 0, 0.64167],
-    "70": [0, 0.69444, 0, 0, 0.61111],
-    "71": [0, 0.69444, 0, 0, 0.73334],
-    "72": [0, 0.69444, 0, 0, 0.79445],
-    "73": [0, 0.69444, 0, 0, 0.33056],
-    "74": [0, 0.69444, 0, 0, 0.51945],
-    "75": [0, 0.69444, 0, 0, 0.76389],
-    "76": [0, 0.69444, 0, 0, 0.58056],
-    "77": [0, 0.69444, 0, 0, 0.97778],
-    "78": [0, 0.69444, 0, 0, 0.79445],
-    "79": [0, 0.69444, 0, 0, 0.79445],
-    "80": [0, 0.69444, 0, 0, 0.70278],
-    "81": [0.10556, 0.69444, 0, 0, 0.79445],
-    "82": [0, 0.69444, 0, 0, 0.70278],
-    "83": [0, 0.69444, 0, 0, 0.61111],
-    "84": [0, 0.69444, 0, 0, 0.73334],
-    "85": [0, 0.69444, 0, 0, 0.76389],
-    "86": [0, 0.69444, 0.01528, 0, 0.73334],
-    "87": [0, 0.69444, 0.01528, 0, 1.03889],
-    "88": [0, 0.69444, 0, 0, 0.73334],
-    "89": [0, 0.69444, 0.0275, 0, 0.73334],
-    "90": [0, 0.69444, 0, 0, 0.67223],
-    "91": [0.25, 0.75, 0, 0, 0.34306],
-    "93": [0.25, 0.75, 0, 0, 0.34306],
-    "94": [0, 0.69444, 0, 0, 0.55],
-    "95": [0.35, 0.10833, 0.03056, 0, 0.55],
-    "97": [0, 0.45833, 0, 0, 0.525],
-    "98": [0, 0.69444, 0, 0, 0.56111],
-    "99": [0, 0.45833, 0, 0, 0.48889],
-    "100": [0, 0.69444, 0, 0, 0.56111],
-    "101": [0, 0.45833, 0, 0, 0.51111],
-    "102": [0, 0.69444, 0.07639, 0, 0.33611],
-    "103": [0.19444, 0.45833, 0.01528, 0, 0.55],
-    "104": [0, 0.69444, 0, 0, 0.56111],
-    "105": [0, 0.69444, 0, 0, 0.25556],
-    "106": [0.19444, 0.69444, 0, 0, 0.28611],
-    "107": [0, 0.69444, 0, 0, 0.53056],
-    "108": [0, 0.69444, 0, 0, 0.25556],
-    "109": [0, 0.45833, 0, 0, 0.86667],
-    "110": [0, 0.45833, 0, 0, 0.56111],
-    "111": [0, 0.45833, 0, 0, 0.55],
-    "112": [0.19444, 0.45833, 0, 0, 0.56111],
-    "113": [0.19444, 0.45833, 0, 0, 0.56111],
-    "114": [0, 0.45833, 0.01528, 0, 0.37222],
-    "115": [0, 0.45833, 0, 0, 0.42167],
-    "116": [0, 0.58929, 0, 0, 0.40417],
-    "117": [0, 0.45833, 0, 0, 0.56111],
-    "118": [0, 0.45833, 0.01528, 0, 0.5],
-    "119": [0, 0.45833, 0.01528, 0, 0.74445],
-    "120": [0, 0.45833, 0, 0, 0.5],
-    "121": [0.19444, 0.45833, 0.01528, 0, 0.5],
-    "122": [0, 0.45833, 0, 0, 0.47639],
-    "126": [0.35, 0.34444, 0, 0, 0.55],
-    "168": [0, 0.69444, 0, 0, 0.55],
-    "176": [0, 0.69444, 0, 0, 0.73334],
-    "180": [0, 0.69444, 0, 0, 0.55],
-    "184": [0.17014, 0, 0, 0, 0.48889],
-    "305": [0, 0.45833, 0, 0, 0.25556],
-    "567": [0.19444, 0.45833, 0, 0, 0.28611],
-    "710": [0, 0.69444, 0, 0, 0.55],
-    "711": [0, 0.63542, 0, 0, 0.55],
-    "713": [0, 0.63778, 0, 0, 0.55],
-    "728": [0, 0.69444, 0, 0, 0.55],
-    "729": [0, 0.69444, 0, 0, 0.30556],
-    "730": [0, 0.69444, 0, 0, 0.73334],
-    "732": [0, 0.69444, 0, 0, 0.55],
-    "733": [0, 0.69444, 0, 0, 0.55],
-    "915": [0, 0.69444, 0, 0, 0.58056],
-    "916": [0, 0.69444, 0, 0, 0.91667],
-    "920": [0, 0.69444, 0, 0, 0.85556],
-    "923": [0, 0.69444, 0, 0, 0.67223],
-    "926": [0, 0.69444, 0, 0, 0.73334],
-    "928": [0, 0.69444, 0, 0, 0.79445],
-    "931": [0, 0.69444, 0, 0, 0.79445],
-    "933": [0, 0.69444, 0, 0, 0.85556],
-    "934": [0, 0.69444, 0, 0, 0.79445],
-    "936": [0, 0.69444, 0, 0, 0.85556],
-    "937": [0, 0.69444, 0, 0, 0.79445],
-    "8211": [0, 0.45833, 0.03056, 0, 0.55],
-    "8212": [0, 0.45833, 0.03056, 0, 1.10001],
-    "8216": [0, 0.69444, 0, 0, 0.30556],
-    "8217": [0, 0.69444, 0, 0, 0.30556],
-    "8220": [0, 0.69444, 0, 0, 0.55834],
-    "8221": [0, 0.69444, 0, 0, 0.55834]
-  },
-  "SansSerif-Italic": {
-    "33": [0, 0.69444, 0.05733, 0, 0.31945],
-    "34": [0, 0.69444, 0.00316, 0, 0.5],
-    "35": [0.19444, 0.69444, 0.05087, 0, 0.83334],
-    "36": [0.05556, 0.75, 0.11156, 0, 0.5],
-    "37": [0.05556, 0.75, 0.03126, 0, 0.83334],
-    "38": [0, 0.69444, 0.03058, 0, 0.75834],
-    "39": [0, 0.69444, 0.07816, 0, 0.27778],
-    "40": [0.25, 0.75, 0.13164, 0, 0.38889],
-    "41": [0.25, 0.75, 0.02536, 0, 0.38889],
-    "42": [0, 0.75, 0.11775, 0, 0.5],
-    "43": [0.08333, 0.58333, 0.02536, 0, 0.77778],
-    "44": [0.125, 0.08333, 0, 0, 0.27778],
-    "45": [0, 0.44444, 0.01946, 0, 0.33333],
-    "46": [0, 0.08333, 0, 0, 0.27778],
-    "47": [0.25, 0.75, 0.13164, 0, 0.5],
-    "48": [0, 0.65556, 0.11156, 0, 0.5],
-    "49": [0, 0.65556, 0.11156, 0, 0.5],
-    "50": [0, 0.65556, 0.11156, 0, 0.5],
-    "51": [0, 0.65556, 0.11156, 0, 0.5],
-    "52": [0, 0.65556, 0.11156, 0, 0.5],
-    "53": [0, 0.65556, 0.11156, 0, 0.5],
-    "54": [0, 0.65556, 0.11156, 0, 0.5],
-    "55": [0, 0.65556, 0.11156, 0, 0.5],
-    "56": [0, 0.65556, 0.11156, 0, 0.5],
-    "57": [0, 0.65556, 0.11156, 0, 0.5],
-    "58": [0, 0.44444, 0.02502, 0, 0.27778],
-    "59": [0.125, 0.44444, 0.02502, 0, 0.27778],
-    "61": [-0.13, 0.37, 0.05087, 0, 0.77778],
-    "63": [0, 0.69444, 0.11809, 0, 0.47222],
-    "64": [0, 0.69444, 0.07555, 0, 0.66667],
-    "65": [0, 0.69444, 0, 0, 0.66667],
-    "66": [0, 0.69444, 0.08293, 0, 0.66667],
-    "67": [0, 0.69444, 0.11983, 0, 0.63889],
-    "68": [0, 0.69444, 0.07555, 0, 0.72223],
-    "69": [0, 0.69444, 0.11983, 0, 0.59722],
-    "70": [0, 0.69444, 0.13372, 0, 0.56945],
-    "71": [0, 0.69444, 0.11983, 0, 0.66667],
-    "72": [0, 0.69444, 0.08094, 0, 0.70834],
-    "73": [0, 0.69444, 0.13372, 0, 0.27778],
-    "74": [0, 0.69444, 0.08094, 0, 0.47222],
-    "75": [0, 0.69444, 0.11983, 0, 0.69445],
-    "76": [0, 0.69444, 0, 0, 0.54167],
-    "77": [0, 0.69444, 0.08094, 0, 0.875],
-    "78": [0, 0.69444, 0.08094, 0, 0.70834],
-    "79": [0, 0.69444, 0.07555, 0, 0.73611],
-    "80": [0, 0.69444, 0.08293, 0, 0.63889],
-    "81": [0.125, 0.69444, 0.07555, 0, 0.73611],
-    "82": [0, 0.69444, 0.08293, 0, 0.64584],
-    "83": [0, 0.69444, 0.09205, 0, 0.55556],
-    "84": [0, 0.69444, 0.13372, 0, 0.68056],
-    "85": [0, 0.69444, 0.08094, 0, 0.6875],
-    "86": [0, 0.69444, 0.1615, 0, 0.66667],
-    "87": [0, 0.69444, 0.1615, 0, 0.94445],
-    "88": [0, 0.69444, 0.13372, 0, 0.66667],
-    "89": [0, 0.69444, 0.17261, 0, 0.66667],
-    "90": [0, 0.69444, 0.11983, 0, 0.61111],
-    "91": [0.25, 0.75, 0.15942, 0, 0.28889],
-    "93": [0.25, 0.75, 0.08719, 0, 0.28889],
-    "94": [0, 0.69444, 0.0799, 0, 0.5],
-    "95": [0.35, 0.09444, 0.08616, 0, 0.5],
-    "97": [0, 0.44444, 0.00981, 0, 0.48056],
-    "98": [0, 0.69444, 0.03057, 0, 0.51667],
-    "99": [0, 0.44444, 0.08336, 0, 0.44445],
-    "100": [0, 0.69444, 0.09483, 0, 0.51667],
-    "101": [0, 0.44444, 0.06778, 0, 0.44445],
-    "102": [0, 0.69444, 0.21705, 0, 0.30556],
-    "103": [0.19444, 0.44444, 0.10836, 0, 0.5],
-    "104": [0, 0.69444, 0.01778, 0, 0.51667],
-    "105": [0, 0.67937, 0.09718, 0, 0.23889],
-    "106": [0.19444, 0.67937, 0.09162, 0, 0.26667],
-    "107": [0, 0.69444, 0.08336, 0, 0.48889],
-    "108": [0, 0.69444, 0.09483, 0, 0.23889],
-    "109": [0, 0.44444, 0.01778, 0, 0.79445],
-    "110": [0, 0.44444, 0.01778, 0, 0.51667],
-    "111": [0, 0.44444, 0.06613, 0, 0.5],
-    "112": [0.19444, 0.44444, 0.0389, 0, 0.51667],
-    "113": [0.19444, 0.44444, 0.04169, 0, 0.51667],
-    "114": [0, 0.44444, 0.10836, 0, 0.34167],
-    "115": [0, 0.44444, 0.0778, 0, 0.38333],
-    "116": [0, 0.57143, 0.07225, 0, 0.36111],
-    "117": [0, 0.44444, 0.04169, 0, 0.51667],
-    "118": [0, 0.44444, 0.10836, 0, 0.46111],
-    "119": [0, 0.44444, 0.10836, 0, 0.68334],
-    "120": [0, 0.44444, 0.09169, 0, 0.46111],
-    "121": [0.19444, 0.44444, 0.10836, 0, 0.46111],
-    "122": [0, 0.44444, 0.08752, 0, 0.43472],
-    "126": [0.35, 0.32659, 0.08826, 0, 0.5],
-    "168": [0, 0.67937, 0.06385, 0, 0.5],
-    "176": [0, 0.69444, 0, 0, 0.73752],
-    "184": [0.17014, 0, 0, 0, 0.44445],
-    "305": [0, 0.44444, 0.04169, 0, 0.23889],
-    "567": [0.19444, 0.44444, 0.04169, 0, 0.26667],
-    "710": [0, 0.69444, 0.0799, 0, 0.5],
-    "711": [0, 0.63194, 0.08432, 0, 0.5],
-    "713": [0, 0.60889, 0.08776, 0, 0.5],
-    "714": [0, 0.69444, 0.09205, 0, 0.5],
-    "715": [0, 0.69444, 0, 0, 0.5],
-    "728": [0, 0.69444, 0.09483, 0, 0.5],
-    "729": [0, 0.67937, 0.07774, 0, 0.27778],
-    "730": [0, 0.69444, 0, 0, 0.73752],
-    "732": [0, 0.67659, 0.08826, 0, 0.5],
-    "733": [0, 0.69444, 0.09205, 0, 0.5],
-    "915": [0, 0.69444, 0.13372, 0, 0.54167],
-    "916": [0, 0.69444, 0, 0, 0.83334],
-    "920": [0, 0.69444, 0.07555, 0, 0.77778],
-    "923": [0, 0.69444, 0, 0, 0.61111],
-    "926": [0, 0.69444, 0.12816, 0, 0.66667],
-    "928": [0, 0.69444, 0.08094, 0, 0.70834],
-    "931": [0, 0.69444, 0.11983, 0, 0.72222],
-    "933": [0, 0.69444, 0.09031, 0, 0.77778],
-    "934": [0, 0.69444, 0.04603, 0, 0.72222],
-    "936": [0, 0.69444, 0.09031, 0, 0.77778],
-    "937": [0, 0.69444, 0.08293, 0, 0.72222],
-    "8211": [0, 0.44444, 0.08616, 0, 0.5],
-    "8212": [0, 0.44444, 0.08616, 0, 1.0],
-    "8216": [0, 0.69444, 0.07816, 0, 0.27778],
-    "8217": [0, 0.69444, 0.07816, 0, 0.27778],
-    "8220": [0, 0.69444, 0.14205, 0, 0.5],
-    "8221": [0, 0.69444, 0.00316, 0, 0.5]
-  },
-  "SansSerif-Regular": {
-    "33": [0, 0.69444, 0, 0, 0.31945],
-    "34": [0, 0.69444, 0, 0, 0.5],
-    "35": [0.19444, 0.69444, 0, 0, 0.83334],
-    "36": [0.05556, 0.75, 0, 0, 0.5],
-    "37": [0.05556, 0.75, 0, 0, 0.83334],
-    "38": [0, 0.69444, 0, 0, 0.75834],
-    "39": [0, 0.69444, 0, 0, 0.27778],
-    "40": [0.25, 0.75, 0, 0, 0.38889],
-    "41": [0.25, 0.75, 0, 0, 0.38889],
-    "42": [0, 0.75, 0, 0, 0.5],
-    "43": [0.08333, 0.58333, 0, 0, 0.77778],
-    "44": [0.125, 0.08333, 0, 0, 0.27778],
-    "45": [0, 0.44444, 0, 0, 0.33333],
-    "46": [0, 0.08333, 0, 0, 0.27778],
-    "47": [0.25, 0.75, 0, 0, 0.5],
-    "48": [0, 0.65556, 0, 0, 0.5],
-    "49": [0, 0.65556, 0, 0, 0.5],
-    "50": [0, 0.65556, 0, 0, 0.5],
-    "51": [0, 0.65556, 0, 0, 0.5],
-    "52": [0, 0.65556, 0, 0, 0.5],
-    "53": [0, 0.65556, 0, 0, 0.5],
-    "54": [0, 0.65556, 0, 0, 0.5],
-    "55": [0, 0.65556, 0, 0, 0.5],
-    "56": [0, 0.65556, 0, 0, 0.5],
-    "57": [0, 0.65556, 0, 0, 0.5],
-    "58": [0, 0.44444, 0, 0, 0.27778],
-    "59": [0.125, 0.44444, 0, 0, 0.27778],
-    "61": [-0.13, 0.37, 0, 0, 0.77778],
-    "63": [0, 0.69444, 0, 0, 0.47222],
-    "64": [0, 0.69444, 0, 0, 0.66667],
-    "65": [0, 0.69444, 0, 0, 0.66667],
-    "66": [0, 0.69444, 0, 0, 0.66667],
-    "67": [0, 0.69444, 0, 0, 0.63889],
-    "68": [0, 0.69444, 0, 0, 0.72223],
-    "69": [0, 0.69444, 0, 0, 0.59722],
-    "70": [0, 0.69444, 0, 0, 0.56945],
-    "71": [0, 0.69444, 0, 0, 0.66667],
-    "72": [0, 0.69444, 0, 0, 0.70834],
-    "73": [0, 0.69444, 0, 0, 0.27778],
-    "74": [0, 0.69444, 0, 0, 0.47222],
-    "75": [0, 0.69444, 0, 0, 0.69445],
-    "76": [0, 0.69444, 0, 0, 0.54167],
-    "77": [0, 0.69444, 0, 0, 0.875],
-    "78": [0, 0.69444, 0, 0, 0.70834],
-    "79": [0, 0.69444, 0, 0, 0.73611],
-    "80": [0, 0.69444, 0, 0, 0.63889],
-    "81": [0.125, 0.69444, 0, 0, 0.73611],
-    "82": [0, 0.69444, 0, 0, 0.64584],
-    "83": [0, 0.69444, 0, 0, 0.55556],
-    "84": [0, 0.69444, 0, 0, 0.68056],
-    "85": [0, 0.69444, 0, 0, 0.6875],
-    "86": [0, 0.69444, 0.01389, 0, 0.66667],
-    "87": [0, 0.69444, 0.01389, 0, 0.94445],
-    "88": [0, 0.69444, 0, 0, 0.66667],
-    "89": [0, 0.69444, 0.025, 0, 0.66667],
-    "90": [0, 0.69444, 0, 0, 0.61111],
-    "91": [0.25, 0.75, 0, 0, 0.28889],
-    "93": [0.25, 0.75, 0, 0, 0.28889],
-    "94": [0, 0.69444, 0, 0, 0.5],
-    "95": [0.35, 0.09444, 0.02778, 0, 0.5],
-    "97": [0, 0.44444, 0, 0, 0.48056],
-    "98": [0, 0.69444, 0, 0, 0.51667],
-    "99": [0, 0.44444, 0, 0, 0.44445],
-    "100": [0, 0.69444, 0, 0, 0.51667],
-    "101": [0, 0.44444, 0, 0, 0.44445],
-    "102": [0, 0.69444, 0.06944, 0, 0.30556],
-    "103": [0.19444, 0.44444, 0.01389, 0, 0.5],
-    "104": [0, 0.69444, 0, 0, 0.51667],
-    "105": [0, 0.67937, 0, 0, 0.23889],
-    "106": [0.19444, 0.67937, 0, 0, 0.26667],
-    "107": [0, 0.69444, 0, 0, 0.48889],
-    "108": [0, 0.69444, 0, 0, 0.23889],
-    "109": [0, 0.44444, 0, 0, 0.79445],
-    "110": [0, 0.44444, 0, 0, 0.51667],
-    "111": [0, 0.44444, 0, 0, 0.5],
-    "112": [0.19444, 0.44444, 0, 0, 0.51667],
-    "113": [0.19444, 0.44444, 0, 0, 0.51667],
-    "114": [0, 0.44444, 0.01389, 0, 0.34167],
-    "115": [0, 0.44444, 0, 0, 0.38333],
-    "116": [0, 0.57143, 0, 0, 0.36111],
-    "117": [0, 0.44444, 0, 0, 0.51667],
-    "118": [0, 0.44444, 0.01389, 0, 0.46111],
-    "119": [0, 0.44444, 0.01389, 0, 0.68334],
-    "120": [0, 0.44444, 0, 0, 0.46111],
-    "121": [0.19444, 0.44444, 0.01389, 0, 0.46111],
-    "122": [0, 0.44444, 0, 0, 0.43472],
-    "126": [0.35, 0.32659, 0, 0, 0.5],
-    "168": [0, 0.67937, 0, 0, 0.5],
-    "176": [0, 0.69444, 0, 0, 0.66667],
-    "184": [0.17014, 0, 0, 0, 0.44445],
-    "305": [0, 0.44444, 0, 0, 0.23889],
-    "567": [0.19444, 0.44444, 0, 0, 0.26667],
-    "710": [0, 0.69444, 0, 0, 0.5],
-    "711": [0, 0.63194, 0, 0, 0.5],
-    "713": [0, 0.60889, 0, 0, 0.5],
-    "714": [0, 0.69444, 0, 0, 0.5],
-    "715": [0, 0.69444, 0, 0, 0.5],
-    "728": [0, 0.69444, 0, 0, 0.5],
-    "729": [0, 0.67937, 0, 0, 0.27778],
-    "730": [0, 0.69444, 0, 0, 0.66667],
-    "732": [0, 0.67659, 0, 0, 0.5],
-    "733": [0, 0.69444, 0, 0, 0.5],
-    "915": [0, 0.69444, 0, 0, 0.54167],
-    "916": [0, 0.69444, 0, 0, 0.83334],
-    "920": [0, 0.69444, 0, 0, 0.77778],
-    "923": [0, 0.69444, 0, 0, 0.61111],
-    "926": [0, 0.69444, 0, 0, 0.66667],
-    "928": [0, 0.69444, 0, 0, 0.70834],
-    "931": [0, 0.69444, 0, 0, 0.72222],
-    "933": [0, 0.69444, 0, 0, 0.77778],
-    "934": [0, 0.69444, 0, 0, 0.72222],
-    "936": [0, 0.69444, 0, 0, 0.77778],
-    "937": [0, 0.69444, 0, 0, 0.72222],
-    "8211": [0, 0.44444, 0.02778, 0, 0.5],
-    "8212": [0, 0.44444, 0.02778, 0, 1.0],
-    "8216": [0, 0.69444, 0, 0, 0.27778],
-    "8217": [0, 0.69444, 0, 0, 0.27778],
-    "8220": [0, 0.69444, 0, 0, 0.5],
-    "8221": [0, 0.69444, 0, 0, 0.5]
-  },
-  "Script-Regular": {
-    "65": [0, 0.7, 0.22925, 0, 0.80253],
-    "66": [0, 0.7, 0.04087, 0, 0.90757],
-    "67": [0, 0.7, 0.1689, 0, 0.66619],
-    "68": [0, 0.7, 0.09371, 0, 0.77443],
-    "69": [0, 0.7, 0.18583, 0, 0.56162],
-    "70": [0, 0.7, 0.13634, 0, 0.89544],
-    "71": [0, 0.7, 0.17322, 0, 0.60961],
-    "72": [0, 0.7, 0.29694, 0, 0.96919],
-    "73": [0, 0.7, 0.19189, 0, 0.80907],
-    "74": [0.27778, 0.7, 0.19189, 0, 1.05159],
-    "75": [0, 0.7, 0.31259, 0, 0.91364],
-    "76": [0, 0.7, 0.19189, 0, 0.87373],
-    "77": [0, 0.7, 0.15981, 0, 1.08031],
-    "78": [0, 0.7, 0.3525, 0, 0.9015],
-    "79": [0, 0.7, 0.08078, 0, 0.73787],
-    "80": [0, 0.7, 0.08078, 0, 1.01262],
-    "81": [0, 0.7, 0.03305, 0, 0.88282],
-    "82": [0, 0.7, 0.06259, 0, 0.85],
-    "83": [0, 0.7, 0.19189, 0, 0.86767],
-    "84": [0, 0.7, 0.29087, 0, 0.74697],
-    "85": [0, 0.7, 0.25815, 0, 0.79996],
-    "86": [0, 0.7, 0.27523, 0, 0.62204],
-    "87": [0, 0.7, 0.27523, 0, 0.80532],
-    "88": [0, 0.7, 0.26006, 0, 0.94445],
-    "89": [0, 0.7, 0.2939, 0, 0.70961],
-    "90": [0, 0.7, 0.24037, 0, 0.8212]
-  },
-  "Size1-Regular": {
-    "40": [0.35001, 0.85, 0, 0, 0.45834],
-    "41": [0.35001, 0.85, 0, 0, 0.45834],
-    "47": [0.35001, 0.85, 0, 0, 0.57778],
-    "91": [0.35001, 0.85, 0, 0, 0.41667],
-    "92": [0.35001, 0.85, 0, 0, 0.57778],
-    "93": [0.35001, 0.85, 0, 0, 0.41667],
-    "123": [0.35001, 0.85, 0, 0, 0.58334],
-    "125": [0.35001, 0.85, 0, 0, 0.58334],
-    "710": [0, 0.72222, 0, 0, 0.55556],
-    "732": [0, 0.72222, 0, 0, 0.55556],
-    "770": [0, 0.72222, 0, 0, 0.55556],
-    "771": [0, 0.72222, 0, 0, 0.55556],
-    "8214": [-0.00099, 0.601, 0, 0, 0.77778],
-    "8593": [1e-05, 0.6, 0, 0, 0.66667],
-    "8595": [1e-05, 0.6, 0, 0, 0.66667],
-    "8657": [1e-05, 0.6, 0, 0, 0.77778],
-    "8659": [1e-05, 0.6, 0, 0, 0.77778],
-    "8719": [0.25001, 0.75, 0, 0, 0.94445],
-    "8720": [0.25001, 0.75, 0, 0, 0.94445],
-    "8721": [0.25001, 0.75, 0, 0, 1.05556],
-    "8730": [0.35001, 0.85, 0, 0, 1.0],
-    "8739": [-0.00599, 0.606, 0, 0, 0.33333],
-    "8741": [-0.00599, 0.606, 0, 0, 0.55556],
-    "8747": [0.30612, 0.805, 0.19445, 0, 0.47222],
-    "8748": [0.306, 0.805, 0.19445, 0, 0.47222],
-    "8749": [0.306, 0.805, 0.19445, 0, 0.47222],
-    "8750": [0.30612, 0.805, 0.19445, 0, 0.47222],
-    "8896": [0.25001, 0.75, 0, 0, 0.83334],
-    "8897": [0.25001, 0.75, 0, 0, 0.83334],
-    "8898": [0.25001, 0.75, 0, 0, 0.83334],
-    "8899": [0.25001, 0.75, 0, 0, 0.83334],
-    "8968": [0.35001, 0.85, 0, 0, 0.47222],
-    "8969": [0.35001, 0.85, 0, 0, 0.47222],
-    "8970": [0.35001, 0.85, 0, 0, 0.47222],
-    "8971": [0.35001, 0.85, 0, 0, 0.47222],
-    "9168": [-0.00099, 0.601, 0, 0, 0.66667],
-    "10216": [0.35001, 0.85, 0, 0, 0.47222],
-    "10217": [0.35001, 0.85, 0, 0, 0.47222],
-    "10752": [0.25001, 0.75, 0, 0, 1.11111],
-    "10753": [0.25001, 0.75, 0, 0, 1.11111],
-    "10754": [0.25001, 0.75, 0, 0, 1.11111],
-    "10756": [0.25001, 0.75, 0, 0, 0.83334],
-    "10758": [0.25001, 0.75, 0, 0, 0.83334]
-  },
-  "Size2-Regular": {
-    "40": [0.65002, 1.15, 0, 0, 0.59722],
-    "41": [0.65002, 1.15, 0, 0, 0.59722],
-    "47": [0.65002, 1.15, 0, 0, 0.81111],
-    "91": [0.65002, 1.15, 0, 0, 0.47222],
-    "92": [0.65002, 1.15, 0, 0, 0.81111],
-    "93": [0.65002, 1.15, 0, 0, 0.47222],
-    "123": [0.65002, 1.15, 0, 0, 0.66667],
-    "125": [0.65002, 1.15, 0, 0, 0.66667],
-    "710": [0, 0.75, 0, 0, 1.0],
-    "732": [0, 0.75, 0, 0, 1.0],
-    "770": [0, 0.75, 0, 0, 1.0],
-    "771": [0, 0.75, 0, 0, 1.0],
-    "8719": [0.55001, 1.05, 0, 0, 1.27778],
-    "8720": [0.55001, 1.05, 0, 0, 1.27778],
-    "8721": [0.55001, 1.05, 0, 0, 1.44445],
-    "8730": [0.65002, 1.15, 0, 0, 1.0],
-    "8747": [0.86225, 1.36, 0.44445, 0, 0.55556],
-    "8748": [0.862, 1.36, 0.44445, 0, 0.55556],
-    "8749": [0.862, 1.36, 0.44445, 0, 0.55556],
-    "8750": [0.86225, 1.36, 0.44445, 0, 0.55556],
-    "8896": [0.55001, 1.05, 0, 0, 1.11111],
-    "8897": [0.55001, 1.05, 0, 0, 1.11111],
-    "8898": [0.55001, 1.05, 0, 0, 1.11111],
-    "8899": [0.55001, 1.05, 0, 0, 1.11111],
-    "8968": [0.65002, 1.15, 0, 0, 0.52778],
-    "8969": [0.65002, 1.15, 0, 0, 0.52778],
-    "8970": [0.65002, 1.15, 0, 0, 0.52778],
-    "8971": [0.65002, 1.15, 0, 0, 0.52778],
-    "10216": [0.65002, 1.15, 0, 0, 0.61111],
-    "10217": [0.65002, 1.15, 0, 0, 0.61111],
-    "10752": [0.55001, 1.05, 0, 0, 1.51112],
-    "10753": [0.55001, 1.05, 0, 0, 1.51112],
-    "10754": [0.55001, 1.05, 0, 0, 1.51112],
-    "10756": [0.55001, 1.05, 0, 0, 1.11111],
-    "10758": [0.55001, 1.05, 0, 0, 1.11111]
-  },
-  "Size3-Regular": {
-    "40": [0.95003, 1.45, 0, 0, 0.73611],
-    "41": [0.95003, 1.45, 0, 0, 0.73611],
-    "47": [0.95003, 1.45, 0, 0, 1.04445],
-    "91": [0.95003, 1.45, 0, 0, 0.52778],
-    "92": [0.95003, 1.45, 0, 0, 1.04445],
-    "93": [0.95003, 1.45, 0, 0, 0.52778],
-    "123": [0.95003, 1.45, 0, 0, 0.75],
-    "125": [0.95003, 1.45, 0, 0, 0.75],
-    "710": [0, 0.75, 0, 0, 1.44445],
-    "732": [0, 0.75, 0, 0, 1.44445],
-    "770": [0, 0.75, 0, 0, 1.44445],
-    "771": [0, 0.75, 0, 0, 1.44445],
-    "8730": [0.95003, 1.45, 0, 0, 1.0],
-    "8968": [0.95003, 1.45, 0, 0, 0.58334],
-    "8969": [0.95003, 1.45, 0, 0, 0.58334],
-    "8970": [0.95003, 1.45, 0, 0, 0.58334],
-    "8971": [0.95003, 1.45, 0, 0, 0.58334],
-    "10216": [0.95003, 1.45, 0, 0, 0.75],
-    "10217": [0.95003, 1.45, 0, 0, 0.75]
-  },
-  "Size4-Regular": {
-    "40": [1.25003, 1.75, 0, 0, 0.79167],
-    "41": [1.25003, 1.75, 0, 0, 0.79167],
-    "47": [1.25003, 1.75, 0, 0, 1.27778],
-    "91": [1.25003, 1.75, 0, 0, 0.58334],
-    "92": [1.25003, 1.75, 0, 0, 1.27778],
-    "93": [1.25003, 1.75, 0, 0, 0.58334],
-    "123": [1.25003, 1.75, 0, 0, 0.80556],
-    "125": [1.25003, 1.75, 0, 0, 0.80556],
-    "710": [0, 0.825, 0, 0, 1.8889],
-    "732": [0, 0.825, 0, 0, 1.8889],
-    "770": [0, 0.825, 0, 0, 1.8889],
-    "771": [0, 0.825, 0, 0, 1.8889],
-    "8730": [1.25003, 1.75, 0, 0, 1.0],
-    "8968": [1.25003, 1.75, 0, 0, 0.63889],
-    "8969": [1.25003, 1.75, 0, 0, 0.63889],
-    "8970": [1.25003, 1.75, 0, 0, 0.63889],
-    "8971": [1.25003, 1.75, 0, 0, 0.63889],
-    "9115": [0.64502, 1.155, 0, 0, 0.875],
-    "9116": [1e-05, 0.6, 0, 0, 0.875],
-    "9117": [0.64502, 1.155, 0, 0, 0.875],
-    "9118": [0.64502, 1.155, 0, 0, 0.875],
-    "9119": [1e-05, 0.6, 0, 0, 0.875],
-    "9120": [0.64502, 1.155, 0, 0, 0.875],
-    "9121": [0.64502, 1.155, 0, 0, 0.66667],
-    "9122": [-0.00099, 0.601, 0, 0, 0.66667],
-    "9123": [0.64502, 1.155, 0, 0, 0.66667],
-    "9124": [0.64502, 1.155, 0, 0, 0.66667],
-    "9125": [-0.00099, 0.601, 0, 0, 0.66667],
-    "9126": [0.64502, 1.155, 0, 0, 0.66667],
-    "9127": [1e-05, 0.9, 0, 0, 0.88889],
-    "9128": [0.65002, 1.15, 0, 0, 0.88889],
-    "9129": [0.90001, 0, 0, 0, 0.88889],
-    "9130": [0, 0.3, 0, 0, 0.88889],
-    "9131": [1e-05, 0.9, 0, 0, 0.88889],
-    "9132": [0.65002, 1.15, 0, 0, 0.88889],
-    "9133": [0.90001, 0, 0, 0, 0.88889],
-    "9143": [0.88502, 0.915, 0, 0, 1.05556],
-    "10216": [1.25003, 1.75, 0, 0, 0.80556],
-    "10217": [1.25003, 1.75, 0, 0, 0.80556],
-    "57344": [-0.00499, 0.605, 0, 0, 1.05556],
-    "57345": [-0.00499, 0.605, 0, 0, 1.05556],
-    "57680": [0, 0.12, 0, 0, 0.45],
-    "57681": [0, 0.12, 0, 0, 0.45],
-    "57682": [0, 0.12, 0, 0, 0.45],
-    "57683": [0, 0.12, 0, 0, 0.45]
-  },
-  "Typewriter-Regular": {
-    "32": [0, 0, 0, 0, 0.525],
-    "33": [0, 0.61111, 0, 0, 0.525],
-    "34": [0, 0.61111, 0, 0, 0.525],
-    "35": [0, 0.61111, 0, 0, 0.525],
-    "36": [0.08333, 0.69444, 0, 0, 0.525],
-    "37": [0.08333, 0.69444, 0, 0, 0.525],
-    "38": [0, 0.61111, 0, 0, 0.525],
-    "39": [0, 0.61111, 0, 0, 0.525],
-    "40": [0.08333, 0.69444, 0, 0, 0.525],
-    "41": [0.08333, 0.69444, 0, 0, 0.525],
-    "42": [0, 0.52083, 0, 0, 0.525],
-    "43": [-0.08056, 0.53055, 0, 0, 0.525],
-    "44": [0.13889, 0.125, 0, 0, 0.525],
-    "45": [-0.08056, 0.53055, 0, 0, 0.525],
-    "46": [0, 0.125, 0, 0, 0.525],
-    "47": [0.08333, 0.69444, 0, 0, 0.525],
-    "48": [0, 0.61111, 0, 0, 0.525],
-    "49": [0, 0.61111, 0, 0, 0.525],
-    "50": [0, 0.61111, 0, 0, 0.525],
-    "51": [0, 0.61111, 0, 0, 0.525],
-    "52": [0, 0.61111, 0, 0, 0.525],
-    "53": [0, 0.61111, 0, 0, 0.525],
-    "54": [0, 0.61111, 0, 0, 0.525],
-    "55": [0, 0.61111, 0, 0, 0.525],
-    "56": [0, 0.61111, 0, 0, 0.525],
-    "57": [0, 0.61111, 0, 0, 0.525],
-    "58": [0, 0.43056, 0, 0, 0.525],
-    "59": [0.13889, 0.43056, 0, 0, 0.525],
-    "60": [-0.05556, 0.55556, 0, 0, 0.525],
-    "61": [-0.19549, 0.41562, 0, 0, 0.525],
-    "62": [-0.05556, 0.55556, 0, 0, 0.525],
-    "63": [0, 0.61111, 0, 0, 0.525],
-    "64": [0, 0.61111, 0, 0, 0.525],
-    "65": [0, 0.61111, 0, 0, 0.525],
-    "66": [0, 0.61111, 0, 0, 0.525],
-    "67": [0, 0.61111, 0, 0, 0.525],
-    "68": [0, 0.61111, 0, 0, 0.525],
-    "69": [0, 0.61111, 0, 0, 0.525],
-    "70": [0, 0.61111, 0, 0, 0.525],
-    "71": [0, 0.61111, 0, 0, 0.525],
-    "72": [0, 0.61111, 0, 0, 0.525],
-    "73": [0, 0.61111, 0, 0, 0.525],
-    "74": [0, 0.61111, 0, 0, 0.525],
-    "75": [0, 0.61111, 0, 0, 0.525],
-    "76": [0, 0.61111, 0, 0, 0.525],
-    "77": [0, 0.61111, 0, 0, 0.525],
-    "78": [0, 0.61111, 0, 0, 0.525],
-    "79": [0, 0.61111, 0, 0, 0.525],
-    "80": [0, 0.61111, 0, 0, 0.525],
-    "81": [0.13889, 0.61111, 0, 0, 0.525],
-    "82": [0, 0.61111, 0, 0, 0.525],
-    "83": [0, 0.61111, 0, 0, 0.525],
-    "84": [0, 0.61111, 0, 0, 0.525],
-    "85": [0, 0.61111, 0, 0, 0.525],
-    "86": [0, 0.61111, 0, 0, 0.525],
-    "87": [0, 0.61111, 0, 0, 0.525],
-    "88": [0, 0.61111, 0, 0, 0.525],
-    "89": [0, 0.61111, 0, 0, 0.525],
-    "90": [0, 0.61111, 0, 0, 0.525],
-    "91": [0.08333, 0.69444, 0, 0, 0.525],
-    "92": [0.08333, 0.69444, 0, 0, 0.525],
-    "93": [0.08333, 0.69444, 0, 0, 0.525],
-    "94": [0, 0.61111, 0, 0, 0.525],
-    "95": [0.09514, 0, 0, 0, 0.525],
-    "96": [0, 0.61111, 0, 0, 0.525],
-    "97": [0, 0.43056, 0, 0, 0.525],
-    "98": [0, 0.61111, 0, 0, 0.525],
-    "99": [0, 0.43056, 0, 0, 0.525],
-    "100": [0, 0.61111, 0, 0, 0.525],
-    "101": [0, 0.43056, 0, 0, 0.525],
-    "102": [0, 0.61111, 0, 0, 0.525],
-    "103": [0.22222, 0.43056, 0, 0, 0.525],
-    "104": [0, 0.61111, 0, 0, 0.525],
-    "105": [0, 0.61111, 0, 0, 0.525],
-    "106": [0.22222, 0.61111, 0, 0, 0.525],
-    "107": [0, 0.61111, 0, 0, 0.525],
-    "108": [0, 0.61111, 0, 0, 0.525],
-    "109": [0, 0.43056, 0, 0, 0.525],
-    "110": [0, 0.43056, 0, 0, 0.525],
-    "111": [0, 0.43056, 0, 0, 0.525],
-    "112": [0.22222, 0.43056, 0, 0, 0.525],
-    "113": [0.22222, 0.43056, 0, 0, 0.525],
-    "114": [0, 0.43056, 0, 0, 0.525],
-    "115": [0, 0.43056, 0, 0, 0.525],
-    "116": [0, 0.55358, 0, 0, 0.525],
-    "117": [0, 0.43056, 0, 0, 0.525],
-    "118": [0, 0.43056, 0, 0, 0.525],
-    "119": [0, 0.43056, 0, 0, 0.525],
-    "120": [0, 0.43056, 0, 0, 0.525],
-    "121": [0.22222, 0.43056, 0, 0, 0.525],
-    "122": [0, 0.43056, 0, 0, 0.525],
-    "123": [0.08333, 0.69444, 0, 0, 0.525],
-    "124": [0.08333, 0.69444, 0, 0, 0.525],
-    "125": [0.08333, 0.69444, 0, 0, 0.525],
-    "126": [0, 0.61111, 0, 0, 0.525],
-    "127": [0, 0.61111, 0, 0, 0.525],
-    "160": [0, 0, 0, 0, 0.525],
-    "176": [0, 0.61111, 0, 0, 0.525],
-    "184": [0.19445, 0, 0, 0, 0.525],
-    "305": [0, 0.43056, 0, 0, 0.525],
-    "567": [0.22222, 0.43056, 0, 0, 0.525],
-    "711": [0, 0.56597, 0, 0, 0.525],
-    "713": [0, 0.56555, 0, 0, 0.525],
-    "714": [0, 0.61111, 0, 0, 0.525],
-    "715": [0, 0.61111, 0, 0, 0.525],
-    "728": [0, 0.61111, 0, 0, 0.525],
-    "730": [0, 0.61111, 0, 0, 0.525],
-    "770": [0, 0.61111, 0, 0, 0.525],
-    "771": [0, 0.61111, 0, 0, 0.525],
-    "776": [0, 0.61111, 0, 0, 0.525],
-    "915": [0, 0.61111, 0, 0, 0.525],
-    "916": [0, 0.61111, 0, 0, 0.525],
-    "920": [0, 0.61111, 0, 0, 0.525],
-    "923": [0, 0.61111, 0, 0, 0.525],
-    "926": [0, 0.61111, 0, 0, 0.525],
-    "928": [0, 0.61111, 0, 0, 0.525],
-    "931": [0, 0.61111, 0, 0, 0.525],
-    "933": [0, 0.61111, 0, 0, 0.525],
-    "934": [0, 0.61111, 0, 0, 0.525],
-    "936": [0, 0.61111, 0, 0, 0.525],
-    "937": [0, 0.61111, 0, 0, 0.525],
-    "8216": [0, 0.61111, 0, 0, 0.525],
-    "8217": [0, 0.61111, 0, 0, 0.525],
-    "8242": [0, 0.61111, 0, 0, 0.525],
-    "9251": [0.11111, 0.21944, 0, 0, 0.525]
-  }
-});
-// CONCATENATED MODULE: ./src/fontMetrics.js
-
-
-/**
- * This file contains metrics regarding fonts and individual symbols. The sigma
- * and xi variables, as well as the metricMap map contain data extracted from
- * TeX, TeX font metrics, and the TTF files. These data are then exposed via the
- * `metrics` variable and the getCharacterMetrics function.
- */
-// In TeX, there are actually three sets of dimensions, one for each of
-// textstyle (size index 5 and higher: >=9pt), scriptstyle (size index 3 and 4:
-// 7-8pt), and scriptscriptstyle (size index 1 and 2: 5-6pt).  These are
-// provided in the the arrays below, in that order.
-//
-// The font metrics are stored in fonts cmsy10, cmsy7, and cmsy5 respsectively.
-// This was determined by running the following script:
-//
-//     latex -interaction=nonstopmode \
-//     '\documentclass{article}\usepackage{amsmath}\begin{document}' \
-//     '$a$ \expandafter\show\the\textfont2' \
-//     '\expandafter\show\the\scriptfont2' \
-//     '\expandafter\show\the\scriptscriptfont2' \
-//     '\stop'
-//
-// The metrics themselves were retreived using the following commands:
-//
-//     tftopl cmsy10
-//     tftopl cmsy7
-//     tftopl cmsy5
-//
-// The output of each of these commands is quite lengthy.  The only part we
-// care about is the FONTDIMEN section. Each value is measured in EMs.
-var sigmasAndXis = {
-  slant: [0.250, 0.250, 0.250],
-  // sigma1
-  space: [0.000, 0.000, 0.000],
-  // sigma2
-  stretch: [0.000, 0.000, 0.000],
-  // sigma3
-  shrink: [0.000, 0.000, 0.000],
-  // sigma4
-  xHeight: [0.431, 0.431, 0.431],
-  // sigma5
-  quad: [1.000, 1.171, 1.472],
-  // sigma6
-  extraSpace: [0.000, 0.000, 0.000],
-  // sigma7
-  num1: [0.677, 0.732, 0.925],
-  // sigma8
-  num2: [0.394, 0.384, 0.387],
-  // sigma9
-  num3: [0.444, 0.471, 0.504],
-  // sigma10
-  denom1: [0.686, 0.752, 1.025],
-  // sigma11
-  denom2: [0.345, 0.344, 0.532],
-  // sigma12
-  sup1: [0.413, 0.503, 0.504],
-  // sigma13
-  sup2: [0.363, 0.431, 0.404],
-  // sigma14
-  sup3: [0.289, 0.286, 0.294],
-  // sigma15
-  sub1: [0.150, 0.143, 0.200],
-  // sigma16
-  sub2: [0.247, 0.286, 0.400],
-  // sigma17
-  supDrop: [0.386, 0.353, 0.494],
-  // sigma18
-  subDrop: [0.050, 0.071, 0.100],
-  // sigma19
-  delim1: [2.390, 1.700, 1.980],
-  // sigma20
-  delim2: [1.010, 1.157, 1.420],
-  // sigma21
-  axisHeight: [0.250, 0.250, 0.250],
-  // sigma22
-  // These font metrics are extracted from TeX by using tftopl on cmex10.tfm;
-  // they correspond to the font parameters of the extension fonts (family 3).
-  // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to
-  // match cmex7, we'd use cmex7.tfm values for script and scriptscript
-  // values.
-  defaultRuleThickness: [0.04, 0.049, 0.049],
-  // xi8; cmex7: 0.049
-  bigOpSpacing1: [0.111, 0.111, 0.111],
-  // xi9
-  bigOpSpacing2: [0.166, 0.166, 0.166],
-  // xi10
-  bigOpSpacing3: [0.2, 0.2, 0.2],
-  // xi11
-  bigOpSpacing4: [0.6, 0.611, 0.611],
-  // xi12; cmex7: 0.611
-  bigOpSpacing5: [0.1, 0.143, 0.143],
-  // xi13; cmex7: 0.143
-  // The \sqrt rule width is taken from the height of the surd character.
-  // Since we use the same font at all sizes, this thickness doesn't scale.
-  sqrtRuleThickness: [0.04, 0.04, 0.04],
-  // This value determines how large a pt is, for metrics which are defined
-  // in terms of pts.
-  // This value is also used in katex.less; if you change it make sure the
-  // values match.
-  ptPerEm: [10.0, 10.0, 10.0],
-  // The space between adjacent `|` columns in an array definition. From
-  // `\showthe\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm.
-  doubleRuleSep: [0.2, 0.2, 0.2],
-  // The width of separator lines in {array} environments. From
-  // `\showthe\arrayrulewidth` in LaTeX. Equals 0.4 / ptPerEm.
-  arrayRuleWidth: [0.04, 0.04, 0.04],
-  // Two values from LaTeX source2e:
-  fboxsep: [0.3, 0.3, 0.3],
-  //        3 pt / ptPerEm
-  fboxrule: [0.04, 0.04, 0.04] // 0.4 pt / ptPerEm
-
-}; // This map contains a mapping from font name and character code to character
-// metrics, including height, depth, italic correction, and skew (kern from the
-// character to the corresponding \skewchar)
-// This map is generated via `make metrics`. It should not be changed manually.
-
- // These are very rough approximations.  We default to Times New Roman which
-// should have Latin-1 and Cyrillic characters, but may not depending on the
-// operating system.  The metrics do not account for extra height from the
-// accents.  In the case of Cyrillic characters which have both ascenders and
-// descenders we prefer approximations with ascenders, primarily to prevent
-// the fraction bar or root line from intersecting the glyph.
-// TODO(kevinb) allow union of multiple glyph metrics for better accuracy.
-
-var extraCharacterMap = {
-  // Latin-1
-  'Å': 'A',
-  'Ç': 'C',
-  'Ð': 'D',
-  'Þ': 'o',
-  'å': 'a',
-  'ç': 'c',
-  'ð': 'd',
-  'þ': 'o',
-  // Cyrillic
-  'А': 'A',
-  'Б': 'B',
-  'В': 'B',
-  'Г': 'F',
-  'Д': 'A',
-  'Е': 'E',
-  'Ж': 'K',
-  'З': '3',
-  'И': 'N',
-  'Й': 'N',
-  'К': 'K',
-  'Л': 'N',
-  'М': 'M',
-  'Н': 'H',
-  'О': 'O',
-  'П': 'N',
-  'Р': 'P',
-  'С': 'C',
-  'Т': 'T',
-  'У': 'y',
-  'Ф': 'O',
-  'Х': 'X',
-  'Ц': 'U',
-  'Ч': 'h',
-  'Ш': 'W',
-  'Щ': 'W',
-  'Ъ': 'B',
-  'Ы': 'X',
-  'Ь': 'B',
-  'Э': '3',
-  'Ю': 'X',
-  'Я': 'R',
-  'а': 'a',
-  'б': 'b',
-  'в': 'a',
-  'г': 'r',
-  'д': 'y',
-  'е': 'e',
-  'ж': 'm',
-  'з': 'e',
-  'и': 'n',
-  'й': 'n',
-  'к': 'n',
-  'л': 'n',
-  'м': 'm',
-  'н': 'n',
-  'о': 'o',
-  'п': 'n',
-  'р': 'p',
-  'с': 'c',
-  'т': 'o',
-  'у': 'y',
-  'ф': 'b',
-  'х': 'x',
-  'ц': 'n',
-  'ч': 'n',
-  'ш': 'w',
-  'щ': 'w',
-  'ъ': 'a',
-  'ы': 'm',
-  'ь': 'a',
-  'э': 'e',
-  'ю': 'm',
-  'я': 'r'
-};
-
-/**
- * This function adds new font metrics to default metricMap
- * It can also override existing metrics
- */
-function setFontMetrics(fontName, metrics) {
-  fontMetricsData[fontName] = metrics;
-}
-/**
- * This function is a convenience function for looking up information in the
- * metricMap table. It takes a character as a string, and a font.
- *
- * Note: the `width` property may be undefined if fontMetricsData.js wasn't
- * built using `Make extended_metrics`.
- */
-
-function getCharacterMetrics(character, font, mode) {
-  if (!fontMetricsData[font]) {
-    throw new Error("Font metrics not found for font: " + font + ".");
-  }
-
-  var ch = character.charCodeAt(0);
-  var metrics = fontMetricsData[font][ch];
-
-  if (!metrics && character[0] in extraCharacterMap) {
-    ch = extraCharacterMap[character[0]].charCodeAt(0);
-    metrics = fontMetricsData[font][ch];
-  }
-
-  if (!metrics && mode === 'text') {
-    // We don't typically have font metrics for Asian scripts.
-    // But since we support them in text mode, we need to return
-    // some sort of metrics.
-    // So if the character is in a script we support but we
-    // don't have metrics for it, just use the metrics for
-    // the Latin capital letter M. This is close enough because
-    // we (currently) only care about the height of the glpyh
-    // not its width.
-    if (supportedCodepoint(ch)) {
-      metrics = fontMetricsData[font][77]; // 77 is the charcode for 'M'
-    }
-  }
-
-  if (metrics) {
-    return {
-      depth: metrics[0],
-      height: metrics[1],
-      italic: metrics[2],
-      skew: metrics[3],
-      width: metrics[4]
-    };
-  }
-}
-var fontMetricsBySizeIndex = {};
-/**
- * Get the font metrics for a given size.
- */
-
-function getGlobalMetrics(size) {
-  var sizeIndex;
-
-  if (size >= 5) {
-    sizeIndex = 0;
-  } else if (size >= 3) {
-    sizeIndex = 1;
-  } else {
-    sizeIndex = 2;
-  }
-
-  if (!fontMetricsBySizeIndex[sizeIndex]) {
-    var metrics = fontMetricsBySizeIndex[sizeIndex] = {
-      cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18
-    };
-
-    for (var key in sigmasAndXis) {
-      if (sigmasAndXis.hasOwnProperty(key)) {
-        metrics[key] = sigmasAndXis[key][sizeIndex];
-      }
-    }
-  }
-
-  return fontMetricsBySizeIndex[sizeIndex];
-}
-// CONCATENATED MODULE: ./src/symbols.js
-/**
- * This file holds a list of all no-argument functions and single-character
- * symbols (like 'a' or ';').
- *
- * For each of the symbols, there are three properties they can have:
- * - font (required): the font to be used for this symbol. Either "main" (the
-     normal font), or "ams" (the ams fonts).
- * - group (required): the ParseNode group type the symbol should have (i.e.
-     "textord", "mathord", etc).
-     See https://github.com/KaTeX/KaTeX/wiki/Examining-TeX#group-types
- * - replace: the character that this symbol or function should be
- *   replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi
- *   character in the main font).
- *
- * The outermost map in the table indicates what mode the symbols should be
- * accepted in (e.g. "math" or "text").
- */
-// Some of these have a "-token" suffix since these are also used as `ParseNode`
-// types for raw text tokens, and we want to avoid conflicts with higher-level
-// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by
-// looking up the `symbols` map.
-var ATOMS = {
-  "bin": 1,
-  "close": 1,
-  "inner": 1,
-  "open": 1,
-  "punct": 1,
-  "rel": 1
-};
-var NON_ATOMS = {
-  "accent-token": 1,
-  "mathord": 1,
-  "op-token": 1,
-  "spacing": 1,
-  "textord": 1
-};
-var symbols = {
-  "math": {},
-  "text": {}
-};
-/* harmony default export */ var src_symbols = (symbols);
-/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */
-
-function defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) {
-  symbols[mode][name] = {
-    font: font,
-    group: group,
-    replace: replace
-  };
-
-  if (acceptUnicodeChar && replace) {
-    symbols[mode][replace] = symbols[mode][name];
-  }
-} // Some abbreviations for commonly used strings.
-// This helps minify the code, and also spotting typos using jshint.
-// modes:
-
-var symbols_math = "math";
-var symbols_text = "text"; // fonts:
-
-var main = "main";
-var ams = "ams"; // groups:
-
-var symbols_accent = "accent-token";
-var bin = "bin";
-var symbols_close = "close";
-var symbols_inner = "inner";
-var mathord = "mathord";
-var op = "op-token";
-var symbols_open = "open";
-var punct = "punct";
-var rel = "rel";
-var symbols_spacing = "spacing";
-var symbols_textord = "textord"; // Now comes the symbol table
-// Relation Symbols
-
-defineSymbol(symbols_math, main, rel, "\u2261", "\\equiv", true);
-defineSymbol(symbols_math, main, rel, "\u227A", "\\prec", true);
-defineSymbol(symbols_math, main, rel, "\u227B", "\\succ", true);
-defineSymbol(symbols_math, main, rel, "\u223C", "\\sim", true);
-defineSymbol(symbols_math, main, rel, "\u22A5", "\\perp");
-defineSymbol(symbols_math, main, rel, "\u2AAF", "\\preceq", true);
-defineSymbol(symbols_math, main, rel, "\u2AB0", "\\succeq", true);
-defineSymbol(symbols_math, main, rel, "\u2243", "\\simeq", true);
-defineSymbol(symbols_math, main, rel, "\u2223", "\\mid", true);
-defineSymbol(symbols_math, main, rel, "\u226A", "\\ll", true);
-defineSymbol(symbols_math, main, rel, "\u226B", "\\gg", true);
-defineSymbol(symbols_math, main, rel, "\u224D", "\\asymp", true);
-defineSymbol(symbols_math, main, rel, "\u2225", "\\parallel");
-defineSymbol(symbols_math, main, rel, "\u22C8", "\\bowtie", true);
-defineSymbol(symbols_math, main, rel, "\u2323", "\\smile", true);
-defineSymbol(symbols_math, main, rel, "\u2291", "\\sqsubseteq", true);
-defineSymbol(symbols_math, main, rel, "\u2292", "\\sqsupseteq", true);
-defineSymbol(symbols_math, main, rel, "\u2250", "\\doteq", true);
-defineSymbol(symbols_math, main, rel, "\u2322", "\\frown", true);
-defineSymbol(symbols_math, main, rel, "\u220B", "\\ni", true);
-defineSymbol(symbols_math, main, rel, "\u221D", "\\propto", true);
-defineSymbol(symbols_math, main, rel, "\u22A2", "\\vdash", true);
-defineSymbol(symbols_math, main, rel, "\u22A3", "\\dashv", true);
-defineSymbol(symbols_math, main, rel, "\u220B", "\\owns"); // Punctuation
-
-defineSymbol(symbols_math, main, punct, ".", "\\ldotp");
-defineSymbol(symbols_math, main, punct, "\u22C5", "\\cdotp"); // Misc Symbols
-
-defineSymbol(symbols_math, main, symbols_textord, "#", "\\#");
-defineSymbol(symbols_text, main, symbols_textord, "#", "\\#");
-defineSymbol(symbols_math, main, symbols_textord, "&", "\\&");
-defineSymbol(symbols_text, main, symbols_textord, "&", "\\&");
-defineSymbol(symbols_math, main, symbols_textord, "\u2135", "\\aleph", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u2200", "\\forall", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u210F", "\\hbar", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u2203", "\\exists", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u2207", "\\nabla", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u266D", "\\flat", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u2113", "\\ell", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u266E", "\\natural", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u2663", "\\clubsuit", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u2118", "\\wp", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u266F", "\\sharp", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u2662", "\\diamondsuit", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u211C", "\\Re", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u2661", "\\heartsuit", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u2111", "\\Im", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u2660", "\\spadesuit", true);
-defineSymbol(symbols_text, main, symbols_textord, "\xA7", "\\S", true);
-defineSymbol(symbols_text, main, symbols_textord, "\xB6", "\\P", true); // Math and Text
-
-defineSymbol(symbols_math, main, symbols_textord, "\u2020", "\\dag");
-defineSymbol(symbols_text, main, symbols_textord, "\u2020", "\\dag");
-defineSymbol(symbols_text, main, symbols_textord, "\u2020", "\\textdagger");
-defineSymbol(symbols_math, main, symbols_textord, "\u2021", "\\ddag");
-defineSymbol(symbols_text, main, symbols_textord, "\u2021", "\\ddag");
-defineSymbol(symbols_text, main, symbols_textord, "\u2021", "\\textdaggerdbl"); // Large Delimiters
-
-defineSymbol(symbols_math, main, symbols_close, "\u23B1", "\\rmoustache", true);
-defineSymbol(symbols_math, main, symbols_open, "\u23B0", "\\lmoustache", true);
-defineSymbol(symbols_math, main, symbols_close, "\u27EF", "\\rgroup", true);
-defineSymbol(symbols_math, main, symbols_open, "\u27EE", "\\lgroup", true); // Binary Operators
-
-defineSymbol(symbols_math, main, bin, "\u2213", "\\mp", true);
-defineSymbol(symbols_math, main, bin, "\u2296", "\\ominus", true);
-defineSymbol(symbols_math, main, bin, "\u228E", "\\uplus", true);
-defineSymbol(symbols_math, main, bin, "\u2293", "\\sqcap", true);
-defineSymbol(symbols_math, main, bin, "\u2217", "\\ast");
-defineSymbol(symbols_math, main, bin, "\u2294", "\\sqcup", true);
-defineSymbol(symbols_math, main, bin, "\u25EF", "\\bigcirc");
-defineSymbol(symbols_math, main, bin, "\u2219", "\\bullet");
-defineSymbol(symbols_math, main, bin, "\u2021", "\\ddagger");
-defineSymbol(symbols_math, main, bin, "\u2240", "\\wr", true);
-defineSymbol(symbols_math, main, bin, "\u2A3F", "\\amalg");
-defineSymbol(symbols_math, main, bin, "&", "\\And"); // from amsmath
-// Arrow Symbols
-
-defineSymbol(symbols_math, main, rel, "\u27F5", "\\longleftarrow", true);
-defineSymbol(symbols_math, main, rel, "\u21D0", "\\Leftarrow", true);
-defineSymbol(symbols_math, main, rel, "\u27F8", "\\Longleftarrow", true);
-defineSymbol(symbols_math, main, rel, "\u27F6", "\\longrightarrow", true);
-defineSymbol(symbols_math, main, rel, "\u21D2", "\\Rightarrow", true);
-defineSymbol(symbols_math, main, rel, "\u27F9", "\\Longrightarrow", true);
-defineSymbol(symbols_math, main, rel, "\u2194", "\\leftrightarrow", true);
-defineSymbol(symbols_math, main, rel, "\u27F7", "\\longleftrightarrow", true);
-defineSymbol(symbols_math, main, rel, "\u21D4", "\\Leftrightarrow", true);
-defineSymbol(symbols_math, main, rel, "\u27FA", "\\Longleftrightarrow", true);
-defineSymbol(symbols_math, main, rel, "\u21A6", "\\mapsto", true);
-defineSymbol(symbols_math, main, rel, "\u27FC", "\\longmapsto", true);
-defineSymbol(symbols_math, main, rel, "\u2197", "\\nearrow", true);
-defineSymbol(symbols_math, main, rel, "\u21A9", "\\hookleftarrow", true);
-defineSymbol(symbols_math, main, rel, "\u21AA", "\\hookrightarrow", true);
-defineSymbol(symbols_math, main, rel, "\u2198", "\\searrow", true);
-defineSymbol(symbols_math, main, rel, "\u21BC", "\\leftharpoonup", true);
-defineSymbol(symbols_math, main, rel, "\u21C0", "\\rightharpoonup", true);
-defineSymbol(symbols_math, main, rel, "\u2199", "\\swarrow", true);
-defineSymbol(symbols_math, main, rel, "\u21BD", "\\leftharpoondown", true);
-defineSymbol(symbols_math, main, rel, "\u21C1", "\\rightharpoondown", true);
-defineSymbol(symbols_math, main, rel, "\u2196", "\\nwarrow", true);
-defineSymbol(symbols_math, main, rel, "\u21CC", "\\rightleftharpoons", true); // AMS Negated Binary Relations
-
-defineSymbol(symbols_math, ams, rel, "\u226E", "\\nless", true); // Symbol names preceeded by "@" each have a corresponding macro.
-
-defineSymbol(symbols_math, ams, rel, "\uE010", "\\@nleqslant");
-defineSymbol(symbols_math, ams, rel, "\uE011", "\\@nleqq");
-defineSymbol(symbols_math, ams, rel, "\u2A87", "\\lneq", true);
-defineSymbol(symbols_math, ams, rel, "\u2268", "\\lneqq", true);
-defineSymbol(symbols_math, ams, rel, "\uE00C", "\\@lvertneqq");
-defineSymbol(symbols_math, ams, rel, "\u22E6", "\\lnsim", true);
-defineSymbol(symbols_math, ams, rel, "\u2A89", "\\lnapprox", true);
-defineSymbol(symbols_math, ams, rel, "\u2280", "\\nprec", true); // unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym.
-
-defineSymbol(symbols_math, ams, rel, "\u22E0", "\\npreceq", true);
-defineSymbol(symbols_math, ams, rel, "\u22E8", "\\precnsim", true);
-defineSymbol(symbols_math, ams, rel, "\u2AB9", "\\precnapprox", true);
-defineSymbol(symbols_math, ams, rel, "\u2241", "\\nsim", true);
-defineSymbol(symbols_math, ams, rel, "\uE006", "\\@nshortmid");
-defineSymbol(symbols_math, ams, rel, "\u2224", "\\nmid", true);
-defineSymbol(symbols_math, ams, rel, "\u22AC", "\\nvdash", true);
-defineSymbol(symbols_math, ams, rel, "\u22AD", "\\nvDash", true);
-defineSymbol(symbols_math, ams, rel, "\u22EA", "\\ntriangleleft");
-defineSymbol(symbols_math, ams, rel, "\u22EC", "\\ntrianglelefteq", true);
-defineSymbol(symbols_math, ams, rel, "\u228A", "\\subsetneq", true);
-defineSymbol(symbols_math, ams, rel, "\uE01A", "\\@varsubsetneq");
-defineSymbol(symbols_math, ams, rel, "\u2ACB", "\\subsetneqq", true);
-defineSymbol(symbols_math, ams, rel, "\uE017", "\\@varsubsetneqq");
-defineSymbol(symbols_math, ams, rel, "\u226F", "\\ngtr", true);
-defineSymbol(symbols_math, ams, rel, "\uE00F", "\\@ngeqslant");
-defineSymbol(symbols_math, ams, rel, "\uE00E", "\\@ngeqq");
-defineSymbol(symbols_math, ams, rel, "\u2A88", "\\gneq", true);
-defineSymbol(symbols_math, ams, rel, "\u2269", "\\gneqq", true);
-defineSymbol(symbols_math, ams, rel, "\uE00D", "\\@gvertneqq");
-defineSymbol(symbols_math, ams, rel, "\u22E7", "\\gnsim", true);
-defineSymbol(symbols_math, ams, rel, "\u2A8A", "\\gnapprox", true);
-defineSymbol(symbols_math, ams, rel, "\u2281", "\\nsucc", true); // unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym.
-
-defineSymbol(symbols_math, ams, rel, "\u22E1", "\\nsucceq", true);
-defineSymbol(symbols_math, ams, rel, "\u22E9", "\\succnsim", true);
-defineSymbol(symbols_math, ams, rel, "\u2ABA", "\\succnapprox", true); // unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym.
-
-defineSymbol(symbols_math, ams, rel, "\u2246", "\\ncong", true);
-defineSymbol(symbols_math, ams, rel, "\uE007", "\\@nshortparallel");
-defineSymbol(symbols_math, ams, rel, "\u2226", "\\nparallel", true);
-defineSymbol(symbols_math, ams, rel, "\u22AF", "\\nVDash", true);
-defineSymbol(symbols_math, ams, rel, "\u22EB", "\\ntriangleright");
-defineSymbol(symbols_math, ams, rel, "\u22ED", "\\ntrianglerighteq", true);
-defineSymbol(symbols_math, ams, rel, "\uE018", "\\@nsupseteqq");
-defineSymbol(symbols_math, ams, rel, "\u228B", "\\supsetneq", true);
-defineSymbol(symbols_math, ams, rel, "\uE01B", "\\@varsupsetneq");
-defineSymbol(symbols_math, ams, rel, "\u2ACC", "\\supsetneqq", true);
-defineSymbol(symbols_math, ams, rel, "\uE019", "\\@varsupsetneqq");
-defineSymbol(symbols_math, ams, rel, "\u22AE", "\\nVdash", true);
-defineSymbol(symbols_math, ams, rel, "\u2AB5", "\\precneqq", true);
-defineSymbol(symbols_math, ams, rel, "\u2AB6", "\\succneqq", true);
-defineSymbol(symbols_math, ams, rel, "\uE016", "\\@nsubseteqq");
-defineSymbol(symbols_math, ams, bin, "\u22B4", "\\unlhd");
-defineSymbol(symbols_math, ams, bin, "\u22B5", "\\unrhd"); // AMS Negated Arrows
-
-defineSymbol(symbols_math, ams, rel, "\u219A", "\\nleftarrow", true);
-defineSymbol(symbols_math, ams, rel, "\u219B", "\\nrightarrow", true);
-defineSymbol(symbols_math, ams, rel, "\u21CD", "\\nLeftarrow", true);
-defineSymbol(symbols_math, ams, rel, "\u21CF", "\\nRightarrow", true);
-defineSymbol(symbols_math, ams, rel, "\u21AE", "\\nleftrightarrow", true);
-defineSymbol(symbols_math, ams, rel, "\u21CE", "\\nLeftrightarrow", true); // AMS Misc
-
-defineSymbol(symbols_math, ams, rel, "\u25B3", "\\vartriangle");
-defineSymbol(symbols_math, ams, symbols_textord, "\u210F", "\\hslash");
-defineSymbol(symbols_math, ams, symbols_textord, "\u25BD", "\\triangledown");
-defineSymbol(symbols_math, ams, symbols_textord, "\u25CA", "\\lozenge");
-defineSymbol(symbols_math, ams, symbols_textord, "\u24C8", "\\circledS");
-defineSymbol(symbols_math, ams, symbols_textord, "\xAE", "\\circledR");
-defineSymbol(symbols_text, ams, symbols_textord, "\xAE", "\\circledR");
-defineSymbol(symbols_math, ams, symbols_textord, "\u2221", "\\measuredangle", true);
-defineSymbol(symbols_math, ams, symbols_textord, "\u2204", "\\nexists");
-defineSymbol(symbols_math, ams, symbols_textord, "\u2127", "\\mho");
-defineSymbol(symbols_math, ams, symbols_textord, "\u2132", "\\Finv", true);
-defineSymbol(symbols_math, ams, symbols_textord, "\u2141", "\\Game", true);
-defineSymbol(symbols_math, ams, symbols_textord, "\u2035", "\\backprime");
-defineSymbol(symbols_math, ams, symbols_textord, "\u25B2", "\\blacktriangle");
-defineSymbol(symbols_math, ams, symbols_textord, "\u25BC", "\\blacktriangledown");
-defineSymbol(symbols_math, ams, symbols_textord, "\u25A0", "\\blacksquare");
-defineSymbol(symbols_math, ams, symbols_textord, "\u29EB", "\\blacklozenge");
-defineSymbol(symbols_math, ams, symbols_textord, "\u2605", "\\bigstar");
-defineSymbol(symbols_math, ams, symbols_textord, "\u2222", "\\sphericalangle", true);
-defineSymbol(symbols_math, ams, symbols_textord, "\u2201", "\\complement", true); // unicode-math maps U+F0 (ð) to \matheth. We map to AMS function \eth
-
-defineSymbol(symbols_math, ams, symbols_textord, "\xF0", "\\eth", true);
-defineSymbol(symbols_math, ams, symbols_textord, "\u2571", "\\diagup");
-defineSymbol(symbols_math, ams, symbols_textord, "\u2572", "\\diagdown");
-defineSymbol(symbols_math, ams, symbols_textord, "\u25A1", "\\square");
-defineSymbol(symbols_math, ams, symbols_textord, "\u25A1", "\\Box");
-defineSymbol(symbols_math, ams, symbols_textord, "\u25CA", "\\Diamond"); // unicode-math maps U+A5 to \mathyen. We map to AMS function \yen
-
-defineSymbol(symbols_math, ams, symbols_textord, "\xA5", "\\yen", true);
-defineSymbol(symbols_text, ams, symbols_textord, "\xA5", "\\yen", true);
-defineSymbol(symbols_math, ams, symbols_textord, "\u2713", "\\checkmark", true);
-defineSymbol(symbols_text, ams, symbols_textord, "\u2713", "\\checkmark"); // AMS Hebrew
-
-defineSymbol(symbols_math, ams, symbols_textord, "\u2136", "\\beth", true);
-defineSymbol(symbols_math, ams, symbols_textord, "\u2138", "\\daleth", true);
-defineSymbol(symbols_math, ams, symbols_textord, "\u2137", "\\gimel", true); // AMS Greek
-
-defineSymbol(symbols_math, ams, symbols_textord, "\u03DD", "\\digamma", true);
-defineSymbol(symbols_math, ams, symbols_textord, "\u03F0", "\\varkappa"); // AMS Delimiters
-
-defineSymbol(symbols_math, ams, symbols_open, "\u250C", "\\ulcorner", true);
-defineSymbol(symbols_math, ams, symbols_close, "\u2510", "\\urcorner", true);
-defineSymbol(symbols_math, ams, symbols_open, "\u2514", "\\llcorner", true);
-defineSymbol(symbols_math, ams, symbols_close, "\u2518", "\\lrcorner", true); // AMS Binary Relations
-
-defineSymbol(symbols_math, ams, rel, "\u2266", "\\leqq", true);
-defineSymbol(symbols_math, ams, rel, "\u2A7D", "\\leqslant", true);
-defineSymbol(symbols_math, ams, rel, "\u2A95", "\\eqslantless", true);
-defineSymbol(symbols_math, ams, rel, "\u2272", "\\lesssim", true);
-defineSymbol(symbols_math, ams, rel, "\u2A85", "\\lessapprox", true);
-defineSymbol(symbols_math, ams, rel, "\u224A", "\\approxeq", true);
-defineSymbol(symbols_math, ams, bin, "\u22D6", "\\lessdot");
-defineSymbol(symbols_math, ams, rel, "\u22D8", "\\lll", true);
-defineSymbol(symbols_math, ams, rel, "\u2276", "\\lessgtr", true);
-defineSymbol(symbols_math, ams, rel, "\u22DA", "\\lesseqgtr", true);
-defineSymbol(symbols_math, ams, rel, "\u2A8B", "\\lesseqqgtr", true);
-defineSymbol(symbols_math, ams, rel, "\u2251", "\\doteqdot");
-defineSymbol(symbols_math, ams, rel, "\u2253", "\\risingdotseq", true);
-defineSymbol(symbols_math, ams, rel, "\u2252", "\\fallingdotseq", true);
-defineSymbol(symbols_math, ams, rel, "\u223D", "\\backsim", true);
-defineSymbol(symbols_math, ams, rel, "\u22CD", "\\backsimeq", true);
-defineSymbol(symbols_math, ams, rel, "\u2AC5", "\\subseteqq", true);
-defineSymbol(symbols_math, ams, rel, "\u22D0", "\\Subset", true);
-defineSymbol(symbols_math, ams, rel, "\u228F", "\\sqsubset", true);
-defineSymbol(symbols_math, ams, rel, "\u227C", "\\preccurlyeq", true);
-defineSymbol(symbols_math, ams, rel, "\u22DE", "\\curlyeqprec", true);
-defineSymbol(symbols_math, ams, rel, "\u227E", "\\precsim", true);
-defineSymbol(symbols_math, ams, rel, "\u2AB7", "\\precapprox", true);
-defineSymbol(symbols_math, ams, rel, "\u22B2", "\\vartriangleleft");
-defineSymbol(symbols_math, ams, rel, "\u22B4", "\\trianglelefteq");
-defineSymbol(symbols_math, ams, rel, "\u22A8", "\\vDash", true);
-defineSymbol(symbols_math, ams, rel, "\u22AA", "\\Vvdash", true);
-defineSymbol(symbols_math, ams, rel, "\u2323", "\\smallsmile");
-defineSymbol(symbols_math, ams, rel, "\u2322", "\\smallfrown");
-defineSymbol(symbols_math, ams, rel, "\u224F", "\\bumpeq", true);
-defineSymbol(symbols_math, ams, rel, "\u224E", "\\Bumpeq", true);
-defineSymbol(symbols_math, ams, rel, "\u2267", "\\geqq", true);
-defineSymbol(symbols_math, ams, rel, "\u2A7E", "\\geqslant", true);
-defineSymbol(symbols_math, ams, rel, "\u2A96", "\\eqslantgtr", true);
-defineSymbol(symbols_math, ams, rel, "\u2273", "\\gtrsim", true);
-defineSymbol(symbols_math, ams, rel, "\u2A86", "\\gtrapprox", true);
-defineSymbol(symbols_math, ams, bin, "\u22D7", "\\gtrdot");
-defineSymbol(symbols_math, ams, rel, "\u22D9", "\\ggg", true);
-defineSymbol(symbols_math, ams, rel, "\u2277", "\\gtrless", true);
-defineSymbol(symbols_math, ams, rel, "\u22DB", "\\gtreqless", true);
-defineSymbol(symbols_math, ams, rel, "\u2A8C", "\\gtreqqless", true);
-defineSymbol(symbols_math, ams, rel, "\u2256", "\\eqcirc", true);
-defineSymbol(symbols_math, ams, rel, "\u2257", "\\circeq", true);
-defineSymbol(symbols_math, ams, rel, "\u225C", "\\triangleq", true);
-defineSymbol(symbols_math, ams, rel, "\u223C", "\\thicksim");
-defineSymbol(symbols_math, ams, rel, "\u2248", "\\thickapprox");
-defineSymbol(symbols_math, ams, rel, "\u2AC6", "\\supseteqq", true);
-defineSymbol(symbols_math, ams, rel, "\u22D1", "\\Supset", true);
-defineSymbol(symbols_math, ams, rel, "\u2290", "\\sqsupset", true);
-defineSymbol(symbols_math, ams, rel, "\u227D", "\\succcurlyeq", true);
-defineSymbol(symbols_math, ams, rel, "\u22DF", "\\curlyeqsucc", true);
-defineSymbol(symbols_math, ams, rel, "\u227F", "\\succsim", true);
-defineSymbol(symbols_math, ams, rel, "\u2AB8", "\\succapprox", true);
-defineSymbol(symbols_math, ams, rel, "\u22B3", "\\vartriangleright");
-defineSymbol(symbols_math, ams, rel, "\u22B5", "\\trianglerighteq");
-defineSymbol(symbols_math, ams, rel, "\u22A9", "\\Vdash", true);
-defineSymbol(symbols_math, ams, rel, "\u2223", "\\shortmid");
-defineSymbol(symbols_math, ams, rel, "\u2225", "\\shortparallel");
-defineSymbol(symbols_math, ams, rel, "\u226C", "\\between", true);
-defineSymbol(symbols_math, ams, rel, "\u22D4", "\\pitchfork", true);
-defineSymbol(symbols_math, ams, rel, "\u221D", "\\varpropto");
-defineSymbol(symbols_math, ams, rel, "\u25C0", "\\blacktriangleleft"); // unicode-math says that \therefore is a mathord atom.
-// We kept the amssymb atom type, which is rel.
-
-defineSymbol(symbols_math, ams, rel, "\u2234", "\\therefore", true);
-defineSymbol(symbols_math, ams, rel, "\u220D", "\\backepsilon");
-defineSymbol(symbols_math, ams, rel, "\u25B6", "\\blacktriangleright"); // unicode-math says that \because is a mathord atom.
-// We kept the amssymb atom type, which is rel.
-
-defineSymbol(symbols_math, ams, rel, "\u2235", "\\because", true);
-defineSymbol(symbols_math, ams, rel, "\u22D8", "\\llless");
-defineSymbol(symbols_math, ams, rel, "\u22D9", "\\gggtr");
-defineSymbol(symbols_math, ams, bin, "\u22B2", "\\lhd");
-defineSymbol(symbols_math, ams, bin, "\u22B3", "\\rhd");
-defineSymbol(symbols_math, ams, rel, "\u2242", "\\eqsim", true);
-defineSymbol(symbols_math, main, rel, "\u22C8", "\\Join");
-defineSymbol(symbols_math, ams, rel, "\u2251", "\\Doteq", true); // AMS Binary Operators
-
-defineSymbol(symbols_math, ams, bin, "\u2214", "\\dotplus", true);
-defineSymbol(symbols_math, ams, bin, "\u2216", "\\smallsetminus");
-defineSymbol(symbols_math, ams, bin, "\u22D2", "\\Cap", true);
-defineSymbol(symbols_math, ams, bin, "\u22D3", "\\Cup", true);
-defineSymbol(symbols_math, ams, bin, "\u2A5E", "\\doublebarwedge", true);
-defineSymbol(symbols_math, ams, bin, "\u229F", "\\boxminus", true);
-defineSymbol(symbols_math, ams, bin, "\u229E", "\\boxplus", true);
-defineSymbol(symbols_math, ams, bin, "\u22C7", "\\divideontimes", true);
-defineSymbol(symbols_math, ams, bin, "\u22C9", "\\ltimes", true);
-defineSymbol(symbols_math, ams, bin, "\u22CA", "\\rtimes", true);
-defineSymbol(symbols_math, ams, bin, "\u22CB", "\\leftthreetimes", true);
-defineSymbol(symbols_math, ams, bin, "\u22CC", "\\rightthreetimes", true);
-defineSymbol(symbols_math, ams, bin, "\u22CF", "\\curlywedge", true);
-defineSymbol(symbols_math, ams, bin, "\u22CE", "\\curlyvee", true);
-defineSymbol(symbols_math, ams, bin, "\u229D", "\\circleddash", true);
-defineSymbol(symbols_math, ams, bin, "\u229B", "\\circledast", true);
-defineSymbol(symbols_math, ams, bin, "\u22C5", "\\centerdot");
-defineSymbol(symbols_math, ams, bin, "\u22BA", "\\intercal", true);
-defineSymbol(symbols_math, ams, bin, "\u22D2", "\\doublecap");
-defineSymbol(symbols_math, ams, bin, "\u22D3", "\\doublecup");
-defineSymbol(symbols_math, ams, bin, "\u22A0", "\\boxtimes", true); // AMS Arrows
-// Note: unicode-math maps \u21e2 to their own function \rightdasharrow.
-// We'll map it to AMS function \dashrightarrow. It produces the same atom.
-
-defineSymbol(symbols_math, ams, rel, "\u21E2", "\\dashrightarrow", true); // unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym.
-
-defineSymbol(symbols_math, ams, rel, "\u21E0", "\\dashleftarrow", true);
-defineSymbol(symbols_math, ams, rel, "\u21C7", "\\leftleftarrows", true);
-defineSymbol(symbols_math, ams, rel, "\u21C6", "\\leftrightarrows", true);
-defineSymbol(symbols_math, ams, rel, "\u21DA", "\\Lleftarrow", true);
-defineSymbol(symbols_math, ams, rel, "\u219E", "\\twoheadleftarrow", true);
-defineSymbol(symbols_math, ams, rel, "\u21A2", "\\leftarrowtail", true);
-defineSymbol(symbols_math, ams, rel, "\u21AB", "\\looparrowleft", true);
-defineSymbol(symbols_math, ams, rel, "\u21CB", "\\leftrightharpoons", true);
-defineSymbol(symbols_math, ams, rel, "\u21B6", "\\curvearrowleft", true); // unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym.
-
-defineSymbol(symbols_math, ams, rel, "\u21BA", "\\circlearrowleft", true);
-defineSymbol(symbols_math, ams, rel, "\u21B0", "\\Lsh", true);
-defineSymbol(symbols_math, ams, rel, "\u21C8", "\\upuparrows", true);
-defineSymbol(symbols_math, ams, rel, "\u21BF", "\\upharpoonleft", true);
-defineSymbol(symbols_math, ams, rel, "\u21C3", "\\downharpoonleft", true);
-defineSymbol(symbols_math, ams, rel, "\u22B8", "\\multimap", true);
-defineSymbol(symbols_math, ams, rel, "\u21AD", "\\leftrightsquigarrow", true);
-defineSymbol(symbols_math, ams, rel, "\u21C9", "\\rightrightarrows", true);
-defineSymbol(symbols_math, ams, rel, "\u21C4", "\\rightleftarrows", true);
-defineSymbol(symbols_math, ams, rel, "\u21A0", "\\twoheadrightarrow", true);
-defineSymbol(symbols_math, ams, rel, "\u21A3", "\\rightarrowtail", true);
-defineSymbol(symbols_math, ams, rel, "\u21AC", "\\looparrowright", true);
-defineSymbol(symbols_math, ams, rel, "\u21B7", "\\curvearrowright", true); // unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym.
-
-defineSymbol(symbols_math, ams, rel, "\u21BB", "\\circlearrowright", true);
-defineSymbol(symbols_math, ams, rel, "\u21B1", "\\Rsh", true);
-defineSymbol(symbols_math, ams, rel, "\u21CA", "\\downdownarrows", true);
-defineSymbol(symbols_math, ams, rel, "\u21BE", "\\upharpoonright", true);
-defineSymbol(symbols_math, ams, rel, "\u21C2", "\\downharpoonright", true);
-defineSymbol(symbols_math, ams, rel, "\u21DD", "\\rightsquigarrow", true);
-defineSymbol(symbols_math, ams, rel, "\u21DD", "\\leadsto");
-defineSymbol(symbols_math, ams, rel, "\u21DB", "\\Rrightarrow", true);
-defineSymbol(symbols_math, ams, rel, "\u21BE", "\\restriction");
-defineSymbol(symbols_math, main, symbols_textord, "\u2018", "`");
-defineSymbol(symbols_math, main, symbols_textord, "$", "\\$");
-defineSymbol(symbols_text, main, symbols_textord, "$", "\\$");
-defineSymbol(symbols_text, main, symbols_textord, "$", "\\textdollar");
-defineSymbol(symbols_math, main, symbols_textord, "%", "\\%");
-defineSymbol(symbols_text, main, symbols_textord, "%", "\\%");
-defineSymbol(symbols_math, main, symbols_textord, "_", "\\_");
-defineSymbol(symbols_text, main, symbols_textord, "_", "\\_");
-defineSymbol(symbols_text, main, symbols_textord, "_", "\\textunderscore");
-defineSymbol(symbols_math, main, symbols_textord, "\u2220", "\\angle", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u221E", "\\infty", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u2032", "\\prime");
-defineSymbol(symbols_math, main, symbols_textord, "\u25B3", "\\triangle");
-defineSymbol(symbols_math, main, symbols_textord, "\u0393", "\\Gamma", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u0394", "\\Delta", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u0398", "\\Theta", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u039B", "\\Lambda", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u039E", "\\Xi", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u03A0", "\\Pi", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u03A3", "\\Sigma", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u03A5", "\\Upsilon", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u03A6", "\\Phi", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u03A8", "\\Psi", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u03A9", "\\Omega", true);
-defineSymbol(symbols_math, main, symbols_textord, "A", "\u0391");
-defineSymbol(symbols_math, main, symbols_textord, "B", "\u0392");
-defineSymbol(symbols_math, main, symbols_textord, "E", "\u0395");
-defineSymbol(symbols_math, main, symbols_textord, "Z", "\u0396");
-defineSymbol(symbols_math, main, symbols_textord, "H", "\u0397");
-defineSymbol(symbols_math, main, symbols_textord, "I", "\u0399");
-defineSymbol(symbols_math, main, symbols_textord, "K", "\u039A");
-defineSymbol(symbols_math, main, symbols_textord, "M", "\u039C");
-defineSymbol(symbols_math, main, symbols_textord, "N", "\u039D");
-defineSymbol(symbols_math, main, symbols_textord, "O", "\u039F");
-defineSymbol(symbols_math, main, symbols_textord, "P", "\u03A1");
-defineSymbol(symbols_math, main, symbols_textord, "T", "\u03A4");
-defineSymbol(symbols_math, main, symbols_textord, "X", "\u03A7");
-defineSymbol(symbols_math, main, symbols_textord, "\xAC", "\\neg", true);
-defineSymbol(symbols_math, main, symbols_textord, "\xAC", "\\lnot");
-defineSymbol(symbols_math, main, symbols_textord, "\u22A4", "\\top");
-defineSymbol(symbols_math, main, symbols_textord, "\u22A5", "\\bot");
-defineSymbol(symbols_math, main, symbols_textord, "\u2205", "\\emptyset");
-defineSymbol(symbols_math, ams, symbols_textord, "\u2205", "\\varnothing");
-defineSymbol(symbols_math, main, mathord, "\u03B1", "\\alpha", true);
-defineSymbol(symbols_math, main, mathord, "\u03B2", "\\beta", true);
-defineSymbol(symbols_math, main, mathord, "\u03B3", "\\gamma", true);
-defineSymbol(symbols_math, main, mathord, "\u03B4", "\\delta", true);
-defineSymbol(symbols_math, main, mathord, "\u03F5", "\\epsilon", true);
-defineSymbol(symbols_math, main, mathord, "\u03B6", "\\zeta", true);
-defineSymbol(symbols_math, main, mathord, "\u03B7", "\\eta", true);
-defineSymbol(symbols_math, main, mathord, "\u03B8", "\\theta", true);
-defineSymbol(symbols_math, main, mathord, "\u03B9", "\\iota", true);
-defineSymbol(symbols_math, main, mathord, "\u03BA", "\\kappa", true);
-defineSymbol(symbols_math, main, mathord, "\u03BB", "\\lambda", true);
-defineSymbol(symbols_math, main, mathord, "\u03BC", "\\mu", true);
-defineSymbol(symbols_math, main, mathord, "\u03BD", "\\nu", true);
-defineSymbol(symbols_math, main, mathord, "\u03BE", "\\xi", true);
-defineSymbol(symbols_math, main, mathord, "\u03BF", "\\omicron", true);
-defineSymbol(symbols_math, main, mathord, "\u03C0", "\\pi", true);
-defineSymbol(symbols_math, main, mathord, "\u03C1", "\\rho", true);
-defineSymbol(symbols_math, main, mathord, "\u03C3", "\\sigma", true);
-defineSymbol(symbols_math, main, mathord, "\u03C4", "\\tau", true);
-defineSymbol(symbols_math, main, mathord, "\u03C5", "\\upsilon", true);
-defineSymbol(symbols_math, main, mathord, "\u03D5", "\\phi", true);
-defineSymbol(symbols_math, main, mathord, "\u03C7", "\\chi", true);
-defineSymbol(symbols_math, main, mathord, "\u03C8", "\\psi", true);
-defineSymbol(symbols_math, main, mathord, "\u03C9", "\\omega", true);
-defineSymbol(symbols_math, main, mathord, "\u03B5", "\\varepsilon", true);
-defineSymbol(symbols_math, main, mathord, "\u03D1", "\\vartheta", true);
-defineSymbol(symbols_math, main, mathord, "\u03D6", "\\varpi", true);
-defineSymbol(symbols_math, main, mathord, "\u03F1", "\\varrho", true);
-defineSymbol(symbols_math, main, mathord, "\u03C2", "\\varsigma", true);
-defineSymbol(symbols_math, main, mathord, "\u03C6", "\\varphi", true);
-defineSymbol(symbols_math, main, bin, "\u2217", "*");
-defineSymbol(symbols_math, main, bin, "+", "+");
-defineSymbol(symbols_math, main, bin, "\u2212", "-");
-defineSymbol(symbols_math, main, bin, "\u22C5", "\\cdot", true);
-defineSymbol(symbols_math, main, bin, "\u2218", "\\circ");
-defineSymbol(symbols_math, main, bin, "\xF7", "\\div", true);
-defineSymbol(symbols_math, main, bin, "\xB1", "\\pm", true);
-defineSymbol(symbols_math, main, bin, "\xD7", "\\times", true);
-defineSymbol(symbols_math, main, bin, "\u2229", "\\cap", true);
-defineSymbol(symbols_math, main, bin, "\u222A", "\\cup", true);
-defineSymbol(symbols_math, main, bin, "\u2216", "\\setminus");
-defineSymbol(symbols_math, main, bin, "\u2227", "\\land");
-defineSymbol(symbols_math, main, bin, "\u2228", "\\lor");
-defineSymbol(symbols_math, main, bin, "\u2227", "\\wedge", true);
-defineSymbol(symbols_math, main, bin, "\u2228", "\\vee", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u221A", "\\surd");
-defineSymbol(symbols_math, main, symbols_open, "(", "(");
-defineSymbol(symbols_math, main, symbols_open, "[", "[");
-defineSymbol(symbols_math, main, symbols_open, "\u27E8", "\\langle", true);
-defineSymbol(symbols_math, main, symbols_open, "\u2223", "\\lvert");
-defineSymbol(symbols_math, main, symbols_open, "\u2225", "\\lVert");
-defineSymbol(symbols_math, main, symbols_close, ")", ")");
-defineSymbol(symbols_math, main, symbols_close, "]", "]");
-defineSymbol(symbols_math, main, symbols_close, "?", "?");
-defineSymbol(symbols_math, main, symbols_close, "!", "!");
-defineSymbol(symbols_math, main, symbols_close, "\u27E9", "\\rangle", true);
-defineSymbol(symbols_math, main, symbols_close, "\u2223", "\\rvert");
-defineSymbol(symbols_math, main, symbols_close, "\u2225", "\\rVert");
-defineSymbol(symbols_math, main, rel, "=", "=");
-defineSymbol(symbols_math, main, rel, "<", "<");
-defineSymbol(symbols_math, main, rel, ">", ">");
-defineSymbol(symbols_math, main, rel, ":", ":");
-defineSymbol(symbols_math, main, rel, "\u2248", "\\approx", true);
-defineSymbol(symbols_math, main, rel, "\u2245", "\\cong", true);
-defineSymbol(symbols_math, main, rel, "\u2265", "\\ge");
-defineSymbol(symbols_math, main, rel, "\u2265", "\\geq", true);
-defineSymbol(symbols_math, main, rel, "\u2190", "\\gets");
-defineSymbol(symbols_math, main, rel, ">", "\\gt");
-defineSymbol(symbols_math, main, rel, "\u2208", "\\in", true);
-defineSymbol(symbols_math, main, rel, "\uE020", "\\@not");
-defineSymbol(symbols_math, main, rel, "\u2282", "\\subset", true);
-defineSymbol(symbols_math, main, rel, "\u2283", "\\supset", true);
-defineSymbol(symbols_math, main, rel, "\u2286", "\\subseteq", true);
-defineSymbol(symbols_math, main, rel, "\u2287", "\\supseteq", true);
-defineSymbol(symbols_math, ams, rel, "\u2288", "\\nsubseteq", true);
-defineSymbol(symbols_math, ams, rel, "\u2289", "\\nsupseteq", true);
-defineSymbol(symbols_math, main, rel, "\u22A8", "\\models");
-defineSymbol(symbols_math, main, rel, "\u2190", "\\leftarrow", true);
-defineSymbol(symbols_math, main, rel, "\u2264", "\\le");
-defineSymbol(symbols_math, main, rel, "\u2264", "\\leq", true);
-defineSymbol(symbols_math, main, rel, "<", "\\lt");
-defineSymbol(symbols_math, main, rel, "\u2192", "\\rightarrow", true);
-defineSymbol(symbols_math, main, rel, "\u2192", "\\to");
-defineSymbol(symbols_math, ams, rel, "\u2271", "\\ngeq", true);
-defineSymbol(symbols_math, ams, rel, "\u2270", "\\nleq", true);
-defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\ ");
-defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "~");
-defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\space"); // Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{%
-
-defineSymbol(symbols_math, main, symbols_spacing, "\xA0", "\\nobreakspace");
-defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\ ");
-defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "~");
-defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\space");
-defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\nobreakspace");
-defineSymbol(symbols_math, main, symbols_spacing, null, "\\nobreak");
-defineSymbol(symbols_math, main, symbols_spacing, null, "\\allowbreak");
-defineSymbol(symbols_math, main, punct, ",", ",");
-defineSymbol(symbols_math, main, punct, ";", ";");
-defineSymbol(symbols_math, ams, bin, "\u22BC", "\\barwedge", true);
-defineSymbol(symbols_math, ams, bin, "\u22BB", "\\veebar", true);
-defineSymbol(symbols_math, main, bin, "\u2299", "\\odot", true);
-defineSymbol(symbols_math, main, bin, "\u2295", "\\oplus", true);
-defineSymbol(symbols_math, main, bin, "\u2297", "\\otimes", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u2202", "\\partial", true);
-defineSymbol(symbols_math, main, bin, "\u2298", "\\oslash", true);
-defineSymbol(symbols_math, ams, bin, "\u229A", "\\circledcirc", true);
-defineSymbol(symbols_math, ams, bin, "\u22A1", "\\boxdot", true);
-defineSymbol(symbols_math, main, bin, "\u25B3", "\\bigtriangleup");
-defineSymbol(symbols_math, main, bin, "\u25BD", "\\bigtriangledown");
-defineSymbol(symbols_math, main, bin, "\u2020", "\\dagger");
-defineSymbol(symbols_math, main, bin, "\u22C4", "\\diamond");
-defineSymbol(symbols_math, main, bin, "\u22C6", "\\star");
-defineSymbol(symbols_math, main, bin, "\u25C3", "\\triangleleft");
-defineSymbol(symbols_math, main, bin, "\u25B9", "\\triangleright");
-defineSymbol(symbols_math, main, symbols_open, "{", "\\{");
-defineSymbol(symbols_text, main, symbols_textord, "{", "\\{");
-defineSymbol(symbols_text, main, symbols_textord, "{", "\\textbraceleft");
-defineSymbol(symbols_math, main, symbols_close, "}", "\\}");
-defineSymbol(symbols_text, main, symbols_textord, "}", "\\}");
-defineSymbol(symbols_text, main, symbols_textord, "}", "\\textbraceright");
-defineSymbol(symbols_math, main, symbols_open, "{", "\\lbrace");
-defineSymbol(symbols_math, main, symbols_close, "}", "\\rbrace");
-defineSymbol(symbols_math, main, symbols_open, "[", "\\lbrack");
-defineSymbol(symbols_text, main, symbols_textord, "[", "\\lbrack");
-defineSymbol(symbols_math, main, symbols_close, "]", "\\rbrack");
-defineSymbol(symbols_text, main, symbols_textord, "]", "\\rbrack");
-defineSymbol(symbols_math, main, symbols_open, "(", "\\lparen");
-defineSymbol(symbols_math, main, symbols_close, ")", "\\rparen");
-defineSymbol(symbols_text, main, symbols_textord, "<", "\\textless"); // in T1 fontenc
-
-defineSymbol(symbols_text, main, symbols_textord, ">", "\\textgreater"); // in T1 fontenc
-
-defineSymbol(symbols_math, main, symbols_open, "\u230A", "\\lfloor", true);
-defineSymbol(symbols_math, main, symbols_close, "\u230B", "\\rfloor", true);
-defineSymbol(symbols_math, main, symbols_open, "\u2308", "\\lceil", true);
-defineSymbol(symbols_math, main, symbols_close, "\u2309", "\\rceil", true);
-defineSymbol(symbols_math, main, symbols_textord, "\\", "\\backslash");
-defineSymbol(symbols_math, main, symbols_textord, "\u2223", "|");
-defineSymbol(symbols_math, main, symbols_textord, "\u2223", "\\vert");
-defineSymbol(symbols_text, main, symbols_textord, "|", "\\textbar"); // in T1 fontenc
-
-defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\|");
-defineSymbol(symbols_math, main, symbols_textord, "\u2225", "\\Vert");
-defineSymbol(symbols_text, main, symbols_textord, "\u2225", "\\textbardbl");
-defineSymbol(symbols_text, main, symbols_textord, "~", "\\textasciitilde");
-defineSymbol(symbols_text, main, symbols_textord, "\\", "\\textbackslash");
-defineSymbol(symbols_text, main, symbols_textord, "^", "\\textasciicircum");
-defineSymbol(symbols_math, main, rel, "\u2191", "\\uparrow", true);
-defineSymbol(symbols_math, main, rel, "\u21D1", "\\Uparrow", true);
-defineSymbol(symbols_math, main, rel, "\u2193", "\\downarrow", true);
-defineSymbol(symbols_math, main, rel, "\u21D3", "\\Downarrow", true);
-defineSymbol(symbols_math, main, rel, "\u2195", "\\updownarrow", true);
-defineSymbol(symbols_math, main, rel, "\u21D5", "\\Updownarrow", true);
-defineSymbol(symbols_math, main, op, "\u2210", "\\coprod");
-defineSymbol(symbols_math, main, op, "\u22C1", "\\bigvee");
-defineSymbol(symbols_math, main, op, "\u22C0", "\\bigwedge");
-defineSymbol(symbols_math, main, op, "\u2A04", "\\biguplus");
-defineSymbol(symbols_math, main, op, "\u22C2", "\\bigcap");
-defineSymbol(symbols_math, main, op, "\u22C3", "\\bigcup");
-defineSymbol(symbols_math, main, op, "\u222B", "\\int");
-defineSymbol(symbols_math, main, op, "\u222B", "\\intop");
-defineSymbol(symbols_math, main, op, "\u222C", "\\iint");
-defineSymbol(symbols_math, main, op, "\u222D", "\\iiint");
-defineSymbol(symbols_math, main, op, "\u220F", "\\prod");
-defineSymbol(symbols_math, main, op, "\u2211", "\\sum");
-defineSymbol(symbols_math, main, op, "\u2A02", "\\bigotimes");
-defineSymbol(symbols_math, main, op, "\u2A01", "\\bigoplus");
-defineSymbol(symbols_math, main, op, "\u2A00", "\\bigodot");
-defineSymbol(symbols_math, main, op, "\u222E", "\\oint");
-defineSymbol(symbols_math, main, op, "\u222F", "\\oiint");
-defineSymbol(symbols_math, main, op, "\u2230", "\\oiiint");
-defineSymbol(symbols_math, main, op, "\u2A06", "\\bigsqcup");
-defineSymbol(symbols_math, main, op, "\u222B", "\\smallint");
-defineSymbol(symbols_text, main, symbols_inner, "\u2026", "\\textellipsis");
-defineSymbol(symbols_math, main, symbols_inner, "\u2026", "\\mathellipsis");
-defineSymbol(symbols_text, main, symbols_inner, "\u2026", "\\ldots", true);
-defineSymbol(symbols_math, main, symbols_inner, "\u2026", "\\ldots", true);
-defineSymbol(symbols_math, main, symbols_inner, "\u22EF", "\\@cdots", true);
-defineSymbol(symbols_math, main, symbols_inner, "\u22F1", "\\ddots", true);
-defineSymbol(symbols_math, main, symbols_textord, "\u22EE", "\\varvdots"); // \vdots is a macro
-
-defineSymbol(symbols_math, main, symbols_accent, "\u02CA", "\\acute");
-defineSymbol(symbols_math, main, symbols_accent, "\u02CB", "\\grave");
-defineSymbol(symbols_math, main, symbols_accent, "\xA8", "\\ddot");
-defineSymbol(symbols_math, main, symbols_accent, "~", "\\tilde");
-defineSymbol(symbols_math, main, symbols_accent, "\u02C9", "\\bar");
-defineSymbol(symbols_math, main, symbols_accent, "\u02D8", "\\breve");
-defineSymbol(symbols_math, main, symbols_accent, "\u02C7", "\\check");
-defineSymbol(symbols_math, main, symbols_accent, "^", "\\hat");
-defineSymbol(symbols_math, main, symbols_accent, "\u20D7", "\\vec");
-defineSymbol(symbols_math, main, symbols_accent, "\u02D9", "\\dot");
-defineSymbol(symbols_math, main, symbols_accent, "\u02DA", "\\mathring");
-defineSymbol(symbols_math, main, mathord, "\u0131", "\\imath", true);
-defineSymbol(symbols_math, main, mathord, "\u0237", "\\jmath", true);
-defineSymbol(symbols_text, main, symbols_textord, "\u0131", "\\i", true);
-defineSymbol(symbols_text, main, symbols_textord, "\u0237", "\\j", true);
-defineSymbol(symbols_text, main, symbols_textord, "\xDF", "\\ss", true);
-defineSymbol(symbols_text, main, symbols_textord, "\xE6", "\\ae", true);
-defineSymbol(symbols_text, main, symbols_textord, "\xE6", "\\ae", true);
-defineSymbol(symbols_text, main, symbols_textord, "\u0153", "\\oe", true);
-defineSymbol(symbols_text, main, symbols_textord, "\xF8", "\\o", true);
-defineSymbol(symbols_text, main, symbols_textord, "\xC6", "\\AE", true);
-defineSymbol(symbols_text, main, symbols_textord, "\u0152", "\\OE", true);
-defineSymbol(symbols_text, main, symbols_textord, "\xD8", "\\O", true);
-defineSymbol(symbols_text, main, symbols_accent, "\u02CA", "\\'"); // acute
-
-defineSymbol(symbols_text, main, symbols_accent, "\u02CB", "\\`"); // grave
-
-defineSymbol(symbols_text, main, symbols_accent, "\u02C6", "\\^"); // circumflex
-
-defineSymbol(symbols_text, main, symbols_accent, "\u02DC", "\\~"); // tilde
-
-defineSymbol(symbols_text, main, symbols_accent, "\u02C9", "\\="); // macron
-
-defineSymbol(symbols_text, main, symbols_accent, "\u02D8", "\\u"); // breve
-
-defineSymbol(symbols_text, main, symbols_accent, "\u02D9", "\\."); // dot above
-
-defineSymbol(symbols_text, main, symbols_accent, "\u02DA", "\\r"); // ring above
-
-defineSymbol(symbols_text, main, symbols_accent, "\u02C7", "\\v"); // caron
-
-defineSymbol(symbols_text, main, symbols_accent, "\xA8", '\\"'); // diaresis
-
-defineSymbol(symbols_text, main, symbols_accent, "\u02DD", "\\H"); // double acute
-
-defineSymbol(symbols_text, main, symbols_accent, "\u25EF", "\\textcircled"); // \bigcirc glyph
-// These ligatures are detected and created in Parser.js's `formLigatures`.
-
-var ligatures = {
-  "--": true,
-  "---": true,
-  "``": true,
-  "''": true
-};
-defineSymbol(symbols_text, main, symbols_textord, "\u2013", "--");
-defineSymbol(symbols_text, main, symbols_textord, "\u2013", "\\textendash");
-defineSymbol(symbols_text, main, symbols_textord, "\u2014", "---");
-defineSymbol(symbols_text, main, symbols_textord, "\u2014", "\\textemdash");
-defineSymbol(symbols_text, main, symbols_textord, "\u2018", "`");
-defineSymbol(symbols_text, main, symbols_textord, "\u2018", "\\textquoteleft");
-defineSymbol(symbols_text, main, symbols_textord, "\u2019", "'");
-defineSymbol(symbols_text, main, symbols_textord, "\u2019", "\\textquoteright");
-defineSymbol(symbols_text, main, symbols_textord, "\u201C", "``");
-defineSymbol(symbols_text, main, symbols_textord, "\u201C", "\\textquotedblleft");
-defineSymbol(symbols_text, main, symbols_textord, "\u201D", "''");
-defineSymbol(symbols_text, main, symbols_textord, "\u201D", "\\textquotedblright"); //  \degree from gensymb package
-
-defineSymbol(symbols_math, main, symbols_textord, "\xB0", "\\degree", true);
-defineSymbol(symbols_text, main, symbols_textord, "\xB0", "\\degree"); // \textdegree from inputenc package
-
-defineSymbol(symbols_text, main, symbols_textord, "\xB0", "\\textdegree", true); // TODO: In LaTeX, \pounds can generate a different character in text and math
-// mode, but among our fonts, only Main-Italic defines this character "163".
-
-defineSymbol(symbols_math, main, mathord, "\xA3", "\\pounds");
-defineSymbol(symbols_math, main, mathord, "\xA3", "\\mathsterling", true);
-defineSymbol(symbols_text, main, mathord, "\xA3", "\\pounds");
-defineSymbol(symbols_text, main, mathord, "\xA3", "\\textsterling", true);
-defineSymbol(symbols_math, ams, symbols_textord, "\u2720", "\\maltese");
-defineSymbol(symbols_text, ams, symbols_textord, "\u2720", "\\maltese");
-defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "\\ ");
-defineSymbol(symbols_text, main, symbols_spacing, "\xA0", " ");
-defineSymbol(symbols_text, main, symbols_spacing, "\xA0", "~"); // There are lots of symbols which are the same, so we add them in afterwards.
-// All of these are textords in math mode
-
-var mathTextSymbols = "0123456789/@.\"";
-
-for (var symbols_i = 0; symbols_i < mathTextSymbols.length; symbols_i++) {
-  var symbols_ch = mathTextSymbols.charAt(symbols_i);
-  defineSymbol(symbols_math, main, symbols_textord, symbols_ch, symbols_ch);
-} // All of these are textords in text mode
-
-
-var textSymbols = "0123456789!@*()-=+[]<>|\";:?/.,";
-
-for (var src_symbols_i = 0; src_symbols_i < textSymbols.length; src_symbols_i++) {
-  var _ch = textSymbols.charAt(src_symbols_i);
-
-  defineSymbol(symbols_text, main, symbols_textord, _ch, _ch);
-} // All of these are textords in text mode, and mathords in math mode
-
-
-var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
-
-for (var symbols_i2 = 0; symbols_i2 < letters.length; symbols_i2++) {
-  var _ch2 = letters.charAt(symbols_i2);
-
-  defineSymbol(symbols_math, main, mathord, _ch2, _ch2);
-  defineSymbol(symbols_text, main, symbols_textord, _ch2, _ch2);
-} // Blackboard bold and script letters in Unicode range
-
-
-defineSymbol(symbols_math, ams, symbols_textord, "C", "\u2102"); // blackboard bold
-
-defineSymbol(symbols_text, ams, symbols_textord, "C", "\u2102");
-defineSymbol(symbols_math, ams, symbols_textord, "H", "\u210D");
-defineSymbol(symbols_text, ams, symbols_textord, "H", "\u210D");
-defineSymbol(symbols_math, ams, symbols_textord, "N", "\u2115");
-defineSymbol(symbols_text, ams, symbols_textord, "N", "\u2115");
-defineSymbol(symbols_math, ams, symbols_textord, "P", "\u2119");
-defineSymbol(symbols_text, ams, symbols_textord, "P", "\u2119");
-defineSymbol(symbols_math, ams, symbols_textord, "Q", "\u211A");
-defineSymbol(symbols_text, ams, symbols_textord, "Q", "\u211A");
-defineSymbol(symbols_math, ams, symbols_textord, "R", "\u211D");
-defineSymbol(symbols_text, ams, symbols_textord, "R", "\u211D");
-defineSymbol(symbols_math, ams, symbols_textord, "Z", "\u2124");
-defineSymbol(symbols_text, ams, symbols_textord, "Z", "\u2124");
-defineSymbol(symbols_math, main, mathord, "h", "\u210E"); // italic h, Planck constant
-
-defineSymbol(symbols_text, main, mathord, "h", "\u210E"); // The next loop loads wide (surrogate pair) characters.
-// We support some letters in the Unicode range U+1D400 to U+1D7FF,
-// Mathematical Alphanumeric Symbols.
-// Some editors do not deal well with wide characters. So don't write the
-// string into this file. Instead, create the string from the surrogate pair.
-
-var symbols_wideChar = "";
-
-for (var symbols_i3 = 0; symbols_i3 < letters.length; symbols_i3++) {
-  var _ch3 = letters.charAt(symbols_i3); // The hex numbers in the next line are a surrogate pair.
-  // 0xD835 is the high surrogate for all letters in the range we support.
-  // 0xDC00 is the low surrogate for bold A.
-
-
-  symbols_wideChar = String.fromCharCode(0xD835, 0xDC00 + symbols_i3); // A-Z a-z bold
-
-  defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
-  defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
-  symbols_wideChar = String.fromCharCode(0xD835, 0xDC34 + symbols_i3); // A-Z a-z italic
-
-  defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
-  defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
-  symbols_wideChar = String.fromCharCode(0xD835, 0xDC68 + symbols_i3); // A-Z a-z bold italic
-
-  defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
-  defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
-  symbols_wideChar = String.fromCharCode(0xD835, 0xDD04 + symbols_i3); // A-Z a-z Fractur
-
-  defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
-  defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
-  symbols_wideChar = String.fromCharCode(0xD835, 0xDDA0 + symbols_i3); // A-Z a-z sans-serif
-
-  defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
-  defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
-  symbols_wideChar = String.fromCharCode(0xD835, 0xDDD4 + symbols_i3); // A-Z a-z sans bold
-
-  defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
-  defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
-  symbols_wideChar = String.fromCharCode(0xD835, 0xDE08 + symbols_i3); // A-Z a-z sans italic
-
-  defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
-  defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
-  symbols_wideChar = String.fromCharCode(0xD835, 0xDE70 + symbols_i3); // A-Z a-z monospace
-
-  defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
-  defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
-
-  if (symbols_i3 < 26) {
-    // KaTeX fonts have only capital letters for blackboard bold and script.
-    // See exception for k below.
-    symbols_wideChar = String.fromCharCode(0xD835, 0xDD38 + symbols_i3); // A-Z double struck
-
-    defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
-    defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
-    symbols_wideChar = String.fromCharCode(0xD835, 0xDC9C + symbols_i3); // A-Z script
-
-    defineSymbol(symbols_math, main, mathord, _ch3, symbols_wideChar);
-    defineSymbol(symbols_text, main, symbols_textord, _ch3, symbols_wideChar);
-  } // TODO: Add bold script when it is supported by a KaTeX font.
-
-} // "k" is the only double struck lower case letter in the KaTeX fonts.
-
-
-symbols_wideChar = String.fromCharCode(0xD835, 0xDD5C); // k double struck
-
-defineSymbol(symbols_math, main, mathord, "k", symbols_wideChar);
-defineSymbol(symbols_text, main, symbols_textord, "k", symbols_wideChar); // Next, some wide character numerals
-
-for (var symbols_i4 = 0; symbols_i4 < 10; symbols_i4++) {
-  var _ch4 = symbols_i4.toString();
-
-  symbols_wideChar = String.fromCharCode(0xD835, 0xDFCE + symbols_i4); // 0-9 bold
-
-  defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar);
-  defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar);
-  symbols_wideChar = String.fromCharCode(0xD835, 0xDFE2 + symbols_i4); // 0-9 sans serif
-
-  defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar);
-  defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar);
-  symbols_wideChar = String.fromCharCode(0xD835, 0xDFEC + symbols_i4); // 0-9 bold sans
-
-  defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar);
-  defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar);
-  symbols_wideChar = String.fromCharCode(0xD835, 0xDFF6 + symbols_i4); // 0-9 monospace
-
-  defineSymbol(symbols_math, main, mathord, _ch4, symbols_wideChar);
-  defineSymbol(symbols_text, main, symbols_textord, _ch4, symbols_wideChar);
-} // We add these Latin-1 letters as symbols for backwards-compatibility,
-// but they are not actually in the font, nor are they supported by the
-// Unicode accent mechanism, so they fall back to Times font and look ugly.
-// TODO(edemaine): Fix this.
-
-
-var extraLatin = "ÇÐÞçþ";
-
-for (var _i5 = 0; _i5 < extraLatin.length; _i5++) {
-  var _ch5 = extraLatin.charAt(_i5);
-
-  defineSymbol(symbols_math, main, mathord, _ch5, _ch5);
-  defineSymbol(symbols_text, main, symbols_textord, _ch5, _ch5);
-}
-
-defineSymbol(symbols_text, main, symbols_textord, "ð", "ð"); // Unicode versions of existing characters
-
-defineSymbol(symbols_text, main, symbols_textord, "\u2013", "–");
-defineSymbol(symbols_text, main, symbols_textord, "\u2014", "—");
-defineSymbol(symbols_text, main, symbols_textord, "\u2018", "‘");
-defineSymbol(symbols_text, main, symbols_textord, "\u2019", "’");
-defineSymbol(symbols_text, main, symbols_textord, "\u201C", "“");
-defineSymbol(symbols_text, main, symbols_textord, "\u201D", "”");
-// CONCATENATED MODULE: ./src/wide-character.js
-/**
- * This file provides support for Unicode range U+1D400 to U+1D7FF,
- * Mathematical Alphanumeric Symbols.
- *
- * Function wideCharacterFont takes a wide character as input and returns
- * the font information necessary to render it properly.
- */
-
-/**
- * Data below is from https://www.unicode.org/charts/PDF/U1D400.pdf
- * That document sorts characters into groups by font type, say bold or italic.
- *
- * In the arrays below, each subarray consists three elements:
- *      * The CSS class of that group when in math mode.
- *      * The CSS class of that group when in text mode.
- *      * The font name, so that KaTeX can get font metrics.
- */
-
-var wideLatinLetterData = [["mathbf", "textbf", "Main-Bold"], // A-Z bold upright
-["mathbf", "textbf", "Main-Bold"], // a-z bold upright
-["mathdefault", "textit", "Math-Italic"], // A-Z italic
-["mathdefault", "textit", "Math-Italic"], // a-z italic
-["boldsymbol", "boldsymbol", "Main-BoldItalic"], // A-Z bold italic
-["boldsymbol", "boldsymbol", "Main-BoldItalic"], // a-z bold italic
-// Map fancy A-Z letters to script, not calligraphic.
-// This aligns with unicode-math and math fonts (except Cambria Math).
-["mathscr", "textscr", "Script-Regular"], // A-Z script
-["", "", ""], // a-z script.  No font
-["", "", ""], // A-Z bold script. No font
-["", "", ""], // a-z bold script. No font
-["mathfrak", "textfrak", "Fraktur-Regular"], // A-Z Fraktur
-["mathfrak", "textfrak", "Fraktur-Regular"], // a-z Fraktur
-["mathbb", "textbb", "AMS-Regular"], // A-Z double-struck
-["mathbb", "textbb", "AMS-Regular"], // k double-struck
-["", "", ""], // A-Z bold Fraktur No font metrics
-["", "", ""], // a-z bold Fraktur.   No font.
-["mathsf", "textsf", "SansSerif-Regular"], // A-Z sans-serif
-["mathsf", "textsf", "SansSerif-Regular"], // a-z sans-serif
-["mathboldsf", "textboldsf", "SansSerif-Bold"], // A-Z bold sans-serif
-["mathboldsf", "textboldsf", "SansSerif-Bold"], // a-z bold sans-serif
-["mathitsf", "textitsf", "SansSerif-Italic"], // A-Z italic sans-serif
-["mathitsf", "textitsf", "SansSerif-Italic"], // a-z italic sans-serif
-["", "", ""], // A-Z bold italic sans. No font
-["", "", ""], // a-z bold italic sans. No font
-["mathtt", "texttt", "Typewriter-Regular"], // A-Z monospace
-["mathtt", "texttt", "Typewriter-Regular"]];
-var wideNumeralData = [["mathbf", "textbf", "Main-Bold"], // 0-9 bold
-["", "", ""], // 0-9 double-struck. No KaTeX font.
-["mathsf", "textsf", "SansSerif-Regular"], // 0-9 sans-serif
-["mathboldsf", "textboldsf", "SansSerif-Bold"], // 0-9 bold sans-serif
-["mathtt", "texttt", "Typewriter-Regular"]];
-var wide_character_wideCharacterFont = function wideCharacterFont(wideChar, mode) {
-  // IE doesn't support codePointAt(). So work with the surrogate pair.
-  var H = wideChar.charCodeAt(0); // high surrogate
-
-  var L = wideChar.charCodeAt(1); // low surrogate
-
-  var codePoint = (H - 0xD800) * 0x400 + (L - 0xDC00) + 0x10000;
-  var j = mode === "math" ? 0 : 1; // column index for CSS class.
-
-  if (0x1D400 <= codePoint && codePoint < 0x1D6A4) {
-    // wideLatinLetterData contains exactly 26 chars on each row.
-    // So we can calculate the relevant row. No traverse necessary.
-    var i = Math.floor((codePoint - 0x1D400) / 26);
-    return [wideLatinLetterData[i][2], wideLatinLetterData[i][j]];
-  } else if (0x1D7CE <= codePoint && codePoint <= 0x1D7FF) {
-    // Numerals, ten per row.
-    var _i = Math.floor((codePoint - 0x1D7CE) / 10);
-
-    return [wideNumeralData[_i][2], wideNumeralData[_i][j]];
-  } else if (codePoint === 0x1D6A5 || codePoint === 0x1D6A6) {
-    // dotless i or j
-    return [wideLatinLetterData[0][2], wideLatinLetterData[0][j]];
-  } else if (0x1D6A6 < codePoint && codePoint < 0x1D7CE) {
-    // Greek letters. Not supported, yet.
-    return ["", ""];
-  } else {
-    // We don't support any wide characters outside 1D400–1D7FF.
-    throw new src_ParseError("Unsupported character: " + wideChar);
-  }
-};
-// CONCATENATED MODULE: ./src/Options.js
-/**
- * This file contains information about the options that the Parser carries
- * around with it while parsing. Data is held in an `Options` object, and when
- * recursing, a new `Options` object can be created with the `.with*` and
- * `.reset` functions.
- */
-
-var sizeStyleMap = [// Each element contains [textsize, scriptsize, scriptscriptsize].
-// The size mappings are taken from TeX with \normalsize=10pt.
-[1, 1, 1], // size1: [5, 5, 5]              \tiny
-[2, 1, 1], // size2: [6, 5, 5]
-[3, 1, 1], // size3: [7, 5, 5]              \scriptsize
-[4, 2, 1], // size4: [8, 6, 5]              \footnotesize
-[5, 2, 1], // size5: [9, 6, 5]              \small
-[6, 3, 1], // size6: [10, 7, 5]             \normalsize
-[7, 4, 2], // size7: [12, 8, 6]             \large
-[8, 6, 3], // size8: [14.4, 10, 7]          \Large
-[9, 7, 6], // size9: [17.28, 12, 10]        \LARGE
-[10, 8, 7], // size10: [20.74, 14.4, 12]     \huge
-[11, 10, 9]];
-var sizeMultipliers = [// fontMetrics.js:getGlobalMetrics also uses size indexes, so if
-// you change size indexes, change that function.
-0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488];
-
-var sizeAtStyle = function sizeAtStyle(size, style) {
-  return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1];
-}; // In these types, "" (empty string) means "no change".
-
-
-/**
- * This is the main options class. It contains the current style, size, color,
- * and font.
- *
- * Options objects should not be modified. To create a new Options with
- * different properties, call a `.having*` method.
- */
-var Options_Options =
-/*#__PURE__*/
-function () {
-  // A font family applies to a group of fonts (i.e. SansSerif), while a font
-  // represents a specific font (i.e. SansSerif Bold).
-  // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm
-
-  /**
-   * The base size index.
-   */
-  function Options(data) {
-    this.style = void 0;
-    this.color = void 0;
-    this.size = void 0;
-    this.textSize = void 0;
-    this.phantom = void 0;
-    this.font = void 0;
-    this.fontFamily = void 0;
-    this.fontWeight = void 0;
-    this.fontShape = void 0;
-    this.sizeMultiplier = void 0;
-    this.maxSize = void 0;
-    this.minRuleThickness = void 0;
-    this._fontMetrics = void 0;
-    this.style = data.style;
-    this.color = data.color;
-    this.size = data.size || Options.BASESIZE;
-    this.textSize = data.textSize || this.size;
-    this.phantom = !!data.phantom;
-    this.font = data.font || "";
-    this.fontFamily = data.fontFamily || "";
-    this.fontWeight = data.fontWeight || '';
-    this.fontShape = data.fontShape || '';
-    this.sizeMultiplier = sizeMultipliers[this.size - 1];
-    this.maxSize = data.maxSize;
-    this.minRuleThickness = data.minRuleThickness;
-    this._fontMetrics = undefined;
-  }
-  /**
-   * Returns a new options object with the same properties as "this".  Properties
-   * from "extension" will be copied to the new options object.
-   */
-
-
-  var _proto = Options.prototype;
-
-  _proto.extend = function extend(extension) {
-    var data = {
-      style: this.style,
-      size: this.size,
-      textSize: this.textSize,
-      color: this.color,
-      phantom: this.phantom,
-      font: this.font,
-      fontFamily: this.fontFamily,
-      fontWeight: this.fontWeight,
-      fontShape: this.fontShape,
-      maxSize: this.maxSize,
-      minRuleThickness: this.minRuleThickness
-    };
-
-    for (var key in extension) {
-      if (extension.hasOwnProperty(key)) {
-        data[key] = extension[key];
-      }
-    }
-
-    return new Options(data);
-  }
-  /**
-   * Return an options object with the given style. If `this.style === style`,
-   * returns `this`.
-   */
-  ;
-
-  _proto.havingStyle = function havingStyle(style) {
-    if (this.style === style) {
-      return this;
-    } else {
-      return this.extend({
-        style: style,
-        size: sizeAtStyle(this.textSize, style)
-      });
-    }
-  }
-  /**
-   * Return an options object with a cramped version of the current style. If
-   * the current style is cramped, returns `this`.
-   */
-  ;
-
-  _proto.havingCrampedStyle = function havingCrampedStyle() {
-    return this.havingStyle(this.style.cramp());
-  }
-  /**
-   * Return an options object with the given size and in at least `\textstyle`.
-   * Returns `this` if appropriate.
-   */
-  ;
-
-  _proto.havingSize = function havingSize(size) {
-    if (this.size === size && this.textSize === size) {
-      return this;
-    } else {
-      return this.extend({
-        style: this.style.text(),
-        size: size,
-        textSize: size,
-        sizeMultiplier: sizeMultipliers[size - 1]
-      });
-    }
-  }
-  /**
-   * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted,
-   * changes to at least `\textstyle`.
-   */
-  ;
-
-  _proto.havingBaseStyle = function havingBaseStyle(style) {
-    style = style || this.style.text();
-    var wantSize = sizeAtStyle(Options.BASESIZE, style);
-
-    if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) {
-      return this;
-    } else {
-      return this.extend({
-        style: style,
-        size: wantSize
-      });
-    }
-  }
-  /**
-   * Remove the effect of sizing changes such as \Huge.
-   * Keep the effect of the current style, such as \scriptstyle.
-   */
-  ;
-
-  _proto.havingBaseSizing = function havingBaseSizing() {
-    var size;
-
-    switch (this.style.id) {
-      case 4:
-      case 5:
-        size = 3; // normalsize in scriptstyle
-
-        break;
-
-      case 6:
-      case 7:
-        size = 1; // normalsize in scriptscriptstyle
-
-        break;
-
-      default:
-        size = 6;
-      // normalsize in textstyle or displaystyle
-    }
-
-    return this.extend({
-      style: this.style.text(),
-      size: size
-    });
-  }
-  /**
-   * Create a new options object with the given color.
-   */
-  ;
-
-  _proto.withColor = function withColor(color) {
-    return this.extend({
-      color: color
-    });
-  }
-  /**
-   * Create a new options object with "phantom" set to true.
-   */
-  ;
-
-  _proto.withPhantom = function withPhantom() {
-    return this.extend({
-      phantom: true
-    });
-  }
-  /**
-   * Creates a new options object with the given math font or old text font.
-   * @type {[type]}
-   */
-  ;
-
-  _proto.withFont = function withFont(font) {
-    return this.extend({
-      font: font
-    });
-  }
-  /**
-   * Create a new options objects with the given fontFamily.
-   */
-  ;
-
-  _proto.withTextFontFamily = function withTextFontFamily(fontFamily) {
-    return this.extend({
-      fontFamily: fontFamily,
-      font: ""
-    });
-  }
-  /**
-   * Creates a new options object with the given font weight
-   */
-  ;
-
-  _proto.withTextFontWeight = function withTextFontWeight(fontWeight) {
-    return this.extend({
-      fontWeight: fontWeight,
-      font: ""
-    });
-  }
-  /**
-   * Creates a new options object with the given font weight
-   */
-  ;
-
-  _proto.withTextFontShape = function withTextFontShape(fontShape) {
-    return this.extend({
-      fontShape: fontShape,
-      font: ""
-    });
-  }
-  /**
-   * Return the CSS sizing classes required to switch from enclosing options
-   * `oldOptions` to `this`. Returns an array of classes.
-   */
-  ;
-
-  _proto.sizingClasses = function sizingClasses(oldOptions) {
-    if (oldOptions.size !== this.size) {
-      return ["sizing", "reset-size" + oldOptions.size, "size" + this.size];
-    } else {
-      return [];
-    }
-  }
-  /**
-   * Return the CSS sizing classes required to switch to the base size. Like
-   * `this.havingSize(BASESIZE).sizingClasses(this)`.
-   */
-  ;
-
-  _proto.baseSizingClasses = function baseSizingClasses() {
-    if (this.size !== Options.BASESIZE) {
-      return ["sizing", "reset-size" + this.size, "size" + Options.BASESIZE];
-    } else {
-      return [];
-    }
-  }
-  /**
-   * Return the font metrics for this size.
-   */
-  ;
-
-  _proto.fontMetrics = function fontMetrics() {
-    if (!this._fontMetrics) {
-      this._fontMetrics = getGlobalMetrics(this.size);
-    }
-
-    return this._fontMetrics;
-  }
-  /**
-   * Gets the CSS color of the current options object
-   */
-  ;
-
-  _proto.getColor = function getColor() {
-    if (this.phantom) {
-      return "transparent";
-    } else {
-      return this.color;
-    }
-  };
-
-  return Options;
-}();
-
-Options_Options.BASESIZE = 6;
-/* harmony default export */ var src_Options = (Options_Options);
-// CONCATENATED MODULE: ./src/units.js
-/**
- * This file does conversion between units.  In particular, it provides
- * calculateSize to convert other units into ems.
- */
-
- // This table gives the number of TeX pts in one of each *absolute* TeX unit.
-// Thus, multiplying a length by this number converts the length from units
-// into pts.  Dividing the result by ptPerEm gives the number of ems
-// *assuming* a font size of ptPerEm (normal size, normal style).
-
-var ptPerUnit = {
-  // https://en.wikibooks.org/wiki/LaTeX/Lengths and
-  // https://tex.stackexchange.com/a/8263
-  "pt": 1,
-  // TeX point
-  "mm": 7227 / 2540,
-  // millimeter
-  "cm": 7227 / 254,
-  // centimeter
-  "in": 72.27,
-  // inch
-  "bp": 803 / 800,
-  // big (PostScript) points
-  "pc": 12,
-  // pica
-  "dd": 1238 / 1157,
-  // didot
-  "cc": 14856 / 1157,
-  // cicero (12 didot)
-  "nd": 685 / 642,
-  // new didot
-  "nc": 1370 / 107,
-  // new cicero (12 new didot)
-  "sp": 1 / 65536,
-  // scaled point (TeX's internal smallest unit)
-  // https://tex.stackexchange.com/a/41371
-  "px": 803 / 800 // \pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX
-
-}; // Dictionary of relative units, for fast validity testing.
-
-var relativeUnit = {
-  "ex": true,
-  "em": true,
-  "mu": true
-};
-
-/**
- * Determine whether the specified unit (either a string defining the unit
- * or a "size" parse node containing a unit field) is valid.
- */
-var validUnit = function validUnit(unit) {
-  if (typeof unit !== "string") {
-    unit = unit.unit;
-  }
-
-  return unit in ptPerUnit || unit in relativeUnit || unit === "ex";
-};
-/*
- * Convert a "size" parse node (with numeric "number" and string "unit" fields,
- * as parsed by functions.js argType "size") into a CSS em value for the
- * current style/scale.  `options` gives the current options.
- */
-
-var units_calculateSize = function calculateSize(sizeValue, options) {
-  var scale;
-
-  if (sizeValue.unit in ptPerUnit) {
-    // Absolute units
-    scale = ptPerUnit[sizeValue.unit] // Convert unit to pt
-    / options.fontMetrics().ptPerEm // Convert pt to CSS em
-    / options.sizeMultiplier; // Unscale to make absolute units
-  } else if (sizeValue.unit === "mu") {
-    // `mu` units scale with scriptstyle/scriptscriptstyle.
-    scale = options.fontMetrics().cssEmPerMu;
-  } else {
-    // Other relative units always refer to the *textstyle* font
-    // in the current size.
-    var unitOptions;
-
-    if (options.style.isTight()) {
-      // isTight() means current style is script/scriptscript.
-      unitOptions = options.havingStyle(options.style.text());
-    } else {
-      unitOptions = options;
-    } // TODO: In TeX these units are relative to the quad of the current
-    // *text* font, e.g. cmr10. KaTeX instead uses values from the
-    // comparably-sized *Computer Modern symbol* font. At 10pt, these
-    // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641;
-    // cmr5=1.361133, cmsy5=1.472241. Consider $\scriptsize a\kern1emb$.
-    // TeX \showlists shows a kern of 1.13889 * fontsize;
-    // KaTeX shows a kern of 1.171 * fontsize.
-
-
-    if (sizeValue.unit === "ex") {
-      scale = unitOptions.fontMetrics().xHeight;
-    } else if (sizeValue.unit === "em") {
-      scale = unitOptions.fontMetrics().quad;
-    } else {
-      throw new src_ParseError("Invalid unit: '" + sizeValue.unit + "'");
-    }
-
-    if (unitOptions !== options) {
-      scale *= unitOptions.sizeMultiplier / options.sizeMultiplier;
-    }
-  }
-
-  return Math.min(sizeValue.number * scale, options.maxSize);
-};
-// CONCATENATED MODULE: ./src/buildCommon.js
-/* eslint no-console:0 */
-
-/**
- * This module contains general functions that can be used for building
- * different kinds of domTree nodes in a consistent manner.
- */
-
-
-
-
-
-
-
-// The following have to be loaded from Main-Italic font, using class mathit
-var mathitLetters = ["\\imath", "ı", // dotless i
-"\\jmath", "ȷ", // dotless j
-"\\pounds", "\\mathsterling", "\\textsterling", "£"];
-/**
- * Looks up the given symbol in fontMetrics, after applying any symbol
- * replacements defined in symbol.js
- */
-
-var buildCommon_lookupSymbol = function lookupSymbol(value, // TODO(#963): Use a union type for this.
-fontName, mode) {
-  // Replace the value with its replaced value from symbol.js
-  if (src_symbols[mode][value] && src_symbols[mode][value].replace) {
-    value = src_symbols[mode][value].replace;
-  }
-
-  return {
-    value: value,
-    metrics: getCharacterMetrics(value, fontName, mode)
-  };
-};
-/**
- * Makes a symbolNode after translation via the list of symbols in symbols.js.
- * Correctly pulls out metrics for the character, and optionally takes a list of
- * classes to be attached to the node.
- *
- * TODO: make argument order closer to makeSpan
- * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which
- * should if present come first in `classes`.
- * TODO(#953): Make `options` mandatory and always pass it in.
- */
-
-
-var buildCommon_makeSymbol = function makeSymbol(value, fontName, mode, options, classes) {
-  var lookup = buildCommon_lookupSymbol(value, fontName, mode);
-  var metrics = lookup.metrics;
-  value = lookup.value;
-  var symbolNode;
-
-  if (metrics) {
-    var italic = metrics.italic;
-
-    if (mode === "text" || options && options.font === "mathit") {
-      italic = 0;
-    }
-
-    symbolNode = new domTree_SymbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes);
-  } else {
-    // TODO(emily): Figure out a good way to only print this in development
-    typeof console !== "undefined" && console.warn("No character metrics " + ("for '" + value + "' in style '" + fontName + "' and mode '" + mode + "'"));
-    symbolNode = new domTree_SymbolNode(value, 0, 0, 0, 0, 0, classes);
-  }
-
-  if (options) {
-    symbolNode.maxFontSize = options.sizeMultiplier;
-
-    if (options.style.isTight()) {
-      symbolNode.classes.push("mtight");
-    }
-
-    var color = options.getColor();
-
-    if (color) {
-      symbolNode.style.color = color;
-    }
-  }
-
-  return symbolNode;
-};
-/**
- * Makes a symbol in Main-Regular or AMS-Regular.
- * Used for rel, bin, open, close, inner, and punct.
- */
-
-
-var buildCommon_mathsym = function mathsym(value, mode, options, classes) {
-  if (classes === void 0) {
-    classes = [];
-  }
-
-  // Decide what font to render the symbol in by its entry in the symbols
-  // table.
-  // Have a special case for when the value = \ because the \ is used as a
-  // textord in unsupported command errors but cannot be parsed as a regular
-  // text ordinal and is therefore not present as a symbol in the symbols
-  // table for text, as well as a special case for boldsymbol because it
-  // can be used for bold + and -
-  if (options.font === "boldsymbol" && buildCommon_lookupSymbol(value, "Main-Bold", mode).metrics) {
-    return buildCommon_makeSymbol(value, "Main-Bold", mode, options, classes.concat(["mathbf"]));
-  } else if (value === "\\" || src_symbols[mode][value].font === "main") {
-    return buildCommon_makeSymbol(value, "Main-Regular", mode, options, classes);
-  } else {
-    return buildCommon_makeSymbol(value, "AMS-Regular", mode, options, classes.concat(["amsrm"]));
-  }
-};
-/**
- * Determines which of the two font names (Main-Italic and Math-Italic) and
- * corresponding style tags (maindefault or mathit) to use for default math font,
- * depending on the symbol.
- */
-
-
-var buildCommon_mathdefault = function mathdefault(value, mode, options, classes) {
-  if (/[0-9]/.test(value.charAt(0)) || // glyphs for \imath and \jmath do not exist in Math-Italic so we
-  // need to use Main-Italic instead
-  utils.contains(mathitLetters, value)) {
-    return {
-      fontName: "Main-Italic",
-      fontClass: "mathit"
-    };
-  } else {
-    return {
-      fontName: "Math-Italic",
-      fontClass: "mathdefault"
-    };
-  }
-};
-/**
- * Determines which of the font names (Main-Italic, Math-Italic, and Caligraphic)
- * and corresponding style tags (mathit, mathdefault, or mathcal) to use for font
- * "mathnormal", depending on the symbol.  Use this function instead of fontMap for
- * font "mathnormal".
- */
-
-
-var buildCommon_mathnormal = function mathnormal(value, mode, options, classes) {
-  if (utils.contains(mathitLetters, value)) {
-    return {
-      fontName: "Main-Italic",
-      fontClass: "mathit"
-    };
-  } else if (/[0-9]/.test(value.charAt(0))) {
-    return {
-      fontName: "Caligraphic-Regular",
-      fontClass: "mathcal"
-    };
-  } else {
-    return {
-      fontName: "Math-Italic",
-      fontClass: "mathdefault"
-    };
-  }
-};
-/**
- * Determines which of the two font names (Main-Bold and Math-BoldItalic) and
- * corresponding style tags (mathbf or boldsymbol) to use for font "boldsymbol",
- * depending on the symbol.  Use this function instead of fontMap for font
- * "boldsymbol".
- */
-
-
-var boldsymbol = function boldsymbol(value, mode, options, classes) {
-  if (buildCommon_lookupSymbol(value, "Math-BoldItalic", mode).metrics) {
-    return {
-      fontName: "Math-BoldItalic",
-      fontClass: "boldsymbol"
-    };
-  } else {
-    // Some glyphs do not exist in Math-BoldItalic so we need to use
-    // Main-Bold instead.
-    return {
-      fontName: "Main-Bold",
-      fontClass: "mathbf"
-    };
-  }
-};
-/**
- * Makes either a mathord or textord in the correct font and color.
- */
-
-
-var buildCommon_makeOrd = function makeOrd(group, options, type) {
-  var mode = group.mode;
-  var text = group.text;
-  var classes = ["mord"]; // Math mode or Old font (i.e. \rm)
-
-  var isFont = mode === "math" || mode === "text" && options.font;
-  var fontOrFamily = isFont ? options.font : options.fontFamily;
-
-  if (text.charCodeAt(0) === 0xD835) {
-    // surrogate pairs get special treatment
-    var _wideCharacterFont = wide_character_wideCharacterFont(text, mode),
-        wideFontName = _wideCharacterFont[0],
-        wideFontClass = _wideCharacterFont[1];
-
-    return buildCommon_makeSymbol(text, wideFontName, mode, options, classes.concat(wideFontClass));
-  } else if (fontOrFamily) {
-    var fontName;
-    var fontClasses;
-
-    if (fontOrFamily === "boldsymbol" || fontOrFamily === "mathnormal") {
-      var fontData = fontOrFamily === "boldsymbol" ? boldsymbol(text, mode, options, classes) : buildCommon_mathnormal(text, mode, options, classes);
-      fontName = fontData.fontName;
-      fontClasses = [fontData.fontClass];
-    } else if (utils.contains(mathitLetters, text)) {
-      fontName = "Main-Italic";
-      fontClasses = ["mathit"];
-    } else if (isFont) {
-      fontName = fontMap[fontOrFamily].fontName;
-      fontClasses = [fontOrFamily];
-    } else {
-      fontName = retrieveTextFontName(fontOrFamily, options.fontWeight, options.fontShape);
-      fontClasses = [fontOrFamily, options.fontWeight, options.fontShape];
-    }
-
-    if (buildCommon_lookupSymbol(text, fontName, mode).metrics) {
-      return buildCommon_makeSymbol(text, fontName, mode, options, classes.concat(fontClasses));
-    } else if (ligatures.hasOwnProperty(text) && fontName.substr(0, 10) === "Typewriter") {
-      // Deconstruct ligatures in monospace fonts (\texttt, \tt).
-      var parts = [];
-
-      for (var i = 0; i < text.length; i++) {
-        parts.push(buildCommon_makeSymbol(text[i], fontName, mode, options, classes.concat(fontClasses)));
-      }
-
-      return buildCommon_makeFragment(parts);
-    }
-  } // Makes a symbol in the default font for mathords and textords.
-
-
-  if (type === "mathord") {
-    var fontLookup = buildCommon_mathdefault(text, mode, options, classes);
-    return buildCommon_makeSymbol(text, fontLookup.fontName, mode, options, classes.concat([fontLookup.fontClass]));
-  } else if (type === "textord") {
-    var font = src_symbols[mode][text] && src_symbols[mode][text].font;
-
-    if (font === "ams") {
-      var _fontName = retrieveTextFontName("amsrm", options.fontWeight, options.fontShape);
-
-      return buildCommon_makeSymbol(text, _fontName, mode, options, classes.concat("amsrm", options.fontWeight, options.fontShape));
-    } else if (font === "main" || !font) {
-      var _fontName2 = retrieveTextFontName("textrm", options.fontWeight, options.fontShape);
-
-      return buildCommon_makeSymbol(text, _fontName2, mode, options, classes.concat(options.fontWeight, options.fontShape));
-    } else {
-      // fonts added by plugins
-      var _fontName3 = retrieveTextFontName(font, options.fontWeight, options.fontShape); // We add font name as a css class
-
-
-      return buildCommon_makeSymbol(text, _fontName3, mode, options, classes.concat(_fontName3, options.fontWeight, options.fontShape));
-    }
-  } else {
-    throw new Error("unexpected type: " + type + " in makeOrd");
-  }
-};
-/**
- * Returns true if subsequent symbolNodes have the same classes, skew, maxFont,
- * and styles.
- */
-
-
-var buildCommon_canCombine = function canCombine(prev, next) {
-  if (createClass(prev.classes) !== createClass(next.classes) || prev.skew !== next.skew || prev.maxFontSize !== next.maxFontSize) {
-    return false;
-  }
-
-  for (var style in prev.style) {
-    if (prev.style.hasOwnProperty(style) && prev.style[style] !== next.style[style]) {
-      return false;
-    }
-  }
-
-  for (var _style in next.style) {
-    if (next.style.hasOwnProperty(_style) && prev.style[_style] !== next.style[_style]) {
-      return false;
-    }
-  }
-
-  return true;
-};
-/**
- * Combine consequetive domTree.symbolNodes into a single symbolNode.
- * Note: this function mutates the argument.
- */
-
-
-var buildCommon_tryCombineChars = function tryCombineChars(chars) {
-  for (var i = 0; i < chars.length - 1; i++) {
-    var prev = chars[i];
-    var next = chars[i + 1];
-
-    if (prev instanceof domTree_SymbolNode && next instanceof domTree_SymbolNode && buildCommon_canCombine(prev, next)) {
-      prev.text += next.text;
-      prev.height = Math.max(prev.height, next.height);
-      prev.depth = Math.max(prev.depth, next.depth); // Use the last character's italic correction since we use
-      // it to add padding to the right of the span created from
-      // the combined characters.
-
-      prev.italic = next.italic;
-      chars.splice(i + 1, 1);
-      i--;
-    }
-  }
-
-  return chars;
-};
-/**
- * Calculate the height, depth, and maxFontSize of an element based on its
- * children.
- */
-
-
-var sizeElementFromChildren = function sizeElementFromChildren(elem) {
-  var height = 0;
-  var depth = 0;
-  var maxFontSize = 0;
-
-  for (var i = 0; i < elem.children.length; i++) {
-    var child = elem.children[i];
-
-    if (child.height > height) {
-      height = child.height;
-    }
-
-    if (child.depth > depth) {
-      depth = child.depth;
-    }
-
-    if (child.maxFontSize > maxFontSize) {
-      maxFontSize = child.maxFontSize;
-    }
-  }
-
-  elem.height = height;
-  elem.depth = depth;
-  elem.maxFontSize = maxFontSize;
-};
-/**
- * Makes a span with the given list of classes, list of children, and options.
- *
- * TODO(#953): Ensure that `options` is always provided (currently some call
- * sites don't pass it) and make the type below mandatory.
- * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which
- * should if present come first in `classes`.
- */
-
-
-var buildCommon_makeSpan = function makeSpan(classes, children, options, style) {
-  var span = new domTree_Span(classes, children, options, style);
-  sizeElementFromChildren(span);
-  return span;
-}; // SVG one is simpler -- doesn't require height, depth, max-font setting.
-// This is also a separate method for typesafety.
-
-
-var buildCommon_makeSvgSpan = function makeSvgSpan(classes, children, options, style) {
-  return new domTree_Span(classes, children, options, style);
-};
-
-var makeLineSpan = function makeLineSpan(className, options, thickness) {
-  var line = buildCommon_makeSpan([className], [], options);
-  line.height = Math.max(thickness || options.fontMetrics().defaultRuleThickness, options.minRuleThickness);
-  line.style.borderBottomWidth = line.height + "em";
-  line.maxFontSize = 1.0;
-  return line;
-};
-/**
- * Makes an anchor with the given href, list of classes, list of children,
- * and options.
- */
-
-
-var buildCommon_makeAnchor = function makeAnchor(href, classes, children, options) {
-  var anchor = new domTree_Anchor(href, classes, children, options);
-  sizeElementFromChildren(anchor);
-  return anchor;
-};
-/**
- * Makes a document fragment with the given list of children.
- */
-
-
-var buildCommon_makeFragment = function makeFragment(children) {
-  var fragment = new tree_DocumentFragment(children);
-  sizeElementFromChildren(fragment);
-  return fragment;
-};
-/**
- * Wraps group in a span if it's a document fragment, allowing to apply classes
- * and styles
- */
-
-
-var buildCommon_wrapFragment = function wrapFragment(group, options) {
-  if (group instanceof tree_DocumentFragment) {
-    return buildCommon_makeSpan([], [group], options);
-  }
-
-  return group;
-}; // These are exact object types to catch typos in the names of the optional fields.
-
-
-// Computes the updated `children` list and the overall depth.
-//
-// This helper function for makeVList makes it easier to enforce type safety by
-// allowing early exits (returns) in the logic.
-var getVListChildrenAndDepth = function getVListChildrenAndDepth(params) {
-  if (params.positionType === "individualShift") {
-    var oldChildren = params.children;
-    var children = [oldChildren[0]]; // Add in kerns to the list of params.children to get each element to be
-    // shifted to the correct specified shift
-
-    var _depth = -oldChildren[0].shift - oldChildren[0].elem.depth;
-
-    var currPos = _depth;
-
-    for (var i = 1; i < oldChildren.length; i++) {
-      var diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth;
-      var size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth);
-      currPos = currPos + diff;
-      children.push({
-        type: "kern",
-        size: size
-      });
-      children.push(oldChildren[i]);
-    }
-
-    return {
-      children: children,
-      depth: _depth
-    };
-  }
-
-  var depth;
-
-  if (params.positionType === "top") {
-    // We always start at the bottom, so calculate the bottom by adding up
-    // all the sizes
-    var bottom = params.positionData;
-
-    for (var _i = 0; _i < params.children.length; _i++) {
-      var child = params.children[_i];
-      bottom -= child.type === "kern" ? child.size : child.elem.height + child.elem.depth;
-    }
-
-    depth = bottom;
-  } else if (params.positionType === "bottom") {
-    depth = -params.positionData;
-  } else {
-    var firstChild = params.children[0];
-
-    if (firstChild.type !== "elem") {
-      throw new Error('First child must have type "elem".');
-    }
-
-    if (params.positionType === "shift") {
-      depth = -firstChild.elem.depth - params.positionData;
-    } else if (params.positionType === "firstBaseline") {
-      depth = -firstChild.elem.depth;
-    } else {
-      throw new Error("Invalid positionType " + params.positionType + ".");
-    }
-  }
-
-  return {
-    children: params.children,
-    depth: depth
-  };
-};
-/**
- * Makes a vertical list by stacking elements and kerns on top of each other.
- * Allows for many different ways of specifying the positioning method.
- *
- * See VListParam documentation above.
- */
-
-
-var buildCommon_makeVList = function makeVList(params, options) {
-  var _getVListChildrenAndD = getVListChildrenAndDepth(params),
-      children = _getVListChildrenAndD.children,
-      depth = _getVListChildrenAndD.depth; // Create a strut that is taller than any list item. The strut is added to
-  // each item, where it will determine the item's baseline. Since it has
-  // `overflow:hidden`, the strut's top edge will sit on the item's line box's
-  // top edge and the strut's bottom edge will sit on the item's baseline,
-  // with no additional line-height spacing. This allows the item baseline to
-  // be positioned precisely without worrying about font ascent and
-  // line-height.
-
-
-  var pstrutSize = 0;
-
-  for (var i = 0; i < children.length; i++) {
-    var child = children[i];
-
-    if (child.type === "elem") {
-      var elem = child.elem;
-      pstrutSize = Math.max(pstrutSize, elem.maxFontSize, elem.height);
-    }
-  }
-
-  pstrutSize += 2;
-  var pstrut = buildCommon_makeSpan(["pstrut"], []);
-  pstrut.style.height = pstrutSize + "em"; // Create a new list of actual children at the correct offsets
-
-  var realChildren = [];
-  var minPos = depth;
-  var maxPos = depth;
-  var currPos = depth;
-
-  for (var _i2 = 0; _i2 < children.length; _i2++) {
-    var _child = children[_i2];
-
-    if (_child.type === "kern") {
-      currPos += _child.size;
-    } else {
-      var _elem = _child.elem;
-      var classes = _child.wrapperClasses || [];
-      var style = _child.wrapperStyle || {};
-      var childWrap = buildCommon_makeSpan(classes, [pstrut, _elem], undefined, style);
-      childWrap.style.top = -pstrutSize - currPos - _elem.depth + "em";
-
-      if (_child.marginLeft) {
-        childWrap.style.marginLeft = _child.marginLeft;
-      }
-
-      if (_child.marginRight) {
-        childWrap.style.marginRight = _child.marginRight;
-      }
-
-      realChildren.push(childWrap);
-      currPos += _elem.height + _elem.depth;
-    }
-
-    minPos = Math.min(minPos, currPos);
-    maxPos = Math.max(maxPos, currPos);
-  } // The vlist contents go in a table-cell with `vertical-align:bottom`.
-  // This cell's bottom edge will determine the containing table's baseline
-  // without overly expanding the containing line-box.
-
-
-  var vlist = buildCommon_makeSpan(["vlist"], realChildren);
-  vlist.style.height = maxPos + "em"; // A second row is used if necessary to represent the vlist's depth.
-
-  var rows;
-
-  if (minPos < 0) {
-    // We will define depth in an empty span with display: table-cell.
-    // It should render with the height that we define. But Chrome, in
-    // contenteditable mode only, treats that span as if it contains some
-    // text content. And that min-height over-rides our desired height.
-    // So we put another empty span inside the depth strut span.
-    var emptySpan = buildCommon_makeSpan([], []);
-    var depthStrut = buildCommon_makeSpan(["vlist"], [emptySpan]);
-    depthStrut.style.height = -minPos + "em"; // Safari wants the first row to have inline content; otherwise it
-    // puts the bottom of the *second* row on the baseline.
-
-    var topStrut = buildCommon_makeSpan(["vlist-s"], [new domTree_SymbolNode("\u200B")]);
-    rows = [buildCommon_makeSpan(["vlist-r"], [vlist, topStrut]), buildCommon_makeSpan(["vlist-r"], [depthStrut])];
-  } else {
-    rows = [buildCommon_makeSpan(["vlist-r"], [vlist])];
-  }
-
-  var vtable = buildCommon_makeSpan(["vlist-t"], rows);
-
-  if (rows.length === 2) {
-    vtable.classes.push("vlist-t2");
-  }
-
-  vtable.height = maxPos;
-  vtable.depth = -minPos;
-  return vtable;
-}; // Glue is a concept from TeX which is a flexible space between elements in
-// either a vertical or horizontal list. In KaTeX, at least for now, it's
-// static space between elements in a horizontal layout.
-
-
-var buildCommon_makeGlue = function makeGlue(measurement, options) {
-  // Make an empty span for the space
-  var rule = buildCommon_makeSpan(["mspace"], [], options);
-  var size = units_calculateSize(measurement, options);
-  rule.style.marginRight = size + "em";
-  return rule;
-}; // Takes font options, and returns the appropriate fontLookup name
-
-
-var retrieveTextFontName = function retrieveTextFontName(fontFamily, fontWeight, fontShape) {
-  var baseFontName = "";
-
-  switch (fontFamily) {
-    case "amsrm":
-      baseFontName = "AMS";
-      break;
-
-    case "textrm":
-      baseFontName = "Main";
-      break;
-
-    case "textsf":
-      baseFontName = "SansSerif";
-      break;
-
-    case "texttt":
-      baseFontName = "Typewriter";
-      break;
-
-    default:
-      baseFontName = fontFamily;
-    // use fonts added by a plugin
-  }
-
-  var fontStylesName;
-
-  if (fontWeight === "textbf" && fontShape === "textit") {
-    fontStylesName = "BoldItalic";
-  } else if (fontWeight === "textbf") {
-    fontStylesName = "Bold";
-  } else if (fontWeight === "textit") {
-    fontStylesName = "Italic";
-  } else {
-    fontStylesName = "Regular";
-  }
-
-  return baseFontName + "-" + fontStylesName;
-};
-/**
- * Maps TeX font commands to objects containing:
- * - variant: string used for "mathvariant" attribute in buildMathML.js
- * - fontName: the "style" parameter to fontMetrics.getCharacterMetrics
- */
-// A map between tex font commands an MathML mathvariant attribute values
-
-
-var fontMap = {
-  // styles
-  "mathbf": {
-    variant: "bold",
-    fontName: "Main-Bold"
-  },
-  "mathrm": {
-    variant: "normal",
-    fontName: "Main-Regular"
-  },
-  "textit": {
-    variant: "italic",
-    fontName: "Main-Italic"
-  },
-  "mathit": {
-    variant: "italic",
-    fontName: "Main-Italic"
-  },
-  // Default math font, "mathnormal" and "boldsymbol" are missing because they
-  // require the use of several fonts: Main-Italic and Math-Italic for default
-  // math font, Main-Italic, Math-Italic, Caligraphic for "mathnormal", and
-  // Math-BoldItalic and Main-Bold for "boldsymbol".  This is handled by a
-  // special case in makeOrd which ends up calling mathdefault, mathnormal,
-  // and boldsymbol.
-  // families
-  "mathbb": {
-    variant: "double-struck",
-    fontName: "AMS-Regular"
-  },
-  "mathcal": {
-    variant: "script",
-    fontName: "Caligraphic-Regular"
-  },
-  "mathfrak": {
-    variant: "fraktur",
-    fontName: "Fraktur-Regular"
-  },
-  "mathscr": {
-    variant: "script",
-    fontName: "Script-Regular"
-  },
-  "mathsf": {
-    variant: "sans-serif",
-    fontName: "SansSerif-Regular"
-  },
-  "mathtt": {
-    variant: "monospace",
-    fontName: "Typewriter-Regular"
-  }
-};
-var svgData = {
-  //   path, width, height
-  vec: ["vec", 0.471, 0.714],
-  // values from the font glyph
-  oiintSize1: ["oiintSize1", 0.957, 0.499],
-  // oval to overlay the integrand
-  oiintSize2: ["oiintSize2", 1.472, 0.659],
-  oiiintSize1: ["oiiintSize1", 1.304, 0.499],
-  oiiintSize2: ["oiiintSize2", 1.98, 0.659]
-};
-
-var buildCommon_staticSvg = function staticSvg(value, options) {
-  // Create a span with inline SVG for the element.
-  var _svgData$value = svgData[value],
-      pathName = _svgData$value[0],
-      width = _svgData$value[1],
-      height = _svgData$value[2];
-  var path = new domTree_PathNode(pathName);
-  var svgNode = new SvgNode([path], {
-    "width": width + "em",
-    "height": height + "em",
-    // Override CSS rule `.katex svg { width: 100% }`
-    "style": "width:" + width + "em",
-    "viewBox": "0 0 " + 1000 * width + " " + 1000 * height,
-    "preserveAspectRatio": "xMinYMin"
-  });
-  var span = buildCommon_makeSvgSpan(["overlay"], [svgNode], options);
-  span.height = height;
-  span.style.height = height + "em";
-  span.style.width = width + "em";
-  return span;
-};
-
-/* harmony default export */ var buildCommon = ({
-  fontMap: fontMap,
-  makeSymbol: buildCommon_makeSymbol,
-  mathsym: buildCommon_mathsym,
-  makeSpan: buildCommon_makeSpan,
-  makeSvgSpan: buildCommon_makeSvgSpan,
-  makeLineSpan: makeLineSpan,
-  makeAnchor: buildCommon_makeAnchor,
-  makeFragment: buildCommon_makeFragment,
-  wrapFragment: buildCommon_wrapFragment,
-  makeVList: buildCommon_makeVList,
-  makeOrd: buildCommon_makeOrd,
-  makeGlue: buildCommon_makeGlue,
-  staticSvg: buildCommon_staticSvg,
-  svgData: svgData,
-  tryCombineChars: buildCommon_tryCombineChars
-});
-// CONCATENATED MODULE: ./src/parseNode.js
-
-
-/**
- * Asserts that the node is of the given type and returns it with stricter
- * typing. Throws if the node's type does not match.
- */
-function assertNodeType(node, type) {
-  var typedNode = checkNodeType(node, type);
-
-  if (!typedNode) {
-    throw new Error("Expected node of type " + type + ", but got " + (node ? "node of type " + node.type : String(node)));
-  } // $FlowFixMe: Unsure why.
-
-
-  return typedNode;
-}
-/**
- * Returns the node more strictly typed iff it is of the given type. Otherwise,
- * returns null.
- */
-
-function checkNodeType(node, type) {
-  if (node && node.type === type) {
-    // The definition of ParseNode<TYPE> doesn't communicate to flow that
-    // `type: TYPE` (as that's not explicitly mentioned anywhere), though that
-    // happens to be true for all our value types.
-    // $FlowFixMe
-    return node;
-  }
-
-  return null;
-}
-/**
- * Asserts that the node is of the given type and returns it with stricter
- * typing. Throws if the node's type does not match.
- */
-
-function assertAtomFamily(node, family) {
-  var typedNode = checkAtomFamily(node, family);
-
-  if (!typedNode) {
-    throw new Error("Expected node of type \"atom\" and family \"" + family + "\", but got " + (node ? node.type === "atom" ? "atom of family " + node.family : "node of type " + node.type : String(node)));
-  }
-
-  return typedNode;
-}
-/**
- * Returns the node more strictly typed iff it is of the given type. Otherwise,
- * returns null.
- */
-
-function checkAtomFamily(node, family) {
-  return node && node.type === "atom" && node.family === family ? node : null;
-}
-/**
- * Returns the node more strictly typed iff it is of the given type. Otherwise,
- * returns null.
- */
-
-function assertSymbolNodeType(node) {
-  var typedNode = checkSymbolNodeType(node);
-
-  if (!typedNode) {
-    throw new Error("Expected node of symbol group type, but got " + (node ? "node of type " + node.type : String(node)));
-  }
-
-  return typedNode;
-}
-/**
- * Returns the node more strictly typed iff it is of the given type. Otherwise,
- * returns null.
- */
-
-function checkSymbolNodeType(node) {
-  if (node && (node.type === "atom" || NON_ATOMS.hasOwnProperty(node.type))) {
-    // $FlowFixMe
-    return node;
-  }
-
-  return null;
-}
-// CONCATENATED MODULE: ./src/spacingData.js
-/**
- * Describes spaces between different classes of atoms.
- */
-var thinspace = {
-  number: 3,
-  unit: "mu"
-};
-var mediumspace = {
-  number: 4,
-  unit: "mu"
-};
-var thickspace = {
-  number: 5,
-  unit: "mu"
-}; // Making the type below exact with all optional fields doesn't work due to
-// - https://github.com/facebook/flow/issues/4582
-// - https://github.com/facebook/flow/issues/5688
-// However, since *all* fields are optional, $Shape<> works as suggested in 5688
-// above.
-
-// Spacing relationships for display and text styles
-var spacings = {
-  mord: {
-    mop: thinspace,
-    mbin: mediumspace,
-    mrel: thickspace,
-    minner: thinspace
-  },
-  mop: {
-    mord: thinspace,
-    mop: thinspace,
-    mrel: thickspace,
-    minner: thinspace
-  },
-  mbin: {
-    mord: mediumspace,
-    mop: mediumspace,
-    mopen: mediumspace,
-    minner: mediumspace
-  },
-  mrel: {
-    mord: thickspace,
-    mop: thickspace,
-    mopen: thickspace,
-    minner: thickspace
-  },
-  mopen: {},
-  mclose: {
-    mop: thinspace,
-    mbin: mediumspace,
-    mrel: thickspace,
-    minner: thinspace
-  },
-  mpunct: {
-    mord: thinspace,
-    mop: thinspace,
-    mrel: thickspace,
-    mopen: thinspace,
-    mclose: thinspace,
-    mpunct: thinspace,
-    minner: thinspace
-  },
-  minner: {
-    mord: thinspace,
-    mop: thinspace,
-    mbin: mediumspace,
-    mrel: thickspace,
-    mopen: thinspace,
-    mpunct: thinspace,
-    minner: thinspace
-  }
-}; // Spacing relationships for script and scriptscript styles
-
-var tightSpacings = {
-  mord: {
-    mop: thinspace
-  },
-  mop: {
-    mord: thinspace,
-    mop: thinspace
-  },
-  mbin: {},
-  mrel: {},
-  mopen: {},
-  mclose: {
-    mop: thinspace
-  },
-  mpunct: {},
-  minner: {
-    mop: thinspace
-  }
-};
-// CONCATENATED MODULE: ./src/defineFunction.js
-
-
-/**
- * All registered functions.
- * `functions.js` just exports this same dictionary again and makes it public.
- * `Parser.js` requires this dictionary.
- */
-var _functions = {};
-/**
- * All HTML builders. Should be only used in the `define*` and the `build*ML`
- * functions.
- */
-
-var _htmlGroupBuilders = {};
-/**
- * All MathML builders. Should be only used in the `define*` and the `build*ML`
- * functions.
- */
-
-var _mathmlGroupBuilders = {};
-function defineFunction(_ref) {
-  var type = _ref.type,
-      names = _ref.names,
-      props = _ref.props,
-      handler = _ref.handler,
-      htmlBuilder = _ref.htmlBuilder,
-      mathmlBuilder = _ref.mathmlBuilder;
-  // Set default values of functions
-  var data = {
-    type: type,
-    numArgs: props.numArgs,
-    argTypes: props.argTypes,
-    greediness: props.greediness === undefined ? 1 : props.greediness,
-    allowedInText: !!props.allowedInText,
-    allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath,
-    numOptionalArgs: props.numOptionalArgs || 0,
-    infix: !!props.infix,
-    handler: handler
-  };
-
-  for (var i = 0; i < names.length; ++i) {
-    _functions[names[i]] = data;
-  }
-
-  if (type) {
-    if (htmlBuilder) {
-      _htmlGroupBuilders[type] = htmlBuilder;
-    }
-
-    if (mathmlBuilder) {
-      _mathmlGroupBuilders[type] = mathmlBuilder;
-    }
-  }
-}
-/**
- * Use this to register only the HTML and MathML builders for a function (e.g.
- * if the function's ParseNode is generated in Parser.js rather than via a
- * stand-alone handler provided to `defineFunction`).
- */
-
-function defineFunctionBuilders(_ref2) {
-  var type = _ref2.type,
-      htmlBuilder = _ref2.htmlBuilder,
-      mathmlBuilder = _ref2.mathmlBuilder;
-  defineFunction({
-    type: type,
-    names: [],
-    props: {
-      numArgs: 0
-    },
-    handler: function handler() {
-      throw new Error('Should never be called.');
-    },
-    htmlBuilder: htmlBuilder,
-    mathmlBuilder: mathmlBuilder
-  });
-} // Since the corresponding buildHTML/buildMathML function expects a
-// list of elements, we normalize for different kinds of arguments
-
-var defineFunction_ordargument = function ordargument(arg) {
-  var node = checkNodeType(arg, "ordgroup");
-  return node ? node.body : [arg];
-};
-// CONCATENATED MODULE: ./src/buildHTML.js
-/**
- * This file does the main work of building a domTree structure from a parse
- * tree. The entry point is the `buildHTML` function, which takes a parse tree.
- * Then, the buildExpression, buildGroup, and various groupBuilders functions
- * are called, to produce a final HTML tree.
- */
-
-
-
-
-
-
-
-
-
-var buildHTML_makeSpan = buildCommon.makeSpan; // Binary atoms (first class `mbin`) change into ordinary atoms (`mord`)
-// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6,
-// and the text before Rule 19.
-
-var binLeftCanceller = ["leftmost", "mbin", "mopen", "mrel", "mop", "mpunct"];
-var binRightCanceller = ["rightmost", "mrel", "mclose", "mpunct"];
-var styleMap = {
-  "display": src_Style.DISPLAY,
-  "text": src_Style.TEXT,
-  "script": src_Style.SCRIPT,
-  "scriptscript": src_Style.SCRIPTSCRIPT
-};
-var DomEnum = {
-  mord: "mord",
-  mop: "mop",
-  mbin: "mbin",
-  mrel: "mrel",
-  mopen: "mopen",
-  mclose: "mclose",
-  mpunct: "mpunct",
-  minner: "minner"
-};
-
-/**
- * Take a list of nodes, build them in order, and return a list of the built
- * nodes. documentFragments are flattened into their contents, so the
- * returned list contains no fragments. `isRealGroup` is true if `expression`
- * is a real group (no atoms will be added on either side), as opposed to
- * a partial group (e.g. one created by \color). `surrounding` is an array
- * consisting type of nodes that will be added to the left and right.
- */
-var buildHTML_buildExpression = function buildExpression(expression, options, isRealGroup, surrounding) {
-  if (surrounding === void 0) {
-    surrounding = [null, null];
-  }
-
-  // Parse expressions into `groups`.
-  var groups = [];
-
-  for (var i = 0; i < expression.length; i++) {
-    var output = buildHTML_buildGroup(expression[i], options);
-
-    if (output instanceof tree_DocumentFragment) {
-      var children = output.children;
-      groups.push.apply(groups, children);
-    } else {
-      groups.push(output);
-    }
-  } // If `expression` is a partial group, let the parent handle spacings
-  // to avoid processing groups multiple times.
-
-
-  if (!isRealGroup) {
-    return groups;
-  }
-
-  var glueOptions = options;
-
-  if (expression.length === 1) {
-    var node = checkNodeType(expression[0], "sizing") || checkNodeType(expression[0], "styling");
-
-    if (!node) {// No match.
-    } else if (node.type === "sizing") {
-      glueOptions = options.havingSize(node.size);
-    } else if (node.type === "styling") {
-      glueOptions = options.havingStyle(styleMap[node.style]);
-    }
-  } // Dummy spans for determining spacings between surrounding atoms.
-  // If `expression` has no atoms on the left or right, class "leftmost"
-  // or "rightmost", respectively, is used to indicate it.
-
-
-  var dummyPrev = buildHTML_makeSpan([surrounding[0] || "leftmost"], [], options);
-  var dummyNext = buildHTML_makeSpan([surrounding[1] || "rightmost"], [], options); // TODO: These code assumes that a node's math class is the first element
-  // of its `classes` array. A later cleanup should ensure this, for
-  // instance by changing the signature of `makeSpan`.
-  // Before determining what spaces to insert, perform bin cancellation.
-  // Binary operators change to ordinary symbols in some contexts.
-
-  traverseNonSpaceNodes(groups, function (node, prev) {
-    var prevType = prev.classes[0];
-    var type = node.classes[0];
-
-    if (prevType === "mbin" && utils.contains(binRightCanceller, type)) {
-      prev.classes[0] = "mord";
-    } else if (type === "mbin" && utils.contains(binLeftCanceller, prevType)) {
-      node.classes[0] = "mord";
-    }
-  }, {
-    node: dummyPrev
-  }, dummyNext);
-  traverseNonSpaceNodes(groups, function (node, prev) {
-    var prevType = getTypeOfDomTree(prev);
-    var type = getTypeOfDomTree(node); // 'mtight' indicates that the node is script or scriptscript style.
-
-    var space = prevType && type ? node.hasClass("mtight") ? tightSpacings[prevType][type] : spacings[prevType][type] : null;
-
-    if (space) {
-      // Insert glue (spacing) after the `prev`.
-      return buildCommon.makeGlue(space, glueOptions);
-    }
-  }, {
-    node: dummyPrev
-  }, dummyNext);
-  return groups;
-}; // Depth-first traverse non-space `nodes`, calling `callback` with the current and
-// previous node as arguments, optionally returning a node to insert after the
-// previous node. `prev` is an object with the previous node and `insertAfter`
-// function to insert after it. `next` is a node that will be added to the right.
-// Used for bin cancellation and inserting spacings.
-
-var traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next) {
-  if (next) {
-    // temporarily append the right node, if exists
-    nodes.push(next);
-  }
-
-  var i = 0;
-
-  for (; i < nodes.length; i++) {
-    var node = nodes[i];
-    var partialGroup = buildHTML_checkPartialGroup(node);
-
-    if (partialGroup) {
-      // Recursive DFS
-      // $FlowFixMe: make nodes a $ReadOnlyArray by returning a new array
-      traverseNonSpaceNodes(partialGroup.children, callback, prev);
-      continue;
-    } // Ignore explicit spaces (e.g., \;, \,) when determining what implicit
-    // spacing should go between atoms of different classes
-
-
-    if (node.classes[0] === "mspace") {
-      continue;
-    }
-
-    var result = callback(node, prev.node);
-
-    if (result) {
-      if (prev.insertAfter) {
-        prev.insertAfter(result);
-      } else {
-        // insert at front
-        nodes.unshift(result);
-        i++;
-      }
-    }
-
-    prev.node = node;
-
-    prev.insertAfter = function (index) {
-      return function (n) {
-        nodes.splice(index + 1, 0, n);
-        i++;
-      };
-    }(i);
-  }
-
-  if (next) {
-    nodes.pop();
-  }
-}; // Check if given node is a partial group, i.e., does not affect spacing around.
-
-
-var buildHTML_checkPartialGroup = function checkPartialGroup(node) {
-  if (node instanceof tree_DocumentFragment || node instanceof domTree_Anchor) {
-    return node;
-  }
-
-  return null;
-}; // Return the outermost node of a domTree.
-
-
-var getOutermostNode = function getOutermostNode(node, side) {
-  var partialGroup = buildHTML_checkPartialGroup(node);
-
-  if (partialGroup) {
-    var children = partialGroup.children;
-
-    if (children.length) {
-      if (side === "right") {
-        return getOutermostNode(children[children.length - 1], "right");
-      } else if (side === "left") {
-        return getOutermostNode(children[0], "left");
-      }
-    }
-  }
-
-  return node;
-}; // Return math atom class (mclass) of a domTree.
-// If `side` is given, it will get the type of the outermost node at given side.
-
-
-var getTypeOfDomTree = function getTypeOfDomTree(node, side) {
-  if (!node) {
-    return null;
-  }
-
-  if (side) {
-    node = getOutermostNode(node, side);
-  } // This makes a lot of assumptions as to where the type of atom
-  // appears.  We should do a better job of enforcing this.
-
-
-  return DomEnum[node.classes[0]] || null;
-};
-var makeNullDelimiter = function makeNullDelimiter(options, classes) {
-  var moreClasses = ["nulldelimiter"].concat(options.baseSizingClasses());
-  return buildHTML_makeSpan(classes.concat(moreClasses));
-};
-/**
- * buildGroup is the function that takes a group and calls the correct groupType
- * function for it. It also handles the interaction of size and style changes
- * between parents and children.
- */
-
-var buildHTML_buildGroup = function buildGroup(group, options, baseOptions) {
-  if (!group) {
-    return buildHTML_makeSpan();
-  }
-
-  if (_htmlGroupBuilders[group.type]) {
-    // Call the groupBuilders function
-    var groupNode = _htmlGroupBuilders[group.type](group, options); // If the size changed between the parent and the current group, account
-    // for that size difference.
-
-    if (baseOptions && options.size !== baseOptions.size) {
-      groupNode = buildHTML_makeSpan(options.sizingClasses(baseOptions), [groupNode], options);
-      var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier;
-      groupNode.height *= multiplier;
-      groupNode.depth *= multiplier;
-    }
-
-    return groupNode;
-  } else {
-    throw new src_ParseError("Got group of unknown type: '" + group.type + "'");
-  }
-};
-/**
- * Combine an array of HTML DOM nodes (e.g., the output of `buildExpression`)
- * into an unbreakable HTML node of class .base, with proper struts to
- * guarantee correct vertical extent.  `buildHTML` calls this repeatedly to
- * make up the entire expression as a sequence of unbreakable units.
- */
-
-function buildHTMLUnbreakable(children, options) {
-  // Compute height and depth of this chunk.
-  var body = buildHTML_makeSpan(["base"], children, options); // Add strut, which ensures that the top of the HTML element falls at
-  // the height of the expression, and the bottom of the HTML element
-  // falls at the depth of the expression.
-  // We used to have separate top and bottom struts, where the bottom strut
-  // would like to use `vertical-align: top`, but in IE 9 this lowers the
-  // baseline of the box to the bottom of this strut (instead of staying in
-  // the normal place) so we use an absolute value for vertical-align instead.
-
-  var strut = buildHTML_makeSpan(["strut"]);
-  strut.style.height = body.height + body.depth + "em";
-  strut.style.verticalAlign = -body.depth + "em";
-  body.children.unshift(strut);
-  return body;
-}
-/**
- * Take an entire parse tree, and build it into an appropriate set of HTML
- * nodes.
- */
-
-
-function buildHTML(tree, options) {
-  // Strip off outer tag wrapper for processing below.
-  var tag = null;
-
-  if (tree.length === 1 && tree[0].type === "tag") {
-    tag = tree[0].tag;
-    tree = tree[0].body;
-  } // Build the expression contained in the tree
-
-
-  var expression = buildHTML_buildExpression(tree, options, true);
-  var children = []; // Create one base node for each chunk between potential line breaks.
-  // The TeXBook [p.173] says "A formula will be broken only after a
-  // relation symbol like $=$ or $<$ or $\rightarrow$, or after a binary
-  // operation symbol like $+$ or $-$ or $\times$, where the relation or
-  // binary operation is on the ``outer level'' of the formula (i.e., not
-  // enclosed in {...} and not part of an \over construction)."
-
-  var parts = [];
-
-  for (var i = 0; i < expression.length; i++) {
-    parts.push(expression[i]);
-
-    if (expression[i].hasClass("mbin") || expression[i].hasClass("mrel") || expression[i].hasClass("allowbreak")) {
-      // Put any post-operator glue on same line as operator.
-      // Watch for \nobreak along the way, and stop at \newline.
-      var nobreak = false;
-
-      while (i < expression.length - 1 && expression[i + 1].hasClass("mspace") && !expression[i + 1].hasClass("newline")) {
-        i++;
-        parts.push(expression[i]);
-
-        if (expression[i].hasClass("nobreak")) {
-          nobreak = true;
-        }
-      } // Don't allow break if \nobreak among the post-operator glue.
-
-
-      if (!nobreak) {
-        children.push(buildHTMLUnbreakable(parts, options));
-        parts = [];
-      }
-    } else if (expression[i].hasClass("newline")) {
-      // Write the line except the newline
-      parts.pop();
-
-      if (parts.length > 0) {
-        children.push(buildHTMLUnbreakable(parts, options));
-        parts = [];
-      } // Put the newline at the top level
-
-
-      children.push(expression[i]);
-    }
-  }
-
-  if (parts.length > 0) {
-    children.push(buildHTMLUnbreakable(parts, options));
-  } // Now, if there was a tag, build it too and append it as a final child.
-
-
-  var tagChild;
-
-  if (tag) {
-    tagChild = buildHTMLUnbreakable(buildHTML_buildExpression(tag, options, true));
-    tagChild.classes = ["tag"];
-    children.push(tagChild);
-  }
-
-  var htmlNode = buildHTML_makeSpan(["katex-html"], children);
-  htmlNode.setAttribute("aria-hidden", "true"); // Adjust the strut of the tag to be the maximum height of all children
-  // (the height of the enclosing htmlNode) for proper vertical alignment.
-
-  if (tagChild) {
-    var strut = tagChild.children[0];
-    strut.style.height = htmlNode.height + htmlNode.depth + "em";
-    strut.style.verticalAlign = -htmlNode.depth + "em";
-  }
-
-  return htmlNode;
-}
-// CONCATENATED MODULE: ./src/mathMLTree.js
-/**
- * These objects store data about MathML nodes. This is the MathML equivalent
- * of the types in domTree.js. Since MathML handles its own rendering, and
- * since we're mainly using MathML to improve accessibility, we don't manage
- * any of the styling state that the plain DOM nodes do.
- *
- * The `toNode` and `toMarkup` functions work simlarly to how they do in
- * domTree.js, creating namespaced DOM nodes and HTML text markup respectively.
- */
-
-
-function newDocumentFragment(children) {
-  return new tree_DocumentFragment(children);
-}
-/**
- * This node represents a general purpose MathML node of any type. The
- * constructor requires the type of node to create (for example, `"mo"` or
- * `"mspace"`, corresponding to `<mo>` and `<mspace>` tags).
- */
-
-var mathMLTree_MathNode =
-/*#__PURE__*/
-function () {
-  function MathNode(type, children) {
-    this.type = void 0;
-    this.attributes = void 0;
-    this.children = void 0;
-    this.type = type;
-    this.attributes = {};
-    this.children = children || [];
-  }
-  /**
-   * Sets an attribute on a MathML node. MathML depends on attributes to convey a
-   * semantic content, so this is used heavily.
-   */
-
-
-  var _proto = MathNode.prototype;
-
-  _proto.setAttribute = function setAttribute(name, value) {
-    this.attributes[name] = value;
-  }
-  /**
-   * Gets an attribute on a MathML node.
-   */
-  ;
-
-  _proto.getAttribute = function getAttribute(name) {
-    return this.attributes[name];
-  }
-  /**
-   * Converts the math node into a MathML-namespaced DOM element.
-   */
-  ;
-
-  _proto.toNode = function toNode() {
-    var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type);
-
-    for (var attr in this.attributes) {
-      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-        node.setAttribute(attr, this.attributes[attr]);
-      }
-    }
-
-    for (var i = 0; i < this.children.length; i++) {
-      node.appendChild(this.children[i].toNode());
-    }
-
-    return node;
-  }
-  /**
-   * Converts the math node into an HTML markup string.
-   */
-  ;
-
-  _proto.toMarkup = function toMarkup() {
-    var markup = "<" + this.type; // Add the attributes
-
-    for (var attr in this.attributes) {
-      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-        markup += " " + attr + "=\"";
-        markup += utils.escape(this.attributes[attr]);
-        markup += "\"";
-      }
-    }
-
-    markup += ">";
-
-    for (var i = 0; i < this.children.length; i++) {
-      markup += this.children[i].toMarkup();
-    }
-
-    markup += "</" + this.type + ">";
-    return markup;
-  }
-  /**
-   * Converts the math node into a string, similar to innerText, but escaped.
-   */
-  ;
-
-  _proto.toText = function toText() {
-    return this.children.map(function (child) {
-      return child.toText();
-    }).join("");
-  };
-
-  return MathNode;
-}();
-/**
- * This node represents a piece of text.
- */
-
-var mathMLTree_TextNode =
-/*#__PURE__*/
-function () {
-  function TextNode(text) {
-    this.text = void 0;
-    this.text = text;
-  }
-  /**
-   * Converts the text node into a DOM text node.
-   */
-
-
-  var _proto2 = TextNode.prototype;
-
-  _proto2.toNode = function toNode() {
-    return document.createTextNode(this.text);
-  }
-  /**
-   * Converts the text node into escaped HTML markup
-   * (representing the text itself).
-   */
-  ;
-
-  _proto2.toMarkup = function toMarkup() {
-    return utils.escape(this.toText());
-  }
-  /**
-   * Converts the text node into a string
-   * (representing the text iteself).
-   */
-  ;
-
-  _proto2.toText = function toText() {
-    return this.text;
-  };
-
-  return TextNode;
-}();
-/**
- * This node represents a space, but may render as <mspace.../> or as text,
- * depending on the width.
- */
-
-var SpaceNode =
-/*#__PURE__*/
-function () {
-  /**
-   * Create a Space node with width given in CSS ems.
-   */
-  function SpaceNode(width) {
-    this.width = void 0;
-    this.character = void 0;
-    this.width = width; // See https://www.w3.org/TR/2000/WD-MathML2-20000328/chapter6.html
-    // for a table of space-like characters.  We use Unicode
-    // representations instead of &LongNames; as it's not clear how to
-    // make the latter via document.createTextNode.
-
-    if (width >= 0.05555 && width <= 0.05556) {
-      this.character = "\u200A"; // &VeryThinSpace;
-    } else if (width >= 0.1666 && width <= 0.1667) {
-      this.character = "\u2009"; // &ThinSpace;
-    } else if (width >= 0.2222 && width <= 0.2223) {
-      this.character = "\u2005"; // &MediumSpace;
-    } else if (width >= 0.2777 && width <= 0.2778) {
-      this.character = "\u2005\u200A"; // &ThickSpace;
-    } else if (width >= -0.05556 && width <= -0.05555) {
-      this.character = "\u200A\u2063"; // &NegativeVeryThinSpace;
-    } else if (width >= -0.1667 && width <= -0.1666) {
-      this.character = "\u2009\u2063"; // &NegativeThinSpace;
-    } else if (width >= -0.2223 && width <= -0.2222) {
-      this.character = "\u205F\u2063"; // &NegativeMediumSpace;
-    } else if (width >= -0.2778 && width <= -0.2777) {
-      this.character = "\u2005\u2063"; // &NegativeThickSpace;
-    } else {
-      this.character = null;
-    }
-  }
-  /**
-   * Converts the math node into a MathML-namespaced DOM element.
-   */
-
-
-  var _proto3 = SpaceNode.prototype;
-
-  _proto3.toNode = function toNode() {
-    if (this.character) {
-      return document.createTextNode(this.character);
-    } else {
-      var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mspace");
-      node.setAttribute("width", this.width + "em");
-      return node;
-    }
-  }
-  /**
-   * Converts the math node into an HTML markup string.
-   */
-  ;
-
-  _proto3.toMarkup = function toMarkup() {
-    if (this.character) {
-      return "<mtext>" + this.character + "</mtext>";
-    } else {
-      return "<mspace width=\"" + this.width + "em\"/>";
-    }
-  }
-  /**
-   * Converts the math node into a string, similar to innerText.
-   */
-  ;
-
-  _proto3.toText = function toText() {
-    if (this.character) {
-      return this.character;
-    } else {
-      return " ";
-    }
-  };
-
-  return SpaceNode;
-}();
-
-/* harmony default export */ var mathMLTree = ({
-  MathNode: mathMLTree_MathNode,
-  TextNode: mathMLTree_TextNode,
-  SpaceNode: SpaceNode,
-  newDocumentFragment: newDocumentFragment
-});
-// CONCATENATED MODULE: ./src/buildMathML.js
-/**
- * This file converts a parse tree into a cooresponding MathML tree. The main
- * entry point is the `buildMathML` function, which takes a parse tree from the
- * parser.
- */
-
-
-
-
-
-
-
-
-
-/**
- * Takes a symbol and converts it into a MathML text node after performing
- * optional replacement from symbols.js.
- */
-var buildMathML_makeText = function makeText(text, mode, options) {
-  if (src_symbols[mode][text] && src_symbols[mode][text].replace && text.charCodeAt(0) !== 0xD835 && !(ligatures.hasOwnProperty(text) && options && (options.fontFamily && options.fontFamily.substr(4, 2) === "tt" || options.font && options.font.substr(4, 2) === "tt"))) {
-    text = src_symbols[mode][text].replace;
-  }
-
-  return new mathMLTree.TextNode(text);
-};
-/**
- * Wrap the given array of nodes in an <mrow> node if needed, i.e.,
- * unless the array has length 1.  Always returns a single node.
- */
-
-var buildMathML_makeRow = function makeRow(body) {
-  if (body.length === 1) {
-    return body[0];
-  } else {
-    return new mathMLTree.MathNode("mrow", body);
-  }
-};
-/**
- * Returns the math variant as a string or null if none is required.
- */
-
-var buildMathML_getVariant = function getVariant(group, options) {
-  // Handle \text... font specifiers as best we can.
-  // MathML has a limited list of allowable mathvariant specifiers; see
-  // https://www.w3.org/TR/MathML3/chapter3.html#presm.commatt
-  if (options.fontFamily === "texttt") {
-    return "monospace";
-  } else if (options.fontFamily === "textsf") {
-    if (options.fontShape === "textit" && options.fontWeight === "textbf") {
-      return "sans-serif-bold-italic";
-    } else if (options.fontShape === "textit") {
-      return "sans-serif-italic";
-    } else if (options.fontWeight === "textbf") {
-      return "bold-sans-serif";
-    } else {
-      return "sans-serif";
-    }
-  } else if (options.fontShape === "textit" && options.fontWeight === "textbf") {
-    return "bold-italic";
-  } else if (options.fontShape === "textit") {
-    return "italic";
-  } else if (options.fontWeight === "textbf") {
-    return "bold";
-  }
-
-  var font = options.font;
-
-  if (!font || font === "mathnormal") {
-    return null;
-  }
-
-  var mode = group.mode;
-
-  if (font === "mathit") {
-    return "italic";
-  } else if (font === "boldsymbol") {
-    return "bold-italic";
-  } else if (font === "mathbf") {
-    return "bold";
-  } else if (font === "mathbb") {
-    return "double-struck";
-  } else if (font === "mathfrak") {
-    return "fraktur";
-  } else if (font === "mathscr" || font === "mathcal") {
-    // MathML makes no distinction between script and caligrahpic
-    return "script";
-  } else if (font === "mathsf") {
-    return "sans-serif";
-  } else if (font === "mathtt") {
-    return "monospace";
-  }
-
-  var text = group.text;
-
-  if (utils.contains(["\\imath", "\\jmath"], text)) {
-    return null;
-  }
-
-  if (src_symbols[mode][text] && src_symbols[mode][text].replace) {
-    text = src_symbols[mode][text].replace;
-  }
-
-  var fontName = buildCommon.fontMap[font].fontName;
-
-  if (getCharacterMetrics(text, fontName, mode)) {
-    return buildCommon.fontMap[font].variant;
-  }
-
-  return null;
-};
-/**
- * Takes a list of nodes, builds them, and returns a list of the generated
- * MathML nodes.  Also combine consecutive <mtext> outputs into a single
- * <mtext> tag.
- */
-
-var buildMathML_buildExpression = function buildExpression(expression, options, isOrdgroup) {
-  if (expression.length === 1) {
-    var group = buildMathML_buildGroup(expression[0], options);
-
-    if (isOrdgroup && group instanceof mathMLTree_MathNode && group.type === "mo") {
-      // When TeX writers want to suppress spacing on an operator,
-      // they often put the operator by itself inside braces.
-      group.setAttribute("lspace", "0em");
-      group.setAttribute("rspace", "0em");
-    }
-
-    return [group];
-  }
-
-  var groups = [];
-  var lastGroup;
-
-  for (var i = 0; i < expression.length; i++) {
-    var _group = buildMathML_buildGroup(expression[i], options);
-
-    if (_group instanceof mathMLTree_MathNode && lastGroup instanceof mathMLTree_MathNode) {
-      // Concatenate adjacent <mtext>s
-      if (_group.type === 'mtext' && lastGroup.type === 'mtext' && _group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) {
-        var _lastGroup$children;
-
-        (_lastGroup$children = lastGroup.children).push.apply(_lastGroup$children, _group.children);
-
-        continue; // Concatenate adjacent <mn>s
-      } else if (_group.type === 'mn' && lastGroup.type === 'mn') {
-        var _lastGroup$children2;
-
-        (_lastGroup$children2 = lastGroup.children).push.apply(_lastGroup$children2, _group.children);
-
-        continue; // Concatenate <mn>...</mn> followed by <mi>.</mi>
-      } else if (_group.type === 'mi' && _group.children.length === 1 && lastGroup.type === 'mn') {
-        var child = _group.children[0];
-
-        if (child instanceof mathMLTree_TextNode && child.text === '.') {
-          var _lastGroup$children3;
-
-          (_lastGroup$children3 = lastGroup.children).push.apply(_lastGroup$children3, _group.children);
-
-          continue;
-        }
-      } else if (lastGroup.type === 'mi' && lastGroup.children.length === 1) {
-        var lastChild = lastGroup.children[0];
-
-        if (lastChild instanceof mathMLTree_TextNode && lastChild.text === "\u0338" && (_group.type === 'mo' || _group.type === 'mi' || _group.type === 'mn')) {
-          var _child = _group.children[0];
-
-          if (_child instanceof mathMLTree_TextNode && _child.text.length > 0) {
-            // Overlay with combining character long solidus
-            _child.text = _child.text.slice(0, 1) + "\u0338" + _child.text.slice(1);
-            groups.pop();
-          }
-        }
-      }
-    }
-
-    groups.push(_group);
-    lastGroup = _group;
-  }
-
-  return groups;
-};
-/**
- * Equivalent to buildExpression, but wraps the elements in an <mrow>
- * if there's more than one.  Returns a single node instead of an array.
- */
-
-var buildExpressionRow = function buildExpressionRow(expression, options, isOrdgroup) {
-  return buildMathML_makeRow(buildMathML_buildExpression(expression, options, isOrdgroup));
-};
-/**
- * Takes a group from the parser and calls the appropriate groupBuilders function
- * on it to produce a MathML node.
- */
-
-var buildMathML_buildGroup = function buildGroup(group, options) {
-  if (!group) {
-    return new mathMLTree.MathNode("mrow");
-  }
-
-  if (_mathmlGroupBuilders[group.type]) {
-    // Call the groupBuilders function
-    var result = _mathmlGroupBuilders[group.type](group, options);
-    return result;
-  } else {
-    throw new src_ParseError("Got group of unknown type: '" + group.type + "'");
-  }
-};
-/**
- * Takes a full parse tree and settings and builds a MathML representation of
- * it. In particular, we put the elements from building the parse tree into a
- * <semantics> tag so we can also include that TeX source as an annotation.
- *
- * Note that we actually return a domTree element with a `<math>` inside it so
- * we can do appropriate styling.
- */
-
-function buildMathML(tree, texExpression, options, forMathmlOnly) {
-  var expression = buildMathML_buildExpression(tree, options); // Wrap up the expression in an mrow so it is presented in the semantics
-  // tag correctly, unless it's a single <mrow> or <mtable>.
-
-  var wrapper;
-
-  if (expression.length === 1 && expression[0] instanceof mathMLTree_MathNode && utils.contains(["mrow", "mtable"], expression[0].type)) {
-    wrapper = expression[0];
-  } else {
-    wrapper = new mathMLTree.MathNode("mrow", expression);
-  } // Build a TeX annotation of the source
-
-
-  var annotation = new mathMLTree.MathNode("annotation", [new mathMLTree.TextNode(texExpression)]);
-  annotation.setAttribute("encoding", "application/x-tex");
-  var semantics = new mathMLTree.MathNode("semantics", [wrapper, annotation]);
-  var math = new mathMLTree.MathNode("math", [semantics]);
-  math.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML"); // You can't style <math> nodes, so we wrap the node in a span.
-  // NOTE: The span class is not typed to have <math> nodes as children, and
-  // we don't want to make the children type more generic since the children
-  // of span are expected to have more fields in `buildHtml` contexts.
-
-  var wrapperClass = forMathmlOnly ? "katex" : "katex-mathml"; // $FlowFixMe
-
-  return buildCommon.makeSpan([wrapperClass], [math]);
-}
-// CONCATENATED MODULE: ./src/buildTree.js
-
-
-
-
-
-
-
-var buildTree_optionsFromSettings = function optionsFromSettings(settings) {
-  return new src_Options({
-    style: settings.displayMode ? src_Style.DISPLAY : src_Style.TEXT,
-    maxSize: settings.maxSize,
-    minRuleThickness: settings.minRuleThickness
-  });
-};
-
-var buildTree_displayWrap = function displayWrap(node, settings) {
-  if (settings.displayMode) {
-    var classes = ["katex-display"];
-
-    if (settings.leqno) {
-      classes.push("leqno");
-    }
-
-    if (settings.fleqn) {
-      classes.push("fleqn");
-    }
-
-    node = buildCommon.makeSpan(classes, [node]);
-  }
-
-  return node;
-};
-
-var buildTree_buildTree = function buildTree(tree, expression, settings) {
-  var options = buildTree_optionsFromSettings(settings);
-  var katexNode;
-
-  if (settings.output === "mathml") {
-    return buildMathML(tree, expression, options, true);
-  } else if (settings.output === "html") {
-    var htmlNode = buildHTML(tree, options);
-    katexNode = buildCommon.makeSpan(["katex"], [htmlNode]);
-  } else {
-    var mathMLNode = buildMathML(tree, expression, options, false);
-
-    var _htmlNode = buildHTML(tree, options);
-
-    katexNode = buildCommon.makeSpan(["katex"], [mathMLNode, _htmlNode]);
-  }
-
-  return buildTree_displayWrap(katexNode, settings);
-};
-var buildTree_buildHTMLTree = function buildHTMLTree(tree, expression, settings) {
-  var options = buildTree_optionsFromSettings(settings);
-  var htmlNode = buildHTML(tree, options);
-  var katexNode = buildCommon.makeSpan(["katex"], [htmlNode]);
-  return buildTree_displayWrap(katexNode, settings);
-};
-/* harmony default export */ var src_buildTree = (buildTree_buildTree);
-// CONCATENATED MODULE: ./src/stretchy.js
-/**
- * This file provides support to buildMathML.js and buildHTML.js
- * for stretchy wide elements rendered from SVG files
- * and other CSS trickery.
- */
-
-
-
-
-var stretchyCodePoint = {
-  widehat: "^",
-  widecheck: "ˇ",
-  widetilde: "~",
-  utilde: "~",
-  overleftarrow: "\u2190",
-  underleftarrow: "\u2190",
-  xleftarrow: "\u2190",
-  overrightarrow: "\u2192",
-  underrightarrow: "\u2192",
-  xrightarrow: "\u2192",
-  underbrace: "\u23DF",
-  overbrace: "\u23DE",
-  overgroup: "\u23E0",
-  undergroup: "\u23E1",
-  overleftrightarrow: "\u2194",
-  underleftrightarrow: "\u2194",
-  xleftrightarrow: "\u2194",
-  Overrightarrow: "\u21D2",
-  xRightarrow: "\u21D2",
-  overleftharpoon: "\u21BC",
-  xleftharpoonup: "\u21BC",
-  overrightharpoon: "\u21C0",
-  xrightharpoonup: "\u21C0",
-  xLeftarrow: "\u21D0",
-  xLeftrightarrow: "\u21D4",
-  xhookleftarrow: "\u21A9",
-  xhookrightarrow: "\u21AA",
-  xmapsto: "\u21A6",
-  xrightharpoondown: "\u21C1",
-  xleftharpoondown: "\u21BD",
-  xrightleftharpoons: "\u21CC",
-  xleftrightharpoons: "\u21CB",
-  xtwoheadleftarrow: "\u219E",
-  xtwoheadrightarrow: "\u21A0",
-  xlongequal: "=",
-  xtofrom: "\u21C4",
-  xrightleftarrows: "\u21C4",
-  xrightequilibrium: "\u21CC",
-  // Not a perfect match.
-  xleftequilibrium: "\u21CB" // None better available.
-
-};
-
-var stretchy_mathMLnode = function mathMLnode(label) {
-  var node = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(stretchyCodePoint[label.substr(1)])]);
-  node.setAttribute("stretchy", "true");
-  return node;
-}; // Many of the KaTeX SVG images have been adapted from glyphs in KaTeX fonts.
-// Copyright (c) 2009-2010, Design Science, Inc. (<www.mathjax.org>)
-// Copyright (c) 2014-2017 Khan Academy (<www.khanacademy.org>)
-// Licensed under the SIL Open Font License, Version 1.1.
-// See \nhttp://scripts.sil.org/OFL
-// Very Long SVGs
-//    Many of the KaTeX stretchy wide elements use a long SVG image and an
-//    overflow: hidden tactic to achieve a stretchy image while avoiding
-//    distortion of arrowheads or brace corners.
-//    The SVG typically contains a very long (400 em) arrow.
-//    The SVG is in a container span that has overflow: hidden, so the span
-//    acts like a window that exposes only part of the  SVG.
-//    The SVG always has a longer, thinner aspect ratio than the container span.
-//    After the SVG fills 100% of the height of the container span,
-//    there is a long arrow shaft left over. That left-over shaft is not shown.
-//    Instead, it is sliced off because the span's CSS has overflow: hidden.
-//    Thus, the reader sees an arrow that matches the subject matter width
-//    without distortion.
-//    Some functions, such as \cancel, need to vary their aspect ratio. These
-//    functions do not get the overflow SVG treatment.
-// Second Brush Stroke
-//    Low resolution monitors struggle to display images in fine detail.
-//    So browsers apply anti-aliasing. A long straight arrow shaft therefore
-//    will sometimes appear as if it has a blurred edge.
-//    To mitigate this, these SVG files contain a second "brush-stroke" on the
-//    arrow shafts. That is, a second long thin rectangular SVG path has been
-//    written directly on top of each arrow shaft. This reinforcement causes
-//    some of the screen pixels to display as black instead of the anti-aliased
-//    gray pixel that a  single path would generate. So we get arrow shafts
-//    whose edges appear to be sharper.
-// In the katexImagesData object just below, the dimensions all
-// correspond to path geometry inside the relevant SVG.
-// For example, \overrightarrow uses the same arrowhead as glyph U+2192
-// from the KaTeX Main font. The scaling factor is 1000.
-// That is, inside the font, that arrowhead is 522 units tall, which
-// corresponds to 0.522 em inside the document.
-
-
-var katexImagesData = {
-  //   path(s), minWidth, height, align
-  overrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"],
-  overleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"],
-  underrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"],
-  underleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"],
-  xrightarrow: [["rightarrow"], 1.469, 522, "xMaxYMin"],
-  xleftarrow: [["leftarrow"], 1.469, 522, "xMinYMin"],
-  Overrightarrow: [["doublerightarrow"], 0.888, 560, "xMaxYMin"],
-  xRightarrow: [["doublerightarrow"], 1.526, 560, "xMaxYMin"],
-  xLeftarrow: [["doubleleftarrow"], 1.526, 560, "xMinYMin"],
-  overleftharpoon: [["leftharpoon"], 0.888, 522, "xMinYMin"],
-  xleftharpoonup: [["leftharpoon"], 0.888, 522, "xMinYMin"],
-  xleftharpoondown: [["leftharpoondown"], 0.888, 522, "xMinYMin"],
-  overrightharpoon: [["rightharpoon"], 0.888, 522, "xMaxYMin"],
-  xrightharpoonup: [["rightharpoon"], 0.888, 522, "xMaxYMin"],
-  xrightharpoondown: [["rightharpoondown"], 0.888, 522, "xMaxYMin"],
-  xlongequal: [["longequal"], 0.888, 334, "xMinYMin"],
-  xtwoheadleftarrow: [["twoheadleftarrow"], 0.888, 334, "xMinYMin"],
-  xtwoheadrightarrow: [["twoheadrightarrow"], 0.888, 334, "xMaxYMin"],
-  overleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522],
-  overbrace: [["leftbrace", "midbrace", "rightbrace"], 1.6, 548],
-  underbrace: [["leftbraceunder", "midbraceunder", "rightbraceunder"], 1.6, 548],
-  underleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522],
-  xleftrightarrow: [["leftarrow", "rightarrow"], 1.75, 522],
-  xLeftrightarrow: [["doubleleftarrow", "doublerightarrow"], 1.75, 560],
-  xrightleftharpoons: [["leftharpoondownplus", "rightharpoonplus"], 1.75, 716],
-  xleftrightharpoons: [["leftharpoonplus", "rightharpoondownplus"], 1.75, 716],
-  xhookleftarrow: [["leftarrow", "righthook"], 1.08, 522],
-  xhookrightarrow: [["lefthook", "rightarrow"], 1.08, 522],
-  overlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522],
-  underlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522],
-  overgroup: [["leftgroup", "rightgroup"], 0.888, 342],
-  undergroup: [["leftgroupunder", "rightgroupunder"], 0.888, 342],
-  xmapsto: [["leftmapsto", "rightarrow"], 1.5, 522],
-  xtofrom: [["leftToFrom", "rightToFrom"], 1.75, 528],
-  // The next three arrows are from the mhchem package.
-  // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the
-  // document as \xrightarrow or \xrightleftharpoons. Those have
-  // min-length = 1.75em, so we set min-length on these next three to match.
-  xrightleftarrows: [["baraboveleftarrow", "rightarrowabovebar"], 1.75, 901],
-  xrightequilibrium: [["baraboveshortleftharpoon", "rightharpoonaboveshortbar"], 1.75, 716],
-  xleftequilibrium: [["shortbaraboveleftharpoon", "shortrightharpoonabovebar"], 1.75, 716]
-};
-
-var groupLength = function groupLength(arg) {
-  if (arg.type === "ordgroup") {
-    return arg.body.length;
-  } else {
-    return 1;
-  }
-};
-
-var stretchy_svgSpan = function svgSpan(group, options) {
-  // Create a span with inline SVG for the element.
-  function buildSvgSpan_() {
-    var viewBoxWidth = 400000; // default
-
-    var label = group.label.substr(1);
-
-    if (utils.contains(["widehat", "widecheck", "widetilde", "utilde"], label)) {
-      // Each type in the `if` statement corresponds to one of the ParseNode
-      // types below. This narrowing is required to access `grp.base`.
-      var grp = group; // There are four SVG images available for each function.
-      // Choose a taller image when there are more characters.
-
-      var numChars = groupLength(grp.base);
-      var viewBoxHeight;
-      var pathName;
-
-      var _height;
-
-      if (numChars > 5) {
-        if (label === "widehat" || label === "widecheck") {
-          viewBoxHeight = 420;
-          viewBoxWidth = 2364;
-          _height = 0.42;
-          pathName = label + "4";
-        } else {
-          viewBoxHeight = 312;
-          viewBoxWidth = 2340;
-          _height = 0.34;
-          pathName = "tilde4";
-        }
-      } else {
-        var imgIndex = [1, 1, 2, 2, 3, 3][numChars];
-
-        if (label === "widehat" || label === "widecheck") {
-          viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex];
-          viewBoxHeight = [0, 239, 300, 360, 420][imgIndex];
-          _height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex];
-          pathName = label + imgIndex;
-        } else {
-          viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex];
-          viewBoxHeight = [0, 260, 286, 306, 312][imgIndex];
-          _height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex];
-          pathName = "tilde" + imgIndex;
-        }
-      }
-
-      var path = new domTree_PathNode(pathName);
-      var svgNode = new SvgNode([path], {
-        "width": "100%",
-        "height": _height + "em",
-        "viewBox": "0 0 " + viewBoxWidth + " " + viewBoxHeight,
-        "preserveAspectRatio": "none"
-      });
-      return {
-        span: buildCommon.makeSvgSpan([], [svgNode], options),
-        minWidth: 0,
-        height: _height
-      };
-    } else {
-      var spans = [];
-      var data = katexImagesData[label];
-      var paths = data[0],
-          _minWidth = data[1],
-          _viewBoxHeight = data[2];
-
-      var _height2 = _viewBoxHeight / 1000;
-
-      var numSvgChildren = paths.length;
-      var widthClasses;
-      var aligns;
-
-      if (numSvgChildren === 1) {
-        // $FlowFixMe: All these cases must be of the 4-tuple type.
-        var align1 = data[3];
-        widthClasses = ["hide-tail"];
-        aligns = [align1];
-      } else if (numSvgChildren === 2) {
-        widthClasses = ["halfarrow-left", "halfarrow-right"];
-        aligns = ["xMinYMin", "xMaxYMin"];
-      } else if (numSvgChildren === 3) {
-        widthClasses = ["brace-left", "brace-center", "brace-right"];
-        aligns = ["xMinYMin", "xMidYMin", "xMaxYMin"];
-      } else {
-        throw new Error("Correct katexImagesData or update code here to support\n                    " + numSvgChildren + " children.");
-      }
-
-      for (var i = 0; i < numSvgChildren; i++) {
-        var _path = new domTree_PathNode(paths[i]);
-
-        var _svgNode = new SvgNode([_path], {
-          "width": "400em",
-          "height": _height2 + "em",
-          "viewBox": "0 0 " + viewBoxWidth + " " + _viewBoxHeight,
-          "preserveAspectRatio": aligns[i] + " slice"
-        });
-
-        var _span = buildCommon.makeSvgSpan([widthClasses[i]], [_svgNode], options);
-
-        if (numSvgChildren === 1) {
-          return {
-            span: _span,
-            minWidth: _minWidth,
-            height: _height2
-          };
-        } else {
-          _span.style.height = _height2 + "em";
-          spans.push(_span);
-        }
-      }
-
-      return {
-        span: buildCommon.makeSpan(["stretchy"], spans, options),
-        minWidth: _minWidth,
-        height: _height2
-      };
-    }
-  } // buildSvgSpan_()
-
-
-  var _buildSvgSpan_ = buildSvgSpan_(),
-      span = _buildSvgSpan_.span,
-      minWidth = _buildSvgSpan_.minWidth,
-      height = _buildSvgSpan_.height; // Note that we are returning span.depth = 0.
-  // Any adjustments relative to the baseline must be done in buildHTML.
-
-
-  span.height = height;
-  span.style.height = height + "em";
-
-  if (minWidth > 0) {
-    span.style.minWidth = minWidth + "em";
-  }
-
-  return span;
-};
-
-var stretchy_encloseSpan = function encloseSpan(inner, label, pad, options) {
-  // Return an image span for \cancel, \bcancel, \xcancel, or \fbox
-  var img;
-  var totalHeight = inner.height + inner.depth + 2 * pad;
-
-  if (/fbox|color/.test(label)) {
-    img = buildCommon.makeSpan(["stretchy", label], [], options);
-
-    if (label === "fbox") {
-      var color = options.color && options.getColor();
-
-      if (color) {
-        img.style.borderColor = color;
-      }
-    }
-  } else {
-    // \cancel, \bcancel, or \xcancel
-    // Since \cancel's SVG is inline and it omits the viewBox attribute,
-    // its stroke-width will not vary with span area.
-    var lines = [];
-
-    if (/^[bx]cancel$/.test(label)) {
-      lines.push(new LineNode({
-        "x1": "0",
-        "y1": "0",
-        "x2": "100%",
-        "y2": "100%",
-        "stroke-width": "0.046em"
-      }));
-    }
-
-    if (/^x?cancel$/.test(label)) {
-      lines.push(new LineNode({
-        "x1": "0",
-        "y1": "100%",
-        "x2": "100%",
-        "y2": "0",
-        "stroke-width": "0.046em"
-      }));
-    }
-
-    var svgNode = new SvgNode(lines, {
-      "width": "100%",
-      "height": totalHeight + "em"
-    });
-    img = buildCommon.makeSvgSpan([], [svgNode], options);
-  }
-
-  img.height = totalHeight;
-  img.style.height = totalHeight + "em";
-  return img;
-};
-
-/* harmony default export */ var stretchy = ({
-  encloseSpan: stretchy_encloseSpan,
-  mathMLnode: stretchy_mathMLnode,
-  svgSpan: stretchy_svgSpan
-});
-// CONCATENATED MODULE: ./src/functions/accent.js
-
-
-
-
-
-
-
-
-
-// NOTE: Unlike most `htmlBuilder`s, this one handles not only "accent", but
-var accent_htmlBuilder = function htmlBuilder(grp, options) {
-  // Accents are handled in the TeXbook pg. 443, rule 12.
-  var base;
-  var group;
-  var supSub = checkNodeType(grp, "supsub");
-  var supSubGroup;
-
-  if (supSub) {
-    // If our base is a character box, and we have superscripts and
-    // subscripts, the supsub will defer to us. In particular, we want
-    // to attach the superscripts and subscripts to the inner body (so
-    // that the position of the superscripts and subscripts won't be
-    // affected by the height of the accent). We accomplish this by
-    // sticking the base of the accent into the base of the supsub, and
-    // rendering that, while keeping track of where the accent is.
-    // The real accent group is the base of the supsub group
-    group = assertNodeType(supSub.base, "accent"); // The character box is the base of the accent group
-
-    base = group.base; // Stick the character box into the base of the supsub group
-
-    supSub.base = base; // Rerender the supsub group with its new base, and store that
-    // result.
-
-    supSubGroup = assertSpan(buildHTML_buildGroup(supSub, options)); // reset original base
-
-    supSub.base = group;
-  } else {
-    group = assertNodeType(grp, "accent");
-    base = group.base;
-  } // Build the base group
-
-
-  var body = buildHTML_buildGroup(base, options.havingCrampedStyle()); // Does the accent need to shift for the skew of a character?
-
-  var mustShift = group.isShifty && utils.isCharacterBox(base); // Calculate the skew of the accent. This is based on the line "If the
-  // nucleus is not a single character, let s = 0; otherwise set s to the
-  // kern amount for the nucleus followed by the \skewchar of its font."
-  // Note that our skew metrics are just the kern between each character
-  // and the skewchar.
-
-  var skew = 0;
-
-  if (mustShift) {
-    // If the base is a character box, then we want the skew of the
-    // innermost character. To do that, we find the innermost character:
-    var baseChar = utils.getBaseElem(base); // Then, we render its group to get the symbol inside it
-
-    var baseGroup = buildHTML_buildGroup(baseChar, options.havingCrampedStyle()); // Finally, we pull the skew off of the symbol.
-
-    skew = assertSymbolDomNode(baseGroup).skew; // Note that we now throw away baseGroup, because the layers we
-    // removed with getBaseElem might contain things like \color which
-    // we can't get rid of.
-    // TODO(emily): Find a better way to get the skew
-  } // calculate the amount of space between the body and the accent
-
-
-  var clearance = Math.min(body.height, options.fontMetrics().xHeight); // Build the accent
-
-  var accentBody;
-
-  if (!group.isStretchy) {
-    var accent;
-    var width;
-
-    if (group.label === "\\vec") {
-      // Before version 0.9, \vec used the combining font glyph U+20D7.
-      // But browsers, especially Safari, are not consistent in how they
-      // render combining characters when not preceded by a character.
-      // So now we use an SVG.
-      // If Safari reforms, we should consider reverting to the glyph.
-      accent = buildCommon.staticSvg("vec", options);
-      width = buildCommon.svgData.vec[1];
-    } else {
-      accent = buildCommon.makeOrd({
-        mode: group.mode,
-        text: group.label
-      }, options, "textord");
-      accent = assertSymbolDomNode(accent); // Remove the italic correction of the accent, because it only serves to
-      // shift the accent over to a place we don't want.
-
-      accent.italic = 0;
-      width = accent.width;
-    }
-
-    accentBody = buildCommon.makeSpan(["accent-body"], [accent]); // "Full" accents expand the width of the resulting symbol to be
-    // at least the width of the accent, and overlap directly onto the
-    // character without any vertical offset.
-
-    var accentFull = group.label === "\\textcircled";
-
-    if (accentFull) {
-      accentBody.classes.push('accent-full');
-      clearance = body.height;
-    } // Shift the accent over by the skew.
-
-
-    var left = skew; // CSS defines `.katex .accent .accent-body:not(.accent-full) { width: 0 }`
-    // so that the accent doesn't contribute to the bounding box.
-    // We need to shift the character by its width (effectively half
-    // its width) to compensate.
-
-    if (!accentFull) {
-      left -= width / 2;
-    }
-
-    accentBody.style.left = left + "em"; // \textcircled uses the \bigcirc glyph, so it needs some
-    // vertical adjustment to match LaTeX.
-
-    if (group.label === "\\textcircled") {
-      accentBody.style.top = ".2em";
-    }
-
-    accentBody = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: body
-      }, {
-        type: "kern",
-        size: -clearance
-      }, {
-        type: "elem",
-        elem: accentBody
-      }]
-    }, options);
-  } else {
-    accentBody = stretchy.svgSpan(group, options);
-    accentBody = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: body
-      }, {
-        type: "elem",
-        elem: accentBody,
-        wrapperClasses: ["svg-align"],
-        wrapperStyle: skew > 0 ? {
-          width: "calc(100% - " + 2 * skew + "em)",
-          marginLeft: 2 * skew + "em"
-        } : undefined
-      }]
-    }, options);
-  }
-
-  var accentWrap = buildCommon.makeSpan(["mord", "accent"], [accentBody], options);
-
-  if (supSubGroup) {
-    // Here, we replace the "base" child of the supsub with our newly
-    // generated accent.
-    supSubGroup.children[0] = accentWrap; // Since we don't rerun the height calculation after replacing the
-    // accent, we manually recalculate height.
-
-    supSubGroup.height = Math.max(accentWrap.height, supSubGroup.height); // Accents should always be ords, even when their innards are not.
-
-    supSubGroup.classes[0] = "mord";
-    return supSubGroup;
-  } else {
-    return accentWrap;
-  }
-};
-
-var accent_mathmlBuilder = function mathmlBuilder(group, options) {
-  var accentNode = group.isStretchy ? stretchy.mathMLnode(group.label) : new mathMLTree.MathNode("mo", [buildMathML_makeText(group.label, group.mode)]);
-  var node = new mathMLTree.MathNode("mover", [buildMathML_buildGroup(group.base, options), accentNode]);
-  node.setAttribute("accent", "true");
-  return node;
-};
-
-var NON_STRETCHY_ACCENT_REGEX = new RegExp(["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring"].map(function (accent) {
-  return "\\" + accent;
-}).join("|")); // Accents
-
-defineFunction({
-  type: "accent",
-  names: ["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring", "\\widecheck", "\\widehat", "\\widetilde", "\\overrightarrow", "\\overleftarrow", "\\Overrightarrow", "\\overleftrightarrow", "\\overgroup", "\\overlinesegment", "\\overleftharpoon", "\\overrightharpoon"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(context, args) {
-    var base = args[0];
-    var isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName);
-    var isShifty = !isStretchy || context.funcName === "\\widehat" || context.funcName === "\\widetilde" || context.funcName === "\\widecheck";
-    return {
-      type: "accent",
-      mode: context.parser.mode,
-      label: context.funcName,
-      isStretchy: isStretchy,
-      isShifty: isShifty,
-      base: base
-    };
-  },
-  htmlBuilder: accent_htmlBuilder,
-  mathmlBuilder: accent_mathmlBuilder
-}); // Text-mode accents
-
-defineFunction({
-  type: "accent",
-  names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v", "\\textcircled"],
-  props: {
-    numArgs: 1,
-    allowedInText: true,
-    allowedInMath: false
-  },
-  handler: function handler(context, args) {
-    var base = args[0];
-    return {
-      type: "accent",
-      mode: context.parser.mode,
-      label: context.funcName,
-      isStretchy: false,
-      isShifty: true,
-      base: base
-    };
-  },
-  htmlBuilder: accent_htmlBuilder,
-  mathmlBuilder: accent_mathmlBuilder
-});
-// CONCATENATED MODULE: ./src/functions/accentunder.js
-// Horizontal overlap functions
-
-
-
-
-
-
-defineFunction({
-  type: "accentUnder",
-  names: ["\\underleftarrow", "\\underrightarrow", "\\underleftrightarrow", "\\undergroup", "\\underlinesegment", "\\utilde"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    var base = args[0];
-    return {
-      type: "accentUnder",
-      mode: parser.mode,
-      label: funcName,
-      base: base
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    // Treat under accents much like underlines.
-    var innerGroup = buildHTML_buildGroup(group.base, options);
-    var accentBody = stretchy.svgSpan(group, options);
-    var kern = group.label === "\\utilde" ? 0.12 : 0; // Generate the vlist, with the appropriate kerns
-
-    var vlist = buildCommon.makeVList({
-      positionType: "bottom",
-      positionData: accentBody.height + kern,
-      children: [{
-        type: "elem",
-        elem: accentBody,
-        wrapperClasses: ["svg-align"]
-      }, {
-        type: "kern",
-        size: kern
-      }, {
-        type: "elem",
-        elem: innerGroup
-      }]
-    }, options);
-    return buildCommon.makeSpan(["mord", "accentunder"], [vlist], options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var accentNode = stretchy.mathMLnode(group.label);
-    var node = new mathMLTree.MathNode("munder", [buildMathML_buildGroup(group.base, options), accentNode]);
-    node.setAttribute("accentunder", "true");
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/arrow.js
-
-
-
-
-
-
-
-// Helper function
-var arrow_paddedNode = function paddedNode(group) {
-  var node = new mathMLTree.MathNode("mpadded", group ? [group] : []);
-  node.setAttribute("width", "+0.6em");
-  node.setAttribute("lspace", "0.3em");
-  return node;
-}; // Stretchy arrows with an optional argument
-
-
-defineFunction({
-  type: "xArrow",
-  names: ["\\xleftarrow", "\\xrightarrow", "\\xLeftarrow", "\\xRightarrow", "\\xleftrightarrow", "\\xLeftrightarrow", "\\xhookleftarrow", "\\xhookrightarrow", "\\xmapsto", "\\xrightharpoondown", "\\xrightharpoonup", "\\xleftharpoondown", "\\xleftharpoonup", "\\xrightleftharpoons", "\\xleftrightharpoons", "\\xlongequal", "\\xtwoheadrightarrow", "\\xtwoheadleftarrow", "\\xtofrom", // The next 3 functions are here to support the mhchem extension.
-  // Direct use of these functions is discouraged and may break someday.
-  "\\xrightleftarrows", "\\xrightequilibrium", "\\xleftequilibrium"],
-  props: {
-    numArgs: 1,
-    numOptionalArgs: 1
-  },
-  handler: function handler(_ref, args, optArgs) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    return {
-      type: "xArrow",
-      mode: parser.mode,
-      label: funcName,
-      body: args[0],
-      below: optArgs[0]
-    };
-  },
-  // Flow is unable to correctly infer the type of `group`, even though it's
-  // unamibiguously determined from the passed-in `type` above.
-  htmlBuilder: function htmlBuilder(group, options) {
-    var style = options.style; // Build the argument groups in the appropriate style.
-    // Ref: amsmath.dtx:   \hbox{$\scriptstyle\mkern#3mu{#6}\mkern#4mu$}%
-    // Some groups can return document fragments.  Handle those by wrapping
-    // them in a span.
-
-    var newOptions = options.havingStyle(style.sup());
-    var upperGroup = buildCommon.wrapFragment(buildHTML_buildGroup(group.body, newOptions, options), options);
-    upperGroup.classes.push("x-arrow-pad");
-    var lowerGroup;
-
-    if (group.below) {
-      // Build the lower group
-      newOptions = options.havingStyle(style.sub());
-      lowerGroup = buildCommon.wrapFragment(buildHTML_buildGroup(group.below, newOptions, options), options);
-      lowerGroup.classes.push("x-arrow-pad");
-    }
-
-    var arrowBody = stretchy.svgSpan(group, options); // Re shift: Note that stretchy.svgSpan returned arrowBody.depth = 0.
-    // The point we want on the math axis is at 0.5 * arrowBody.height.
-
-    var arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height; // 2 mu kern. Ref: amsmath.dtx: #7\if0#2\else\mkern#2mu\fi
-
-    var upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; // 0.111 em = 2 mu
-
-    if (upperGroup.depth > 0.25 || group.label === "\\xleftequilibrium") {
-      upperShift -= upperGroup.depth; // shift up if depth encroaches
-    } // Generate the vlist
-
-
-    var vlist;
-
-    if (lowerGroup) {
-      var lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111;
-      vlist = buildCommon.makeVList({
-        positionType: "individualShift",
-        children: [{
-          type: "elem",
-          elem: upperGroup,
-          shift: upperShift
-        }, {
-          type: "elem",
-          elem: arrowBody,
-          shift: arrowShift
-        }, {
-          type: "elem",
-          elem: lowerGroup,
-          shift: lowerShift
-        }]
-      }, options);
-    } else {
-      vlist = buildCommon.makeVList({
-        positionType: "individualShift",
-        children: [{
-          type: "elem",
-          elem: upperGroup,
-          shift: upperShift
-        }, {
-          type: "elem",
-          elem: arrowBody,
-          shift: arrowShift
-        }]
-      }, options);
-    } // $FlowFixMe: Replace this with passing "svg-align" into makeVList.
-
-
-    vlist.children[0].children[0].children[1].classes.push("svg-align");
-    return buildCommon.makeSpan(["mrel", "x-arrow"], [vlist], options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var arrowNode = stretchy.mathMLnode(group.label);
-    var node;
-
-    if (group.body) {
-      var upperNode = arrow_paddedNode(buildMathML_buildGroup(group.body, options));
-
-      if (group.below) {
-        var lowerNode = arrow_paddedNode(buildMathML_buildGroup(group.below, options));
-        node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]);
-      } else {
-        node = new mathMLTree.MathNode("mover", [arrowNode, upperNode]);
-      }
-    } else if (group.below) {
-      var _lowerNode = arrow_paddedNode(buildMathML_buildGroup(group.below, options));
-
-      node = new mathMLTree.MathNode("munder", [arrowNode, _lowerNode]);
-    } else {
-      // This should never happen.
-      // Parser.js throws an error if there is no argument.
-      node = arrow_paddedNode();
-      node = new mathMLTree.MathNode("mover", [arrowNode, node]);
-    }
-
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/char.js
-
-
- // \@char is an internal function that takes a grouped decimal argument like
-// {123} and converts into symbol with code 123.  It is used by the *macro*
-// \char defined in macros.js.
-
-defineFunction({
-  type: "textord",
-  names: ["\\@char"],
-  props: {
-    numArgs: 1,
-    allowedInText: true
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser;
-    var arg = assertNodeType(args[0], "ordgroup");
-    var group = arg.body;
-    var number = "";
-
-    for (var i = 0; i < group.length; i++) {
-      var node = assertNodeType(group[i], "textord");
-      number += node.text;
-    }
-
-    var code = parseInt(number);
-
-    if (isNaN(code)) {
-      throw new src_ParseError("\\@char has non-numeric argument " + number);
-    }
-
-    return {
-      type: "textord",
-      mode: parser.mode,
-      text: String.fromCharCode(code)
-    };
-  }
-});
-// CONCATENATED MODULE: ./src/functions/color.js
-
-
-
-
-
-
-
-var color_htmlBuilder = function htmlBuilder(group, options) {
-  var elements = buildHTML_buildExpression(group.body, options.withColor(group.color), false); // \color isn't supposed to affect the type of the elements it contains.
-  // To accomplish this, we wrap the results in a fragment, so the inner
-  // elements will be able to directly interact with their neighbors. For
-  // example, `\color{red}{2 +} 3` has the same spacing as `2 + 3`
-
-  return buildCommon.makeFragment(elements);
-};
-
-var color_mathmlBuilder = function mathmlBuilder(group, options) {
-  var inner = buildMathML_buildExpression(group.body, options.withColor(group.color));
-  var node = new mathMLTree.MathNode("mstyle", inner);
-  node.setAttribute("mathcolor", group.color);
-  return node;
-};
-
-defineFunction({
-  type: "color",
-  names: ["\\textcolor"],
-  props: {
-    numArgs: 2,
-    allowedInText: true,
-    greediness: 3,
-    argTypes: ["color", "original"]
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser;
-    var color = assertNodeType(args[0], "color-token").color;
-    var body = args[1];
-    return {
-      type: "color",
-      mode: parser.mode,
-      color: color,
-      body: defineFunction_ordargument(body)
-    };
-  },
-  htmlBuilder: color_htmlBuilder,
-  mathmlBuilder: color_mathmlBuilder
-});
-defineFunction({
-  type: "color",
-  names: ["\\color"],
-  props: {
-    numArgs: 1,
-    allowedInText: true,
-    greediness: 3,
-    argTypes: ["color"]
-  },
-  handler: function handler(_ref2, args) {
-    var parser = _ref2.parser,
-        breakOnTokenText = _ref2.breakOnTokenText;
-    var color = assertNodeType(args[0], "color-token").color; // Set macro \current@color in current namespace to store the current
-    // color, mimicking the behavior of color.sty.
-    // This is currently used just to correctly color a \right
-    // that follows a \color command.
-
-    parser.gullet.macros.set("\\current@color", color); // Parse out the implicit body that should be colored.
-
-    var body = parser.parseExpression(true, breakOnTokenText);
-    return {
-      type: "color",
-      mode: parser.mode,
-      color: color,
-      body: body
-    };
-  },
-  htmlBuilder: color_htmlBuilder,
-  mathmlBuilder: color_mathmlBuilder
-});
-// CONCATENATED MODULE: ./src/functions/cr.js
-// Row breaks within tabular environments, and line breaks at top level
-
-
-
-
-
- // \\ is a macro mapping to either \cr or \newline.  Because they have the
-// same signature, we implement them as one megafunction, with newRow
-// indicating whether we're in the \cr case, and newLine indicating whether
-// to break the line in the \newline case.
-
-defineFunction({
-  type: "cr",
-  names: ["\\cr", "\\newline"],
-  props: {
-    numArgs: 0,
-    numOptionalArgs: 1,
-    argTypes: ["size"],
-    allowedInText: true
-  },
-  handler: function handler(_ref, args, optArgs) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    var size = optArgs[0];
-    var newRow = funcName === "\\cr";
-    var newLine = false;
-
-    if (!newRow) {
-      if (parser.settings.displayMode && parser.settings.useStrictBehavior("newLineInDisplayMode", "In LaTeX, \\\\ or \\newline " + "does nothing in display mode")) {
-        newLine = false;
-      } else {
-        newLine = true;
-      }
-    }
-
-    return {
-      type: "cr",
-      mode: parser.mode,
-      newLine: newLine,
-      newRow: newRow,
-      size: size && assertNodeType(size, "size").value
-    };
-  },
-  // The following builders are called only at the top level,
-  // not within tabular/array environments.
-  htmlBuilder: function htmlBuilder(group, options) {
-    if (group.newRow) {
-      throw new src_ParseError("\\cr valid only within a tabular/array environment");
-    }
-
-    var span = buildCommon.makeSpan(["mspace"], [], options);
-
-    if (group.newLine) {
-      span.classes.push("newline");
-
-      if (group.size) {
-        span.style.marginTop = units_calculateSize(group.size, options) + "em";
-      }
-    }
-
-    return span;
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var node = new mathMLTree.MathNode("mspace");
-
-    if (group.newLine) {
-      node.setAttribute("linebreak", "newline");
-
-      if (group.size) {
-        node.setAttribute("height", units_calculateSize(group.size, options) + "em");
-      }
-    }
-
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/delimiter.js
-/**
- * This file deals with creating delimiters of various sizes. The TeXbook
- * discusses these routines on page 441-442, in the "Another subroutine sets box
- * x to a specified variable delimiter" paragraph.
- *
- * There are three main routines here. `makeSmallDelim` makes a delimiter in the
- * normal font, but in either text, script, or scriptscript style.
- * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1,
- * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of
- * smaller pieces that are stacked on top of one another.
- *
- * The functions take a parameter `center`, which determines if the delimiter
- * should be centered around the axis.
- *
- * Then, there are three exposed functions. `sizedDelim` makes a delimiter in
- * one of the given sizes. This is used for things like `\bigl`.
- * `customSizedDelim` makes a delimiter with a given total height+depth. It is
- * called in places like `\sqrt`. `leftRightDelim` makes an appropriate
- * delimiter which surrounds an expression of a given height an depth. It is
- * used in `\left` and `\right`.
- */
-
-
-
-
-
-
-
-
-
-/**
- * Get the metrics for a given symbol and font, after transformation (i.e.
- * after following replacement from symbols.js)
- */
-var delimiter_getMetrics = function getMetrics(symbol, font, mode) {
-  var replace = src_symbols.math[symbol] && src_symbols.math[symbol].replace;
-  var metrics = getCharacterMetrics(replace || symbol, font, mode);
-
-  if (!metrics) {
-    throw new Error("Unsupported symbol " + symbol + " and font size " + font + ".");
-  }
-
-  return metrics;
-};
-/**
- * Puts a delimiter span in a given style, and adds appropriate height, depth,
- * and maxFontSizes.
- */
-
-
-var delimiter_styleWrap = function styleWrap(delim, toStyle, options, classes) {
-  var newOptions = options.havingBaseStyle(toStyle);
-  var span = buildCommon.makeSpan(classes.concat(newOptions.sizingClasses(options)), [delim], options);
-  var delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier;
-  span.height *= delimSizeMultiplier;
-  span.depth *= delimSizeMultiplier;
-  span.maxFontSize = newOptions.sizeMultiplier;
-  return span;
-};
-
-var centerSpan = function centerSpan(span, options, style) {
-  var newOptions = options.havingBaseStyle(style);
-  var shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight;
-  span.classes.push("delimcenter");
-  span.style.top = shift + "em";
-  span.height -= shift;
-  span.depth += shift;
-};
-/**
- * Makes a small delimiter. This is a delimiter that comes in the Main-Regular
- * font, but is restyled to either be in textstyle, scriptstyle, or
- * scriptscriptstyle.
- */
-
-
-var delimiter_makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) {
-  var text = buildCommon.makeSymbol(delim, "Main-Regular", mode, options);
-  var span = delimiter_styleWrap(text, style, options, classes);
-
-  if (center) {
-    centerSpan(span, options, style);
-  }
-
-  return span;
-};
-/**
- * Builds a symbol in the given font size (note size is an integer)
- */
-
-
-var delimiter_mathrmSize = function mathrmSize(value, size, mode, options) {
-  return buildCommon.makeSymbol(value, "Size" + size + "-Regular", mode, options);
-};
-/**
- * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2,
- * Size3, or Size4 fonts. It is always rendered in textstyle.
- */
-
-
-var delimiter_makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) {
-  var inner = delimiter_mathrmSize(delim, size, mode, options);
-  var span = delimiter_styleWrap(buildCommon.makeSpan(["delimsizing", "size" + size], [inner], options), src_Style.TEXT, options, classes);
-
-  if (center) {
-    centerSpan(span, options, src_Style.TEXT);
-  }
-
-  return span;
-};
-/**
- * Make an inner span with the given offset and in the given font. This is used
- * in `makeStackedDelim` to make the stacking pieces for the delimiter.
- */
-
-
-var delimiter_makeInner = function makeInner(symbol, font, mode) {
-  var sizeClass; // Apply the correct CSS class to choose the right font.
-
-  if (font === "Size1-Regular") {
-    sizeClass = "delim-size1";
-  } else
-    /* if (font === "Size4-Regular") */
-    {
-      sizeClass = "delim-size4";
-    }
-
-  var inner = buildCommon.makeSpan(["delimsizinginner", sizeClass], [buildCommon.makeSpan([], [buildCommon.makeSymbol(symbol, font, mode)])]); // Since this will be passed into `makeVList` in the end, wrap the element
-  // in the appropriate tag that VList uses.
-
-  return {
-    type: "elem",
-    elem: inner
-  };
-}; // Helper for makeStackedDelim
-
-
-var lap = {
-  type: "kern",
-  size: -0.005
-};
-/**
- * Make a stacked delimiter out of a given delimiter, with the total height at
- * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook.
- */
-
-var delimiter_makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) {
-  // There are four parts, the top, an optional middle, a repeated part, and a
-  // bottom.
-  var top;
-  var middle;
-  var repeat;
-  var bottom;
-  top = repeat = bottom = delim;
-  middle = null; // Also keep track of what font the delimiters are in
-
-  var font = "Size1-Regular"; // We set the parts and font based on the symbol. Note that we use
-  // '\u23d0' instead of '|' and '\u2016' instead of '\\|' for the
-  // repeats of the arrows
-
-  if (delim === "\\uparrow") {
-    repeat = bottom = "\u23D0";
-  } else if (delim === "\\Uparrow") {
-    repeat = bottom = "\u2016";
-  } else if (delim === "\\downarrow") {
-    top = repeat = "\u23D0";
-  } else if (delim === "\\Downarrow") {
-    top = repeat = "\u2016";
-  } else if (delim === "\\updownarrow") {
-    top = "\\uparrow";
-    repeat = "\u23D0";
-    bottom = "\\downarrow";
-  } else if (delim === "\\Updownarrow") {
-    top = "\\Uparrow";
-    repeat = "\u2016";
-    bottom = "\\Downarrow";
-  } else if (delim === "[" || delim === "\\lbrack") {
-    top = "\u23A1";
-    repeat = "\u23A2";
-    bottom = "\u23A3";
-    font = "Size4-Regular";
-  } else if (delim === "]" || delim === "\\rbrack") {
-    top = "\u23A4";
-    repeat = "\u23A5";
-    bottom = "\u23A6";
-    font = "Size4-Regular";
-  } else if (delim === "\\lfloor" || delim === "\u230A") {
-    repeat = top = "\u23A2";
-    bottom = "\u23A3";
-    font = "Size4-Regular";
-  } else if (delim === "\\lceil" || delim === "\u2308") {
-    top = "\u23A1";
-    repeat = bottom = "\u23A2";
-    font = "Size4-Regular";
-  } else if (delim === "\\rfloor" || delim === "\u230B") {
-    repeat = top = "\u23A5";
-    bottom = "\u23A6";
-    font = "Size4-Regular";
-  } else if (delim === "\\rceil" || delim === "\u2309") {
-    top = "\u23A4";
-    repeat = bottom = "\u23A5";
-    font = "Size4-Regular";
-  } else if (delim === "(" || delim === "\\lparen") {
-    top = "\u239B";
-    repeat = "\u239C";
-    bottom = "\u239D";
-    font = "Size4-Regular";
-  } else if (delim === ")" || delim === "\\rparen") {
-    top = "\u239E";
-    repeat = "\u239F";
-    bottom = "\u23A0";
-    font = "Size4-Regular";
-  } else if (delim === "\\{" || delim === "\\lbrace") {
-    top = "\u23A7";
-    middle = "\u23A8";
-    bottom = "\u23A9";
-    repeat = "\u23AA";
-    font = "Size4-Regular";
-  } else if (delim === "\\}" || delim === "\\rbrace") {
-    top = "\u23AB";
-    middle = "\u23AC";
-    bottom = "\u23AD";
-    repeat = "\u23AA";
-    font = "Size4-Regular";
-  } else if (delim === "\\lgroup" || delim === "\u27EE") {
-    top = "\u23A7";
-    bottom = "\u23A9";
-    repeat = "\u23AA";
-    font = "Size4-Regular";
-  } else if (delim === "\\rgroup" || delim === "\u27EF") {
-    top = "\u23AB";
-    bottom = "\u23AD";
-    repeat = "\u23AA";
-    font = "Size4-Regular";
-  } else if (delim === "\\lmoustache" || delim === "\u23B0") {
-    top = "\u23A7";
-    bottom = "\u23AD";
-    repeat = "\u23AA";
-    font = "Size4-Regular";
-  } else if (delim === "\\rmoustache" || delim === "\u23B1") {
-    top = "\u23AB";
-    bottom = "\u23A9";
-    repeat = "\u23AA";
-    font = "Size4-Regular";
-  } // Get the metrics of the four sections
-
-
-  var topMetrics = delimiter_getMetrics(top, font, mode);
-  var topHeightTotal = topMetrics.height + topMetrics.depth;
-  var repeatMetrics = delimiter_getMetrics(repeat, font, mode);
-  var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth;
-  var bottomMetrics = delimiter_getMetrics(bottom, font, mode);
-  var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth;
-  var middleHeightTotal = 0;
-  var middleFactor = 1;
-
-  if (middle !== null) {
-    var middleMetrics = delimiter_getMetrics(middle, font, mode);
-    middleHeightTotal = middleMetrics.height + middleMetrics.depth;
-    middleFactor = 2; // repeat symmetrically above and below middle
-  } // Calcuate the minimal height that the delimiter can have.
-  // It is at least the size of the top, bottom, and optional middle combined.
-
-
-  var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal; // Compute the number of copies of the repeat symbol we will need
-
-  var repeatCount = Math.max(0, Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal))); // Compute the total height of the delimiter including all the symbols
-
-  var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal; // The center of the delimiter is placed at the center of the axis. Note
-  // that in this context, "center" means that the delimiter should be
-  // centered around the axis in the current style, while normally it is
-  // centered around the axis in textstyle.
-
-  var axisHeight = options.fontMetrics().axisHeight;
-
-  if (center) {
-    axisHeight *= options.sizeMultiplier;
-  } // Calculate the depth
-
-
-  var depth = realHeightTotal / 2 - axisHeight; // This function differs from the TeX procedure in one way.
-  // We shift each repeat element downwards by 0.005em, to prevent a gap
-  // due to browser floating point rounding error.
-  // Then, at the last element-to element joint, we add one extra repeat
-  // element to cover the gap created by the shifts.
-  // Find the shift needed to align the upper end of the extra element at a point
-  // 0.005em above the lower end of the top element.
-
-  var shiftOfExtraElement = (repeatCount + 1) * 0.005 - repeatHeightTotal; // Now, we start building the pieces that will go into the vlist
-  // Keep a list of the inner pieces
-
-  var inners = []; // Add the bottom symbol
-
-  inners.push(delimiter_makeInner(bottom, font, mode));
-
-  if (middle === null) {
-    // Add that many symbols
-    for (var i = 0; i < repeatCount; i++) {
-      inners.push(lap); // overlap
-
-      inners.push(delimiter_makeInner(repeat, font, mode));
-    }
-  } else {
-    // When there is a middle bit, we need the middle part and two repeated
-    // sections
-    for (var _i = 0; _i < repeatCount; _i++) {
-      inners.push(lap);
-      inners.push(delimiter_makeInner(repeat, font, mode));
-    } // Insert one extra repeat element.
-
-
-    inners.push({
-      type: "kern",
-      size: shiftOfExtraElement
-    });
-    inners.push(delimiter_makeInner(repeat, font, mode));
-    inners.push(lap); // Now insert the middle of the brace.
-
-    inners.push(delimiter_makeInner(middle, font, mode));
-
-    for (var _i2 = 0; _i2 < repeatCount; _i2++) {
-      inners.push(lap);
-      inners.push(delimiter_makeInner(repeat, font, mode));
-    }
-  } // To cover the gap create by the overlaps, insert one more repeat element,
-  // at a position that juts 0.005 above the bottom of the top element.
-
-
-  inners.push({
-    type: "kern",
-    size: shiftOfExtraElement
-  });
-  inners.push(delimiter_makeInner(repeat, font, mode));
-  inners.push(lap); // Add the top symbol
-
-  inners.push(delimiter_makeInner(top, font, mode)); // Finally, build the vlist
-
-  var newOptions = options.havingBaseStyle(src_Style.TEXT);
-  var inner = buildCommon.makeVList({
-    positionType: "bottom",
-    positionData: depth,
-    children: inners
-  }, newOptions);
-  return delimiter_styleWrap(buildCommon.makeSpan(["delimsizing", "mult"], [inner], newOptions), src_Style.TEXT, options, classes);
-}; // All surds have 0.08em padding above the viniculum inside the SVG.
-// That keeps browser span height rounding error from pinching the line.
-
-
-var vbPad = 80; // padding above the surd, measured inside the viewBox.
-
-var emPad = 0.08; // padding, in ems, measured in the document.
-
-var delimiter_sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, extraViniculum, options) {
-  var path = sqrtPath(sqrtName, extraViniculum, viewBoxHeight);
-  var pathNode = new domTree_PathNode(sqrtName, path);
-  var svg = new SvgNode([pathNode], {
-    // Note: 1000:1 ratio of viewBox to document em width.
-    "width": "400em",
-    "height": height + "em",
-    "viewBox": "0 0 400000 " + viewBoxHeight,
-    "preserveAspectRatio": "xMinYMin slice"
-  });
-  return buildCommon.makeSvgSpan(["hide-tail"], [svg], options);
-};
-/**
- * Make a sqrt image of the given height,
- */
-
-
-var makeSqrtImage = function makeSqrtImage(height, options) {
-  // Define a newOptions that removes the effect of size changes such as \Huge.
-  // We don't pick different a height surd for \Huge. For it, we scale up.
-  var newOptions = options.havingBaseSizing(); // Pick the desired surd glyph from a sequence of surds.
-
-  var delim = traverseSequence("\\surd", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions);
-  var sizeMultiplier = newOptions.sizeMultiplier; // default
-  // The standard sqrt SVGs each have a 0.04em thick viniculum.
-  // If Settings.minRuleThickness is larger than that, we add extraViniculum.
-
-  var extraViniculum = Math.max(0, options.minRuleThickness - options.fontMetrics().sqrtRuleThickness); // Create a span containing an SVG image of a sqrt symbol.
-
-  var span;
-  var spanHeight = 0;
-  var texHeight = 0;
-  var viewBoxHeight = 0;
-  var advanceWidth; // We create viewBoxes with 80 units of "padding" above each surd.
-  // Then browser rounding error on the parent span height will not
-  // encroach on the ink of the viniculum. But that padding is not
-  // included in the TeX-like `height` used for calculation of
-  // vertical alignment. So texHeight = span.height < span.style.height.
-
-  if (delim.type === "small") {
-    // Get an SVG that is derived from glyph U+221A in font KaTeX-Main.
-    // 1000 unit normal glyph height.
-    viewBoxHeight = 1000 + 1000 * extraViniculum + vbPad;
-
-    if (height < 1.0) {
-      sizeMultiplier = 1.0; // mimic a \textfont radical
-    } else if (height < 1.4) {
-      sizeMultiplier = 0.7; // mimic a \scriptfont radical
-    }
-
-    spanHeight = (1.0 + extraViniculum + emPad) / sizeMultiplier;
-    texHeight = (1.00 + extraViniculum) / sizeMultiplier;
-    span = delimiter_sqrtSvg("sqrtMain", spanHeight, viewBoxHeight, extraViniculum, options);
-    span.style.minWidth = "0.853em";
-    advanceWidth = 0.833 / sizeMultiplier; // from the font.
-  } else if (delim.type === "large") {
-    // These SVGs come from fonts: KaTeX_Size1, _Size2, etc.
-    viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size];
-    texHeight = (sizeToMaxHeight[delim.size] + extraViniculum) / sizeMultiplier;
-    spanHeight = (sizeToMaxHeight[delim.size] + extraViniculum + emPad) / sizeMultiplier;
-    span = delimiter_sqrtSvg("sqrtSize" + delim.size, spanHeight, viewBoxHeight, extraViniculum, options);
-    span.style.minWidth = "1.02em";
-    advanceWidth = 1.0 / sizeMultiplier; // 1.0 from the font.
-  } else {
-    // Tall sqrt. In TeX, this would be stacked using multiple glyphs.
-    // We'll use a single SVG to accomplish the same thing.
-    spanHeight = height + extraViniculum + emPad;
-    texHeight = height + extraViniculum;
-    viewBoxHeight = Math.floor(1000 * height + extraViniculum) + vbPad;
-    span = delimiter_sqrtSvg("sqrtTall", spanHeight, viewBoxHeight, extraViniculum, options);
-    span.style.minWidth = "0.742em";
-    advanceWidth = 1.056;
-  }
-
-  span.height = texHeight;
-  span.style.height = spanHeight + "em";
-  return {
-    span: span,
-    advanceWidth: advanceWidth,
-    // Calculate the actual line width.
-    // This actually should depend on the chosen font -- e.g. \boldmath
-    // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and
-    // have thicker rules.
-    ruleWidth: (options.fontMetrics().sqrtRuleThickness + extraViniculum) * sizeMultiplier
-  };
-}; // There are three kinds of delimiters, delimiters that stack when they become
-// too large
-
-
-var stackLargeDelimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230A", "\u230B", "\\lceil", "\\rceil", "\u2308", "\u2309", "\\surd"]; // delimiters that always stack
-
-var stackAlwaysDelimiters = ["\\uparrow", "\\downarrow", "\\updownarrow", "\\Uparrow", "\\Downarrow", "\\Updownarrow", "|", "\\|", "\\vert", "\\Vert", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27EE", "\u27EF", "\\lmoustache", "\\rmoustache", "\u23B0", "\u23B1"]; // and delimiters that never stack
-
-var stackNeverDelimiters = ["<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt"]; // Metrics of the different sizes. Found by looking at TeX's output of
-// $\bigl| // \Bigl| \biggl| \Biggl| \showlists$
-// Used to create stacked delimiters of appropriate sizes in makeSizedDelim.
-
-var sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];
-/**
- * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4.
- */
-
-var delimiter_makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) {
-  // < and > turn into \langle and \rangle in delimiters
-  if (delim === "<" || delim === "\\lt" || delim === "\u27E8") {
-    delim = "\\langle";
-  } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") {
-    delim = "\\rangle";
-  } // Sized delimiters are never centered.
-
-
-  if (utils.contains(stackLargeDelimiters, delim) || utils.contains(stackNeverDelimiters, delim)) {
-    return delimiter_makeLargeDelim(delim, size, false, options, mode, classes);
-  } else if (utils.contains(stackAlwaysDelimiters, delim)) {
-    return delimiter_makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes);
-  } else {
-    throw new src_ParseError("Illegal delimiter: '" + delim + "'");
-  }
-};
-/**
- * There are three different sequences of delimiter sizes that the delimiters
- * follow depending on the kind of delimiter. This is used when creating custom
- * sized delimiters to decide whether to create a small, large, or stacked
- * delimiter.
- *
- * In real TeX, these sequences aren't explicitly defined, but are instead
- * defined inside the font metrics. Since there are only three sequences that
- * are possible for the delimiters that TeX defines, it is easier to just encode
- * them explicitly here.
- */
-
-
-// Delimiters that never stack try small delimiters and large delimiters only
-var stackNeverDelimiterSequence = [{
-  type: "small",
-  style: src_Style.SCRIPTSCRIPT
-}, {
-  type: "small",
-  style: src_Style.SCRIPT
-}, {
-  type: "small",
-  style: src_Style.TEXT
-}, {
-  type: "large",
-  size: 1
-}, {
-  type: "large",
-  size: 2
-}, {
-  type: "large",
-  size: 3
-}, {
-  type: "large",
-  size: 4
-}]; // Delimiters that always stack try the small delimiters first, then stack
-
-var stackAlwaysDelimiterSequence = [{
-  type: "small",
-  style: src_Style.SCRIPTSCRIPT
-}, {
-  type: "small",
-  style: src_Style.SCRIPT
-}, {
-  type: "small",
-  style: src_Style.TEXT
-}, {
-  type: "stack"
-}]; // Delimiters that stack when large try the small and then large delimiters, and
-// stack afterwards
-
-var stackLargeDelimiterSequence = [{
-  type: "small",
-  style: src_Style.SCRIPTSCRIPT
-}, {
-  type: "small",
-  style: src_Style.SCRIPT
-}, {
-  type: "small",
-  style: src_Style.TEXT
-}, {
-  type: "large",
-  size: 1
-}, {
-  type: "large",
-  size: 2
-}, {
-  type: "large",
-  size: 3
-}, {
-  type: "large",
-  size: 4
-}, {
-  type: "stack"
-}];
-/**
- * Get the font used in a delimiter based on what kind of delimiter it is.
- * TODO(#963) Use more specific font family return type once that is introduced.
- */
-
-var delimTypeToFont = function delimTypeToFont(type) {
-  if (type.type === "small") {
-    return "Main-Regular";
-  } else if (type.type === "large") {
-    return "Size" + type.size + "-Regular";
-  } else if (type.type === "stack") {
-    return "Size4-Regular";
-  } else {
-    throw new Error("Add support for delim type '" + type.type + "' here.");
-  }
-};
-/**
- * Traverse a sequence of types of delimiters to decide what kind of delimiter
- * should be used to create a delimiter of the given height+depth.
- */
-
-
-var traverseSequence = function traverseSequence(delim, height, sequence, options) {
-  // Here, we choose the index we should start at in the sequences. In smaller
-  // sizes (which correspond to larger numbers in style.size) we start earlier
-  // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts
-  // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2
-  var start = Math.min(2, 3 - options.style.size);
-
-  for (var i = start; i < sequence.length; i++) {
-    if (sequence[i].type === "stack") {
-      // This is always the last delimiter, so we just break the loop now.
-      break;
-    }
-
-    var metrics = delimiter_getMetrics(delim, delimTypeToFont(sequence[i]), "math");
-    var heightDepth = metrics.height + metrics.depth; // Small delimiters are scaled down versions of the same font, so we
-    // account for the style change size.
-
-    if (sequence[i].type === "small") {
-      var newOptions = options.havingBaseStyle(sequence[i].style);
-      heightDepth *= newOptions.sizeMultiplier;
-    } // Check if the delimiter at this size works for the given height.
-
-
-    if (heightDepth > height) {
-      return sequence[i];
-    }
-  } // If we reached the end of the sequence, return the last sequence element.
-
-
-  return sequence[sequence.length - 1];
-};
-/**
- * Make a delimiter of a given height+depth, with optional centering. Here, we
- * traverse the sequences, and create a delimiter that the sequence tells us to.
- */
-
-
-var delimiter_makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) {
-  if (delim === "<" || delim === "\\lt" || delim === "\u27E8") {
-    delim = "\\langle";
-  } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") {
-    delim = "\\rangle";
-  } // Decide what sequence to use
-
-
-  var sequence;
-
-  if (utils.contains(stackNeverDelimiters, delim)) {
-    sequence = stackNeverDelimiterSequence;
-  } else if (utils.contains(stackLargeDelimiters, delim)) {
-    sequence = stackLargeDelimiterSequence;
-  } else {
-    sequence = stackAlwaysDelimiterSequence;
-  } // Look through the sequence
-
-
-  var delimType = traverseSequence(delim, height, sequence, options); // Get the delimiter from font glyphs.
-  // Depending on the sequence element we decided on, call the
-  // appropriate function.
-
-  if (delimType.type === "small") {
-    return delimiter_makeSmallDelim(delim, delimType.style, center, options, mode, classes);
-  } else if (delimType.type === "large") {
-    return delimiter_makeLargeDelim(delim, delimType.size, center, options, mode, classes);
-  } else
-    /* if (delimType.type === "stack") */
-    {
-      return delimiter_makeStackedDelim(delim, height, center, options, mode, classes);
-    }
-};
-/**
- * Make a delimiter for use with `\left` and `\right`, given a height and depth
- * of an expression that the delimiters surround.
- */
-
-
-var makeLeftRightDelim = function makeLeftRightDelim(delim, height, depth, options, mode, classes) {
-  // We always center \left/\right delimiters, so the axis is always shifted
-  var axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier; // Taken from TeX source, tex.web, function make_left_right
-
-  var delimiterFactor = 901;
-  var delimiterExtend = 5.0 / options.fontMetrics().ptPerEm;
-  var maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight);
-  var totalHeight = Math.max( // In real TeX, calculations are done using integral values which are
-  // 65536 per pt, or 655360 per em. So, the division here truncates in
-  // TeX but doesn't here, producing different results. If we wanted to
-  // exactly match TeX's calculation, we could do
-  //   Math.floor(655360 * maxDistFromAxis / 500) *
-  //    delimiterFactor / 655360
-  // (To see the difference, compare
-  //    x^{x^{\left(\rule{0.1em}{0.68em}\right)}}
-  // in TeX and KaTeX)
-  maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend); // Finally, we defer to `makeCustomSizedDelim` with our calculated total
-  // height
-
-  return delimiter_makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes);
-};
-
-/* harmony default export */ var delimiter = ({
-  sqrtImage: makeSqrtImage,
-  sizedDelim: delimiter_makeSizedDelim,
-  customSizedDelim: delimiter_makeCustomSizedDelim,
-  leftRightDelim: makeLeftRightDelim
-});
-// CONCATENATED MODULE: ./src/functions/delimsizing.js
-
-
-
-
-
-
-
-
-
-// Extra data needed for the delimiter handler down below
-var delimiterSizes = {
-  "\\bigl": {
-    mclass: "mopen",
-    size: 1
-  },
-  "\\Bigl": {
-    mclass: "mopen",
-    size: 2
-  },
-  "\\biggl": {
-    mclass: "mopen",
-    size: 3
-  },
-  "\\Biggl": {
-    mclass: "mopen",
-    size: 4
-  },
-  "\\bigr": {
-    mclass: "mclose",
-    size: 1
-  },
-  "\\Bigr": {
-    mclass: "mclose",
-    size: 2
-  },
-  "\\biggr": {
-    mclass: "mclose",
-    size: 3
-  },
-  "\\Biggr": {
-    mclass: "mclose",
-    size: 4
-  },
-  "\\bigm": {
-    mclass: "mrel",
-    size: 1
-  },
-  "\\Bigm": {
-    mclass: "mrel",
-    size: 2
-  },
-  "\\biggm": {
-    mclass: "mrel",
-    size: 3
-  },
-  "\\Biggm": {
-    mclass: "mrel",
-    size: 4
-  },
-  "\\big": {
-    mclass: "mord",
-    size: 1
-  },
-  "\\Big": {
-    mclass: "mord",
-    size: 2
-  },
-  "\\bigg": {
-    mclass: "mord",
-    size: 3
-  },
-  "\\Bigg": {
-    mclass: "mord",
-    size: 4
-  }
-};
-var delimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230A", "\u230B", "\\lceil", "\\rceil", "\u2308", "\u2309", "<", ">", "\\langle", "\u27E8", "\\rangle", "\u27E9", "\\lt", "\\gt", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27EE", "\u27EF", "\\lmoustache", "\\rmoustache", "\u23B0", "\u23B1", "/", "\\backslash", "|", "\\vert", "\\|", "\\Vert", "\\uparrow", "\\Uparrow", "\\downarrow", "\\Downarrow", "\\updownarrow", "\\Updownarrow", "."];
-
-// Delimiter functions
-function checkDelimiter(delim, context) {
-  var symDelim = checkSymbolNodeType(delim);
-
-  if (symDelim && utils.contains(delimiters, symDelim.text)) {
-    return symDelim;
-  } else {
-    throw new src_ParseError("Invalid delimiter: '" + (symDelim ? symDelim.text : JSON.stringify(delim)) + "' after '" + context.funcName + "'", delim);
-  }
-}
-
-defineFunction({
-  type: "delimsizing",
-  names: ["\\bigl", "\\Bigl", "\\biggl", "\\Biggl", "\\bigr", "\\Bigr", "\\biggr", "\\Biggr", "\\bigm", "\\Bigm", "\\biggm", "\\Biggm", "\\big", "\\Big", "\\bigg", "\\Bigg"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(context, args) {
-    var delim = checkDelimiter(args[0], context);
-    return {
-      type: "delimsizing",
-      mode: context.parser.mode,
-      size: delimiterSizes[context.funcName].size,
-      mclass: delimiterSizes[context.funcName].mclass,
-      delim: delim.text
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    if (group.delim === ".") {
-      // Empty delimiters still count as elements, even though they don't
-      // show anything.
-      return buildCommon.makeSpan([group.mclass]);
-    } // Use delimiter.sizedDelim to generate the delimiter.
-
-
-    return delimiter.sizedDelim(group.delim, group.size, options, group.mode, [group.mclass]);
-  },
-  mathmlBuilder: function mathmlBuilder(group) {
-    var children = [];
-
-    if (group.delim !== ".") {
-      children.push(buildMathML_makeText(group.delim, group.mode));
-    }
-
-    var node = new mathMLTree.MathNode("mo", children);
-
-    if (group.mclass === "mopen" || group.mclass === "mclose") {
-      // Only some of the delimsizing functions act as fences, and they
-      // return "mopen" or "mclose" mclass.
-      node.setAttribute("fence", "true");
-    } else {
-      // Explicitly disable fencing if it's not a fence, to override the
-      // defaults.
-      node.setAttribute("fence", "false");
-    }
-
-    return node;
-  }
-});
-
-function assertParsed(group) {
-  if (!group.body) {
-    throw new Error("Bug: The leftright ParseNode wasn't fully parsed.");
-  }
-}
-
-defineFunction({
-  type: "leftright-right",
-  names: ["\\right"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(context, args) {
-    // \left case below triggers parsing of \right in
-    //   `const right = parser.parseFunction();`
-    // uses this return value.
-    var color = context.parser.gullet.macros.get("\\current@color");
-
-    if (color && typeof color !== "string") {
-      throw new src_ParseError("\\current@color set to non-string in \\right");
-    }
-
-    return {
-      type: "leftright-right",
-      mode: context.parser.mode,
-      delim: checkDelimiter(args[0], context).text,
-      color: color // undefined if not set via \color
-
-    };
-  }
-});
-defineFunction({
-  type: "leftright",
-  names: ["\\left"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(context, args) {
-    var delim = checkDelimiter(args[0], context);
-    var parser = context.parser; // Parse out the implicit body
-
-    ++parser.leftrightDepth; // parseExpression stops before '\\right'
-
-    var body = parser.parseExpression(false);
-    --parser.leftrightDepth; // Check the next token
-
-    parser.expect("\\right", false);
-    var right = assertNodeType(parser.parseFunction(), "leftright-right");
-    return {
-      type: "leftright",
-      mode: parser.mode,
-      body: body,
-      left: delim.text,
-      right: right.delim,
-      rightColor: right.color
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    assertParsed(group); // Build the inner expression
-
-    var inner = buildHTML_buildExpression(group.body, options, true, ["mopen", "mclose"]);
-    var innerHeight = 0;
-    var innerDepth = 0;
-    var hadMiddle = false; // Calculate its height and depth
-
-    for (var i = 0; i < inner.length; i++) {
-      // Property `isMiddle` not defined on `span`. See comment in
-      // "middle"'s htmlBuilder.
-      // $FlowFixMe
-      if (inner[i].isMiddle) {
-        hadMiddle = true;
-      } else {
-        innerHeight = Math.max(inner[i].height, innerHeight);
-        innerDepth = Math.max(inner[i].depth, innerDepth);
-      }
-    } // The size of delimiters is the same, regardless of what style we are
-    // in. Thus, to correctly calculate the size of delimiter we need around
-    // a group, we scale down the inner size based on the size.
-
-
-    innerHeight *= options.sizeMultiplier;
-    innerDepth *= options.sizeMultiplier;
-    var leftDelim;
-
-    if (group.left === ".") {
-      // Empty delimiters in \left and \right make null delimiter spaces.
-      leftDelim = makeNullDelimiter(options, ["mopen"]);
-    } else {
-      // Otherwise, use leftRightDelim to generate the correct sized
-      // delimiter.
-      leftDelim = delimiter.leftRightDelim(group.left, innerHeight, innerDepth, options, group.mode, ["mopen"]);
-    } // Add it to the beginning of the expression
-
-
-    inner.unshift(leftDelim); // Handle middle delimiters
-
-    if (hadMiddle) {
-      for (var _i = 1; _i < inner.length; _i++) {
-        var middleDelim = inner[_i]; // Property `isMiddle` not defined on `span`. See comment in
-        // "middle"'s htmlBuilder.
-        // $FlowFixMe
-
-        var isMiddle = middleDelim.isMiddle;
-
-        if (isMiddle) {
-          // Apply the options that were active when \middle was called
-          inner[_i] = delimiter.leftRightDelim(isMiddle.delim, innerHeight, innerDepth, isMiddle.options, group.mode, []);
-        }
-      }
-    }
-
-    var rightDelim; // Same for the right delimiter, but using color specified by \color
-
-    if (group.right === ".") {
-      rightDelim = makeNullDelimiter(options, ["mclose"]);
-    } else {
-      var colorOptions = group.rightColor ? options.withColor(group.rightColor) : options;
-      rightDelim = delimiter.leftRightDelim(group.right, innerHeight, innerDepth, colorOptions, group.mode, ["mclose"]);
-    } // Add it to the end of the expression.
-
-
-    inner.push(rightDelim);
-    return buildCommon.makeSpan(["minner"], inner, options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    assertParsed(group);
-    var inner = buildMathML_buildExpression(group.body, options);
-
-    if (group.left !== ".") {
-      var leftNode = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.left, group.mode)]);
-      leftNode.setAttribute("fence", "true");
-      inner.unshift(leftNode);
-    }
-
-    if (group.right !== ".") {
-      var rightNode = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.right, group.mode)]);
-      rightNode.setAttribute("fence", "true");
-
-      if (group.rightColor) {
-        rightNode.setAttribute("mathcolor", group.rightColor);
-      }
-
-      inner.push(rightNode);
-    }
-
-    return buildMathML_makeRow(inner);
-  }
-});
-defineFunction({
-  type: "middle",
-  names: ["\\middle"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(context, args) {
-    var delim = checkDelimiter(args[0], context);
-
-    if (!context.parser.leftrightDepth) {
-      throw new src_ParseError("\\middle without preceding \\left", delim);
-    }
-
-    return {
-      type: "middle",
-      mode: context.parser.mode,
-      delim: delim.text
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    var middleDelim;
-
-    if (group.delim === ".") {
-      middleDelim = makeNullDelimiter(options, []);
-    } else {
-      middleDelim = delimiter.sizedDelim(group.delim, 1, options, group.mode, []);
-      var isMiddle = {
-        delim: group.delim,
-        options: options
-      }; // Property `isMiddle` not defined on `span`. It is only used in
-      // this file above.
-      // TODO: Fix this violation of the `span` type and possibly rename
-      // things since `isMiddle` sounds like a boolean, but is a struct.
-      // $FlowFixMe
-
-      middleDelim.isMiddle = isMiddle;
-    }
-
-    return middleDelim;
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    // A Firefox \middle will strech a character vertically only if it
-    // is in the fence part of the operator dictionary at:
-    // https://www.w3.org/TR/MathML3/appendixc.html.
-    // So we need to avoid U+2223 and use plain "|" instead.
-    var textNode = group.delim === "\\vert" || group.delim === "|" ? buildMathML_makeText("|", "text") : buildMathML_makeText(group.delim, group.mode);
-    var middleNode = new mathMLTree.MathNode("mo", [textNode]);
-    middleNode.setAttribute("fence", "true"); // MathML gives 5/18em spacing to each <mo> element.
-    // \middle should get delimiter spacing instead.
-
-    middleNode.setAttribute("lspace", "0.05em");
-    middleNode.setAttribute("rspace", "0.05em");
-    return middleNode;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/enclose.js
-
-
-
-
-
-
-
-
-
-var enclose_htmlBuilder = function htmlBuilder(group, options) {
-  // \cancel, \bcancel, \xcancel, \sout, \fbox, \colorbox, \fcolorbox
-  // Some groups can return document fragments.  Handle those by wrapping
-  // them in a span.
-  var inner = buildCommon.wrapFragment(buildHTML_buildGroup(group.body, options), options);
-  var label = group.label.substr(1);
-  var scale = options.sizeMultiplier;
-  var img;
-  var imgShift = 0; // In the LaTeX cancel package, line geometry is slightly different
-  // depending on whether the subject is wider than it is tall, or vice versa.
-  // We don't know the width of a group, so as a proxy, we test if
-  // the subject is a single character. This captures most of the
-  // subjects that should get the "tall" treatment.
-
-  var isSingleChar = utils.isCharacterBox(group.body);
-
-  if (label === "sout") {
-    img = buildCommon.makeSpan(["stretchy", "sout"]);
-    img.height = options.fontMetrics().defaultRuleThickness / scale;
-    imgShift = -0.5 * options.fontMetrics().xHeight;
-  } else {
-    // Add horizontal padding
-    if (/cancel/.test(label)) {
-      if (!isSingleChar) {
-        inner.classes.push("cancel-pad");
-      }
-    } else {
-      inner.classes.push("boxpad");
-    } // Add vertical padding
-
-
-    var vertPad = 0;
-    var ruleThickness = 0; // ref: cancel package: \advance\totalheight2\p@ % "+2"
-
-    if (/box/.test(label)) {
-      ruleThickness = Math.max(options.fontMetrics().fboxrule, // default
-      options.minRuleThickness // User override.
-      );
-      vertPad = options.fontMetrics().fboxsep + (label === "colorbox" ? 0 : ruleThickness);
-    } else {
-      vertPad = isSingleChar ? 0.2 : 0;
-    }
-
-    img = stretchy.encloseSpan(inner, label, vertPad, options);
-
-    if (/fbox|boxed|fcolorbox/.test(label)) {
-      img.style.borderStyle = "solid";
-      img.style.borderWidth = ruleThickness + "em";
-    }
-
-    imgShift = inner.depth + vertPad;
-
-    if (group.backgroundColor) {
-      img.style.backgroundColor = group.backgroundColor;
-
-      if (group.borderColor) {
-        img.style.borderColor = group.borderColor;
-      }
-    }
-  }
-
-  var vlist;
-
-  if (group.backgroundColor) {
-    vlist = buildCommon.makeVList({
-      positionType: "individualShift",
-      children: [// Put the color background behind inner;
-      {
-        type: "elem",
-        elem: img,
-        shift: imgShift
-      }, {
-        type: "elem",
-        elem: inner,
-        shift: 0
-      }]
-    }, options);
-  } else {
-    vlist = buildCommon.makeVList({
-      positionType: "individualShift",
-      children: [// Write the \cancel stroke on top of inner.
-      {
-        type: "elem",
-        elem: inner,
-        shift: 0
-      }, {
-        type: "elem",
-        elem: img,
-        shift: imgShift,
-        wrapperClasses: /cancel/.test(label) ? ["svg-align"] : []
-      }]
-    }, options);
-  }
-
-  if (/cancel/.test(label)) {
-    // The cancel package documentation says that cancel lines add their height
-    // to the expression, but tests show that isn't how it actually works.
-    vlist.height = inner.height;
-    vlist.depth = inner.depth;
-  }
-
-  if (/cancel/.test(label) && !isSingleChar) {
-    // cancel does not create horiz space for its line extension.
-    return buildCommon.makeSpan(["mord", "cancel-lap"], [vlist], options);
-  } else {
-    return buildCommon.makeSpan(["mord"], [vlist], options);
-  }
-};
-
-var enclose_mathmlBuilder = function mathmlBuilder(group, options) {
-  var fboxsep = 0;
-  var node = new mathMLTree.MathNode(group.label.indexOf("colorbox") > -1 ? "mpadded" : "menclose", [buildMathML_buildGroup(group.body, options)]);
-
-  switch (group.label) {
-    case "\\cancel":
-      node.setAttribute("notation", "updiagonalstrike");
-      break;
-
-    case "\\bcancel":
-      node.setAttribute("notation", "downdiagonalstrike");
-      break;
-
-    case "\\sout":
-      node.setAttribute("notation", "horizontalstrike");
-      break;
-
-    case "\\fbox":
-      node.setAttribute("notation", "box");
-      break;
-
-    case "\\fcolorbox":
-    case "\\colorbox":
-      // <menclose> doesn't have a good notation option. So use <mpadded>
-      // instead. Set some attributes that come included with <menclose>.
-      fboxsep = options.fontMetrics().fboxsep * options.fontMetrics().ptPerEm;
-      node.setAttribute("width", "+" + 2 * fboxsep + "pt");
-      node.setAttribute("height", "+" + 2 * fboxsep + "pt");
-      node.setAttribute("lspace", fboxsep + "pt"); //
-
-      node.setAttribute("voffset", fboxsep + "pt");
-
-      if (group.label === "\\fcolorbox") {
-        var thk = Math.max(options.fontMetrics().fboxrule, // default
-        options.minRuleThickness // user override
-        );
-        node.setAttribute("style", "border: " + thk + "em solid " + String(group.borderColor));
-      }
-
-      break;
-
-    case "\\xcancel":
-      node.setAttribute("notation", "updiagonalstrike downdiagonalstrike");
-      break;
-  }
-
-  if (group.backgroundColor) {
-    node.setAttribute("mathbackground", group.backgroundColor);
-  }
-
-  return node;
-};
-
-defineFunction({
-  type: "enclose",
-  names: ["\\colorbox"],
-  props: {
-    numArgs: 2,
-    allowedInText: true,
-    greediness: 3,
-    argTypes: ["color", "text"]
-  },
-  handler: function handler(_ref, args, optArgs) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    var color = assertNodeType(args[0], "color-token").color;
-    var body = args[1];
-    return {
-      type: "enclose",
-      mode: parser.mode,
-      label: funcName,
-      backgroundColor: color,
-      body: body
-    };
-  },
-  htmlBuilder: enclose_htmlBuilder,
-  mathmlBuilder: enclose_mathmlBuilder
-});
-defineFunction({
-  type: "enclose",
-  names: ["\\fcolorbox"],
-  props: {
-    numArgs: 3,
-    allowedInText: true,
-    greediness: 3,
-    argTypes: ["color", "color", "text"]
-  },
-  handler: function handler(_ref2, args, optArgs) {
-    var parser = _ref2.parser,
-        funcName = _ref2.funcName;
-    var borderColor = assertNodeType(args[0], "color-token").color;
-    var backgroundColor = assertNodeType(args[1], "color-token").color;
-    var body = args[2];
-    return {
-      type: "enclose",
-      mode: parser.mode,
-      label: funcName,
-      backgroundColor: backgroundColor,
-      borderColor: borderColor,
-      body: body
-    };
-  },
-  htmlBuilder: enclose_htmlBuilder,
-  mathmlBuilder: enclose_mathmlBuilder
-});
-defineFunction({
-  type: "enclose",
-  names: ["\\fbox"],
-  props: {
-    numArgs: 1,
-    argTypes: ["hbox"],
-    allowedInText: true
-  },
-  handler: function handler(_ref3, args) {
-    var parser = _ref3.parser;
-    return {
-      type: "enclose",
-      mode: parser.mode,
-      label: "\\fbox",
-      body: args[0]
-    };
-  }
-});
-defineFunction({
-  type: "enclose",
-  names: ["\\cancel", "\\bcancel", "\\xcancel", "\\sout"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(_ref4, args, optArgs) {
-    var parser = _ref4.parser,
-        funcName = _ref4.funcName;
-    var body = args[0];
-    return {
-      type: "enclose",
-      mode: parser.mode,
-      label: funcName,
-      body: body
-    };
-  },
-  htmlBuilder: enclose_htmlBuilder,
-  mathmlBuilder: enclose_mathmlBuilder
-});
-// CONCATENATED MODULE: ./src/defineEnvironment.js
-
-
-/**
- * All registered environments.
- * `environments.js` exports this same dictionary again and makes it public.
- * `Parser.js` requires this dictionary via `environments.js`.
- */
-var _environments = {};
-function defineEnvironment(_ref) {
-  var type = _ref.type,
-      names = _ref.names,
-      props = _ref.props,
-      handler = _ref.handler,
-      htmlBuilder = _ref.htmlBuilder,
-      mathmlBuilder = _ref.mathmlBuilder;
-  // Set default values of environments.
-  var data = {
-    type: type,
-    numArgs: props.numArgs || 0,
-    greediness: 1,
-    allowedInText: false,
-    numOptionalArgs: 0,
-    handler: handler
-  };
-
-  for (var i = 0; i < names.length; ++i) {
-    // TODO: The value type of _environments should be a type union of all
-    // possible `EnvSpec<>` possibilities instead of `EnvSpec<*>`, which is
-    // an existential type.
-    // $FlowFixMe
-    _environments[names[i]] = data;
-  }
-
-  if (htmlBuilder) {
-    _htmlGroupBuilders[type] = htmlBuilder;
-  }
-
-  if (mathmlBuilder) {
-    _mathmlGroupBuilders[type] = mathmlBuilder;
-  }
-}
-// CONCATENATED MODULE: ./src/environments/array.js
-
-
-
-
-
-
-
-
-
-
-
-
-
-function getHLines(parser) {
-  // Return an array. The array length = number of hlines.
-  // Each element in the array tells if the line is dashed.
-  var hlineInfo = [];
-  parser.consumeSpaces();
-  var nxt = parser.fetch().text;
-
-  while (nxt === "\\hline" || nxt === "\\hdashline") {
-    parser.consume();
-    hlineInfo.push(nxt === "\\hdashline");
-    parser.consumeSpaces();
-    nxt = parser.fetch().text;
-  }
-
-  return hlineInfo;
-}
-/**
- * Parse the body of the environment, with rows delimited by \\ and
- * columns delimited by &, and create a nested list in row-major order
- * with one group per cell.  If given an optional argument style
- * ("text", "display", etc.), then each cell is cast into that style.
- */
-
-
-function parseArray(parser, _ref, style) {
-  var hskipBeforeAndAfter = _ref.hskipBeforeAndAfter,
-      addJot = _ref.addJot,
-      cols = _ref.cols,
-      arraystretch = _ref.arraystretch,
-      colSeparationType = _ref.colSeparationType;
-  // Parse body of array with \\ temporarily mapped to \cr
-  parser.gullet.beginGroup();
-  parser.gullet.macros.set("\\\\", "\\cr"); // Get current arraystretch if it's not set by the environment
-
-  if (!arraystretch) {
-    var stretch = parser.gullet.expandMacroAsText("\\arraystretch");
-
-    if (stretch == null) {
-      // Default \arraystretch from lttab.dtx
-      arraystretch = 1;
-    } else {
-      arraystretch = parseFloat(stretch);
-
-      if (!arraystretch || arraystretch < 0) {
-        throw new src_ParseError("Invalid \\arraystretch: " + stretch);
-      }
-    }
-  } // Start group for first cell
-
-
-  parser.gullet.beginGroup();
-  var row = [];
-  var body = [row];
-  var rowGaps = [];
-  var hLinesBeforeRow = []; // Test for \hline at the top of the array.
-
-  hLinesBeforeRow.push(getHLines(parser));
-
-  while (true) {
-    // eslint-disable-line no-constant-condition
-    // Parse each cell in its own group (namespace)
-    var cell = parser.parseExpression(false, "\\cr");
-    parser.gullet.endGroup();
-    parser.gullet.beginGroup();
-    cell = {
-      type: "ordgroup",
-      mode: parser.mode,
-      body: cell
-    };
-
-    if (style) {
-      cell = {
-        type: "styling",
-        mode: parser.mode,
-        style: style,
-        body: [cell]
-      };
-    }
-
-    row.push(cell);
-    var next = parser.fetch().text;
-
-    if (next === "&") {
-      parser.consume();
-    } else if (next === "\\end") {
-      // Arrays terminate newlines with `\crcr` which consumes a `\cr` if
-      // the last line is empty.
-      // NOTE: Currently, `cell` is the last item added into `row`.
-      if (row.length === 1 && cell.type === "styling" && cell.body[0].body.length === 0) {
-        body.pop();
-      }
-
-      if (hLinesBeforeRow.length < body.length + 1) {
-        hLinesBeforeRow.push([]);
-      }
-
-      break;
-    } else if (next === "\\cr") {
-      var cr = assertNodeType(parser.parseFunction(), "cr");
-      rowGaps.push(cr.size); // check for \hline(s) following the row separator
-
-      hLinesBeforeRow.push(getHLines(parser));
-      row = [];
-      body.push(row);
-    } else {
-      throw new src_ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken);
-    }
-  } // End cell group
-
-
-  parser.gullet.endGroup(); // End array group defining \\
-
-  parser.gullet.endGroup();
-  return {
-    type: "array",
-    mode: parser.mode,
-    addJot: addJot,
-    arraystretch: arraystretch,
-    body: body,
-    cols: cols,
-    rowGaps: rowGaps,
-    hskipBeforeAndAfter: hskipBeforeAndAfter,
-    hLinesBeforeRow: hLinesBeforeRow,
-    colSeparationType: colSeparationType
-  };
-} // Decides on a style for cells in an array according to whether the given
-// environment name starts with the letter 'd'.
-
-
-function dCellStyle(envName) {
-  if (envName.substr(0, 1) === "d") {
-    return "display";
-  } else {
-    return "text";
-  }
-}
-
-var array_htmlBuilder = function htmlBuilder(group, options) {
-  var r;
-  var c;
-  var nr = group.body.length;
-  var hLinesBeforeRow = group.hLinesBeforeRow;
-  var nc = 0;
-  var body = new Array(nr);
-  var hlines = [];
-  var ruleThickness = Math.max( // From LaTeX \showthe\arrayrulewidth. Equals 0.04 em.
-  options.fontMetrics().arrayRuleWidth, options.minRuleThickness // User override.
-  ); // Horizontal spacing
-
-  var pt = 1 / options.fontMetrics().ptPerEm;
-  var arraycolsep = 5 * pt; // default value, i.e. \arraycolsep in article.cls
-
-  if (group.colSeparationType && group.colSeparationType === "small") {
-    // We're in a {smallmatrix}. Default column space is \thickspace,
-    // i.e. 5/18em = 0.2778em, per amsmath.dtx for {smallmatrix}.
-    // But that needs adjustment because LaTeX applies \scriptstyle to the
-    // entire array, including the colspace, but this function applies
-    // \scriptstyle only inside each element.
-    var localMultiplier = options.havingStyle(src_Style.SCRIPT).sizeMultiplier;
-    arraycolsep = 0.2778 * (localMultiplier / options.sizeMultiplier);
-  } // Vertical spacing
-
-
-  var baselineskip = 12 * pt; // see size10.clo
-  // Default \jot from ltmath.dtx
-  // TODO(edemaine): allow overriding \jot via \setlength (#687)
-
-  var jot = 3 * pt;
-  var arrayskip = group.arraystretch * baselineskip;
-  var arstrutHeight = 0.7 * arrayskip; // \strutbox in ltfsstrc.dtx and
-
-  var arstrutDepth = 0.3 * arrayskip; // \@arstrutbox in lttab.dtx
-
-  var totalHeight = 0; // Set a position for \hline(s) at the top of the array, if any.
-
-  function setHLinePos(hlinesInGap) {
-    for (var i = 0; i < hlinesInGap.length; ++i) {
-      if (i > 0) {
-        totalHeight += 0.25;
-      }
-
-      hlines.push({
-        pos: totalHeight,
-        isDashed: hlinesInGap[i]
-      });
-    }
-  }
-
-  setHLinePos(hLinesBeforeRow[0]);
-
-  for (r = 0; r < group.body.length; ++r) {
-    var inrow = group.body[r];
-    var height = arstrutHeight; // \@array adds an \@arstrut
-
-    var depth = arstrutDepth; // to each tow (via the template)
-
-    if (nc < inrow.length) {
-      nc = inrow.length;
-    }
-
-    var outrow = new Array(inrow.length);
-
-    for (c = 0; c < inrow.length; ++c) {
-      var elt = buildHTML_buildGroup(inrow[c], options);
-
-      if (depth < elt.depth) {
-        depth = elt.depth;
-      }
-
-      if (height < elt.height) {
-        height = elt.height;
-      }
-
-      outrow[c] = elt;
-    }
-
-    var rowGap = group.rowGaps[r];
-    var gap = 0;
-
-    if (rowGap) {
-      gap = units_calculateSize(rowGap, options);
-
-      if (gap > 0) {
-        // \@argarraycr
-        gap += arstrutDepth;
-
-        if (depth < gap) {
-          depth = gap; // \@xargarraycr
-        }
-
-        gap = 0;
-      }
-    } // In AMS multiline environments such as aligned and gathered, rows
-    // correspond to lines that have additional \jot added to the
-    // \baselineskip via \openup.
-
-
-    if (group.addJot) {
-      depth += jot;
-    }
-
-    outrow.height = height;
-    outrow.depth = depth;
-    totalHeight += height;
-    outrow.pos = totalHeight;
-    totalHeight += depth + gap; // \@yargarraycr
-
-    body[r] = outrow; // Set a position for \hline(s), if any.
-
-    setHLinePos(hLinesBeforeRow[r + 1]);
-  }
-
-  var offset = totalHeight / 2 + options.fontMetrics().axisHeight;
-  var colDescriptions = group.cols || [];
-  var cols = [];
-  var colSep;
-  var colDescrNum;
-
-  for (c = 0, colDescrNum = 0; // Continue while either there are more columns or more column
-  // descriptions, so trailing separators don't get lost.
-  c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) {
-    var colDescr = colDescriptions[colDescrNum] || {};
-    var firstSeparator = true;
-
-    while (colDescr.type === "separator") {
-      // If there is more than one separator in a row, add a space
-      // between them.
-      if (!firstSeparator) {
-        colSep = buildCommon.makeSpan(["arraycolsep"], []);
-        colSep.style.width = options.fontMetrics().doubleRuleSep + "em";
-        cols.push(colSep);
-      }
-
-      if (colDescr.separator === "|" || colDescr.separator === ":") {
-        var lineType = colDescr.separator === "|" ? "solid" : "dashed";
-        var separator = buildCommon.makeSpan(["vertical-separator"], [], options);
-        separator.style.height = totalHeight + "em";
-        separator.style.borderRightWidth = ruleThickness + "em";
-        separator.style.borderRightStyle = lineType;
-        separator.style.margin = "0 -" + ruleThickness / 2 + "em";
-        separator.style.verticalAlign = -(totalHeight - offset) + "em";
-        cols.push(separator);
-      } else {
-        throw new src_ParseError("Invalid separator type: " + colDescr.separator);
-      }
-
-      colDescrNum++;
-      colDescr = colDescriptions[colDescrNum] || {};
-      firstSeparator = false;
-    }
-
-    if (c >= nc) {
-      continue;
-    }
-
-    var sepwidth = void 0;
-
-    if (c > 0 || group.hskipBeforeAndAfter) {
-      sepwidth = utils.deflt(colDescr.pregap, arraycolsep);
-
-      if (sepwidth !== 0) {
-        colSep = buildCommon.makeSpan(["arraycolsep"], []);
-        colSep.style.width = sepwidth + "em";
-        cols.push(colSep);
-      }
-    }
-
-    var col = [];
-
-    for (r = 0; r < nr; ++r) {
-      var row = body[r];
-      var elem = row[c];
-
-      if (!elem) {
-        continue;
-      }
-
-      var shift = row.pos - offset;
-      elem.depth = row.depth;
-      elem.height = row.height;
-      col.push({
-        type: "elem",
-        elem: elem,
-        shift: shift
-      });
-    }
-
-    col = buildCommon.makeVList({
-      positionType: "individualShift",
-      children: col
-    }, options);
-    col = buildCommon.makeSpan(["col-align-" + (colDescr.align || "c")], [col]);
-    cols.push(col);
-
-    if (c < nc - 1 || group.hskipBeforeAndAfter) {
-      sepwidth = utils.deflt(colDescr.postgap, arraycolsep);
-
-      if (sepwidth !== 0) {
-        colSep = buildCommon.makeSpan(["arraycolsep"], []);
-        colSep.style.width = sepwidth + "em";
-        cols.push(colSep);
-      }
-    }
-  }
-
-  body = buildCommon.makeSpan(["mtable"], cols); // Add \hline(s), if any.
-
-  if (hlines.length > 0) {
-    var line = buildCommon.makeLineSpan("hline", options, ruleThickness);
-    var dashes = buildCommon.makeLineSpan("hdashline", options, ruleThickness);
-    var vListElems = [{
-      type: "elem",
-      elem: body,
-      shift: 0
-    }];
-
-    while (hlines.length > 0) {
-      var hline = hlines.pop();
-      var lineShift = hline.pos - offset;
-
-      if (hline.isDashed) {
-        vListElems.push({
-          type: "elem",
-          elem: dashes,
-          shift: lineShift
-        });
-      } else {
-        vListElems.push({
-          type: "elem",
-          elem: line,
-          shift: lineShift
-        });
-      }
-    }
-
-    body = buildCommon.makeVList({
-      positionType: "individualShift",
-      children: vListElems
-    }, options);
-  }
-
-  return buildCommon.makeSpan(["mord"], [body], options);
-};
-
-var alignMap = {
-  c: "center ",
-  l: "left ",
-  r: "right "
-};
-
-var array_mathmlBuilder = function mathmlBuilder(group, options) {
-  var table = new mathMLTree.MathNode("mtable", group.body.map(function (row) {
-    return new mathMLTree.MathNode("mtr", row.map(function (cell) {
-      return new mathMLTree.MathNode("mtd", [buildMathML_buildGroup(cell, options)]);
-    }));
-  })); // Set column alignment, row spacing, column spacing, and
-  // array lines by setting attributes on the table element.
-  // Set the row spacing. In MathML, we specify a gap distance.
-  // We do not use rowGap[] because MathML automatically increases
-  // cell height with the height/depth of the element content.
-  // LaTeX \arraystretch multiplies the row baseline-to-baseline distance.
-  // We simulate this by adding (arraystretch - 1)em to the gap. This
-  // does a reasonable job of adjusting arrays containing 1 em tall content.
-  // The 0.16 and 0.09 values are found emprically. They produce an array
-  // similar to LaTeX and in which content does not interfere with \hines.
-
-  var gap = group.arraystretch === 0.5 ? 0.1 // {smallmatrix}, {subarray}
-  : 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0);
-  table.setAttribute("rowspacing", gap + "em"); // MathML table lines go only between cells.
-  // To place a line on an edge we'll use <menclose>, if necessary.
-
-  var menclose = "";
-  var align = "";
-
-  if (group.cols) {
-    // Find column alignment, column spacing, and  vertical lines.
-    var cols = group.cols;
-    var columnLines = "";
-    var prevTypeWasAlign = false;
-    var iStart = 0;
-    var iEnd = cols.length;
-
-    if (cols[0].type === "separator") {
-      menclose += "top ";
-      iStart = 1;
-    }
-
-    if (cols[cols.length - 1].type === "separator") {
-      menclose += "bottom ";
-      iEnd -= 1;
-    }
-
-    for (var i = iStart; i < iEnd; i++) {
-      if (cols[i].type === "align") {
-        align += alignMap[cols[i].align];
-
-        if (prevTypeWasAlign) {
-          columnLines += "none ";
-        }
-
-        prevTypeWasAlign = true;
-      } else if (cols[i].type === "separator") {
-        // MathML accepts only single lines between cells.
-        // So we read only the first of consecutive separators.
-        if (prevTypeWasAlign) {
-          columnLines += cols[i].separator === "|" ? "solid " : "dashed ";
-          prevTypeWasAlign = false;
-        }
-      }
-    }
-
-    table.setAttribute("columnalign", align.trim());
-
-    if (/[sd]/.test(columnLines)) {
-      table.setAttribute("columnlines", columnLines.trim());
-    }
-  } // Set column spacing.
-
-
-  if (group.colSeparationType === "align") {
-    var _cols = group.cols || [];
-
-    var spacing = "";
-
-    for (var _i = 1; _i < _cols.length; _i++) {
-      spacing += _i % 2 ? "0em " : "1em ";
-    }
-
-    table.setAttribute("columnspacing", spacing.trim());
-  } else if (group.colSeparationType === "alignat") {
-    table.setAttribute("columnspacing", "0em");
-  } else if (group.colSeparationType === "small") {
-    table.setAttribute("columnspacing", "0.2778em");
-  } else {
-    table.setAttribute("columnspacing", "1em");
-  } // Address \hline and \hdashline
-
-
-  var rowLines = "";
-  var hlines = group.hLinesBeforeRow;
-  menclose += hlines[0].length > 0 ? "left " : "";
-  menclose += hlines[hlines.length - 1].length > 0 ? "right " : "";
-
-  for (var _i2 = 1; _i2 < hlines.length - 1; _i2++) {
-    rowLines += hlines[_i2].length === 0 ? "none " // MathML accepts only a single line between rows. Read one element.
-    : hlines[_i2][0] ? "dashed " : "solid ";
-  }
-
-  if (/[sd]/.test(rowLines)) {
-    table.setAttribute("rowlines", rowLines.trim());
-  }
-
-  if (menclose !== "") {
-    table = new mathMLTree.MathNode("menclose", [table]);
-    table.setAttribute("notation", menclose.trim());
-  }
-
-  if (group.arraystretch && group.arraystretch < 1) {
-    // A small array. Wrap in scriptstyle so row gap is not too large.
-    table = new mathMLTree.MathNode("mstyle", [table]);
-    table.setAttribute("scriptlevel", "1");
-  }
-
-  return table;
-}; // Convenience function for aligned and alignedat environments.
-
-
-var array_alignedHandler = function alignedHandler(context, args) {
-  var cols = [];
-  var res = parseArray(context.parser, {
-    cols: cols,
-    addJot: true
-  }, "display"); // Determining number of columns.
-  // 1. If the first argument is given, we use it as a number of columns,
-  //    and makes sure that each row doesn't exceed that number.
-  // 2. Otherwise, just count number of columns = maximum number
-  //    of cells in each row ("aligned" mode -- isAligned will be true).
-  //
-  // At the same time, prepend empty group {} at beginning of every second
-  // cell in each row (starting with second cell) so that operators become
-  // binary.  This behavior is implemented in amsmath's \start@aligned.
-
-  var numMaths;
-  var numCols = 0;
-  var emptyGroup = {
-    type: "ordgroup",
-    mode: context.mode,
-    body: []
-  };
-  var ordgroup = checkNodeType(args[0], "ordgroup");
-
-  if (ordgroup) {
-    var arg0 = "";
-
-    for (var i = 0; i < ordgroup.body.length; i++) {
-      var textord = assertNodeType(ordgroup.body[i], "textord");
-      arg0 += textord.text;
-    }
-
-    numMaths = Number(arg0);
-    numCols = numMaths * 2;
-  }
-
-  var isAligned = !numCols;
-  res.body.forEach(function (row) {
-    for (var _i3 = 1; _i3 < row.length; _i3 += 2) {
-      // Modify ordgroup node within styling node
-      var styling = assertNodeType(row[_i3], "styling");
-
-      var _ordgroup = assertNodeType(styling.body[0], "ordgroup");
-
-      _ordgroup.body.unshift(emptyGroup);
-    }
-
-    if (!isAligned) {
-      // Case 1
-      var curMaths = row.length / 2;
-
-      if (numMaths < curMaths) {
-        throw new src_ParseError("Too many math in a row: " + ("expected " + numMaths + ", but got " + curMaths), row[0]);
-      }
-    } else if (numCols < row.length) {
-      // Case 2
-      numCols = row.length;
-    }
-  }); // Adjusting alignment.
-  // In aligned mode, we add one \qquad between columns;
-  // otherwise we add nothing.
-
-  for (var _i4 = 0; _i4 < numCols; ++_i4) {
-    var align = "r";
-    var pregap = 0;
-
-    if (_i4 % 2 === 1) {
-      align = "l";
-    } else if (_i4 > 0 && isAligned) {
-      // "aligned" mode.
-      pregap = 1; // add one \quad
-    }
-
-    cols[_i4] = {
-      type: "align",
-      align: align,
-      pregap: pregap,
-      postgap: 0
-    };
-  }
-
-  res.colSeparationType = isAligned ? "align" : "alignat";
-  return res;
-}; // Arrays are part of LaTeX, defined in lttab.dtx so its documentation
-// is part of the source2e.pdf file of LaTeX2e source documentation.
-// {darray} is an {array} environment where cells are set in \displaystyle,
-// as defined in nccmath.sty.
-
-
-defineEnvironment({
-  type: "array",
-  names: ["array", "darray"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(context, args) {
-    // Since no types are specified above, the two possibilities are
-    // - The argument is wrapped in {} or [], in which case Parser's
-    //   parseGroup() returns an "ordgroup" wrapping some symbol node.
-    // - The argument is a bare symbol node.
-    var symNode = checkSymbolNodeType(args[0]);
-    var colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body;
-    var cols = colalign.map(function (nde) {
-      var node = assertSymbolNodeType(nde);
-      var ca = node.text;
-
-      if ("lcr".indexOf(ca) !== -1) {
-        return {
-          type: "align",
-          align: ca
-        };
-      } else if (ca === "|") {
-        return {
-          type: "separator",
-          separator: "|"
-        };
-      } else if (ca === ":") {
-        return {
-          type: "separator",
-          separator: ":"
-        };
-      }
-
-      throw new src_ParseError("Unknown column alignment: " + ca, nde);
-    });
-    var res = {
-      cols: cols,
-      hskipBeforeAndAfter: true // \@preamble in lttab.dtx
-
-    };
-    return parseArray(context.parser, res, dCellStyle(context.envName));
-  },
-  htmlBuilder: array_htmlBuilder,
-  mathmlBuilder: array_mathmlBuilder
-}); // The matrix environments of amsmath builds on the array environment
-// of LaTeX, which is discussed above.
-
-defineEnvironment({
-  type: "array",
-  names: ["matrix", "pmatrix", "bmatrix", "Bmatrix", "vmatrix", "Vmatrix"],
-  props: {
-    numArgs: 0
-  },
-  handler: function handler(context) {
-    var delimiters = {
-      "matrix": null,
-      "pmatrix": ["(", ")"],
-      "bmatrix": ["[", "]"],
-      "Bmatrix": ["\\{", "\\}"],
-      "vmatrix": ["|", "|"],
-      "Vmatrix": ["\\Vert", "\\Vert"]
-    }[context.envName]; // \hskip -\arraycolsep in amsmath
-
-    var payload = {
-      hskipBeforeAndAfter: false
-    };
-    var res = parseArray(context.parser, payload, dCellStyle(context.envName));
-    return delimiters ? {
-      type: "leftright",
-      mode: context.mode,
-      body: [res],
-      left: delimiters[0],
-      right: delimiters[1],
-      rightColor: undefined // \right uninfluenced by \color in array
-
-    } : res;
-  },
-  htmlBuilder: array_htmlBuilder,
-  mathmlBuilder: array_mathmlBuilder
-});
-defineEnvironment({
-  type: "array",
-  names: ["smallmatrix"],
-  props: {
-    numArgs: 0
-  },
-  handler: function handler(context) {
-    var payload = {
-      arraystretch: 0.5
-    };
-    var res = parseArray(context.parser, payload, "script");
-    res.colSeparationType = "small";
-    return res;
-  },
-  htmlBuilder: array_htmlBuilder,
-  mathmlBuilder: array_mathmlBuilder
-});
-defineEnvironment({
-  type: "array",
-  names: ["subarray"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(context, args) {
-    // Parsing of {subarray} is similar to {array}
-    var symNode = checkSymbolNodeType(args[0]);
-    var colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body;
-    var cols = colalign.map(function (nde) {
-      var node = assertSymbolNodeType(nde);
-      var ca = node.text; // {subarray} only recognizes "l" & "c"
-
-      if ("lc".indexOf(ca) !== -1) {
-        return {
-          type: "align",
-          align: ca
-        };
-      }
-
-      throw new src_ParseError("Unknown column alignment: " + ca, nde);
-    });
-
-    if (cols.length > 1) {
-      throw new src_ParseError("{subarray} can contain only one column");
-    }
-
-    var res = {
-      cols: cols,
-      hskipBeforeAndAfter: false,
-      arraystretch: 0.5
-    };
-    res = parseArray(context.parser, res, "script");
-
-    if (res.body[0].length > 1) {
-      throw new src_ParseError("{subarray} can contain only one column");
-    }
-
-    return res;
-  },
-  htmlBuilder: array_htmlBuilder,
-  mathmlBuilder: array_mathmlBuilder
-}); // A cases environment (in amsmath.sty) is almost equivalent to
-// \def\arraystretch{1.2}%
-// \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right.
-// {dcases} is a {cases} environment where cells are set in \displaystyle,
-// as defined in mathtools.sty.
-
-defineEnvironment({
-  type: "array",
-  names: ["cases", "dcases"],
-  props: {
-    numArgs: 0
-  },
-  handler: function handler(context) {
-    var payload = {
-      arraystretch: 1.2,
-      cols: [{
-        type: "align",
-        align: "l",
-        pregap: 0,
-        // TODO(kevinb) get the current style.
-        // For now we use the metrics for TEXT style which is what we were
-        // doing before.  Before attempting to get the current style we
-        // should look at TeX's behavior especially for \over and matrices.
-        postgap: 1.0
-        /* 1em quad */
-
-      }, {
-        type: "align",
-        align: "l",
-        pregap: 0,
-        postgap: 0
-      }]
-    };
-    var res = parseArray(context.parser, payload, dCellStyle(context.envName));
-    return {
-      type: "leftright",
-      mode: context.mode,
-      body: [res],
-      left: "\\{",
-      right: ".",
-      rightColor: undefined
-    };
-  },
-  htmlBuilder: array_htmlBuilder,
-  mathmlBuilder: array_mathmlBuilder
-}); // An aligned environment is like the align* environment
-// except it operates within math mode.
-// Note that we assume \nomallineskiplimit to be zero,
-// so that \strut@ is the same as \strut.
-
-defineEnvironment({
-  type: "array",
-  names: ["aligned"],
-  props: {
-    numArgs: 0
-  },
-  handler: array_alignedHandler,
-  htmlBuilder: array_htmlBuilder,
-  mathmlBuilder: array_mathmlBuilder
-}); // A gathered environment is like an array environment with one centered
-// column, but where rows are considered lines so get \jot line spacing
-// and contents are set in \displaystyle.
-
-defineEnvironment({
-  type: "array",
-  names: ["gathered"],
-  props: {
-    numArgs: 0
-  },
-  handler: function handler(context) {
-    var res = {
-      cols: [{
-        type: "align",
-        align: "c"
-      }],
-      addJot: true
-    };
-    return parseArray(context.parser, res, "display");
-  },
-  htmlBuilder: array_htmlBuilder,
-  mathmlBuilder: array_mathmlBuilder
-}); // alignat environment is like an align environment, but one must explicitly
-// specify maximum number of columns in each row, and can adjust spacing between
-// each columns.
-
-defineEnvironment({
-  type: "array",
-  names: ["alignedat"],
-  // One for numbered and for unnumbered;
-  // but, KaTeX doesn't supports math numbering yet,
-  // they make no difference for now.
-  props: {
-    numArgs: 1
-  },
-  handler: array_alignedHandler,
-  htmlBuilder: array_htmlBuilder,
-  mathmlBuilder: array_mathmlBuilder
-}); // Catch \hline outside array environment
-
-defineFunction({
-  type: "text",
-  // Doesn't matter what this is.
-  names: ["\\hline", "\\hdashline"],
-  props: {
-    numArgs: 0,
-    allowedInText: true,
-    allowedInMath: true
-  },
-  handler: function handler(context, args) {
-    throw new src_ParseError(context.funcName + " valid only within array environment");
-  }
-});
-// CONCATENATED MODULE: ./src/environments.js
-
-var environments = _environments;
-/* harmony default export */ var src_environments = (environments); // All environment definitions should be imported below
-
-
-// CONCATENATED MODULE: ./src/functions/environment.js
-
-
-
- // Environment delimiters. HTML/MathML rendering is defined in the corresponding
-// defineEnvironment definitions.
-// $FlowFixMe, "environment" handler returns an environment ParseNode
-
-defineFunction({
-  type: "environment",
-  names: ["\\begin", "\\end"],
-  props: {
-    numArgs: 1,
-    argTypes: ["text"]
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    var nameGroup = args[0];
-
-    if (nameGroup.type !== "ordgroup") {
-      throw new src_ParseError("Invalid environment name", nameGroup);
-    }
-
-    var envName = "";
-
-    for (var i = 0; i < nameGroup.body.length; ++i) {
-      envName += assertNodeType(nameGroup.body[i], "textord").text;
-    }
-
-    if (funcName === "\\begin") {
-      // begin...end is similar to left...right
-      if (!src_environments.hasOwnProperty(envName)) {
-        throw new src_ParseError("No such environment: " + envName, nameGroup);
-      } // Build the environment object. Arguments and other information will
-      // be made available to the begin and end methods using properties.
-
-
-      var env = src_environments[envName];
-
-      var _parser$parseArgument = parser.parseArguments("\\begin{" + envName + "}", env),
-          _args = _parser$parseArgument.args,
-          optArgs = _parser$parseArgument.optArgs;
-
-      var context = {
-        mode: parser.mode,
-        envName: envName,
-        parser: parser
-      };
-      var result = env.handler(context, _args, optArgs);
-      parser.expect("\\end", false);
-      var endNameToken = parser.nextToken;
-      var end = assertNodeType(parser.parseFunction(), "environment");
-
-      if (end.name !== envName) {
-        throw new src_ParseError("Mismatch: \\begin{" + envName + "} matched by \\end{" + end.name + "}", endNameToken);
-      }
-
-      return result;
-    }
-
-    return {
-      type: "environment",
-      mode: parser.mode,
-      name: envName,
-      nameGroup: nameGroup
-    };
-  }
-});
-// CONCATENATED MODULE: ./src/functions/mclass.js
-
-
-
-
-
-
-var mclass_makeSpan = buildCommon.makeSpan;
-
-function mclass_htmlBuilder(group, options) {
-  var elements = buildHTML_buildExpression(group.body, options, true);
-  return mclass_makeSpan([group.mclass], elements, options);
-}
-
-function mclass_mathmlBuilder(group, options) {
-  var node;
-  var inner = buildMathML_buildExpression(group.body, options);
-
-  if (group.mclass === "minner") {
-    return mathMLTree.newDocumentFragment(inner);
-  } else if (group.mclass === "mord") {
-    if (group.isCharacterBox) {
-      node = inner[0];
-      node.type = "mi";
-    } else {
-      node = new mathMLTree.MathNode("mi", inner);
-    }
-  } else {
-    if (group.isCharacterBox) {
-      node = inner[0];
-      node.type = "mo";
-    } else {
-      node = new mathMLTree.MathNode("mo", inner);
-    } // Set spacing based on what is the most likely adjacent atom type.
-    // See TeXbook p170.
-
-
-    if (group.mclass === "mbin") {
-      node.attributes.lspace = "0.22em"; // medium space
-
-      node.attributes.rspace = "0.22em";
-    } else if (group.mclass === "mpunct") {
-      node.attributes.lspace = "0em";
-      node.attributes.rspace = "0.17em"; // thinspace
-    } else if (group.mclass === "mopen" || group.mclass === "mclose") {
-      node.attributes.lspace = "0em";
-      node.attributes.rspace = "0em";
-    } // MathML <mo> default space is 5/18 em, so <mrel> needs no action.
-    // Ref: https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo
-
-  }
-
-  return node;
-} // Math class commands except \mathop
-
-
-defineFunction({
-  type: "mclass",
-  names: ["\\mathord", "\\mathbin", "\\mathrel", "\\mathopen", "\\mathclose", "\\mathpunct", "\\mathinner"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    var body = args[0];
-    return {
-      type: "mclass",
-      mode: parser.mode,
-      mclass: "m" + funcName.substr(5),
-      // TODO(kevinb): don't prefix with 'm'
-      body: defineFunction_ordargument(body),
-      isCharacterBox: utils.isCharacterBox(body)
-    };
-  },
-  htmlBuilder: mclass_htmlBuilder,
-  mathmlBuilder: mclass_mathmlBuilder
-});
-var binrelClass = function binrelClass(arg) {
-  // \binrel@ spacing varies with (bin|rel|ord) of the atom in the argument.
-  // (by rendering separately and with {}s before and after, and measuring
-  // the change in spacing).  We'll do roughly the same by detecting the
-  // atom type directly.
-  var atom = arg.type === "ordgroup" && arg.body.length ? arg.body[0] : arg;
-
-  if (atom.type === "atom" && (atom.family === "bin" || atom.family === "rel")) {
-    return "m" + atom.family;
-  } else {
-    return "mord";
-  }
-}; // \@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord.
-// This is equivalent to \binrel@{x}\binrel@@{y} in AMSTeX.
-
-defineFunction({
-  type: "mclass",
-  names: ["\\@binrel"],
-  props: {
-    numArgs: 2
-  },
-  handler: function handler(_ref2, args) {
-    var parser = _ref2.parser;
-    return {
-      type: "mclass",
-      mode: parser.mode,
-      mclass: binrelClass(args[0]),
-      body: [args[1]],
-      isCharacterBox: utils.isCharacterBox(args[1])
-    };
-  }
-}); // Build a relation or stacked op by placing one symbol on top of another
-
-defineFunction({
-  type: "mclass",
-  names: ["\\stackrel", "\\overset", "\\underset"],
-  props: {
-    numArgs: 2
-  },
-  handler: function handler(_ref3, args) {
-    var parser = _ref3.parser,
-        funcName = _ref3.funcName;
-    var baseArg = args[1];
-    var shiftedArg = args[0];
-    var mclass;
-
-    if (funcName !== "\\stackrel") {
-      // LaTeX applies \binrel spacing to \overset and \underset.
-      mclass = binrelClass(baseArg);
-    } else {
-      mclass = "mrel"; // for \stackrel
-    }
-
-    var baseOp = {
-      type: "op",
-      mode: baseArg.mode,
-      limits: true,
-      alwaysHandleSupSub: true,
-      parentIsSupSub: false,
-      symbol: false,
-      suppressBaseShift: funcName !== "\\stackrel",
-      body: defineFunction_ordargument(baseArg)
-    };
-    var supsub = {
-      type: "supsub",
-      mode: shiftedArg.mode,
-      base: baseOp,
-      sup: funcName === "\\underset" ? null : shiftedArg,
-      sub: funcName === "\\underset" ? shiftedArg : null
-    };
-    return {
-      type: "mclass",
-      mode: parser.mode,
-      mclass: mclass,
-      body: [supsub],
-      isCharacterBox: utils.isCharacterBox(supsub)
-    };
-  },
-  htmlBuilder: mclass_htmlBuilder,
-  mathmlBuilder: mclass_mathmlBuilder
-});
-// CONCATENATED MODULE: ./src/functions/font.js
-// TODO(kevinb): implement \\sl and \\sc
-
-
-
-
-
-
-var font_htmlBuilder = function htmlBuilder(group, options) {
-  var font = group.font;
-  var newOptions = options.withFont(font);
-  return buildHTML_buildGroup(group.body, newOptions);
-};
-
-var font_mathmlBuilder = function mathmlBuilder(group, options) {
-  var font = group.font;
-  var newOptions = options.withFont(font);
-  return buildMathML_buildGroup(group.body, newOptions);
-};
-
-var fontAliases = {
-  "\\Bbb": "\\mathbb",
-  "\\bold": "\\mathbf",
-  "\\frak": "\\mathfrak",
-  "\\bm": "\\boldsymbol"
-};
-defineFunction({
-  type: "font",
-  names: [// styles, except \boldsymbol defined below
-  "\\mathrm", "\\mathit", "\\mathbf", "\\mathnormal", // families
-  "\\mathbb", "\\mathcal", "\\mathfrak", "\\mathscr", "\\mathsf", "\\mathtt", // aliases, except \bm defined below
-  "\\Bbb", "\\bold", "\\frak"],
-  props: {
-    numArgs: 1,
-    greediness: 2
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    var body = args[0];
-    var func = funcName;
-
-    if (func in fontAliases) {
-      func = fontAliases[func];
-    }
-
-    return {
-      type: "font",
-      mode: parser.mode,
-      font: func.slice(1),
-      body: body
-    };
-  },
-  htmlBuilder: font_htmlBuilder,
-  mathmlBuilder: font_mathmlBuilder
-});
-defineFunction({
-  type: "mclass",
-  names: ["\\boldsymbol", "\\bm"],
-  props: {
-    numArgs: 1,
-    greediness: 2
-  },
-  handler: function handler(_ref2, args) {
-    var parser = _ref2.parser;
-    var body = args[0];
-    var isCharacterBox = utils.isCharacterBox(body); // amsbsy.sty's \boldsymbol uses \binrel spacing to inherit the
-    // argument's bin|rel|ord status
-
-    return {
-      type: "mclass",
-      mode: parser.mode,
-      mclass: binrelClass(body),
-      body: [{
-        type: "font",
-        mode: parser.mode,
-        font: "boldsymbol",
-        body: body
-      }],
-      isCharacterBox: isCharacterBox
-    };
-  }
-}); // Old font changing functions
-
-defineFunction({
-  type: "font",
-  names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it"],
-  props: {
-    numArgs: 0,
-    allowedInText: true
-  },
-  handler: function handler(_ref3, args) {
-    var parser = _ref3.parser,
-        funcName = _ref3.funcName,
-        breakOnTokenText = _ref3.breakOnTokenText;
-    var mode = parser.mode;
-    var body = parser.parseExpression(true, breakOnTokenText);
-    var style = "math" + funcName.slice(1);
-    return {
-      type: "font",
-      mode: mode,
-      font: style,
-      body: {
-        type: "ordgroup",
-        mode: parser.mode,
-        body: body
-      }
-    };
-  },
-  htmlBuilder: font_htmlBuilder,
-  mathmlBuilder: font_mathmlBuilder
-});
-// CONCATENATED MODULE: ./src/functions/genfrac.js
-
-
-
-
-
-
-
-
-
-
-
-var genfrac_adjustStyle = function adjustStyle(size, originalStyle) {
-  // Figure out what style this fraction should be in based on the
-  // function used
-  var style = originalStyle;
-
-  if (size === "display") {
-    // Get display style as a default.
-    // If incoming style is sub/sup, use style.text() to get correct size.
-    style = style.id >= src_Style.SCRIPT.id ? style.text() : src_Style.DISPLAY;
-  } else if (size === "text" && style.size === src_Style.DISPLAY.size) {
-    // We're in a \tfrac but incoming style is displaystyle, so:
-    style = src_Style.TEXT;
-  } else if (size === "script") {
-    style = src_Style.SCRIPT;
-  } else if (size === "scriptscript") {
-    style = src_Style.SCRIPTSCRIPT;
-  }
-
-  return style;
-};
-
-var genfrac_htmlBuilder = function htmlBuilder(group, options) {
-  // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e).
-  var style = genfrac_adjustStyle(group.size, options.style);
-  var nstyle = style.fracNum();
-  var dstyle = style.fracDen();
-  var newOptions;
-  newOptions = options.havingStyle(nstyle);
-  var numerm = buildHTML_buildGroup(group.numer, newOptions, options);
-
-  if (group.continued) {
-    // \cfrac inserts a \strut into the numerator.
-    // Get \strut dimensions from TeXbook page 353.
-    var hStrut = 8.5 / options.fontMetrics().ptPerEm;
-    var dStrut = 3.5 / options.fontMetrics().ptPerEm;
-    numerm.height = numerm.height < hStrut ? hStrut : numerm.height;
-    numerm.depth = numerm.depth < dStrut ? dStrut : numerm.depth;
-  }
-
-  newOptions = options.havingStyle(dstyle);
-  var denomm = buildHTML_buildGroup(group.denom, newOptions, options);
-  var rule;
-  var ruleWidth;
-  var ruleSpacing;
-
-  if (group.hasBarLine) {
-    if (group.barSize) {
-      ruleWidth = units_calculateSize(group.barSize, options);
-      rule = buildCommon.makeLineSpan("frac-line", options, ruleWidth);
-    } else {
-      rule = buildCommon.makeLineSpan("frac-line", options);
-    }
-
-    ruleWidth = rule.height;
-    ruleSpacing = rule.height;
-  } else {
-    rule = null;
-    ruleWidth = 0;
-    ruleSpacing = options.fontMetrics().defaultRuleThickness;
-  } // Rule 15b
-
-
-  var numShift;
-  var clearance;
-  var denomShift;
-
-  if (style.size === src_Style.DISPLAY.size || group.size === "display") {
-    numShift = options.fontMetrics().num1;
-
-    if (ruleWidth > 0) {
-      clearance = 3 * ruleSpacing;
-    } else {
-      clearance = 7 * ruleSpacing;
-    }
-
-    denomShift = options.fontMetrics().denom1;
-  } else {
-    if (ruleWidth > 0) {
-      numShift = options.fontMetrics().num2;
-      clearance = ruleSpacing;
-    } else {
-      numShift = options.fontMetrics().num3;
-      clearance = 3 * ruleSpacing;
-    }
-
-    denomShift = options.fontMetrics().denom2;
-  }
-
-  var frac;
-
-  if (!rule) {
-    // Rule 15c
-    var candidateClearance = numShift - numerm.depth - (denomm.height - denomShift);
-
-    if (candidateClearance < clearance) {
-      numShift += 0.5 * (clearance - candidateClearance);
-      denomShift += 0.5 * (clearance - candidateClearance);
-    }
-
-    frac = buildCommon.makeVList({
-      positionType: "individualShift",
-      children: [{
-        type: "elem",
-        elem: denomm,
-        shift: denomShift
-      }, {
-        type: "elem",
-        elem: numerm,
-        shift: -numShift
-      }]
-    }, options);
-  } else {
-    // Rule 15d
-    var axisHeight = options.fontMetrics().axisHeight;
-
-    if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) {
-      numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth));
-    }
-
-    if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) {
-      denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift));
-    }
-
-    var midShift = -(axisHeight - 0.5 * ruleWidth);
-    frac = buildCommon.makeVList({
-      positionType: "individualShift",
-      children: [{
-        type: "elem",
-        elem: denomm,
-        shift: denomShift
-      }, {
-        type: "elem",
-        elem: rule,
-        shift: midShift
-      }, {
-        type: "elem",
-        elem: numerm,
-        shift: -numShift
-      }]
-    }, options);
-  } // Since we manually change the style sometimes (with \dfrac or \tfrac),
-  // account for the possible size change here.
-
-
-  newOptions = options.havingStyle(style);
-  frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier;
-  frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier; // Rule 15e
-
-  var delimSize;
-
-  if (style.size === src_Style.DISPLAY.size) {
-    delimSize = options.fontMetrics().delim1;
-  } else {
-    delimSize = options.fontMetrics().delim2;
-  }
-
-  var leftDelim;
-  var rightDelim;
-
-  if (group.leftDelim == null) {
-    leftDelim = makeNullDelimiter(options, ["mopen"]);
-  } else {
-    leftDelim = delimiter.customSizedDelim(group.leftDelim, delimSize, true, options.havingStyle(style), group.mode, ["mopen"]);
-  }
-
-  if (group.continued) {
-    rightDelim = buildCommon.makeSpan([]); // zero width for \cfrac
-  } else if (group.rightDelim == null) {
-    rightDelim = makeNullDelimiter(options, ["mclose"]);
-  } else {
-    rightDelim = delimiter.customSizedDelim(group.rightDelim, delimSize, true, options.havingStyle(style), group.mode, ["mclose"]);
-  }
-
-  return buildCommon.makeSpan(["mord"].concat(newOptions.sizingClasses(options)), [leftDelim, buildCommon.makeSpan(["mfrac"], [frac]), rightDelim], options);
-};
-
-var genfrac_mathmlBuilder = function mathmlBuilder(group, options) {
-  var node = new mathMLTree.MathNode("mfrac", [buildMathML_buildGroup(group.numer, options), buildMathML_buildGroup(group.denom, options)]);
-
-  if (!group.hasBarLine) {
-    node.setAttribute("linethickness", "0px");
-  } else if (group.barSize) {
-    var ruleWidth = units_calculateSize(group.barSize, options);
-    node.setAttribute("linethickness", ruleWidth + "em");
-  }
-
-  var style = genfrac_adjustStyle(group.size, options.style);
-
-  if (style.size !== options.style.size) {
-    node = new mathMLTree.MathNode("mstyle", [node]);
-    var isDisplay = style.size === src_Style.DISPLAY.size ? "true" : "false";
-    node.setAttribute("displaystyle", isDisplay);
-    node.setAttribute("scriptlevel", "0");
-  }
-
-  if (group.leftDelim != null || group.rightDelim != null) {
-    var withDelims = [];
-
-    if (group.leftDelim != null) {
-      var leftOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.leftDelim.replace("\\", ""))]);
-      leftOp.setAttribute("fence", "true");
-      withDelims.push(leftOp);
-    }
-
-    withDelims.push(node);
-
-    if (group.rightDelim != null) {
-      var rightOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.rightDelim.replace("\\", ""))]);
-      rightOp.setAttribute("fence", "true");
-      withDelims.push(rightOp);
-    }
-
-    return buildMathML_makeRow(withDelims);
-  }
-
-  return node;
-};
-
-defineFunction({
-  type: "genfrac",
-  names: ["\\cfrac", "\\dfrac", "\\frac", "\\tfrac", "\\dbinom", "\\binom", "\\tbinom", "\\\\atopfrac", // can’t be entered directly
-  "\\\\bracefrac", "\\\\brackfrac"],
-  props: {
-    numArgs: 2,
-    greediness: 2
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    var numer = args[0];
-    var denom = args[1];
-    var hasBarLine;
-    var leftDelim = null;
-    var rightDelim = null;
-    var size = "auto";
-
-    switch (funcName) {
-      case "\\cfrac":
-      case "\\dfrac":
-      case "\\frac":
-      case "\\tfrac":
-        hasBarLine = true;
-        break;
-
-      case "\\\\atopfrac":
-        hasBarLine = false;
-        break;
-
-      case "\\dbinom":
-      case "\\binom":
-      case "\\tbinom":
-        hasBarLine = false;
-        leftDelim = "(";
-        rightDelim = ")";
-        break;
-
-      case "\\\\bracefrac":
-        hasBarLine = false;
-        leftDelim = "\\{";
-        rightDelim = "\\}";
-        break;
-
-      case "\\\\brackfrac":
-        hasBarLine = false;
-        leftDelim = "[";
-        rightDelim = "]";
-        break;
-
-      default:
-        throw new Error("Unrecognized genfrac command");
-    }
-
-    switch (funcName) {
-      case "\\cfrac":
-      case "\\dfrac":
-      case "\\dbinom":
-        size = "display";
-        break;
-
-      case "\\tfrac":
-      case "\\tbinom":
-        size = "text";
-        break;
-    }
-
-    return {
-      type: "genfrac",
-      mode: parser.mode,
-      continued: funcName === "\\cfrac",
-      numer: numer,
-      denom: denom,
-      hasBarLine: hasBarLine,
-      leftDelim: leftDelim,
-      rightDelim: rightDelim,
-      size: size,
-      barSize: null
-    };
-  },
-  htmlBuilder: genfrac_htmlBuilder,
-  mathmlBuilder: genfrac_mathmlBuilder
-}); // Infix generalized fractions -- these are not rendered directly, but replaced
-// immediately by one of the variants above.
-
-defineFunction({
-  type: "infix",
-  names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"],
-  props: {
-    numArgs: 0,
-    infix: true
-  },
-  handler: function handler(_ref2) {
-    var parser = _ref2.parser,
-        funcName = _ref2.funcName,
-        token = _ref2.token;
-    var replaceWith;
-
-    switch (funcName) {
-      case "\\over":
-        replaceWith = "\\frac";
-        break;
-
-      case "\\choose":
-        replaceWith = "\\binom";
-        break;
-
-      case "\\atop":
-        replaceWith = "\\\\atopfrac";
-        break;
-
-      case "\\brace":
-        replaceWith = "\\\\bracefrac";
-        break;
-
-      case "\\brack":
-        replaceWith = "\\\\brackfrac";
-        break;
-
-      default:
-        throw new Error("Unrecognized infix genfrac command");
-    }
-
-    return {
-      type: "infix",
-      mode: parser.mode,
-      replaceWith: replaceWith,
-      token: token
-    };
-  }
-});
-var stylArray = ["display", "text", "script", "scriptscript"];
-
-var delimFromValue = function delimFromValue(delimString) {
-  var delim = null;
-
-  if (delimString.length > 0) {
-    delim = delimString;
-    delim = delim === "." ? null : delim;
-  }
-
-  return delim;
-};
-
-defineFunction({
-  type: "genfrac",
-  names: ["\\genfrac"],
-  props: {
-    numArgs: 6,
-    greediness: 6,
-    argTypes: ["math", "math", "size", "text", "math", "math"]
-  },
-  handler: function handler(_ref3, args) {
-    var parser = _ref3.parser;
-    var numer = args[4];
-    var denom = args[5]; // Look into the parse nodes to get the desired delimiters.
-
-    var leftNode = checkNodeType(args[0], "atom");
-
-    if (leftNode) {
-      leftNode = assertAtomFamily(args[0], "open");
-    }
-
-    var leftDelim = leftNode ? delimFromValue(leftNode.text) : null;
-    var rightNode = checkNodeType(args[1], "atom");
-
-    if (rightNode) {
-      rightNode = assertAtomFamily(args[1], "close");
-    }
-
-    var rightDelim = rightNode ? delimFromValue(rightNode.text) : null;
-    var barNode = assertNodeType(args[2], "size");
-    var hasBarLine;
-    var barSize = null;
-
-    if (barNode.isBlank) {
-      // \genfrac acts differently than \above.
-      // \genfrac treats an empty size group as a signal to use a
-      // standard bar size. \above would see size = 0 and omit the bar.
-      hasBarLine = true;
-    } else {
-      barSize = barNode.value;
-      hasBarLine = barSize.number > 0;
-    } // Find out if we want displaystyle, textstyle, etc.
-
-
-    var size = "auto";
-    var styl = checkNodeType(args[3], "ordgroup");
-
-    if (styl) {
-      if (styl.body.length > 0) {
-        var textOrd = assertNodeType(styl.body[0], "textord");
-        size = stylArray[Number(textOrd.text)];
-      }
-    } else {
-      styl = assertNodeType(args[3], "textord");
-      size = stylArray[Number(styl.text)];
-    }
-
-    return {
-      type: "genfrac",
-      mode: parser.mode,
-      numer: numer,
-      denom: denom,
-      continued: false,
-      hasBarLine: hasBarLine,
-      barSize: barSize,
-      leftDelim: leftDelim,
-      rightDelim: rightDelim,
-      size: size
-    };
-  },
-  htmlBuilder: genfrac_htmlBuilder,
-  mathmlBuilder: genfrac_mathmlBuilder
-}); // \above is an infix fraction that also defines a fraction bar size.
-
-defineFunction({
-  type: "infix",
-  names: ["\\above"],
-  props: {
-    numArgs: 1,
-    argTypes: ["size"],
-    infix: true
-  },
-  handler: function handler(_ref4, args) {
-    var parser = _ref4.parser,
-        funcName = _ref4.funcName,
-        token = _ref4.token;
-    return {
-      type: "infix",
-      mode: parser.mode,
-      replaceWith: "\\\\abovefrac",
-      size: assertNodeType(args[0], "size").value,
-      token: token
-    };
-  }
-});
-defineFunction({
-  type: "genfrac",
-  names: ["\\\\abovefrac"],
-  props: {
-    numArgs: 3,
-    argTypes: ["math", "size", "math"]
-  },
-  handler: function handler(_ref5, args) {
-    var parser = _ref5.parser,
-        funcName = _ref5.funcName;
-    var numer = args[0];
-    var barSize = assert(assertNodeType(args[1], "infix").size);
-    var denom = args[2];
-    var hasBarLine = barSize.number > 0;
-    return {
-      type: "genfrac",
-      mode: parser.mode,
-      numer: numer,
-      denom: denom,
-      continued: false,
-      hasBarLine: hasBarLine,
-      barSize: barSize,
-      leftDelim: null,
-      rightDelim: null,
-      size: "auto"
-    };
-  },
-  htmlBuilder: genfrac_htmlBuilder,
-  mathmlBuilder: genfrac_mathmlBuilder
-});
-// CONCATENATED MODULE: ./src/functions/horizBrace.js
-
-
-
-
-
-
-
-
-// NOTE: Unlike most `htmlBuilder`s, this one handles not only "horizBrace", but
-var horizBrace_htmlBuilder = function htmlBuilder(grp, options) {
-  var style = options.style; // Pull out the `ParseNode<"horizBrace">` if `grp` is a "supsub" node.
-
-  var supSubGroup;
-  var group;
-  var supSub = checkNodeType(grp, "supsub");
-
-  if (supSub) {
-    // Ref: LaTeX source2e: }}}}\limits}
-    // i.e. LaTeX treats the brace similar to an op and passes it
-    // with \limits, so we need to assign supsub style.
-    supSubGroup = supSub.sup ? buildHTML_buildGroup(supSub.sup, options.havingStyle(style.sup()), options) : buildHTML_buildGroup(supSub.sub, options.havingStyle(style.sub()), options);
-    group = assertNodeType(supSub.base, "horizBrace");
-  } else {
-    group = assertNodeType(grp, "horizBrace");
-  } // Build the base group
-
-
-  var body = buildHTML_buildGroup(group.base, options.havingBaseStyle(src_Style.DISPLAY)); // Create the stretchy element
-
-  var braceBody = stretchy.svgSpan(group, options); // Generate the vlist, with the appropriate kerns        ┏━━━━━━━━┓
-  // This first vlist contains the content and the brace:   equation
-
-  var vlist;
-
-  if (group.isOver) {
-    vlist = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: body
-      }, {
-        type: "kern",
-        size: 0.1
-      }, {
-        type: "elem",
-        elem: braceBody
-      }]
-    }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList.
-
-    vlist.children[0].children[0].children[1].classes.push("svg-align");
-  } else {
-    vlist = buildCommon.makeVList({
-      positionType: "bottom",
-      positionData: body.depth + 0.1 + braceBody.height,
-      children: [{
-        type: "elem",
-        elem: braceBody
-      }, {
-        type: "kern",
-        size: 0.1
-      }, {
-        type: "elem",
-        elem: body
-      }]
-    }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList.
-
-    vlist.children[0].children[0].children[0].classes.push("svg-align");
-  }
-
-  if (supSubGroup) {
-    // To write the supsub, wrap the first vlist in another vlist:
-    // They can't all go in the same vlist, because the note might be
-    // wider than the equation. We want the equation to control the
-    // brace width.
-    //      note          long note           long note
-    //   ┏━━━━━━━━┓   or    ┏━━━┓     not    ┏━━━━━━━━━┓
-    //    equation           eqn                 eqn
-    var vSpan = buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options);
-
-    if (group.isOver) {
-      vlist = buildCommon.makeVList({
-        positionType: "firstBaseline",
-        children: [{
-          type: "elem",
-          elem: vSpan
-        }, {
-          type: "kern",
-          size: 0.2
-        }, {
-          type: "elem",
-          elem: supSubGroup
-        }]
-      }, options);
-    } else {
-      vlist = buildCommon.makeVList({
-        positionType: "bottom",
-        positionData: vSpan.depth + 0.2 + supSubGroup.height + supSubGroup.depth,
-        children: [{
-          type: "elem",
-          elem: supSubGroup
-        }, {
-          type: "kern",
-          size: 0.2
-        }, {
-          type: "elem",
-          elem: vSpan
-        }]
-      }, options);
-    }
-  }
-
-  return buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options);
-};
-
-var horizBrace_mathmlBuilder = function mathmlBuilder(group, options) {
-  var accentNode = stretchy.mathMLnode(group.label);
-  return new mathMLTree.MathNode(group.isOver ? "mover" : "munder", [buildMathML_buildGroup(group.base, options), accentNode]);
-}; // Horizontal stretchy braces
-
-
-defineFunction({
-  type: "horizBrace",
-  names: ["\\overbrace", "\\underbrace"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    return {
-      type: "horizBrace",
-      mode: parser.mode,
-      label: funcName,
-      isOver: /^\\over/.test(funcName),
-      base: args[0]
-    };
-  },
-  htmlBuilder: horizBrace_htmlBuilder,
-  mathmlBuilder: horizBrace_mathmlBuilder
-});
-// CONCATENATED MODULE: ./src/functions/href.js
-
-
-
-
-
-
-defineFunction({
-  type: "href",
-  names: ["\\href"],
-  props: {
-    numArgs: 2,
-    argTypes: ["url", "original"],
-    allowedInText: true
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser;
-    var body = args[1];
-    var href = assertNodeType(args[0], "url").url;
-
-    if (!parser.settings.isTrusted({
-      command: "\\href",
-      url: href
-    })) {
-      return parser.formatUnsupportedCmd("\\href");
-    }
-
-    return {
-      type: "href",
-      mode: parser.mode,
-      href: href,
-      body: defineFunction_ordargument(body)
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    var elements = buildHTML_buildExpression(group.body, options, false);
-    return buildCommon.makeAnchor(group.href, [], elements, options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var math = buildExpressionRow(group.body, options);
-
-    if (!(math instanceof mathMLTree_MathNode)) {
-      math = new mathMLTree_MathNode("mrow", [math]);
-    }
-
-    math.setAttribute("href", group.href);
-    return math;
-  }
-});
-defineFunction({
-  type: "href",
-  names: ["\\url"],
-  props: {
-    numArgs: 1,
-    argTypes: ["url"],
-    allowedInText: true
-  },
-  handler: function handler(_ref2, args) {
-    var parser = _ref2.parser;
-    var href = assertNodeType(args[0], "url").url;
-
-    if (!parser.settings.isTrusted({
-      command: "\\url",
-      url: href
-    })) {
-      return parser.formatUnsupportedCmd("\\url");
-    }
-
-    var chars = [];
-
-    for (var i = 0; i < href.length; i++) {
-      var c = href[i];
-
-      if (c === "~") {
-        c = "\\textasciitilde";
-      }
-
-      chars.push({
-        type: "textord",
-        mode: "text",
-        text: c
-      });
-    }
-
-    var body = {
-      type: "text",
-      mode: parser.mode,
-      font: "\\texttt",
-      body: chars
-    };
-    return {
-      type: "href",
-      mode: parser.mode,
-      href: href,
-      body: defineFunction_ordargument(body)
-    };
-  }
-});
-// CONCATENATED MODULE: ./src/functions/htmlmathml.js
-
-
-
-
-defineFunction({
-  type: "htmlmathml",
-  names: ["\\html@mathml"],
-  props: {
-    numArgs: 2,
-    allowedInText: true
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser;
-    return {
-      type: "htmlmathml",
-      mode: parser.mode,
-      html: defineFunction_ordargument(args[0]),
-      mathml: defineFunction_ordargument(args[1])
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    var elements = buildHTML_buildExpression(group.html, options, false);
-    return buildCommon.makeFragment(elements);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    return buildExpressionRow(group.mathml, options);
-  }
-});
-// CONCATENATED MODULE: ./src/functions/includegraphics.js
-
-
-
-
-
-
-
-var includegraphics_sizeData = function sizeData(str) {
-  if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(str)) {
-    // str is a number with no unit specified.
-    // default unit is bp, per graphix package.
-    return {
-      number: +str,
-      unit: "bp"
-    };
-  } else {
-    var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(str);
-
-    if (!match) {
-      throw new src_ParseError("Invalid size: '" + str + "' in \\includegraphics");
-    }
-
-    var data = {
-      number: +(match[1] + match[2]),
-      // sign + magnitude, cast to number
-      unit: match[3]
-    };
-
-    if (!validUnit(data)) {
-      throw new src_ParseError("Invalid unit: '" + data.unit + "' in \\includegraphics.");
-    }
-
-    return data;
-  }
-};
-
-defineFunction({
-  type: "includegraphics",
-  names: ["\\includegraphics"],
-  props: {
-    numArgs: 1,
-    numOptionalArgs: 1,
-    argTypes: ["raw", "url"],
-    allowedInText: false
-  },
-  handler: function handler(_ref, args, optArgs) {
-    var parser = _ref.parser;
-    var width = {
-      number: 0,
-      unit: "em"
-    };
-    var height = {
-      number: 0.9,
-      unit: "em"
-    }; // sorta character sized.
-
-    var totalheight = {
-      number: 0,
-      unit: "em"
-    };
-    var alt = "";
-
-    if (optArgs[0]) {
-      var attributeStr = assertNodeType(optArgs[0], "raw").string; // Parser.js does not parse key/value pairs. We get a string.
-
-      var attributes = attributeStr.split(",");
-
-      for (var i = 0; i < attributes.length; i++) {
-        var keyVal = attributes[i].split("=");
-
-        if (keyVal.length === 2) {
-          var str = keyVal[1].trim();
-
-          switch (keyVal[0].trim()) {
-            case "alt":
-              alt = str;
-              break;
-
-            case "width":
-              width = includegraphics_sizeData(str);
-              break;
-
-            case "height":
-              height = includegraphics_sizeData(str);
-              break;
-
-            case "totalheight":
-              totalheight = includegraphics_sizeData(str);
-              break;
-
-            default:
-              throw new src_ParseError("Invalid key: '" + keyVal[0] + "' in \\includegraphics.");
-          }
-        }
-      }
-    }
-
-    var src = assertNodeType(args[0], "url").url;
-
-    if (alt === "") {
-      // No alt given. Use the file name. Strip away the path.
-      alt = src;
-      alt = alt.replace(/^.*[\\/]/, '');
-      alt = alt.substring(0, alt.lastIndexOf('.'));
-    }
-
-    if (!parser.settings.isTrusted({
-      command: "\\includegraphics",
-      url: src
-    })) {
-      return parser.formatUnsupportedCmd("\\includegraphics");
-    }
-
-    return {
-      type: "includegraphics",
-      mode: parser.mode,
-      alt: alt,
-      width: width,
-      height: height,
-      totalheight: totalheight,
-      src: src
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    var height = units_calculateSize(group.height, options);
-    var depth = 0;
-
-    if (group.totalheight.number > 0) {
-      depth = units_calculateSize(group.totalheight, options) - height;
-      depth = Number(depth.toFixed(2));
-    }
-
-    var width = 0;
-
-    if (group.width.number > 0) {
-      width = units_calculateSize(group.width, options);
-    }
-
-    var style = {
-      height: height + depth + "em"
-    };
-
-    if (width > 0) {
-      style.width = width + "em";
-    }
-
-    if (depth > 0) {
-      style.verticalAlign = -depth + "em";
-    }
-
-    var node = new domTree_Img(group.src, group.alt, style);
-    node.height = height;
-    node.depth = depth;
-    return node;
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var node = new mathMLTree.MathNode("mglyph", []);
-    node.setAttribute("alt", group.alt);
-    var height = units_calculateSize(group.height, options);
-    var depth = 0;
-
-    if (group.totalheight.number > 0) {
-      depth = units_calculateSize(group.totalheight, options) - height;
-      depth = depth.toFixed(2);
-      node.setAttribute("valign", "-" + depth + "em");
-    }
-
-    node.setAttribute("height", height + depth + "em");
-
-    if (group.width.number > 0) {
-      var width = units_calculateSize(group.width, options);
-      node.setAttribute("width", width + "em");
-    }
-
-    node.setAttribute("src", group.src);
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/kern.js
-// Horizontal spacing commands
-
-
-
-
- // TODO: \hskip and \mskip should support plus and minus in lengths
-
-defineFunction({
-  type: "kern",
-  names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"],
-  props: {
-    numArgs: 1,
-    argTypes: ["size"],
-    allowedInText: true
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    var size = assertNodeType(args[0], "size");
-
-    if (parser.settings.strict) {
-      var mathFunction = funcName[1] === 'm'; // \mkern, \mskip
-
-      var muUnit = size.value.unit === 'mu';
-
-      if (mathFunction) {
-        if (!muUnit) {
-          parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " supports only mu units, " + ("not " + size.value.unit + " units"));
-        }
-
-        if (parser.mode !== "math") {
-          parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " works only in math mode");
-        }
-      } else {
-        // !mathFunction
-        if (muUnit) {
-          parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " doesn't support mu units");
-        }
-      }
-    }
-
-    return {
-      type: "kern",
-      mode: parser.mode,
-      dimension: size.value
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    return buildCommon.makeGlue(group.dimension, options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var dimension = units_calculateSize(group.dimension, options);
-    return new mathMLTree.SpaceNode(dimension);
-  }
-});
-// CONCATENATED MODULE: ./src/functions/lap.js
-// Horizontal overlap functions
-
-
-
-
-
-defineFunction({
-  type: "lap",
-  names: ["\\mathllap", "\\mathrlap", "\\mathclap"],
-  props: {
-    numArgs: 1,
-    allowedInText: true
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    var body = args[0];
-    return {
-      type: "lap",
-      mode: parser.mode,
-      alignment: funcName.slice(5),
-      body: body
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    // mathllap, mathrlap, mathclap
-    var inner;
-
-    if (group.alignment === "clap") {
-      // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/
-      inner = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options)]); // wrap, since CSS will center a .clap > .inner > span
-
-      inner = buildCommon.makeSpan(["inner"], [inner], options);
-    } else {
-      inner = buildCommon.makeSpan(["inner"], [buildHTML_buildGroup(group.body, options)]);
-    }
-
-    var fix = buildCommon.makeSpan(["fix"], []);
-    var node = buildCommon.makeSpan([group.alignment], [inner, fix], options); // At this point, we have correctly set horizontal alignment of the
-    // two items involved in the lap.
-    // Next, use a strut to set the height of the HTML bounding box.
-    // Otherwise, a tall argument may be misplaced.
-
-    var strut = buildCommon.makeSpan(["strut"]);
-    strut.style.height = node.height + node.depth + "em";
-    strut.style.verticalAlign = -node.depth + "em";
-    node.children.unshift(strut); // Next, prevent vertical misplacement when next to something tall.
-
-    node = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: node
-      }]
-    }, options); // Get the horizontal spacing correct relative to adjacent items.
-
-    return buildCommon.makeSpan(["mord"], [node], options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    // mathllap, mathrlap, mathclap
-    var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]);
-
-    if (group.alignment !== "rlap") {
-      var offset = group.alignment === "llap" ? "-1" : "-0.5";
-      node.setAttribute("lspace", offset + "width");
-    }
-
-    node.setAttribute("width", "0px");
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/math.js
-
- // Switching from text mode back to math mode
-
-defineFunction({
-  type: "styling",
-  names: ["\\(", "$"],
-  props: {
-    numArgs: 0,
-    allowedInText: true,
-    allowedInMath: false
-  },
-  handler: function handler(_ref, args) {
-    var funcName = _ref.funcName,
-        parser = _ref.parser;
-    var outerMode = parser.mode;
-    parser.switchMode("math");
-    var close = funcName === "\\(" ? "\\)" : "$";
-    var body = parser.parseExpression(false, close);
-    parser.expect(close);
-    parser.switchMode(outerMode);
-    return {
-      type: "styling",
-      mode: parser.mode,
-      style: "text",
-      body: body
-    };
-  }
-}); // Check for extra closing math delimiters
-
-defineFunction({
-  type: "text",
-  // Doesn't matter what this is.
-  names: ["\\)", "\\]"],
-  props: {
-    numArgs: 0,
-    allowedInText: true,
-    allowedInMath: false
-  },
-  handler: function handler(context, args) {
-    throw new src_ParseError("Mismatched " + context.funcName);
-  }
-});
-// CONCATENATED MODULE: ./src/functions/mathchoice.js
-
-
-
-
-
-
-var mathchoice_chooseMathStyle = function chooseMathStyle(group, options) {
-  switch (options.style.size) {
-    case src_Style.DISPLAY.size:
-      return group.display;
-
-    case src_Style.TEXT.size:
-      return group.text;
-
-    case src_Style.SCRIPT.size:
-      return group.script;
-
-    case src_Style.SCRIPTSCRIPT.size:
-      return group.scriptscript;
-
-    default:
-      return group.text;
-  }
-};
-
-defineFunction({
-  type: "mathchoice",
-  names: ["\\mathchoice"],
-  props: {
-    numArgs: 4
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser;
-    return {
-      type: "mathchoice",
-      mode: parser.mode,
-      display: defineFunction_ordargument(args[0]),
-      text: defineFunction_ordargument(args[1]),
-      script: defineFunction_ordargument(args[2]),
-      scriptscript: defineFunction_ordargument(args[3])
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    var body = mathchoice_chooseMathStyle(group, options);
-    var elements = buildHTML_buildExpression(body, options, false);
-    return buildCommon.makeFragment(elements);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var body = mathchoice_chooseMathStyle(group, options);
-    return buildExpressionRow(body, options);
-  }
-});
-// CONCATENATED MODULE: ./src/functions/utils/assembleSupSub.js
-
-
-// For an operator with limits, assemble the base, sup, and sub into a span.
-var assembleSupSub_assembleSupSub = function assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift) {
-  // IE 8 clips \int if it is in a display: inline-block. We wrap it
-  // in a new span so it is an inline, and works.
-  base = buildCommon.makeSpan([], [base]);
-  var sub;
-  var sup; // We manually have to handle the superscripts and subscripts. This,
-  // aside from the kern calculations, is copied from supsub.
-
-  if (supGroup) {
-    var elem = buildHTML_buildGroup(supGroup, options.havingStyle(style.sup()), options);
-    sup = {
-      elem: elem,
-      kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth)
-    };
-  }
-
-  if (subGroup) {
-    var _elem = buildHTML_buildGroup(subGroup, options.havingStyle(style.sub()), options);
-
-    sub = {
-      elem: _elem,
-      kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height)
-    };
-  } // Build the final group as a vlist of the possible subscript, base,
-  // and possible superscript.
-
-
-  var finalGroup;
-
-  if (sup && sub) {
-    var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift;
-    finalGroup = buildCommon.makeVList({
-      positionType: "bottom",
-      positionData: bottom,
-      children: [{
-        type: "kern",
-        size: options.fontMetrics().bigOpSpacing5
-      }, {
-        type: "elem",
-        elem: sub.elem,
-        marginLeft: -slant + "em"
-      }, {
-        type: "kern",
-        size: sub.kern
-      }, {
-        type: "elem",
-        elem: base
-      }, {
-        type: "kern",
-        size: sup.kern
-      }, {
-        type: "elem",
-        elem: sup.elem,
-        marginLeft: slant + "em"
-      }, {
-        type: "kern",
-        size: options.fontMetrics().bigOpSpacing5
-      }]
-    }, options);
-  } else if (sub) {
-    var top = base.height - baseShift; // Shift the limits by the slant of the symbol. Note
-    // that we are supposed to shift the limits by 1/2 of the slant,
-    // but since we are centering the limits adding a full slant of
-    // margin will shift by 1/2 that.
-
-    finalGroup = buildCommon.makeVList({
-      positionType: "top",
-      positionData: top,
-      children: [{
-        type: "kern",
-        size: options.fontMetrics().bigOpSpacing5
-      }, {
-        type: "elem",
-        elem: sub.elem,
-        marginLeft: -slant + "em"
-      }, {
-        type: "kern",
-        size: sub.kern
-      }, {
-        type: "elem",
-        elem: base
-      }]
-    }, options);
-  } else if (sup) {
-    var _bottom = base.depth + baseShift;
-
-    finalGroup = buildCommon.makeVList({
-      positionType: "bottom",
-      positionData: _bottom,
-      children: [{
-        type: "elem",
-        elem: base
-      }, {
-        type: "kern",
-        size: sup.kern
-      }, {
-        type: "elem",
-        elem: sup.elem,
-        marginLeft: slant + "em"
-      }, {
-        type: "kern",
-        size: options.fontMetrics().bigOpSpacing5
-      }]
-    }, options);
-  } else {
-    // This case probably shouldn't occur (this would mean the
-    // supsub was sending us a group with no superscript or
-    // subscript) but be safe.
-    return base;
-  }
-
-  return buildCommon.makeSpan(["mop", "op-limits"], [finalGroup], options);
-};
-// CONCATENATED MODULE: ./src/functions/op.js
-// Limits, symbols
-
-
-
-
-
-
-
-
-
-
-// Most operators have a large successor symbol, but these don't.
-var noSuccessor = ["\\smallint"]; // NOTE: Unlike most `htmlBuilder`s, this one handles not only "op", but also
-// "supsub" since some of them (like \int) can affect super/subscripting.
-
-var op_htmlBuilder = function htmlBuilder(grp, options) {
-  // Operators are handled in the TeXbook pg. 443-444, rule 13(a).
-  var supGroup;
-  var subGroup;
-  var hasLimits = false;
-  var group;
-  var supSub = checkNodeType(grp, "supsub");
-
-  if (supSub) {
-    // If we have limits, supsub will pass us its group to handle. Pull
-    // out the superscript and subscript and set the group to the op in
-    // its base.
-    supGroup = supSub.sup;
-    subGroup = supSub.sub;
-    group = assertNodeType(supSub.base, "op");
-    hasLimits = true;
-  } else {
-    group = assertNodeType(grp, "op");
-  }
-
-  var style = options.style;
-  var large = false;
-
-  if (style.size === src_Style.DISPLAY.size && group.symbol && !utils.contains(noSuccessor, group.name)) {
-    // Most symbol operators get larger in displaystyle (rule 13)
-    large = true;
-  }
-
-  var base;
-
-  if (group.symbol) {
-    // If this is a symbol, create the symbol.
-    var fontName = large ? "Size2-Regular" : "Size1-Regular";
-    var stash = "";
-
-    if (group.name === "\\oiint" || group.name === "\\oiiint") {
-      // No font glyphs yet, so use a glyph w/o the oval.
-      // TODO: When font glyphs are available, delete this code.
-      stash = group.name.substr(1); // $FlowFixMe
-
-      group.name = stash === "oiint" ? "\\iint" : "\\iiint";
-    }
-
-    base = buildCommon.makeSymbol(group.name, fontName, "math", options, ["mop", "op-symbol", large ? "large-op" : "small-op"]);
-
-    if (stash.length > 0) {
-      // We're in \oiint or \oiiint. Overlay the oval.
-      // TODO: When font glyphs are available, delete this code.
-      var italic = base.italic;
-      var oval = buildCommon.staticSvg(stash + "Size" + (large ? "2" : "1"), options);
-      base = buildCommon.makeVList({
-        positionType: "individualShift",
-        children: [{
-          type: "elem",
-          elem: base,
-          shift: 0
-        }, {
-          type: "elem",
-          elem: oval,
-          shift: large ? 0.08 : 0
-        }]
-      }, options); // $FlowFixMe
-
-      group.name = "\\" + stash;
-      base.classes.unshift("mop"); // $FlowFixMe
-
-      base.italic = italic;
-    }
-  } else if (group.body) {
-    // If this is a list, compose that list.
-    var inner = buildHTML_buildExpression(group.body, options, true);
-
-    if (inner.length === 1 && inner[0] instanceof domTree_SymbolNode) {
-      base = inner[0];
-      base.classes[0] = "mop"; // replace old mclass
-    } else {
-      base = buildCommon.makeSpan(["mop"], buildCommon.tryCombineChars(inner), options);
-    }
-  } else {
-    // Otherwise, this is a text operator. Build the text from the
-    // operator's name.
-    // TODO(emily): Add a space in the middle of some of these
-    // operators, like \limsup
-    var output = [];
-
-    for (var i = 1; i < group.name.length; i++) {
-      output.push(buildCommon.mathsym(group.name[i], group.mode, options));
-    }
-
-    base = buildCommon.makeSpan(["mop"], output, options);
-  } // If content of op is a single symbol, shift it vertically.
-
-
-  var baseShift = 0;
-  var slant = 0;
-
-  if ((base instanceof domTree_SymbolNode || group.name === "\\oiint" || group.name === "\\oiiint") && !group.suppressBaseShift) {
-    // We suppress the shift of the base of \overset and \underset. Otherwise,
-    // shift the symbol so its center lies on the axis (rule 13). It
-    // appears that our fonts have the centers of the symbols already
-    // almost on the axis, so these numbers are very small. Note we
-    // don't actually apply this here, but instead it is used either in
-    // the vlist creation or separately when there are no limits.
-    baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight; // The slant of the symbol is just its italic correction.
-    // $FlowFixMe
-
-    slant = base.italic;
-  }
-
-  if (hasLimits) {
-    return assembleSupSub_assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift);
-  } else {
-    if (baseShift) {
-      base.style.position = "relative";
-      base.style.top = baseShift + "em";
-    }
-
-    return base;
-  }
-};
-
-var op_mathmlBuilder = function mathmlBuilder(group, options) {
-  var node;
-
-  if (group.symbol) {
-    // This is a symbol. Just add the symbol.
-    node = new mathMLTree_MathNode("mo", [buildMathML_makeText(group.name, group.mode)]);
-
-    if (utils.contains(noSuccessor, group.name)) {
-      node.setAttribute("largeop", "false");
-    }
-  } else if (group.body) {
-    // This is an operator with children. Add them.
-    node = new mathMLTree_MathNode("mo", buildMathML_buildExpression(group.body, options));
-  } else {
-    // This is a text operator. Add all of the characters from the
-    // operator's name.
-    node = new mathMLTree_MathNode("mi", [new mathMLTree_TextNode(group.name.slice(1))]); // Append an <mo>&ApplyFunction;</mo>.
-    // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4
-
-    var operator = new mathMLTree_MathNode("mo", [buildMathML_makeText("\u2061", "text")]);
-
-    if (group.parentIsSupSub) {
-      node = new mathMLTree_MathNode("mo", [node, operator]);
-    } else {
-      node = newDocumentFragment([node, operator]);
-    }
-  }
-
-  return node;
-};
-
-var singleCharBigOps = {
-  "\u220F": "\\prod",
-  "\u2210": "\\coprod",
-  "\u2211": "\\sum",
-  "\u22C0": "\\bigwedge",
-  "\u22C1": "\\bigvee",
-  "\u22C2": "\\bigcap",
-  "\u22C3": "\\bigcup",
-  "\u2A00": "\\bigodot",
-  "\u2A01": "\\bigoplus",
-  "\u2A02": "\\bigotimes",
-  "\u2A04": "\\biguplus",
-  "\u2A06": "\\bigsqcup"
-};
-defineFunction({
-  type: "op",
-  names: ["\\coprod", "\\bigvee", "\\bigwedge", "\\biguplus", "\\bigcap", "\\bigcup", "\\intop", "\\prod", "\\sum", "\\bigotimes", "\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint", "\u220F", "\u2210", "\u2211", "\u22C0", "\u22C1", "\u22C2", "\u22C3", "\u2A00", "\u2A01", "\u2A02", "\u2A04", "\u2A06"],
-  props: {
-    numArgs: 0
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    var fName = funcName;
-
-    if (fName.length === 1) {
-      fName = singleCharBigOps[fName];
-    }
-
-    return {
-      type: "op",
-      mode: parser.mode,
-      limits: true,
-      parentIsSupSub: false,
-      symbol: true,
-      name: fName
-    };
-  },
-  htmlBuilder: op_htmlBuilder,
-  mathmlBuilder: op_mathmlBuilder
-}); // Note: calling defineFunction with a type that's already been defined only
-// works because the same htmlBuilder and mathmlBuilder are being used.
-
-defineFunction({
-  type: "op",
-  names: ["\\mathop"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(_ref2, args) {
-    var parser = _ref2.parser;
-    var body = args[0];
-    return {
-      type: "op",
-      mode: parser.mode,
-      limits: false,
-      parentIsSupSub: false,
-      symbol: false,
-      body: defineFunction_ordargument(body)
-    };
-  },
-  htmlBuilder: op_htmlBuilder,
-  mathmlBuilder: op_mathmlBuilder
-}); // There are 2 flags for operators; whether they produce limits in
-// displaystyle, and whether they are symbols and should grow in
-// displaystyle. These four groups cover the four possible choices.
-
-var singleCharIntegrals = {
-  "\u222B": "\\int",
-  "\u222C": "\\iint",
-  "\u222D": "\\iiint",
-  "\u222E": "\\oint",
-  "\u222F": "\\oiint",
-  "\u2230": "\\oiiint"
-}; // No limits, not symbols
-
-defineFunction({
-  type: "op",
-  names: ["\\arcsin", "\\arccos", "\\arctan", "\\arctg", "\\arcctg", "\\arg", "\\ch", "\\cos", "\\cosec", "\\cosh", "\\cot", "\\cotg", "\\coth", "\\csc", "\\ctg", "\\cth", "\\deg", "\\dim", "\\exp", "\\hom", "\\ker", "\\lg", "\\ln", "\\log", "\\sec", "\\sin", "\\sinh", "\\sh", "\\tan", "\\tanh", "\\tg", "\\th"],
-  props: {
-    numArgs: 0
-  },
-  handler: function handler(_ref3) {
-    var parser = _ref3.parser,
-        funcName = _ref3.funcName;
-    return {
-      type: "op",
-      mode: parser.mode,
-      limits: false,
-      parentIsSupSub: false,
-      symbol: false,
-      name: funcName
-    };
-  },
-  htmlBuilder: op_htmlBuilder,
-  mathmlBuilder: op_mathmlBuilder
-}); // Limits, not symbols
-
-defineFunction({
-  type: "op",
-  names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"],
-  props: {
-    numArgs: 0
-  },
-  handler: function handler(_ref4) {
-    var parser = _ref4.parser,
-        funcName = _ref4.funcName;
-    return {
-      type: "op",
-      mode: parser.mode,
-      limits: true,
-      parentIsSupSub: false,
-      symbol: false,
-      name: funcName
-    };
-  },
-  htmlBuilder: op_htmlBuilder,
-  mathmlBuilder: op_mathmlBuilder
-}); // No limits, symbols
-
-defineFunction({
-  type: "op",
-  names: ["\\int", "\\iint", "\\iiint", "\\oint", "\\oiint", "\\oiiint", "\u222B", "\u222C", "\u222D", "\u222E", "\u222F", "\u2230"],
-  props: {
-    numArgs: 0
-  },
-  handler: function handler(_ref5) {
-    var parser = _ref5.parser,
-        funcName = _ref5.funcName;
-    var fName = funcName;
-
-    if (fName.length === 1) {
-      fName = singleCharIntegrals[fName];
-    }
-
-    return {
-      type: "op",
-      mode: parser.mode,
-      limits: false,
-      parentIsSupSub: false,
-      symbol: true,
-      name: fName
-    };
-  },
-  htmlBuilder: op_htmlBuilder,
-  mathmlBuilder: op_mathmlBuilder
-});
-// CONCATENATED MODULE: ./src/functions/operatorname.js
-
-
-
-
-
-
-
-
-// NOTE: Unlike most `htmlBuilder`s, this one handles not only
-// "operatorname", but also  "supsub" since \operatorname* can
-var operatorname_htmlBuilder = function htmlBuilder(grp, options) {
-  // Operators are handled in the TeXbook pg. 443-444, rule 13(a).
-  var supGroup;
-  var subGroup;
-  var hasLimits = false;
-  var group;
-  var supSub = checkNodeType(grp, "supsub");
-
-  if (supSub) {
-    // If we have limits, supsub will pass us its group to handle. Pull
-    // out the superscript and subscript and set the group to the op in
-    // its base.
-    supGroup = supSub.sup;
-    subGroup = supSub.sub;
-    group = assertNodeType(supSub.base, "operatorname");
-    hasLimits = true;
-  } else {
-    group = assertNodeType(grp, "operatorname");
-  }
-
-  var base;
-
-  if (group.body.length > 0) {
-    var body = group.body.map(function (child) {
-      // $FlowFixMe: Check if the node has a string `text` property.
-      var childText = child.text;
-
-      if (typeof childText === "string") {
-        return {
-          type: "textord",
-          mode: child.mode,
-          text: childText
-        };
-      } else {
-        return child;
-      }
-    }); // Consolidate function names into symbol characters.
-
-    var expression = buildHTML_buildExpression(body, options.withFont("mathrm"), true);
-
-    for (var i = 0; i < expression.length; i++) {
-      var child = expression[i];
-
-      if (child instanceof domTree_SymbolNode) {
-        // Per amsopn package,
-        // change minus to hyphen and \ast to asterisk
-        child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*");
-      }
-    }
-
-    base = buildCommon.makeSpan(["mop"], expression, options);
-  } else {
-    base = buildCommon.makeSpan(["mop"], [], options);
-  }
-
-  if (hasLimits) {
-    return assembleSupSub_assembleSupSub(base, supGroup, subGroup, options, options.style, 0, 0);
-  } else {
-    return base;
-  }
-};
-
-var operatorname_mathmlBuilder = function mathmlBuilder(group, options) {
-  // The steps taken here are similar to the html version.
-  var expression = buildMathML_buildExpression(group.body, options.withFont("mathrm")); // Is expression a string or has it something like a fraction?
-
-  var isAllString = true; // default
-
-  for (var i = 0; i < expression.length; i++) {
-    var node = expression[i];
-
-    if (node instanceof mathMLTree.SpaceNode) {// Do nothing
-    } else if (node instanceof mathMLTree.MathNode) {
-      switch (node.type) {
-        case "mi":
-        case "mn":
-        case "ms":
-        case "mspace":
-        case "mtext":
-          break;
-        // Do nothing yet.
-
-        case "mo":
-          {
-            var child = node.children[0];
-
-            if (node.children.length === 1 && child instanceof mathMLTree.TextNode) {
-              child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*");
-            } else {
-              isAllString = false;
-            }
-
-            break;
-          }
-
-        default:
-          isAllString = false;
-      }
-    } else {
-      isAllString = false;
-    }
-  }
-
-  if (isAllString) {
-    // Write a single TextNode instead of multiple nested tags.
-    var word = expression.map(function (node) {
-      return node.toText();
-    }).join("");
-    expression = [new mathMLTree.TextNode(word)];
-  }
-
-  var identifier = new mathMLTree.MathNode("mi", expression);
-  identifier.setAttribute("mathvariant", "normal"); // \u2061 is the same as &ApplyFunction;
-  // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp
-
-  var operator = new mathMLTree.MathNode("mo", [buildMathML_makeText("\u2061", "text")]);
-
-  if (group.parentIsSupSub) {
-    return new mathMLTree.MathNode("mo", [identifier, operator]);
-  } else {
-    return mathMLTree.newDocumentFragment([identifier, operator]);
-  }
-}; // \operatorname
-// amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@
-
-
-defineFunction({
-  type: "operatorname",
-  names: ["\\operatorname", "\\operatorname*"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    var body = args[0];
-    return {
-      type: "operatorname",
-      mode: parser.mode,
-      body: defineFunction_ordargument(body),
-      alwaysHandleSupSub: funcName === "\\operatorname*",
-      limits: false,
-      parentIsSupSub: false
-    };
-  },
-  htmlBuilder: operatorname_htmlBuilder,
-  mathmlBuilder: operatorname_mathmlBuilder
-});
-// CONCATENATED MODULE: ./src/functions/ordgroup.js
-
-
-
-
-defineFunctionBuilders({
-  type: "ordgroup",
-  htmlBuilder: function htmlBuilder(group, options) {
-    if (group.semisimple) {
-      return buildCommon.makeFragment(buildHTML_buildExpression(group.body, options, false));
-    }
-
-    return buildCommon.makeSpan(["mord"], buildHTML_buildExpression(group.body, options, true), options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    return buildExpressionRow(group.body, options, true);
-  }
-});
-// CONCATENATED MODULE: ./src/functions/overline.js
-
-
-
-
-
-defineFunction({
-  type: "overline",
-  names: ["\\overline"],
-  props: {
-    numArgs: 1
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser;
-    var body = args[0];
-    return {
-      type: "overline",
-      mode: parser.mode,
-      body: body
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    // Overlines are handled in the TeXbook pg 443, Rule 9.
-    // Build the inner group in the cramped style.
-    var innerGroup = buildHTML_buildGroup(group.body, options.havingCrampedStyle()); // Create the line above the body
-
-    var line = buildCommon.makeLineSpan("overline-line", options); // Generate the vlist, with the appropriate kerns
-
-    var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;
-    var vlist = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: innerGroup
-      }, {
-        type: "kern",
-        size: 3 * defaultRuleThickness
-      }, {
-        type: "elem",
-        elem: line
-      }, {
-        type: "kern",
-        size: defaultRuleThickness
-      }]
-    }, options);
-    return buildCommon.makeSpan(["mord", "overline"], [vlist], options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203E")]);
-    operator.setAttribute("stretchy", "true");
-    var node = new mathMLTree.MathNode("mover", [buildMathML_buildGroup(group.body, options), operator]);
-    node.setAttribute("accent", "true");
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/phantom.js
-
-
-
-
-
-defineFunction({
-  type: "phantom",
-  names: ["\\phantom"],
-  props: {
-    numArgs: 1,
-    allowedInText: true
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser;
-    var body = args[0];
-    return {
-      type: "phantom",
-      mode: parser.mode,
-      body: defineFunction_ordargument(body)
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    var elements = buildHTML_buildExpression(group.body, options.withPhantom(), false); // \phantom isn't supposed to affect the elements it contains.
-    // See "color" for more details.
-
-    return buildCommon.makeFragment(elements);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var inner = buildMathML_buildExpression(group.body, options);
-    return new mathMLTree.MathNode("mphantom", inner);
-  }
-});
-defineFunction({
-  type: "hphantom",
-  names: ["\\hphantom"],
-  props: {
-    numArgs: 1,
-    allowedInText: true
-  },
-  handler: function handler(_ref2, args) {
-    var parser = _ref2.parser;
-    var body = args[0];
-    return {
-      type: "hphantom",
-      mode: parser.mode,
-      body: body
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    var node = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options.withPhantom())]);
-    node.height = 0;
-    node.depth = 0;
-
-    if (node.children) {
-      for (var i = 0; i < node.children.length; i++) {
-        node.children[i].height = 0;
-        node.children[i].depth = 0;
-      }
-    } // See smash for comment re: use of makeVList
-
-
-    node = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: node
-      }]
-    }, options); // For spacing, TeX treats \smash as a math group (same spacing as ord).
-
-    return buildCommon.makeSpan(["mord"], [node], options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var inner = buildMathML_buildExpression(defineFunction_ordargument(group.body), options);
-    var phantom = new mathMLTree.MathNode("mphantom", inner);
-    var node = new mathMLTree.MathNode("mpadded", [phantom]);
-    node.setAttribute("height", "0px");
-    node.setAttribute("depth", "0px");
-    return node;
-  }
-});
-defineFunction({
-  type: "vphantom",
-  names: ["\\vphantom"],
-  props: {
-    numArgs: 1,
-    allowedInText: true
-  },
-  handler: function handler(_ref3, args) {
-    var parser = _ref3.parser;
-    var body = args[0];
-    return {
-      type: "vphantom",
-      mode: parser.mode,
-      body: body
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    var inner = buildCommon.makeSpan(["inner"], [buildHTML_buildGroup(group.body, options.withPhantom())]);
-    var fix = buildCommon.makeSpan(["fix"], []);
-    return buildCommon.makeSpan(["mord", "rlap"], [inner, fix], options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var inner = buildMathML_buildExpression(defineFunction_ordargument(group.body), options);
-    var phantom = new mathMLTree.MathNode("mphantom", inner);
-    var node = new mathMLTree.MathNode("mpadded", [phantom]);
-    node.setAttribute("width", "0px");
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/raisebox.js
-
-
-
-
-
-
- // Box manipulation
-
-defineFunction({
-  type: "raisebox",
-  names: ["\\raisebox"],
-  props: {
-    numArgs: 2,
-    argTypes: ["size", "hbox"],
-    allowedInText: true
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser;
-    var amount = assertNodeType(args[0], "size").value;
-    var body = args[1];
-    return {
-      type: "raisebox",
-      mode: parser.mode,
-      dy: amount,
-      body: body
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    var body = buildHTML_buildGroup(group.body, options);
-    var dy = units_calculateSize(group.dy, options);
-    return buildCommon.makeVList({
-      positionType: "shift",
-      positionData: -dy,
-      children: [{
-        type: "elem",
-        elem: body
-      }]
-    }, options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]);
-    var dy = group.dy.number + group.dy.unit;
-    node.setAttribute("voffset", dy);
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/rule.js
-
-
-
-
-
-defineFunction({
-  type: "rule",
-  names: ["\\rule"],
-  props: {
-    numArgs: 2,
-    numOptionalArgs: 1,
-    argTypes: ["size", "size", "size"]
-  },
-  handler: function handler(_ref, args, optArgs) {
-    var parser = _ref.parser;
-    var shift = optArgs[0];
-    var width = assertNodeType(args[0], "size");
-    var height = assertNodeType(args[1], "size");
-    return {
-      type: "rule",
-      mode: parser.mode,
-      shift: shift && assertNodeType(shift, "size").value,
-      width: width.value,
-      height: height.value
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    // Make an empty span for the rule
-    var rule = buildCommon.makeSpan(["mord", "rule"], [], options); // Calculate the shift, width, and height of the rule, and account for units
-
-    var width = units_calculateSize(group.width, options);
-    var height = units_calculateSize(group.height, options);
-    var shift = group.shift ? units_calculateSize(group.shift, options) : 0; // Style the rule to the right size
-
-    rule.style.borderRightWidth = width + "em";
-    rule.style.borderTopWidth = height + "em";
-    rule.style.bottom = shift + "em"; // Record the height and width
-
-    rule.width = width;
-    rule.height = height + shift;
-    rule.depth = -shift; // Font size is the number large enough that the browser will
-    // reserve at least `absHeight` space above the baseline.
-    // The 1.125 factor was empirically determined
-
-    rule.maxFontSize = height * 1.125 * options.sizeMultiplier;
-    return rule;
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var width = units_calculateSize(group.width, options);
-    var height = units_calculateSize(group.height, options);
-    var shift = group.shift ? units_calculateSize(group.shift, options) : 0;
-    var color = options.color && options.getColor() || "black";
-    var rule = new mathMLTree.MathNode("mspace");
-    rule.setAttribute("mathbackground", color);
-    rule.setAttribute("width", width + "em");
-    rule.setAttribute("height", height + "em");
-    var wrapper = new mathMLTree.MathNode("mpadded", [rule]);
-
-    if (shift >= 0) {
-      wrapper.setAttribute("height", "+" + shift + "em");
-    } else {
-      wrapper.setAttribute("height", shift + "em");
-      wrapper.setAttribute("depth", "+" + -shift + "em");
-    }
-
-    wrapper.setAttribute("voffset", shift + "em");
-    return wrapper;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/sizing.js
-
-
-
-
-
-function sizingGroup(value, options, baseOptions) {
-  var inner = buildHTML_buildExpression(value, options, false);
-  var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; // Add size-resetting classes to the inner list and set maxFontSize
-  // manually. Handle nested size changes.
-
-  for (var i = 0; i < inner.length; i++) {
-    var pos = inner[i].classes.indexOf("sizing");
-
-    if (pos < 0) {
-      Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions));
-    } else if (inner[i].classes[pos + 1] === "reset-size" + options.size) {
-      // This is a nested size change: e.g., inner[i] is the "b" in
-      // `\Huge a \small b`. Override the old size (the `reset-` class)
-      // but not the new size.
-      inner[i].classes[pos + 1] = "reset-size" + baseOptions.size;
-    }
-
-    inner[i].height *= multiplier;
-    inner[i].depth *= multiplier;
-  }
-
-  return buildCommon.makeFragment(inner);
-}
-var sizeFuncs = ["\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"];
-var sizing_htmlBuilder = function htmlBuilder(group, options) {
-  // Handle sizing operators like \Huge. Real TeX doesn't actually allow
-  // these functions inside of math expressions, so we do some special
-  // handling.
-  var newOptions = options.havingSize(group.size);
-  return sizingGroup(group.body, newOptions, options);
-};
-defineFunction({
-  type: "sizing",
-  names: sizeFuncs,
-  props: {
-    numArgs: 0,
-    allowedInText: true
-  },
-  handler: function handler(_ref, args) {
-    var breakOnTokenText = _ref.breakOnTokenText,
-        funcName = _ref.funcName,
-        parser = _ref.parser;
-    var body = parser.parseExpression(false, breakOnTokenText);
-    return {
-      type: "sizing",
-      mode: parser.mode,
-      // Figure out what size to use based on the list of functions above
-      size: sizeFuncs.indexOf(funcName) + 1,
-      body: body
-    };
-  },
-  htmlBuilder: sizing_htmlBuilder,
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var newOptions = options.havingSize(group.size);
-    var inner = buildMathML_buildExpression(group.body, newOptions);
-    var node = new mathMLTree.MathNode("mstyle", inner); // TODO(emily): This doesn't produce the correct size for nested size
-    // changes, because we don't keep state of what style we're currently
-    // in, so we can't reset the size to normal before changing it.  Now
-    // that we're passing an options parameter we should be able to fix
-    // this.
-
-    node.setAttribute("mathsize", newOptions.sizeMultiplier + "em");
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/smash.js
-// smash, with optional [tb], as in AMS
-
-
-
-
-
-
-defineFunction({
-  type: "smash",
-  names: ["\\smash"],
-  props: {
-    numArgs: 1,
-    numOptionalArgs: 1,
-    allowedInText: true
-  },
-  handler: function handler(_ref, args, optArgs) {
-    var parser = _ref.parser;
-    var smashHeight = false;
-    var smashDepth = false;
-    var tbArg = optArgs[0] && assertNodeType(optArgs[0], "ordgroup");
-
-    if (tbArg) {
-      // Optional [tb] argument is engaged.
-      // ref: amsmath: \renewcommand{\smash}[1][tb]{%
-      //               def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}%
-      var letter = "";
-
-      for (var i = 0; i < tbArg.body.length; ++i) {
-        var node = tbArg.body[i]; // $FlowFixMe: Not every node type has a `text` property.
-
-        letter = node.text;
-
-        if (letter === "t") {
-          smashHeight = true;
-        } else if (letter === "b") {
-          smashDepth = true;
-        } else {
-          smashHeight = false;
-          smashDepth = false;
-          break;
-        }
-      }
-    } else {
-      smashHeight = true;
-      smashDepth = true;
-    }
-
-    var body = args[0];
-    return {
-      type: "smash",
-      mode: parser.mode,
-      body: body,
-      smashHeight: smashHeight,
-      smashDepth: smashDepth
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    var node = buildCommon.makeSpan([], [buildHTML_buildGroup(group.body, options)]);
-
-    if (!group.smashHeight && !group.smashDepth) {
-      return node;
-    }
-
-    if (group.smashHeight) {
-      node.height = 0; // In order to influence makeVList, we have to reset the children.
-
-      if (node.children) {
-        for (var i = 0; i < node.children.length; i++) {
-          node.children[i].height = 0;
-        }
-      }
-    }
-
-    if (group.smashDepth) {
-      node.depth = 0;
-
-      if (node.children) {
-        for (var _i = 0; _i < node.children.length; _i++) {
-          node.children[_i].depth = 0;
-        }
-      }
-    } // At this point, we've reset the TeX-like height and depth values.
-    // But the span still has an HTML line height.
-    // makeVList applies "display: table-cell", which prevents the browser
-    // from acting on that line height. So we'll call makeVList now.
-
-
-    var smashedNode = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: node
-      }]
-    }, options); // For spacing, TeX treats \hphantom as a math group (same spacing as ord).
-
-    return buildCommon.makeSpan(["mord"], [smashedNode], options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]);
-
-    if (group.smashHeight) {
-      node.setAttribute("height", "0px");
-    }
-
-    if (group.smashDepth) {
-      node.setAttribute("depth", "0px");
-    }
-
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/sqrt.js
-
-
-
-
-
-
-
-defineFunction({
-  type: "sqrt",
-  names: ["\\sqrt"],
-  props: {
-    numArgs: 1,
-    numOptionalArgs: 1
-  },
-  handler: function handler(_ref, args, optArgs) {
-    var parser = _ref.parser;
-    var index = optArgs[0];
-    var body = args[0];
-    return {
-      type: "sqrt",
-      mode: parser.mode,
-      body: body,
-      index: index
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    // Square roots are handled in the TeXbook pg. 443, Rule 11.
-    // First, we do the same steps as in overline to build the inner group
-    // and line
-    var inner = buildHTML_buildGroup(group.body, options.havingCrampedStyle());
-
-    if (inner.height === 0) {
-      // Render a small surd.
-      inner.height = options.fontMetrics().xHeight;
-    } // Some groups can return document fragments.  Handle those by wrapping
-    // them in a span.
-
-
-    inner = buildCommon.wrapFragment(inner, options); // Calculate the minimum size for the \surd delimiter
-
-    var metrics = options.fontMetrics();
-    var theta = metrics.defaultRuleThickness;
-    var phi = theta;
-
-    if (options.style.id < src_Style.TEXT.id) {
-      phi = options.fontMetrics().xHeight;
-    } // Calculate the clearance between the body and line
-
-
-    var lineClearance = theta + phi / 4;
-    var minDelimiterHeight = inner.height + inner.depth + lineClearance + theta; // Create a sqrt SVG of the required minimum size
-
-    var _delimiter$sqrtImage = delimiter.sqrtImage(minDelimiterHeight, options),
-        img = _delimiter$sqrtImage.span,
-        ruleWidth = _delimiter$sqrtImage.ruleWidth,
-        advanceWidth = _delimiter$sqrtImage.advanceWidth;
-
-    var delimDepth = img.height - ruleWidth; // Adjust the clearance based on the delimiter size
-
-    if (delimDepth > inner.height + inner.depth + lineClearance) {
-      lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2;
-    } // Shift the sqrt image
-
-
-    var imgShift = img.height - inner.height - lineClearance - ruleWidth;
-    inner.style.paddingLeft = advanceWidth + "em"; // Overlay the image and the argument.
-
-    var body = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: inner,
-        wrapperClasses: ["svg-align"]
-      }, {
-        type: "kern",
-        size: -(inner.height + imgShift)
-      }, {
-        type: "elem",
-        elem: img
-      }, {
-        type: "kern",
-        size: ruleWidth
-      }]
-    }, options);
-
-    if (!group.index) {
-      return buildCommon.makeSpan(["mord", "sqrt"], [body], options);
-    } else {
-      // Handle the optional root index
-      // The index is always in scriptscript style
-      var newOptions = options.havingStyle(src_Style.SCRIPTSCRIPT);
-      var rootm = buildHTML_buildGroup(group.index, newOptions, options); // The amount the index is shifted by. This is taken from the TeX
-      // source, in the definition of `\r@@t`.
-
-      var toShift = 0.6 * (body.height - body.depth); // Build a VList with the superscript shifted up correctly
-
-      var rootVList = buildCommon.makeVList({
-        positionType: "shift",
-        positionData: -toShift,
-        children: [{
-          type: "elem",
-          elem: rootm
-        }]
-      }, options); // Add a class surrounding it so we can add on the appropriate
-      // kerning
-
-      var rootVListWrap = buildCommon.makeSpan(["root"], [rootVList]);
-      return buildCommon.makeSpan(["mord", "sqrt"], [rootVListWrap, body], options);
-    }
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var body = group.body,
-        index = group.index;
-    return index ? new mathMLTree.MathNode("mroot", [buildMathML_buildGroup(body, options), buildMathML_buildGroup(index, options)]) : new mathMLTree.MathNode("msqrt", [buildMathML_buildGroup(body, options)]);
-  }
-});
-// CONCATENATED MODULE: ./src/functions/styling.js
-
-
-
-
-
-var styling_styleMap = {
-  "display": src_Style.DISPLAY,
-  "text": src_Style.TEXT,
-  "script": src_Style.SCRIPT,
-  "scriptscript": src_Style.SCRIPTSCRIPT
-};
-defineFunction({
-  type: "styling",
-  names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"],
-  props: {
-    numArgs: 0,
-    allowedInText: true
-  },
-  handler: function handler(_ref, args) {
-    var breakOnTokenText = _ref.breakOnTokenText,
-        funcName = _ref.funcName,
-        parser = _ref.parser;
-    // parse out the implicit body
-    var body = parser.parseExpression(true, breakOnTokenText); // TODO: Refactor to avoid duplicating styleMap in multiple places (e.g.
-    // here and in buildHTML and de-dupe the enumeration of all the styles).
-    // $FlowFixMe: The names above exactly match the styles.
-
-    var style = funcName.slice(1, funcName.length - 5);
-    return {
-      type: "styling",
-      mode: parser.mode,
-      // Figure out what style to use by pulling out the style from
-      // the function name
-      style: style,
-      body: body
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    // Style changes are handled in the TeXbook on pg. 442, Rule 3.
-    var newStyle = styling_styleMap[group.style];
-    var newOptions = options.havingStyle(newStyle).withFont('');
-    return sizingGroup(group.body, newOptions, options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    // Figure out what style we're changing to.
-    var newStyle = styling_styleMap[group.style];
-    var newOptions = options.havingStyle(newStyle);
-    var inner = buildMathML_buildExpression(group.body, newOptions);
-    var node = new mathMLTree.MathNode("mstyle", inner);
-    var styleAttributes = {
-      "display": ["0", "true"],
-      "text": ["0", "false"],
-      "script": ["1", "false"],
-      "scriptscript": ["2", "false"]
-    };
-    var attr = styleAttributes[group.style];
-    node.setAttribute("scriptlevel", attr[0]);
-    node.setAttribute("displaystyle", attr[1]);
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/supsub.js
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/**
- * Sometimes, groups perform special rules when they have superscripts or
- * subscripts attached to them. This function lets the `supsub` group know that
- * Sometimes, groups perform special rules when they have superscripts or
- * its inner element should handle the superscripts and subscripts instead of
- * handling them itself.
- */
-var supsub_htmlBuilderDelegate = function htmlBuilderDelegate(group, options) {
-  var base = group.base;
-
-  if (!base) {
-    return null;
-  } else if (base.type === "op") {
-    // Operators handle supsubs differently when they have limits
-    // (e.g. `\displaystyle\sum_2^3`)
-    var delegate = base.limits && (options.style.size === src_Style.DISPLAY.size || base.alwaysHandleSupSub);
-    return delegate ? op_htmlBuilder : null;
-  } else if (base.type === "operatorname") {
-    var _delegate = base.alwaysHandleSupSub && (options.style.size === src_Style.DISPLAY.size || base.limits);
-
-    return _delegate ? operatorname_htmlBuilder : null;
-  } else if (base.type === "accent") {
-    return utils.isCharacterBox(base.base) ? accent_htmlBuilder : null;
-  } else if (base.type === "horizBrace") {
-    var isSup = !group.sub;
-    return isSup === base.isOver ? horizBrace_htmlBuilder : null;
-  } else {
-    return null;
-  }
-}; // Super scripts and subscripts, whose precise placement can depend on other
-// functions that precede them.
-
-
-defineFunctionBuilders({
-  type: "supsub",
-  htmlBuilder: function htmlBuilder(group, options) {
-    // Superscript and subscripts are handled in the TeXbook on page
-    // 445-446, rules 18(a-f).
-    // Here is where we defer to the inner group if it should handle
-    // superscripts and subscripts itself.
-    var builderDelegate = supsub_htmlBuilderDelegate(group, options);
-
-    if (builderDelegate) {
-      return builderDelegate(group, options);
-    }
-
-    var valueBase = group.base,
-        valueSup = group.sup,
-        valueSub = group.sub;
-    var base = buildHTML_buildGroup(valueBase, options);
-    var supm;
-    var subm;
-    var metrics = options.fontMetrics(); // Rule 18a
-
-    var supShift = 0;
-    var subShift = 0;
-    var isCharacterBox = valueBase && utils.isCharacterBox(valueBase);
-
-    if (valueSup) {
-      var newOptions = options.havingStyle(options.style.sup());
-      supm = buildHTML_buildGroup(valueSup, newOptions, options);
-
-      if (!isCharacterBox) {
-        supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier;
-      }
-    }
-
-    if (valueSub) {
-      var _newOptions = options.havingStyle(options.style.sub());
-
-      subm = buildHTML_buildGroup(valueSub, _newOptions, options);
-
-      if (!isCharacterBox) {
-        subShift = base.depth + _newOptions.fontMetrics().subDrop * _newOptions.sizeMultiplier / options.sizeMultiplier;
-      }
-    } // Rule 18c
-
-
-    var minSupShift;
-
-    if (options.style === src_Style.DISPLAY) {
-      minSupShift = metrics.sup1;
-    } else if (options.style.cramped) {
-      minSupShift = metrics.sup3;
-    } else {
-      minSupShift = metrics.sup2;
-    } // scriptspace is a font-size-independent size, so scale it
-    // appropriately for use as the marginRight.
-
-
-    var multiplier = options.sizeMultiplier;
-    var marginRight = 0.5 / metrics.ptPerEm / multiplier + "em";
-    var marginLeft = null;
-
-    if (subm) {
-      // Subscripts shouldn't be shifted by the base's italic correction.
-      // Account for that by shifting the subscript back the appropriate
-      // amount. Note we only do this when the base is a single symbol.
-      var isOiint = group.base && group.base.type === "op" && group.base.name && (group.base.name === "\\oiint" || group.base.name === "\\oiiint");
-
-      if (base instanceof domTree_SymbolNode || isOiint) {
-        // $FlowFixMe
-        marginLeft = -base.italic + "em";
-      }
-    }
-
-    var supsub;
-
-    if (supm && subm) {
-      supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);
-      subShift = Math.max(subShift, metrics.sub2);
-      var ruleWidth = metrics.defaultRuleThickness; // Rule 18e
-
-      var maxWidth = 4 * ruleWidth;
-
-      if (supShift - supm.depth - (subm.height - subShift) < maxWidth) {
-        subShift = maxWidth - (supShift - supm.depth) + subm.height;
-        var psi = 0.8 * metrics.xHeight - (supShift - supm.depth);
-
-        if (psi > 0) {
-          supShift += psi;
-          subShift -= psi;
-        }
-      }
-
-      var vlistElem = [{
-        type: "elem",
-        elem: subm,
-        shift: subShift,
-        marginRight: marginRight,
-        marginLeft: marginLeft
-      }, {
-        type: "elem",
-        elem: supm,
-        shift: -supShift,
-        marginRight: marginRight
-      }];
-      supsub = buildCommon.makeVList({
-        positionType: "individualShift",
-        children: vlistElem
-      }, options);
-    } else if (subm) {
-      // Rule 18b
-      subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight);
-      var _vlistElem = [{
-        type: "elem",
-        elem: subm,
-        marginLeft: marginLeft,
-        marginRight: marginRight
-      }];
-      supsub = buildCommon.makeVList({
-        positionType: "shift",
-        positionData: subShift,
-        children: _vlistElem
-      }, options);
-    } else if (supm) {
-      // Rule 18c, d
-      supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);
-      supsub = buildCommon.makeVList({
-        positionType: "shift",
-        positionData: -supShift,
-        children: [{
-          type: "elem",
-          elem: supm,
-          marginRight: marginRight
-        }]
-      }, options);
-    } else {
-      throw new Error("supsub must have either sup or sub.");
-    } // Wrap the supsub vlist in a span.msupsub to reset text-align.
-
-
-    var mclass = getTypeOfDomTree(base, "right") || "mord";
-    return buildCommon.makeSpan([mclass], [base, buildCommon.makeSpan(["msupsub"], [supsub])], options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    // Is the inner group a relevant horizonal brace?
-    var isBrace = false;
-    var isOver;
-    var isSup;
-    var horizBrace = checkNodeType(group.base, "horizBrace");
-
-    if (horizBrace) {
-      isSup = !!group.sup;
-
-      if (isSup === horizBrace.isOver) {
-        isBrace = true;
-        isOver = horizBrace.isOver;
-      }
-    }
-
-    if (group.base && (group.base.type === "op" || group.base.type === "operatorname")) {
-      group.base.parentIsSupSub = true;
-    }
-
-    var children = [buildMathML_buildGroup(group.base, options)];
-
-    if (group.sub) {
-      children.push(buildMathML_buildGroup(group.sub, options));
-    }
-
-    if (group.sup) {
-      children.push(buildMathML_buildGroup(group.sup, options));
-    }
-
-    var nodeType;
-
-    if (isBrace) {
-      nodeType = isOver ? "mover" : "munder";
-    } else if (!group.sub) {
-      var base = group.base;
-
-      if (base && base.type === "op" && base.limits && (options.style === src_Style.DISPLAY || base.alwaysHandleSupSub)) {
-        nodeType = "mover";
-      } else if (base && base.type === "operatorname" && base.alwaysHandleSupSub && (base.limits || options.style === src_Style.DISPLAY)) {
-        nodeType = "mover";
-      } else {
-        nodeType = "msup";
-      }
-    } else if (!group.sup) {
-      var _base = group.base;
-
-      if (_base && _base.type === "op" && _base.limits && (options.style === src_Style.DISPLAY || _base.alwaysHandleSupSub)) {
-        nodeType = "munder";
-      } else if (_base && _base.type === "operatorname" && _base.alwaysHandleSupSub && (_base.limits || options.style === src_Style.DISPLAY)) {
-        nodeType = "munder";
-      } else {
-        nodeType = "msub";
-      }
-    } else {
-      var _base2 = group.base;
-
-      if (_base2 && _base2.type === "op" && _base2.limits && options.style === src_Style.DISPLAY) {
-        nodeType = "munderover";
-      } else if (_base2 && _base2.type === "operatorname" && _base2.alwaysHandleSupSub && (options.style === src_Style.DISPLAY || _base2.limits)) {
-        nodeType = "munderover";
-      } else {
-        nodeType = "msubsup";
-      }
-    }
-
-    var node = new mathMLTree.MathNode(nodeType, children);
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/symbolsOp.js
-
-
-
- // Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js.
-
-defineFunctionBuilders({
-  type: "atom",
-  htmlBuilder: function htmlBuilder(group, options) {
-    return buildCommon.mathsym(group.text, group.mode, options, ["m" + group.family]);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var node = new mathMLTree.MathNode("mo", [buildMathML_makeText(group.text, group.mode)]);
-
-    if (group.family === "bin") {
-      var variant = buildMathML_getVariant(group, options);
-
-      if (variant === "bold-italic") {
-        node.setAttribute("mathvariant", variant);
-      }
-    } else if (group.family === "punct") {
-      node.setAttribute("separator", "true");
-    } else if (group.family === "open" || group.family === "close") {
-      // Delims built here should not stretch vertically.
-      // See delimsizing.js for stretchy delims.
-      node.setAttribute("stretchy", "false");
-    }
-
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/symbolsOrd.js
-
-
-
-
-// "mathord" and "textord" ParseNodes created in Parser.js from symbol Groups in
-var defaultVariant = {
-  "mi": "italic",
-  "mn": "normal",
-  "mtext": "normal"
-};
-defineFunctionBuilders({
-  type: "mathord",
-  htmlBuilder: function htmlBuilder(group, options) {
-    return buildCommon.makeOrd(group, options, "mathord");
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var node = new mathMLTree.MathNode("mi", [buildMathML_makeText(group.text, group.mode, options)]);
-    var variant = buildMathML_getVariant(group, options) || "italic";
-
-    if (variant !== defaultVariant[node.type]) {
-      node.setAttribute("mathvariant", variant);
-    }
-
-    return node;
-  }
-});
-defineFunctionBuilders({
-  type: "textord",
-  htmlBuilder: function htmlBuilder(group, options) {
-    return buildCommon.makeOrd(group, options, "textord");
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var text = buildMathML_makeText(group.text, group.mode, options);
-    var variant = buildMathML_getVariant(group, options) || "normal";
-    var node;
-
-    if (group.mode === 'text') {
-      node = new mathMLTree.MathNode("mtext", [text]);
-    } else if (/[0-9]/.test(group.text)) {
-      // TODO(kevinb) merge adjacent <mn> nodes
-      // do it as a post processing step
-      node = new mathMLTree.MathNode("mn", [text]);
-    } else if (group.text === "\\prime") {
-      node = new mathMLTree.MathNode("mo", [text]);
-    } else {
-      node = new mathMLTree.MathNode("mi", [text]);
-    }
-
-    if (variant !== defaultVariant[node.type]) {
-      node.setAttribute("mathvariant", variant);
-    }
-
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/symbolsSpacing.js
-
-
-
- // A map of CSS-based spacing functions to their CSS class.
-
-var cssSpace = {
-  "\\nobreak": "nobreak",
-  "\\allowbreak": "allowbreak"
-}; // A lookup table to determine whether a spacing function/symbol should be
-// treated like a regular space character.  If a symbol or command is a key
-// in this table, then it should be a regular space character.  Furthermore,
-// the associated value may have a `className` specifying an extra CSS class
-// to add to the created `span`.
-
-var regularSpace = {
-  " ": {},
-  "\\ ": {},
-  "~": {
-    className: "nobreak"
-  },
-  "\\space": {},
-  "\\nobreakspace": {
-    className: "nobreak"
-  }
-}; // ParseNode<"spacing"> created in Parser.js from the "spacing" symbol Groups in
-// src/symbols.js.
-
-defineFunctionBuilders({
-  type: "spacing",
-  htmlBuilder: function htmlBuilder(group, options) {
-    if (regularSpace.hasOwnProperty(group.text)) {
-      var className = regularSpace[group.text].className || ""; // Spaces are generated by adding an actual space. Each of these
-      // things has an entry in the symbols table, so these will be turned
-      // into appropriate outputs.
-
-      if (group.mode === "text") {
-        var ord = buildCommon.makeOrd(group, options, "textord");
-        ord.classes.push(className);
-        return ord;
-      } else {
-        return buildCommon.makeSpan(["mspace", className], [buildCommon.mathsym(group.text, group.mode, options)], options);
-      }
-    } else if (cssSpace.hasOwnProperty(group.text)) {
-      // Spaces based on just a CSS class.
-      return buildCommon.makeSpan(["mspace", cssSpace[group.text]], [], options);
-    } else {
-      throw new src_ParseError("Unknown type of space \"" + group.text + "\"");
-    }
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var node;
-
-    if (regularSpace.hasOwnProperty(group.text)) {
-      node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("\xA0")]);
-    } else if (cssSpace.hasOwnProperty(group.text)) {
-      // CSS-based MathML spaces (\nobreak, \allowbreak) are ignored
-      return new mathMLTree.MathNode("mspace");
-    } else {
-      throw new src_ParseError("Unknown type of space \"" + group.text + "\"");
-    }
-
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/tag.js
-
-
-
-
-var tag_pad = function pad() {
-  var padNode = new mathMLTree.MathNode("mtd", []);
-  padNode.setAttribute("width", "50%");
-  return padNode;
-};
-
-defineFunctionBuilders({
-  type: "tag",
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var table = new mathMLTree.MathNode("mtable", [new mathMLTree.MathNode("mtr", [tag_pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.body, options)]), tag_pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.tag, options)])])]);
-    table.setAttribute("width", "100%");
-    return table; // TODO: Left-aligned tags.
-    // Currently, the group and options passed here do not contain
-    // enough info to set tag alignment. `leqno` is in Settings but it is
-    // not passed to Options. On the HTML side, leqno is
-    // set by a CSS class applied in buildTree.js. That would have worked
-    // in MathML if browsers supported <mlabeledtr>. Since they don't, we
-    // need to rewrite the way this function is called.
-  }
-});
-// CONCATENATED MODULE: ./src/functions/text.js
-
-
-
- // Non-mathy text, possibly in a font
-
-var textFontFamilies = {
-  "\\text": undefined,
-  "\\textrm": "textrm",
-  "\\textsf": "textsf",
-  "\\texttt": "texttt",
-  "\\textnormal": "textrm"
-};
-var textFontWeights = {
-  "\\textbf": "textbf",
-  "\\textmd": "textmd"
-};
-var textFontShapes = {
-  "\\textit": "textit",
-  "\\textup": "textup"
-};
-
-var optionsWithFont = function optionsWithFont(group, options) {
-  var font = group.font; // Checks if the argument is a font family or a font style.
-
-  if (!font) {
-    return options;
-  } else if (textFontFamilies[font]) {
-    return options.withTextFontFamily(textFontFamilies[font]);
-  } else if (textFontWeights[font]) {
-    return options.withTextFontWeight(textFontWeights[font]);
-  } else {
-    return options.withTextFontShape(textFontShapes[font]);
-  }
-};
-
-defineFunction({
-  type: "text",
-  names: [// Font families
-  "\\text", "\\textrm", "\\textsf", "\\texttt", "\\textnormal", // Font weights
-  "\\textbf", "\\textmd", // Font Shapes
-  "\\textit", "\\textup"],
-  props: {
-    numArgs: 1,
-    argTypes: ["text"],
-    greediness: 2,
-    allowedInText: true
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser,
-        funcName = _ref.funcName;
-    var body = args[0];
-    return {
-      type: "text",
-      mode: parser.mode,
-      body: defineFunction_ordargument(body),
-      font: funcName
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    var newOptions = optionsWithFont(group, options);
-    var inner = buildHTML_buildExpression(group.body, newOptions, true);
-    return buildCommon.makeSpan(["mord", "text"], buildCommon.tryCombineChars(inner), newOptions);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var newOptions = optionsWithFont(group, options);
-    return buildExpressionRow(group.body, newOptions);
-  }
-});
-// CONCATENATED MODULE: ./src/functions/underline.js
-
-
-
-
-
-defineFunction({
-  type: "underline",
-  names: ["\\underline"],
-  props: {
-    numArgs: 1,
-    allowedInText: true
-  },
-  handler: function handler(_ref, args) {
-    var parser = _ref.parser;
-    return {
-      type: "underline",
-      mode: parser.mode,
-      body: args[0]
-    };
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    // Underlines are handled in the TeXbook pg 443, Rule 10.
-    // Build the inner group.
-    var innerGroup = buildHTML_buildGroup(group.body, options); // Create the line to go below the body
-
-    var line = buildCommon.makeLineSpan("underline-line", options); // Generate the vlist, with the appropriate kerns
-
-    var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;
-    var vlist = buildCommon.makeVList({
-      positionType: "top",
-      positionData: innerGroup.height,
-      children: [{
-        type: "kern",
-        size: defaultRuleThickness
-      }, {
-        type: "elem",
-        elem: line
-      }, {
-        type: "kern",
-        size: 3 * defaultRuleThickness
-      }, {
-        type: "elem",
-        elem: innerGroup
-      }]
-    }, options);
-    return buildCommon.makeSpan(["mord", "underline"], [vlist], options);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203E")]);
-    operator.setAttribute("stretchy", "true");
-    var node = new mathMLTree.MathNode("munder", [buildMathML_buildGroup(group.body, options), operator]);
-    node.setAttribute("accentunder", "true");
-    return node;
-  }
-});
-// CONCATENATED MODULE: ./src/functions/verb.js
-
-
-
-
-defineFunction({
-  type: "verb",
-  names: ["\\verb"],
-  props: {
-    numArgs: 0,
-    allowedInText: true
-  },
-  handler: function handler(context, args, optArgs) {
-    // \verb and \verb* are dealt with directly in Parser.js.
-    // If we end up here, it's because of a failure to match the two delimiters
-    // in the regex in Lexer.js.  LaTeX raises the following error when \verb is
-    // terminated by end of line (or file).
-    throw new src_ParseError("\\verb ended by end of line instead of matching delimiter");
-  },
-  htmlBuilder: function htmlBuilder(group, options) {
-    var text = makeVerb(group);
-    var body = []; // \verb enters text mode and therefore is sized like \textstyle
-
-    var newOptions = options.havingStyle(options.style.text());
-
-    for (var i = 0; i < text.length; i++) {
-      var c = text[i];
-
-      if (c === '~') {
-        c = '\\textasciitilde';
-      }
-
-      body.push(buildCommon.makeSymbol(c, "Typewriter-Regular", group.mode, newOptions, ["mord", "texttt"]));
-    }
-
-    return buildCommon.makeSpan(["mord", "text"].concat(newOptions.sizingClasses(options)), buildCommon.tryCombineChars(body), newOptions);
-  },
-  mathmlBuilder: function mathmlBuilder(group, options) {
-    var text = new mathMLTree.TextNode(makeVerb(group));
-    var node = new mathMLTree.MathNode("mtext", [text]);
-    node.setAttribute("mathvariant", "monospace");
-    return node;
-  }
-});
-/**
- * Converts verb group into body string.
- *
- * \verb* replaces each space with an open box \u2423
- * \verb replaces each space with a no-break space \xA0
- */
-
-var makeVerb = function makeVerb(group) {
-  return group.body.replace(/ /g, group.star ? "\u2423" : '\xA0');
-};
-// CONCATENATED MODULE: ./src/functions.js
-/** Include this to ensure that all functions are defined. */
-
-var functions = _functions;
-/* harmony default export */ var src_functions = (functions); // TODO(kevinb): have functions return an object and call defineFunction with
-// that object in this file instead of relying on side-effects.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-// CONCATENATED MODULE: ./src/Lexer.js
-/**
- * The Lexer class handles tokenizing the input in various ways. Since our
- * parser expects us to be able to backtrack, the lexer allows lexing from any
- * given starting point.
- *
- * Its main exposed function is the `lex` function, which takes a position to
- * lex from and a type of token to lex. It defers to the appropriate `_innerLex`
- * function.
- *
- * The various `_innerLex` functions perform the actual lexing of different
- * kinds.
- */
-
-
-
-
-/* The following tokenRegex
- * - matches typical whitespace (but not NBSP etc.) using its first group
- * - does not match any control character \x00-\x1f except whitespace
- * - does not match a bare backslash
- * - matches any ASCII character except those just mentioned
- * - does not match the BMP private use area \uE000-\uF8FF
- * - does not match bare surrogate code units
- * - matches any BMP character except for those just described
- * - matches any valid Unicode surrogate pair
- * - matches a backslash followed by one or more letters
- * - matches a backslash followed by any BMP character, including newline
- * Just because the Lexer matches something doesn't mean it's valid input:
- * If there is no matching function or symbol definition, the Parser will
- * still reject the input.
- */
-var spaceRegexString = "[ \r\n\t]";
-var controlWordRegexString = "\\\\[a-zA-Z@]+";
-var controlSymbolRegexString = "\\\\[^\uD800-\uDFFF]";
-var controlWordWhitespaceRegexString = "" + controlWordRegexString + spaceRegexString + "*";
-var controlWordWhitespaceRegex = new RegExp("^(" + controlWordRegexString + ")" + spaceRegexString + "*$");
-var combiningDiacriticalMarkString = "[\u0300-\u036F]";
-var combiningDiacriticalMarksEndRegex = new RegExp(combiningDiacriticalMarkString + "+$");
-var tokenRegexString = "(" + spaceRegexString + "+)|" + // whitespace
-"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + ( // single codepoint
-combiningDiacriticalMarkString + "*") + // ...plus accents
-"|[\uD800-\uDBFF][\uDC00-\uDFFF]" + ( // surrogate pair
-combiningDiacriticalMarkString + "*") + // ...plus accents
-"|\\\\verb\\*([^]).*?\\3" + // \verb*
-"|\\\\verb([^*a-zA-Z]).*?\\4" + // \verb unstarred
-"|\\\\operatorname\\*" + ( // \operatorname*
-"|" + controlWordWhitespaceRegexString) + ( // \macroName + spaces
-"|" + controlSymbolRegexString + ")"); // \\, \', etc.
-
-/** Main Lexer class */
-
-var Lexer_Lexer =
-/*#__PURE__*/
-function () {
-  // category codes, only supports comment characters (14) for now
-  function Lexer(input, settings) {
-    this.input = void 0;
-    this.settings = void 0;
-    this.tokenRegex = void 0;
-    this.catcodes = void 0;
-    // Separate accents from characters
-    this.input = input;
-    this.settings = settings;
-    this.tokenRegex = new RegExp(tokenRegexString, 'g');
-    this.catcodes = {
-      "%": 14 // comment character
-
-    };
-  }
-
-  var _proto = Lexer.prototype;
-
-  _proto.setCatcode = function setCatcode(char, code) {
-    this.catcodes[char] = code;
-  }
-  /**
-   * This function lexes a single token.
-   */
-  ;
-
-  _proto.lex = function lex() {
-    var input = this.input;
-    var pos = this.tokenRegex.lastIndex;
-
-    if (pos === input.length) {
-      return new Token_Token("EOF", new SourceLocation(this, pos, pos));
-    }
-
-    var match = this.tokenRegex.exec(input);
-
-    if (match === null || match.index !== pos) {
-      throw new src_ParseError("Unexpected character: '" + input[pos] + "'", new Token_Token(input[pos], new SourceLocation(this, pos, pos + 1)));
-    }
-
-    var text = match[2] || " ";
-
-    if (this.catcodes[text] === 14) {
-      // comment character
-      var nlIndex = input.indexOf('\n', this.tokenRegex.lastIndex);
-
-      if (nlIndex === -1) {
-        this.tokenRegex.lastIndex = input.length; // EOF
-
-        this.settings.reportNonstrict("commentAtEnd", "% comment has no terminating newline; LaTeX would " + "fail because of commenting the end of math mode (e.g. $)");
-      } else {
-        this.tokenRegex.lastIndex = nlIndex + 1;
-      }
-
-      return this.lex();
-    } // Trim any trailing whitespace from control word match
-
-
-    var controlMatch = text.match(controlWordWhitespaceRegex);
-
-    if (controlMatch) {
-      text = controlMatch[1];
-    }
-
-    return new Token_Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex));
-  };
-
-  return Lexer;
-}();
-
-
-// CONCATENATED MODULE: ./src/Namespace.js
-/**
- * A `Namespace` refers to a space of nameable things like macros or lengths,
- * which can be `set` either globally or local to a nested group, using an
- * undo stack similar to how TeX implements this functionality.
- * Performance-wise, `get` and local `set` take constant time, while global
- * `set` takes time proportional to the depth of group nesting.
- */
-
-
-var Namespace_Namespace =
-/*#__PURE__*/
-function () {
-  /**
-   * Both arguments are optional.  The first argument is an object of
-   * built-in mappings which never change.  The second argument is an object
-   * of initial (global-level) mappings, which will constantly change
-   * according to any global/top-level `set`s done.
-   */
-  function Namespace(builtins, globalMacros) {
-    if (builtins === void 0) {
-      builtins = {};
-    }
-
-    if (globalMacros === void 0) {
-      globalMacros = {};
-    }
-
-    this.current = void 0;
-    this.builtins = void 0;
-    this.undefStack = void 0;
-    this.current = globalMacros;
-    this.builtins = builtins;
-    this.undefStack = [];
-  }
-  /**
-   * Start a new nested group, affecting future local `set`s.
-   */
-
-
-  var _proto = Namespace.prototype;
-
-  _proto.beginGroup = function beginGroup() {
-    this.undefStack.push({});
-  }
-  /**
-   * End current nested group, restoring values before the group began.
-   */
-  ;
-
-  _proto.endGroup = function endGroup() {
-    if (this.undefStack.length === 0) {
-      throw new src_ParseError("Unbalanced namespace destruction: attempt " + "to pop global namespace; please report this as a bug");
-    }
-
-    var undefs = this.undefStack.pop();
-
-    for (var undef in undefs) {
-      if (undefs.hasOwnProperty(undef)) {
-        if (undefs[undef] === undefined) {
-          delete this.current[undef];
-        } else {
-          this.current[undef] = undefs[undef];
-        }
-      }
-    }
-  }
-  /**
-   * Detect whether `name` has a definition.  Equivalent to
-   * `get(name) != null`.
-   */
-  ;
-
-  _proto.has = function has(name) {
-    return this.current.hasOwnProperty(name) || this.builtins.hasOwnProperty(name);
-  }
-  /**
-   * Get the current value of a name, or `undefined` if there is no value.
-   *
-   * Note: Do not use `if (namespace.get(...))` to detect whether a macro
-   * is defined, as the definition may be the empty string which evaluates
-   * to `false` in JavaScript.  Use `if (namespace.get(...) != null)` or
-   * `if (namespace.has(...))`.
-   */
-  ;
-
-  _proto.get = function get(name) {
-    if (this.current.hasOwnProperty(name)) {
-      return this.current[name];
-    } else {
-      return this.builtins[name];
-    }
-  }
-  /**
-   * Set the current value of a name, and optionally set it globally too.
-   * Local set() sets the current value and (when appropriate) adds an undo
-   * operation to the undo stack.  Global set() may change the undo
-   * operation at every level, so takes time linear in their number.
-   */
-  ;
-
-  _proto.set = function set(name, value, global) {
-    if (global === void 0) {
-      global = false;
-    }
-
-    if (global) {
-      // Global set is equivalent to setting in all groups.  Simulate this
-      // by destroying any undos currently scheduled for this name,
-      // and adding an undo with the *new* value (in case it later gets
-      // locally reset within this environment).
-      for (var i = 0; i < this.undefStack.length; i++) {
-        delete this.undefStack[i][name];
-      }
-
-      if (this.undefStack.length > 0) {
-        this.undefStack[this.undefStack.length - 1][name] = value;
-      }
-    } else {
-      // Undo this set at end of this group (possibly to `undefined`),
-      // unless an undo is already in place, in which case that older
-      // value is the correct one.
-      var top = this.undefStack[this.undefStack.length - 1];
-
-      if (top && !top.hasOwnProperty(name)) {
-        top[name] = this.current[name];
-      }
-    }
-
-    this.current[name] = value;
-  };
-
-  return Namespace;
-}();
-
-
-// CONCATENATED MODULE: ./src/macros.js
-/**
- * Predefined macros for KaTeX.
- * This can be used to define some commands in terms of others.
- */
-
-
-
-
-
-var builtinMacros = {};
-/* harmony default export */ var macros = (builtinMacros); // This function might one day accept an additional argument and do more things.
-
-function defineMacro(name, body) {
-  builtinMacros[name] = body;
-} //////////////////////////////////////////////////////////////////////
-// macro tools
-// LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2
-// TeX source: \long\def\@firstoftwo#1#2{#1}
-
-defineMacro("\\@firstoftwo", function (context) {
-  var args = context.consumeArgs(2);
-  return {
-    tokens: args[0],
-    numArgs: 0
-  };
-}); // LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1
-// TeX source: \long\def\@secondoftwo#1#2{#2}
-
-defineMacro("\\@secondoftwo", function (context) {
-  var args = context.consumeArgs(2);
-  return {
-    tokens: args[1],
-    numArgs: 0
-  };
-}); // LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded)
-// symbol.  If it matches #1, then the macro expands to #2; otherwise, #3.
-// Note, however, that it does not consume the next symbol in either case.
-
-defineMacro("\\@ifnextchar", function (context) {
-  var args = context.consumeArgs(3); // symbol, if, else
-
-  var nextToken = context.future();
-
-  if (args[0].length === 1 && args[0][0].text === nextToken.text) {
-    return {
-      tokens: args[1],
-      numArgs: 0
-    };
-  } else {
-    return {
-      tokens: args[2],
-      numArgs: 0
-    };
-  }
-}); // LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol.
-// If it is `*`, then it consumes the symbol, and the macro expands to #1;
-// otherwise, the macro expands to #2 (without consuming the symbol).
-// TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}
-
-defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); // LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode
-
-defineMacro("\\TextOrMath", function (context) {
-  var args = context.consumeArgs(2);
-
-  if (context.mode === 'text') {
-    return {
-      tokens: args[0],
-      numArgs: 0
-    };
-  } else {
-    return {
-      tokens: args[1],
-      numArgs: 0
-    };
-  }
-}); // Lookup table for parsing numbers in base 8 through 16
-
-var digitToNumber = {
-  "0": 0,
-  "1": 1,
-  "2": 2,
-  "3": 3,
-  "4": 4,
-  "5": 5,
-  "6": 6,
-  "7": 7,
-  "8": 8,
-  "9": 9,
-  "a": 10,
-  "A": 10,
-  "b": 11,
-  "B": 11,
-  "c": 12,
-  "C": 12,
-  "d": 13,
-  "D": 13,
-  "e": 14,
-  "E": 14,
-  "f": 15,
-  "F": 15
-}; // TeX \char makes a literal character (catcode 12) using the following forms:
-// (see The TeXBook, p. 43)
-//   \char123  -- decimal
-//   \char'123 -- octal
-//   \char"123 -- hex
-//   \char`x   -- character that can be written (i.e. isn't active)
-//   \char`\x  -- character that cannot be written (e.g. %)
-// These all refer to characters from the font, so we turn them into special
-// calls to a function \@char dealt with in the Parser.
-
-defineMacro("\\char", function (context) {
-  var token = context.popToken();
-  var base;
-  var number = '';
-
-  if (token.text === "'") {
-    base = 8;
-    token = context.popToken();
-  } else if (token.text === '"') {
-    base = 16;
-    token = context.popToken();
-  } else if (token.text === "`") {
-    token = context.popToken();
-
-    if (token.text[0] === "\\") {
-      number = token.text.charCodeAt(1);
-    } else if (token.text === "EOF") {
-      throw new src_ParseError("\\char` missing argument");
-    } else {
-      number = token.text.charCodeAt(0);
-    }
-  } else {
-    base = 10;
-  }
-
-  if (base) {
-    // Parse a number in the given base, starting with first `token`.
-    number = digitToNumber[token.text];
-
-    if (number == null || number >= base) {
-      throw new src_ParseError("Invalid base-" + base + " digit " + token.text);
-    }
-
-    var digit;
-
-    while ((digit = digitToNumber[context.future().text]) != null && digit < base) {
-      number *= base;
-      number += digit;
-      context.popToken();
-    }
-  }
-
-  return "\\@char{" + number + "}";
-}); // Basic support for macro definitions:
-//     \def\macro{expansion}
-//     \def\macro#1{expansion}
-//     \def\macro#1#2{expansion}
-//     \def\macro#1#2#3#4#5#6#7#8#9{expansion}
-// Also the \gdef and \global\def equivalents
-
-var macros_def = function def(context, global) {
-  var arg = context.consumeArgs(1)[0];
-
-  if (arg.length !== 1) {
-    throw new src_ParseError("\\gdef's first argument must be a macro name");
-  }
-
-  var name = arg[0].text; // Count argument specifiers, and check they are in the order #1 #2 ...
-
-  var numArgs = 0;
-  arg = context.consumeArgs(1)[0];
-
-  while (arg.length === 1 && arg[0].text === "#") {
-    arg = context.consumeArgs(1)[0];
-
-    if (arg.length !== 1) {
-      throw new src_ParseError("Invalid argument number length \"" + arg.length + "\"");
-    }
-
-    if (!/^[1-9]$/.test(arg[0].text)) {
-      throw new src_ParseError("Invalid argument number \"" + arg[0].text + "\"");
-    }
-
-    numArgs++;
-
-    if (parseInt(arg[0].text) !== numArgs) {
-      throw new src_ParseError("Argument number \"" + arg[0].text + "\" out of order");
-    }
-
-    arg = context.consumeArgs(1)[0];
-  } // Final arg is the expansion of the macro
-
-
-  context.macros.set(name, {
-    tokens: arg,
-    numArgs: numArgs
-  }, global);
-  return '';
-};
-
-defineMacro("\\gdef", function (context) {
-  return macros_def(context, true);
-});
-defineMacro("\\def", function (context) {
-  return macros_def(context, false);
-});
-defineMacro("\\global", function (context) {
-  var next = context.consumeArgs(1)[0];
-
-  if (next.length !== 1) {
-    throw new src_ParseError("Invalid command after \\global");
-  }
-
-  var command = next[0].text; // TODO: Should expand command
-
-  if (command === "\\def") {
-    // \global\def is equivalent to \gdef
-    return macros_def(context, true);
-  } else {
-    throw new src_ParseError("Invalid command '" + command + "' after \\global");
-  }
-}); // \newcommand{\macro}[args]{definition}
-// \renewcommand{\macro}[args]{definition}
-// TODO: Optional arguments: \newcommand{\macro}[args][default]{definition}
-
-var macros_newcommand = function newcommand(context, existsOK, nonexistsOK) {
-  var arg = context.consumeArgs(1)[0];
-
-  if (arg.length !== 1) {
-    throw new src_ParseError("\\newcommand's first argument must be a macro name");
-  }
-
-  var name = arg[0].text;
-  var exists = context.isDefined(name);
-
-  if (exists && !existsOK) {
-    throw new src_ParseError("\\newcommand{" + name + "} attempting to redefine " + (name + "; use \\renewcommand"));
-  }
-
-  if (!exists && !nonexistsOK) {
-    throw new src_ParseError("\\renewcommand{" + name + "} when command " + name + " " + "does not yet exist; use \\newcommand");
-  }
-
-  var numArgs = 0;
-  arg = context.consumeArgs(1)[0];
-
-  if (arg.length === 1 && arg[0].text === "[") {
-    var argText = '';
-    var token = context.expandNextToken();
-
-    while (token.text !== "]" && token.text !== "EOF") {
-      // TODO: Should properly expand arg, e.g., ignore {}s
-      argText += token.text;
-      token = context.expandNextToken();
-    }
-
-    if (!argText.match(/^\s*[0-9]+\s*$/)) {
-      throw new src_ParseError("Invalid number of arguments: " + argText);
-    }
-
-    numArgs = parseInt(argText);
-    arg = context.consumeArgs(1)[0];
-  } // Final arg is the expansion of the macro
-
-
-  context.macros.set(name, {
-    tokens: arg,
-    numArgs: numArgs
-  });
-  return '';
-};
-
-defineMacro("\\newcommand", function (context) {
-  return macros_newcommand(context, false, true);
-});
-defineMacro("\\renewcommand", function (context) {
-  return macros_newcommand(context, true, false);
-});
-defineMacro("\\providecommand", function (context) {
-  return macros_newcommand(context, true, true);
-}); //////////////////////////////////////////////////////////////////////
-// Grouping
-// \let\bgroup={ \let\egroup=}
-
-defineMacro("\\bgroup", "{");
-defineMacro("\\egroup", "}"); // Symbols from latex.ltx:
-// \def\lq{`}
-// \def\rq{'}
-// \def \aa {\r a}
-// \def \AA {\r A}
-
-defineMacro("\\lq", "`");
-defineMacro("\\rq", "'");
-defineMacro("\\aa", "\\r a");
-defineMacro("\\AA", "\\r A"); // Copyright (C) and registered (R) symbols. Use raw symbol in MathML.
-// \DeclareTextCommandDefault{\textcopyright}{\textcircled{c}}
-// \DeclareTextCommandDefault{\textregistered}{\textcircled{%
-//      \check@mathfonts\fontsize\sf@size\z@\math@fontsfalse\selectfont R}}
-// \DeclareRobustCommand{\copyright}{%
-//    \ifmmode{\nfss@text{\textcopyright}}\else\textcopyright\fi}
-
-defineMacro("\\textcopyright", "\\html@mathml{\\textcircled{c}}{\\char`©}");
-defineMacro("\\copyright", "\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");
-defineMacro("\\textregistered", "\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"); // Characters omitted from Unicode range 1D400–1D7FF
-
-defineMacro("\u212C", "\\mathscr{B}"); // script
-
-defineMacro("\u2130", "\\mathscr{E}");
-defineMacro("\u2131", "\\mathscr{F}");
-defineMacro("\u210B", "\\mathscr{H}");
-defineMacro("\u2110", "\\mathscr{I}");
-defineMacro("\u2112", "\\mathscr{L}");
-defineMacro("\u2133", "\\mathscr{M}");
-defineMacro("\u211B", "\\mathscr{R}");
-defineMacro("\u212D", "\\mathfrak{C}"); // Fraktur
-
-defineMacro("\u210C", "\\mathfrak{H}");
-defineMacro("\u2128", "\\mathfrak{Z}"); // Define \Bbbk with a macro that works in both HTML and MathML.
-
-defineMacro("\\Bbbk", "\\Bbb{k}"); // Unicode middle dot
-// The KaTeX fonts do not contain U+00B7. Instead, \cdotp displays
-// the dot at U+22C5 and gives it punct spacing.
-
-defineMacro("\xB7", "\\cdotp"); // \llap and \rlap render their contents in text mode
-
-defineMacro("\\llap", "\\mathllap{\\textrm{#1}}");
-defineMacro("\\rlap", "\\mathrlap{\\textrm{#1}}");
-defineMacro("\\clap", "\\mathclap{\\textrm{#1}}"); // \not is defined by base/fontmath.ltx via
-// \DeclareMathSymbol{\not}{\mathrel}{symbols}{"36}
-// It's thus treated like a \mathrel, but defined by a symbol that has zero
-// width but extends to the right.  We use \rlap to get that spacing.
-// For MathML we write U+0338 here. buildMathML.js will then do the overlay.
-
-defineMacro("\\not", '\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'); // Negated symbols from base/fontmath.ltx:
-// \def\neq{\not=} \let\ne=\neq
-// \DeclareRobustCommand
-//   \notin{\mathrel{\m@th\mathpalette\c@ncel\in}}
-// \def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}
-
-defineMacro("\\neq", "\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}");
-defineMacro("\\ne", "\\neq");
-defineMacro("\u2260", "\\neq");
-defineMacro("\\notin", "\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}" + "{\\mathrel{\\char`∉}}");
-defineMacro("\u2209", "\\notin"); // Unicode stacked relations
-
-defineMacro("\u2258", "\\html@mathml{" + "\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}" + "}{\\mathrel{\\char`\u2258}}");
-defineMacro("\u2259", "\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");
-defineMacro("\u225A", "\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");
-defineMacro("\u225B", "\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}" + "{\\mathrel{\\char`\u225B}}");
-defineMacro("\u225D", "\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}" + "{\\mathrel{\\char`\u225D}}");
-defineMacro("\u225E", "\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}" + "{\\mathrel{\\char`\u225E}}");
-defineMacro("\u225F", "\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}"); // Misc Unicode
-
-defineMacro("\u27C2", "\\perp");
-defineMacro("\u203C", "\\mathclose{!\\mkern-0.8mu!}");
-defineMacro("\u220C", "\\notni");
-defineMacro("\u231C", "\\ulcorner");
-defineMacro("\u231D", "\\urcorner");
-defineMacro("\u231E", "\\llcorner");
-defineMacro("\u231F", "\\lrcorner");
-defineMacro("\xA9", "\\copyright");
-defineMacro("\xAE", "\\textregistered");
-defineMacro("\uFE0F", "\\textregistered"); //////////////////////////////////////////////////////////////////////
-// LaTeX_2ε
-// \vdots{\vbox{\baselineskip4\p@  \lineskiplimit\z@
-// \kern6\p@\hbox{.}\hbox{.}\hbox{.}}}
-// We'll call \varvdots, which gets a glyph from symbols.js.
-// The zero-width rule gets us an equivalent to the vertical 6pt kern.
-
-defineMacro("\\vdots", "\\mathord{\\varvdots\\rule{0pt}{15pt}}");
-defineMacro("\u22EE", "\\vdots"); //////////////////////////////////////////////////////////////////////
-// amsmath.sty
-// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf
-// Italic Greek capital letters.  AMS defines these with \DeclareMathSymbol,
-// but they are equivalent to \mathit{\Letter}.
-
-defineMacro("\\varGamma", "\\mathit{\\Gamma}");
-defineMacro("\\varDelta", "\\mathit{\\Delta}");
-defineMacro("\\varTheta", "\\mathit{\\Theta}");
-defineMacro("\\varLambda", "\\mathit{\\Lambda}");
-defineMacro("\\varXi", "\\mathit{\\Xi}");
-defineMacro("\\varPi", "\\mathit{\\Pi}");
-defineMacro("\\varSigma", "\\mathit{\\Sigma}");
-defineMacro("\\varUpsilon", "\\mathit{\\Upsilon}");
-defineMacro("\\varPhi", "\\mathit{\\Phi}");
-defineMacro("\\varPsi", "\\mathit{\\Psi}");
-defineMacro("\\varOmega", "\\mathit{\\Omega}"); //\newcommand{\substack}[1]{\subarray{c}#1\endsubarray}
-
-defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"); // \renewcommand{\colon}{\nobreak\mskip2mu\mathpunct{}\nonscript
-// \mkern-\thinmuskip{:}\mskip6muplus1mu\relax}
-
-defineMacro("\\colon", "\\nobreak\\mskip2mu\\mathpunct{}" + "\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"); // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}}
-
-defineMacro("\\boxed", "\\fbox{$\\displaystyle{#1}$}"); // \def\iff{\DOTSB\;\Longleftrightarrow\;}
-// \def\implies{\DOTSB\;\Longrightarrow\;}
-// \def\impliedby{\DOTSB\;\Longleftarrow\;}
-
-defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;");
-defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;");
-defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); // AMSMath's automatic \dots, based on \mdots@@ macro.
-
-var dotsByToken = {
-  ',': '\\dotsc',
-  '\\not': '\\dotsb',
-  // \keybin@ checks for the following:
-  '+': '\\dotsb',
-  '=': '\\dotsb',
-  '<': '\\dotsb',
-  '>': '\\dotsb',
-  '-': '\\dotsb',
-  '*': '\\dotsb',
-  ':': '\\dotsb',
-  // Symbols whose definition starts with \DOTSB:
-  '\\DOTSB': '\\dotsb',
-  '\\coprod': '\\dotsb',
-  '\\bigvee': '\\dotsb',
-  '\\bigwedge': '\\dotsb',
-  '\\biguplus': '\\dotsb',
-  '\\bigcap': '\\dotsb',
-  '\\bigcup': '\\dotsb',
-  '\\prod': '\\dotsb',
-  '\\sum': '\\dotsb',
-  '\\bigotimes': '\\dotsb',
-  '\\bigoplus': '\\dotsb',
-  '\\bigodot': '\\dotsb',
-  '\\bigsqcup': '\\dotsb',
-  '\\And': '\\dotsb',
-  '\\longrightarrow': '\\dotsb',
-  '\\Longrightarrow': '\\dotsb',
-  '\\longleftarrow': '\\dotsb',
-  '\\Longleftarrow': '\\dotsb',
-  '\\longleftrightarrow': '\\dotsb',
-  '\\Longleftrightarrow': '\\dotsb',
-  '\\mapsto': '\\dotsb',
-  '\\longmapsto': '\\dotsb',
-  '\\hookrightarrow': '\\dotsb',
-  '\\doteq': '\\dotsb',
-  // Symbols whose definition starts with \mathbin:
-  '\\mathbin': '\\dotsb',
-  // Symbols whose definition starts with \mathrel:
-  '\\mathrel': '\\dotsb',
-  '\\relbar': '\\dotsb',
-  '\\Relbar': '\\dotsb',
-  '\\xrightarrow': '\\dotsb',
-  '\\xleftarrow': '\\dotsb',
-  // Symbols whose definition starts with \DOTSI:
-  '\\DOTSI': '\\dotsi',
-  '\\int': '\\dotsi',
-  '\\oint': '\\dotsi',
-  '\\iint': '\\dotsi',
-  '\\iiint': '\\dotsi',
-  '\\iiiint': '\\dotsi',
-  '\\idotsint': '\\dotsi',
-  // Symbols whose definition starts with \DOTSX:
-  '\\DOTSX': '\\dotsx'
-};
-defineMacro("\\dots", function (context) {
-  // TODO: If used in text mode, should expand to \textellipsis.
-  // However, in KaTeX, \textellipsis and \ldots behave the same
-  // (in text mode), and it's unlikely we'd see any of the math commands
-  // that affect the behavior of \dots when in text mode.  So fine for now
-  // (until we support \ifmmode ... \else ... \fi).
-  var thedots = '\\dotso';
-  var next = context.expandAfterFuture().text;
-
-  if (next in dotsByToken) {
-    thedots = dotsByToken[next];
-  } else if (next.substr(0, 4) === '\\not') {
-    thedots = '\\dotsb';
-  } else if (next in src_symbols.math) {
-    if (utils.contains(['bin', 'rel'], src_symbols.math[next].group)) {
-      thedots = '\\dotsb';
-    }
-  }
-
-  return thedots;
-});
-var spaceAfterDots = {
-  // \rightdelim@ checks for the following:
-  ')': true,
-  ']': true,
-  '\\rbrack': true,
-  '\\}': true,
-  '\\rbrace': true,
-  '\\rangle': true,
-  '\\rceil': true,
-  '\\rfloor': true,
-  '\\rgroup': true,
-  '\\rmoustache': true,
-  '\\right': true,
-  '\\bigr': true,
-  '\\biggr': true,
-  '\\Bigr': true,
-  '\\Biggr': true,
-  // \extra@ also tests for the following:
-  '$': true,
-  // \extrap@ checks for the following:
-  ';': true,
-  '.': true,
-  ',': true
-};
-defineMacro("\\dotso", function (context) {
-  var next = context.future().text;
-
-  if (next in spaceAfterDots) {
-    return "\\ldots\\,";
-  } else {
-    return "\\ldots";
-  }
-});
-defineMacro("\\dotsc", function (context) {
-  var next = context.future().text; // \dotsc uses \extra@ but not \extrap@, instead specially checking for
-  // ';' and '.', but doesn't check for ','.
-
-  if (next in spaceAfterDots && next !== ',') {
-    return "\\ldots\\,";
-  } else {
-    return "\\ldots";
-  }
-});
-defineMacro("\\cdots", function (context) {
-  var next = context.future().text;
-
-  if (next in spaceAfterDots) {
-    return "\\@cdots\\,";
-  } else {
-    return "\\@cdots";
-  }
-});
-defineMacro("\\dotsb", "\\cdots");
-defineMacro("\\dotsm", "\\cdots");
-defineMacro("\\dotsi", "\\!\\cdots"); // amsmath doesn't actually define \dotsx, but \dots followed by a macro
-// starting with \DOTSX implies \dotso, and then \extra@ detects this case
-// and forces the added `\,`.
-
-defineMacro("\\dotsx", "\\ldots\\,"); // \let\DOTSI\relax
-// \let\DOTSB\relax
-// \let\DOTSX\relax
-
-defineMacro("\\DOTSI", "\\relax");
-defineMacro("\\DOTSB", "\\relax");
-defineMacro("\\DOTSX", "\\relax"); // Spacing, based on amsmath.sty's override of LaTeX defaults
-// \DeclareRobustCommand{\tmspace}[3]{%
-//   \ifmmode\mskip#1#2\else\kern#1#3\fi\relax}
-
-defineMacro("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"); // \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}}
-// TODO: math mode should use \thinmuskip
-
-defineMacro("\\,", "\\tmspace+{3mu}{.1667em}"); // \let\thinspace\,
-
-defineMacro("\\thinspace", "\\,"); // \def\>{\mskip\medmuskip}
-// \renewcommand{\:}{\tmspace+\medmuskip{.2222em}}
-// TODO: \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu
-
-defineMacro("\\>", "\\mskip{4mu}");
-defineMacro("\\:", "\\tmspace+{4mu}{.2222em}"); // \let\medspace\:
-
-defineMacro("\\medspace", "\\:"); // \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}}
-// TODO: math mode should use \thickmuskip = 5mu plus 5mu
-
-defineMacro("\\;", "\\tmspace+{5mu}{.2777em}"); // \let\thickspace\;
-
-defineMacro("\\thickspace", "\\;"); // \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}}
-// TODO: math mode should use \thinmuskip
-
-defineMacro("\\!", "\\tmspace-{3mu}{.1667em}"); // \let\negthinspace\!
-
-defineMacro("\\negthinspace", "\\!"); // \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}}
-// TODO: math mode should use \medmuskip
-
-defineMacro("\\negmedspace", "\\tmspace-{4mu}{.2222em}"); // \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}}
-// TODO: math mode should use \thickmuskip
-
-defineMacro("\\negthickspace", "\\tmspace-{5mu}{.277em}"); // \def\enspace{\kern.5em }
-
-defineMacro("\\enspace", "\\kern.5em "); // \def\enskip{\hskip.5em\relax}
-
-defineMacro("\\enskip", "\\hskip.5em\\relax"); // \def\quad{\hskip1em\relax}
-
-defineMacro("\\quad", "\\hskip1em\\relax"); // \def\qquad{\hskip2em\relax}
-
-defineMacro("\\qquad", "\\hskip2em\\relax"); // \tag@in@display form of \tag
-
-defineMacro("\\tag", "\\@ifstar\\tag@literal\\tag@paren");
-defineMacro("\\tag@paren", "\\tag@literal{({#1})}");
-defineMacro("\\tag@literal", function (context) {
-  if (context.macros.get("\\df@tag")) {
-    throw new src_ParseError("Multiple \\tag");
-  }
-
-  return "\\gdef\\df@tag{\\text{#1}}";
-}); // \renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin
-//   {\operator@font mod}\penalty900
-//   \mkern5mu\nonscript\mskip-\medmuskip}
-// \newcommand{\pod}[1]{\allowbreak
-//   \if@display\mkern18mu\else\mkern8mu\fi(#1)}
-// \renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}}
-// \newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu
-//   \else\mkern12mu\fi{\operator@font mod}\,\,#1}
-// TODO: math mode should use \medmuskip = 4mu plus 2mu minus 4mu
-
-defineMacro("\\bmod", "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}" + "\\mathbin{\\rm mod}" + "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");
-defineMacro("\\pod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");
-defineMacro("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}");
-defineMacro("\\mod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}" + "{\\rm mod}\\,\\,#1"); // \pmb    --   A simulation of bold.
-// The version in ambsy.sty works by typesetting three copies of the argument
-// with small offsets. We use two copies. We omit the vertical offset because
-// of rendering problems that makeVList encounters in Safari.
-
-defineMacro("\\pmb", "\\html@mathml{" + "\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}" + "{\\mathbf{#1}}"); //////////////////////////////////////////////////////////////////////
-// LaTeX source2e
-// \\ defaults to \newline, but changes to \cr within array environment
-
-defineMacro("\\\\", "\\newline"); // \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@}
-// TODO: Doesn't normally work in math mode because \@ fails.  KaTeX doesn't
-// support \@ yet, so that's omitted, and we add \text so that the result
-// doesn't look funny in math mode.
-
-defineMacro("\\TeX", "\\textrm{\\html@mathml{" + "T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX" + "}{TeX}}"); // \DeclareRobustCommand{\LaTeX}{L\kern-.36em%
-//         {\sbox\z@ T%
-//          \vbox to\ht\z@{\hbox{\check@mathfonts
-//                               \fontsize\sf@size\z@
-//                               \math@fontsfalse\selectfont
-//                               A}%
-//                         \vss}%
-//         }%
-//         \kern-.15em%
-//         \TeX}
-// This code aligns the top of the A with the T (from the perspective of TeX's
-// boxes, though visually the A appears to extend above slightly).
-// We compute the corresponding \raisebox when A is rendered in \normalsize
-// \scriptstyle, which has a scale factor of 0.7 (see Options.js).
-
-var latexRaiseA = fontMetricsData['Main-Regular']["T".charCodeAt(0)][1] - 0.7 * fontMetricsData['Main-Regular']["A".charCodeAt(0)][1] + "em";
-defineMacro("\\LaTeX", "\\textrm{\\html@mathml{" + ("L\\kern-.36em\\raisebox{" + latexRaiseA + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{LaTeX}}"); // New KaTeX logo based on tweaking LaTeX logo
-
-defineMacro("\\KaTeX", "\\textrm{\\html@mathml{" + ("K\\kern-.17em\\raisebox{" + latexRaiseA + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{KaTeX}}"); // \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace}
-// \def\@hspace#1{\hskip  #1\relax}
-// \def\@hspacer#1{\vrule \@width\z@\nobreak
-//                 \hskip #1\hskip \z@skip}
-
-defineMacro("\\hspace", "\\@ifstar\\@hspacer\\@hspace");
-defineMacro("\\@hspace", "\\hskip #1\\relax");
-defineMacro("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"); //////////////////////////////////////////////////////////////////////
-// mathtools.sty
-//\providecommand\ordinarycolon{:}
-
-defineMacro("\\ordinarycolon", ":"); //\def\vcentcolon{\mathrel{\mathop\ordinarycolon}}
-//TODO(edemaine): Not yet centered. Fix via \raisebox or #726
-
-defineMacro("\\vcentcolon", "\\mathrel{\\mathop\\ordinarycolon}"); // \providecommand*\dblcolon{\vcentcolon\mathrel{\mkern-.9mu}\vcentcolon}
-
-defineMacro("\\dblcolon", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}" + "{\\mathop{\\char\"2237}}"); // \providecommand*\coloneqq{\vcentcolon\mathrel{\mkern-1.2mu}=}
-
-defineMacro("\\coloneqq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2254}}"); // ≔
-// \providecommand*\Coloneqq{\dblcolon\mathrel{\mkern-1.2mu}=}
-
-defineMacro("\\Coloneqq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2237\\char\"3d}}"); // \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}}
-
-defineMacro("\\coloneq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"3a\\char\"2212}}"); // \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}}
-
-defineMacro("\\Coloneq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"2237\\char\"2212}}"); // \providecommand*\eqqcolon{=\mathrel{\mkern-1.2mu}\vcentcolon}
-
-defineMacro("\\eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2255}}"); // ≕
-// \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon}
-
-defineMacro("\\Eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"3d\\char\"2237}}"); // \providecommand*\eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\vcentcolon}
-
-defineMacro("\\eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2239}}"); // \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon}
-
-defineMacro("\\Eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"2212\\char\"2237}}"); // \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx}
-
-defineMacro("\\colonapprox", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"3a\\char\"2248}}"); // \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx}
-
-defineMacro("\\Colonapprox", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"2237\\char\"2248}}"); // \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim}
-
-defineMacro("\\colonsim", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"3a\\char\"223c}}"); // \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim}
-
-defineMacro("\\Colonsim", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"2237\\char\"223c}}"); // Some Unicode characters are implemented with macros to mathtools functions.
-
-defineMacro("\u2237", "\\dblcolon"); // ::
-
-defineMacro("\u2239", "\\eqcolon"); // -:
-
-defineMacro("\u2254", "\\coloneqq"); // :=
-
-defineMacro("\u2255", "\\eqqcolon"); // =:
-
-defineMacro("\u2A74", "\\Coloneqq"); // ::=
-//////////////////////////////////////////////////////////////////////
-// colonequals.sty
-// Alternate names for mathtools's macros:
-
-defineMacro("\\ratio", "\\vcentcolon");
-defineMacro("\\coloncolon", "\\dblcolon");
-defineMacro("\\colonequals", "\\coloneqq");
-defineMacro("\\coloncolonequals", "\\Coloneqq");
-defineMacro("\\equalscolon", "\\eqqcolon");
-defineMacro("\\equalscoloncolon", "\\Eqqcolon");
-defineMacro("\\colonminus", "\\coloneq");
-defineMacro("\\coloncolonminus", "\\Coloneq");
-defineMacro("\\minuscolon", "\\eqcolon");
-defineMacro("\\minuscoloncolon", "\\Eqcolon"); // \colonapprox name is same in mathtools and colonequals.
-
-defineMacro("\\coloncolonapprox", "\\Colonapprox"); // \colonsim name is same in mathtools and colonequals.
-
-defineMacro("\\coloncolonsim", "\\Colonsim"); // Additional macros, implemented by analogy with mathtools definitions:
-
-defineMacro("\\simcolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");
-defineMacro("\\simcoloncolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");
-defineMacro("\\approxcolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");
-defineMacro("\\approxcoloncolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"); // Present in newtxmath, pxfonts and txfonts
-
-defineMacro("\\notni", "\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");
-defineMacro("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}");
-defineMacro("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"); //////////////////////////////////////////////////////////////////////
-// MathML alternates for KaTeX glyphs in the Unicode private area
-
-defineMacro("\\gvertneqq", "\\html@mathml{\\@gvertneqq}{\u2269}");
-defineMacro("\\lvertneqq", "\\html@mathml{\\@lvertneqq}{\u2268}");
-defineMacro("\\ngeqq", "\\html@mathml{\\@ngeqq}{\u2271}");
-defineMacro("\\ngeqslant", "\\html@mathml{\\@ngeqslant}{\u2271}");
-defineMacro("\\nleqq", "\\html@mathml{\\@nleqq}{\u2270}");
-defineMacro("\\nleqslant", "\\html@mathml{\\@nleqslant}{\u2270}");
-defineMacro("\\nshortmid", "\\html@mathml{\\@nshortmid}{∤}");
-defineMacro("\\nshortparallel", "\\html@mathml{\\@nshortparallel}{∦}");
-defineMacro("\\nsubseteqq", "\\html@mathml{\\@nsubseteqq}{\u2288}");
-defineMacro("\\nsupseteqq", "\\html@mathml{\\@nsupseteqq}{\u2289}");
-defineMacro("\\varsubsetneq", "\\html@mathml{\\@varsubsetneq}{⊊}");
-defineMacro("\\varsubsetneqq", "\\html@mathml{\\@varsubsetneqq}{⫋}");
-defineMacro("\\varsupsetneq", "\\html@mathml{\\@varsupsetneq}{⊋}");
-defineMacro("\\varsupsetneqq", "\\html@mathml{\\@varsupsetneqq}{⫌}"); //////////////////////////////////////////////////////////////////////
-// stmaryrd and semantic
-// The stmaryrd and semantic packages render the next four items by calling a
-// glyph. Those glyphs do not exist in the KaTeX fonts. Hence the macros.
-
-defineMacro("\\llbracket", "\\html@mathml{" + "\\mathopen{[\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u27E6}}");
-defineMacro("\\rrbracket", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu]}}" + "{\\mathclose{\\char`\u27E7}}");
-defineMacro("\u27E6", "\\llbracket"); // blackboard bold [
-
-defineMacro("\u27E7", "\\rrbracket"); // blackboard bold ]
-
-defineMacro("\\lBrace", "\\html@mathml{" + "\\mathopen{\\{\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u2983}}");
-defineMacro("\\rBrace", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu\\}}}" + "{\\mathclose{\\char`\u2984}}");
-defineMacro("\u2983", "\\lBrace"); // blackboard bold {
-
-defineMacro("\u2984", "\\rBrace"); // blackboard bold }
-// TODO: Create variable sized versions of the last two items. I believe that
-// will require new font glyphs.
-//////////////////////////////////////////////////////////////////////
-// texvc.sty
-// The texvc package contains macros available in mediawiki pages.
-// We omit the functions deprecated at
-// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax
-// We also omit texvc's \O, which conflicts with \text{\O}
-
-defineMacro("\\darr", "\\downarrow");
-defineMacro("\\dArr", "\\Downarrow");
-defineMacro("\\Darr", "\\Downarrow");
-defineMacro("\\lang", "\\langle");
-defineMacro("\\rang", "\\rangle");
-defineMacro("\\uarr", "\\uparrow");
-defineMacro("\\uArr", "\\Uparrow");
-defineMacro("\\Uarr", "\\Uparrow");
-defineMacro("\\N", "\\mathbb{N}");
-defineMacro("\\R", "\\mathbb{R}");
-defineMacro("\\Z", "\\mathbb{Z}");
-defineMacro("\\alef", "\\aleph");
-defineMacro("\\alefsym", "\\aleph");
-defineMacro("\\Alpha", "\\mathrm{A}");
-defineMacro("\\Beta", "\\mathrm{B}");
-defineMacro("\\bull", "\\bullet");
-defineMacro("\\Chi", "\\mathrm{X}");
-defineMacro("\\clubs", "\\clubsuit");
-defineMacro("\\cnums", "\\mathbb{C}");
-defineMacro("\\Complex", "\\mathbb{C}");
-defineMacro("\\Dagger", "\\ddagger");
-defineMacro("\\diamonds", "\\diamondsuit");
-defineMacro("\\empty", "\\emptyset");
-defineMacro("\\Epsilon", "\\mathrm{E}");
-defineMacro("\\Eta", "\\mathrm{H}");
-defineMacro("\\exist", "\\exists");
-defineMacro("\\harr", "\\leftrightarrow");
-defineMacro("\\hArr", "\\Leftrightarrow");
-defineMacro("\\Harr", "\\Leftrightarrow");
-defineMacro("\\hearts", "\\heartsuit");
-defineMacro("\\image", "\\Im");
-defineMacro("\\infin", "\\infty");
-defineMacro("\\Iota", "\\mathrm{I}");
-defineMacro("\\isin", "\\in");
-defineMacro("\\Kappa", "\\mathrm{K}");
-defineMacro("\\larr", "\\leftarrow");
-defineMacro("\\lArr", "\\Leftarrow");
-defineMacro("\\Larr", "\\Leftarrow");
-defineMacro("\\lrarr", "\\leftrightarrow");
-defineMacro("\\lrArr", "\\Leftrightarrow");
-defineMacro("\\Lrarr", "\\Leftrightarrow");
-defineMacro("\\Mu", "\\mathrm{M}");
-defineMacro("\\natnums", "\\mathbb{N}");
-defineMacro("\\Nu", "\\mathrm{N}");
-defineMacro("\\Omicron", "\\mathrm{O}");
-defineMacro("\\plusmn", "\\pm");
-defineMacro("\\rarr", "\\rightarrow");
-defineMacro("\\rArr", "\\Rightarrow");
-defineMacro("\\Rarr", "\\Rightarrow");
-defineMacro("\\real", "\\Re");
-defineMacro("\\reals", "\\mathbb{R}");
-defineMacro("\\Reals", "\\mathbb{R}");
-defineMacro("\\Rho", "\\mathrm{P}");
-defineMacro("\\sdot", "\\cdot");
-defineMacro("\\sect", "\\S");
-defineMacro("\\spades", "\\spadesuit");
-defineMacro("\\sub", "\\subset");
-defineMacro("\\sube", "\\subseteq");
-defineMacro("\\supe", "\\supseteq");
-defineMacro("\\Tau", "\\mathrm{T}");
-defineMacro("\\thetasym", "\\vartheta"); // TODO: defineMacro("\\varcoppa", "\\\mbox{\\coppa}");
-
-defineMacro("\\weierp", "\\wp");
-defineMacro("\\Zeta", "\\mathrm{Z}"); //////////////////////////////////////////////////////////////////////
-// statmath.sty
-// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf
-
-defineMacro("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}");
-defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}");
-defineMacro("\\plim", "\\DOTSB\\mathop{\\operatorname{plim}}\\limits"); // Custom Khan Academy colors, should be moved to an optional package
-
-defineMacro("\\blue", "\\textcolor{##6495ed}{#1}");
-defineMacro("\\orange", "\\textcolor{##ffa500}{#1}");
-defineMacro("\\pink", "\\textcolor{##ff00af}{#1}");
-defineMacro("\\red", "\\textcolor{##df0030}{#1}");
-defineMacro("\\green", "\\textcolor{##28ae7b}{#1}");
-defineMacro("\\gray", "\\textcolor{gray}{#1}");
-defineMacro("\\purple", "\\textcolor{##9d38bd}{#1}");
-defineMacro("\\blueA", "\\textcolor{##ccfaff}{#1}");
-defineMacro("\\blueB", "\\textcolor{##80f6ff}{#1}");
-defineMacro("\\blueC", "\\textcolor{##63d9ea}{#1}");
-defineMacro("\\blueD", "\\textcolor{##11accd}{#1}");
-defineMacro("\\blueE", "\\textcolor{##0c7f99}{#1}");
-defineMacro("\\tealA", "\\textcolor{##94fff5}{#1}");
-defineMacro("\\tealB", "\\textcolor{##26edd5}{#1}");
-defineMacro("\\tealC", "\\textcolor{##01d1c1}{#1}");
-defineMacro("\\tealD", "\\textcolor{##01a995}{#1}");
-defineMacro("\\tealE", "\\textcolor{##208170}{#1}");
-defineMacro("\\greenA", "\\textcolor{##b6ffb0}{#1}");
-defineMacro("\\greenB", "\\textcolor{##8af281}{#1}");
-defineMacro("\\greenC", "\\textcolor{##74cf70}{#1}");
-defineMacro("\\greenD", "\\textcolor{##1fab54}{#1}");
-defineMacro("\\greenE", "\\textcolor{##0d923f}{#1}");
-defineMacro("\\goldA", "\\textcolor{##ffd0a9}{#1}");
-defineMacro("\\goldB", "\\textcolor{##ffbb71}{#1}");
-defineMacro("\\goldC", "\\textcolor{##ff9c39}{#1}");
-defineMacro("\\goldD", "\\textcolor{##e07d10}{#1}");
-defineMacro("\\goldE", "\\textcolor{##a75a05}{#1}");
-defineMacro("\\redA", "\\textcolor{##fca9a9}{#1}");
-defineMacro("\\redB", "\\textcolor{##ff8482}{#1}");
-defineMacro("\\redC", "\\textcolor{##f9685d}{#1}");
-defineMacro("\\redD", "\\textcolor{##e84d39}{#1}");
-defineMacro("\\redE", "\\textcolor{##bc2612}{#1}");
-defineMacro("\\maroonA", "\\textcolor{##ffbde0}{#1}");
-defineMacro("\\maroonB", "\\textcolor{##ff92c6}{#1}");
-defineMacro("\\maroonC", "\\textcolor{##ed5fa6}{#1}");
-defineMacro("\\maroonD", "\\textcolor{##ca337c}{#1}");
-defineMacro("\\maroonE", "\\textcolor{##9e034e}{#1}");
-defineMacro("\\purpleA", "\\textcolor{##ddd7ff}{#1}");
-defineMacro("\\purpleB", "\\textcolor{##c6b9fc}{#1}");
-defineMacro("\\purpleC", "\\textcolor{##aa87ff}{#1}");
-defineMacro("\\purpleD", "\\textcolor{##7854ab}{#1}");
-defineMacro("\\purpleE", "\\textcolor{##543b78}{#1}");
-defineMacro("\\mintA", "\\textcolor{##f5f9e8}{#1}");
-defineMacro("\\mintB", "\\textcolor{##edf2df}{#1}");
-defineMacro("\\mintC", "\\textcolor{##e0e5cc}{#1}");
-defineMacro("\\grayA", "\\textcolor{##f6f7f7}{#1}");
-defineMacro("\\grayB", "\\textcolor{##f0f1f2}{#1}");
-defineMacro("\\grayC", "\\textcolor{##e3e5e6}{#1}");
-defineMacro("\\grayD", "\\textcolor{##d6d8da}{#1}");
-defineMacro("\\grayE", "\\textcolor{##babec2}{#1}");
-defineMacro("\\grayF", "\\textcolor{##888d93}{#1}");
-defineMacro("\\grayG", "\\textcolor{##626569}{#1}");
-defineMacro("\\grayH", "\\textcolor{##3b3e40}{#1}");
-defineMacro("\\grayI", "\\textcolor{##21242c}{#1}");
-defineMacro("\\kaBlue", "\\textcolor{##314453}{#1}");
-defineMacro("\\kaGreen", "\\textcolor{##71B307}{#1}");
-// CONCATENATED MODULE: ./src/MacroExpander.js
-/**
- * This file contains the “gullet” where macros are expanded
- * until only non-macro tokens remain.
- */
-
-
-
-
-
-
-
-// List of commands that act like macros but aren't defined as a macro,
-// function, or symbol.  Used in `isDefined`.
-var implicitCommands = {
-  "\\relax": true,
-  // MacroExpander.js
-  "^": true,
-  // Parser.js
-  "_": true,
-  // Parser.js
-  "\\limits": true,
-  // Parser.js
-  "\\nolimits": true // Parser.js
-
-};
-
-var MacroExpander_MacroExpander =
-/*#__PURE__*/
-function () {
-  function MacroExpander(input, settings, mode) {
-    this.settings = void 0;
-    this.expansionCount = void 0;
-    this.lexer = void 0;
-    this.macros = void 0;
-    this.stack = void 0;
-    this.mode = void 0;
-    this.settings = settings;
-    this.expansionCount = 0;
-    this.feed(input); // Make new global namespace
-
-    this.macros = new Namespace_Namespace(macros, settings.macros);
-    this.mode = mode;
-    this.stack = []; // contains tokens in REVERSE order
-  }
-  /**
-   * Feed a new input string to the same MacroExpander
-   * (with existing macros etc.).
-   */
-
-
-  var _proto = MacroExpander.prototype;
-
-  _proto.feed = function feed(input) {
-    this.lexer = new Lexer_Lexer(input, this.settings);
-  }
-  /**
-   * Switches between "text" and "math" modes.
-   */
-  ;
-
-  _proto.switchMode = function switchMode(newMode) {
-    this.mode = newMode;
-  }
-  /**
-   * Start a new group nesting within all namespaces.
-   */
-  ;
-
-  _proto.beginGroup = function beginGroup() {
-    this.macros.beginGroup();
-  }
-  /**
-   * End current group nesting within all namespaces.
-   */
-  ;
-
-  _proto.endGroup = function endGroup() {
-    this.macros.endGroup();
-  }
-  /**
-   * Returns the topmost token on the stack, without expanding it.
-   * Similar in behavior to TeX's `\futurelet`.
-   */
-  ;
-
-  _proto.future = function future() {
-    if (this.stack.length === 0) {
-      this.pushToken(this.lexer.lex());
-    }
-
-    return this.stack[this.stack.length - 1];
-  }
-  /**
-   * Remove and return the next unexpanded token.
-   */
-  ;
-
-  _proto.popToken = function popToken() {
-    this.future(); // ensure non-empty stack
-
-    return this.stack.pop();
-  }
-  /**
-   * Add a given token to the token stack.  In particular, this get be used
-   * to put back a token returned from one of the other methods.
-   */
-  ;
-
-  _proto.pushToken = function pushToken(token) {
-    this.stack.push(token);
-  }
-  /**
-   * Append an array of tokens to the token stack.
-   */
-  ;
-
-  _proto.pushTokens = function pushTokens(tokens) {
-    var _this$stack;
-
-    (_this$stack = this.stack).push.apply(_this$stack, tokens);
-  }
-  /**
-   * Consume all following space tokens, without expansion.
-   */
-  ;
-
-  _proto.consumeSpaces = function consumeSpaces() {
-    for (;;) {
-      var token = this.future();
-
-      if (token.text === " ") {
-        this.stack.pop();
-      } else {
-        break;
-      }
-    }
-  }
-  /**
-   * Consume the specified number of arguments from the token stream,
-   * and return the resulting array of arguments.
-   */
-  ;
-
-  _proto.consumeArgs = function consumeArgs(numArgs) {
-    var args = []; // obtain arguments, either single token or balanced {…} group
-
-    for (var i = 0; i < numArgs; ++i) {
-      this.consumeSpaces(); // ignore spaces before each argument
-
-      var startOfArg = this.popToken();
-
-      if (startOfArg.text === "{") {
-        var arg = [];
-        var depth = 1;
-
-        while (depth !== 0) {
-          var tok = this.popToken();
-          arg.push(tok);
-
-          if (tok.text === "{") {
-            ++depth;
-          } else if (tok.text === "}") {
-            --depth;
-          } else if (tok.text === "EOF") {
-            throw new src_ParseError("End of input in macro argument", startOfArg);
-          }
-        }
-
-        arg.pop(); // remove last }
-
-        arg.reverse(); // like above, to fit in with stack order
-
-        args[i] = arg;
-      } else if (startOfArg.text === "EOF") {
-        throw new src_ParseError("End of input expecting macro argument");
-      } else {
-        args[i] = [startOfArg];
-      }
-    }
-
-    return args;
-  }
-  /**
-   * Expand the next token only once if possible.
-   *
-   * If the token is expanded, the resulting tokens will be pushed onto
-   * the stack in reverse order and will be returned as an array,
-   * also in reverse order.
-   *
-   * If not, the next token will be returned without removing it
-   * from the stack.  This case can be detected by a `Token` return value
-   * instead of an `Array` return value.
-   *
-   * In either case, the next token will be on the top of the stack,
-   * or the stack will be empty.
-   *
-   * Used to implement `expandAfterFuture` and `expandNextToken`.
-   *
-   * At the moment, macro expansion doesn't handle delimited macros,
-   * i.e. things like those defined by \def\foo#1\end{…}.
-   * See the TeX book page 202ff. for details on how those should behave.
-   */
-  ;
-
-  _proto.expandOnce = function expandOnce() {
-    var topToken = this.popToken();
-    var name = topToken.text;
-
-    var expansion = this._getExpansion(name);
-
-    if (expansion == null) {
-      // mainly checking for undefined here
-      // Fully expanded
-      this.pushToken(topToken);
-      return topToken;
-    }
-
-    this.expansionCount++;
-
-    if (this.expansionCount > this.settings.maxExpand) {
-      throw new src_ParseError("Too many expansions: infinite loop or " + "need to increase maxExpand setting");
-    }
-
-    var tokens = expansion.tokens;
-
-    if (expansion.numArgs) {
-      var args = this.consumeArgs(expansion.numArgs); // paste arguments in place of the placeholders
-
-      tokens = tokens.slice(); // make a shallow copy
-
-      for (var i = tokens.length - 1; i >= 0; --i) {
-        var tok = tokens[i];
-
-        if (tok.text === "#") {
-          if (i === 0) {
-            throw new src_ParseError("Incomplete placeholder at end of macro body", tok);
-          }
-
-          tok = tokens[--i]; // next token on stack
-
-          if (tok.text === "#") {
-            // ## → #
-            tokens.splice(i + 1, 1); // drop first #
-          } else if (/^[1-9]$/.test(tok.text)) {
-            var _tokens;
-
-            // replace the placeholder with the indicated argument
-            (_tokens = tokens).splice.apply(_tokens, [i, 2].concat(args[+tok.text - 1]));
-          } else {
-            throw new src_ParseError("Not a valid argument number", tok);
-          }
-        }
-      }
-    } // Concatenate expansion onto top of stack.
-
-
-    this.pushTokens(tokens);
-    return tokens;
-  }
-  /**
-   * Expand the next token only once (if possible), and return the resulting
-   * top token on the stack (without removing anything from the stack).
-   * Similar in behavior to TeX's `\expandafter\futurelet`.
-   * Equivalent to expandOnce() followed by future().
-   */
-  ;
-
-  _proto.expandAfterFuture = function expandAfterFuture() {
-    this.expandOnce();
-    return this.future();
-  }
-  /**
-   * Recursively expand first token, then return first non-expandable token.
-   */
-  ;
-
-  _proto.expandNextToken = function expandNextToken() {
-    for (;;) {
-      var expanded = this.expandOnce(); // expandOnce returns Token if and only if it's fully expanded.
-
-      if (expanded instanceof Token_Token) {
-        // \relax stops the expansion, but shouldn't get returned (a
-        // null return value couldn't get implemented as a function).
-        if (expanded.text === "\\relax") {
-          this.stack.pop();
-        } else {
-          return this.stack.pop(); // === expanded
-        }
-      }
-    } // Flow unable to figure out that this pathway is impossible.
-    // https://github.com/facebook/flow/issues/4808
-
-
-    throw new Error(); // eslint-disable-line no-unreachable
-  }
-  /**
-   * Fully expand the given macro name and return the resulting list of
-   * tokens, or return `undefined` if no such macro is defined.
-   */
-  ;
-
-  _proto.expandMacro = function expandMacro(name) {
-    if (!this.macros.get(name)) {
-      return undefined;
-    }
-
-    var output = [];
-    var oldStackLength = this.stack.length;
-    this.pushToken(new Token_Token(name));
-
-    while (this.stack.length > oldStackLength) {
-      var expanded = this.expandOnce(); // expandOnce returns Token if and only if it's fully expanded.
-
-      if (expanded instanceof Token_Token) {
-        output.push(this.stack.pop());
-      }
-    }
-
-    return output;
-  }
-  /**
-   * Fully expand the given macro name and return the result as a string,
-   * or return `undefined` if no such macro is defined.
-   */
-  ;
-
-  _proto.expandMacroAsText = function expandMacroAsText(name) {
-    var tokens = this.expandMacro(name);
-
-    if (tokens) {
-      return tokens.map(function (token) {
-        return token.text;
-      }).join("");
-    } else {
-      return tokens;
-    }
-  }
-  /**
-   * Returns the expanded macro as a reversed array of tokens and a macro
-   * argument count.  Or returns `null` if no such macro.
-   */
-  ;
-
-  _proto._getExpansion = function _getExpansion(name) {
-    var definition = this.macros.get(name);
-
-    if (definition == null) {
-      // mainly checking for undefined here
-      return definition;
-    }
-
-    var expansion = typeof definition === "function" ? definition(this) : definition;
-
-    if (typeof expansion === "string") {
-      var numArgs = 0;
-
-      if (expansion.indexOf("#") !== -1) {
-        var stripped = expansion.replace(/##/g, "");
-
-        while (stripped.indexOf("#" + (numArgs + 1)) !== -1) {
-          ++numArgs;
-        }
-      }
-
-      var bodyLexer = new Lexer_Lexer(expansion, this.settings);
-      var tokens = [];
-      var tok = bodyLexer.lex();
-
-      while (tok.text !== "EOF") {
-        tokens.push(tok);
-        tok = bodyLexer.lex();
-      }
-
-      tokens.reverse(); // to fit in with stack using push and pop
-
-      var expanded = {
-        tokens: tokens,
-        numArgs: numArgs
-      };
-      return expanded;
-    }
-
-    return expansion;
-  }
-  /**
-   * Determine whether a command is currently "defined" (has some
-   * functionality), meaning that it's a macro (in the current group),
-   * a function, a symbol, or one of the special commands listed in
-   * `implicitCommands`.
-   */
-  ;
-
-  _proto.isDefined = function isDefined(name) {
-    return this.macros.has(name) || src_functions.hasOwnProperty(name) || src_symbols.math.hasOwnProperty(name) || src_symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name);
-  };
-
-  return MacroExpander;
-}();
-
-
-// CONCATENATED MODULE: ./src/unicodeAccents.js
-// Mapping of Unicode accent characters to their LaTeX equivalent in text and
-// math mode (when they exist).
-/* harmony default export */ var unicodeAccents = ({
-  "\u0301": {
-    text: "\\'",
-    math: '\\acute'
-  },
-  "\u0300": {
-    text: '\\`',
-    math: '\\grave'
-  },
-  "\u0308": {
-    text: '\\"',
-    math: '\\ddot'
-  },
-  "\u0303": {
-    text: '\\~',
-    math: '\\tilde'
-  },
-  "\u0304": {
-    text: '\\=',
-    math: '\\bar'
-  },
-  "\u0306": {
-    text: "\\u",
-    math: '\\breve'
-  },
-  "\u030C": {
-    text: '\\v',
-    math: '\\check'
-  },
-  "\u0302": {
-    text: '\\^',
-    math: '\\hat'
-  },
-  "\u0307": {
-    text: '\\.',
-    math: '\\dot'
-  },
-  "\u030A": {
-    text: '\\r',
-    math: '\\mathring'
-  },
-  "\u030B": {
-    text: '\\H'
-  }
-});
-// CONCATENATED MODULE: ./src/unicodeSymbols.js
-// This file is GENERATED by unicodeMake.js. DO NOT MODIFY.
-/* harmony default export */ var unicodeSymbols = ({
-  "\xE1": "a\u0301",
-  // á = \'{a}
-  "\xE0": "a\u0300",
-  // à = \`{a}
-  "\xE4": "a\u0308",
-  // ä = \"{a}
-  "\u01DF": "a\u0308\u0304",
-  // ǟ = \"\={a}
-  "\xE3": "a\u0303",
-  // ã = \~{a}
-  "\u0101": "a\u0304",
-  // ā = \={a}
-  "\u0103": "a\u0306",
-  // ă = \u{a}
-  "\u1EAF": "a\u0306\u0301",
-  // ắ = \u\'{a}
-  "\u1EB1": "a\u0306\u0300",
-  // ằ = \u\`{a}
-  "\u1EB5": "a\u0306\u0303",
-  // ẵ = \u\~{a}
-  "\u01CE": "a\u030C",
-  // ǎ = \v{a}
-  "\xE2": "a\u0302",
-  // â = \^{a}
-  "\u1EA5": "a\u0302\u0301",
-  // ấ = \^\'{a}
-  "\u1EA7": "a\u0302\u0300",
-  // ầ = \^\`{a}
-  "\u1EAB": "a\u0302\u0303",
-  // ẫ = \^\~{a}
-  "\u0227": "a\u0307",
-  // ȧ = \.{a}
-  "\u01E1": "a\u0307\u0304",
-  // ǡ = \.\={a}
-  "\xE5": "a\u030A",
-  // å = \r{a}
-  "\u01FB": "a\u030A\u0301",
-  // ǻ = \r\'{a}
-  "\u1E03": "b\u0307",
-  // ḃ = \.{b}
-  "\u0107": "c\u0301",
-  // ć = \'{c}
-  "\u010D": "c\u030C",
-  // č = \v{c}
-  "\u0109": "c\u0302",
-  // ĉ = \^{c}
-  "\u010B": "c\u0307",
-  // ċ = \.{c}
-  "\u010F": "d\u030C",
-  // ď = \v{d}
-  "\u1E0B": "d\u0307",
-  // ḋ = \.{d}
-  "\xE9": "e\u0301",
-  // é = \'{e}
-  "\xE8": "e\u0300",
-  // è = \`{e}
-  "\xEB": "e\u0308",
-  // ë = \"{e}
-  "\u1EBD": "e\u0303",
-  // ẽ = \~{e}
-  "\u0113": "e\u0304",
-  // ē = \={e}
-  "\u1E17": "e\u0304\u0301",
-  // ḗ = \=\'{e}
-  "\u1E15": "e\u0304\u0300",
-  // ḕ = \=\`{e}
-  "\u0115": "e\u0306",
-  // ĕ = \u{e}
-  "\u011B": "e\u030C",
-  // ě = \v{e}
-  "\xEA": "e\u0302",
-  // ê = \^{e}
-  "\u1EBF": "e\u0302\u0301",
-  // ế = \^\'{e}
-  "\u1EC1": "e\u0302\u0300",
-  // ề = \^\`{e}
-  "\u1EC5": "e\u0302\u0303",
-  // ễ = \^\~{e}
-  "\u0117": "e\u0307",
-  // ė = \.{e}
-  "\u1E1F": "f\u0307",
-  // ḟ = \.{f}
-  "\u01F5": "g\u0301",
-  // ǵ = \'{g}
-  "\u1E21": "g\u0304",
-  // ḡ = \={g}
-  "\u011F": "g\u0306",
-  // ğ = \u{g}
-  "\u01E7": "g\u030C",
-  // ǧ = \v{g}
-  "\u011D": "g\u0302",
-  // ĝ = \^{g}
-  "\u0121": "g\u0307",
-  // ġ = \.{g}
-  "\u1E27": "h\u0308",
-  // ḧ = \"{h}
-  "\u021F": "h\u030C",
-  // ȟ = \v{h}
-  "\u0125": "h\u0302",
-  // ĥ = \^{h}
-  "\u1E23": "h\u0307",
-  // ḣ = \.{h}
-  "\xED": "i\u0301",
-  // í = \'{i}
-  "\xEC": "i\u0300",
-  // ì = \`{i}
-  "\xEF": "i\u0308",
-  // ï = \"{i}
-  "\u1E2F": "i\u0308\u0301",
-  // ḯ = \"\'{i}
-  "\u0129": "i\u0303",
-  // ĩ = \~{i}
-  "\u012B": "i\u0304",
-  // ī = \={i}
-  "\u012D": "i\u0306",
-  // ĭ = \u{i}
-  "\u01D0": "i\u030C",
-  // ǐ = \v{i}
-  "\xEE": "i\u0302",
-  // î = \^{i}
-  "\u01F0": "j\u030C",
-  // ǰ = \v{j}
-  "\u0135": "j\u0302",
-  // ĵ = \^{j}
-  "\u1E31": "k\u0301",
-  // ḱ = \'{k}
-  "\u01E9": "k\u030C",
-  // ǩ = \v{k}
-  "\u013A": "l\u0301",
-  // ĺ = \'{l}
-  "\u013E": "l\u030C",
-  // ľ = \v{l}
-  "\u1E3F": "m\u0301",
-  // ḿ = \'{m}
-  "\u1E41": "m\u0307",
-  // ṁ = \.{m}
-  "\u0144": "n\u0301",
-  // ń = \'{n}
-  "\u01F9": "n\u0300",
-  // ǹ = \`{n}
-  "\xF1": "n\u0303",
-  // ñ = \~{n}
-  "\u0148": "n\u030C",
-  // ň = \v{n}
-  "\u1E45": "n\u0307",
-  // ṅ = \.{n}
-  "\xF3": "o\u0301",
-  // ó = \'{o}
-  "\xF2": "o\u0300",
-  // ò = \`{o}
-  "\xF6": "o\u0308",
-  // ö = \"{o}
-  "\u022B": "o\u0308\u0304",
-  // ȫ = \"\={o}
-  "\xF5": "o\u0303",
-  // õ = \~{o}
-  "\u1E4D": "o\u0303\u0301",
-  // ṍ = \~\'{o}
-  "\u1E4F": "o\u0303\u0308",
-  // ṏ = \~\"{o}
-  "\u022D": "o\u0303\u0304",
-  // ȭ = \~\={o}
-  "\u014D": "o\u0304",
-  // ō = \={o}
-  "\u1E53": "o\u0304\u0301",
-  // ṓ = \=\'{o}
-  "\u1E51": "o\u0304\u0300",
-  // ṑ = \=\`{o}
-  "\u014F": "o\u0306",
-  // ŏ = \u{o}
-  "\u01D2": "o\u030C",
-  // ǒ = \v{o}
-  "\xF4": "o\u0302",
-  // ô = \^{o}
-  "\u1ED1": "o\u0302\u0301",
-  // ố = \^\'{o}
-  "\u1ED3": "o\u0302\u0300",
-  // ồ = \^\`{o}
-  "\u1ED7": "o\u0302\u0303",
-  // ỗ = \^\~{o}
-  "\u022F": "o\u0307",
-  // ȯ = \.{o}
-  "\u0231": "o\u0307\u0304",
-  // ȱ = \.\={o}
-  "\u0151": "o\u030B",
-  // ő = \H{o}
-  "\u1E55": "p\u0301",
-  // ṕ = \'{p}
-  "\u1E57": "p\u0307",
-  // ṗ = \.{p}
-  "\u0155": "r\u0301",
-  // ŕ = \'{r}
-  "\u0159": "r\u030C",
-  // ř = \v{r}
-  "\u1E59": "r\u0307",
-  // ṙ = \.{r}
-  "\u015B": "s\u0301",
-  // ś = \'{s}
-  "\u1E65": "s\u0301\u0307",
-  // ṥ = \'\.{s}
-  "\u0161": "s\u030C",
-  // š = \v{s}
-  "\u1E67": "s\u030C\u0307",
-  // ṧ = \v\.{s}
-  "\u015D": "s\u0302",
-  // ŝ = \^{s}
-  "\u1E61": "s\u0307",
-  // ṡ = \.{s}
-  "\u1E97": "t\u0308",
-  // ẗ = \"{t}
-  "\u0165": "t\u030C",
-  // ť = \v{t}
-  "\u1E6B": "t\u0307",
-  // ṫ = \.{t}
-  "\xFA": "u\u0301",
-  // ú = \'{u}
-  "\xF9": "u\u0300",
-  // ù = \`{u}
-  "\xFC": "u\u0308",
-  // ü = \"{u}
-  "\u01D8": "u\u0308\u0301",
-  // ǘ = \"\'{u}
-  "\u01DC": "u\u0308\u0300",
-  // ǜ = \"\`{u}
-  "\u01D6": "u\u0308\u0304",
-  // ǖ = \"\={u}
-  "\u01DA": "u\u0308\u030C",
-  // ǚ = \"\v{u}
-  "\u0169": "u\u0303",
-  // ũ = \~{u}
-  "\u1E79": "u\u0303\u0301",
-  // ṹ = \~\'{u}
-  "\u016B": "u\u0304",
-  // ū = \={u}
-  "\u1E7B": "u\u0304\u0308",
-  // ṻ = \=\"{u}
-  "\u016D": "u\u0306",
-  // ŭ = \u{u}
-  "\u01D4": "u\u030C",
-  // ǔ = \v{u}
-  "\xFB": "u\u0302",
-  // û = \^{u}
-  "\u016F": "u\u030A",
-  // ů = \r{u}
-  "\u0171": "u\u030B",
-  // ű = \H{u}
-  "\u1E7D": "v\u0303",
-  // ṽ = \~{v}
-  "\u1E83": "w\u0301",
-  // ẃ = \'{w}
-  "\u1E81": "w\u0300",
-  // ẁ = \`{w}
-  "\u1E85": "w\u0308",
-  // ẅ = \"{w}
-  "\u0175": "w\u0302",
-  // ŵ = \^{w}
-  "\u1E87": "w\u0307",
-  // ẇ = \.{w}
-  "\u1E98": "w\u030A",
-  // ẘ = \r{w}
-  "\u1E8D": "x\u0308",
-  // ẍ = \"{x}
-  "\u1E8B": "x\u0307",
-  // ẋ = \.{x}
-  "\xFD": "y\u0301",
-  // ý = \'{y}
-  "\u1EF3": "y\u0300",
-  // ỳ = \`{y}
-  "\xFF": "y\u0308",
-  // ÿ = \"{y}
-  "\u1EF9": "y\u0303",
-  // ỹ = \~{y}
-  "\u0233": "y\u0304",
-  // ȳ = \={y}
-  "\u0177": "y\u0302",
-  // ŷ = \^{y}
-  "\u1E8F": "y\u0307",
-  // ẏ = \.{y}
-  "\u1E99": "y\u030A",
-  // ẙ = \r{y}
-  "\u017A": "z\u0301",
-  // ź = \'{z}
-  "\u017E": "z\u030C",
-  // ž = \v{z}
-  "\u1E91": "z\u0302",
-  // ẑ = \^{z}
-  "\u017C": "z\u0307",
-  // ż = \.{z}
-  "\xC1": "A\u0301",
-  // Á = \'{A}
-  "\xC0": "A\u0300",
-  // À = \`{A}
-  "\xC4": "A\u0308",
-  // Ä = \"{A}
-  "\u01DE": "A\u0308\u0304",
-  // Ǟ = \"\={A}
-  "\xC3": "A\u0303",
-  // Ã = \~{A}
-  "\u0100": "A\u0304",
-  // Ā = \={A}
-  "\u0102": "A\u0306",
-  // Ă = \u{A}
-  "\u1EAE": "A\u0306\u0301",
-  // Ắ = \u\'{A}
-  "\u1EB0": "A\u0306\u0300",
-  // Ằ = \u\`{A}
-  "\u1EB4": "A\u0306\u0303",
-  // Ẵ = \u\~{A}
-  "\u01CD": "A\u030C",
-  // Ǎ = \v{A}
-  "\xC2": "A\u0302",
-  // Â = \^{A}
-  "\u1EA4": "A\u0302\u0301",
-  // Ấ = \^\'{A}
-  "\u1EA6": "A\u0302\u0300",
-  // Ầ = \^\`{A}
-  "\u1EAA": "A\u0302\u0303",
-  // Ẫ = \^\~{A}
-  "\u0226": "A\u0307",
-  // Ȧ = \.{A}
-  "\u01E0": "A\u0307\u0304",
-  // Ǡ = \.\={A}
-  "\xC5": "A\u030A",
-  // Å = \r{A}
-  "\u01FA": "A\u030A\u0301",
-  // Ǻ = \r\'{A}
-  "\u1E02": "B\u0307",
-  // Ḃ = \.{B}
-  "\u0106": "C\u0301",
-  // Ć = \'{C}
-  "\u010C": "C\u030C",
-  // Č = \v{C}
-  "\u0108": "C\u0302",
-  // Ĉ = \^{C}
-  "\u010A": "C\u0307",
-  // Ċ = \.{C}
-  "\u010E": "D\u030C",
-  // Ď = \v{D}
-  "\u1E0A": "D\u0307",
-  // Ḋ = \.{D}
-  "\xC9": "E\u0301",
-  // É = \'{E}
-  "\xC8": "E\u0300",
-  // È = \`{E}
-  "\xCB": "E\u0308",
-  // Ë = \"{E}
-  "\u1EBC": "E\u0303",
-  // Ẽ = \~{E}
-  "\u0112": "E\u0304",
-  // Ē = \={E}
-  "\u1E16": "E\u0304\u0301",
-  // Ḗ = \=\'{E}
-  "\u1E14": "E\u0304\u0300",
-  // Ḕ = \=\`{E}
-  "\u0114": "E\u0306",
-  // Ĕ = \u{E}
-  "\u011A": "E\u030C",
-  // Ě = \v{E}
-  "\xCA": "E\u0302",
-  // Ê = \^{E}
-  "\u1EBE": "E\u0302\u0301",
-  // Ế = \^\'{E}
-  "\u1EC0": "E\u0302\u0300",
-  // Ề = \^\`{E}
-  "\u1EC4": "E\u0302\u0303",
-  // Ễ = \^\~{E}
-  "\u0116": "E\u0307",
-  // Ė = \.{E}
-  "\u1E1E": "F\u0307",
-  // Ḟ = \.{F}
-  "\u01F4": "G\u0301",
-  // Ǵ = \'{G}
-  "\u1E20": "G\u0304",
-  // Ḡ = \={G}
-  "\u011E": "G\u0306",
-  // Ğ = \u{G}
-  "\u01E6": "G\u030C",
-  // Ǧ = \v{G}
-  "\u011C": "G\u0302",
-  // Ĝ = \^{G}
-  "\u0120": "G\u0307",
-  // Ġ = \.{G}
-  "\u1E26": "H\u0308",
-  // Ḧ = \"{H}
-  "\u021E": "H\u030C",
-  // Ȟ = \v{H}
-  "\u0124": "H\u0302",
-  // Ĥ = \^{H}
-  "\u1E22": "H\u0307",
-  // Ḣ = \.{H}
-  "\xCD": "I\u0301",
-  // Í = \'{I}
-  "\xCC": "I\u0300",
-  // Ì = \`{I}
-  "\xCF": "I\u0308",
-  // Ï = \"{I}
-  "\u1E2E": "I\u0308\u0301",
-  // Ḯ = \"\'{I}
-  "\u0128": "I\u0303",
-  // Ĩ = \~{I}
-  "\u012A": "I\u0304",
-  // Ī = \={I}
-  "\u012C": "I\u0306",
-  // Ĭ = \u{I}
-  "\u01CF": "I\u030C",
-  // Ǐ = \v{I}
-  "\xCE": "I\u0302",
-  // Î = \^{I}
-  "\u0130": "I\u0307",
-  // İ = \.{I}
-  "\u0134": "J\u0302",
-  // Ĵ = \^{J}
-  "\u1E30": "K\u0301",
-  // Ḱ = \'{K}
-  "\u01E8": "K\u030C",
-  // Ǩ = \v{K}
-  "\u0139": "L\u0301",
-  // Ĺ = \'{L}
-  "\u013D": "L\u030C",
-  // Ľ = \v{L}
-  "\u1E3E": "M\u0301",
-  // Ḿ = \'{M}
-  "\u1E40": "M\u0307",
-  // Ṁ = \.{M}
-  "\u0143": "N\u0301",
-  // Ń = \'{N}
-  "\u01F8": "N\u0300",
-  // Ǹ = \`{N}
-  "\xD1": "N\u0303",
-  // Ñ = \~{N}
-  "\u0147": "N\u030C",
-  // Ň = \v{N}
-  "\u1E44": "N\u0307",
-  // Ṅ = \.{N}
-  "\xD3": "O\u0301",
-  // Ó = \'{O}
-  "\xD2": "O\u0300",
-  // Ò = \`{O}
-  "\xD6": "O\u0308",
-  // Ö = \"{O}
-  "\u022A": "O\u0308\u0304",
-  // Ȫ = \"\={O}
-  "\xD5": "O\u0303",
-  // Õ = \~{O}
-  "\u1E4C": "O\u0303\u0301",
-  // Ṍ = \~\'{O}
-  "\u1E4E": "O\u0303\u0308",
-  // Ṏ = \~\"{O}
-  "\u022C": "O\u0303\u0304",
-  // Ȭ = \~\={O}
-  "\u014C": "O\u0304",
-  // Ō = \={O}
-  "\u1E52": "O\u0304\u0301",
-  // Ṓ = \=\'{O}
-  "\u1E50": "O\u0304\u0300",
-  // Ṑ = \=\`{O}
-  "\u014E": "O\u0306",
-  // Ŏ = \u{O}
-  "\u01D1": "O\u030C",
-  // Ǒ = \v{O}
-  "\xD4": "O\u0302",
-  // Ô = \^{O}
-  "\u1ED0": "O\u0302\u0301",
-  // Ố = \^\'{O}
-  "\u1ED2": "O\u0302\u0300",
-  // Ồ = \^\`{O}
-  "\u1ED6": "O\u0302\u0303",
-  // Ỗ = \^\~{O}
-  "\u022E": "O\u0307",
-  // Ȯ = \.{O}
-  "\u0230": "O\u0307\u0304",
-  // Ȱ = \.\={O}
-  "\u0150": "O\u030B",
-  // Ő = \H{O}
-  "\u1E54": "P\u0301",
-  // Ṕ = \'{P}
-  "\u1E56": "P\u0307",
-  // Ṗ = \.{P}
-  "\u0154": "R\u0301",
-  // Ŕ = \'{R}
-  "\u0158": "R\u030C",
-  // Ř = \v{R}
-  "\u1E58": "R\u0307",
-  // Ṙ = \.{R}
-  "\u015A": "S\u0301",
-  // Ś = \'{S}
-  "\u1E64": "S\u0301\u0307",
-  // Ṥ = \'\.{S}
-  "\u0160": "S\u030C",
-  // Š = \v{S}
-  "\u1E66": "S\u030C\u0307",
-  // Ṧ = \v\.{S}
-  "\u015C": "S\u0302",
-  // Ŝ = \^{S}
-  "\u1E60": "S\u0307",
-  // Ṡ = \.{S}
-  "\u0164": "T\u030C",
-  // Ť = \v{T}
-  "\u1E6A": "T\u0307",
-  // Ṫ = \.{T}
-  "\xDA": "U\u0301",
-  // Ú = \'{U}
-  "\xD9": "U\u0300",
-  // Ù = \`{U}
-  "\xDC": "U\u0308",
-  // Ü = \"{U}
-  "\u01D7": "U\u0308\u0301",
-  // Ǘ = \"\'{U}
-  "\u01DB": "U\u0308\u0300",
-  // Ǜ = \"\`{U}
-  "\u01D5": "U\u0308\u0304",
-  // Ǖ = \"\={U}
-  "\u01D9": "U\u0308\u030C",
-  // Ǚ = \"\v{U}
-  "\u0168": "U\u0303",
-  // Ũ = \~{U}
-  "\u1E78": "U\u0303\u0301",
-  // Ṹ = \~\'{U}
-  "\u016A": "U\u0304",
-  // Ū = \={U}
-  "\u1E7A": "U\u0304\u0308",
-  // Ṻ = \=\"{U}
-  "\u016C": "U\u0306",
-  // Ŭ = \u{U}
-  "\u01D3": "U\u030C",
-  // Ǔ = \v{U}
-  "\xDB": "U\u0302",
-  // Û = \^{U}
-  "\u016E": "U\u030A",
-  // Ů = \r{U}
-  "\u0170": "U\u030B",
-  // Ű = \H{U}
-  "\u1E7C": "V\u0303",
-  // Ṽ = \~{V}
-  "\u1E82": "W\u0301",
-  // Ẃ = \'{W}
-  "\u1E80": "W\u0300",
-  // Ẁ = \`{W}
-  "\u1E84": "W\u0308",
-  // Ẅ = \"{W}
-  "\u0174": "W\u0302",
-  // Ŵ = \^{W}
-  "\u1E86": "W\u0307",
-  // Ẇ = \.{W}
-  "\u1E8C": "X\u0308",
-  // Ẍ = \"{X}
-  "\u1E8A": "X\u0307",
-  // Ẋ = \.{X}
-  "\xDD": "Y\u0301",
-  // Ý = \'{Y}
-  "\u1EF2": "Y\u0300",
-  // Ỳ = \`{Y}
-  "\u0178": "Y\u0308",
-  // Ÿ = \"{Y}
-  "\u1EF8": "Y\u0303",
-  // Ỹ = \~{Y}
-  "\u0232": "Y\u0304",
-  // Ȳ = \={Y}
-  "\u0176": "Y\u0302",
-  // Ŷ = \^{Y}
-  "\u1E8E": "Y\u0307",
-  // Ẏ = \.{Y}
-  "\u0179": "Z\u0301",
-  // Ź = \'{Z}
-  "\u017D": "Z\u030C",
-  // Ž = \v{Z}
-  "\u1E90": "Z\u0302",
-  // Ẑ = \^{Z}
-  "\u017B": "Z\u0307",
-  // Ż = \.{Z}
-  "\u03AC": "\u03B1\u0301",
-  // ά = \'{α}
-  "\u1F70": "\u03B1\u0300",
-  // ὰ = \`{α}
-  "\u1FB1": "\u03B1\u0304",
-  // ᾱ = \={α}
-  "\u1FB0": "\u03B1\u0306",
-  // ᾰ = \u{α}
-  "\u03AD": "\u03B5\u0301",
-  // έ = \'{ε}
-  "\u1F72": "\u03B5\u0300",
-  // ὲ = \`{ε}
-  "\u03AE": "\u03B7\u0301",
-  // ή = \'{η}
-  "\u1F74": "\u03B7\u0300",
-  // ὴ = \`{η}
-  "\u03AF": "\u03B9\u0301",
-  // ί = \'{ι}
-  "\u1F76": "\u03B9\u0300",
-  // ὶ = \`{ι}
-  "\u03CA": "\u03B9\u0308",
-  // ϊ = \"{ι}
-  "\u0390": "\u03B9\u0308\u0301",
-  // ΐ = \"\'{ι}
-  "\u1FD2": "\u03B9\u0308\u0300",
-  // ῒ = \"\`{ι}
-  "\u1FD1": "\u03B9\u0304",
-  // ῑ = \={ι}
-  "\u1FD0": "\u03B9\u0306",
-  // ῐ = \u{ι}
-  "\u03CC": "\u03BF\u0301",
-  // ό = \'{ο}
-  "\u1F78": "\u03BF\u0300",
-  // ὸ = \`{ο}
-  "\u03CD": "\u03C5\u0301",
-  // ύ = \'{υ}
-  "\u1F7A": "\u03C5\u0300",
-  // ὺ = \`{υ}
-  "\u03CB": "\u03C5\u0308",
-  // ϋ = \"{υ}
-  "\u03B0": "\u03C5\u0308\u0301",
-  // ΰ = \"\'{υ}
-  "\u1FE2": "\u03C5\u0308\u0300",
-  // ῢ = \"\`{υ}
-  "\u1FE1": "\u03C5\u0304",
-  // ῡ = \={υ}
-  "\u1FE0": "\u03C5\u0306",
-  // ῠ = \u{υ}
-  "\u03CE": "\u03C9\u0301",
-  // ώ = \'{ω}
-  "\u1F7C": "\u03C9\u0300",
-  // ὼ = \`{ω}
-  "\u038E": "\u03A5\u0301",
-  // Ύ = \'{Υ}
-  "\u1FEA": "\u03A5\u0300",
-  // Ὺ = \`{Υ}
-  "\u03AB": "\u03A5\u0308",
-  // Ϋ = \"{Υ}
-  "\u1FE9": "\u03A5\u0304",
-  // Ῡ = \={Υ}
-  "\u1FE8": "\u03A5\u0306",
-  // Ῠ = \u{Υ}
-  "\u038F": "\u03A9\u0301",
-  // Ώ = \'{Ω}
-  "\u1FFA": "\u03A9\u0300" // Ὼ = \`{Ω}
-
-});
-// CONCATENATED MODULE: ./src/Parser.js
-/* eslint no-constant-condition:0 */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/**
- * This file contains the parser used to parse out a TeX expression from the
- * input. Since TeX isn't context-free, standard parsers don't work particularly
- * well.
- *
- * The strategy of this parser is as such:
- *
- * The main functions (the `.parse...` ones) take a position in the current
- * parse string to parse tokens from. The lexer (found in Lexer.js, stored at
- * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When
- * individual tokens are needed at a position, the lexer is called to pull out a
- * token, which is then used.
- *
- * The parser has a property called "mode" indicating the mode that
- * the parser is currently in. Currently it has to be one of "math" or
- * "text", which denotes whether the current environment is a math-y
- * one or a text-y one (e.g. inside \text). Currently, this serves to
- * limit the functions which can be used in text mode.
- *
- * The main functions then return an object which contains the useful data that
- * was parsed at its given point, and a new position at the end of the parsed
- * data. The main functions can call each other and continue the parsing by
- * using the returned position as a new starting point.
- *
- * There are also extra `.handle...` functions, which pull out some reused
- * functionality into self-contained functions.
- *
- * The functions return ParseNodes.
- */
-var Parser_Parser =
-/*#__PURE__*/
-function () {
-  function Parser(input, settings) {
-    this.mode = void 0;
-    this.gullet = void 0;
-    this.settings = void 0;
-    this.leftrightDepth = void 0;
-    this.nextToken = void 0;
-    // Start in math mode
-    this.mode = "math"; // Create a new macro expander (gullet) and (indirectly via that) also a
-    // new lexer (mouth) for this parser (stomach, in the language of TeX)
-
-    this.gullet = new MacroExpander_MacroExpander(input, settings, this.mode); // Store the settings for use in parsing
-
-    this.settings = settings; // Count leftright depth (for \middle errors)
-
-    this.leftrightDepth = 0;
-  }
-  /**
-   * Checks a result to make sure it has the right type, and throws an
-   * appropriate error otherwise.
-   */
-
-
-  var _proto = Parser.prototype;
-
-  _proto.expect = function expect(text, consume) {
-    if (consume === void 0) {
-      consume = true;
-    }
-
-    if (this.fetch().text !== text) {
-      throw new src_ParseError("Expected '" + text + "', got '" + this.fetch().text + "'", this.fetch());
-    }
-
-    if (consume) {
-      this.consume();
-    }
-  }
-  /**
-   * Discards the current lookahead token, considering it consumed.
-   */
-  ;
-
-  _proto.consume = function consume() {
-    this.nextToken = null;
-  }
-  /**
-   * Return the current lookahead token, or if there isn't one (at the
-   * beginning, or if the previous lookahead token was consume()d),
-   * fetch the next token as the new lookahead token and return it.
-   */
-  ;
-
-  _proto.fetch = function fetch() {
-    if (this.nextToken == null) {
-      this.nextToken = this.gullet.expandNextToken();
-    }
-
-    return this.nextToken;
-  }
-  /**
-   * Switches between "text" and "math" modes.
-   */
-  ;
-
-  _proto.switchMode = function switchMode(newMode) {
-    this.mode = newMode;
-    this.gullet.switchMode(newMode);
-  }
-  /**
-   * Main parsing function, which parses an entire input.
-   */
-  ;
-
-  _proto.parse = function parse() {
-    // Create a group namespace for the math expression.
-    // (LaTeX creates a new group for every $...$, $$...$$, \[...\].)
-    this.gullet.beginGroup(); // Use old \color behavior (same as LaTeX's \textcolor) if requested.
-    // We do this within the group for the math expression, so it doesn't
-    // pollute settings.macros.
-
-    if (this.settings.colorIsTextColor) {
-      this.gullet.macros.set("\\color", "\\textcolor");
-    } // Try to parse the input
-
-
-    var parse = this.parseExpression(false); // If we succeeded, make sure there's an EOF at the end
-
-    this.expect("EOF"); // End the group namespace for the expression
-
-    this.gullet.endGroup();
-    return parse;
-  };
-
-  _proto.parseExpression = function parseExpression(breakOnInfix, breakOnTokenText) {
-    var body = []; // Keep adding atoms to the body until we can't parse any more atoms (either
-    // we reached the end, a }, or a \right)
-
-    while (true) {
-      // Ignore spaces in math mode
-      if (this.mode === "math") {
-        this.consumeSpaces();
-      }
-
-      var lex = this.fetch();
-
-      if (Parser.endOfExpression.indexOf(lex.text) !== -1) {
-        break;
-      }
-
-      if (breakOnTokenText && lex.text === breakOnTokenText) {
-        break;
-      }
-
-      if (breakOnInfix && src_functions[lex.text] && src_functions[lex.text].infix) {
-        break;
-      }
-
-      var atom = this.parseAtom(breakOnTokenText);
-
-      if (!atom) {
-        break;
-      }
-
-      body.push(atom);
-    }
-
-    if (this.mode === "text") {
-      this.formLigatures(body);
-    }
-
-    return this.handleInfixNodes(body);
-  }
-  /**
-   * Rewrites infix operators such as \over with corresponding commands such
-   * as \frac.
-   *
-   * There can only be one infix operator per group.  If there's more than one
-   * then the expression is ambiguous.  This can be resolved by adding {}.
-   */
-  ;
-
-  _proto.handleInfixNodes = function handleInfixNodes(body) {
-    var overIndex = -1;
-    var funcName;
-
-    for (var i = 0; i < body.length; i++) {
-      var node = checkNodeType(body[i], "infix");
-
-      if (node) {
-        if (overIndex !== -1) {
-          throw new src_ParseError("only one infix operator per group", node.token);
-        }
-
-        overIndex = i;
-        funcName = node.replaceWith;
-      }
-    }
-
-    if (overIndex !== -1 && funcName) {
-      var numerNode;
-      var denomNode;
-      var numerBody = body.slice(0, overIndex);
-      var denomBody = body.slice(overIndex + 1);
-
-      if (numerBody.length === 1 && numerBody[0].type === "ordgroup") {
-        numerNode = numerBody[0];
-      } else {
-        numerNode = {
-          type: "ordgroup",
-          mode: this.mode,
-          body: numerBody
-        };
-      }
-
-      if (denomBody.length === 1 && denomBody[0].type === "ordgroup") {
-        denomNode = denomBody[0];
-      } else {
-        denomNode = {
-          type: "ordgroup",
-          mode: this.mode,
-          body: denomBody
-        };
-      }
-
-      var _node;
-
-      if (funcName === "\\\\abovefrac") {
-        _node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []);
-      } else {
-        _node = this.callFunction(funcName, [numerNode, denomNode], []);
-      }
-
-      return [_node];
-    } else {
-      return body;
-    }
-  } // The greediness of a superscript or subscript
-  ;
-
-  /**
-   * Handle a subscript or superscript with nice errors.
-   */
-  _proto.handleSupSubscript = function handleSupSubscript(name) {
-    var symbolToken = this.fetch();
-    var symbol = symbolToken.text;
-    this.consume();
-    var group = this.parseGroup(name, false, Parser.SUPSUB_GREEDINESS, undefined, undefined, true); // ignore spaces before sup/subscript argument
-
-    if (!group) {
-      throw new src_ParseError("Expected group after '" + symbol + "'", symbolToken);
-    }
-
-    return group;
-  }
-  /**
-   * Converts the textual input of an unsupported command into a text node
-   * contained within a color node whose color is determined by errorColor
-   */
-  ;
-
-  _proto.formatUnsupportedCmd = function formatUnsupportedCmd(text) {
-    var textordArray = [];
-
-    for (var i = 0; i < text.length; i++) {
-      textordArray.push({
-        type: "textord",
-        mode: "text",
-        text: text[i]
-      });
-    }
-
-    var textNode = {
-      type: "text",
-      mode: this.mode,
-      body: textordArray
-    };
-    var colorNode = {
-      type: "color",
-      mode: this.mode,
-      color: this.settings.errorColor,
-      body: [textNode]
-    };
-    return colorNode;
-  }
-  /**
-   * Parses a group with optional super/subscripts.
-   */
-  ;
-
-  _proto.parseAtom = function parseAtom(breakOnTokenText) {
-    // The body of an atom is an implicit group, so that things like
-    // \left(x\right)^2 work correctly.
-    var base = this.parseGroup("atom", false, null, breakOnTokenText); // In text mode, we don't have superscripts or subscripts
-
-    if (this.mode === "text") {
-      return base;
-    } // Note that base may be empty (i.e. null) at this point.
-
-
-    var superscript;
-    var subscript;
-
-    while (true) {
-      // Guaranteed in math mode, so eat any spaces first.
-      this.consumeSpaces(); // Lex the first token
-
-      var lex = this.fetch();
-
-      if (lex.text === "\\limits" || lex.text === "\\nolimits") {
-        // We got a limit control
-        var opNode = checkNodeType(base, "op");
-
-        if (opNode) {
-          var limits = lex.text === "\\limits";
-          opNode.limits = limits;
-          opNode.alwaysHandleSupSub = true;
-        } else {
-          opNode = checkNodeType(base, "operatorname");
-
-          if (opNode && opNode.alwaysHandleSupSub) {
-            var _limits = lex.text === "\\limits";
-
-            opNode.limits = _limits;
-          } else {
-            throw new src_ParseError("Limit controls must follow a math operator", lex);
-          }
-        }
-
-        this.consume();
-      } else if (lex.text === "^") {
-        // We got a superscript start
-        if (superscript) {
-          throw new src_ParseError("Double superscript", lex);
-        }
-
-        superscript = this.handleSupSubscript("superscript");
-      } else if (lex.text === "_") {
-        // We got a subscript start
-        if (subscript) {
-          throw new src_ParseError("Double subscript", lex);
-        }
-
-        subscript = this.handleSupSubscript("subscript");
-      } else if (lex.text === "'") {
-        // We got a prime
-        if (superscript) {
-          throw new src_ParseError("Double superscript", lex);
-        }
-
-        var prime = {
-          type: "textord",
-          mode: this.mode,
-          text: "\\prime"
-        }; // Many primes can be grouped together, so we handle this here
-
-        var primes = [prime];
-        this.consume(); // Keep lexing tokens until we get something that's not a prime
-
-        while (this.fetch().text === "'") {
-          // For each one, add another prime to the list
-          primes.push(prime);
-          this.consume();
-        } // If there's a superscript following the primes, combine that
-        // superscript in with the primes.
-
-
-        if (this.fetch().text === "^") {
-          primes.push(this.handleSupSubscript("superscript"));
-        } // Put everything into an ordgroup as the superscript
-
-
-        superscript = {
-          type: "ordgroup",
-          mode: this.mode,
-          body: primes
-        };
-      } else {
-        // If it wasn't ^, _, or ', stop parsing super/subscripts
-        break;
-      }
-    } // Base must be set if superscript or subscript are set per logic above,
-    // but need to check here for type check to pass.
-
-
-    if (superscript || subscript) {
-      // If we got either a superscript or subscript, create a supsub
-      return {
-        type: "supsub",
-        mode: this.mode,
-        base: base,
-        sup: superscript,
-        sub: subscript
-      };
-    } else {
-      // Otherwise return the original body
-      return base;
-    }
-  }
-  /**
-   * Parses an entire function, including its base and all of its arguments.
-   */
-  ;
-
-  _proto.parseFunction = function parseFunction(breakOnTokenText, name, // For error reporting.
-  greediness) {
-    var token = this.fetch();
-    var func = token.text;
-    var funcData = src_functions[func];
-
-    if (!funcData) {
-      return null;
-    }
-
-    this.consume(); // consume command token
-
-    if (greediness != null && funcData.greediness <= greediness) {
-      throw new src_ParseError("Got function '" + func + "' with no arguments" + (name ? " as " + name : ""), token);
-    } else if (this.mode === "text" && !funcData.allowedInText) {
-      throw new src_ParseError("Can't use function '" + func + "' in text mode", token);
-    } else if (this.mode === "math" && funcData.allowedInMath === false) {
-      throw new src_ParseError("Can't use function '" + func + "' in math mode", token);
-    }
-
-    var _this$parseArguments = this.parseArguments(func, funcData),
-        args = _this$parseArguments.args,
-        optArgs = _this$parseArguments.optArgs;
-
-    return this.callFunction(func, args, optArgs, token, breakOnTokenText);
-  }
-  /**
-   * Call a function handler with a suitable context and arguments.
-   */
-  ;
-
-  _proto.callFunction = function callFunction(name, args, optArgs, token, breakOnTokenText) {
-    var context = {
-      funcName: name,
-      parser: this,
-      token: token,
-      breakOnTokenText: breakOnTokenText
-    };
-    var func = src_functions[name];
-
-    if (func && func.handler) {
-      return func.handler(context, args, optArgs);
-    } else {
-      throw new src_ParseError("No function handler for " + name);
-    }
-  }
-  /**
-   * Parses the arguments of a function or environment
-   */
-  ;
-
-  _proto.parseArguments = function parseArguments(func, // Should look like "\name" or "\begin{name}".
-  funcData) {
-    var totalArgs = funcData.numArgs + funcData.numOptionalArgs;
-
-    if (totalArgs === 0) {
-      return {
-        args: [],
-        optArgs: []
-      };
-    }
-
-    var baseGreediness = funcData.greediness;
-    var args = [];
-    var optArgs = [];
-
-    for (var i = 0; i < totalArgs; i++) {
-      var argType = funcData.argTypes && funcData.argTypes[i];
-      var isOptional = i < funcData.numOptionalArgs; // Ignore spaces between arguments.  As the TeXbook says:
-      // "After you have said ‘\def\row#1#2{...}’, you are allowed to
-      //  put spaces between the arguments (e.g., ‘\row x n’), because
-      //  TeX doesn’t use single spaces as undelimited arguments."
-
-      var consumeSpaces = i > 0 && !isOptional || // Also consume leading spaces in math mode, as parseSymbol
-      // won't know what to do with them.  This can only happen with
-      // macros, e.g. \frac\foo\foo where \foo expands to a space symbol.
-      // In LaTeX, the \foo's get treated as (blank) arguments.
-      // In KaTeX, for now, both spaces will get consumed.
-      // TODO(edemaine)
-      i === 0 && !isOptional && this.mode === "math";
-      var arg = this.parseGroupOfType("argument to '" + func + "'", argType, isOptional, baseGreediness, consumeSpaces);
-
-      if (!arg) {
-        if (isOptional) {
-          optArgs.push(null);
-          continue;
-        }
-
-        throw new src_ParseError("Expected group after '" + func + "'", this.fetch());
-      }
-
-      (isOptional ? optArgs : args).push(arg);
-    }
-
-    return {
-      args: args,
-      optArgs: optArgs
-    };
-  }
-  /**
-   * Parses a group when the mode is changing.
-   */
-  ;
-
-  _proto.parseGroupOfType = function parseGroupOfType(name, type, optional, greediness, consumeSpaces) {
-    switch (type) {
-      case "color":
-        if (consumeSpaces) {
-          this.consumeSpaces();
-        }
-
-        return this.parseColorGroup(optional);
-
-      case "size":
-        if (consumeSpaces) {
-          this.consumeSpaces();
-        }
-
-        return this.parseSizeGroup(optional);
-
-      case "url":
-        return this.parseUrlGroup(optional, consumeSpaces);
-
-      case "math":
-      case "text":
-        return this.parseGroup(name, optional, greediness, undefined, type, consumeSpaces);
-
-      case "hbox":
-        {
-          // hbox argument type wraps the argument in the equivalent of
-          // \hbox, which is like \text but switching to \textstyle size.
-          var group = this.parseGroup(name, optional, greediness, undefined, "text", consumeSpaces);
-
-          if (!group) {
-            return group;
-          }
-
-          var styledGroup = {
-            type: "styling",
-            mode: group.mode,
-            body: [group],
-            style: "text" // simulate \textstyle
-
-          };
-          return styledGroup;
-        }
-
-      case "raw":
-        {
-          if (consumeSpaces) {
-            this.consumeSpaces();
-          }
-
-          if (optional && this.fetch().text === "{") {
-            return null;
-          }
-
-          var token = this.parseStringGroup("raw", optional, true);
-
-          if (token) {
-            return {
-              type: "raw",
-              mode: "text",
-              string: token.text
-            };
-          } else {
-            throw new src_ParseError("Expected raw group", this.fetch());
-          }
-        }
-
-      case "original":
-      case null:
-      case undefined:
-        return this.parseGroup(name, optional, greediness, undefined, undefined, consumeSpaces);
-
-      default:
-        throw new src_ParseError("Unknown group type as " + name, this.fetch());
-    }
-  }
-  /**
-   * Discard any space tokens, fetching the next non-space token.
-   */
-  ;
-
-  _proto.consumeSpaces = function consumeSpaces() {
-    while (this.fetch().text === " ") {
-      this.consume();
-    }
-  }
-  /**
-   * Parses a group, essentially returning the string formed by the
-   * brace-enclosed tokens plus some position information.
-   */
-  ;
-
-  _proto.parseStringGroup = function parseStringGroup(modeName, // Used to describe the mode in error messages.
-  optional, raw) {
-    var groupBegin = optional ? "[" : "{";
-    var groupEnd = optional ? "]" : "}";
-    var beginToken = this.fetch();
-
-    if (beginToken.text !== groupBegin) {
-      if (optional) {
-        return null;
-      } else if (raw && beginToken.text !== "EOF" && /[^{}[\]]/.test(beginToken.text)) {
-        this.consume();
-        return beginToken;
-      }
-    }
-
-    var outerMode = this.mode;
-    this.mode = "text";
-    this.expect(groupBegin);
-    var str = "";
-    var firstToken = this.fetch();
-    var nested = 0; // allow nested braces in raw string group
-
-    var lastToken = firstToken;
-    var nextToken;
-
-    while ((nextToken = this.fetch()).text !== groupEnd || raw && nested > 0) {
-      switch (nextToken.text) {
-        case "EOF":
-          throw new src_ParseError("Unexpected end of input in " + modeName, firstToken.range(lastToken, str));
-
-        case groupBegin:
-          nested++;
-          break;
-
-        case groupEnd:
-          nested--;
-          break;
-      }
-
-      lastToken = nextToken;
-      str += lastToken.text;
-      this.consume();
-    }
-
-    this.expect(groupEnd);
-    this.mode = outerMode;
-    return firstToken.range(lastToken, str);
-  }
-  /**
-   * Parses a regex-delimited group: the largest sequence of tokens
-   * whose concatenated strings match `regex`. Returns the string
-   * formed by the tokens plus some position information.
-   */
-  ;
-
-  _proto.parseRegexGroup = function parseRegexGroup(regex, modeName) {
-    var outerMode = this.mode;
-    this.mode = "text";
-    var firstToken = this.fetch();
-    var lastToken = firstToken;
-    var str = "";
-    var nextToken;
-
-    while ((nextToken = this.fetch()).text !== "EOF" && regex.test(str + nextToken.text)) {
-      lastToken = nextToken;
-      str += lastToken.text;
-      this.consume();
-    }
-
-    if (str === "") {
-      throw new src_ParseError("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken);
-    }
-
-    this.mode = outerMode;
-    return firstToken.range(lastToken, str);
-  }
-  /**
-   * Parses a color description.
-   */
-  ;
-
-  _proto.parseColorGroup = function parseColorGroup(optional) {
-    var res = this.parseStringGroup("color", optional);
-
-    if (!res) {
-      return null;
-    }
-
-    var match = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(res.text);
-
-    if (!match) {
-      throw new src_ParseError("Invalid color: '" + res.text + "'", res);
-    }
-
-    var color = match[0];
-
-    if (/^[0-9a-f]{6}$/i.test(color)) {
-      // We allow a 6-digit HTML color spec without a leading "#".
-      // This follows the xcolor package's HTML color model.
-      // Predefined color names are all missed by this RegEx pattern.
-      color = "#" + color;
-    }
-
-    return {
-      type: "color-token",
-      mode: this.mode,
-      color: color
-    };
-  }
-  /**
-   * Parses a size specification, consisting of magnitude and unit.
-   */
-  ;
-
-  _proto.parseSizeGroup = function parseSizeGroup(optional) {
-    var res;
-    var isBlank = false;
-
-    if (!optional && this.fetch().text !== "{") {
-      res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size");
-    } else {
-      res = this.parseStringGroup("size", optional);
-    }
-
-    if (!res) {
-      return null;
-    }
-
-    if (!optional && res.text.length === 0) {
-      // Because we've tested for what is !optional, this block won't
-      // affect \kern, \hspace, etc. It will capture the mandatory arguments
-      // to \genfrac and \above.
-      res.text = "0pt"; // Enable \above{}
-
-      isBlank = true; // This is here specifically for \genfrac
-    }
-
-    var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text);
-
-    if (!match) {
-      throw new src_ParseError("Invalid size: '" + res.text + "'", res);
-    }
-
-    var data = {
-      number: +(match[1] + match[2]),
-      // sign + magnitude, cast to number
-      unit: match[3]
-    };
-
-    if (!validUnit(data)) {
-      throw new src_ParseError("Invalid unit: '" + data.unit + "'", res);
-    }
-
-    return {
-      type: "size",
-      mode: this.mode,
-      value: data,
-      isBlank: isBlank
-    };
-  }
-  /**
-   * Parses an URL, checking escaped letters and allowed protocols,
-   * and setting the catcode of % as an active character (as in \hyperref).
-   */
-  ;
-
-  _proto.parseUrlGroup = function parseUrlGroup(optional, consumeSpaces) {
-    this.gullet.lexer.setCatcode("%", 13); // active character
-
-    var res = this.parseStringGroup("url", optional, true); // get raw string
-
-    this.gullet.lexer.setCatcode("%", 14); // comment character
-
-    if (!res) {
-      return null;
-    } // hyperref package allows backslashes alone in href, but doesn't
-    // generate valid links in such cases; we interpret this as
-    // "undefined" behaviour, and keep them as-is. Some browser will
-    // replace backslashes with forward slashes.
-
-
-    var url = res.text.replace(/\\([#$%&~_^{}])/g, '$1');
-    return {
-      type: "url",
-      mode: this.mode,
-      url: url
-    };
-  }
-  /**
-   * If `optional` is false or absent, this parses an ordinary group,
-   * which is either a single nucleus (like "x") or an expression
-   * in braces (like "{x+y}") or an implicit group, a group that starts
-   * at the current position, and ends right before a higher explicit
-   * group ends, or at EOF.
-   * If `optional` is true, it parses either a bracket-delimited expression
-   * (like "[x+y]") or returns null to indicate the absence of a
-   * bracket-enclosed group.
-   * If `mode` is present, switches to that mode while parsing the group,
-   * and switches back after.
-   */
-  ;
-
-  _proto.parseGroup = function parseGroup(name, // For error reporting.
-  optional, greediness, breakOnTokenText, mode, consumeSpaces) {
-    // Switch to specified mode
-    var outerMode = this.mode;
-
-    if (mode) {
-      this.switchMode(mode);
-    } // Consume spaces if requested, crucially *after* we switch modes,
-    // so that the next non-space token is parsed in the correct mode.
-
-
-    if (consumeSpaces) {
-      this.consumeSpaces();
-    } // Get first token
-
-
-    var firstToken = this.fetch();
-    var text = firstToken.text;
-    var result; // Try to parse an open brace or \begingroup
-
-    if (optional ? text === "[" : text === "{" || text === "\\begingroup") {
-      this.consume();
-      var groupEnd = Parser.endOfGroup[text]; // Start a new group namespace
-
-      this.gullet.beginGroup(); // If we get a brace, parse an expression
-
-      var expression = this.parseExpression(false, groupEnd);
-      var lastToken = this.fetch(); // Check that we got a matching closing brace
-
-      this.expect(groupEnd); // End group namespace
-
-      this.gullet.endGroup();
-      result = {
-        type: "ordgroup",
-        mode: this.mode,
-        loc: SourceLocation.range(firstToken, lastToken),
-        body: expression,
-        // A group formed by \begingroup...\endgroup is a semi-simple group
-        // which doesn't affect spacing in math mode, i.e., is transparent.
-        // https://tex.stackexchange.com/questions/1930/when-should-one-
-        // use-begingroup-instead-of-bgroup
-        semisimple: text === "\\begingroup" || undefined
-      };
-    } else if (optional) {
-      // Return nothing for an optional group
-      result = null;
-    } else {
-      // If there exists a function with this name, parse the function.
-      // Otherwise, just return a nucleus
-      result = this.parseFunction(breakOnTokenText, name, greediness) || this.parseSymbol();
-
-      if (result == null && text[0] === "\\" && !implicitCommands.hasOwnProperty(text)) {
-        if (this.settings.throwOnError) {
-          throw new src_ParseError("Undefined control sequence: " + text, firstToken);
-        }
-
-        result = this.formatUnsupportedCmd(text);
-        this.consume();
-      }
-    } // Switch mode back
-
-
-    if (mode) {
-      this.switchMode(outerMode);
-    }
-
-    return result;
-  }
-  /**
-   * Form ligature-like combinations of characters for text mode.
-   * This includes inputs like "--", "---", "``" and "''".
-   * The result will simply replace multiple textord nodes with a single
-   * character in each value by a single textord node having multiple
-   * characters in its value.  The representation is still ASCII source.
-   * The group will be modified in place.
-   */
-  ;
-
-  _proto.formLigatures = function formLigatures(group) {
-    var n = group.length - 1;
-
-    for (var i = 0; i < n; ++i) {
-      var a = group[i]; // $FlowFixMe: Not every node type has a `text` property.
-
-      var v = a.text;
-
-      if (v === "-" && group[i + 1].text === "-") {
-        if (i + 1 < n && group[i + 2].text === "-") {
-          group.splice(i, 3, {
-            type: "textord",
-            mode: "text",
-            loc: SourceLocation.range(a, group[i + 2]),
-            text: "---"
-          });
-          n -= 2;
-        } else {
-          group.splice(i, 2, {
-            type: "textord",
-            mode: "text",
-            loc: SourceLocation.range(a, group[i + 1]),
-            text: "--"
-          });
-          n -= 1;
-        }
-      }
-
-      if ((v === "'" || v === "`") && group[i + 1].text === v) {
-        group.splice(i, 2, {
-          type: "textord",
-          mode: "text",
-          loc: SourceLocation.range(a, group[i + 1]),
-          text: v + v
-        });
-        n -= 1;
-      }
-    }
-  }
-  /**
-   * Parse a single symbol out of the string. Here, we handle single character
-   * symbols and special functions like \verb.
-   */
-  ;
-
-  _proto.parseSymbol = function parseSymbol() {
-    var nucleus = this.fetch();
-    var text = nucleus.text;
-
-    if (/^\\verb[^a-zA-Z]/.test(text)) {
-      this.consume();
-      var arg = text.slice(5);
-      var star = arg.charAt(0) === "*";
-
-      if (star) {
-        arg = arg.slice(1);
-      } // Lexer's tokenRegex is constructed to always have matching
-      // first/last characters.
-
-
-      if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) {
-        throw new src_ParseError("\\verb assertion failed --\n                    please report what input caused this bug");
-      }
-
-      arg = arg.slice(1, -1); // remove first and last char
-
-      return {
-        type: "verb",
-        mode: "text",
-        body: arg,
-        star: star
-      };
-    } // At this point, we should have a symbol, possibly with accents.
-    // First expand any accented base symbol according to unicodeSymbols.
-
-
-    if (unicodeSymbols.hasOwnProperty(text[0]) && !src_symbols[this.mode][text[0]]) {
-      // This behavior is not strict (XeTeX-compatible) in math mode.
-      if (this.settings.strict && this.mode === "math") {
-        this.settings.reportNonstrict("unicodeTextInMathMode", "Accented Unicode text character \"" + text[0] + "\" used in " + "math mode", nucleus);
-      }
-
-      text = unicodeSymbols[text[0]] + text.substr(1);
-    } // Strip off any combining characters
-
-
-    var match = combiningDiacriticalMarksEndRegex.exec(text);
-
-    if (match) {
-      text = text.substring(0, match.index);
-
-      if (text === 'i') {
-        text = "\u0131"; // dotless i, in math and text mode
-      } else if (text === 'j') {
-        text = "\u0237"; // dotless j, in math and text mode
-      }
-    } // Recognize base symbol
-
-
-    var symbol;
-
-    if (src_symbols[this.mode][text]) {
-      if (this.settings.strict && this.mode === 'math' && extraLatin.indexOf(text) >= 0) {
-        this.settings.reportNonstrict("unicodeTextInMathMode", "Latin-1/Unicode text character \"" + text[0] + "\" used in " + "math mode", nucleus);
-      }
-
-      var group = src_symbols[this.mode][text].group;
-      var loc = SourceLocation.range(nucleus);
-      var s;
-
-      if (ATOMS.hasOwnProperty(group)) {
-        // $FlowFixMe
-        var family = group;
-        s = {
-          type: "atom",
-          mode: this.mode,
-          family: family,
-          loc: loc,
-          text: text
-        };
-      } else {
-        // $FlowFixMe
-        s = {
-          type: group,
-          mode: this.mode,
-          loc: loc,
-          text: text
-        };
-      }
-
-      symbol = s;
-    } else if (text.charCodeAt(0) >= 0x80) {
-      // no symbol for e.g. ^
-      if (this.settings.strict) {
-        if (!supportedCodepoint(text.charCodeAt(0))) {
-          this.settings.reportNonstrict("unknownSymbol", "Unrecognized Unicode character \"" + text[0] + "\"" + (" (" + text.charCodeAt(0) + ")"), nucleus);
-        } else if (this.mode === "math") {
-          this.settings.reportNonstrict("unicodeTextInMathMode", "Unicode text character \"" + text[0] + "\" used in math mode", nucleus);
-        }
-      } // All nonmathematical Unicode characters are rendered as if they
-      // are in text mode (wrapped in \text) because that's what it
-      // takes to render them in LaTeX.  Setting `mode: this.mode` is
-      // another natural choice (the user requested math mode), but
-      // this makes it more difficult for getCharacterMetrics() to
-      // distinguish Unicode characters without metrics and those for
-      // which we want to simulate the letter M.
-
-
-      symbol = {
-        type: "textord",
-        mode: "text",
-        loc: SourceLocation.range(nucleus),
-        text: text
-      };
-    } else {
-      return null; // EOF, ^, _, {, }, etc.
-    }
-
-    this.consume(); // Transform combining characters into accents
-
-    if (match) {
-      for (var i = 0; i < match[0].length; i++) {
-        var accent = match[0][i];
-
-        if (!unicodeAccents[accent]) {
-          throw new src_ParseError("Unknown accent ' " + accent + "'", nucleus);
-        }
-
-        var command = unicodeAccents[accent][this.mode];
-
-        if (!command) {
-          throw new src_ParseError("Accent " + accent + " unsupported in " + this.mode + " mode", nucleus);
-        }
-
-        symbol = {
-          type: "accent",
-          mode: this.mode,
-          loc: SourceLocation.range(nucleus),
-          label: command,
-          isStretchy: false,
-          isShifty: true,
-          base: symbol
-        };
-      }
-    }
-
-    return symbol;
-  };
-
-  return Parser;
-}();
-
-Parser_Parser.endOfExpression = ["}", "\\endgroup", "\\end", "\\right", "&"];
-Parser_Parser.endOfGroup = {
-  "[": "]",
-  "{": "}",
-  "\\begingroup": "\\endgroup"
-  /**
-   * Parses an "expression", which is a list of atoms.
-   *
-   * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This
-   *                 happens when functions have higher precendence han infix
-   *                 nodes in implicit parses.
-   *
-   * `breakOnTokenText`: The text of the token that the expression should end
-   *                     with, or `null` if something else should end the
-   *                     expression.
-   */
-
-};
-Parser_Parser.SUPSUB_GREEDINESS = 1;
-
-// CONCATENATED MODULE: ./src/parseTree.js
-/**
- * Provides a single function for parsing an expression using a Parser
- * TODO(emily): Remove this
- */
-
-
-
-/**
- * Parses an expression using a Parser, then returns the parsed result.
- */
-var parseTree_parseTree = function parseTree(toParse, settings) {
-  if (!(typeof toParse === 'string' || toParse instanceof String)) {
-    throw new TypeError('KaTeX can only parse string typed expression');
-  }
-
-  var parser = new Parser_Parser(toParse, settings); // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors
-
-  delete parser.gullet.macros.current["\\df@tag"];
-  var tree = parser.parse(); // If the input used \tag, it will set the \df@tag macro to the tag.
-  // In this case, we separately parse the tag and wrap the tree.
-
-  if (parser.gullet.macros.get("\\df@tag")) {
-    if (!settings.displayMode) {
-      throw new src_ParseError("\\tag works only in display equations");
-    }
-
-    parser.gullet.feed("\\df@tag");
-    tree = [{
-      type: "tag",
-      mode: "text",
-      body: tree,
-      tag: parser.parse()
-    }];
-  }
-
-  return tree;
-};
-
-/* harmony default export */ var src_parseTree = (parseTree_parseTree);
-// CONCATENATED MODULE: ./katex.js
-/* eslint no-console:0 */
-
-/**
- * This is the main entry point for KaTeX. Here, we expose functions for
- * rendering expressions either to DOM nodes or to markup strings.
- *
- * We also expose the ParseError class to check if errors thrown from KaTeX are
- * errors in the expression, or errors in javascript handling.
- */
-
-
-
-
-
-
-
-
-
-
-/**
- * Parse and build an expression, and place that expression in the DOM node
- * given.
- */
-var katex_render = function render(expression, baseNode, options) {
-  baseNode.textContent = "";
-  var node = katex_renderToDomTree(expression, options).toNode();
-  baseNode.appendChild(node);
-}; // KaTeX's styles don't work properly in quirks mode. Print out an error, and
-// disable rendering.
-
-
-if (typeof document !== "undefined") {
-  if (document.compatMode !== "CSS1Compat") {
-    typeof console !== "undefined" && console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your " + "website has a suitable doctype.");
-
-    katex_render = function render() {
-      throw new src_ParseError("KaTeX doesn't work in quirks mode.");
-    };
-  }
-}
-/**
- * Parse and build an expression, and return the markup for that.
- */
-
-
-var renderToString = function renderToString(expression, options) {
-  var markup = katex_renderToDomTree(expression, options).toMarkup();
-  return markup;
-};
-/**
- * Parse an expression and return the parse tree.
- */
-
-
-var katex_generateParseTree = function generateParseTree(expression, options) {
-  var settings = new Settings_Settings(options);
-  return src_parseTree(expression, settings);
-};
-/**
- * If the given error is a KaTeX ParseError and options.throwOnError is false,
- * renders the invalid LaTeX as a span with hover title giving the KaTeX
- * error message.  Otherwise, simply throws the error.
- */
-
-
-var katex_renderError = function renderError(error, expression, options) {
-  if (options.throwOnError || !(error instanceof src_ParseError)) {
-    throw error;
-  }
-
-  var node = buildCommon.makeSpan(["katex-error"], [new domTree_SymbolNode(expression)]);
-  node.setAttribute("title", error.toString());
-  node.setAttribute("style", "color:" + options.errorColor);
-  return node;
-};
-/**
- * Generates and returns the katex build tree. This is used for advanced
- * use cases (like rendering to custom output).
- */
-
-
-var katex_renderToDomTree = function renderToDomTree(expression, options) {
-  var settings = new Settings_Settings(options);
-
-  try {
-    var tree = src_parseTree(expression, settings);
-    return buildTree_buildTree(tree, expression, settings);
-  } catch (error) {
-    return katex_renderError(error, expression, settings);
-  }
-};
-/**
- * Generates and returns the katex build tree, with just HTML (no MathML).
- * This is used for advanced use cases (like rendering to custom output).
- */
-
-
-var katex_renderToHTMLTree = function renderToHTMLTree(expression, options) {
-  var settings = new Settings_Settings(options);
-
-  try {
-    var tree = src_parseTree(expression, settings);
-    return buildTree_buildHTMLTree(tree, expression, settings);
-  } catch (error) {
-    return katex_renderError(error, expression, settings);
-  }
-};
-
-/* harmony default export */ var katex_0 = ({
-  /**
-   * Current KaTeX version
-   */
-  version: "0.11.1",
-
-  /**
-   * Renders the given LaTeX into an HTML+MathML combination, and adds
-   * it as a child to the specified DOM node.
-   */
-  render: katex_render,
-
-  /**
-   * Renders the given LaTeX into an HTML+MathML combination string,
-   * for sending to the client.
-   */
-  renderToString: renderToString,
-
-  /**
-   * KaTeX error, usually during parsing.
-   */
-  ParseError: src_ParseError,
-
-  /**
-   * Parses the given LaTeX into KaTeX's internal parse tree structure,
-   * without rendering to HTML or MathML.
-   *
-   * NOTE: This method is not currently recommended for public use.
-   * The internal tree representation is unstable and is very likely
-   * to change. Use at your own risk.
-   */
-  __parse: katex_generateParseTree,
-
-  /**
-   * Renders the given LaTeX into an HTML+MathML internal DOM tree
-   * representation, without flattening that representation to a string.
-   *
-   * NOTE: This method is not currently recommended for public use.
-   * The internal tree representation is unstable and is very likely
-   * to change. Use at your own risk.
-   */
-  __renderToDomTree: katex_renderToDomTree,
-
-  /**
-   * Renders the given LaTeX into an HTML internal DOM tree representation,
-   * without MathML and without flattening that representation to a string.
-   *
-   * NOTE: This method is not currently recommended for public use.
-   * The internal tree representation is unstable and is very likely
-   * to change. Use at your own risk.
-   */
-  __renderToHTMLTree: katex_renderToHTMLTree,
-
-  /**
-   * extends internal font metrics object with a new object
-   * each key in the new object represents a font name
-  */
-  __setFontMetrics: setFontMetrics,
-
-  /**
-   * adds a new symbol to builtin symbols table
-   */
-  __defineSymbol: defineSymbol,
-
-  /**
-   * adds a new macro to builtin macro list
-   */
-  __defineMacro: defineMacro,
-
-  /**
-   * Expose the dom tree node types, which can be useful for type checking nodes.
-   *
-   * NOTE: This method is not currently recommended for public use.
-   * The internal tree representation is unstable and is very likely
-   * to change. Use at your own risk.
-   */
-  __domTree: {
-    Span: domTree_Span,
-    Anchor: domTree_Anchor,
-    SymbolNode: domTree_SymbolNode,
-    SvgNode: SvgNode,
-    PathNode: domTree_PathNode,
-    LineNode: LineNode
-  }
-});
-// CONCATENATED MODULE: ./katex.webpack.js
-/**
- * This is the webpack entry point for KaTeX. As ECMAScript, flow[1] and jest[2]
- * doesn't support CSS modules natively, a separate entry point is used and
- * it is not flowtyped.
- *
- * [1] https://gist.github.com/lambdahands/d19e0da96285b749f0ef
- * [2] https://facebook.github.io/jest/docs/en/webpack.html
- */
-
-
-/* harmony default export */ var katex_webpack = __webpack_exports__["default"] = (katex_0);
-
-/***/ })
-/******/ ])["default"];
-});
\ No newline at end of file
diff --git a/registry/vulkan/katex/katex.min.css b/registry/vulkan/katex/katex.min.css
deleted file mode 100644
index c0cd145..0000000
--- a/registry/vulkan/katex/katex.min.css
+++ /dev/null
@@ -1 +0,0 @@
-@font-face{font-family:KaTeX_AMS;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Math;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype");font-weight:400;font-style:normal}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.11.1"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left}
diff --git a/registry/vulkan/katex/katex.min.js b/registry/vulkan/katex/katex.min.js
deleted file mode 100644
index 906ce12..0000000
--- a/registry/vulkan/katex/katex.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.katex=e():t.katex=e()}("undefined"!=typeof self?self:this,function(){return function(t){var e={};function r(a){if(e[a])return e[a].exports;var n=e[a]={i:a,l:!1,exports:{}};return t[a].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=t,r.c=e,r.d=function(t,e,a){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var a=Object.create(null);if(r.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)r.d(a,n,function(e){return t[e]}.bind(null,n));return a},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=1)}([function(t,e,r){},function(t,e,r){"use strict";r.r(e);r(0);var a=function(){function t(t,e,r){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=t,this.start=e,this.end=r}return t.range=function(e,r){return r?e&&e.loc&&r.loc&&e.loc.lexer===r.loc.lexer?new t(e.loc.lexer,e.loc.start,r.loc.end):null:e&&e.loc},t}(),n=function(){function t(t,e){this.text=void 0,this.loc=void 0,this.text=t,this.loc=e}return t.prototype.range=function(e,r){return new t(r,a.range(this,e))},t}(),i=function t(e,r){this.position=void 0;var a,n="KaTeX parse error: "+e,i=r&&r.loc;if(i&&i.start<=i.end){var o=i.lexer.input;a=i.start;var s=i.end;a===o.length?n+=" at end of input: ":n+=" at position "+(a+1)+": ";var h=o.slice(a,s).replace(/[^]/g,"$&\u0332");n+=(a>15?"\u2026"+o.slice(a-15,a):o.slice(0,a))+h+(s+15<o.length?o.slice(s,s+15)+"\u2026":o.slice(s))}var l=new Error(n);return l.name="ParseError",l.__proto__=t.prototype,l.position=a,l};i.prototype.__proto__=Error.prototype;var o=i,s=/([A-Z])/g,h={"&":"&amp;",">":"&gt;","<":"&lt;",'"':"&quot;","'":"&#x27;"},l=/[&><"']/g;var m=function t(e){return"ordgroup"===e.type?1===e.body.length?t(e.body[0]):e:"color"===e.type?1===e.body.length?t(e.body[0]):e:"font"===e.type?t(e.body):e},c={contains:function(t,e){return-1!==t.indexOf(e)},deflt:function(t,e){return void 0===t?e:t},escape:function(t){return String(t).replace(l,function(t){return h[t]})},hyphenate:function(t){return t.replace(s,"-$1").toLowerCase()},getBaseElem:m,isCharacterBox:function(t){var e=m(t);return"mathord"===e.type||"textord"===e.type||"atom"===e.type},protocolFromUrl:function(t){var e=/^\s*([^\\\/#]*?)(?::|&#0*58|&#x0*3a)/i.exec(t);return null!=e?e[1]:"_relative"}},u=function(){function t(t){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,t=t||{},this.displayMode=c.deflt(t.displayMode,!1),this.output=c.deflt(t.output,"htmlAndMathml"),this.leqno=c.deflt(t.leqno,!1),this.fleqn=c.deflt(t.fleqn,!1),this.throwOnError=c.deflt(t.throwOnError,!0),this.errorColor=c.deflt(t.errorColor,"#cc0000"),this.macros=t.macros||{},this.minRuleThickness=Math.max(0,c.deflt(t.minRuleThickness,0)),this.colorIsTextColor=c.deflt(t.colorIsTextColor,!1),this.strict=c.deflt(t.strict,"warn"),this.trust=c.deflt(t.trust,!1),this.maxSize=Math.max(0,c.deflt(t.maxSize,1/0)),this.maxExpand=Math.max(0,c.deflt(t.maxExpand,1e3))}var e=t.prototype;return e.reportNonstrict=function(t,e,r){var a=this.strict;if("function"==typeof a&&(a=a(t,e,r)),a&&"ignore"!==a){if(!0===a||"error"===a)throw new o("LaTeX-incompatible input and strict mode is set to 'error': "+e+" ["+t+"]",r);"warn"===a?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+e+" ["+t+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+e+" ["+t+"]")}},e.useStrictBehavior=function(t,e,r){var a=this.strict;if("function"==typeof a)try{a=a(t,e,r)}catch(t){a="error"}return!(!a||"ignore"===a)&&(!0===a||"error"===a||("warn"===a?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+e+" ["+t+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+e+" ["+t+"]"),!1)))},e.isTrusted=function(t){t.url&&!t.protocol&&(t.protocol=c.protocolFromUrl(t.url));var e="function"==typeof this.trust?this.trust(t):this.trust;return Boolean(e)},t}(),p=function(){function t(t,e,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=t,this.size=e,this.cramped=r}var e=t.prototype;return e.sup=function(){return d[f[this.id]]},e.sub=function(){return d[g[this.id]]},e.fracNum=function(){return d[x[this.id]]},e.fracDen=function(){return d[v[this.id]]},e.cramp=function(){return d[b[this.id]]},e.text=function(){return d[y[this.id]]},e.isTight=function(){return this.size>=2},t}(),d=[new p(0,0,!1),new p(1,0,!0),new p(2,1,!1),new p(3,1,!0),new p(4,2,!1),new p(5,2,!0),new p(6,3,!1),new p(7,3,!0)],f=[4,5,4,5,6,7,6,7],g=[5,5,5,5,7,7,7,7],x=[2,3,4,5,6,7,6,7],v=[3,3,5,5,7,7,7,7],b=[1,1,3,3,5,5,7,7],y=[0,1,2,3,2,3,2,3],w={DISPLAY:d[0],TEXT:d[2],SCRIPT:d[4],SCRIPTSCRIPT:d[6]},k=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];var S=[];function M(t){for(var e=0;e<S.length;e+=2)if(t>=S[e]&&t<=S[e+1])return!0;return!1}k.forEach(function(t){return t.blocks.forEach(function(t){return S.push.apply(S,t)})});var z={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"},A=function(){function t(t){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=t,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){for(var t=document.createDocumentFragment(),e=0;e<this.children.length;e++)t.appendChild(this.children[e].toNode());return t},e.toMarkup=function(){for(var t="",e=0;e<this.children.length;e++)t+=this.children[e].toMarkup();return t},e.toText=function(){var t=function(t){return t.toText()};return this.children.map(t).join("")},t}(),T=function(t){return t.filter(function(t){return t}).join(" ")},B=function(t,e,r){if(this.classes=t||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},e){e.style.isTight()&&this.classes.push("mtight");var a=e.getColor();a&&(this.style.color=a)}},C=function(t){var e=document.createElement(t);for(var r in e.className=T(this.classes),this.style)this.style.hasOwnProperty(r)&&(e.style[r]=this.style[r]);for(var a in this.attributes)this.attributes.hasOwnProperty(a)&&e.setAttribute(a,this.attributes[a]);for(var n=0;n<this.children.length;n++)e.appendChild(this.children[n].toNode());return e},q=function(t){var e="<"+t;this.classes.length&&(e+=' class="'+c.escape(T(this.classes))+'"');var r="";for(var a in this.style)this.style.hasOwnProperty(a)&&(r+=c.hyphenate(a)+":"+this.style[a]+";");for(var n in r&&(e+=' style="'+c.escape(r)+'"'),this.attributes)this.attributes.hasOwnProperty(n)&&(e+=" "+n+'="'+c.escape(this.attributes[n])+'"');e+=">";for(var i=0;i<this.children.length;i++)e+=this.children[i].toMarkup();return e+="</"+t+">"},N=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,t,r,a),this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return C.call(this,"span")},e.toMarkup=function(){return q.call(this,"span")},t}(),I=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,e,a),this.children=r||[],this.setAttribute("href",t)}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return C.call(this,"a")},e.toMarkup=function(){return q.call(this,"a")},t}(),R=function(){function t(t,e,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=e,this.src=t,this.classes=["mord"],this.style=r}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){var t=document.createElement("img");for(var e in t.src=this.src,t.alt=this.alt,t.className="mord",this.style)this.style.hasOwnProperty(e)&&(t.style[e]=this.style[e]);return t},e.toMarkup=function(){var t="<img  src='"+this.src+" 'alt='"+this.alt+"' ",e="";for(var r in this.style)this.style.hasOwnProperty(r)&&(e+=c.hyphenate(r)+":"+this.style[r]+";");return e&&(t+=' style="'+c.escape(e)+'"'),t+="'/>"},t}(),O={"\xee":"\u0131\u0302","\xef":"\u0131\u0308","\xed":"\u0131\u0301","\xec":"\u0131\u0300"},E=function(){function t(t,e,r,a,n,i,o,s){this.text=void 0,this.height=void 0,this.depth=void 0,this.italic=void 0,this.skew=void 0,this.width=void 0,this.maxFontSize=void 0,this.classes=void 0,this.style=void 0,this.text=t,this.height=e||0,this.depth=r||0,this.italic=a||0,this.skew=n||0,this.width=i||0,this.classes=o||[],this.style=s||{},this.maxFontSize=0;var h=function(t){for(var e=0;e<k.length;e++)for(var r=k[e],a=0;a<r.blocks.length;a++){var n=r.blocks[a];if(t>=n[0]&&t<=n[1])return r.name}return null}(this.text.charCodeAt(0));h&&this.classes.push(h+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=O[this.text])}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){var t=document.createTextNode(this.text),e=null;for(var r in this.italic>0&&((e=document.createElement("span")).style.marginRight=this.italic+"em"),this.classes.length>0&&((e=e||document.createElement("span")).className=T(this.classes)),this.style)this.style.hasOwnProperty(r)&&((e=e||document.createElement("span")).style[r]=this.style[r]);return e?(e.appendChild(t),e):t},e.toMarkup=function(){var t=!1,e="<span";this.classes.length&&(t=!0,e+=' class="',e+=c.escape(T(this.classes)),e+='"');var r="";for(var a in this.italic>0&&(r+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(a)&&(r+=c.hyphenate(a)+":"+this.style[a]+";");r&&(t=!0,e+=' style="'+c.escape(r)+'"');var n=c.escape(this.text);return t?(e+=">",e+=n,e+="</span>"):n},t}(),L=function(){function t(t,e){this.children=void 0,this.attributes=void 0,this.children=t||[],this.attributes=e||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r<this.children.length;r++)t.appendChild(this.children[r].toNode());return t},e.toMarkup=function(){var t="<svg";for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=" "+e+"='"+this.attributes[e]+"'");t+=">";for(var r=0;r<this.children.length;r++)t+=this.children[r].toMarkup();return t+="</svg>"},t}(),H=function(){function t(t,e){this.pathName=void 0,this.alternate=void 0,this.pathName=t,this.alternate=e}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","path");return this.alternate?t.setAttribute("d",this.alternate):t.setAttribute("d",z[this.pathName]),t},e.toMarkup=function(){return this.alternate?"<path d='"+this.alternate+"'/>":"<path d='"+z[this.pathName]+"'/>"},t}(),P=function(){function t(t){this.attributes=void 0,this.attributes=t||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS("http://www.w3.org/2000/svg","line");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);return t},e.toMarkup=function(){var t="<line";for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=" "+e+"='"+this.attributes[e]+"'");return t+="/>"},t}();function D(t){if(t instanceof E)return t;throw new Error("Expected symbolNode but got "+String(t)+".")}var F={"AMS-Regular":{65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473]},"Fraktur-Regular":{33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],163:[0,.69444,0,0,.86853],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],163:[0,.69444,0,0,.76909],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],305:[0,.43056,0,.02778,.32246],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],567:[.19444,.43056,0,.08334,.38403],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.12,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,1],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.67,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.9,0,0,.278],8943:[-.19,.31,0,0,1.172],8945:[-.1,.82,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.744,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.744,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333]},"Math-Italic":{65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059]},"Math-Regular":{65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059]},"SansSerif-Bold":{33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212]},"Size1-Regular":{40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},V={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},U={"\xc5":"A","\xc7":"C","\xd0":"D","\xde":"o","\xe5":"a","\xe7":"c","\xf0":"d","\xfe":"o","\u0410":"A","\u0411":"B","\u0412":"B","\u0413":"F","\u0414":"A","\u0415":"E","\u0416":"K","\u0417":"3","\u0418":"N","\u0419":"N","\u041a":"K","\u041b":"N","\u041c":"M","\u041d":"H","\u041e":"O","\u041f":"N","\u0420":"P","\u0421":"C","\u0422":"T","\u0423":"y","\u0424":"O","\u0425":"X","\u0426":"U","\u0427":"h","\u0428":"W","\u0429":"W","\u042a":"B","\u042b":"X","\u042c":"B","\u042d":"3","\u042e":"X","\u042f":"R","\u0430":"a","\u0431":"b","\u0432":"a","\u0433":"r","\u0434":"y","\u0435":"e","\u0436":"m","\u0437":"e","\u0438":"n","\u0439":"n","\u043a":"n","\u043b":"n","\u043c":"m","\u043d":"n","\u043e":"o","\u043f":"n","\u0440":"p","\u0441":"c","\u0442":"o","\u0443":"y","\u0444":"b","\u0445":"x","\u0446":"n","\u0447":"n","\u0448":"w","\u0449":"w","\u044a":"a","\u044b":"m","\u044c":"a","\u044d":"e","\u044e":"m","\u044f":"r"};function G(t,e,r){if(!F[e])throw new Error("Font metrics not found for font: "+e+".");var a=t.charCodeAt(0),n=F[e][a];if(!n&&t[0]in U&&(a=U[t[0]].charCodeAt(0),n=F[e][a]),n||"text"!==r||M(a)&&(n=F[e][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var Y={};var W={bin:1,close:1,inner:1,open:1,punct:1,rel:1},X={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},_={math:{},text:{}},j=_;function $(t,e,r,a,n,i){_[t][n]={font:e,group:r,replace:a},i&&a&&(_[t][a]=_[t][n])}var Z="main",K="ams",J="bin",Q="mathord",tt="op-token",et="rel";$("math",Z,et,"\u2261","\\equiv",!0),$("math",Z,et,"\u227a","\\prec",!0),$("math",Z,et,"\u227b","\\succ",!0),$("math",Z,et,"\u223c","\\sim",!0),$("math",Z,et,"\u22a5","\\perp"),$("math",Z,et,"\u2aaf","\\preceq",!0),$("math",Z,et,"\u2ab0","\\succeq",!0),$("math",Z,et,"\u2243","\\simeq",!0),$("math",Z,et,"\u2223","\\mid",!0),$("math",Z,et,"\u226a","\\ll",!0),$("math",Z,et,"\u226b","\\gg",!0),$("math",Z,et,"\u224d","\\asymp",!0),$("math",Z,et,"\u2225","\\parallel"),$("math",Z,et,"\u22c8","\\bowtie",!0),$("math",Z,et,"\u2323","\\smile",!0),$("math",Z,et,"\u2291","\\sqsubseteq",!0),$("math",Z,et,"\u2292","\\sqsupseteq",!0),$("math",Z,et,"\u2250","\\doteq",!0),$("math",Z,et,"\u2322","\\frown",!0),$("math",Z,et,"\u220b","\\ni",!0),$("math",Z,et,"\u221d","\\propto",!0),$("math",Z,et,"\u22a2","\\vdash",!0),$("math",Z,et,"\u22a3","\\dashv",!0),$("math",Z,et,"\u220b","\\owns"),$("math",Z,"punct",".","\\ldotp"),$("math",Z,"punct","\u22c5","\\cdotp"),$("math",Z,"textord","#","\\#"),$("text",Z,"textord","#","\\#"),$("math",Z,"textord","&","\\&"),$("text",Z,"textord","&","\\&"),$("math",Z,"textord","\u2135","\\aleph",!0),$("math",Z,"textord","\u2200","\\forall",!0),$("math",Z,"textord","\u210f","\\hbar",!0),$("math",Z,"textord","\u2203","\\exists",!0),$("math",Z,"textord","\u2207","\\nabla",!0),$("math",Z,"textord","\u266d","\\flat",!0),$("math",Z,"textord","\u2113","\\ell",!0),$("math",Z,"textord","\u266e","\\natural",!0),$("math",Z,"textord","\u2663","\\clubsuit",!0),$("math",Z,"textord","\u2118","\\wp",!0),$("math",Z,"textord","\u266f","\\sharp",!0),$("math",Z,"textord","\u2662","\\diamondsuit",!0),$("math",Z,"textord","\u211c","\\Re",!0),$("math",Z,"textord","\u2661","\\heartsuit",!0),$("math",Z,"textord","\u2111","\\Im",!0),$("math",Z,"textord","\u2660","\\spadesuit",!0),$("text",Z,"textord","\xa7","\\S",!0),$("text",Z,"textord","\xb6","\\P",!0),$("math",Z,"textord","\u2020","\\dag"),$("text",Z,"textord","\u2020","\\dag"),$("text",Z,"textord","\u2020","\\textdagger"),$("math",Z,"textord","\u2021","\\ddag"),$("text",Z,"textord","\u2021","\\ddag"),$("text",Z,"textord","\u2021","\\textdaggerdbl"),$("math",Z,"close","\u23b1","\\rmoustache",!0),$("math",Z,"open","\u23b0","\\lmoustache",!0),$("math",Z,"close","\u27ef","\\rgroup",!0),$("math",Z,"open","\u27ee","\\lgroup",!0),$("math",Z,J,"\u2213","\\mp",!0),$("math",Z,J,"\u2296","\\ominus",!0),$("math",Z,J,"\u228e","\\uplus",!0),$("math",Z,J,"\u2293","\\sqcap",!0),$("math",Z,J,"\u2217","\\ast"),$("math",Z,J,"\u2294","\\sqcup",!0),$("math",Z,J,"\u25ef","\\bigcirc"),$("math",Z,J,"\u2219","\\bullet"),$("math",Z,J,"\u2021","\\ddagger"),$("math",Z,J,"\u2240","\\wr",!0),$("math",Z,J,"\u2a3f","\\amalg"),$("math",Z,J,"&","\\And"),$("math",Z,et,"\u27f5","\\longleftarrow",!0),$("math",Z,et,"\u21d0","\\Leftarrow",!0),$("math",Z,et,"\u27f8","\\Longleftarrow",!0),$("math",Z,et,"\u27f6","\\longrightarrow",!0),$("math",Z,et,"\u21d2","\\Rightarrow",!0),$("math",Z,et,"\u27f9","\\Longrightarrow",!0),$("math",Z,et,"\u2194","\\leftrightarrow",!0),$("math",Z,et,"\u27f7","\\longleftrightarrow",!0),$("math",Z,et,"\u21d4","\\Leftrightarrow",!0),$("math",Z,et,"\u27fa","\\Longleftrightarrow",!0),$("math",Z,et,"\u21a6","\\mapsto",!0),$("math",Z,et,"\u27fc","\\longmapsto",!0),$("math",Z,et,"\u2197","\\nearrow",!0),$("math",Z,et,"\u21a9","\\hookleftarrow",!0),$("math",Z,et,"\u21aa","\\hookrightarrow",!0),$("math",Z,et,"\u2198","\\searrow",!0),$("math",Z,et,"\u21bc","\\leftharpoonup",!0),$("math",Z,et,"\u21c0","\\rightharpoonup",!0),$("math",Z,et,"\u2199","\\swarrow",!0),$("math",Z,et,"\u21bd","\\leftharpoondown",!0),$("math",Z,et,"\u21c1","\\rightharpoondown",!0),$("math",Z,et,"\u2196","\\nwarrow",!0),$("math",Z,et,"\u21cc","\\rightleftharpoons",!0),$("math",K,et,"\u226e","\\nless",!0),$("math",K,et,"\ue010","\\@nleqslant"),$("math",K,et,"\ue011","\\@nleqq"),$("math",K,et,"\u2a87","\\lneq",!0),$("math",K,et,"\u2268","\\lneqq",!0),$("math",K,et,"\ue00c","\\@lvertneqq"),$("math",K,et,"\u22e6","\\lnsim",!0),$("math",K,et,"\u2a89","\\lnapprox",!0),$("math",K,et,"\u2280","\\nprec",!0),$("math",K,et,"\u22e0","\\npreceq",!0),$("math",K,et,"\u22e8","\\precnsim",!0),$("math",K,et,"\u2ab9","\\precnapprox",!0),$("math",K,et,"\u2241","\\nsim",!0),$("math",K,et,"\ue006","\\@nshortmid"),$("math",K,et,"\u2224","\\nmid",!0),$("math",K,et,"\u22ac","\\nvdash",!0),$("math",K,et,"\u22ad","\\nvDash",!0),$("math",K,et,"\u22ea","\\ntriangleleft"),$("math",K,et,"\u22ec","\\ntrianglelefteq",!0),$("math",K,et,"\u228a","\\subsetneq",!0),$("math",K,et,"\ue01a","\\@varsubsetneq"),$("math",K,et,"\u2acb","\\subsetneqq",!0),$("math",K,et,"\ue017","\\@varsubsetneqq"),$("math",K,et,"\u226f","\\ngtr",!0),$("math",K,et,"\ue00f","\\@ngeqslant"),$("math",K,et,"\ue00e","\\@ngeqq"),$("math",K,et,"\u2a88","\\gneq",!0),$("math",K,et,"\u2269","\\gneqq",!0),$("math",K,et,"\ue00d","\\@gvertneqq"),$("math",K,et,"\u22e7","\\gnsim",!0),$("math",K,et,"\u2a8a","\\gnapprox",!0),$("math",K,et,"\u2281","\\nsucc",!0),$("math",K,et,"\u22e1","\\nsucceq",!0),$("math",K,et,"\u22e9","\\succnsim",!0),$("math",K,et,"\u2aba","\\succnapprox",!0),$("math",K,et,"\u2246","\\ncong",!0),$("math",K,et,"\ue007","\\@nshortparallel"),$("math",K,et,"\u2226","\\nparallel",!0),$("math",K,et,"\u22af","\\nVDash",!0),$("math",K,et,"\u22eb","\\ntriangleright"),$("math",K,et,"\u22ed","\\ntrianglerighteq",!0),$("math",K,et,"\ue018","\\@nsupseteqq"),$("math",K,et,"\u228b","\\supsetneq",!0),$("math",K,et,"\ue01b","\\@varsupsetneq"),$("math",K,et,"\u2acc","\\supsetneqq",!0),$("math",K,et,"\ue019","\\@varsupsetneqq"),$("math",K,et,"\u22ae","\\nVdash",!0),$("math",K,et,"\u2ab5","\\precneqq",!0),$("math",K,et,"\u2ab6","\\succneqq",!0),$("math",K,et,"\ue016","\\@nsubseteqq"),$("math",K,J,"\u22b4","\\unlhd"),$("math",K,J,"\u22b5","\\unrhd"),$("math",K,et,"\u219a","\\nleftarrow",!0),$("math",K,et,"\u219b","\\nrightarrow",!0),$("math",K,et,"\u21cd","\\nLeftarrow",!0),$("math",K,et,"\u21cf","\\nRightarrow",!0),$("math",K,et,"\u21ae","\\nleftrightarrow",!0),$("math",K,et,"\u21ce","\\nLeftrightarrow",!0),$("math",K,et,"\u25b3","\\vartriangle"),$("math",K,"textord","\u210f","\\hslash"),$("math",K,"textord","\u25bd","\\triangledown"),$("math",K,"textord","\u25ca","\\lozenge"),$("math",K,"textord","\u24c8","\\circledS"),$("math",K,"textord","\xae","\\circledR"),$("text",K,"textord","\xae","\\circledR"),$("math",K,"textord","\u2221","\\measuredangle",!0),$("math",K,"textord","\u2204","\\nexists"),$("math",K,"textord","\u2127","\\mho"),$("math",K,"textord","\u2132","\\Finv",!0),$("math",K,"textord","\u2141","\\Game",!0),$("math",K,"textord","\u2035","\\backprime"),$("math",K,"textord","\u25b2","\\blacktriangle"),$("math",K,"textord","\u25bc","\\blacktriangledown"),$("math",K,"textord","\u25a0","\\blacksquare"),$("math",K,"textord","\u29eb","\\blacklozenge"),$("math",K,"textord","\u2605","\\bigstar"),$("math",K,"textord","\u2222","\\sphericalangle",!0),$("math",K,"textord","\u2201","\\complement",!0),$("math",K,"textord","\xf0","\\eth",!0),$("math",K,"textord","\u2571","\\diagup"),$("math",K,"textord","\u2572","\\diagdown"),$("math",K,"textord","\u25a1","\\square"),$("math",K,"textord","\u25a1","\\Box"),$("math",K,"textord","\u25ca","\\Diamond"),$("math",K,"textord","\xa5","\\yen",!0),$("text",K,"textord","\xa5","\\yen",!0),$("math",K,"textord","\u2713","\\checkmark",!0),$("text",K,"textord","\u2713","\\checkmark"),$("math",K,"textord","\u2136","\\beth",!0),$("math",K,"textord","\u2138","\\daleth",!0),$("math",K,"textord","\u2137","\\gimel",!0),$("math",K,"textord","\u03dd","\\digamma",!0),$("math",K,"textord","\u03f0","\\varkappa"),$("math",K,"open","\u250c","\\ulcorner",!0),$("math",K,"close","\u2510","\\urcorner",!0),$("math",K,"open","\u2514","\\llcorner",!0),$("math",K,"close","\u2518","\\lrcorner",!0),$("math",K,et,"\u2266","\\leqq",!0),$("math",K,et,"\u2a7d","\\leqslant",!0),$("math",K,et,"\u2a95","\\eqslantless",!0),$("math",K,et,"\u2272","\\lesssim",!0),$("math",K,et,"\u2a85","\\lessapprox",!0),$("math",K,et,"\u224a","\\approxeq",!0),$("math",K,J,"\u22d6","\\lessdot"),$("math",K,et,"\u22d8","\\lll",!0),$("math",K,et,"\u2276","\\lessgtr",!0),$("math",K,et,"\u22da","\\lesseqgtr",!0),$("math",K,et,"\u2a8b","\\lesseqqgtr",!0),$("math",K,et,"\u2251","\\doteqdot"),$("math",K,et,"\u2253","\\risingdotseq",!0),$("math",K,et,"\u2252","\\fallingdotseq",!0),$("math",K,et,"\u223d","\\backsim",!0),$("math",K,et,"\u22cd","\\backsimeq",!0),$("math",K,et,"\u2ac5","\\subseteqq",!0),$("math",K,et,"\u22d0","\\Subset",!0),$("math",K,et,"\u228f","\\sqsubset",!0),$("math",K,et,"\u227c","\\preccurlyeq",!0),$("math",K,et,"\u22de","\\curlyeqprec",!0),$("math",K,et,"\u227e","\\precsim",!0),$("math",K,et,"\u2ab7","\\precapprox",!0),$("math",K,et,"\u22b2","\\vartriangleleft"),$("math",K,et,"\u22b4","\\trianglelefteq"),$("math",K,et,"\u22a8","\\vDash",!0),$("math",K,et,"\u22aa","\\Vvdash",!0),$("math",K,et,"\u2323","\\smallsmile"),$("math",K,et,"\u2322","\\smallfrown"),$("math",K,et,"\u224f","\\bumpeq",!0),$("math",K,et,"\u224e","\\Bumpeq",!0),$("math",K,et,"\u2267","\\geqq",!0),$("math",K,et,"\u2a7e","\\geqslant",!0),$("math",K,et,"\u2a96","\\eqslantgtr",!0),$("math",K,et,"\u2273","\\gtrsim",!0),$("math",K,et,"\u2a86","\\gtrapprox",!0),$("math",K,J,"\u22d7","\\gtrdot"),$("math",K,et,"\u22d9","\\ggg",!0),$("math",K,et,"\u2277","\\gtrless",!0),$("math",K,et,"\u22db","\\gtreqless",!0),$("math",K,et,"\u2a8c","\\gtreqqless",!0),$("math",K,et,"\u2256","\\eqcirc",!0),$("math",K,et,"\u2257","\\circeq",!0),$("math",K,et,"\u225c","\\triangleq",!0),$("math",K,et,"\u223c","\\thicksim"),$("math",K,et,"\u2248","\\thickapprox"),$("math",K,et,"\u2ac6","\\supseteqq",!0),$("math",K,et,"\u22d1","\\Supset",!0),$("math",K,et,"\u2290","\\sqsupset",!0),$("math",K,et,"\u227d","\\succcurlyeq",!0),$("math",K,et,"\u22df","\\curlyeqsucc",!0),$("math",K,et,"\u227f","\\succsim",!0),$("math",K,et,"\u2ab8","\\succapprox",!0),$("math",K,et,"\u22b3","\\vartriangleright"),$("math",K,et,"\u22b5","\\trianglerighteq"),$("math",K,et,"\u22a9","\\Vdash",!0),$("math",K,et,"\u2223","\\shortmid"),$("math",K,et,"\u2225","\\shortparallel"),$("math",K,et,"\u226c","\\between",!0),$("math",K,et,"\u22d4","\\pitchfork",!0),$("math",K,et,"\u221d","\\varpropto"),$("math",K,et,"\u25c0","\\blacktriangleleft"),$("math",K,et,"\u2234","\\therefore",!0),$("math",K,et,"\u220d","\\backepsilon"),$("math",K,et,"\u25b6","\\blacktriangleright"),$("math",K,et,"\u2235","\\because",!0),$("math",K,et,"\u22d8","\\llless"),$("math",K,et,"\u22d9","\\gggtr"),$("math",K,J,"\u22b2","\\lhd"),$("math",K,J,"\u22b3","\\rhd"),$("math",K,et,"\u2242","\\eqsim",!0),$("math",Z,et,"\u22c8","\\Join"),$("math",K,et,"\u2251","\\Doteq",!0),$("math",K,J,"\u2214","\\dotplus",!0),$("math",K,J,"\u2216","\\smallsetminus"),$("math",K,J,"\u22d2","\\Cap",!0),$("math",K,J,"\u22d3","\\Cup",!0),$("math",K,J,"\u2a5e","\\doublebarwedge",!0),$("math",K,J,"\u229f","\\boxminus",!0),$("math",K,J,"\u229e","\\boxplus",!0),$("math",K,J,"\u22c7","\\divideontimes",!0),$("math",K,J,"\u22c9","\\ltimes",!0),$("math",K,J,"\u22ca","\\rtimes",!0),$("math",K,J,"\u22cb","\\leftthreetimes",!0),$("math",K,J,"\u22cc","\\rightthreetimes",!0),$("math",K,J,"\u22cf","\\curlywedge",!0),$("math",K,J,"\u22ce","\\curlyvee",!0),$("math",K,J,"\u229d","\\circleddash",!0),$("math",K,J,"\u229b","\\circledast",!0),$("math",K,J,"\u22c5","\\centerdot"),$("math",K,J,"\u22ba","\\intercal",!0),$("math",K,J,"\u22d2","\\doublecap"),$("math",K,J,"\u22d3","\\doublecup"),$("math",K,J,"\u22a0","\\boxtimes",!0),$("math",K,et,"\u21e2","\\dashrightarrow",!0),$("math",K,et,"\u21e0","\\dashleftarrow",!0),$("math",K,et,"\u21c7","\\leftleftarrows",!0),$("math",K,et,"\u21c6","\\leftrightarrows",!0),$("math",K,et,"\u21da","\\Lleftarrow",!0),$("math",K,et,"\u219e","\\twoheadleftarrow",!0),$("math",K,et,"\u21a2","\\leftarrowtail",!0),$("math",K,et,"\u21ab","\\looparrowleft",!0),$("math",K,et,"\u21cb","\\leftrightharpoons",!0),$("math",K,et,"\u21b6","\\curvearrowleft",!0),$("math",K,et,"\u21ba","\\circlearrowleft",!0),$("math",K,et,"\u21b0","\\Lsh",!0),$("math",K,et,"\u21c8","\\upuparrows",!0),$("math",K,et,"\u21bf","\\upharpoonleft",!0),$("math",K,et,"\u21c3","\\downharpoonleft",!0),$("math",K,et,"\u22b8","\\multimap",!0),$("math",K,et,"\u21ad","\\leftrightsquigarrow",!0),$("math",K,et,"\u21c9","\\rightrightarrows",!0),$("math",K,et,"\u21c4","\\rightleftarrows",!0),$("math",K,et,"\u21a0","\\twoheadrightarrow",!0),$("math",K,et,"\u21a3","\\rightarrowtail",!0),$("math",K,et,"\u21ac","\\looparrowright",!0),$("math",K,et,"\u21b7","\\curvearrowright",!0),$("math",K,et,"\u21bb","\\circlearrowright",!0),$("math",K,et,"\u21b1","\\Rsh",!0),$("math",K,et,"\u21ca","\\downdownarrows",!0),$("math",K,et,"\u21be","\\upharpoonright",!0),$("math",K,et,"\u21c2","\\downharpoonright",!0),$("math",K,et,"\u21dd","\\rightsquigarrow",!0),$("math",K,et,"\u21dd","\\leadsto"),$("math",K,et,"\u21db","\\Rrightarrow",!0),$("math",K,et,"\u21be","\\restriction"),$("math",Z,"textord","\u2018","`"),$("math",Z,"textord","$","\\$"),$("text",Z,"textord","$","\\$"),$("text",Z,"textord","$","\\textdollar"),$("math",Z,"textord","%","\\%"),$("text",Z,"textord","%","\\%"),$("math",Z,"textord","_","\\_"),$("text",Z,"textord","_","\\_"),$("text",Z,"textord","_","\\textunderscore"),$("math",Z,"textord","\u2220","\\angle",!0),$("math",Z,"textord","\u221e","\\infty",!0),$("math",Z,"textord","\u2032","\\prime"),$("math",Z,"textord","\u25b3","\\triangle"),$("math",Z,"textord","\u0393","\\Gamma",!0),$("math",Z,"textord","\u0394","\\Delta",!0),$("math",Z,"textord","\u0398","\\Theta",!0),$("math",Z,"textord","\u039b","\\Lambda",!0),$("math",Z,"textord","\u039e","\\Xi",!0),$("math",Z,"textord","\u03a0","\\Pi",!0),$("math",Z,"textord","\u03a3","\\Sigma",!0),$("math",Z,"textord","\u03a5","\\Upsilon",!0),$("math",Z,"textord","\u03a6","\\Phi",!0),$("math",Z,"textord","\u03a8","\\Psi",!0),$("math",Z,"textord","\u03a9","\\Omega",!0),$("math",Z,"textord","A","\u0391"),$("math",Z,"textord","B","\u0392"),$("math",Z,"textord","E","\u0395"),$("math",Z,"textord","Z","\u0396"),$("math",Z,"textord","H","\u0397"),$("math",Z,"textord","I","\u0399"),$("math",Z,"textord","K","\u039a"),$("math",Z,"textord","M","\u039c"),$("math",Z,"textord","N","\u039d"),$("math",Z,"textord","O","\u039f"),$("math",Z,"textord","P","\u03a1"),$("math",Z,"textord","T","\u03a4"),$("math",Z,"textord","X","\u03a7"),$("math",Z,"textord","\xac","\\neg",!0),$("math",Z,"textord","\xac","\\lnot"),$("math",Z,"textord","\u22a4","\\top"),$("math",Z,"textord","\u22a5","\\bot"),$("math",Z,"textord","\u2205","\\emptyset"),$("math",K,"textord","\u2205","\\varnothing"),$("math",Z,Q,"\u03b1","\\alpha",!0),$("math",Z,Q,"\u03b2","\\beta",!0),$("math",Z,Q,"\u03b3","\\gamma",!0),$("math",Z,Q,"\u03b4","\\delta",!0),$("math",Z,Q,"\u03f5","\\epsilon",!0),$("math",Z,Q,"\u03b6","\\zeta",!0),$("math",Z,Q,"\u03b7","\\eta",!0),$("math",Z,Q,"\u03b8","\\theta",!0),$("math",Z,Q,"\u03b9","\\iota",!0),$("math",Z,Q,"\u03ba","\\kappa",!0),$("math",Z,Q,"\u03bb","\\lambda",!0),$("math",Z,Q,"\u03bc","\\mu",!0),$("math",Z,Q,"\u03bd","\\nu",!0),$("math",Z,Q,"\u03be","\\xi",!0),$("math",Z,Q,"\u03bf","\\omicron",!0),$("math",Z,Q,"\u03c0","\\pi",!0),$("math",Z,Q,"\u03c1","\\rho",!0),$("math",Z,Q,"\u03c3","\\sigma",!0),$("math",Z,Q,"\u03c4","\\tau",!0),$("math",Z,Q,"\u03c5","\\upsilon",!0),$("math",Z,Q,"\u03d5","\\phi",!0),$("math",Z,Q,"\u03c7","\\chi",!0),$("math",Z,Q,"\u03c8","\\psi",!0),$("math",Z,Q,"\u03c9","\\omega",!0),$("math",Z,Q,"\u03b5","\\varepsilon",!0),$("math",Z,Q,"\u03d1","\\vartheta",!0),$("math",Z,Q,"\u03d6","\\varpi",!0),$("math",Z,Q,"\u03f1","\\varrho",!0),$("math",Z,Q,"\u03c2","\\varsigma",!0),$("math",Z,Q,"\u03c6","\\varphi",!0),$("math",Z,J,"\u2217","*"),$("math",Z,J,"+","+"),$("math",Z,J,"\u2212","-"),$("math",Z,J,"\u22c5","\\cdot",!0),$("math",Z,J,"\u2218","\\circ"),$("math",Z,J,"\xf7","\\div",!0),$("math",Z,J,"\xb1","\\pm",!0),$("math",Z,J,"\xd7","\\times",!0),$("math",Z,J,"\u2229","\\cap",!0),$("math",Z,J,"\u222a","\\cup",!0),$("math",Z,J,"\u2216","\\setminus"),$("math",Z,J,"\u2227","\\land"),$("math",Z,J,"\u2228","\\lor"),$("math",Z,J,"\u2227","\\wedge",!0),$("math",Z,J,"\u2228","\\vee",!0),$("math",Z,"textord","\u221a","\\surd"),$("math",Z,"open","(","("),$("math",Z,"open","[","["),$("math",Z,"open","\u27e8","\\langle",!0),$("math",Z,"open","\u2223","\\lvert"),$("math",Z,"open","\u2225","\\lVert"),$("math",Z,"close",")",")"),$("math",Z,"close","]","]"),$("math",Z,"close","?","?"),$("math",Z,"close","!","!"),$("math",Z,"close","\u27e9","\\rangle",!0),$("math",Z,"close","\u2223","\\rvert"),$("math",Z,"close","\u2225","\\rVert"),$("math",Z,et,"=","="),$("math",Z,et,"<","<"),$("math",Z,et,">",">"),$("math",Z,et,":",":"),$("math",Z,et,"\u2248","\\approx",!0),$("math",Z,et,"\u2245","\\cong",!0),$("math",Z,et,"\u2265","\\ge"),$("math",Z,et,"\u2265","\\geq",!0),$("math",Z,et,"\u2190","\\gets"),$("math",Z,et,">","\\gt"),$("math",Z,et,"\u2208","\\in",!0),$("math",Z,et,"\ue020","\\@not"),$("math",Z,et,"\u2282","\\subset",!0),$("math",Z,et,"\u2283","\\supset",!0),$("math",Z,et,"\u2286","\\subseteq",!0),$("math",Z,et,"\u2287","\\supseteq",!0),$("math",K,et,"\u2288","\\nsubseteq",!0),$("math",K,et,"\u2289","\\nsupseteq",!0),$("math",Z,et,"\u22a8","\\models"),$("math",Z,et,"\u2190","\\leftarrow",!0),$("math",Z,et,"\u2264","\\le"),$("math",Z,et,"\u2264","\\leq",!0),$("math",Z,et,"<","\\lt"),$("math",Z,et,"\u2192","\\rightarrow",!0),$("math",Z,et,"\u2192","\\to"),$("math",K,et,"\u2271","\\ngeq",!0),$("math",K,et,"\u2270","\\nleq",!0),$("math",Z,"spacing","\xa0","\\ "),$("math",Z,"spacing","\xa0","~"),$("math",Z,"spacing","\xa0","\\space"),$("math",Z,"spacing","\xa0","\\nobreakspace"),$("text",Z,"spacing","\xa0","\\ "),$("text",Z,"spacing","\xa0","~"),$("text",Z,"spacing","\xa0","\\space"),$("text",Z,"spacing","\xa0","\\nobreakspace"),$("math",Z,"spacing",null,"\\nobreak"),$("math",Z,"spacing",null,"\\allowbreak"),$("math",Z,"punct",",",","),$("math",Z,"punct",";",";"),$("math",K,J,"\u22bc","\\barwedge",!0),$("math",K,J,"\u22bb","\\veebar",!0),$("math",Z,J,"\u2299","\\odot",!0),$("math",Z,J,"\u2295","\\oplus",!0),$("math",Z,J,"\u2297","\\otimes",!0),$("math",Z,"textord","\u2202","\\partial",!0),$("math",Z,J,"\u2298","\\oslash",!0),$("math",K,J,"\u229a","\\circledcirc",!0),$("math",K,J,"\u22a1","\\boxdot",!0),$("math",Z,J,"\u25b3","\\bigtriangleup"),$("math",Z,J,"\u25bd","\\bigtriangledown"),$("math",Z,J,"\u2020","\\dagger"),$("math",Z,J,"\u22c4","\\diamond"),$("math",Z,J,"\u22c6","\\star"),$("math",Z,J,"\u25c3","\\triangleleft"),$("math",Z,J,"\u25b9","\\triangleright"),$("math",Z,"open","{","\\{"),$("text",Z,"textord","{","\\{"),$("text",Z,"textord","{","\\textbraceleft"),$("math",Z,"close","}","\\}"),$("text",Z,"textord","}","\\}"),$("text",Z,"textord","}","\\textbraceright"),$("math",Z,"open","{","\\lbrace"),$("math",Z,"close","}","\\rbrace"),$("math",Z,"open","[","\\lbrack"),$("text",Z,"textord","[","\\lbrack"),$("math",Z,"close","]","\\rbrack"),$("text",Z,"textord","]","\\rbrack"),$("math",Z,"open","(","\\lparen"),$("math",Z,"close",")","\\rparen"),$("text",Z,"textord","<","\\textless"),$("text",Z,"textord",">","\\textgreater"),$("math",Z,"open","\u230a","\\lfloor",!0),$("math",Z,"close","\u230b","\\rfloor",!0),$("math",Z,"open","\u2308","\\lceil",!0),$("math",Z,"close","\u2309","\\rceil",!0),$("math",Z,"textord","\\","\\backslash"),$("math",Z,"textord","\u2223","|"),$("math",Z,"textord","\u2223","\\vert"),$("text",Z,"textord","|","\\textbar"),$("math",Z,"textord","\u2225","\\|"),$("math",Z,"textord","\u2225","\\Vert"),$("text",Z,"textord","\u2225","\\textbardbl"),$("text",Z,"textord","~","\\textasciitilde"),$("text",Z,"textord","\\","\\textbackslash"),$("text",Z,"textord","^","\\textasciicircum"),$("math",Z,et,"\u2191","\\uparrow",!0),$("math",Z,et,"\u21d1","\\Uparrow",!0),$("math",Z,et,"\u2193","\\downarrow",!0),$("math",Z,et,"\u21d3","\\Downarrow",!0),$("math",Z,et,"\u2195","\\updownarrow",!0),$("math",Z,et,"\u21d5","\\Updownarrow",!0),$("math",Z,tt,"\u2210","\\coprod"),$("math",Z,tt,"\u22c1","\\bigvee"),$("math",Z,tt,"\u22c0","\\bigwedge"),$("math",Z,tt,"\u2a04","\\biguplus"),$("math",Z,tt,"\u22c2","\\bigcap"),$("math",Z,tt,"\u22c3","\\bigcup"),$("math",Z,tt,"\u222b","\\int"),$("math",Z,tt,"\u222b","\\intop"),$("math",Z,tt,"\u222c","\\iint"),$("math",Z,tt,"\u222d","\\iiint"),$("math",Z,tt,"\u220f","\\prod"),$("math",Z,tt,"\u2211","\\sum"),$("math",Z,tt,"\u2a02","\\bigotimes"),$("math",Z,tt,"\u2a01","\\bigoplus"),$("math",Z,tt,"\u2a00","\\bigodot"),$("math",Z,tt,"\u222e","\\oint"),$("math",Z,tt,"\u222f","\\oiint"),$("math",Z,tt,"\u2230","\\oiiint"),$("math",Z,tt,"\u2a06","\\bigsqcup"),$("math",Z,tt,"\u222b","\\smallint"),$("text",Z,"inner","\u2026","\\textellipsis"),$("math",Z,"inner","\u2026","\\mathellipsis"),$("text",Z,"inner","\u2026","\\ldots",!0),$("math",Z,"inner","\u2026","\\ldots",!0),$("math",Z,"inner","\u22ef","\\@cdots",!0),$("math",Z,"inner","\u22f1","\\ddots",!0),$("math",Z,"textord","\u22ee","\\varvdots"),$("math",Z,"accent-token","\u02ca","\\acute"),$("math",Z,"accent-token","\u02cb","\\grave"),$("math",Z,"accent-token","\xa8","\\ddot"),$("math",Z,"accent-token","~","\\tilde"),$("math",Z,"accent-token","\u02c9","\\bar"),$("math",Z,"accent-token","\u02d8","\\breve"),$("math",Z,"accent-token","\u02c7","\\check"),$("math",Z,"accent-token","^","\\hat"),$("math",Z,"accent-token","\u20d7","\\vec"),$("math",Z,"accent-token","\u02d9","\\dot"),$("math",Z,"accent-token","\u02da","\\mathring"),$("math",Z,Q,"\u0131","\\imath",!0),$("math",Z,Q,"\u0237","\\jmath",!0),$("text",Z,"textord","\u0131","\\i",!0),$("text",Z,"textord","\u0237","\\j",!0),$("text",Z,"textord","\xdf","\\ss",!0),$("text",Z,"textord","\xe6","\\ae",!0),$("text",Z,"textord","\xe6","\\ae",!0),$("text",Z,"textord","\u0153","\\oe",!0),$("text",Z,"textord","\xf8","\\o",!0),$("text",Z,"textord","\xc6","\\AE",!0),$("text",Z,"textord","\u0152","\\OE",!0),$("text",Z,"textord","\xd8","\\O",!0),$("text",Z,"accent-token","\u02ca","\\'"),$("text",Z,"accent-token","\u02cb","\\`"),$("text",Z,"accent-token","\u02c6","\\^"),$("text",Z,"accent-token","\u02dc","\\~"),$("text",Z,"accent-token","\u02c9","\\="),$("text",Z,"accent-token","\u02d8","\\u"),$("text",Z,"accent-token","\u02d9","\\."),$("text",Z,"accent-token","\u02da","\\r"),$("text",Z,"accent-token","\u02c7","\\v"),$("text",Z,"accent-token","\xa8",'\\"'),$("text",Z,"accent-token","\u02dd","\\H"),$("text",Z,"accent-token","\u25ef","\\textcircled");var rt={"--":!0,"---":!0,"``":!0,"''":!0};$("text",Z,"textord","\u2013","--"),$("text",Z,"textord","\u2013","\\textendash"),$("text",Z,"textord","\u2014","---"),$("text",Z,"textord","\u2014","\\textemdash"),$("text",Z,"textord","\u2018","`"),$("text",Z,"textord","\u2018","\\textquoteleft"),$("text",Z,"textord","\u2019","'"),$("text",Z,"textord","\u2019","\\textquoteright"),$("text",Z,"textord","\u201c","``"),$("text",Z,"textord","\u201c","\\textquotedblleft"),$("text",Z,"textord","\u201d","''"),$("text",Z,"textord","\u201d","\\textquotedblright"),$("math",Z,"textord","\xb0","\\degree",!0),$("text",Z,"textord","\xb0","\\degree"),$("text",Z,"textord","\xb0","\\textdegree",!0),$("math",Z,Q,"\xa3","\\pounds"),$("math",Z,Q,"\xa3","\\mathsterling",!0),$("text",Z,Q,"\xa3","\\pounds"),$("text",Z,Q,"\xa3","\\textsterling",!0),$("math",K,"textord","\u2720","\\maltese"),$("text",K,"textord","\u2720","\\maltese"),$("text",Z,"spacing","\xa0","\\ "),$("text",Z,"spacing","\xa0"," "),$("text",Z,"spacing","\xa0","~");for(var at=0;at<'0123456789/@."'.length;at++){var nt='0123456789/@."'.charAt(at);$("math",Z,"textord",nt,nt)}for(var it=0;it<'0123456789!@*()-=+[]<>|";:?/.,'.length;it++){var ot='0123456789!@*()-=+[]<>|";:?/.,'.charAt(it);$("text",Z,"textord",ot,ot)}for(var st="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",ht=0;ht<st.length;ht++){var lt=st.charAt(ht);$("math",Z,Q,lt,lt),$("text",Z,"textord",lt,lt)}$("math",K,"textord","C","\u2102"),$("text",K,"textord","C","\u2102"),$("math",K,"textord","H","\u210d"),$("text",K,"textord","H","\u210d"),$("math",K,"textord","N","\u2115"),$("text",K,"textord","N","\u2115"),$("math",K,"textord","P","\u2119"),$("text",K,"textord","P","\u2119"),$("math",K,"textord","Q","\u211a"),$("text",K,"textord","Q","\u211a"),$("math",K,"textord","R","\u211d"),$("text",K,"textord","R","\u211d"),$("math",K,"textord","Z","\u2124"),$("text",K,"textord","Z","\u2124"),$("math",Z,Q,"h","\u210e"),$("text",Z,Q,"h","\u210e");for(var mt="",ct=0;ct<st.length;ct++){var ut=st.charAt(ct);$("math",Z,Q,ut,mt=String.fromCharCode(55349,56320+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56372+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56424+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56580+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56736+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56788+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56840+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56944+ct)),$("text",Z,"textord",ut,mt),ct<26&&($("math",Z,Q,ut,mt=String.fromCharCode(55349,56632+ct)),$("text",Z,"textord",ut,mt),$("math",Z,Q,ut,mt=String.fromCharCode(55349,56476+ct)),$("text",Z,"textord",ut,mt))}$("math",Z,Q,"k",mt=String.fromCharCode(55349,56668)),$("text",Z,"textord","k",mt);for(var pt=0;pt<10;pt++){var dt=pt.toString();$("math",Z,Q,dt,mt=String.fromCharCode(55349,57294+pt)),$("text",Z,"textord",dt,mt),$("math",Z,Q,dt,mt=String.fromCharCode(55349,57314+pt)),$("text",Z,"textord",dt,mt),$("math",Z,Q,dt,mt=String.fromCharCode(55349,57324+pt)),$("text",Z,"textord",dt,mt),$("math",Z,Q,dt,mt=String.fromCharCode(55349,57334+pt)),$("text",Z,"textord",dt,mt)}for(var ft=0;ft<"\xc7\xd0\xde\xe7\xfe".length;ft++){var gt="\xc7\xd0\xde\xe7\xfe".charAt(ft);$("math",Z,Q,gt,gt),$("text",Z,"textord",gt,gt)}$("text",Z,"textord","\xf0","\xf0"),$("text",Z,"textord","\u2013","\u2013"),$("text",Z,"textord","\u2014","\u2014"),$("text",Z,"textord","\u2018","\u2018"),$("text",Z,"textord","\u2019","\u2019"),$("text",Z,"textord","\u201c","\u201c"),$("text",Z,"textord","\u201d","\u201d");var xt=[["mathbf","textbf","Main-Bold"],["mathbf","textbf","Main-Bold"],["mathdefault","textit","Math-Italic"],["mathdefault","textit","Math-Italic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["mathscr","textscr","Script-Regular"],["","",""],["","",""],["","",""],["mathfrak","textfrak","Fraktur-Regular"],["mathfrak","textfrak","Fraktur-Regular"],["mathbb","textbb","AMS-Regular"],["mathbb","textbb","AMS-Regular"],["","",""],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathitsf","textitsf","SansSerif-Italic"],["mathitsf","textitsf","SansSerif-Italic"],["","",""],["","",""],["mathtt","texttt","Typewriter-Regular"],["mathtt","texttt","Typewriter-Regular"]],vt=[["mathbf","textbf","Main-Bold"],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathtt","texttt","Typewriter-Regular"]],bt=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],yt=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],wt=function(t,e){return e.size<2?t:bt[t-1][e.size-1]},kt=function(){function t(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||t.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=yt[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}var e=t.prototype;return e.extend=function(e){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(var a in e)e.hasOwnProperty(a)&&(r[a]=e[a]);return new t(r)},e.havingStyle=function(t){return this.style===t?this:this.extend({style:t,size:wt(this.textSize,t)})},e.havingCrampedStyle=function(){return this.havingStyle(this.style.cramp())},e.havingSize=function(t){return this.size===t&&this.textSize===t?this:this.extend({style:this.style.text(),size:t,textSize:t,sizeMultiplier:yt[t-1]})},e.havingBaseStyle=function(e){e=e||this.style.text();var r=wt(t.BASESIZE,e);return this.size===r&&this.textSize===t.BASESIZE&&this.style===e?this:this.extend({style:e,size:r})},e.havingBaseSizing=function(){var t;switch(this.style.id){case 4:case 5:t=3;break;case 6:case 7:t=1;break;default:t=6}return this.extend({style:this.style.text(),size:t})},e.withColor=function(t){return this.extend({color:t})},e.withPhantom=function(){return this.extend({phantom:!0})},e.withFont=function(t){return this.extend({font:t})},e.withTextFontFamily=function(t){return this.extend({fontFamily:t,font:""})},e.withTextFontWeight=function(t){return this.extend({fontWeight:t,font:""})},e.withTextFontShape=function(t){return this.extend({fontShape:t,font:""})},e.sizingClasses=function(t){return t.size!==this.size?["sizing","reset-size"+t.size,"size"+this.size]:[]},e.baseSizingClasses=function(){return this.size!==t.BASESIZE?["sizing","reset-size"+this.size,"size"+t.BASESIZE]:[]},e.fontMetrics=function(){return this._fontMetrics||(this._fontMetrics=function(t){var e;if(!Y[e=t>=5?0:t>=3?1:2]){var r=Y[e]={cssEmPerMu:V.quad[e]/18};for(var a in V)V.hasOwnProperty(a)&&(r[a]=V[a][e])}return Y[e]}(this.size)),this._fontMetrics},e.getColor=function(){return this.phantom?"transparent":this.color},t}();kt.BASESIZE=6;var St=kt,Mt={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},zt={ex:!0,em:!0,mu:!0},At=function(t){return"string"!=typeof t&&(t=t.unit),t in Mt||t in zt||"ex"===t},Tt=function(t,e){var r;if(t.unit in Mt)r=Mt[t.unit]/e.fontMetrics().ptPerEm/e.sizeMultiplier;else if("mu"===t.unit)r=e.fontMetrics().cssEmPerMu;else{var a;if(a=e.style.isTight()?e.havingStyle(e.style.text()):e,"ex"===t.unit)r=a.fontMetrics().xHeight;else{if("em"!==t.unit)throw new o("Invalid unit: '"+t.unit+"'");r=a.fontMetrics().quad}a!==e&&(r*=a.sizeMultiplier/e.sizeMultiplier)}return Math.min(t.number*r,e.maxSize)},Bt=["\\imath","\u0131","\\jmath","\u0237","\\pounds","\\mathsterling","\\textsterling","\xa3"],Ct=function(t,e,r){return j[r][t]&&j[r][t].replace&&(t=j[r][t].replace),{value:t,metrics:G(t,e,r)}},qt=function(t,e,r,a,n){var i,o=Ct(t,e,r),s=o.metrics;if(t=o.value,s){var h=s.italic;("text"===r||a&&"mathit"===a.font)&&(h=0),i=new E(t,s.height,s.depth,h,s.skew,s.width,n)}else"undefined"!=typeof console&&console.warn("No character metrics for '"+t+"' in style '"+e+"' and mode '"+r+"'"),i=new E(t,0,0,0,0,0,n);if(a){i.maxFontSize=a.sizeMultiplier,a.style.isTight()&&i.classes.push("mtight");var l=a.getColor();l&&(i.style.color=l)}return i},Nt=function(t,e){if(T(t.classes)!==T(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;for(var r in t.style)if(t.style.hasOwnProperty(r)&&t.style[r]!==e.style[r])return!1;for(var a in e.style)if(e.style.hasOwnProperty(a)&&t.style[a]!==e.style[a])return!1;return!0},It=function(t){for(var e=0,r=0,a=0,n=0;n<t.children.length;n++){var i=t.children[n];i.height>e&&(e=i.height),i.depth>r&&(r=i.depth),i.maxFontSize>a&&(a=i.maxFontSize)}t.height=e,t.depth=r,t.maxFontSize=a},Rt=function(t,e,r,a){var n=new N(t,e,r,a);return It(n),n},Ot=function(t,e,r,a){return new N(t,e,r,a)},Et=function(t){var e=new A(t);return It(e),e},Lt=function(t,e,r){var a="";switch(t){case"amsrm":a="AMS";break;case"textrm":a="Main";break;case"textsf":a="SansSerif";break;case"texttt":a="Typewriter";break;default:a=t}return a+"-"+("textbf"===e&&"textit"===r?"BoldItalic":"textbf"===e?"Bold":"textit"===e?"Italic":"Regular")},Ht={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Pt={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Dt={fontMap:Ht,makeSymbol:qt,mathsym:function(t,e,r,a){return void 0===a&&(a=[]),"boldsymbol"===r.font&&Ct(t,"Main-Bold",e).metrics?qt(t,"Main-Bold",e,r,a.concat(["mathbf"])):"\\"===t||"main"===j[e][t].font?qt(t,"Main-Regular",e,r,a):qt(t,"AMS-Regular",e,r,a.concat(["amsrm"]))},makeSpan:Rt,makeSvgSpan:Ot,makeLineSpan:function(t,e,r){var a=Rt([t],[],e);return a.height=Math.max(r||e.fontMetrics().defaultRuleThickness,e.minRuleThickness),a.style.borderBottomWidth=a.height+"em",a.maxFontSize=1,a},makeAnchor:function(t,e,r,a){var n=new I(t,e,r,a);return It(n),n},makeFragment:Et,wrapFragment:function(t,e){return t instanceof A?Rt([],[t],e):t},makeVList:function(t,e){for(var r=function(t){if("individualShift"===t.positionType){for(var e=t.children,r=[e[0]],a=-e[0].shift-e[0].elem.depth,n=a,i=1;i<e.length;i++){var o=-e[i].shift-n-e[i].elem.depth,s=o-(e[i-1].elem.height+e[i-1].elem.depth);n+=o,r.push({type:"kern",size:s}),r.push(e[i])}return{children:r,depth:a}}var h;if("top"===t.positionType){for(var l=t.positionData,m=0;m<t.children.length;m++){var c=t.children[m];l-="kern"===c.type?c.size:c.elem.height+c.elem.depth}h=l}else if("bottom"===t.positionType)h=-t.positionData;else{var u=t.children[0];if("elem"!==u.type)throw new Error('First child must have type "elem".');if("shift"===t.positionType)h=-u.elem.depth-t.positionData;else{if("firstBaseline"!==t.positionType)throw new Error("Invalid positionType "+t.positionType+".");h=-u.elem.depth}}return{children:t.children,depth:h}}(t),a=r.children,n=r.depth,i=0,o=0;o<a.length;o++){var s=a[o];if("elem"===s.type){var h=s.elem;i=Math.max(i,h.maxFontSize,h.height)}}i+=2;var l=Rt(["pstrut"],[]);l.style.height=i+"em";for(var m=[],c=n,u=n,p=n,d=0;d<a.length;d++){var f=a[d];if("kern"===f.type)p+=f.size;else{var g=f.elem,x=f.wrapperClasses||[],v=f.wrapperStyle||{},b=Rt(x,[l,g],void 0,v);b.style.top=-i-p-g.depth+"em",f.marginLeft&&(b.style.marginLeft=f.marginLeft),f.marginRight&&(b.style.marginRight=f.marginRight),m.push(b),p+=g.height+g.depth}c=Math.min(c,p),u=Math.max(u,p)}var y,w=Rt(["vlist"],m);if(w.style.height=u+"em",c<0){var k=Rt([],[]),S=Rt(["vlist"],[k]);S.style.height=-c+"em";var M=Rt(["vlist-s"],[new E("\u200b")]);y=[Rt(["vlist-r"],[w,M]),Rt(["vlist-r"],[S])]}else y=[Rt(["vlist-r"],[w])];var z=Rt(["vlist-t"],y);return 2===y.length&&z.classes.push("vlist-t2"),z.height=u,z.depth=-c,z},makeOrd:function(t,e,r){var a,n=t.mode,i=t.text,s=["mord"],h="math"===n||"text"===n&&e.font,l=h?e.font:e.fontFamily;if(55349===i.charCodeAt(0)){var m=function(t,e){var r=1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320)+65536,a="math"===e?0:1;if(119808<=r&&r<120484){var n=Math.floor((r-119808)/26);return[xt[n][2],xt[n][a]]}if(120782<=r&&r<=120831){var i=Math.floor((r-120782)/10);return[vt[i][2],vt[i][a]]}if(120485===r||120486===r)return[xt[0][2],xt[0][a]];if(120486<r&&r<120782)return["",""];throw new o("Unsupported character: "+t)}(i,n),u=m[0],p=m[1];return qt(i,u,n,e,s.concat(p))}if(l){var d,f;if("boldsymbol"===l||"mathnormal"===l){var g="boldsymbol"===l?function(t,e,r,a){return Ct(t,"Math-BoldItalic",e).metrics?{fontName:"Math-BoldItalic",fontClass:"boldsymbol"}:{fontName:"Main-Bold",fontClass:"mathbf"}}(i,n):(a=i,c.contains(Bt,a)?{fontName:"Main-Italic",fontClass:"mathit"}:/[0-9]/.test(a.charAt(0))?{fontName:"Caligraphic-Regular",fontClass:"mathcal"}:{fontName:"Math-Italic",fontClass:"mathdefault"});d=g.fontName,f=[g.fontClass]}else c.contains(Bt,i)?(d="Main-Italic",f=["mathit"]):h?(d=Ht[l].fontName,f=[l]):(d=Lt(l,e.fontWeight,e.fontShape),f=[l,e.fontWeight,e.fontShape]);if(Ct(i,d,n).metrics)return qt(i,d,n,e,s.concat(f));if(rt.hasOwnProperty(i)&&"Typewriter"===d.substr(0,10)){for(var x=[],v=0;v<i.length;v++)x.push(qt(i[v],d,n,e,s.concat(f)));return Et(x)}}if("mathord"===r){var b=function(t,e,r,a){return/[0-9]/.test(t.charAt(0))||c.contains(Bt,t)?{fontName:"Main-Italic",fontClass:"mathit"}:{fontName:"Math-Italic",fontClass:"mathdefault"}}(i);return qt(i,b.fontName,n,e,s.concat([b.fontClass]))}if("textord"===r){var y=j[n][i]&&j[n][i].font;if("ams"===y){var w=Lt("amsrm",e.fontWeight,e.fontShape);return qt(i,w,n,e,s.concat("amsrm",e.fontWeight,e.fontShape))}if("main"!==y&&y){var k=Lt(y,e.fontWeight,e.fontShape);return qt(i,k,n,e,s.concat(k,e.fontWeight,e.fontShape))}var S=Lt("textrm",e.fontWeight,e.fontShape);return qt(i,S,n,e,s.concat(e.fontWeight,e.fontShape))}throw new Error("unexpected type: "+r+" in makeOrd")},makeGlue:function(t,e){var r=Rt(["mspace"],[],e),a=Tt(t,e);return r.style.marginRight=a+"em",r},staticSvg:function(t,e){var r=Pt[t],a=r[0],n=r[1],i=r[2],o=new H(a),s=new L([o],{width:n+"em",height:i+"em",style:"width:"+n+"em",viewBox:"0 0 "+1e3*n+" "+1e3*i,preserveAspectRatio:"xMinYMin"}),h=Ot(["overlay"],[s],e);return h.height=i,h.style.height=i+"em",h.style.width=n+"em",h},svgData:Pt,tryCombineChars:function(t){for(var e=0;e<t.length-1;e++){var r=t[e],a=t[e+1];r instanceof E&&a instanceof E&&Nt(r,a)&&(r.text+=a.text,r.height=Math.max(r.height,a.height),r.depth=Math.max(r.depth,a.depth),r.italic=a.italic,t.splice(e+1,1),e--)}return t}};function Ft(t,e){var r=Vt(t,e);if(!r)throw new Error("Expected node of type "+e+", but got "+(t?"node of type "+t.type:String(t)));return r}function Vt(t,e){return t&&t.type===e?t:null}function Ut(t,e){var r=function(t,e){return t&&"atom"===t.type&&t.family===e?t:null}(t,e);if(!r)throw new Error('Expected node of type "atom" and family "'+e+'", but got '+(t?"atom"===t.type?"atom of family "+t.family:"node of type "+t.type:String(t)));return r}function Gt(t){var e=Yt(t);if(!e)throw new Error("Expected node of symbol group type, but got "+(t?"node of type "+t.type:String(t)));return e}function Yt(t){return t&&("atom"===t.type||X.hasOwnProperty(t.type))?t:null}var Wt={number:3,unit:"mu"},Xt={number:4,unit:"mu"},_t={number:5,unit:"mu"},jt={mord:{mop:Wt,mbin:Xt,mrel:_t,minner:Wt},mop:{mord:Wt,mop:Wt,mrel:_t,minner:Wt},mbin:{mord:Xt,mop:Xt,mopen:Xt,minner:Xt},mrel:{mord:_t,mop:_t,mopen:_t,minner:_t},mopen:{},mclose:{mop:Wt,mbin:Xt,mrel:_t,minner:Wt},mpunct:{mord:Wt,mop:Wt,mrel:_t,mopen:Wt,mclose:Wt,mpunct:Wt,minner:Wt},minner:{mord:Wt,mop:Wt,mbin:Xt,mrel:_t,mopen:Wt,mpunct:Wt,minner:Wt}},$t={mord:{mop:Wt},mop:{mord:Wt,mop:Wt},mbin:{},mrel:{},mopen:{},mclose:{mop:Wt},mpunct:{},minner:{mop:Wt}},Zt={},Kt={},Jt={};function Qt(t){for(var e=t.type,r=t.names,a=t.props,n=t.handler,i=t.htmlBuilder,o=t.mathmlBuilder,s={type:e,numArgs:a.numArgs,argTypes:a.argTypes,greediness:void 0===a.greediness?1:a.greediness,allowedInText:!!a.allowedInText,allowedInMath:void 0===a.allowedInMath||a.allowedInMath,numOptionalArgs:a.numOptionalArgs||0,infix:!!a.infix,handler:n},h=0;h<r.length;++h)Zt[r[h]]=s;e&&(i&&(Kt[e]=i),o&&(Jt[e]=o))}function te(t){Qt({type:t.type,names:[],props:{numArgs:0},handler:function(){throw new Error("Should never be called.")},htmlBuilder:t.htmlBuilder,mathmlBuilder:t.mathmlBuilder})}var ee=function(t){var e=Vt(t,"ordgroup");return e?e.body:[t]},re=Dt.makeSpan,ae=["leftmost","mbin","mopen","mrel","mop","mpunct"],ne=["rightmost","mrel","mclose","mpunct"],ie={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT},oe={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},se=function(t,e,r,a){void 0===a&&(a=[null,null]);for(var n=[],i=0;i<t.length;i++){var o=ue(t[i],e);if(o instanceof A){var s=o.children;n.push.apply(n,s)}else n.push(o)}if(!r)return n;var h=e;if(1===t.length){var l=Vt(t[0],"sizing")||Vt(t[0],"styling");l&&("sizing"===l.type?h=e.havingSize(l.size):"styling"===l.type&&(h=e.havingStyle(ie[l.style])))}var m=re([a[0]||"leftmost"],[],e),u=re([a[1]||"rightmost"],[],e);return he(n,function(t,e){var r=e.classes[0],a=t.classes[0];"mbin"===r&&c.contains(ne,a)?e.classes[0]="mord":"mbin"===a&&c.contains(ae,r)&&(t.classes[0]="mord")},{node:m},u),he(n,function(t,e){var r=me(e),a=me(t),n=r&&a?t.hasClass("mtight")?$t[r][a]:jt[r][a]:null;if(n)return Dt.makeGlue(n,h)},{node:m},u),n},he=function t(e,r,a,n){n&&e.push(n);for(var i=0;i<e.length;i++){var o=e[i],s=le(o);if(s)t(s.children,r,a);else if("mspace"!==o.classes[0]){var h=r(o,a.node);h&&(a.insertAfter?a.insertAfter(h):(e.unshift(h),i++)),a.node=o,a.insertAfter=function(t){return function(r){e.splice(t+1,0,r),i++}}(i)}}n&&e.pop()},le=function(t){return t instanceof A||t instanceof I?t:null},me=function(t,e){return t?(e&&(t=function t(e,r){var a=le(e);if(a){var n=a.children;if(n.length){if("right"===r)return t(n[n.length-1],"right");if("left"===r)return t(n[0],"left")}}return e}(t,e)),oe[t.classes[0]]||null):null},ce=function(t,e){var r=["nulldelimiter"].concat(t.baseSizingClasses());return re(e.concat(r))},ue=function(t,e,r){if(!t)return re();if(Kt[t.type]){var a=Kt[t.type](t,e);if(r&&e.size!==r.size){a=re(e.sizingClasses(r),[a],e);var n=e.sizeMultiplier/r.sizeMultiplier;a.height*=n,a.depth*=n}return a}throw new o("Got group of unknown type: '"+t.type+"'")};function pe(t,e){var r=re(["base"],t,e),a=re(["strut"]);return a.style.height=r.height+r.depth+"em",a.style.verticalAlign=-r.depth+"em",r.children.unshift(a),r}function de(t,e){var r=null;1===t.length&&"tag"===t[0].type&&(r=t[0].tag,t=t[0].body);for(var a,n=se(t,e,!0),i=[],o=[],s=0;s<n.length;s++)if(o.push(n[s]),n[s].hasClass("mbin")||n[s].hasClass("mrel")||n[s].hasClass("allowbreak")){for(var h=!1;s<n.length-1&&n[s+1].hasClass("mspace")&&!n[s+1].hasClass("newline");)s++,o.push(n[s]),n[s].hasClass("nobreak")&&(h=!0);h||(i.push(pe(o,e)),o=[])}else n[s].hasClass("newline")&&(o.pop(),o.length>0&&(i.push(pe(o,e)),o=[]),i.push(n[s]));o.length>0&&i.push(pe(o,e)),r&&((a=pe(se(r,e,!0))).classes=["tag"],i.push(a));var l=re(["katex-html"],i);if(l.setAttribute("aria-hidden","true"),a){var m=a.children[0];m.style.height=l.height+l.depth+"em",m.style.verticalAlign=-l.depth+"em"}return l}function fe(t){return new A(t)}var ge=function(){function t(t,e){this.type=void 0,this.attributes=void 0,this.children=void 0,this.type=t,this.attributes={},this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.getAttribute=function(t){return this.attributes[t]},e.toNode=function(){var t=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r<this.children.length;r++)t.appendChild(this.children[r].toNode());return t},e.toMarkup=function(){var t="<"+this.type;for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=" "+e+'="',t+=c.escape(this.attributes[e]),t+='"');t+=">";for(var r=0;r<this.children.length;r++)t+=this.children[r].toMarkup();return t+="</"+this.type+">"},e.toText=function(){return this.children.map(function(t){return t.toText()}).join("")},t}(),xe=function(){function t(t){this.text=void 0,this.text=t}var e=t.prototype;return e.toNode=function(){return document.createTextNode(this.text)},e.toMarkup=function(){return c.escape(this.toText())},e.toText=function(){return this.text},t}(),ve={MathNode:ge,TextNode:xe,SpaceNode:function(){function t(t){this.width=void 0,this.character=void 0,this.width=t,this.character=t>=.05555&&t<=.05556?"\u200a":t>=.1666&&t<=.1667?"\u2009":t>=.2222&&t<=.2223?"\u2005":t>=.2777&&t<=.2778?"\u2005\u200a":t>=-.05556&&t<=-.05555?"\u200a\u2063":t>=-.1667&&t<=-.1666?"\u2009\u2063":t>=-.2223&&t<=-.2222?"\u205f\u2063":t>=-.2778&&t<=-.2777?"\u2005\u2063":null}var e=t.prototype;return e.toNode=function(){if(this.character)return document.createTextNode(this.character);var t=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return t.setAttribute("width",this.width+"em"),t},e.toMarkup=function(){return this.character?"<mtext>"+this.character+"</mtext>":'<mspace width="'+this.width+'em"/>'},e.toText=function(){return this.character?this.character:" "},t}(),newDocumentFragment:fe},be=function(t,e,r){return!j[e][t]||!j[e][t].replace||55349===t.charCodeAt(0)||rt.hasOwnProperty(t)&&r&&(r.fontFamily&&"tt"===r.fontFamily.substr(4,2)||r.font&&"tt"===r.font.substr(4,2))||(t=j[e][t].replace),new ve.TextNode(t)},ye=function(t){return 1===t.length?t[0]:new ve.MathNode("mrow",t)},we=function(t,e){if("texttt"===e.fontFamily)return"monospace";if("textsf"===e.fontFamily)return"textit"===e.fontShape&&"textbf"===e.fontWeight?"sans-serif-bold-italic":"textit"===e.fontShape?"sans-serif-italic":"textbf"===e.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===e.fontShape&&"textbf"===e.fontWeight)return"bold-italic";if("textit"===e.fontShape)return"italic";if("textbf"===e.fontWeight)return"bold";var r=e.font;if(!r||"mathnormal"===r)return null;var a=t.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"bold-italic";if("mathbf"===r)return"bold";if("mathbb"===r)return"double-struck";if("mathfrak"===r)return"fraktur";if("mathscr"===r||"mathcal"===r)return"script";if("mathsf"===r)return"sans-serif";if("mathtt"===r)return"monospace";var n=t.text;return c.contains(["\\imath","\\jmath"],n)?null:(j[a][n]&&j[a][n].replace&&(n=j[a][n].replace),G(n,Dt.fontMap[r].fontName,a)?Dt.fontMap[r].variant:null)},ke=function(t,e,r){if(1===t.length){var a=Me(t[0],e);return r&&a instanceof ge&&"mo"===a.type&&(a.setAttribute("lspace","0em"),a.setAttribute("rspace","0em")),[a]}for(var n,i=[],o=0;o<t.length;o++){var s=Me(t[o],e);if(s instanceof ge&&n instanceof ge){if("mtext"===s.type&&"mtext"===n.type&&s.getAttribute("mathvariant")===n.getAttribute("mathvariant")){var h;(h=n.children).push.apply(h,s.children);continue}if("mn"===s.type&&"mn"===n.type){var l;(l=n.children).push.apply(l,s.children);continue}if("mi"===s.type&&1===s.children.length&&"mn"===n.type){var m=s.children[0];if(m instanceof xe&&"."===m.text){var c;(c=n.children).push.apply(c,s.children);continue}}else if("mi"===n.type&&1===n.children.length){var u=n.children[0];if(u instanceof xe&&"\u0338"===u.text&&("mo"===s.type||"mi"===s.type||"mn"===s.type)){var p=s.children[0];p instanceof xe&&p.text.length>0&&(p.text=p.text.slice(0,1)+"\u0338"+p.text.slice(1),i.pop())}}}i.push(s),n=s}return i},Se=function(t,e,r){return ye(ke(t,e,r))},Me=function(t,e){if(!t)return new ve.MathNode("mrow");if(Jt[t.type])return Jt[t.type](t,e);throw new o("Got group of unknown type: '"+t.type+"'")};function ze(t,e,r,a){var n,i=ke(t,r);n=1===i.length&&i[0]instanceof ge&&c.contains(["mrow","mtable"],i[0].type)?i[0]:new ve.MathNode("mrow",i);var o=new ve.MathNode("annotation",[new ve.TextNode(e)]);o.setAttribute("encoding","application/x-tex");var s=new ve.MathNode("semantics",[n,o]),h=new ve.MathNode("math",[s]);h.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML");var l=a?"katex":"katex-mathml";return Dt.makeSpan([l],[h])}var Ae=function(t){return new St({style:t.displayMode?w.DISPLAY:w.TEXT,maxSize:t.maxSize,minRuleThickness:t.minRuleThickness})},Te=function(t,e){if(e.displayMode){var r=["katex-display"];e.leqno&&r.push("leqno"),e.fleqn&&r.push("fleqn"),t=Dt.makeSpan(r,[t])}return t},Be=function(t,e,r){var a,n=Ae(r);if("mathml"===r.output)return ze(t,e,n,!0);if("html"===r.output){var i=de(t,n);a=Dt.makeSpan(["katex"],[i])}else{var o=ze(t,e,n,!1),s=de(t,n);a=Dt.makeSpan(["katex"],[o,s])}return Te(a,r)},Ce={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb"},qe={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Ne=function(t){return"ordgroup"===t.type?t.body.length:1},Ie=function(t,e,r,a){var n,i=t.height+t.depth+2*r;if(/fbox|color/.test(e)){if(n=Dt.makeSpan(["stretchy",e],[],a),"fbox"===e){var o=a.color&&a.getColor();o&&(n.style.borderColor=o)}}else{var s=[];/^[bx]cancel$/.test(e)&&s.push(new P({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(e)&&s.push(new P({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var h=new L(s,{width:"100%",height:i+"em"});n=Dt.makeSvgSpan([],[h],a)}return n.height=i,n.style.height=i+"em",n},Re=function(t){var e=new ve.MathNode("mo",[new ve.TextNode(Ce[t.substr(1)])]);return e.setAttribute("stretchy","true"),e},Oe=function(t,e){var r=function(){var r=4e5,a=t.label.substr(1);if(c.contains(["widehat","widecheck","widetilde","utilde"],a)){var n,i,o,s=Ne(t.base);if(s>5)"widehat"===a||"widecheck"===a?(n=420,r=2364,o=.42,i=a+"4"):(n=312,r=2340,o=.34,i="tilde4");else{var h=[1,1,2,2,3,3][s];"widehat"===a||"widecheck"===a?(r=[0,1062,2364,2364,2364][h],n=[0,239,300,360,420][h],o=[0,.24,.3,.3,.36,.42][h],i=a+h):(r=[0,600,1033,2339,2340][h],n=[0,260,286,306,312][h],o=[0,.26,.286,.3,.306,.34][h],i="tilde"+h)}var l=new H(i),m=new L([l],{width:"100%",height:o+"em",viewBox:"0 0 "+r+" "+n,preserveAspectRatio:"none"});return{span:Dt.makeSvgSpan([],[m],e),minWidth:0,height:o}}var u,p,d=[],f=qe[a],g=f[0],x=f[1],v=f[2],b=v/1e3,y=g.length;if(1===y)u=["hide-tail"],p=[f[3]];else if(2===y)u=["halfarrow-left","halfarrow-right"],p=["xMinYMin","xMaxYMin"];else{if(3!==y)throw new Error("Correct katexImagesData or update code here to support\n                    "+y+" children.");u=["brace-left","brace-center","brace-right"],p=["xMinYMin","xMidYMin","xMaxYMin"]}for(var w=0;w<y;w++){var k=new H(g[w]),S=new L([k],{width:"400em",height:b+"em",viewBox:"0 0 "+r+" "+v,preserveAspectRatio:p[w]+" slice"}),M=Dt.makeSvgSpan([u[w]],[S],e);if(1===y)return{span:M,minWidth:x,height:b};M.style.height=b+"em",d.push(M)}return{span:Dt.makeSpan(["stretchy"],d,e),minWidth:x,height:b}}(),a=r.span,n=r.minWidth,i=r.height;return a.height=i,a.style.height=i+"em",n>0&&(a.style.minWidth=n+"em"),a},Ee=function(t,e){var r,a,n,i=Vt(t,"supsub");i?(r=(a=Ft(i.base,"accent")).base,i.base=r,n=function(t){if(t instanceof N)return t;throw new Error("Expected span<HtmlDomNode> but got "+String(t)+".")}(ue(i,e)),i.base=a):r=(a=Ft(t,"accent")).base;var o=ue(r,e.havingCrampedStyle()),s=0;if(a.isShifty&&c.isCharacterBox(r)){var h=c.getBaseElem(r);s=D(ue(h,e.havingCrampedStyle())).skew}var l,m=Math.min(o.height,e.fontMetrics().xHeight);if(a.isStretchy)l=Oe(a,e),l=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"elem",elem:l,wrapperClasses:["svg-align"],wrapperStyle:s>0?{width:"calc(100% - "+2*s+"em)",marginLeft:2*s+"em"}:void 0}]},e);else{var u,p;"\\vec"===a.label?(u=Dt.staticSvg("vec",e),p=Dt.svgData.vec[1]):((u=D(u=Dt.makeOrd({mode:a.mode,text:a.label},e,"textord"))).italic=0,p=u.width),l=Dt.makeSpan(["accent-body"],[u]);var d="\\textcircled"===a.label;d&&(l.classes.push("accent-full"),m=o.height);var f=s;d||(f-=p/2),l.style.left=f+"em","\\textcircled"===a.label&&(l.style.top=".2em"),l=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"kern",size:-m},{type:"elem",elem:l}]},e)}var g=Dt.makeSpan(["mord","accent"],[l],e);return n?(n.children[0]=g,n.height=Math.max(g.height,n.height),n.classes[0]="mord",n):g},Le=function(t,e){var r=t.isStretchy?Re(t.label):new ve.MathNode("mo",[be(t.label,t.mode)]),a=new ve.MathNode("mover",[Me(t.base,e),r]);return a.setAttribute("accent","true"),a},He=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(function(t){return"\\"+t}).join("|"));Qt({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(t,e){var r=e[0],a=!He.test(t.funcName),n=!a||"\\widehat"===t.funcName||"\\widetilde"===t.funcName||"\\widecheck"===t.funcName;return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:a,isShifty:n,base:r}},htmlBuilder:Ee,mathmlBuilder:Le}),Qt({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!1},handler:function(t,e){var r=e[0];return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Ee,mathmlBuilder:Le}),Qt({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"accentUnder",mode:r.mode,label:a,base:n}},htmlBuilder:function(t,e){var r=ue(t.base,e),a=Oe(t,e),n="\\utilde"===t.label?.12:0,i=Dt.makeVList({positionType:"bottom",positionData:a.height+n,children:[{type:"elem",elem:a,wrapperClasses:["svg-align"]},{type:"kern",size:n},{type:"elem",elem:r}]},e);return Dt.makeSpan(["mord","accentunder"],[i],e)},mathmlBuilder:function(t,e){var r=Re(t.label),a=new ve.MathNode("munder",[Me(t.base,e),r]);return a.setAttribute("accentunder","true"),a}});var Pe=function(t){var e=new ve.MathNode("mpadded",t?[t]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e};Qt({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium"],props:{numArgs:1,numOptionalArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName;return{type:"xArrow",mode:a.mode,label:n,body:e[0],below:r[0]}},htmlBuilder:function(t,e){var r,a=e.style,n=e.havingStyle(a.sup()),i=Dt.wrapFragment(ue(t.body,n,e),e);i.classes.push("x-arrow-pad"),t.below&&(n=e.havingStyle(a.sub()),(r=Dt.wrapFragment(ue(t.below,n,e),e)).classes.push("x-arrow-pad"));var o,s=Oe(t,e),h=-e.fontMetrics().axisHeight+.5*s.height,l=-e.fontMetrics().axisHeight-.5*s.height-.111;if((i.depth>.25||"\\xleftequilibrium"===t.label)&&(l-=i.depth),r){var m=-e.fontMetrics().axisHeight+r.height+.5*s.height+.111;o=Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:l},{type:"elem",elem:s,shift:h},{type:"elem",elem:r,shift:m}]},e)}else o=Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:l},{type:"elem",elem:s,shift:h}]},e);return o.children[0].children[0].children[1].classes.push("svg-align"),Dt.makeSpan(["mrel","x-arrow"],[o],e)},mathmlBuilder:function(t,e){var r,a=Re(t.label);if(t.body){var n=Pe(Me(t.body,e));if(t.below){var i=Pe(Me(t.below,e));r=new ve.MathNode("munderover",[a,i,n])}else r=new ve.MathNode("mover",[a,n])}else if(t.below){var o=Pe(Me(t.below,e));r=new ve.MathNode("munder",[a,o])}else r=Pe(),r=new ve.MathNode("mover",[a,r]);return r}}),Qt({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){for(var r=t.parser,a=Ft(e[0],"ordgroup").body,n="",i=0;i<a.length;i++){n+=Ft(a[i],"textord").text}var s=parseInt(n);if(isNaN(s))throw new o("\\@char has non-numeric argument "+n);return{type:"textord",mode:r.mode,text:String.fromCharCode(s)}}});var De=function(t,e){var r=se(t.body,e.withColor(t.color),!1);return Dt.makeFragment(r)},Fe=function(t,e){var r=ke(t.body,e.withColor(t.color)),a=new ve.MathNode("mstyle",r);return a.setAttribute("mathcolor",t.color),a};Qt({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:["color","original"]},handler:function(t,e){var r=t.parser,a=Ft(e[0],"color-token").color,n=e[1];return{type:"color",mode:r.mode,color:a,body:ee(n)}},htmlBuilder:De,mathmlBuilder:Fe}),Qt({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,greediness:3,argTypes:["color"]},handler:function(t,e){var r=t.parser,a=t.breakOnTokenText,n=Ft(e[0],"color-token").color;r.gullet.macros.set("\\current@color",n);var i=r.parseExpression(!0,a);return{type:"color",mode:r.mode,color:n,body:i}},htmlBuilder:De,mathmlBuilder:Fe}),Qt({type:"cr",names:["\\cr","\\newline"],props:{numArgs:0,numOptionalArgs:1,argTypes:["size"],allowedInText:!0},handler:function(t,e,r){var a=t.parser,n=t.funcName,i=r[0],o="\\cr"===n,s=!1;return o||(s=!a.settings.displayMode||!a.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode")),{type:"cr",mode:a.mode,newLine:s,newRow:o,size:i&&Ft(i,"size").value}},htmlBuilder:function(t,e){if(t.newRow)throw new o("\\cr valid only within a tabular/array environment");var r=Dt.makeSpan(["mspace"],[],e);return t.newLine&&(r.classes.push("newline"),t.size&&(r.style.marginTop=Tt(t.size,e)+"em")),r},mathmlBuilder:function(t,e){var r=new ve.MathNode("mspace");return t.newLine&&(r.setAttribute("linebreak","newline"),t.size&&r.setAttribute("height",Tt(t.size,e)+"em")),r}});var Ve=function(t,e,r){var a=G(j.math[t]&&j.math[t].replace||t,e,r);if(!a)throw new Error("Unsupported symbol "+t+" and font size "+e+".");return a},Ue=function(t,e,r,a){var n=r.havingBaseStyle(e),i=Dt.makeSpan(a.concat(n.sizingClasses(r)),[t],r),o=n.sizeMultiplier/r.sizeMultiplier;return i.height*=o,i.depth*=o,i.maxFontSize=n.sizeMultiplier,i},Ge=function(t,e,r){var a=e.havingBaseStyle(r),n=(1-e.sizeMultiplier/a.sizeMultiplier)*e.fontMetrics().axisHeight;t.classes.push("delimcenter"),t.style.top=n+"em",t.height-=n,t.depth+=n},Ye=function(t,e,r,a,n,i){var o=function(t,e,r,a){return Dt.makeSymbol(t,"Size"+e+"-Regular",r,a)}(t,e,n,a),s=Ue(Dt.makeSpan(["delimsizing","size"+e],[o],a),w.TEXT,a,i);return r&&Ge(s,a,w.TEXT),s},We=function(t,e,r){var a;return a="Size1-Regular"===e?"delim-size1":"delim-size4",{type:"elem",elem:Dt.makeSpan(["delimsizinginner",a],[Dt.makeSpan([],[Dt.makeSymbol(t,e,r)])])}},Xe={type:"kern",size:-.005},_e=function(t,e,r,a,n,i){var o,s,h,l;o=h=l=t,s=null;var m="Size1-Regular";"\\uparrow"===t?h=l="\u23d0":"\\Uparrow"===t?h=l="\u2016":"\\downarrow"===t?o=h="\u23d0":"\\Downarrow"===t?o=h="\u2016":"\\updownarrow"===t?(o="\\uparrow",h="\u23d0",l="\\downarrow"):"\\Updownarrow"===t?(o="\\Uparrow",h="\u2016",l="\\Downarrow"):"["===t||"\\lbrack"===t?(o="\u23a1",h="\u23a2",l="\u23a3",m="Size4-Regular"):"]"===t||"\\rbrack"===t?(o="\u23a4",h="\u23a5",l="\u23a6",m="Size4-Regular"):"\\lfloor"===t||"\u230a"===t?(h=o="\u23a2",l="\u23a3",m="Size4-Regular"):"\\lceil"===t||"\u2308"===t?(o="\u23a1",h=l="\u23a2",m="Size4-Regular"):"\\rfloor"===t||"\u230b"===t?(h=o="\u23a5",l="\u23a6",m="Size4-Regular"):"\\rceil"===t||"\u2309"===t?(o="\u23a4",h=l="\u23a5",m="Size4-Regular"):"("===t||"\\lparen"===t?(o="\u239b",h="\u239c",l="\u239d",m="Size4-Regular"):")"===t||"\\rparen"===t?(o="\u239e",h="\u239f",l="\u23a0",m="Size4-Regular"):"\\{"===t||"\\lbrace"===t?(o="\u23a7",s="\u23a8",l="\u23a9",h="\u23aa",m="Size4-Regular"):"\\}"===t||"\\rbrace"===t?(o="\u23ab",s="\u23ac",l="\u23ad",h="\u23aa",m="Size4-Regular"):"\\lgroup"===t||"\u27ee"===t?(o="\u23a7",l="\u23a9",h="\u23aa",m="Size4-Regular"):"\\rgroup"===t||"\u27ef"===t?(o="\u23ab",l="\u23ad",h="\u23aa",m="Size4-Regular"):"\\lmoustache"===t||"\u23b0"===t?(o="\u23a7",l="\u23ad",h="\u23aa",m="Size4-Regular"):"\\rmoustache"!==t&&"\u23b1"!==t||(o="\u23ab",l="\u23a9",h="\u23aa",m="Size4-Regular");var c=Ve(o,m,n),u=c.height+c.depth,p=Ve(h,m,n),d=p.height+p.depth,f=Ve(l,m,n),g=f.height+f.depth,x=0,v=1;if(null!==s){var b=Ve(s,m,n);x=b.height+b.depth,v=2}var y=u+g+x,k=Math.max(0,Math.ceil((e-y)/(v*d))),S=y+k*v*d,M=a.fontMetrics().axisHeight;r&&(M*=a.sizeMultiplier);var z=S/2-M,A=.005*(k+1)-d,T=[];if(T.push(We(l,m,n)),null===s)for(var B=0;B<k;B++)T.push(Xe),T.push(We(h,m,n));else{for(var C=0;C<k;C++)T.push(Xe),T.push(We(h,m,n));T.push({type:"kern",size:A}),T.push(We(h,m,n)),T.push(Xe),T.push(We(s,m,n));for(var q=0;q<k;q++)T.push(Xe),T.push(We(h,m,n))}T.push({type:"kern",size:A}),T.push(We(h,m,n)),T.push(Xe),T.push(We(o,m,n));var N=a.havingBaseStyle(w.TEXT),I=Dt.makeVList({positionType:"bottom",positionData:z,children:T},N);return Ue(Dt.makeSpan(["delimsizing","mult"],[I],N),w.TEXT,a,i)},je=function(t,e,r,a,n){var i=function(t,e,r){e*=1e3;var a="";switch(t){case"sqrtMain":a=function(t,e){return"M95,"+(622+t+e)+"\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl"+t/2.075+" -"+t+"\nc5.3,-9.3,12,-14,20,-14\nH400000v"+(40+t)+"H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM"+(834+t)+" "+e+"h400000v"+(40+t)+"h-400000z"}(e,80);break;case"sqrtSize1":a=function(t,e){return"M263,"+(601+t+e)+"c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl"+t/2.084+" -"+t+"\nc4.7,-7.3,11,-11,19,-11\nH40000v"+(40+t)+"H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM"+(1001+t)+" "+e+"h400000v"+(40+t)+"h-400000z"}(e,80);break;case"sqrtSize2":a=function(t,e){return"M983 "+(10+t+e)+"\nl"+t/3.13+" -"+t+"\nc4,-6.7,10,-10,18,-10 H400000v"+(40+t)+"\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM"+(1001+t)+" "+e+"h400000v"+(40+t)+"h-400000z"}(e,80);break;case"sqrtSize3":a=function(t,e){return"M424,"+(2398+t+e)+"\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl"+t/4.223+" -"+t+"c4,-6.7,10,-10,18,-10 H400000\nv"+(40+t)+"H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M"+(1001+t)+" "+e+"\nh400000v"+(40+t)+"h-400000z"}(e,80);break;case"sqrtSize4":a=function(t,e){return"M473,"+(2713+t+e)+"\nc339.3,-1799.3,509.3,-2700,510,-2702 l"+t/5.298+" -"+t+"\nc3.3,-7.3,9.3,-11,18,-11 H400000v"+(40+t)+"H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM"+(1001+t)+" "+e+"h400000v"+(40+t)+"H1017.7z"}(e,80);break;case"sqrtTall":a=function(t,e,r){return"M702 "+(t+e)+"H400000"+(40+t)+"\nH742v"+(r-54-e-t)+"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 "+e+"H400000v"+(40+t)+"H742z"}(e,80,r)}return a}(t,a,r),o=new H(t,i),s=new L([o],{width:"400em",height:e+"em",viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return Dt.makeSvgSpan(["hide-tail"],[s],n)},$e=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],Ze=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],Ke=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],Je=[0,1.2,1.8,2.4,3],Qe=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],tr=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"stack"}],er=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],rr=function(t){if("small"===t.type)return"Main-Regular";if("large"===t.type)return"Size"+t.size+"-Regular";if("stack"===t.type)return"Size4-Regular";throw new Error("Add support for delim type '"+t.type+"' here.")},ar=function(t,e,r,a){for(var n=Math.min(2,3-a.style.size);n<r.length&&"stack"!==r[n].type;n++){var i=Ve(t,rr(r[n]),"math"),o=i.height+i.depth;if("small"===r[n].type&&(o*=a.havingBaseStyle(r[n].style).sizeMultiplier),o>e)return r[n]}return r[r.length-1]},nr=function(t,e,r,a,n,i){var o;"<"===t||"\\lt"===t||"\u27e8"===t?t="\\langle":">"!==t&&"\\gt"!==t&&"\u27e9"!==t||(t="\\rangle"),o=c.contains(Ke,t)?Qe:c.contains($e,t)?er:tr;var s=ar(t,e,o,a);return"small"===s.type?function(t,e,r,a,n,i){var o=Dt.makeSymbol(t,"Main-Regular",n,a),s=Ue(o,e,a,i);return r&&Ge(s,a,e),s}(t,s.style,r,a,n,i):"large"===s.type?Ye(t,s.size,r,a,n,i):_e(t,e,r,a,n,i)},ir=function(t,e){var r,a,n=e.havingBaseSizing(),i=ar("\\surd",t*n.sizeMultiplier,er,n),o=n.sizeMultiplier,s=Math.max(0,e.minRuleThickness-e.fontMetrics().sqrtRuleThickness),h=0,l=0,m=0;return"small"===i.type?(t<1?o=1:t<1.4&&(o=.7),l=(1+s)/o,(r=je("sqrtMain",h=(1+s+.08)/o,m=1e3+1e3*s+80,s,e)).style.minWidth="0.853em",a=.833/o):"large"===i.type?(m=1080*Je[i.size],l=(Je[i.size]+s)/o,h=(Je[i.size]+s+.08)/o,(r=je("sqrtSize"+i.size,h,m,s,e)).style.minWidth="1.02em",a=1/o):(h=t+s+.08,l=t+s,m=Math.floor(1e3*t+s)+80,(r=je("sqrtTall",h,m,s,e)).style.minWidth="0.742em",a=1.056),r.height=l,r.style.height=h+"em",{span:r,advanceWidth:a,ruleWidth:(e.fontMetrics().sqrtRuleThickness+s)*o}},or=function(t,e,r,a,n){if("<"===t||"\\lt"===t||"\u27e8"===t?t="\\langle":">"!==t&&"\\gt"!==t&&"\u27e9"!==t||(t="\\rangle"),c.contains($e,t)||c.contains(Ke,t))return Ye(t,e,!1,r,a,n);if(c.contains(Ze,t))return _e(t,Je[e],!1,r,a,n);throw new o("Illegal delimiter: '"+t+"'")},sr=nr,hr=function(t,e,r,a,n,i){var o=a.fontMetrics().axisHeight*a.sizeMultiplier,s=5/a.fontMetrics().ptPerEm,h=Math.max(e-o,r+o),l=Math.max(h/500*901,2*h-s);return nr(t,l,!0,a,n,i)},lr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},mr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function cr(t,e){var r=Yt(t);if(r&&c.contains(mr,r.text))return r;throw new o("Invalid delimiter: '"+(r?r.text:JSON.stringify(t))+"' after '"+e.funcName+"'",t)}function ur(t){if(!t.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}Qt({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1},handler:function(t,e){var r=cr(e[0],t);return{type:"delimsizing",mode:t.parser.mode,size:lr[t.funcName].size,mclass:lr[t.funcName].mclass,delim:r.text}},htmlBuilder:function(t,e){return"."===t.delim?Dt.makeSpan([t.mclass]):or(t.delim,t.size,e,t.mode,[t.mclass])},mathmlBuilder:function(t){var e=[];"."!==t.delim&&e.push(be(t.delim,t.mode));var r=new ve.MathNode("mo",e);return"mopen"===t.mclass||"mclose"===t.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r}}),Qt({type:"leftright-right",names:["\\right"],props:{numArgs:1},handler:function(t,e){var r=t.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new o("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:t.parser.mode,delim:cr(e[0],t).text,color:r}}}),Qt({type:"leftright",names:["\\left"],props:{numArgs:1},handler:function(t,e){var r=cr(e[0],t),a=t.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect("\\right",!1);var i=Ft(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:r.text,right:i.delim,rightColor:i.color}},htmlBuilder:function(t,e){ur(t);for(var r,a,n=se(t.body,e,!0,["mopen","mclose"]),i=0,o=0,s=!1,h=0;h<n.length;h++)n[h].isMiddle?s=!0:(i=Math.max(n[h].height,i),o=Math.max(n[h].depth,o));if(i*=e.sizeMultiplier,o*=e.sizeMultiplier,r="."===t.left?ce(e,["mopen"]):hr(t.left,i,o,e,t.mode,["mopen"]),n.unshift(r),s)for(var l=1;l<n.length;l++){var m=n[l].isMiddle;m&&(n[l]=hr(m.delim,i,o,m.options,t.mode,[]))}if("."===t.right)a=ce(e,["mclose"]);else{var c=t.rightColor?e.withColor(t.rightColor):e;a=hr(t.right,i,o,c,t.mode,["mclose"])}return n.push(a),Dt.makeSpan(["minner"],n,e)},mathmlBuilder:function(t,e){ur(t);var r=ke(t.body,e);if("."!==t.left){var a=new ve.MathNode("mo",[be(t.left,t.mode)]);a.setAttribute("fence","true"),r.unshift(a)}if("."!==t.right){var n=new ve.MathNode("mo",[be(t.right,t.mode)]);n.setAttribute("fence","true"),t.rightColor&&n.setAttribute("mathcolor",t.rightColor),r.push(n)}return ye(r)}}),Qt({type:"middle",names:["\\middle"],props:{numArgs:1},handler:function(t,e){var r=cr(e[0],t);if(!t.parser.leftrightDepth)throw new o("\\middle without preceding \\left",r);return{type:"middle",mode:t.parser.mode,delim:r.text}},htmlBuilder:function(t,e){var r;if("."===t.delim)r=ce(e,[]);else{r=or(t.delim,1,e,t.mode,[]);var a={delim:t.delim,options:e};r.isMiddle=a}return r},mathmlBuilder:function(t,e){var r="\\vert"===t.delim||"|"===t.delim?be("|","text"):be(t.delim,t.mode),a=new ve.MathNode("mo",[r]);return a.setAttribute("fence","true"),a.setAttribute("lspace","0.05em"),a.setAttribute("rspace","0.05em"),a}});var pr=function(t,e){var r,a,n=Dt.wrapFragment(ue(t.body,e),e),i=t.label.substr(1),o=e.sizeMultiplier,s=0,h=c.isCharacterBox(t.body);if("sout"===i)(r=Dt.makeSpan(["stretchy","sout"])).height=e.fontMetrics().defaultRuleThickness/o,s=-.5*e.fontMetrics().xHeight;else{/cancel/.test(i)?h||n.classes.push("cancel-pad"):n.classes.push("boxpad");var l=0,m=0;/box/.test(i)?(m=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),l=e.fontMetrics().fboxsep+("colorbox"===i?0:m)):l=h?.2:0,r=Ie(n,i,l,e),/fbox|boxed|fcolorbox/.test(i)&&(r.style.borderStyle="solid",r.style.borderWidth=m+"em"),s=n.depth+l,t.backgroundColor&&(r.style.backgroundColor=t.backgroundColor,t.borderColor&&(r.style.borderColor=t.borderColor))}return a=t.backgroundColor?Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:s},{type:"elem",elem:n,shift:0}]},e):Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:0},{type:"elem",elem:r,shift:s,wrapperClasses:/cancel/.test(i)?["svg-align"]:[]}]},e),/cancel/.test(i)&&(a.height=n.height,a.depth=n.depth),/cancel/.test(i)&&!h?Dt.makeSpan(["mord","cancel-lap"],[a],e):Dt.makeSpan(["mord"],[a],e)},dr=function(t,e){var r=0,a=new ve.MathNode(t.label.indexOf("colorbox")>-1?"mpadded":"menclose",[Me(t.body,e)]);switch(t.label){case"\\cancel":a.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":a.setAttribute("notation","downdiagonalstrike");break;case"\\sout":a.setAttribute("notation","horizontalstrike");break;case"\\fbox":a.setAttribute("notation","box");break;case"\\fcolorbox":case"\\colorbox":if(r=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,a.setAttribute("width","+"+2*r+"pt"),a.setAttribute("height","+"+2*r+"pt"),a.setAttribute("lspace",r+"pt"),a.setAttribute("voffset",r+"pt"),"\\fcolorbox"===t.label){var n=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);a.setAttribute("style","border: "+n+"em solid "+String(t.borderColor))}break;case"\\xcancel":a.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return t.backgroundColor&&a.setAttribute("mathbackground",t.backgroundColor),a};Qt({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:["color","text"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,i=Ft(e[0],"color-token").color,o=e[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:i,body:o}},htmlBuilder:pr,mathmlBuilder:dr}),Qt({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,greediness:3,argTypes:["color","color","text"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,i=Ft(e[0],"color-token").color,o=Ft(e[1],"color-token").color,s=e[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:o,borderColor:i,body:s}},htmlBuilder:pr,mathmlBuilder:dr}),Qt({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler:function(t,e){return{type:"enclose",mode:t.parser.mode,label:"\\fbox",body:e[0]}}}),Qt({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout"],props:{numArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName,i=e[0];return{type:"enclose",mode:a.mode,label:n,body:i}},htmlBuilder:pr,mathmlBuilder:dr});var fr={};function gr(t){for(var e=t.type,r=t.names,a=t.props,n=t.handler,i=t.htmlBuilder,o=t.mathmlBuilder,s={type:e,numArgs:a.numArgs||0,greediness:1,allowedInText:!1,numOptionalArgs:0,handler:n},h=0;h<r.length;++h)fr[r[h]]=s;i&&(Kt[e]=i),o&&(Jt[e]=o)}function xr(t){var e=[];t.consumeSpaces();for(var r=t.fetch().text;"\\hline"===r||"\\hdashline"===r;)t.consume(),e.push("\\hdashline"===r),t.consumeSpaces(),r=t.fetch().text;return e}function vr(t,e,r){var a=e.hskipBeforeAndAfter,n=e.addJot,i=e.cols,s=e.arraystretch,h=e.colSeparationType;if(t.gullet.beginGroup(),t.gullet.macros.set("\\\\","\\cr"),!s){var l=t.gullet.expandMacroAsText("\\arraystretch");if(null==l)s=1;else if(!(s=parseFloat(l))||s<0)throw new o("Invalid \\arraystretch: "+l)}t.gullet.beginGroup();var m=[],c=[m],u=[],p=[];for(p.push(xr(t));;){var d=t.parseExpression(!1,"\\cr");t.gullet.endGroup(),t.gullet.beginGroup(),d={type:"ordgroup",mode:t.mode,body:d},r&&(d={type:"styling",mode:t.mode,style:r,body:[d]}),m.push(d);var f=t.fetch().text;if("&"===f)t.consume();else{if("\\end"===f){1===m.length&&"styling"===d.type&&0===d.body[0].body.length&&c.pop(),p.length<c.length+1&&p.push([]);break}if("\\cr"!==f)throw new o("Expected & or \\\\ or \\cr or \\end",t.nextToken);var g=Ft(t.parseFunction(),"cr");u.push(g.size),p.push(xr(t)),m=[],c.push(m)}}return t.gullet.endGroup(),t.gullet.endGroup(),{type:"array",mode:t.mode,addJot:n,arraystretch:s,body:c,cols:i,rowGaps:u,hskipBeforeAndAfter:a,hLinesBeforeRow:p,colSeparationType:h}}function br(t){return"d"===t.substr(0,1)?"display":"text"}var yr=function(t,e){var r,a,n=t.body.length,i=t.hLinesBeforeRow,s=0,h=new Array(n),l=[],m=Math.max(e.fontMetrics().arrayRuleWidth,e.minRuleThickness),u=1/e.fontMetrics().ptPerEm,p=5*u;t.colSeparationType&&"small"===t.colSeparationType&&(p=e.havingStyle(w.SCRIPT).sizeMultiplier/e.sizeMultiplier*.2778);var d=12*u,f=3*u,g=t.arraystretch*d,x=.7*g,v=.3*g,b=0;function y(t){for(var e=0;e<t.length;++e)e>0&&(b+=.25),l.push({pos:b,isDashed:t[e]})}for(y(i[0]),r=0;r<t.body.length;++r){var k=t.body[r],S=x,M=v;s<k.length&&(s=k.length);var z=new Array(k.length);for(a=0;a<k.length;++a){var A=ue(k[a],e);M<A.depth&&(M=A.depth),S<A.height&&(S=A.height),z[a]=A}var T=t.rowGaps[r],B=0;T&&(B=Tt(T,e))>0&&(M<(B+=v)&&(M=B),B=0),t.addJot&&(M+=f),z.height=S,z.depth=M,b+=S,z.pos=b,b+=M+B,h[r]=z,y(i[r+1])}var C,q,N=b/2+e.fontMetrics().axisHeight,I=t.cols||[],R=[];for(a=0,q=0;a<s||q<I.length;++a,++q){for(var O=I[q]||{},E=!0;"separator"===O.type;){if(E||((C=Dt.makeSpan(["arraycolsep"],[])).style.width=e.fontMetrics().doubleRuleSep+"em",R.push(C)),"|"!==O.separator&&":"!==O.separator)throw new o("Invalid separator type: "+O.separator);var L="|"===O.separator?"solid":"dashed",H=Dt.makeSpan(["vertical-separator"],[],e);H.style.height=b+"em",H.style.borderRightWidth=m+"em",H.style.borderRightStyle=L,H.style.margin="0 -"+m/2+"em",H.style.verticalAlign=-(b-N)+"em",R.push(H),O=I[++q]||{},E=!1}if(!(a>=s)){var P=void 0;(a>0||t.hskipBeforeAndAfter)&&0!==(P=c.deflt(O.pregap,p))&&((C=Dt.makeSpan(["arraycolsep"],[])).style.width=P+"em",R.push(C));var D=[];for(r=0;r<n;++r){var F=h[r],V=F[a];if(V){var U=F.pos-N;V.depth=F.depth,V.height=F.height,D.push({type:"elem",elem:V,shift:U})}}D=Dt.makeVList({positionType:"individualShift",children:D},e),D=Dt.makeSpan(["col-align-"+(O.align||"c")],[D]),R.push(D),(a<s-1||t.hskipBeforeAndAfter)&&0!==(P=c.deflt(O.postgap,p))&&((C=Dt.makeSpan(["arraycolsep"],[])).style.width=P+"em",R.push(C))}}if(h=Dt.makeSpan(["mtable"],R),l.length>0){for(var G=Dt.makeLineSpan("hline",e,m),Y=Dt.makeLineSpan("hdashline",e,m),W=[{type:"elem",elem:h,shift:0}];l.length>0;){var X=l.pop(),_=X.pos-N;X.isDashed?W.push({type:"elem",elem:Y,shift:_}):W.push({type:"elem",elem:G,shift:_})}h=Dt.makeVList({positionType:"individualShift",children:W},e)}return Dt.makeSpan(["mord"],[h],e)},wr={c:"center ",l:"left ",r:"right "},kr=function(t,e){var r=new ve.MathNode("mtable",t.body.map(function(t){return new ve.MathNode("mtr",t.map(function(t){return new ve.MathNode("mtd",[Me(t,e)])}))})),a=.5===t.arraystretch?.1:.16+t.arraystretch-1+(t.addJot?.09:0);r.setAttribute("rowspacing",a+"em");var n="",i="";if(t.cols){var o=t.cols,s="",h=!1,l=0,m=o.length;"separator"===o[0].type&&(n+="top ",l=1),"separator"===o[o.length-1].type&&(n+="bottom ",m-=1);for(var c=l;c<m;c++)"align"===o[c].type?(i+=wr[o[c].align],h&&(s+="none "),h=!0):"separator"===o[c].type&&h&&(s+="|"===o[c].separator?"solid ":"dashed ",h=!1);r.setAttribute("columnalign",i.trim()),/[sd]/.test(s)&&r.setAttribute("columnlines",s.trim())}if("align"===t.colSeparationType){for(var u=t.cols||[],p="",d=1;d<u.length;d++)p+=d%2?"0em ":"1em ";r.setAttribute("columnspacing",p.trim())}else"alignat"===t.colSeparationType?r.setAttribute("columnspacing","0em"):"small"===t.colSeparationType?r.setAttribute("columnspacing","0.2778em"):r.setAttribute("columnspacing","1em");var f="",g=t.hLinesBeforeRow;n+=g[0].length>0?"left ":"",n+=g[g.length-1].length>0?"right ":"";for(var x=1;x<g.length-1;x++)f+=0===g[x].length?"none ":g[x][0]?"dashed ":"solid ";return/[sd]/.test(f)&&r.setAttribute("rowlines",f.trim()),""!==n&&(r=new ve.MathNode("menclose",[r])).setAttribute("notation",n.trim()),t.arraystretch&&t.arraystretch<1&&(r=new ve.MathNode("mstyle",[r])).setAttribute("scriptlevel","1"),r},Sr=function(t,e){var r,a=[],n=vr(t.parser,{cols:a,addJot:!0},"display"),i=0,s={type:"ordgroup",mode:t.mode,body:[]},h=Vt(e[0],"ordgroup");if(h){for(var l="",m=0;m<h.body.length;m++){l+=Ft(h.body[m],"textord").text}r=Number(l),i=2*r}var c=!i;n.body.forEach(function(t){for(var e=1;e<t.length;e+=2){var a=Ft(t[e],"styling");Ft(a.body[0],"ordgroup").body.unshift(s)}if(c)i<t.length&&(i=t.length);else{var n=t.length/2;if(r<n)throw new o("Too many math in a row: expected "+r+", but got "+n,t[0])}});for(var u=0;u<i;++u){var p="r",d=0;u%2==1?p="l":u>0&&c&&(d=1),a[u]={type:"align",align:p,pregap:d,postgap:0}}return n.colSeparationType=c?"align":"alignat",n};gr({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(t,e){var r={cols:(Yt(e[0])?[e[0]]:Ft(e[0],"ordgroup").body).map(function(t){var e=Gt(t).text;if(-1!=="lcr".indexOf(e))return{type:"align",align:e};if("|"===e)return{type:"separator",separator:"|"};if(":"===e)return{type:"separator",separator:":"};throw new o("Unknown column alignment: "+e,t)}),hskipBeforeAndAfter:!0};return vr(t.parser,r,br(t.envName))},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix"],props:{numArgs:0},handler:function(t){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[t.envName],r=vr(t.parser,{hskipBeforeAndAfter:!1},br(t.envName));return e?{type:"leftright",mode:t.mode,body:[r],left:e[0],right:e[1],rightColor:void 0}:r},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["smallmatrix"],props:{numArgs:0},handler:function(t){var e=vr(t.parser,{arraystretch:.5},"script");return e.colSeparationType="small",e},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["subarray"],props:{numArgs:1},handler:function(t,e){var r=(Yt(e[0])?[e[0]]:Ft(e[0],"ordgroup").body).map(function(t){var e=Gt(t).text;if(-1!=="lc".indexOf(e))return{type:"align",align:e};throw new o("Unknown column alignment: "+e,t)});if(r.length>1)throw new o("{subarray} can contain only one column");var a={cols:r,hskipBeforeAndAfter:!1,arraystretch:.5};if((a=vr(t.parser,a,"script")).body[0].length>1)throw new o("{subarray} can contain only one column");return a},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["cases","dcases"],props:{numArgs:0},handler:function(t){var e=vr(t.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},br(t.envName));return{type:"leftright",mode:t.mode,body:[e],left:"\\{",right:".",rightColor:void 0}},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["aligned"],props:{numArgs:0},handler:Sr,htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["gathered"],props:{numArgs:0},handler:function(t){return vr(t.parser,{cols:[{type:"align",align:"c"}],addJot:!0},"display")},htmlBuilder:yr,mathmlBuilder:kr}),gr({type:"array",names:["alignedat"],props:{numArgs:1},handler:Sr,htmlBuilder:yr,mathmlBuilder:kr}),Qt({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler:function(t,e){throw new o(t.funcName+" valid only within array environment")}});var Mr=fr;Qt({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];if("ordgroup"!==n.type)throw new o("Invalid environment name",n);for(var i="",s=0;s<n.body.length;++s)i+=Ft(n.body[s],"textord").text;if("\\begin"===a){if(!Mr.hasOwnProperty(i))throw new o("No such environment: "+i,n);var h=Mr[i],l=r.parseArguments("\\begin{"+i+"}",h),m=l.args,c=l.optArgs,u={mode:r.mode,envName:i,parser:r},p=h.handler(u,m,c);r.expect("\\end",!1);var d=r.nextToken,f=Ft(r.parseFunction(),"environment");if(f.name!==i)throw new o("Mismatch: \\begin{"+i+"} matched by \\end{"+f.name+"}",d);return p}return{type:"environment",mode:r.mode,name:i,nameGroup:n}}});var zr=Dt.makeSpan;function Ar(t,e){var r=se(t.body,e,!0);return zr([t.mclass],r,e)}function Tr(t,e){var r,a=ke(t.body,e);return"minner"===t.mclass?ve.newDocumentFragment(a):("mord"===t.mclass?t.isCharacterBox?(r=a[0]).type="mi":r=new ve.MathNode("mi",a):(t.isCharacterBox?(r=a[0]).type="mo":r=new ve.MathNode("mo",a),"mbin"===t.mclass?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):"mpunct"===t.mclass?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):"mopen"!==t.mclass&&"mclose"!==t.mclass||(r.attributes.lspace="0em",r.attributes.rspace="0em")),r)}Qt({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"mclass",mode:r.mode,mclass:"m"+a.substr(5),body:ee(n),isCharacterBox:c.isCharacterBox(n)}},htmlBuilder:Ar,mathmlBuilder:Tr});var Br=function(t){var e="ordgroup"===t.type&&t.body.length?t.body[0]:t;return"atom"!==e.type||"bin"!==e.family&&"rel"!==e.family?"mord":"m"+e.family};Qt({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler:function(t,e){return{type:"mclass",mode:t.parser.mode,mclass:Br(e[0]),body:[e[1]],isCharacterBox:c.isCharacterBox(e[1])}}}),Qt({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler:function(t,e){var r,a=t.parser,n=t.funcName,i=e[1],o=e[0];r="\\stackrel"!==n?Br(i):"mrel";var s={type:"op",mode:i.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==n,body:ee(i)},h={type:"supsub",mode:o.mode,base:s,sup:"\\underset"===n?null:o,sub:"\\underset"===n?o:null};return{type:"mclass",mode:a.mode,mclass:r,body:[h],isCharacterBox:c.isCharacterBox(h)}},htmlBuilder:Ar,mathmlBuilder:Tr});var Cr=function(t,e){var r=t.font,a=e.withFont(r);return ue(t.body,a)},qr=function(t,e){var r=t.font,a=e.withFont(r);return Me(t.body,a)},Nr={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};Qt({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,greediness:2},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0],i=a;return i in Nr&&(i=Nr[i]),{type:"font",mode:r.mode,font:i.slice(1),body:n}},htmlBuilder:Cr,mathmlBuilder:qr}),Qt({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1,greediness:2},handler:function(t,e){var r=t.parser,a=e[0],n=c.isCharacterBox(a);return{type:"mclass",mode:r.mode,mclass:Br(a),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:a}],isCharacterBox:n}}}),Qt({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it"],props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=t.breakOnTokenText,i=r.mode,o=r.parseExpression(!0,n);return{type:"font",mode:i,font:"math"+a.slice(1),body:{type:"ordgroup",mode:r.mode,body:o}}},htmlBuilder:Cr,mathmlBuilder:qr});var Ir=function(t,e){var r=e;return"display"===t?r=r.id>=w.SCRIPT.id?r.text():w.DISPLAY:"text"===t&&r.size===w.DISPLAY.size?r=w.TEXT:"script"===t?r=w.SCRIPT:"scriptscript"===t&&(r=w.SCRIPTSCRIPT),r},Rr=function(t,e){var r,a=Ir(t.size,e.style),n=a.fracNum(),i=a.fracDen();r=e.havingStyle(n);var o=ue(t.numer,r,e);if(t.continued){var s=8.5/e.fontMetrics().ptPerEm,h=3.5/e.fontMetrics().ptPerEm;o.height=o.height<s?s:o.height,o.depth=o.depth<h?h:o.depth}r=e.havingStyle(i);var l,m,c,u,p,d,f,g,x,v,b=ue(t.denom,r,e);if(t.hasBarLine?(t.barSize?(m=Tt(t.barSize,e),l=Dt.makeLineSpan("frac-line",e,m)):l=Dt.makeLineSpan("frac-line",e),m=l.height,c=l.height):(l=null,m=0,c=e.fontMetrics().defaultRuleThickness),a.size===w.DISPLAY.size||"display"===t.size?(u=e.fontMetrics().num1,p=m>0?3*c:7*c,d=e.fontMetrics().denom1):(m>0?(u=e.fontMetrics().num2,p=c):(u=e.fontMetrics().num3,p=3*c),d=e.fontMetrics().denom2),l){var y=e.fontMetrics().axisHeight;u-o.depth-(y+.5*m)<p&&(u+=p-(u-o.depth-(y+.5*m))),y-.5*m-(b.height-d)<p&&(d+=p-(y-.5*m-(b.height-d)));var k=-(y-.5*m);f=Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:b,shift:d},{type:"elem",elem:l,shift:k},{type:"elem",elem:o,shift:-u}]},e)}else{var S=u-o.depth-(b.height-d);S<p&&(u+=.5*(p-S),d+=.5*(p-S)),f=Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:b,shift:d},{type:"elem",elem:o,shift:-u}]},e)}return r=e.havingStyle(a),f.height*=r.sizeMultiplier/e.sizeMultiplier,f.depth*=r.sizeMultiplier/e.sizeMultiplier,g=a.size===w.DISPLAY.size?e.fontMetrics().delim1:e.fontMetrics().delim2,x=null==t.leftDelim?ce(e,["mopen"]):sr(t.leftDelim,g,!0,e.havingStyle(a),t.mode,["mopen"]),v=t.continued?Dt.makeSpan([]):null==t.rightDelim?ce(e,["mclose"]):sr(t.rightDelim,g,!0,e.havingStyle(a),t.mode,["mclose"]),Dt.makeSpan(["mord"].concat(r.sizingClasses(e)),[x,Dt.makeSpan(["mfrac"],[f]),v],e)},Or=function(t,e){var r=new ve.MathNode("mfrac",[Me(t.numer,e),Me(t.denom,e)]);if(t.hasBarLine){if(t.barSize){var a=Tt(t.barSize,e);r.setAttribute("linethickness",a+"em")}}else r.setAttribute("linethickness","0px");var n=Ir(t.size,e.style);if(n.size!==e.style.size){r=new ve.MathNode("mstyle",[r]);var i=n.size===w.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",i),r.setAttribute("scriptlevel","0")}if(null!=t.leftDelim||null!=t.rightDelim){var o=[];if(null!=t.leftDelim){var s=new ve.MathNode("mo",[new ve.TextNode(t.leftDelim.replace("\\",""))]);s.setAttribute("fence","true"),o.push(s)}if(o.push(r),null!=t.rightDelim){var h=new ve.MathNode("mo",[new ve.TextNode(t.rightDelim.replace("\\",""))]);h.setAttribute("fence","true"),o.push(h)}return ye(o)}return r};Qt({type:"genfrac",names:["\\cfrac","\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,greediness:2},handler:function(t,e){var r,a=t.parser,n=t.funcName,i=e[0],o=e[1],s=null,h=null,l="auto";switch(n){case"\\cfrac":case"\\dfrac":case"\\frac":case"\\tfrac":r=!0;break;case"\\\\atopfrac":r=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":r=!1,s="(",h=")";break;case"\\\\bracefrac":r=!1,s="\\{",h="\\}";break;case"\\\\brackfrac":r=!1,s="[",h="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\cfrac":case"\\dfrac":case"\\dbinom":l="display";break;case"\\tfrac":case"\\tbinom":l="text"}return{type:"genfrac",mode:a.mode,continued:"\\cfrac"===n,numer:i,denom:o,hasBarLine:r,leftDelim:s,rightDelim:h,size:l,barSize:null}},htmlBuilder:Rr,mathmlBuilder:Or}),Qt({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler:function(t){var e,r=t.parser,a=t.funcName,n=t.token;switch(a){case"\\over":e="\\frac";break;case"\\choose":e="\\binom";break;case"\\atop":e="\\\\atopfrac";break;case"\\brace":e="\\\\bracefrac";break;case"\\brack":e="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:r.mode,replaceWith:e,token:n}}});var Er=["display","text","script","scriptscript"],Lr=function(t){var e=null;return t.length>0&&(e="."===(e=t)?null:e),e};Qt({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,greediness:6,argTypes:["math","math","size","text","math","math"]},handler:function(t,e){var r=t.parser,a=e[4],n=e[5],i=Vt(e[0],"atom");i&&(i=Ut(e[0],"open"));var o=i?Lr(i.text):null,s=Vt(e[1],"atom");s&&(s=Ut(e[1],"close"));var h,l=s?Lr(s.text):null,m=Ft(e[2],"size"),c=null;h=!!m.isBlank||(c=m.value).number>0;var u="auto",p=Vt(e[3],"ordgroup");if(p){if(p.body.length>0){var d=Ft(p.body[0],"textord");u=Er[Number(d.text)]}}else p=Ft(e[3],"textord"),u=Er[Number(p.text)];return{type:"genfrac",mode:r.mode,numer:a,denom:n,continued:!1,hasBarLine:h,barSize:c,leftDelim:o,rightDelim:l,size:u}},htmlBuilder:Rr,mathmlBuilder:Or}),Qt({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(t,e){var r=t.parser,a=(t.funcName,t.token);return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Ft(e[0],"size").value,token:a}}}),Qt({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(t,e){var r=t.parser,a=(t.funcName,e[0]),n=function(t){if(!t)throw new Error("Expected non-null, but got "+String(t));return t}(Ft(e[1],"infix").size),i=e[2],o=n.number>0;return{type:"genfrac",mode:r.mode,numer:a,denom:i,continued:!1,hasBarLine:o,barSize:n,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:Rr,mathmlBuilder:Or});var Hr=function(t,e){var r,a,n=e.style,i=Vt(t,"supsub");i?(r=i.sup?ue(i.sup,e.havingStyle(n.sup()),e):ue(i.sub,e.havingStyle(n.sub()),e),a=Ft(i.base,"horizBrace")):a=Ft(t,"horizBrace");var o,s=ue(a.base,e.havingBaseStyle(w.DISPLAY)),h=Oe(a,e);if(a.isOver?(o=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:h}]},e)).children[0].children[0].children[1].classes.push("svg-align"):(o=Dt.makeVList({positionType:"bottom",positionData:s.depth+.1+h.height,children:[{type:"elem",elem:h},{type:"kern",size:.1},{type:"elem",elem:s}]},e)).children[0].children[0].children[0].classes.push("svg-align"),r){var l=Dt.makeSpan(["mord",a.isOver?"mover":"munder"],[o],e);o=a.isOver?Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.2},{type:"elem",elem:r}]},e):Dt.makeVList({positionType:"bottom",positionData:l.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:l}]},e)}return Dt.makeSpan(["mord",a.isOver?"mover":"munder"],[o],e)};Qt({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName;return{type:"horizBrace",mode:r.mode,label:a,isOver:/^\\over/.test(a),base:e[0]}},htmlBuilder:Hr,mathmlBuilder:function(t,e){var r=Re(t.label);return new ve.MathNode(t.isOver?"mover":"munder",[Me(t.base,e),r])}}),Qt({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[1],n=Ft(e[0],"url").url;return r.settings.isTrusted({command:"\\href",url:n})?{type:"href",mode:r.mode,href:n,body:ee(a)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:function(t,e){var r=se(t.body,e,!1);return Dt.makeAnchor(t.href,[],r,e)},mathmlBuilder:function(t,e){var r=Se(t.body,e);return r instanceof ge||(r=new ge("mrow",[r])),r.setAttribute("href",t.href),r}}),Qt({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=Ft(e[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:a}))return r.formatUnsupportedCmd("\\url");for(var n=[],i=0;i<a.length;i++){var o=a[i];"~"===o&&(o="\\textasciitilde"),n.push({type:"textord",mode:"text",text:o})}var s={type:"text",mode:r.mode,font:"\\texttt",body:n};return{type:"href",mode:r.mode,href:a,body:ee(s)}}}),Qt({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:function(t,e){return{type:"htmlmathml",mode:t.parser.mode,html:ee(e[0]),mathml:ee(e[1])}},htmlBuilder:function(t,e){var r=se(t.html,e,!1);return Dt.makeFragment(r)},mathmlBuilder:function(t,e){return Se(t.mathml,e)}});var Pr=function(t){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(t))return{number:+t,unit:"bp"};var e=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(t);if(!e)throw new o("Invalid size: '"+t+"' in \\includegraphics");var r={number:+(e[1]+e[2]),unit:e[3]};if(!At(r))throw new o("Invalid unit: '"+r.unit+"' in \\includegraphics.");return r};Qt({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:function(t,e,r){var a=t.parser,n={number:0,unit:"em"},i={number:.9,unit:"em"},s={number:0,unit:"em"},h="";if(r[0])for(var l=Ft(r[0],"raw").string.split(","),m=0;m<l.length;m++){var c=l[m].split("=");if(2===c.length){var u=c[1].trim();switch(c[0].trim()){case"alt":h=u;break;case"width":n=Pr(u);break;case"height":i=Pr(u);break;case"totalheight":s=Pr(u);break;default:throw new o("Invalid key: '"+c[0]+"' in \\includegraphics.")}}}var p=Ft(e[0],"url").url;return""===h&&(h=(h=(h=p).replace(/^.*[\\\/]/,"")).substring(0,h.lastIndexOf("."))),a.settings.isTrusted({command:"\\includegraphics",url:p})?{type:"includegraphics",mode:a.mode,alt:h,width:n,height:i,totalheight:s,src:p}:a.formatUnsupportedCmd("\\includegraphics")},htmlBuilder:function(t,e){var r=Tt(t.height,e),a=0;t.totalheight.number>0&&(a=Tt(t.totalheight,e)-r,a=Number(a.toFixed(2)));var n=0;t.width.number>0&&(n=Tt(t.width,e));var i={height:r+a+"em"};n>0&&(i.width=n+"em"),a>0&&(i.verticalAlign=-a+"em");var o=new R(t.src,t.alt,i);return o.height=r,o.depth=a,o},mathmlBuilder:function(t,e){var r=new ve.MathNode("mglyph",[]);r.setAttribute("alt",t.alt);var a=Tt(t.height,e),n=0;if(t.totalheight.number>0&&(n=(n=Tt(t.totalheight,e)-a).toFixed(2),r.setAttribute("valign","-"+n+"em")),r.setAttribute("height",a+n+"em"),t.width.number>0){var i=Tt(t.width,e);r.setAttribute("width",i+"em")}return r.setAttribute("src",t.src),r}}),Qt({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=Ft(e[0],"size");if(r.settings.strict){var i="m"===a[1],o="mu"===n.value.unit;i?(o||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" supports only mu units, not "+n.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" works only in math mode")):o&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:n.value}},htmlBuilder:function(t,e){return Dt.makeGlue(t.dimension,e)},mathmlBuilder:function(t,e){var r=Tt(t.dimension,e);return new ve.SpaceNode(r)}}),Qt({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"lap",mode:r.mode,alignment:a.slice(5),body:n}},htmlBuilder:function(t,e){var r;"clap"===t.alignment?(r=Dt.makeSpan([],[ue(t.body,e)]),r=Dt.makeSpan(["inner"],[r],e)):r=Dt.makeSpan(["inner"],[ue(t.body,e)]);var a=Dt.makeSpan(["fix"],[]),n=Dt.makeSpan([t.alignment],[r,a],e),i=Dt.makeSpan(["strut"]);return i.style.height=n.height+n.depth+"em",i.style.verticalAlign=-n.depth+"em",n.children.unshift(i),n=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:n}]},e),Dt.makeSpan(["mord"],[n],e)},mathmlBuilder:function(t,e){var r=new ve.MathNode("mpadded",[Me(t.body,e)]);if("rlap"!==t.alignment){var a="llap"===t.alignment?"-1":"-0.5";r.setAttribute("lspace",a+"width")}return r.setAttribute("width","0px"),r}}),Qt({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(t,e){var r=t.funcName,a=t.parser,n=a.mode;a.switchMode("math");var i="\\("===r?"\\)":"$",o=a.parseExpression(!1,i);return a.expect(i),a.switchMode(n),{type:"styling",mode:a.mode,style:"text",body:o}}}),Qt({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(t,e){throw new o("Mismatched "+t.funcName)}});var Dr=function(t,e){switch(e.style.size){case w.DISPLAY.size:return t.display;case w.TEXT.size:return t.text;case w.SCRIPT.size:return t.script;case w.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}};Qt({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4},handler:function(t,e){return{type:"mathchoice",mode:t.parser.mode,display:ee(e[0]),text:ee(e[1]),script:ee(e[2]),scriptscript:ee(e[3])}},htmlBuilder:function(t,e){var r=Dr(t,e),a=se(r,e,!1);return Dt.makeFragment(a)},mathmlBuilder:function(t,e){var r=Dr(t,e);return Se(r,e)}});var Fr=function(t,e,r,a,n,i,o){var s,h,l;if(t=Dt.makeSpan([],[t]),e){var m=ue(e,a.havingStyle(n.sup()),a);h={elem:m,kern:Math.max(a.fontMetrics().bigOpSpacing1,a.fontMetrics().bigOpSpacing3-m.depth)}}if(r){var c=ue(r,a.havingStyle(n.sub()),a);s={elem:c,kern:Math.max(a.fontMetrics().bigOpSpacing2,a.fontMetrics().bigOpSpacing4-c.height)}}if(h&&s){var u=a.fontMetrics().bigOpSpacing5+s.elem.height+s.elem.depth+s.kern+t.depth+o;l=Dt.makeVList({positionType:"bottom",positionData:u,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:-i+"em"},{type:"kern",size:s.kern},{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:i+"em"},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}else if(s){var p=t.height-o;l=Dt.makeVList({positionType:"top",positionData:p,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:-i+"em"},{type:"kern",size:s.kern},{type:"elem",elem:t}]},a)}else{if(!h)return t;var d=t.depth+o;l=Dt.makeVList({positionType:"bottom",positionData:d,children:[{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:i+"em"},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}return Dt.makeSpan(["mop","op-limits"],[l],a)},Vr=["\\smallint"],Ur=function(t,e){var r,a,n,i=!1,o=Vt(t,"supsub");o?(r=o.sup,a=o.sub,n=Ft(o.base,"op"),i=!0):n=Ft(t,"op");var s,h=e.style,l=!1;if(h.size===w.DISPLAY.size&&n.symbol&&!c.contains(Vr,n.name)&&(l=!0),n.symbol){var m=l?"Size2-Regular":"Size1-Regular",u="";if("\\oiint"!==n.name&&"\\oiiint"!==n.name||(u=n.name.substr(1),n.name="oiint"===u?"\\iint":"\\iiint"),s=Dt.makeSymbol(n.name,m,"math",e,["mop","op-symbol",l?"large-op":"small-op"]),u.length>0){var p=s.italic,d=Dt.staticSvg(u+"Size"+(l?"2":"1"),e);s=Dt.makeVList({positionType:"individualShift",children:[{type:"elem",elem:s,shift:0},{type:"elem",elem:d,shift:l?.08:0}]},e),n.name="\\"+u,s.classes.unshift("mop"),s.italic=p}}else if(n.body){var f=se(n.body,e,!0);1===f.length&&f[0]instanceof E?(s=f[0]).classes[0]="mop":s=Dt.makeSpan(["mop"],Dt.tryCombineChars(f),e)}else{for(var g=[],x=1;x<n.name.length;x++)g.push(Dt.mathsym(n.name[x],n.mode,e));s=Dt.makeSpan(["mop"],g,e)}var v=0,b=0;return(s instanceof E||"\\oiint"===n.name||"\\oiiint"===n.name)&&!n.suppressBaseShift&&(v=(s.height-s.depth)/2-e.fontMetrics().axisHeight,b=s.italic),i?Fr(s,r,a,e,h,b,v):(v&&(s.style.position="relative",s.style.top=v+"em"),s)},Gr=function(t,e){var r;if(t.symbol)r=new ge("mo",[be(t.name,t.mode)]),c.contains(Vr,t.name)&&r.setAttribute("largeop","false");else if(t.body)r=new ge("mo",ke(t.body,e));else{r=new ge("mi",[new xe(t.name.slice(1))]);var a=new ge("mo",[be("\u2061","text")]);r=t.parentIsSupSub?new ge("mo",[r,a]):fe([r,a])}return r},Yr={"\u220f":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22c0":"\\bigwedge","\u22c1":"\\bigvee","\u22c2":"\\bigcap","\u22c3":"\\bigcup","\u2a00":"\\bigodot","\u2a01":"\\bigoplus","\u2a02":"\\bigotimes","\u2a04":"\\biguplus","\u2a06":"\\bigsqcup"};Qt({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220f","\u2210","\u2211","\u22c0","\u22c1","\u22c2","\u22c3","\u2a00","\u2a01","\u2a02","\u2a04","\u2a06"],props:{numArgs:0},handler:function(t,e){var r=t.parser,a=t.funcName;return 1===a.length&&(a=Yr[a]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:Ur,mathmlBuilder:Gr}),Qt({type:"op",names:["\\mathop"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:ee(a)}},htmlBuilder:Ur,mathmlBuilder:Gr});var Wr={"\u222b":"\\int","\u222c":"\\iint","\u222d":"\\iiint","\u222e":"\\oint","\u222f":"\\oiint","\u2230":"\\oiiint"};Qt({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Ur,mathmlBuilder:Gr}),Qt({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Ur,mathmlBuilder:Gr}),Qt({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222b","\u222c","\u222d","\u222e","\u222f","\u2230"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return 1===r.length&&(r=Wr[r]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:r}},htmlBuilder:Ur,mathmlBuilder:Gr});var Xr=function(t,e){var r,a,n,i,o=!1,s=Vt(t,"supsub");if(s?(r=s.sup,a=s.sub,n=Ft(s.base,"operatorname"),o=!0):n=Ft(t,"operatorname"),n.body.length>0){for(var h=n.body.map(function(t){var e=t.text;return"string"==typeof e?{type:"textord",mode:t.mode,text:e}:t}),l=se(h,e.withFont("mathrm"),!0),m=0;m<l.length;m++){var c=l[m];c instanceof E&&(c.text=c.text.replace(/\u2212/,"-").replace(/\u2217/,"*"))}i=Dt.makeSpan(["mop"],l,e)}else i=Dt.makeSpan(["mop"],[],e);return o?Fr(i,r,a,e,e.style,0,0):i};function _r(t,e,r){for(var a=se(t,e,!1),n=e.sizeMultiplier/r.sizeMultiplier,i=0;i<a.length;i++){var o=a[i].classes.indexOf("sizing");o<0?Array.prototype.push.apply(a[i].classes,e.sizingClasses(r)):a[i].classes[o+1]==="reset-size"+e.size&&(a[i].classes[o+1]="reset-size"+r.size),a[i].height*=n,a[i].depth*=n}return Dt.makeFragment(a)}Qt({type:"operatorname",names:["\\operatorname","\\operatorname*"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"operatorname",mode:r.mode,body:ee(n),alwaysHandleSupSub:"\\operatorname*"===a,limits:!1,parentIsSupSub:!1}},htmlBuilder:Xr,mathmlBuilder:function(t,e){for(var r=ke(t.body,e.withFont("mathrm")),a=!0,n=0;n<r.length;n++){var i=r[n];if(i instanceof ve.SpaceNode);else if(i instanceof ve.MathNode)switch(i.type){case"mi":case"mn":case"ms":case"mspace":case"mtext":break;case"mo":var o=i.children[0];1===i.children.length&&o instanceof ve.TextNode?o.text=o.text.replace(/\u2212/,"-").replace(/\u2217/,"*"):a=!1;break;default:a=!1}else a=!1}if(a){var s=r.map(function(t){return t.toText()}).join("");r=[new ve.TextNode(s)]}var h=new ve.MathNode("mi",r);h.setAttribute("mathvariant","normal");var l=new ve.MathNode("mo",[be("\u2061","text")]);return t.parentIsSupSub?new ve.MathNode("mo",[h,l]):ve.newDocumentFragment([h,l])}}),te({type:"ordgroup",htmlBuilder:function(t,e){return t.semisimple?Dt.makeFragment(se(t.body,e,!1)):Dt.makeSpan(["mord"],se(t.body,e,!0),e)},mathmlBuilder:function(t,e){return Se(t.body,e,!0)}}),Qt({type:"overline",names:["\\overline"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:"overline",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=ue(t.body,e.havingCrampedStyle()),a=Dt.makeLineSpan("overline-line",e),n=e.fontMetrics().defaultRuleThickness,i=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*n},{type:"elem",elem:a},{type:"kern",size:n}]},e);return Dt.makeSpan(["mord","overline"],[i],e)},mathmlBuilder:function(t,e){var r=new ve.MathNode("mo",[new ve.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new ve.MathNode("mover",[Me(t.body,e),r]);return a.setAttribute("accent","true"),a}}),Qt({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:"phantom",mode:r.mode,body:ee(a)}},htmlBuilder:function(t,e){var r=se(t.body,e.withPhantom(),!1);return Dt.makeFragment(r)},mathmlBuilder:function(t,e){var r=ke(t.body,e);return new ve.MathNode("mphantom",r)}}),Qt({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:"hphantom",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=Dt.makeSpan([],[ue(t.body,e.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var a=0;a<r.children.length;a++)r.children[a].height=0,r.children[a].depth=0;return r=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r}]},e),Dt.makeSpan(["mord"],[r],e)},mathmlBuilder:function(t,e){var r=ke(ee(t.body),e),a=new ve.MathNode("mphantom",r),n=new ve.MathNode("mpadded",[a]);return n.setAttribute("height","0px"),n.setAttribute("depth","0px"),n}}),Qt({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:"vphantom",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=Dt.makeSpan(["inner"],[ue(t.body,e.withPhantom())]),a=Dt.makeSpan(["fix"],[]);return Dt.makeSpan(["mord","rlap"],[r,a],e)},mathmlBuilder:function(t,e){var r=ke(ee(t.body),e),a=new ve.MathNode("mphantom",r),n=new ve.MathNode("mpadded",[a]);return n.setAttribute("width","0px"),n}}),Qt({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=Ft(e[0],"size").value,n=e[1];return{type:"raisebox",mode:r.mode,dy:a,body:n}},htmlBuilder:function(t,e){var r=ue(t.body,e),a=Tt(t.dy,e);return Dt.makeVList({positionType:"shift",positionData:-a,children:[{type:"elem",elem:r}]},e)},mathmlBuilder:function(t,e){var r=new ve.MathNode("mpadded",[Me(t.body,e)]),a=t.dy.number+t.dy.unit;return r.setAttribute("voffset",a),r}}),Qt({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},handler:function(t,e,r){var a=t.parser,n=r[0],i=Ft(e[0],"size"),o=Ft(e[1],"size");return{type:"rule",mode:a.mode,shift:n&&Ft(n,"size").value,width:i.value,height:o.value}},htmlBuilder:function(t,e){var r=Dt.makeSpan(["mord","rule"],[],e),a=Tt(t.width,e),n=Tt(t.height,e),i=t.shift?Tt(t.shift,e):0;return r.style.borderRightWidth=a+"em",r.style.borderTopWidth=n+"em",r.style.bottom=i+"em",r.width=a,r.height=n+i,r.depth=-i,r.maxFontSize=1.125*n*e.sizeMultiplier,r},mathmlBuilder:function(t,e){var r=Tt(t.width,e),a=Tt(t.height,e),n=t.shift?Tt(t.shift,e):0,i=e.color&&e.getColor()||"black",o=new ve.MathNode("mspace");o.setAttribute("mathbackground",i),o.setAttribute("width",r+"em"),o.setAttribute("height",a+"em");var s=new ve.MathNode("mpadded",[o]);return n>=0?s.setAttribute("height","+"+n+"em"):(s.setAttribute("height",n+"em"),s.setAttribute("depth","+"+-n+"em")),s.setAttribute("voffset",n+"em"),s}});var jr=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];Qt({type:"sizing",names:jr,props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,i=n.parseExpression(!1,r);return{type:"sizing",mode:n.mode,size:jr.indexOf(a)+1,body:i}},htmlBuilder:function(t,e){var r=e.havingSize(t.size);return _r(t.body,r,e)},mathmlBuilder:function(t,e){var r=e.havingSize(t.size),a=ke(t.body,r),n=new ve.MathNode("mstyle",a);return n.setAttribute("mathsize",r.sizeMultiplier+"em"),n}}),Qt({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(t,e,r){var a=t.parser,n=!1,i=!1,o=r[0]&&Ft(r[0],"ordgroup");if(o)for(var s="",h=0;h<o.body.length;++h){if("t"===(s=o.body[h].text))n=!0;else{if("b"!==s){n=!1,i=!1;break}i=!0}}else n=!0,i=!0;var l=e[0];return{type:"smash",mode:a.mode,body:l,smashHeight:n,smashDepth:i}},htmlBuilder:function(t,e){var r=Dt.makeSpan([],[ue(t.body,e)]);if(!t.smashHeight&&!t.smashDepth)return r;if(t.smashHeight&&(r.height=0,r.children))for(var a=0;a<r.children.length;a++)r.children[a].height=0;if(t.smashDepth&&(r.depth=0,r.children))for(var n=0;n<r.children.length;n++)r.children[n].depth=0;var i=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r}]},e);return Dt.makeSpan(["mord"],[i],e)},mathmlBuilder:function(t,e){var r=new ve.MathNode("mpadded",[Me(t.body,e)]);return t.smashHeight&&r.setAttribute("height","0px"),t.smashDepth&&r.setAttribute("depth","0px"),r}}),Qt({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler:function(t,e,r){var a=t.parser,n=r[0],i=e[0];return{type:"sqrt",mode:a.mode,body:i,index:n}},htmlBuilder:function(t,e){var r=ue(t.body,e.havingCrampedStyle());0===r.height&&(r.height=e.fontMetrics().xHeight),r=Dt.wrapFragment(r,e);var a=e.fontMetrics().defaultRuleThickness,n=a;e.style.id<w.TEXT.id&&(n=e.fontMetrics().xHeight);var i=a+n/4,o=r.height+r.depth+i+a,s=ir(o,e),h=s.span,l=s.ruleWidth,m=s.advanceWidth,c=h.height-l;c>r.height+r.depth+i&&(i=(i+c-r.height-r.depth)/2);var u=h.height-r.height-i-l;r.style.paddingLeft=m+"em";var p=Dt.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+u)},{type:"elem",elem:h},{type:"kern",size:l}]},e);if(t.index){var d=e.havingStyle(w.SCRIPTSCRIPT),f=ue(t.index,d,e),g=.6*(p.height-p.depth),x=Dt.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:f}]},e),v=Dt.makeSpan(["root"],[x]);return Dt.makeSpan(["mord","sqrt"],[v,p],e)}return Dt.makeSpan(["mord","sqrt"],[p],e)},mathmlBuilder:function(t,e){var r=t.body,a=t.index;return a?new ve.MathNode("mroot",[Me(r,e),Me(a,e)]):new ve.MathNode("msqrt",[Me(r,e)])}});var $r={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT};Qt({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,i=n.parseExpression(!0,r),o=a.slice(1,a.length-5);return{type:"styling",mode:n.mode,style:o,body:i}},htmlBuilder:function(t,e){var r=$r[t.style],a=e.havingStyle(r).withFont("");return _r(t.body,a,e)},mathmlBuilder:function(t,e){var r=$r[t.style],a=e.havingStyle(r),n=ke(t.body,a),i=new ve.MathNode("mstyle",n),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[t.style];return i.setAttribute("scriptlevel",o[0]),i.setAttribute("displaystyle",o[1]),i}});te({type:"supsub",htmlBuilder:function(t,e){var r=function(t,e){var r=t.base;return r?"op"===r.type?r.limits&&(e.style.size===w.DISPLAY.size||r.alwaysHandleSupSub)?Ur:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(e.style.size===w.DISPLAY.size||r.limits)?Xr:null:"accent"===r.type?c.isCharacterBox(r.base)?Ee:null:"horizBrace"===r.type&&!t.sub===r.isOver?Hr:null:null}(t,e);if(r)return r(t,e);var a,n,i,o=t.base,s=t.sup,h=t.sub,l=ue(o,e),m=e.fontMetrics(),u=0,p=0,d=o&&c.isCharacterBox(o);if(s){var f=e.havingStyle(e.style.sup());a=ue(s,f,e),d||(u=l.height-f.fontMetrics().supDrop*f.sizeMultiplier/e.sizeMultiplier)}if(h){var g=e.havingStyle(e.style.sub());n=ue(h,g,e),d||(p=l.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}i=e.style===w.DISPLAY?m.sup1:e.style.cramped?m.sup3:m.sup2;var x,v=e.sizeMultiplier,b=.5/m.ptPerEm/v+"em",y=null;if(n){var k=t.base&&"op"===t.base.type&&t.base.name&&("\\oiint"===t.base.name||"\\oiiint"===t.base.name);(l instanceof E||k)&&(y=-l.italic+"em")}if(a&&n){u=Math.max(u,i,a.depth+.25*m.xHeight),p=Math.max(p,m.sub2);var S=4*m.defaultRuleThickness;if(u-a.depth-(n.height-p)<S){p=S-(u-a.depth)+n.height;var M=.8*m.xHeight-(u-a.depth);M>0&&(u+=M,p-=M)}var z=[{type:"elem",elem:n,shift:p,marginRight:b,marginLeft:y},{type:"elem",elem:a,shift:-u,marginRight:b}];x=Dt.makeVList({positionType:"individualShift",children:z},e)}else if(n){p=Math.max(p,m.sub1,n.height-.8*m.xHeight);var A=[{type:"elem",elem:n,marginLeft:y,marginRight:b}];x=Dt.makeVList({positionType:"shift",positionData:p,children:A},e)}else{if(!a)throw new Error("supsub must have either sup or sub.");u=Math.max(u,i,a.depth+.25*m.xHeight),x=Dt.makeVList({positionType:"shift",positionData:-u,children:[{type:"elem",elem:a,marginRight:b}]},e)}var T=me(l,"right")||"mord";return Dt.makeSpan([T],[l,Dt.makeSpan(["msupsub"],[x])],e)},mathmlBuilder:function(t,e){var r,a=!1,n=Vt(t.base,"horizBrace");n&&!!t.sup===n.isOver&&(a=!0,r=n.isOver),!t.base||"op"!==t.base.type&&"operatorname"!==t.base.type||(t.base.parentIsSupSub=!0);var i,o=[Me(t.base,e)];if(t.sub&&o.push(Me(t.sub,e)),t.sup&&o.push(Me(t.sup,e)),a)i=r?"mover":"munder";else if(t.sub)if(t.sup){var s=t.base;i=s&&"op"===s.type&&s.limits&&e.style===w.DISPLAY?"munderover":s&&"operatorname"===s.type&&s.alwaysHandleSupSub&&(e.style===w.DISPLAY||s.limits)?"munderover":"msubsup"}else{var h=t.base;i=h&&"op"===h.type&&h.limits&&(e.style===w.DISPLAY||h.alwaysHandleSupSub)?"munder":h&&"operatorname"===h.type&&h.alwaysHandleSupSub&&(h.limits||e.style===w.DISPLAY)?"munder":"msub"}else{var l=t.base;i=l&&"op"===l.type&&l.limits&&(e.style===w.DISPLAY||l.alwaysHandleSupSub)?"mover":l&&"operatorname"===l.type&&l.alwaysHandleSupSub&&(l.limits||e.style===w.DISPLAY)?"mover":"msup"}return new ve.MathNode(i,o)}}),te({type:"atom",htmlBuilder:function(t,e){return Dt.mathsym(t.text,t.mode,e,["m"+t.family])},mathmlBuilder:function(t,e){var r=new ve.MathNode("mo",[be(t.text,t.mode)]);if("bin"===t.family){var a=we(t,e);"bold-italic"===a&&r.setAttribute("mathvariant",a)}else"punct"===t.family?r.setAttribute("separator","true"):"open"!==t.family&&"close"!==t.family||r.setAttribute("stretchy","false");return r}});var Zr={mi:"italic",mn:"normal",mtext:"normal"};te({type:"mathord",htmlBuilder:function(t,e){return Dt.makeOrd(t,e,"mathord")},mathmlBuilder:function(t,e){var r=new ve.MathNode("mi",[be(t.text,t.mode,e)]),a=we(t,e)||"italic";return a!==Zr[r.type]&&r.setAttribute("mathvariant",a),r}}),te({type:"textord",htmlBuilder:function(t,e){return Dt.makeOrd(t,e,"textord")},mathmlBuilder:function(t,e){var r,a=be(t.text,t.mode,e),n=we(t,e)||"normal";return r="text"===t.mode?new ve.MathNode("mtext",[a]):/[0-9]/.test(t.text)?new ve.MathNode("mn",[a]):"\\prime"===t.text?new ve.MathNode("mo",[a]):new ve.MathNode("mi",[a]),n!==Zr[r.type]&&r.setAttribute("mathvariant",n),r}});var Kr={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},Jr={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};te({type:"spacing",htmlBuilder:function(t,e){if(Jr.hasOwnProperty(t.text)){var r=Jr[t.text].className||"";if("text"===t.mode){var a=Dt.makeOrd(t,e,"textord");return a.classes.push(r),a}return Dt.makeSpan(["mspace",r],[Dt.mathsym(t.text,t.mode,e)],e)}if(Kr.hasOwnProperty(t.text))return Dt.makeSpan(["mspace",Kr[t.text]],[],e);throw new o('Unknown type of space "'+t.text+'"')},mathmlBuilder:function(t,e){if(!Jr.hasOwnProperty(t.text)){if(Kr.hasOwnProperty(t.text))return new ve.MathNode("mspace");throw new o('Unknown type of space "'+t.text+'"')}return new ve.MathNode("mtext",[new ve.TextNode("\xa0")])}});var Qr=function(){var t=new ve.MathNode("mtd",[]);return t.setAttribute("width","50%"),t};te({type:"tag",mathmlBuilder:function(t,e){var r=new ve.MathNode("mtable",[new ve.MathNode("mtr",[Qr(),new ve.MathNode("mtd",[Se(t.body,e)]),Qr(),new ve.MathNode("mtd",[Se(t.tag,e)])])]);return r.setAttribute("width","100%"),r}});var ta={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},ea={"\\textbf":"textbf","\\textmd":"textmd"},ra={"\\textit":"textit","\\textup":"textup"},aa=function(t,e){var r=t.font;return r?ta[r]?e.withTextFontFamily(ta[r]):ea[r]?e.withTextFontWeight(ea[r]):e.withTextFontShape(ra[r]):e};Qt({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],greediness:2,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:"text",mode:r.mode,body:ee(n),font:a}},htmlBuilder:function(t,e){var r=aa(t,e),a=se(t.body,r,!0);return Dt.makeSpan(["mord","text"],Dt.tryCombineChars(a),r)},mathmlBuilder:function(t,e){var r=aa(t,e);return Se(t.body,r)}}),Qt({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){return{type:"underline",mode:t.parser.mode,body:e[0]}},htmlBuilder:function(t,e){var r=ue(t.body,e),a=Dt.makeLineSpan("underline-line",e),n=e.fontMetrics().defaultRuleThickness,i=Dt.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:n},{type:"elem",elem:a},{type:"kern",size:3*n},{type:"elem",elem:r}]},e);return Dt.makeSpan(["mord","underline"],[i],e)},mathmlBuilder:function(t,e){var r=new ve.MathNode("mo",[new ve.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new ve.MathNode("munder",[Me(t.body,e),r]);return a.setAttribute("accentunder","true"),a}}),Qt({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(t,e,r){throw new o("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(t,e){for(var r=na(t),a=[],n=e.havingStyle(e.style.text()),i=0;i<r.length;i++){var o=r[i];"~"===o&&(o="\\textasciitilde"),a.push(Dt.makeSymbol(o,"Typewriter-Regular",t.mode,n,["mord","texttt"]))}return Dt.makeSpan(["mord","text"].concat(n.sizingClasses(e)),Dt.tryCombineChars(a),n)},mathmlBuilder:function(t,e){var r=new ve.TextNode(na(t)),a=new ve.MathNode("mtext",[r]);return a.setAttribute("mathvariant","monospace"),a}});var na=function(t){return t.body.replace(/ /g,t.star?"\u2423":"\xa0")},ia=Zt,oa=new RegExp("^(\\\\[a-zA-Z@]+)[ \r\n\t]*$"),sa=new RegExp("[\u0300-\u036f]+$"),ha="([ \r\n\t]+)|([!-\\[\\]-\u2027\u202a-\ud7ff\uf900-\uffff][\u0300-\u036f]*|[\ud800-\udbff][\udc00-\udfff][\u0300-\u036f]*|\\\\verb\\*([^]).*?\\3|\\\\verb([^*a-zA-Z]).*?\\4|\\\\operatorname\\*|\\\\[a-zA-Z@]+[ \r\n\t]*|\\\\[^\ud800-\udfff])",la=function(){function t(t,e){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=t,this.settings=e,this.tokenRegex=new RegExp(ha,"g"),this.catcodes={"%":14}}var e=t.prototype;return e.setCatcode=function(t,e){this.catcodes[t]=e},e.lex=function(){var t=this.input,e=this.tokenRegex.lastIndex;if(e===t.length)return new n("EOF",new a(this,e,e));var r=this.tokenRegex.exec(t);if(null===r||r.index!==e)throw new o("Unexpected character: '"+t[e]+"'",new n(t[e],new a(this,e,e+1)));var i=r[2]||" ";if(14===this.catcodes[i]){var s=t.indexOf("\n",this.tokenRegex.lastIndex);return-1===s?(this.tokenRegex.lastIndex=t.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=s+1,this.lex()}var h=i.match(oa);return h&&(i=h[1]),new n(i,new a(this,e,this.tokenRegex.lastIndex))},t}(),ma=function(){function t(t,e){void 0===t&&(t={}),void 0===e&&(e={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=e,this.builtins=t,this.undefStack=[]}var e=t.prototype;return e.beginGroup=function(){this.undefStack.push({})},e.endGroup=function(){if(0===this.undefStack.length)throw new o("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var t=this.undefStack.pop();for(var e in t)t.hasOwnProperty(e)&&(void 0===t[e]?delete this.current[e]:this.current[e]=t[e])},e.has=function(t){return this.current.hasOwnProperty(t)||this.builtins.hasOwnProperty(t)},e.get=function(t){return this.current.hasOwnProperty(t)?this.current[t]:this.builtins[t]},e.set=function(t,e,r){if(void 0===r&&(r=!1),r){for(var a=0;a<this.undefStack.length;a++)delete this.undefStack[a][t];this.undefStack.length>0&&(this.undefStack[this.undefStack.length-1][t]=e)}else{var n=this.undefStack[this.undefStack.length-1];n&&!n.hasOwnProperty(t)&&(n[t]=this.current[t])}this.current[t]=e},t}(),ca={},ua=ca;function pa(t,e){ca[t]=e}pa("\\@firstoftwo",function(t){return{tokens:t.consumeArgs(2)[0],numArgs:0}}),pa("\\@secondoftwo",function(t){return{tokens:t.consumeArgs(2)[1],numArgs:0}}),pa("\\@ifnextchar",function(t){var e=t.consumeArgs(3),r=t.future();return 1===e[0].length&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}}),pa("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),pa("\\TextOrMath",function(t){var e=t.consumeArgs(2);return"text"===t.mode?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var da={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};pa("\\char",function(t){var e,r=t.popToken(),a="";if("'"===r.text)e=8,r=t.popToken();else if('"'===r.text)e=16,r=t.popToken();else if("`"===r.text)if("\\"===(r=t.popToken()).text[0])a=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new o("\\char` missing argument");a=r.text.charCodeAt(0)}else e=10;if(e){if(null==(a=da[r.text])||a>=e)throw new o("Invalid base-"+e+" digit "+r.text);for(var n;null!=(n=da[t.future().text])&&n<e;)a*=e,a+=n,t.popToken()}return"\\@char{"+a+"}"});var fa=function(t,e){var r=t.consumeArgs(1)[0];if(1!==r.length)throw new o("\\gdef's first argument must be a macro name");var a=r[0].text,n=0;for(r=t.consumeArgs(1)[0];1===r.length&&"#"===r[0].text;){if(1!==(r=t.consumeArgs(1)[0]).length)throw new o('Invalid argument number length "'+r.length+'"');if(!/^[1-9]$/.test(r[0].text))throw new o('Invalid argument number "'+r[0].text+'"');if(n++,parseInt(r[0].text)!==n)throw new o('Argument number "'+r[0].text+'" out of order');r=t.consumeArgs(1)[0]}return t.macros.set(a,{tokens:r,numArgs:n},e),""};pa("\\gdef",function(t){return fa(t,!0)}),pa("\\def",function(t){return fa(t,!1)}),pa("\\global",function(t){var e=t.consumeArgs(1)[0];if(1!==e.length)throw new o("Invalid command after \\global");var r=e[0].text;if("\\def"===r)return fa(t,!0);throw new o("Invalid command '"+r+"' after \\global")});var ga=function(t,e,r){var a=t.consumeArgs(1)[0];if(1!==a.length)throw new o("\\newcommand's first argument must be a macro name");var n=a[0].text,i=t.isDefined(n);if(i&&!e)throw new o("\\newcommand{"+n+"} attempting to redefine "+n+"; use \\renewcommand");if(!i&&!r)throw new o("\\renewcommand{"+n+"} when command "+n+" does not yet exist; use \\newcommand");var s=0;if(1===(a=t.consumeArgs(1)[0]).length&&"["===a[0].text){for(var h="",l=t.expandNextToken();"]"!==l.text&&"EOF"!==l.text;)h+=l.text,l=t.expandNextToken();if(!h.match(/^\s*[0-9]+\s*$/))throw new o("Invalid number of arguments: "+h);s=parseInt(h),a=t.consumeArgs(1)[0]}return t.macros.set(n,{tokens:a,numArgs:s}),""};pa("\\newcommand",function(t){return ga(t,!1,!0)}),pa("\\renewcommand",function(t){return ga(t,!0,!1)}),pa("\\providecommand",function(t){return ga(t,!0,!0)}),pa("\\bgroup","{"),pa("\\egroup","}"),pa("\\lq","`"),pa("\\rq","'"),pa("\\aa","\\r a"),pa("\\AA","\\r A"),pa("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xa9}"),pa("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),pa("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xae}"),pa("\u212c","\\mathscr{B}"),pa("\u2130","\\mathscr{E}"),pa("\u2131","\\mathscr{F}"),pa("\u210b","\\mathscr{H}"),pa("\u2110","\\mathscr{I}"),pa("\u2112","\\mathscr{L}"),pa("\u2133","\\mathscr{M}"),pa("\u211b","\\mathscr{R}"),pa("\u212d","\\mathfrak{C}"),pa("\u210c","\\mathfrak{H}"),pa("\u2128","\\mathfrak{Z}"),pa("\\Bbbk","\\Bbb{k}"),pa("\xb7","\\cdotp"),pa("\\llap","\\mathllap{\\textrm{#1}}"),pa("\\rlap","\\mathrlap{\\textrm{#1}}"),pa("\\clap","\\mathclap{\\textrm{#1}}"),pa("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'),pa("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}"),pa("\\ne","\\neq"),pa("\u2260","\\neq"),pa("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}"),pa("\u2209","\\notin"),pa("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}"),pa("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"),pa("\u225a","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225a}}"),pa("\u225b","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225b}}"),pa("\u225d","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225d}}"),pa("\u225e","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225e}}"),pa("\u225f","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225f}}"),pa("\u27c2","\\perp"),pa("\u203c","\\mathclose{!\\mkern-0.8mu!}"),pa("\u220c","\\notni"),pa("\u231c","\\ulcorner"),pa("\u231d","\\urcorner"),pa("\u231e","\\llcorner"),pa("\u231f","\\lrcorner"),pa("\xa9","\\copyright"),pa("\xae","\\textregistered"),pa("\ufe0f","\\textregistered"),pa("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}"),pa("\u22ee","\\vdots"),pa("\\varGamma","\\mathit{\\Gamma}"),pa("\\varDelta","\\mathit{\\Delta}"),pa("\\varTheta","\\mathit{\\Theta}"),pa("\\varLambda","\\mathit{\\Lambda}"),pa("\\varXi","\\mathit{\\Xi}"),pa("\\varPi","\\mathit{\\Pi}"),pa("\\varSigma","\\mathit{\\Sigma}"),pa("\\varUpsilon","\\mathit{\\Upsilon}"),pa("\\varPhi","\\mathit{\\Phi}"),pa("\\varPsi","\\mathit{\\Psi}"),pa("\\varOmega","\\mathit{\\Omega}"),pa("\\substack","\\begin{subarray}{c}#1\\end{subarray}"),pa("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"),pa("\\boxed","\\fbox{$\\displaystyle{#1}$}"),pa("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),pa("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),pa("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");var xa={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};pa("\\dots",function(t){var e="\\dotso",r=t.expandAfterFuture().text;return r in xa?e=xa[r]:"\\not"===r.substr(0,4)?e="\\dotsb":r in j.math&&c.contains(["bin","rel"],j.math[r].group)&&(e="\\dotsb"),e});var va={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};pa("\\dotso",function(t){return t.future().text in va?"\\ldots\\,":"\\ldots"}),pa("\\dotsc",function(t){var e=t.future().text;return e in va&&","!==e?"\\ldots\\,":"\\ldots"}),pa("\\cdots",function(t){return t.future().text in va?"\\@cdots\\,":"\\@cdots"}),pa("\\dotsb","\\cdots"),pa("\\dotsm","\\cdots"),pa("\\dotsi","\\!\\cdots"),pa("\\dotsx","\\ldots\\,"),pa("\\DOTSI","\\relax"),pa("\\DOTSB","\\relax"),pa("\\DOTSX","\\relax"),pa("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),pa("\\,","\\tmspace+{3mu}{.1667em}"),pa("\\thinspace","\\,"),pa("\\>","\\mskip{4mu}"),pa("\\:","\\tmspace+{4mu}{.2222em}"),pa("\\medspace","\\:"),pa("\\;","\\tmspace+{5mu}{.2777em}"),pa("\\thickspace","\\;"),pa("\\!","\\tmspace-{3mu}{.1667em}"),pa("\\negthinspace","\\!"),pa("\\negmedspace","\\tmspace-{4mu}{.2222em}"),pa("\\negthickspace","\\tmspace-{5mu}{.277em}"),pa("\\enspace","\\kern.5em "),pa("\\enskip","\\hskip.5em\\relax"),pa("\\quad","\\hskip1em\\relax"),pa("\\qquad","\\hskip2em\\relax"),pa("\\tag","\\@ifstar\\tag@literal\\tag@paren"),pa("\\tag@paren","\\tag@literal{({#1})}"),pa("\\tag@literal",function(t){if(t.macros.get("\\df@tag"))throw new o("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"}),pa("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),pa("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),pa("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),pa("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),pa("\\pmb","\\html@mathml{\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}{\\mathbf{#1}}"),pa("\\\\","\\newline"),pa("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var ba=F["Main-Regular"]["T".charCodeAt(0)][1]-.7*F["Main-Regular"]["A".charCodeAt(0)][1]+"em";pa("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+ba+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),pa("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+ba+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),pa("\\hspace","\\@ifstar\\@hspacer\\@hspace"),pa("\\@hspace","\\hskip #1\\relax"),pa("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),pa("\\ordinarycolon",":"),pa("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),pa("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),pa("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),pa("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),pa("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),pa("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),pa("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),pa("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),pa("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),pa("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),pa("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),pa("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),pa("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),pa("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),pa("\u2237","\\dblcolon"),pa("\u2239","\\eqcolon"),pa("\u2254","\\coloneqq"),pa("\u2255","\\eqqcolon"),pa("\u2a74","\\Coloneqq"),pa("\\ratio","\\vcentcolon"),pa("\\coloncolon","\\dblcolon"),pa("\\colonequals","\\coloneqq"),pa("\\coloncolonequals","\\Coloneqq"),pa("\\equalscolon","\\eqqcolon"),pa("\\equalscoloncolon","\\Eqqcolon"),pa("\\colonminus","\\coloneq"),pa("\\coloncolonminus","\\Coloneq"),pa("\\minuscolon","\\eqcolon"),pa("\\minuscoloncolon","\\Eqcolon"),pa("\\coloncolonapprox","\\Colonapprox"),pa("\\coloncolonsim","\\Colonsim"),pa("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),pa("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),pa("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),pa("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),pa("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),pa("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),pa("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),pa("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),pa("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),pa("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),pa("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),pa("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),pa("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),pa("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),pa("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),pa("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),pa("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),pa("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),pa("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),pa("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),pa("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),pa("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),pa("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),pa("\u27e6","\\llbracket"),pa("\u27e7","\\rrbracket"),pa("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),pa("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),pa("\u2983","\\lBrace"),pa("\u2984","\\rBrace"),pa("\\darr","\\downarrow"),pa("\\dArr","\\Downarrow"),pa("\\Darr","\\Downarrow"),pa("\\lang","\\langle"),pa("\\rang","\\rangle"),pa("\\uarr","\\uparrow"),pa("\\uArr","\\Uparrow"),pa("\\Uarr","\\Uparrow"),pa("\\N","\\mathbb{N}"),pa("\\R","\\mathbb{R}"),pa("\\Z","\\mathbb{Z}"),pa("\\alef","\\aleph"),pa("\\alefsym","\\aleph"),pa("\\Alpha","\\mathrm{A}"),pa("\\Beta","\\mathrm{B}"),pa("\\bull","\\bullet"),pa("\\Chi","\\mathrm{X}"),pa("\\clubs","\\clubsuit"),pa("\\cnums","\\mathbb{C}"),pa("\\Complex","\\mathbb{C}"),pa("\\Dagger","\\ddagger"),pa("\\diamonds","\\diamondsuit"),pa("\\empty","\\emptyset"),pa("\\Epsilon","\\mathrm{E}"),pa("\\Eta","\\mathrm{H}"),pa("\\exist","\\exists"),pa("\\harr","\\leftrightarrow"),pa("\\hArr","\\Leftrightarrow"),pa("\\Harr","\\Leftrightarrow"),pa("\\hearts","\\heartsuit"),pa("\\image","\\Im"),pa("\\infin","\\infty"),pa("\\Iota","\\mathrm{I}"),pa("\\isin","\\in"),pa("\\Kappa","\\mathrm{K}"),pa("\\larr","\\leftarrow"),pa("\\lArr","\\Leftarrow"),pa("\\Larr","\\Leftarrow"),pa("\\lrarr","\\leftrightarrow"),pa("\\lrArr","\\Leftrightarrow"),pa("\\Lrarr","\\Leftrightarrow"),pa("\\Mu","\\mathrm{M}"),pa("\\natnums","\\mathbb{N}"),pa("\\Nu","\\mathrm{N}"),pa("\\Omicron","\\mathrm{O}"),pa("\\plusmn","\\pm"),pa("\\rarr","\\rightarrow"),pa("\\rArr","\\Rightarrow"),pa("\\Rarr","\\Rightarrow"),pa("\\real","\\Re"),pa("\\reals","\\mathbb{R}"),pa("\\Reals","\\mathbb{R}"),pa("\\Rho","\\mathrm{P}"),pa("\\sdot","\\cdot"),pa("\\sect","\\S"),pa("\\spades","\\spadesuit"),pa("\\sub","\\subset"),pa("\\sube","\\subseteq"),pa("\\supe","\\supseteq"),pa("\\Tau","\\mathrm{T}"),pa("\\thetasym","\\vartheta"),pa("\\weierp","\\wp"),pa("\\Zeta","\\mathrm{Z}"),pa("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),pa("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),pa("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),pa("\\blue","\\textcolor{##6495ed}{#1}"),pa("\\orange","\\textcolor{##ffa500}{#1}"),pa("\\pink","\\textcolor{##ff00af}{#1}"),pa("\\red","\\textcolor{##df0030}{#1}"),pa("\\green","\\textcolor{##28ae7b}{#1}"),pa("\\gray","\\textcolor{gray}{#1}"),pa("\\purple","\\textcolor{##9d38bd}{#1}"),pa("\\blueA","\\textcolor{##ccfaff}{#1}"),pa("\\blueB","\\textcolor{##80f6ff}{#1}"),pa("\\blueC","\\textcolor{##63d9ea}{#1}"),pa("\\blueD","\\textcolor{##11accd}{#1}"),pa("\\blueE","\\textcolor{##0c7f99}{#1}"),pa("\\tealA","\\textcolor{##94fff5}{#1}"),pa("\\tealB","\\textcolor{##26edd5}{#1}"),pa("\\tealC","\\textcolor{##01d1c1}{#1}"),pa("\\tealD","\\textcolor{##01a995}{#1}"),pa("\\tealE","\\textcolor{##208170}{#1}"),pa("\\greenA","\\textcolor{##b6ffb0}{#1}"),pa("\\greenB","\\textcolor{##8af281}{#1}"),pa("\\greenC","\\textcolor{##74cf70}{#1}"),pa("\\greenD","\\textcolor{##1fab54}{#1}"),pa("\\greenE","\\textcolor{##0d923f}{#1}"),pa("\\goldA","\\textcolor{##ffd0a9}{#1}"),pa("\\goldB","\\textcolor{##ffbb71}{#1}"),pa("\\goldC","\\textcolor{##ff9c39}{#1}"),pa("\\goldD","\\textcolor{##e07d10}{#1}"),pa("\\goldE","\\textcolor{##a75a05}{#1}"),pa("\\redA","\\textcolor{##fca9a9}{#1}"),pa("\\redB","\\textcolor{##ff8482}{#1}"),pa("\\redC","\\textcolor{##f9685d}{#1}"),pa("\\redD","\\textcolor{##e84d39}{#1}"),pa("\\redE","\\textcolor{##bc2612}{#1}"),pa("\\maroonA","\\textcolor{##ffbde0}{#1}"),pa("\\maroonB","\\textcolor{##ff92c6}{#1}"),pa("\\maroonC","\\textcolor{##ed5fa6}{#1}"),pa("\\maroonD","\\textcolor{##ca337c}{#1}"),pa("\\maroonE","\\textcolor{##9e034e}{#1}"),pa("\\purpleA","\\textcolor{##ddd7ff}{#1}"),pa("\\purpleB","\\textcolor{##c6b9fc}{#1}"),pa("\\purpleC","\\textcolor{##aa87ff}{#1}"),pa("\\purpleD","\\textcolor{##7854ab}{#1}"),pa("\\purpleE","\\textcolor{##543b78}{#1}"),pa("\\mintA","\\textcolor{##f5f9e8}{#1}"),pa("\\mintB","\\textcolor{##edf2df}{#1}"),pa("\\mintC","\\textcolor{##e0e5cc}{#1}"),pa("\\grayA","\\textcolor{##f6f7f7}{#1}"),pa("\\grayB","\\textcolor{##f0f1f2}{#1}"),pa("\\grayC","\\textcolor{##e3e5e6}{#1}"),pa("\\grayD","\\textcolor{##d6d8da}{#1}"),pa("\\grayE","\\textcolor{##babec2}{#1}"),pa("\\grayF","\\textcolor{##888d93}{#1}"),pa("\\grayG","\\textcolor{##626569}{#1}"),pa("\\grayH","\\textcolor{##3b3e40}{#1}"),pa("\\grayI","\\textcolor{##21242c}{#1}"),pa("\\kaBlue","\\textcolor{##314453}{#1}"),pa("\\kaGreen","\\textcolor{##71B307}{#1}");var ya={"\\relax":!0,"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},wa=function(){function t(t,e,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=e,this.expansionCount=0,this.feed(t),this.macros=new ma(ua,e.macros),this.mode=r,this.stack=[]}var e=t.prototype;return e.feed=function(t){this.lexer=new la(t,this.settings)},e.switchMode=function(t){this.mode=t},e.beginGroup=function(){this.macros.beginGroup()},e.endGroup=function(){this.macros.endGroup()},e.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},e.popToken=function(){return this.future(),this.stack.pop()},e.pushToken=function(t){this.stack.push(t)},e.pushTokens=function(t){var e;(e=this.stack).push.apply(e,t)},e.consumeSpaces=function(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}},e.consumeArgs=function(t){for(var e=[],r=0;r<t;++r){this.consumeSpaces();var a=this.popToken();if("{"===a.text){for(var n=[],i=1;0!==i;){var s=this.popToken();if(n.push(s),"{"===s.text)++i;else if("}"===s.text)--i;else if("EOF"===s.text)throw new o("End of input in macro argument",a)}n.pop(),n.reverse(),e[r]=n}else{if("EOF"===a.text)throw new o("End of input expecting macro argument");e[r]=[a]}}return e},e.expandOnce=function(){var t=this.popToken(),e=t.text,r=this._getExpansion(e);if(null==r)return this.pushToken(t),t;if(this.expansionCount++,this.expansionCount>this.settings.maxExpand)throw new o("Too many expansions: infinite loop or need to increase maxExpand setting");var a=r.tokens;if(r.numArgs)for(var n=this.consumeArgs(r.numArgs),i=(a=a.slice()).length-1;i>=0;--i){var s=a[i];if("#"===s.text){if(0===i)throw new o("Incomplete placeholder at end of macro body",s);if("#"===(s=a[--i]).text)a.splice(i+1,1);else{if(!/^[1-9]$/.test(s.text))throw new o("Not a valid argument number",s);var h;(h=a).splice.apply(h,[i,2].concat(n[+s.text-1]))}}}return this.pushTokens(a),a},e.expandAfterFuture=function(){return this.expandOnce(),this.future()},e.expandNextToken=function(){for(;;){var t=this.expandOnce();if(t instanceof n){if("\\relax"!==t.text)return this.stack.pop();this.stack.pop()}}throw new Error},e.expandMacro=function(t){if(this.macros.get(t)){var e=[],r=this.stack.length;for(this.pushToken(new n(t));this.stack.length>r;){this.expandOnce()instanceof n&&e.push(this.stack.pop())}return e}},e.expandMacroAsText=function(t){var e=this.expandMacro(t);return e?e.map(function(t){return t.text}).join(""):e},e._getExpansion=function(t){var e=this.macros.get(t);if(null==e)return e;var r="function"==typeof e?e(this):e;if("string"==typeof r){var a=0;if(-1!==r.indexOf("#"))for(var n=r.replace(/##/g,"");-1!==n.indexOf("#"+(a+1));)++a;for(var i=new la(r,this.settings),o=[],s=i.lex();"EOF"!==s.text;)o.push(s),s=i.lex();return o.reverse(),{tokens:o,numArgs:a}}return r},e.isDefined=function(t){return this.macros.has(t)||ia.hasOwnProperty(t)||j.math.hasOwnProperty(t)||j.text.hasOwnProperty(t)||ya.hasOwnProperty(t)},t}(),ka={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"}},Sa={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\u010f":"d\u030c","\u1e0b":"d\u0307","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u013a":"l\u0301","\u013e":"l\u030c","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\u010e":"D\u030c","\u1e0a":"D\u0307","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0139":"L\u0301","\u013d":"L\u030c","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u0164":"T\u030c","\u1e6a":"T\u0307","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"},Ma=function(){function t(t,e){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new wa(t,e,this.mode),this.settings=e,this.leftrightDepth=0}var e=t.prototype;return e.expect=function(t,e){if(void 0===e&&(e=!0),this.fetch().text!==t)throw new o("Expected '"+t+"', got '"+this.fetch().text+"'",this.fetch());e&&this.consume()},e.consume=function(){this.nextToken=null},e.fetch=function(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken},e.switchMode=function(t){this.mode=t,this.gullet.switchMode(t)},e.parse=function(){this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");var t=this.parseExpression(!1);return this.expect("EOF"),this.gullet.endGroup(),t},e.parseExpression=function(e,r){for(var a=[];;){"math"===this.mode&&this.consumeSpaces();var n=this.fetch();if(-1!==t.endOfExpression.indexOf(n.text))break;if(r&&n.text===r)break;if(e&&ia[n.text]&&ia[n.text].infix)break;var i=this.parseAtom(r);if(!i)break;a.push(i)}return"text"===this.mode&&this.formLigatures(a),this.handleInfixNodes(a)},e.handleInfixNodes=function(t){for(var e,r=-1,a=0;a<t.length;a++){var n=Vt(t[a],"infix");if(n){if(-1!==r)throw new o("only one infix operator per group",n.token);r=a,e=n.replaceWith}}if(-1!==r&&e){var i,s,h=t.slice(0,r),l=t.slice(r+1);return i=1===h.length&&"ordgroup"===h[0].type?h[0]:{type:"ordgroup",mode:this.mode,body:h},s=1===l.length&&"ordgroup"===l[0].type?l[0]:{type:"ordgroup",mode:this.mode,body:l},["\\\\abovefrac"===e?this.callFunction(e,[i,t[r],s],[]):this.callFunction(e,[i,s],[])]}return t},e.handleSupSubscript=function(e){var r=this.fetch(),a=r.text;this.consume();var n=this.parseGroup(e,!1,t.SUPSUB_GREEDINESS,void 0,void 0,!0);if(!n)throw new o("Expected group after '"+a+"'",r);return n},e.formatUnsupportedCmd=function(t){for(var e=[],r=0;r<t.length;r++)e.push({type:"textord",mode:"text",text:t[r]});var a={type:"text",mode:this.mode,body:e};return{type:"color",mode:this.mode,color:this.settings.errorColor,body:[a]}},e.parseAtom=function(t){var e,r,a=this.parseGroup("atom",!1,null,t);if("text"===this.mode)return a;for(;;){this.consumeSpaces();var n=this.fetch();if("\\limits"===n.text||"\\nolimits"===n.text){var i=Vt(a,"op");if(i){var s="\\limits"===n.text;i.limits=s,i.alwaysHandleSupSub=!0}else{if(!(i=Vt(a,"operatorname"))||!i.alwaysHandleSupSub)throw new o("Limit controls must follow a math operator",n);var h="\\limits"===n.text;i.limits=h}this.consume()}else if("^"===n.text){if(e)throw new o("Double superscript",n);e=this.handleSupSubscript("superscript")}else if("_"===n.text){if(r)throw new o("Double subscript",n);r=this.handleSupSubscript("subscript")}else{if("'"!==n.text)break;if(e)throw new o("Double superscript",n);var l={type:"textord",mode:this.mode,text:"\\prime"},m=[l];for(this.consume();"'"===this.fetch().text;)m.push(l),this.consume();"^"===this.fetch().text&&m.push(this.handleSupSubscript("superscript")),e={type:"ordgroup",mode:this.mode,body:m}}}return e||r?{type:"supsub",mode:this.mode,base:a,sup:e,sub:r}:a},e.parseFunction=function(t,e,r){var a=this.fetch(),n=a.text,i=ia[n];if(!i)return null;if(this.consume(),null!=r&&i.greediness<=r)throw new o("Got function '"+n+"' with no arguments"+(e?" as "+e:""),a);if("text"===this.mode&&!i.allowedInText)throw new o("Can't use function '"+n+"' in text mode",a);if("math"===this.mode&&!1===i.allowedInMath)throw new o("Can't use function '"+n+"' in math mode",a);var s=this.parseArguments(n,i),h=s.args,l=s.optArgs;return this.callFunction(n,h,l,a,t)},e.callFunction=function(t,e,r,a,n){var i={funcName:t,parser:this,token:a,breakOnTokenText:n},s=ia[t];if(s&&s.handler)return s.handler(i,e,r);throw new o("No function handler for "+t)},e.parseArguments=function(t,e){var r=e.numArgs+e.numOptionalArgs;if(0===r)return{args:[],optArgs:[]};for(var a=e.greediness,n=[],i=[],s=0;s<r;s++){var h=e.argTypes&&e.argTypes[s],l=s<e.numOptionalArgs,m=s>0&&!l||0===s&&!l&&"math"===this.mode,c=this.parseGroupOfType("argument to '"+t+"'",h,l,a,m);if(!c){if(l){i.push(null);continue}throw new o("Expected group after '"+t+"'",this.fetch())}(l?i:n).push(c)}return{args:n,optArgs:i}},e.parseGroupOfType=function(t,e,r,a,n){switch(e){case"color":return n&&this.consumeSpaces(),this.parseColorGroup(r);case"size":return n&&this.consumeSpaces(),this.parseSizeGroup(r);case"url":return this.parseUrlGroup(r,n);case"math":case"text":return this.parseGroup(t,r,a,void 0,e,n);case"hbox":var i=this.parseGroup(t,r,a,void 0,"text",n);return i?{type:"styling",mode:i.mode,body:[i],style:"text"}:i;case"raw":if(n&&this.consumeSpaces(),r&&"{"===this.fetch().text)return null;var s=this.parseStringGroup("raw",r,!0);if(s)return{type:"raw",mode:"text",string:s.text};throw new o("Expected raw group",this.fetch());case"original":case null:case void 0:return this.parseGroup(t,r,a,void 0,void 0,n);default:throw new o("Unknown group type as "+t,this.fetch())}},e.consumeSpaces=function(){for(;" "===this.fetch().text;)this.consume()},e.parseStringGroup=function(t,e,r){var a=e?"[":"{",n=e?"]":"}",i=this.fetch();if(i.text!==a){if(e)return null;if(r&&"EOF"!==i.text&&/[^{}[\]]/.test(i.text))return this.consume(),i}var s=this.mode;this.mode="text",this.expect(a);for(var h,l="",m=this.fetch(),c=0,u=m;(h=this.fetch()).text!==n||r&&c>0;){switch(h.text){case"EOF":throw new o("Unexpected end of input in "+t,m.range(u,l));case a:c++;break;case n:c--}l+=(u=h).text,this.consume()}return this.expect(n),this.mode=s,m.range(u,l)},e.parseRegexGroup=function(t,e){var r=this.mode;this.mode="text";for(var a,n=this.fetch(),i=n,s="";"EOF"!==(a=this.fetch()).text&&t.test(s+a.text);)s+=(i=a).text,this.consume();if(""===s)throw new o("Invalid "+e+": '"+n.text+"'",n);return this.mode=r,n.range(i,s)},e.parseColorGroup=function(t){var e=this.parseStringGroup("color",t);if(!e)return null;var r=/^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(e.text);if(!r)throw new o("Invalid color: '"+e.text+"'",e);var a=r[0];return/^[0-9a-f]{6}$/i.test(a)&&(a="#"+a),{type:"color-token",mode:this.mode,color:a}},e.parseSizeGroup=function(t){var e,r=!1;if(!(e=t||"{"===this.fetch().text?this.parseStringGroup("size",t):this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/,"size")))return null;t||0!==e.text.length||(e.text="0pt",r=!0);var a=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e.text);if(!a)throw new o("Invalid size: '"+e.text+"'",e);var n={number:+(a[1]+a[2]),unit:a[3]};if(!At(n))throw new o("Invalid unit: '"+n.unit+"'",e);return{type:"size",mode:this.mode,value:n,isBlank:r}},e.parseUrlGroup=function(t,e){this.gullet.lexer.setCatcode("%",13);var r=this.parseStringGroup("url",t,!0);if(this.gullet.lexer.setCatcode("%",14),!r)return null;var a=r.text.replace(/\\([#$%&~_^{}])/g,"$1");return{type:"url",mode:this.mode,url:a}},e.parseGroup=function(e,r,n,i,s,h){var l=this.mode;s&&this.switchMode(s),h&&this.consumeSpaces();var m,c=this.fetch(),u=c.text;if(r?"["===u:"{"===u||"\\begingroup"===u){this.consume();var p=t.endOfGroup[u];this.gullet.beginGroup();var d=this.parseExpression(!1,p),f=this.fetch();this.expect(p),this.gullet.endGroup(),m={type:"ordgroup",mode:this.mode,loc:a.range(c,f),body:d,semisimple:"\\begingroup"===u||void 0}}else if(r)m=null;else if(null==(m=this.parseFunction(i,e,n)||this.parseSymbol())&&"\\"===u[0]&&!ya.hasOwnProperty(u)){if(this.settings.throwOnError)throw new o("Undefined control sequence: "+u,c);m=this.formatUnsupportedCmd(u),this.consume()}return s&&this.switchMode(l),m},e.formLigatures=function(t){for(var e=t.length-1,r=0;r<e;++r){var n=t[r],i=n.text;"-"===i&&"-"===t[r+1].text&&(r+1<e&&"-"===t[r+2].text?(t.splice(r,3,{type:"textord",mode:"text",loc:a.range(n,t[r+2]),text:"---"}),e-=2):(t.splice(r,2,{type:"textord",mode:"text",loc:a.range(n,t[r+1]),text:"--"}),e-=1)),"'"!==i&&"`"!==i||t[r+1].text!==i||(t.splice(r,2,{type:"textord",mode:"text",loc:a.range(n,t[r+1]),text:i+i}),e-=1)}},e.parseSymbol=function(){var t=this.fetch(),e=t.text;if(/^\\verb[^a-zA-Z]/.test(e)){this.consume();var r=e.slice(5),n="*"===r.charAt(0);if(n&&(r=r.slice(1)),r.length<2||r.charAt(0)!==r.slice(-1))throw new o("\\verb assertion failed --\n                    please report what input caused this bug");return{type:"verb",mode:"text",body:r=r.slice(1,-1),star:n}}Sa.hasOwnProperty(e[0])&&!j[this.mode][e[0]]&&(this.settings.strict&&"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Accented Unicode text character "'+e[0]+'" used in math mode',t),e=Sa[e[0]]+e.substr(1));var i,s=sa.exec(e);if(s&&("i"===(e=e.substring(0,s.index))?e="\u0131":"j"===e&&(e="\u0237")),j[this.mode][e]){this.settings.strict&&"math"===this.mode&&"\xc7\xd0\xde\xe7\xfe".indexOf(e)>=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+e[0]+'" used in math mode',t);var h,l=j[this.mode][e].group,m=a.range(t);if(W.hasOwnProperty(l)){var c=l;h={type:"atom",mode:this.mode,family:c,loc:m,text:e}}else h={type:l,mode:this.mode,loc:m,text:e};i=h}else{if(!(e.charCodeAt(0)>=128))return null;this.settings.strict&&(M(e.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+e[0]+'" used in math mode',t):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+e[0]+'" ('+e.charCodeAt(0)+")",t)),i={type:"textord",mode:"text",loc:a.range(t),text:e}}if(this.consume(),s)for(var u=0;u<s[0].length;u++){var p=s[0][u];if(!ka[p])throw new o("Unknown accent ' "+p+"'",t);var d=ka[p][this.mode];if(!d)throw new o("Accent "+p+" unsupported in "+this.mode+" mode",t);i={type:"accent",mode:this.mode,loc:a.range(t),label:d,isStretchy:!1,isShifty:!0,base:i}}return i},t}();Ma.endOfExpression=["}","\\endgroup","\\end","\\right","&"],Ma.endOfGroup={"[":"]","{":"}","\\begingroup":"\\endgroup"},Ma.SUPSUB_GREEDINESS=1;var za=function(t,e){if(!("string"==typeof t||t instanceof String))throw new TypeError("KaTeX can only parse string typed expression");var r=new Ma(t,e);delete r.gullet.macros.current["\\df@tag"];var a=r.parse();if(r.gullet.macros.get("\\df@tag")){if(!e.displayMode)throw new o("\\tag works only in display equations");r.gullet.feed("\\df@tag"),a=[{type:"tag",mode:"text",body:a,tag:r.parse()}]}return a},Aa=function(t,e,r){e.textContent="";var a=Ba(t,r).toNode();e.appendChild(a)};"undefined"!=typeof document&&"CSS1Compat"!==document.compatMode&&("undefined"!=typeof console&&console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your website has a suitable doctype."),Aa=function(){throw new o("KaTeX doesn't work in quirks mode.")});var Ta=function(t,e,r){if(r.throwOnError||!(t instanceof o))throw t;var a=Dt.makeSpan(["katex-error"],[new E(e)]);return a.setAttribute("title",t.toString()),a.setAttribute("style","color:"+r.errorColor),a},Ba=function(t,e){var r=new u(e);try{var a=za(t,r);return Be(a,t,r)}catch(e){return Ta(e,t,r)}},Ca={version:"0.11.1",render:Aa,renderToString:function(t,e){return Ba(t,e).toMarkup()},ParseError:o,__parse:function(t,e){var r=new u(e);return za(t,r)},__renderToDomTree:Ba,__renderToHTMLTree:function(t,e){var r=new u(e);try{return function(t,e,r){var a=de(t,Ae(r)),n=Dt.makeSpan(["katex"],[a]);return Te(n,r)}(za(t,r),0,r)}catch(e){return Ta(e,t,r)}},__setFontMetrics:function(t,e){F[t]=e},__defineSymbol:$,__defineMacro:pa,__domTree:{Span:N,Anchor:I,SymbolNode:E,SvgNode:L,PathNode:H,LineNode:P}};e.default=Ca}]).default});
\ No newline at end of file
diff --git a/registry/vulkan/katex/katex.mjs b/registry/vulkan/katex/katex.mjs
deleted file mode 100644
index dc7eebb..0000000
--- a/registry/vulkan/katex/katex.mjs
+++ /dev/null
@@ -1,17021 +0,0 @@
-/**
- * Lexing or parsing positional information for error reporting.
- * This object is immutable.
- */
-class SourceLocation {
-  // The + prefix indicates that these fields aren't writeable
-  // Lexer holding the input string.
-  // Start offset, zero-based inclusive.
-  // End offset, zero-based exclusive.
-  constructor(lexer, start, end) {
-    this.lexer = void 0;
-    this.start = void 0;
-    this.end = void 0;
-    this.lexer = lexer;
-    this.start = start;
-    this.end = end;
-  }
-  /**
-   * Merges two `SourceLocation`s from location providers, given they are
-   * provided in order of appearance.
-   * - Returns the first one's location if only the first is provided.
-   * - Returns a merged range of the first and the last if both are provided
-   *   and their lexers match.
-   * - Otherwise, returns null.
-   */
-
-
-  static range(first, second) {
-    if (!second) {
-      return first && first.loc;
-    } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) {
-      return null;
-    } else {
-      return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end);
-    }
-  }
-
-}
-
-/**
- * Interface required to break circular dependency between Token, Lexer, and
- * ParseError.
- */
-
-/**
- * The resulting token returned from `lex`.
- *
- * It consists of the token text plus some position information.
- * The position information is essentially a range in an input string,
- * but instead of referencing the bare input string, we refer to the lexer.
- * That way it is possible to attach extra metadata to the input string,
- * like for example a file name or similar.
- *
- * The position information is optional, so it is OK to construct synthetic
- * tokens if appropriate. Not providing available position information may
- * lead to degraded error reporting, though.
- */
-class Token {
-  constructor(text, // the text of this token
-  loc) {
-    this.text = void 0;
-    this.loc = void 0;
-    this.text = text;
-    this.loc = loc;
-  }
-  /**
-   * Given a pair of tokens (this and endToken), compute a `Token` encompassing
-   * the whole input range enclosed by these two.
-   */
-
-
-  range(endToken, // last token of the range, inclusive
-  text) // the text of the newly constructed token
-  {
-    return new Token(text, SourceLocation.range(this, endToken));
-  }
-
-}
-
-/**
- * This is the ParseError class, which is the main error thrown by KaTeX
- * functions when something has gone wrong. This is used to distinguish internal
- * errors from errors in the expression that the user provided.
- *
- * If possible, a caller should provide a Token or ParseNode with information
- * about where in the source string the problem occurred.
- */
-class ParseError {
-  // Error position based on passed-in Token or ParseNode.
-  constructor(message, // The error message
-  token) // An object providing position information
-  {
-    this.position = void 0;
-    let error = "KaTeX parse error: " + message;
-    let start;
-    const loc = token && token.loc;
-
-    if (loc && loc.start <= loc.end) {
-      // If we have the input and a position, make the error a bit fancier
-      // Get the input
-      const input = loc.lexer.input; // Prepend some information
-
-      start = loc.start;
-      const end = loc.end;
-
-      if (start === input.length) {
-        error += " at end of input: ";
-      } else {
-        error += " at position " + (start + 1) + ": ";
-      } // Underline token in question using combining underscores
-
-
-      const underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332"); // Extract some context from the input and add it to the error
-
-      let left;
-
-      if (start > 15) {
-        left = "…" + input.slice(start - 15, start);
-      } else {
-        left = input.slice(0, start);
-      }
-
-      let right;
-
-      if (end + 15 < input.length) {
-        right = input.slice(end, end + 15) + "…";
-      } else {
-        right = input.slice(end);
-      }
-
-      error += left + underlined + right;
-    } // Some hackery to make ParseError a prototype of Error
-    // See http://stackoverflow.com/a/8460753
-
-
-    const self = new Error(error);
-    self.name = "ParseError"; // $FlowFixMe
-
-    self.__proto__ = ParseError.prototype; // $FlowFixMe
-
-    self.position = start;
-    return self;
-  }
-
-} // $FlowFixMe More hackery
-
-
-ParseError.prototype.__proto__ = Error.prototype;
-
-/**
- * This file contains a list of utility functions which are useful in other
- * files.
- */
-
-/**
- * Return whether an element is contained in a list
- */
-const contains = function contains(list, elem) {
-  return list.indexOf(elem) !== -1;
-};
-/**
- * Provide a default value if a setting is undefined
- * NOTE: Couldn't use `T` as the output type due to facebook/flow#5022.
- */
-
-
-const deflt = function deflt(setting, defaultIfUndefined) {
-  return setting === undefined ? defaultIfUndefined : setting;
-}; // hyphenate and escape adapted from Facebook's React under Apache 2 license
-
-
-const uppercase = /([A-Z])/g;
-
-const hyphenate = function hyphenate(str) {
-  return str.replace(uppercase, "-$1").toLowerCase();
-};
-
-const ESCAPE_LOOKUP = {
-  "&": "&amp;",
-  ">": "&gt;",
-  "<": "&lt;",
-  "\"": "&quot;",
-  "'": "&#x27;"
-};
-const ESCAPE_REGEX = /[&><"']/g;
-/**
- * Escapes text to prevent scripting attacks.
- */
-
-function escape(text) {
-  return String(text).replace(ESCAPE_REGEX, match => ESCAPE_LOOKUP[match]);
-}
-/**
- * Sometimes we want to pull out the innermost element of a group. In most
- * cases, this will just be the group itself, but when ordgroups and colors have
- * a single element, we want to pull that out.
- */
-
-
-const getBaseElem = function getBaseElem(group) {
-  if (group.type === "ordgroup") {
-    if (group.body.length === 1) {
-      return getBaseElem(group.body[0]);
-    } else {
-      return group;
-    }
-  } else if (group.type === "color") {
-    if (group.body.length === 1) {
-      return getBaseElem(group.body[0]);
-    } else {
-      return group;
-    }
-  } else if (group.type === "font") {
-    return getBaseElem(group.body);
-  } else {
-    return group;
-  }
-};
-/**
- * TeXbook algorithms often reference "character boxes", which are simply groups
- * with a single character in them. To decide if something is a character box,
- * we find its innermost group, and see if it is a single character.
- */
-
-
-const isCharacterBox = function isCharacterBox(group) {
-  const baseElem = getBaseElem(group); // These are all they types of groups which hold single characters
-
-  return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "atom";
-};
-
-const assert = function assert(value) {
-  if (!value) {
-    throw new Error('Expected non-null, but got ' + String(value));
-  }
-
-  return value;
-};
-/**
- * Return the protocol of a URL, or "_relative" if the URL does not specify a
- * protocol (and thus is relative).
- */
-
-const protocolFromUrl = function protocolFromUrl(url) {
-  const protocol = /^\s*([^\\/#]*?)(?::|&#0*58|&#x0*3a)/i.exec(url);
-  return protocol != null ? protocol[1] : "_relative";
-};
-var utils = {
-  contains,
-  deflt,
-  escape,
-  hyphenate,
-  getBaseElem,
-  isCharacterBox,
-  protocolFromUrl
-};
-
-/* eslint no-console:0 */
-
-/**
- * The main Settings object
- *
- * The current options stored are:
- *  - displayMode: Whether the expression should be typeset as inline math
- *                 (false, the default), meaning that the math starts in
- *                 \textstyle and is placed in an inline-block); or as display
- *                 math (true), meaning that the math starts in \displaystyle
- *                 and is placed in a block with vertical margin.
- */
-class Settings {
-  constructor(options) {
-    this.displayMode = void 0;
-    this.output = void 0;
-    this.leqno = void 0;
-    this.fleqn = void 0;
-    this.throwOnError = void 0;
-    this.errorColor = void 0;
-    this.macros = void 0;
-    this.minRuleThickness = void 0;
-    this.colorIsTextColor = void 0;
-    this.strict = void 0;
-    this.trust = void 0;
-    this.maxSize = void 0;
-    this.maxExpand = void 0;
-    // allow null options
-    options = options || {};
-    this.displayMode = utils.deflt(options.displayMode, false);
-    this.output = utils.deflt(options.output, "htmlAndMathml");
-    this.leqno = utils.deflt(options.leqno, false);
-    this.fleqn = utils.deflt(options.fleqn, false);
-    this.throwOnError = utils.deflt(options.throwOnError, true);
-    this.errorColor = utils.deflt(options.errorColor, "#cc0000");
-    this.macros = options.macros || {};
-    this.minRuleThickness = Math.max(0, utils.deflt(options.minRuleThickness, 0));
-    this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false);
-    this.strict = utils.deflt(options.strict, "warn");
-    this.trust = utils.deflt(options.trust, false);
-    this.maxSize = Math.max(0, utils.deflt(options.maxSize, Infinity));
-    this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000));
-  }
-  /**
-   * Report nonstrict (non-LaTeX-compatible) input.
-   * Can safely not be called if `this.strict` is false in JavaScript.
-   */
-
-
-  reportNonstrict(errorCode, errorMsg, token) {
-    let strict = this.strict;
-
-    if (typeof strict === "function") {
-      // Allow return value of strict function to be boolean or string
-      // (or null/undefined, meaning no further processing).
-      strict = strict(errorCode, errorMsg, token);
-    }
-
-    if (!strict || strict === "ignore") {
-      return;
-    } else if (strict === true || strict === "error") {
-      throw new ParseError("LaTeX-incompatible input and strict mode is set to 'error': " + `${errorMsg} [${errorCode}]`, token);
-    } else if (strict === "warn") {
-      typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + `${errorMsg} [${errorCode}]`);
-    } else {
-      // won't happen in type-safe code
-      typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + `unrecognized '${strict}': ${errorMsg} [${errorCode}]`);
-    }
-  }
-  /**
-   * Check whether to apply strict (LaTeX-adhering) behavior for unusual
-   * input (like `\\`).  Unlike `nonstrict`, will not throw an error;
-   * instead, "error" translates to a return value of `true`, while "ignore"
-   * translates to a return value of `false`.  May still print a warning:
-   * "warn" prints a warning and returns `false`.
-   * This is for the second category of `errorCode`s listed in the README.
-   */
-
-
-  useStrictBehavior(errorCode, errorMsg, token) {
-    let strict = this.strict;
-
-    if (typeof strict === "function") {
-      // Allow return value of strict function to be boolean or string
-      // (or null/undefined, meaning no further processing).
-      // But catch any exceptions thrown by function, treating them
-      // like "error".
-      try {
-        strict = strict(errorCode, errorMsg, token);
-      } catch (error) {
-        strict = "error";
-      }
-    }
-
-    if (!strict || strict === "ignore") {
-      return false;
-    } else if (strict === true || strict === "error") {
-      return true;
-    } else if (strict === "warn") {
-      typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + `${errorMsg} [${errorCode}]`);
-      return false;
-    } else {
-      // won't happen in type-safe code
-      typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + `unrecognized '${strict}': ${errorMsg} [${errorCode}]`);
-      return false;
-    }
-  }
-  /**
-   * Check whether to test potentially dangerous input, and return
-   * `true` (trusted) or `false` (untrusted).  The sole argument `context`
-   * should be an object with `command` field specifying the relevant LaTeX
-   * command (as a string starting with `\`), and any other arguments, etc.
-   * If `context` has a `url` field, a `protocol` field will automatically
-   * get added by this function (changing the specified object).
-   */
-
-
-  isTrusted(context) {
-    if (context.url && !context.protocol) {
-      context.protocol = utils.protocolFromUrl(context.url);
-    }
-
-    const trust = typeof this.trust === "function" ? this.trust(context) : this.trust;
-    return Boolean(trust);
-  }
-
-}
-
-/**
- * This file contains information and classes for the various kinds of styles
- * used in TeX. It provides a generic `Style` class, which holds information
- * about a specific style. It then provides instances of all the different kinds
- * of styles possible, and provides functions to move between them and get
- * information about them.
- */
-
-/**
- * The main style class. Contains a unique id for the style, a size (which is
- * the same for cramped and uncramped version of a style), and a cramped flag.
- */
-class Style {
-  constructor(id, size, cramped) {
-    this.id = void 0;
-    this.size = void 0;
-    this.cramped = void 0;
-    this.id = id;
-    this.size = size;
-    this.cramped = cramped;
-  }
-  /**
-   * Get the style of a superscript given a base in the current style.
-   */
-
-
-  sup() {
-    return styles[sup[this.id]];
-  }
-  /**
-   * Get the style of a subscript given a base in the current style.
-   */
-
-
-  sub() {
-    return styles[sub[this.id]];
-  }
-  /**
-   * Get the style of a fraction numerator given the fraction in the current
-   * style.
-   */
-
-
-  fracNum() {
-    return styles[fracNum[this.id]];
-  }
-  /**
-   * Get the style of a fraction denominator given the fraction in the current
-   * style.
-   */
-
-
-  fracDen() {
-    return styles[fracDen[this.id]];
-  }
-  /**
-   * Get the cramped version of a style (in particular, cramping a cramped style
-   * doesn't change the style).
-   */
-
-
-  cramp() {
-    return styles[cramp[this.id]];
-  }
-  /**
-   * Get a text or display version of this style.
-   */
-
-
-  text() {
-    return styles[text[this.id]];
-  }
-  /**
-   * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle)
-   */
-
-
-  isTight() {
-    return this.size >= 2;
-  }
-
-} // Export an interface for type checking, but don't expose the implementation.
-// This way, no more styles can be generated.
-
-
-// IDs of the different styles
-const D = 0;
-const Dc = 1;
-const T = 2;
-const Tc = 3;
-const S = 4;
-const Sc = 5;
-const SS = 6;
-const SSc = 7; // Instances of the different styles
-
-const styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)]; // Lookup tables for switching from one style to another
-
-const sup = [S, Sc, S, Sc, SS, SSc, SS, SSc];
-const sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc];
-const fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc];
-const fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc];
-const cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc];
-const text = [D, Dc, T, Tc, T, Tc, T, Tc]; // We only export some of the styles.
-
-var Style$1 = {
-  DISPLAY: styles[D],
-  TEXT: styles[T],
-  SCRIPT: styles[S],
-  SCRIPTSCRIPT: styles[SS]
-};
-
-/*
- * This file defines the Unicode scripts and script families that we
- * support. To add new scripts or families, just add a new entry to the
- * scriptData array below. Adding scripts to the scriptData array allows
- * characters from that script to appear in \text{} environments.
- */
-
-/**
- * Each script or script family has a name and an array of blocks.
- * Each block is an array of two numbers which specify the start and
- * end points (inclusive) of a block of Unicode codepoints.
- */
-
-/**
- * Unicode block data for the families of scripts we support in \text{}.
- * Scripts only need to appear here if they do not have font metrics.
- */
-const scriptData = [{
-  // Latin characters beyond the Latin-1 characters we have metrics for.
-  // Needed for Czech, Hungarian and Turkish text, for example.
-  name: 'latin',
-  blocks: [[0x0100, 0x024f], // Latin Extended-A and Latin Extended-B
-  [0x0300, 0x036f]]
-}, {
-  // The Cyrillic script used by Russian and related languages.
-  // A Cyrillic subset used to be supported as explicitly defined
-  // symbols in symbols.js
-  name: 'cyrillic',
-  blocks: [[0x0400, 0x04ff]]
-}, {
-  // The Brahmic scripts of South and Southeast Asia
-  // Devanagari (0900–097F)
-  // Bengali (0980–09FF)
-  // Gurmukhi (0A00–0A7F)
-  // Gujarati (0A80–0AFF)
-  // Oriya (0B00–0B7F)
-  // Tamil (0B80–0BFF)
-  // Telugu (0C00–0C7F)
-  // Kannada (0C80–0CFF)
-  // Malayalam (0D00–0D7F)
-  // Sinhala (0D80–0DFF)
-  // Thai (0E00–0E7F)
-  // Lao (0E80–0EFF)
-  // Tibetan (0F00–0FFF)
-  // Myanmar (1000–109F)
-  name: 'brahmic',
-  blocks: [[0x0900, 0x109F]]
-}, {
-  name: 'georgian',
-  blocks: [[0x10A0, 0x10ff]]
-}, {
-  // Chinese and Japanese.
-  // The "k" in cjk is for Korean, but we've separated Korean out
-  name: "cjk",
-  blocks: [[0x3000, 0x30FF], // CJK symbols and punctuation, Hiragana, Katakana
-  [0x4E00, 0x9FAF], // CJK ideograms
-  [0xFF00, 0xFF60]]
-}, {
-  // Korean
-  name: 'hangul',
-  blocks: [[0xAC00, 0xD7AF]]
-}];
-/**
- * Given a codepoint, return the name of the script or script family
- * it is from, or null if it is not part of a known block
- */
-
-function scriptFromCodepoint(codepoint) {
-  for (let i = 0; i < scriptData.length; i++) {
-    const script = scriptData[i];
-
-    for (let i = 0; i < script.blocks.length; i++) {
-      const block = script.blocks[i];
-
-      if (codepoint >= block[0] && codepoint <= block[1]) {
-        return script.name;
-      }
-    }
-  }
-
-  return null;
-}
-/**
- * A flattened version of all the supported blocks in a single array.
- * This is an optimization to make supportedCodepoint() fast.
- */
-
-const allBlocks = [];
-scriptData.forEach(s => s.blocks.forEach(b => allBlocks.push(...b)));
-/**
- * Given a codepoint, return true if it falls within one of the
- * scripts or script families defined above and false otherwise.
- *
- * Micro benchmarks shows that this is faster than
- * /[\u3000-\u30FF\u4E00-\u9FAF\uFF00-\uFF60\uAC00-\uD7AF\u0900-\u109F]/.test()
- * in Firefox, Chrome and Node.
- */
-
-function supportedCodepoint(codepoint) {
-  for (let i = 0; i < allBlocks.length; i += 2) {
-    if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-/**
- * This file provides support to domTree.js and delimiter.js.
- * It's a storehouse of path geometry for SVG images.
- */
-// In all paths below, the viewBox-to-em scale is 1000:1.
-const hLinePad = 80; // padding above a sqrt viniculum. Prevents image cropping.
-// The viniculum of a \sqrt can be made thicker by a KaTeX rendering option.
-// Think of variable extraViniculum as two detours in the SVG path.
-// The detour begins at the lower left of the area labeled extraViniculum below.
-// The detour proceeds one extraViniculum distance up and slightly to the right,
-// displacing the radiused corner between surd and viniculum. The radius is
-// traversed as usual, then the detour resumes. It goes right, to the end of
-// the very long viniculumn, then down one extraViniculum distance,
-// after which it resumes regular path geometry for the radical.
-
-/*                                                  viniculum
-                                                   /
-         /▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒←extraViniculum
-        / █████████████████████←0.04em (40 unit) std viniculum thickness
-       / /
-      / /
-     / /\
-    / / surd
-*/
-
-const sqrtMain = function sqrtMain(extraViniculum, hLinePad) {
-  // sqrtMain path geometry is from glyph U221A in the font KaTeX Main
-  return `M95,${622 + extraViniculum + hLinePad}
-c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14
-c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54
-c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10
-s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429
-c69,-144,104.5,-217.7,106.5,-221
-l${extraViniculum / 2.075} -${extraViniculum}
-c5.3,-9.3,12,-14,20,-14
-H400000v${40 + extraViniculum}H845.2724
-s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7
-c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z
-M${834 + extraViniculum} ${hLinePad}h400000v${40 + extraViniculum}h-400000z`;
-};
-
-const sqrtSize1 = function sqrtSize1(extraViniculum, hLinePad) {
-  // size1 is from glyph U221A in the font KaTeX_Size1-Regular
-  return `M263,${601 + extraViniculum + hLinePad}c0.7,0,18,39.7,52,119
-c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120
-c340,-704.7,510.7,-1060.3,512,-1067
-l${extraViniculum / 2.084} -${extraViniculum}
-c4.7,-7.3,11,-11,19,-11
-H40000v${40 + extraViniculum}H1012.3
-s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232
-c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1
-s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26
-c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z
-M${1001 + extraViniculum} ${hLinePad}h400000v${40 + extraViniculum}h-400000z`;
-};
-
-const sqrtSize2 = function sqrtSize2(extraViniculum, hLinePad) {
-  // size2 is from glyph U221A in the font KaTeX_Size2-Regular
-  return `M983 ${10 + extraViniculum + hLinePad}
-l${extraViniculum / 3.13} -${extraViniculum}
-c4,-6.7,10,-10,18,-10 H400000v${40 + extraViniculum}
-H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7
-s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744
-c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30
-c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722
-c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5
-c53.7,-170.3,84.5,-266.8,92.5,-289.5z
-M${1001 + extraViniculum} ${hLinePad}h400000v${40 + extraViniculum}h-400000z`;
-};
-
-const sqrtSize3 = function sqrtSize3(extraViniculum, hLinePad) {
-  // size3 is from glyph U221A in the font KaTeX_Size3-Regular
-  return `M424,${2398 + extraViniculum + hLinePad}
-c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514
-c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20
-s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121
-s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081
-l${extraViniculum / 4.223} -${extraViniculum}c4,-6.7,10,-10,18,-10 H400000
-v${40 + extraViniculum}H1014.6
-s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185
-c-2,6,-10,9,-24,9
-c-8,0,-12,-0.7,-12,-2z M${1001 + extraViniculum} ${hLinePad}
-h400000v${40 + extraViniculum}h-400000z`;
-};
-
-const sqrtSize4 = function sqrtSize4(extraViniculum, hLinePad) {
-  // size4 is from glyph U221A in the font KaTeX_Size4-Regular
-  return `M473,${2713 + extraViniculum + hLinePad}
-c339.3,-1799.3,509.3,-2700,510,-2702 l${extraViniculum / 5.298} -${extraViniculum}
-c3.3,-7.3,9.3,-11,18,-11 H400000v${40 + extraViniculum}H1017.7
-s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9
-c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200
-c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26
-s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,
-606zM${1001 + extraViniculum} ${hLinePad}h400000v${40 + extraViniculum}H1017.7z`;
-};
-
-const sqrtTall = function sqrtTall(extraViniculum, hLinePad, viewBoxHeight) {
-  // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular
-  // One path edge has a variable length. It runs vertically from the viniculumn
-  // to a point near (14 units) the bottom of the surd. The viniculum
-  // is normally 40 units thick. So the length of the line in question is:
-  const vertSegment = viewBoxHeight - 54 - hLinePad - extraViniculum;
-  return `M702 ${extraViniculum + hLinePad}H400000${40 + extraViniculum}
-H742v${vertSegment}l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1
-h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170
-c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667
-219 661 l218 661zM702 ${hLinePad}H400000v${40 + extraViniculum}H742z`;
-};
-
-const sqrtPath = function sqrtPath(size, extraViniculum, viewBoxHeight) {
-  extraViniculum = 1000 * extraViniculum; // Convert from document ems to viewBox.
-
-  let path = "";
-
-  switch (size) {
-    case "sqrtMain":
-      path = sqrtMain(extraViniculum, hLinePad);
-      break;
-
-    case "sqrtSize1":
-      path = sqrtSize1(extraViniculum, hLinePad);
-      break;
-
-    case "sqrtSize2":
-      path = sqrtSize2(extraViniculum, hLinePad);
-      break;
-
-    case "sqrtSize3":
-      path = sqrtSize3(extraViniculum, hLinePad);
-      break;
-
-    case "sqrtSize4":
-      path = sqrtSize4(extraViniculum, hLinePad);
-      break;
-
-    case "sqrtTall":
-      path = sqrtTall(extraViniculum, hLinePad, viewBoxHeight);
-  }
-
-  return path;
-};
-const path = {
-  // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main
-  doubleleftarrow: `M262 157
-l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3
- 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28
- 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5
-c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5
- 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87
--86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7
--2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z
-m8 0v40h399730v-40zm0 194v40h399730v-40z`,
-  // doublerightarrow is from glyph U+21D2 in font KaTeX Main
-  doublerightarrow: `M399738 392l
--10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5
- 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88
--33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68
--17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18
--13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782
-c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3
--107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,
-  // leftarrow is from glyph U+2190 in font KaTeX Main
-  leftarrow: `M400000 241H110l3-3c68.7-52.7 113.7-120
- 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8
--5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247
-c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208
- 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3
- 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202
- l-3-3h399890zM100 241v40h399900v-40z`,
-  // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular
-  leftbrace: `M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117
--45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7
- 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,
-  leftbraceunder: `M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13
- 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688
- 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7
--331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,
-  // overgroup is from the MnSymbol package (public domain)
-  leftgroup: `M400000 80
-H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0
- 435 0h399565z`,
-  leftgroupunder: `M400000 262
-H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219
- 435 219h399565z`,
-  // Harpoons are from glyph U+21BD in font KaTeX Main
-  leftharpoon: `M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3
--3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5
--18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7
--196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,
-  leftharpoonplus: `M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5
- 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3
--4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7
--10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z
-m0 0v40h400000v-40z`,
-  leftharpoondown: `M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333
- 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5
- 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667
--152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,
-  leftharpoondownplus: `M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12
- 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7
--2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0
-v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,
-  // hook is from glyph U+21A9 in font KaTeX Main
-  lefthook: `M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5
--83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3
--68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21
- 71.5 23h399859zM103 281v-40h399897v40z`,
-  leftlinesegment: `M40 281 V428 H0 V94 H40 V241 H400000 v40z
-M40 281 V428 H0 V94 H40 V241 H400000 v40z`,
-  leftmapsto: `M40 281 V448H0V74H40V241H400000v40z
-M40 281 V448H0V74H40V241H400000v40z`,
-  // tofrom is from glyph U+21C4 in font KaTeX AMS Regular
-  leftToFrom: `M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23
--.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8
-c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3
- 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,
-  longequal: `M0 50 h400000 v40H0z m0 194h40000v40H0z
-M0 50 h400000 v40H0z m0 194h40000v40H0z`,
-  midbrace: `M200428 334
-c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14
--53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7
- 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11
- 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,
-  midbraceunder: `M199572 214
-c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14
- 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3
- 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0
--5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,
-  oiintSize1: `M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6
--320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z
-m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8
-60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,
-  oiintSize2: `M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8
--451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z
-m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2
-c0 110 84 276 504 276s502.4-166 502.4-276z`,
-  oiiintSize1: `M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6
--480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z
-m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0
-85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,
-  oiiintSize2: `M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8
--707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z
-m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1
-c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,
-  rightarrow: `M0 241v40h399891c-47.3 35.3-84 78-110 128
--16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20
- 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7
- 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85
--40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
--12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
- 151.7 139 205zm0 0v40h399900v-40z`,
-  rightbrace: `M400000 542l
--6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5
-s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1
-c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,
-  rightbraceunder: `M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3
- 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237
--174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,
-  rightgroup: `M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0
- 3-1 3-3v-38c-76-158-257-219-435-219H0z`,
-  rightgroupunder: `M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18
- 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,
-  rightharpoon: `M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3
--3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2
--10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58
- 69.2 92 94.5zm0 0v40h399900v-40z`,
-  rightharpoonplus: `M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11
--18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7
- 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z
-m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,
-  rightharpoondown: `M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8
- 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5
--7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95
--27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,
-  rightharpoondownplus: `M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8
- 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3
- 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3
--64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z
-m0-194v40h400000v-40zm0 0v40h400000v-40z`,
-  righthook: `M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3
- 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0
--13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21
- 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,
-  rightlinesegment: `M399960 241 V94 h40 V428 h-40 V281 H0 v-40z
-M399960 241 V94 h40 V428 h-40 V281 H0 v-40z`,
-  rightToFrom: `M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23
- 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32
--52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142
--167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,
-  // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular
-  twoheadleftarrow: `M0 167c68 40
- 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69
--70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3
--40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19
--37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101
- 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,
-  twoheadrightarrow: `M400000 167
-c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3
- 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42
- 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333
--19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70
- 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,
-  // tilde1 is a modified version of a glyph from the MnSymbol package
-  tilde1: `M200 55.538c-77 0-168 73.953-177 73.953-3 0-7
--2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0
- 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0
- 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128
--68.267.847-113-73.952-191-73.952z`,
-  // ditto tilde2, tilde3, & tilde4
-  tilde2: `M344 55.266c-142 0-300.638 81.316-311.5 86.418
--8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9
- 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114
-c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751
- 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,
-  tilde3: `M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457
--11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0
- 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697
- 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696
- -338 0-409-156.573-744-156.573z`,
-  tilde4: `M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345
--11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409
- 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9
- 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409
- -175.236-744-175.236z`,
-  // vec is from glyph U+20D7 in font KaTeX Main
-  vec: `M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
-3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
-10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
--1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
--7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
-H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
-c-16-25.333-24-45-24-59z`,
-  // widehat1 is a modified version of a glyph from the MnSymbol package
-  widehat1: `M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22
-c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,
-  // ditto widehat2, widehat3, & widehat4
-  widehat2: `M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10
--11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,
-  widehat3: `M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10
--11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,
-  widehat4: `M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10
--11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,
-  // widecheck paths are all inverted versions of widehat
-  widecheck1: `M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,
--5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,
-  widecheck2: `M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,
--11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,
-  widecheck3: `M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,
--11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,
-  widecheck4: `M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,
--11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,
-  // The next ten paths support reaction arrows from the mhchem package.
-  // Arrows for \ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX
-  // baraboveleftarrow is mostly from from glyph U+2190 in font KaTeX Main
-  baraboveleftarrow: `M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202
-c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5
-c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130
-s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47
-121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6
-s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11
-c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z
-M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,
-  // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main
-  rightarrowabovebar: `M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32
--27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0
-13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39
--84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5
--119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5
--12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67
-151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,
-  // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end.
-  // Ref from mhchem.sty: \rlap{\raisebox{-.22ex}{$\kern0.5em
-  baraboveshortleftharpoon: `M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11
-c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17
-c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21
-c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40
-c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z
-M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,
-  rightharpoonaboveshortbar: `M0,241 l0,40c399126,0,399993,0,399993,0
-c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,
--231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6
-c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z
-M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,
-  shortbaraboveleftharpoon: `M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11
-c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,
-1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,
--152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z
-M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,
-  shortrightharpoonabovebar: `M53,241l0,40c398570,0,399437,0,399437,0
-c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,
--231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6
-c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z
-M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`
-};
-
-/**
- * This node represents a document fragment, which contains elements, but when
- * placed into the DOM doesn't have any representation itself. It only contains
- * children and doesn't have any DOM node properties.
- */
-class DocumentFragment {
-  // HtmlDomNode
-  // Never used; needed for satisfying interface.
-  constructor(children) {
-    this.children = void 0;
-    this.classes = void 0;
-    this.height = void 0;
-    this.depth = void 0;
-    this.maxFontSize = void 0;
-    this.style = void 0;
-    this.children = children;
-    this.classes = [];
-    this.height = 0;
-    this.depth = 0;
-    this.maxFontSize = 0;
-    this.style = {};
-  }
-
-  hasClass(className) {
-    return utils.contains(this.classes, className);
-  }
-  /** Convert the fragment into a node. */
-
-
-  toNode() {
-    const frag = document.createDocumentFragment();
-
-    for (let i = 0; i < this.children.length; i++) {
-      frag.appendChild(this.children[i].toNode());
-    }
-
-    return frag;
-  }
-  /** Convert the fragment into HTML markup. */
-
-
-  toMarkup() {
-    let markup = ""; // Simply concatenate the markup for the children together.
-
-    for (let i = 0; i < this.children.length; i++) {
-      markup += this.children[i].toMarkup();
-    }
-
-    return markup;
-  }
-  /**
-   * Converts the math node into a string, similar to innerText. Applies to
-   * MathDomNode's only.
-   */
-
-
-  toText() {
-    // To avoid this, we would subclass documentFragment separately for
-    // MathML, but polyfills for subclassing is expensive per PR 1469.
-    // $FlowFixMe: Only works for ChildType = MathDomNode.
-    const toText = child => child.toText();
-
-    return this.children.map(toText).join("");
-  }
-
-}
-
-/**
- * These objects store the data about the DOM nodes we create, as well as some
- * extra data. They can then be transformed into real DOM nodes with the
- * `toNode` function or HTML markup using `toMarkup`. They are useful for both
- * storing extra properties on the nodes, as well as providing a way to easily
- * work with the DOM.
- *
- * Similar functions for working with MathML nodes exist in mathMLTree.js.
- *
- * TODO: refactor `span` and `anchor` into common superclass when
- * target environments support class inheritance
- */
-
-/**
- * Create an HTML className based on a list of classes. In addition to joining
- * with spaces, we also remove empty classes.
- */
-const createClass = function createClass(classes) {
-  return classes.filter(cls => cls).join(" ");
-};
-
-const initNode = function initNode(classes, options, style) {
-  this.classes = classes || [];
-  this.attributes = {};
-  this.height = 0;
-  this.depth = 0;
-  this.maxFontSize = 0;
-  this.style = style || {};
-
-  if (options) {
-    if (options.style.isTight()) {
-      this.classes.push("mtight");
-    }
-
-    const color = options.getColor();
-
-    if (color) {
-      this.style.color = color;
-    }
-  }
-};
-/**
- * Convert into an HTML node
- */
-
-
-const toNode = function toNode(tagName) {
-  const node = document.createElement(tagName); // Apply the class
-
-  node.className = createClass(this.classes); // Apply inline styles
-
-  for (const style in this.style) {
-    if (this.style.hasOwnProperty(style)) {
-      // $FlowFixMe Flow doesn't seem to understand span.style's type.
-      node.style[style] = this.style[style];
-    }
-  } // Apply attributes
-
-
-  for (const attr in this.attributes) {
-    if (this.attributes.hasOwnProperty(attr)) {
-      node.setAttribute(attr, this.attributes[attr]);
-    }
-  } // Append the children, also as HTML nodes
-
-
-  for (let i = 0; i < this.children.length; i++) {
-    node.appendChild(this.children[i].toNode());
-  }
-
-  return node;
-};
-/**
- * Convert into an HTML markup string
- */
-
-
-const toMarkup = function toMarkup(tagName) {
-  let markup = `<${tagName}`; // Add the class
-
-  if (this.classes.length) {
-    markup += ` class="${utils.escape(createClass(this.classes))}"`;
-  }
-
-  let styles = ""; // Add the styles, after hyphenation
-
-  for (const style in this.style) {
-    if (this.style.hasOwnProperty(style)) {
-      styles += `${utils.hyphenate(style)}:${this.style[style]};`;
-    }
-  }
-
-  if (styles) {
-    markup += ` style="${utils.escape(styles)}"`;
-  } // Add the attributes
-
-
-  for (const attr in this.attributes) {
-    if (this.attributes.hasOwnProperty(attr)) {
-      markup += ` ${attr}="${utils.escape(this.attributes[attr])}"`;
-    }
-  }
-
-  markup += ">"; // Add the markup of the children, also as markup
-
-  for (let i = 0; i < this.children.length; i++) {
-    markup += this.children[i].toMarkup();
-  }
-
-  markup += `</${tagName}>`;
-  return markup;
-}; // Making the type below exact with all optional fields doesn't work due to
-// - https://github.com/facebook/flow/issues/4582
-// - https://github.com/facebook/flow/issues/5688
-// However, since *all* fields are optional, $Shape<> works as suggested in 5688
-// above.
-// This type does not include all CSS properties. Additional properties should
-// be added as needed.
-
-
-/**
- * This node represents a span node, with a className, a list of children, and
- * an inline style. It also contains information about its height, depth, and
- * maxFontSize.
- *
- * Represents two types with different uses: SvgSpan to wrap an SVG and DomSpan
- * otherwise. This typesafety is important when HTML builders access a span's
- * children.
- */
-class Span {
-  constructor(classes, children, options, style) {
-    this.children = void 0;
-    this.attributes = void 0;
-    this.classes = void 0;
-    this.height = void 0;
-    this.depth = void 0;
-    this.width = void 0;
-    this.maxFontSize = void 0;
-    this.style = void 0;
-    initNode.call(this, classes, options, style);
-    this.children = children || [];
-  }
-  /**
-   * Sets an arbitrary attribute on the span. Warning: use this wisely. Not
-   * all browsers support attributes the same, and having too many custom
-   * attributes is probably bad.
-   */
-
-
-  setAttribute(attribute, value) {
-    this.attributes[attribute] = value;
-  }
-
-  hasClass(className) {
-    return utils.contains(this.classes, className);
-  }
-
-  toNode() {
-    return toNode.call(this, "span");
-  }
-
-  toMarkup() {
-    return toMarkup.call(this, "span");
-  }
-
-}
-/**
- * This node represents an anchor (<a>) element with a hyperlink.  See `span`
- * for further details.
- */
-
-class Anchor {
-  constructor(href, classes, children, options) {
-    this.children = void 0;
-    this.attributes = void 0;
-    this.classes = void 0;
-    this.height = void 0;
-    this.depth = void 0;
-    this.maxFontSize = void 0;
-    this.style = void 0;
-    initNode.call(this, classes, options);
-    this.children = children || [];
-    this.setAttribute('href', href);
-  }
-
-  setAttribute(attribute, value) {
-    this.attributes[attribute] = value;
-  }
-
-  hasClass(className) {
-    return utils.contains(this.classes, className);
-  }
-
-  toNode() {
-    return toNode.call(this, "a");
-  }
-
-  toMarkup() {
-    return toMarkup.call(this, "a");
-  }
-
-}
-/**
- * This node represents an image embed (<img>) element.
- */
-
-class Img {
-  constructor(src, alt, style) {
-    this.src = void 0;
-    this.alt = void 0;
-    this.classes = void 0;
-    this.height = void 0;
-    this.depth = void 0;
-    this.maxFontSize = void 0;
-    this.style = void 0;
-    this.alt = alt;
-    this.src = src;
-    this.classes = ["mord"];
-    this.style = style;
-  }
-
-  hasClass(className) {
-    return utils.contains(this.classes, className);
-  }
-
-  toNode() {
-    const node = document.createElement("img");
-    node.src = this.src;
-    node.alt = this.alt;
-    node.className = "mord"; // Apply inline styles
-
-    for (const style in this.style) {
-      if (this.style.hasOwnProperty(style)) {
-        // $FlowFixMe
-        node.style[style] = this.style[style];
-      }
-    }
-
-    return node;
-  }
-
-  toMarkup() {
-    let markup = `<img  src='${this.src} 'alt='${this.alt}' `; // Add the styles, after hyphenation
-
-    let styles = "";
-
-    for (const style in this.style) {
-      if (this.style.hasOwnProperty(style)) {
-        styles += `${utils.hyphenate(style)}:${this.style[style]};`;
-      }
-    }
-
-    if (styles) {
-      markup += ` style="${utils.escape(styles)}"`;
-    }
-
-    markup += "'/>";
-    return markup;
-  }
-
-}
-const iCombinations = {
-  'î': '\u0131\u0302',
-  'ï': '\u0131\u0308',
-  'í': '\u0131\u0301',
-  // 'ī': '\u0131\u0304', // enable when we add Extended Latin
-  'ì': '\u0131\u0300'
-};
-/**
- * A symbol node contains information about a single symbol. It either renders
- * to a single text node, or a span with a single text node in it, depending on
- * whether it has CSS classes, styles, or needs italic correction.
- */
-
-class SymbolNode {
-  constructor(text, height, depth, italic, skew, width, classes, style) {
-    this.text = void 0;
-    this.height = void 0;
-    this.depth = void 0;
-    this.italic = void 0;
-    this.skew = void 0;
-    this.width = void 0;
-    this.maxFontSize = void 0;
-    this.classes = void 0;
-    this.style = void 0;
-    this.text = text;
-    this.height = height || 0;
-    this.depth = depth || 0;
-    this.italic = italic || 0;
-    this.skew = skew || 0;
-    this.width = width || 0;
-    this.classes = classes || [];
-    this.style = style || {};
-    this.maxFontSize = 0; // Mark text from non-Latin scripts with specific classes so that we
-    // can specify which fonts to use.  This allows us to render these
-    // characters with a serif font in situations where the browser would
-    // either default to a sans serif or render a placeholder character.
-    // We use CSS class names like cjk_fallback, hangul_fallback and
-    // brahmic_fallback. See ./unicodeScripts.js for the set of possible
-    // script names
-
-    const script = scriptFromCodepoint(this.text.charCodeAt(0));
-
-    if (script) {
-      this.classes.push(script + "_fallback");
-    }
-
-    if (/[îïíì]/.test(this.text)) {
-      // add ī when we add Extended Latin
-      this.text = iCombinations[this.text];
-    }
-  }
-
-  hasClass(className) {
-    return utils.contains(this.classes, className);
-  }
-  /**
-   * Creates a text node or span from a symbol node. Note that a span is only
-   * created if it is needed.
-   */
-
-
-  toNode() {
-    const node = document.createTextNode(this.text);
-    let span = null;
-
-    if (this.italic > 0) {
-      span = document.createElement("span");
-      span.style.marginRight = this.italic + "em";
-    }
-
-    if (this.classes.length > 0) {
-      span = span || document.createElement("span");
-      span.className = createClass(this.classes);
-    }
-
-    for (const style in this.style) {
-      if (this.style.hasOwnProperty(style)) {
-        span = span || document.createElement("span"); // $FlowFixMe Flow doesn't seem to understand span.style's type.
-
-        span.style[style] = this.style[style];
-      }
-    }
-
-    if (span) {
-      span.appendChild(node);
-      return span;
-    } else {
-      return node;
-    }
-  }
-  /**
-   * Creates markup for a symbol node.
-   */
-
-
-  toMarkup() {
-    // TODO(alpert): More duplication than I'd like from
-    // span.prototype.toMarkup and symbolNode.prototype.toNode...
-    let needsSpan = false;
-    let markup = "<span";
-
-    if (this.classes.length) {
-      needsSpan = true;
-      markup += " class=\"";
-      markup += utils.escape(createClass(this.classes));
-      markup += "\"";
-    }
-
-    let styles = "";
-
-    if (this.italic > 0) {
-      styles += "margin-right:" + this.italic + "em;";
-    }
-
-    for (const style in this.style) {
-      if (this.style.hasOwnProperty(style)) {
-        styles += utils.hyphenate(style) + ":" + this.style[style] + ";";
-      }
-    }
-
-    if (styles) {
-      needsSpan = true;
-      markup += " style=\"" + utils.escape(styles) + "\"";
-    }
-
-    const escaped = utils.escape(this.text);
-
-    if (needsSpan) {
-      markup += ">";
-      markup += escaped;
-      markup += "</span>";
-      return markup;
-    } else {
-      return escaped;
-    }
-  }
-
-}
-/**
- * SVG nodes are used to render stretchy wide elements.
- */
-
-class SvgNode {
-  constructor(children, attributes) {
-    this.children = void 0;
-    this.attributes = void 0;
-    this.children = children || [];
-    this.attributes = attributes || {};
-  }
-
-  toNode() {
-    const svgNS = "http://www.w3.org/2000/svg";
-    const node = document.createElementNS(svgNS, "svg"); // Apply attributes
-
-    for (const attr in this.attributes) {
-      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-        node.setAttribute(attr, this.attributes[attr]);
-      }
-    }
-
-    for (let i = 0; i < this.children.length; i++) {
-      node.appendChild(this.children[i].toNode());
-    }
-
-    return node;
-  }
-
-  toMarkup() {
-    let markup = "<svg"; // Apply attributes
-
-    for (const attr in this.attributes) {
-      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-        markup += ` ${attr}='${this.attributes[attr]}'`;
-      }
-    }
-
-    markup += ">";
-
-    for (let i = 0; i < this.children.length; i++) {
-      markup += this.children[i].toMarkup();
-    }
-
-    markup += "</svg>";
-    return markup;
-  }
-
-}
-class PathNode {
-  constructor(pathName, alternate) {
-    this.pathName = void 0;
-    this.alternate = void 0;
-    this.pathName = pathName;
-    this.alternate = alternate; // Used only for \sqrt
-  }
-
-  toNode() {
-    const svgNS = "http://www.w3.org/2000/svg";
-    const node = document.createElementNS(svgNS, "path");
-
-    if (this.alternate) {
-      node.setAttribute("d", this.alternate);
-    } else {
-      node.setAttribute("d", path[this.pathName]);
-    }
-
-    return node;
-  }
-
-  toMarkup() {
-    if (this.alternate) {
-      return `<path d='${this.alternate}'/>`;
-    } else {
-      return `<path d='${path[this.pathName]}'/>`;
-    }
-  }
-
-}
-class LineNode {
-  constructor(attributes) {
-    this.attributes = void 0;
-    this.attributes = attributes || {};
-  }
-
-  toNode() {
-    const svgNS = "http://www.w3.org/2000/svg";
-    const node = document.createElementNS(svgNS, "line"); // Apply attributes
-
-    for (const attr in this.attributes) {
-      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-        node.setAttribute(attr, this.attributes[attr]);
-      }
-    }
-
-    return node;
-  }
-
-  toMarkup() {
-    let markup = "<line";
-
-    for (const attr in this.attributes) {
-      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-        markup += ` ${attr}='${this.attributes[attr]}'`;
-      }
-    }
-
-    markup += "/>";
-    return markup;
-  }
-
-}
-function assertSymbolDomNode(group) {
-  if (group instanceof SymbolNode) {
-    return group;
-  } else {
-    throw new Error(`Expected symbolNode but got ${String(group)}.`);
-  }
-}
-function assertSpan(group) {
-  if (group instanceof Span) {
-    return group;
-  } else {
-    throw new Error(`Expected span<HtmlDomNode> but got ${String(group)}.`);
-  }
-}
-
-// This file is GENERATED by buildMetrics.sh. DO NOT MODIFY.
-var metricMap = {
-  "AMS-Regular": {
-    "65": [0, 0.68889, 0, 0, 0.72222],
-    "66": [0, 0.68889, 0, 0, 0.66667],
-    "67": [0, 0.68889, 0, 0, 0.72222],
-    "68": [0, 0.68889, 0, 0, 0.72222],
-    "69": [0, 0.68889, 0, 0, 0.66667],
-    "70": [0, 0.68889, 0, 0, 0.61111],
-    "71": [0, 0.68889, 0, 0, 0.77778],
-    "72": [0, 0.68889, 0, 0, 0.77778],
-    "73": [0, 0.68889, 0, 0, 0.38889],
-    "74": [0.16667, 0.68889, 0, 0, 0.5],
-    "75": [0, 0.68889, 0, 0, 0.77778],
-    "76": [0, 0.68889, 0, 0, 0.66667],
-    "77": [0, 0.68889, 0, 0, 0.94445],
-    "78": [0, 0.68889, 0, 0, 0.72222],
-    "79": [0.16667, 0.68889, 0, 0, 0.77778],
-    "80": [0, 0.68889, 0, 0, 0.61111],
-    "81": [0.16667, 0.68889, 0, 0, 0.77778],
-    "82": [0, 0.68889, 0, 0, 0.72222],
-    "83": [0, 0.68889, 0, 0, 0.55556],
-    "84": [0, 0.68889, 0, 0, 0.66667],
-    "85": [0, 0.68889, 0, 0, 0.72222],
-    "86": [0, 0.68889, 0, 0, 0.72222],
-    "87": [0, 0.68889, 0, 0, 1.0],
-    "88": [0, 0.68889, 0, 0, 0.72222],
-    "89": [0, 0.68889, 0, 0, 0.72222],
-    "90": [0, 0.68889, 0, 0, 0.66667],
-    "107": [0, 0.68889, 0, 0, 0.55556],
-    "165": [0, 0.675, 0.025, 0, 0.75],
-    "174": [0.15559, 0.69224, 0, 0, 0.94666],
-    "240": [0, 0.68889, 0, 0, 0.55556],
-    "295": [0, 0.68889, 0, 0, 0.54028],
-    "710": [0, 0.825, 0, 0, 2.33334],
-    "732": [0, 0.9, 0, 0, 2.33334],
-    "770": [0, 0.825, 0, 0, 2.33334],
-    "771": [0, 0.9, 0, 0, 2.33334],
-    "989": [0.08167, 0.58167, 0, 0, 0.77778],
-    "1008": [0, 0.43056, 0.04028, 0, 0.66667],
-    "8245": [0, 0.54986, 0, 0, 0.275],
-    "8463": [0, 0.68889, 0, 0, 0.54028],
-    "8487": [0, 0.68889, 0, 0, 0.72222],
-    "8498": [0, 0.68889, 0, 0, 0.55556],
-    "8502": [0, 0.68889, 0, 0, 0.66667],
-    "8503": [0, 0.68889, 0, 0, 0.44445],
-    "8504": [0, 0.68889, 0, 0, 0.66667],
-    "8513": [0, 0.68889, 0, 0, 0.63889],
-    "8592": [-0.03598, 0.46402, 0, 0, 0.5],
-    "8594": [-0.03598, 0.46402, 0, 0, 0.5],
-    "8602": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8603": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8606": [0.01354, 0.52239, 0, 0, 1.0],
-    "8608": [0.01354, 0.52239, 0, 0, 1.0],
-    "8610": [0.01354, 0.52239, 0, 0, 1.11111],
-    "8611": [0.01354, 0.52239, 0, 0, 1.11111],
-    "8619": [0, 0.54986, 0, 0, 1.0],
-    "8620": [0, 0.54986, 0, 0, 1.0],
-    "8621": [-0.13313, 0.37788, 0, 0, 1.38889],
-    "8622": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8624": [0, 0.69224, 0, 0, 0.5],
-    "8625": [0, 0.69224, 0, 0, 0.5],
-    "8630": [0, 0.43056, 0, 0, 1.0],
-    "8631": [0, 0.43056, 0, 0, 1.0],
-    "8634": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8635": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8638": [0.19444, 0.69224, 0, 0, 0.41667],
-    "8639": [0.19444, 0.69224, 0, 0, 0.41667],
-    "8642": [0.19444, 0.69224, 0, 0, 0.41667],
-    "8643": [0.19444, 0.69224, 0, 0, 0.41667],
-    "8644": [0.1808, 0.675, 0, 0, 1.0],
-    "8646": [0.1808, 0.675, 0, 0, 1.0],
-    "8647": [0.1808, 0.675, 0, 0, 1.0],
-    "8648": [0.19444, 0.69224, 0, 0, 0.83334],
-    "8649": [0.1808, 0.675, 0, 0, 1.0],
-    "8650": [0.19444, 0.69224, 0, 0, 0.83334],
-    "8651": [0.01354, 0.52239, 0, 0, 1.0],
-    "8652": [0.01354, 0.52239, 0, 0, 1.0],
-    "8653": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8654": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8655": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8666": [0.13667, 0.63667, 0, 0, 1.0],
-    "8667": [0.13667, 0.63667, 0, 0, 1.0],
-    "8669": [-0.13313, 0.37788, 0, 0, 1.0],
-    "8672": [-0.064, 0.437, 0, 0, 1.334],
-    "8674": [-0.064, 0.437, 0, 0, 1.334],
-    "8705": [0, 0.825, 0, 0, 0.5],
-    "8708": [0, 0.68889, 0, 0, 0.55556],
-    "8709": [0.08167, 0.58167, 0, 0, 0.77778],
-    "8717": [0, 0.43056, 0, 0, 0.42917],
-    "8722": [-0.03598, 0.46402, 0, 0, 0.5],
-    "8724": [0.08198, 0.69224, 0, 0, 0.77778],
-    "8726": [0.08167, 0.58167, 0, 0, 0.77778],
-    "8733": [0, 0.69224, 0, 0, 0.77778],
-    "8736": [0, 0.69224, 0, 0, 0.72222],
-    "8737": [0, 0.69224, 0, 0, 0.72222],
-    "8738": [0.03517, 0.52239, 0, 0, 0.72222],
-    "8739": [0.08167, 0.58167, 0, 0, 0.22222],
-    "8740": [0.25142, 0.74111, 0, 0, 0.27778],
-    "8741": [0.08167, 0.58167, 0, 0, 0.38889],
-    "8742": [0.25142, 0.74111, 0, 0, 0.5],
-    "8756": [0, 0.69224, 0, 0, 0.66667],
-    "8757": [0, 0.69224, 0, 0, 0.66667],
-    "8764": [-0.13313, 0.36687, 0, 0, 0.77778],
-    "8765": [-0.13313, 0.37788, 0, 0, 0.77778],
-    "8769": [-0.13313, 0.36687, 0, 0, 0.77778],
-    "8770": [-0.03625, 0.46375, 0, 0, 0.77778],
-    "8774": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8776": [-0.01688, 0.48312, 0, 0, 0.77778],
-    "8778": [0.08167, 0.58167, 0, 0, 0.77778],
-    "8782": [0.06062, 0.54986, 0, 0, 0.77778],
-    "8783": [0.06062, 0.54986, 0, 0, 0.77778],
-    "8785": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8786": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8787": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8790": [0, 0.69224, 0, 0, 0.77778],
-    "8791": [0.22958, 0.72958, 0, 0, 0.77778],
-    "8796": [0.08198, 0.91667, 0, 0, 0.77778],
-    "8806": [0.25583, 0.75583, 0, 0, 0.77778],
-    "8807": [0.25583, 0.75583, 0, 0, 0.77778],
-    "8808": [0.25142, 0.75726, 0, 0, 0.77778],
-    "8809": [0.25142, 0.75726, 0, 0, 0.77778],
-    "8812": [0.25583, 0.75583, 0, 0, 0.5],
-    "8814": [0.20576, 0.70576, 0, 0, 0.77778],
-    "8815": [0.20576, 0.70576, 0, 0, 0.77778],
-    "8816": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8817": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8818": [0.22958, 0.72958, 0, 0, 0.77778],
-    "8819": [0.22958, 0.72958, 0, 0, 0.77778],
-    "8822": [0.1808, 0.675, 0, 0, 0.77778],
-    "8823": [0.1808, 0.675, 0, 0, 0.77778],
-    "8828": [0.13667, 0.63667, 0, 0, 0.77778],
-    "8829": [0.13667, 0.63667, 0, 0, 0.77778],
-    "8830": [0.22958, 0.72958, 0, 0, 0.77778],
-    "8831": [0.22958, 0.72958, 0, 0, 0.77778],
-    "8832": [0.20576, 0.70576, 0, 0, 0.77778],
-    "8833": [0.20576, 0.70576, 0, 0, 0.77778],
-    "8840": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8841": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8842": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8843": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8847": [0.03517, 0.54986, 0, 0, 0.77778],
-    "8848": [0.03517, 0.54986, 0, 0, 0.77778],
-    "8858": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8859": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8861": [0.08198, 0.58198, 0, 0, 0.77778],
-    "8862": [0, 0.675, 0, 0, 0.77778],
-    "8863": [0, 0.675, 0, 0, 0.77778],
-    "8864": [0, 0.675, 0, 0, 0.77778],
-    "8865": [0, 0.675, 0, 0, 0.77778],
-    "8872": [0, 0.69224, 0, 0, 0.61111],
-    "8873": [0, 0.69224, 0, 0, 0.72222],
-    "8874": [0, 0.69224, 0, 0, 0.88889],
-    "8876": [0, 0.68889, 0, 0, 0.61111],
-    "8877": [0, 0.68889, 0, 0, 0.61111],
-    "8878": [0, 0.68889, 0, 0, 0.72222],
-    "8879": [0, 0.68889, 0, 0, 0.72222],
-    "8882": [0.03517, 0.54986, 0, 0, 0.77778],
-    "8883": [0.03517, 0.54986, 0, 0, 0.77778],
-    "8884": [0.13667, 0.63667, 0, 0, 0.77778],
-    "8885": [0.13667, 0.63667, 0, 0, 0.77778],
-    "8888": [0, 0.54986, 0, 0, 1.11111],
-    "8890": [0.19444, 0.43056, 0, 0, 0.55556],
-    "8891": [0.19444, 0.69224, 0, 0, 0.61111],
-    "8892": [0.19444, 0.69224, 0, 0, 0.61111],
-    "8901": [0, 0.54986, 0, 0, 0.27778],
-    "8903": [0.08167, 0.58167, 0, 0, 0.77778],
-    "8905": [0.08167, 0.58167, 0, 0, 0.77778],
-    "8906": [0.08167, 0.58167, 0, 0, 0.77778],
-    "8907": [0, 0.69224, 0, 0, 0.77778],
-    "8908": [0, 0.69224, 0, 0, 0.77778],
-    "8909": [-0.03598, 0.46402, 0, 0, 0.77778],
-    "8910": [0, 0.54986, 0, 0, 0.76042],
-    "8911": [0, 0.54986, 0, 0, 0.76042],
-    "8912": [0.03517, 0.54986, 0, 0, 0.77778],
-    "8913": [0.03517, 0.54986, 0, 0, 0.77778],
-    "8914": [0, 0.54986, 0, 0, 0.66667],
-    "8915": [0, 0.54986, 0, 0, 0.66667],
-    "8916": [0, 0.69224, 0, 0, 0.66667],
-    "8918": [0.0391, 0.5391, 0, 0, 0.77778],
-    "8919": [0.0391, 0.5391, 0, 0, 0.77778],
-    "8920": [0.03517, 0.54986, 0, 0, 1.33334],
-    "8921": [0.03517, 0.54986, 0, 0, 1.33334],
-    "8922": [0.38569, 0.88569, 0, 0, 0.77778],
-    "8923": [0.38569, 0.88569, 0, 0, 0.77778],
-    "8926": [0.13667, 0.63667, 0, 0, 0.77778],
-    "8927": [0.13667, 0.63667, 0, 0, 0.77778],
-    "8928": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8929": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8934": [0.23222, 0.74111, 0, 0, 0.77778],
-    "8935": [0.23222, 0.74111, 0, 0, 0.77778],
-    "8936": [0.23222, 0.74111, 0, 0, 0.77778],
-    "8937": [0.23222, 0.74111, 0, 0, 0.77778],
-    "8938": [0.20576, 0.70576, 0, 0, 0.77778],
-    "8939": [0.20576, 0.70576, 0, 0, 0.77778],
-    "8940": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8941": [0.30274, 0.79383, 0, 0, 0.77778],
-    "8994": [0.19444, 0.69224, 0, 0, 0.77778],
-    "8995": [0.19444, 0.69224, 0, 0, 0.77778],
-    "9416": [0.15559, 0.69224, 0, 0, 0.90222],
-    "9484": [0, 0.69224, 0, 0, 0.5],
-    "9488": [0, 0.69224, 0, 0, 0.5],
-    "9492": [0, 0.37788, 0, 0, 0.5],
-    "9496": [0, 0.37788, 0, 0, 0.5],
-    "9585": [0.19444, 0.68889, 0, 0, 0.88889],
-    "9586": [0.19444, 0.74111, 0, 0, 0.88889],
-    "9632": [0, 0.675, 0, 0, 0.77778],
-    "9633": [0, 0.675, 0, 0, 0.77778],
-    "9650": [0, 0.54986, 0, 0, 0.72222],
-    "9651": [0, 0.54986, 0, 0, 0.72222],
-    "9654": [0.03517, 0.54986, 0, 0, 0.77778],
-    "9660": [0, 0.54986, 0, 0, 0.72222],
-    "9661": [0, 0.54986, 0, 0, 0.72222],
-    "9664": [0.03517, 0.54986, 0, 0, 0.77778],
-    "9674": [0.11111, 0.69224, 0, 0, 0.66667],
-    "9733": [0.19444, 0.69224, 0, 0, 0.94445],
-    "10003": [0, 0.69224, 0, 0, 0.83334],
-    "10016": [0, 0.69224, 0, 0, 0.83334],
-    "10731": [0.11111, 0.69224, 0, 0, 0.66667],
-    "10846": [0.19444, 0.75583, 0, 0, 0.61111],
-    "10877": [0.13667, 0.63667, 0, 0, 0.77778],
-    "10878": [0.13667, 0.63667, 0, 0, 0.77778],
-    "10885": [0.25583, 0.75583, 0, 0, 0.77778],
-    "10886": [0.25583, 0.75583, 0, 0, 0.77778],
-    "10887": [0.13597, 0.63597, 0, 0, 0.77778],
-    "10888": [0.13597, 0.63597, 0, 0, 0.77778],
-    "10889": [0.26167, 0.75726, 0, 0, 0.77778],
-    "10890": [0.26167, 0.75726, 0, 0, 0.77778],
-    "10891": [0.48256, 0.98256, 0, 0, 0.77778],
-    "10892": [0.48256, 0.98256, 0, 0, 0.77778],
-    "10901": [0.13667, 0.63667, 0, 0, 0.77778],
-    "10902": [0.13667, 0.63667, 0, 0, 0.77778],
-    "10933": [0.25142, 0.75726, 0, 0, 0.77778],
-    "10934": [0.25142, 0.75726, 0, 0, 0.77778],
-    "10935": [0.26167, 0.75726, 0, 0, 0.77778],
-    "10936": [0.26167, 0.75726, 0, 0, 0.77778],
-    "10937": [0.26167, 0.75726, 0, 0, 0.77778],
-    "10938": [0.26167, 0.75726, 0, 0, 0.77778],
-    "10949": [0.25583, 0.75583, 0, 0, 0.77778],
-    "10950": [0.25583, 0.75583, 0, 0, 0.77778],
-    "10955": [0.28481, 0.79383, 0, 0, 0.77778],
-    "10956": [0.28481, 0.79383, 0, 0, 0.77778],
-    "57350": [0.08167, 0.58167, 0, 0, 0.22222],
-    "57351": [0.08167, 0.58167, 0, 0, 0.38889],
-    "57352": [0.08167, 0.58167, 0, 0, 0.77778],
-    "57353": [0, 0.43056, 0.04028, 0, 0.66667],
-    "57356": [0.25142, 0.75726, 0, 0, 0.77778],
-    "57357": [0.25142, 0.75726, 0, 0, 0.77778],
-    "57358": [0.41951, 0.91951, 0, 0, 0.77778],
-    "57359": [0.30274, 0.79383, 0, 0, 0.77778],
-    "57360": [0.30274, 0.79383, 0, 0, 0.77778],
-    "57361": [0.41951, 0.91951, 0, 0, 0.77778],
-    "57366": [0.25142, 0.75726, 0, 0, 0.77778],
-    "57367": [0.25142, 0.75726, 0, 0, 0.77778],
-    "57368": [0.25142, 0.75726, 0, 0, 0.77778],
-    "57369": [0.25142, 0.75726, 0, 0, 0.77778],
-    "57370": [0.13597, 0.63597, 0, 0, 0.77778],
-    "57371": [0.13597, 0.63597, 0, 0, 0.77778]
-  },
-  "Caligraphic-Regular": {
-    "48": [0, 0.43056, 0, 0, 0.5],
-    "49": [0, 0.43056, 0, 0, 0.5],
-    "50": [0, 0.43056, 0, 0, 0.5],
-    "51": [0.19444, 0.43056, 0, 0, 0.5],
-    "52": [0.19444, 0.43056, 0, 0, 0.5],
-    "53": [0.19444, 0.43056, 0, 0, 0.5],
-    "54": [0, 0.64444, 0, 0, 0.5],
-    "55": [0.19444, 0.43056, 0, 0, 0.5],
-    "56": [0, 0.64444, 0, 0, 0.5],
-    "57": [0.19444, 0.43056, 0, 0, 0.5],
-    "65": [0, 0.68333, 0, 0.19445, 0.79847],
-    "66": [0, 0.68333, 0.03041, 0.13889, 0.65681],
-    "67": [0, 0.68333, 0.05834, 0.13889, 0.52653],
-    "68": [0, 0.68333, 0.02778, 0.08334, 0.77139],
-    "69": [0, 0.68333, 0.08944, 0.11111, 0.52778],
-    "70": [0, 0.68333, 0.09931, 0.11111, 0.71875],
-    "71": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487],
-    "72": [0, 0.68333, 0.00965, 0.11111, 0.84452],
-    "73": [0, 0.68333, 0.07382, 0, 0.54452],
-    "74": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778],
-    "75": [0, 0.68333, 0.01445, 0.05556, 0.76195],
-    "76": [0, 0.68333, 0, 0.13889, 0.68972],
-    "77": [0, 0.68333, 0, 0.13889, 1.2009],
-    "78": [0, 0.68333, 0.14736, 0.08334, 0.82049],
-    "79": [0, 0.68333, 0.02778, 0.11111, 0.79611],
-    "80": [0, 0.68333, 0.08222, 0.08334, 0.69556],
-    "81": [0.09722, 0.68333, 0, 0.11111, 0.81667],
-    "82": [0, 0.68333, 0, 0.08334, 0.8475],
-    "83": [0, 0.68333, 0.075, 0.13889, 0.60556],
-    "84": [0, 0.68333, 0.25417, 0, 0.54464],
-    "85": [0, 0.68333, 0.09931, 0.08334, 0.62583],
-    "86": [0, 0.68333, 0.08222, 0, 0.61278],
-    "87": [0, 0.68333, 0.08222, 0.08334, 0.98778],
-    "88": [0, 0.68333, 0.14643, 0.13889, 0.7133],
-    "89": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834],
-    "90": [0, 0.68333, 0.07944, 0.13889, 0.72473]
-  },
-  "Fraktur-Regular": {
-    "33": [0, 0.69141, 0, 0, 0.29574],
-    "34": [0, 0.69141, 0, 0, 0.21471],
-    "38": [0, 0.69141, 0, 0, 0.73786],
-    "39": [0, 0.69141, 0, 0, 0.21201],
-    "40": [0.24982, 0.74947, 0, 0, 0.38865],
-    "41": [0.24982, 0.74947, 0, 0, 0.38865],
-    "42": [0, 0.62119, 0, 0, 0.27764],
-    "43": [0.08319, 0.58283, 0, 0, 0.75623],
-    "44": [0, 0.10803, 0, 0, 0.27764],
-    "45": [0.08319, 0.58283, 0, 0, 0.75623],
-    "46": [0, 0.10803, 0, 0, 0.27764],
-    "47": [0.24982, 0.74947, 0, 0, 0.50181],
-    "48": [0, 0.47534, 0, 0, 0.50181],
-    "49": [0, 0.47534, 0, 0, 0.50181],
-    "50": [0, 0.47534, 0, 0, 0.50181],
-    "51": [0.18906, 0.47534, 0, 0, 0.50181],
-    "52": [0.18906, 0.47534, 0, 0, 0.50181],
-    "53": [0.18906, 0.47534, 0, 0, 0.50181],
-    "54": [0, 0.69141, 0, 0, 0.50181],
-    "55": [0.18906, 0.47534, 0, 0, 0.50181],
-    "56": [0, 0.69141, 0, 0, 0.50181],
-    "57": [0.18906, 0.47534, 0, 0, 0.50181],
-    "58": [0, 0.47534, 0, 0, 0.21606],
-    "59": [0.12604, 0.47534, 0, 0, 0.21606],
-    "61": [-0.13099, 0.36866, 0, 0, 0.75623],
-    "63": [0, 0.69141, 0, 0, 0.36245],
-    "65": [0, 0.69141, 0, 0, 0.7176],
-    "66": [0, 0.69141, 0, 0, 0.88397],
-    "67": [0, 0.69141, 0, 0, 0.61254],
-    "68": [0, 0.69141, 0, 0, 0.83158],
-    "69": [0, 0.69141, 0, 0, 0.66278],
-    "70": [0.12604, 0.69141, 0, 0, 0.61119],
-    "71": [0, 0.69141, 0, 0, 0.78539],
-    "72": [0.06302, 0.69141, 0, 0, 0.7203],
-    "73": [0, 0.69141, 0, 0, 0.55448],
-    "74": [0.12604, 0.69141, 0, 0, 0.55231],
-    "75": [0, 0.69141, 0, 0, 0.66845],
-    "76": [0, 0.69141, 0, 0, 0.66602],
-    "77": [0, 0.69141, 0, 0, 1.04953],
-    "78": [0, 0.69141, 0, 0, 0.83212],
-    "79": [0, 0.69141, 0, 0, 0.82699],
-    "80": [0.18906, 0.69141, 0, 0, 0.82753],
-    "81": [0.03781, 0.69141, 0, 0, 0.82699],
-    "82": [0, 0.69141, 0, 0, 0.82807],
-    "83": [0, 0.69141, 0, 0, 0.82861],
-    "84": [0, 0.69141, 0, 0, 0.66899],
-    "85": [0, 0.69141, 0, 0, 0.64576],
-    "86": [0, 0.69141, 0, 0, 0.83131],
-    "87": [0, 0.69141, 0, 0, 1.04602],
-    "88": [0, 0.69141, 0, 0, 0.71922],
-    "89": [0.18906, 0.69141, 0, 0, 0.83293],
-    "90": [0.12604, 0.69141, 0, 0, 0.60201],
-    "91": [0.24982, 0.74947, 0, 0, 0.27764],
-    "93": [0.24982, 0.74947, 0, 0, 0.27764],
-    "94": [0, 0.69141, 0, 0, 0.49965],
-    "97": [0, 0.47534, 0, 0, 0.50046],
-    "98": [0, 0.69141, 0, 0, 0.51315],
-    "99": [0, 0.47534, 0, 0, 0.38946],
-    "100": [0, 0.62119, 0, 0, 0.49857],
-    "101": [0, 0.47534, 0, 0, 0.40053],
-    "102": [0.18906, 0.69141, 0, 0, 0.32626],
-    "103": [0.18906, 0.47534, 0, 0, 0.5037],
-    "104": [0.18906, 0.69141, 0, 0, 0.52126],
-    "105": [0, 0.69141, 0, 0, 0.27899],
-    "106": [0, 0.69141, 0, 0, 0.28088],
-    "107": [0, 0.69141, 0, 0, 0.38946],
-    "108": [0, 0.69141, 0, 0, 0.27953],
-    "109": [0, 0.47534, 0, 0, 0.76676],
-    "110": [0, 0.47534, 0, 0, 0.52666],
-    "111": [0, 0.47534, 0, 0, 0.48885],
-    "112": [0.18906, 0.52396, 0, 0, 0.50046],
-    "113": [0.18906, 0.47534, 0, 0, 0.48912],
-    "114": [0, 0.47534, 0, 0, 0.38919],
-    "115": [0, 0.47534, 0, 0, 0.44266],
-    "116": [0, 0.62119, 0, 0, 0.33301],
-    "117": [0, 0.47534, 0, 0, 0.5172],
-    "118": [0, 0.52396, 0, 0, 0.5118],
-    "119": [0, 0.52396, 0, 0, 0.77351],
-    "120": [0.18906, 0.47534, 0, 0, 0.38865],
-    "121": [0.18906, 0.47534, 0, 0, 0.49884],
-    "122": [0.18906, 0.47534, 0, 0, 0.39054],
-    "8216": [0, 0.69141, 0, 0, 0.21471],
-    "8217": [0, 0.69141, 0, 0, 0.21471],
-    "58112": [0, 0.62119, 0, 0, 0.49749],
-    "58113": [0, 0.62119, 0, 0, 0.4983],
-    "58114": [0.18906, 0.69141, 0, 0, 0.33328],
-    "58115": [0.18906, 0.69141, 0, 0, 0.32923],
-    "58116": [0.18906, 0.47534, 0, 0, 0.50343],
-    "58117": [0, 0.69141, 0, 0, 0.33301],
-    "58118": [0, 0.62119, 0, 0, 0.33409],
-    "58119": [0, 0.47534, 0, 0, 0.50073]
-  },
-  "Main-Bold": {
-    "33": [0, 0.69444, 0, 0, 0.35],
-    "34": [0, 0.69444, 0, 0, 0.60278],
-    "35": [0.19444, 0.69444, 0, 0, 0.95833],
-    "36": [0.05556, 0.75, 0, 0, 0.575],
-    "37": [0.05556, 0.75, 0, 0, 0.95833],
-    "38": [0, 0.69444, 0, 0, 0.89444],
-    "39": [0, 0.69444, 0, 0, 0.31944],
-    "40": [0.25, 0.75, 0, 0, 0.44722],
-    "41": [0.25, 0.75, 0, 0, 0.44722],
-    "42": [0, 0.75, 0, 0, 0.575],
-    "43": [0.13333, 0.63333, 0, 0, 0.89444],
-    "44": [0.19444, 0.15556, 0, 0, 0.31944],
-    "45": [0, 0.44444, 0, 0, 0.38333],
-    "46": [0, 0.15556, 0, 0, 0.31944],
-    "47": [0.25, 0.75, 0, 0, 0.575],
-    "48": [0, 0.64444, 0, 0, 0.575],
-    "49": [0, 0.64444, 0, 0, 0.575],
-    "50": [0, 0.64444, 0, 0, 0.575],
-    "51": [0, 0.64444, 0, 0, 0.575],
-    "52": [0, 0.64444, 0, 0, 0.575],
-    "53": [0, 0.64444, 0, 0, 0.575],
-    "54": [0, 0.64444, 0, 0, 0.575],
-    "55": [0, 0.64444, 0, 0, 0.575],
-    "56": [0, 0.64444, 0, 0, 0.575],
-    "57": [0, 0.64444, 0, 0, 0.575],
-    "58": [0, 0.44444, 0, 0, 0.31944],
-    "59": [0.19444, 0.44444, 0, 0, 0.31944],
-    "60": [0.08556, 0.58556, 0, 0, 0.89444],
-    "61": [-0.10889, 0.39111, 0, 0, 0.89444],
-    "62": [0.08556, 0.58556, 0, 0, 0.89444],
-    "63": [0, 0.69444, 0, 0, 0.54305],
-    "64": [0, 0.69444, 0, 0, 0.89444],
-    "65": [0, 0.68611, 0, 0, 0.86944],
-    "66": [0, 0.68611, 0, 0, 0.81805],
-    "67": [0, 0.68611, 0, 0, 0.83055],
-    "68": [0, 0.68611, 0, 0, 0.88194],
-    "69": [0, 0.68611, 0, 0, 0.75555],
-    "70": [0, 0.68611, 0, 0, 0.72361],
-    "71": [0, 0.68611, 0, 0, 0.90416],
-    "72": [0, 0.68611, 0, 0, 0.9],
-    "73": [0, 0.68611, 0, 0, 0.43611],
-    "74": [0, 0.68611, 0, 0, 0.59444],
-    "75": [0, 0.68611, 0, 0, 0.90138],
-    "76": [0, 0.68611, 0, 0, 0.69166],
-    "77": [0, 0.68611, 0, 0, 1.09166],
-    "78": [0, 0.68611, 0, 0, 0.9],
-    "79": [0, 0.68611, 0, 0, 0.86388],
-    "80": [0, 0.68611, 0, 0, 0.78611],
-    "81": [0.19444, 0.68611, 0, 0, 0.86388],
-    "82": [0, 0.68611, 0, 0, 0.8625],
-    "83": [0, 0.68611, 0, 0, 0.63889],
-    "84": [0, 0.68611, 0, 0, 0.8],
-    "85": [0, 0.68611, 0, 0, 0.88472],
-    "86": [0, 0.68611, 0.01597, 0, 0.86944],
-    "87": [0, 0.68611, 0.01597, 0, 1.18888],
-    "88": [0, 0.68611, 0, 0, 0.86944],
-    "89": [0, 0.68611, 0.02875, 0, 0.86944],
-    "90": [0, 0.68611, 0, 0, 0.70277],
-    "91": [0.25, 0.75, 0, 0, 0.31944],
-    "92": [0.25, 0.75, 0, 0, 0.575],
-    "93": [0.25, 0.75, 0, 0, 0.31944],
-    "94": [0, 0.69444, 0, 0, 0.575],
-    "95": [0.31, 0.13444, 0.03194, 0, 0.575],
-    "97": [0, 0.44444, 0, 0, 0.55902],
-    "98": [0, 0.69444, 0, 0, 0.63889],
-    "99": [0, 0.44444, 0, 0, 0.51111],
-    "100": [0, 0.69444, 0, 0, 0.63889],
-    "101": [0, 0.44444, 0, 0, 0.52708],
-    "102": [0, 0.69444, 0.10903, 0, 0.35139],
-    "103": [0.19444, 0.44444, 0.01597, 0, 0.575],
-    "104": [0, 0.69444, 0, 0, 0.63889],
-    "105": [0, 0.69444, 0, 0, 0.31944],
-    "106": [0.19444, 0.69444, 0, 0, 0.35139],
-    "107": [0, 0.69444, 0, 0, 0.60694],
-    "108": [0, 0.69444, 0, 0, 0.31944],
-    "109": [0, 0.44444, 0, 0, 0.95833],
-    "110": [0, 0.44444, 0, 0, 0.63889],
-    "111": [0, 0.44444, 0, 0, 0.575],
-    "112": [0.19444, 0.44444, 0, 0, 0.63889],
-    "113": [0.19444, 0.44444, 0, 0, 0.60694],
-    "114": [0, 0.44444, 0, 0, 0.47361],
-    "115": [0, 0.44444, 0, 0, 0.45361],
-    "116": [0, 0.63492, 0, 0, 0.44722],
-    "117": [0, 0.44444, 0, 0, 0.63889],
-    "118": [0, 0.44444, 0.01597, 0, 0.60694],
-    "119": [0, 0.44444, 0.01597, 0, 0.83055],
-    "120": [0, 0.44444, 0, 0, 0.60694],
-    "121": [0.19444, 0.44444, 0.01597, 0, 0.60694],
-    "122": [0, 0.44444, 0, 0, 0.51111],
-    "123": [0.25, 0.75, 0, 0, 0.575],
-    "124": [0.25, 0.75, 0, 0, 0.31944],
-    "125": [0.25, 0.75, 0, 0, 0.575],
-    "126": [0.35, 0.34444, 0, 0, 0.575],
-    "168": [0, 0.69444, 0, 0, 0.575],
-    "172": [0, 0.44444, 0, 0, 0.76666],
-    "176": [0, 0.69444, 0, 0, 0.86944],
-    "177": [0.13333, 0.63333, 0, 0, 0.89444],
-    "184": [0.17014, 0, 0, 0, 0.51111],
-    "198": [0, 0.68611, 0, 0, 1.04166],
-    "215": [0.13333, 0.63333, 0, 0, 0.89444],
-    "216": [0.04861, 0.73472, 0, 0, 0.89444],
-    "223": [0, 0.69444, 0, 0, 0.59722],
-    "230": [0, 0.44444, 0, 0, 0.83055],
-    "247": [0.13333, 0.63333, 0, 0, 0.89444],
-    "248": [0.09722, 0.54167, 0, 0, 0.575],
-    "305": [0, 0.44444, 0, 0, 0.31944],
-    "338": [0, 0.68611, 0, 0, 1.16944],
-    "339": [0, 0.44444, 0, 0, 0.89444],
-    "567": [0.19444, 0.44444, 0, 0, 0.35139],
-    "710": [0, 0.69444, 0, 0, 0.575],
-    "711": [0, 0.63194, 0, 0, 0.575],
-    "713": [0, 0.59611, 0, 0, 0.575],
-    "714": [0, 0.69444, 0, 0, 0.575],
-    "715": [0, 0.69444, 0, 0, 0.575],
-    "728": [0, 0.69444, 0, 0, 0.575],
-    "729": [0, 0.69444, 0, 0, 0.31944],
-    "730": [0, 0.69444, 0, 0, 0.86944],
-    "732": [0, 0.69444, 0, 0, 0.575],
-    "733": [0, 0.69444, 0, 0, 0.575],
-    "915": [0, 0.68611, 0, 0, 0.69166],
-    "916": [0, 0.68611, 0, 0, 0.95833],
-    "920": [0, 0.68611, 0, 0, 0.89444],
-    "923": [0, 0.68611, 0, 0, 0.80555],
-    "926": [0, 0.68611, 0, 0, 0.76666],
-    "928": [0, 0.68611, 0, 0, 0.9],
-    "931": [0, 0.68611, 0, 0, 0.83055],
-    "933": [0, 0.68611, 0, 0, 0.89444],
-    "934": [0, 0.68611, 0, 0, 0.83055],
-    "936": [0, 0.68611, 0, 0, 0.89444],
-    "937": [0, 0.68611, 0, 0, 0.83055],
-    "8211": [0, 0.44444, 0.03194, 0, 0.575],
-    "8212": [0, 0.44444, 0.03194, 0, 1.14999],
-    "8216": [0, 0.69444, 0, 0, 0.31944],
-    "8217": [0, 0.69444, 0, 0, 0.31944],
-    "8220": [0, 0.69444, 0, 0, 0.60278],
-    "8221": [0, 0.69444, 0, 0, 0.60278],
-    "8224": [0.19444, 0.69444, 0, 0, 0.51111],
-    "8225": [0.19444, 0.69444, 0, 0, 0.51111],
-    "8242": [0, 0.55556, 0, 0, 0.34444],
-    "8407": [0, 0.72444, 0.15486, 0, 0.575],
-    "8463": [0, 0.69444, 0, 0, 0.66759],
-    "8465": [0, 0.69444, 0, 0, 0.83055],
-    "8467": [0, 0.69444, 0, 0, 0.47361],
-    "8472": [0.19444, 0.44444, 0, 0, 0.74027],
-    "8476": [0, 0.69444, 0, 0, 0.83055],
-    "8501": [0, 0.69444, 0, 0, 0.70277],
-    "8592": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8593": [0.19444, 0.69444, 0, 0, 0.575],
-    "8594": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8595": [0.19444, 0.69444, 0, 0, 0.575],
-    "8596": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8597": [0.25, 0.75, 0, 0, 0.575],
-    "8598": [0.19444, 0.69444, 0, 0, 1.14999],
-    "8599": [0.19444, 0.69444, 0, 0, 1.14999],
-    "8600": [0.19444, 0.69444, 0, 0, 1.14999],
-    "8601": [0.19444, 0.69444, 0, 0, 1.14999],
-    "8636": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8637": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8640": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8641": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8656": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8657": [0.19444, 0.69444, 0, 0, 0.70277],
-    "8658": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8659": [0.19444, 0.69444, 0, 0, 0.70277],
-    "8660": [-0.10889, 0.39111, 0, 0, 1.14999],
-    "8661": [0.25, 0.75, 0, 0, 0.70277],
-    "8704": [0, 0.69444, 0, 0, 0.63889],
-    "8706": [0, 0.69444, 0.06389, 0, 0.62847],
-    "8707": [0, 0.69444, 0, 0, 0.63889],
-    "8709": [0.05556, 0.75, 0, 0, 0.575],
-    "8711": [0, 0.68611, 0, 0, 0.95833],
-    "8712": [0.08556, 0.58556, 0, 0, 0.76666],
-    "8715": [0.08556, 0.58556, 0, 0, 0.76666],
-    "8722": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8723": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8725": [0.25, 0.75, 0, 0, 0.575],
-    "8726": [0.25, 0.75, 0, 0, 0.575],
-    "8727": [-0.02778, 0.47222, 0, 0, 0.575],
-    "8728": [-0.02639, 0.47361, 0, 0, 0.575],
-    "8729": [-0.02639, 0.47361, 0, 0, 0.575],
-    "8730": [0.18, 0.82, 0, 0, 0.95833],
-    "8733": [0, 0.44444, 0, 0, 0.89444],
-    "8734": [0, 0.44444, 0, 0, 1.14999],
-    "8736": [0, 0.69224, 0, 0, 0.72222],
-    "8739": [0.25, 0.75, 0, 0, 0.31944],
-    "8741": [0.25, 0.75, 0, 0, 0.575],
-    "8743": [0, 0.55556, 0, 0, 0.76666],
-    "8744": [0, 0.55556, 0, 0, 0.76666],
-    "8745": [0, 0.55556, 0, 0, 0.76666],
-    "8746": [0, 0.55556, 0, 0, 0.76666],
-    "8747": [0.19444, 0.69444, 0.12778, 0, 0.56875],
-    "8764": [-0.10889, 0.39111, 0, 0, 0.89444],
-    "8768": [0.19444, 0.69444, 0, 0, 0.31944],
-    "8771": [0.00222, 0.50222, 0, 0, 0.89444],
-    "8776": [0.02444, 0.52444, 0, 0, 0.89444],
-    "8781": [0.00222, 0.50222, 0, 0, 0.89444],
-    "8801": [0.00222, 0.50222, 0, 0, 0.89444],
-    "8804": [0.19667, 0.69667, 0, 0, 0.89444],
-    "8805": [0.19667, 0.69667, 0, 0, 0.89444],
-    "8810": [0.08556, 0.58556, 0, 0, 1.14999],
-    "8811": [0.08556, 0.58556, 0, 0, 1.14999],
-    "8826": [0.08556, 0.58556, 0, 0, 0.89444],
-    "8827": [0.08556, 0.58556, 0, 0, 0.89444],
-    "8834": [0.08556, 0.58556, 0, 0, 0.89444],
-    "8835": [0.08556, 0.58556, 0, 0, 0.89444],
-    "8838": [0.19667, 0.69667, 0, 0, 0.89444],
-    "8839": [0.19667, 0.69667, 0, 0, 0.89444],
-    "8846": [0, 0.55556, 0, 0, 0.76666],
-    "8849": [0.19667, 0.69667, 0, 0, 0.89444],
-    "8850": [0.19667, 0.69667, 0, 0, 0.89444],
-    "8851": [0, 0.55556, 0, 0, 0.76666],
-    "8852": [0, 0.55556, 0, 0, 0.76666],
-    "8853": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8854": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8855": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8856": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8857": [0.13333, 0.63333, 0, 0, 0.89444],
-    "8866": [0, 0.69444, 0, 0, 0.70277],
-    "8867": [0, 0.69444, 0, 0, 0.70277],
-    "8868": [0, 0.69444, 0, 0, 0.89444],
-    "8869": [0, 0.69444, 0, 0, 0.89444],
-    "8900": [-0.02639, 0.47361, 0, 0, 0.575],
-    "8901": [-0.02639, 0.47361, 0, 0, 0.31944],
-    "8902": [-0.02778, 0.47222, 0, 0, 0.575],
-    "8968": [0.25, 0.75, 0, 0, 0.51111],
-    "8969": [0.25, 0.75, 0, 0, 0.51111],
-    "8970": [0.25, 0.75, 0, 0, 0.51111],
-    "8971": [0.25, 0.75, 0, 0, 0.51111],
-    "8994": [-0.13889, 0.36111, 0, 0, 1.14999],
-    "8995": [-0.13889, 0.36111, 0, 0, 1.14999],
-    "9651": [0.19444, 0.69444, 0, 0, 1.02222],
-    "9657": [-0.02778, 0.47222, 0, 0, 0.575],
-    "9661": [0.19444, 0.69444, 0, 0, 1.02222],
-    "9667": [-0.02778, 0.47222, 0, 0, 0.575],
-    "9711": [0.19444, 0.69444, 0, 0, 1.14999],
-    "9824": [0.12963, 0.69444, 0, 0, 0.89444],
-    "9825": [0.12963, 0.69444, 0, 0, 0.89444],
-    "9826": [0.12963, 0.69444, 0, 0, 0.89444],
-    "9827": [0.12963, 0.69444, 0, 0, 0.89444],
-    "9837": [0, 0.75, 0, 0, 0.44722],
-    "9838": [0.19444, 0.69444, 0, 0, 0.44722],
-    "9839": [0.19444, 0.69444, 0, 0, 0.44722],
-    "10216": [0.25, 0.75, 0, 0, 0.44722],
-    "10217": [0.25, 0.75, 0, 0, 0.44722],
-    "10815": [0, 0.68611, 0, 0, 0.9],
-    "10927": [0.19667, 0.69667, 0, 0, 0.89444],
-    "10928": [0.19667, 0.69667, 0, 0, 0.89444],
-    "57376": [0.19444, 0.69444, 0, 0, 0]
-  },
-  "Main-BoldItalic": {
-    "33": [0, 0.69444, 0.11417, 0, 0.38611],
-    "34": [0, 0.69444, 0.07939, 0, 0.62055],
-    "35": [0.19444, 0.69444, 0.06833, 0, 0.94444],
-    "37": [0.05556, 0.75, 0.12861, 0, 0.94444],
-    "38": [0, 0.69444, 0.08528, 0, 0.88555],
-    "39": [0, 0.69444, 0.12945, 0, 0.35555],
-    "40": [0.25, 0.75, 0.15806, 0, 0.47333],
-    "41": [0.25, 0.75, 0.03306, 0, 0.47333],
-    "42": [0, 0.75, 0.14333, 0, 0.59111],
-    "43": [0.10333, 0.60333, 0.03306, 0, 0.88555],
-    "44": [0.19444, 0.14722, 0, 0, 0.35555],
-    "45": [0, 0.44444, 0.02611, 0, 0.41444],
-    "46": [0, 0.14722, 0, 0, 0.35555],
-    "47": [0.25, 0.75, 0.15806, 0, 0.59111],
-    "48": [0, 0.64444, 0.13167, 0, 0.59111],
-    "49": [0, 0.64444, 0.13167, 0, 0.59111],
-    "50": [0, 0.64444, 0.13167, 0, 0.59111],
-    "51": [0, 0.64444, 0.13167, 0, 0.59111],
-    "52": [0.19444, 0.64444, 0.13167, 0, 0.59111],
-    "53": [0, 0.64444, 0.13167, 0, 0.59111],
-    "54": [0, 0.64444, 0.13167, 0, 0.59111],
-    "55": [0.19444, 0.64444, 0.13167, 0, 0.59111],
-    "56": [0, 0.64444, 0.13167, 0, 0.59111],
-    "57": [0, 0.64444, 0.13167, 0, 0.59111],
-    "58": [0, 0.44444, 0.06695, 0, 0.35555],
-    "59": [0.19444, 0.44444, 0.06695, 0, 0.35555],
-    "61": [-0.10889, 0.39111, 0.06833, 0, 0.88555],
-    "63": [0, 0.69444, 0.11472, 0, 0.59111],
-    "64": [0, 0.69444, 0.09208, 0, 0.88555],
-    "65": [0, 0.68611, 0, 0, 0.86555],
-    "66": [0, 0.68611, 0.0992, 0, 0.81666],
-    "67": [0, 0.68611, 0.14208, 0, 0.82666],
-    "68": [0, 0.68611, 0.09062, 0, 0.87555],
-    "69": [0, 0.68611, 0.11431, 0, 0.75666],
-    "70": [0, 0.68611, 0.12903, 0, 0.72722],
-    "71": [0, 0.68611, 0.07347, 0, 0.89527],
-    "72": [0, 0.68611, 0.17208, 0, 0.8961],
-    "73": [0, 0.68611, 0.15681, 0, 0.47166],
-    "74": [0, 0.68611, 0.145, 0, 0.61055],
-    "75": [0, 0.68611, 0.14208, 0, 0.89499],
-    "76": [0, 0.68611, 0, 0, 0.69777],
-    "77": [0, 0.68611, 0.17208, 0, 1.07277],
-    "78": [0, 0.68611, 0.17208, 0, 0.8961],
-    "79": [0, 0.68611, 0.09062, 0, 0.85499],
-    "80": [0, 0.68611, 0.0992, 0, 0.78721],
-    "81": [0.19444, 0.68611, 0.09062, 0, 0.85499],
-    "82": [0, 0.68611, 0.02559, 0, 0.85944],
-    "83": [0, 0.68611, 0.11264, 0, 0.64999],
-    "84": [0, 0.68611, 0.12903, 0, 0.7961],
-    "85": [0, 0.68611, 0.17208, 0, 0.88083],
-    "86": [0, 0.68611, 0.18625, 0, 0.86555],
-    "87": [0, 0.68611, 0.18625, 0, 1.15999],
-    "88": [0, 0.68611, 0.15681, 0, 0.86555],
-    "89": [0, 0.68611, 0.19803, 0, 0.86555],
-    "90": [0, 0.68611, 0.14208, 0, 0.70888],
-    "91": [0.25, 0.75, 0.1875, 0, 0.35611],
-    "93": [0.25, 0.75, 0.09972, 0, 0.35611],
-    "94": [0, 0.69444, 0.06709, 0, 0.59111],
-    "95": [0.31, 0.13444, 0.09811, 0, 0.59111],
-    "97": [0, 0.44444, 0.09426, 0, 0.59111],
-    "98": [0, 0.69444, 0.07861, 0, 0.53222],
-    "99": [0, 0.44444, 0.05222, 0, 0.53222],
-    "100": [0, 0.69444, 0.10861, 0, 0.59111],
-    "101": [0, 0.44444, 0.085, 0, 0.53222],
-    "102": [0.19444, 0.69444, 0.21778, 0, 0.4],
-    "103": [0.19444, 0.44444, 0.105, 0, 0.53222],
-    "104": [0, 0.69444, 0.09426, 0, 0.59111],
-    "105": [0, 0.69326, 0.11387, 0, 0.35555],
-    "106": [0.19444, 0.69326, 0.1672, 0, 0.35555],
-    "107": [0, 0.69444, 0.11111, 0, 0.53222],
-    "108": [0, 0.69444, 0.10861, 0, 0.29666],
-    "109": [0, 0.44444, 0.09426, 0, 0.94444],
-    "110": [0, 0.44444, 0.09426, 0, 0.64999],
-    "111": [0, 0.44444, 0.07861, 0, 0.59111],
-    "112": [0.19444, 0.44444, 0.07861, 0, 0.59111],
-    "113": [0.19444, 0.44444, 0.105, 0, 0.53222],
-    "114": [0, 0.44444, 0.11111, 0, 0.50167],
-    "115": [0, 0.44444, 0.08167, 0, 0.48694],
-    "116": [0, 0.63492, 0.09639, 0, 0.385],
-    "117": [0, 0.44444, 0.09426, 0, 0.62055],
-    "118": [0, 0.44444, 0.11111, 0, 0.53222],
-    "119": [0, 0.44444, 0.11111, 0, 0.76777],
-    "120": [0, 0.44444, 0.12583, 0, 0.56055],
-    "121": [0.19444, 0.44444, 0.105, 0, 0.56166],
-    "122": [0, 0.44444, 0.13889, 0, 0.49055],
-    "126": [0.35, 0.34444, 0.11472, 0, 0.59111],
-    "163": [0, 0.69444, 0, 0, 0.86853],
-    "168": [0, 0.69444, 0.11473, 0, 0.59111],
-    "176": [0, 0.69444, 0, 0, 0.94888],
-    "184": [0.17014, 0, 0, 0, 0.53222],
-    "198": [0, 0.68611, 0.11431, 0, 1.02277],
-    "216": [0.04861, 0.73472, 0.09062, 0, 0.88555],
-    "223": [0.19444, 0.69444, 0.09736, 0, 0.665],
-    "230": [0, 0.44444, 0.085, 0, 0.82666],
-    "248": [0.09722, 0.54167, 0.09458, 0, 0.59111],
-    "305": [0, 0.44444, 0.09426, 0, 0.35555],
-    "338": [0, 0.68611, 0.11431, 0, 1.14054],
-    "339": [0, 0.44444, 0.085, 0, 0.82666],
-    "567": [0.19444, 0.44444, 0.04611, 0, 0.385],
-    "710": [0, 0.69444, 0.06709, 0, 0.59111],
-    "711": [0, 0.63194, 0.08271, 0, 0.59111],
-    "713": [0, 0.59444, 0.10444, 0, 0.59111],
-    "714": [0, 0.69444, 0.08528, 0, 0.59111],
-    "715": [0, 0.69444, 0, 0, 0.59111],
-    "728": [0, 0.69444, 0.10333, 0, 0.59111],
-    "729": [0, 0.69444, 0.12945, 0, 0.35555],
-    "730": [0, 0.69444, 0, 0, 0.94888],
-    "732": [0, 0.69444, 0.11472, 0, 0.59111],
-    "733": [0, 0.69444, 0.11472, 0, 0.59111],
-    "915": [0, 0.68611, 0.12903, 0, 0.69777],
-    "916": [0, 0.68611, 0, 0, 0.94444],
-    "920": [0, 0.68611, 0.09062, 0, 0.88555],
-    "923": [0, 0.68611, 0, 0, 0.80666],
-    "926": [0, 0.68611, 0.15092, 0, 0.76777],
-    "928": [0, 0.68611, 0.17208, 0, 0.8961],
-    "931": [0, 0.68611, 0.11431, 0, 0.82666],
-    "933": [0, 0.68611, 0.10778, 0, 0.88555],
-    "934": [0, 0.68611, 0.05632, 0, 0.82666],
-    "936": [0, 0.68611, 0.10778, 0, 0.88555],
-    "937": [0, 0.68611, 0.0992, 0, 0.82666],
-    "8211": [0, 0.44444, 0.09811, 0, 0.59111],
-    "8212": [0, 0.44444, 0.09811, 0, 1.18221],
-    "8216": [0, 0.69444, 0.12945, 0, 0.35555],
-    "8217": [0, 0.69444, 0.12945, 0, 0.35555],
-    "8220": [0, 0.69444, 0.16772, 0, 0.62055],
-    "8221": [0, 0.69444, 0.07939, 0, 0.62055]
-  },
-  "Main-Italic": {
-    "33": [0, 0.69444, 0.12417, 0, 0.30667],
-    "34": [0, 0.69444, 0.06961, 0, 0.51444],
-    "35": [0.19444, 0.69444, 0.06616, 0, 0.81777],
-    "37": [0.05556, 0.75, 0.13639, 0, 0.81777],
-    "38": [0, 0.69444, 0.09694, 0, 0.76666],
-    "39": [0, 0.69444, 0.12417, 0, 0.30667],
-    "40": [0.25, 0.75, 0.16194, 0, 0.40889],
-    "41": [0.25, 0.75, 0.03694, 0, 0.40889],
-    "42": [0, 0.75, 0.14917, 0, 0.51111],
-    "43": [0.05667, 0.56167, 0.03694, 0, 0.76666],
-    "44": [0.19444, 0.10556, 0, 0, 0.30667],
-    "45": [0, 0.43056, 0.02826, 0, 0.35778],
-    "46": [0, 0.10556, 0, 0, 0.30667],
-    "47": [0.25, 0.75, 0.16194, 0, 0.51111],
-    "48": [0, 0.64444, 0.13556, 0, 0.51111],
-    "49": [0, 0.64444, 0.13556, 0, 0.51111],
-    "50": [0, 0.64444, 0.13556, 0, 0.51111],
-    "51": [0, 0.64444, 0.13556, 0, 0.51111],
-    "52": [0.19444, 0.64444, 0.13556, 0, 0.51111],
-    "53": [0, 0.64444, 0.13556, 0, 0.51111],
-    "54": [0, 0.64444, 0.13556, 0, 0.51111],
-    "55": [0.19444, 0.64444, 0.13556, 0, 0.51111],
-    "56": [0, 0.64444, 0.13556, 0, 0.51111],
-    "57": [0, 0.64444, 0.13556, 0, 0.51111],
-    "58": [0, 0.43056, 0.0582, 0, 0.30667],
-    "59": [0.19444, 0.43056, 0.0582, 0, 0.30667],
-    "61": [-0.13313, 0.36687, 0.06616, 0, 0.76666],
-    "63": [0, 0.69444, 0.1225, 0, 0.51111],
-    "64": [0, 0.69444, 0.09597, 0, 0.76666],
-    "65": [0, 0.68333, 0, 0, 0.74333],
-    "66": [0, 0.68333, 0.10257, 0, 0.70389],
-    "67": [0, 0.68333, 0.14528, 0, 0.71555],
-    "68": [0, 0.68333, 0.09403, 0, 0.755],
-    "69": [0, 0.68333, 0.12028, 0, 0.67833],
-    "70": [0, 0.68333, 0.13305, 0, 0.65277],
-    "71": [0, 0.68333, 0.08722, 0, 0.77361],
-    "72": [0, 0.68333, 0.16389, 0, 0.74333],
-    "73": [0, 0.68333, 0.15806, 0, 0.38555],
-    "74": [0, 0.68333, 0.14028, 0, 0.525],
-    "75": [0, 0.68333, 0.14528, 0, 0.76888],
-    "76": [0, 0.68333, 0, 0, 0.62722],
-    "77": [0, 0.68333, 0.16389, 0, 0.89666],
-    "78": [0, 0.68333, 0.16389, 0, 0.74333],
-    "79": [0, 0.68333, 0.09403, 0, 0.76666],
-    "80": [0, 0.68333, 0.10257, 0, 0.67833],
-    "81": [0.19444, 0.68333, 0.09403, 0, 0.76666],
-    "82": [0, 0.68333, 0.03868, 0, 0.72944],
-    "83": [0, 0.68333, 0.11972, 0, 0.56222],
-    "84": [0, 0.68333, 0.13305, 0, 0.71555],
-    "85": [0, 0.68333, 0.16389, 0, 0.74333],
-    "86": [0, 0.68333, 0.18361, 0, 0.74333],
-    "87": [0, 0.68333, 0.18361, 0, 0.99888],
-    "88": [0, 0.68333, 0.15806, 0, 0.74333],
-    "89": [0, 0.68333, 0.19383, 0, 0.74333],
-    "90": [0, 0.68333, 0.14528, 0, 0.61333],
-    "91": [0.25, 0.75, 0.1875, 0, 0.30667],
-    "93": [0.25, 0.75, 0.10528, 0, 0.30667],
-    "94": [0, 0.69444, 0.06646, 0, 0.51111],
-    "95": [0.31, 0.12056, 0.09208, 0, 0.51111],
-    "97": [0, 0.43056, 0.07671, 0, 0.51111],
-    "98": [0, 0.69444, 0.06312, 0, 0.46],
-    "99": [0, 0.43056, 0.05653, 0, 0.46],
-    "100": [0, 0.69444, 0.10333, 0, 0.51111],
-    "101": [0, 0.43056, 0.07514, 0, 0.46],
-    "102": [0.19444, 0.69444, 0.21194, 0, 0.30667],
-    "103": [0.19444, 0.43056, 0.08847, 0, 0.46],
-    "104": [0, 0.69444, 0.07671, 0, 0.51111],
-    "105": [0, 0.65536, 0.1019, 0, 0.30667],
-    "106": [0.19444, 0.65536, 0.14467, 0, 0.30667],
-    "107": [0, 0.69444, 0.10764, 0, 0.46],
-    "108": [0, 0.69444, 0.10333, 0, 0.25555],
-    "109": [0, 0.43056, 0.07671, 0, 0.81777],
-    "110": [0, 0.43056, 0.07671, 0, 0.56222],
-    "111": [0, 0.43056, 0.06312, 0, 0.51111],
-    "112": [0.19444, 0.43056, 0.06312, 0, 0.51111],
-    "113": [0.19444, 0.43056, 0.08847, 0, 0.46],
-    "114": [0, 0.43056, 0.10764, 0, 0.42166],
-    "115": [0, 0.43056, 0.08208, 0, 0.40889],
-    "116": [0, 0.61508, 0.09486, 0, 0.33222],
-    "117": [0, 0.43056, 0.07671, 0, 0.53666],
-    "118": [0, 0.43056, 0.10764, 0, 0.46],
-    "119": [0, 0.43056, 0.10764, 0, 0.66444],
-    "120": [0, 0.43056, 0.12042, 0, 0.46389],
-    "121": [0.19444, 0.43056, 0.08847, 0, 0.48555],
-    "122": [0, 0.43056, 0.12292, 0, 0.40889],
-    "126": [0.35, 0.31786, 0.11585, 0, 0.51111],
-    "163": [0, 0.69444, 0, 0, 0.76909],
-    "168": [0, 0.66786, 0.10474, 0, 0.51111],
-    "176": [0, 0.69444, 0, 0, 0.83129],
-    "184": [0.17014, 0, 0, 0, 0.46],
-    "198": [0, 0.68333, 0.12028, 0, 0.88277],
-    "216": [0.04861, 0.73194, 0.09403, 0, 0.76666],
-    "223": [0.19444, 0.69444, 0.10514, 0, 0.53666],
-    "230": [0, 0.43056, 0.07514, 0, 0.71555],
-    "248": [0.09722, 0.52778, 0.09194, 0, 0.51111],
-    "305": [0, 0.43056, 0, 0.02778, 0.32246],
-    "338": [0, 0.68333, 0.12028, 0, 0.98499],
-    "339": [0, 0.43056, 0.07514, 0, 0.71555],
-    "567": [0.19444, 0.43056, 0, 0.08334, 0.38403],
-    "710": [0, 0.69444, 0.06646, 0, 0.51111],
-    "711": [0, 0.62847, 0.08295, 0, 0.51111],
-    "713": [0, 0.56167, 0.10333, 0, 0.51111],
-    "714": [0, 0.69444, 0.09694, 0, 0.51111],
-    "715": [0, 0.69444, 0, 0, 0.51111],
-    "728": [0, 0.69444, 0.10806, 0, 0.51111],
-    "729": [0, 0.66786, 0.11752, 0, 0.30667],
-    "730": [0, 0.69444, 0, 0, 0.83129],
-    "732": [0, 0.66786, 0.11585, 0, 0.51111],
-    "733": [0, 0.69444, 0.1225, 0, 0.51111],
-    "915": [0, 0.68333, 0.13305, 0, 0.62722],
-    "916": [0, 0.68333, 0, 0, 0.81777],
-    "920": [0, 0.68333, 0.09403, 0, 0.76666],
-    "923": [0, 0.68333, 0, 0, 0.69222],
-    "926": [0, 0.68333, 0.15294, 0, 0.66444],
-    "928": [0, 0.68333, 0.16389, 0, 0.74333],
-    "931": [0, 0.68333, 0.12028, 0, 0.71555],
-    "933": [0, 0.68333, 0.11111, 0, 0.76666],
-    "934": [0, 0.68333, 0.05986, 0, 0.71555],
-    "936": [0, 0.68333, 0.11111, 0, 0.76666],
-    "937": [0, 0.68333, 0.10257, 0, 0.71555],
-    "8211": [0, 0.43056, 0.09208, 0, 0.51111],
-    "8212": [0, 0.43056, 0.09208, 0, 1.02222],
-    "8216": [0, 0.69444, 0.12417, 0, 0.30667],
-    "8217": [0, 0.69444, 0.12417, 0, 0.30667],
-    "8220": [0, 0.69444, 0.1685, 0, 0.51444],
-    "8221": [0, 0.69444, 0.06961, 0, 0.51444],
-    "8463": [0, 0.68889, 0, 0, 0.54028]
-  },
-  "Main-Regular": {
-    "32": [0, 0, 0, 0, 0.25],
-    "33": [0, 0.69444, 0, 0, 0.27778],
-    "34": [0, 0.69444, 0, 0, 0.5],
-    "35": [0.19444, 0.69444, 0, 0, 0.83334],
-    "36": [0.05556, 0.75, 0, 0, 0.5],
-    "37": [0.05556, 0.75, 0, 0, 0.83334],
-    "38": [0, 0.69444, 0, 0, 0.77778],
-    "39": [0, 0.69444, 0, 0, 0.27778],
-    "40": [0.25, 0.75, 0, 0, 0.38889],
-    "41": [0.25, 0.75, 0, 0, 0.38889],
-    "42": [0, 0.75, 0, 0, 0.5],
-    "43": [0.08333, 0.58333, 0, 0, 0.77778],
-    "44": [0.19444, 0.10556, 0, 0, 0.27778],
-    "45": [0, 0.43056, 0, 0, 0.33333],
-    "46": [0, 0.10556, 0, 0, 0.27778],
-    "47": [0.25, 0.75, 0, 0, 0.5],
-    "48": [0, 0.64444, 0, 0, 0.5],
-    "49": [0, 0.64444, 0, 0, 0.5],
-    "50": [0, 0.64444, 0, 0, 0.5],
-    "51": [0, 0.64444, 0, 0, 0.5],
-    "52": [0, 0.64444, 0, 0, 0.5],
-    "53": [0, 0.64444, 0, 0, 0.5],
-    "54": [0, 0.64444, 0, 0, 0.5],
-    "55": [0, 0.64444, 0, 0, 0.5],
-    "56": [0, 0.64444, 0, 0, 0.5],
-    "57": [0, 0.64444, 0, 0, 0.5],
-    "58": [0, 0.43056, 0, 0, 0.27778],
-    "59": [0.19444, 0.43056, 0, 0, 0.27778],
-    "60": [0.0391, 0.5391, 0, 0, 0.77778],
-    "61": [-0.13313, 0.36687, 0, 0, 0.77778],
-    "62": [0.0391, 0.5391, 0, 0, 0.77778],
-    "63": [0, 0.69444, 0, 0, 0.47222],
-    "64": [0, 0.69444, 0, 0, 0.77778],
-    "65": [0, 0.68333, 0, 0, 0.75],
-    "66": [0, 0.68333, 0, 0, 0.70834],
-    "67": [0, 0.68333, 0, 0, 0.72222],
-    "68": [0, 0.68333, 0, 0, 0.76389],
-    "69": [0, 0.68333, 0, 0, 0.68056],
-    "70": [0, 0.68333, 0, 0, 0.65278],
-    "71": [0, 0.68333, 0, 0, 0.78472],
-    "72": [0, 0.68333, 0, 0, 0.75],
-    "73": [0, 0.68333, 0, 0, 0.36111],
-    "74": [0, 0.68333, 0, 0, 0.51389],
-    "75": [0, 0.68333, 0, 0, 0.77778],
-    "76": [0, 0.68333, 0, 0, 0.625],
-    "77": [0, 0.68333, 0, 0, 0.91667],
-    "78": [0, 0.68333, 0, 0, 0.75],
-    "79": [0, 0.68333, 0, 0, 0.77778],
-    "80": [0, 0.68333, 0, 0, 0.68056],
-    "81": [0.19444, 0.68333, 0, 0, 0.77778],
-    "82": [0, 0.68333, 0, 0, 0.73611],
-    "83": [0, 0.68333, 0, 0, 0.55556],
-    "84": [0, 0.68333, 0, 0, 0.72222],
-    "85": [0, 0.68333, 0, 0, 0.75],
-    "86": [0, 0.68333, 0.01389, 0, 0.75],
-    "87": [0, 0.68333, 0.01389, 0, 1.02778],
-    "88": [0, 0.68333, 0, 0, 0.75],
-    "89": [0, 0.68333, 0.025, 0, 0.75],
-    "90": [0, 0.68333, 0, 0, 0.61111],
-    "91": [0.25, 0.75, 0, 0, 0.27778],
-    "92": [0.25, 0.75, 0, 0, 0.5],
-    "93": [0.25, 0.75, 0, 0, 0.27778],
-    "94": [0, 0.69444, 0, 0, 0.5],
-    "95": [0.31, 0.12056, 0.02778, 0, 0.5],
-    "97": [0, 0.43056, 0, 0, 0.5],
-    "98": [0, 0.69444, 0, 0, 0.55556],
-    "99": [0, 0.43056, 0, 0, 0.44445],
-    "100": [0, 0.69444, 0, 0, 0.55556],
-    "101": [0, 0.43056, 0, 0, 0.44445],
-    "102": [0, 0.69444, 0.07778, 0, 0.30556],
-    "103": [0.19444, 0.43056, 0.01389, 0, 0.5],
-    "104": [0, 0.69444, 0, 0, 0.55556],
-    "105": [0, 0.66786, 0, 0, 0.27778],
-    "106": [0.19444, 0.66786, 0, 0, 0.30556],
-    "107": [0, 0.69444, 0, 0, 0.52778],
-    "108": [0, 0.69444, 0, 0, 0.27778],
-    "109": [0, 0.43056, 0, 0, 0.83334],
-    "110": [0, 0.43056, 0, 0, 0.55556],
-    "111": [0, 0.43056, 0, 0, 0.5],
-    "112": [0.19444, 0.43056, 0, 0, 0.55556],
-    "113": [0.19444, 0.43056, 0, 0, 0.52778],
-    "114": [0, 0.43056, 0, 0, 0.39167],
-    "115": [0, 0.43056, 0, 0, 0.39445],
-    "116": [0, 0.61508, 0, 0, 0.38889],
-    "117": [0, 0.43056, 0, 0, 0.55556],
-    "118": [0, 0.43056, 0.01389, 0, 0.52778],
-    "119": [0, 0.43056, 0.01389, 0, 0.72222],
-    "120": [0, 0.43056, 0, 0, 0.52778],
-    "121": [0.19444, 0.43056, 0.01389, 0, 0.52778],
-    "122": [0, 0.43056, 0, 0, 0.44445],
-    "123": [0.25, 0.75, 0, 0, 0.5],
-    "124": [0.25, 0.75, 0, 0, 0.27778],
-    "125": [0.25, 0.75, 0, 0, 0.5],
-    "126": [0.35, 0.31786, 0, 0, 0.5],
-    "160": [0, 0, 0, 0, 0.25],
-    "167": [0.19444, 0.69444, 0, 0, 0.44445],
-    "168": [0, 0.66786, 0, 0, 0.5],
-    "172": [0, 0.43056, 0, 0, 0.66667],
-    "176": [0, 0.69444, 0, 0, 0.75],
-    "177": [0.08333, 0.58333, 0, 0, 0.77778],
-    "182": [0.19444, 0.69444, 0, 0, 0.61111],
-    "184": [0.17014, 0, 0, 0, 0.44445],
-    "198": [0, 0.68333, 0, 0, 0.90278],
-    "215": [0.08333, 0.58333, 0, 0, 0.77778],
-    "216": [0.04861, 0.73194, 0, 0, 0.77778],
-    "223": [0, 0.69444, 0, 0, 0.5],
-    "230": [0, 0.43056, 0, 0, 0.72222],
-    "247": [0.08333, 0.58333, 0, 0, 0.77778],
-    "248": [0.09722, 0.52778, 0, 0, 0.5],
-    "305": [0, 0.43056, 0, 0, 0.27778],
-    "338": [0, 0.68333, 0, 0, 1.01389],
-    "339": [0, 0.43056, 0, 0, 0.77778],
-    "567": [0.19444, 0.43056, 0, 0, 0.30556],
-    "710": [0, 0.69444, 0, 0, 0.5],
-    "711": [0, 0.62847, 0, 0, 0.5],
-    "713": [0, 0.56778, 0, 0, 0.5],
-    "714": [0, 0.69444, 0, 0, 0.5],
-    "715": [0, 0.69444, 0, 0, 0.5],
-    "728": [0, 0.69444, 0, 0, 0.5],
-    "729": [0, 0.66786, 0, 0, 0.27778],
-    "730": [0, 0.69444, 0, 0, 0.75],
-    "732": [0, 0.66786, 0, 0, 0.5],
-    "733": [0, 0.69444, 0, 0, 0.5],
-    "915": [0, 0.68333, 0, 0, 0.625],
-    "916": [0, 0.68333, 0, 0, 0.83334],
-    "920": [0, 0.68333, 0, 0, 0.77778],
-    "923": [0, 0.68333, 0, 0, 0.69445],
-    "926": [0, 0.68333, 0, 0, 0.66667],
-    "928": [0, 0.68333, 0, 0, 0.75],
-    "931": [0, 0.68333, 0, 0, 0.72222],
-    "933": [0, 0.68333, 0, 0, 0.77778],
-    "934": [0, 0.68333, 0, 0, 0.72222],
-    "936": [0, 0.68333, 0, 0, 0.77778],
-    "937": [0, 0.68333, 0, 0, 0.72222],
-    "8211": [0, 0.43056, 0.02778, 0, 0.5],
-    "8212": [0, 0.43056, 0.02778, 0, 1.0],
-    "8216": [0, 0.69444, 0, 0, 0.27778],
-    "8217": [0, 0.69444, 0, 0, 0.27778],
-    "8220": [0, 0.69444, 0, 0, 0.5],
-    "8221": [0, 0.69444, 0, 0, 0.5],
-    "8224": [0.19444, 0.69444, 0, 0, 0.44445],
-    "8225": [0.19444, 0.69444, 0, 0, 0.44445],
-    "8230": [0, 0.12, 0, 0, 1.172],
-    "8242": [0, 0.55556, 0, 0, 0.275],
-    "8407": [0, 0.71444, 0.15382, 0, 0.5],
-    "8463": [0, 0.68889, 0, 0, 0.54028],
-    "8465": [0, 0.69444, 0, 0, 0.72222],
-    "8467": [0, 0.69444, 0, 0.11111, 0.41667],
-    "8472": [0.19444, 0.43056, 0, 0.11111, 0.63646],
-    "8476": [0, 0.69444, 0, 0, 0.72222],
-    "8501": [0, 0.69444, 0, 0, 0.61111],
-    "8592": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8593": [0.19444, 0.69444, 0, 0, 0.5],
-    "8594": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8595": [0.19444, 0.69444, 0, 0, 0.5],
-    "8596": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8597": [0.25, 0.75, 0, 0, 0.5],
-    "8598": [0.19444, 0.69444, 0, 0, 1.0],
-    "8599": [0.19444, 0.69444, 0, 0, 1.0],
-    "8600": [0.19444, 0.69444, 0, 0, 1.0],
-    "8601": [0.19444, 0.69444, 0, 0, 1.0],
-    "8614": [0.011, 0.511, 0, 0, 1.0],
-    "8617": [0.011, 0.511, 0, 0, 1.126],
-    "8618": [0.011, 0.511, 0, 0, 1.126],
-    "8636": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8637": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8640": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8641": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8652": [0.011, 0.671, 0, 0, 1.0],
-    "8656": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8657": [0.19444, 0.69444, 0, 0, 0.61111],
-    "8658": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8659": [0.19444, 0.69444, 0, 0, 0.61111],
-    "8660": [-0.13313, 0.36687, 0, 0, 1.0],
-    "8661": [0.25, 0.75, 0, 0, 0.61111],
-    "8704": [0, 0.69444, 0, 0, 0.55556],
-    "8706": [0, 0.69444, 0.05556, 0.08334, 0.5309],
-    "8707": [0, 0.69444, 0, 0, 0.55556],
-    "8709": [0.05556, 0.75, 0, 0, 0.5],
-    "8711": [0, 0.68333, 0, 0, 0.83334],
-    "8712": [0.0391, 0.5391, 0, 0, 0.66667],
-    "8715": [0.0391, 0.5391, 0, 0, 0.66667],
-    "8722": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8723": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8725": [0.25, 0.75, 0, 0, 0.5],
-    "8726": [0.25, 0.75, 0, 0, 0.5],
-    "8727": [-0.03472, 0.46528, 0, 0, 0.5],
-    "8728": [-0.05555, 0.44445, 0, 0, 0.5],
-    "8729": [-0.05555, 0.44445, 0, 0, 0.5],
-    "8730": [0.2, 0.8, 0, 0, 0.83334],
-    "8733": [0, 0.43056, 0, 0, 0.77778],
-    "8734": [0, 0.43056, 0, 0, 1.0],
-    "8736": [0, 0.69224, 0, 0, 0.72222],
-    "8739": [0.25, 0.75, 0, 0, 0.27778],
-    "8741": [0.25, 0.75, 0, 0, 0.5],
-    "8743": [0, 0.55556, 0, 0, 0.66667],
-    "8744": [0, 0.55556, 0, 0, 0.66667],
-    "8745": [0, 0.55556, 0, 0, 0.66667],
-    "8746": [0, 0.55556, 0, 0, 0.66667],
-    "8747": [0.19444, 0.69444, 0.11111, 0, 0.41667],
-    "8764": [-0.13313, 0.36687, 0, 0, 0.77778],
-    "8768": [0.19444, 0.69444, 0, 0, 0.27778],
-    "8771": [-0.03625, 0.46375, 0, 0, 0.77778],
-    "8773": [-0.022, 0.589, 0, 0, 1.0],
-    "8776": [-0.01688, 0.48312, 0, 0, 0.77778],
-    "8781": [-0.03625, 0.46375, 0, 0, 0.77778],
-    "8784": [-0.133, 0.67, 0, 0, 0.778],
-    "8801": [-0.03625, 0.46375, 0, 0, 0.77778],
-    "8804": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8805": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8810": [0.0391, 0.5391, 0, 0, 1.0],
-    "8811": [0.0391, 0.5391, 0, 0, 1.0],
-    "8826": [0.0391, 0.5391, 0, 0, 0.77778],
-    "8827": [0.0391, 0.5391, 0, 0, 0.77778],
-    "8834": [0.0391, 0.5391, 0, 0, 0.77778],
-    "8835": [0.0391, 0.5391, 0, 0, 0.77778],
-    "8838": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8839": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8846": [0, 0.55556, 0, 0, 0.66667],
-    "8849": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8850": [0.13597, 0.63597, 0, 0, 0.77778],
-    "8851": [0, 0.55556, 0, 0, 0.66667],
-    "8852": [0, 0.55556, 0, 0, 0.66667],
-    "8853": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8854": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8855": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8856": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8857": [0.08333, 0.58333, 0, 0, 0.77778],
-    "8866": [0, 0.69444, 0, 0, 0.61111],
-    "8867": [0, 0.69444, 0, 0, 0.61111],
-    "8868": [0, 0.69444, 0, 0, 0.77778],
-    "8869": [0, 0.69444, 0, 0, 0.77778],
-    "8872": [0.249, 0.75, 0, 0, 0.867],
-    "8900": [-0.05555, 0.44445, 0, 0, 0.5],
-    "8901": [-0.05555, 0.44445, 0, 0, 0.27778],
-    "8902": [-0.03472, 0.46528, 0, 0, 0.5],
-    "8904": [0.005, 0.505, 0, 0, 0.9],
-    "8942": [0.03, 0.9, 0, 0, 0.278],
-    "8943": [-0.19, 0.31, 0, 0, 1.172],
-    "8945": [-0.1, 0.82, 0, 0, 1.282],
-    "8968": [0.25, 0.75, 0, 0, 0.44445],
-    "8969": [0.25, 0.75, 0, 0, 0.44445],
-    "8970": [0.25, 0.75, 0, 0, 0.44445],
-    "8971": [0.25, 0.75, 0, 0, 0.44445],
-    "8994": [-0.14236, 0.35764, 0, 0, 1.0],
-    "8995": [-0.14236, 0.35764, 0, 0, 1.0],
-    "9136": [0.244, 0.744, 0, 0, 0.412],
-    "9137": [0.244, 0.744, 0, 0, 0.412],
-    "9651": [0.19444, 0.69444, 0, 0, 0.88889],
-    "9657": [-0.03472, 0.46528, 0, 0, 0.5],
-    "9661": [0.19444, 0.69444, 0, 0, 0.88889],
-    "9667": [-0.03472, 0.46528, 0, 0, 0.5],
-    "9711": [0.19444, 0.69444, 0, 0, 1.0],
-    "9824": [0.12963, 0.69444, 0, 0, 0.77778],
-    "9825": [0.12963, 0.69444, 0, 0, 0.77778],
-    "9826": [0.12963, 0.69444, 0, 0, 0.77778],
-    "9827": [0.12963, 0.69444, 0, 0, 0.77778],
-    "9837": [0, 0.75, 0, 0, 0.38889],
-    "9838": [0.19444, 0.69444, 0, 0, 0.38889],
-    "9839": [0.19444, 0.69444, 0, 0, 0.38889],
-    "10216": [0.25, 0.75, 0, 0, 0.38889],
-    "10217": [0.25, 0.75, 0, 0, 0.38889],
-    "10222": [0.244, 0.744, 0, 0, 0.412],
-    "10223": [0.244, 0.744, 0, 0, 0.412],
-    "10229": [0.011, 0.511, 0, 0, 1.609],
-    "10230": [0.011, 0.511, 0, 0, 1.638],
-    "10231": [0.011, 0.511, 0, 0, 1.859],
-    "10232": [0.024, 0.525, 0, 0, 1.609],
-    "10233": [0.024, 0.525, 0, 0, 1.638],
-    "10234": [0.024, 0.525, 0, 0, 1.858],
-    "10236": [0.011, 0.511, 0, 0, 1.638],
-    "10815": [0, 0.68333, 0, 0, 0.75],
-    "10927": [0.13597, 0.63597, 0, 0, 0.77778],
-    "10928": [0.13597, 0.63597, 0, 0, 0.77778],
-    "57376": [0.19444, 0.69444, 0, 0, 0]
-  },
-  "Math-BoldItalic": {
-    "65": [0, 0.68611, 0, 0, 0.86944],
-    "66": [0, 0.68611, 0.04835, 0, 0.8664],
-    "67": [0, 0.68611, 0.06979, 0, 0.81694],
-    "68": [0, 0.68611, 0.03194, 0, 0.93812],
-    "69": [0, 0.68611, 0.05451, 0, 0.81007],
-    "70": [0, 0.68611, 0.15972, 0, 0.68889],
-    "71": [0, 0.68611, 0, 0, 0.88673],
-    "72": [0, 0.68611, 0.08229, 0, 0.98229],
-    "73": [0, 0.68611, 0.07778, 0, 0.51111],
-    "74": [0, 0.68611, 0.10069, 0, 0.63125],
-    "75": [0, 0.68611, 0.06979, 0, 0.97118],
-    "76": [0, 0.68611, 0, 0, 0.75555],
-    "77": [0, 0.68611, 0.11424, 0, 1.14201],
-    "78": [0, 0.68611, 0.11424, 0, 0.95034],
-    "79": [0, 0.68611, 0.03194, 0, 0.83666],
-    "80": [0, 0.68611, 0.15972, 0, 0.72309],
-    "81": [0.19444, 0.68611, 0, 0, 0.86861],
-    "82": [0, 0.68611, 0.00421, 0, 0.87235],
-    "83": [0, 0.68611, 0.05382, 0, 0.69271],
-    "84": [0, 0.68611, 0.15972, 0, 0.63663],
-    "85": [0, 0.68611, 0.11424, 0, 0.80027],
-    "86": [0, 0.68611, 0.25555, 0, 0.67778],
-    "87": [0, 0.68611, 0.15972, 0, 1.09305],
-    "88": [0, 0.68611, 0.07778, 0, 0.94722],
-    "89": [0, 0.68611, 0.25555, 0, 0.67458],
-    "90": [0, 0.68611, 0.06979, 0, 0.77257],
-    "97": [0, 0.44444, 0, 0, 0.63287],
-    "98": [0, 0.69444, 0, 0, 0.52083],
-    "99": [0, 0.44444, 0, 0, 0.51342],
-    "100": [0, 0.69444, 0, 0, 0.60972],
-    "101": [0, 0.44444, 0, 0, 0.55361],
-    "102": [0.19444, 0.69444, 0.11042, 0, 0.56806],
-    "103": [0.19444, 0.44444, 0.03704, 0, 0.5449],
-    "104": [0, 0.69444, 0, 0, 0.66759],
-    "105": [0, 0.69326, 0, 0, 0.4048],
-    "106": [0.19444, 0.69326, 0.0622, 0, 0.47083],
-    "107": [0, 0.69444, 0.01852, 0, 0.6037],
-    "108": [0, 0.69444, 0.0088, 0, 0.34815],
-    "109": [0, 0.44444, 0, 0, 1.0324],
-    "110": [0, 0.44444, 0, 0, 0.71296],
-    "111": [0, 0.44444, 0, 0, 0.58472],
-    "112": [0.19444, 0.44444, 0, 0, 0.60092],
-    "113": [0.19444, 0.44444, 0.03704, 0, 0.54213],
-    "114": [0, 0.44444, 0.03194, 0, 0.5287],
-    "115": [0, 0.44444, 0, 0, 0.53125],
-    "116": [0, 0.63492, 0, 0, 0.41528],
-    "117": [0, 0.44444, 0, 0, 0.68102],
-    "118": [0, 0.44444, 0.03704, 0, 0.56666],
-    "119": [0, 0.44444, 0.02778, 0, 0.83148],
-    "120": [0, 0.44444, 0, 0, 0.65903],
-    "121": [0.19444, 0.44444, 0.03704, 0, 0.59028],
-    "122": [0, 0.44444, 0.04213, 0, 0.55509],
-    "915": [0, 0.68611, 0.15972, 0, 0.65694],
-    "916": [0, 0.68611, 0, 0, 0.95833],
-    "920": [0, 0.68611, 0.03194, 0, 0.86722],
-    "923": [0, 0.68611, 0, 0, 0.80555],
-    "926": [0, 0.68611, 0.07458, 0, 0.84125],
-    "928": [0, 0.68611, 0.08229, 0, 0.98229],
-    "931": [0, 0.68611, 0.05451, 0, 0.88507],
-    "933": [0, 0.68611, 0.15972, 0, 0.67083],
-    "934": [0, 0.68611, 0, 0, 0.76666],
-    "936": [0, 0.68611, 0.11653, 0, 0.71402],
-    "937": [0, 0.68611, 0.04835, 0, 0.8789],
-    "945": [0, 0.44444, 0, 0, 0.76064],
-    "946": [0.19444, 0.69444, 0.03403, 0, 0.65972],
-    "947": [0.19444, 0.44444, 0.06389, 0, 0.59003],
-    "948": [0, 0.69444, 0.03819, 0, 0.52222],
-    "949": [0, 0.44444, 0, 0, 0.52882],
-    "950": [0.19444, 0.69444, 0.06215, 0, 0.50833],
-    "951": [0.19444, 0.44444, 0.03704, 0, 0.6],
-    "952": [0, 0.69444, 0.03194, 0, 0.5618],
-    "953": [0, 0.44444, 0, 0, 0.41204],
-    "954": [0, 0.44444, 0, 0, 0.66759],
-    "955": [0, 0.69444, 0, 0, 0.67083],
-    "956": [0.19444, 0.44444, 0, 0, 0.70787],
-    "957": [0, 0.44444, 0.06898, 0, 0.57685],
-    "958": [0.19444, 0.69444, 0.03021, 0, 0.50833],
-    "959": [0, 0.44444, 0, 0, 0.58472],
-    "960": [0, 0.44444, 0.03704, 0, 0.68241],
-    "961": [0.19444, 0.44444, 0, 0, 0.6118],
-    "962": [0.09722, 0.44444, 0.07917, 0, 0.42361],
-    "963": [0, 0.44444, 0.03704, 0, 0.68588],
-    "964": [0, 0.44444, 0.13472, 0, 0.52083],
-    "965": [0, 0.44444, 0.03704, 0, 0.63055],
-    "966": [0.19444, 0.44444, 0, 0, 0.74722],
-    "967": [0.19444, 0.44444, 0, 0, 0.71805],
-    "968": [0.19444, 0.69444, 0.03704, 0, 0.75833],
-    "969": [0, 0.44444, 0.03704, 0, 0.71782],
-    "977": [0, 0.69444, 0, 0, 0.69155],
-    "981": [0.19444, 0.69444, 0, 0, 0.7125],
-    "982": [0, 0.44444, 0.03194, 0, 0.975],
-    "1009": [0.19444, 0.44444, 0, 0, 0.6118],
-    "1013": [0, 0.44444, 0, 0, 0.48333]
-  },
-  "Math-Italic": {
-    "65": [0, 0.68333, 0, 0.13889, 0.75],
-    "66": [0, 0.68333, 0.05017, 0.08334, 0.75851],
-    "67": [0, 0.68333, 0.07153, 0.08334, 0.71472],
-    "68": [0, 0.68333, 0.02778, 0.05556, 0.82792],
-    "69": [0, 0.68333, 0.05764, 0.08334, 0.7382],
-    "70": [0, 0.68333, 0.13889, 0.08334, 0.64306],
-    "71": [0, 0.68333, 0, 0.08334, 0.78625],
-    "72": [0, 0.68333, 0.08125, 0.05556, 0.83125],
-    "73": [0, 0.68333, 0.07847, 0.11111, 0.43958],
-    "74": [0, 0.68333, 0.09618, 0.16667, 0.55451],
-    "75": [0, 0.68333, 0.07153, 0.05556, 0.84931],
-    "76": [0, 0.68333, 0, 0.02778, 0.68056],
-    "77": [0, 0.68333, 0.10903, 0.08334, 0.97014],
-    "78": [0, 0.68333, 0.10903, 0.08334, 0.80347],
-    "79": [0, 0.68333, 0.02778, 0.08334, 0.76278],
-    "80": [0, 0.68333, 0.13889, 0.08334, 0.64201],
-    "81": [0.19444, 0.68333, 0, 0.08334, 0.79056],
-    "82": [0, 0.68333, 0.00773, 0.08334, 0.75929],
-    "83": [0, 0.68333, 0.05764, 0.08334, 0.6132],
-    "84": [0, 0.68333, 0.13889, 0.08334, 0.58438],
-    "85": [0, 0.68333, 0.10903, 0.02778, 0.68278],
-    "86": [0, 0.68333, 0.22222, 0, 0.58333],
-    "87": [0, 0.68333, 0.13889, 0, 0.94445],
-    "88": [0, 0.68333, 0.07847, 0.08334, 0.82847],
-    "89": [0, 0.68333, 0.22222, 0, 0.58056],
-    "90": [0, 0.68333, 0.07153, 0.08334, 0.68264],
-    "97": [0, 0.43056, 0, 0, 0.52859],
-    "98": [0, 0.69444, 0, 0, 0.42917],
-    "99": [0, 0.43056, 0, 0.05556, 0.43276],
-    "100": [0, 0.69444, 0, 0.16667, 0.52049],
-    "101": [0, 0.43056, 0, 0.05556, 0.46563],
-    "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959],
-    "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697],
-    "104": [0, 0.69444, 0, 0, 0.57616],
-    "105": [0, 0.65952, 0, 0, 0.34451],
-    "106": [0.19444, 0.65952, 0.05724, 0, 0.41181],
-    "107": [0, 0.69444, 0.03148, 0, 0.5206],
-    "108": [0, 0.69444, 0.01968, 0.08334, 0.29838],
-    "109": [0, 0.43056, 0, 0, 0.87801],
-    "110": [0, 0.43056, 0, 0, 0.60023],
-    "111": [0, 0.43056, 0, 0.05556, 0.48472],
-    "112": [0.19444, 0.43056, 0, 0.08334, 0.50313],
-    "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641],
-    "114": [0, 0.43056, 0.02778, 0.05556, 0.45116],
-    "115": [0, 0.43056, 0, 0.05556, 0.46875],
-    "116": [0, 0.61508, 0, 0.08334, 0.36111],
-    "117": [0, 0.43056, 0, 0.02778, 0.57246],
-    "118": [0, 0.43056, 0.03588, 0.02778, 0.48472],
-    "119": [0, 0.43056, 0.02691, 0.08334, 0.71592],
-    "120": [0, 0.43056, 0, 0.02778, 0.57153],
-    "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028],
-    "122": [0, 0.43056, 0.04398, 0.05556, 0.46505],
-    "915": [0, 0.68333, 0.13889, 0.08334, 0.61528],
-    "916": [0, 0.68333, 0, 0.16667, 0.83334],
-    "920": [0, 0.68333, 0.02778, 0.08334, 0.76278],
-    "923": [0, 0.68333, 0, 0.16667, 0.69445],
-    "926": [0, 0.68333, 0.07569, 0.08334, 0.74236],
-    "928": [0, 0.68333, 0.08125, 0.05556, 0.83125],
-    "931": [0, 0.68333, 0.05764, 0.08334, 0.77986],
-    "933": [0, 0.68333, 0.13889, 0.05556, 0.58333],
-    "934": [0, 0.68333, 0, 0.08334, 0.66667],
-    "936": [0, 0.68333, 0.11, 0.05556, 0.61222],
-    "937": [0, 0.68333, 0.05017, 0.08334, 0.7724],
-    "945": [0, 0.43056, 0.0037, 0.02778, 0.6397],
-    "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563],
-    "947": [0.19444, 0.43056, 0.05556, 0, 0.51773],
-    "948": [0, 0.69444, 0.03785, 0.05556, 0.44444],
-    "949": [0, 0.43056, 0, 0.08334, 0.46632],
-    "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375],
-    "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653],
-    "952": [0, 0.69444, 0.02778, 0.08334, 0.46944],
-    "953": [0, 0.43056, 0, 0.05556, 0.35394],
-    "954": [0, 0.43056, 0, 0, 0.57616],
-    "955": [0, 0.69444, 0, 0, 0.58334],
-    "956": [0.19444, 0.43056, 0, 0.02778, 0.60255],
-    "957": [0, 0.43056, 0.06366, 0.02778, 0.49398],
-    "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375],
-    "959": [0, 0.43056, 0, 0.05556, 0.48472],
-    "960": [0, 0.43056, 0.03588, 0, 0.57003],
-    "961": [0.19444, 0.43056, 0, 0.08334, 0.51702],
-    "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285],
-    "963": [0, 0.43056, 0.03588, 0, 0.57141],
-    "964": [0, 0.43056, 0.1132, 0.02778, 0.43715],
-    "965": [0, 0.43056, 0.03588, 0.02778, 0.54028],
-    "966": [0.19444, 0.43056, 0, 0.08334, 0.65417],
-    "967": [0.19444, 0.43056, 0, 0.05556, 0.62569],
-    "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139],
-    "969": [0, 0.43056, 0.03588, 0, 0.62245],
-    "977": [0, 0.69444, 0, 0.08334, 0.59144],
-    "981": [0.19444, 0.69444, 0, 0.08334, 0.59583],
-    "982": [0, 0.43056, 0.02778, 0, 0.82813],
-    "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702],
-    "1013": [0, 0.43056, 0, 0.05556, 0.4059]
-  },
-  "Math-Regular": {
-    "65": [0, 0.68333, 0, 0.13889, 0.75],
-    "66": [0, 0.68333, 0.05017, 0.08334, 0.75851],
-    "67": [0, 0.68333, 0.07153, 0.08334, 0.71472],
-    "68": [0, 0.68333, 0.02778, 0.05556, 0.82792],
-    "69": [0, 0.68333, 0.05764, 0.08334, 0.7382],
-    "70": [0, 0.68333, 0.13889, 0.08334, 0.64306],
-    "71": [0, 0.68333, 0, 0.08334, 0.78625],
-    "72": [0, 0.68333, 0.08125, 0.05556, 0.83125],
-    "73": [0, 0.68333, 0.07847, 0.11111, 0.43958],
-    "74": [0, 0.68333, 0.09618, 0.16667, 0.55451],
-    "75": [0, 0.68333, 0.07153, 0.05556, 0.84931],
-    "76": [0, 0.68333, 0, 0.02778, 0.68056],
-    "77": [0, 0.68333, 0.10903, 0.08334, 0.97014],
-    "78": [0, 0.68333, 0.10903, 0.08334, 0.80347],
-    "79": [0, 0.68333, 0.02778, 0.08334, 0.76278],
-    "80": [0, 0.68333, 0.13889, 0.08334, 0.64201],
-    "81": [0.19444, 0.68333, 0, 0.08334, 0.79056],
-    "82": [0, 0.68333, 0.00773, 0.08334, 0.75929],
-    "83": [0, 0.68333, 0.05764, 0.08334, 0.6132],
-    "84": [0, 0.68333, 0.13889, 0.08334, 0.58438],
-    "85": [0, 0.68333, 0.10903, 0.02778, 0.68278],
-    "86": [0, 0.68333, 0.22222, 0, 0.58333],
-    "87": [0, 0.68333, 0.13889, 0, 0.94445],
-    "88": [0, 0.68333, 0.07847, 0.08334, 0.82847],
-    "89": [0, 0.68333, 0.22222, 0, 0.58056],
-    "90": [0, 0.68333, 0.07153, 0.08334, 0.68264],
-    "97": [0, 0.43056, 0, 0, 0.52859],
-    "98": [0, 0.69444, 0, 0, 0.42917],
-    "99": [0, 0.43056, 0, 0.05556, 0.43276],
-    "100": [0, 0.69444, 0, 0.16667, 0.52049],
-    "101": [0, 0.43056, 0, 0.05556, 0.46563],
-    "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959],
-    "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697],
-    "104": [0, 0.69444, 0, 0, 0.57616],
-    "105": [0, 0.65952, 0, 0, 0.34451],
-    "106": [0.19444, 0.65952, 0.05724, 0, 0.41181],
-    "107": [0, 0.69444, 0.03148, 0, 0.5206],
-    "108": [0, 0.69444, 0.01968, 0.08334, 0.29838],
-    "109": [0, 0.43056, 0, 0, 0.87801],
-    "110": [0, 0.43056, 0, 0, 0.60023],
-    "111": [0, 0.43056, 0, 0.05556, 0.48472],
-    "112": [0.19444, 0.43056, 0, 0.08334, 0.50313],
-    "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641],
-    "114": [0, 0.43056, 0.02778, 0.05556, 0.45116],
-    "115": [0, 0.43056, 0, 0.05556, 0.46875],
-    "116": [0, 0.61508, 0, 0.08334, 0.36111],
-    "117": [0, 0.43056, 0, 0.02778, 0.57246],
-    "118": [0, 0.43056, 0.03588, 0.02778, 0.48472],
-    "119": [0, 0.43056, 0.02691, 0.08334, 0.71592],
-    "120": [0, 0.43056, 0, 0.02778, 0.57153],
-    "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028],
-    "122": [0, 0.43056, 0.04398, 0.05556, 0.46505],
-    "915": [0, 0.68333, 0.13889, 0.08334, 0.61528],
-    "916": [0, 0.68333, 0, 0.16667, 0.83334],
-    "920": [0, 0.68333, 0.02778, 0.08334, 0.76278],
-    "923": [0, 0.68333, 0, 0.16667, 0.69445],
-    "926": [0, 0.68333, 0.07569, 0.08334, 0.74236],
-    "928": [0, 0.68333, 0.08125, 0.05556, 0.83125],
-    "931": [0, 0.68333, 0.05764, 0.08334, 0.77986],
-    "933": [0, 0.68333, 0.13889, 0.05556, 0.58333],
-    "934": [0, 0.68333, 0, 0.08334, 0.66667],
-    "936": [0, 0.68333, 0.11, 0.05556, 0.61222],
-    "937": [0, 0.68333, 0.05017, 0.08334, 0.7724],
-    "945": [0, 0.43056, 0.0037, 0.02778, 0.6397],
-    "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563],
-    "947": [0.19444, 0.43056, 0.05556, 0, 0.51773],
-    "948": [0, 0.69444, 0.03785, 0.05556, 0.44444],
-    "949": [0, 0.43056, 0, 0.08334, 0.46632],
-    "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375],
-    "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653],
-    "952": [0, 0.69444, 0.02778, 0.08334, 0.46944],
-    "953": [0, 0.43056, 0, 0.05556, 0.35394],
-    "954": [0, 0.43056, 0, 0, 0.57616],
-    "955": [0, 0.69444, 0, 0, 0.58334],
-    "956": [0.19444, 0.43056, 0, 0.02778, 0.60255],
-    "957": [0, 0.43056, 0.06366, 0.02778, 0.49398],
-    "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375],
-    "959": [0, 0.43056, 0, 0.05556, 0.48472],
-    "960": [0, 0.43056, 0.03588, 0, 0.57003],
-    "961": [0.19444, 0.43056, 0, 0.08334, 0.51702],
-    "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285],
-    "963": [0, 0.43056, 0.03588, 0, 0.57141],
-    "964": [0, 0.43056, 0.1132, 0.02778, 0.43715],
-    "965": [0, 0.43056, 0.03588, 0.02778, 0.54028],
-    "966": [0.19444, 0.43056, 0, 0.08334, 0.65417],
-    "967": [0.19444, 0.43056, 0, 0.05556, 0.62569],
-    "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139],
-    "969": [0, 0.43056, 0.03588, 0, 0.62245],
-    "977": [0, 0.69444, 0, 0.08334, 0.59144],
-    "981": [0.19444, 0.69444, 0, 0.08334, 0.59583],
-    "982": [0, 0.43056, 0.02778, 0, 0.82813],
-    "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702],
-    "1013": [0, 0.43056, 0, 0.05556, 0.4059]
-  },
-  "SansSerif-Bold": {
-    "33": [0, 0.69444, 0, 0, 0.36667],
-    "34": [0, 0.69444, 0, 0, 0.55834],
-    "35": [0.19444, 0.69444, 0, 0, 0.91667],
-    "36": [0.05556, 0.75, 0, 0, 0.55],
-    "37": [0.05556, 0.75, 0, 0, 1.02912],
-    "38": [0, 0.69444, 0, 0, 0.83056],
-    "39": [0, 0.69444, 0, 0, 0.30556],
-    "40": [0.25, 0.75, 0, 0, 0.42778],
-    "41": [0.25, 0.75, 0, 0, 0.42778],
-    "42": [0, 0.75, 0, 0, 0.55],
-    "43": [0.11667, 0.61667, 0, 0, 0.85556],
-    "44": [0.10556, 0.13056, 0, 0, 0.30556],
-    "45": [0, 0.45833, 0, 0, 0.36667],
-    "46": [0, 0.13056, 0, 0, 0.30556],
-    "47": [0.25, 0.75, 0, 0, 0.55],
-    "48": [0, 0.69444, 0, 0, 0.55],
-    "49": [0, 0.69444, 0, 0, 0.55],
-    "50": [0, 0.69444, 0, 0, 0.55],
-    "51": [0, 0.69444, 0, 0, 0.55],
-    "52": [0, 0.69444, 0, 0, 0.55],
-    "53": [0, 0.69444, 0, 0, 0.55],
-    "54": [0, 0.69444, 0, 0, 0.55],
-    "55": [0, 0.69444, 0, 0, 0.55],
-    "56": [0, 0.69444, 0, 0, 0.55],
-    "57": [0, 0.69444, 0, 0, 0.55],
-    "58": [0, 0.45833, 0, 0, 0.30556],
-    "59": [0.10556, 0.45833, 0, 0, 0.30556],
-    "61": [-0.09375, 0.40625, 0, 0, 0.85556],
-    "63": [0, 0.69444, 0, 0, 0.51945],
-    "64": [0, 0.69444, 0, 0, 0.73334],
-    "65": [0, 0.69444, 0, 0, 0.73334],
-    "66": [0, 0.69444, 0, 0, 0.73334],
-    "67": [0, 0.69444, 0, 0, 0.70278],
-    "68": [0, 0.69444, 0, 0, 0.79445],
-    "69": [0, 0.69444, 0, 0, 0.64167],
-    "70": [0, 0.69444, 0, 0, 0.61111],
-    "71": [0, 0.69444, 0, 0, 0.73334],
-    "72": [0, 0.69444, 0, 0, 0.79445],
-    "73": [0, 0.69444, 0, 0, 0.33056],
-    "74": [0, 0.69444, 0, 0, 0.51945],
-    "75": [0, 0.69444, 0, 0, 0.76389],
-    "76": [0, 0.69444, 0, 0, 0.58056],
-    "77": [0, 0.69444, 0, 0, 0.97778],
-    "78": [0, 0.69444, 0, 0, 0.79445],
-    "79": [0, 0.69444, 0, 0, 0.79445],
-    "80": [0, 0.69444, 0, 0, 0.70278],
-    "81": [0.10556, 0.69444, 0, 0, 0.79445],
-    "82": [0, 0.69444, 0, 0, 0.70278],
-    "83": [0, 0.69444, 0, 0, 0.61111],
-    "84": [0, 0.69444, 0, 0, 0.73334],
-    "85": [0, 0.69444, 0, 0, 0.76389],
-    "86": [0, 0.69444, 0.01528, 0, 0.73334],
-    "87": [0, 0.69444, 0.01528, 0, 1.03889],
-    "88": [0, 0.69444, 0, 0, 0.73334],
-    "89": [0, 0.69444, 0.0275, 0, 0.73334],
-    "90": [0, 0.69444, 0, 0, 0.67223],
-    "91": [0.25, 0.75, 0, 0, 0.34306],
-    "93": [0.25, 0.75, 0, 0, 0.34306],
-    "94": [0, 0.69444, 0, 0, 0.55],
-    "95": [0.35, 0.10833, 0.03056, 0, 0.55],
-    "97": [0, 0.45833, 0, 0, 0.525],
-    "98": [0, 0.69444, 0, 0, 0.56111],
-    "99": [0, 0.45833, 0, 0, 0.48889],
-    "100": [0, 0.69444, 0, 0, 0.56111],
-    "101": [0, 0.45833, 0, 0, 0.51111],
-    "102": [0, 0.69444, 0.07639, 0, 0.33611],
-    "103": [0.19444, 0.45833, 0.01528, 0, 0.55],
-    "104": [0, 0.69444, 0, 0, 0.56111],
-    "105": [0, 0.69444, 0, 0, 0.25556],
-    "106": [0.19444, 0.69444, 0, 0, 0.28611],
-    "107": [0, 0.69444, 0, 0, 0.53056],
-    "108": [0, 0.69444, 0, 0, 0.25556],
-    "109": [0, 0.45833, 0, 0, 0.86667],
-    "110": [0, 0.45833, 0, 0, 0.56111],
-    "111": [0, 0.45833, 0, 0, 0.55],
-    "112": [0.19444, 0.45833, 0, 0, 0.56111],
-    "113": [0.19444, 0.45833, 0, 0, 0.56111],
-    "114": [0, 0.45833, 0.01528, 0, 0.37222],
-    "115": [0, 0.45833, 0, 0, 0.42167],
-    "116": [0, 0.58929, 0, 0, 0.40417],
-    "117": [0, 0.45833, 0, 0, 0.56111],
-    "118": [0, 0.45833, 0.01528, 0, 0.5],
-    "119": [0, 0.45833, 0.01528, 0, 0.74445],
-    "120": [0, 0.45833, 0, 0, 0.5],
-    "121": [0.19444, 0.45833, 0.01528, 0, 0.5],
-    "122": [0, 0.45833, 0, 0, 0.47639],
-    "126": [0.35, 0.34444, 0, 0, 0.55],
-    "168": [0, 0.69444, 0, 0, 0.55],
-    "176": [0, 0.69444, 0, 0, 0.73334],
-    "180": [0, 0.69444, 0, 0, 0.55],
-    "184": [0.17014, 0, 0, 0, 0.48889],
-    "305": [0, 0.45833, 0, 0, 0.25556],
-    "567": [0.19444, 0.45833, 0, 0, 0.28611],
-    "710": [0, 0.69444, 0, 0, 0.55],
-    "711": [0, 0.63542, 0, 0, 0.55],
-    "713": [0, 0.63778, 0, 0, 0.55],
-    "728": [0, 0.69444, 0, 0, 0.55],
-    "729": [0, 0.69444, 0, 0, 0.30556],
-    "730": [0, 0.69444, 0, 0, 0.73334],
-    "732": [0, 0.69444, 0, 0, 0.55],
-    "733": [0, 0.69444, 0, 0, 0.55],
-    "915": [0, 0.69444, 0, 0, 0.58056],
-    "916": [0, 0.69444, 0, 0, 0.91667],
-    "920": [0, 0.69444, 0, 0, 0.85556],
-    "923": [0, 0.69444, 0, 0, 0.67223],
-    "926": [0, 0.69444, 0, 0, 0.73334],
-    "928": [0, 0.69444, 0, 0, 0.79445],
-    "931": [0, 0.69444, 0, 0, 0.79445],
-    "933": [0, 0.69444, 0, 0, 0.85556],
-    "934": [0, 0.69444, 0, 0, 0.79445],
-    "936": [0, 0.69444, 0, 0, 0.85556],
-    "937": [0, 0.69444, 0, 0, 0.79445],
-    "8211": [0, 0.45833, 0.03056, 0, 0.55],
-    "8212": [0, 0.45833, 0.03056, 0, 1.10001],
-    "8216": [0, 0.69444, 0, 0, 0.30556],
-    "8217": [0, 0.69444, 0, 0, 0.30556],
-    "8220": [0, 0.69444, 0, 0, 0.55834],
-    "8221": [0, 0.69444, 0, 0, 0.55834]
-  },
-  "SansSerif-Italic": {
-    "33": [0, 0.69444, 0.05733, 0, 0.31945],
-    "34": [0, 0.69444, 0.00316, 0, 0.5],
-    "35": [0.19444, 0.69444, 0.05087, 0, 0.83334],
-    "36": [0.05556, 0.75, 0.11156, 0, 0.5],
-    "37": [0.05556, 0.75, 0.03126, 0, 0.83334],
-    "38": [0, 0.69444, 0.03058, 0, 0.75834],
-    "39": [0, 0.69444, 0.07816, 0, 0.27778],
-    "40": [0.25, 0.75, 0.13164, 0, 0.38889],
-    "41": [0.25, 0.75, 0.02536, 0, 0.38889],
-    "42": [0, 0.75, 0.11775, 0, 0.5],
-    "43": [0.08333, 0.58333, 0.02536, 0, 0.77778],
-    "44": [0.125, 0.08333, 0, 0, 0.27778],
-    "45": [0, 0.44444, 0.01946, 0, 0.33333],
-    "46": [0, 0.08333, 0, 0, 0.27778],
-    "47": [0.25, 0.75, 0.13164, 0, 0.5],
-    "48": [0, 0.65556, 0.11156, 0, 0.5],
-    "49": [0, 0.65556, 0.11156, 0, 0.5],
-    "50": [0, 0.65556, 0.11156, 0, 0.5],
-    "51": [0, 0.65556, 0.11156, 0, 0.5],
-    "52": [0, 0.65556, 0.11156, 0, 0.5],
-    "53": [0, 0.65556, 0.11156, 0, 0.5],
-    "54": [0, 0.65556, 0.11156, 0, 0.5],
-    "55": [0, 0.65556, 0.11156, 0, 0.5],
-    "56": [0, 0.65556, 0.11156, 0, 0.5],
-    "57": [0, 0.65556, 0.11156, 0, 0.5],
-    "58": [0, 0.44444, 0.02502, 0, 0.27778],
-    "59": [0.125, 0.44444, 0.02502, 0, 0.27778],
-    "61": [-0.13, 0.37, 0.05087, 0, 0.77778],
-    "63": [0, 0.69444, 0.11809, 0, 0.47222],
-    "64": [0, 0.69444, 0.07555, 0, 0.66667],
-    "65": [0, 0.69444, 0, 0, 0.66667],
-    "66": [0, 0.69444, 0.08293, 0, 0.66667],
-    "67": [0, 0.69444, 0.11983, 0, 0.63889],
-    "68": [0, 0.69444, 0.07555, 0, 0.72223],
-    "69": [0, 0.69444, 0.11983, 0, 0.59722],
-    "70": [0, 0.69444, 0.13372, 0, 0.56945],
-    "71": [0, 0.69444, 0.11983, 0, 0.66667],
-    "72": [0, 0.69444, 0.08094, 0, 0.70834],
-    "73": [0, 0.69444, 0.13372, 0, 0.27778],
-    "74": [0, 0.69444, 0.08094, 0, 0.47222],
-    "75": [0, 0.69444, 0.11983, 0, 0.69445],
-    "76": [0, 0.69444, 0, 0, 0.54167],
-    "77": [0, 0.69444, 0.08094, 0, 0.875],
-    "78": [0, 0.69444, 0.08094, 0, 0.70834],
-    "79": [0, 0.69444, 0.07555, 0, 0.73611],
-    "80": [0, 0.69444, 0.08293, 0, 0.63889],
-    "81": [0.125, 0.69444, 0.07555, 0, 0.73611],
-    "82": [0, 0.69444, 0.08293, 0, 0.64584],
-    "83": [0, 0.69444, 0.09205, 0, 0.55556],
-    "84": [0, 0.69444, 0.13372, 0, 0.68056],
-    "85": [0, 0.69444, 0.08094, 0, 0.6875],
-    "86": [0, 0.69444, 0.1615, 0, 0.66667],
-    "87": [0, 0.69444, 0.1615, 0, 0.94445],
-    "88": [0, 0.69444, 0.13372, 0, 0.66667],
-    "89": [0, 0.69444, 0.17261, 0, 0.66667],
-    "90": [0, 0.69444, 0.11983, 0, 0.61111],
-    "91": [0.25, 0.75, 0.15942, 0, 0.28889],
-    "93": [0.25, 0.75, 0.08719, 0, 0.28889],
-    "94": [0, 0.69444, 0.0799, 0, 0.5],
-    "95": [0.35, 0.09444, 0.08616, 0, 0.5],
-    "97": [0, 0.44444, 0.00981, 0, 0.48056],
-    "98": [0, 0.69444, 0.03057, 0, 0.51667],
-    "99": [0, 0.44444, 0.08336, 0, 0.44445],
-    "100": [0, 0.69444, 0.09483, 0, 0.51667],
-    "101": [0, 0.44444, 0.06778, 0, 0.44445],
-    "102": [0, 0.69444, 0.21705, 0, 0.30556],
-    "103": [0.19444, 0.44444, 0.10836, 0, 0.5],
-    "104": [0, 0.69444, 0.01778, 0, 0.51667],
-    "105": [0, 0.67937, 0.09718, 0, 0.23889],
-    "106": [0.19444, 0.67937, 0.09162, 0, 0.26667],
-    "107": [0, 0.69444, 0.08336, 0, 0.48889],
-    "108": [0, 0.69444, 0.09483, 0, 0.23889],
-    "109": [0, 0.44444, 0.01778, 0, 0.79445],
-    "110": [0, 0.44444, 0.01778, 0, 0.51667],
-    "111": [0, 0.44444, 0.06613, 0, 0.5],
-    "112": [0.19444, 0.44444, 0.0389, 0, 0.51667],
-    "113": [0.19444, 0.44444, 0.04169, 0, 0.51667],
-    "114": [0, 0.44444, 0.10836, 0, 0.34167],
-    "115": [0, 0.44444, 0.0778, 0, 0.38333],
-    "116": [0, 0.57143, 0.07225, 0, 0.36111],
-    "117": [0, 0.44444, 0.04169, 0, 0.51667],
-    "118": [0, 0.44444, 0.10836, 0, 0.46111],
-    "119": [0, 0.44444, 0.10836, 0, 0.68334],
-    "120": [0, 0.44444, 0.09169, 0, 0.46111],
-    "121": [0.19444, 0.44444, 0.10836, 0, 0.46111],
-    "122": [0, 0.44444, 0.08752, 0, 0.43472],
-    "126": [0.35, 0.32659, 0.08826, 0, 0.5],
-    "168": [0, 0.67937, 0.06385, 0, 0.5],
-    "176": [0, 0.69444, 0, 0, 0.73752],
-    "184": [0.17014, 0, 0, 0, 0.44445],
-    "305": [0, 0.44444, 0.04169, 0, 0.23889],
-    "567": [0.19444, 0.44444, 0.04169, 0, 0.26667],
-    "710": [0, 0.69444, 0.0799, 0, 0.5],
-    "711": [0, 0.63194, 0.08432, 0, 0.5],
-    "713": [0, 0.60889, 0.08776, 0, 0.5],
-    "714": [0, 0.69444, 0.09205, 0, 0.5],
-    "715": [0, 0.69444, 0, 0, 0.5],
-    "728": [0, 0.69444, 0.09483, 0, 0.5],
-    "729": [0, 0.67937, 0.07774, 0, 0.27778],
-    "730": [0, 0.69444, 0, 0, 0.73752],
-    "732": [0, 0.67659, 0.08826, 0, 0.5],
-    "733": [0, 0.69444, 0.09205, 0, 0.5],
-    "915": [0, 0.69444, 0.13372, 0, 0.54167],
-    "916": [0, 0.69444, 0, 0, 0.83334],
-    "920": [0, 0.69444, 0.07555, 0, 0.77778],
-    "923": [0, 0.69444, 0, 0, 0.61111],
-    "926": [0, 0.69444, 0.12816, 0, 0.66667],
-    "928": [0, 0.69444, 0.08094, 0, 0.70834],
-    "931": [0, 0.69444, 0.11983, 0, 0.72222],
-    "933": [0, 0.69444, 0.09031, 0, 0.77778],
-    "934": [0, 0.69444, 0.04603, 0, 0.72222],
-    "936": [0, 0.69444, 0.09031, 0, 0.77778],
-    "937": [0, 0.69444, 0.08293, 0, 0.72222],
-    "8211": [0, 0.44444, 0.08616, 0, 0.5],
-    "8212": [0, 0.44444, 0.08616, 0, 1.0],
-    "8216": [0, 0.69444, 0.07816, 0, 0.27778],
-    "8217": [0, 0.69444, 0.07816, 0, 0.27778],
-    "8220": [0, 0.69444, 0.14205, 0, 0.5],
-    "8221": [0, 0.69444, 0.00316, 0, 0.5]
-  },
-  "SansSerif-Regular": {
-    "33": [0, 0.69444, 0, 0, 0.31945],
-    "34": [0, 0.69444, 0, 0, 0.5],
-    "35": [0.19444, 0.69444, 0, 0, 0.83334],
-    "36": [0.05556, 0.75, 0, 0, 0.5],
-    "37": [0.05556, 0.75, 0, 0, 0.83334],
-    "38": [0, 0.69444, 0, 0, 0.75834],
-    "39": [0, 0.69444, 0, 0, 0.27778],
-    "40": [0.25, 0.75, 0, 0, 0.38889],
-    "41": [0.25, 0.75, 0, 0, 0.38889],
-    "42": [0, 0.75, 0, 0, 0.5],
-    "43": [0.08333, 0.58333, 0, 0, 0.77778],
-    "44": [0.125, 0.08333, 0, 0, 0.27778],
-    "45": [0, 0.44444, 0, 0, 0.33333],
-    "46": [0, 0.08333, 0, 0, 0.27778],
-    "47": [0.25, 0.75, 0, 0, 0.5],
-    "48": [0, 0.65556, 0, 0, 0.5],
-    "49": [0, 0.65556, 0, 0, 0.5],
-    "50": [0, 0.65556, 0, 0, 0.5],
-    "51": [0, 0.65556, 0, 0, 0.5],
-    "52": [0, 0.65556, 0, 0, 0.5],
-    "53": [0, 0.65556, 0, 0, 0.5],
-    "54": [0, 0.65556, 0, 0, 0.5],
-    "55": [0, 0.65556, 0, 0, 0.5],
-    "56": [0, 0.65556, 0, 0, 0.5],
-    "57": [0, 0.65556, 0, 0, 0.5],
-    "58": [0, 0.44444, 0, 0, 0.27778],
-    "59": [0.125, 0.44444, 0, 0, 0.27778],
-    "61": [-0.13, 0.37, 0, 0, 0.77778],
-    "63": [0, 0.69444, 0, 0, 0.47222],
-    "64": [0, 0.69444, 0, 0, 0.66667],
-    "65": [0, 0.69444, 0, 0, 0.66667],
-    "66": [0, 0.69444, 0, 0, 0.66667],
-    "67": [0, 0.69444, 0, 0, 0.63889],
-    "68": [0, 0.69444, 0, 0, 0.72223],
-    "69": [0, 0.69444, 0, 0, 0.59722],
-    "70": [0, 0.69444, 0, 0, 0.56945],
-    "71": [0, 0.69444, 0, 0, 0.66667],
-    "72": [0, 0.69444, 0, 0, 0.70834],
-    "73": [0, 0.69444, 0, 0, 0.27778],
-    "74": [0, 0.69444, 0, 0, 0.47222],
-    "75": [0, 0.69444, 0, 0, 0.69445],
-    "76": [0, 0.69444, 0, 0, 0.54167],
-    "77": [0, 0.69444, 0, 0, 0.875],
-    "78": [0, 0.69444, 0, 0, 0.70834],
-    "79": [0, 0.69444, 0, 0, 0.73611],
-    "80": [0, 0.69444, 0, 0, 0.63889],
-    "81": [0.125, 0.69444, 0, 0, 0.73611],
-    "82": [0, 0.69444, 0, 0, 0.64584],
-    "83": [0, 0.69444, 0, 0, 0.55556],
-    "84": [0, 0.69444, 0, 0, 0.68056],
-    "85": [0, 0.69444, 0, 0, 0.6875],
-    "86": [0, 0.69444, 0.01389, 0, 0.66667],
-    "87": [0, 0.69444, 0.01389, 0, 0.94445],
-    "88": [0, 0.69444, 0, 0, 0.66667],
-    "89": [0, 0.69444, 0.025, 0, 0.66667],
-    "90": [0, 0.69444, 0, 0, 0.61111],
-    "91": [0.25, 0.75, 0, 0, 0.28889],
-    "93": [0.25, 0.75, 0, 0, 0.28889],
-    "94": [0, 0.69444, 0, 0, 0.5],
-    "95": [0.35, 0.09444, 0.02778, 0, 0.5],
-    "97": [0, 0.44444, 0, 0, 0.48056],
-    "98": [0, 0.69444, 0, 0, 0.51667],
-    "99": [0, 0.44444, 0, 0, 0.44445],
-    "100": [0, 0.69444, 0, 0, 0.51667],
-    "101": [0, 0.44444, 0, 0, 0.44445],
-    "102": [0, 0.69444, 0.06944, 0, 0.30556],
-    "103": [0.19444, 0.44444, 0.01389, 0, 0.5],
-    "104": [0, 0.69444, 0, 0, 0.51667],
-    "105": [0, 0.67937, 0, 0, 0.23889],
-    "106": [0.19444, 0.67937, 0, 0, 0.26667],
-    "107": [0, 0.69444, 0, 0, 0.48889],
-    "108": [0, 0.69444, 0, 0, 0.23889],
-    "109": [0, 0.44444, 0, 0, 0.79445],
-    "110": [0, 0.44444, 0, 0, 0.51667],
-    "111": [0, 0.44444, 0, 0, 0.5],
-    "112": [0.19444, 0.44444, 0, 0, 0.51667],
-    "113": [0.19444, 0.44444, 0, 0, 0.51667],
-    "114": [0, 0.44444, 0.01389, 0, 0.34167],
-    "115": [0, 0.44444, 0, 0, 0.38333],
-    "116": [0, 0.57143, 0, 0, 0.36111],
-    "117": [0, 0.44444, 0, 0, 0.51667],
-    "118": [0, 0.44444, 0.01389, 0, 0.46111],
-    "119": [0, 0.44444, 0.01389, 0, 0.68334],
-    "120": [0, 0.44444, 0, 0, 0.46111],
-    "121": [0.19444, 0.44444, 0.01389, 0, 0.46111],
-    "122": [0, 0.44444, 0, 0, 0.43472],
-    "126": [0.35, 0.32659, 0, 0, 0.5],
-    "168": [0, 0.67937, 0, 0, 0.5],
-    "176": [0, 0.69444, 0, 0, 0.66667],
-    "184": [0.17014, 0, 0, 0, 0.44445],
-    "305": [0, 0.44444, 0, 0, 0.23889],
-    "567": [0.19444, 0.44444, 0, 0, 0.26667],
-    "710": [0, 0.69444, 0, 0, 0.5],
-    "711": [0, 0.63194, 0, 0, 0.5],
-    "713": [0, 0.60889, 0, 0, 0.5],
-    "714": [0, 0.69444, 0, 0, 0.5],
-    "715": [0, 0.69444, 0, 0, 0.5],
-    "728": [0, 0.69444, 0, 0, 0.5],
-    "729": [0, 0.67937, 0, 0, 0.27778],
-    "730": [0, 0.69444, 0, 0, 0.66667],
-    "732": [0, 0.67659, 0, 0, 0.5],
-    "733": [0, 0.69444, 0, 0, 0.5],
-    "915": [0, 0.69444, 0, 0, 0.54167],
-    "916": [0, 0.69444, 0, 0, 0.83334],
-    "920": [0, 0.69444, 0, 0, 0.77778],
-    "923": [0, 0.69444, 0, 0, 0.61111],
-    "926": [0, 0.69444, 0, 0, 0.66667],
-    "928": [0, 0.69444, 0, 0, 0.70834],
-    "931": [0, 0.69444, 0, 0, 0.72222],
-    "933": [0, 0.69444, 0, 0, 0.77778],
-    "934": [0, 0.69444, 0, 0, 0.72222],
-    "936": [0, 0.69444, 0, 0, 0.77778],
-    "937": [0, 0.69444, 0, 0, 0.72222],
-    "8211": [0, 0.44444, 0.02778, 0, 0.5],
-    "8212": [0, 0.44444, 0.02778, 0, 1.0],
-    "8216": [0, 0.69444, 0, 0, 0.27778],
-    "8217": [0, 0.69444, 0, 0, 0.27778],
-    "8220": [0, 0.69444, 0, 0, 0.5],
-    "8221": [0, 0.69444, 0, 0, 0.5]
-  },
-  "Script-Regular": {
-    "65": [0, 0.7, 0.22925, 0, 0.80253],
-    "66": [0, 0.7, 0.04087, 0, 0.90757],
-    "67": [0, 0.7, 0.1689, 0, 0.66619],
-    "68": [0, 0.7, 0.09371, 0, 0.77443],
-    "69": [0, 0.7, 0.18583, 0, 0.56162],
-    "70": [0, 0.7, 0.13634, 0, 0.89544],
-    "71": [0, 0.7, 0.17322, 0, 0.60961],
-    "72": [0, 0.7, 0.29694, 0, 0.96919],
-    "73": [0, 0.7, 0.19189, 0, 0.80907],
-    "74": [0.27778, 0.7, 0.19189, 0, 1.05159],
-    "75": [0, 0.7, 0.31259, 0, 0.91364],
-    "76": [0, 0.7, 0.19189, 0, 0.87373],
-    "77": [0, 0.7, 0.15981, 0, 1.08031],
-    "78": [0, 0.7, 0.3525, 0, 0.9015],
-    "79": [0, 0.7, 0.08078, 0, 0.73787],
-    "80": [0, 0.7, 0.08078, 0, 1.01262],
-    "81": [0, 0.7, 0.03305, 0, 0.88282],
-    "82": [0, 0.7, 0.06259, 0, 0.85],
-    "83": [0, 0.7, 0.19189, 0, 0.86767],
-    "84": [0, 0.7, 0.29087, 0, 0.74697],
-    "85": [0, 0.7, 0.25815, 0, 0.79996],
-    "86": [0, 0.7, 0.27523, 0, 0.62204],
-    "87": [0, 0.7, 0.27523, 0, 0.80532],
-    "88": [0, 0.7, 0.26006, 0, 0.94445],
-    "89": [0, 0.7, 0.2939, 0, 0.70961],
-    "90": [0, 0.7, 0.24037, 0, 0.8212]
-  },
-  "Size1-Regular": {
-    "40": [0.35001, 0.85, 0, 0, 0.45834],
-    "41": [0.35001, 0.85, 0, 0, 0.45834],
-    "47": [0.35001, 0.85, 0, 0, 0.57778],
-    "91": [0.35001, 0.85, 0, 0, 0.41667],
-    "92": [0.35001, 0.85, 0, 0, 0.57778],
-    "93": [0.35001, 0.85, 0, 0, 0.41667],
-    "123": [0.35001, 0.85, 0, 0, 0.58334],
-    "125": [0.35001, 0.85, 0, 0, 0.58334],
-    "710": [0, 0.72222, 0, 0, 0.55556],
-    "732": [0, 0.72222, 0, 0, 0.55556],
-    "770": [0, 0.72222, 0, 0, 0.55556],
-    "771": [0, 0.72222, 0, 0, 0.55556],
-    "8214": [-0.00099, 0.601, 0, 0, 0.77778],
-    "8593": [1e-05, 0.6, 0, 0, 0.66667],
-    "8595": [1e-05, 0.6, 0, 0, 0.66667],
-    "8657": [1e-05, 0.6, 0, 0, 0.77778],
-    "8659": [1e-05, 0.6, 0, 0, 0.77778],
-    "8719": [0.25001, 0.75, 0, 0, 0.94445],
-    "8720": [0.25001, 0.75, 0, 0, 0.94445],
-    "8721": [0.25001, 0.75, 0, 0, 1.05556],
-    "8730": [0.35001, 0.85, 0, 0, 1.0],
-    "8739": [-0.00599, 0.606, 0, 0, 0.33333],
-    "8741": [-0.00599, 0.606, 0, 0, 0.55556],
-    "8747": [0.30612, 0.805, 0.19445, 0, 0.47222],
-    "8748": [0.306, 0.805, 0.19445, 0, 0.47222],
-    "8749": [0.306, 0.805, 0.19445, 0, 0.47222],
-    "8750": [0.30612, 0.805, 0.19445, 0, 0.47222],
-    "8896": [0.25001, 0.75, 0, 0, 0.83334],
-    "8897": [0.25001, 0.75, 0, 0, 0.83334],
-    "8898": [0.25001, 0.75, 0, 0, 0.83334],
-    "8899": [0.25001, 0.75, 0, 0, 0.83334],
-    "8968": [0.35001, 0.85, 0, 0, 0.47222],
-    "8969": [0.35001, 0.85, 0, 0, 0.47222],
-    "8970": [0.35001, 0.85, 0, 0, 0.47222],
-    "8971": [0.35001, 0.85, 0, 0, 0.47222],
-    "9168": [-0.00099, 0.601, 0, 0, 0.66667],
-    "10216": [0.35001, 0.85, 0, 0, 0.47222],
-    "10217": [0.35001, 0.85, 0, 0, 0.47222],
-    "10752": [0.25001, 0.75, 0, 0, 1.11111],
-    "10753": [0.25001, 0.75, 0, 0, 1.11111],
-    "10754": [0.25001, 0.75, 0, 0, 1.11111],
-    "10756": [0.25001, 0.75, 0, 0, 0.83334],
-    "10758": [0.25001, 0.75, 0, 0, 0.83334]
-  },
-  "Size2-Regular": {
-    "40": [0.65002, 1.15, 0, 0, 0.59722],
-    "41": [0.65002, 1.15, 0, 0, 0.59722],
-    "47": [0.65002, 1.15, 0, 0, 0.81111],
-    "91": [0.65002, 1.15, 0, 0, 0.47222],
-    "92": [0.65002, 1.15, 0, 0, 0.81111],
-    "93": [0.65002, 1.15, 0, 0, 0.47222],
-    "123": [0.65002, 1.15, 0, 0, 0.66667],
-    "125": [0.65002, 1.15, 0, 0, 0.66667],
-    "710": [0, 0.75, 0, 0, 1.0],
-    "732": [0, 0.75, 0, 0, 1.0],
-    "770": [0, 0.75, 0, 0, 1.0],
-    "771": [0, 0.75, 0, 0, 1.0],
-    "8719": [0.55001, 1.05, 0, 0, 1.27778],
-    "8720": [0.55001, 1.05, 0, 0, 1.27778],
-    "8721": [0.55001, 1.05, 0, 0, 1.44445],
-    "8730": [0.65002, 1.15, 0, 0, 1.0],
-    "8747": [0.86225, 1.36, 0.44445, 0, 0.55556],
-    "8748": [0.862, 1.36, 0.44445, 0, 0.55556],
-    "8749": [0.862, 1.36, 0.44445, 0, 0.55556],
-    "8750": [0.86225, 1.36, 0.44445, 0, 0.55556],
-    "8896": [0.55001, 1.05, 0, 0, 1.11111],
-    "8897": [0.55001, 1.05, 0, 0, 1.11111],
-    "8898": [0.55001, 1.05, 0, 0, 1.11111],
-    "8899": [0.55001, 1.05, 0, 0, 1.11111],
-    "8968": [0.65002, 1.15, 0, 0, 0.52778],
-    "8969": [0.65002, 1.15, 0, 0, 0.52778],
-    "8970": [0.65002, 1.15, 0, 0, 0.52778],
-    "8971": [0.65002, 1.15, 0, 0, 0.52778],
-    "10216": [0.65002, 1.15, 0, 0, 0.61111],
-    "10217": [0.65002, 1.15, 0, 0, 0.61111],
-    "10752": [0.55001, 1.05, 0, 0, 1.51112],
-    "10753": [0.55001, 1.05, 0, 0, 1.51112],
-    "10754": [0.55001, 1.05, 0, 0, 1.51112],
-    "10756": [0.55001, 1.05, 0, 0, 1.11111],
-    "10758": [0.55001, 1.05, 0, 0, 1.11111]
-  },
-  "Size3-Regular": {
-    "40": [0.95003, 1.45, 0, 0, 0.73611],
-    "41": [0.95003, 1.45, 0, 0, 0.73611],
-    "47": [0.95003, 1.45, 0, 0, 1.04445],
-    "91": [0.95003, 1.45, 0, 0, 0.52778],
-    "92": [0.95003, 1.45, 0, 0, 1.04445],
-    "93": [0.95003, 1.45, 0, 0, 0.52778],
-    "123": [0.95003, 1.45, 0, 0, 0.75],
-    "125": [0.95003, 1.45, 0, 0, 0.75],
-    "710": [0, 0.75, 0, 0, 1.44445],
-    "732": [0, 0.75, 0, 0, 1.44445],
-    "770": [0, 0.75, 0, 0, 1.44445],
-    "771": [0, 0.75, 0, 0, 1.44445],
-    "8730": [0.95003, 1.45, 0, 0, 1.0],
-    "8968": [0.95003, 1.45, 0, 0, 0.58334],
-    "8969": [0.95003, 1.45, 0, 0, 0.58334],
-    "8970": [0.95003, 1.45, 0, 0, 0.58334],
-    "8971": [0.95003, 1.45, 0, 0, 0.58334],
-    "10216": [0.95003, 1.45, 0, 0, 0.75],
-    "10217": [0.95003, 1.45, 0, 0, 0.75]
-  },
-  "Size4-Regular": {
-    "40": [1.25003, 1.75, 0, 0, 0.79167],
-    "41": [1.25003, 1.75, 0, 0, 0.79167],
-    "47": [1.25003, 1.75, 0, 0, 1.27778],
-    "91": [1.25003, 1.75, 0, 0, 0.58334],
-    "92": [1.25003, 1.75, 0, 0, 1.27778],
-    "93": [1.25003, 1.75, 0, 0, 0.58334],
-    "123": [1.25003, 1.75, 0, 0, 0.80556],
-    "125": [1.25003, 1.75, 0, 0, 0.80556],
-    "710": [0, 0.825, 0, 0, 1.8889],
-    "732": [0, 0.825, 0, 0, 1.8889],
-    "770": [0, 0.825, 0, 0, 1.8889],
-    "771": [0, 0.825, 0, 0, 1.8889],
-    "8730": [1.25003, 1.75, 0, 0, 1.0],
-    "8968": [1.25003, 1.75, 0, 0, 0.63889],
-    "8969": [1.25003, 1.75, 0, 0, 0.63889],
-    "8970": [1.25003, 1.75, 0, 0, 0.63889],
-    "8971": [1.25003, 1.75, 0, 0, 0.63889],
-    "9115": [0.64502, 1.155, 0, 0, 0.875],
-    "9116": [1e-05, 0.6, 0, 0, 0.875],
-    "9117": [0.64502, 1.155, 0, 0, 0.875],
-    "9118": [0.64502, 1.155, 0, 0, 0.875],
-    "9119": [1e-05, 0.6, 0, 0, 0.875],
-    "9120": [0.64502, 1.155, 0, 0, 0.875],
-    "9121": [0.64502, 1.155, 0, 0, 0.66667],
-    "9122": [-0.00099, 0.601, 0, 0, 0.66667],
-    "9123": [0.64502, 1.155, 0, 0, 0.66667],
-    "9124": [0.64502, 1.155, 0, 0, 0.66667],
-    "9125": [-0.00099, 0.601, 0, 0, 0.66667],
-    "9126": [0.64502, 1.155, 0, 0, 0.66667],
-    "9127": [1e-05, 0.9, 0, 0, 0.88889],
-    "9128": [0.65002, 1.15, 0, 0, 0.88889],
-    "9129": [0.90001, 0, 0, 0, 0.88889],
-    "9130": [0, 0.3, 0, 0, 0.88889],
-    "9131": [1e-05, 0.9, 0, 0, 0.88889],
-    "9132": [0.65002, 1.15, 0, 0, 0.88889],
-    "9133": [0.90001, 0, 0, 0, 0.88889],
-    "9143": [0.88502, 0.915, 0, 0, 1.05556],
-    "10216": [1.25003, 1.75, 0, 0, 0.80556],
-    "10217": [1.25003, 1.75, 0, 0, 0.80556],
-    "57344": [-0.00499, 0.605, 0, 0, 1.05556],
-    "57345": [-0.00499, 0.605, 0, 0, 1.05556],
-    "57680": [0, 0.12, 0, 0, 0.45],
-    "57681": [0, 0.12, 0, 0, 0.45],
-    "57682": [0, 0.12, 0, 0, 0.45],
-    "57683": [0, 0.12, 0, 0, 0.45]
-  },
-  "Typewriter-Regular": {
-    "32": [0, 0, 0, 0, 0.525],
-    "33": [0, 0.61111, 0, 0, 0.525],
-    "34": [0, 0.61111, 0, 0, 0.525],
-    "35": [0, 0.61111, 0, 0, 0.525],
-    "36": [0.08333, 0.69444, 0, 0, 0.525],
-    "37": [0.08333, 0.69444, 0, 0, 0.525],
-    "38": [0, 0.61111, 0, 0, 0.525],
-    "39": [0, 0.61111, 0, 0, 0.525],
-    "40": [0.08333, 0.69444, 0, 0, 0.525],
-    "41": [0.08333, 0.69444, 0, 0, 0.525],
-    "42": [0, 0.52083, 0, 0, 0.525],
-    "43": [-0.08056, 0.53055, 0, 0, 0.525],
-    "44": [0.13889, 0.125, 0, 0, 0.525],
-    "45": [-0.08056, 0.53055, 0, 0, 0.525],
-    "46": [0, 0.125, 0, 0, 0.525],
-    "47": [0.08333, 0.69444, 0, 0, 0.525],
-    "48": [0, 0.61111, 0, 0, 0.525],
-    "49": [0, 0.61111, 0, 0, 0.525],
-    "50": [0, 0.61111, 0, 0, 0.525],
-    "51": [0, 0.61111, 0, 0, 0.525],
-    "52": [0, 0.61111, 0, 0, 0.525],
-    "53": [0, 0.61111, 0, 0, 0.525],
-    "54": [0, 0.61111, 0, 0, 0.525],
-    "55": [0, 0.61111, 0, 0, 0.525],
-    "56": [0, 0.61111, 0, 0, 0.525],
-    "57": [0, 0.61111, 0, 0, 0.525],
-    "58": [0, 0.43056, 0, 0, 0.525],
-    "59": [0.13889, 0.43056, 0, 0, 0.525],
-    "60": [-0.05556, 0.55556, 0, 0, 0.525],
-    "61": [-0.19549, 0.41562, 0, 0, 0.525],
-    "62": [-0.05556, 0.55556, 0, 0, 0.525],
-    "63": [0, 0.61111, 0, 0, 0.525],
-    "64": [0, 0.61111, 0, 0, 0.525],
-    "65": [0, 0.61111, 0, 0, 0.525],
-    "66": [0, 0.61111, 0, 0, 0.525],
-    "67": [0, 0.61111, 0, 0, 0.525],
-    "68": [0, 0.61111, 0, 0, 0.525],
-    "69": [0, 0.61111, 0, 0, 0.525],
-    "70": [0, 0.61111, 0, 0, 0.525],
-    "71": [0, 0.61111, 0, 0, 0.525],
-    "72": [0, 0.61111, 0, 0, 0.525],
-    "73": [0, 0.61111, 0, 0, 0.525],
-    "74": [0, 0.61111, 0, 0, 0.525],
-    "75": [0, 0.61111, 0, 0, 0.525],
-    "76": [0, 0.61111, 0, 0, 0.525],
-    "77": [0, 0.61111, 0, 0, 0.525],
-    "78": [0, 0.61111, 0, 0, 0.525],
-    "79": [0, 0.61111, 0, 0, 0.525],
-    "80": [0, 0.61111, 0, 0, 0.525],
-    "81": [0.13889, 0.61111, 0, 0, 0.525],
-    "82": [0, 0.61111, 0, 0, 0.525],
-    "83": [0, 0.61111, 0, 0, 0.525],
-    "84": [0, 0.61111, 0, 0, 0.525],
-    "85": [0, 0.61111, 0, 0, 0.525],
-    "86": [0, 0.61111, 0, 0, 0.525],
-    "87": [0, 0.61111, 0, 0, 0.525],
-    "88": [0, 0.61111, 0, 0, 0.525],
-    "89": [0, 0.61111, 0, 0, 0.525],
-    "90": [0, 0.61111, 0, 0, 0.525],
-    "91": [0.08333, 0.69444, 0, 0, 0.525],
-    "92": [0.08333, 0.69444, 0, 0, 0.525],
-    "93": [0.08333, 0.69444, 0, 0, 0.525],
-    "94": [0, 0.61111, 0, 0, 0.525],
-    "95": [0.09514, 0, 0, 0, 0.525],
-    "96": [0, 0.61111, 0, 0, 0.525],
-    "97": [0, 0.43056, 0, 0, 0.525],
-    "98": [0, 0.61111, 0, 0, 0.525],
-    "99": [0, 0.43056, 0, 0, 0.525],
-    "100": [0, 0.61111, 0, 0, 0.525],
-    "101": [0, 0.43056, 0, 0, 0.525],
-    "102": [0, 0.61111, 0, 0, 0.525],
-    "103": [0.22222, 0.43056, 0, 0, 0.525],
-    "104": [0, 0.61111, 0, 0, 0.525],
-    "105": [0, 0.61111, 0, 0, 0.525],
-    "106": [0.22222, 0.61111, 0, 0, 0.525],
-    "107": [0, 0.61111, 0, 0, 0.525],
-    "108": [0, 0.61111, 0, 0, 0.525],
-    "109": [0, 0.43056, 0, 0, 0.525],
-    "110": [0, 0.43056, 0, 0, 0.525],
-    "111": [0, 0.43056, 0, 0, 0.525],
-    "112": [0.22222, 0.43056, 0, 0, 0.525],
-    "113": [0.22222, 0.43056, 0, 0, 0.525],
-    "114": [0, 0.43056, 0, 0, 0.525],
-    "115": [0, 0.43056, 0, 0, 0.525],
-    "116": [0, 0.55358, 0, 0, 0.525],
-    "117": [0, 0.43056, 0, 0, 0.525],
-    "118": [0, 0.43056, 0, 0, 0.525],
-    "119": [0, 0.43056, 0, 0, 0.525],
-    "120": [0, 0.43056, 0, 0, 0.525],
-    "121": [0.22222, 0.43056, 0, 0, 0.525],
-    "122": [0, 0.43056, 0, 0, 0.525],
-    "123": [0.08333, 0.69444, 0, 0, 0.525],
-    "124": [0.08333, 0.69444, 0, 0, 0.525],
-    "125": [0.08333, 0.69444, 0, 0, 0.525],
-    "126": [0, 0.61111, 0, 0, 0.525],
-    "127": [0, 0.61111, 0, 0, 0.525],
-    "160": [0, 0, 0, 0, 0.525],
-    "176": [0, 0.61111, 0, 0, 0.525],
-    "184": [0.19445, 0, 0, 0, 0.525],
-    "305": [0, 0.43056, 0, 0, 0.525],
-    "567": [0.22222, 0.43056, 0, 0, 0.525],
-    "711": [0, 0.56597, 0, 0, 0.525],
-    "713": [0, 0.56555, 0, 0, 0.525],
-    "714": [0, 0.61111, 0, 0, 0.525],
-    "715": [0, 0.61111, 0, 0, 0.525],
-    "728": [0, 0.61111, 0, 0, 0.525],
-    "730": [0, 0.61111, 0, 0, 0.525],
-    "770": [0, 0.61111, 0, 0, 0.525],
-    "771": [0, 0.61111, 0, 0, 0.525],
-    "776": [0, 0.61111, 0, 0, 0.525],
-    "915": [0, 0.61111, 0, 0, 0.525],
-    "916": [0, 0.61111, 0, 0, 0.525],
-    "920": [0, 0.61111, 0, 0, 0.525],
-    "923": [0, 0.61111, 0, 0, 0.525],
-    "926": [0, 0.61111, 0, 0, 0.525],
-    "928": [0, 0.61111, 0, 0, 0.525],
-    "931": [0, 0.61111, 0, 0, 0.525],
-    "933": [0, 0.61111, 0, 0, 0.525],
-    "934": [0, 0.61111, 0, 0, 0.525],
-    "936": [0, 0.61111, 0, 0, 0.525],
-    "937": [0, 0.61111, 0, 0, 0.525],
-    "8216": [0, 0.61111, 0, 0, 0.525],
-    "8217": [0, 0.61111, 0, 0, 0.525],
-    "8242": [0, 0.61111, 0, 0, 0.525],
-    "9251": [0.11111, 0.21944, 0, 0, 0.525]
-  }
-};
-
-/**
- * This file contains metrics regarding fonts and individual symbols. The sigma
- * and xi variables, as well as the metricMap map contain data extracted from
- * TeX, TeX font metrics, and the TTF files. These data are then exposed via the
- * `metrics` variable and the getCharacterMetrics function.
- */
-// In TeX, there are actually three sets of dimensions, one for each of
-// textstyle (size index 5 and higher: >=9pt), scriptstyle (size index 3 and 4:
-// 7-8pt), and scriptscriptstyle (size index 1 and 2: 5-6pt).  These are
-// provided in the the arrays below, in that order.
-//
-// The font metrics are stored in fonts cmsy10, cmsy7, and cmsy5 respsectively.
-// This was determined by running the following script:
-//
-//     latex -interaction=nonstopmode \
-//     '\documentclass{article}\usepackage{amsmath}\begin{document}' \
-//     '$a$ \expandafter\show\the\textfont2' \
-//     '\expandafter\show\the\scriptfont2' \
-//     '\expandafter\show\the\scriptscriptfont2' \
-//     '\stop'
-//
-// The metrics themselves were retreived using the following commands:
-//
-//     tftopl cmsy10
-//     tftopl cmsy7
-//     tftopl cmsy5
-//
-// The output of each of these commands is quite lengthy.  The only part we
-// care about is the FONTDIMEN section. Each value is measured in EMs.
-const sigmasAndXis = {
-  slant: [0.250, 0.250, 0.250],
-  // sigma1
-  space: [0.000, 0.000, 0.000],
-  // sigma2
-  stretch: [0.000, 0.000, 0.000],
-  // sigma3
-  shrink: [0.000, 0.000, 0.000],
-  // sigma4
-  xHeight: [0.431, 0.431, 0.431],
-  // sigma5
-  quad: [1.000, 1.171, 1.472],
-  // sigma6
-  extraSpace: [0.000, 0.000, 0.000],
-  // sigma7
-  num1: [0.677, 0.732, 0.925],
-  // sigma8
-  num2: [0.394, 0.384, 0.387],
-  // sigma9
-  num3: [0.444, 0.471, 0.504],
-  // sigma10
-  denom1: [0.686, 0.752, 1.025],
-  // sigma11
-  denom2: [0.345, 0.344, 0.532],
-  // sigma12
-  sup1: [0.413, 0.503, 0.504],
-  // sigma13
-  sup2: [0.363, 0.431, 0.404],
-  // sigma14
-  sup3: [0.289, 0.286, 0.294],
-  // sigma15
-  sub1: [0.150, 0.143, 0.200],
-  // sigma16
-  sub2: [0.247, 0.286, 0.400],
-  // sigma17
-  supDrop: [0.386, 0.353, 0.494],
-  // sigma18
-  subDrop: [0.050, 0.071, 0.100],
-  // sigma19
-  delim1: [2.390, 1.700, 1.980],
-  // sigma20
-  delim2: [1.010, 1.157, 1.420],
-  // sigma21
-  axisHeight: [0.250, 0.250, 0.250],
-  // sigma22
-  // These font metrics are extracted from TeX by using tftopl on cmex10.tfm;
-  // they correspond to the font parameters of the extension fonts (family 3).
-  // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to
-  // match cmex7, we'd use cmex7.tfm values for script and scriptscript
-  // values.
-  defaultRuleThickness: [0.04, 0.049, 0.049],
-  // xi8; cmex7: 0.049
-  bigOpSpacing1: [0.111, 0.111, 0.111],
-  // xi9
-  bigOpSpacing2: [0.166, 0.166, 0.166],
-  // xi10
-  bigOpSpacing3: [0.2, 0.2, 0.2],
-  // xi11
-  bigOpSpacing4: [0.6, 0.611, 0.611],
-  // xi12; cmex7: 0.611
-  bigOpSpacing5: [0.1, 0.143, 0.143],
-  // xi13; cmex7: 0.143
-  // The \sqrt rule width is taken from the height of the surd character.
-  // Since we use the same font at all sizes, this thickness doesn't scale.
-  sqrtRuleThickness: [0.04, 0.04, 0.04],
-  // This value determines how large a pt is, for metrics which are defined
-  // in terms of pts.
-  // This value is also used in katex.less; if you change it make sure the
-  // values match.
-  ptPerEm: [10.0, 10.0, 10.0],
-  // The space between adjacent `|` columns in an array definition. From
-  // `\showthe\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm.
-  doubleRuleSep: [0.2, 0.2, 0.2],
-  // The width of separator lines in {array} environments. From
-  // `\showthe\arrayrulewidth` in LaTeX. Equals 0.4 / ptPerEm.
-  arrayRuleWidth: [0.04, 0.04, 0.04],
-  // Two values from LaTeX source2e:
-  fboxsep: [0.3, 0.3, 0.3],
-  //        3 pt / ptPerEm
-  fboxrule: [0.04, 0.04, 0.04] // 0.4 pt / ptPerEm
-
-}; // This map contains a mapping from font name and character code to character
-// should have Latin-1 and Cyrillic characters, but may not depending on the
-// operating system.  The metrics do not account for extra height from the
-// accents.  In the case of Cyrillic characters which have both ascenders and
-// descenders we prefer approximations with ascenders, primarily to prevent
-// the fraction bar or root line from intersecting the glyph.
-// TODO(kevinb) allow union of multiple glyph metrics for better accuracy.
-
-const extraCharacterMap = {
-  // Latin-1
-  'Å': 'A',
-  'Ç': 'C',
-  'Ð': 'D',
-  'Þ': 'o',
-  'å': 'a',
-  'ç': 'c',
-  'ð': 'd',
-  'þ': 'o',
-  // Cyrillic
-  'А': 'A',
-  'Б': 'B',
-  'В': 'B',
-  'Г': 'F',
-  'Д': 'A',
-  'Е': 'E',
-  'Ж': 'K',
-  'З': '3',
-  'И': 'N',
-  'Й': 'N',
-  'К': 'K',
-  'Л': 'N',
-  'М': 'M',
-  'Н': 'H',
-  'О': 'O',
-  'П': 'N',
-  'Р': 'P',
-  'С': 'C',
-  'Т': 'T',
-  'У': 'y',
-  'Ф': 'O',
-  'Х': 'X',
-  'Ц': 'U',
-  'Ч': 'h',
-  'Ш': 'W',
-  'Щ': 'W',
-  'Ъ': 'B',
-  'Ы': 'X',
-  'Ь': 'B',
-  'Э': '3',
-  'Ю': 'X',
-  'Я': 'R',
-  'а': 'a',
-  'б': 'b',
-  'в': 'a',
-  'г': 'r',
-  'д': 'y',
-  'е': 'e',
-  'ж': 'm',
-  'з': 'e',
-  'и': 'n',
-  'й': 'n',
-  'к': 'n',
-  'л': 'n',
-  'м': 'm',
-  'н': 'n',
-  'о': 'o',
-  'п': 'n',
-  'р': 'p',
-  'с': 'c',
-  'т': 'o',
-  'у': 'y',
-  'ф': 'b',
-  'х': 'x',
-  'ц': 'n',
-  'ч': 'n',
-  'ш': 'w',
-  'щ': 'w',
-  'ъ': 'a',
-  'ы': 'm',
-  'ь': 'a',
-  'э': 'e',
-  'ю': 'm',
-  'я': 'r'
-};
-
-/**
- * This function adds new font metrics to default metricMap
- * It can also override existing metrics
- */
-function setFontMetrics(fontName, metrics) {
-  metricMap[fontName] = metrics;
-}
-/**
- * This function is a convenience function for looking up information in the
- * metricMap table. It takes a character as a string, and a font.
- *
- * Note: the `width` property may be undefined if fontMetricsData.js wasn't
- * built using `Make extended_metrics`.
- */
-
-function getCharacterMetrics(character, font, mode) {
-  if (!metricMap[font]) {
-    throw new Error(`Font metrics not found for font: ${font}.`);
-  }
-
-  let ch = character.charCodeAt(0);
-  let metrics = metricMap[font][ch];
-
-  if (!metrics && character[0] in extraCharacterMap) {
-    ch = extraCharacterMap[character[0]].charCodeAt(0);
-    metrics = metricMap[font][ch];
-  }
-
-  if (!metrics && mode === 'text') {
-    // We don't typically have font metrics for Asian scripts.
-    // But since we support them in text mode, we need to return
-    // some sort of metrics.
-    // So if the character is in a script we support but we
-    // don't have metrics for it, just use the metrics for
-    // the Latin capital letter M. This is close enough because
-    // we (currently) only care about the height of the glpyh
-    // not its width.
-    if (supportedCodepoint(ch)) {
-      metrics = metricMap[font][77]; // 77 is the charcode for 'M'
-    }
-  }
-
-  if (metrics) {
-    return {
-      depth: metrics[0],
-      height: metrics[1],
-      italic: metrics[2],
-      skew: metrics[3],
-      width: metrics[4]
-    };
-  }
-}
-const fontMetricsBySizeIndex = {};
-/**
- * Get the font metrics for a given size.
- */
-
-function getGlobalMetrics(size) {
-  let sizeIndex;
-
-  if (size >= 5) {
-    sizeIndex = 0;
-  } else if (size >= 3) {
-    sizeIndex = 1;
-  } else {
-    sizeIndex = 2;
-  }
-
-  if (!fontMetricsBySizeIndex[sizeIndex]) {
-    const metrics = fontMetricsBySizeIndex[sizeIndex] = {
-      cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18
-    };
-
-    for (const key in sigmasAndXis) {
-      if (sigmasAndXis.hasOwnProperty(key)) {
-        metrics[key] = sigmasAndXis[key][sizeIndex];
-      }
-    }
-  }
-
-  return fontMetricsBySizeIndex[sizeIndex];
-}
-
-/**
- * This file holds a list of all no-argument functions and single-character
- * symbols (like 'a' or ';').
- *
- * For each of the symbols, there are three properties they can have:
- * - font (required): the font to be used for this symbol. Either "main" (the
-     normal font), or "ams" (the ams fonts).
- * - group (required): the ParseNode group type the symbol should have (i.e.
-     "textord", "mathord", etc).
-     See https://github.com/KaTeX/KaTeX/wiki/Examining-TeX#group-types
- * - replace: the character that this symbol or function should be
- *   replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi
- *   character in the main font).
- *
- * The outermost map in the table indicates what mode the symbols should be
- * accepted in (e.g. "math" or "text").
- */
-// Some of these have a "-token" suffix since these are also used as `ParseNode`
-// types for raw text tokens, and we want to avoid conflicts with higher-level
-// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by
-// looking up the `symbols` map.
-const ATOMS = {
-  "bin": 1,
-  "close": 1,
-  "inner": 1,
-  "open": 1,
-  "punct": 1,
-  "rel": 1
-};
-const NON_ATOMS = {
-  "accent-token": 1,
-  "mathord": 1,
-  "op-token": 1,
-  "spacing": 1,
-  "textord": 1
-};
-const symbols = {
-  "math": {},
-  "text": {}
-};
-/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */
-
-function defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) {
-  symbols[mode][name] = {
-    font,
-    group,
-    replace
-  };
-
-  if (acceptUnicodeChar && replace) {
-    symbols[mode][replace] = symbols[mode][name];
-  }
-} // Some abbreviations for commonly used strings.
-// This helps minify the code, and also spotting typos using jshint.
-// modes:
-
-const math = "math";
-const text$1 = "text"; // fonts:
-
-const main = "main";
-const ams = "ams"; // groups:
-
-const accent = "accent-token";
-const bin = "bin";
-const close = "close";
-const inner = "inner";
-const mathord = "mathord";
-const op = "op-token";
-const open = "open";
-const punct = "punct";
-const rel = "rel";
-const spacing = "spacing";
-const textord = "textord"; // Now comes the symbol table
-// Relation Symbols
-
-defineSymbol(math, main, rel, "\u2261", "\\equiv", true);
-defineSymbol(math, main, rel, "\u227a", "\\prec", true);
-defineSymbol(math, main, rel, "\u227b", "\\succ", true);
-defineSymbol(math, main, rel, "\u223c", "\\sim", true);
-defineSymbol(math, main, rel, "\u22a5", "\\perp");
-defineSymbol(math, main, rel, "\u2aaf", "\\preceq", true);
-defineSymbol(math, main, rel, "\u2ab0", "\\succeq", true);
-defineSymbol(math, main, rel, "\u2243", "\\simeq", true);
-defineSymbol(math, main, rel, "\u2223", "\\mid", true);
-defineSymbol(math, main, rel, "\u226a", "\\ll", true);
-defineSymbol(math, main, rel, "\u226b", "\\gg", true);
-defineSymbol(math, main, rel, "\u224d", "\\asymp", true);
-defineSymbol(math, main, rel, "\u2225", "\\parallel");
-defineSymbol(math, main, rel, "\u22c8", "\\bowtie", true);
-defineSymbol(math, main, rel, "\u2323", "\\smile", true);
-defineSymbol(math, main, rel, "\u2291", "\\sqsubseteq", true);
-defineSymbol(math, main, rel, "\u2292", "\\sqsupseteq", true);
-defineSymbol(math, main, rel, "\u2250", "\\doteq", true);
-defineSymbol(math, main, rel, "\u2322", "\\frown", true);
-defineSymbol(math, main, rel, "\u220b", "\\ni", true);
-defineSymbol(math, main, rel, "\u221d", "\\propto", true);
-defineSymbol(math, main, rel, "\u22a2", "\\vdash", true);
-defineSymbol(math, main, rel, "\u22a3", "\\dashv", true);
-defineSymbol(math, main, rel, "\u220b", "\\owns"); // Punctuation
-
-defineSymbol(math, main, punct, "\u002e", "\\ldotp");
-defineSymbol(math, main, punct, "\u22c5", "\\cdotp"); // Misc Symbols
-
-defineSymbol(math, main, textord, "\u0023", "\\#");
-defineSymbol(text$1, main, textord, "\u0023", "\\#");
-defineSymbol(math, main, textord, "\u0026", "\\&");
-defineSymbol(text$1, main, textord, "\u0026", "\\&");
-defineSymbol(math, main, textord, "\u2135", "\\aleph", true);
-defineSymbol(math, main, textord, "\u2200", "\\forall", true);
-defineSymbol(math, main, textord, "\u210f", "\\hbar", true);
-defineSymbol(math, main, textord, "\u2203", "\\exists", true);
-defineSymbol(math, main, textord, "\u2207", "\\nabla", true);
-defineSymbol(math, main, textord, "\u266d", "\\flat", true);
-defineSymbol(math, main, textord, "\u2113", "\\ell", true);
-defineSymbol(math, main, textord, "\u266e", "\\natural", true);
-defineSymbol(math, main, textord, "\u2663", "\\clubsuit", true);
-defineSymbol(math, main, textord, "\u2118", "\\wp", true);
-defineSymbol(math, main, textord, "\u266f", "\\sharp", true);
-defineSymbol(math, main, textord, "\u2662", "\\diamondsuit", true);
-defineSymbol(math, main, textord, "\u211c", "\\Re", true);
-defineSymbol(math, main, textord, "\u2661", "\\heartsuit", true);
-defineSymbol(math, main, textord, "\u2111", "\\Im", true);
-defineSymbol(math, main, textord, "\u2660", "\\spadesuit", true);
-defineSymbol(text$1, main, textord, "\u00a7", "\\S", true);
-defineSymbol(text$1, main, textord, "\u00b6", "\\P", true); // Math and Text
-
-defineSymbol(math, main, textord, "\u2020", "\\dag");
-defineSymbol(text$1, main, textord, "\u2020", "\\dag");
-defineSymbol(text$1, main, textord, "\u2020", "\\textdagger");
-defineSymbol(math, main, textord, "\u2021", "\\ddag");
-defineSymbol(text$1, main, textord, "\u2021", "\\ddag");
-defineSymbol(text$1, main, textord, "\u2021", "\\textdaggerdbl"); // Large Delimiters
-
-defineSymbol(math, main, close, "\u23b1", "\\rmoustache", true);
-defineSymbol(math, main, open, "\u23b0", "\\lmoustache", true);
-defineSymbol(math, main, close, "\u27ef", "\\rgroup", true);
-defineSymbol(math, main, open, "\u27ee", "\\lgroup", true); // Binary Operators
-
-defineSymbol(math, main, bin, "\u2213", "\\mp", true);
-defineSymbol(math, main, bin, "\u2296", "\\ominus", true);
-defineSymbol(math, main, bin, "\u228e", "\\uplus", true);
-defineSymbol(math, main, bin, "\u2293", "\\sqcap", true);
-defineSymbol(math, main, bin, "\u2217", "\\ast");
-defineSymbol(math, main, bin, "\u2294", "\\sqcup", true);
-defineSymbol(math, main, bin, "\u25ef", "\\bigcirc");
-defineSymbol(math, main, bin, "\u2219", "\\bullet");
-defineSymbol(math, main, bin, "\u2021", "\\ddagger");
-defineSymbol(math, main, bin, "\u2240", "\\wr", true);
-defineSymbol(math, main, bin, "\u2a3f", "\\amalg");
-defineSymbol(math, main, bin, "\u0026", "\\And"); // from amsmath
-// Arrow Symbols
-
-defineSymbol(math, main, rel, "\u27f5", "\\longleftarrow", true);
-defineSymbol(math, main, rel, "\u21d0", "\\Leftarrow", true);
-defineSymbol(math, main, rel, "\u27f8", "\\Longleftarrow", true);
-defineSymbol(math, main, rel, "\u27f6", "\\longrightarrow", true);
-defineSymbol(math, main, rel, "\u21d2", "\\Rightarrow", true);
-defineSymbol(math, main, rel, "\u27f9", "\\Longrightarrow", true);
-defineSymbol(math, main, rel, "\u2194", "\\leftrightarrow", true);
-defineSymbol(math, main, rel, "\u27f7", "\\longleftrightarrow", true);
-defineSymbol(math, main, rel, "\u21d4", "\\Leftrightarrow", true);
-defineSymbol(math, main, rel, "\u27fa", "\\Longleftrightarrow", true);
-defineSymbol(math, main, rel, "\u21a6", "\\mapsto", true);
-defineSymbol(math, main, rel, "\u27fc", "\\longmapsto", true);
-defineSymbol(math, main, rel, "\u2197", "\\nearrow", true);
-defineSymbol(math, main, rel, "\u21a9", "\\hookleftarrow", true);
-defineSymbol(math, main, rel, "\u21aa", "\\hookrightarrow", true);
-defineSymbol(math, main, rel, "\u2198", "\\searrow", true);
-defineSymbol(math, main, rel, "\u21bc", "\\leftharpoonup", true);
-defineSymbol(math, main, rel, "\u21c0", "\\rightharpoonup", true);
-defineSymbol(math, main, rel, "\u2199", "\\swarrow", true);
-defineSymbol(math, main, rel, "\u21bd", "\\leftharpoondown", true);
-defineSymbol(math, main, rel, "\u21c1", "\\rightharpoondown", true);
-defineSymbol(math, main, rel, "\u2196", "\\nwarrow", true);
-defineSymbol(math, main, rel, "\u21cc", "\\rightleftharpoons", true); // AMS Negated Binary Relations
-
-defineSymbol(math, ams, rel, "\u226e", "\\nless", true); // Symbol names preceeded by "@" each have a corresponding macro.
-
-defineSymbol(math, ams, rel, "\ue010", "\\@nleqslant");
-defineSymbol(math, ams, rel, "\ue011", "\\@nleqq");
-defineSymbol(math, ams, rel, "\u2a87", "\\lneq", true);
-defineSymbol(math, ams, rel, "\u2268", "\\lneqq", true);
-defineSymbol(math, ams, rel, "\ue00c", "\\@lvertneqq");
-defineSymbol(math, ams, rel, "\u22e6", "\\lnsim", true);
-defineSymbol(math, ams, rel, "\u2a89", "\\lnapprox", true);
-defineSymbol(math, ams, rel, "\u2280", "\\nprec", true); // unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym.
-
-defineSymbol(math, ams, rel, "\u22e0", "\\npreceq", true);
-defineSymbol(math, ams, rel, "\u22e8", "\\precnsim", true);
-defineSymbol(math, ams, rel, "\u2ab9", "\\precnapprox", true);
-defineSymbol(math, ams, rel, "\u2241", "\\nsim", true);
-defineSymbol(math, ams, rel, "\ue006", "\\@nshortmid");
-defineSymbol(math, ams, rel, "\u2224", "\\nmid", true);
-defineSymbol(math, ams, rel, "\u22ac", "\\nvdash", true);
-defineSymbol(math, ams, rel, "\u22ad", "\\nvDash", true);
-defineSymbol(math, ams, rel, "\u22ea", "\\ntriangleleft");
-defineSymbol(math, ams, rel, "\u22ec", "\\ntrianglelefteq", true);
-defineSymbol(math, ams, rel, "\u228a", "\\subsetneq", true);
-defineSymbol(math, ams, rel, "\ue01a", "\\@varsubsetneq");
-defineSymbol(math, ams, rel, "\u2acb", "\\subsetneqq", true);
-defineSymbol(math, ams, rel, "\ue017", "\\@varsubsetneqq");
-defineSymbol(math, ams, rel, "\u226f", "\\ngtr", true);
-defineSymbol(math, ams, rel, "\ue00f", "\\@ngeqslant");
-defineSymbol(math, ams, rel, "\ue00e", "\\@ngeqq");
-defineSymbol(math, ams, rel, "\u2a88", "\\gneq", true);
-defineSymbol(math, ams, rel, "\u2269", "\\gneqq", true);
-defineSymbol(math, ams, rel, "\ue00d", "\\@gvertneqq");
-defineSymbol(math, ams, rel, "\u22e7", "\\gnsim", true);
-defineSymbol(math, ams, rel, "\u2a8a", "\\gnapprox", true);
-defineSymbol(math, ams, rel, "\u2281", "\\nsucc", true); // unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym.
-
-defineSymbol(math, ams, rel, "\u22e1", "\\nsucceq", true);
-defineSymbol(math, ams, rel, "\u22e9", "\\succnsim", true);
-defineSymbol(math, ams, rel, "\u2aba", "\\succnapprox", true); // unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym.
-
-defineSymbol(math, ams, rel, "\u2246", "\\ncong", true);
-defineSymbol(math, ams, rel, "\ue007", "\\@nshortparallel");
-defineSymbol(math, ams, rel, "\u2226", "\\nparallel", true);
-defineSymbol(math, ams, rel, "\u22af", "\\nVDash", true);
-defineSymbol(math, ams, rel, "\u22eb", "\\ntriangleright");
-defineSymbol(math, ams, rel, "\u22ed", "\\ntrianglerighteq", true);
-defineSymbol(math, ams, rel, "\ue018", "\\@nsupseteqq");
-defineSymbol(math, ams, rel, "\u228b", "\\supsetneq", true);
-defineSymbol(math, ams, rel, "\ue01b", "\\@varsupsetneq");
-defineSymbol(math, ams, rel, "\u2acc", "\\supsetneqq", true);
-defineSymbol(math, ams, rel, "\ue019", "\\@varsupsetneqq");
-defineSymbol(math, ams, rel, "\u22ae", "\\nVdash", true);
-defineSymbol(math, ams, rel, "\u2ab5", "\\precneqq", true);
-defineSymbol(math, ams, rel, "\u2ab6", "\\succneqq", true);
-defineSymbol(math, ams, rel, "\ue016", "\\@nsubseteqq");
-defineSymbol(math, ams, bin, "\u22b4", "\\unlhd");
-defineSymbol(math, ams, bin, "\u22b5", "\\unrhd"); // AMS Negated Arrows
-
-defineSymbol(math, ams, rel, "\u219a", "\\nleftarrow", true);
-defineSymbol(math, ams, rel, "\u219b", "\\nrightarrow", true);
-defineSymbol(math, ams, rel, "\u21cd", "\\nLeftarrow", true);
-defineSymbol(math, ams, rel, "\u21cf", "\\nRightarrow", true);
-defineSymbol(math, ams, rel, "\u21ae", "\\nleftrightarrow", true);
-defineSymbol(math, ams, rel, "\u21ce", "\\nLeftrightarrow", true); // AMS Misc
-
-defineSymbol(math, ams, rel, "\u25b3", "\\vartriangle");
-defineSymbol(math, ams, textord, "\u210f", "\\hslash");
-defineSymbol(math, ams, textord, "\u25bd", "\\triangledown");
-defineSymbol(math, ams, textord, "\u25ca", "\\lozenge");
-defineSymbol(math, ams, textord, "\u24c8", "\\circledS");
-defineSymbol(math, ams, textord, "\u00ae", "\\circledR");
-defineSymbol(text$1, ams, textord, "\u00ae", "\\circledR");
-defineSymbol(math, ams, textord, "\u2221", "\\measuredangle", true);
-defineSymbol(math, ams, textord, "\u2204", "\\nexists");
-defineSymbol(math, ams, textord, "\u2127", "\\mho");
-defineSymbol(math, ams, textord, "\u2132", "\\Finv", true);
-defineSymbol(math, ams, textord, "\u2141", "\\Game", true);
-defineSymbol(math, ams, textord, "\u2035", "\\backprime");
-defineSymbol(math, ams, textord, "\u25b2", "\\blacktriangle");
-defineSymbol(math, ams, textord, "\u25bc", "\\blacktriangledown");
-defineSymbol(math, ams, textord, "\u25a0", "\\blacksquare");
-defineSymbol(math, ams, textord, "\u29eb", "\\blacklozenge");
-defineSymbol(math, ams, textord, "\u2605", "\\bigstar");
-defineSymbol(math, ams, textord, "\u2222", "\\sphericalangle", true);
-defineSymbol(math, ams, textord, "\u2201", "\\complement", true); // unicode-math maps U+F0 (ð) to \matheth. We map to AMS function \eth
-
-defineSymbol(math, ams, textord, "\u00f0", "\\eth", true);
-defineSymbol(math, ams, textord, "\u2571", "\\diagup");
-defineSymbol(math, ams, textord, "\u2572", "\\diagdown");
-defineSymbol(math, ams, textord, "\u25a1", "\\square");
-defineSymbol(math, ams, textord, "\u25a1", "\\Box");
-defineSymbol(math, ams, textord, "\u25ca", "\\Diamond"); // unicode-math maps U+A5 to \mathyen. We map to AMS function \yen
-
-defineSymbol(math, ams, textord, "\u00a5", "\\yen", true);
-defineSymbol(text$1, ams, textord, "\u00a5", "\\yen", true);
-defineSymbol(math, ams, textord, "\u2713", "\\checkmark", true);
-defineSymbol(text$1, ams, textord, "\u2713", "\\checkmark"); // AMS Hebrew
-
-defineSymbol(math, ams, textord, "\u2136", "\\beth", true);
-defineSymbol(math, ams, textord, "\u2138", "\\daleth", true);
-defineSymbol(math, ams, textord, "\u2137", "\\gimel", true); // AMS Greek
-
-defineSymbol(math, ams, textord, "\u03dd", "\\digamma", true);
-defineSymbol(math, ams, textord, "\u03f0", "\\varkappa"); // AMS Delimiters
-
-defineSymbol(math, ams, open, "\u250c", "\\ulcorner", true);
-defineSymbol(math, ams, close, "\u2510", "\\urcorner", true);
-defineSymbol(math, ams, open, "\u2514", "\\llcorner", true);
-defineSymbol(math, ams, close, "\u2518", "\\lrcorner", true); // AMS Binary Relations
-
-defineSymbol(math, ams, rel, "\u2266", "\\leqq", true);
-defineSymbol(math, ams, rel, "\u2a7d", "\\leqslant", true);
-defineSymbol(math, ams, rel, "\u2a95", "\\eqslantless", true);
-defineSymbol(math, ams, rel, "\u2272", "\\lesssim", true);
-defineSymbol(math, ams, rel, "\u2a85", "\\lessapprox", true);
-defineSymbol(math, ams, rel, "\u224a", "\\approxeq", true);
-defineSymbol(math, ams, bin, "\u22d6", "\\lessdot");
-defineSymbol(math, ams, rel, "\u22d8", "\\lll", true);
-defineSymbol(math, ams, rel, "\u2276", "\\lessgtr", true);
-defineSymbol(math, ams, rel, "\u22da", "\\lesseqgtr", true);
-defineSymbol(math, ams, rel, "\u2a8b", "\\lesseqqgtr", true);
-defineSymbol(math, ams, rel, "\u2251", "\\doteqdot");
-defineSymbol(math, ams, rel, "\u2253", "\\risingdotseq", true);
-defineSymbol(math, ams, rel, "\u2252", "\\fallingdotseq", true);
-defineSymbol(math, ams, rel, "\u223d", "\\backsim", true);
-defineSymbol(math, ams, rel, "\u22cd", "\\backsimeq", true);
-defineSymbol(math, ams, rel, "\u2ac5", "\\subseteqq", true);
-defineSymbol(math, ams, rel, "\u22d0", "\\Subset", true);
-defineSymbol(math, ams, rel, "\u228f", "\\sqsubset", true);
-defineSymbol(math, ams, rel, "\u227c", "\\preccurlyeq", true);
-defineSymbol(math, ams, rel, "\u22de", "\\curlyeqprec", true);
-defineSymbol(math, ams, rel, "\u227e", "\\precsim", true);
-defineSymbol(math, ams, rel, "\u2ab7", "\\precapprox", true);
-defineSymbol(math, ams, rel, "\u22b2", "\\vartriangleleft");
-defineSymbol(math, ams, rel, "\u22b4", "\\trianglelefteq");
-defineSymbol(math, ams, rel, "\u22a8", "\\vDash", true);
-defineSymbol(math, ams, rel, "\u22aa", "\\Vvdash", true);
-defineSymbol(math, ams, rel, "\u2323", "\\smallsmile");
-defineSymbol(math, ams, rel, "\u2322", "\\smallfrown");
-defineSymbol(math, ams, rel, "\u224f", "\\bumpeq", true);
-defineSymbol(math, ams, rel, "\u224e", "\\Bumpeq", true);
-defineSymbol(math, ams, rel, "\u2267", "\\geqq", true);
-defineSymbol(math, ams, rel, "\u2a7e", "\\geqslant", true);
-defineSymbol(math, ams, rel, "\u2a96", "\\eqslantgtr", true);
-defineSymbol(math, ams, rel, "\u2273", "\\gtrsim", true);
-defineSymbol(math, ams, rel, "\u2a86", "\\gtrapprox", true);
-defineSymbol(math, ams, bin, "\u22d7", "\\gtrdot");
-defineSymbol(math, ams, rel, "\u22d9", "\\ggg", true);
-defineSymbol(math, ams, rel, "\u2277", "\\gtrless", true);
-defineSymbol(math, ams, rel, "\u22db", "\\gtreqless", true);
-defineSymbol(math, ams, rel, "\u2a8c", "\\gtreqqless", true);
-defineSymbol(math, ams, rel, "\u2256", "\\eqcirc", true);
-defineSymbol(math, ams, rel, "\u2257", "\\circeq", true);
-defineSymbol(math, ams, rel, "\u225c", "\\triangleq", true);
-defineSymbol(math, ams, rel, "\u223c", "\\thicksim");
-defineSymbol(math, ams, rel, "\u2248", "\\thickapprox");
-defineSymbol(math, ams, rel, "\u2ac6", "\\supseteqq", true);
-defineSymbol(math, ams, rel, "\u22d1", "\\Supset", true);
-defineSymbol(math, ams, rel, "\u2290", "\\sqsupset", true);
-defineSymbol(math, ams, rel, "\u227d", "\\succcurlyeq", true);
-defineSymbol(math, ams, rel, "\u22df", "\\curlyeqsucc", true);
-defineSymbol(math, ams, rel, "\u227f", "\\succsim", true);
-defineSymbol(math, ams, rel, "\u2ab8", "\\succapprox", true);
-defineSymbol(math, ams, rel, "\u22b3", "\\vartriangleright");
-defineSymbol(math, ams, rel, "\u22b5", "\\trianglerighteq");
-defineSymbol(math, ams, rel, "\u22a9", "\\Vdash", true);
-defineSymbol(math, ams, rel, "\u2223", "\\shortmid");
-defineSymbol(math, ams, rel, "\u2225", "\\shortparallel");
-defineSymbol(math, ams, rel, "\u226c", "\\between", true);
-defineSymbol(math, ams, rel, "\u22d4", "\\pitchfork", true);
-defineSymbol(math, ams, rel, "\u221d", "\\varpropto");
-defineSymbol(math, ams, rel, "\u25c0", "\\blacktriangleleft"); // unicode-math says that \therefore is a mathord atom.
-// We kept the amssymb atom type, which is rel.
-
-defineSymbol(math, ams, rel, "\u2234", "\\therefore", true);
-defineSymbol(math, ams, rel, "\u220d", "\\backepsilon");
-defineSymbol(math, ams, rel, "\u25b6", "\\blacktriangleright"); // unicode-math says that \because is a mathord atom.
-// We kept the amssymb atom type, which is rel.
-
-defineSymbol(math, ams, rel, "\u2235", "\\because", true);
-defineSymbol(math, ams, rel, "\u22d8", "\\llless");
-defineSymbol(math, ams, rel, "\u22d9", "\\gggtr");
-defineSymbol(math, ams, bin, "\u22b2", "\\lhd");
-defineSymbol(math, ams, bin, "\u22b3", "\\rhd");
-defineSymbol(math, ams, rel, "\u2242", "\\eqsim", true);
-defineSymbol(math, main, rel, "\u22c8", "\\Join");
-defineSymbol(math, ams, rel, "\u2251", "\\Doteq", true); // AMS Binary Operators
-
-defineSymbol(math, ams, bin, "\u2214", "\\dotplus", true);
-defineSymbol(math, ams, bin, "\u2216", "\\smallsetminus");
-defineSymbol(math, ams, bin, "\u22d2", "\\Cap", true);
-defineSymbol(math, ams, bin, "\u22d3", "\\Cup", true);
-defineSymbol(math, ams, bin, "\u2a5e", "\\doublebarwedge", true);
-defineSymbol(math, ams, bin, "\u229f", "\\boxminus", true);
-defineSymbol(math, ams, bin, "\u229e", "\\boxplus", true);
-defineSymbol(math, ams, bin, "\u22c7", "\\divideontimes", true);
-defineSymbol(math, ams, bin, "\u22c9", "\\ltimes", true);
-defineSymbol(math, ams, bin, "\u22ca", "\\rtimes", true);
-defineSymbol(math, ams, bin, "\u22cb", "\\leftthreetimes", true);
-defineSymbol(math, ams, bin, "\u22cc", "\\rightthreetimes", true);
-defineSymbol(math, ams, bin, "\u22cf", "\\curlywedge", true);
-defineSymbol(math, ams, bin, "\u22ce", "\\curlyvee", true);
-defineSymbol(math, ams, bin, "\u229d", "\\circleddash", true);
-defineSymbol(math, ams, bin, "\u229b", "\\circledast", true);
-defineSymbol(math, ams, bin, "\u22c5", "\\centerdot");
-defineSymbol(math, ams, bin, "\u22ba", "\\intercal", true);
-defineSymbol(math, ams, bin, "\u22d2", "\\doublecap");
-defineSymbol(math, ams, bin, "\u22d3", "\\doublecup");
-defineSymbol(math, ams, bin, "\u22a0", "\\boxtimes", true); // AMS Arrows
-// Note: unicode-math maps \u21e2 to their own function \rightdasharrow.
-// We'll map it to AMS function \dashrightarrow. It produces the same atom.
-
-defineSymbol(math, ams, rel, "\u21e2", "\\dashrightarrow", true); // unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym.
-
-defineSymbol(math, ams, rel, "\u21e0", "\\dashleftarrow", true);
-defineSymbol(math, ams, rel, "\u21c7", "\\leftleftarrows", true);
-defineSymbol(math, ams, rel, "\u21c6", "\\leftrightarrows", true);
-defineSymbol(math, ams, rel, "\u21da", "\\Lleftarrow", true);
-defineSymbol(math, ams, rel, "\u219e", "\\twoheadleftarrow", true);
-defineSymbol(math, ams, rel, "\u21a2", "\\leftarrowtail", true);
-defineSymbol(math, ams, rel, "\u21ab", "\\looparrowleft", true);
-defineSymbol(math, ams, rel, "\u21cb", "\\leftrightharpoons", true);
-defineSymbol(math, ams, rel, "\u21b6", "\\curvearrowleft", true); // unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym.
-
-defineSymbol(math, ams, rel, "\u21ba", "\\circlearrowleft", true);
-defineSymbol(math, ams, rel, "\u21b0", "\\Lsh", true);
-defineSymbol(math, ams, rel, "\u21c8", "\\upuparrows", true);
-defineSymbol(math, ams, rel, "\u21bf", "\\upharpoonleft", true);
-defineSymbol(math, ams, rel, "\u21c3", "\\downharpoonleft", true);
-defineSymbol(math, ams, rel, "\u22b8", "\\multimap", true);
-defineSymbol(math, ams, rel, "\u21ad", "\\leftrightsquigarrow", true);
-defineSymbol(math, ams, rel, "\u21c9", "\\rightrightarrows", true);
-defineSymbol(math, ams, rel, "\u21c4", "\\rightleftarrows", true);
-defineSymbol(math, ams, rel, "\u21a0", "\\twoheadrightarrow", true);
-defineSymbol(math, ams, rel, "\u21a3", "\\rightarrowtail", true);
-defineSymbol(math, ams, rel, "\u21ac", "\\looparrowright", true);
-defineSymbol(math, ams, rel, "\u21b7", "\\curvearrowright", true); // unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym.
-
-defineSymbol(math, ams, rel, "\u21bb", "\\circlearrowright", true);
-defineSymbol(math, ams, rel, "\u21b1", "\\Rsh", true);
-defineSymbol(math, ams, rel, "\u21ca", "\\downdownarrows", true);
-defineSymbol(math, ams, rel, "\u21be", "\\upharpoonright", true);
-defineSymbol(math, ams, rel, "\u21c2", "\\downharpoonright", true);
-defineSymbol(math, ams, rel, "\u21dd", "\\rightsquigarrow", true);
-defineSymbol(math, ams, rel, "\u21dd", "\\leadsto");
-defineSymbol(math, ams, rel, "\u21db", "\\Rrightarrow", true);
-defineSymbol(math, ams, rel, "\u21be", "\\restriction");
-defineSymbol(math, main, textord, "\u2018", "`");
-defineSymbol(math, main, textord, "$", "\\$");
-defineSymbol(text$1, main, textord, "$", "\\$");
-defineSymbol(text$1, main, textord, "$", "\\textdollar");
-defineSymbol(math, main, textord, "%", "\\%");
-defineSymbol(text$1, main, textord, "%", "\\%");
-defineSymbol(math, main, textord, "_", "\\_");
-defineSymbol(text$1, main, textord, "_", "\\_");
-defineSymbol(text$1, main, textord, "_", "\\textunderscore");
-defineSymbol(math, main, textord, "\u2220", "\\angle", true);
-defineSymbol(math, main, textord, "\u221e", "\\infty", true);
-defineSymbol(math, main, textord, "\u2032", "\\prime");
-defineSymbol(math, main, textord, "\u25b3", "\\triangle");
-defineSymbol(math, main, textord, "\u0393", "\\Gamma", true);
-defineSymbol(math, main, textord, "\u0394", "\\Delta", true);
-defineSymbol(math, main, textord, "\u0398", "\\Theta", true);
-defineSymbol(math, main, textord, "\u039b", "\\Lambda", true);
-defineSymbol(math, main, textord, "\u039e", "\\Xi", true);
-defineSymbol(math, main, textord, "\u03a0", "\\Pi", true);
-defineSymbol(math, main, textord, "\u03a3", "\\Sigma", true);
-defineSymbol(math, main, textord, "\u03a5", "\\Upsilon", true);
-defineSymbol(math, main, textord, "\u03a6", "\\Phi", true);
-defineSymbol(math, main, textord, "\u03a8", "\\Psi", true);
-defineSymbol(math, main, textord, "\u03a9", "\\Omega", true);
-defineSymbol(math, main, textord, "A", "\u0391");
-defineSymbol(math, main, textord, "B", "\u0392");
-defineSymbol(math, main, textord, "E", "\u0395");
-defineSymbol(math, main, textord, "Z", "\u0396");
-defineSymbol(math, main, textord, "H", "\u0397");
-defineSymbol(math, main, textord, "I", "\u0399");
-defineSymbol(math, main, textord, "K", "\u039A");
-defineSymbol(math, main, textord, "M", "\u039C");
-defineSymbol(math, main, textord, "N", "\u039D");
-defineSymbol(math, main, textord, "O", "\u039F");
-defineSymbol(math, main, textord, "P", "\u03A1");
-defineSymbol(math, main, textord, "T", "\u03A4");
-defineSymbol(math, main, textord, "X", "\u03A7");
-defineSymbol(math, main, textord, "\u00ac", "\\neg", true);
-defineSymbol(math, main, textord, "\u00ac", "\\lnot");
-defineSymbol(math, main, textord, "\u22a4", "\\top");
-defineSymbol(math, main, textord, "\u22a5", "\\bot");
-defineSymbol(math, main, textord, "\u2205", "\\emptyset");
-defineSymbol(math, ams, textord, "\u2205", "\\varnothing");
-defineSymbol(math, main, mathord, "\u03b1", "\\alpha", true);
-defineSymbol(math, main, mathord, "\u03b2", "\\beta", true);
-defineSymbol(math, main, mathord, "\u03b3", "\\gamma", true);
-defineSymbol(math, main, mathord, "\u03b4", "\\delta", true);
-defineSymbol(math, main, mathord, "\u03f5", "\\epsilon", true);
-defineSymbol(math, main, mathord, "\u03b6", "\\zeta", true);
-defineSymbol(math, main, mathord, "\u03b7", "\\eta", true);
-defineSymbol(math, main, mathord, "\u03b8", "\\theta", true);
-defineSymbol(math, main, mathord, "\u03b9", "\\iota", true);
-defineSymbol(math, main, mathord, "\u03ba", "\\kappa", true);
-defineSymbol(math, main, mathord, "\u03bb", "\\lambda", true);
-defineSymbol(math, main, mathord, "\u03bc", "\\mu", true);
-defineSymbol(math, main, mathord, "\u03bd", "\\nu", true);
-defineSymbol(math, main, mathord, "\u03be", "\\xi", true);
-defineSymbol(math, main, mathord, "\u03bf", "\\omicron", true);
-defineSymbol(math, main, mathord, "\u03c0", "\\pi", true);
-defineSymbol(math, main, mathord, "\u03c1", "\\rho", true);
-defineSymbol(math, main, mathord, "\u03c3", "\\sigma", true);
-defineSymbol(math, main, mathord, "\u03c4", "\\tau", true);
-defineSymbol(math, main, mathord, "\u03c5", "\\upsilon", true);
-defineSymbol(math, main, mathord, "\u03d5", "\\phi", true);
-defineSymbol(math, main, mathord, "\u03c7", "\\chi", true);
-defineSymbol(math, main, mathord, "\u03c8", "\\psi", true);
-defineSymbol(math, main, mathord, "\u03c9", "\\omega", true);
-defineSymbol(math, main, mathord, "\u03b5", "\\varepsilon", true);
-defineSymbol(math, main, mathord, "\u03d1", "\\vartheta", true);
-defineSymbol(math, main, mathord, "\u03d6", "\\varpi", true);
-defineSymbol(math, main, mathord, "\u03f1", "\\varrho", true);
-defineSymbol(math, main, mathord, "\u03c2", "\\varsigma", true);
-defineSymbol(math, main, mathord, "\u03c6", "\\varphi", true);
-defineSymbol(math, main, bin, "\u2217", "*");
-defineSymbol(math, main, bin, "+", "+");
-defineSymbol(math, main, bin, "\u2212", "-");
-defineSymbol(math, main, bin, "\u22c5", "\\cdot", true);
-defineSymbol(math, main, bin, "\u2218", "\\circ");
-defineSymbol(math, main, bin, "\u00f7", "\\div", true);
-defineSymbol(math, main, bin, "\u00b1", "\\pm", true);
-defineSymbol(math, main, bin, "\u00d7", "\\times", true);
-defineSymbol(math, main, bin, "\u2229", "\\cap", true);
-defineSymbol(math, main, bin, "\u222a", "\\cup", true);
-defineSymbol(math, main, bin, "\u2216", "\\setminus");
-defineSymbol(math, main, bin, "\u2227", "\\land");
-defineSymbol(math, main, bin, "\u2228", "\\lor");
-defineSymbol(math, main, bin, "\u2227", "\\wedge", true);
-defineSymbol(math, main, bin, "\u2228", "\\vee", true);
-defineSymbol(math, main, textord, "\u221a", "\\surd");
-defineSymbol(math, main, open, "(", "(");
-defineSymbol(math, main, open, "[", "[");
-defineSymbol(math, main, open, "\u27e8", "\\langle", true);
-defineSymbol(math, main, open, "\u2223", "\\lvert");
-defineSymbol(math, main, open, "\u2225", "\\lVert");
-defineSymbol(math, main, close, ")", ")");
-defineSymbol(math, main, close, "]", "]");
-defineSymbol(math, main, close, "?", "?");
-defineSymbol(math, main, close, "!", "!");
-defineSymbol(math, main, close, "\u27e9", "\\rangle", true);
-defineSymbol(math, main, close, "\u2223", "\\rvert");
-defineSymbol(math, main, close, "\u2225", "\\rVert");
-defineSymbol(math, main, rel, "=", "=");
-defineSymbol(math, main, rel, "<", "<");
-defineSymbol(math, main, rel, ">", ">");
-defineSymbol(math, main, rel, ":", ":");
-defineSymbol(math, main, rel, "\u2248", "\\approx", true);
-defineSymbol(math, main, rel, "\u2245", "\\cong", true);
-defineSymbol(math, main, rel, "\u2265", "\\ge");
-defineSymbol(math, main, rel, "\u2265", "\\geq", true);
-defineSymbol(math, main, rel, "\u2190", "\\gets");
-defineSymbol(math, main, rel, ">", "\\gt");
-defineSymbol(math, main, rel, "\u2208", "\\in", true);
-defineSymbol(math, main, rel, "\ue020", "\\@not");
-defineSymbol(math, main, rel, "\u2282", "\\subset", true);
-defineSymbol(math, main, rel, "\u2283", "\\supset", true);
-defineSymbol(math, main, rel, "\u2286", "\\subseteq", true);
-defineSymbol(math, main, rel, "\u2287", "\\supseteq", true);
-defineSymbol(math, ams, rel, "\u2288", "\\nsubseteq", true);
-defineSymbol(math, ams, rel, "\u2289", "\\nsupseteq", true);
-defineSymbol(math, main, rel, "\u22a8", "\\models");
-defineSymbol(math, main, rel, "\u2190", "\\leftarrow", true);
-defineSymbol(math, main, rel, "\u2264", "\\le");
-defineSymbol(math, main, rel, "\u2264", "\\leq", true);
-defineSymbol(math, main, rel, "<", "\\lt");
-defineSymbol(math, main, rel, "\u2192", "\\rightarrow", true);
-defineSymbol(math, main, rel, "\u2192", "\\to");
-defineSymbol(math, ams, rel, "\u2271", "\\ngeq", true);
-defineSymbol(math, ams, rel, "\u2270", "\\nleq", true);
-defineSymbol(math, main, spacing, "\u00a0", "\\ ");
-defineSymbol(math, main, spacing, "\u00a0", "~");
-defineSymbol(math, main, spacing, "\u00a0", "\\space"); // Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{%
-
-defineSymbol(math, main, spacing, "\u00a0", "\\nobreakspace");
-defineSymbol(text$1, main, spacing, "\u00a0", "\\ ");
-defineSymbol(text$1, main, spacing, "\u00a0", "~");
-defineSymbol(text$1, main, spacing, "\u00a0", "\\space");
-defineSymbol(text$1, main, spacing, "\u00a0", "\\nobreakspace");
-defineSymbol(math, main, spacing, null, "\\nobreak");
-defineSymbol(math, main, spacing, null, "\\allowbreak");
-defineSymbol(math, main, punct, ",", ",");
-defineSymbol(math, main, punct, ";", ";");
-defineSymbol(math, ams, bin, "\u22bc", "\\barwedge", true);
-defineSymbol(math, ams, bin, "\u22bb", "\\veebar", true);
-defineSymbol(math, main, bin, "\u2299", "\\odot", true);
-defineSymbol(math, main, bin, "\u2295", "\\oplus", true);
-defineSymbol(math, main, bin, "\u2297", "\\otimes", true);
-defineSymbol(math, main, textord, "\u2202", "\\partial", true);
-defineSymbol(math, main, bin, "\u2298", "\\oslash", true);
-defineSymbol(math, ams, bin, "\u229a", "\\circledcirc", true);
-defineSymbol(math, ams, bin, "\u22a1", "\\boxdot", true);
-defineSymbol(math, main, bin, "\u25b3", "\\bigtriangleup");
-defineSymbol(math, main, bin, "\u25bd", "\\bigtriangledown");
-defineSymbol(math, main, bin, "\u2020", "\\dagger");
-defineSymbol(math, main, bin, "\u22c4", "\\diamond");
-defineSymbol(math, main, bin, "\u22c6", "\\star");
-defineSymbol(math, main, bin, "\u25c3", "\\triangleleft");
-defineSymbol(math, main, bin, "\u25b9", "\\triangleright");
-defineSymbol(math, main, open, "{", "\\{");
-defineSymbol(text$1, main, textord, "{", "\\{");
-defineSymbol(text$1, main, textord, "{", "\\textbraceleft");
-defineSymbol(math, main, close, "}", "\\}");
-defineSymbol(text$1, main, textord, "}", "\\}");
-defineSymbol(text$1, main, textord, "}", "\\textbraceright");
-defineSymbol(math, main, open, "{", "\\lbrace");
-defineSymbol(math, main, close, "}", "\\rbrace");
-defineSymbol(math, main, open, "[", "\\lbrack");
-defineSymbol(text$1, main, textord, "[", "\\lbrack");
-defineSymbol(math, main, close, "]", "\\rbrack");
-defineSymbol(text$1, main, textord, "]", "\\rbrack");
-defineSymbol(math, main, open, "(", "\\lparen");
-defineSymbol(math, main, close, ")", "\\rparen");
-defineSymbol(text$1, main, textord, "<", "\\textless"); // in T1 fontenc
-
-defineSymbol(text$1, main, textord, ">", "\\textgreater"); // in T1 fontenc
-
-defineSymbol(math, main, open, "\u230a", "\\lfloor", true);
-defineSymbol(math, main, close, "\u230b", "\\rfloor", true);
-defineSymbol(math, main, open, "\u2308", "\\lceil", true);
-defineSymbol(math, main, close, "\u2309", "\\rceil", true);
-defineSymbol(math, main, textord, "\\", "\\backslash");
-defineSymbol(math, main, textord, "\u2223", "|");
-defineSymbol(math, main, textord, "\u2223", "\\vert");
-defineSymbol(text$1, main, textord, "|", "\\textbar"); // in T1 fontenc
-
-defineSymbol(math, main, textord, "\u2225", "\\|");
-defineSymbol(math, main, textord, "\u2225", "\\Vert");
-defineSymbol(text$1, main, textord, "\u2225", "\\textbardbl");
-defineSymbol(text$1, main, textord, "~", "\\textasciitilde");
-defineSymbol(text$1, main, textord, "\\", "\\textbackslash");
-defineSymbol(text$1, main, textord, "^", "\\textasciicircum");
-defineSymbol(math, main, rel, "\u2191", "\\uparrow", true);
-defineSymbol(math, main, rel, "\u21d1", "\\Uparrow", true);
-defineSymbol(math, main, rel, "\u2193", "\\downarrow", true);
-defineSymbol(math, main, rel, "\u21d3", "\\Downarrow", true);
-defineSymbol(math, main, rel, "\u2195", "\\updownarrow", true);
-defineSymbol(math, main, rel, "\u21d5", "\\Updownarrow", true);
-defineSymbol(math, main, op, "\u2210", "\\coprod");
-defineSymbol(math, main, op, "\u22c1", "\\bigvee");
-defineSymbol(math, main, op, "\u22c0", "\\bigwedge");
-defineSymbol(math, main, op, "\u2a04", "\\biguplus");
-defineSymbol(math, main, op, "\u22c2", "\\bigcap");
-defineSymbol(math, main, op, "\u22c3", "\\bigcup");
-defineSymbol(math, main, op, "\u222b", "\\int");
-defineSymbol(math, main, op, "\u222b", "\\intop");
-defineSymbol(math, main, op, "\u222c", "\\iint");
-defineSymbol(math, main, op, "\u222d", "\\iiint");
-defineSymbol(math, main, op, "\u220f", "\\prod");
-defineSymbol(math, main, op, "\u2211", "\\sum");
-defineSymbol(math, main, op, "\u2a02", "\\bigotimes");
-defineSymbol(math, main, op, "\u2a01", "\\bigoplus");
-defineSymbol(math, main, op, "\u2a00", "\\bigodot");
-defineSymbol(math, main, op, "\u222e", "\\oint");
-defineSymbol(math, main, op, "\u222f", "\\oiint");
-defineSymbol(math, main, op, "\u2230", "\\oiiint");
-defineSymbol(math, main, op, "\u2a06", "\\bigsqcup");
-defineSymbol(math, main, op, "\u222b", "\\smallint");
-defineSymbol(text$1, main, inner, "\u2026", "\\textellipsis");
-defineSymbol(math, main, inner, "\u2026", "\\mathellipsis");
-defineSymbol(text$1, main, inner, "\u2026", "\\ldots", true);
-defineSymbol(math, main, inner, "\u2026", "\\ldots", true);
-defineSymbol(math, main, inner, "\u22ef", "\\@cdots", true);
-defineSymbol(math, main, inner, "\u22f1", "\\ddots", true);
-defineSymbol(math, main, textord, "\u22ee", "\\varvdots"); // \vdots is a macro
-
-defineSymbol(math, main, accent, "\u02ca", "\\acute");
-defineSymbol(math, main, accent, "\u02cb", "\\grave");
-defineSymbol(math, main, accent, "\u00a8", "\\ddot");
-defineSymbol(math, main, accent, "\u007e", "\\tilde");
-defineSymbol(math, main, accent, "\u02c9", "\\bar");
-defineSymbol(math, main, accent, "\u02d8", "\\breve");
-defineSymbol(math, main, accent, "\u02c7", "\\check");
-defineSymbol(math, main, accent, "\u005e", "\\hat");
-defineSymbol(math, main, accent, "\u20d7", "\\vec");
-defineSymbol(math, main, accent, "\u02d9", "\\dot");
-defineSymbol(math, main, accent, "\u02da", "\\mathring");
-defineSymbol(math, main, mathord, "\u0131", "\\imath", true);
-defineSymbol(math, main, mathord, "\u0237", "\\jmath", true);
-defineSymbol(text$1, main, textord, "\u0131", "\\i", true);
-defineSymbol(text$1, main, textord, "\u0237", "\\j", true);
-defineSymbol(text$1, main, textord, "\u00df", "\\ss", true);
-defineSymbol(text$1, main, textord, "\u00e6", "\\ae", true);
-defineSymbol(text$1, main, textord, "\u00e6", "\\ae", true);
-defineSymbol(text$1, main, textord, "\u0153", "\\oe", true);
-defineSymbol(text$1, main, textord, "\u00f8", "\\o", true);
-defineSymbol(text$1, main, textord, "\u00c6", "\\AE", true);
-defineSymbol(text$1, main, textord, "\u0152", "\\OE", true);
-defineSymbol(text$1, main, textord, "\u00d8", "\\O", true);
-defineSymbol(text$1, main, accent, "\u02ca", "\\'"); // acute
-
-defineSymbol(text$1, main, accent, "\u02cb", "\\`"); // grave
-
-defineSymbol(text$1, main, accent, "\u02c6", "\\^"); // circumflex
-
-defineSymbol(text$1, main, accent, "\u02dc", "\\~"); // tilde
-
-defineSymbol(text$1, main, accent, "\u02c9", "\\="); // macron
-
-defineSymbol(text$1, main, accent, "\u02d8", "\\u"); // breve
-
-defineSymbol(text$1, main, accent, "\u02d9", "\\."); // dot above
-
-defineSymbol(text$1, main, accent, "\u02da", "\\r"); // ring above
-
-defineSymbol(text$1, main, accent, "\u02c7", "\\v"); // caron
-
-defineSymbol(text$1, main, accent, "\u00a8", '\\"'); // diaresis
-
-defineSymbol(text$1, main, accent, "\u02dd", "\\H"); // double acute
-
-defineSymbol(text$1, main, accent, "\u25ef", "\\textcircled"); // \bigcirc glyph
-// These ligatures are detected and created in Parser.js's `formLigatures`.
-
-const ligatures = {
-  "--": true,
-  "---": true,
-  "``": true,
-  "''": true
-};
-defineSymbol(text$1, main, textord, "\u2013", "--");
-defineSymbol(text$1, main, textord, "\u2013", "\\textendash");
-defineSymbol(text$1, main, textord, "\u2014", "---");
-defineSymbol(text$1, main, textord, "\u2014", "\\textemdash");
-defineSymbol(text$1, main, textord, "\u2018", "`");
-defineSymbol(text$1, main, textord, "\u2018", "\\textquoteleft");
-defineSymbol(text$1, main, textord, "\u2019", "'");
-defineSymbol(text$1, main, textord, "\u2019", "\\textquoteright");
-defineSymbol(text$1, main, textord, "\u201c", "``");
-defineSymbol(text$1, main, textord, "\u201c", "\\textquotedblleft");
-defineSymbol(text$1, main, textord, "\u201d", "''");
-defineSymbol(text$1, main, textord, "\u201d", "\\textquotedblright"); //  \degree from gensymb package
-
-defineSymbol(math, main, textord, "\u00b0", "\\degree", true);
-defineSymbol(text$1, main, textord, "\u00b0", "\\degree"); // \textdegree from inputenc package
-
-defineSymbol(text$1, main, textord, "\u00b0", "\\textdegree", true); // TODO: In LaTeX, \pounds can generate a different character in text and math
-// mode, but among our fonts, only Main-Italic defines this character "163".
-
-defineSymbol(math, main, mathord, "\u00a3", "\\pounds");
-defineSymbol(math, main, mathord, "\u00a3", "\\mathsterling", true);
-defineSymbol(text$1, main, mathord, "\u00a3", "\\pounds");
-defineSymbol(text$1, main, mathord, "\u00a3", "\\textsterling", true);
-defineSymbol(math, ams, textord, "\u2720", "\\maltese");
-defineSymbol(text$1, ams, textord, "\u2720", "\\maltese");
-defineSymbol(text$1, main, spacing, "\u00a0", "\\ ");
-defineSymbol(text$1, main, spacing, "\u00a0", " ");
-defineSymbol(text$1, main, spacing, "\u00a0", "~"); // There are lots of symbols which are the same, so we add them in afterwards.
-// All of these are textords in math mode
-
-const mathTextSymbols = "0123456789/@.\"";
-
-for (let i = 0; i < mathTextSymbols.length; i++) {
-  const ch = mathTextSymbols.charAt(i);
-  defineSymbol(math, main, textord, ch, ch);
-} // All of these are textords in text mode
-
-
-const textSymbols = "0123456789!@*()-=+[]<>|\";:?/.,";
-
-for (let i = 0; i < textSymbols.length; i++) {
-  const ch = textSymbols.charAt(i);
-  defineSymbol(text$1, main, textord, ch, ch);
-} // All of these are textords in text mode, and mathords in math mode
-
-
-const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
-
-for (let i = 0; i < letters.length; i++) {
-  const ch = letters.charAt(i);
-  defineSymbol(math, main, mathord, ch, ch);
-  defineSymbol(text$1, main, textord, ch, ch);
-} // Blackboard bold and script letters in Unicode range
-
-
-defineSymbol(math, ams, textord, "C", "\u2102"); // blackboard bold
-
-defineSymbol(text$1, ams, textord, "C", "\u2102");
-defineSymbol(math, ams, textord, "H", "\u210D");
-defineSymbol(text$1, ams, textord, "H", "\u210D");
-defineSymbol(math, ams, textord, "N", "\u2115");
-defineSymbol(text$1, ams, textord, "N", "\u2115");
-defineSymbol(math, ams, textord, "P", "\u2119");
-defineSymbol(text$1, ams, textord, "P", "\u2119");
-defineSymbol(math, ams, textord, "Q", "\u211A");
-defineSymbol(text$1, ams, textord, "Q", "\u211A");
-defineSymbol(math, ams, textord, "R", "\u211D");
-defineSymbol(text$1, ams, textord, "R", "\u211D");
-defineSymbol(math, ams, textord, "Z", "\u2124");
-defineSymbol(text$1, ams, textord, "Z", "\u2124");
-defineSymbol(math, main, mathord, "h", "\u210E"); // italic h, Planck constant
-
-defineSymbol(text$1, main, mathord, "h", "\u210E"); // The next loop loads wide (surrogate pair) characters.
-// We support some letters in the Unicode range U+1D400 to U+1D7FF,
-// Mathematical Alphanumeric Symbols.
-// Some editors do not deal well with wide characters. So don't write the
-// string into this file. Instead, create the string from the surrogate pair.
-
-let wideChar = "";
-
-for (let i = 0; i < letters.length; i++) {
-  const ch = letters.charAt(i); // The hex numbers in the next line are a surrogate pair.
-  // 0xD835 is the high surrogate for all letters in the range we support.
-  // 0xDC00 is the low surrogate for bold A.
-
-  wideChar = String.fromCharCode(0xD835, 0xDC00 + i); // A-Z a-z bold
-
-  defineSymbol(math, main, mathord, ch, wideChar);
-  defineSymbol(text$1, main, textord, ch, wideChar);
-  wideChar = String.fromCharCode(0xD835, 0xDC34 + i); // A-Z a-z italic
-
-  defineSymbol(math, main, mathord, ch, wideChar);
-  defineSymbol(text$1, main, textord, ch, wideChar);
-  wideChar = String.fromCharCode(0xD835, 0xDC68 + i); // A-Z a-z bold italic
-
-  defineSymbol(math, main, mathord, ch, wideChar);
-  defineSymbol(text$1, main, textord, ch, wideChar);
-  wideChar = String.fromCharCode(0xD835, 0xDD04 + i); // A-Z a-z Fractur
-
-  defineSymbol(math, main, mathord, ch, wideChar);
-  defineSymbol(text$1, main, textord, ch, wideChar);
-  wideChar = String.fromCharCode(0xD835, 0xDDA0 + i); // A-Z a-z sans-serif
-
-  defineSymbol(math, main, mathord, ch, wideChar);
-  defineSymbol(text$1, main, textord, ch, wideChar);
-  wideChar = String.fromCharCode(0xD835, 0xDDD4 + i); // A-Z a-z sans bold
-
-  defineSymbol(math, main, mathord, ch, wideChar);
-  defineSymbol(text$1, main, textord, ch, wideChar);
-  wideChar = String.fromCharCode(0xD835, 0xDE08 + i); // A-Z a-z sans italic
-
-  defineSymbol(math, main, mathord, ch, wideChar);
-  defineSymbol(text$1, main, textord, ch, wideChar);
-  wideChar = String.fromCharCode(0xD835, 0xDE70 + i); // A-Z a-z monospace
-
-  defineSymbol(math, main, mathord, ch, wideChar);
-  defineSymbol(text$1, main, textord, ch, wideChar);
-
-  if (i < 26) {
-    // KaTeX fonts have only capital letters for blackboard bold and script.
-    // See exception for k below.
-    wideChar = String.fromCharCode(0xD835, 0xDD38 + i); // A-Z double struck
-
-    defineSymbol(math, main, mathord, ch, wideChar);
-    defineSymbol(text$1, main, textord, ch, wideChar);
-    wideChar = String.fromCharCode(0xD835, 0xDC9C + i); // A-Z script
-
-    defineSymbol(math, main, mathord, ch, wideChar);
-    defineSymbol(text$1, main, textord, ch, wideChar);
-  } // TODO: Add bold script when it is supported by a KaTeX font.
-
-} // "k" is the only double struck lower case letter in the KaTeX fonts.
-
-
-wideChar = String.fromCharCode(0xD835, 0xDD5C); // k double struck
-
-defineSymbol(math, main, mathord, "k", wideChar);
-defineSymbol(text$1, main, textord, "k", wideChar); // Next, some wide character numerals
-
-for (let i = 0; i < 10; i++) {
-  const ch = i.toString();
-  wideChar = String.fromCharCode(0xD835, 0xDFCE + i); // 0-9 bold
-
-  defineSymbol(math, main, mathord, ch, wideChar);
-  defineSymbol(text$1, main, textord, ch, wideChar);
-  wideChar = String.fromCharCode(0xD835, 0xDFE2 + i); // 0-9 sans serif
-
-  defineSymbol(math, main, mathord, ch, wideChar);
-  defineSymbol(text$1, main, textord, ch, wideChar);
-  wideChar = String.fromCharCode(0xD835, 0xDFEC + i); // 0-9 bold sans
-
-  defineSymbol(math, main, mathord, ch, wideChar);
-  defineSymbol(text$1, main, textord, ch, wideChar);
-  wideChar = String.fromCharCode(0xD835, 0xDFF6 + i); // 0-9 monospace
-
-  defineSymbol(math, main, mathord, ch, wideChar);
-  defineSymbol(text$1, main, textord, ch, wideChar);
-} // We add these Latin-1 letters as symbols for backwards-compatibility,
-// but they are not actually in the font, nor are they supported by the
-// Unicode accent mechanism, so they fall back to Times font and look ugly.
-// TODO(edemaine): Fix this.
-
-
-const extraLatin = "ÇÐÞçþ";
-
-for (let i = 0; i < extraLatin.length; i++) {
-  const ch = extraLatin.charAt(i);
-  defineSymbol(math, main, mathord, ch, ch);
-  defineSymbol(text$1, main, textord, ch, ch);
-}
-
-defineSymbol(text$1, main, textord, "ð", "ð"); // Unicode versions of existing characters
-
-defineSymbol(text$1, main, textord, "\u2013", "–");
-defineSymbol(text$1, main, textord, "\u2014", "—");
-defineSymbol(text$1, main, textord, "\u2018", "‘");
-defineSymbol(text$1, main, textord, "\u2019", "’");
-defineSymbol(text$1, main, textord, "\u201c", "“");
-defineSymbol(text$1, main, textord, "\u201d", "”");
-
-/**
- * This file provides support for Unicode range U+1D400 to U+1D7FF,
- * Mathematical Alphanumeric Symbols.
- *
- * Function wideCharacterFont takes a wide character as input and returns
- * the font information necessary to render it properly.
- */
-/**
- * Data below is from https://www.unicode.org/charts/PDF/U1D400.pdf
- * That document sorts characters into groups by font type, say bold or italic.
- *
- * In the arrays below, each subarray consists three elements:
- *      * The CSS class of that group when in math mode.
- *      * The CSS class of that group when in text mode.
- *      * The font name, so that KaTeX can get font metrics.
- */
-
-const wideLatinLetterData = [["mathbf", "textbf", "Main-Bold"], // A-Z bold upright
-["mathbf", "textbf", "Main-Bold"], // a-z bold upright
-["mathdefault", "textit", "Math-Italic"], // A-Z italic
-["mathdefault", "textit", "Math-Italic"], // a-z italic
-["boldsymbol", "boldsymbol", "Main-BoldItalic"], // A-Z bold italic
-["boldsymbol", "boldsymbol", "Main-BoldItalic"], // a-z bold italic
-// Map fancy A-Z letters to script, not calligraphic.
-// This aligns with unicode-math and math fonts (except Cambria Math).
-["mathscr", "textscr", "Script-Regular"], // A-Z script
-["", "", ""], // a-z script.  No font
-["", "", ""], // A-Z bold script. No font
-["", "", ""], // a-z bold script. No font
-["mathfrak", "textfrak", "Fraktur-Regular"], // A-Z Fraktur
-["mathfrak", "textfrak", "Fraktur-Regular"], // a-z Fraktur
-["mathbb", "textbb", "AMS-Regular"], // A-Z double-struck
-["mathbb", "textbb", "AMS-Regular"], // k double-struck
-["", "", ""], // A-Z bold Fraktur No font metrics
-["", "", ""], // a-z bold Fraktur.   No font.
-["mathsf", "textsf", "SansSerif-Regular"], // A-Z sans-serif
-["mathsf", "textsf", "SansSerif-Regular"], // a-z sans-serif
-["mathboldsf", "textboldsf", "SansSerif-Bold"], // A-Z bold sans-serif
-["mathboldsf", "textboldsf", "SansSerif-Bold"], // a-z bold sans-serif
-["mathitsf", "textitsf", "SansSerif-Italic"], // A-Z italic sans-serif
-["mathitsf", "textitsf", "SansSerif-Italic"], // a-z italic sans-serif
-["", "", ""], // A-Z bold italic sans. No font
-["", "", ""], // a-z bold italic sans. No font
-["mathtt", "texttt", "Typewriter-Regular"], // A-Z monospace
-["mathtt", "texttt", "Typewriter-Regular"]];
-const wideNumeralData = [["mathbf", "textbf", "Main-Bold"], // 0-9 bold
-["", "", ""], // 0-9 double-struck. No KaTeX font.
-["mathsf", "textsf", "SansSerif-Regular"], // 0-9 sans-serif
-["mathboldsf", "textboldsf", "SansSerif-Bold"], // 0-9 bold sans-serif
-["mathtt", "texttt", "Typewriter-Regular"]];
-const wideCharacterFont = function wideCharacterFont(wideChar, mode) {
-  // IE doesn't support codePointAt(). So work with the surrogate pair.
-  const H = wideChar.charCodeAt(0); // high surrogate
-
-  const L = wideChar.charCodeAt(1); // low surrogate
-
-  const codePoint = (H - 0xD800) * 0x400 + (L - 0xDC00) + 0x10000;
-  const j = mode === "math" ? 0 : 1; // column index for CSS class.
-
-  if (0x1D400 <= codePoint && codePoint < 0x1D6A4) {
-    // wideLatinLetterData contains exactly 26 chars on each row.
-    // So we can calculate the relevant row. No traverse necessary.
-    const i = Math.floor((codePoint - 0x1D400) / 26);
-    return [wideLatinLetterData[i][2], wideLatinLetterData[i][j]];
-  } else if (0x1D7CE <= codePoint && codePoint <= 0x1D7FF) {
-    // Numerals, ten per row.
-    const i = Math.floor((codePoint - 0x1D7CE) / 10);
-    return [wideNumeralData[i][2], wideNumeralData[i][j]];
-  } else if (codePoint === 0x1D6A5 || codePoint === 0x1D6A6) {
-    // dotless i or j
-    return [wideLatinLetterData[0][2], wideLatinLetterData[0][j]];
-  } else if (0x1D6A6 < codePoint && codePoint < 0x1D7CE) {
-    // Greek letters. Not supported, yet.
-    return ["", ""];
-  } else {
-    // We don't support any wide characters outside 1D400–1D7FF.
-    throw new ParseError("Unsupported character: " + wideChar);
-  }
-};
-
-/**
- * This file contains information about the options that the Parser carries
- * around with it while parsing. Data is held in an `Options` object, and when
- * recursing, a new `Options` object can be created with the `.with*` and
- * `.reset` functions.
- */
-const sizeStyleMap = [// Each element contains [textsize, scriptsize, scriptscriptsize].
-// The size mappings are taken from TeX with \normalsize=10pt.
-[1, 1, 1], // size1: [5, 5, 5]              \tiny
-[2, 1, 1], // size2: [6, 5, 5]
-[3, 1, 1], // size3: [7, 5, 5]              \scriptsize
-[4, 2, 1], // size4: [8, 6, 5]              \footnotesize
-[5, 2, 1], // size5: [9, 6, 5]              \small
-[6, 3, 1], // size6: [10, 7, 5]             \normalsize
-[7, 4, 2], // size7: [12, 8, 6]             \large
-[8, 6, 3], // size8: [14.4, 10, 7]          \Large
-[9, 7, 6], // size9: [17.28, 12, 10]        \LARGE
-[10, 8, 7], // size10: [20.74, 14.4, 12]     \huge
-[11, 10, 9]];
-const sizeMultipliers = [// fontMetrics.js:getGlobalMetrics also uses size indexes, so if
-// you change size indexes, change that function.
-0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488];
-
-const sizeAtStyle = function sizeAtStyle(size, style) {
-  return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1];
-}; // In these types, "" (empty string) means "no change".
-
-
-/**
- * This is the main options class. It contains the current style, size, color,
- * and font.
- *
- * Options objects should not be modified. To create a new Options with
- * different properties, call a `.having*` method.
- */
-class Options {
-  // A font family applies to a group of fonts (i.e. SansSerif), while a font
-  // represents a specific font (i.e. SansSerif Bold).
-  // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm
-
-  /**
-   * The base size index.
-   */
-  constructor(data) {
-    this.style = void 0;
-    this.color = void 0;
-    this.size = void 0;
-    this.textSize = void 0;
-    this.phantom = void 0;
-    this.font = void 0;
-    this.fontFamily = void 0;
-    this.fontWeight = void 0;
-    this.fontShape = void 0;
-    this.sizeMultiplier = void 0;
-    this.maxSize = void 0;
-    this.minRuleThickness = void 0;
-    this._fontMetrics = void 0;
-    this.style = data.style;
-    this.color = data.color;
-    this.size = data.size || Options.BASESIZE;
-    this.textSize = data.textSize || this.size;
-    this.phantom = !!data.phantom;
-    this.font = data.font || "";
-    this.fontFamily = data.fontFamily || "";
-    this.fontWeight = data.fontWeight || '';
-    this.fontShape = data.fontShape || '';
-    this.sizeMultiplier = sizeMultipliers[this.size - 1];
-    this.maxSize = data.maxSize;
-    this.minRuleThickness = data.minRuleThickness;
-    this._fontMetrics = undefined;
-  }
-  /**
-   * Returns a new options object with the same properties as "this".  Properties
-   * from "extension" will be copied to the new options object.
-   */
-
-
-  extend(extension) {
-    const data = {
-      style: this.style,
-      size: this.size,
-      textSize: this.textSize,
-      color: this.color,
-      phantom: this.phantom,
-      font: this.font,
-      fontFamily: this.fontFamily,
-      fontWeight: this.fontWeight,
-      fontShape: this.fontShape,
-      maxSize: this.maxSize,
-      minRuleThickness: this.minRuleThickness
-    };
-
-    for (const key in extension) {
-      if (extension.hasOwnProperty(key)) {
-        data[key] = extension[key];
-      }
-    }
-
-    return new Options(data);
-  }
-  /**
-   * Return an options object with the given style. If `this.style === style`,
-   * returns `this`.
-   */
-
-
-  havingStyle(style) {
-    if (this.style === style) {
-      return this;
-    } else {
-      return this.extend({
-        style: style,
-        size: sizeAtStyle(this.textSize, style)
-      });
-    }
-  }
-  /**
-   * Return an options object with a cramped version of the current style. If
-   * the current style is cramped, returns `this`.
-   */
-
-
-  havingCrampedStyle() {
-    return this.havingStyle(this.style.cramp());
-  }
-  /**
-   * Return an options object with the given size and in at least `\textstyle`.
-   * Returns `this` if appropriate.
-   */
-
-
-  havingSize(size) {
-    if (this.size === size && this.textSize === size) {
-      return this;
-    } else {
-      return this.extend({
-        style: this.style.text(),
-        size: size,
-        textSize: size,
-        sizeMultiplier: sizeMultipliers[size - 1]
-      });
-    }
-  }
-  /**
-   * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted,
-   * changes to at least `\textstyle`.
-   */
-
-
-  havingBaseStyle(style) {
-    style = style || this.style.text();
-    const wantSize = sizeAtStyle(Options.BASESIZE, style);
-
-    if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) {
-      return this;
-    } else {
-      return this.extend({
-        style: style,
-        size: wantSize
-      });
-    }
-  }
-  /**
-   * Remove the effect of sizing changes such as \Huge.
-   * Keep the effect of the current style, such as \scriptstyle.
-   */
-
-
-  havingBaseSizing() {
-    let size;
-
-    switch (this.style.id) {
-      case 4:
-      case 5:
-        size = 3; // normalsize in scriptstyle
-
-        break;
-
-      case 6:
-      case 7:
-        size = 1; // normalsize in scriptscriptstyle
-
-        break;
-
-      default:
-        size = 6;
-      // normalsize in textstyle or displaystyle
-    }
-
-    return this.extend({
-      style: this.style.text(),
-      size: size
-    });
-  }
-  /**
-   * Create a new options object with the given color.
-   */
-
-
-  withColor(color) {
-    return this.extend({
-      color: color
-    });
-  }
-  /**
-   * Create a new options object with "phantom" set to true.
-   */
-
-
-  withPhantom() {
-    return this.extend({
-      phantom: true
-    });
-  }
-  /**
-   * Creates a new options object with the given math font or old text font.
-   * @type {[type]}
-   */
-
-
-  withFont(font) {
-    return this.extend({
-      font
-    });
-  }
-  /**
-   * Create a new options objects with the given fontFamily.
-   */
-
-
-  withTextFontFamily(fontFamily) {
-    return this.extend({
-      fontFamily,
-      font: ""
-    });
-  }
-  /**
-   * Creates a new options object with the given font weight
-   */
-
-
-  withTextFontWeight(fontWeight) {
-    return this.extend({
-      fontWeight,
-      font: ""
-    });
-  }
-  /**
-   * Creates a new options object with the given font weight
-   */
-
-
-  withTextFontShape(fontShape) {
-    return this.extend({
-      fontShape,
-      font: ""
-    });
-  }
-  /**
-   * Return the CSS sizing classes required to switch from enclosing options
-   * `oldOptions` to `this`. Returns an array of classes.
-   */
-
-
-  sizingClasses(oldOptions) {
-    if (oldOptions.size !== this.size) {
-      return ["sizing", "reset-size" + oldOptions.size, "size" + this.size];
-    } else {
-      return [];
-    }
-  }
-  /**
-   * Return the CSS sizing classes required to switch to the base size. Like
-   * `this.havingSize(BASESIZE).sizingClasses(this)`.
-   */
-
-
-  baseSizingClasses() {
-    if (this.size !== Options.BASESIZE) {
-      return ["sizing", "reset-size" + this.size, "size" + Options.BASESIZE];
-    } else {
-      return [];
-    }
-  }
-  /**
-   * Return the font metrics for this size.
-   */
-
-
-  fontMetrics() {
-    if (!this._fontMetrics) {
-      this._fontMetrics = getGlobalMetrics(this.size);
-    }
-
-    return this._fontMetrics;
-  }
-  /**
-   * Gets the CSS color of the current options object
-   */
-
-
-  getColor() {
-    if (this.phantom) {
-      return "transparent";
-    } else {
-      return this.color;
-    }
-  }
-
-}
-
-Options.BASESIZE = 6;
-
-/**
- * This file does conversion between units.  In particular, it provides
- * calculateSize to convert other units into ems.
- */
-// Thus, multiplying a length by this number converts the length from units
-// into pts.  Dividing the result by ptPerEm gives the number of ems
-// *assuming* a font size of ptPerEm (normal size, normal style).
-
-const ptPerUnit = {
-  // https://en.wikibooks.org/wiki/LaTeX/Lengths and
-  // https://tex.stackexchange.com/a/8263
-  "pt": 1,
-  // TeX point
-  "mm": 7227 / 2540,
-  // millimeter
-  "cm": 7227 / 254,
-  // centimeter
-  "in": 72.27,
-  // inch
-  "bp": 803 / 800,
-  // big (PostScript) points
-  "pc": 12,
-  // pica
-  "dd": 1238 / 1157,
-  // didot
-  "cc": 14856 / 1157,
-  // cicero (12 didot)
-  "nd": 685 / 642,
-  // new didot
-  "nc": 1370 / 107,
-  // new cicero (12 new didot)
-  "sp": 1 / 65536,
-  // scaled point (TeX's internal smallest unit)
-  // https://tex.stackexchange.com/a/41371
-  "px": 803 / 800 // \pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX
-
-}; // Dictionary of relative units, for fast validity testing.
-
-const relativeUnit = {
-  "ex": true,
-  "em": true,
-  "mu": true
-};
-
-/**
- * Determine whether the specified unit (either a string defining the unit
- * or a "size" parse node containing a unit field) is valid.
- */
-const validUnit = function validUnit(unit) {
-  if (typeof unit !== "string") {
-    unit = unit.unit;
-  }
-
-  return unit in ptPerUnit || unit in relativeUnit || unit === "ex";
-};
-/*
- * Convert a "size" parse node (with numeric "number" and string "unit" fields,
- * as parsed by functions.js argType "size") into a CSS em value for the
- * current style/scale.  `options` gives the current options.
- */
-
-const calculateSize = function calculateSize(sizeValue, options) {
-  let scale;
-
-  if (sizeValue.unit in ptPerUnit) {
-    // Absolute units
-    scale = ptPerUnit[sizeValue.unit] // Convert unit to pt
-    / options.fontMetrics().ptPerEm // Convert pt to CSS em
-    / options.sizeMultiplier; // Unscale to make absolute units
-  } else if (sizeValue.unit === "mu") {
-    // `mu` units scale with scriptstyle/scriptscriptstyle.
-    scale = options.fontMetrics().cssEmPerMu;
-  } else {
-    // Other relative units always refer to the *textstyle* font
-    // in the current size.
-    let unitOptions;
-
-    if (options.style.isTight()) {
-      // isTight() means current style is script/scriptscript.
-      unitOptions = options.havingStyle(options.style.text());
-    } else {
-      unitOptions = options;
-    } // TODO: In TeX these units are relative to the quad of the current
-    // *text* font, e.g. cmr10. KaTeX instead uses values from the
-    // comparably-sized *Computer Modern symbol* font. At 10pt, these
-    // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641;
-    // cmr5=1.361133, cmsy5=1.472241. Consider $\scriptsize a\kern1emb$.
-    // TeX \showlists shows a kern of 1.13889 * fontsize;
-    // KaTeX shows a kern of 1.171 * fontsize.
-
-
-    if (sizeValue.unit === "ex") {
-      scale = unitOptions.fontMetrics().xHeight;
-    } else if (sizeValue.unit === "em") {
-      scale = unitOptions.fontMetrics().quad;
-    } else {
-      throw new ParseError("Invalid unit: '" + sizeValue.unit + "'");
-    }
-
-    if (unitOptions !== options) {
-      scale *= unitOptions.sizeMultiplier / options.sizeMultiplier;
-    }
-  }
-
-  return Math.min(sizeValue.number * scale, options.maxSize);
-};
-
-/* eslint no-console:0 */
-// The following have to be loaded from Main-Italic font, using class mathit
-const mathitLetters = ["\\imath", "ı", // dotless i
-"\\jmath", "ȷ", // dotless j
-"\\pounds", "\\mathsterling", "\\textsterling", "£"];
-/**
- * Looks up the given symbol in fontMetrics, after applying any symbol
- * replacements defined in symbol.js
- */
-
-const lookupSymbol = function lookupSymbol(value, // TODO(#963): Use a union type for this.
-fontName, mode) {
-  // Replace the value with its replaced value from symbol.js
-  if (symbols[mode][value] && symbols[mode][value].replace) {
-    value = symbols[mode][value].replace;
-  }
-
-  return {
-    value: value,
-    metrics: getCharacterMetrics(value, fontName, mode)
-  };
-};
-/**
- * Makes a symbolNode after translation via the list of symbols in symbols.js.
- * Correctly pulls out metrics for the character, and optionally takes a list of
- * classes to be attached to the node.
- *
- * TODO: make argument order closer to makeSpan
- * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which
- * should if present come first in `classes`.
- * TODO(#953): Make `options` mandatory and always pass it in.
- */
-
-
-const makeSymbol = function makeSymbol(value, fontName, mode, options, classes) {
-  const lookup = lookupSymbol(value, fontName, mode);
-  const metrics = lookup.metrics;
-  value = lookup.value;
-  let symbolNode;
-
-  if (metrics) {
-    let italic = metrics.italic;
-
-    if (mode === "text" || options && options.font === "mathit") {
-      italic = 0;
-    }
-
-    symbolNode = new SymbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes);
-  } else {
-    // TODO(emily): Figure out a good way to only print this in development
-    typeof console !== "undefined" && console.warn("No character metrics " + `for '${value}' in style '${fontName}' and mode '${mode}'`);
-    symbolNode = new SymbolNode(value, 0, 0, 0, 0, 0, classes);
-  }
-
-  if (options) {
-    symbolNode.maxFontSize = options.sizeMultiplier;
-
-    if (options.style.isTight()) {
-      symbolNode.classes.push("mtight");
-    }
-
-    const color = options.getColor();
-
-    if (color) {
-      symbolNode.style.color = color;
-    }
-  }
-
-  return symbolNode;
-};
-/**
- * Makes a symbol in Main-Regular or AMS-Regular.
- * Used for rel, bin, open, close, inner, and punct.
- */
-
-
-const mathsym = function mathsym(value, mode, options, classes) {
-  if (classes === void 0) {
-    classes = [];
-  }
-
-  // Decide what font to render the symbol in by its entry in the symbols
-  // table.
-  // Have a special case for when the value = \ because the \ is used as a
-  // textord in unsupported command errors but cannot be parsed as a regular
-  // text ordinal and is therefore not present as a symbol in the symbols
-  // table for text, as well as a special case for boldsymbol because it
-  // can be used for bold + and -
-  if (options.font === "boldsymbol" && lookupSymbol(value, "Main-Bold", mode).metrics) {
-    return makeSymbol(value, "Main-Bold", mode, options, classes.concat(["mathbf"]));
-  } else if (value === "\\" || symbols[mode][value].font === "main") {
-    return makeSymbol(value, "Main-Regular", mode, options, classes);
-  } else {
-    return makeSymbol(value, "AMS-Regular", mode, options, classes.concat(["amsrm"]));
-  }
-};
-/**
- * Determines which of the two font names (Main-Italic and Math-Italic) and
- * corresponding style tags (maindefault or mathit) to use for default math font,
- * depending on the symbol.
- */
-
-
-const mathdefault = function mathdefault(value, mode, options, classes) {
-  if (/[0-9]/.test(value.charAt(0)) || // glyphs for \imath and \jmath do not exist in Math-Italic so we
-  // need to use Main-Italic instead
-  utils.contains(mathitLetters, value)) {
-    return {
-      fontName: "Main-Italic",
-      fontClass: "mathit"
-    };
-  } else {
-    return {
-      fontName: "Math-Italic",
-      fontClass: "mathdefault"
-    };
-  }
-};
-/**
- * Determines which of the font names (Main-Italic, Math-Italic, and Caligraphic)
- * and corresponding style tags (mathit, mathdefault, or mathcal) to use for font
- * "mathnormal", depending on the symbol.  Use this function instead of fontMap for
- * font "mathnormal".
- */
-
-
-const mathnormal = function mathnormal(value, mode, options, classes) {
-  if (utils.contains(mathitLetters, value)) {
-    return {
-      fontName: "Main-Italic",
-      fontClass: "mathit"
-    };
-  } else if (/[0-9]/.test(value.charAt(0))) {
-    return {
-      fontName: "Caligraphic-Regular",
-      fontClass: "mathcal"
-    };
-  } else {
-    return {
-      fontName: "Math-Italic",
-      fontClass: "mathdefault"
-    };
-  }
-};
-/**
- * Determines which of the two font names (Main-Bold and Math-BoldItalic) and
- * corresponding style tags (mathbf or boldsymbol) to use for font "boldsymbol",
- * depending on the symbol.  Use this function instead of fontMap for font
- * "boldsymbol".
- */
-
-
-const boldsymbol = function boldsymbol(value, mode, options, classes) {
-  if (lookupSymbol(value, "Math-BoldItalic", mode).metrics) {
-    return {
-      fontName: "Math-BoldItalic",
-      fontClass: "boldsymbol"
-    };
-  } else {
-    // Some glyphs do not exist in Math-BoldItalic so we need to use
-    // Main-Bold instead.
-    return {
-      fontName: "Main-Bold",
-      fontClass: "mathbf"
-    };
-  }
-};
-/**
- * Makes either a mathord or textord in the correct font and color.
- */
-
-
-const makeOrd = function makeOrd(group, options, type) {
-  const mode = group.mode;
-  const text = group.text;
-  const classes = ["mord"]; // Math mode or Old font (i.e. \rm)
-
-  const isFont = mode === "math" || mode === "text" && options.font;
-  const fontOrFamily = isFont ? options.font : options.fontFamily;
-
-  if (text.charCodeAt(0) === 0xD835) {
-    // surrogate pairs get special treatment
-    const _wideCharacterFont = wideCharacterFont(text, mode),
-          wideFontName = _wideCharacterFont[0],
-          wideFontClass = _wideCharacterFont[1];
-
-    return makeSymbol(text, wideFontName, mode, options, classes.concat(wideFontClass));
-  } else if (fontOrFamily) {
-    let fontName;
-    let fontClasses;
-
-    if (fontOrFamily === "boldsymbol" || fontOrFamily === "mathnormal") {
-      const fontData = fontOrFamily === "boldsymbol" ? boldsymbol(text, mode, options, classes) : mathnormal(text, mode, options, classes);
-      fontName = fontData.fontName;
-      fontClasses = [fontData.fontClass];
-    } else if (utils.contains(mathitLetters, text)) {
-      fontName = "Main-Italic";
-      fontClasses = ["mathit"];
-    } else if (isFont) {
-      fontName = fontMap[fontOrFamily].fontName;
-      fontClasses = [fontOrFamily];
-    } else {
-      fontName = retrieveTextFontName(fontOrFamily, options.fontWeight, options.fontShape);
-      fontClasses = [fontOrFamily, options.fontWeight, options.fontShape];
-    }
-
-    if (lookupSymbol(text, fontName, mode).metrics) {
-      return makeSymbol(text, fontName, mode, options, classes.concat(fontClasses));
-    } else if (ligatures.hasOwnProperty(text) && fontName.substr(0, 10) === "Typewriter") {
-      // Deconstruct ligatures in monospace fonts (\texttt, \tt).
-      const parts = [];
-
-      for (let i = 0; i < text.length; i++) {
-        parts.push(makeSymbol(text[i], fontName, mode, options, classes.concat(fontClasses)));
-      }
-
-      return makeFragment(parts);
-    }
-  } // Makes a symbol in the default font for mathords and textords.
-
-
-  if (type === "mathord") {
-    const fontLookup = mathdefault(text, mode, options, classes);
-    return makeSymbol(text, fontLookup.fontName, mode, options, classes.concat([fontLookup.fontClass]));
-  } else if (type === "textord") {
-    const font = symbols[mode][text] && symbols[mode][text].font;
-
-    if (font === "ams") {
-      const fontName = retrieveTextFontName("amsrm", options.fontWeight, options.fontShape);
-      return makeSymbol(text, fontName, mode, options, classes.concat("amsrm", options.fontWeight, options.fontShape));
-    } else if (font === "main" || !font) {
-      const fontName = retrieveTextFontName("textrm", options.fontWeight, options.fontShape);
-      return makeSymbol(text, fontName, mode, options, classes.concat(options.fontWeight, options.fontShape));
-    } else {
-      // fonts added by plugins
-      const fontName = retrieveTextFontName(font, options.fontWeight, options.fontShape); // We add font name as a css class
-
-      return makeSymbol(text, fontName, mode, options, classes.concat(fontName, options.fontWeight, options.fontShape));
-    }
-  } else {
-    throw new Error("unexpected type: " + type + " in makeOrd");
-  }
-};
-/**
- * Returns true if subsequent symbolNodes have the same classes, skew, maxFont,
- * and styles.
- */
-
-
-const canCombine = (prev, next) => {
-  if (createClass(prev.classes) !== createClass(next.classes) || prev.skew !== next.skew || prev.maxFontSize !== next.maxFontSize) {
-    return false;
-  }
-
-  for (const style in prev.style) {
-    if (prev.style.hasOwnProperty(style) && prev.style[style] !== next.style[style]) {
-      return false;
-    }
-  }
-
-  for (const style in next.style) {
-    if (next.style.hasOwnProperty(style) && prev.style[style] !== next.style[style]) {
-      return false;
-    }
-  }
-
-  return true;
-};
-/**
- * Combine consequetive domTree.symbolNodes into a single symbolNode.
- * Note: this function mutates the argument.
- */
-
-
-const tryCombineChars = chars => {
-  for (let i = 0; i < chars.length - 1; i++) {
-    const prev = chars[i];
-    const next = chars[i + 1];
-
-    if (prev instanceof SymbolNode && next instanceof SymbolNode && canCombine(prev, next)) {
-      prev.text += next.text;
-      prev.height = Math.max(prev.height, next.height);
-      prev.depth = Math.max(prev.depth, next.depth); // Use the last character's italic correction since we use
-      // it to add padding to the right of the span created from
-      // the combined characters.
-
-      prev.italic = next.italic;
-      chars.splice(i + 1, 1);
-      i--;
-    }
-  }
-
-  return chars;
-};
-/**
- * Calculate the height, depth, and maxFontSize of an element based on its
- * children.
- */
-
-
-const sizeElementFromChildren = function sizeElementFromChildren(elem) {
-  let height = 0;
-  let depth = 0;
-  let maxFontSize = 0;
-
-  for (let i = 0; i < elem.children.length; i++) {
-    const child = elem.children[i];
-
-    if (child.height > height) {
-      height = child.height;
-    }
-
-    if (child.depth > depth) {
-      depth = child.depth;
-    }
-
-    if (child.maxFontSize > maxFontSize) {
-      maxFontSize = child.maxFontSize;
-    }
-  }
-
-  elem.height = height;
-  elem.depth = depth;
-  elem.maxFontSize = maxFontSize;
-};
-/**
- * Makes a span with the given list of classes, list of children, and options.
- *
- * TODO(#953): Ensure that `options` is always provided (currently some call
- * sites don't pass it) and make the type below mandatory.
- * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which
- * should if present come first in `classes`.
- */
-
-
-const makeSpan = function makeSpan(classes, children, options, style) {
-  const span = new Span(classes, children, options, style);
-  sizeElementFromChildren(span);
-  return span;
-}; // SVG one is simpler -- doesn't require height, depth, max-font setting.
-// This is also a separate method for typesafety.
-
-
-const makeSvgSpan = (classes, children, options, style) => new Span(classes, children, options, style);
-
-const makeLineSpan = function makeLineSpan(className, options, thickness) {
-  const line = makeSpan([className], [], options);
-  line.height = Math.max(thickness || options.fontMetrics().defaultRuleThickness, options.minRuleThickness);
-  line.style.borderBottomWidth = line.height + "em";
-  line.maxFontSize = 1.0;
-  return line;
-};
-/**
- * Makes an anchor with the given href, list of classes, list of children,
- * and options.
- */
-
-
-const makeAnchor = function makeAnchor(href, classes, children, options) {
-  const anchor = new Anchor(href, classes, children, options);
-  sizeElementFromChildren(anchor);
-  return anchor;
-};
-/**
- * Makes a document fragment with the given list of children.
- */
-
-
-const makeFragment = function makeFragment(children) {
-  const fragment = new DocumentFragment(children);
-  sizeElementFromChildren(fragment);
-  return fragment;
-};
-/**
- * Wraps group in a span if it's a document fragment, allowing to apply classes
- * and styles
- */
-
-
-const wrapFragment = function wrapFragment(group, options) {
-  if (group instanceof DocumentFragment) {
-    return makeSpan([], [group], options);
-  }
-
-  return group;
-}; // These are exact object types to catch typos in the names of the optional fields.
-
-
-// Computes the updated `children` list and the overall depth.
-//
-// This helper function for makeVList makes it easier to enforce type safety by
-// allowing early exits (returns) in the logic.
-const getVListChildrenAndDepth = function getVListChildrenAndDepth(params) {
-  if (params.positionType === "individualShift") {
-    const oldChildren = params.children;
-    const children = [oldChildren[0]]; // Add in kerns to the list of params.children to get each element to be
-    // shifted to the correct specified shift
-
-    const depth = -oldChildren[0].shift - oldChildren[0].elem.depth;
-    let currPos = depth;
-
-    for (let i = 1; i < oldChildren.length; i++) {
-      const diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth;
-      const size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth);
-      currPos = currPos + diff;
-      children.push({
-        type: "kern",
-        size
-      });
-      children.push(oldChildren[i]);
-    }
-
-    return {
-      children,
-      depth
-    };
-  }
-
-  let depth;
-
-  if (params.positionType === "top") {
-    // We always start at the bottom, so calculate the bottom by adding up
-    // all the sizes
-    let bottom = params.positionData;
-
-    for (let i = 0; i < params.children.length; i++) {
-      const child = params.children[i];
-      bottom -= child.type === "kern" ? child.size : child.elem.height + child.elem.depth;
-    }
-
-    depth = bottom;
-  } else if (params.positionType === "bottom") {
-    depth = -params.positionData;
-  } else {
-    const firstChild = params.children[0];
-
-    if (firstChild.type !== "elem") {
-      throw new Error('First child must have type "elem".');
-    }
-
-    if (params.positionType === "shift") {
-      depth = -firstChild.elem.depth - params.positionData;
-    } else if (params.positionType === "firstBaseline") {
-      depth = -firstChild.elem.depth;
-    } else {
-      throw new Error(`Invalid positionType ${params.positionType}.`);
-    }
-  }
-
-  return {
-    children: params.children,
-    depth
-  };
-};
-/**
- * Makes a vertical list by stacking elements and kerns on top of each other.
- * Allows for many different ways of specifying the positioning method.
- *
- * See VListParam documentation above.
- */
-
-
-const makeVList = function makeVList(params, options) {
-  const _getVListChildrenAndD = getVListChildrenAndDepth(params),
-        children = _getVListChildrenAndD.children,
-        depth = _getVListChildrenAndD.depth; // Create a strut that is taller than any list item. The strut is added to
-  // each item, where it will determine the item's baseline. Since it has
-  // `overflow:hidden`, the strut's top edge will sit on the item's line box's
-  // top edge and the strut's bottom edge will sit on the item's baseline,
-  // with no additional line-height spacing. This allows the item baseline to
-  // be positioned precisely without worrying about font ascent and
-  // line-height.
-
-
-  let pstrutSize = 0;
-
-  for (let i = 0; i < children.length; i++) {
-    const child = children[i];
-
-    if (child.type === "elem") {
-      const elem = child.elem;
-      pstrutSize = Math.max(pstrutSize, elem.maxFontSize, elem.height);
-    }
-  }
-
-  pstrutSize += 2;
-  const pstrut = makeSpan(["pstrut"], []);
-  pstrut.style.height = pstrutSize + "em"; // Create a new list of actual children at the correct offsets
-
-  const realChildren = [];
-  let minPos = depth;
-  let maxPos = depth;
-  let currPos = depth;
-
-  for (let i = 0; i < children.length; i++) {
-    const child = children[i];
-
-    if (child.type === "kern") {
-      currPos += child.size;
-    } else {
-      const elem = child.elem;
-      const classes = child.wrapperClasses || [];
-      const style = child.wrapperStyle || {};
-      const childWrap = makeSpan(classes, [pstrut, elem], undefined, style);
-      childWrap.style.top = -pstrutSize - currPos - elem.depth + "em";
-
-      if (child.marginLeft) {
-        childWrap.style.marginLeft = child.marginLeft;
-      }
-
-      if (child.marginRight) {
-        childWrap.style.marginRight = child.marginRight;
-      }
-
-      realChildren.push(childWrap);
-      currPos += elem.height + elem.depth;
-    }
-
-    minPos = Math.min(minPos, currPos);
-    maxPos = Math.max(maxPos, currPos);
-  } // The vlist contents go in a table-cell with `vertical-align:bottom`.
-  // This cell's bottom edge will determine the containing table's baseline
-  // without overly expanding the containing line-box.
-
-
-  const vlist = makeSpan(["vlist"], realChildren);
-  vlist.style.height = maxPos + "em"; // A second row is used if necessary to represent the vlist's depth.
-
-  let rows;
-
-  if (minPos < 0) {
-    // We will define depth in an empty span with display: table-cell.
-    // It should render with the height that we define. But Chrome, in
-    // contenteditable mode only, treats that span as if it contains some
-    // text content. And that min-height over-rides our desired height.
-    // So we put another empty span inside the depth strut span.
-    const emptySpan = makeSpan([], []);
-    const depthStrut = makeSpan(["vlist"], [emptySpan]);
-    depthStrut.style.height = -minPos + "em"; // Safari wants the first row to have inline content; otherwise it
-    // puts the bottom of the *second* row on the baseline.
-
-    const topStrut = makeSpan(["vlist-s"], [new SymbolNode("\u200b")]);
-    rows = [makeSpan(["vlist-r"], [vlist, topStrut]), makeSpan(["vlist-r"], [depthStrut])];
-  } else {
-    rows = [makeSpan(["vlist-r"], [vlist])];
-  }
-
-  const vtable = makeSpan(["vlist-t"], rows);
-
-  if (rows.length === 2) {
-    vtable.classes.push("vlist-t2");
-  }
-
-  vtable.height = maxPos;
-  vtable.depth = -minPos;
-  return vtable;
-}; // Glue is a concept from TeX which is a flexible space between elements in
-// either a vertical or horizontal list. In KaTeX, at least for now, it's
-// static space between elements in a horizontal layout.
-
-
-const makeGlue = (measurement, options) => {
-  // Make an empty span for the space
-  const rule = makeSpan(["mspace"], [], options);
-  const size = calculateSize(measurement, options);
-  rule.style.marginRight = `${size}em`;
-  return rule;
-}; // Takes font options, and returns the appropriate fontLookup name
-
-
-const retrieveTextFontName = function retrieveTextFontName(fontFamily, fontWeight, fontShape) {
-  let baseFontName = "";
-
-  switch (fontFamily) {
-    case "amsrm":
-      baseFontName = "AMS";
-      break;
-
-    case "textrm":
-      baseFontName = "Main";
-      break;
-
-    case "textsf":
-      baseFontName = "SansSerif";
-      break;
-
-    case "texttt":
-      baseFontName = "Typewriter";
-      break;
-
-    default:
-      baseFontName = fontFamily;
-    // use fonts added by a plugin
-  }
-
-  let fontStylesName;
-
-  if (fontWeight === "textbf" && fontShape === "textit") {
-    fontStylesName = "BoldItalic";
-  } else if (fontWeight === "textbf") {
-    fontStylesName = "Bold";
-  } else if (fontWeight === "textit") {
-    fontStylesName = "Italic";
-  } else {
-    fontStylesName = "Regular";
-  }
-
-  return `${baseFontName}-${fontStylesName}`;
-};
-/**
- * Maps TeX font commands to objects containing:
- * - variant: string used for "mathvariant" attribute in buildMathML.js
- * - fontName: the "style" parameter to fontMetrics.getCharacterMetrics
- */
-// A map between tex font commands an MathML mathvariant attribute values
-
-
-const fontMap = {
-  // styles
-  "mathbf": {
-    variant: "bold",
-    fontName: "Main-Bold"
-  },
-  "mathrm": {
-    variant: "normal",
-    fontName: "Main-Regular"
-  },
-  "textit": {
-    variant: "italic",
-    fontName: "Main-Italic"
-  },
-  "mathit": {
-    variant: "italic",
-    fontName: "Main-Italic"
-  },
-  // Default math font, "mathnormal" and "boldsymbol" are missing because they
-  // require the use of several fonts: Main-Italic and Math-Italic for default
-  // math font, Main-Italic, Math-Italic, Caligraphic for "mathnormal", and
-  // Math-BoldItalic and Main-Bold for "boldsymbol".  This is handled by a
-  // special case in makeOrd which ends up calling mathdefault, mathnormal,
-  // and boldsymbol.
-  // families
-  "mathbb": {
-    variant: "double-struck",
-    fontName: "AMS-Regular"
-  },
-  "mathcal": {
-    variant: "script",
-    fontName: "Caligraphic-Regular"
-  },
-  "mathfrak": {
-    variant: "fraktur",
-    fontName: "Fraktur-Regular"
-  },
-  "mathscr": {
-    variant: "script",
-    fontName: "Script-Regular"
-  },
-  "mathsf": {
-    variant: "sans-serif",
-    fontName: "SansSerif-Regular"
-  },
-  "mathtt": {
-    variant: "monospace",
-    fontName: "Typewriter-Regular"
-  }
-};
-const svgData = {
-  //   path, width, height
-  vec: ["vec", 0.471, 0.714],
-  // values from the font glyph
-  oiintSize1: ["oiintSize1", 0.957, 0.499],
-  // oval to overlay the integrand
-  oiintSize2: ["oiintSize2", 1.472, 0.659],
-  oiiintSize1: ["oiiintSize1", 1.304, 0.499],
-  oiiintSize2: ["oiiintSize2", 1.98, 0.659]
-};
-
-const staticSvg = function staticSvg(value, options) {
-  // Create a span with inline SVG for the element.
-  const _svgData$value = svgData[value],
-        pathName = _svgData$value[0],
-        width = _svgData$value[1],
-        height = _svgData$value[2];
-  const path = new PathNode(pathName);
-  const svgNode = new SvgNode([path], {
-    "width": width + "em",
-    "height": height + "em",
-    // Override CSS rule `.katex svg { width: 100% }`
-    "style": "width:" + width + "em",
-    "viewBox": "0 0 " + 1000 * width + " " + 1000 * height,
-    "preserveAspectRatio": "xMinYMin"
-  });
-  const span = makeSvgSpan(["overlay"], [svgNode], options);
-  span.height = height;
-  span.style.height = height + "em";
-  span.style.width = width + "em";
-  return span;
-};
-
-var buildCommon = {
-  fontMap,
-  makeSymbol,
-  mathsym,
-  makeSpan,
-  makeSvgSpan,
-  makeLineSpan,
-  makeAnchor,
-  makeFragment,
-  wrapFragment,
-  makeVList,
-  makeOrd,
-  makeGlue,
-  staticSvg,
-  svgData,
-  tryCombineChars
-};
-
-/**
- * Asserts that the node is of the given type and returns it with stricter
- * typing. Throws if the node's type does not match.
- */
-function assertNodeType(node, type) {
-  const typedNode = checkNodeType(node, type);
-
-  if (!typedNode) {
-    throw new Error(`Expected node of type ${type}, but got ` + (node ? `node of type ${node.type}` : String(node)));
-  } // $FlowFixMe: Unsure why.
-
-
-  return typedNode;
-}
-/**
- * Returns the node more strictly typed iff it is of the given type. Otherwise,
- * returns null.
- */
-
-function checkNodeType(node, type) {
-  if (node && node.type === type) {
-    // The definition of ParseNode<TYPE> doesn't communicate to flow that
-    // `type: TYPE` (as that's not explicitly mentioned anywhere), though that
-    // happens to be true for all our value types.
-    // $FlowFixMe
-    return node;
-  }
-
-  return null;
-}
-/**
- * Asserts that the node is of the given type and returns it with stricter
- * typing. Throws if the node's type does not match.
- */
-
-function assertAtomFamily(node, family) {
-  const typedNode = checkAtomFamily(node, family);
-
-  if (!typedNode) {
-    throw new Error(`Expected node of type "atom" and family "${family}", but got ` + (node ? node.type === "atom" ? `atom of family ${node.family}` : `node of type ${node.type}` : String(node)));
-  }
-
-  return typedNode;
-}
-/**
- * Returns the node more strictly typed iff it is of the given type. Otherwise,
- * returns null.
- */
-
-function checkAtomFamily(node, family) {
-  return node && node.type === "atom" && node.family === family ? node : null;
-}
-/**
- * Returns the node more strictly typed iff it is of the given type. Otherwise,
- * returns null.
- */
-
-function assertSymbolNodeType(node) {
-  const typedNode = checkSymbolNodeType(node);
-
-  if (!typedNode) {
-    throw new Error(`Expected node of symbol group type, but got ` + (node ? `node of type ${node.type}` : String(node)));
-  }
-
-  return typedNode;
-}
-/**
- * Returns the node more strictly typed iff it is of the given type. Otherwise,
- * returns null.
- */
-
-function checkSymbolNodeType(node) {
-  if (node && (node.type === "atom" || NON_ATOMS.hasOwnProperty(node.type))) {
-    // $FlowFixMe
-    return node;
-  }
-
-  return null;
-}
-
-/**
- * Describes spaces between different classes of atoms.
- */
-const thinspace = {
-  number: 3,
-  unit: "mu"
-};
-const mediumspace = {
-  number: 4,
-  unit: "mu"
-};
-const thickspace = {
-  number: 5,
-  unit: "mu"
-}; // Making the type below exact with all optional fields doesn't work due to
-// - https://github.com/facebook/flow/issues/4582
-// - https://github.com/facebook/flow/issues/5688
-// However, since *all* fields are optional, $Shape<> works as suggested in 5688
-// above.
-
-// Spacing relationships for display and text styles
-const spacings = {
-  mord: {
-    mop: thinspace,
-    mbin: mediumspace,
-    mrel: thickspace,
-    minner: thinspace
-  },
-  mop: {
-    mord: thinspace,
-    mop: thinspace,
-    mrel: thickspace,
-    minner: thinspace
-  },
-  mbin: {
-    mord: mediumspace,
-    mop: mediumspace,
-    mopen: mediumspace,
-    minner: mediumspace
-  },
-  mrel: {
-    mord: thickspace,
-    mop: thickspace,
-    mopen: thickspace,
-    minner: thickspace
-  },
-  mopen: {},
-  mclose: {
-    mop: thinspace,
-    mbin: mediumspace,
-    mrel: thickspace,
-    minner: thinspace
-  },
-  mpunct: {
-    mord: thinspace,
-    mop: thinspace,
-    mrel: thickspace,
-    mopen: thinspace,
-    mclose: thinspace,
-    mpunct: thinspace,
-    minner: thinspace
-  },
-  minner: {
-    mord: thinspace,
-    mop: thinspace,
-    mbin: mediumspace,
-    mrel: thickspace,
-    mopen: thinspace,
-    mpunct: thinspace,
-    minner: thinspace
-  }
-}; // Spacing relationships for script and scriptscript styles
-
-const tightSpacings = {
-  mord: {
-    mop: thinspace
-  },
-  mop: {
-    mord: thinspace,
-    mop: thinspace
-  },
-  mbin: {},
-  mrel: {},
-  mopen: {},
-  mclose: {
-    mop: thinspace
-  },
-  mpunct: {},
-  minner: {
-    mop: thinspace
-  }
-};
-
-/**
- * All registered functions.
- * `functions.js` just exports this same dictionary again and makes it public.
- * `Parser.js` requires this dictionary.
- */
-const _functions = {};
-/**
- * All HTML builders. Should be only used in the `define*` and the `build*ML`
- * functions.
- */
-
-const _htmlGroupBuilders = {};
-/**
- * All MathML builders. Should be only used in the `define*` and the `build*ML`
- * functions.
- */
-
-const _mathmlGroupBuilders = {};
-function defineFunction(_ref) {
-  let type = _ref.type,
-      names = _ref.names,
-      props = _ref.props,
-      handler = _ref.handler,
-      htmlBuilder = _ref.htmlBuilder,
-      mathmlBuilder = _ref.mathmlBuilder;
-  // Set default values of functions
-  const data = {
-    type,
-    numArgs: props.numArgs,
-    argTypes: props.argTypes,
-    greediness: props.greediness === undefined ? 1 : props.greediness,
-    allowedInText: !!props.allowedInText,
-    allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath,
-    numOptionalArgs: props.numOptionalArgs || 0,
-    infix: !!props.infix,
-    handler: handler
-  };
-
-  for (let i = 0; i < names.length; ++i) {
-    _functions[names[i]] = data;
-  }
-
-  if (type) {
-    if (htmlBuilder) {
-      _htmlGroupBuilders[type] = htmlBuilder;
-    }
-
-    if (mathmlBuilder) {
-      _mathmlGroupBuilders[type] = mathmlBuilder;
-    }
-  }
-}
-/**
- * Use this to register only the HTML and MathML builders for a function (e.g.
- * if the function's ParseNode is generated in Parser.js rather than via a
- * stand-alone handler provided to `defineFunction`).
- */
-
-function defineFunctionBuilders(_ref2) {
-  let type = _ref2.type,
-      htmlBuilder = _ref2.htmlBuilder,
-      mathmlBuilder = _ref2.mathmlBuilder;
-  defineFunction({
-    type,
-    names: [],
-    props: {
-      numArgs: 0
-    },
-
-    handler() {
-      throw new Error('Should never be called.');
-    },
-
-    htmlBuilder,
-    mathmlBuilder
-  });
-} // Since the corresponding buildHTML/buildMathML function expects a
-// list of elements, we normalize for different kinds of arguments
-
-const ordargument = function ordargument(arg) {
-  const node = checkNodeType(arg, "ordgroup");
-  return node ? node.body : [arg];
-};
-
-/**
- * This file does the main work of building a domTree structure from a parse
- * tree. The entry point is the `buildHTML` function, which takes a parse tree.
- * Then, the buildExpression, buildGroup, and various groupBuilders functions
- * are called, to produce a final HTML tree.
- */
-const makeSpan$1 = buildCommon.makeSpan; // Binary atoms (first class `mbin`) change into ordinary atoms (`mord`)
-// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6,
-// and the text before Rule 19.
-
-const binLeftCanceller = ["leftmost", "mbin", "mopen", "mrel", "mop", "mpunct"];
-const binRightCanceller = ["rightmost", "mrel", "mclose", "mpunct"];
-const styleMap = {
-  "display": Style$1.DISPLAY,
-  "text": Style$1.TEXT,
-  "script": Style$1.SCRIPT,
-  "scriptscript": Style$1.SCRIPTSCRIPT
-};
-const DomEnum = {
-  mord: "mord",
-  mop: "mop",
-  mbin: "mbin",
-  mrel: "mrel",
-  mopen: "mopen",
-  mclose: "mclose",
-  mpunct: "mpunct",
-  minner: "minner"
-};
-
-/**
- * Take a list of nodes, build them in order, and return a list of the built
- * nodes. documentFragments are flattened into their contents, so the
- * returned list contains no fragments. `isRealGroup` is true if `expression`
- * is a real group (no atoms will be added on either side), as opposed to
- * a partial group (e.g. one created by \color). `surrounding` is an array
- * consisting type of nodes that will be added to the left and right.
- */
-const buildExpression = function buildExpression(expression, options, isRealGroup, surrounding) {
-  if (surrounding === void 0) {
-    surrounding = [null, null];
-  }
-
-  // Parse expressions into `groups`.
-  const groups = [];
-
-  for (let i = 0; i < expression.length; i++) {
-    const output = buildGroup(expression[i], options);
-
-    if (output instanceof DocumentFragment) {
-      const children = output.children;
-      groups.push(...children);
-    } else {
-      groups.push(output);
-    }
-  } // If `expression` is a partial group, let the parent handle spacings
-  // to avoid processing groups multiple times.
-
-
-  if (!isRealGroup) {
-    return groups;
-  }
-
-  let glueOptions = options;
-
-  if (expression.length === 1) {
-    const node = checkNodeType(expression[0], "sizing") || checkNodeType(expression[0], "styling");
-
-    if (!node) ; else if (node.type === "sizing") {
-      glueOptions = options.havingSize(node.size);
-    } else if (node.type === "styling") {
-      glueOptions = options.havingStyle(styleMap[node.style]);
-    }
-  } // Dummy spans for determining spacings between surrounding atoms.
-  // If `expression` has no atoms on the left or right, class "leftmost"
-  // or "rightmost", respectively, is used to indicate it.
-
-
-  const dummyPrev = makeSpan$1([surrounding[0] || "leftmost"], [], options);
-  const dummyNext = makeSpan$1([surrounding[1] || "rightmost"], [], options); // TODO: These code assumes that a node's math class is the first element
-  // of its `classes` array. A later cleanup should ensure this, for
-  // instance by changing the signature of `makeSpan`.
-  // Before determining what spaces to insert, perform bin cancellation.
-  // Binary operators change to ordinary symbols in some contexts.
-
-  traverseNonSpaceNodes(groups, (node, prev) => {
-    const prevType = prev.classes[0];
-    const type = node.classes[0];
-
-    if (prevType === "mbin" && utils.contains(binRightCanceller, type)) {
-      prev.classes[0] = "mord";
-    } else if (type === "mbin" && utils.contains(binLeftCanceller, prevType)) {
-      node.classes[0] = "mord";
-    }
-  }, {
-    node: dummyPrev
-  }, dummyNext);
-  traverseNonSpaceNodes(groups, (node, prev) => {
-    const prevType = getTypeOfDomTree(prev);
-    const type = getTypeOfDomTree(node); // 'mtight' indicates that the node is script or scriptscript style.
-
-    const space = prevType && type ? node.hasClass("mtight") ? tightSpacings[prevType][type] : spacings[prevType][type] : null;
-
-    if (space) {
-      // Insert glue (spacing) after the `prev`.
-      return buildCommon.makeGlue(space, glueOptions);
-    }
-  }, {
-    node: dummyPrev
-  }, dummyNext);
-  return groups;
-}; // Depth-first traverse non-space `nodes`, calling `callback` with the current and
-// previous node as arguments, optionally returning a node to insert after the
-// previous node. `prev` is an object with the previous node and `insertAfter`
-// function to insert after it. `next` is a node that will be added to the right.
-// Used for bin cancellation and inserting spacings.
-
-const traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next) {
-  if (next) {
-    // temporarily append the right node, if exists
-    nodes.push(next);
-  }
-
-  let i = 0;
-
-  for (; i < nodes.length; i++) {
-    const node = nodes[i];
-    const partialGroup = checkPartialGroup(node);
-
-    if (partialGroup) {
-      // Recursive DFS
-      // $FlowFixMe: make nodes a $ReadOnlyArray by returning a new array
-      traverseNonSpaceNodes(partialGroup.children, callback, prev);
-      continue;
-    } // Ignore explicit spaces (e.g., \;, \,) when determining what implicit
-    // spacing should go between atoms of different classes
-
-
-    if (node.classes[0] === "mspace") {
-      continue;
-    }
-
-    const result = callback(node, prev.node);
-
-    if (result) {
-      if (prev.insertAfter) {
-        prev.insertAfter(result);
-      } else {
-        // insert at front
-        nodes.unshift(result);
-        i++;
-      }
-    }
-
-    prev.node = node;
-
-    prev.insertAfter = (index => n => {
-      nodes.splice(index + 1, 0, n);
-      i++;
-    })(i);
-  }
-
-  if (next) {
-    nodes.pop();
-  }
-}; // Check if given node is a partial group, i.e., does not affect spacing around.
-
-
-const checkPartialGroup = function checkPartialGroup(node) {
-  if (node instanceof DocumentFragment || node instanceof Anchor) {
-    return node;
-  }
-
-  return null;
-}; // Return the outermost node of a domTree.
-
-
-const getOutermostNode = function getOutermostNode(node, side) {
-  const partialGroup = checkPartialGroup(node);
-
-  if (partialGroup) {
-    const children = partialGroup.children;
-
-    if (children.length) {
-      if (side === "right") {
-        return getOutermostNode(children[children.length - 1], "right");
-      } else if (side === "left") {
-        return getOutermostNode(children[0], "left");
-      }
-    }
-  }
-
-  return node;
-}; // Return math atom class (mclass) of a domTree.
-// If `side` is given, it will get the type of the outermost node at given side.
-
-
-const getTypeOfDomTree = function getTypeOfDomTree(node, side) {
-  if (!node) {
-    return null;
-  }
-
-  if (side) {
-    node = getOutermostNode(node, side);
-  } // This makes a lot of assumptions as to where the type of atom
-  // appears.  We should do a better job of enforcing this.
-
-
-  return DomEnum[node.classes[0]] || null;
-};
-const makeNullDelimiter = function makeNullDelimiter(options, classes) {
-  const moreClasses = ["nulldelimiter"].concat(options.baseSizingClasses());
-  return makeSpan$1(classes.concat(moreClasses));
-};
-/**
- * buildGroup is the function that takes a group and calls the correct groupType
- * function for it. It also handles the interaction of size and style changes
- * between parents and children.
- */
-
-const buildGroup = function buildGroup(group, options, baseOptions) {
-  if (!group) {
-    return makeSpan$1();
-  }
-
-  if (_htmlGroupBuilders[group.type]) {
-    // Call the groupBuilders function
-    let groupNode = _htmlGroupBuilders[group.type](group, options); // If the size changed between the parent and the current group, account
-    // for that size difference.
-
-    if (baseOptions && options.size !== baseOptions.size) {
-      groupNode = makeSpan$1(options.sizingClasses(baseOptions), [groupNode], options);
-      const multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier;
-      groupNode.height *= multiplier;
-      groupNode.depth *= multiplier;
-    }
-
-    return groupNode;
-  } else {
-    throw new ParseError("Got group of unknown type: '" + group.type + "'");
-  }
-};
-/**
- * Combine an array of HTML DOM nodes (e.g., the output of `buildExpression`)
- * into an unbreakable HTML node of class .base, with proper struts to
- * guarantee correct vertical extent.  `buildHTML` calls this repeatedly to
- * make up the entire expression as a sequence of unbreakable units.
- */
-
-function buildHTMLUnbreakable(children, options) {
-  // Compute height and depth of this chunk.
-  const body = makeSpan$1(["base"], children, options); // Add strut, which ensures that the top of the HTML element falls at
-  // the height of the expression, and the bottom of the HTML element
-  // falls at the depth of the expression.
-  // We used to have separate top and bottom struts, where the bottom strut
-  // would like to use `vertical-align: top`, but in IE 9 this lowers the
-  // baseline of the box to the bottom of this strut (instead of staying in
-  // the normal place) so we use an absolute value for vertical-align instead.
-
-  const strut = makeSpan$1(["strut"]);
-  strut.style.height = body.height + body.depth + "em";
-  strut.style.verticalAlign = -body.depth + "em";
-  body.children.unshift(strut);
-  return body;
-}
-/**
- * Take an entire parse tree, and build it into an appropriate set of HTML
- * nodes.
- */
-
-
-function buildHTML(tree, options) {
-  // Strip off outer tag wrapper for processing below.
-  let tag = null;
-
-  if (tree.length === 1 && tree[0].type === "tag") {
-    tag = tree[0].tag;
-    tree = tree[0].body;
-  } // Build the expression contained in the tree
-
-
-  const expression = buildExpression(tree, options, true);
-  const children = []; // Create one base node for each chunk between potential line breaks.
-  // The TeXBook [p.173] says "A formula will be broken only after a
-  // relation symbol like $=$ or $<$ or $\rightarrow$, or after a binary
-  // operation symbol like $+$ or $-$ or $\times$, where the relation or
-  // binary operation is on the ``outer level'' of the formula (i.e., not
-  // enclosed in {...} and not part of an \over construction)."
-
-  let parts = [];
-
-  for (let i = 0; i < expression.length; i++) {
-    parts.push(expression[i]);
-
-    if (expression[i].hasClass("mbin") || expression[i].hasClass("mrel") || expression[i].hasClass("allowbreak")) {
-      // Put any post-operator glue on same line as operator.
-      // Watch for \nobreak along the way, and stop at \newline.
-      let nobreak = false;
-
-      while (i < expression.length - 1 && expression[i + 1].hasClass("mspace") && !expression[i + 1].hasClass("newline")) {
-        i++;
-        parts.push(expression[i]);
-
-        if (expression[i].hasClass("nobreak")) {
-          nobreak = true;
-        }
-      } // Don't allow break if \nobreak among the post-operator glue.
-
-
-      if (!nobreak) {
-        children.push(buildHTMLUnbreakable(parts, options));
-        parts = [];
-      }
-    } else if (expression[i].hasClass("newline")) {
-      // Write the line except the newline
-      parts.pop();
-
-      if (parts.length > 0) {
-        children.push(buildHTMLUnbreakable(parts, options));
-        parts = [];
-      } // Put the newline at the top level
-
-
-      children.push(expression[i]);
-    }
-  }
-
-  if (parts.length > 0) {
-    children.push(buildHTMLUnbreakable(parts, options));
-  } // Now, if there was a tag, build it too and append it as a final child.
-
-
-  let tagChild;
-
-  if (tag) {
-    tagChild = buildHTMLUnbreakable(buildExpression(tag, options, true));
-    tagChild.classes = ["tag"];
-    children.push(tagChild);
-  }
-
-  const htmlNode = makeSpan$1(["katex-html"], children);
-  htmlNode.setAttribute("aria-hidden", "true"); // Adjust the strut of the tag to be the maximum height of all children
-  // (the height of the enclosing htmlNode) for proper vertical alignment.
-
-  if (tagChild) {
-    const strut = tagChild.children[0];
-    strut.style.height = htmlNode.height + htmlNode.depth + "em";
-    strut.style.verticalAlign = -htmlNode.depth + "em";
-  }
-
-  return htmlNode;
-}
-
-/**
- * These objects store data about MathML nodes. This is the MathML equivalent
- * of the types in domTree.js. Since MathML handles its own rendering, and
- * since we're mainly using MathML to improve accessibility, we don't manage
- * any of the styling state that the plain DOM nodes do.
- *
- * The `toNode` and `toMarkup` functions work simlarly to how they do in
- * domTree.js, creating namespaced DOM nodes and HTML text markup respectively.
- */
-function newDocumentFragment(children) {
-  return new DocumentFragment(children);
-}
-/**
- * This node represents a general purpose MathML node of any type. The
- * constructor requires the type of node to create (for example, `"mo"` or
- * `"mspace"`, corresponding to `<mo>` and `<mspace>` tags).
- */
-
-class MathNode {
-  constructor(type, children) {
-    this.type = void 0;
-    this.attributes = void 0;
-    this.children = void 0;
-    this.type = type;
-    this.attributes = {};
-    this.children = children || [];
-  }
-  /**
-   * Sets an attribute on a MathML node. MathML depends on attributes to convey a
-   * semantic content, so this is used heavily.
-   */
-
-
-  setAttribute(name, value) {
-    this.attributes[name] = value;
-  }
-  /**
-   * Gets an attribute on a MathML node.
-   */
-
-
-  getAttribute(name) {
-    return this.attributes[name];
-  }
-  /**
-   * Converts the math node into a MathML-namespaced DOM element.
-   */
-
-
-  toNode() {
-    const node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type);
-
-    for (const attr in this.attributes) {
-      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-        node.setAttribute(attr, this.attributes[attr]);
-      }
-    }
-
-    for (let i = 0; i < this.children.length; i++) {
-      node.appendChild(this.children[i].toNode());
-    }
-
-    return node;
-  }
-  /**
-   * Converts the math node into an HTML markup string.
-   */
-
-
-  toMarkup() {
-    let markup = "<" + this.type; // Add the attributes
-
-    for (const attr in this.attributes) {
-      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {
-        markup += " " + attr + "=\"";
-        markup += utils.escape(this.attributes[attr]);
-        markup += "\"";
-      }
-    }
-
-    markup += ">";
-
-    for (let i = 0; i < this.children.length; i++) {
-      markup += this.children[i].toMarkup();
-    }
-
-    markup += "</" + this.type + ">";
-    return markup;
-  }
-  /**
-   * Converts the math node into a string, similar to innerText, but escaped.
-   */
-
-
-  toText() {
-    return this.children.map(child => child.toText()).join("");
-  }
-
-}
-/**
- * This node represents a piece of text.
- */
-
-class TextNode {
-  constructor(text) {
-    this.text = void 0;
-    this.text = text;
-  }
-  /**
-   * Converts the text node into a DOM text node.
-   */
-
-
-  toNode() {
-    return document.createTextNode(this.text);
-  }
-  /**
-   * Converts the text node into escaped HTML markup
-   * (representing the text itself).
-   */
-
-
-  toMarkup() {
-    return utils.escape(this.toText());
-  }
-  /**
-   * Converts the text node into a string
-   * (representing the text iteself).
-   */
-
-
-  toText() {
-    return this.text;
-  }
-
-}
-/**
- * This node represents a space, but may render as <mspace.../> or as text,
- * depending on the width.
- */
-
-class SpaceNode {
-  /**
-   * Create a Space node with width given in CSS ems.
-   */
-  constructor(width) {
-    this.width = void 0;
-    this.character = void 0;
-    this.width = width; // See https://www.w3.org/TR/2000/WD-MathML2-20000328/chapter6.html
-    // for a table of space-like characters.  We use Unicode
-    // representations instead of &LongNames; as it's not clear how to
-    // make the latter via document.createTextNode.
-
-    if (width >= 0.05555 && width <= 0.05556) {
-      this.character = "\u200a"; // &VeryThinSpace;
-    } else if (width >= 0.1666 && width <= 0.1667) {
-      this.character = "\u2009"; // &ThinSpace;
-    } else if (width >= 0.2222 && width <= 0.2223) {
-      this.character = "\u2005"; // &MediumSpace;
-    } else if (width >= 0.2777 && width <= 0.2778) {
-      this.character = "\u2005\u200a"; // &ThickSpace;
-    } else if (width >= -0.05556 && width <= -0.05555) {
-      this.character = "\u200a\u2063"; // &NegativeVeryThinSpace;
-    } else if (width >= -0.1667 && width <= -0.1666) {
-      this.character = "\u2009\u2063"; // &NegativeThinSpace;
-    } else if (width >= -0.2223 && width <= -0.2222) {
-      this.character = "\u205f\u2063"; // &NegativeMediumSpace;
-    } else if (width >= -0.2778 && width <= -0.2777) {
-      this.character = "\u2005\u2063"; // &NegativeThickSpace;
-    } else {
-      this.character = null;
-    }
-  }
-  /**
-   * Converts the math node into a MathML-namespaced DOM element.
-   */
-
-
-  toNode() {
-    if (this.character) {
-      return document.createTextNode(this.character);
-    } else {
-      const node = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mspace");
-      node.setAttribute("width", this.width + "em");
-      return node;
-    }
-  }
-  /**
-   * Converts the math node into an HTML markup string.
-   */
-
-
-  toMarkup() {
-    if (this.character) {
-      return `<mtext>${this.character}</mtext>`;
-    } else {
-      return `<mspace width="${this.width}em"/>`;
-    }
-  }
-  /**
-   * Converts the math node into a string, similar to innerText.
-   */
-
-
-  toText() {
-    if (this.character) {
-      return this.character;
-    } else {
-      return " ";
-    }
-  }
-
-}
-
-var mathMLTree = {
-  MathNode,
-  TextNode,
-  SpaceNode,
-  newDocumentFragment
-};
-
-/**
- * This file converts a parse tree into a cooresponding MathML tree. The main
- * entry point is the `buildMathML` function, which takes a parse tree from the
- * parser.
- */
-
-/**
- * Takes a symbol and converts it into a MathML text node after performing
- * optional replacement from symbols.js.
- */
-const makeText = function makeText(text, mode, options) {
-  if (symbols[mode][text] && symbols[mode][text].replace && text.charCodeAt(0) !== 0xD835 && !(ligatures.hasOwnProperty(text) && options && (options.fontFamily && options.fontFamily.substr(4, 2) === "tt" || options.font && options.font.substr(4, 2) === "tt"))) {
-    text = symbols[mode][text].replace;
-  }
-
-  return new mathMLTree.TextNode(text);
-};
-/**
- * Wrap the given array of nodes in an <mrow> node if needed, i.e.,
- * unless the array has length 1.  Always returns a single node.
- */
-
-const makeRow = function makeRow(body) {
-  if (body.length === 1) {
-    return body[0];
-  } else {
-    return new mathMLTree.MathNode("mrow", body);
-  }
-};
-/**
- * Returns the math variant as a string or null if none is required.
- */
-
-const getVariant = function getVariant(group, options) {
-  // Handle \text... font specifiers as best we can.
-  // MathML has a limited list of allowable mathvariant specifiers; see
-  // https://www.w3.org/TR/MathML3/chapter3.html#presm.commatt
-  if (options.fontFamily === "texttt") {
-    return "monospace";
-  } else if (options.fontFamily === "textsf") {
-    if (options.fontShape === "textit" && options.fontWeight === "textbf") {
-      return "sans-serif-bold-italic";
-    } else if (options.fontShape === "textit") {
-      return "sans-serif-italic";
-    } else if (options.fontWeight === "textbf") {
-      return "bold-sans-serif";
-    } else {
-      return "sans-serif";
-    }
-  } else if (options.fontShape === "textit" && options.fontWeight === "textbf") {
-    return "bold-italic";
-  } else if (options.fontShape === "textit") {
-    return "italic";
-  } else if (options.fontWeight === "textbf") {
-    return "bold";
-  }
-
-  const font = options.font;
-
-  if (!font || font === "mathnormal") {
-    return null;
-  }
-
-  const mode = group.mode;
-
-  if (font === "mathit") {
-    return "italic";
-  } else if (font === "boldsymbol") {
-    return "bold-italic";
-  } else if (font === "mathbf") {
-    return "bold";
-  } else if (font === "mathbb") {
-    return "double-struck";
-  } else if (font === "mathfrak") {
-    return "fraktur";
-  } else if (font === "mathscr" || font === "mathcal") {
-    // MathML makes no distinction between script and caligrahpic
-    return "script";
-  } else if (font === "mathsf") {
-    return "sans-serif";
-  } else if (font === "mathtt") {
-    return "monospace";
-  }
-
-  let text = group.text;
-
-  if (utils.contains(["\\imath", "\\jmath"], text)) {
-    return null;
-  }
-
-  if (symbols[mode][text] && symbols[mode][text].replace) {
-    text = symbols[mode][text].replace;
-  }
-
-  const fontName = buildCommon.fontMap[font].fontName;
-
-  if (getCharacterMetrics(text, fontName, mode)) {
-    return buildCommon.fontMap[font].variant;
-  }
-
-  return null;
-};
-/**
- * Takes a list of nodes, builds them, and returns a list of the generated
- * MathML nodes.  Also combine consecutive <mtext> outputs into a single
- * <mtext> tag.
- */
-
-const buildExpression$1 = function buildExpression(expression, options, isOrdgroup) {
-  if (expression.length === 1) {
-    const group = buildGroup$1(expression[0], options);
-
-    if (isOrdgroup && group instanceof MathNode && group.type === "mo") {
-      // When TeX writers want to suppress spacing on an operator,
-      // they often put the operator by itself inside braces.
-      group.setAttribute("lspace", "0em");
-      group.setAttribute("rspace", "0em");
-    }
-
-    return [group];
-  }
-
-  const groups = [];
-  let lastGroup;
-
-  for (let i = 0; i < expression.length; i++) {
-    const group = buildGroup$1(expression[i], options);
-
-    if (group instanceof MathNode && lastGroup instanceof MathNode) {
-      // Concatenate adjacent <mtext>s
-      if (group.type === 'mtext' && lastGroup.type === 'mtext' && group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) {
-        lastGroup.children.push(...group.children);
-        continue; // Concatenate adjacent <mn>s
-      } else if (group.type === 'mn' && lastGroup.type === 'mn') {
-        lastGroup.children.push(...group.children);
-        continue; // Concatenate <mn>...</mn> followed by <mi>.</mi>
-      } else if (group.type === 'mi' && group.children.length === 1 && lastGroup.type === 'mn') {
-        const child = group.children[0];
-
-        if (child instanceof TextNode && child.text === '.') {
-          lastGroup.children.push(...group.children);
-          continue;
-        }
-      } else if (lastGroup.type === 'mi' && lastGroup.children.length === 1) {
-        const lastChild = lastGroup.children[0];
-
-        if (lastChild instanceof TextNode && lastChild.text === '\u0338' && (group.type === 'mo' || group.type === 'mi' || group.type === 'mn')) {
-          const child = group.children[0];
-
-          if (child instanceof TextNode && child.text.length > 0) {
-            // Overlay with combining character long solidus
-            child.text = child.text.slice(0, 1) + "\u0338" + child.text.slice(1);
-            groups.pop();
-          }
-        }
-      }
-    }
-
-    groups.push(group);
-    lastGroup = group;
-  }
-
-  return groups;
-};
-/**
- * Equivalent to buildExpression, but wraps the elements in an <mrow>
- * if there's more than one.  Returns a single node instead of an array.
- */
-
-const buildExpressionRow = function buildExpressionRow(expression, options, isOrdgroup) {
-  return makeRow(buildExpression$1(expression, options, isOrdgroup));
-};
-/**
- * Takes a group from the parser and calls the appropriate groupBuilders function
- * on it to produce a MathML node.
- */
-
-const buildGroup$1 = function buildGroup(group, options) {
-  if (!group) {
-    return new mathMLTree.MathNode("mrow");
-  }
-
-  if (_mathmlGroupBuilders[group.type]) {
-    // Call the groupBuilders function
-    const result = _mathmlGroupBuilders[group.type](group, options);
-    return result;
-  } else {
-    throw new ParseError("Got group of unknown type: '" + group.type + "'");
-  }
-};
-/**
- * Takes a full parse tree and settings and builds a MathML representation of
- * it. In particular, we put the elements from building the parse tree into a
- * <semantics> tag so we can also include that TeX source as an annotation.
- *
- * Note that we actually return a domTree element with a `<math>` inside it so
- * we can do appropriate styling.
- */
-
-function buildMathML(tree, texExpression, options, forMathmlOnly) {
-  const expression = buildExpression$1(tree, options); // Wrap up the expression in an mrow so it is presented in the semantics
-  // tag correctly, unless it's a single <mrow> or <mtable>.
-
-  let wrapper;
-
-  if (expression.length === 1 && expression[0] instanceof MathNode && utils.contains(["mrow", "mtable"], expression[0].type)) {
-    wrapper = expression[0];
-  } else {
-    wrapper = new mathMLTree.MathNode("mrow", expression);
-  } // Build a TeX annotation of the source
-
-
-  const annotation = new mathMLTree.MathNode("annotation", [new mathMLTree.TextNode(texExpression)]);
-  annotation.setAttribute("encoding", "application/x-tex");
-  const semantics = new mathMLTree.MathNode("semantics", [wrapper, annotation]);
-  const math = new mathMLTree.MathNode("math", [semantics]);
-  math.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML"); // You can't style <math> nodes, so we wrap the node in a span.
-  // NOTE: The span class is not typed to have <math> nodes as children, and
-  // we don't want to make the children type more generic since the children
-  // of span are expected to have more fields in `buildHtml` contexts.
-
-  const wrapperClass = forMathmlOnly ? "katex" : "katex-mathml"; // $FlowFixMe
-
-  return buildCommon.makeSpan([wrapperClass], [math]);
-}
-
-const optionsFromSettings = function optionsFromSettings(settings) {
-  return new Options({
-    style: settings.displayMode ? Style$1.DISPLAY : Style$1.TEXT,
-    maxSize: settings.maxSize,
-    minRuleThickness: settings.minRuleThickness
-  });
-};
-
-const displayWrap = function displayWrap(node, settings) {
-  if (settings.displayMode) {
-    const classes = ["katex-display"];
-
-    if (settings.leqno) {
-      classes.push("leqno");
-    }
-
-    if (settings.fleqn) {
-      classes.push("fleqn");
-    }
-
-    node = buildCommon.makeSpan(classes, [node]);
-  }
-
-  return node;
-};
-
-const buildTree = function buildTree(tree, expression, settings) {
-  const options = optionsFromSettings(settings);
-  let katexNode;
-
-  if (settings.output === "mathml") {
-    return buildMathML(tree, expression, options, true);
-  } else if (settings.output === "html") {
-    const htmlNode = buildHTML(tree, options);
-    katexNode = buildCommon.makeSpan(["katex"], [htmlNode]);
-  } else {
-    const mathMLNode = buildMathML(tree, expression, options, false);
-    const htmlNode = buildHTML(tree, options);
-    katexNode = buildCommon.makeSpan(["katex"], [mathMLNode, htmlNode]);
-  }
-
-  return displayWrap(katexNode, settings);
-};
-const buildHTMLTree = function buildHTMLTree(tree, expression, settings) {
-  const options = optionsFromSettings(settings);
-  const htmlNode = buildHTML(tree, options);
-  const katexNode = buildCommon.makeSpan(["katex"], [htmlNode]);
-  return displayWrap(katexNode, settings);
-};
-
-/**
- * This file provides support to buildMathML.js and buildHTML.js
- * for stretchy wide elements rendered from SVG files
- * and other CSS trickery.
- */
-const stretchyCodePoint = {
-  widehat: "^",
-  widecheck: "ˇ",
-  widetilde: "~",
-  utilde: "~",
-  overleftarrow: "\u2190",
-  underleftarrow: "\u2190",
-  xleftarrow: "\u2190",
-  overrightarrow: "\u2192",
-  underrightarrow: "\u2192",
-  xrightarrow: "\u2192",
-  underbrace: "\u23df",
-  overbrace: "\u23de",
-  overgroup: "\u23e0",
-  undergroup: "\u23e1",
-  overleftrightarrow: "\u2194",
-  underleftrightarrow: "\u2194",
-  xleftrightarrow: "\u2194",
-  Overrightarrow: "\u21d2",
-  xRightarrow: "\u21d2",
-  overleftharpoon: "\u21bc",
-  xleftharpoonup: "\u21bc",
-  overrightharpoon: "\u21c0",
-  xrightharpoonup: "\u21c0",
-  xLeftarrow: "\u21d0",
-  xLeftrightarrow: "\u21d4",
-  xhookleftarrow: "\u21a9",
-  xhookrightarrow: "\u21aa",
-  xmapsto: "\u21a6",
-  xrightharpoondown: "\u21c1",
-  xleftharpoondown: "\u21bd",
-  xrightleftharpoons: "\u21cc",
-  xleftrightharpoons: "\u21cb",
-  xtwoheadleftarrow: "\u219e",
-  xtwoheadrightarrow: "\u21a0",
-  xlongequal: "=",
-  xtofrom: "\u21c4",
-  xrightleftarrows: "\u21c4",
-  xrightequilibrium: "\u21cc",
-  // Not a perfect match.
-  xleftequilibrium: "\u21cb" // None better available.
-
-};
-
-const mathMLnode = function mathMLnode(label) {
-  const node = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(stretchyCodePoint[label.substr(1)])]);
-  node.setAttribute("stretchy", "true");
-  return node;
-}; // Many of the KaTeX SVG images have been adapted from glyphs in KaTeX fonts.
-// Copyright (c) 2009-2010, Design Science, Inc. (<www.mathjax.org>)
-// Copyright (c) 2014-2017 Khan Academy (<www.khanacademy.org>)
-// Licensed under the SIL Open Font License, Version 1.1.
-// See \nhttp://scripts.sil.org/OFL
-// Very Long SVGs
-//    Many of the KaTeX stretchy wide elements use a long SVG image and an
-//    overflow: hidden tactic to achieve a stretchy image while avoiding
-//    distortion of arrowheads or brace corners.
-//    The SVG typically contains a very long (400 em) arrow.
-//    The SVG is in a container span that has overflow: hidden, so the span
-//    acts like a window that exposes only part of the  SVG.
-//    The SVG always has a longer, thinner aspect ratio than the container span.
-//    After the SVG fills 100% of the height of the container span,
-//    there is a long arrow shaft left over. That left-over shaft is not shown.
-//    Instead, it is sliced off because the span's CSS has overflow: hidden.
-//    Thus, the reader sees an arrow that matches the subject matter width
-//    without distortion.
-//    Some functions, such as \cancel, need to vary their aspect ratio. These
-//    functions do not get the overflow SVG treatment.
-// Second Brush Stroke
-//    Low resolution monitors struggle to display images in fine detail.
-//    So browsers apply anti-aliasing. A long straight arrow shaft therefore
-//    will sometimes appear as if it has a blurred edge.
-//    To mitigate this, these SVG files contain a second "brush-stroke" on the
-//    arrow shafts. That is, a second long thin rectangular SVG path has been
-//    written directly on top of each arrow shaft. This reinforcement causes
-//    some of the screen pixels to display as black instead of the anti-aliased
-//    gray pixel that a  single path would generate. So we get arrow shafts
-//    whose edges appear to be sharper.
-// In the katexImagesData object just below, the dimensions all
-// correspond to path geometry inside the relevant SVG.
-// For example, \overrightarrow uses the same arrowhead as glyph U+2192
-// from the KaTeX Main font. The scaling factor is 1000.
-// That is, inside the font, that arrowhead is 522 units tall, which
-// corresponds to 0.522 em inside the document.
-
-
-const katexImagesData = {
-  //   path(s), minWidth, height, align
-  overrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"],
-  overleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"],
-  underrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"],
-  underleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"],
-  xrightarrow: [["rightarrow"], 1.469, 522, "xMaxYMin"],
-  xleftarrow: [["leftarrow"], 1.469, 522, "xMinYMin"],
-  Overrightarrow: [["doublerightarrow"], 0.888, 560, "xMaxYMin"],
-  xRightarrow: [["doublerightarrow"], 1.526, 560, "xMaxYMin"],
-  xLeftarrow: [["doubleleftarrow"], 1.526, 560, "xMinYMin"],
-  overleftharpoon: [["leftharpoon"], 0.888, 522, "xMinYMin"],
-  xleftharpoonup: [["leftharpoon"], 0.888, 522, "xMinYMin"],
-  xleftharpoondown: [["leftharpoondown"], 0.888, 522, "xMinYMin"],
-  overrightharpoon: [["rightharpoon"], 0.888, 522, "xMaxYMin"],
-  xrightharpoonup: [["rightharpoon"], 0.888, 522, "xMaxYMin"],
-  xrightharpoondown: [["rightharpoondown"], 0.888, 522, "xMaxYMin"],
-  xlongequal: [["longequal"], 0.888, 334, "xMinYMin"],
-  xtwoheadleftarrow: [["twoheadleftarrow"], 0.888, 334, "xMinYMin"],
-  xtwoheadrightarrow: [["twoheadrightarrow"], 0.888, 334, "xMaxYMin"],
-  overleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522],
-  overbrace: [["leftbrace", "midbrace", "rightbrace"], 1.6, 548],
-  underbrace: [["leftbraceunder", "midbraceunder", "rightbraceunder"], 1.6, 548],
-  underleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522],
-  xleftrightarrow: [["leftarrow", "rightarrow"], 1.75, 522],
-  xLeftrightarrow: [["doubleleftarrow", "doublerightarrow"], 1.75, 560],
-  xrightleftharpoons: [["leftharpoondownplus", "rightharpoonplus"], 1.75, 716],
-  xleftrightharpoons: [["leftharpoonplus", "rightharpoondownplus"], 1.75, 716],
-  xhookleftarrow: [["leftarrow", "righthook"], 1.08, 522],
-  xhookrightarrow: [["lefthook", "rightarrow"], 1.08, 522],
-  overlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522],
-  underlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522],
-  overgroup: [["leftgroup", "rightgroup"], 0.888, 342],
-  undergroup: [["leftgroupunder", "rightgroupunder"], 0.888, 342],
-  xmapsto: [["leftmapsto", "rightarrow"], 1.5, 522],
-  xtofrom: [["leftToFrom", "rightToFrom"], 1.75, 528],
-  // The next three arrows are from the mhchem package.
-  // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the
-  // document as \xrightarrow or \xrightleftharpoons. Those have
-  // min-length = 1.75em, so we set min-length on these next three to match.
-  xrightleftarrows: [["baraboveleftarrow", "rightarrowabovebar"], 1.75, 901],
-  xrightequilibrium: [["baraboveshortleftharpoon", "rightharpoonaboveshortbar"], 1.75, 716],
-  xleftequilibrium: [["shortbaraboveleftharpoon", "shortrightharpoonabovebar"], 1.75, 716]
-};
-
-const groupLength = function groupLength(arg) {
-  if (arg.type === "ordgroup") {
-    return arg.body.length;
-  } else {
-    return 1;
-  }
-};
-
-const svgSpan = function svgSpan(group, options) {
-  // Create a span with inline SVG for the element.
-  function buildSvgSpan_() {
-    let viewBoxWidth = 400000; // default
-
-    const label = group.label.substr(1);
-
-    if (utils.contains(["widehat", "widecheck", "widetilde", "utilde"], label)) {
-      // Each type in the `if` statement corresponds to one of the ParseNode
-      // types below. This narrowing is required to access `grp.base`.
-      const grp = group; // There are four SVG images available for each function.
-      // Choose a taller image when there are more characters.
-
-      const numChars = groupLength(grp.base);
-      let viewBoxHeight;
-      let pathName;
-      let height;
-
-      if (numChars > 5) {
-        if (label === "widehat" || label === "widecheck") {
-          viewBoxHeight = 420;
-          viewBoxWidth = 2364;
-          height = 0.42;
-          pathName = label + "4";
-        } else {
-          viewBoxHeight = 312;
-          viewBoxWidth = 2340;
-          height = 0.34;
-          pathName = "tilde4";
-        }
-      } else {
-        const imgIndex = [1, 1, 2, 2, 3, 3][numChars];
-
-        if (label === "widehat" || label === "widecheck") {
-          viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex];
-          viewBoxHeight = [0, 239, 300, 360, 420][imgIndex];
-          height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex];
-          pathName = label + imgIndex;
-        } else {
-          viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex];
-          viewBoxHeight = [0, 260, 286, 306, 312][imgIndex];
-          height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex];
-          pathName = "tilde" + imgIndex;
-        }
-      }
-
-      const path = new PathNode(pathName);
-      const svgNode = new SvgNode([path], {
-        "width": "100%",
-        "height": height + "em",
-        "viewBox": `0 0 ${viewBoxWidth} ${viewBoxHeight}`,
-        "preserveAspectRatio": "none"
-      });
-      return {
-        span: buildCommon.makeSvgSpan([], [svgNode], options),
-        minWidth: 0,
-        height
-      };
-    } else {
-      const spans = [];
-      const data = katexImagesData[label];
-      const paths = data[0],
-            minWidth = data[1],
-            viewBoxHeight = data[2];
-      const height = viewBoxHeight / 1000;
-      const numSvgChildren = paths.length;
-      let widthClasses;
-      let aligns;
-
-      if (numSvgChildren === 1) {
-        // $FlowFixMe: All these cases must be of the 4-tuple type.
-        const align1 = data[3];
-        widthClasses = ["hide-tail"];
-        aligns = [align1];
-      } else if (numSvgChildren === 2) {
-        widthClasses = ["halfarrow-left", "halfarrow-right"];
-        aligns = ["xMinYMin", "xMaxYMin"];
-      } else if (numSvgChildren === 3) {
-        widthClasses = ["brace-left", "brace-center", "brace-right"];
-        aligns = ["xMinYMin", "xMidYMin", "xMaxYMin"];
-      } else {
-        throw new Error(`Correct katexImagesData or update code here to support
-                    ${numSvgChildren} children.`);
-      }
-
-      for (let i = 0; i < numSvgChildren; i++) {
-        const path = new PathNode(paths[i]);
-        const svgNode = new SvgNode([path], {
-          "width": "400em",
-          "height": height + "em",
-          "viewBox": `0 0 ${viewBoxWidth} ${viewBoxHeight}`,
-          "preserveAspectRatio": aligns[i] + " slice"
-        });
-        const span = buildCommon.makeSvgSpan([widthClasses[i]], [svgNode], options);
-
-        if (numSvgChildren === 1) {
-          return {
-            span,
-            minWidth,
-            height
-          };
-        } else {
-          span.style.height = height + "em";
-          spans.push(span);
-        }
-      }
-
-      return {
-        span: buildCommon.makeSpan(["stretchy"], spans, options),
-        minWidth,
-        height
-      };
-    }
-  } // buildSvgSpan_()
-
-
-  const _buildSvgSpan_ = buildSvgSpan_(),
-        span = _buildSvgSpan_.span,
-        minWidth = _buildSvgSpan_.minWidth,
-        height = _buildSvgSpan_.height; // Note that we are returning span.depth = 0.
-  // Any adjustments relative to the baseline must be done in buildHTML.
-
-
-  span.height = height;
-  span.style.height = height + "em";
-
-  if (minWidth > 0) {
-    span.style.minWidth = minWidth + "em";
-  }
-
-  return span;
-};
-
-const encloseSpan = function encloseSpan(inner, label, pad, options) {
-  // Return an image span for \cancel, \bcancel, \xcancel, or \fbox
-  let img;
-  const totalHeight = inner.height + inner.depth + 2 * pad;
-
-  if (/fbox|color/.test(label)) {
-    img = buildCommon.makeSpan(["stretchy", label], [], options);
-
-    if (label === "fbox") {
-      const color = options.color && options.getColor();
-
-      if (color) {
-        img.style.borderColor = color;
-      }
-    }
-  } else {
-    // \cancel, \bcancel, or \xcancel
-    // Since \cancel's SVG is inline and it omits the viewBox attribute,
-    // its stroke-width will not vary with span area.
-    const lines = [];
-
-    if (/^[bx]cancel$/.test(label)) {
-      lines.push(new LineNode({
-        "x1": "0",
-        "y1": "0",
-        "x2": "100%",
-        "y2": "100%",
-        "stroke-width": "0.046em"
-      }));
-    }
-
-    if (/^x?cancel$/.test(label)) {
-      lines.push(new LineNode({
-        "x1": "0",
-        "y1": "100%",
-        "x2": "100%",
-        "y2": "0",
-        "stroke-width": "0.046em"
-      }));
-    }
-
-    const svgNode = new SvgNode(lines, {
-      "width": "100%",
-      "height": totalHeight + "em"
-    });
-    img = buildCommon.makeSvgSpan([], [svgNode], options);
-  }
-
-  img.height = totalHeight;
-  img.style.height = totalHeight + "em";
-  return img;
-};
-
-var stretchy = {
-  encloseSpan,
-  mathMLnode,
-  svgSpan
-};
-
-// NOTE: Unlike most `htmlBuilder`s, this one handles not only "accent", but
-const htmlBuilder = (grp, options) => {
-  // Accents are handled in the TeXbook pg. 443, rule 12.
-  let base;
-  let group;
-  const supSub = checkNodeType(grp, "supsub");
-  let supSubGroup;
-
-  if (supSub) {
-    // If our base is a character box, and we have superscripts and
-    // subscripts, the supsub will defer to us. In particular, we want
-    // to attach the superscripts and subscripts to the inner body (so
-    // that the position of the superscripts and subscripts won't be
-    // affected by the height of the accent). We accomplish this by
-    // sticking the base of the accent into the base of the supsub, and
-    // rendering that, while keeping track of where the accent is.
-    // The real accent group is the base of the supsub group
-    group = assertNodeType(supSub.base, "accent"); // The character box is the base of the accent group
-
-    base = group.base; // Stick the character box into the base of the supsub group
-
-    supSub.base = base; // Rerender the supsub group with its new base, and store that
-    // result.
-
-    supSubGroup = assertSpan(buildGroup(supSub, options)); // reset original base
-
-    supSub.base = group;
-  } else {
-    group = assertNodeType(grp, "accent");
-    base = group.base;
-  } // Build the base group
-
-
-  const body = buildGroup(base, options.havingCrampedStyle()); // Does the accent need to shift for the skew of a character?
-
-  const mustShift = group.isShifty && utils.isCharacterBox(base); // Calculate the skew of the accent. This is based on the line "If the
-  // nucleus is not a single character, let s = 0; otherwise set s to the
-  // kern amount for the nucleus followed by the \skewchar of its font."
-  // Note that our skew metrics are just the kern between each character
-  // and the skewchar.
-
-  let skew = 0;
-
-  if (mustShift) {
-    // If the base is a character box, then we want the skew of the
-    // innermost character. To do that, we find the innermost character:
-    const baseChar = utils.getBaseElem(base); // Then, we render its group to get the symbol inside it
-
-    const baseGroup = buildGroup(baseChar, options.havingCrampedStyle()); // Finally, we pull the skew off of the symbol.
-
-    skew = assertSymbolDomNode(baseGroup).skew; // Note that we now throw away baseGroup, because the layers we
-    // removed with getBaseElem might contain things like \color which
-    // we can't get rid of.
-    // TODO(emily): Find a better way to get the skew
-  } // calculate the amount of space between the body and the accent
-
-
-  let clearance = Math.min(body.height, options.fontMetrics().xHeight); // Build the accent
-
-  let accentBody;
-
-  if (!group.isStretchy) {
-    let accent;
-    let width;
-
-    if (group.label === "\\vec") {
-      // Before version 0.9, \vec used the combining font glyph U+20D7.
-      // But browsers, especially Safari, are not consistent in how they
-      // render combining characters when not preceded by a character.
-      // So now we use an SVG.
-      // If Safari reforms, we should consider reverting to the glyph.
-      accent = buildCommon.staticSvg("vec", options);
-      width = buildCommon.svgData.vec[1];
-    } else {
-      accent = buildCommon.makeOrd({
-        mode: group.mode,
-        text: group.label
-      }, options, "textord");
-      accent = assertSymbolDomNode(accent); // Remove the italic correction of the accent, because it only serves to
-      // shift the accent over to a place we don't want.
-
-      accent.italic = 0;
-      width = accent.width;
-    }
-
-    accentBody = buildCommon.makeSpan(["accent-body"], [accent]); // "Full" accents expand the width of the resulting symbol to be
-    // at least the width of the accent, and overlap directly onto the
-    // character without any vertical offset.
-
-    const accentFull = group.label === "\\textcircled";
-
-    if (accentFull) {
-      accentBody.classes.push('accent-full');
-      clearance = body.height;
-    } // Shift the accent over by the skew.
-
-
-    let left = skew; // CSS defines `.katex .accent .accent-body:not(.accent-full) { width: 0 }`
-    // so that the accent doesn't contribute to the bounding box.
-    // We need to shift the character by its width (effectively half
-    // its width) to compensate.
-
-    if (!accentFull) {
-      left -= width / 2;
-    }
-
-    accentBody.style.left = left + "em"; // \textcircled uses the \bigcirc glyph, so it needs some
-    // vertical adjustment to match LaTeX.
-
-    if (group.label === "\\textcircled") {
-      accentBody.style.top = ".2em";
-    }
-
-    accentBody = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: body
-      }, {
-        type: "kern",
-        size: -clearance
-      }, {
-        type: "elem",
-        elem: accentBody
-      }]
-    }, options);
-  } else {
-    accentBody = stretchy.svgSpan(group, options);
-    accentBody = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: body
-      }, {
-        type: "elem",
-        elem: accentBody,
-        wrapperClasses: ["svg-align"],
-        wrapperStyle: skew > 0 ? {
-          width: `calc(100% - ${2 * skew}em)`,
-          marginLeft: `${2 * skew}em`
-        } : undefined
-      }]
-    }, options);
-  }
-
-  const accentWrap = buildCommon.makeSpan(["mord", "accent"], [accentBody], options);
-
-  if (supSubGroup) {
-    // Here, we replace the "base" child of the supsub with our newly
-    // generated accent.
-    supSubGroup.children[0] = accentWrap; // Since we don't rerun the height calculation after replacing the
-    // accent, we manually recalculate height.
-
-    supSubGroup.height = Math.max(accentWrap.height, supSubGroup.height); // Accents should always be ords, even when their innards are not.
-
-    supSubGroup.classes[0] = "mord";
-    return supSubGroup;
-  } else {
-    return accentWrap;
-  }
-};
-
-const mathmlBuilder = (group, options) => {
-  const accentNode = group.isStretchy ? stretchy.mathMLnode(group.label) : new mathMLTree.MathNode("mo", [makeText(group.label, group.mode)]);
-  const node = new mathMLTree.MathNode("mover", [buildGroup$1(group.base, options), accentNode]);
-  node.setAttribute("accent", "true");
-  return node;
-};
-
-const NON_STRETCHY_ACCENT_REGEX = new RegExp(["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring"].map(accent => `\\${accent}`).join("|")); // Accents
-
-defineFunction({
-  type: "accent",
-  names: ["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring", "\\widecheck", "\\widehat", "\\widetilde", "\\overrightarrow", "\\overleftarrow", "\\Overrightarrow", "\\overleftrightarrow", "\\overgroup", "\\overlinesegment", "\\overleftharpoon", "\\overrightharpoon"],
-  props: {
-    numArgs: 1
-  },
-  handler: (context, args) => {
-    const base = args[0];
-    const isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName);
-    const isShifty = !isStretchy || context.funcName === "\\widehat" || context.funcName === "\\widetilde" || context.funcName === "\\widecheck";
-    return {
-      type: "accent",
-      mode: context.parser.mode,
-      label: context.funcName,
-      isStretchy: isStretchy,
-      isShifty: isShifty,
-      base: base
-    };
-  },
-  htmlBuilder,
-  mathmlBuilder
-}); // Text-mode accents
-
-defineFunction({
-  type: "accent",
-  names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v", "\\textcircled"],
-  props: {
-    numArgs: 1,
-    allowedInText: true,
-    allowedInMath: false
-  },
-  handler: (context, args) => {
-    const base = args[0];
-    return {
-      type: "accent",
-      mode: context.parser.mode,
-      label: context.funcName,
-      isStretchy: false,
-      isShifty: true,
-      base: base
-    };
-  },
-  htmlBuilder,
-  mathmlBuilder
-});
-
-// Horizontal overlap functions
-defineFunction({
-  type: "accentUnder",
-  names: ["\\underleftarrow", "\\underrightarrow", "\\underleftrightarrow", "\\undergroup", "\\underlinesegment", "\\utilde"],
-  props: {
-    numArgs: 1
-  },
-  handler: (_ref, args) => {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    const base = args[0];
-    return {
-      type: "accentUnder",
-      mode: parser.mode,
-      label: funcName,
-      base: base
-    };
-  },
-  htmlBuilder: (group, options) => {
-    // Treat under accents much like underlines.
-    const innerGroup = buildGroup(group.base, options);
-    const accentBody = stretchy.svgSpan(group, options);
-    const kern = group.label === "\\utilde" ? 0.12 : 0; // Generate the vlist, with the appropriate kerns
-
-    const vlist = buildCommon.makeVList({
-      positionType: "bottom",
-      positionData: accentBody.height + kern,
-      children: [{
-        type: "elem",
-        elem: accentBody,
-        wrapperClasses: ["svg-align"]
-      }, {
-        type: "kern",
-        size: kern
-      }, {
-        type: "elem",
-        elem: innerGroup
-      }]
-    }, options);
-    return buildCommon.makeSpan(["mord", "accentunder"], [vlist], options);
-  },
-  mathmlBuilder: (group, options) => {
-    const accentNode = stretchy.mathMLnode(group.label);
-    const node = new mathMLTree.MathNode("munder", [buildGroup$1(group.base, options), accentNode]);
-    node.setAttribute("accentunder", "true");
-    return node;
-  }
-});
-
-// Helper function
-const paddedNode = group => {
-  const node = new mathMLTree.MathNode("mpadded", group ? [group] : []);
-  node.setAttribute("width", "+0.6em");
-  node.setAttribute("lspace", "0.3em");
-  return node;
-}; // Stretchy arrows with an optional argument
-
-
-defineFunction({
-  type: "xArrow",
-  names: ["\\xleftarrow", "\\xrightarrow", "\\xLeftarrow", "\\xRightarrow", "\\xleftrightarrow", "\\xLeftrightarrow", "\\xhookleftarrow", "\\xhookrightarrow", "\\xmapsto", "\\xrightharpoondown", "\\xrightharpoonup", "\\xleftharpoondown", "\\xleftharpoonup", "\\xrightleftharpoons", "\\xleftrightharpoons", "\\xlongequal", "\\xtwoheadrightarrow", "\\xtwoheadleftarrow", "\\xtofrom", // The next 3 functions are here to support the mhchem extension.
-  // Direct use of these functions is discouraged and may break someday.
-  "\\xrightleftarrows", "\\xrightequilibrium", "\\xleftequilibrium"],
-  props: {
-    numArgs: 1,
-    numOptionalArgs: 1
-  },
-
-  handler(_ref, args, optArgs) {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    return {
-      type: "xArrow",
-      mode: parser.mode,
-      label: funcName,
-      body: args[0],
-      below: optArgs[0]
-    };
-  },
-
-  // Flow is unable to correctly infer the type of `group`, even though it's
-  // unamibiguously determined from the passed-in `type` above.
-  htmlBuilder(group, options) {
-    const style = options.style; // Build the argument groups in the appropriate style.
-    // Ref: amsmath.dtx:   \hbox{$\scriptstyle\mkern#3mu{#6}\mkern#4mu$}%
-    // Some groups can return document fragments.  Handle those by wrapping
-    // them in a span.
-
-    let newOptions = options.havingStyle(style.sup());
-    const upperGroup = buildCommon.wrapFragment(buildGroup(group.body, newOptions, options), options);
-    upperGroup.classes.push("x-arrow-pad");
-    let lowerGroup;
-
-    if (group.below) {
-      // Build the lower group
-      newOptions = options.havingStyle(style.sub());
-      lowerGroup = buildCommon.wrapFragment(buildGroup(group.below, newOptions, options), options);
-      lowerGroup.classes.push("x-arrow-pad");
-    }
-
-    const arrowBody = stretchy.svgSpan(group, options); // Re shift: Note that stretchy.svgSpan returned arrowBody.depth = 0.
-    // The point we want on the math axis is at 0.5 * arrowBody.height.
-
-    const arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height; // 2 mu kern. Ref: amsmath.dtx: #7\if0#2\else\mkern#2mu\fi
-
-    let upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; // 0.111 em = 2 mu
-
-    if (upperGroup.depth > 0.25 || group.label === "\\xleftequilibrium") {
-      upperShift -= upperGroup.depth; // shift up if depth encroaches
-    } // Generate the vlist
-
-
-    let vlist;
-
-    if (lowerGroup) {
-      const lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111;
-      vlist = buildCommon.makeVList({
-        positionType: "individualShift",
-        children: [{
-          type: "elem",
-          elem: upperGroup,
-          shift: upperShift
-        }, {
-          type: "elem",
-          elem: arrowBody,
-          shift: arrowShift
-        }, {
-          type: "elem",
-          elem: lowerGroup,
-          shift: lowerShift
-        }]
-      }, options);
-    } else {
-      vlist = buildCommon.makeVList({
-        positionType: "individualShift",
-        children: [{
-          type: "elem",
-          elem: upperGroup,
-          shift: upperShift
-        }, {
-          type: "elem",
-          elem: arrowBody,
-          shift: arrowShift
-        }]
-      }, options);
-    } // $FlowFixMe: Replace this with passing "svg-align" into makeVList.
-
-
-    vlist.children[0].children[0].children[1].classes.push("svg-align");
-    return buildCommon.makeSpan(["mrel", "x-arrow"], [vlist], options);
-  },
-
-  mathmlBuilder(group, options) {
-    const arrowNode = stretchy.mathMLnode(group.label);
-    let node;
-
-    if (group.body) {
-      const upperNode = paddedNode(buildGroup$1(group.body, options));
-
-      if (group.below) {
-        const lowerNode = paddedNode(buildGroup$1(group.below, options));
-        node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]);
-      } else {
-        node = new mathMLTree.MathNode("mover", [arrowNode, upperNode]);
-      }
-    } else if (group.below) {
-      const lowerNode = paddedNode(buildGroup$1(group.below, options));
-      node = new mathMLTree.MathNode("munder", [arrowNode, lowerNode]);
-    } else {
-      // This should never happen.
-      // Parser.js throws an error if there is no argument.
-      node = paddedNode();
-      node = new mathMLTree.MathNode("mover", [arrowNode, node]);
-    }
-
-    return node;
-  }
-
-});
-
-// {123} and converts into symbol with code 123.  It is used by the *macro*
-// \char defined in macros.js.
-
-defineFunction({
-  type: "textord",
-  names: ["\\@char"],
-  props: {
-    numArgs: 1,
-    allowedInText: true
-  },
-
-  handler(_ref, args) {
-    let parser = _ref.parser;
-    const arg = assertNodeType(args[0], "ordgroup");
-    const group = arg.body;
-    let number = "";
-
-    for (let i = 0; i < group.length; i++) {
-      const node = assertNodeType(group[i], "textord");
-      number += node.text;
-    }
-
-    const code = parseInt(number);
-
-    if (isNaN(code)) {
-      throw new ParseError(`\\@char has non-numeric argument ${number}`);
-    }
-
-    return {
-      type: "textord",
-      mode: parser.mode,
-      text: String.fromCharCode(code)
-    };
-  }
-
-});
-
-const htmlBuilder$1 = (group, options) => {
-  const elements = buildExpression(group.body, options.withColor(group.color), false); // \color isn't supposed to affect the type of the elements it contains.
-  // To accomplish this, we wrap the results in a fragment, so the inner
-  // elements will be able to directly interact with their neighbors. For
-  // example, `\color{red}{2 +} 3` has the same spacing as `2 + 3`
-
-  return buildCommon.makeFragment(elements);
-};
-
-const mathmlBuilder$1 = (group, options) => {
-  const inner = buildExpression$1(group.body, options.withColor(group.color));
-  const node = new mathMLTree.MathNode("mstyle", inner);
-  node.setAttribute("mathcolor", group.color);
-  return node;
-};
-
-defineFunction({
-  type: "color",
-  names: ["\\textcolor"],
-  props: {
-    numArgs: 2,
-    allowedInText: true,
-    greediness: 3,
-    argTypes: ["color", "original"]
-  },
-
-  handler(_ref, args) {
-    let parser = _ref.parser;
-    const color = assertNodeType(args[0], "color-token").color;
-    const body = args[1];
-    return {
-      type: "color",
-      mode: parser.mode,
-      color,
-      body: ordargument(body)
-    };
-  },
-
-  htmlBuilder: htmlBuilder$1,
-  mathmlBuilder: mathmlBuilder$1
-});
-defineFunction({
-  type: "color",
-  names: ["\\color"],
-  props: {
-    numArgs: 1,
-    allowedInText: true,
-    greediness: 3,
-    argTypes: ["color"]
-  },
-
-  handler(_ref2, args) {
-    let parser = _ref2.parser,
-        breakOnTokenText = _ref2.breakOnTokenText;
-    const color = assertNodeType(args[0], "color-token").color; // Set macro \current@color in current namespace to store the current
-    // color, mimicking the behavior of color.sty.
-    // This is currently used just to correctly color a \right
-    // that follows a \color command.
-
-    parser.gullet.macros.set("\\current@color", color); // Parse out the implicit body that should be colored.
-
-    const body = parser.parseExpression(true, breakOnTokenText);
-    return {
-      type: "color",
-      mode: parser.mode,
-      color,
-      body
-    };
-  },
-
-  htmlBuilder: htmlBuilder$1,
-  mathmlBuilder: mathmlBuilder$1
-});
-
-// Row breaks within tabular environments, and line breaks at top level
-// same signature, we implement them as one megafunction, with newRow
-// indicating whether we're in the \cr case, and newLine indicating whether
-// to break the line in the \newline case.
-
-defineFunction({
-  type: "cr",
-  names: ["\\cr", "\\newline"],
-  props: {
-    numArgs: 0,
-    numOptionalArgs: 1,
-    argTypes: ["size"],
-    allowedInText: true
-  },
-
-  handler(_ref, args, optArgs) {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    const size = optArgs[0];
-    const newRow = funcName === "\\cr";
-    let newLine = false;
-
-    if (!newRow) {
-      if (parser.settings.displayMode && parser.settings.useStrictBehavior("newLineInDisplayMode", "In LaTeX, \\\\ or \\newline " + "does nothing in display mode")) {
-        newLine = false;
-      } else {
-        newLine = true;
-      }
-    }
-
-    return {
-      type: "cr",
-      mode: parser.mode,
-      newLine,
-      newRow,
-      size: size && assertNodeType(size, "size").value
-    };
-  },
-
-  // The following builders are called only at the top level,
-  // not within tabular/array environments.
-  htmlBuilder(group, options) {
-    if (group.newRow) {
-      throw new ParseError("\\cr valid only within a tabular/array environment");
-    }
-
-    const span = buildCommon.makeSpan(["mspace"], [], options);
-
-    if (group.newLine) {
-      span.classes.push("newline");
-
-      if (group.size) {
-        span.style.marginTop = calculateSize(group.size, options) + "em";
-      }
-    }
-
-    return span;
-  },
-
-  mathmlBuilder(group, options) {
-    const node = new mathMLTree.MathNode("mspace");
-
-    if (group.newLine) {
-      node.setAttribute("linebreak", "newline");
-
-      if (group.size) {
-        node.setAttribute("height", calculateSize(group.size, options) + "em");
-      }
-    }
-
-    return node;
-  }
-
-});
-
-/**
- * This file deals with creating delimiters of various sizes. The TeXbook
- * discusses these routines on page 441-442, in the "Another subroutine sets box
- * x to a specified variable delimiter" paragraph.
- *
- * There are three main routines here. `makeSmallDelim` makes a delimiter in the
- * normal font, but in either text, script, or scriptscript style.
- * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1,
- * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of
- * smaller pieces that are stacked on top of one another.
- *
- * The functions take a parameter `center`, which determines if the delimiter
- * should be centered around the axis.
- *
- * Then, there are three exposed functions. `sizedDelim` makes a delimiter in
- * one of the given sizes. This is used for things like `\bigl`.
- * `customSizedDelim` makes a delimiter with a given total height+depth. It is
- * called in places like `\sqrt`. `leftRightDelim` makes an appropriate
- * delimiter which surrounds an expression of a given height an depth. It is
- * used in `\left` and `\right`.
- */
-
-/**
- * Get the metrics for a given symbol and font, after transformation (i.e.
- * after following replacement from symbols.js)
- */
-const getMetrics = function getMetrics(symbol, font, mode) {
-  const replace = symbols.math[symbol] && symbols.math[symbol].replace;
-  const metrics = getCharacterMetrics(replace || symbol, font, mode);
-
-  if (!metrics) {
-    throw new Error(`Unsupported symbol ${symbol} and font size ${font}.`);
-  }
-
-  return metrics;
-};
-/**
- * Puts a delimiter span in a given style, and adds appropriate height, depth,
- * and maxFontSizes.
- */
-
-
-const styleWrap = function styleWrap(delim, toStyle, options, classes) {
-  const newOptions = options.havingBaseStyle(toStyle);
-  const span = buildCommon.makeSpan(classes.concat(newOptions.sizingClasses(options)), [delim], options);
-  const delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier;
-  span.height *= delimSizeMultiplier;
-  span.depth *= delimSizeMultiplier;
-  span.maxFontSize = newOptions.sizeMultiplier;
-  return span;
-};
-
-const centerSpan = function centerSpan(span, options, style) {
-  const newOptions = options.havingBaseStyle(style);
-  const shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight;
-  span.classes.push("delimcenter");
-  span.style.top = shift + "em";
-  span.height -= shift;
-  span.depth += shift;
-};
-/**
- * Makes a small delimiter. This is a delimiter that comes in the Main-Regular
- * font, but is restyled to either be in textstyle, scriptstyle, or
- * scriptscriptstyle.
- */
-
-
-const makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) {
-  const text = buildCommon.makeSymbol(delim, "Main-Regular", mode, options);
-  const span = styleWrap(text, style, options, classes);
-
-  if (center) {
-    centerSpan(span, options, style);
-  }
-
-  return span;
-};
-/**
- * Builds a symbol in the given font size (note size is an integer)
- */
-
-
-const mathrmSize = function mathrmSize(value, size, mode, options) {
-  return buildCommon.makeSymbol(value, "Size" + size + "-Regular", mode, options);
-};
-/**
- * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2,
- * Size3, or Size4 fonts. It is always rendered in textstyle.
- */
-
-
-const makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) {
-  const inner = mathrmSize(delim, size, mode, options);
-  const span = styleWrap(buildCommon.makeSpan(["delimsizing", "size" + size], [inner], options), Style$1.TEXT, options, classes);
-
-  if (center) {
-    centerSpan(span, options, Style$1.TEXT);
-  }
-
-  return span;
-};
-/**
- * Make an inner span with the given offset and in the given font. This is used
- * in `makeStackedDelim` to make the stacking pieces for the delimiter.
- */
-
-
-const makeInner = function makeInner(symbol, font, mode) {
-  let sizeClass; // Apply the correct CSS class to choose the right font.
-
-  if (font === "Size1-Regular") {
-    sizeClass = "delim-size1";
-  } else
-    /* if (font === "Size4-Regular") */
-    {
-      sizeClass = "delim-size4";
-    }
-
-  const inner = buildCommon.makeSpan(["delimsizinginner", sizeClass], [buildCommon.makeSpan([], [buildCommon.makeSymbol(symbol, font, mode)])]); // Since this will be passed into `makeVList` in the end, wrap the element
-  // in the appropriate tag that VList uses.
-
-  return {
-    type: "elem",
-    elem: inner
-  };
-}; // Helper for makeStackedDelim
-
-
-const lap = {
-  type: "kern",
-  size: -0.005
-};
-/**
- * Make a stacked delimiter out of a given delimiter, with the total height at
- * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook.
- */
-
-const makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) {
-  // There are four parts, the top, an optional middle, a repeated part, and a
-  // bottom.
-  let top;
-  let middle;
-  let repeat;
-  let bottom;
-  top = repeat = bottom = delim;
-  middle = null; // Also keep track of what font the delimiters are in
-
-  let font = "Size1-Regular"; // We set the parts and font based on the symbol. Note that we use
-  // '\u23d0' instead of '|' and '\u2016' instead of '\\|' for the
-  // repeats of the arrows
-
-  if (delim === "\\uparrow") {
-    repeat = bottom = "\u23d0";
-  } else if (delim === "\\Uparrow") {
-    repeat = bottom = "\u2016";
-  } else if (delim === "\\downarrow") {
-    top = repeat = "\u23d0";
-  } else if (delim === "\\Downarrow") {
-    top = repeat = "\u2016";
-  } else if (delim === "\\updownarrow") {
-    top = "\\uparrow";
-    repeat = "\u23d0";
-    bottom = "\\downarrow";
-  } else if (delim === "\\Updownarrow") {
-    top = "\\Uparrow";
-    repeat = "\u2016";
-    bottom = "\\Downarrow";
-  } else if (delim === "[" || delim === "\\lbrack") {
-    top = "\u23a1";
-    repeat = "\u23a2";
-    bottom = "\u23a3";
-    font = "Size4-Regular";
-  } else if (delim === "]" || delim === "\\rbrack") {
-    top = "\u23a4";
-    repeat = "\u23a5";
-    bottom = "\u23a6";
-    font = "Size4-Regular";
-  } else if (delim === "\\lfloor" || delim === "\u230a") {
-    repeat = top = "\u23a2";
-    bottom = "\u23a3";
-    font = "Size4-Regular";
-  } else if (delim === "\\lceil" || delim === "\u2308") {
-    top = "\u23a1";
-    repeat = bottom = "\u23a2";
-    font = "Size4-Regular";
-  } else if (delim === "\\rfloor" || delim === "\u230b") {
-    repeat = top = "\u23a5";
-    bottom = "\u23a6";
-    font = "Size4-Regular";
-  } else if (delim === "\\rceil" || delim === "\u2309") {
-    top = "\u23a4";
-    repeat = bottom = "\u23a5";
-    font = "Size4-Regular";
-  } else if (delim === "(" || delim === "\\lparen") {
-    top = "\u239b";
-    repeat = "\u239c";
-    bottom = "\u239d";
-    font = "Size4-Regular";
-  } else if (delim === ")" || delim === "\\rparen") {
-    top = "\u239e";
-    repeat = "\u239f";
-    bottom = "\u23a0";
-    font = "Size4-Regular";
-  } else if (delim === "\\{" || delim === "\\lbrace") {
-    top = "\u23a7";
-    middle = "\u23a8";
-    bottom = "\u23a9";
-    repeat = "\u23aa";
-    font = "Size4-Regular";
-  } else if (delim === "\\}" || delim === "\\rbrace") {
-    top = "\u23ab";
-    middle = "\u23ac";
-    bottom = "\u23ad";
-    repeat = "\u23aa";
-    font = "Size4-Regular";
-  } else if (delim === "\\lgroup" || delim === "\u27ee") {
-    top = "\u23a7";
-    bottom = "\u23a9";
-    repeat = "\u23aa";
-    font = "Size4-Regular";
-  } else if (delim === "\\rgroup" || delim === "\u27ef") {
-    top = "\u23ab";
-    bottom = "\u23ad";
-    repeat = "\u23aa";
-    font = "Size4-Regular";
-  } else if (delim === "\\lmoustache" || delim === "\u23b0") {
-    top = "\u23a7";
-    bottom = "\u23ad";
-    repeat = "\u23aa";
-    font = "Size4-Regular";
-  } else if (delim === "\\rmoustache" || delim === "\u23b1") {
-    top = "\u23ab";
-    bottom = "\u23a9";
-    repeat = "\u23aa";
-    font = "Size4-Regular";
-  } // Get the metrics of the four sections
-
-
-  const topMetrics = getMetrics(top, font, mode);
-  const topHeightTotal = topMetrics.height + topMetrics.depth;
-  const repeatMetrics = getMetrics(repeat, font, mode);
-  const repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth;
-  const bottomMetrics = getMetrics(bottom, font, mode);
-  const bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth;
-  let middleHeightTotal = 0;
-  let middleFactor = 1;
-
-  if (middle !== null) {
-    const middleMetrics = getMetrics(middle, font, mode);
-    middleHeightTotal = middleMetrics.height + middleMetrics.depth;
-    middleFactor = 2; // repeat symmetrically above and below middle
-  } // Calcuate the minimal height that the delimiter can have.
-  // It is at least the size of the top, bottom, and optional middle combined.
-
-
-  const minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal; // Compute the number of copies of the repeat symbol we will need
-
-  const repeatCount = Math.max(0, Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal))); // Compute the total height of the delimiter including all the symbols
-
-  const realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal; // The center of the delimiter is placed at the center of the axis. Note
-  // that in this context, "center" means that the delimiter should be
-  // centered around the axis in the current style, while normally it is
-  // centered around the axis in textstyle.
-
-  let axisHeight = options.fontMetrics().axisHeight;
-
-  if (center) {
-    axisHeight *= options.sizeMultiplier;
-  } // Calculate the depth
-
-
-  const depth = realHeightTotal / 2 - axisHeight; // This function differs from the TeX procedure in one way.
-  // We shift each repeat element downwards by 0.005em, to prevent a gap
-  // due to browser floating point rounding error.
-  // Then, at the last element-to element joint, we add one extra repeat
-  // element to cover the gap created by the shifts.
-  // Find the shift needed to align the upper end of the extra element at a point
-  // 0.005em above the lower end of the top element.
-
-  const shiftOfExtraElement = (repeatCount + 1) * 0.005 - repeatHeightTotal; // Now, we start building the pieces that will go into the vlist
-  // Keep a list of the inner pieces
-
-  const inners = []; // Add the bottom symbol
-
-  inners.push(makeInner(bottom, font, mode));
-
-  if (middle === null) {
-    // Add that many symbols
-    for (let i = 0; i < repeatCount; i++) {
-      inners.push(lap); // overlap
-
-      inners.push(makeInner(repeat, font, mode));
-    }
-  } else {
-    // When there is a middle bit, we need the middle part and two repeated
-    // sections
-    for (let i = 0; i < repeatCount; i++) {
-      inners.push(lap);
-      inners.push(makeInner(repeat, font, mode));
-    } // Insert one extra repeat element.
-
-
-    inners.push({
-      type: "kern",
-      size: shiftOfExtraElement
-    });
-    inners.push(makeInner(repeat, font, mode));
-    inners.push(lap); // Now insert the middle of the brace.
-
-    inners.push(makeInner(middle, font, mode));
-
-    for (let i = 0; i < repeatCount; i++) {
-      inners.push(lap);
-      inners.push(makeInner(repeat, font, mode));
-    }
-  } // To cover the gap create by the overlaps, insert one more repeat element,
-  // at a position that juts 0.005 above the bottom of the top element.
-
-
-  inners.push({
-    type: "kern",
-    size: shiftOfExtraElement
-  });
-  inners.push(makeInner(repeat, font, mode));
-  inners.push(lap); // Add the top symbol
-
-  inners.push(makeInner(top, font, mode)); // Finally, build the vlist
-
-  const newOptions = options.havingBaseStyle(Style$1.TEXT);
-  const inner = buildCommon.makeVList({
-    positionType: "bottom",
-    positionData: depth,
-    children: inners
-  }, newOptions);
-  return styleWrap(buildCommon.makeSpan(["delimsizing", "mult"], [inner], newOptions), Style$1.TEXT, options, classes);
-}; // All surds have 0.08em padding above the viniculum inside the SVG.
-// That keeps browser span height rounding error from pinching the line.
-
-
-const vbPad = 80; // padding above the surd, measured inside the viewBox.
-
-const emPad = 0.08; // padding, in ems, measured in the document.
-
-const sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, extraViniculum, options) {
-  const path = sqrtPath(sqrtName, extraViniculum, viewBoxHeight);
-  const pathNode = new PathNode(sqrtName, path);
-  const svg = new SvgNode([pathNode], {
-    // Note: 1000:1 ratio of viewBox to document em width.
-    "width": "400em",
-    "height": height + "em",
-    "viewBox": "0 0 400000 " + viewBoxHeight,
-    "preserveAspectRatio": "xMinYMin slice"
-  });
-  return buildCommon.makeSvgSpan(["hide-tail"], [svg], options);
-};
-/**
- * Make a sqrt image of the given height,
- */
-
-
-const makeSqrtImage = function makeSqrtImage(height, options) {
-  // Define a newOptions that removes the effect of size changes such as \Huge.
-  // We don't pick different a height surd for \Huge. For it, we scale up.
-  const newOptions = options.havingBaseSizing(); // Pick the desired surd glyph from a sequence of surds.
-
-  const delim = traverseSequence("\\surd", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions);
-  let sizeMultiplier = newOptions.sizeMultiplier; // default
-  // The standard sqrt SVGs each have a 0.04em thick viniculum.
-  // If Settings.minRuleThickness is larger than that, we add extraViniculum.
-
-  const extraViniculum = Math.max(0, options.minRuleThickness - options.fontMetrics().sqrtRuleThickness); // Create a span containing an SVG image of a sqrt symbol.
-
-  let span;
-  let spanHeight = 0;
-  let texHeight = 0;
-  let viewBoxHeight = 0;
-  let advanceWidth; // We create viewBoxes with 80 units of "padding" above each surd.
-  // Then browser rounding error on the parent span height will not
-  // encroach on the ink of the viniculum. But that padding is not
-  // included in the TeX-like `height` used for calculation of
-  // vertical alignment. So texHeight = span.height < span.style.height.
-
-  if (delim.type === "small") {
-    // Get an SVG that is derived from glyph U+221A in font KaTeX-Main.
-    // 1000 unit normal glyph height.
-    viewBoxHeight = 1000 + 1000 * extraViniculum + vbPad;
-
-    if (height < 1.0) {
-      sizeMultiplier = 1.0; // mimic a \textfont radical
-    } else if (height < 1.4) {
-      sizeMultiplier = 0.7; // mimic a \scriptfont radical
-    }
-
-    spanHeight = (1.0 + extraViniculum + emPad) / sizeMultiplier;
-    texHeight = (1.00 + extraViniculum) / sizeMultiplier;
-    span = sqrtSvg("sqrtMain", spanHeight, viewBoxHeight, extraViniculum, options);
-    span.style.minWidth = "0.853em";
-    advanceWidth = 0.833 / sizeMultiplier; // from the font.
-  } else if (delim.type === "large") {
-    // These SVGs come from fonts: KaTeX_Size1, _Size2, etc.
-    viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size];
-    texHeight = (sizeToMaxHeight[delim.size] + extraViniculum) / sizeMultiplier;
-    spanHeight = (sizeToMaxHeight[delim.size] + extraViniculum + emPad) / sizeMultiplier;
-    span = sqrtSvg("sqrtSize" + delim.size, spanHeight, viewBoxHeight, extraViniculum, options);
-    span.style.minWidth = "1.02em";
-    advanceWidth = 1.0 / sizeMultiplier; // 1.0 from the font.
-  } else {
-    // Tall sqrt. In TeX, this would be stacked using multiple glyphs.
-    // We'll use a single SVG to accomplish the same thing.
-    spanHeight = height + extraViniculum + emPad;
-    texHeight = height + extraViniculum;
-    viewBoxHeight = Math.floor(1000 * height + extraViniculum) + vbPad;
-    span = sqrtSvg("sqrtTall", spanHeight, viewBoxHeight, extraViniculum, options);
-    span.style.minWidth = "0.742em";
-    advanceWidth = 1.056;
-  }
-
-  span.height = texHeight;
-  span.style.height = spanHeight + "em";
-  return {
-    span,
-    advanceWidth,
-    // Calculate the actual line width.
-    // This actually should depend on the chosen font -- e.g. \boldmath
-    // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and
-    // have thicker rules.
-    ruleWidth: (options.fontMetrics().sqrtRuleThickness + extraViniculum) * sizeMultiplier
-  };
-}; // There are three kinds of delimiters, delimiters that stack when they become
-// too large
-
-
-const stackLargeDelimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230a", "\u230b", "\\lceil", "\\rceil", "\u2308", "\u2309", "\\surd"]; // delimiters that always stack
-
-const stackAlwaysDelimiters = ["\\uparrow", "\\downarrow", "\\updownarrow", "\\Uparrow", "\\Downarrow", "\\Updownarrow", "|", "\\|", "\\vert", "\\Vert", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27ee", "\u27ef", "\\lmoustache", "\\rmoustache", "\u23b0", "\u23b1"]; // and delimiters that never stack
-
-const stackNeverDelimiters = ["<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt"]; // Metrics of the different sizes. Found by looking at TeX's output of
-// $\bigl| // \Bigl| \biggl| \Biggl| \showlists$
-// Used to create stacked delimiters of appropriate sizes in makeSizedDelim.
-
-const sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];
-/**
- * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4.
- */
-
-const makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) {
-  // < and > turn into \langle and \rangle in delimiters
-  if (delim === "<" || delim === "\\lt" || delim === "\u27e8") {
-    delim = "\\langle";
-  } else if (delim === ">" || delim === "\\gt" || delim === "\u27e9") {
-    delim = "\\rangle";
-  } // Sized delimiters are never centered.
-
-
-  if (utils.contains(stackLargeDelimiters, delim) || utils.contains(stackNeverDelimiters, delim)) {
-    return makeLargeDelim(delim, size, false, options, mode, classes);
-  } else if (utils.contains(stackAlwaysDelimiters, delim)) {
-    return makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes);
-  } else {
-    throw new ParseError("Illegal delimiter: '" + delim + "'");
-  }
-};
-/**
- * There are three different sequences of delimiter sizes that the delimiters
- * follow depending on the kind of delimiter. This is used when creating custom
- * sized delimiters to decide whether to create a small, large, or stacked
- * delimiter.
- *
- * In real TeX, these sequences aren't explicitly defined, but are instead
- * defined inside the font metrics. Since there are only three sequences that
- * are possible for the delimiters that TeX defines, it is easier to just encode
- * them explicitly here.
- */
-
-
-// Delimiters that never stack try small delimiters and large delimiters only
-const stackNeverDelimiterSequence = [{
-  type: "small",
-  style: Style$1.SCRIPTSCRIPT
-}, {
-  type: "small",
-  style: Style$1.SCRIPT
-}, {
-  type: "small",
-  style: Style$1.TEXT
-}, {
-  type: "large",
-  size: 1
-}, {
-  type: "large",
-  size: 2
-}, {
-  type: "large",
-  size: 3
-}, {
-  type: "large",
-  size: 4
-}]; // Delimiters that always stack try the small delimiters first, then stack
-
-const stackAlwaysDelimiterSequence = [{
-  type: "small",
-  style: Style$1.SCRIPTSCRIPT
-}, {
-  type: "small",
-  style: Style$1.SCRIPT
-}, {
-  type: "small",
-  style: Style$1.TEXT
-}, {
-  type: "stack"
-}]; // Delimiters that stack when large try the small and then large delimiters, and
-// stack afterwards
-
-const stackLargeDelimiterSequence = [{
-  type: "small",
-  style: Style$1.SCRIPTSCRIPT
-}, {
-  type: "small",
-  style: Style$1.SCRIPT
-}, {
-  type: "small",
-  style: Style$1.TEXT
-}, {
-  type: "large",
-  size: 1
-}, {
-  type: "large",
-  size: 2
-}, {
-  type: "large",
-  size: 3
-}, {
-  type: "large",
-  size: 4
-}, {
-  type: "stack"
-}];
-/**
- * Get the font used in a delimiter based on what kind of delimiter it is.
- * TODO(#963) Use more specific font family return type once that is introduced.
- */
-
-const delimTypeToFont = function delimTypeToFont(type) {
-  if (type.type === "small") {
-    return "Main-Regular";
-  } else if (type.type === "large") {
-    return "Size" + type.size + "-Regular";
-  } else if (type.type === "stack") {
-    return "Size4-Regular";
-  } else {
-    throw new Error(`Add support for delim type '${type.type}' here.`);
-  }
-};
-/**
- * Traverse a sequence of types of delimiters to decide what kind of delimiter
- * should be used to create a delimiter of the given height+depth.
- */
-
-
-const traverseSequence = function traverseSequence(delim, height, sequence, options) {
-  // Here, we choose the index we should start at in the sequences. In smaller
-  // sizes (which correspond to larger numbers in style.size) we start earlier
-  // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts
-  // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2
-  const start = Math.min(2, 3 - options.style.size);
-
-  for (let i = start; i < sequence.length; i++) {
-    if (sequence[i].type === "stack") {
-      // This is always the last delimiter, so we just break the loop now.
-      break;
-    }
-
-    const metrics = getMetrics(delim, delimTypeToFont(sequence[i]), "math");
-    let heightDepth = metrics.height + metrics.depth; // Small delimiters are scaled down versions of the same font, so we
-    // account for the style change size.
-
-    if (sequence[i].type === "small") {
-      const newOptions = options.havingBaseStyle(sequence[i].style);
-      heightDepth *= newOptions.sizeMultiplier;
-    } // Check if the delimiter at this size works for the given height.
-
-
-    if (heightDepth > height) {
-      return sequence[i];
-    }
-  } // If we reached the end of the sequence, return the last sequence element.
-
-
-  return sequence[sequence.length - 1];
-};
-/**
- * Make a delimiter of a given height+depth, with optional centering. Here, we
- * traverse the sequences, and create a delimiter that the sequence tells us to.
- */
-
-
-const makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) {
-  if (delim === "<" || delim === "\\lt" || delim === "\u27e8") {
-    delim = "\\langle";
-  } else if (delim === ">" || delim === "\\gt" || delim === "\u27e9") {
-    delim = "\\rangle";
-  } // Decide what sequence to use
-
-
-  let sequence;
-
-  if (utils.contains(stackNeverDelimiters, delim)) {
-    sequence = stackNeverDelimiterSequence;
-  } else if (utils.contains(stackLargeDelimiters, delim)) {
-    sequence = stackLargeDelimiterSequence;
-  } else {
-    sequence = stackAlwaysDelimiterSequence;
-  } // Look through the sequence
-
-
-  const delimType = traverseSequence(delim, height, sequence, options); // Get the delimiter from font glyphs.
-  // Depending on the sequence element we decided on, call the
-  // appropriate function.
-
-  if (delimType.type === "small") {
-    return makeSmallDelim(delim, delimType.style, center, options, mode, classes);
-  } else if (delimType.type === "large") {
-    return makeLargeDelim(delim, delimType.size, center, options, mode, classes);
-  } else
-    /* if (delimType.type === "stack") */
-    {
-      return makeStackedDelim(delim, height, center, options, mode, classes);
-    }
-};
-/**
- * Make a delimiter for use with `\left` and `\right`, given a height and depth
- * of an expression that the delimiters surround.
- */
-
-
-const makeLeftRightDelim = function makeLeftRightDelim(delim, height, depth, options, mode, classes) {
-  // We always center \left/\right delimiters, so the axis is always shifted
-  const axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier; // Taken from TeX source, tex.web, function make_left_right
-
-  const delimiterFactor = 901;
-  const delimiterExtend = 5.0 / options.fontMetrics().ptPerEm;
-  const maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight);
-  const totalHeight = Math.max( // In real TeX, calculations are done using integral values which are
-  // 65536 per pt, or 655360 per em. So, the division here truncates in
-  // TeX but doesn't here, producing different results. If we wanted to
-  // exactly match TeX's calculation, we could do
-  //   Math.floor(655360 * maxDistFromAxis / 500) *
-  //    delimiterFactor / 655360
-  // (To see the difference, compare
-  //    x^{x^{\left(\rule{0.1em}{0.68em}\right)}}
-  // in TeX and KaTeX)
-  maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend); // Finally, we defer to `makeCustomSizedDelim` with our calculated total
-  // height
-
-  return makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes);
-};
-
-var delimiter = {
-  sqrtImage: makeSqrtImage,
-  sizedDelim: makeSizedDelim,
-  customSizedDelim: makeCustomSizedDelim,
-  leftRightDelim: makeLeftRightDelim
-};
-
-// Extra data needed for the delimiter handler down below
-const delimiterSizes = {
-  "\\bigl": {
-    mclass: "mopen",
-    size: 1
-  },
-  "\\Bigl": {
-    mclass: "mopen",
-    size: 2
-  },
-  "\\biggl": {
-    mclass: "mopen",
-    size: 3
-  },
-  "\\Biggl": {
-    mclass: "mopen",
-    size: 4
-  },
-  "\\bigr": {
-    mclass: "mclose",
-    size: 1
-  },
-  "\\Bigr": {
-    mclass: "mclose",
-    size: 2
-  },
-  "\\biggr": {
-    mclass: "mclose",
-    size: 3
-  },
-  "\\Biggr": {
-    mclass: "mclose",
-    size: 4
-  },
-  "\\bigm": {
-    mclass: "mrel",
-    size: 1
-  },
-  "\\Bigm": {
-    mclass: "mrel",
-    size: 2
-  },
-  "\\biggm": {
-    mclass: "mrel",
-    size: 3
-  },
-  "\\Biggm": {
-    mclass: "mrel",
-    size: 4
-  },
-  "\\big": {
-    mclass: "mord",
-    size: 1
-  },
-  "\\Big": {
-    mclass: "mord",
-    size: 2
-  },
-  "\\bigg": {
-    mclass: "mord",
-    size: 3
-  },
-  "\\Bigg": {
-    mclass: "mord",
-    size: 4
-  }
-};
-const delimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230a", "\u230b", "\\lceil", "\\rceil", "\u2308", "\u2309", "<", ">", "\\langle", "\u27e8", "\\rangle", "\u27e9", "\\lt", "\\gt", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27ee", "\u27ef", "\\lmoustache", "\\rmoustache", "\u23b0", "\u23b1", "/", "\\backslash", "|", "\\vert", "\\|", "\\Vert", "\\uparrow", "\\Uparrow", "\\downarrow", "\\Downarrow", "\\updownarrow", "\\Updownarrow", "."];
-
-// Delimiter functions
-function checkDelimiter(delim, context) {
-  const symDelim = checkSymbolNodeType(delim);
-
-  if (symDelim && utils.contains(delimiters, symDelim.text)) {
-    return symDelim;
-  } else {
-    throw new ParseError("Invalid delimiter: '" + (symDelim ? symDelim.text : JSON.stringify(delim)) + "' after '" + context.funcName + "'", delim);
-  }
-}
-
-defineFunction({
-  type: "delimsizing",
-  names: ["\\bigl", "\\Bigl", "\\biggl", "\\Biggl", "\\bigr", "\\Bigr", "\\biggr", "\\Biggr", "\\bigm", "\\Bigm", "\\biggm", "\\Biggm", "\\big", "\\Big", "\\bigg", "\\Bigg"],
-  props: {
-    numArgs: 1
-  },
-  handler: (context, args) => {
-    const delim = checkDelimiter(args[0], context);
-    return {
-      type: "delimsizing",
-      mode: context.parser.mode,
-      size: delimiterSizes[context.funcName].size,
-      mclass: delimiterSizes[context.funcName].mclass,
-      delim: delim.text
-    };
-  },
-  htmlBuilder: (group, options) => {
-    if (group.delim === ".") {
-      // Empty delimiters still count as elements, even though they don't
-      // show anything.
-      return buildCommon.makeSpan([group.mclass]);
-    } // Use delimiter.sizedDelim to generate the delimiter.
-
-
-    return delimiter.sizedDelim(group.delim, group.size, options, group.mode, [group.mclass]);
-  },
-  mathmlBuilder: group => {
-    const children = [];
-
-    if (group.delim !== ".") {
-      children.push(makeText(group.delim, group.mode));
-    }
-
-    const node = new mathMLTree.MathNode("mo", children);
-
-    if (group.mclass === "mopen" || group.mclass === "mclose") {
-      // Only some of the delimsizing functions act as fences, and they
-      // return "mopen" or "mclose" mclass.
-      node.setAttribute("fence", "true");
-    } else {
-      // Explicitly disable fencing if it's not a fence, to override the
-      // defaults.
-      node.setAttribute("fence", "false");
-    }
-
-    return node;
-  }
-});
-
-function assertParsed(group) {
-  if (!group.body) {
-    throw new Error("Bug: The leftright ParseNode wasn't fully parsed.");
-  }
-}
-
-defineFunction({
-  type: "leftright-right",
-  names: ["\\right"],
-  props: {
-    numArgs: 1
-  },
-  handler: (context, args) => {
-    // \left case below triggers parsing of \right in
-    //   `const right = parser.parseFunction();`
-    // uses this return value.
-    const color = context.parser.gullet.macros.get("\\current@color");
-
-    if (color && typeof color !== "string") {
-      throw new ParseError("\\current@color set to non-string in \\right");
-    }
-
-    return {
-      type: "leftright-right",
-      mode: context.parser.mode,
-      delim: checkDelimiter(args[0], context).text,
-      color // undefined if not set via \color
-
-    };
-  }
-});
-defineFunction({
-  type: "leftright",
-  names: ["\\left"],
-  props: {
-    numArgs: 1
-  },
-  handler: (context, args) => {
-    const delim = checkDelimiter(args[0], context);
-    const parser = context.parser; // Parse out the implicit body
-
-    ++parser.leftrightDepth; // parseExpression stops before '\\right'
-
-    const body = parser.parseExpression(false);
-    --parser.leftrightDepth; // Check the next token
-
-    parser.expect("\\right", false);
-    const right = assertNodeType(parser.parseFunction(), "leftright-right");
-    return {
-      type: "leftright",
-      mode: parser.mode,
-      body,
-      left: delim.text,
-      right: right.delim,
-      rightColor: right.color
-    };
-  },
-  htmlBuilder: (group, options) => {
-    assertParsed(group); // Build the inner expression
-
-    const inner = buildExpression(group.body, options, true, ["mopen", "mclose"]);
-    let innerHeight = 0;
-    let innerDepth = 0;
-    let hadMiddle = false; // Calculate its height and depth
-
-    for (let i = 0; i < inner.length; i++) {
-      // Property `isMiddle` not defined on `span`. See comment in
-      // "middle"'s htmlBuilder.
-      // $FlowFixMe
-      if (inner[i].isMiddle) {
-        hadMiddle = true;
-      } else {
-        innerHeight = Math.max(inner[i].height, innerHeight);
-        innerDepth = Math.max(inner[i].depth, innerDepth);
-      }
-    } // The size of delimiters is the same, regardless of what style we are
-    // in. Thus, to correctly calculate the size of delimiter we need around
-    // a group, we scale down the inner size based on the size.
-
-
-    innerHeight *= options.sizeMultiplier;
-    innerDepth *= options.sizeMultiplier;
-    let leftDelim;
-
-    if (group.left === ".") {
-      // Empty delimiters in \left and \right make null delimiter spaces.
-      leftDelim = makeNullDelimiter(options, ["mopen"]);
-    } else {
-      // Otherwise, use leftRightDelim to generate the correct sized
-      // delimiter.
-      leftDelim = delimiter.leftRightDelim(group.left, innerHeight, innerDepth, options, group.mode, ["mopen"]);
-    } // Add it to the beginning of the expression
-
-
-    inner.unshift(leftDelim); // Handle middle delimiters
-
-    if (hadMiddle) {
-      for (let i = 1; i < inner.length; i++) {
-        const middleDelim = inner[i]; // Property `isMiddle` not defined on `span`. See comment in
-        // "middle"'s htmlBuilder.
-        // $FlowFixMe
-
-        const isMiddle = middleDelim.isMiddle;
-
-        if (isMiddle) {
-          // Apply the options that were active when \middle was called
-          inner[i] = delimiter.leftRightDelim(isMiddle.delim, innerHeight, innerDepth, isMiddle.options, group.mode, []);
-        }
-      }
-    }
-
-    let rightDelim; // Same for the right delimiter, but using color specified by \color
-
-    if (group.right === ".") {
-      rightDelim = makeNullDelimiter(options, ["mclose"]);
-    } else {
-      const colorOptions = group.rightColor ? options.withColor(group.rightColor) : options;
-      rightDelim = delimiter.leftRightDelim(group.right, innerHeight, innerDepth, colorOptions, group.mode, ["mclose"]);
-    } // Add it to the end of the expression.
-
-
-    inner.push(rightDelim);
-    return buildCommon.makeSpan(["minner"], inner, options);
-  },
-  mathmlBuilder: (group, options) => {
-    assertParsed(group);
-    const inner = buildExpression$1(group.body, options);
-
-    if (group.left !== ".") {
-      const leftNode = new mathMLTree.MathNode("mo", [makeText(group.left, group.mode)]);
-      leftNode.setAttribute("fence", "true");
-      inner.unshift(leftNode);
-    }
-
-    if (group.right !== ".") {
-      const rightNode = new mathMLTree.MathNode("mo", [makeText(group.right, group.mode)]);
-      rightNode.setAttribute("fence", "true");
-
-      if (group.rightColor) {
-        rightNode.setAttribute("mathcolor", group.rightColor);
-      }
-
-      inner.push(rightNode);
-    }
-
-    return makeRow(inner);
-  }
-});
-defineFunction({
-  type: "middle",
-  names: ["\\middle"],
-  props: {
-    numArgs: 1
-  },
-  handler: (context, args) => {
-    const delim = checkDelimiter(args[0], context);
-
-    if (!context.parser.leftrightDepth) {
-      throw new ParseError("\\middle without preceding \\left", delim);
-    }
-
-    return {
-      type: "middle",
-      mode: context.parser.mode,
-      delim: delim.text
-    };
-  },
-  htmlBuilder: (group, options) => {
-    let middleDelim;
-
-    if (group.delim === ".") {
-      middleDelim = makeNullDelimiter(options, []);
-    } else {
-      middleDelim = delimiter.sizedDelim(group.delim, 1, options, group.mode, []);
-      const isMiddle = {
-        delim: group.delim,
-        options
-      }; // Property `isMiddle` not defined on `span`. It is only used in
-      // this file above.
-      // TODO: Fix this violation of the `span` type and possibly rename
-      // things since `isMiddle` sounds like a boolean, but is a struct.
-      // $FlowFixMe
-
-      middleDelim.isMiddle = isMiddle;
-    }
-
-    return middleDelim;
-  },
-  mathmlBuilder: (group, options) => {
-    // A Firefox \middle will strech a character vertically only if it
-    // is in the fence part of the operator dictionary at:
-    // https://www.w3.org/TR/MathML3/appendixc.html.
-    // So we need to avoid U+2223 and use plain "|" instead.
-    const textNode = group.delim === "\\vert" || group.delim === "|" ? makeText("|", "text") : makeText(group.delim, group.mode);
-    const middleNode = new mathMLTree.MathNode("mo", [textNode]);
-    middleNode.setAttribute("fence", "true"); // MathML gives 5/18em spacing to each <mo> element.
-    // \middle should get delimiter spacing instead.
-
-    middleNode.setAttribute("lspace", "0.05em");
-    middleNode.setAttribute("rspace", "0.05em");
-    return middleNode;
-  }
-});
-
-const htmlBuilder$2 = (group, options) => {
-  // \cancel, \bcancel, \xcancel, \sout, \fbox, \colorbox, \fcolorbox
-  // Some groups can return document fragments.  Handle those by wrapping
-  // them in a span.
-  const inner = buildCommon.wrapFragment(buildGroup(group.body, options), options);
-  const label = group.label.substr(1);
-  const scale = options.sizeMultiplier;
-  let img;
-  let imgShift = 0; // In the LaTeX cancel package, line geometry is slightly different
-  // depending on whether the subject is wider than it is tall, or vice versa.
-  // We don't know the width of a group, so as a proxy, we test if
-  // the subject is a single character. This captures most of the
-  // subjects that should get the "tall" treatment.
-
-  const isSingleChar = utils.isCharacterBox(group.body);
-
-  if (label === "sout") {
-    img = buildCommon.makeSpan(["stretchy", "sout"]);
-    img.height = options.fontMetrics().defaultRuleThickness / scale;
-    imgShift = -0.5 * options.fontMetrics().xHeight;
-  } else {
-    // Add horizontal padding
-    if (/cancel/.test(label)) {
-      if (!isSingleChar) {
-        inner.classes.push("cancel-pad");
-      }
-    } else {
-      inner.classes.push("boxpad");
-    } // Add vertical padding
-
-
-    let vertPad = 0;
-    let ruleThickness = 0; // ref: cancel package: \advance\totalheight2\p@ % "+2"
-
-    if (/box/.test(label)) {
-      ruleThickness = Math.max(options.fontMetrics().fboxrule, // default
-      options.minRuleThickness // User override.
-      );
-      vertPad = options.fontMetrics().fboxsep + (label === "colorbox" ? 0 : ruleThickness);
-    } else {
-      vertPad = isSingleChar ? 0.2 : 0;
-    }
-
-    img = stretchy.encloseSpan(inner, label, vertPad, options);
-
-    if (/fbox|boxed|fcolorbox/.test(label)) {
-      img.style.borderStyle = "solid";
-      img.style.borderWidth = `${ruleThickness}em`;
-    }
-
-    imgShift = inner.depth + vertPad;
-
-    if (group.backgroundColor) {
-      img.style.backgroundColor = group.backgroundColor;
-
-      if (group.borderColor) {
-        img.style.borderColor = group.borderColor;
-      }
-    }
-  }
-
-  let vlist;
-
-  if (group.backgroundColor) {
-    vlist = buildCommon.makeVList({
-      positionType: "individualShift",
-      children: [// Put the color background behind inner;
-      {
-        type: "elem",
-        elem: img,
-        shift: imgShift
-      }, {
-        type: "elem",
-        elem: inner,
-        shift: 0
-      }]
-    }, options);
-  } else {
-    vlist = buildCommon.makeVList({
-      positionType: "individualShift",
-      children: [// Write the \cancel stroke on top of inner.
-      {
-        type: "elem",
-        elem: inner,
-        shift: 0
-      }, {
-        type: "elem",
-        elem: img,
-        shift: imgShift,
-        wrapperClasses: /cancel/.test(label) ? ["svg-align"] : []
-      }]
-    }, options);
-  }
-
-  if (/cancel/.test(label)) {
-    // The cancel package documentation says that cancel lines add their height
-    // to the expression, but tests show that isn't how it actually works.
-    vlist.height = inner.height;
-    vlist.depth = inner.depth;
-  }
-
-  if (/cancel/.test(label) && !isSingleChar) {
-    // cancel does not create horiz space for its line extension.
-    return buildCommon.makeSpan(["mord", "cancel-lap"], [vlist], options);
-  } else {
-    return buildCommon.makeSpan(["mord"], [vlist], options);
-  }
-};
-
-const mathmlBuilder$2 = (group, options) => {
-  let fboxsep = 0;
-  const node = new mathMLTree.MathNode(group.label.indexOf("colorbox") > -1 ? "mpadded" : "menclose", [buildGroup$1(group.body, options)]);
-
-  switch (group.label) {
-    case "\\cancel":
-      node.setAttribute("notation", "updiagonalstrike");
-      break;
-
-    case "\\bcancel":
-      node.setAttribute("notation", "downdiagonalstrike");
-      break;
-
-    case "\\sout":
-      node.setAttribute("notation", "horizontalstrike");
-      break;
-
-    case "\\fbox":
-      node.setAttribute("notation", "box");
-      break;
-
-    case "\\fcolorbox":
-    case "\\colorbox":
-      // <menclose> doesn't have a good notation option. So use <mpadded>
-      // instead. Set some attributes that come included with <menclose>.
-      fboxsep = options.fontMetrics().fboxsep * options.fontMetrics().ptPerEm;
-      node.setAttribute("width", `+${2 * fboxsep}pt`);
-      node.setAttribute("height", `+${2 * fboxsep}pt`);
-      node.setAttribute("lspace", `${fboxsep}pt`); //
-
-      node.setAttribute("voffset", `${fboxsep}pt`);
-
-      if (group.label === "\\fcolorbox") {
-        const thk = Math.max(options.fontMetrics().fboxrule, // default
-        options.minRuleThickness // user override
-        );
-        node.setAttribute("style", "border: " + thk + "em solid " + String(group.borderColor));
-      }
-
-      break;
-
-    case "\\xcancel":
-      node.setAttribute("notation", "updiagonalstrike downdiagonalstrike");
-      break;
-  }
-
-  if (group.backgroundColor) {
-    node.setAttribute("mathbackground", group.backgroundColor);
-  }
-
-  return node;
-};
-
-defineFunction({
-  type: "enclose",
-  names: ["\\colorbox"],
-  props: {
-    numArgs: 2,
-    allowedInText: true,
-    greediness: 3,
-    argTypes: ["color", "text"]
-  },
-
-  handler(_ref, args, optArgs) {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    const color = assertNodeType(args[0], "color-token").color;
-    const body = args[1];
-    return {
-      type: "enclose",
-      mode: parser.mode,
-      label: funcName,
-      backgroundColor: color,
-      body
-    };
-  },
-
-  htmlBuilder: htmlBuilder$2,
-  mathmlBuilder: mathmlBuilder$2
-});
-defineFunction({
-  type: "enclose",
-  names: ["\\fcolorbox"],
-  props: {
-    numArgs: 3,
-    allowedInText: true,
-    greediness: 3,
-    argTypes: ["color", "color", "text"]
-  },
-
-  handler(_ref2, args, optArgs) {
-    let parser = _ref2.parser,
-        funcName = _ref2.funcName;
-    const borderColor = assertNodeType(args[0], "color-token").color;
-    const backgroundColor = assertNodeType(args[1], "color-token").color;
-    const body = args[2];
-    return {
-      type: "enclose",
-      mode: parser.mode,
-      label: funcName,
-      backgroundColor,
-      borderColor,
-      body
-    };
-  },
-
-  htmlBuilder: htmlBuilder$2,
-  mathmlBuilder: mathmlBuilder$2
-});
-defineFunction({
-  type: "enclose",
-  names: ["\\fbox"],
-  props: {
-    numArgs: 1,
-    argTypes: ["hbox"],
-    allowedInText: true
-  },
-
-  handler(_ref3, args) {
-    let parser = _ref3.parser;
-    return {
-      type: "enclose",
-      mode: parser.mode,
-      label: "\\fbox",
-      body: args[0]
-    };
-  }
-
-});
-defineFunction({
-  type: "enclose",
-  names: ["\\cancel", "\\bcancel", "\\xcancel", "\\sout"],
-  props: {
-    numArgs: 1
-  },
-
-  handler(_ref4, args, optArgs) {
-    let parser = _ref4.parser,
-        funcName = _ref4.funcName;
-    const body = args[0];
-    return {
-      type: "enclose",
-      mode: parser.mode,
-      label: funcName,
-      body
-    };
-  },
-
-  htmlBuilder: htmlBuilder$2,
-  mathmlBuilder: mathmlBuilder$2
-});
-
-/**
- * All registered environments.
- * `environments.js` exports this same dictionary again and makes it public.
- * `Parser.js` requires this dictionary via `environments.js`.
- */
-const _environments = {};
-function defineEnvironment(_ref) {
-  let type = _ref.type,
-      names = _ref.names,
-      props = _ref.props,
-      handler = _ref.handler,
-      htmlBuilder = _ref.htmlBuilder,
-      mathmlBuilder = _ref.mathmlBuilder;
-  // Set default values of environments.
-  const data = {
-    type,
-    numArgs: props.numArgs || 0,
-    greediness: 1,
-    allowedInText: false,
-    numOptionalArgs: 0,
-    handler
-  };
-
-  for (let i = 0; i < names.length; ++i) {
-    // TODO: The value type of _environments should be a type union of all
-    // possible `EnvSpec<>` possibilities instead of `EnvSpec<*>`, which is
-    // an existential type.
-    // $FlowFixMe
-    _environments[names[i]] = data;
-  }
-
-  if (htmlBuilder) {
-    _htmlGroupBuilders[type] = htmlBuilder;
-  }
-
-  if (mathmlBuilder) {
-    _mathmlGroupBuilders[type] = mathmlBuilder;
-  }
-}
-
-function getHLines(parser) {
-  // Return an array. The array length = number of hlines.
-  // Each element in the array tells if the line is dashed.
-  const hlineInfo = [];
-  parser.consumeSpaces();
-  let nxt = parser.fetch().text;
-
-  while (nxt === "\\hline" || nxt === "\\hdashline") {
-    parser.consume();
-    hlineInfo.push(nxt === "\\hdashline");
-    parser.consumeSpaces();
-    nxt = parser.fetch().text;
-  }
-
-  return hlineInfo;
-}
-/**
- * Parse the body of the environment, with rows delimited by \\ and
- * columns delimited by &, and create a nested list in row-major order
- * with one group per cell.  If given an optional argument style
- * ("text", "display", etc.), then each cell is cast into that style.
- */
-
-
-function parseArray(parser, _ref, style) {
-  let hskipBeforeAndAfter = _ref.hskipBeforeAndAfter,
-      addJot = _ref.addJot,
-      cols = _ref.cols,
-      arraystretch = _ref.arraystretch,
-      colSeparationType = _ref.colSeparationType;
-  // Parse body of array with \\ temporarily mapped to \cr
-  parser.gullet.beginGroup();
-  parser.gullet.macros.set("\\\\", "\\cr"); // Get current arraystretch if it's not set by the environment
-
-  if (!arraystretch) {
-    const stretch = parser.gullet.expandMacroAsText("\\arraystretch");
-
-    if (stretch == null) {
-      // Default \arraystretch from lttab.dtx
-      arraystretch = 1;
-    } else {
-      arraystretch = parseFloat(stretch);
-
-      if (!arraystretch || arraystretch < 0) {
-        throw new ParseError(`Invalid \\arraystretch: ${stretch}`);
-      }
-    }
-  } // Start group for first cell
-
-
-  parser.gullet.beginGroup();
-  let row = [];
-  const body = [row];
-  const rowGaps = [];
-  const hLinesBeforeRow = []; // Test for \hline at the top of the array.
-
-  hLinesBeforeRow.push(getHLines(parser));
-
-  while (true) {
-    // eslint-disable-line no-constant-condition
-    // Parse each cell in its own group (namespace)
-    let cell = parser.parseExpression(false, "\\cr");
-    parser.gullet.endGroup();
-    parser.gullet.beginGroup();
-    cell = {
-      type: "ordgroup",
-      mode: parser.mode,
-      body: cell
-    };
-
-    if (style) {
-      cell = {
-        type: "styling",
-        mode: parser.mode,
-        style,
-        body: [cell]
-      };
-    }
-
-    row.push(cell);
-    const next = parser.fetch().text;
-
-    if (next === "&") {
-      parser.consume();
-    } else if (next === "\\end") {
-      // Arrays terminate newlines with `\crcr` which consumes a `\cr` if
-      // the last line is empty.
-      // NOTE: Currently, `cell` is the last item added into `row`.
-      if (row.length === 1 && cell.type === "styling" && cell.body[0].body.length === 0) {
-        body.pop();
-      }
-
-      if (hLinesBeforeRow.length < body.length + 1) {
-        hLinesBeforeRow.push([]);
-      }
-
-      break;
-    } else if (next === "\\cr") {
-      const cr = assertNodeType(parser.parseFunction(), "cr");
-      rowGaps.push(cr.size); // check for \hline(s) following the row separator
-
-      hLinesBeforeRow.push(getHLines(parser));
-      row = [];
-      body.push(row);
-    } else {
-      throw new ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken);
-    }
-  } // End cell group
-
-
-  parser.gullet.endGroup(); // End array group defining \\
-
-  parser.gullet.endGroup();
-  return {
-    type: "array",
-    mode: parser.mode,
-    addJot,
-    arraystretch,
-    body,
-    cols,
-    rowGaps,
-    hskipBeforeAndAfter,
-    hLinesBeforeRow,
-    colSeparationType
-  };
-} // Decides on a style for cells in an array according to whether the given
-// environment name starts with the letter 'd'.
-
-
-function dCellStyle(envName) {
-  if (envName.substr(0, 1) === "d") {
-    return "display";
-  } else {
-    return "text";
-  }
-}
-
-const htmlBuilder$3 = function htmlBuilder(group, options) {
-  let r;
-  let c;
-  const nr = group.body.length;
-  const hLinesBeforeRow = group.hLinesBeforeRow;
-  let nc = 0;
-  let body = new Array(nr);
-  const hlines = [];
-  const ruleThickness = Math.max( // From LaTeX \showthe\arrayrulewidth. Equals 0.04 em.
-  options.fontMetrics().arrayRuleWidth, options.minRuleThickness // User override.
-  ); // Horizontal spacing
-
-  const pt = 1 / options.fontMetrics().ptPerEm;
-  let arraycolsep = 5 * pt; // default value, i.e. \arraycolsep in article.cls
-
-  if (group.colSeparationType && group.colSeparationType === "small") {
-    // We're in a {smallmatrix}. Default column space is \thickspace,
-    // i.e. 5/18em = 0.2778em, per amsmath.dtx for {smallmatrix}.
-    // But that needs adjustment because LaTeX applies \scriptstyle to the
-    // entire array, including the colspace, but this function applies
-    // \scriptstyle only inside each element.
-    const localMultiplier = options.havingStyle(Style$1.SCRIPT).sizeMultiplier;
-    arraycolsep = 0.2778 * (localMultiplier / options.sizeMultiplier);
-  } // Vertical spacing
-
-
-  const baselineskip = 12 * pt; // see size10.clo
-  // Default \jot from ltmath.dtx
-  // TODO(edemaine): allow overriding \jot via \setlength (#687)
-
-  const jot = 3 * pt;
-  const arrayskip = group.arraystretch * baselineskip;
-  const arstrutHeight = 0.7 * arrayskip; // \strutbox in ltfsstrc.dtx and
-
-  const arstrutDepth = 0.3 * arrayskip; // \@arstrutbox in lttab.dtx
-
-  let totalHeight = 0; // Set a position for \hline(s) at the top of the array, if any.
-
-  function setHLinePos(hlinesInGap) {
-    for (let i = 0; i < hlinesInGap.length; ++i) {
-      if (i > 0) {
-        totalHeight += 0.25;
-      }
-
-      hlines.push({
-        pos: totalHeight,
-        isDashed: hlinesInGap[i]
-      });
-    }
-  }
-
-  setHLinePos(hLinesBeforeRow[0]);
-
-  for (r = 0; r < group.body.length; ++r) {
-    const inrow = group.body[r];
-    let height = arstrutHeight; // \@array adds an \@arstrut
-
-    let depth = arstrutDepth; // to each tow (via the template)
-
-    if (nc < inrow.length) {
-      nc = inrow.length;
-    }
-
-    const outrow = new Array(inrow.length);
-
-    for (c = 0; c < inrow.length; ++c) {
-      const elt = buildGroup(inrow[c], options);
-
-      if (depth < elt.depth) {
-        depth = elt.depth;
-      }
-
-      if (height < elt.height) {
-        height = elt.height;
-      }
-
-      outrow[c] = elt;
-    }
-
-    const rowGap = group.rowGaps[r];
-    let gap = 0;
-
-    if (rowGap) {
-      gap = calculateSize(rowGap, options);
-
-      if (gap > 0) {
-        // \@argarraycr
-        gap += arstrutDepth;
-
-        if (depth < gap) {
-          depth = gap; // \@xargarraycr
-        }
-
-        gap = 0;
-      }
-    } // In AMS multiline environments such as aligned and gathered, rows
-    // correspond to lines that have additional \jot added to the
-    // \baselineskip via \openup.
-
-
-    if (group.addJot) {
-      depth += jot;
-    }
-
-    outrow.height = height;
-    outrow.depth = depth;
-    totalHeight += height;
-    outrow.pos = totalHeight;
-    totalHeight += depth + gap; // \@yargarraycr
-
-    body[r] = outrow; // Set a position for \hline(s), if any.
-
-    setHLinePos(hLinesBeforeRow[r + 1]);
-  }
-
-  const offset = totalHeight / 2 + options.fontMetrics().axisHeight;
-  const colDescriptions = group.cols || [];
-  const cols = [];
-  let colSep;
-  let colDescrNum;
-
-  for (c = 0, colDescrNum = 0; // Continue while either there are more columns or more column
-  // descriptions, so trailing separators don't get lost.
-  c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) {
-    let colDescr = colDescriptions[colDescrNum] || {};
-    let firstSeparator = true;
-
-    while (colDescr.type === "separator") {
-      // If there is more than one separator in a row, add a space
-      // between them.
-      if (!firstSeparator) {
-        colSep = buildCommon.makeSpan(["arraycolsep"], []);
-        colSep.style.width = options.fontMetrics().doubleRuleSep + "em";
-        cols.push(colSep);
-      }
-
-      if (colDescr.separator === "|" || colDescr.separator === ":") {
-        const lineType = colDescr.separator === "|" ? "solid" : "dashed";
-        const separator = buildCommon.makeSpan(["vertical-separator"], [], options);
-        separator.style.height = totalHeight + "em";
-        separator.style.borderRightWidth = `${ruleThickness}em`;
-        separator.style.borderRightStyle = lineType;
-        separator.style.margin = `0 -${ruleThickness / 2}em`;
-        separator.style.verticalAlign = -(totalHeight - offset) + "em";
-        cols.push(separator);
-      } else {
-        throw new ParseError("Invalid separator type: " + colDescr.separator);
-      }
-
-      colDescrNum++;
-      colDescr = colDescriptions[colDescrNum] || {};
-      firstSeparator = false;
-    }
-
-    if (c >= nc) {
-      continue;
-    }
-
-    let sepwidth;
-
-    if (c > 0 || group.hskipBeforeAndAfter) {
-      sepwidth = utils.deflt(colDescr.pregap, arraycolsep);
-
-      if (sepwidth !== 0) {
-        colSep = buildCommon.makeSpan(["arraycolsep"], []);
-        colSep.style.width = sepwidth + "em";
-        cols.push(colSep);
-      }
-    }
-
-    let col = [];
-
-    for (r = 0; r < nr; ++r) {
-      const row = body[r];
-      const elem = row[c];
-
-      if (!elem) {
-        continue;
-      }
-
-      const shift = row.pos - offset;
-      elem.depth = row.depth;
-      elem.height = row.height;
-      col.push({
-        type: "elem",
-        elem: elem,
-        shift: shift
-      });
-    }
-
-    col = buildCommon.makeVList({
-      positionType: "individualShift",
-      children: col
-    }, options);
-    col = buildCommon.makeSpan(["col-align-" + (colDescr.align || "c")], [col]);
-    cols.push(col);
-
-    if (c < nc - 1 || group.hskipBeforeAndAfter) {
-      sepwidth = utils.deflt(colDescr.postgap, arraycolsep);
-
-      if (sepwidth !== 0) {
-        colSep = buildCommon.makeSpan(["arraycolsep"], []);
-        colSep.style.width = sepwidth + "em";
-        cols.push(colSep);
-      }
-    }
-  }
-
-  body = buildCommon.makeSpan(["mtable"], cols); // Add \hline(s), if any.
-
-  if (hlines.length > 0) {
-    const line = buildCommon.makeLineSpan("hline", options, ruleThickness);
-    const dashes = buildCommon.makeLineSpan("hdashline", options, ruleThickness);
-    const vListElems = [{
-      type: "elem",
-      elem: body,
-      shift: 0
-    }];
-
-    while (hlines.length > 0) {
-      const hline = hlines.pop();
-      const lineShift = hline.pos - offset;
-
-      if (hline.isDashed) {
-        vListElems.push({
-          type: "elem",
-          elem: dashes,
-          shift: lineShift
-        });
-      } else {
-        vListElems.push({
-          type: "elem",
-          elem: line,
-          shift: lineShift
-        });
-      }
-    }
-
-    body = buildCommon.makeVList({
-      positionType: "individualShift",
-      children: vListElems
-    }, options);
-  }
-
-  return buildCommon.makeSpan(["mord"], [body], options);
-};
-
-const alignMap = {
-  c: "center ",
-  l: "left ",
-  r: "right "
-};
-
-const mathmlBuilder$3 = function mathmlBuilder(group, options) {
-  let table = new mathMLTree.MathNode("mtable", group.body.map(function (row) {
-    return new mathMLTree.MathNode("mtr", row.map(function (cell) {
-      return new mathMLTree.MathNode("mtd", [buildGroup$1(cell, options)]);
-    }));
-  })); // Set column alignment, row spacing, column spacing, and
-  // array lines by setting attributes on the table element.
-  // Set the row spacing. In MathML, we specify a gap distance.
-  // We do not use rowGap[] because MathML automatically increases
-  // cell height with the height/depth of the element content.
-  // LaTeX \arraystretch multiplies the row baseline-to-baseline distance.
-  // We simulate this by adding (arraystretch - 1)em to the gap. This
-  // does a reasonable job of adjusting arrays containing 1 em tall content.
-  // The 0.16 and 0.09 values are found emprically. They produce an array
-  // similar to LaTeX and in which content does not interfere with \hines.
-
-  const gap = group.arraystretch === 0.5 ? 0.1 // {smallmatrix}, {subarray}
-  : 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0);
-  table.setAttribute("rowspacing", gap + "em"); // MathML table lines go only between cells.
-  // To place a line on an edge we'll use <menclose>, if necessary.
-
-  let menclose = "";
-  let align = "";
-
-  if (group.cols) {
-    // Find column alignment, column spacing, and  vertical lines.
-    const cols = group.cols;
-    let columnLines = "";
-    let prevTypeWasAlign = false;
-    let iStart = 0;
-    let iEnd = cols.length;
-
-    if (cols[0].type === "separator") {
-      menclose += "top ";
-      iStart = 1;
-    }
-
-    if (cols[cols.length - 1].type === "separator") {
-      menclose += "bottom ";
-      iEnd -= 1;
-    }
-
-    for (let i = iStart; i < iEnd; i++) {
-      if (cols[i].type === "align") {
-        align += alignMap[cols[i].align];
-
-        if (prevTypeWasAlign) {
-          columnLines += "none ";
-        }
-
-        prevTypeWasAlign = true;
-      } else if (cols[i].type === "separator") {
-        // MathML accepts only single lines between cells.
-        // So we read only the first of consecutive separators.
-        if (prevTypeWasAlign) {
-          columnLines += cols[i].separator === "|" ? "solid " : "dashed ";
-          prevTypeWasAlign = false;
-        }
-      }
-    }
-
-    table.setAttribute("columnalign", align.trim());
-
-    if (/[sd]/.test(columnLines)) {
-      table.setAttribute("columnlines", columnLines.trim());
-    }
-  } // Set column spacing.
-
-
-  if (group.colSeparationType === "align") {
-    const cols = group.cols || [];
-    let spacing = "";
-
-    for (let i = 1; i < cols.length; i++) {
-      spacing += i % 2 ? "0em " : "1em ";
-    }
-
-    table.setAttribute("columnspacing", spacing.trim());
-  } else if (group.colSeparationType === "alignat") {
-    table.setAttribute("columnspacing", "0em");
-  } else if (group.colSeparationType === "small") {
-    table.setAttribute("columnspacing", "0.2778em");
-  } else {
-    table.setAttribute("columnspacing", "1em");
-  } // Address \hline and \hdashline
-
-
-  let rowLines = "";
-  const hlines = group.hLinesBeforeRow;
-  menclose += hlines[0].length > 0 ? "left " : "";
-  menclose += hlines[hlines.length - 1].length > 0 ? "right " : "";
-
-  for (let i = 1; i < hlines.length - 1; i++) {
-    rowLines += hlines[i].length === 0 ? "none " // MathML accepts only a single line between rows. Read one element.
-    : hlines[i][0] ? "dashed " : "solid ";
-  }
-
-  if (/[sd]/.test(rowLines)) {
-    table.setAttribute("rowlines", rowLines.trim());
-  }
-
-  if (menclose !== "") {
-    table = new mathMLTree.MathNode("menclose", [table]);
-    table.setAttribute("notation", menclose.trim());
-  }
-
-  if (group.arraystretch && group.arraystretch < 1) {
-    // A small array. Wrap in scriptstyle so row gap is not too large.
-    table = new mathMLTree.MathNode("mstyle", [table]);
-    table.setAttribute("scriptlevel", "1");
-  }
-
-  return table;
-}; // Convenience function for aligned and alignedat environments.
-
-
-const alignedHandler = function alignedHandler(context, args) {
-  const cols = [];
-  const res = parseArray(context.parser, {
-    cols,
-    addJot: true
-  }, "display"); // Determining number of columns.
-  // 1. If the first argument is given, we use it as a number of columns,
-  //    and makes sure that each row doesn't exceed that number.
-  // 2. Otherwise, just count number of columns = maximum number
-  //    of cells in each row ("aligned" mode -- isAligned will be true).
-  //
-  // At the same time, prepend empty group {} at beginning of every second
-  // cell in each row (starting with second cell) so that operators become
-  // binary.  This behavior is implemented in amsmath's \start@aligned.
-
-  let numMaths;
-  let numCols = 0;
-  const emptyGroup = {
-    type: "ordgroup",
-    mode: context.mode,
-    body: []
-  };
-  const ordgroup = checkNodeType(args[0], "ordgroup");
-
-  if (ordgroup) {
-    let arg0 = "";
-
-    for (let i = 0; i < ordgroup.body.length; i++) {
-      const textord = assertNodeType(ordgroup.body[i], "textord");
-      arg0 += textord.text;
-    }
-
-    numMaths = Number(arg0);
-    numCols = numMaths * 2;
-  }
-
-  const isAligned = !numCols;
-  res.body.forEach(function (row) {
-    for (let i = 1; i < row.length; i += 2) {
-      // Modify ordgroup node within styling node
-      const styling = assertNodeType(row[i], "styling");
-      const ordgroup = assertNodeType(styling.body[0], "ordgroup");
-      ordgroup.body.unshift(emptyGroup);
-    }
-
-    if (!isAligned) {
-      // Case 1
-      const curMaths = row.length / 2;
-
-      if (numMaths < curMaths) {
-        throw new ParseError("Too many math in a row: " + `expected ${numMaths}, but got ${curMaths}`, row[0]);
-      }
-    } else if (numCols < row.length) {
-      // Case 2
-      numCols = row.length;
-    }
-  }); // Adjusting alignment.
-  // In aligned mode, we add one \qquad between columns;
-  // otherwise we add nothing.
-
-  for (let i = 0; i < numCols; ++i) {
-    let align = "r";
-    let pregap = 0;
-
-    if (i % 2 === 1) {
-      align = "l";
-    } else if (i > 0 && isAligned) {
-      // "aligned" mode.
-      pregap = 1; // add one \quad
-    }
-
-    cols[i] = {
-      type: "align",
-      align: align,
-      pregap: pregap,
-      postgap: 0
-    };
-  }
-
-  res.colSeparationType = isAligned ? "align" : "alignat";
-  return res;
-}; // Arrays are part of LaTeX, defined in lttab.dtx so its documentation
-// is part of the source2e.pdf file of LaTeX2e source documentation.
-// {darray} is an {array} environment where cells are set in \displaystyle,
-// as defined in nccmath.sty.
-
-
-defineEnvironment({
-  type: "array",
-  names: ["array", "darray"],
-  props: {
-    numArgs: 1
-  },
-
-  handler(context, args) {
-    // Since no types are specified above, the two possibilities are
-    // - The argument is wrapped in {} or [], in which case Parser's
-    //   parseGroup() returns an "ordgroup" wrapping some symbol node.
-    // - The argument is a bare symbol node.
-    const symNode = checkSymbolNodeType(args[0]);
-    const colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body;
-    const cols = colalign.map(function (nde) {
-      const node = assertSymbolNodeType(nde);
-      const ca = node.text;
-
-      if ("lcr".indexOf(ca) !== -1) {
-        return {
-          type: "align",
-          align: ca
-        };
-      } else if (ca === "|") {
-        return {
-          type: "separator",
-          separator: "|"
-        };
-      } else if (ca === ":") {
-        return {
-          type: "separator",
-          separator: ":"
-        };
-      }
-
-      throw new ParseError("Unknown column alignment: " + ca, nde);
-    });
-    const res = {
-      cols,
-      hskipBeforeAndAfter: true // \@preamble in lttab.dtx
-
-    };
-    return parseArray(context.parser, res, dCellStyle(context.envName));
-  },
-
-  htmlBuilder: htmlBuilder$3,
-  mathmlBuilder: mathmlBuilder$3
-}); // The matrix environments of amsmath builds on the array environment
-// of LaTeX, which is discussed above.
-
-defineEnvironment({
-  type: "array",
-  names: ["matrix", "pmatrix", "bmatrix", "Bmatrix", "vmatrix", "Vmatrix"],
-  props: {
-    numArgs: 0
-  },
-
-  handler(context) {
-    const delimiters = {
-      "matrix": null,
-      "pmatrix": ["(", ")"],
-      "bmatrix": ["[", "]"],
-      "Bmatrix": ["\\{", "\\}"],
-      "vmatrix": ["|", "|"],
-      "Vmatrix": ["\\Vert", "\\Vert"]
-    }[context.envName]; // \hskip -\arraycolsep in amsmath
-
-    const payload = {
-      hskipBeforeAndAfter: false
-    };
-    const res = parseArray(context.parser, payload, dCellStyle(context.envName));
-    return delimiters ? {
-      type: "leftright",
-      mode: context.mode,
-      body: [res],
-      left: delimiters[0],
-      right: delimiters[1],
-      rightColor: undefined // \right uninfluenced by \color in array
-
-    } : res;
-  },
-
-  htmlBuilder: htmlBuilder$3,
-  mathmlBuilder: mathmlBuilder$3
-});
-defineEnvironment({
-  type: "array",
-  names: ["smallmatrix"],
-  props: {
-    numArgs: 0
-  },
-
-  handler(context) {
-    const payload = {
-      arraystretch: 0.5
-    };
-    const res = parseArray(context.parser, payload, "script");
-    res.colSeparationType = "small";
-    return res;
-  },
-
-  htmlBuilder: htmlBuilder$3,
-  mathmlBuilder: mathmlBuilder$3
-});
-defineEnvironment({
-  type: "array",
-  names: ["subarray"],
-  props: {
-    numArgs: 1
-  },
-
-  handler(context, args) {
-    // Parsing of {subarray} is similar to {array}
-    const symNode = checkSymbolNodeType(args[0]);
-    const colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body;
-    const cols = colalign.map(function (nde) {
-      const node = assertSymbolNodeType(nde);
-      const ca = node.text; // {subarray} only recognizes "l" & "c"
-
-      if ("lc".indexOf(ca) !== -1) {
-        return {
-          type: "align",
-          align: ca
-        };
-      }
-
-      throw new ParseError("Unknown column alignment: " + ca, nde);
-    });
-
-    if (cols.length > 1) {
-      throw new ParseError("{subarray} can contain only one column");
-    }
-
-    let res = {
-      cols,
-      hskipBeforeAndAfter: false,
-      arraystretch: 0.5
-    };
-    res = parseArray(context.parser, res, "script");
-
-    if (res.body[0].length > 1) {
-      throw new ParseError("{subarray} can contain only one column");
-    }
-
-    return res;
-  },
-
-  htmlBuilder: htmlBuilder$3,
-  mathmlBuilder: mathmlBuilder$3
-}); // A cases environment (in amsmath.sty) is almost equivalent to
-// \def\arraystretch{1.2}%
-// \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right.
-// {dcases} is a {cases} environment where cells are set in \displaystyle,
-// as defined in mathtools.sty.
-
-defineEnvironment({
-  type: "array",
-  names: ["cases", "dcases"],
-  props: {
-    numArgs: 0
-  },
-
-  handler(context) {
-    const payload = {
-      arraystretch: 1.2,
-      cols: [{
-        type: "align",
-        align: "l",
-        pregap: 0,
-        // TODO(kevinb) get the current style.
-        // For now we use the metrics for TEXT style which is what we were
-        // doing before.  Before attempting to get the current style we
-        // should look at TeX's behavior especially for \over and matrices.
-        postgap: 1.0
-        /* 1em quad */
-
-      }, {
-        type: "align",
-        align: "l",
-        pregap: 0,
-        postgap: 0
-      }]
-    };
-    const res = parseArray(context.parser, payload, dCellStyle(context.envName));
-    return {
-      type: "leftright",
-      mode: context.mode,
-      body: [res],
-      left: "\\{",
-      right: ".",
-      rightColor: undefined
-    };
-  },
-
-  htmlBuilder: htmlBuilder$3,
-  mathmlBuilder: mathmlBuilder$3
-}); // An aligned environment is like the align* environment
-// except it operates within math mode.
-// Note that we assume \nomallineskiplimit to be zero,
-// so that \strut@ is the same as \strut.
-
-defineEnvironment({
-  type: "array",
-  names: ["aligned"],
-  props: {
-    numArgs: 0
-  },
-  handler: alignedHandler,
-  htmlBuilder: htmlBuilder$3,
-  mathmlBuilder: mathmlBuilder$3
-}); // A gathered environment is like an array environment with one centered
-// column, but where rows are considered lines so get \jot line spacing
-// and contents are set in \displaystyle.
-
-defineEnvironment({
-  type: "array",
-  names: ["gathered"],
-  props: {
-    numArgs: 0
-  },
-
-  handler(context) {
-    const res = {
-      cols: [{
-        type: "align",
-        align: "c"
-      }],
-      addJot: true
-    };
-    return parseArray(context.parser, res, "display");
-  },
-
-  htmlBuilder: htmlBuilder$3,
-  mathmlBuilder: mathmlBuilder$3
-}); // alignat environment is like an align environment, but one must explicitly
-// specify maximum number of columns in each row, and can adjust spacing between
-// each columns.
-
-defineEnvironment({
-  type: "array",
-  names: ["alignedat"],
-  // One for numbered and for unnumbered;
-  // but, KaTeX doesn't supports math numbering yet,
-  // they make no difference for now.
-  props: {
-    numArgs: 1
-  },
-  handler: alignedHandler,
-  htmlBuilder: htmlBuilder$3,
-  mathmlBuilder: mathmlBuilder$3
-}); // Catch \hline outside array environment
-
-defineFunction({
-  type: "text",
-  // Doesn't matter what this is.
-  names: ["\\hline", "\\hdashline"],
-  props: {
-    numArgs: 0,
-    allowedInText: true,
-    allowedInMath: true
-  },
-
-  handler(context, args) {
-    throw new ParseError(`${context.funcName} valid only within array environment`);
-  }
-
-});
-
-const environments = _environments;
-
-// defineEnvironment definitions.
-// $FlowFixMe, "environment" handler returns an environment ParseNode
-
-defineFunction({
-  type: "environment",
-  names: ["\\begin", "\\end"],
-  props: {
-    numArgs: 1,
-    argTypes: ["text"]
-  },
-
-  handler(_ref, args) {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    const nameGroup = args[0];
-
-    if (nameGroup.type !== "ordgroup") {
-      throw new ParseError("Invalid environment name", nameGroup);
-    }
-
-    let envName = "";
-
-    for (let i = 0; i < nameGroup.body.length; ++i) {
-      envName += assertNodeType(nameGroup.body[i], "textord").text;
-    }
-
-    if (funcName === "\\begin") {
-      // begin...end is similar to left...right
-      if (!environments.hasOwnProperty(envName)) {
-        throw new ParseError("No such environment: " + envName, nameGroup);
-      } // Build the environment object. Arguments and other information will
-      // be made available to the begin and end methods using properties.
-
-
-      const env = environments[envName];
-
-      const _parser$parseArgument = parser.parseArguments("\\begin{" + envName + "}", env),
-            args = _parser$parseArgument.args,
-            optArgs = _parser$parseArgument.optArgs;
-
-      const context = {
-        mode: parser.mode,
-        envName,
-        parser
-      };
-      const result = env.handler(context, args, optArgs);
-      parser.expect("\\end", false);
-      const endNameToken = parser.nextToken;
-      const end = assertNodeType(parser.parseFunction(), "environment");
-
-      if (end.name !== envName) {
-        throw new ParseError(`Mismatch: \\begin{${envName}} matched by \\end{${end.name}}`, endNameToken);
-      }
-
-      return result;
-    }
-
-    return {
-      type: "environment",
-      mode: parser.mode,
-      name: envName,
-      nameGroup
-    };
-  }
-
-});
-
-const makeSpan$2 = buildCommon.makeSpan;
-
-function htmlBuilder$4(group, options) {
-  const elements = buildExpression(group.body, options, true);
-  return makeSpan$2([group.mclass], elements, options);
-}
-
-function mathmlBuilder$4(group, options) {
-  let node;
-  const inner = buildExpression$1(group.body, options);
-
-  if (group.mclass === "minner") {
-    return mathMLTree.newDocumentFragment(inner);
-  } else if (group.mclass === "mord") {
-    if (group.isCharacterBox) {
-      node = inner[0];
-      node.type = "mi";
-    } else {
-      node = new mathMLTree.MathNode("mi", inner);
-    }
-  } else {
-    if (group.isCharacterBox) {
-      node = inner[0];
-      node.type = "mo";
-    } else {
-      node = new mathMLTree.MathNode("mo", inner);
-    } // Set spacing based on what is the most likely adjacent atom type.
-    // See TeXbook p170.
-
-
-    if (group.mclass === "mbin") {
-      node.attributes.lspace = "0.22em"; // medium space
-
-      node.attributes.rspace = "0.22em";
-    } else if (group.mclass === "mpunct") {
-      node.attributes.lspace = "0em";
-      node.attributes.rspace = "0.17em"; // thinspace
-    } else if (group.mclass === "mopen" || group.mclass === "mclose") {
-      node.attributes.lspace = "0em";
-      node.attributes.rspace = "0em";
-    } // MathML <mo> default space is 5/18 em, so <mrel> needs no action.
-    // Ref: https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo
-
-  }
-
-  return node;
-} // Math class commands except \mathop
-
-
-defineFunction({
-  type: "mclass",
-  names: ["\\mathord", "\\mathbin", "\\mathrel", "\\mathopen", "\\mathclose", "\\mathpunct", "\\mathinner"],
-  props: {
-    numArgs: 1
-  },
-
-  handler(_ref, args) {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    const body = args[0];
-    return {
-      type: "mclass",
-      mode: parser.mode,
-      mclass: "m" + funcName.substr(5),
-      // TODO(kevinb): don't prefix with 'm'
-      body: ordargument(body),
-      isCharacterBox: utils.isCharacterBox(body)
-    };
-  },
-
-  htmlBuilder: htmlBuilder$4,
-  mathmlBuilder: mathmlBuilder$4
-});
-const binrelClass = arg => {
-  // \binrel@ spacing varies with (bin|rel|ord) of the atom in the argument.
-  // (by rendering separately and with {}s before and after, and measuring
-  // the change in spacing).  We'll do roughly the same by detecting the
-  // atom type directly.
-  const atom = arg.type === "ordgroup" && arg.body.length ? arg.body[0] : arg;
-
-  if (atom.type === "atom" && (atom.family === "bin" || atom.family === "rel")) {
-    return "m" + atom.family;
-  } else {
-    return "mord";
-  }
-}; // \@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord.
-// This is equivalent to \binrel@{x}\binrel@@{y} in AMSTeX.
-
-defineFunction({
-  type: "mclass",
-  names: ["\\@binrel"],
-  props: {
-    numArgs: 2
-  },
-
-  handler(_ref2, args) {
-    let parser = _ref2.parser;
-    return {
-      type: "mclass",
-      mode: parser.mode,
-      mclass: binrelClass(args[0]),
-      body: [args[1]],
-      isCharacterBox: utils.isCharacterBox(args[1])
-    };
-  }
-
-}); // Build a relation or stacked op by placing one symbol on top of another
-
-defineFunction({
-  type: "mclass",
-  names: ["\\stackrel", "\\overset", "\\underset"],
-  props: {
-    numArgs: 2
-  },
-
-  handler(_ref3, args) {
-    let parser = _ref3.parser,
-        funcName = _ref3.funcName;
-    const baseArg = args[1];
-    const shiftedArg = args[0];
-    let mclass;
-
-    if (funcName !== "\\stackrel") {
-      // LaTeX applies \binrel spacing to \overset and \underset.
-      mclass = binrelClass(baseArg);
-    } else {
-      mclass = "mrel"; // for \stackrel
-    }
-
-    const baseOp = {
-      type: "op",
-      mode: baseArg.mode,
-      limits: true,
-      alwaysHandleSupSub: true,
-      parentIsSupSub: false,
-      symbol: false,
-      suppressBaseShift: funcName !== "\\stackrel",
-      body: ordargument(baseArg)
-    };
-    const supsub = {
-      type: "supsub",
-      mode: shiftedArg.mode,
-      base: baseOp,
-      sup: funcName === "\\underset" ? null : shiftedArg,
-      sub: funcName === "\\underset" ? shiftedArg : null
-    };
-    return {
-      type: "mclass",
-      mode: parser.mode,
-      mclass,
-      body: [supsub],
-      isCharacterBox: utils.isCharacterBox(supsub)
-    };
-  },
-
-  htmlBuilder: htmlBuilder$4,
-  mathmlBuilder: mathmlBuilder$4
-});
-
-// TODO(kevinb): implement \\sl and \\sc
-
-const htmlBuilder$5 = (group, options) => {
-  const font = group.font;
-  const newOptions = options.withFont(font);
-  return buildGroup(group.body, newOptions);
-};
-
-const mathmlBuilder$5 = (group, options) => {
-  const font = group.font;
-  const newOptions = options.withFont(font);
-  return buildGroup$1(group.body, newOptions);
-};
-
-const fontAliases = {
-  "\\Bbb": "\\mathbb",
-  "\\bold": "\\mathbf",
-  "\\frak": "\\mathfrak",
-  "\\bm": "\\boldsymbol"
-};
-defineFunction({
-  type: "font",
-  names: [// styles, except \boldsymbol defined below
-  "\\mathrm", "\\mathit", "\\mathbf", "\\mathnormal", // families
-  "\\mathbb", "\\mathcal", "\\mathfrak", "\\mathscr", "\\mathsf", "\\mathtt", // aliases, except \bm defined below
-  "\\Bbb", "\\bold", "\\frak"],
-  props: {
-    numArgs: 1,
-    greediness: 2
-  },
-  handler: (_ref, args) => {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    const body = args[0];
-    let func = funcName;
-
-    if (func in fontAliases) {
-      func = fontAliases[func];
-    }
-
-    return {
-      type: "font",
-      mode: parser.mode,
-      font: func.slice(1),
-      body
-    };
-  },
-  htmlBuilder: htmlBuilder$5,
-  mathmlBuilder: mathmlBuilder$5
-});
-defineFunction({
-  type: "mclass",
-  names: ["\\boldsymbol", "\\bm"],
-  props: {
-    numArgs: 1,
-    greediness: 2
-  },
-  handler: (_ref2, args) => {
-    let parser = _ref2.parser;
-    const body = args[0];
-    const isCharacterBox = utils.isCharacterBox(body); // amsbsy.sty's \boldsymbol uses \binrel spacing to inherit the
-    // argument's bin|rel|ord status
-
-    return {
-      type: "mclass",
-      mode: parser.mode,
-      mclass: binrelClass(body),
-      body: [{
-        type: "font",
-        mode: parser.mode,
-        font: "boldsymbol",
-        body
-      }],
-      isCharacterBox: isCharacterBox
-    };
-  }
-}); // Old font changing functions
-
-defineFunction({
-  type: "font",
-  names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it"],
-  props: {
-    numArgs: 0,
-    allowedInText: true
-  },
-  handler: (_ref3, args) => {
-    let parser = _ref3.parser,
-        funcName = _ref3.funcName,
-        breakOnTokenText = _ref3.breakOnTokenText;
-    const mode = parser.mode;
-    const body = parser.parseExpression(true, breakOnTokenText);
-    const style = `math${funcName.slice(1)}`;
-    return {
-      type: "font",
-      mode: mode,
-      font: style,
-      body: {
-        type: "ordgroup",
-        mode: parser.mode,
-        body
-      }
-    };
-  },
-  htmlBuilder: htmlBuilder$5,
-  mathmlBuilder: mathmlBuilder$5
-});
-
-const adjustStyle = (size, originalStyle) => {
-  // Figure out what style this fraction should be in based on the
-  // function used
-  let style = originalStyle;
-
-  if (size === "display") {
-    // Get display style as a default.
-    // If incoming style is sub/sup, use style.text() to get correct size.
-    style = style.id >= Style$1.SCRIPT.id ? style.text() : Style$1.DISPLAY;
-  } else if (size === "text" && style.size === Style$1.DISPLAY.size) {
-    // We're in a \tfrac but incoming style is displaystyle, so:
-    style = Style$1.TEXT;
-  } else if (size === "script") {
-    style = Style$1.SCRIPT;
-  } else if (size === "scriptscript") {
-    style = Style$1.SCRIPTSCRIPT;
-  }
-
-  return style;
-};
-
-const htmlBuilder$6 = (group, options) => {
-  // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e).
-  const style = adjustStyle(group.size, options.style);
-  const nstyle = style.fracNum();
-  const dstyle = style.fracDen();
-  let newOptions;
-  newOptions = options.havingStyle(nstyle);
-  const numerm = buildGroup(group.numer, newOptions, options);
-
-  if (group.continued) {
-    // \cfrac inserts a \strut into the numerator.
-    // Get \strut dimensions from TeXbook page 353.
-    const hStrut = 8.5 / options.fontMetrics().ptPerEm;
-    const dStrut = 3.5 / options.fontMetrics().ptPerEm;
-    numerm.height = numerm.height < hStrut ? hStrut : numerm.height;
-    numerm.depth = numerm.depth < dStrut ? dStrut : numerm.depth;
-  }
-
-  newOptions = options.havingStyle(dstyle);
-  const denomm = buildGroup(group.denom, newOptions, options);
-  let rule;
-  let ruleWidth;
-  let ruleSpacing;
-
-  if (group.hasBarLine) {
-    if (group.barSize) {
-      ruleWidth = calculateSize(group.barSize, options);
-      rule = buildCommon.makeLineSpan("frac-line", options, ruleWidth);
-    } else {
-      rule = buildCommon.makeLineSpan("frac-line", options);
-    }
-
-    ruleWidth = rule.height;
-    ruleSpacing = rule.height;
-  } else {
-    rule = null;
-    ruleWidth = 0;
-    ruleSpacing = options.fontMetrics().defaultRuleThickness;
-  } // Rule 15b
-
-
-  let numShift;
-  let clearance;
-  let denomShift;
-
-  if (style.size === Style$1.DISPLAY.size || group.size === "display") {
-    numShift = options.fontMetrics().num1;
-
-    if (ruleWidth > 0) {
-      clearance = 3 * ruleSpacing;
-    } else {
-      clearance = 7 * ruleSpacing;
-    }
-
-    denomShift = options.fontMetrics().denom1;
-  } else {
-    if (ruleWidth > 0) {
-      numShift = options.fontMetrics().num2;
-      clearance = ruleSpacing;
-    } else {
-      numShift = options.fontMetrics().num3;
-      clearance = 3 * ruleSpacing;
-    }
-
-    denomShift = options.fontMetrics().denom2;
-  }
-
-  let frac;
-
-  if (!rule) {
-    // Rule 15c
-    const candidateClearance = numShift - numerm.depth - (denomm.height - denomShift);
-
-    if (candidateClearance < clearance) {
-      numShift += 0.5 * (clearance - candidateClearance);
-      denomShift += 0.5 * (clearance - candidateClearance);
-    }
-
-    frac = buildCommon.makeVList({
-      positionType: "individualShift",
-      children: [{
-        type: "elem",
-        elem: denomm,
-        shift: denomShift
-      }, {
-        type: "elem",
-        elem: numerm,
-        shift: -numShift
-      }]
-    }, options);
-  } else {
-    // Rule 15d
-    const axisHeight = options.fontMetrics().axisHeight;
-
-    if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) {
-      numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth));
-    }
-
-    if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) {
-      denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift));
-    }
-
-    const midShift = -(axisHeight - 0.5 * ruleWidth);
-    frac = buildCommon.makeVList({
-      positionType: "individualShift",
-      children: [{
-        type: "elem",
-        elem: denomm,
-        shift: denomShift
-      }, {
-        type: "elem",
-        elem: rule,
-        shift: midShift
-      }, {
-        type: "elem",
-        elem: numerm,
-        shift: -numShift
-      }]
-    }, options);
-  } // Since we manually change the style sometimes (with \dfrac or \tfrac),
-  // account for the possible size change here.
-
-
-  newOptions = options.havingStyle(style);
-  frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier;
-  frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier; // Rule 15e
-
-  let delimSize;
-
-  if (style.size === Style$1.DISPLAY.size) {
-    delimSize = options.fontMetrics().delim1;
-  } else {
-    delimSize = options.fontMetrics().delim2;
-  }
-
-  let leftDelim;
-  let rightDelim;
-
-  if (group.leftDelim == null) {
-    leftDelim = makeNullDelimiter(options, ["mopen"]);
-  } else {
-    leftDelim = delimiter.customSizedDelim(group.leftDelim, delimSize, true, options.havingStyle(style), group.mode, ["mopen"]);
-  }
-
-  if (group.continued) {
-    rightDelim = buildCommon.makeSpan([]); // zero width for \cfrac
-  } else if (group.rightDelim == null) {
-    rightDelim = makeNullDelimiter(options, ["mclose"]);
-  } else {
-    rightDelim = delimiter.customSizedDelim(group.rightDelim, delimSize, true, options.havingStyle(style), group.mode, ["mclose"]);
-  }
-
-  return buildCommon.makeSpan(["mord"].concat(newOptions.sizingClasses(options)), [leftDelim, buildCommon.makeSpan(["mfrac"], [frac]), rightDelim], options);
-};
-
-const mathmlBuilder$6 = (group, options) => {
-  let node = new mathMLTree.MathNode("mfrac", [buildGroup$1(group.numer, options), buildGroup$1(group.denom, options)]);
-
-  if (!group.hasBarLine) {
-    node.setAttribute("linethickness", "0px");
-  } else if (group.barSize) {
-    const ruleWidth = calculateSize(group.barSize, options);
-    node.setAttribute("linethickness", ruleWidth + "em");
-  }
-
-  const style = adjustStyle(group.size, options.style);
-
-  if (style.size !== options.style.size) {
-    node = new mathMLTree.MathNode("mstyle", [node]);
-    const isDisplay = style.size === Style$1.DISPLAY.size ? "true" : "false";
-    node.setAttribute("displaystyle", isDisplay);
-    node.setAttribute("scriptlevel", "0");
-  }
-
-  if (group.leftDelim != null || group.rightDelim != null) {
-    const withDelims = [];
-
-    if (group.leftDelim != null) {
-      const leftOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.leftDelim.replace("\\", ""))]);
-      leftOp.setAttribute("fence", "true");
-      withDelims.push(leftOp);
-    }
-
-    withDelims.push(node);
-
-    if (group.rightDelim != null) {
-      const rightOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.rightDelim.replace("\\", ""))]);
-      rightOp.setAttribute("fence", "true");
-      withDelims.push(rightOp);
-    }
-
-    return makeRow(withDelims);
-  }
-
-  return node;
-};
-
-defineFunction({
-  type: "genfrac",
-  names: ["\\cfrac", "\\dfrac", "\\frac", "\\tfrac", "\\dbinom", "\\binom", "\\tbinom", "\\\\atopfrac", // can’t be entered directly
-  "\\\\bracefrac", "\\\\brackfrac"],
-  props: {
-    numArgs: 2,
-    greediness: 2
-  },
-  handler: (_ref, args) => {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    const numer = args[0];
-    const denom = args[1];
-    let hasBarLine;
-    let leftDelim = null;
-    let rightDelim = null;
-    let size = "auto";
-
-    switch (funcName) {
-      case "\\cfrac":
-      case "\\dfrac":
-      case "\\frac":
-      case "\\tfrac":
-        hasBarLine = true;
-        break;
-
-      case "\\\\atopfrac":
-        hasBarLine = false;
-        break;
-
-      case "\\dbinom":
-      case "\\binom":
-      case "\\tbinom":
-        hasBarLine = false;
-        leftDelim = "(";
-        rightDelim = ")";
-        break;
-
-      case "\\\\bracefrac":
-        hasBarLine = false;
-        leftDelim = "\\{";
-        rightDelim = "\\}";
-        break;
-
-      case "\\\\brackfrac":
-        hasBarLine = false;
-        leftDelim = "[";
-        rightDelim = "]";
-        break;
-
-      default:
-        throw new Error("Unrecognized genfrac command");
-    }
-
-    switch (funcName) {
-      case "\\cfrac":
-      case "\\dfrac":
-      case "\\dbinom":
-        size = "display";
-        break;
-
-      case "\\tfrac":
-      case "\\tbinom":
-        size = "text";
-        break;
-    }
-
-    return {
-      type: "genfrac",
-      mode: parser.mode,
-      continued: funcName === "\\cfrac",
-      numer,
-      denom,
-      hasBarLine,
-      leftDelim,
-      rightDelim,
-      size,
-      barSize: null
-    };
-  },
-  htmlBuilder: htmlBuilder$6,
-  mathmlBuilder: mathmlBuilder$6
-}); // Infix generalized fractions -- these are not rendered directly, but replaced
-// immediately by one of the variants above.
-
-defineFunction({
-  type: "infix",
-  names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"],
-  props: {
-    numArgs: 0,
-    infix: true
-  },
-
-  handler(_ref2) {
-    let parser = _ref2.parser,
-        funcName = _ref2.funcName,
-        token = _ref2.token;
-    let replaceWith;
-
-    switch (funcName) {
-      case "\\over":
-        replaceWith = "\\frac";
-        break;
-
-      case "\\choose":
-        replaceWith = "\\binom";
-        break;
-
-      case "\\atop":
-        replaceWith = "\\\\atopfrac";
-        break;
-
-      case "\\brace":
-        replaceWith = "\\\\bracefrac";
-        break;
-
-      case "\\brack":
-        replaceWith = "\\\\brackfrac";
-        break;
-
-      default:
-        throw new Error("Unrecognized infix genfrac command");
-    }
-
-    return {
-      type: "infix",
-      mode: parser.mode,
-      replaceWith,
-      token
-    };
-  }
-
-});
-const stylArray = ["display", "text", "script", "scriptscript"];
-
-const delimFromValue = function delimFromValue(delimString) {
-  let delim = null;
-
-  if (delimString.length > 0) {
-    delim = delimString;
-    delim = delim === "." ? null : delim;
-  }
-
-  return delim;
-};
-
-defineFunction({
-  type: "genfrac",
-  names: ["\\genfrac"],
-  props: {
-    numArgs: 6,
-    greediness: 6,
-    argTypes: ["math", "math", "size", "text", "math", "math"]
-  },
-
-  handler(_ref3, args) {
-    let parser = _ref3.parser;
-    const numer = args[4];
-    const denom = args[5]; // Look into the parse nodes to get the desired delimiters.
-
-    let leftNode = checkNodeType(args[0], "atom");
-
-    if (leftNode) {
-      leftNode = assertAtomFamily(args[0], "open");
-    }
-
-    const leftDelim = leftNode ? delimFromValue(leftNode.text) : null;
-    let rightNode = checkNodeType(args[1], "atom");
-
-    if (rightNode) {
-      rightNode = assertAtomFamily(args[1], "close");
-    }
-
-    const rightDelim = rightNode ? delimFromValue(rightNode.text) : null;
-    const barNode = assertNodeType(args[2], "size");
-    let hasBarLine;
-    let barSize = null;
-
-    if (barNode.isBlank) {
-      // \genfrac acts differently than \above.
-      // \genfrac treats an empty size group as a signal to use a
-      // standard bar size. \above would see size = 0 and omit the bar.
-      hasBarLine = true;
-    } else {
-      barSize = barNode.value;
-      hasBarLine = barSize.number > 0;
-    } // Find out if we want displaystyle, textstyle, etc.
-
-
-    let size = "auto";
-    let styl = checkNodeType(args[3], "ordgroup");
-
-    if (styl) {
-      if (styl.body.length > 0) {
-        const textOrd = assertNodeType(styl.body[0], "textord");
-        size = stylArray[Number(textOrd.text)];
-      }
-    } else {
-      styl = assertNodeType(args[3], "textord");
-      size = stylArray[Number(styl.text)];
-    }
-
-    return {
-      type: "genfrac",
-      mode: parser.mode,
-      numer,
-      denom,
-      continued: false,
-      hasBarLine,
-      barSize,
-      leftDelim,
-      rightDelim,
-      size
-    };
-  },
-
-  htmlBuilder: htmlBuilder$6,
-  mathmlBuilder: mathmlBuilder$6
-}); // \above is an infix fraction that also defines a fraction bar size.
-
-defineFunction({
-  type: "infix",
-  names: ["\\above"],
-  props: {
-    numArgs: 1,
-    argTypes: ["size"],
-    infix: true
-  },
-
-  handler(_ref4, args) {
-    let parser = _ref4.parser,
-        funcName = _ref4.funcName,
-        token = _ref4.token;
-    return {
-      type: "infix",
-      mode: parser.mode,
-      replaceWith: "\\\\abovefrac",
-      size: assertNodeType(args[0], "size").value,
-      token
-    };
-  }
-
-});
-defineFunction({
-  type: "genfrac",
-  names: ["\\\\abovefrac"],
-  props: {
-    numArgs: 3,
-    argTypes: ["math", "size", "math"]
-  },
-  handler: (_ref5, args) => {
-    let parser = _ref5.parser,
-        funcName = _ref5.funcName;
-    const numer = args[0];
-    const barSize = assert(assertNodeType(args[1], "infix").size);
-    const denom = args[2];
-    const hasBarLine = barSize.number > 0;
-    return {
-      type: "genfrac",
-      mode: parser.mode,
-      numer,
-      denom,
-      continued: false,
-      hasBarLine,
-      barSize,
-      leftDelim: null,
-      rightDelim: null,
-      size: "auto"
-    };
-  },
-  htmlBuilder: htmlBuilder$6,
-  mathmlBuilder: mathmlBuilder$6
-});
-
-// NOTE: Unlike most `htmlBuilder`s, this one handles not only "horizBrace", but
-const htmlBuilder$7 = (grp, options) => {
-  const style = options.style; // Pull out the `ParseNode<"horizBrace">` if `grp` is a "supsub" node.
-
-  let supSubGroup;
-  let group;
-  const supSub = checkNodeType(grp, "supsub");
-
-  if (supSub) {
-    // Ref: LaTeX source2e: }}}}\limits}
-    // i.e. LaTeX treats the brace similar to an op and passes it
-    // with \limits, so we need to assign supsub style.
-    supSubGroup = supSub.sup ? buildGroup(supSub.sup, options.havingStyle(style.sup()), options) : buildGroup(supSub.sub, options.havingStyle(style.sub()), options);
-    group = assertNodeType(supSub.base, "horizBrace");
-  } else {
-    group = assertNodeType(grp, "horizBrace");
-  } // Build the base group
-
-
-  const body = buildGroup(group.base, options.havingBaseStyle(Style$1.DISPLAY)); // Create the stretchy element
-
-  const braceBody = stretchy.svgSpan(group, options); // Generate the vlist, with the appropriate kerns        ┏━━━━━━━━┓
-  // This first vlist contains the content and the brace:   equation
-
-  let vlist;
-
-  if (group.isOver) {
-    vlist = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: body
-      }, {
-        type: "kern",
-        size: 0.1
-      }, {
-        type: "elem",
-        elem: braceBody
-      }]
-    }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList.
-
-    vlist.children[0].children[0].children[1].classes.push("svg-align");
-  } else {
-    vlist = buildCommon.makeVList({
-      positionType: "bottom",
-      positionData: body.depth + 0.1 + braceBody.height,
-      children: [{
-        type: "elem",
-        elem: braceBody
-      }, {
-        type: "kern",
-        size: 0.1
-      }, {
-        type: "elem",
-        elem: body
-      }]
-    }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList.
-
-    vlist.children[0].children[0].children[0].classes.push("svg-align");
-  }
-
-  if (supSubGroup) {
-    // To write the supsub, wrap the first vlist in another vlist:
-    // They can't all go in the same vlist, because the note might be
-    // wider than the equation. We want the equation to control the
-    // brace width.
-    //      note          long note           long note
-    //   ┏━━━━━━━━┓   or    ┏━━━┓     not    ┏━━━━━━━━━┓
-    //    equation           eqn                 eqn
-    const vSpan = buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options);
-
-    if (group.isOver) {
-      vlist = buildCommon.makeVList({
-        positionType: "firstBaseline",
-        children: [{
-          type: "elem",
-          elem: vSpan
-        }, {
-          type: "kern",
-          size: 0.2
-        }, {
-          type: "elem",
-          elem: supSubGroup
-        }]
-      }, options);
-    } else {
-      vlist = buildCommon.makeVList({
-        positionType: "bottom",
-        positionData: vSpan.depth + 0.2 + supSubGroup.height + supSubGroup.depth,
-        children: [{
-          type: "elem",
-          elem: supSubGroup
-        }, {
-          type: "kern",
-          size: 0.2
-        }, {
-          type: "elem",
-          elem: vSpan
-        }]
-      }, options);
-    }
-  }
-
-  return buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options);
-};
-
-const mathmlBuilder$7 = (group, options) => {
-  const accentNode = stretchy.mathMLnode(group.label);
-  return new mathMLTree.MathNode(group.isOver ? "mover" : "munder", [buildGroup$1(group.base, options), accentNode]);
-}; // Horizontal stretchy braces
-
-
-defineFunction({
-  type: "horizBrace",
-  names: ["\\overbrace", "\\underbrace"],
-  props: {
-    numArgs: 1
-  },
-
-  handler(_ref, args) {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    return {
-      type: "horizBrace",
-      mode: parser.mode,
-      label: funcName,
-      isOver: /^\\over/.test(funcName),
-      base: args[0]
-    };
-  },
-
-  htmlBuilder: htmlBuilder$7,
-  mathmlBuilder: mathmlBuilder$7
-});
-
-defineFunction({
-  type: "href",
-  names: ["\\href"],
-  props: {
-    numArgs: 2,
-    argTypes: ["url", "original"],
-    allowedInText: true
-  },
-  handler: (_ref, args) => {
-    let parser = _ref.parser;
-    const body = args[1];
-    const href = assertNodeType(args[0], "url").url;
-
-    if (!parser.settings.isTrusted({
-      command: "\\href",
-      url: href
-    })) {
-      return parser.formatUnsupportedCmd("\\href");
-    }
-
-    return {
-      type: "href",
-      mode: parser.mode,
-      href,
-      body: ordargument(body)
-    };
-  },
-  htmlBuilder: (group, options) => {
-    const elements = buildExpression(group.body, options, false);
-    return buildCommon.makeAnchor(group.href, [], elements, options);
-  },
-  mathmlBuilder: (group, options) => {
-    let math = buildExpressionRow(group.body, options);
-
-    if (!(math instanceof MathNode)) {
-      math = new MathNode("mrow", [math]);
-    }
-
-    math.setAttribute("href", group.href);
-    return math;
-  }
-});
-defineFunction({
-  type: "href",
-  names: ["\\url"],
-  props: {
-    numArgs: 1,
-    argTypes: ["url"],
-    allowedInText: true
-  },
-  handler: (_ref2, args) => {
-    let parser = _ref2.parser;
-    const href = assertNodeType(args[0], "url").url;
-
-    if (!parser.settings.isTrusted({
-      command: "\\url",
-      url: href
-    })) {
-      return parser.formatUnsupportedCmd("\\url");
-    }
-
-    const chars = [];
-
-    for (let i = 0; i < href.length; i++) {
-      let c = href[i];
-
-      if (c === "~") {
-        c = "\\textasciitilde";
-      }
-
-      chars.push({
-        type: "textord",
-        mode: "text",
-        text: c
-      });
-    }
-
-    const body = {
-      type: "text",
-      mode: parser.mode,
-      font: "\\texttt",
-      body: chars
-    };
-    return {
-      type: "href",
-      mode: parser.mode,
-      href,
-      body: ordargument(body)
-    };
-  }
-});
-
-defineFunction({
-  type: "htmlmathml",
-  names: ["\\html@mathml"],
-  props: {
-    numArgs: 2,
-    allowedInText: true
-  },
-  handler: (_ref, args) => {
-    let parser = _ref.parser;
-    return {
-      type: "htmlmathml",
-      mode: parser.mode,
-      html: ordargument(args[0]),
-      mathml: ordargument(args[1])
-    };
-  },
-  htmlBuilder: (group, options) => {
-    const elements = buildExpression(group.html, options, false);
-    return buildCommon.makeFragment(elements);
-  },
-  mathmlBuilder: (group, options) => {
-    return buildExpressionRow(group.mathml, options);
-  }
-});
-
-const sizeData = function sizeData(str) {
-  if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(str)) {
-    // str is a number with no unit specified.
-    // default unit is bp, per graphix package.
-    return {
-      number: +str,
-      unit: "bp"
-    };
-  } else {
-    const match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(str);
-
-    if (!match) {
-      throw new ParseError("Invalid size: '" + str + "' in \\includegraphics");
-    }
-
-    const data = {
-      number: +(match[1] + match[2]),
-      // sign + magnitude, cast to number
-      unit: match[3]
-    };
-
-    if (!validUnit(data)) {
-      throw new ParseError("Invalid unit: '" + data.unit + "' in \\includegraphics.");
-    }
-
-    return data;
-  }
-};
-
-defineFunction({
-  type: "includegraphics",
-  names: ["\\includegraphics"],
-  props: {
-    numArgs: 1,
-    numOptionalArgs: 1,
-    argTypes: ["raw", "url"],
-    allowedInText: false
-  },
-  handler: (_ref, args, optArgs) => {
-    let parser = _ref.parser;
-    let width = {
-      number: 0,
-      unit: "em"
-    };
-    let height = {
-      number: 0.9,
-      unit: "em"
-    }; // sorta character sized.
-
-    let totalheight = {
-      number: 0,
-      unit: "em"
-    };
-    let alt = "";
-
-    if (optArgs[0]) {
-      const attributeStr = assertNodeType(optArgs[0], "raw").string; // Parser.js does not parse key/value pairs. We get a string.
-
-      const attributes = attributeStr.split(",");
-
-      for (let i = 0; i < attributes.length; i++) {
-        const keyVal = attributes[i].split("=");
-
-        if (keyVal.length === 2) {
-          const str = keyVal[1].trim();
-
-          switch (keyVal[0].trim()) {
-            case "alt":
-              alt = str;
-              break;
-
-            case "width":
-              width = sizeData(str);
-              break;
-
-            case "height":
-              height = sizeData(str);
-              break;
-
-            case "totalheight":
-              totalheight = sizeData(str);
-              break;
-
-            default:
-              throw new ParseError("Invalid key: '" + keyVal[0] + "' in \\includegraphics.");
-          }
-        }
-      }
-    }
-
-    const src = assertNodeType(args[0], "url").url;
-
-    if (alt === "") {
-      // No alt given. Use the file name. Strip away the path.
-      alt = src;
-      alt = alt.replace(/^.*[\\/]/, '');
-      alt = alt.substring(0, alt.lastIndexOf('.'));
-    }
-
-    if (!parser.settings.isTrusted({
-      command: "\\includegraphics",
-      url: src
-    })) {
-      return parser.formatUnsupportedCmd("\\includegraphics");
-    }
-
-    return {
-      type: "includegraphics",
-      mode: parser.mode,
-      alt: alt,
-      width: width,
-      height: height,
-      totalheight: totalheight,
-      src: src
-    };
-  },
-  htmlBuilder: (group, options) => {
-    const height = calculateSize(group.height, options);
-    let depth = 0;
-
-    if (group.totalheight.number > 0) {
-      depth = calculateSize(group.totalheight, options) - height;
-      depth = Number(depth.toFixed(2));
-    }
-
-    let width = 0;
-
-    if (group.width.number > 0) {
-      width = calculateSize(group.width, options);
-    }
-
-    const style = {
-      height: height + depth + "em"
-    };
-
-    if (width > 0) {
-      style.width = width + "em";
-    }
-
-    if (depth > 0) {
-      style.verticalAlign = -depth + "em";
-    }
-
-    const node = new Img(group.src, group.alt, style);
-    node.height = height;
-    node.depth = depth;
-    return node;
-  },
-  mathmlBuilder: (group, options) => {
-    const node = new mathMLTree.MathNode("mglyph", []);
-    node.setAttribute("alt", group.alt);
-    const height = calculateSize(group.height, options);
-    let depth = 0;
-
-    if (group.totalheight.number > 0) {
-      depth = calculateSize(group.totalheight, options) - height;
-      depth = depth.toFixed(2);
-      node.setAttribute("valign", "-" + depth + "em");
-    }
-
-    node.setAttribute("height", height + depth + "em");
-
-    if (group.width.number > 0) {
-      const width = calculateSize(group.width, options);
-      node.setAttribute("width", width + "em");
-    }
-
-    node.setAttribute("src", group.src);
-    return node;
-  }
-});
-
-// Horizontal spacing commands
-
-defineFunction({
-  type: "kern",
-  names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"],
-  props: {
-    numArgs: 1,
-    argTypes: ["size"],
-    allowedInText: true
-  },
-
-  handler(_ref, args) {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    const size = assertNodeType(args[0], "size");
-
-    if (parser.settings.strict) {
-      const mathFunction = funcName[1] === 'm'; // \mkern, \mskip
-
-      const muUnit = size.value.unit === 'mu';
-
-      if (mathFunction) {
-        if (!muUnit) {
-          parser.settings.reportNonstrict("mathVsTextUnits", `LaTeX's ${funcName} supports only mu units, ` + `not ${size.value.unit} units`);
-        }
-
-        if (parser.mode !== "math") {
-          parser.settings.reportNonstrict("mathVsTextUnits", `LaTeX's ${funcName} works only in math mode`);
-        }
-      } else {
-        // !mathFunction
-        if (muUnit) {
-          parser.settings.reportNonstrict("mathVsTextUnits", `LaTeX's ${funcName} doesn't support mu units`);
-        }
-      }
-    }
-
-    return {
-      type: "kern",
-      mode: parser.mode,
-      dimension: size.value
-    };
-  },
-
-  htmlBuilder(group, options) {
-    return buildCommon.makeGlue(group.dimension, options);
-  },
-
-  mathmlBuilder(group, options) {
-    const dimension = calculateSize(group.dimension, options);
-    return new mathMLTree.SpaceNode(dimension);
-  }
-
-});
-
-// Horizontal overlap functions
-defineFunction({
-  type: "lap",
-  names: ["\\mathllap", "\\mathrlap", "\\mathclap"],
-  props: {
-    numArgs: 1,
-    allowedInText: true
-  },
-  handler: (_ref, args) => {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    const body = args[0];
-    return {
-      type: "lap",
-      mode: parser.mode,
-      alignment: funcName.slice(5),
-      body
-    };
-  },
-  htmlBuilder: (group, options) => {
-    // mathllap, mathrlap, mathclap
-    let inner;
-
-    if (group.alignment === "clap") {
-      // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/
-      inner = buildCommon.makeSpan([], [buildGroup(group.body, options)]); // wrap, since CSS will center a .clap > .inner > span
-
-      inner = buildCommon.makeSpan(["inner"], [inner], options);
-    } else {
-      inner = buildCommon.makeSpan(["inner"], [buildGroup(group.body, options)]);
-    }
-
-    const fix = buildCommon.makeSpan(["fix"], []);
-    let node = buildCommon.makeSpan([group.alignment], [inner, fix], options); // At this point, we have correctly set horizontal alignment of the
-    // two items involved in the lap.
-    // Next, use a strut to set the height of the HTML bounding box.
-    // Otherwise, a tall argument may be misplaced.
-
-    const strut = buildCommon.makeSpan(["strut"]);
-    strut.style.height = node.height + node.depth + "em";
-    strut.style.verticalAlign = -node.depth + "em";
-    node.children.unshift(strut); // Next, prevent vertical misplacement when next to something tall.
-
-    node = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: node
-      }]
-    }, options); // Get the horizontal spacing correct relative to adjacent items.
-
-    return buildCommon.makeSpan(["mord"], [node], options);
-  },
-  mathmlBuilder: (group, options) => {
-    // mathllap, mathrlap, mathclap
-    const node = new mathMLTree.MathNode("mpadded", [buildGroup$1(group.body, options)]);
-
-    if (group.alignment !== "rlap") {
-      const offset = group.alignment === "llap" ? "-1" : "-0.5";
-      node.setAttribute("lspace", offset + "width");
-    }
-
-    node.setAttribute("width", "0px");
-    return node;
-  }
-});
-
-defineFunction({
-  type: "styling",
-  names: ["\\(", "$"],
-  props: {
-    numArgs: 0,
-    allowedInText: true,
-    allowedInMath: false
-  },
-
-  handler(_ref, args) {
-    let funcName = _ref.funcName,
-        parser = _ref.parser;
-    const outerMode = parser.mode;
-    parser.switchMode("math");
-    const close = funcName === "\\(" ? "\\)" : "$";
-    const body = parser.parseExpression(false, close);
-    parser.expect(close);
-    parser.switchMode(outerMode);
-    return {
-      type: "styling",
-      mode: parser.mode,
-      style: "text",
-      body
-    };
-  }
-
-}); // Check for extra closing math delimiters
-
-defineFunction({
-  type: "text",
-  // Doesn't matter what this is.
-  names: ["\\)", "\\]"],
-  props: {
-    numArgs: 0,
-    allowedInText: true,
-    allowedInMath: false
-  },
-
-  handler(context, args) {
-    throw new ParseError(`Mismatched ${context.funcName}`);
-  }
-
-});
-
-const chooseMathStyle = (group, options) => {
-  switch (options.style.size) {
-    case Style$1.DISPLAY.size:
-      return group.display;
-
-    case Style$1.TEXT.size:
-      return group.text;
-
-    case Style$1.SCRIPT.size:
-      return group.script;
-
-    case Style$1.SCRIPTSCRIPT.size:
-      return group.scriptscript;
-
-    default:
-      return group.text;
-  }
-};
-
-defineFunction({
-  type: "mathchoice",
-  names: ["\\mathchoice"],
-  props: {
-    numArgs: 4
-  },
-  handler: (_ref, args) => {
-    let parser = _ref.parser;
-    return {
-      type: "mathchoice",
-      mode: parser.mode,
-      display: ordargument(args[0]),
-      text: ordargument(args[1]),
-      script: ordargument(args[2]),
-      scriptscript: ordargument(args[3])
-    };
-  },
-  htmlBuilder: (group, options) => {
-    const body = chooseMathStyle(group, options);
-    const elements = buildExpression(body, options, false);
-    return buildCommon.makeFragment(elements);
-  },
-  mathmlBuilder: (group, options) => {
-    const body = chooseMathStyle(group, options);
-    return buildExpressionRow(body, options);
-  }
-});
-
-// For an operator with limits, assemble the base, sup, and sub into a span.
-const assembleSupSub = (base, supGroup, subGroup, options, style, slant, baseShift) => {
-  // IE 8 clips \int if it is in a display: inline-block. We wrap it
-  // in a new span so it is an inline, and works.
-  base = buildCommon.makeSpan([], [base]);
-  let sub;
-  let sup; // We manually have to handle the superscripts and subscripts. This,
-  // aside from the kern calculations, is copied from supsub.
-
-  if (supGroup) {
-    const elem = buildGroup(supGroup, options.havingStyle(style.sup()), options);
-    sup = {
-      elem,
-      kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth)
-    };
-  }
-
-  if (subGroup) {
-    const elem = buildGroup(subGroup, options.havingStyle(style.sub()), options);
-    sub = {
-      elem,
-      kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - elem.height)
-    };
-  } // Build the final group as a vlist of the possible subscript, base,
-  // and possible superscript.
-
-
-  let finalGroup;
-
-  if (sup && sub) {
-    const bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift;
-    finalGroup = buildCommon.makeVList({
-      positionType: "bottom",
-      positionData: bottom,
-      children: [{
-        type: "kern",
-        size: options.fontMetrics().bigOpSpacing5
-      }, {
-        type: "elem",
-        elem: sub.elem,
-        marginLeft: -slant + "em"
-      }, {
-        type: "kern",
-        size: sub.kern
-      }, {
-        type: "elem",
-        elem: base
-      }, {
-        type: "kern",
-        size: sup.kern
-      }, {
-        type: "elem",
-        elem: sup.elem,
-        marginLeft: slant + "em"
-      }, {
-        type: "kern",
-        size: options.fontMetrics().bigOpSpacing5
-      }]
-    }, options);
-  } else if (sub) {
-    const top = base.height - baseShift; // Shift the limits by the slant of the symbol. Note
-    // that we are supposed to shift the limits by 1/2 of the slant,
-    // but since we are centering the limits adding a full slant of
-    // margin will shift by 1/2 that.
-
-    finalGroup = buildCommon.makeVList({
-      positionType: "top",
-      positionData: top,
-      children: [{
-        type: "kern",
-        size: options.fontMetrics().bigOpSpacing5
-      }, {
-        type: "elem",
-        elem: sub.elem,
-        marginLeft: -slant + "em"
-      }, {
-        type: "kern",
-        size: sub.kern
-      }, {
-        type: "elem",
-        elem: base
-      }]
-    }, options);
-  } else if (sup) {
-    const bottom = base.depth + baseShift;
-    finalGroup = buildCommon.makeVList({
-      positionType: "bottom",
-      positionData: bottom,
-      children: [{
-        type: "elem",
-        elem: base
-      }, {
-        type: "kern",
-        size: sup.kern
-      }, {
-        type: "elem",
-        elem: sup.elem,
-        marginLeft: slant + "em"
-      }, {
-        type: "kern",
-        size: options.fontMetrics().bigOpSpacing5
-      }]
-    }, options);
-  } else {
-    // This case probably shouldn't occur (this would mean the
-    // supsub was sending us a group with no superscript or
-    // subscript) but be safe.
-    return base;
-  }
-
-  return buildCommon.makeSpan(["mop", "op-limits"], [finalGroup], options);
-};
-
-// Limits, symbols
-// Most operators have a large successor symbol, but these don't.
-const noSuccessor = ["\\smallint"]; // NOTE: Unlike most `htmlBuilder`s, this one handles not only "op", but also
-// "supsub" since some of them (like \int) can affect super/subscripting.
-
-const htmlBuilder$8 = (grp, options) => {
-  // Operators are handled in the TeXbook pg. 443-444, rule 13(a).
-  let supGroup;
-  let subGroup;
-  let hasLimits = false;
-  let group;
-  const supSub = checkNodeType(grp, "supsub");
-
-  if (supSub) {
-    // If we have limits, supsub will pass us its group to handle. Pull
-    // out the superscript and subscript and set the group to the op in
-    // its base.
-    supGroup = supSub.sup;
-    subGroup = supSub.sub;
-    group = assertNodeType(supSub.base, "op");
-    hasLimits = true;
-  } else {
-    group = assertNodeType(grp, "op");
-  }
-
-  const style = options.style;
-  let large = false;
-
-  if (style.size === Style$1.DISPLAY.size && group.symbol && !utils.contains(noSuccessor, group.name)) {
-    // Most symbol operators get larger in displaystyle (rule 13)
-    large = true;
-  }
-
-  let base;
-
-  if (group.symbol) {
-    // If this is a symbol, create the symbol.
-    const fontName = large ? "Size2-Regular" : "Size1-Regular";
-    let stash = "";
-
-    if (group.name === "\\oiint" || group.name === "\\oiiint") {
-      // No font glyphs yet, so use a glyph w/o the oval.
-      // TODO: When font glyphs are available, delete this code.
-      stash = group.name.substr(1); // $FlowFixMe
-
-      group.name = stash === "oiint" ? "\\iint" : "\\iiint";
-    }
-
-    base = buildCommon.makeSymbol(group.name, fontName, "math", options, ["mop", "op-symbol", large ? "large-op" : "small-op"]);
-
-    if (stash.length > 0) {
-      // We're in \oiint or \oiiint. Overlay the oval.
-      // TODO: When font glyphs are available, delete this code.
-      const italic = base.italic;
-      const oval = buildCommon.staticSvg(stash + "Size" + (large ? "2" : "1"), options);
-      base = buildCommon.makeVList({
-        positionType: "individualShift",
-        children: [{
-          type: "elem",
-          elem: base,
-          shift: 0
-        }, {
-          type: "elem",
-          elem: oval,
-          shift: large ? 0.08 : 0
-        }]
-      }, options); // $FlowFixMe
-
-      group.name = "\\" + stash;
-      base.classes.unshift("mop"); // $FlowFixMe
-
-      base.italic = italic;
-    }
-  } else if (group.body) {
-    // If this is a list, compose that list.
-    const inner = buildExpression(group.body, options, true);
-
-    if (inner.length === 1 && inner[0] instanceof SymbolNode) {
-      base = inner[0];
-      base.classes[0] = "mop"; // replace old mclass
-    } else {
-      base = buildCommon.makeSpan(["mop"], buildCommon.tryCombineChars(inner), options);
-    }
-  } else {
-    // Otherwise, this is a text operator. Build the text from the
-    // operator's name.
-    // TODO(emily): Add a space in the middle of some of these
-    // operators, like \limsup
-    const output = [];
-
-    for (let i = 1; i < group.name.length; i++) {
-      output.push(buildCommon.mathsym(group.name[i], group.mode, options));
-    }
-
-    base = buildCommon.makeSpan(["mop"], output, options);
-  } // If content of op is a single symbol, shift it vertically.
-
-
-  let baseShift = 0;
-  let slant = 0;
-
-  if ((base instanceof SymbolNode || group.name === "\\oiint" || group.name === "\\oiiint") && !group.suppressBaseShift) {
-    // We suppress the shift of the base of \overset and \underset. Otherwise,
-    // shift the symbol so its center lies on the axis (rule 13). It
-    // appears that our fonts have the centers of the symbols already
-    // almost on the axis, so these numbers are very small. Note we
-    // don't actually apply this here, but instead it is used either in
-    // the vlist creation or separately when there are no limits.
-    baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight; // The slant of the symbol is just its italic correction.
-    // $FlowFixMe
-
-    slant = base.italic;
-  }
-
-  if (hasLimits) {
-    return assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift);
-  } else {
-    if (baseShift) {
-      base.style.position = "relative";
-      base.style.top = baseShift + "em";
-    }
-
-    return base;
-  }
-};
-
-const mathmlBuilder$8 = (group, options) => {
-  let node;
-
-  if (group.symbol) {
-    // This is a symbol. Just add the symbol.
-    node = new MathNode("mo", [makeText(group.name, group.mode)]);
-
-    if (utils.contains(noSuccessor, group.name)) {
-      node.setAttribute("largeop", "false");
-    }
-  } else if (group.body) {
-    // This is an operator with children. Add them.
-    node = new MathNode("mo", buildExpression$1(group.body, options));
-  } else {
-    // This is a text operator. Add all of the characters from the
-    // operator's name.
-    node = new MathNode("mi", [new TextNode(group.name.slice(1))]); // Append an <mo>&ApplyFunction;</mo>.
-    // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4
-
-    const operator = new MathNode("mo", [makeText("\u2061", "text")]);
-
-    if (group.parentIsSupSub) {
-      node = new MathNode("mo", [node, operator]);
-    } else {
-      node = newDocumentFragment([node, operator]);
-    }
-  }
-
-  return node;
-};
-
-const singleCharBigOps = {
-  "\u220F": "\\prod",
-  "\u2210": "\\coprod",
-  "\u2211": "\\sum",
-  "\u22c0": "\\bigwedge",
-  "\u22c1": "\\bigvee",
-  "\u22c2": "\\bigcap",
-  "\u22c3": "\\bigcup",
-  "\u2a00": "\\bigodot",
-  "\u2a01": "\\bigoplus",
-  "\u2a02": "\\bigotimes",
-  "\u2a04": "\\biguplus",
-  "\u2a06": "\\bigsqcup"
-};
-defineFunction({
-  type: "op",
-  names: ["\\coprod", "\\bigvee", "\\bigwedge", "\\biguplus", "\\bigcap", "\\bigcup", "\\intop", "\\prod", "\\sum", "\\bigotimes", "\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint", "\u220F", "\u2210", "\u2211", "\u22c0", "\u22c1", "\u22c2", "\u22c3", "\u2a00", "\u2a01", "\u2a02", "\u2a04", "\u2a06"],
-  props: {
-    numArgs: 0
-  },
-  handler: (_ref, args) => {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    let fName = funcName;
-
-    if (fName.length === 1) {
-      fName = singleCharBigOps[fName];
-    }
-
-    return {
-      type: "op",
-      mode: parser.mode,
-      limits: true,
-      parentIsSupSub: false,
-      symbol: true,
-      name: fName
-    };
-  },
-  htmlBuilder: htmlBuilder$8,
-  mathmlBuilder: mathmlBuilder$8
-}); // Note: calling defineFunction with a type that's already been defined only
-// works because the same htmlBuilder and mathmlBuilder are being used.
-
-defineFunction({
-  type: "op",
-  names: ["\\mathop"],
-  props: {
-    numArgs: 1
-  },
-  handler: (_ref2, args) => {
-    let parser = _ref2.parser;
-    const body = args[0];
-    return {
-      type: "op",
-      mode: parser.mode,
-      limits: false,
-      parentIsSupSub: false,
-      symbol: false,
-      body: ordargument(body)
-    };
-  },
-  htmlBuilder: htmlBuilder$8,
-  mathmlBuilder: mathmlBuilder$8
-}); // There are 2 flags for operators; whether they produce limits in
-// displaystyle, and whether they are symbols and should grow in
-// displaystyle. These four groups cover the four possible choices.
-
-const singleCharIntegrals = {
-  "\u222b": "\\int",
-  "\u222c": "\\iint",
-  "\u222d": "\\iiint",
-  "\u222e": "\\oint",
-  "\u222f": "\\oiint",
-  "\u2230": "\\oiiint"
-}; // No limits, not symbols
-
-defineFunction({
-  type: "op",
-  names: ["\\arcsin", "\\arccos", "\\arctan", "\\arctg", "\\arcctg", "\\arg", "\\ch", "\\cos", "\\cosec", "\\cosh", "\\cot", "\\cotg", "\\coth", "\\csc", "\\ctg", "\\cth", "\\deg", "\\dim", "\\exp", "\\hom", "\\ker", "\\lg", "\\ln", "\\log", "\\sec", "\\sin", "\\sinh", "\\sh", "\\tan", "\\tanh", "\\tg", "\\th"],
-  props: {
-    numArgs: 0
-  },
-
-  handler(_ref3) {
-    let parser = _ref3.parser,
-        funcName = _ref3.funcName;
-    return {
-      type: "op",
-      mode: parser.mode,
-      limits: false,
-      parentIsSupSub: false,
-      symbol: false,
-      name: funcName
-    };
-  },
-
-  htmlBuilder: htmlBuilder$8,
-  mathmlBuilder: mathmlBuilder$8
-}); // Limits, not symbols
-
-defineFunction({
-  type: "op",
-  names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"],
-  props: {
-    numArgs: 0
-  },
-
-  handler(_ref4) {
-    let parser = _ref4.parser,
-        funcName = _ref4.funcName;
-    return {
-      type: "op",
-      mode: parser.mode,
-      limits: true,
-      parentIsSupSub: false,
-      symbol: false,
-      name: funcName
-    };
-  },
-
-  htmlBuilder: htmlBuilder$8,
-  mathmlBuilder: mathmlBuilder$8
-}); // No limits, symbols
-
-defineFunction({
-  type: "op",
-  names: ["\\int", "\\iint", "\\iiint", "\\oint", "\\oiint", "\\oiiint", "\u222b", "\u222c", "\u222d", "\u222e", "\u222f", "\u2230"],
-  props: {
-    numArgs: 0
-  },
-
-  handler(_ref5) {
-    let parser = _ref5.parser,
-        funcName = _ref5.funcName;
-    let fName = funcName;
-
-    if (fName.length === 1) {
-      fName = singleCharIntegrals[fName];
-    }
-
-    return {
-      type: "op",
-      mode: parser.mode,
-      limits: false,
-      parentIsSupSub: false,
-      symbol: true,
-      name: fName
-    };
-  },
-
-  htmlBuilder: htmlBuilder$8,
-  mathmlBuilder: mathmlBuilder$8
-});
-
-// NOTE: Unlike most `htmlBuilder`s, this one handles not only
-// "operatorname", but also  "supsub" since \operatorname* can
-const htmlBuilder$9 = (grp, options) => {
-  // Operators are handled in the TeXbook pg. 443-444, rule 13(a).
-  let supGroup;
-  let subGroup;
-  let hasLimits = false;
-  let group;
-  const supSub = checkNodeType(grp, "supsub");
-
-  if (supSub) {
-    // If we have limits, supsub will pass us its group to handle. Pull
-    // out the superscript and subscript and set the group to the op in
-    // its base.
-    supGroup = supSub.sup;
-    subGroup = supSub.sub;
-    group = assertNodeType(supSub.base, "operatorname");
-    hasLimits = true;
-  } else {
-    group = assertNodeType(grp, "operatorname");
-  }
-
-  let base;
-
-  if (group.body.length > 0) {
-    const body = group.body.map(child => {
-      // $FlowFixMe: Check if the node has a string `text` property.
-      const childText = child.text;
-
-      if (typeof childText === "string") {
-        return {
-          type: "textord",
-          mode: child.mode,
-          text: childText
-        };
-      } else {
-        return child;
-      }
-    }); // Consolidate function names into symbol characters.
-
-    const expression = buildExpression(body, options.withFont("mathrm"), true);
-
-    for (let i = 0; i < expression.length; i++) {
-      const child = expression[i];
-
-      if (child instanceof SymbolNode) {
-        // Per amsopn package,
-        // change minus to hyphen and \ast to asterisk
-        child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*");
-      }
-    }
-
-    base = buildCommon.makeSpan(["mop"], expression, options);
-  } else {
-    base = buildCommon.makeSpan(["mop"], [], options);
-  }
-
-  if (hasLimits) {
-    return assembleSupSub(base, supGroup, subGroup, options, options.style, 0, 0);
-  } else {
-    return base;
-  }
-};
-
-const mathmlBuilder$9 = (group, options) => {
-  // The steps taken here are similar to the html version.
-  let expression = buildExpression$1(group.body, options.withFont("mathrm")); // Is expression a string or has it something like a fraction?
-
-  let isAllString = true; // default
-
-  for (let i = 0; i < expression.length; i++) {
-    const node = expression[i];
-
-    if (node instanceof mathMLTree.SpaceNode) ; else if (node instanceof mathMLTree.MathNode) {
-      switch (node.type) {
-        case "mi":
-        case "mn":
-        case "ms":
-        case "mspace":
-        case "mtext":
-          break;
-        // Do nothing yet.
-
-        case "mo":
-          {
-            const child = node.children[0];
-
-            if (node.children.length === 1 && child instanceof mathMLTree.TextNode) {
-              child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*");
-            } else {
-              isAllString = false;
-            }
-
-            break;
-          }
-
-        default:
-          isAllString = false;
-      }
-    } else {
-      isAllString = false;
-    }
-  }
-
-  if (isAllString) {
-    // Write a single TextNode instead of multiple nested tags.
-    const word = expression.map(node => node.toText()).join("");
-    expression = [new mathMLTree.TextNode(word)];
-  }
-
-  const identifier = new mathMLTree.MathNode("mi", expression);
-  identifier.setAttribute("mathvariant", "normal"); // \u2061 is the same as &ApplyFunction;
-  // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp
-
-  const operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]);
-
-  if (group.parentIsSupSub) {
-    return new mathMLTree.MathNode("mo", [identifier, operator]);
-  } else {
-    return mathMLTree.newDocumentFragment([identifier, operator]);
-  }
-}; // \operatorname
-// amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@
-
-
-defineFunction({
-  type: "operatorname",
-  names: ["\\operatorname", "\\operatorname*"],
-  props: {
-    numArgs: 1
-  },
-  handler: (_ref, args) => {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    const body = args[0];
-    return {
-      type: "operatorname",
-      mode: parser.mode,
-      body: ordargument(body),
-      alwaysHandleSupSub: funcName === "\\operatorname*",
-      limits: false,
-      parentIsSupSub: false
-    };
-  },
-  htmlBuilder: htmlBuilder$9,
-  mathmlBuilder: mathmlBuilder$9
-});
-
-defineFunctionBuilders({
-  type: "ordgroup",
-
-  htmlBuilder(group, options) {
-    if (group.semisimple) {
-      return buildCommon.makeFragment(buildExpression(group.body, options, false));
-    }
-
-    return buildCommon.makeSpan(["mord"], buildExpression(group.body, options, true), options);
-  },
-
-  mathmlBuilder(group, options) {
-    return buildExpressionRow(group.body, options, true);
-  }
-
-});
-
-defineFunction({
-  type: "overline",
-  names: ["\\overline"],
-  props: {
-    numArgs: 1
-  },
-
-  handler(_ref, args) {
-    let parser = _ref.parser;
-    const body = args[0];
-    return {
-      type: "overline",
-      mode: parser.mode,
-      body
-    };
-  },
-
-  htmlBuilder(group, options) {
-    // Overlines are handled in the TeXbook pg 443, Rule 9.
-    // Build the inner group in the cramped style.
-    const innerGroup = buildGroup(group.body, options.havingCrampedStyle()); // Create the line above the body
-
-    const line = buildCommon.makeLineSpan("overline-line", options); // Generate the vlist, with the appropriate kerns
-
-    const defaultRuleThickness = options.fontMetrics().defaultRuleThickness;
-    const vlist = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: innerGroup
-      }, {
-        type: "kern",
-        size: 3 * defaultRuleThickness
-      }, {
-        type: "elem",
-        elem: line
-      }, {
-        type: "kern",
-        size: defaultRuleThickness
-      }]
-    }, options);
-    return buildCommon.makeSpan(["mord", "overline"], [vlist], options);
-  },
-
-  mathmlBuilder(group, options) {
-    const operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203e")]);
-    operator.setAttribute("stretchy", "true");
-    const node = new mathMLTree.MathNode("mover", [buildGroup$1(group.body, options), operator]);
-    node.setAttribute("accent", "true");
-    return node;
-  }
-
-});
-
-defineFunction({
-  type: "phantom",
-  names: ["\\phantom"],
-  props: {
-    numArgs: 1,
-    allowedInText: true
-  },
-  handler: (_ref, args) => {
-    let parser = _ref.parser;
-    const body = args[0];
-    return {
-      type: "phantom",
-      mode: parser.mode,
-      body: ordargument(body)
-    };
-  },
-  htmlBuilder: (group, options) => {
-    const elements = buildExpression(group.body, options.withPhantom(), false); // \phantom isn't supposed to affect the elements it contains.
-    // See "color" for more details.
-
-    return buildCommon.makeFragment(elements);
-  },
-  mathmlBuilder: (group, options) => {
-    const inner = buildExpression$1(group.body, options);
-    return new mathMLTree.MathNode("mphantom", inner);
-  }
-});
-defineFunction({
-  type: "hphantom",
-  names: ["\\hphantom"],
-  props: {
-    numArgs: 1,
-    allowedInText: true
-  },
-  handler: (_ref2, args) => {
-    let parser = _ref2.parser;
-    const body = args[0];
-    return {
-      type: "hphantom",
-      mode: parser.mode,
-      body
-    };
-  },
-  htmlBuilder: (group, options) => {
-    let node = buildCommon.makeSpan([], [buildGroup(group.body, options.withPhantom())]);
-    node.height = 0;
-    node.depth = 0;
-
-    if (node.children) {
-      for (let i = 0; i < node.children.length; i++) {
-        node.children[i].height = 0;
-        node.children[i].depth = 0;
-      }
-    } // See smash for comment re: use of makeVList
-
-
-    node = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: node
-      }]
-    }, options); // For spacing, TeX treats \smash as a math group (same spacing as ord).
-
-    return buildCommon.makeSpan(["mord"], [node], options);
-  },
-  mathmlBuilder: (group, options) => {
-    const inner = buildExpression$1(ordargument(group.body), options);
-    const phantom = new mathMLTree.MathNode("mphantom", inner);
-    const node = new mathMLTree.MathNode("mpadded", [phantom]);
-    node.setAttribute("height", "0px");
-    node.setAttribute("depth", "0px");
-    return node;
-  }
-});
-defineFunction({
-  type: "vphantom",
-  names: ["\\vphantom"],
-  props: {
-    numArgs: 1,
-    allowedInText: true
-  },
-  handler: (_ref3, args) => {
-    let parser = _ref3.parser;
-    const body = args[0];
-    return {
-      type: "vphantom",
-      mode: parser.mode,
-      body
-    };
-  },
-  htmlBuilder: (group, options) => {
-    const inner = buildCommon.makeSpan(["inner"], [buildGroup(group.body, options.withPhantom())]);
-    const fix = buildCommon.makeSpan(["fix"], []);
-    return buildCommon.makeSpan(["mord", "rlap"], [inner, fix], options);
-  },
-  mathmlBuilder: (group, options) => {
-    const inner = buildExpression$1(ordargument(group.body), options);
-    const phantom = new mathMLTree.MathNode("mphantom", inner);
-    const node = new mathMLTree.MathNode("mpadded", [phantom]);
-    node.setAttribute("width", "0px");
-    return node;
-  }
-});
-
-defineFunction({
-  type: "raisebox",
-  names: ["\\raisebox"],
-  props: {
-    numArgs: 2,
-    argTypes: ["size", "hbox"],
-    allowedInText: true
-  },
-
-  handler(_ref, args) {
-    let parser = _ref.parser;
-    const amount = assertNodeType(args[0], "size").value;
-    const body = args[1];
-    return {
-      type: "raisebox",
-      mode: parser.mode,
-      dy: amount,
-      body
-    };
-  },
-
-  htmlBuilder(group, options) {
-    const body = buildGroup(group.body, options);
-    const dy = calculateSize(group.dy, options);
-    return buildCommon.makeVList({
-      positionType: "shift",
-      positionData: -dy,
-      children: [{
-        type: "elem",
-        elem: body
-      }]
-    }, options);
-  },
-
-  mathmlBuilder(group, options) {
-    const node = new mathMLTree.MathNode("mpadded", [buildGroup$1(group.body, options)]);
-    const dy = group.dy.number + group.dy.unit;
-    node.setAttribute("voffset", dy);
-    return node;
-  }
-
-});
-
-defineFunction({
-  type: "rule",
-  names: ["\\rule"],
-  props: {
-    numArgs: 2,
-    numOptionalArgs: 1,
-    argTypes: ["size", "size", "size"]
-  },
-
-  handler(_ref, args, optArgs) {
-    let parser = _ref.parser;
-    const shift = optArgs[0];
-    const width = assertNodeType(args[0], "size");
-    const height = assertNodeType(args[1], "size");
-    return {
-      type: "rule",
-      mode: parser.mode,
-      shift: shift && assertNodeType(shift, "size").value,
-      width: width.value,
-      height: height.value
-    };
-  },
-
-  htmlBuilder(group, options) {
-    // Make an empty span for the rule
-    const rule = buildCommon.makeSpan(["mord", "rule"], [], options); // Calculate the shift, width, and height of the rule, and account for units
-
-    const width = calculateSize(group.width, options);
-    const height = calculateSize(group.height, options);
-    const shift = group.shift ? calculateSize(group.shift, options) : 0; // Style the rule to the right size
-
-    rule.style.borderRightWidth = width + "em";
-    rule.style.borderTopWidth = height + "em";
-    rule.style.bottom = shift + "em"; // Record the height and width
-
-    rule.width = width;
-    rule.height = height + shift;
-    rule.depth = -shift; // Font size is the number large enough that the browser will
-    // reserve at least `absHeight` space above the baseline.
-    // The 1.125 factor was empirically determined
-
-    rule.maxFontSize = height * 1.125 * options.sizeMultiplier;
-    return rule;
-  },
-
-  mathmlBuilder(group, options) {
-    const width = calculateSize(group.width, options);
-    const height = calculateSize(group.height, options);
-    const shift = group.shift ? calculateSize(group.shift, options) : 0;
-    const color = options.color && options.getColor() || "black";
-    const rule = new mathMLTree.MathNode("mspace");
-    rule.setAttribute("mathbackground", color);
-    rule.setAttribute("width", width + "em");
-    rule.setAttribute("height", height + "em");
-    const wrapper = new mathMLTree.MathNode("mpadded", [rule]);
-
-    if (shift >= 0) {
-      wrapper.setAttribute("height", "+" + shift + "em");
-    } else {
-      wrapper.setAttribute("height", shift + "em");
-      wrapper.setAttribute("depth", "+" + -shift + "em");
-    }
-
-    wrapper.setAttribute("voffset", shift + "em");
-    return wrapper;
-  }
-
-});
-
-function sizingGroup(value, options, baseOptions) {
-  const inner = buildExpression(value, options, false);
-  const multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; // Add size-resetting classes to the inner list and set maxFontSize
-  // manually. Handle nested size changes.
-
-  for (let i = 0; i < inner.length; i++) {
-    const pos = inner[i].classes.indexOf("sizing");
-
-    if (pos < 0) {
-      Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions));
-    } else if (inner[i].classes[pos + 1] === "reset-size" + options.size) {
-      // This is a nested size change: e.g., inner[i] is the "b" in
-      // `\Huge a \small b`. Override the old size (the `reset-` class)
-      // but not the new size.
-      inner[i].classes[pos + 1] = "reset-size" + baseOptions.size;
-    }
-
-    inner[i].height *= multiplier;
-    inner[i].depth *= multiplier;
-  }
-
-  return buildCommon.makeFragment(inner);
-}
-const sizeFuncs = ["\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"];
-const htmlBuilder$a = (group, options) => {
-  // Handle sizing operators like \Huge. Real TeX doesn't actually allow
-  // these functions inside of math expressions, so we do some special
-  // handling.
-  const newOptions = options.havingSize(group.size);
-  return sizingGroup(group.body, newOptions, options);
-};
-defineFunction({
-  type: "sizing",
-  names: sizeFuncs,
-  props: {
-    numArgs: 0,
-    allowedInText: true
-  },
-  handler: (_ref, args) => {
-    let breakOnTokenText = _ref.breakOnTokenText,
-        funcName = _ref.funcName,
-        parser = _ref.parser;
-    const body = parser.parseExpression(false, breakOnTokenText);
-    return {
-      type: "sizing",
-      mode: parser.mode,
-      // Figure out what size to use based on the list of functions above
-      size: sizeFuncs.indexOf(funcName) + 1,
-      body
-    };
-  },
-  htmlBuilder: htmlBuilder$a,
-  mathmlBuilder: (group, options) => {
-    const newOptions = options.havingSize(group.size);
-    const inner = buildExpression$1(group.body, newOptions);
-    const node = new mathMLTree.MathNode("mstyle", inner); // TODO(emily): This doesn't produce the correct size for nested size
-    // changes, because we don't keep state of what style we're currently
-    // in, so we can't reset the size to normal before changing it.  Now
-    // that we're passing an options parameter we should be able to fix
-    // this.
-
-    node.setAttribute("mathsize", newOptions.sizeMultiplier + "em");
-    return node;
-  }
-});
-
-// smash, with optional [tb], as in AMS
-defineFunction({
-  type: "smash",
-  names: ["\\smash"],
-  props: {
-    numArgs: 1,
-    numOptionalArgs: 1,
-    allowedInText: true
-  },
-  handler: (_ref, args, optArgs) => {
-    let parser = _ref.parser;
-    let smashHeight = false;
-    let smashDepth = false;
-    const tbArg = optArgs[0] && assertNodeType(optArgs[0], "ordgroup");
-
-    if (tbArg) {
-      // Optional [tb] argument is engaged.
-      // ref: amsmath: \renewcommand{\smash}[1][tb]{%
-      //               def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}%
-      let letter = "";
-
-      for (let i = 0; i < tbArg.body.length; ++i) {
-        const node = tbArg.body[i]; // $FlowFixMe: Not every node type has a `text` property.
-
-        letter = node.text;
-
-        if (letter === "t") {
-          smashHeight = true;
-        } else if (letter === "b") {
-          smashDepth = true;
-        } else {
-          smashHeight = false;
-          smashDepth = false;
-          break;
-        }
-      }
-    } else {
-      smashHeight = true;
-      smashDepth = true;
-    }
-
-    const body = args[0];
-    return {
-      type: "smash",
-      mode: parser.mode,
-      body,
-      smashHeight,
-      smashDepth
-    };
-  },
-  htmlBuilder: (group, options) => {
-    const node = buildCommon.makeSpan([], [buildGroup(group.body, options)]);
-
-    if (!group.smashHeight && !group.smashDepth) {
-      return node;
-    }
-
-    if (group.smashHeight) {
-      node.height = 0; // In order to influence makeVList, we have to reset the children.
-
-      if (node.children) {
-        for (let i = 0; i < node.children.length; i++) {
-          node.children[i].height = 0;
-        }
-      }
-    }
-
-    if (group.smashDepth) {
-      node.depth = 0;
-
-      if (node.children) {
-        for (let i = 0; i < node.children.length; i++) {
-          node.children[i].depth = 0;
-        }
-      }
-    } // At this point, we've reset the TeX-like height and depth values.
-    // But the span still has an HTML line height.
-    // makeVList applies "display: table-cell", which prevents the browser
-    // from acting on that line height. So we'll call makeVList now.
-
-
-    const smashedNode = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: node
-      }]
-    }, options); // For spacing, TeX treats \hphantom as a math group (same spacing as ord).
-
-    return buildCommon.makeSpan(["mord"], [smashedNode], options);
-  },
-  mathmlBuilder: (group, options) => {
-    const node = new mathMLTree.MathNode("mpadded", [buildGroup$1(group.body, options)]);
-
-    if (group.smashHeight) {
-      node.setAttribute("height", "0px");
-    }
-
-    if (group.smashDepth) {
-      node.setAttribute("depth", "0px");
-    }
-
-    return node;
-  }
-});
-
-defineFunction({
-  type: "sqrt",
-  names: ["\\sqrt"],
-  props: {
-    numArgs: 1,
-    numOptionalArgs: 1
-  },
-
-  handler(_ref, args, optArgs) {
-    let parser = _ref.parser;
-    const index = optArgs[0];
-    const body = args[0];
-    return {
-      type: "sqrt",
-      mode: parser.mode,
-      body,
-      index
-    };
-  },
-
-  htmlBuilder(group, options) {
-    // Square roots are handled in the TeXbook pg. 443, Rule 11.
-    // First, we do the same steps as in overline to build the inner group
-    // and line
-    let inner = buildGroup(group.body, options.havingCrampedStyle());
-
-    if (inner.height === 0) {
-      // Render a small surd.
-      inner.height = options.fontMetrics().xHeight;
-    } // Some groups can return document fragments.  Handle those by wrapping
-    // them in a span.
-
-
-    inner = buildCommon.wrapFragment(inner, options); // Calculate the minimum size for the \surd delimiter
-
-    const metrics = options.fontMetrics();
-    const theta = metrics.defaultRuleThickness;
-    let phi = theta;
-
-    if (options.style.id < Style$1.TEXT.id) {
-      phi = options.fontMetrics().xHeight;
-    } // Calculate the clearance between the body and line
-
-
-    let lineClearance = theta + phi / 4;
-    const minDelimiterHeight = inner.height + inner.depth + lineClearance + theta; // Create a sqrt SVG of the required minimum size
-
-    const _delimiter$sqrtImage = delimiter.sqrtImage(minDelimiterHeight, options),
-          img = _delimiter$sqrtImage.span,
-          ruleWidth = _delimiter$sqrtImage.ruleWidth,
-          advanceWidth = _delimiter$sqrtImage.advanceWidth;
-
-    const delimDepth = img.height - ruleWidth; // Adjust the clearance based on the delimiter size
-
-    if (delimDepth > inner.height + inner.depth + lineClearance) {
-      lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2;
-    } // Shift the sqrt image
-
-
-    const imgShift = img.height - inner.height - lineClearance - ruleWidth;
-    inner.style.paddingLeft = advanceWidth + "em"; // Overlay the image and the argument.
-
-    const body = buildCommon.makeVList({
-      positionType: "firstBaseline",
-      children: [{
-        type: "elem",
-        elem: inner,
-        wrapperClasses: ["svg-align"]
-      }, {
-        type: "kern",
-        size: -(inner.height + imgShift)
-      }, {
-        type: "elem",
-        elem: img
-      }, {
-        type: "kern",
-        size: ruleWidth
-      }]
-    }, options);
-
-    if (!group.index) {
-      return buildCommon.makeSpan(["mord", "sqrt"], [body], options);
-    } else {
-      // Handle the optional root index
-      // The index is always in scriptscript style
-      const newOptions = options.havingStyle(Style$1.SCRIPTSCRIPT);
-      const rootm = buildGroup(group.index, newOptions, options); // The amount the index is shifted by. This is taken from the TeX
-      // source, in the definition of `\r@@t`.
-
-      const toShift = 0.6 * (body.height - body.depth); // Build a VList with the superscript shifted up correctly
-
-      const rootVList = buildCommon.makeVList({
-        positionType: "shift",
-        positionData: -toShift,
-        children: [{
-          type: "elem",
-          elem: rootm
-        }]
-      }, options); // Add a class surrounding it so we can add on the appropriate
-      // kerning
-
-      const rootVListWrap = buildCommon.makeSpan(["root"], [rootVList]);
-      return buildCommon.makeSpan(["mord", "sqrt"], [rootVListWrap, body], options);
-    }
-  },
-
-  mathmlBuilder(group, options) {
-    const body = group.body,
-          index = group.index;
-    return index ? new mathMLTree.MathNode("mroot", [buildGroup$1(body, options), buildGroup$1(index, options)]) : new mathMLTree.MathNode("msqrt", [buildGroup$1(body, options)]);
-  }
-
-});
-
-const styleMap$1 = {
-  "display": Style$1.DISPLAY,
-  "text": Style$1.TEXT,
-  "script": Style$1.SCRIPT,
-  "scriptscript": Style$1.SCRIPTSCRIPT
-};
-defineFunction({
-  type: "styling",
-  names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"],
-  props: {
-    numArgs: 0,
-    allowedInText: true
-  },
-
-  handler(_ref, args) {
-    let breakOnTokenText = _ref.breakOnTokenText,
-        funcName = _ref.funcName,
-        parser = _ref.parser;
-    // parse out the implicit body
-    const body = parser.parseExpression(true, breakOnTokenText); // TODO: Refactor to avoid duplicating styleMap in multiple places (e.g.
-    // here and in buildHTML and de-dupe the enumeration of all the styles).
-    // $FlowFixMe: The names above exactly match the styles.
-
-    const style = funcName.slice(1, funcName.length - 5);
-    return {
-      type: "styling",
-      mode: parser.mode,
-      // Figure out what style to use by pulling out the style from
-      // the function name
-      style,
-      body
-    };
-  },
-
-  htmlBuilder(group, options) {
-    // Style changes are handled in the TeXbook on pg. 442, Rule 3.
-    const newStyle = styleMap$1[group.style];
-    const newOptions = options.havingStyle(newStyle).withFont('');
-    return sizingGroup(group.body, newOptions, options);
-  },
-
-  mathmlBuilder(group, options) {
-    // Figure out what style we're changing to.
-    const newStyle = styleMap$1[group.style];
-    const newOptions = options.havingStyle(newStyle);
-    const inner = buildExpression$1(group.body, newOptions);
-    const node = new mathMLTree.MathNode("mstyle", inner);
-    const styleAttributes = {
-      "display": ["0", "true"],
-      "text": ["0", "false"],
-      "script": ["1", "false"],
-      "scriptscript": ["2", "false"]
-    };
-    const attr = styleAttributes[group.style];
-    node.setAttribute("scriptlevel", attr[0]);
-    node.setAttribute("displaystyle", attr[1]);
-    return node;
-  }
-
-});
-
-/**
- * Sometimes, groups perform special rules when they have superscripts or
- * subscripts attached to them. This function lets the `supsub` group know that
- * Sometimes, groups perform special rules when they have superscripts or
- * its inner element should handle the superscripts and subscripts instead of
- * handling them itself.
- */
-const htmlBuilderDelegate = function htmlBuilderDelegate(group, options) {
-  const base = group.base;
-
-  if (!base) {
-    return null;
-  } else if (base.type === "op") {
-    // Operators handle supsubs differently when they have limits
-    // (e.g. `\displaystyle\sum_2^3`)
-    const delegate = base.limits && (options.style.size === Style$1.DISPLAY.size || base.alwaysHandleSupSub);
-    return delegate ? htmlBuilder$8 : null;
-  } else if (base.type === "operatorname") {
-    const delegate = base.alwaysHandleSupSub && (options.style.size === Style$1.DISPLAY.size || base.limits);
-    return delegate ? htmlBuilder$9 : null;
-  } else if (base.type === "accent") {
-    return utils.isCharacterBox(base.base) ? htmlBuilder : null;
-  } else if (base.type === "horizBrace") {
-    const isSup = !group.sub;
-    return isSup === base.isOver ? htmlBuilder$7 : null;
-  } else {
-    return null;
-  }
-}; // Super scripts and subscripts, whose precise placement can depend on other
-// functions that precede them.
-
-
-defineFunctionBuilders({
-  type: "supsub",
-
-  htmlBuilder(group, options) {
-    // Superscript and subscripts are handled in the TeXbook on page
-    // 445-446, rules 18(a-f).
-    // Here is where we defer to the inner group if it should handle
-    // superscripts and subscripts itself.
-    const builderDelegate = htmlBuilderDelegate(group, options);
-
-    if (builderDelegate) {
-      return builderDelegate(group, options);
-    }
-
-    const valueBase = group.base,
-          valueSup = group.sup,
-          valueSub = group.sub;
-    const base = buildGroup(valueBase, options);
-    let supm;
-    let subm;
-    const metrics = options.fontMetrics(); // Rule 18a
-
-    let supShift = 0;
-    let subShift = 0;
-    const isCharacterBox = valueBase && utils.isCharacterBox(valueBase);
-
-    if (valueSup) {
-      const newOptions = options.havingStyle(options.style.sup());
-      supm = buildGroup(valueSup, newOptions, options);
-
-      if (!isCharacterBox) {
-        supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier;
-      }
-    }
-
-    if (valueSub) {
-      const newOptions = options.havingStyle(options.style.sub());
-      subm = buildGroup(valueSub, newOptions, options);
-
-      if (!isCharacterBox) {
-        subShift = base.depth + newOptions.fontMetrics().subDrop * newOptions.sizeMultiplier / options.sizeMultiplier;
-      }
-    } // Rule 18c
-
-
-    let minSupShift;
-
-    if (options.style === Style$1.DISPLAY) {
-      minSupShift = metrics.sup1;
-    } else if (options.style.cramped) {
-      minSupShift = metrics.sup3;
-    } else {
-      minSupShift = metrics.sup2;
-    } // scriptspace is a font-size-independent size, so scale it
-    // appropriately for use as the marginRight.
-
-
-    const multiplier = options.sizeMultiplier;
-    const marginRight = 0.5 / metrics.ptPerEm / multiplier + "em";
-    let marginLeft = null;
-
-    if (subm) {
-      // Subscripts shouldn't be shifted by the base's italic correction.
-      // Account for that by shifting the subscript back the appropriate
-      // amount. Note we only do this when the base is a single symbol.
-      const isOiint = group.base && group.base.type === "op" && group.base.name && (group.base.name === "\\oiint" || group.base.name === "\\oiiint");
-
-      if (base instanceof SymbolNode || isOiint) {
-        // $FlowFixMe
-        marginLeft = -base.italic + "em";
-      }
-    }
-
-    let supsub;
-
-    if (supm && subm) {
-      supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);
-      subShift = Math.max(subShift, metrics.sub2);
-      const ruleWidth = metrics.defaultRuleThickness; // Rule 18e
-
-      const maxWidth = 4 * ruleWidth;
-
-      if (supShift - supm.depth - (subm.height - subShift) < maxWidth) {
-        subShift = maxWidth - (supShift - supm.depth) + subm.height;
-        const psi = 0.8 * metrics.xHeight - (supShift - supm.depth);
-
-        if (psi > 0) {
-          supShift += psi;
-          subShift -= psi;
-        }
-      }
-
-      const vlistElem = [{
-        type: "elem",
-        elem: subm,
-        shift: subShift,
-        marginRight,
-        marginLeft
-      }, {
-        type: "elem",
-        elem: supm,
-        shift: -supShift,
-        marginRight
-      }];
-      supsub = buildCommon.makeVList({
-        positionType: "individualShift",
-        children: vlistElem
-      }, options);
-    } else if (subm) {
-      // Rule 18b
-      subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight);
-      const vlistElem = [{
-        type: "elem",
-        elem: subm,
-        marginLeft,
-        marginRight
-      }];
-      supsub = buildCommon.makeVList({
-        positionType: "shift",
-        positionData: subShift,
-        children: vlistElem
-      }, options);
-    } else if (supm) {
-      // Rule 18c, d
-      supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);
-      supsub = buildCommon.makeVList({
-        positionType: "shift",
-        positionData: -supShift,
-        children: [{
-          type: "elem",
-          elem: supm,
-          marginRight
-        }]
-      }, options);
-    } else {
-      throw new Error("supsub must have either sup or sub.");
-    } // Wrap the supsub vlist in a span.msupsub to reset text-align.
-
-
-    const mclass = getTypeOfDomTree(base, "right") || "mord";
-    return buildCommon.makeSpan([mclass], [base, buildCommon.makeSpan(["msupsub"], [supsub])], options);
-  },
-
-  mathmlBuilder(group, options) {
-    // Is the inner group a relevant horizonal brace?
-    let isBrace = false;
-    let isOver;
-    let isSup;
-    const horizBrace = checkNodeType(group.base, "horizBrace");
-
-    if (horizBrace) {
-      isSup = !!group.sup;
-
-      if (isSup === horizBrace.isOver) {
-        isBrace = true;
-        isOver = horizBrace.isOver;
-      }
-    }
-
-    if (group.base && (group.base.type === "op" || group.base.type === "operatorname")) {
-      group.base.parentIsSupSub = true;
-    }
-
-    const children = [buildGroup$1(group.base, options)];
-
-    if (group.sub) {
-      children.push(buildGroup$1(group.sub, options));
-    }
-
-    if (group.sup) {
-      children.push(buildGroup$1(group.sup, options));
-    }
-
-    let nodeType;
-
-    if (isBrace) {
-      nodeType = isOver ? "mover" : "munder";
-    } else if (!group.sub) {
-      const base = group.base;
-
-      if (base && base.type === "op" && base.limits && (options.style === Style$1.DISPLAY || base.alwaysHandleSupSub)) {
-        nodeType = "mover";
-      } else if (base && base.type === "operatorname" && base.alwaysHandleSupSub && (base.limits || options.style === Style$1.DISPLAY)) {
-        nodeType = "mover";
-      } else {
-        nodeType = "msup";
-      }
-    } else if (!group.sup) {
-      const base = group.base;
-
-      if (base && base.type === "op" && base.limits && (options.style === Style$1.DISPLAY || base.alwaysHandleSupSub)) {
-        nodeType = "munder";
-      } else if (base && base.type === "operatorname" && base.alwaysHandleSupSub && (base.limits || options.style === Style$1.DISPLAY)) {
-        nodeType = "munder";
-      } else {
-        nodeType = "msub";
-      }
-    } else {
-      const base = group.base;
-
-      if (base && base.type === "op" && base.limits && options.style === Style$1.DISPLAY) {
-        nodeType = "munderover";
-      } else if (base && base.type === "operatorname" && base.alwaysHandleSupSub && (options.style === Style$1.DISPLAY || base.limits)) {
-        nodeType = "munderover";
-      } else {
-        nodeType = "msubsup";
-      }
-    }
-
-    const node = new mathMLTree.MathNode(nodeType, children);
-    return node;
-  }
-
-});
-
-defineFunctionBuilders({
-  type: "atom",
-
-  htmlBuilder(group, options) {
-    return buildCommon.mathsym(group.text, group.mode, options, ["m" + group.family]);
-  },
-
-  mathmlBuilder(group, options) {
-    const node = new mathMLTree.MathNode("mo", [makeText(group.text, group.mode)]);
-
-    if (group.family === "bin") {
-      const variant = getVariant(group, options);
-
-      if (variant === "bold-italic") {
-        node.setAttribute("mathvariant", variant);
-      }
-    } else if (group.family === "punct") {
-      node.setAttribute("separator", "true");
-    } else if (group.family === "open" || group.family === "close") {
-      // Delims built here should not stretch vertically.
-      // See delimsizing.js for stretchy delims.
-      node.setAttribute("stretchy", "false");
-    }
-
-    return node;
-  }
-
-});
-
-// "mathord" and "textord" ParseNodes created in Parser.js from symbol Groups in
-const defaultVariant = {
-  "mi": "italic",
-  "mn": "normal",
-  "mtext": "normal"
-};
-defineFunctionBuilders({
-  type: "mathord",
-
-  htmlBuilder(group, options) {
-    return buildCommon.makeOrd(group, options, "mathord");
-  },
-
-  mathmlBuilder(group, options) {
-    const node = new mathMLTree.MathNode("mi", [makeText(group.text, group.mode, options)]);
-    const variant = getVariant(group, options) || "italic";
-
-    if (variant !== defaultVariant[node.type]) {
-      node.setAttribute("mathvariant", variant);
-    }
-
-    return node;
-  }
-
-});
-defineFunctionBuilders({
-  type: "textord",
-
-  htmlBuilder(group, options) {
-    return buildCommon.makeOrd(group, options, "textord");
-  },
-
-  mathmlBuilder(group, options) {
-    const text = makeText(group.text, group.mode, options);
-    const variant = getVariant(group, options) || "normal";
-    let node;
-
-    if (group.mode === 'text') {
-      node = new mathMLTree.MathNode("mtext", [text]);
-    } else if (/[0-9]/.test(group.text)) {
-      // TODO(kevinb) merge adjacent <mn> nodes
-      // do it as a post processing step
-      node = new mathMLTree.MathNode("mn", [text]);
-    } else if (group.text === "\\prime") {
-      node = new mathMLTree.MathNode("mo", [text]);
-    } else {
-      node = new mathMLTree.MathNode("mi", [text]);
-    }
-
-    if (variant !== defaultVariant[node.type]) {
-      node.setAttribute("mathvariant", variant);
-    }
-
-    return node;
-  }
-
-});
-
-const cssSpace = {
-  "\\nobreak": "nobreak",
-  "\\allowbreak": "allowbreak"
-}; // A lookup table to determine whether a spacing function/symbol should be
-// treated like a regular space character.  If a symbol or command is a key
-// in this table, then it should be a regular space character.  Furthermore,
-// the associated value may have a `className` specifying an extra CSS class
-// to add to the created `span`.
-
-const regularSpace = {
-  " ": {},
-  "\\ ": {},
-  "~": {
-    className: "nobreak"
-  },
-  "\\space": {},
-  "\\nobreakspace": {
-    className: "nobreak"
-  }
-}; // ParseNode<"spacing"> created in Parser.js from the "spacing" symbol Groups in
-// src/symbols.js.
-
-defineFunctionBuilders({
-  type: "spacing",
-
-  htmlBuilder(group, options) {
-    if (regularSpace.hasOwnProperty(group.text)) {
-      const className = regularSpace[group.text].className || ""; // Spaces are generated by adding an actual space. Each of these
-      // things has an entry in the symbols table, so these will be turned
-      // into appropriate outputs.
-
-      if (group.mode === "text") {
-        const ord = buildCommon.makeOrd(group, options, "textord");
-        ord.classes.push(className);
-        return ord;
-      } else {
-        return buildCommon.makeSpan(["mspace", className], [buildCommon.mathsym(group.text, group.mode, options)], options);
-      }
-    } else if (cssSpace.hasOwnProperty(group.text)) {
-      // Spaces based on just a CSS class.
-      return buildCommon.makeSpan(["mspace", cssSpace[group.text]], [], options);
-    } else {
-      throw new ParseError(`Unknown type of space "${group.text}"`);
-    }
-  },
-
-  mathmlBuilder(group, options) {
-    let node;
-
-    if (regularSpace.hasOwnProperty(group.text)) {
-      node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("\u00a0")]);
-    } else if (cssSpace.hasOwnProperty(group.text)) {
-      // CSS-based MathML spaces (\nobreak, \allowbreak) are ignored
-      return new mathMLTree.MathNode("mspace");
-    } else {
-      throw new ParseError(`Unknown type of space "${group.text}"`);
-    }
-
-    return node;
-  }
-
-});
-
-const pad = () => {
-  const padNode = new mathMLTree.MathNode("mtd", []);
-  padNode.setAttribute("width", "50%");
-  return padNode;
-};
-
-defineFunctionBuilders({
-  type: "tag",
-
-  mathmlBuilder(group, options) {
-    const table = new mathMLTree.MathNode("mtable", [new mathMLTree.MathNode("mtr", [pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.body, options)]), pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.tag, options)])])]);
-    table.setAttribute("width", "100%");
-    return table; // TODO: Left-aligned tags.
-    // Currently, the group and options passed here do not contain
-    // enough info to set tag alignment. `leqno` is in Settings but it is
-    // not passed to Options. On the HTML side, leqno is
-    // set by a CSS class applied in buildTree.js. That would have worked
-    // in MathML if browsers supported <mlabeledtr>. Since they don't, we
-    // need to rewrite the way this function is called.
-  }
-
-});
-
-const textFontFamilies = {
-  "\\text": undefined,
-  "\\textrm": "textrm",
-  "\\textsf": "textsf",
-  "\\texttt": "texttt",
-  "\\textnormal": "textrm"
-};
-const textFontWeights = {
-  "\\textbf": "textbf",
-  "\\textmd": "textmd"
-};
-const textFontShapes = {
-  "\\textit": "textit",
-  "\\textup": "textup"
-};
-
-const optionsWithFont = (group, options) => {
-  const font = group.font; // Checks if the argument is a font family or a font style.
-
-  if (!font) {
-    return options;
-  } else if (textFontFamilies[font]) {
-    return options.withTextFontFamily(textFontFamilies[font]);
-  } else if (textFontWeights[font]) {
-    return options.withTextFontWeight(textFontWeights[font]);
-  } else {
-    return options.withTextFontShape(textFontShapes[font]);
-  }
-};
-
-defineFunction({
-  type: "text",
-  names: [// Font families
-  "\\text", "\\textrm", "\\textsf", "\\texttt", "\\textnormal", // Font weights
-  "\\textbf", "\\textmd", // Font Shapes
-  "\\textit", "\\textup"],
-  props: {
-    numArgs: 1,
-    argTypes: ["text"],
-    greediness: 2,
-    allowedInText: true
-  },
-
-  handler(_ref, args) {
-    let parser = _ref.parser,
-        funcName = _ref.funcName;
-    const body = args[0];
-    return {
-      type: "text",
-      mode: parser.mode,
-      body: ordargument(body),
-      font: funcName
-    };
-  },
-
-  htmlBuilder(group, options) {
-    const newOptions = optionsWithFont(group, options);
-    const inner = buildExpression(group.body, newOptions, true);
-    return buildCommon.makeSpan(["mord", "text"], buildCommon.tryCombineChars(inner), newOptions);
-  },
-
-  mathmlBuilder(group, options) {
-    const newOptions = optionsWithFont(group, options);
-    return buildExpressionRow(group.body, newOptions);
-  }
-
-});
-
-defineFunction({
-  type: "underline",
-  names: ["\\underline"],
-  props: {
-    numArgs: 1,
-    allowedInText: true
-  },
-
-  handler(_ref, args) {
-    let parser = _ref.parser;
-    return {
-      type: "underline",
-      mode: parser.mode,
-      body: args[0]
-    };
-  },
-
-  htmlBuilder(group, options) {
-    // Underlines are handled in the TeXbook pg 443, Rule 10.
-    // Build the inner group.
-    const innerGroup = buildGroup(group.body, options); // Create the line to go below the body
-
-    const line = buildCommon.makeLineSpan("underline-line", options); // Generate the vlist, with the appropriate kerns
-
-    const defaultRuleThickness = options.fontMetrics().defaultRuleThickness;
-    const vlist = buildCommon.makeVList({
-      positionType: "top",
-      positionData: innerGroup.height,
-      children: [{
-        type: "kern",
-        size: defaultRuleThickness
-      }, {
-        type: "elem",
-        elem: line
-      }, {
-        type: "kern",
-        size: 3 * defaultRuleThickness
-      }, {
-        type: "elem",
-        elem: innerGroup
-      }]
-    }, options);
-    return buildCommon.makeSpan(["mord", "underline"], [vlist], options);
-  },
-
-  mathmlBuilder(group, options) {
-    const operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203e")]);
-    operator.setAttribute("stretchy", "true");
-    const node = new mathMLTree.MathNode("munder", [buildGroup$1(group.body, options), operator]);
-    node.setAttribute("accentunder", "true");
-    return node;
-  }
-
-});
-
-defineFunction({
-  type: "verb",
-  names: ["\\verb"],
-  props: {
-    numArgs: 0,
-    allowedInText: true
-  },
-
-  handler(context, args, optArgs) {
-    // \verb and \verb* are dealt with directly in Parser.js.
-    // If we end up here, it's because of a failure to match the two delimiters
-    // in the regex in Lexer.js.  LaTeX raises the following error when \verb is
-    // terminated by end of line (or file).
-    throw new ParseError("\\verb ended by end of line instead of matching delimiter");
-  },
-
-  htmlBuilder(group, options) {
-    const text = makeVerb(group);
-    const body = []; // \verb enters text mode and therefore is sized like \textstyle
-
-    const newOptions = options.havingStyle(options.style.text());
-
-    for (let i = 0; i < text.length; i++) {
-      let c = text[i];
-
-      if (c === '~') {
-        c = '\\textasciitilde';
-      }
-
-      body.push(buildCommon.makeSymbol(c, "Typewriter-Regular", group.mode, newOptions, ["mord", "texttt"]));
-    }
-
-    return buildCommon.makeSpan(["mord", "text"].concat(newOptions.sizingClasses(options)), buildCommon.tryCombineChars(body), newOptions);
-  },
-
-  mathmlBuilder(group, options) {
-    const text = new mathMLTree.TextNode(makeVerb(group));
-    const node = new mathMLTree.MathNode("mtext", [text]);
-    node.setAttribute("mathvariant", "monospace");
-    return node;
-  }
-
-});
-/**
- * Converts verb group into body string.
- *
- * \verb* replaces each space with an open box \u2423
- * \verb replaces each space with a no-break space \xA0
- */
-
-const makeVerb = group => group.body.replace(/ /g, group.star ? '\u2423' : '\xA0');
-
-/** Include this to ensure that all functions are defined. */
-const functions = _functions;
-
-/**
- * The Lexer class handles tokenizing the input in various ways. Since our
- * parser expects us to be able to backtrack, the lexer allows lexing from any
- * given starting point.
- *
- * Its main exposed function is the `lex` function, which takes a position to
- * lex from and a type of token to lex. It defers to the appropriate `_innerLex`
- * function.
- *
- * The various `_innerLex` functions perform the actual lexing of different
- * kinds.
- */
-
-/* The following tokenRegex
- * - matches typical whitespace (but not NBSP etc.) using its first group
- * - does not match any control character \x00-\x1f except whitespace
- * - does not match a bare backslash
- * - matches any ASCII character except those just mentioned
- * - does not match the BMP private use area \uE000-\uF8FF
- * - does not match bare surrogate code units
- * - matches any BMP character except for those just described
- * - matches any valid Unicode surrogate pair
- * - matches a backslash followed by one or more letters
- * - matches a backslash followed by any BMP character, including newline
- * Just because the Lexer matches something doesn't mean it's valid input:
- * If there is no matching function or symbol definition, the Parser will
- * still reject the input.
- */
-const spaceRegexString = "[ \r\n\t]";
-const controlWordRegexString = "\\\\[a-zA-Z@]+";
-const controlSymbolRegexString = "\\\\[^\uD800-\uDFFF]";
-const controlWordWhitespaceRegexString = `${controlWordRegexString}${spaceRegexString}*`;
-const controlWordWhitespaceRegex = new RegExp(`^(${controlWordRegexString})${spaceRegexString}*$`);
-const combiningDiacriticalMarkString = "[\u0300-\u036f]";
-const combiningDiacriticalMarksEndRegex = new RegExp(`${combiningDiacriticalMarkString}+$`);
-const tokenRegexString = `(${spaceRegexString}+)|` + // whitespace
-"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + // single codepoint
-`${combiningDiacriticalMarkString}*` + // ...plus accents
-"|[\uD800-\uDBFF][\uDC00-\uDFFF]" + // surrogate pair
-`${combiningDiacriticalMarkString}*` + // ...plus accents
-"|\\\\verb\\*([^]).*?\\3" + // \verb*
-"|\\\\verb([^*a-zA-Z]).*?\\4" + // \verb unstarred
-"|\\\\operatorname\\*" + // \operatorname*
-`|${controlWordWhitespaceRegexString}` + // \macroName + spaces
-`|${controlSymbolRegexString})`; // \\, \', etc.
-
-/** Main Lexer class */
-
-class Lexer {
-  // category codes, only supports comment characters (14) for now
-  constructor(input, settings) {
-    this.input = void 0;
-    this.settings = void 0;
-    this.tokenRegex = void 0;
-    this.catcodes = void 0;
-    // Separate accents from characters
-    this.input = input;
-    this.settings = settings;
-    this.tokenRegex = new RegExp(tokenRegexString, 'g');
-    this.catcodes = {
-      "%": 14 // comment character
-
-    };
-  }
-
-  setCatcode(char, code) {
-    this.catcodes[char] = code;
-  }
-  /**
-   * This function lexes a single token.
-   */
-
-
-  lex() {
-    const input = this.input;
-    const pos = this.tokenRegex.lastIndex;
-
-    if (pos === input.length) {
-      return new Token("EOF", new SourceLocation(this, pos, pos));
-    }
-
-    const match = this.tokenRegex.exec(input);
-
-    if (match === null || match.index !== pos) {
-      throw new ParseError(`Unexpected character: '${input[pos]}'`, new Token(input[pos], new SourceLocation(this, pos, pos + 1)));
-    }
-
-    let text = match[2] || " ";
-
-    if (this.catcodes[text] === 14) {
-      // comment character
-      const nlIndex = input.indexOf('\n', this.tokenRegex.lastIndex);
-
-      if (nlIndex === -1) {
-        this.tokenRegex.lastIndex = input.length; // EOF
-
-        this.settings.reportNonstrict("commentAtEnd", "% comment has no terminating newline; LaTeX would " + "fail because of commenting the end of math mode (e.g. $)");
-      } else {
-        this.tokenRegex.lastIndex = nlIndex + 1;
-      }
-
-      return this.lex();
-    } // Trim any trailing whitespace from control word match
-
-
-    const controlMatch = text.match(controlWordWhitespaceRegex);
-
-    if (controlMatch) {
-      text = controlMatch[1];
-    }
-
-    return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex));
-  }
-
-}
-
-/**
- * A `Namespace` refers to a space of nameable things like macros or lengths,
- * which can be `set` either globally or local to a nested group, using an
- * undo stack similar to how TeX implements this functionality.
- * Performance-wise, `get` and local `set` take constant time, while global
- * `set` takes time proportional to the depth of group nesting.
- */
-class Namespace {
-  /**
-   * Both arguments are optional.  The first argument is an object of
-   * built-in mappings which never change.  The second argument is an object
-   * of initial (global-level) mappings, which will constantly change
-   * according to any global/top-level `set`s done.
-   */
-  constructor(builtins, globalMacros) {
-    if (builtins === void 0) {
-      builtins = {};
-    }
-
-    if (globalMacros === void 0) {
-      globalMacros = {};
-    }
-
-    this.current = void 0;
-    this.builtins = void 0;
-    this.undefStack = void 0;
-    this.current = globalMacros;
-    this.builtins = builtins;
-    this.undefStack = [];
-  }
-  /**
-   * Start a new nested group, affecting future local `set`s.
-   */
-
-
-  beginGroup() {
-    this.undefStack.push({});
-  }
-  /**
-   * End current nested group, restoring values before the group began.
-   */
-
-
-  endGroup() {
-    if (this.undefStack.length === 0) {
-      throw new ParseError("Unbalanced namespace destruction: attempt " + "to pop global namespace; please report this as a bug");
-    }
-
-    const undefs = this.undefStack.pop();
-
-    for (const undef in undefs) {
-      if (undefs.hasOwnProperty(undef)) {
-        if (undefs[undef] === undefined) {
-          delete this.current[undef];
-        } else {
-          this.current[undef] = undefs[undef];
-        }
-      }
-    }
-  }
-  /**
-   * Detect whether `name` has a definition.  Equivalent to
-   * `get(name) != null`.
-   */
-
-
-  has(name) {
-    return this.current.hasOwnProperty(name) || this.builtins.hasOwnProperty(name);
-  }
-  /**
-   * Get the current value of a name, or `undefined` if there is no value.
-   *
-   * Note: Do not use `if (namespace.get(...))` to detect whether a macro
-   * is defined, as the definition may be the empty string which evaluates
-   * to `false` in JavaScript.  Use `if (namespace.get(...) != null)` or
-   * `if (namespace.has(...))`.
-   */
-
-
-  get(name) {
-    if (this.current.hasOwnProperty(name)) {
-      return this.current[name];
-    } else {
-      return this.builtins[name];
-    }
-  }
-  /**
-   * Set the current value of a name, and optionally set it globally too.
-   * Local set() sets the current value and (when appropriate) adds an undo
-   * operation to the undo stack.  Global set() may change the undo
-   * operation at every level, so takes time linear in their number.
-   */
-
-
-  set(name, value, global) {
-    if (global === void 0) {
-      global = false;
-    }
-
-    if (global) {
-      // Global set is equivalent to setting in all groups.  Simulate this
-      // by destroying any undos currently scheduled for this name,
-      // and adding an undo with the *new* value (in case it later gets
-      // locally reset within this environment).
-      for (let i = 0; i < this.undefStack.length; i++) {
-        delete this.undefStack[i][name];
-      }
-
-      if (this.undefStack.length > 0) {
-        this.undefStack[this.undefStack.length - 1][name] = value;
-      }
-    } else {
-      // Undo this set at end of this group (possibly to `undefined`),
-      // unless an undo is already in place, in which case that older
-      // value is the correct one.
-      const top = this.undefStack[this.undefStack.length - 1];
-
-      if (top && !top.hasOwnProperty(name)) {
-        top[name] = this.current[name];
-      }
-    }
-
-    this.current[name] = value;
-  }
-
-}
-
-/**
- * Predefined macros for KaTeX.
- * This can be used to define some commands in terms of others.
- */
-const builtinMacros = {};
-
-function defineMacro(name, body) {
-  builtinMacros[name] = body;
-} //////////////////////////////////////////////////////////////////////
-// macro tools
-// LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2
-// TeX source: \long\def\@firstoftwo#1#2{#1}
-
-defineMacro("\\@firstoftwo", function (context) {
-  const args = context.consumeArgs(2);
-  return {
-    tokens: args[0],
-    numArgs: 0
-  };
-}); // LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1
-// TeX source: \long\def\@secondoftwo#1#2{#2}
-
-defineMacro("\\@secondoftwo", function (context) {
-  const args = context.consumeArgs(2);
-  return {
-    tokens: args[1],
-    numArgs: 0
-  };
-}); // LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded)
-// symbol.  If it matches #1, then the macro expands to #2; otherwise, #3.
-// Note, however, that it does not consume the next symbol in either case.
-
-defineMacro("\\@ifnextchar", function (context) {
-  const args = context.consumeArgs(3); // symbol, if, else
-
-  const nextToken = context.future();
-
-  if (args[0].length === 1 && args[0][0].text === nextToken.text) {
-    return {
-      tokens: args[1],
-      numArgs: 0
-    };
-  } else {
-    return {
-      tokens: args[2],
-      numArgs: 0
-    };
-  }
-}); // LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol.
-// If it is `*`, then it consumes the symbol, and the macro expands to #1;
-// otherwise, the macro expands to #2 (without consuming the symbol).
-// TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}
-
-defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); // LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode
-
-defineMacro("\\TextOrMath", function (context) {
-  const args = context.consumeArgs(2);
-
-  if (context.mode === 'text') {
-    return {
-      tokens: args[0],
-      numArgs: 0
-    };
-  } else {
-    return {
-      tokens: args[1],
-      numArgs: 0
-    };
-  }
-}); // Lookup table for parsing numbers in base 8 through 16
-
-const digitToNumber = {
-  "0": 0,
-  "1": 1,
-  "2": 2,
-  "3": 3,
-  "4": 4,
-  "5": 5,
-  "6": 6,
-  "7": 7,
-  "8": 8,
-  "9": 9,
-  "a": 10,
-  "A": 10,
-  "b": 11,
-  "B": 11,
-  "c": 12,
-  "C": 12,
-  "d": 13,
-  "D": 13,
-  "e": 14,
-  "E": 14,
-  "f": 15,
-  "F": 15
-}; // TeX \char makes a literal character (catcode 12) using the following forms:
-// (see The TeXBook, p. 43)
-//   \char123  -- decimal
-//   \char'123 -- octal
-//   \char"123 -- hex
-//   \char`x   -- character that can be written (i.e. isn't active)
-//   \char`\x  -- character that cannot be written (e.g. %)
-// These all refer to characters from the font, so we turn them into special
-// calls to a function \@char dealt with in the Parser.
-
-defineMacro("\\char", function (context) {
-  let token = context.popToken();
-  let base;
-  let number = '';
-
-  if (token.text === "'") {
-    base = 8;
-    token = context.popToken();
-  } else if (token.text === '"') {
-    base = 16;
-    token = context.popToken();
-  } else if (token.text === "`") {
-    token = context.popToken();
-
-    if (token.text[0] === "\\") {
-      number = token.text.charCodeAt(1);
-    } else if (token.text === "EOF") {
-      throw new ParseError("\\char` missing argument");
-    } else {
-      number = token.text.charCodeAt(0);
-    }
-  } else {
-    base = 10;
-  }
-
-  if (base) {
-    // Parse a number in the given base, starting with first `token`.
-    number = digitToNumber[token.text];
-
-    if (number == null || number >= base) {
-      throw new ParseError(`Invalid base-${base} digit ${token.text}`);
-    }
-
-    let digit;
-
-    while ((digit = digitToNumber[context.future().text]) != null && digit < base) {
-      number *= base;
-      number += digit;
-      context.popToken();
-    }
-  }
-
-  return `\\@char{${number}}`;
-}); // Basic support for macro definitions:
-//     \def\macro{expansion}
-//     \def\macro#1{expansion}
-//     \def\macro#1#2{expansion}
-//     \def\macro#1#2#3#4#5#6#7#8#9{expansion}
-// Also the \gdef and \global\def equivalents
-
-const def = (context, global) => {
-  let arg = context.consumeArgs(1)[0];
-
-  if (arg.length !== 1) {
-    throw new ParseError("\\gdef's first argument must be a macro name");
-  }
-
-  const name = arg[0].text; // Count argument specifiers, and check they are in the order #1 #2 ...
-
-  let numArgs = 0;
-  arg = context.consumeArgs(1)[0];
-
-  while (arg.length === 1 && arg[0].text === "#") {
-    arg = context.consumeArgs(1)[0];
-
-    if (arg.length !== 1) {
-      throw new ParseError(`Invalid argument number length "${arg.length}"`);
-    }
-
-    if (!/^[1-9]$/.test(arg[0].text)) {
-      throw new ParseError(`Invalid argument number "${arg[0].text}"`);
-    }
-
-    numArgs++;
-
-    if (parseInt(arg[0].text) !== numArgs) {
-      throw new ParseError(`Argument number "${arg[0].text}" out of order`);
-    }
-
-    arg = context.consumeArgs(1)[0];
-  } // Final arg is the expansion of the macro
-
-
-  context.macros.set(name, {
-    tokens: arg,
-    numArgs
-  }, global);
-  return '';
-};
-
-defineMacro("\\gdef", context => def(context, true));
-defineMacro("\\def", context => def(context, false));
-defineMacro("\\global", context => {
-  const next = context.consumeArgs(1)[0];
-
-  if (next.length !== 1) {
-    throw new ParseError("Invalid command after \\global");
-  }
-
-  const command = next[0].text; // TODO: Should expand command
-
-  if (command === "\\def") {
-    // \global\def is equivalent to \gdef
-    return def(context, true);
-  } else {
-    throw new ParseError(`Invalid command '${command}' after \\global`);
-  }
-}); // \newcommand{\macro}[args]{definition}
-// \renewcommand{\macro}[args]{definition}
-// TODO: Optional arguments: \newcommand{\macro}[args][default]{definition}
-
-const newcommand = (context, existsOK, nonexistsOK) => {
-  let arg = context.consumeArgs(1)[0];
-
-  if (arg.length !== 1) {
-    throw new ParseError("\\newcommand's first argument must be a macro name");
-  }
-
-  const name = arg[0].text;
-  const exists = context.isDefined(name);
-
-  if (exists && !existsOK) {
-    throw new ParseError(`\\newcommand{${name}} attempting to redefine ` + `${name}; use \\renewcommand`);
-  }
-
-  if (!exists && !nonexistsOK) {
-    throw new ParseError(`\\renewcommand{${name}} when command ${name} ` + `does not yet exist; use \\newcommand`);
-  }
-
-  let numArgs = 0;
-  arg = context.consumeArgs(1)[0];
-
-  if (arg.length === 1 && arg[0].text === "[") {
-    let argText = '';
-    let token = context.expandNextToken();
-
-    while (token.text !== "]" && token.text !== "EOF") {
-      // TODO: Should properly expand arg, e.g., ignore {}s
-      argText += token.text;
-      token = context.expandNextToken();
-    }
-
-    if (!argText.match(/^\s*[0-9]+\s*$/)) {
-      throw new ParseError(`Invalid number of arguments: ${argText}`);
-    }
-
-    numArgs = parseInt(argText);
-    arg = context.consumeArgs(1)[0];
-  } // Final arg is the expansion of the macro
-
-
-  context.macros.set(name, {
-    tokens: arg,
-    numArgs
-  });
-  return '';
-};
-
-defineMacro("\\newcommand", context => newcommand(context, false, true));
-defineMacro("\\renewcommand", context => newcommand(context, true, false));
-defineMacro("\\providecommand", context => newcommand(context, true, true)); //////////////////////////////////////////////////////////////////////
-// Grouping
-// \let\bgroup={ \let\egroup=}
-
-defineMacro("\\bgroup", "{");
-defineMacro("\\egroup", "}"); // Symbols from latex.ltx:
-// \def\lq{`}
-// \def\rq{'}
-// \def \aa {\r a}
-// \def \AA {\r A}
-
-defineMacro("\\lq", "`");
-defineMacro("\\rq", "'");
-defineMacro("\\aa", "\\r a");
-defineMacro("\\AA", "\\r A"); // Copyright (C) and registered (R) symbols. Use raw symbol in MathML.
-// \DeclareTextCommandDefault{\textcopyright}{\textcircled{c}}
-// \DeclareTextCommandDefault{\textregistered}{\textcircled{%
-//      \check@mathfonts\fontsize\sf@size\z@\math@fontsfalse\selectfont R}}
-// \DeclareRobustCommand{\copyright}{%
-//    \ifmmode{\nfss@text{\textcopyright}}\else\textcopyright\fi}
-
-defineMacro("\\textcopyright", "\\html@mathml{\\textcircled{c}}{\\char`©}");
-defineMacro("\\copyright", "\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");
-defineMacro("\\textregistered", "\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"); // Characters omitted from Unicode range 1D400–1D7FF
-
-defineMacro("\u212C", "\\mathscr{B}"); // script
-
-defineMacro("\u2130", "\\mathscr{E}");
-defineMacro("\u2131", "\\mathscr{F}");
-defineMacro("\u210B", "\\mathscr{H}");
-defineMacro("\u2110", "\\mathscr{I}");
-defineMacro("\u2112", "\\mathscr{L}");
-defineMacro("\u2133", "\\mathscr{M}");
-defineMacro("\u211B", "\\mathscr{R}");
-defineMacro("\u212D", "\\mathfrak{C}"); // Fraktur
-
-defineMacro("\u210C", "\\mathfrak{H}");
-defineMacro("\u2128", "\\mathfrak{Z}"); // Define \Bbbk with a macro that works in both HTML and MathML.
-
-defineMacro("\\Bbbk", "\\Bbb{k}"); // Unicode middle dot
-// The KaTeX fonts do not contain U+00B7. Instead, \cdotp displays
-// the dot at U+22C5 and gives it punct spacing.
-
-defineMacro("\u00b7", "\\cdotp"); // \llap and \rlap render their contents in text mode
-
-defineMacro("\\llap", "\\mathllap{\\textrm{#1}}");
-defineMacro("\\rlap", "\\mathrlap{\\textrm{#1}}");
-defineMacro("\\clap", "\\mathclap{\\textrm{#1}}"); // \not is defined by base/fontmath.ltx via
-// \DeclareMathSymbol{\not}{\mathrel}{symbols}{"36}
-// It's thus treated like a \mathrel, but defined by a symbol that has zero
-// width but extends to the right.  We use \rlap to get that spacing.
-// For MathML we write U+0338 here. buildMathML.js will then do the overlay.
-
-defineMacro("\\not", '\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'); // Negated symbols from base/fontmath.ltx:
-// \def\neq{\not=} \let\ne=\neq
-// \DeclareRobustCommand
-//   \notin{\mathrel{\m@th\mathpalette\c@ncel\in}}
-// \def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}
-
-defineMacro("\\neq", "\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}");
-defineMacro("\\ne", "\\neq");
-defineMacro("\u2260", "\\neq");
-defineMacro("\\notin", "\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}" + "{\\mathrel{\\char`∉}}");
-defineMacro("\u2209", "\\notin"); // Unicode stacked relations
-
-defineMacro("\u2258", "\\html@mathml{" + "\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}" + "}{\\mathrel{\\char`\u2258}}");
-defineMacro("\u2259", "\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");
-defineMacro("\u225A", "\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");
-defineMacro("\u225B", "\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}" + "{\\mathrel{\\char`\u225B}}");
-defineMacro("\u225D", "\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}" + "{\\mathrel{\\char`\u225D}}");
-defineMacro("\u225E", "\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}" + "{\\mathrel{\\char`\u225E}}");
-defineMacro("\u225F", "\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}"); // Misc Unicode
-
-defineMacro("\u27C2", "\\perp");
-defineMacro("\u203C", "\\mathclose{!\\mkern-0.8mu!}");
-defineMacro("\u220C", "\\notni");
-defineMacro("\u231C", "\\ulcorner");
-defineMacro("\u231D", "\\urcorner");
-defineMacro("\u231E", "\\llcorner");
-defineMacro("\u231F", "\\lrcorner");
-defineMacro("\u00A9", "\\copyright");
-defineMacro("\u00AE", "\\textregistered");
-defineMacro("\uFE0F", "\\textregistered"); //////////////////////////////////////////////////////////////////////
-// LaTeX_2ε
-// \vdots{\vbox{\baselineskip4\p@  \lineskiplimit\z@
-// \kern6\p@\hbox{.}\hbox{.}\hbox{.}}}
-// We'll call \varvdots, which gets a glyph from symbols.js.
-// The zero-width rule gets us an equivalent to the vertical 6pt kern.
-
-defineMacro("\\vdots", "\\mathord{\\varvdots\\rule{0pt}{15pt}}");
-defineMacro("\u22ee", "\\vdots"); //////////////////////////////////////////////////////////////////////
-// amsmath.sty
-// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf
-// Italic Greek capital letters.  AMS defines these with \DeclareMathSymbol,
-// but they are equivalent to \mathit{\Letter}.
-
-defineMacro("\\varGamma", "\\mathit{\\Gamma}");
-defineMacro("\\varDelta", "\\mathit{\\Delta}");
-defineMacro("\\varTheta", "\\mathit{\\Theta}");
-defineMacro("\\varLambda", "\\mathit{\\Lambda}");
-defineMacro("\\varXi", "\\mathit{\\Xi}");
-defineMacro("\\varPi", "\\mathit{\\Pi}");
-defineMacro("\\varSigma", "\\mathit{\\Sigma}");
-defineMacro("\\varUpsilon", "\\mathit{\\Upsilon}");
-defineMacro("\\varPhi", "\\mathit{\\Phi}");
-defineMacro("\\varPsi", "\\mathit{\\Psi}");
-defineMacro("\\varOmega", "\\mathit{\\Omega}"); //\newcommand{\substack}[1]{\subarray{c}#1\endsubarray}
-
-defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"); // \renewcommand{\colon}{\nobreak\mskip2mu\mathpunct{}\nonscript
-// \mkern-\thinmuskip{:}\mskip6muplus1mu\relax}
-
-defineMacro("\\colon", "\\nobreak\\mskip2mu\\mathpunct{}" + "\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"); // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}}
-
-defineMacro("\\boxed", "\\fbox{$\\displaystyle{#1}$}"); // \def\iff{\DOTSB\;\Longleftrightarrow\;}
-// \def\implies{\DOTSB\;\Longrightarrow\;}
-// \def\impliedby{\DOTSB\;\Longleftarrow\;}
-
-defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;");
-defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;");
-defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); // AMSMath's automatic \dots, based on \mdots@@ macro.
-
-const dotsByToken = {
-  ',': '\\dotsc',
-  '\\not': '\\dotsb',
-  // \keybin@ checks for the following:
-  '+': '\\dotsb',
-  '=': '\\dotsb',
-  '<': '\\dotsb',
-  '>': '\\dotsb',
-  '-': '\\dotsb',
-  '*': '\\dotsb',
-  ':': '\\dotsb',
-  // Symbols whose definition starts with \DOTSB:
-  '\\DOTSB': '\\dotsb',
-  '\\coprod': '\\dotsb',
-  '\\bigvee': '\\dotsb',
-  '\\bigwedge': '\\dotsb',
-  '\\biguplus': '\\dotsb',
-  '\\bigcap': '\\dotsb',
-  '\\bigcup': '\\dotsb',
-  '\\prod': '\\dotsb',
-  '\\sum': '\\dotsb',
-  '\\bigotimes': '\\dotsb',
-  '\\bigoplus': '\\dotsb',
-  '\\bigodot': '\\dotsb',
-  '\\bigsqcup': '\\dotsb',
-  '\\And': '\\dotsb',
-  '\\longrightarrow': '\\dotsb',
-  '\\Longrightarrow': '\\dotsb',
-  '\\longleftarrow': '\\dotsb',
-  '\\Longleftarrow': '\\dotsb',
-  '\\longleftrightarrow': '\\dotsb',
-  '\\Longleftrightarrow': '\\dotsb',
-  '\\mapsto': '\\dotsb',
-  '\\longmapsto': '\\dotsb',
-  '\\hookrightarrow': '\\dotsb',
-  '\\doteq': '\\dotsb',
-  // Symbols whose definition starts with \mathbin:
-  '\\mathbin': '\\dotsb',
-  // Symbols whose definition starts with \mathrel:
-  '\\mathrel': '\\dotsb',
-  '\\relbar': '\\dotsb',
-  '\\Relbar': '\\dotsb',
-  '\\xrightarrow': '\\dotsb',
-  '\\xleftarrow': '\\dotsb',
-  // Symbols whose definition starts with \DOTSI:
-  '\\DOTSI': '\\dotsi',
-  '\\int': '\\dotsi',
-  '\\oint': '\\dotsi',
-  '\\iint': '\\dotsi',
-  '\\iiint': '\\dotsi',
-  '\\iiiint': '\\dotsi',
-  '\\idotsint': '\\dotsi',
-  // Symbols whose definition starts with \DOTSX:
-  '\\DOTSX': '\\dotsx'
-};
-defineMacro("\\dots", function (context) {
-  // TODO: If used in text mode, should expand to \textellipsis.
-  // However, in KaTeX, \textellipsis and \ldots behave the same
-  // (in text mode), and it's unlikely we'd see any of the math commands
-  // that affect the behavior of \dots when in text mode.  So fine for now
-  // (until we support \ifmmode ... \else ... \fi).
-  let thedots = '\\dotso';
-  const next = context.expandAfterFuture().text;
-
-  if (next in dotsByToken) {
-    thedots = dotsByToken[next];
-  } else if (next.substr(0, 4) === '\\not') {
-    thedots = '\\dotsb';
-  } else if (next in symbols.math) {
-    if (utils.contains(['bin', 'rel'], symbols.math[next].group)) {
-      thedots = '\\dotsb';
-    }
-  }
-
-  return thedots;
-});
-const spaceAfterDots = {
-  // \rightdelim@ checks for the following:
-  ')': true,
-  ']': true,
-  '\\rbrack': true,
-  '\\}': true,
-  '\\rbrace': true,
-  '\\rangle': true,
-  '\\rceil': true,
-  '\\rfloor': true,
-  '\\rgroup': true,
-  '\\rmoustache': true,
-  '\\right': true,
-  '\\bigr': true,
-  '\\biggr': true,
-  '\\Bigr': true,
-  '\\Biggr': true,
-  // \extra@ also tests for the following:
-  '$': true,
-  // \extrap@ checks for the following:
-  ';': true,
-  '.': true,
-  ',': true
-};
-defineMacro("\\dotso", function (context) {
-  const next = context.future().text;
-
-  if (next in spaceAfterDots) {
-    return "\\ldots\\,";
-  } else {
-    return "\\ldots";
-  }
-});
-defineMacro("\\dotsc", function (context) {
-  const next = context.future().text; // \dotsc uses \extra@ but not \extrap@, instead specially checking for
-  // ';' and '.', but doesn't check for ','.
-
-  if (next in spaceAfterDots && next !== ',') {
-    return "\\ldots\\,";
-  } else {
-    return "\\ldots";
-  }
-});
-defineMacro("\\cdots", function (context) {
-  const next = context.future().text;
-
-  if (next in spaceAfterDots) {
-    return "\\@cdots\\,";
-  } else {
-    return "\\@cdots";
-  }
-});
-defineMacro("\\dotsb", "\\cdots");
-defineMacro("\\dotsm", "\\cdots");
-defineMacro("\\dotsi", "\\!\\cdots"); // amsmath doesn't actually define \dotsx, but \dots followed by a macro
-// starting with \DOTSX implies \dotso, and then \extra@ detects this case
-// and forces the added `\,`.
-
-defineMacro("\\dotsx", "\\ldots\\,"); // \let\DOTSI\relax
-// \let\DOTSB\relax
-// \let\DOTSX\relax
-
-defineMacro("\\DOTSI", "\\relax");
-defineMacro("\\DOTSB", "\\relax");
-defineMacro("\\DOTSX", "\\relax"); // Spacing, based on amsmath.sty's override of LaTeX defaults
-// \DeclareRobustCommand{\tmspace}[3]{%
-//   \ifmmode\mskip#1#2\else\kern#1#3\fi\relax}
-
-defineMacro("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"); // \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}}
-// TODO: math mode should use \thinmuskip
-
-defineMacro("\\,", "\\tmspace+{3mu}{.1667em}"); // \let\thinspace\,
-
-defineMacro("\\thinspace", "\\,"); // \def\>{\mskip\medmuskip}
-// \renewcommand{\:}{\tmspace+\medmuskip{.2222em}}
-// TODO: \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu
-
-defineMacro("\\>", "\\mskip{4mu}");
-defineMacro("\\:", "\\tmspace+{4mu}{.2222em}"); // \let\medspace\:
-
-defineMacro("\\medspace", "\\:"); // \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}}
-// TODO: math mode should use \thickmuskip = 5mu plus 5mu
-
-defineMacro("\\;", "\\tmspace+{5mu}{.2777em}"); // \let\thickspace\;
-
-defineMacro("\\thickspace", "\\;"); // \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}}
-// TODO: math mode should use \thinmuskip
-
-defineMacro("\\!", "\\tmspace-{3mu}{.1667em}"); // \let\negthinspace\!
-
-defineMacro("\\negthinspace", "\\!"); // \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}}
-// TODO: math mode should use \medmuskip
-
-defineMacro("\\negmedspace", "\\tmspace-{4mu}{.2222em}"); // \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}}
-// TODO: math mode should use \thickmuskip
-
-defineMacro("\\negthickspace", "\\tmspace-{5mu}{.277em}"); // \def\enspace{\kern.5em }
-
-defineMacro("\\enspace", "\\kern.5em "); // \def\enskip{\hskip.5em\relax}
-
-defineMacro("\\enskip", "\\hskip.5em\\relax"); // \def\quad{\hskip1em\relax}
-
-defineMacro("\\quad", "\\hskip1em\\relax"); // \def\qquad{\hskip2em\relax}
-
-defineMacro("\\qquad", "\\hskip2em\\relax"); // \tag@in@display form of \tag
-
-defineMacro("\\tag", "\\@ifstar\\tag@literal\\tag@paren");
-defineMacro("\\tag@paren", "\\tag@literal{({#1})}");
-defineMacro("\\tag@literal", context => {
-  if (context.macros.get("\\df@tag")) {
-    throw new ParseError("Multiple \\tag");
-  }
-
-  return "\\gdef\\df@tag{\\text{#1}}";
-}); // \renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin
-//   {\operator@font mod}\penalty900
-//   \mkern5mu\nonscript\mskip-\medmuskip}
-// \newcommand{\pod}[1]{\allowbreak
-//   \if@display\mkern18mu\else\mkern8mu\fi(#1)}
-// \renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}}
-// \newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu
-//   \else\mkern12mu\fi{\operator@font mod}\,\,#1}
-// TODO: math mode should use \medmuskip = 4mu plus 2mu minus 4mu
-
-defineMacro("\\bmod", "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}" + "\\mathbin{\\rm mod}" + "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");
-defineMacro("\\pod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");
-defineMacro("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}");
-defineMacro("\\mod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}" + "{\\rm mod}\\,\\,#1"); // \pmb    --   A simulation of bold.
-// The version in ambsy.sty works by typesetting three copies of the argument
-// with small offsets. We use two copies. We omit the vertical offset because
-// of rendering problems that makeVList encounters in Safari.
-
-defineMacro("\\pmb", "\\html@mathml{" + "\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}" + "{\\mathbf{#1}}"); //////////////////////////////////////////////////////////////////////
-// LaTeX source2e
-// \\ defaults to \newline, but changes to \cr within array environment
-
-defineMacro("\\\\", "\\newline"); // \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@}
-// TODO: Doesn't normally work in math mode because \@ fails.  KaTeX doesn't
-// support \@ yet, so that's omitted, and we add \text so that the result
-// doesn't look funny in math mode.
-
-defineMacro("\\TeX", "\\textrm{\\html@mathml{" + "T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX" + "}{TeX}}"); // \DeclareRobustCommand{\LaTeX}{L\kern-.36em%
-//         {\sbox\z@ T%
-//          \vbox to\ht\z@{\hbox{\check@mathfonts
-//                               \fontsize\sf@size\z@
-//                               \math@fontsfalse\selectfont
-//                               A}%
-//                         \vss}%
-//         }%
-//         \kern-.15em%
-//         \TeX}
-// This code aligns the top of the A with the T (from the perspective of TeX's
-// boxes, though visually the A appears to extend above slightly).
-// We compute the corresponding \raisebox when A is rendered in \normalsize
-// \scriptstyle, which has a scale factor of 0.7 (see Options.js).
-
-const latexRaiseA = metricMap['Main-Regular']["T".charCodeAt(0)][1] - 0.7 * metricMap['Main-Regular']["A".charCodeAt(0)][1] + "em";
-defineMacro("\\LaTeX", "\\textrm{\\html@mathml{" + `L\\kern-.36em\\raisebox{${latexRaiseA}}{\\scriptstyle A}` + "\\kern-.15em\\TeX}{LaTeX}}"); // New KaTeX logo based on tweaking LaTeX logo
-
-defineMacro("\\KaTeX", "\\textrm{\\html@mathml{" + `K\\kern-.17em\\raisebox{${latexRaiseA}}{\\scriptstyle A}` + "\\kern-.15em\\TeX}{KaTeX}}"); // \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace}
-// \def\@hspace#1{\hskip  #1\relax}
-// \def\@hspacer#1{\vrule \@width\z@\nobreak
-//                 \hskip #1\hskip \z@skip}
-
-defineMacro("\\hspace", "\\@ifstar\\@hspacer\\@hspace");
-defineMacro("\\@hspace", "\\hskip #1\\relax");
-defineMacro("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"); //////////////////////////////////////////////////////////////////////
-// mathtools.sty
-//\providecommand\ordinarycolon{:}
-
-defineMacro("\\ordinarycolon", ":"); //\def\vcentcolon{\mathrel{\mathop\ordinarycolon}}
-//TODO(edemaine): Not yet centered. Fix via \raisebox or #726
-
-defineMacro("\\vcentcolon", "\\mathrel{\\mathop\\ordinarycolon}"); // \providecommand*\dblcolon{\vcentcolon\mathrel{\mkern-.9mu}\vcentcolon}
-
-defineMacro("\\dblcolon", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}" + "{\\mathop{\\char\"2237}}"); // \providecommand*\coloneqq{\vcentcolon\mathrel{\mkern-1.2mu}=}
-
-defineMacro("\\coloneqq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2254}}"); // ≔
-// \providecommand*\Coloneqq{\dblcolon\mathrel{\mkern-1.2mu}=}
-
-defineMacro("\\Coloneqq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2237\\char\"3d}}"); // \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}}
-
-defineMacro("\\coloneq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"3a\\char\"2212}}"); // \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}}
-
-defineMacro("\\Coloneq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"2237\\char\"2212}}"); // \providecommand*\eqqcolon{=\mathrel{\mkern-1.2mu}\vcentcolon}
-
-defineMacro("\\eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2255}}"); // ≕
-// \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon}
-
-defineMacro("\\Eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"3d\\char\"2237}}"); // \providecommand*\eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\vcentcolon}
-
-defineMacro("\\eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2239}}"); // \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon}
-
-defineMacro("\\Eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"2212\\char\"2237}}"); // \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx}
-
-defineMacro("\\colonapprox", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"3a\\char\"2248}}"); // \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx}
-
-defineMacro("\\Colonapprox", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"2237\\char\"2248}}"); // \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim}
-
-defineMacro("\\colonsim", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"3a\\char\"223c}}"); // \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim}
-
-defineMacro("\\Colonsim", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"2237\\char\"223c}}"); // Some Unicode characters are implemented with macros to mathtools functions.
-
-defineMacro("\u2237", "\\dblcolon"); // ::
-
-defineMacro("\u2239", "\\eqcolon"); // -:
-
-defineMacro("\u2254", "\\coloneqq"); // :=
-
-defineMacro("\u2255", "\\eqqcolon"); // =:
-
-defineMacro("\u2A74", "\\Coloneqq"); // ::=
-//////////////////////////////////////////////////////////////////////
-// colonequals.sty
-// Alternate names for mathtools's macros:
-
-defineMacro("\\ratio", "\\vcentcolon");
-defineMacro("\\coloncolon", "\\dblcolon");
-defineMacro("\\colonequals", "\\coloneqq");
-defineMacro("\\coloncolonequals", "\\Coloneqq");
-defineMacro("\\equalscolon", "\\eqqcolon");
-defineMacro("\\equalscoloncolon", "\\Eqqcolon");
-defineMacro("\\colonminus", "\\coloneq");
-defineMacro("\\coloncolonminus", "\\Coloneq");
-defineMacro("\\minuscolon", "\\eqcolon");
-defineMacro("\\minuscoloncolon", "\\Eqcolon"); // \colonapprox name is same in mathtools and colonequals.
-
-defineMacro("\\coloncolonapprox", "\\Colonapprox"); // \colonsim name is same in mathtools and colonequals.
-
-defineMacro("\\coloncolonsim", "\\Colonsim"); // Additional macros, implemented by analogy with mathtools definitions:
-
-defineMacro("\\simcolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");
-defineMacro("\\simcoloncolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");
-defineMacro("\\approxcolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");
-defineMacro("\\approxcoloncolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"); // Present in newtxmath, pxfonts and txfonts
-
-defineMacro("\\notni", "\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");
-defineMacro("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}");
-defineMacro("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"); //////////////////////////////////////////////////////////////////////
-// MathML alternates for KaTeX glyphs in the Unicode private area
-
-defineMacro("\\gvertneqq", "\\html@mathml{\\@gvertneqq}{\u2269}");
-defineMacro("\\lvertneqq", "\\html@mathml{\\@lvertneqq}{\u2268}");
-defineMacro("\\ngeqq", "\\html@mathml{\\@ngeqq}{\u2271}");
-defineMacro("\\ngeqslant", "\\html@mathml{\\@ngeqslant}{\u2271}");
-defineMacro("\\nleqq", "\\html@mathml{\\@nleqq}{\u2270}");
-defineMacro("\\nleqslant", "\\html@mathml{\\@nleqslant}{\u2270}");
-defineMacro("\\nshortmid", "\\html@mathml{\\@nshortmid}{∤}");
-defineMacro("\\nshortparallel", "\\html@mathml{\\@nshortparallel}{∦}");
-defineMacro("\\nsubseteqq", "\\html@mathml{\\@nsubseteqq}{\u2288}");
-defineMacro("\\nsupseteqq", "\\html@mathml{\\@nsupseteqq}{\u2289}");
-defineMacro("\\varsubsetneq", "\\html@mathml{\\@varsubsetneq}{⊊}");
-defineMacro("\\varsubsetneqq", "\\html@mathml{\\@varsubsetneqq}{⫋}");
-defineMacro("\\varsupsetneq", "\\html@mathml{\\@varsupsetneq}{⊋}");
-defineMacro("\\varsupsetneqq", "\\html@mathml{\\@varsupsetneqq}{⫌}"); //////////////////////////////////////////////////////////////////////
-// stmaryrd and semantic
-// The stmaryrd and semantic packages render the next four items by calling a
-// glyph. Those glyphs do not exist in the KaTeX fonts. Hence the macros.
-
-defineMacro("\\llbracket", "\\html@mathml{" + "\\mathopen{[\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u27e6}}");
-defineMacro("\\rrbracket", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu]}}" + "{\\mathclose{\\char`\u27e7}}");
-defineMacro("\u27e6", "\\llbracket"); // blackboard bold [
-
-defineMacro("\u27e7", "\\rrbracket"); // blackboard bold ]
-
-defineMacro("\\lBrace", "\\html@mathml{" + "\\mathopen{\\{\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u2983}}");
-defineMacro("\\rBrace", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu\\}}}" + "{\\mathclose{\\char`\u2984}}");
-defineMacro("\u2983", "\\lBrace"); // blackboard bold {
-
-defineMacro("\u2984", "\\rBrace"); // blackboard bold }
-// TODO: Create variable sized versions of the last two items. I believe that
-// will require new font glyphs.
-//////////////////////////////////////////////////////////////////////
-// texvc.sty
-// The texvc package contains macros available in mediawiki pages.
-// We omit the functions deprecated at
-// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax
-// We also omit texvc's \O, which conflicts with \text{\O}
-
-defineMacro("\\darr", "\\downarrow");
-defineMacro("\\dArr", "\\Downarrow");
-defineMacro("\\Darr", "\\Downarrow");
-defineMacro("\\lang", "\\langle");
-defineMacro("\\rang", "\\rangle");
-defineMacro("\\uarr", "\\uparrow");
-defineMacro("\\uArr", "\\Uparrow");
-defineMacro("\\Uarr", "\\Uparrow");
-defineMacro("\\N", "\\mathbb{N}");
-defineMacro("\\R", "\\mathbb{R}");
-defineMacro("\\Z", "\\mathbb{Z}");
-defineMacro("\\alef", "\\aleph");
-defineMacro("\\alefsym", "\\aleph");
-defineMacro("\\Alpha", "\\mathrm{A}");
-defineMacro("\\Beta", "\\mathrm{B}");
-defineMacro("\\bull", "\\bullet");
-defineMacro("\\Chi", "\\mathrm{X}");
-defineMacro("\\clubs", "\\clubsuit");
-defineMacro("\\cnums", "\\mathbb{C}");
-defineMacro("\\Complex", "\\mathbb{C}");
-defineMacro("\\Dagger", "\\ddagger");
-defineMacro("\\diamonds", "\\diamondsuit");
-defineMacro("\\empty", "\\emptyset");
-defineMacro("\\Epsilon", "\\mathrm{E}");
-defineMacro("\\Eta", "\\mathrm{H}");
-defineMacro("\\exist", "\\exists");
-defineMacro("\\harr", "\\leftrightarrow");
-defineMacro("\\hArr", "\\Leftrightarrow");
-defineMacro("\\Harr", "\\Leftrightarrow");
-defineMacro("\\hearts", "\\heartsuit");
-defineMacro("\\image", "\\Im");
-defineMacro("\\infin", "\\infty");
-defineMacro("\\Iota", "\\mathrm{I}");
-defineMacro("\\isin", "\\in");
-defineMacro("\\Kappa", "\\mathrm{K}");
-defineMacro("\\larr", "\\leftarrow");
-defineMacro("\\lArr", "\\Leftarrow");
-defineMacro("\\Larr", "\\Leftarrow");
-defineMacro("\\lrarr", "\\leftrightarrow");
-defineMacro("\\lrArr", "\\Leftrightarrow");
-defineMacro("\\Lrarr", "\\Leftrightarrow");
-defineMacro("\\Mu", "\\mathrm{M}");
-defineMacro("\\natnums", "\\mathbb{N}");
-defineMacro("\\Nu", "\\mathrm{N}");
-defineMacro("\\Omicron", "\\mathrm{O}");
-defineMacro("\\plusmn", "\\pm");
-defineMacro("\\rarr", "\\rightarrow");
-defineMacro("\\rArr", "\\Rightarrow");
-defineMacro("\\Rarr", "\\Rightarrow");
-defineMacro("\\real", "\\Re");
-defineMacro("\\reals", "\\mathbb{R}");
-defineMacro("\\Reals", "\\mathbb{R}");
-defineMacro("\\Rho", "\\mathrm{P}");
-defineMacro("\\sdot", "\\cdot");
-defineMacro("\\sect", "\\S");
-defineMacro("\\spades", "\\spadesuit");
-defineMacro("\\sub", "\\subset");
-defineMacro("\\sube", "\\subseteq");
-defineMacro("\\supe", "\\supseteq");
-defineMacro("\\Tau", "\\mathrm{T}");
-defineMacro("\\thetasym", "\\vartheta"); // TODO: defineMacro("\\varcoppa", "\\\mbox{\\coppa}");
-
-defineMacro("\\weierp", "\\wp");
-defineMacro("\\Zeta", "\\mathrm{Z}"); //////////////////////////////////////////////////////////////////////
-// statmath.sty
-// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf
-
-defineMacro("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}");
-defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}");
-defineMacro("\\plim", "\\DOTSB\\mathop{\\operatorname{plim}}\\limits"); // Custom Khan Academy colors, should be moved to an optional package
-
-defineMacro("\\blue", "\\textcolor{##6495ed}{#1}");
-defineMacro("\\orange", "\\textcolor{##ffa500}{#1}");
-defineMacro("\\pink", "\\textcolor{##ff00af}{#1}");
-defineMacro("\\red", "\\textcolor{##df0030}{#1}");
-defineMacro("\\green", "\\textcolor{##28ae7b}{#1}");
-defineMacro("\\gray", "\\textcolor{gray}{#1}");
-defineMacro("\\purple", "\\textcolor{##9d38bd}{#1}");
-defineMacro("\\blueA", "\\textcolor{##ccfaff}{#1}");
-defineMacro("\\blueB", "\\textcolor{##80f6ff}{#1}");
-defineMacro("\\blueC", "\\textcolor{##63d9ea}{#1}");
-defineMacro("\\blueD", "\\textcolor{##11accd}{#1}");
-defineMacro("\\blueE", "\\textcolor{##0c7f99}{#1}");
-defineMacro("\\tealA", "\\textcolor{##94fff5}{#1}");
-defineMacro("\\tealB", "\\textcolor{##26edd5}{#1}");
-defineMacro("\\tealC", "\\textcolor{##01d1c1}{#1}");
-defineMacro("\\tealD", "\\textcolor{##01a995}{#1}");
-defineMacro("\\tealE", "\\textcolor{##208170}{#1}");
-defineMacro("\\greenA", "\\textcolor{##b6ffb0}{#1}");
-defineMacro("\\greenB", "\\textcolor{##8af281}{#1}");
-defineMacro("\\greenC", "\\textcolor{##74cf70}{#1}");
-defineMacro("\\greenD", "\\textcolor{##1fab54}{#1}");
-defineMacro("\\greenE", "\\textcolor{##0d923f}{#1}");
-defineMacro("\\goldA", "\\textcolor{##ffd0a9}{#1}");
-defineMacro("\\goldB", "\\textcolor{##ffbb71}{#1}");
-defineMacro("\\goldC", "\\textcolor{##ff9c39}{#1}");
-defineMacro("\\goldD", "\\textcolor{##e07d10}{#1}");
-defineMacro("\\goldE", "\\textcolor{##a75a05}{#1}");
-defineMacro("\\redA", "\\textcolor{##fca9a9}{#1}");
-defineMacro("\\redB", "\\textcolor{##ff8482}{#1}");
-defineMacro("\\redC", "\\textcolor{##f9685d}{#1}");
-defineMacro("\\redD", "\\textcolor{##e84d39}{#1}");
-defineMacro("\\redE", "\\textcolor{##bc2612}{#1}");
-defineMacro("\\maroonA", "\\textcolor{##ffbde0}{#1}");
-defineMacro("\\maroonB", "\\textcolor{##ff92c6}{#1}");
-defineMacro("\\maroonC", "\\textcolor{##ed5fa6}{#1}");
-defineMacro("\\maroonD", "\\textcolor{##ca337c}{#1}");
-defineMacro("\\maroonE", "\\textcolor{##9e034e}{#1}");
-defineMacro("\\purpleA", "\\textcolor{##ddd7ff}{#1}");
-defineMacro("\\purpleB", "\\textcolor{##c6b9fc}{#1}");
-defineMacro("\\purpleC", "\\textcolor{##aa87ff}{#1}");
-defineMacro("\\purpleD", "\\textcolor{##7854ab}{#1}");
-defineMacro("\\purpleE", "\\textcolor{##543b78}{#1}");
-defineMacro("\\mintA", "\\textcolor{##f5f9e8}{#1}");
-defineMacro("\\mintB", "\\textcolor{##edf2df}{#1}");
-defineMacro("\\mintC", "\\textcolor{##e0e5cc}{#1}");
-defineMacro("\\grayA", "\\textcolor{##f6f7f7}{#1}");
-defineMacro("\\grayB", "\\textcolor{##f0f1f2}{#1}");
-defineMacro("\\grayC", "\\textcolor{##e3e5e6}{#1}");
-defineMacro("\\grayD", "\\textcolor{##d6d8da}{#1}");
-defineMacro("\\grayE", "\\textcolor{##babec2}{#1}");
-defineMacro("\\grayF", "\\textcolor{##888d93}{#1}");
-defineMacro("\\grayG", "\\textcolor{##626569}{#1}");
-defineMacro("\\grayH", "\\textcolor{##3b3e40}{#1}");
-defineMacro("\\grayI", "\\textcolor{##21242c}{#1}");
-defineMacro("\\kaBlue", "\\textcolor{##314453}{#1}");
-defineMacro("\\kaGreen", "\\textcolor{##71B307}{#1}");
-
-/**
- * This file contains the “gullet” where macros are expanded
- * until only non-macro tokens remain.
- */
-// List of commands that act like macros but aren't defined as a macro,
-// function, or symbol.  Used in `isDefined`.
-const implicitCommands = {
-  "\\relax": true,
-  // MacroExpander.js
-  "^": true,
-  // Parser.js
-  "_": true,
-  // Parser.js
-  "\\limits": true,
-  // Parser.js
-  "\\nolimits": true // Parser.js
-
-};
-class MacroExpander {
-  constructor(input, settings, mode) {
-    this.settings = void 0;
-    this.expansionCount = void 0;
-    this.lexer = void 0;
-    this.macros = void 0;
-    this.stack = void 0;
-    this.mode = void 0;
-    this.settings = settings;
-    this.expansionCount = 0;
-    this.feed(input); // Make new global namespace
-
-    this.macros = new Namespace(builtinMacros, settings.macros);
-    this.mode = mode;
-    this.stack = []; // contains tokens in REVERSE order
-  }
-  /**
-   * Feed a new input string to the same MacroExpander
-   * (with existing macros etc.).
-   */
-
-
-  feed(input) {
-    this.lexer = new Lexer(input, this.settings);
-  }
-  /**
-   * Switches between "text" and "math" modes.
-   */
-
-
-  switchMode(newMode) {
-    this.mode = newMode;
-  }
-  /**
-   * Start a new group nesting within all namespaces.
-   */
-
-
-  beginGroup() {
-    this.macros.beginGroup();
-  }
-  /**
-   * End current group nesting within all namespaces.
-   */
-
-
-  endGroup() {
-    this.macros.endGroup();
-  }
-  /**
-   * Returns the topmost token on the stack, without expanding it.
-   * Similar in behavior to TeX's `\futurelet`.
-   */
-
-
-  future() {
-    if (this.stack.length === 0) {
-      this.pushToken(this.lexer.lex());
-    }
-
-    return this.stack[this.stack.length - 1];
-  }
-  /**
-   * Remove and return the next unexpanded token.
-   */
-
-
-  popToken() {
-    this.future(); // ensure non-empty stack
-
-    return this.stack.pop();
-  }
-  /**
-   * Add a given token to the token stack.  In particular, this get be used
-   * to put back a token returned from one of the other methods.
-   */
-
-
-  pushToken(token) {
-    this.stack.push(token);
-  }
-  /**
-   * Append an array of tokens to the token stack.
-   */
-
-
-  pushTokens(tokens) {
-    this.stack.push(...tokens);
-  }
-  /**
-   * Consume all following space tokens, without expansion.
-   */
-
-
-  consumeSpaces() {
-    for (;;) {
-      const token = this.future();
-
-      if (token.text === " ") {
-        this.stack.pop();
-      } else {
-        break;
-      }
-    }
-  }
-  /**
-   * Consume the specified number of arguments from the token stream,
-   * and return the resulting array of arguments.
-   */
-
-
-  consumeArgs(numArgs) {
-    const args = []; // obtain arguments, either single token or balanced {…} group
-
-    for (let i = 0; i < numArgs; ++i) {
-      this.consumeSpaces(); // ignore spaces before each argument
-
-      const startOfArg = this.popToken();
-
-      if (startOfArg.text === "{") {
-        const arg = [];
-        let depth = 1;
-
-        while (depth !== 0) {
-          const tok = this.popToken();
-          arg.push(tok);
-
-          if (tok.text === "{") {
-            ++depth;
-          } else if (tok.text === "}") {
-            --depth;
-          } else if (tok.text === "EOF") {
-            throw new ParseError("End of input in macro argument", startOfArg);
-          }
-        }
-
-        arg.pop(); // remove last }
-
-        arg.reverse(); // like above, to fit in with stack order
-
-        args[i] = arg;
-      } else if (startOfArg.text === "EOF") {
-        throw new ParseError("End of input expecting macro argument");
-      } else {
-        args[i] = [startOfArg];
-      }
-    }
-
-    return args;
-  }
-  /**
-   * Expand the next token only once if possible.
-   *
-   * If the token is expanded, the resulting tokens will be pushed onto
-   * the stack in reverse order and will be returned as an array,
-   * also in reverse order.
-   *
-   * If not, the next token will be returned without removing it
-   * from the stack.  This case can be detected by a `Token` return value
-   * instead of an `Array` return value.
-   *
-   * In either case, the next token will be on the top of the stack,
-   * or the stack will be empty.
-   *
-   * Used to implement `expandAfterFuture` and `expandNextToken`.
-   *
-   * At the moment, macro expansion doesn't handle delimited macros,
-   * i.e. things like those defined by \def\foo#1\end{…}.
-   * See the TeX book page 202ff. for details on how those should behave.
-   */
-
-
-  expandOnce() {
-    const topToken = this.popToken();
-    const name = topToken.text;
-
-    const expansion = this._getExpansion(name);
-
-    if (expansion == null) {
-      // mainly checking for undefined here
-      // Fully expanded
-      this.pushToken(topToken);
-      return topToken;
-    }
-
-    this.expansionCount++;
-
-    if (this.expansionCount > this.settings.maxExpand) {
-      throw new ParseError("Too many expansions: infinite loop or " + "need to increase maxExpand setting");
-    }
-
-    let tokens = expansion.tokens;
-
-    if (expansion.numArgs) {
-      const args = this.consumeArgs(expansion.numArgs); // paste arguments in place of the placeholders
-
-      tokens = tokens.slice(); // make a shallow copy
-
-      for (let i = tokens.length - 1; i >= 0; --i) {
-        let tok = tokens[i];
-
-        if (tok.text === "#") {
-          if (i === 0) {
-            throw new ParseError("Incomplete placeholder at end of macro body", tok);
-          }
-
-          tok = tokens[--i]; // next token on stack
-
-          if (tok.text === "#") {
-            // ## → #
-            tokens.splice(i + 1, 1); // drop first #
-          } else if (/^[1-9]$/.test(tok.text)) {
-            // replace the placeholder with the indicated argument
-            tokens.splice(i, 2, ...args[+tok.text - 1]);
-          } else {
-            throw new ParseError("Not a valid argument number", tok);
-          }
-        }
-      }
-    } // Concatenate expansion onto top of stack.
-
-
-    this.pushTokens(tokens);
-    return tokens;
-  }
-  /**
-   * Expand the next token only once (if possible), and return the resulting
-   * top token on the stack (without removing anything from the stack).
-   * Similar in behavior to TeX's `\expandafter\futurelet`.
-   * Equivalent to expandOnce() followed by future().
-   */
-
-
-  expandAfterFuture() {
-    this.expandOnce();
-    return this.future();
-  }
-  /**
-   * Recursively expand first token, then return first non-expandable token.
-   */
-
-
-  expandNextToken() {
-    for (;;) {
-      const expanded = this.expandOnce(); // expandOnce returns Token if and only if it's fully expanded.
-
-      if (expanded instanceof Token) {
-        // \relax stops the expansion, but shouldn't get returned (a
-        // null return value couldn't get implemented as a function).
-        if (expanded.text === "\\relax") {
-          this.stack.pop();
-        } else {
-          return this.stack.pop(); // === expanded
-        }
-      }
-    } // Flow unable to figure out that this pathway is impossible.
-    // https://github.com/facebook/flow/issues/4808
-
-
-    throw new Error(); // eslint-disable-line no-unreachable
-  }
-  /**
-   * Fully expand the given macro name and return the resulting list of
-   * tokens, or return `undefined` if no such macro is defined.
-   */
-
-
-  expandMacro(name) {
-    if (!this.macros.get(name)) {
-      return undefined;
-    }
-
-    const output = [];
-    const oldStackLength = this.stack.length;
-    this.pushToken(new Token(name));
-
-    while (this.stack.length > oldStackLength) {
-      const expanded = this.expandOnce(); // expandOnce returns Token if and only if it's fully expanded.
-
-      if (expanded instanceof Token) {
-        output.push(this.stack.pop());
-      }
-    }
-
-    return output;
-  }
-  /**
-   * Fully expand the given macro name and return the result as a string,
-   * or return `undefined` if no such macro is defined.
-   */
-
-
-  expandMacroAsText(name) {
-    const tokens = this.expandMacro(name);
-
-    if (tokens) {
-      return tokens.map(token => token.text).join("");
-    } else {
-      return tokens;
-    }
-  }
-  /**
-   * Returns the expanded macro as a reversed array of tokens and a macro
-   * argument count.  Or returns `null` if no such macro.
-   */
-
-
-  _getExpansion(name) {
-    const definition = this.macros.get(name);
-
-    if (definition == null) {
-      // mainly checking for undefined here
-      return definition;
-    }
-
-    const expansion = typeof definition === "function" ? definition(this) : definition;
-
-    if (typeof expansion === "string") {
-      let numArgs = 0;
-
-      if (expansion.indexOf("#") !== -1) {
-        const stripped = expansion.replace(/##/g, "");
-
-        while (stripped.indexOf("#" + (numArgs + 1)) !== -1) {
-          ++numArgs;
-        }
-      }
-
-      const bodyLexer = new Lexer(expansion, this.settings);
-      const tokens = [];
-      let tok = bodyLexer.lex();
-
-      while (tok.text !== "EOF") {
-        tokens.push(tok);
-        tok = bodyLexer.lex();
-      }
-
-      tokens.reverse(); // to fit in with stack using push and pop
-
-      const expanded = {
-        tokens,
-        numArgs
-      };
-      return expanded;
-    }
-
-    return expansion;
-  }
-  /**
-   * Determine whether a command is currently "defined" (has some
-   * functionality), meaning that it's a macro (in the current group),
-   * a function, a symbol, or one of the special commands listed in
-   * `implicitCommands`.
-   */
-
-
-  isDefined(name) {
-    return this.macros.has(name) || functions.hasOwnProperty(name) || symbols.math.hasOwnProperty(name) || symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name);
-  }
-
-}
-
-// Mapping of Unicode accent characters to their LaTeX equivalent in text and
-// math mode (when they exist).
-var unicodeAccents = {
-  '\u0301': {
-    text: "\\'",
-    math: '\\acute'
-  },
-  '\u0300': {
-    text: '\\`',
-    math: '\\grave'
-  },
-  '\u0308': {
-    text: '\\"',
-    math: '\\ddot'
-  },
-  '\u0303': {
-    text: '\\~',
-    math: '\\tilde'
-  },
-  '\u0304': {
-    text: '\\=',
-    math: '\\bar'
-  },
-  '\u0306': {
-    text: '\\u',
-    math: '\\breve'
-  },
-  '\u030c': {
-    text: '\\v',
-    math: '\\check'
-  },
-  '\u0302': {
-    text: '\\^',
-    math: '\\hat'
-  },
-  '\u0307': {
-    text: '\\.',
-    math: '\\dot'
-  },
-  '\u030a': {
-    text: '\\r',
-    math: '\\mathring'
-  },
-  '\u030b': {
-    text: '\\H'
-  }
-};
-
-// This file is GENERATED by unicodeMake.js. DO NOT MODIFY.
-var unicodeSymbols = {
-  "\u00e1": "\u0061\u0301",
-  // á = \'{a}
-  "\u00e0": "\u0061\u0300",
-  // à = \`{a}
-  "\u00e4": "\u0061\u0308",
-  // ä = \"{a}
-  "\u01df": "\u0061\u0308\u0304",
-  // ǟ = \"\={a}
-  "\u00e3": "\u0061\u0303",
-  // ã = \~{a}
-  "\u0101": "\u0061\u0304",
-  // ā = \={a}
-  "\u0103": "\u0061\u0306",
-  // ă = \u{a}
-  "\u1eaf": "\u0061\u0306\u0301",
-  // ắ = \u\'{a}
-  "\u1eb1": "\u0061\u0306\u0300",
-  // ằ = \u\`{a}
-  "\u1eb5": "\u0061\u0306\u0303",
-  // ẵ = \u\~{a}
-  "\u01ce": "\u0061\u030c",
-  // ǎ = \v{a}
-  "\u00e2": "\u0061\u0302",
-  // â = \^{a}
-  "\u1ea5": "\u0061\u0302\u0301",
-  // ấ = \^\'{a}
-  "\u1ea7": "\u0061\u0302\u0300",
-  // ầ = \^\`{a}
-  "\u1eab": "\u0061\u0302\u0303",
-  // ẫ = \^\~{a}
-  "\u0227": "\u0061\u0307",
-  // ȧ = \.{a}
-  "\u01e1": "\u0061\u0307\u0304",
-  // ǡ = \.\={a}
-  "\u00e5": "\u0061\u030a",
-  // å = \r{a}
-  "\u01fb": "\u0061\u030a\u0301",
-  // ǻ = \r\'{a}
-  "\u1e03": "\u0062\u0307",
-  // ḃ = \.{b}
-  "\u0107": "\u0063\u0301",
-  // ć = \'{c}
-  "\u010d": "\u0063\u030c",
-  // č = \v{c}
-  "\u0109": "\u0063\u0302",
-  // ĉ = \^{c}
-  "\u010b": "\u0063\u0307",
-  // ċ = \.{c}
-  "\u010f": "\u0064\u030c",
-  // ď = \v{d}
-  "\u1e0b": "\u0064\u0307",
-  // ḋ = \.{d}
-  "\u00e9": "\u0065\u0301",
-  // é = \'{e}
-  "\u00e8": "\u0065\u0300",
-  // è = \`{e}
-  "\u00eb": "\u0065\u0308",
-  // ë = \"{e}
-  "\u1ebd": "\u0065\u0303",
-  // ẽ = \~{e}
-  "\u0113": "\u0065\u0304",
-  // ē = \={e}
-  "\u1e17": "\u0065\u0304\u0301",
-  // ḗ = \=\'{e}
-  "\u1e15": "\u0065\u0304\u0300",
-  // ḕ = \=\`{e}
-  "\u0115": "\u0065\u0306",
-  // ĕ = \u{e}
-  "\u011b": "\u0065\u030c",
-  // ě = \v{e}
-  "\u00ea": "\u0065\u0302",
-  // ê = \^{e}
-  "\u1ebf": "\u0065\u0302\u0301",
-  // ế = \^\'{e}
-  "\u1ec1": "\u0065\u0302\u0300",
-  // ề = \^\`{e}
-  "\u1ec5": "\u0065\u0302\u0303",
-  // ễ = \^\~{e}
-  "\u0117": "\u0065\u0307",
-  // ė = \.{e}
-  "\u1e1f": "\u0066\u0307",
-  // ḟ = \.{f}
-  "\u01f5": "\u0067\u0301",
-  // ǵ = \'{g}
-  "\u1e21": "\u0067\u0304",
-  // ḡ = \={g}
-  "\u011f": "\u0067\u0306",
-  // ğ = \u{g}
-  "\u01e7": "\u0067\u030c",
-  // ǧ = \v{g}
-  "\u011d": "\u0067\u0302",
-  // ĝ = \^{g}
-  "\u0121": "\u0067\u0307",
-  // ġ = \.{g}
-  "\u1e27": "\u0068\u0308",
-  // ḧ = \"{h}
-  "\u021f": "\u0068\u030c",
-  // ȟ = \v{h}
-  "\u0125": "\u0068\u0302",
-  // ĥ = \^{h}
-  "\u1e23": "\u0068\u0307",
-  // ḣ = \.{h}
-  "\u00ed": "\u0069\u0301",
-  // í = \'{i}
-  "\u00ec": "\u0069\u0300",
-  // ì = \`{i}
-  "\u00ef": "\u0069\u0308",
-  // ï = \"{i}
-  "\u1e2f": "\u0069\u0308\u0301",
-  // ḯ = \"\'{i}
-  "\u0129": "\u0069\u0303",
-  // ĩ = \~{i}
-  "\u012b": "\u0069\u0304",
-  // ī = \={i}
-  "\u012d": "\u0069\u0306",
-  // ĭ = \u{i}
-  "\u01d0": "\u0069\u030c",
-  // ǐ = \v{i}
-  "\u00ee": "\u0069\u0302",
-  // î = \^{i}
-  "\u01f0": "\u006a\u030c",
-  // ǰ = \v{j}
-  "\u0135": "\u006a\u0302",
-  // ĵ = \^{j}
-  "\u1e31": "\u006b\u0301",
-  // ḱ = \'{k}
-  "\u01e9": "\u006b\u030c",
-  // ǩ = \v{k}
-  "\u013a": "\u006c\u0301",
-  // ĺ = \'{l}
-  "\u013e": "\u006c\u030c",
-  // ľ = \v{l}
-  "\u1e3f": "\u006d\u0301",
-  // ḿ = \'{m}
-  "\u1e41": "\u006d\u0307",
-  // ṁ = \.{m}
-  "\u0144": "\u006e\u0301",
-  // ń = \'{n}
-  "\u01f9": "\u006e\u0300",
-  // ǹ = \`{n}
-  "\u00f1": "\u006e\u0303",
-  // ñ = \~{n}
-  "\u0148": "\u006e\u030c",
-  // ň = \v{n}
-  "\u1e45": "\u006e\u0307",
-  // ṅ = \.{n}
-  "\u00f3": "\u006f\u0301",
-  // ó = \'{o}
-  "\u00f2": "\u006f\u0300",
-  // ò = \`{o}
-  "\u00f6": "\u006f\u0308",
-  // ö = \"{o}
-  "\u022b": "\u006f\u0308\u0304",
-  // ȫ = \"\={o}
-  "\u00f5": "\u006f\u0303",
-  // õ = \~{o}
-  "\u1e4d": "\u006f\u0303\u0301",
-  // ṍ = \~\'{o}
-  "\u1e4f": "\u006f\u0303\u0308",
-  // ṏ = \~\"{o}
-  "\u022d": "\u006f\u0303\u0304",
-  // ȭ = \~\={o}
-  "\u014d": "\u006f\u0304",
-  // ō = \={o}
-  "\u1e53": "\u006f\u0304\u0301",
-  // ṓ = \=\'{o}
-  "\u1e51": "\u006f\u0304\u0300",
-  // ṑ = \=\`{o}
-  "\u014f": "\u006f\u0306",
-  // ŏ = \u{o}
-  "\u01d2": "\u006f\u030c",
-  // ǒ = \v{o}
-  "\u00f4": "\u006f\u0302",
-  // ô = \^{o}
-  "\u1ed1": "\u006f\u0302\u0301",
-  // ố = \^\'{o}
-  "\u1ed3": "\u006f\u0302\u0300",
-  // ồ = \^\`{o}
-  "\u1ed7": "\u006f\u0302\u0303",
-  // ỗ = \^\~{o}
-  "\u022f": "\u006f\u0307",
-  // ȯ = \.{o}
-  "\u0231": "\u006f\u0307\u0304",
-  // ȱ = \.\={o}
-  "\u0151": "\u006f\u030b",
-  // ő = \H{o}
-  "\u1e55": "\u0070\u0301",
-  // ṕ = \'{p}
-  "\u1e57": "\u0070\u0307",
-  // ṗ = \.{p}
-  "\u0155": "\u0072\u0301",
-  // ŕ = \'{r}
-  "\u0159": "\u0072\u030c",
-  // ř = \v{r}
-  "\u1e59": "\u0072\u0307",
-  // ṙ = \.{r}
-  "\u015b": "\u0073\u0301",
-  // ś = \'{s}
-  "\u1e65": "\u0073\u0301\u0307",
-  // ṥ = \'\.{s}
-  "\u0161": "\u0073\u030c",
-  // š = \v{s}
-  "\u1e67": "\u0073\u030c\u0307",
-  // ṧ = \v\.{s}
-  "\u015d": "\u0073\u0302",
-  // ŝ = \^{s}
-  "\u1e61": "\u0073\u0307",
-  // ṡ = \.{s}
-  "\u1e97": "\u0074\u0308",
-  // ẗ = \"{t}
-  "\u0165": "\u0074\u030c",
-  // ť = \v{t}
-  "\u1e6b": "\u0074\u0307",
-  // ṫ = \.{t}
-  "\u00fa": "\u0075\u0301",
-  // ú = \'{u}
-  "\u00f9": "\u0075\u0300",
-  // ù = \`{u}
-  "\u00fc": "\u0075\u0308",
-  // ü = \"{u}
-  "\u01d8": "\u0075\u0308\u0301",
-  // ǘ = \"\'{u}
-  "\u01dc": "\u0075\u0308\u0300",
-  // ǜ = \"\`{u}
-  "\u01d6": "\u0075\u0308\u0304",
-  // ǖ = \"\={u}
-  "\u01da": "\u0075\u0308\u030c",
-  // ǚ = \"\v{u}
-  "\u0169": "\u0075\u0303",
-  // ũ = \~{u}
-  "\u1e79": "\u0075\u0303\u0301",
-  // ṹ = \~\'{u}
-  "\u016b": "\u0075\u0304",
-  // ū = \={u}
-  "\u1e7b": "\u0075\u0304\u0308",
-  // ṻ = \=\"{u}
-  "\u016d": "\u0075\u0306",
-  // ŭ = \u{u}
-  "\u01d4": "\u0075\u030c",
-  // ǔ = \v{u}
-  "\u00fb": "\u0075\u0302",
-  // û = \^{u}
-  "\u016f": "\u0075\u030a",
-  // ů = \r{u}
-  "\u0171": "\u0075\u030b",
-  // ű = \H{u}
-  "\u1e7d": "\u0076\u0303",
-  // ṽ = \~{v}
-  "\u1e83": "\u0077\u0301",
-  // ẃ = \'{w}
-  "\u1e81": "\u0077\u0300",
-  // ẁ = \`{w}
-  "\u1e85": "\u0077\u0308",
-  // ẅ = \"{w}
-  "\u0175": "\u0077\u0302",
-  // ŵ = \^{w}
-  "\u1e87": "\u0077\u0307",
-  // ẇ = \.{w}
-  "\u1e98": "\u0077\u030a",
-  // ẘ = \r{w}
-  "\u1e8d": "\u0078\u0308",
-  // ẍ = \"{x}
-  "\u1e8b": "\u0078\u0307",
-  // ẋ = \.{x}
-  "\u00fd": "\u0079\u0301",
-  // ý = \'{y}
-  "\u1ef3": "\u0079\u0300",
-  // ỳ = \`{y}
-  "\u00ff": "\u0079\u0308",
-  // ÿ = \"{y}
-  "\u1ef9": "\u0079\u0303",
-  // ỹ = \~{y}
-  "\u0233": "\u0079\u0304",
-  // ȳ = \={y}
-  "\u0177": "\u0079\u0302",
-  // ŷ = \^{y}
-  "\u1e8f": "\u0079\u0307",
-  // ẏ = \.{y}
-  "\u1e99": "\u0079\u030a",
-  // ẙ = \r{y}
-  "\u017a": "\u007a\u0301",
-  // ź = \'{z}
-  "\u017e": "\u007a\u030c",
-  // ž = \v{z}
-  "\u1e91": "\u007a\u0302",
-  // ẑ = \^{z}
-  "\u017c": "\u007a\u0307",
-  // ż = \.{z}
-  "\u00c1": "\u0041\u0301",
-  // Á = \'{A}
-  "\u00c0": "\u0041\u0300",
-  // À = \`{A}
-  "\u00c4": "\u0041\u0308",
-  // Ä = \"{A}
-  "\u01de": "\u0041\u0308\u0304",
-  // Ǟ = \"\={A}
-  "\u00c3": "\u0041\u0303",
-  // Ã = \~{A}
-  "\u0100": "\u0041\u0304",
-  // Ā = \={A}
-  "\u0102": "\u0041\u0306",
-  // Ă = \u{A}
-  "\u1eae": "\u0041\u0306\u0301",
-  // Ắ = \u\'{A}
-  "\u1eb0": "\u0041\u0306\u0300",
-  // Ằ = \u\`{A}
-  "\u1eb4": "\u0041\u0306\u0303",
-  // Ẵ = \u\~{A}
-  "\u01cd": "\u0041\u030c",
-  // Ǎ = \v{A}
-  "\u00c2": "\u0041\u0302",
-  // Â = \^{A}
-  "\u1ea4": "\u0041\u0302\u0301",
-  // Ấ = \^\'{A}
-  "\u1ea6": "\u0041\u0302\u0300",
-  // Ầ = \^\`{A}
-  "\u1eaa": "\u0041\u0302\u0303",
-  // Ẫ = \^\~{A}
-  "\u0226": "\u0041\u0307",
-  // Ȧ = \.{A}
-  "\u01e0": "\u0041\u0307\u0304",
-  // Ǡ = \.\={A}
-  "\u00c5": "\u0041\u030a",
-  // Å = \r{A}
-  "\u01fa": "\u0041\u030a\u0301",
-  // Ǻ = \r\'{A}
-  "\u1e02": "\u0042\u0307",
-  // Ḃ = \.{B}
-  "\u0106": "\u0043\u0301",
-  // Ć = \'{C}
-  "\u010c": "\u0043\u030c",
-  // Č = \v{C}
-  "\u0108": "\u0043\u0302",
-  // Ĉ = \^{C}
-  "\u010a": "\u0043\u0307",
-  // Ċ = \.{C}
-  "\u010e": "\u0044\u030c",
-  // Ď = \v{D}
-  "\u1e0a": "\u0044\u0307",
-  // Ḋ = \.{D}
-  "\u00c9": "\u0045\u0301",
-  // É = \'{E}
-  "\u00c8": "\u0045\u0300",
-  // È = \`{E}
-  "\u00cb": "\u0045\u0308",
-  // Ë = \"{E}
-  "\u1ebc": "\u0045\u0303",
-  // Ẽ = \~{E}
-  "\u0112": "\u0045\u0304",
-  // Ē = \={E}
-  "\u1e16": "\u0045\u0304\u0301",
-  // Ḗ = \=\'{E}
-  "\u1e14": "\u0045\u0304\u0300",
-  // Ḕ = \=\`{E}
-  "\u0114": "\u0045\u0306",
-  // Ĕ = \u{E}
-  "\u011a": "\u0045\u030c",
-  // Ě = \v{E}
-  "\u00ca": "\u0045\u0302",
-  // Ê = \^{E}
-  "\u1ebe": "\u0045\u0302\u0301",
-  // Ế = \^\'{E}
-  "\u1ec0": "\u0045\u0302\u0300",
-  // Ề = \^\`{E}
-  "\u1ec4": "\u0045\u0302\u0303",
-  // Ễ = \^\~{E}
-  "\u0116": "\u0045\u0307",
-  // Ė = \.{E}
-  "\u1e1e": "\u0046\u0307",
-  // Ḟ = \.{F}
-  "\u01f4": "\u0047\u0301",
-  // Ǵ = \'{G}
-  "\u1e20": "\u0047\u0304",
-  // Ḡ = \={G}
-  "\u011e": "\u0047\u0306",
-  // Ğ = \u{G}
-  "\u01e6": "\u0047\u030c",
-  // Ǧ = \v{G}
-  "\u011c": "\u0047\u0302",
-  // Ĝ = \^{G}
-  "\u0120": "\u0047\u0307",
-  // Ġ = \.{G}
-  "\u1e26": "\u0048\u0308",
-  // Ḧ = \"{H}
-  "\u021e": "\u0048\u030c",
-  // Ȟ = \v{H}
-  "\u0124": "\u0048\u0302",
-  // Ĥ = \^{H}
-  "\u1e22": "\u0048\u0307",
-  // Ḣ = \.{H}
-  "\u00cd": "\u0049\u0301",
-  // Í = \'{I}
-  "\u00cc": "\u0049\u0300",
-  // Ì = \`{I}
-  "\u00cf": "\u0049\u0308",
-  // Ï = \"{I}
-  "\u1e2e": "\u0049\u0308\u0301",
-  // Ḯ = \"\'{I}
-  "\u0128": "\u0049\u0303",
-  // Ĩ = \~{I}
-  "\u012a": "\u0049\u0304",
-  // Ī = \={I}
-  "\u012c": "\u0049\u0306",
-  // Ĭ = \u{I}
-  "\u01cf": "\u0049\u030c",
-  // Ǐ = \v{I}
-  "\u00ce": "\u0049\u0302",
-  // Î = \^{I}
-  "\u0130": "\u0049\u0307",
-  // İ = \.{I}
-  "\u0134": "\u004a\u0302",
-  // Ĵ = \^{J}
-  "\u1e30": "\u004b\u0301",
-  // Ḱ = \'{K}
-  "\u01e8": "\u004b\u030c",
-  // Ǩ = \v{K}
-  "\u0139": "\u004c\u0301",
-  // Ĺ = \'{L}
-  "\u013d": "\u004c\u030c",
-  // Ľ = \v{L}
-  "\u1e3e": "\u004d\u0301",
-  // Ḿ = \'{M}
-  "\u1e40": "\u004d\u0307",
-  // Ṁ = \.{M}
-  "\u0143": "\u004e\u0301",
-  // Ń = \'{N}
-  "\u01f8": "\u004e\u0300",
-  // Ǹ = \`{N}
-  "\u00d1": "\u004e\u0303",
-  // Ñ = \~{N}
-  "\u0147": "\u004e\u030c",
-  // Ň = \v{N}
-  "\u1e44": "\u004e\u0307",
-  // Ṅ = \.{N}
-  "\u00d3": "\u004f\u0301",
-  // Ó = \'{O}
-  "\u00d2": "\u004f\u0300",
-  // Ò = \`{O}
-  "\u00d6": "\u004f\u0308",
-  // Ö = \"{O}
-  "\u022a": "\u004f\u0308\u0304",
-  // Ȫ = \"\={O}
-  "\u00d5": "\u004f\u0303",
-  // Õ = \~{O}
-  "\u1e4c": "\u004f\u0303\u0301",
-  // Ṍ = \~\'{O}
-  "\u1e4e": "\u004f\u0303\u0308",
-  // Ṏ = \~\"{O}
-  "\u022c": "\u004f\u0303\u0304",
-  // Ȭ = \~\={O}
-  "\u014c": "\u004f\u0304",
-  // Ō = \={O}
-  "\u1e52": "\u004f\u0304\u0301",
-  // Ṓ = \=\'{O}
-  "\u1e50": "\u004f\u0304\u0300",
-  // Ṑ = \=\`{O}
-  "\u014e": "\u004f\u0306",
-  // Ŏ = \u{O}
-  "\u01d1": "\u004f\u030c",
-  // Ǒ = \v{O}
-  "\u00d4": "\u004f\u0302",
-  // Ô = \^{O}
-  "\u1ed0": "\u004f\u0302\u0301",
-  // Ố = \^\'{O}
-  "\u1ed2": "\u004f\u0302\u0300",
-  // Ồ = \^\`{O}
-  "\u1ed6": "\u004f\u0302\u0303",
-  // Ỗ = \^\~{O}
-  "\u022e": "\u004f\u0307",
-  // Ȯ = \.{O}
-  "\u0230": "\u004f\u0307\u0304",
-  // Ȱ = \.\={O}
-  "\u0150": "\u004f\u030b",
-  // Ő = \H{O}
-  "\u1e54": "\u0050\u0301",
-  // Ṕ = \'{P}
-  "\u1e56": "\u0050\u0307",
-  // Ṗ = \.{P}
-  "\u0154": "\u0052\u0301",
-  // Ŕ = \'{R}
-  "\u0158": "\u0052\u030c",
-  // Ř = \v{R}
-  "\u1e58": "\u0052\u0307",
-  // Ṙ = \.{R}
-  "\u015a": "\u0053\u0301",
-  // Ś = \'{S}
-  "\u1e64": "\u0053\u0301\u0307",
-  // Ṥ = \'\.{S}
-  "\u0160": "\u0053\u030c",
-  // Š = \v{S}
-  "\u1e66": "\u0053\u030c\u0307",
-  // Ṧ = \v\.{S}
-  "\u015c": "\u0053\u0302",
-  // Ŝ = \^{S}
-  "\u1e60": "\u0053\u0307",
-  // Ṡ = \.{S}
-  "\u0164": "\u0054\u030c",
-  // Ť = \v{T}
-  "\u1e6a": "\u0054\u0307",
-  // Ṫ = \.{T}
-  "\u00da": "\u0055\u0301",
-  // Ú = \'{U}
-  "\u00d9": "\u0055\u0300",
-  // Ù = \`{U}
-  "\u00dc": "\u0055\u0308",
-  // Ü = \"{U}
-  "\u01d7": "\u0055\u0308\u0301",
-  // Ǘ = \"\'{U}
-  "\u01db": "\u0055\u0308\u0300",
-  // Ǜ = \"\`{U}
-  "\u01d5": "\u0055\u0308\u0304",
-  // Ǖ = \"\={U}
-  "\u01d9": "\u0055\u0308\u030c",
-  // Ǚ = \"\v{U}
-  "\u0168": "\u0055\u0303",
-  // Ũ = \~{U}
-  "\u1e78": "\u0055\u0303\u0301",
-  // Ṹ = \~\'{U}
-  "\u016a": "\u0055\u0304",
-  // Ū = \={U}
-  "\u1e7a": "\u0055\u0304\u0308",
-  // Ṻ = \=\"{U}
-  "\u016c": "\u0055\u0306",
-  // Ŭ = \u{U}
-  "\u01d3": "\u0055\u030c",
-  // Ǔ = \v{U}
-  "\u00db": "\u0055\u0302",
-  // Û = \^{U}
-  "\u016e": "\u0055\u030a",
-  // Ů = \r{U}
-  "\u0170": "\u0055\u030b",
-  // Ű = \H{U}
-  "\u1e7c": "\u0056\u0303",
-  // Ṽ = \~{V}
-  "\u1e82": "\u0057\u0301",
-  // Ẃ = \'{W}
-  "\u1e80": "\u0057\u0300",
-  // Ẁ = \`{W}
-  "\u1e84": "\u0057\u0308",
-  // Ẅ = \"{W}
-  "\u0174": "\u0057\u0302",
-  // Ŵ = \^{W}
-  "\u1e86": "\u0057\u0307",
-  // Ẇ = \.{W}
-  "\u1e8c": "\u0058\u0308",
-  // Ẍ = \"{X}
-  "\u1e8a": "\u0058\u0307",
-  // Ẋ = \.{X}
-  "\u00dd": "\u0059\u0301",
-  // Ý = \'{Y}
-  "\u1ef2": "\u0059\u0300",
-  // Ỳ = \`{Y}
-  "\u0178": "\u0059\u0308",
-  // Ÿ = \"{Y}
-  "\u1ef8": "\u0059\u0303",
-  // Ỹ = \~{Y}
-  "\u0232": "\u0059\u0304",
-  // Ȳ = \={Y}
-  "\u0176": "\u0059\u0302",
-  // Ŷ = \^{Y}
-  "\u1e8e": "\u0059\u0307",
-  // Ẏ = \.{Y}
-  "\u0179": "\u005a\u0301",
-  // Ź = \'{Z}
-  "\u017d": "\u005a\u030c",
-  // Ž = \v{Z}
-  "\u1e90": "\u005a\u0302",
-  // Ẑ = \^{Z}
-  "\u017b": "\u005a\u0307",
-  // Ż = \.{Z}
-  "\u03ac": "\u03b1\u0301",
-  // ά = \'{α}
-  "\u1f70": "\u03b1\u0300",
-  // ὰ = \`{α}
-  "\u1fb1": "\u03b1\u0304",
-  // ᾱ = \={α}
-  "\u1fb0": "\u03b1\u0306",
-  // ᾰ = \u{α}
-  "\u03ad": "\u03b5\u0301",
-  // έ = \'{ε}
-  "\u1f72": "\u03b5\u0300",
-  // ὲ = \`{ε}
-  "\u03ae": "\u03b7\u0301",
-  // ή = \'{η}
-  "\u1f74": "\u03b7\u0300",
-  // ὴ = \`{η}
-  "\u03af": "\u03b9\u0301",
-  // ί = \'{ι}
-  "\u1f76": "\u03b9\u0300",
-  // ὶ = \`{ι}
-  "\u03ca": "\u03b9\u0308",
-  // ϊ = \"{ι}
-  "\u0390": "\u03b9\u0308\u0301",
-  // ΐ = \"\'{ι}
-  "\u1fd2": "\u03b9\u0308\u0300",
-  // ῒ = \"\`{ι}
-  "\u1fd1": "\u03b9\u0304",
-  // ῑ = \={ι}
-  "\u1fd0": "\u03b9\u0306",
-  // ῐ = \u{ι}
-  "\u03cc": "\u03bf\u0301",
-  // ό = \'{ο}
-  "\u1f78": "\u03bf\u0300",
-  // ὸ = \`{ο}
-  "\u03cd": "\u03c5\u0301",
-  // ύ = \'{υ}
-  "\u1f7a": "\u03c5\u0300",
-  // ὺ = \`{υ}
-  "\u03cb": "\u03c5\u0308",
-  // ϋ = \"{υ}
-  "\u03b0": "\u03c5\u0308\u0301",
-  // ΰ = \"\'{υ}
-  "\u1fe2": "\u03c5\u0308\u0300",
-  // ῢ = \"\`{υ}
-  "\u1fe1": "\u03c5\u0304",
-  // ῡ = \={υ}
-  "\u1fe0": "\u03c5\u0306",
-  // ῠ = \u{υ}
-  "\u03ce": "\u03c9\u0301",
-  // ώ = \'{ω}
-  "\u1f7c": "\u03c9\u0300",
-  // ὼ = \`{ω}
-  "\u038e": "\u03a5\u0301",
-  // Ύ = \'{Υ}
-  "\u1fea": "\u03a5\u0300",
-  // Ὺ = \`{Υ}
-  "\u03ab": "\u03a5\u0308",
-  // Ϋ = \"{Υ}
-  "\u1fe9": "\u03a5\u0304",
-  // Ῡ = \={Υ}
-  "\u1fe8": "\u03a5\u0306",
-  // Ῠ = \u{Υ}
-  "\u038f": "\u03a9\u0301",
-  // Ώ = \'{Ω}
-  "\u1ffa": "\u03a9\u0300" // Ὼ = \`{Ω}
-
-};
-
-/* eslint no-constant-condition:0 */
-
-/**
- * This file contains the parser used to parse out a TeX expression from the
- * input. Since TeX isn't context-free, standard parsers don't work particularly
- * well.
- *
- * The strategy of this parser is as such:
- *
- * The main functions (the `.parse...` ones) take a position in the current
- * parse string to parse tokens from. The lexer (found in Lexer.js, stored at
- * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When
- * individual tokens are needed at a position, the lexer is called to pull out a
- * token, which is then used.
- *
- * The parser has a property called "mode" indicating the mode that
- * the parser is currently in. Currently it has to be one of "math" or
- * "text", which denotes whether the current environment is a math-y
- * one or a text-y one (e.g. inside \text). Currently, this serves to
- * limit the functions which can be used in text mode.
- *
- * The main functions then return an object which contains the useful data that
- * was parsed at its given point, and a new position at the end of the parsed
- * data. The main functions can call each other and continue the parsing by
- * using the returned position as a new starting point.
- *
- * There are also extra `.handle...` functions, which pull out some reused
- * functionality into self-contained functions.
- *
- * The functions return ParseNodes.
- */
-class Parser {
-  constructor(input, settings) {
-    this.mode = void 0;
-    this.gullet = void 0;
-    this.settings = void 0;
-    this.leftrightDepth = void 0;
-    this.nextToken = void 0;
-    // Start in math mode
-    this.mode = "math"; // Create a new macro expander (gullet) and (indirectly via that) also a
-    // new lexer (mouth) for this parser (stomach, in the language of TeX)
-
-    this.gullet = new MacroExpander(input, settings, this.mode); // Store the settings for use in parsing
-
-    this.settings = settings; // Count leftright depth (for \middle errors)
-
-    this.leftrightDepth = 0;
-  }
-  /**
-   * Checks a result to make sure it has the right type, and throws an
-   * appropriate error otherwise.
-   */
-
-
-  expect(text, consume) {
-    if (consume === void 0) {
-      consume = true;
-    }
-
-    if (this.fetch().text !== text) {
-      throw new ParseError(`Expected '${text}', got '${this.fetch().text}'`, this.fetch());
-    }
-
-    if (consume) {
-      this.consume();
-    }
-  }
-  /**
-   * Discards the current lookahead token, considering it consumed.
-   */
-
-
-  consume() {
-    this.nextToken = null;
-  }
-  /**
-   * Return the current lookahead token, or if there isn't one (at the
-   * beginning, or if the previous lookahead token was consume()d),
-   * fetch the next token as the new lookahead token and return it.
-   */
-
-
-  fetch() {
-    if (this.nextToken == null) {
-      this.nextToken = this.gullet.expandNextToken();
-    }
-
-    return this.nextToken;
-  }
-  /**
-   * Switches between "text" and "math" modes.
-   */
-
-
-  switchMode(newMode) {
-    this.mode = newMode;
-    this.gullet.switchMode(newMode);
-  }
-  /**
-   * Main parsing function, which parses an entire input.
-   */
-
-
-  parse() {
-    // Create a group namespace for the math expression.
-    // (LaTeX creates a new group for every $...$, $$...$$, \[...\].)
-    this.gullet.beginGroup(); // Use old \color behavior (same as LaTeX's \textcolor) if requested.
-    // We do this within the group for the math expression, so it doesn't
-    // pollute settings.macros.
-
-    if (this.settings.colorIsTextColor) {
-      this.gullet.macros.set("\\color", "\\textcolor");
-    } // Try to parse the input
-
-
-    const parse = this.parseExpression(false); // If we succeeded, make sure there's an EOF at the end
-
-    this.expect("EOF"); // End the group namespace for the expression
-
-    this.gullet.endGroup();
-    return parse;
-  }
-
-  parseExpression(breakOnInfix, breakOnTokenText) {
-    const body = []; // Keep adding atoms to the body until we can't parse any more atoms (either
-    // we reached the end, a }, or a \right)
-
-    while (true) {
-      // Ignore spaces in math mode
-      if (this.mode === "math") {
-        this.consumeSpaces();
-      }
-
-      const lex = this.fetch();
-
-      if (Parser.endOfExpression.indexOf(lex.text) !== -1) {
-        break;
-      }
-
-      if (breakOnTokenText && lex.text === breakOnTokenText) {
-        break;
-      }
-
-      if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) {
-        break;
-      }
-
-      const atom = this.parseAtom(breakOnTokenText);
-
-      if (!atom) {
-        break;
-      }
-
-      body.push(atom);
-    }
-
-    if (this.mode === "text") {
-      this.formLigatures(body);
-    }
-
-    return this.handleInfixNodes(body);
-  }
-  /**
-   * Rewrites infix operators such as \over with corresponding commands such
-   * as \frac.
-   *
-   * There can only be one infix operator per group.  If there's more than one
-   * then the expression is ambiguous.  This can be resolved by adding {}.
-   */
-
-
-  handleInfixNodes(body) {
-    let overIndex = -1;
-    let funcName;
-
-    for (let i = 0; i < body.length; i++) {
-      const node = checkNodeType(body[i], "infix");
-
-      if (node) {
-        if (overIndex !== -1) {
-          throw new ParseError("only one infix operator per group", node.token);
-        }
-
-        overIndex = i;
-        funcName = node.replaceWith;
-      }
-    }
-
-    if (overIndex !== -1 && funcName) {
-      let numerNode;
-      let denomNode;
-      const numerBody = body.slice(0, overIndex);
-      const denomBody = body.slice(overIndex + 1);
-
-      if (numerBody.length === 1 && numerBody[0].type === "ordgroup") {
-        numerNode = numerBody[0];
-      } else {
-        numerNode = {
-          type: "ordgroup",
-          mode: this.mode,
-          body: numerBody
-        };
-      }
-
-      if (denomBody.length === 1 && denomBody[0].type === "ordgroup") {
-        denomNode = denomBody[0];
-      } else {
-        denomNode = {
-          type: "ordgroup",
-          mode: this.mode,
-          body: denomBody
-        };
-      }
-
-      let node;
-
-      if (funcName === "\\\\abovefrac") {
-        node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []);
-      } else {
-        node = this.callFunction(funcName, [numerNode, denomNode], []);
-      }
-
-      return [node];
-    } else {
-      return body;
-    }
-  } // The greediness of a superscript or subscript
-
-
-  /**
-   * Handle a subscript or superscript with nice errors.
-   */
-  handleSupSubscript(name) {
-    const symbolToken = this.fetch();
-    const symbol = symbolToken.text;
-    this.consume();
-    const group = this.parseGroup(name, false, Parser.SUPSUB_GREEDINESS, undefined, undefined, true); // ignore spaces before sup/subscript argument
-
-    if (!group) {
-      throw new ParseError("Expected group after '" + symbol + "'", symbolToken);
-    }
-
-    return group;
-  }
-  /**
-   * Converts the textual input of an unsupported command into a text node
-   * contained within a color node whose color is determined by errorColor
-   */
-
-
-  formatUnsupportedCmd(text) {
-    const textordArray = [];
-
-    for (let i = 0; i < text.length; i++) {
-      textordArray.push({
-        type: "textord",
-        mode: "text",
-        text: text[i]
-      });
-    }
-
-    const textNode = {
-      type: "text",
-      mode: this.mode,
-      body: textordArray
-    };
-    const colorNode = {
-      type: "color",
-      mode: this.mode,
-      color: this.settings.errorColor,
-      body: [textNode]
-    };
-    return colorNode;
-  }
-  /**
-   * Parses a group with optional super/subscripts.
-   */
-
-
-  parseAtom(breakOnTokenText) {
-    // The body of an atom is an implicit group, so that things like
-    // \left(x\right)^2 work correctly.
-    const base = this.parseGroup("atom", false, null, breakOnTokenText); // In text mode, we don't have superscripts or subscripts
-
-    if (this.mode === "text") {
-      return base;
-    } // Note that base may be empty (i.e. null) at this point.
-
-
-    let superscript;
-    let subscript;
-
-    while (true) {
-      // Guaranteed in math mode, so eat any spaces first.
-      this.consumeSpaces(); // Lex the first token
-
-      const lex = this.fetch();
-
-      if (lex.text === "\\limits" || lex.text === "\\nolimits") {
-        // We got a limit control
-        let opNode = checkNodeType(base, "op");
-
-        if (opNode) {
-          const limits = lex.text === "\\limits";
-          opNode.limits = limits;
-          opNode.alwaysHandleSupSub = true;
-        } else {
-          opNode = checkNodeType(base, "operatorname");
-
-          if (opNode && opNode.alwaysHandleSupSub) {
-            const limits = lex.text === "\\limits";
-            opNode.limits = limits;
-          } else {
-            throw new ParseError("Limit controls must follow a math operator", lex);
-          }
-        }
-
-        this.consume();
-      } else if (lex.text === "^") {
-        // We got a superscript start
-        if (superscript) {
-          throw new ParseError("Double superscript", lex);
-        }
-
-        superscript = this.handleSupSubscript("superscript");
-      } else if (lex.text === "_") {
-        // We got a subscript start
-        if (subscript) {
-          throw new ParseError("Double subscript", lex);
-        }
-
-        subscript = this.handleSupSubscript("subscript");
-      } else if (lex.text === "'") {
-        // We got a prime
-        if (superscript) {
-          throw new ParseError("Double superscript", lex);
-        }
-
-        const prime = {
-          type: "textord",
-          mode: this.mode,
-          text: "\\prime"
-        }; // Many primes can be grouped together, so we handle this here
-
-        const primes = [prime];
-        this.consume(); // Keep lexing tokens until we get something that's not a prime
-
-        while (this.fetch().text === "'") {
-          // For each one, add another prime to the list
-          primes.push(prime);
-          this.consume();
-        } // If there's a superscript following the primes, combine that
-        // superscript in with the primes.
-
-
-        if (this.fetch().text === "^") {
-          primes.push(this.handleSupSubscript("superscript"));
-        } // Put everything into an ordgroup as the superscript
-
-
-        superscript = {
-          type: "ordgroup",
-          mode: this.mode,
-          body: primes
-        };
-      } else {
-        // If it wasn't ^, _, or ', stop parsing super/subscripts
-        break;
-      }
-    } // Base must be set if superscript or subscript are set per logic above,
-    // but need to check here for type check to pass.
-
-
-    if (superscript || subscript) {
-      // If we got either a superscript or subscript, create a supsub
-      return {
-        type: "supsub",
-        mode: this.mode,
-        base: base,
-        sup: superscript,
-        sub: subscript
-      };
-    } else {
-      // Otherwise return the original body
-      return base;
-    }
-  }
-  /**
-   * Parses an entire function, including its base and all of its arguments.
-   */
-
-
-  parseFunction(breakOnTokenText, name, // For error reporting.
-  greediness) {
-    const token = this.fetch();
-    const func = token.text;
-    const funcData = functions[func];
-
-    if (!funcData) {
-      return null;
-    }
-
-    this.consume(); // consume command token
-
-    if (greediness != null && funcData.greediness <= greediness) {
-      throw new ParseError("Got function '" + func + "' with no arguments" + (name ? " as " + name : ""), token);
-    } else if (this.mode === "text" && !funcData.allowedInText) {
-      throw new ParseError("Can't use function '" + func + "' in text mode", token);
-    } else if (this.mode === "math" && funcData.allowedInMath === false) {
-      throw new ParseError("Can't use function '" + func + "' in math mode", token);
-    }
-
-    const _this$parseArguments = this.parseArguments(func, funcData),
-          args = _this$parseArguments.args,
-          optArgs = _this$parseArguments.optArgs;
-
-    return this.callFunction(func, args, optArgs, token, breakOnTokenText);
-  }
-  /**
-   * Call a function handler with a suitable context and arguments.
-   */
-
-
-  callFunction(name, args, optArgs, token, breakOnTokenText) {
-    const context = {
-      funcName: name,
-      parser: this,
-      token,
-      breakOnTokenText
-    };
-    const func = functions[name];
-
-    if (func && func.handler) {
-      return func.handler(context, args, optArgs);
-    } else {
-      throw new ParseError(`No function handler for ${name}`);
-    }
-  }
-  /**
-   * Parses the arguments of a function or environment
-   */
-
-
-  parseArguments(func, // Should look like "\name" or "\begin{name}".
-  funcData) {
-    const totalArgs = funcData.numArgs + funcData.numOptionalArgs;
-
-    if (totalArgs === 0) {
-      return {
-        args: [],
-        optArgs: []
-      };
-    }
-
-    const baseGreediness = funcData.greediness;
-    const args = [];
-    const optArgs = [];
-
-    for (let i = 0; i < totalArgs; i++) {
-      const argType = funcData.argTypes && funcData.argTypes[i];
-      const isOptional = i < funcData.numOptionalArgs; // Ignore spaces between arguments.  As the TeXbook says:
-      // "After you have said ‘\def\row#1#2{...}’, you are allowed to
-      //  put spaces between the arguments (e.g., ‘\row x n’), because
-      //  TeX doesn’t use single spaces as undelimited arguments."
-
-      const consumeSpaces = i > 0 && !isOptional || // Also consume leading spaces in math mode, as parseSymbol
-      // won't know what to do with them.  This can only happen with
-      // macros, e.g. \frac\foo\foo where \foo expands to a space symbol.
-      // In LaTeX, the \foo's get treated as (blank) arguments.
-      // In KaTeX, for now, both spaces will get consumed.
-      // TODO(edemaine)
-      i === 0 && !isOptional && this.mode === "math";
-      const arg = this.parseGroupOfType(`argument to '${func}'`, argType, isOptional, baseGreediness, consumeSpaces);
-
-      if (!arg) {
-        if (isOptional) {
-          optArgs.push(null);
-          continue;
-        }
-
-        throw new ParseError(`Expected group after '${func}'`, this.fetch());
-      }
-
-      (isOptional ? optArgs : args).push(arg);
-    }
-
-    return {
-      args,
-      optArgs
-    };
-  }
-  /**
-   * Parses a group when the mode is changing.
-   */
-
-
-  parseGroupOfType(name, type, optional, greediness, consumeSpaces) {
-    switch (type) {
-      case "color":
-        if (consumeSpaces) {
-          this.consumeSpaces();
-        }
-
-        return this.parseColorGroup(optional);
-
-      case "size":
-        if (consumeSpaces) {
-          this.consumeSpaces();
-        }
-
-        return this.parseSizeGroup(optional);
-
-      case "url":
-        return this.parseUrlGroup(optional, consumeSpaces);
-
-      case "math":
-      case "text":
-        return this.parseGroup(name, optional, greediness, undefined, type, consumeSpaces);
-
-      case "hbox":
-        {
-          // hbox argument type wraps the argument in the equivalent of
-          // \hbox, which is like \text but switching to \textstyle size.
-          const group = this.parseGroup(name, optional, greediness, undefined, "text", consumeSpaces);
-
-          if (!group) {
-            return group;
-          }
-
-          const styledGroup = {
-            type: "styling",
-            mode: group.mode,
-            body: [group],
-            style: "text" // simulate \textstyle
-
-          };
-          return styledGroup;
-        }
-
-      case "raw":
-        {
-          if (consumeSpaces) {
-            this.consumeSpaces();
-          }
-
-          if (optional && this.fetch().text === "{") {
-            return null;
-          }
-
-          const token = this.parseStringGroup("raw", optional, true);
-
-          if (token) {
-            return {
-              type: "raw",
-              mode: "text",
-              string: token.text
-            };
-          } else {
-            throw new ParseError("Expected raw group", this.fetch());
-          }
-        }
-
-      case "original":
-      case null:
-      case undefined:
-        return this.parseGroup(name, optional, greediness, undefined, undefined, consumeSpaces);
-
-      default:
-        throw new ParseError("Unknown group type as " + name, this.fetch());
-    }
-  }
-  /**
-   * Discard any space tokens, fetching the next non-space token.
-   */
-
-
-  consumeSpaces() {
-    while (this.fetch().text === " ") {
-      this.consume();
-    }
-  }
-  /**
-   * Parses a group, essentially returning the string formed by the
-   * brace-enclosed tokens plus some position information.
-   */
-
-
-  parseStringGroup(modeName, // Used to describe the mode in error messages.
-  optional, raw) {
-    const groupBegin = optional ? "[" : "{";
-    const groupEnd = optional ? "]" : "}";
-    const beginToken = this.fetch();
-
-    if (beginToken.text !== groupBegin) {
-      if (optional) {
-        return null;
-      } else if (raw && beginToken.text !== "EOF" && /[^{}[\]]/.test(beginToken.text)) {
-        this.consume();
-        return beginToken;
-      }
-    }
-
-    const outerMode = this.mode;
-    this.mode = "text";
-    this.expect(groupBegin);
-    let str = "";
-    const firstToken = this.fetch();
-    let nested = 0; // allow nested braces in raw string group
-
-    let lastToken = firstToken;
-    let nextToken;
-
-    while ((nextToken = this.fetch()).text !== groupEnd || raw && nested > 0) {
-      switch (nextToken.text) {
-        case "EOF":
-          throw new ParseError("Unexpected end of input in " + modeName, firstToken.range(lastToken, str));
-
-        case groupBegin:
-          nested++;
-          break;
-
-        case groupEnd:
-          nested--;
-          break;
-      }
-
-      lastToken = nextToken;
-      str += lastToken.text;
-      this.consume();
-    }
-
-    this.expect(groupEnd);
-    this.mode = outerMode;
-    return firstToken.range(lastToken, str);
-  }
-  /**
-   * Parses a regex-delimited group: the largest sequence of tokens
-   * whose concatenated strings match `regex`. Returns the string
-   * formed by the tokens plus some position information.
-   */
-
-
-  parseRegexGroup(regex, modeName) {
-    const outerMode = this.mode;
-    this.mode = "text";
-    const firstToken = this.fetch();
-    let lastToken = firstToken;
-    let str = "";
-    let nextToken;
-
-    while ((nextToken = this.fetch()).text !== "EOF" && regex.test(str + nextToken.text)) {
-      lastToken = nextToken;
-      str += lastToken.text;
-      this.consume();
-    }
-
-    if (str === "") {
-      throw new ParseError("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken);
-    }
-
-    this.mode = outerMode;
-    return firstToken.range(lastToken, str);
-  }
-  /**
-   * Parses a color description.
-   */
-
-
-  parseColorGroup(optional) {
-    const res = this.parseStringGroup("color", optional);
-
-    if (!res) {
-      return null;
-    }
-
-    const match = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(res.text);
-
-    if (!match) {
-      throw new ParseError("Invalid color: '" + res.text + "'", res);
-    }
-
-    let color = match[0];
-
-    if (/^[0-9a-f]{6}$/i.test(color)) {
-      // We allow a 6-digit HTML color spec without a leading "#".
-      // This follows the xcolor package's HTML color model.
-      // Predefined color names are all missed by this RegEx pattern.
-      color = "#" + color;
-    }
-
-    return {
-      type: "color-token",
-      mode: this.mode,
-      color
-    };
-  }
-  /**
-   * Parses a size specification, consisting of magnitude and unit.
-   */
-
-
-  parseSizeGroup(optional) {
-    let res;
-    let isBlank = false;
-
-    if (!optional && this.fetch().text !== "{") {
-      res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size");
-    } else {
-      res = this.parseStringGroup("size", optional);
-    }
-
-    if (!res) {
-      return null;
-    }
-
-    if (!optional && res.text.length === 0) {
-      // Because we've tested for what is !optional, this block won't
-      // affect \kern, \hspace, etc. It will capture the mandatory arguments
-      // to \genfrac and \above.
-      res.text = "0pt"; // Enable \above{}
-
-      isBlank = true; // This is here specifically for \genfrac
-    }
-
-    const match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text);
-
-    if (!match) {
-      throw new ParseError("Invalid size: '" + res.text + "'", res);
-    }
-
-    const data = {
-      number: +(match[1] + match[2]),
-      // sign + magnitude, cast to number
-      unit: match[3]
-    };
-
-    if (!validUnit(data)) {
-      throw new ParseError("Invalid unit: '" + data.unit + "'", res);
-    }
-
-    return {
-      type: "size",
-      mode: this.mode,
-      value: data,
-      isBlank
-    };
-  }
-  /**
-   * Parses an URL, checking escaped letters and allowed protocols,
-   * and setting the catcode of % as an active character (as in \hyperref).
-   */
-
-
-  parseUrlGroup(optional, consumeSpaces) {
-    this.gullet.lexer.setCatcode("%", 13); // active character
-
-    const res = this.parseStringGroup("url", optional, true); // get raw string
-
-    this.gullet.lexer.setCatcode("%", 14); // comment character
-
-    if (!res) {
-      return null;
-    } // hyperref package allows backslashes alone in href, but doesn't
-    // generate valid links in such cases; we interpret this as
-    // "undefined" behaviour, and keep them as-is. Some browser will
-    // replace backslashes with forward slashes.
-
-
-    const url = res.text.replace(/\\([#$%&~_^{}])/g, '$1');
-    return {
-      type: "url",
-      mode: this.mode,
-      url
-    };
-  }
-  /**
-   * If `optional` is false or absent, this parses an ordinary group,
-   * which is either a single nucleus (like "x") or an expression
-   * in braces (like "{x+y}") or an implicit group, a group that starts
-   * at the current position, and ends right before a higher explicit
-   * group ends, or at EOF.
-   * If `optional` is true, it parses either a bracket-delimited expression
-   * (like "[x+y]") or returns null to indicate the absence of a
-   * bracket-enclosed group.
-   * If `mode` is present, switches to that mode while parsing the group,
-   * and switches back after.
-   */
-
-
-  parseGroup(name, // For error reporting.
-  optional, greediness, breakOnTokenText, mode, consumeSpaces) {
-    // Switch to specified mode
-    const outerMode = this.mode;
-
-    if (mode) {
-      this.switchMode(mode);
-    } // Consume spaces if requested, crucially *after* we switch modes,
-    // so that the next non-space token is parsed in the correct mode.
-
-
-    if (consumeSpaces) {
-      this.consumeSpaces();
-    } // Get first token
-
-
-    const firstToken = this.fetch();
-    const text = firstToken.text;
-    let result; // Try to parse an open brace or \begingroup
-
-    if (optional ? text === "[" : text === "{" || text === "\\begingroup") {
-      this.consume();
-      const groupEnd = Parser.endOfGroup[text]; // Start a new group namespace
-
-      this.gullet.beginGroup(); // If we get a brace, parse an expression
-
-      const expression = this.parseExpression(false, groupEnd);
-      const lastToken = this.fetch(); // Check that we got a matching closing brace
-
-      this.expect(groupEnd); // End group namespace
-
-      this.gullet.endGroup();
-      result = {
-        type: "ordgroup",
-        mode: this.mode,
-        loc: SourceLocation.range(firstToken, lastToken),
-        body: expression,
-        // A group formed by \begingroup...\endgroup is a semi-simple group
-        // which doesn't affect spacing in math mode, i.e., is transparent.
-        // https://tex.stackexchange.com/questions/1930/when-should-one-
-        // use-begingroup-instead-of-bgroup
-        semisimple: text === "\\begingroup" || undefined
-      };
-    } else if (optional) {
-      // Return nothing for an optional group
-      result = null;
-    } else {
-      // If there exists a function with this name, parse the function.
-      // Otherwise, just return a nucleus
-      result = this.parseFunction(breakOnTokenText, name, greediness) || this.parseSymbol();
-
-      if (result == null && text[0] === "\\" && !implicitCommands.hasOwnProperty(text)) {
-        if (this.settings.throwOnError) {
-          throw new ParseError("Undefined control sequence: " + text, firstToken);
-        }
-
-        result = this.formatUnsupportedCmd(text);
-        this.consume();
-      }
-    } // Switch mode back
-
-
-    if (mode) {
-      this.switchMode(outerMode);
-    }
-
-    return result;
-  }
-  /**
-   * Form ligature-like combinations of characters for text mode.
-   * This includes inputs like "--", "---", "``" and "''".
-   * The result will simply replace multiple textord nodes with a single
-   * character in each value by a single textord node having multiple
-   * characters in its value.  The representation is still ASCII source.
-   * The group will be modified in place.
-   */
-
-
-  formLigatures(group) {
-    let n = group.length - 1;
-
-    for (let i = 0; i < n; ++i) {
-      const a = group[i]; // $FlowFixMe: Not every node type has a `text` property.
-
-      const v = a.text;
-
-      if (v === "-" && group[i + 1].text === "-") {
-        if (i + 1 < n && group[i + 2].text === "-") {
-          group.splice(i, 3, {
-            type: "textord",
-            mode: "text",
-            loc: SourceLocation.range(a, group[i + 2]),
-            text: "---"
-          });
-          n -= 2;
-        } else {
-          group.splice(i, 2, {
-            type: "textord",
-            mode: "text",
-            loc: SourceLocation.range(a, group[i + 1]),
-            text: "--"
-          });
-          n -= 1;
-        }
-      }
-
-      if ((v === "'" || v === "`") && group[i + 1].text === v) {
-        group.splice(i, 2, {
-          type: "textord",
-          mode: "text",
-          loc: SourceLocation.range(a, group[i + 1]),
-          text: v + v
-        });
-        n -= 1;
-      }
-    }
-  }
-  /**
-   * Parse a single symbol out of the string. Here, we handle single character
-   * symbols and special functions like \verb.
-   */
-
-
-  parseSymbol() {
-    const nucleus = this.fetch();
-    let text = nucleus.text;
-
-    if (/^\\verb[^a-zA-Z]/.test(text)) {
-      this.consume();
-      let arg = text.slice(5);
-      const star = arg.charAt(0) === "*";
-
-      if (star) {
-        arg = arg.slice(1);
-      } // Lexer's tokenRegex is constructed to always have matching
-      // first/last characters.
-
-
-      if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) {
-        throw new ParseError(`\\verb assertion failed --
-                    please report what input caused this bug`);
-      }
-
-      arg = arg.slice(1, -1); // remove first and last char
-
-      return {
-        type: "verb",
-        mode: "text",
-        body: arg,
-        star
-      };
-    } // At this point, we should have a symbol, possibly with accents.
-    // First expand any accented base symbol according to unicodeSymbols.
-
-
-    if (unicodeSymbols.hasOwnProperty(text[0]) && !symbols[this.mode][text[0]]) {
-      // This behavior is not strict (XeTeX-compatible) in math mode.
-      if (this.settings.strict && this.mode === "math") {
-        this.settings.reportNonstrict("unicodeTextInMathMode", `Accented Unicode text character "${text[0]}" used in ` + `math mode`, nucleus);
-      }
-
-      text = unicodeSymbols[text[0]] + text.substr(1);
-    } // Strip off any combining characters
-
-
-    const match = combiningDiacriticalMarksEndRegex.exec(text);
-
-    if (match) {
-      text = text.substring(0, match.index);
-
-      if (text === 'i') {
-        text = '\u0131'; // dotless i, in math and text mode
-      } else if (text === 'j') {
-        text = '\u0237'; // dotless j, in math and text mode
-      }
-    } // Recognize base symbol
-
-
-    let symbol;
-
-    if (symbols[this.mode][text]) {
-      if (this.settings.strict && this.mode === 'math' && extraLatin.indexOf(text) >= 0) {
-        this.settings.reportNonstrict("unicodeTextInMathMode", `Latin-1/Unicode text character "${text[0]}" used in ` + `math mode`, nucleus);
-      }
-
-      const group = symbols[this.mode][text].group;
-      const loc = SourceLocation.range(nucleus);
-      let s;
-
-      if (ATOMS.hasOwnProperty(group)) {
-        // $FlowFixMe
-        const family = group;
-        s = {
-          type: "atom",
-          mode: this.mode,
-          family,
-          loc,
-          text
-        };
-      } else {
-        // $FlowFixMe
-        s = {
-          type: group,
-          mode: this.mode,
-          loc,
-          text
-        };
-      }
-
-      symbol = s;
-    } else if (text.charCodeAt(0) >= 0x80) {
-      // no symbol for e.g. ^
-      if (this.settings.strict) {
-        if (!supportedCodepoint(text.charCodeAt(0))) {
-          this.settings.reportNonstrict("unknownSymbol", `Unrecognized Unicode character "${text[0]}"` + ` (${text.charCodeAt(0)})`, nucleus);
-        } else if (this.mode === "math") {
-          this.settings.reportNonstrict("unicodeTextInMathMode", `Unicode text character "${text[0]}" used in math mode`, nucleus);
-        }
-      } // All nonmathematical Unicode characters are rendered as if they
-      // are in text mode (wrapped in \text) because that's what it
-      // takes to render them in LaTeX.  Setting `mode: this.mode` is
-      // another natural choice (the user requested math mode), but
-      // this makes it more difficult for getCharacterMetrics() to
-      // distinguish Unicode characters without metrics and those for
-      // which we want to simulate the letter M.
-
-
-      symbol = {
-        type: "textord",
-        mode: "text",
-        loc: SourceLocation.range(nucleus),
-        text
-      };
-    } else {
-      return null; // EOF, ^, _, {, }, etc.
-    }
-
-    this.consume(); // Transform combining characters into accents
-
-    if (match) {
-      for (let i = 0; i < match[0].length; i++) {
-        const accent = match[0][i];
-
-        if (!unicodeAccents[accent]) {
-          throw new ParseError(`Unknown accent ' ${accent}'`, nucleus);
-        }
-
-        const command = unicodeAccents[accent][this.mode];
-
-        if (!command) {
-          throw new ParseError(`Accent ${accent} unsupported in ${this.mode} mode`, nucleus);
-        }
-
-        symbol = {
-          type: "accent",
-          mode: this.mode,
-          loc: SourceLocation.range(nucleus),
-          label: command,
-          isStretchy: false,
-          isShifty: true,
-          base: symbol
-        };
-      }
-    }
-
-    return symbol;
-  }
-
-}
-Parser.endOfExpression = ["}", "\\endgroup", "\\end", "\\right", "&"];
-Parser.endOfGroup = {
-  "[": "]",
-  "{": "}",
-  "\\begingroup": "\\endgroup"
-  /**
-   * Parses an "expression", which is a list of atoms.
-   *
-   * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This
-   *                 happens when functions have higher precendence han infix
-   *                 nodes in implicit parses.
-   *
-   * `breakOnTokenText`: The text of the token that the expression should end
-   *                     with, or `null` if something else should end the
-   *                     expression.
-   */
-
-};
-Parser.SUPSUB_GREEDINESS = 1;
-
-/**
- * Provides a single function for parsing an expression using a Parser
- * TODO(emily): Remove this
- */
-
-/**
- * Parses an expression using a Parser, then returns the parsed result.
- */
-const parseTree = function parseTree(toParse, settings) {
-  if (!(typeof toParse === 'string' || toParse instanceof String)) {
-    throw new TypeError('KaTeX can only parse string typed expression');
-  }
-
-  const parser = new Parser(toParse, settings); // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors
-
-  delete parser.gullet.macros.current["\\df@tag"];
-  let tree = parser.parse(); // If the input used \tag, it will set the \df@tag macro to the tag.
-  // In this case, we separately parse the tag and wrap the tree.
-
-  if (parser.gullet.macros.get("\\df@tag")) {
-    if (!settings.displayMode) {
-      throw new ParseError("\\tag works only in display equations");
-    }
-
-    parser.gullet.feed("\\df@tag");
-    tree = [{
-      type: "tag",
-      mode: "text",
-      body: tree,
-      tag: parser.parse()
-    }];
-  }
-
-  return tree;
-};
-
-/* eslint no-console:0 */
-
-/**
- * Parse and build an expression, and place that expression in the DOM node
- * given.
- */
-let render = function render(expression, baseNode, options) {
-  baseNode.textContent = "";
-  const node = renderToDomTree(expression, options).toNode();
-  baseNode.appendChild(node);
-}; // KaTeX's styles don't work properly in quirks mode. Print out an error, and
-// disable rendering.
-
-
-if (typeof document !== "undefined") {
-  if (document.compatMode !== "CSS1Compat") {
-    typeof console !== "undefined" && console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your " + "website has a suitable doctype.");
-
-    render = function render() {
-      throw new ParseError("KaTeX doesn't work in quirks mode.");
-    };
-  }
-}
-/**
- * Parse and build an expression, and return the markup for that.
- */
-
-
-const renderToString = function renderToString(expression, options) {
-  const markup = renderToDomTree(expression, options).toMarkup();
-  return markup;
-};
-/**
- * Parse an expression and return the parse tree.
- */
-
-
-const generateParseTree = function generateParseTree(expression, options) {
-  const settings = new Settings(options);
-  return parseTree(expression, settings);
-};
-/**
- * If the given error is a KaTeX ParseError and options.throwOnError is false,
- * renders the invalid LaTeX as a span with hover title giving the KaTeX
- * error message.  Otherwise, simply throws the error.
- */
-
-
-const renderError = function renderError(error, expression, options) {
-  if (options.throwOnError || !(error instanceof ParseError)) {
-    throw error;
-  }
-
-  const node = buildCommon.makeSpan(["katex-error"], [new SymbolNode(expression)]);
-  node.setAttribute("title", error.toString());
-  node.setAttribute("style", `color:${options.errorColor}`);
-  return node;
-};
-/**
- * Generates and returns the katex build tree. This is used for advanced
- * use cases (like rendering to custom output).
- */
-
-
-const renderToDomTree = function renderToDomTree(expression, options) {
-  const settings = new Settings(options);
-
-  try {
-    const tree = parseTree(expression, settings);
-    return buildTree(tree, expression, settings);
-  } catch (error) {
-    return renderError(error, expression, settings);
-  }
-};
-/**
- * Generates and returns the katex build tree, with just HTML (no MathML).
- * This is used for advanced use cases (like rendering to custom output).
- */
-
-
-const renderToHTMLTree = function renderToHTMLTree(expression, options) {
-  const settings = new Settings(options);
-
-  try {
-    const tree = parseTree(expression, settings);
-    return buildHTMLTree(tree, expression, settings);
-  } catch (error) {
-    return renderError(error, expression, settings);
-  }
-};
-
-var katex = {
-  /**
-   * Current KaTeX version
-   */
-  version: "0.11.1",
-
-  /**
-   * Renders the given LaTeX into an HTML+MathML combination, and adds
-   * it as a child to the specified DOM node.
-   */
-  render,
-
-  /**
-   * Renders the given LaTeX into an HTML+MathML combination string,
-   * for sending to the client.
-   */
-  renderToString,
-
-  /**
-   * KaTeX error, usually during parsing.
-   */
-  ParseError,
-
-  /**
-   * Parses the given LaTeX into KaTeX's internal parse tree structure,
-   * without rendering to HTML or MathML.
-   *
-   * NOTE: This method is not currently recommended for public use.
-   * The internal tree representation is unstable and is very likely
-   * to change. Use at your own risk.
-   */
-  __parse: generateParseTree,
-
-  /**
-   * Renders the given LaTeX into an HTML+MathML internal DOM tree
-   * representation, without flattening that representation to a string.
-   *
-   * NOTE: This method is not currently recommended for public use.
-   * The internal tree representation is unstable and is very likely
-   * to change. Use at your own risk.
-   */
-  __renderToDomTree: renderToDomTree,
-
-  /**
-   * Renders the given LaTeX into an HTML internal DOM tree representation,
-   * without MathML and without flattening that representation to a string.
-   *
-   * NOTE: This method is not currently recommended for public use.
-   * The internal tree representation is unstable and is very likely
-   * to change. Use at your own risk.
-   */
-  __renderToHTMLTree: renderToHTMLTree,
-
-  /**
-   * extends internal font metrics object with a new object
-   * each key in the new object represents a font name
-  */
-  __setFontMetrics: setFontMetrics,
-
-  /**
-   * adds a new symbol to builtin symbols table
-   */
-  __defineSymbol: defineSymbol,
-
-  /**
-   * adds a new macro to builtin macro list
-   */
-  __defineMacro: defineMacro,
-
-  /**
-   * Expose the dom tree node types, which can be useful for type checking nodes.
-   *
-   * NOTE: This method is not currently recommended for public use.
-   * The internal tree representation is unstable and is very likely
-   * to change. Use at your own risk.
-   */
-  __domTree: {
-    Span,
-    Anchor,
-    SymbolNode,
-    SvgNode,
-    PathNode,
-    LineNode
-  }
-};
-
-export default katex;
diff --git a/registry/vulkan/makeAllExts b/registry/vulkan/makeAllExts
deleted file mode 100755
index fce3ce3..0000000
--- a/registry/vulkan/makeAllExts
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-#
-# Copyright 2016-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-# makeAllExts - invoke Makefile with the right options to build with all
-# extensions included.
-
-./makeSpec -clean -spec all $*
diff --git a/registry/vulkan/makeExt b/registry/vulkan/makeExt
deleted file mode 100755
index 2a92198..0000000
--- a/registry/vulkan/makeExt
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env bash
-#
-# Copyright 2016-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-# makeExt - invoke Makefile with the right options to build with a
-# specific extension included. Only one extension may be specified;
-# for more complex builds, invoke 'makeSpec' directly.
-#
-# Usage: makeExt extension targets
-
-extension=$1
-shift
-
-./makeSpec -clean -spec core -extension $extension $*
diff --git a/registry/vulkan/makeKHR b/registry/vulkan/makeKHR
deleted file mode 100755
index 147f2e3..0000000
--- a/registry/vulkan/makeKHR
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env bash
-#
-# Copyright 2016-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-# makeKHR - invoke Makefile with the right options to build with all
-# KHR extensions included.
-
-# Usage: makeKHR targets
-
-# Load extension dependencies, generated from vk.xml
-./makeSpec -clean -spec khr $*
diff --git a/registry/vulkan/makeSpec b/registry/vulkan/makeSpec
deleted file mode 100755
index a8d4ce0..0000000
--- a/registry/vulkan/makeSpec
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright 2020-2021 The Khronos Group Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-# Build a spec with requested extension sets and options.
-#
-# Usage: makeSpec script-options make-options
-# Script options are parsed by this script before invoking 'make':
-#   -genpath path - directory for generated files and outputs
-#   -spec core - make a spec with no extensions (default)
-#   -spec khr - make a spec with all KHR extensions
-#   -spec all - make a spec with all registered extensions
-#   -version {1.0 | 1.1 | 1.2} - make a spec with this core version
-#   -ext name - add specified extension and its dependencies
-#   -clean - clean generated files before building
-#   -v - verbose, print actions before executing  them
-#   -n - dry-run, print actions instead of executing them
-# make-options - all other options are passed to 'make', including
-# requested build targets
-
-import argparse, copy, io, os, re, string, subprocess, sys
-
-def execute(args, results):
-    if results.verbose or results.dryrun:
-        print("'" + "' '".join(args) + "'")
-    if not results.dryrun:
-        subprocess.check_call(args)
-
-if __name__ == '__main__':
-    parser = argparse.ArgumentParser()
-
-    parser.add_argument('-clean', action='store_true',
-                        help='Clean generated files before building')
-    parser.add_argument('-extension', action='append',
-                        default=[],
-                        help='Specify a required extension or extensions to add to targets')
-    parser.add_argument('-genpath', action='store',
-                        default='gen',
-                        help='Path to directory containing generated files')
-    parser.add_argument('-spec', action='store',
-                        choices=[ 'core', 'khr', 'all' ],
-                        default='core',
-                        help='Type of spec to generate')
-    parser.add_argument('-version', action='store',
-                        choices=[ '1.0', '1.1', '1.2' ],
-                        default='1.2',
-                        help='Type of spec to generate')
-    parser.add_argument('-n', action='store_true', dest='dryrun',
-                        help='Only prints actions, do not execute them')
-    parser.add_argument('-v', action='store_true', dest='verbose',
-                        help='Print actions before executing them')
-
-    (results, options) = parser.parse_known_args()
-
-    # Ensure genpath is an absolute path, not relative
-    if results.genpath[0] != '/':
-        results.genpath = os.getcwd() + '/' + results.genpath
-
-    # Ensure extDependency.py exists and is up to date before importing it
-    try:
-        execute(['make', 'GENERATED=' + results.genpath, 'extDependency'], results)
-
-        # Look for extDependency.py in the specified directory and import it
-        sys.path.insert(0, results.genpath)
-        from extDependency import extensions, allExts, khrExts
-    except:
-        print('Cannot execute "make extDependency" or determine correct extension list', file=sys.stderr)
-
-    # List of versions to build with from the requested -version
-    versionDict = {
-        '1.0' : [ 'VK_VERSION_1_0' ],
-        '1.1' : [ 'VK_VERSION_1_0', 'VK_VERSION_1_1' ],
-        '1.2' : [ 'VK_VERSION_1_0', 'VK_VERSION_1_1', 'VK_VERSION_1_2' ],
-    }
-    versions = 'VERSIONS={}'.format(' '.join(versionDict[results.version]))
-
-    # List of extensions to build with from the requested -spec
-    # Also construct a spec title
-    if results.spec == 'core':
-        title = ''
-        exts = set()
-    if results.spec == 'khr':
-        title = 'with all KHR extensions'
-        exts = set(khrExts)
-    elif results.spec == 'all':
-        title = 'with all registered extensions'
-        exts = set(allExts)
-
-    # List of explicitly requested extension and all its dependencies
-    extraexts = set()
-    for name in results.extension:
-        if name in extensions:
-            extraexts.add(name)
-            extraexts.update(extensions[name])
-        else:
-            print('ERROR: unknown extension', name, file=sys.stderr)
-            sys.exit(1)
-
-    # See if any explicitly requested extensions aren't implicitly requested
-    # Add any such extensions to the spec title
-    extraexts -= exts
-    if len(extraexts) > 0:
-        exts.update(extraexts)
-        if title != '':
-            title += ' and ' + ', '.join(sorted(extraexts))
-        else:
-            title += 'with ' + ', '.join(sorted(extraexts))
-
-    if title != '':
-        title = '(' + title + ')'
-
-    # Finally, actually invoke make as needed for the targets
-    args = [ 'make', 'GENERATED=' + results.genpath ]
-
-    if results.clean:
-        execute(args + ['clean'], results)
-
-    args.append(versions)
-
-    # The actual target
-    if len(exts) > 0:
-        args.append('EXTENSIONS={}'.format(' '.join(sorted(exts))))
-    args.append('APITITLE={}'.format(title))
-    args += options
-
-    try:
-        execute(args, results)
-    except:
-        sys.exit(1)
diff --git a/registry/vulkan/proposals/VK_HUAWEI_invocation_mask.asciidoc b/registry/vulkan/proposals/VK_HUAWEI_invocation_mask.asciidoc
deleted file mode 100644
index c1726a4..0000000
--- a/registry/vulkan/proposals/VK_HUAWEI_invocation_mask.asciidoc
+++ /dev/null
@@ -1,149 +0,0 @@
-
-// Copyright 2021 HUAWEI, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-= VK_HUAWEI_invocation_mask
-:toc: left
-:refpage: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/
-
-
-
-== Problem Statement
-
-The rays to trace may be sparse in some use cases. 
-
-For example, the scene only have a few regions to reflect. 
-
-Providing an invocation mask image to the trace ray commands could potentially give the hardware the hint to do
-
-certain optimization without invoking an additional pass to compact the ray buffer.
-
-== Solution Space
-
-
-
-== Proposal
-
-API proposal
-
-New Enum Constants
-
-• VK_HUAWEI_INVOCATION_MASK_EXTENSION_NAME
-• VK_HUAWEI_INVOCATION_MASK_SPEC_VERSION
-• Extending VkAccessFlagBits2KHR:
-
- ◦ VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI
-
-• Extending VkImageUsageFlagBits:
-
- ◦ VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI
-
-• Extending VkPipelineStageFlagBits2KHR:
-
- ◦ VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI
-
-• Extending VkStructureType:
-
- ◦ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI
-
-
-New structure
- ◦ VkPhysicalDeviceInvocationMaskFeaturesHUAWEI
-
-typedef enum VkImageUsageFlagBits {
-
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT = 0x00000001,
- VK_IMAGE_USAGE_TRANSFER_DST_BIT = 0x00000002,
- VK_IMAGE_USAGE_SAMPLED_BIT = 0x00000004,
- VK_IMAGE_USAGE_STORAGE_BIT = 0x00000008,
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 0x00000010,
- VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020,
- VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040,
- VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080,
- VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV = 0x00000100,
-
- // Provided by VK_EXT_fragment_density_map
- VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x00000200,
-
- // Provided by VK_HUAWEI_invocation_mask
- VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI = 0x00040000,
-
-} VkImageUsageFlagBits;
-
-New commands
-
-void vkCmdBindInvocationMaskHUAWEI(
-  VkCommandBuffer commandBuffer,
-  VkImageView imageView,
-  VkImageLayout imageLayout);
-  
-• If imageView is not VK_NULL_HANDLE, it must be a valid VkImageView handle of type VK_IMAGE_VIEW_TYPE_2D
-
-• If imageView is not VK_NULL_HANDLE, it must have a format of VK_FORMAT_R8_UINT
-
-• If imageView is not VK_NULL_HANDLE, it must have been created with a usage value including VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI
-
-• If imageView is not VK_NULL_HANDLE, imageLayout must match the actual VkImageLayou
-of each subresource accessible from imageView at the time the subresource is accessed
-• If imageView is not VK_NULL_HANDLE, imageLayout must be VK_IMAGE_LAYOUT_GENERAL
-
-Valid usage:
-
-Mask image resolution must match the width/height in vkCmdTraceRay;
-The elment of the invocation mask image use value 0 and 1.
-The value 1 means the invocation is active.
-
-New structure
-
-• Extending VkPhysicalDeviceFeatures2, VkDeviceCreateInfo:
-
- ◦ VkPhysicalDeviceInvocationMaskFeaturesHUAWEI
-
- typedef struct VkPhysicalDeviceInvocationMaskFeaturesHUAWEI {
-  VkStructureType sType;
-  void* pNext;
-  VkBool32 invocationMask;
- } VkPhysicalDeviceInvocationMaskFeaturesHUAWEI;
-
-invocationMask = true mean the feature is supported
-
-
-== Examples
-
-RT mask is updated before each traceRay.
-
-Step 1. Generate InvocationMask.
-
-//the rt mask image bind as color attachment in the fragment shader
-Layout(location = 2) out vec4 outRTmask
-vec4 mask = vec4(x,x,x,x);
-outRTmask = mask;
-
-Step 2. traceRay with InvocationMask
-
-vkCmdBindPipeline(
-    commandBuffers[imageIndex],
-    VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, m_rtPipeline);
-    vkCmdBindDescriptorSets(commandBuffers[imageIndex],
-    VK_PIPELINE_BIND_POINT_RAY_TRACING_NV,
-    m_rtPipelineLayout, 0, 1, &m_rtDescriptorSet,
-    0, nullptr);
-
-vkCmdBindInvocationMaskHUAWEI(
-    commandBuffers[imageIndex],
-    InvocationMaskimageView,
-    InvocationMaskimageLayout);
-    vkCmdTraceRaysKHR(commandBuffers[imageIndex],
-    pRaygenShaderBindingTable,
-    pMissShaderBindingTable,
-    swapChainExtent.width,
-    swapChainExtent.height, 1);
-
-
-== Issues
-
-
-== Further Functionality
-
-
diff --git a/registry/vulkan/proposals/VK_KHR_dynamic_rendering.asciidoc b/registry/vulkan/proposals/VK_KHR_dynamic_rendering.asciidoc
deleted file mode 100644
index f7ef51e..0000000
--- a/registry/vulkan/proposals/VK_KHR_dynamic_rendering.asciidoc
+++ /dev/null
@@ -1,440 +0,0 @@
-// Copyright 2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-= VK_KHR_dynamic_rendering
-:toc: left
-:refpage: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/
-:sectnums:
-
-This document details API design ideas for the VK_KHR_dynamic_rendering extension, which adds a more dynamic and flexible way to use draw commands, as a straightforward replacement for single pass render passes.
-
-
-== Problem Statement
-
-Render passes are the number one complaint from developers about Vulkan and have been almost since launch. Some of the most pointed issues are as follows:
-
-  . Other APIs have much more flexible APIs for the same functionality
-  . Most of the render pass API in Vulkan goes unused
-  . Most applications don't or can't use subpasses, but still pay the cost of setting them up
-  . The API doesn't fit into most existing software architectures
-  . Fundamentally, other than load/store actions, they don't address real issues for IHVs or ISVs
-  . When teaching Vulkan as an API, this is a huge place where people trip up
-
-An additional problem came up recently that having this state baked into pipeline creation actively contributes to the pipeline compilation time problem and having the ability to separate out most of this state would help enormously.
-
-This proposal _only_ addresses single pass render passes; additional functionality to replace multiple subpasses will be in a separate proposal.
-
-
-== Solution Space
-
-The following rough options exist for addressing this issue:
-
-  . Drastically expand the render pass compatibility options
-  . Allow render pass objects to be “VK_NULL_HANDLE” until record time
-  . Create a new API that pares down the information required to the bare minimum
-
-Option 1 has the advantage of being the least invasive in terms of API changes –it only really affects a handful of VUs, whilst still solving some of the flexibility issues.
-The disadvantage of this is that applications still have to manage render pass objects, and it doesn’t really address any of the points in the problem statement directly.
-
-Option 2 effectively allows applications to provide the same information to applications again without any real API change, and addresses point 4 in the problem statement directly as it allows the render pass information to provided fairly late.
-
-Option 3 is a much more drastic change in terms of the API, requiring additional paths through the API/driver that are generally somewhat annoying to manage. This has the advantage of being able to address all points in the problem statement, however.
-Render pass objects also carry a lot of baggage in terms of developer opinion, and an overhaul replacement is likely to be better received for that reason.
-
-Developers and the Vulkan WG seems to be more enthusiastic about Option 3 than other approaches, and so it is the approach proposed here.
-
-
-== Proposal
-
-=== Begin/End Render Pass
-
-This extension introduces new commands to begin and end a render pass:
-
-[source,c]
-----
-VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderingKHR(
-    VkCommandBuffer                             commandBuffer,
-    const VkRenderingInfoKHR*                   pRenderingInfo);
-
-VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderingKHR(
-    VkCommandBuffer                             commandBuffer);
-----
-
-Neither of these commands make any reference to a render pass object – render passes are now fully dynamic.
-These commands may be called inside secondary command buffers, but `vkCmdEndRenderingKHR` and `vkCmdBeginRenderingKHR` must always appear as a pair in the same command buffer.
-Note that render passes can still span multiple command buffers via <<suspending-and-resuming,suspended render passes>>.
-
-[source,c]
-----
-typedef struct VkRenderingInfoKHR {
-    VkStructureType                     sType;
-    const void*                         pNext;
-    VkRenderingFlagsKHR                 flags;
-    VkRect2D                            renderArea;
-    uint32_t                            layerCount;
-    uint32_t                            viewMask;
-    uint32_t                            colorAttachmentCount;
-    const VkRenderingAttachmentInfoKHR* pColorAttachments;
-    const VkRenderingAttachmentInfoKHR* pDepthAttachment;
-    const VkRenderingAttachmentInfoKHR* pStencilAttachment;
-} VkRenderingInfoKHR;
-----
-
-The rendering info provided to `vkCmdBeginRenderingKHR` is the essential information needed to begin rendering, based on what is and is not currently inside the compatibility rules for render passes.
-Notably, this is not a synchronization command – there’s no replacement for subpass external dependencies.
-Applications should use other synchronization primitives (barriers, events) to manage synchronization.
-
-If `viewMask` is `0`, then multiview is disabled for this render pass, and `layerCount` indicates the number of layers used in each attachment.
-If `viewMask` is non-zero, then multiview is enabled for this render pass, and each bit in `viewMask` indicates a layer index in each element that will rendered.
-
-==== Attachments
-
-Depth and stencil image info are separated for API clarity (since everything else is applied independently), but they must point to the same image.
-The same restriction applies to their respective resolve images.
-For each attachment, the information provided is a the image view to bind, layout information, resolve information, and load/store ops (including a clear color).
-
-[source,c]
-----
-typedef struct VkRenderingAttachmentInfoKHR {
-    VkStructureType          sType;
-    const void*              pNext;
-    VkImageView              imageView;
-    VkImageLayout            imageLayout;
-    VkResolveModeFlagBits    resolveMode;
-    VkImageView              resolveImageView;
-    VkImageLayout            resolveImageLayout;
-    VkAttachmentLoadOp       loadOp;
-    VkAttachmentStoreOp      storeOp;
-    VkClearValue             clearValue;
-} VkRenderingAttachmentInfoKHR;
-----
-
-There are no layout transitions or other synchronization info for images – synchronization is done exclusively by existing synchronization commands - the layouts provided are those that the image must already be in when rendering.
-
-Image views for any attachment may be link:{refpage}VK_NULL_HANDLE.html[VK_NULL_HANDLE], indicating that writes to the attachment are discarded, and reads return undefined values.
-
-Note that the resolve images do not have their own load/store operations; they are treated as if they are implicitly `VK_ATTACHMENT_LOAD_OP_DONT_CARE` and `VK_ATTACHMENT_STORE_OP_STORE` – other combinations in the existing API don’t really carry any useful meaning.
-
-`resolveMode` for color attachments must be `VK_RESOLVE_MODE_NONE` or `VK_RESOLVE_MODE_AVERAGE_BIT`.
-
-===== Store Op None
-
-A new store operation is provided as originally described by link:{refpage}VK_QCOM_render_pass_store_ops.html[VK_QCOM_render_pass_store_ops]:
-
-[source,c]
-----
-VK_ATTACHMENT_STORE_OP_NONE_KHR = 1000301000,
-----
-
-This store operation works largely like DONT_CARE but guarantees that the store op does not access the attachment.
-When a render pass accesses an attachment as read only, this can be useful in avoiding a potential write operation during the store operation, and removing the need for synchronization in some cases.
-
-
-==== Rendering Flags
-
-Rendering flags cover the following functionality:
-
-[source,c]
-----
-typedef enum VkRenderingFlagsKHR {
-    VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR = 0x00000001,
-    VK_RENDERING_SUSPENDING_BIT_KHR                         = 0x00000002,
-    VK_RENDERING_RESUMING_BIT_KHR                           = 0x00000004,
-} VkRenderingFlagsKHR;
-----
-
-
-===== Secondary Command Buffer Contents
-
-`VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR` works more or less identically to `VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS`, indicating that the contents of the render pass will be entirely recorded inside a secondary command buffer and replayed.
-If it is absent, the commands must be wholly recorded inside the command buffer that starts it. 
-
-This requires the introduction of a new inheritance info when dynamic rendering is used, as the renderpass will no longer provide information required by implementations:
-
-[source,c]
-----
-typedef struct VkCommandBufferInheritanceRenderingInfoKHR {
-    VkStructureType          sType;
-    const void*              pNext;
-    VkRenderingFlagsKHR      flags;
-    uint32_t                 viewMask;
-    uint32_t                 colorAttachmentCount;
-    const VkFormat*          pColorAttachmentFormats;
-    VkFormat                 depthAttachmentFormat;
-    VkFormat                 stencilAttachmentFormat;
-    VkSampleCountFlagBits    rasterizationSamples;
-} VkCommandBufferInheritanceRenderingInfoKHR;
-----
-
-Information here must match that in the render pass being executed.
-If no color attachments are used or the formats are all `VK_FORMAT_UNDEFINED`, and the `variableMultisampleRate` feature is supported, the rasterization sample count is ignored.
-If either `depthAttachmentFormat` or `stencilAttachmentFormat` are not `VK_FORMAT_UNDEFINED`, they must have the same value.
-
-This allows applications to use secondary command buffers with dynamic rendering as they would have done in the existing render pass API.
-
-However, an alternative method of recording commands across multiple command buffers is also provided by <<suspending-and-resuming,suspending render passes>>.
-
-[[command-buffer-inheritance-mixed-samples]]
-====== Mixed Samples
-
-If either of link:{refpage}VK_NV_framebuffer_mixed_samples.html[VK_NV_framebuffer_mixed_samples] or link:{refpage}VK_AMD_mixed_attachment_samples.html[VK_AMD_mixed_attachment_samples] are enabled, the sample counts of color and depth attachments may vary from the `rasterizationSamples`.
-In this case, the sample count of each attachment can be specified by including the `VkAttachmentSampleInfoAMD`/`VkAttachmentSampleCountInfoNV` structure in the same `pNext` chain.
-
-[source,c]
-----
-typedef struct VkAttachmentSampleCountInfoAMD {
-    VkStructureType                 sType;
-    const void*                     pNext;
-    VkRenderingFlagsKHR             flags;
-    uint32_t                        colorAttachmentCount;
-    const VkSampleCountFlagBits*    pColorAttachmentSamples;
-    VkSampleCountFlagBits           depthStencilAttachmentSamples;
-} VkAttachmentSampleCountInfoAMD;
-
-typedef VkAttachmentSampleCountInfoAMD VkAttachmentSampleCountInfoNV;
-----
-
-[[command-buffer-inheritance-multiview-per-view-attributes]]
-====== Multiview Per-View Attributes
-
-If link:{refpage}VK_NVX_multiview_per_view_attributes.html[VK_NVX_multiview_per_view_attributes] is enabled, the multiview per-view attributes can be specified by including the `VkMultiviewPerViewAttributesInfoNVX` structure in the same `pNext` chain.
-
-
-[[suspending-and-resuming]]
-===== Suspending and Resuming
-
-`VK_RENDERING_SUSPENDING_BIT_KHR` and `VK_RENDERING_RESUMING_BIT_KHR` allow an alternative method of recording across multiple command buffers.
-Applications can suspend a render pass in one command buffer using `VK_RENDERING_SUSPENDING_BIT_KHR`, and resume it in another command buffer by starting an identical render pass with `VK_RENDERING_RESUMING_BIT_KHR`.
-Suspended render passes must be resumed by a render pass with identical begin parameters, other than the presence absence of `VK_RENDERING_SUSPENDING_BIT_KHR`, `VK_RENDERING_RESUMING_BIT_KHR`, and `VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR`.
-
-It is invalid to use action commands, synchronization commands, or record additional render passes, between a suspended render pass and the render pass which resumes it.
-All pairs of resuming and suspending render passes must be submitted in the same batch.
-Applications can resume a dynamic render pass in the same command buffer as it was suspended.
-Applications can record a dynamic render pass wholly inside secondary command buffers.
-A dynamic render pass can be both suspending and resuming.
-
-
-==== Device Groups
-
-The link:{refpage}VkDeviceGroupRenderPassBeginInfo.html[VkDeviceGroupRenderPassBeginInfo] structure can be chained from `VkRenderingInfoKHR`, with the same effect as when chained to link:{refpage}VkRenderPassBeginInfo.html[VkRenderPassBeginInfo] - setting the device mask and setting independent render areas per device.
-
-
-==== Fragment Shading Rate
-
-If link:{refpage}VK_KHR_fragment_shading_rate.html[VK_KHR_fragment_shading_rate] is enabled, when calling `vkCmdBeginRenderingKHR`, the following structure should be chained to `VkRenderingInfoKHR` to include a fragment shading rate attachment:
-
-[source,c]
-----
-typedef struct VkRenderingFragmentShadingRateAttachmentInfoKHR {
-    VkStructureType                     sType;
-    const void*                         pNext;
-    VkImageView                         imageView;
-    VkImageLayout                       imageLayout;
-} VkRenderingFragmentShadingRateAttachmentInfoKHR;
-----
-
-
-==== Fragment Density Map
-
-If link:{refpage}VK_EXT_fragment_density_map.html[VK_EXT_fragment_density_map] is enabled, when calling `vkCmdBeginRenderingKHR`, the following structure should be chained to `VkRenderingInfoKHR` to include a fragment density map attachment:
-
-[source,c]
-----
-typedef struct VkRenderingFragmentDensityMapAttachmentInfoEXT {
-    VkStructureType                     sType;
-    const void*                         pNext;
-    VkImageView                         imageView;
-    VkImageLayout                       imageLayout;
-} VkRenderingFragmentDensityMapAttachmentInfoEXT;
-----
-
-
-=== Pipeline Creation
-
-With the removal of render pass objects, it’s now necessary to provide some of that same information to applications at pipeline creation.
-This structure is chained from link:{refpage}VkGraphicsPipelineCreateInfo.html[VkGraphicsPipelineCreateInfo]:
-
-[source,c]
-----
-typedef struct VkPipelineRenderingCreateInfoKHR {
-    VkStructureType    sType;
-    const void*        pNext;
-    uint32_t           colorAttachmentCount;
-    const VkFormat*    pColorAttachmentFormats;
-    VkFormat           depthAttachmentFormat;
-    VkFormat           stencilAttachmentFormat;
-    uint32_t           viewMask;
-} VkPipelineRenderingCreateInfoKHR;
-----
-
-If a color or depth/stencil attachment is specified in `vkCmdBeginRenderingKHR`, its format must match that provided here.
-If any format here is `VK_FORMAT_UNDEFINED`, no attachment must be specified for that attachment in `vkCmdBeginRenderingKHR`.
-Applications can provide a valid format here and then not specify an attachment in `vkCmdBeginRenderingKHR`.
-If either `depthAttachmentFormat` or `stencilAttachmentFormat` are not `VK_FORMAT_UNDEFINED`, they must have the same value.
-
-The value of `viewMask` must match the value of the `viewMask` member of `VkRenderingInfoKHR`.
-
-===== Multiview Per-View Attributes
-
-If link:{refpage}VK_NVX_multiview_per_view_attributes.html[VK_NVX_multiview_per_view_attributes] is enabled, the multiview per-view attributes can be specified by including the `VkMultiviewPerViewAttributesInfoNVX` structure in the same `pNext` chain. 
-
-==== Mixed Sample Attachments
-
-If either of link:{refpage}VK_NV_framebuffer_mixed_samples.html[VK_NV_framebuffer_mixed_samples] or link:{refpage}VK_AMD_mixed_attachment_samples.html[VK_AMD_mixed_attachment_samples] are enabled, the sample counts of color and depth attachments must be specified at pipeline creation as well.
-As with <<command-buffer-inheritance-mixed-samples,command buffer inheritance>>, the sample count of each attachment can be specified by including the `VkAttachmentSampleInfoAMD`/`VkAttachmentSampleCountInfoNV` structure in the `pNext` chain.
-If the structure is omitted, the sample count for each attachment is considered equal to link:{refpage}VkPipelineMultisampleStateCreateInfo.html[`VkPipelineMultisampleStateCreateInfo::rasterizationSamples`].
-
-
-==== Fragment Shading Rate
-
-If link:{refpage}VK_KHR_fragment_shading_rate.html[VK_KHR_fragment_shading_rate] is enabled, a new rasterization state pipeline creation flag must be provided if a shading rate attachment will be used:
-
-[source,c]
-----
-VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
-----
-
-
-==== Fragment Density Map
-
-If link:{refpage}VK_EXT_fragment_density_map.html[VK_EXT_fragment_density_map] is enabled, a new rasterization state pipeline creation flag must be provided if a fragment density map will be used:
-
-[source,c]
-----
-VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT
-----
-
-
-=== Features
-
-The following features are exposed by this extension:
-
-[source,c]
-----
-typedef struct VkPhysicalDeviceDynamicRenderingFeaturesKHR {
-    VkStructureType    sType;
-    void*              pNext;
-    VkBool32           dynamicRendering;
-} VkPhysicalDeviceDynamicRenderingFeaturesKHR
-----
-
-`dynamicRendering` is the core feature enabling this extension's functionality.
-
-
-== Examples
-
-
-=== Creating a Pipeline
-
-[source,c]
-----
-VkFormat colorRenderingFormats[2] = {
-    VK_FORMAT_R8G8B8A8_UNORM,
-    VK_FORMAT_R32_UINT };
-
-VkPipelineRenderingCreateInfoKHR rfInfo = {
-    .sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_FORMAT_CREATE_INFO_KHR,
-    .pNext = NULL,
-    .colorAttachmentCount = 2,
-    .pColorAttachmentFormats = colorRenderingFormats,
-    .depthAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT,
-    .stencilAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT };
-
-VkGraphicsPipelineCreateInfo createInfo = {
-    .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
-    .pNext = &rfInfo,
-    .renderPass = VK_NULL_HANDLE,
-    .... };
-
-VkPipeline graphicsPipeline;
-
-vkCreateGraphicsPipelines(device, pipelineCache, 1, &createInfo, NULL, &graphicsPipeline);
-----
-
-=== Rendering with a dynamic render pass
-
-[source,c]
-----
-VkRenderingAttachmentInfoKHR colorAttachments[2] = {
-    {
-        .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR
-        .pNext = NULL,
-        .imageView = colorImageViews[0],
-        .imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR,
-        .resolveMode = VK_RESOLVE_MODE_AVERAGE_BIT,
-        .resolveImageView = resolveColorImageView,
-        .resolveImageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR,
-        .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,
-        .storeOp = VK_ATTACHMENT_STORE_OP_NONE_KHR,
-        .clearValue = {.color = {.float32 = {0.0f,0.0f,0.0f,0.0f} } }
-    }, {
-        .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR
-        .pNext = NULL,
-        .imageView = colorImageViews[0],
-        .imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR,
-        .resolveMode = VK_RESOLVE_MODE_NONE,
-        .loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
-        .storeOp = VK_ATTACHMENT_STORE_OP_STORE_KHR
-    } };
-
-// A single depth stencil attachment info can be used, but they can also be specified separately.
-// When both are specified separately, the only requirement is that the image view is identical.
-VkRenderingAttachmentInfoKHR depthStencilAttachment = {
-    .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR
-    .pNext = NULL,
-    .imageView = depthStencilImageView,
-    .imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR,
-    .resolveMode = VK_RESOLVE_MODE_NONE,
-    .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,
-    .storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
-    .clearValue = {.depthStencil = {.depth = 0.0f, .stencil = 0 } } };
-
-VkRenderingInfoKHR renderingInfo = {
-    .sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR,
-    .pNext = NULL,
-    .flags = 0,
-    .renderArea = { ... },
-    .layerCount = 1,
-    .colorAttachmentCount = 2,
-    .pColorAttachments = colorAttachments,
-    .pDepthAttachment = &depthStencilAttachment,
-    .pStencilAttachment = &depthStencilAttachment };
-
-vkCmdBeginRenderingKHR(commandBuffer, &renderingInfo);
-
-vkCmdDraw(commandBuffer, ...);
-
-...
-
-vkCmdDraw(commandBuffer, ...);
-
-vkCmdEndRenderingKHR(commandBuffer);    
-----
-
-
-== Issues
-
-This section describes issues with the existing proposal – including both open issues that you haven’t addressed, and closed issues that aren’t self-evident from the proposal description. 
-
-
-=== RESOLVED: Should we support multiview?
-
-Yes, its complexity is much reduced compared to render pass objects, and it’s probably worth preserving in this limited form for compatibility reasons.
-
-
-=== RESOLVED: Should there be a view mask for multiview?
-
-Yes.
-Without multiple subpasses the view mask is significantly less useful; the layer count provided is sufficient to describe the number of views.
-However, the mask allows specification of a non-contiguous array, and while it's unclear if any applications use this, to maintain compatibility with existing APIs it has been included.
-
-
-=== RESOLVED: Should we have functionality to replace the on-chip storage aspect of subpasses?
-
-No - this will be designed as a separate extension.
-
-
-=== RESOLVED: Should pipeline barriers work inside these limited render passes?
-
-No - without input attachments or a solution for on-chip storage these are currently functionally useless.
diff --git a/registry/vulkan/proposals/VK_KHR_shader_integer_dot_product.asciidoc b/registry/vulkan/proposals/VK_KHR_shader_integer_dot_product.asciidoc
deleted file mode 100644
index 559ccb5..0000000
--- a/registry/vulkan/proposals/VK_KHR_shader_integer_dot_product.asciidoc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-= VK_KHR_shader_integer_dot_product
-:toc: left
-:refpage: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/
-:sectnums:
-
-This document proposes adding support for shader integer dot product instructions.
-
-== Problem Statement
-
-Dot product operations between vectors of integer values are used heavily in machine learning algorithms, acting as a fairly fundamental building block.
-When running machine learning algorithms in Vulkan, these have to be emulated using other integer operations; however many implementations have dedicated fast paths for these operations.
-
-An additional problem is that there is no clear common subset of accelerated dot product operations between vendors - making standardising on a solution somewhat tricky.
-
-This proposal aims to enable these fast paths for machine learning algorithms with minimal difficulty.
-
-
-== Solution Space
-
-There are two main ways in which applications could gain access to these fast paths:
-
- . Rely on compiler pattern matching to optimise standard integer operations into dot products
- . Add dedicated dot product operations
-
-The first of those is more or less a "do nothing" approach and puts a burden on implementations to detect these cases, with variable success rates.
-Adding dedicated dot product operations is less error prone, but does mean machine learning content needs to be updated to use these new operations.
-In the long run, the latter is likely to be much more reliable for new applications - so this proposal aims to add new operations.
-
-The question then becomes _which_ dedicated dot product operations should be exposed if there's no common subset of accelerated operations.
-Choices become:
-
- . Multiple extensions advertising different operations
- . One extension with the superset of operations but make them all optional
- . One extension with all operations available, emulating those that aren't accelerated
-
-Most existing ML backends targetting SPIR-V compile to SPIR-V once and expect the code to work everywhere within their target market - they will pick a single expression of the ML operations at the macro level and compile to that.
-To run this code everywhere, only option 3 works directly - the only option faced with 1 or 2 would be to emulate the functions as they do today, perhaps picking up optimisations in extreme cases only.
-
-Newer backends such as those using https://www.tensorflow.org/mlir[MLIR] are looking at generating platform-specific optimised IR, which can be done in part by expressing the macro-level operations differently.
-Backends like this could use information about the accelerated operations to determine which SPIR-V operations to target, and thus 1 and 2 are well suited to this.
-Option 3 would also work but would need additional information in order to make optimisation decisions.
-
-In order to satisfy both of these types of backends, this proposal works along the lines of option 3, while providing platform-specific information to allow optimising compilers to make useful choices.
-
-
-== Proposal
-
-=== API Features
-
-The following features are exposed by this extension:
-
-[source,c]
-----
-typedef struct VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR {
-    VkStructureType    sType;
-    void*              pNext;
-    VkBool32           shaderIntegerDotProduct;
-} VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR
-----
-
-`shaderIntegerDotProduct` is the core feature enabling this extension's functionality.
-
-
-=== API Properties
-
-The following features are exposed by this extension:
-
-[source,c]
-----
-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;
-} VkPhysicalDeviceDynamicRenderingFeaturesKHR
-----
-
-Each of these properties is a boolean that will be ename:VK_TRUE if the implementation provides a performance advantage for the corresponding SPIR-V instruction, over application-provided code composed from elementary instructions and/or other dot product instructions.
-This could be either because the implementation uses optimized machine code sequences whose generation from application-provided code cannot be guaranteed or because it uses hardware features that cannot otherwise be targeted from application-provided code.
-
-[NOTE] 
----
-Properties are written as `integerDotProduct<AccumulatingSaturating>{type bitwidth}{Unsigned|Signed|MixedSignedness}Accelerated`.
-Each property corresponds to a SPIR-V opcode of the form `Op{U|S|SU}Dot<AccSat>KHR`, as defined in SPIR-V extension SPV_KHR_integer_dot_product.
-The `<AccumulatingSaturating>` portion of the property corresponds to the `AccSat` instruction variants.
-The type bitwidth refers to the size of the input vectors and whether it is a packed format or not.
-`{Unsigned|Signed|MixedSignedness}` in the property correspond to `{U|S|SU}` in the instruction name.
----
-
-=== SPIR-V Changes
-
-This proposal uses an existing SPIR-V extension: http://htmlpreview.github.io/?https://github.com/KhronosGroup/SPIRV-Registry/blob/master/extensions/KHR/SPV_KHR_integer_dot_product.html[SPV_KHR_integer_dot_product].
-
-
-== Examples
-
-TODO
-
diff --git a/registry/vulkan/proposals/template.asciidoc b/registry/vulkan/proposals/template.asciidoc
deleted file mode 100644
index 45b2d43..0000000
--- a/registry/vulkan/proposals/template.asciidoc
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2021 The Khronos Group, Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-= Proposal Template
-:toc: left
-:refpage: https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/
-:sectnums:
-
-.How to use this document
-[NOTE]
-====
-This document outlines the expected flow of a proposal - text in the following sections is there as guidance for how to fill out each section.
-When creating a new proposal, text inside these sections (including this note!) should be removed and replaced with actual proposal text.
-
-Proposal documents are standalone and do not use the attributes and extensions associated with the specification - they should be independently buildable with Asciidoctor, which allows them to be previewed live on GitHub/GitLab.
-
-When calling out existing API constructs or extensions, the `refpage` attribute should be used to link to the relevant Khronos reference page.
-For example - "...used to extend link:{refpage}VkGraphicsPipelineCreateInfo.html[VkGraphicsPipelineCreateInfo]..."
-====
-
-A short summary of this proposal should be written here.
-
-== Problem Statement
-
-This section should detail the problem that’s being addressed as succinctly as possible.
-Usually this comes in three parts:
-
- . Setting the scene
- . Bulleted list of problems
- . (Optional) Describe peripheral issues
-  a. I.e. things this may enable solutions for, but doesn’t directly address.
-
-Writing this section is a good opportunity to make sure you’re not overreaching by trying to address too many problems at once.
-
-== Solution Space
-
-This section should briefly describe the options that have been considered (this is a good time to reconsider those options too!).
-
-Start with a bulleted list of the options, usually no more than a paragraph on each option and what the pros/cons of each are, then some sort of brief reason for picking the proposal you’re about to make in section 3.
-
-== Proposal
-
-This section should be the most detailed – it should go into enough detail on specific points of the proposal that readers can understand it, but without being overly verbose.
-Typically, this section will be split into subsections describing different areas of the proposal.
-
-This should only describe the minimum viable proposal; all those extra things that you could put on top that don’t necessarily fix the initial problem should move to section 5 (further functionality).
-They may make it into the final solution, but it’s important to give others the opportunity to evaluate these independently.
-
-== Examples
-
-Where relevant, add one or more examples of how this proposal will be used in practice.
-Some proposals that have limited external surface area (e.g. add a flag in a function call) may not require this but try to write motivating examples down where possible.
-This section is relatively freeform but should remain concise and to the point.
-Extraneous details in examples should be omitted (e.g. code examples don't need to compile).
-
-== Issues
-
-This section describes issues with the existing proposal – including both open issues that you haven’t addressed, and closed issues that aren’t self-evident from the proposal description. 
-
-=== RESOLVED: How are issues written?
-
-Each issue should be a separate subsection starting with a question, an indication of the status (UNRESOLVED/PROPOSED/RESOLVED), discussion expanding on the question, and a proposal for resolving it if there is one.
-
-== Further Functionality
-
-This section is for anything that could be beneficial to in the final solution, but maybe isn’t necessary to address the core problem.
-Subsections here will be like those in section 3 (Proposal) but offer additional background as to what peripheral problem they address, or benefit they provide.
-Writing this section is a good chance to re-evaluate if anything can or should be moved from section 3 to here, or just outright removed.
diff --git a/registry/vulkan/sandboxCopy b/registry/vulkan/sandboxCopy
deleted file mode 100755
index a7bec52..0000000
--- a/registry/vulkan/sandboxCopy
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env bash
-#
-# Copyright 2018-2021 The Khronos Group, Inc.
-#
-# SPDX-License-Identifier: Apache-2.0
-
-specdir=out
-RHOST=kaylee
-RPATH=/home/khronos/memberftp/vulkan/
-
-cd $specdir || (echo "Can't cd to $specdir !" ; exit 1)
-# Create tarball and upload/copy/extract that to speed things
-echo "Creating tarball"
-tar czpf /tmp/tarball.tgz .
-echo "Uploading tarball"
-scp /tmp/tarball.tgz $RHOST:$RPATH
-echo "Extracting tarball on server"
-# Could add "&& rm tarball.tgz" but nice to have around
-ssh $RHOST "cd $RPATH && tar xzpf tarball.tgz"
-echo "Removing tarball"
-rm /tmp/tarball.tgz
-
-# scp -rp * $RHOST:$RPATH
diff --git a/registry/vulkan/style/extensions.txt b/registry/vulkan/style/extensions.txt
deleted file mode 100644
index 9bffa7b..0000000
--- a/registry/vulkan/style/extensions.txt
+++ /dev/null
@@ -1,1213 +0,0 @@
-// Copyright 2015-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[extensions]]
-= API Versions, Extensions, and Layers
-
-This chapter describes required and recommended processes for writing
-specification language for different core API versions, extensions, and API
-layers.
-It is concerned with processes and registration, while fine-grained naming
-conventions are included in the <<naming,API Naming Conventions chapter>>.
-
-[NOTE]
-.Note
-====
-The mechanism and process of specifying extensions is subject to change, as
-we receive feedback from authors and further requirements of documentation
-tooling.
-This document will be updated as changes are made.
-====
-
-
-== Introduction
-
-The Khronos extension registries and extension naming conventions serve
-several purposes:
-
-  * Avoiding naming collisions between extensions developed by mutually
-    unaware parties, both in the extension names themselves, as well as
-    their token, command, and type names.
-  * Allocating enumerant values for tokens added by extensions
-  * Creating a defined order between extensions.
-    Extensions with higher numbers may have dependencies upon extensions
-    with lower numbers, and must define any relevant interactions with
-    lower-numbered extensions.
-  * Provides a central repository for documentation and header changes
-    associated with extensions
-
-
-== Proposing New Extensions
-
-The first step in the process should be to fill out a proposal document, and
-iterate on that before committing to writing specification language.
-
-The main reasons to do this are to ensure that everyone understands the
-nature of the problem being addressed, to be clear why a particular solution
-was chosen in lieu of others, and to allow for design changes before
-committing to specification text.
-If a potential implementor has concerns with any of the design choices, it
-is much easier to change details in a proposal document than it is to
-rewrite specification text.
-
-In the top level `proposals` folder there is a template (`template.adoc`)
-for writing design proposals, including guidance on how it should be used.
-
-For some simpler extensions it may not be necessary to write a proposal
-document if both the problem is well understood and the solution well
-bounded, so this is not a required piece of documentation.
-However it may still be useful to write this in a proposal document.
-
-Once a proposal is written, the Vulkan Working Group and other interested
-parties should be asked to review and provide feedback before specification
-work begins.
-
-
-[[extensions-rules]]
-== General Rules/Guidelines
-
-Some general rules to simplify the specific rules below:
-
-  * API versions, extensions and layers must each have a globally unique
-    name.
-  * All commands and tokens must have a globally unique name.
-  * API versions and extensions can expose new commands, types, and/or
-    tokens, but layers must not.
-  ** However, layers can expose their own extensions, which in turn are
-     allowed to expose new commands and tokens.
-  * All extensions must be registered with Khronos.
-  * Extensions in general are strictly additive and backwards-compatible
-    with each other and with the core API.
-    However, as described in more detail the Fundamentals chapter of the
-    <<vulkan-spec,Vulkan API Specification>>, explicit incompatibilities may
-    exist, and must be documented.
-
-
-[[extensions-naming-conventions]]
-== Version, Extension, and Layer Naming Conventions
-
-Versions, extensions and layers have formal _names_.
-These names are used in a variety of places:
-
-  * When specifying extensions and layers to enable in the API.
-  * As a preprocessor symbol in the `vulkan_*.h` header files indicating
-    that an extension interface is defined at compile time.
-  * To control building the Vulkan Specification from asciidoctor source
-    containing multiple versions and extensions, by explicitly enabling
-    their inclusion.
-
-[NOTE]
-.Note
-====
-Published extensions are documented as part of the default branch (`main`)
-of the <<vulkan-docs,KhronosGroup/Vulkan-Docs>> project.
-They can optionally be included or excluded when generating specifications.
-====
-
-There is a rigid syntax for these names:
-
-  * Versions are named with the syntax `VK_VERSION_<major>_<minor>`.
-  * Extensions are named with the syntax `VK_<author>_<name>`.
-  * Layers are named with the syntax `VK_LAYER_<author>_<name>` or
-    `VK_LAYER_<fqdn>_<name>`.
-
-All these names include a `VK_` prefix, as described in the
-<<naming-preprocessor,Preprocessor Defines>> section above.
-In addition, layers add a `LAYER_` prefix.
-
-All these names must be valid C language identifiers.
-
-
-[[extensions-naming-conventions-name-strings]]
-=== Version, Extension and Layer Name Strings
-
-The `<name>` portion of version, extension and layer names is a concise name
-describing its purpose or functionality.
-The underscore (`_`) character is used as a delimiter between words.
-Every alphabetic character of the name must be in lower case.
-
-
-[[extensions-naming-author-IDs]]
-=== Author IDs for Extensions and Layers
-
-Extension and layer names also contain an _author ID_, indicated by
-`<author>` above, identifying the author of the extension/layer.
-This ID is a short, capitalized string identifying an author, such as a
-Khronos member developing Vulkan implementations for their devices, or a
-non-Khronos developer creating Vulkan layers.
-Author IDs must be registered with Khronos.
-
-Some authors have platform communities they wish to distinguish between, and
-can register additional author IDs for that purpose.
-For example, Google has separate Android and Chrome communities.
-
-Details on how to register an author ID are provided below.
-Layer authors not wishing to register an author ID with Khronos can instead
-use a fully-qualified domain name (FQDN, indicated by `<fqdn>` above) as the
-ID.
-The FQDN should be a domain name owned by the author.
-FQDNs cannot be used for extensions, only for layers.
-
-  * The following are examples of extension and layer names, demonstrating
-    the above syntax:
-  ** Extension names all use the base prefix `VK_`.
-  ** Khronos-ratified extensions add the reserved author ID `KHR` and use
-     the prefix `VK_KHR_`.
-  ** The following author IDs are reserved and must not be used:
-  *** `VK` - To avoid confusion with the top-level `VK_` prefix.
-  *** `VULKAN` - To avoid confusion with the name of the Vulkan API.
-  *** `LAYER` - To avoid confusion with the higher-level "`LAYER`" prefix.
-  *** `KHRONOS` - To avoid confusion with the Khronos organization.
-  ** Multi-author extensions that have not been ratified by Khronos (those
-     developed via cooperation between, and intended to be supported by two
-     or more registered authors) add the special author ID `EXT` to the base
-     prefix, and will use the prefix `VK_EXT_`.
-  ** Traditional author-specific extensions developed by one author (or one
-     author in cooperation with non-authors) add the author ID to the base
-     prefix.
-     For example, NVIDIA will use the prefix `VK_NV_`, and Valve will use
-     the prefix `VK_VALVE_`.
-     Some authors can have additional registered author IDs for special
-     purposes.
-     For example, an Android extension developed by Google - but part of an
-     Android open-source community project, and so not a proprietary Google
-     extension - will use the author ID `ANDROID`.
-  ** Layer names follow the same conventions as extensions, but use the base
-     prefix `VK_LAYER_`.
-  ** Because layers need not be registered with Khronos, an alternative
-     mechanism is needed to allow creating unique layer names without
-     registering an author ID.
-     Layer authors that prefer not to register an author ID can instead use
-     a fully-qualified domain name (FQDN) in reverse-order as an author ID,
-     replacing `.` (period) with `_` (underscore) characters.
-     The restriction that layer names must be valid C identifiers means that
-     some FQDNs cannot be used as part of layer names.
-
-[NOTE]
-.Note
-====
-The `KHX` author ID was used for _experimental_ extensions, as described in
-the "`Layers & Extensions`" appendix of the <<vulkan-spec,Vulkan API
-Specification>>.
-As of the initial Vulkan 1.1 public release, all `KHX` extensions have been
-promoted to `KHR` status, and this mechanism is no longer used.
-====
-
-[source, c]
-.Example
-----
-// Core API version name for Vulkan 1.1
-VK_VERSION_1_1
-
-// Khronos extension name
-VK_KHR_mirror_clamp_to_edge
-
-// Multivendor extension name
-VK_EXT_debug_marker
-
-// Vendor extension name using author ID NV
-VK_NV_glsl_shader
-
-// Vendor layer name using author ID LUNARG
-VK_LAYER_LUNARG_vktrace
-
-// Layer name using the FQDN www.3dxcl.invalid instead of an author ID
-VK_LAYER_invalid_3dxcl_www
-----
-
-[NOTE]
-.Note
-====
-To avoid linking to a nonexistent domain, the reserved TLD `.invalid` is
-used in the example above.
-====
-
-
-[[extensions-naming]]
-== Extension Command, Type, and Token Naming Conventions
-
-Extensions may add new commands, types, and tokens, or collectively
-"`objects`", to the Vulkan API.
-These objects are given globally unique names by appending the author ID
-defined above for the extension name as described in the
-<<naming-extension-identifiers, Extension Identifier Naming Conventions>>
-section above.
-
-
-[[extensions-api-registry]]
-== The Vulkan API Registry
-
-The canonical definition of the Vulkan APIs is kept in an XML file known as
-the *Vulkan API Registry*.
-The registry is kept in `xml/vk.xml` in the default branch (`main`) of the
-<<vulkan-docs,KhronosGroup/Vulkan-Docs>> project, containing the most
-recently released Vulkan API specification.
-The registry contains reserved author IDs, core and extension interface
-definitions, definitions of individual commands and structures, and other
-information which must be agreed on by all implementations.
-The registry is used to maintain a single, consistent global namespace for
-the registered entities, to generate the Khronos-supplied Vulkan header
-files, and to create a variety of related documentation used in generating
-the API specification and reference pages.
-Other uses of the registry outside Khronos include the LunarG Loader and
-Validation Layers, and a variety of language bindings.
-
-
-[[extensions-author-ID]]
-== Registering an Author ID with Khronos
-
-Previous Khronos APIs could only officially be modified by Khronos members.
-In an effort to build a more flexible platform, Vulkan allows non-Khronos
-developers to extend and modify the API via layers and extensions in the
-same manner as Khronos members.
-However, extensions must still be registered with Khronos.
-A mechanism for non-members to register layers and extensions is provided.
-
-Extension authors will be able to create an account on GitHub and register
-an author ID with Khronos through the
-<<vulkan-docs,KhronosGroup/Vulkan-Docs>> project.
-The author ID must be used for any extensions that author registers.
-The same mechanism will be used to request registration of extensions or
-layers with Khronos, as described below.
-
-To reserve an author ID, propose a merge request against
-<<extensions-api-registry,`vk.xml`>> in the default branch.
-The merge must add a `<tag>` XML tag and fill in the `name`, `author` and
-`contact` attributes with the requested author ID, the author's formal name
-(e.g. company or project name), and contact email address, respectively.
-The author ID will only be reserved once this merge request is accepted.
-
-Please do not try to reserve author IDs which clearly belong to another
-existing company or project which may wish to develop Vulkan extensions or
-layers in the future, as a matter of courtesy and respect.
-Khronos may decline to register author IDs that are not requested in good
-faith.
-
-
-[[extensions-vendor-id]]
-== Registering a Vendor ID with Khronos
-
-Vulkan implementors must report a valid vendor ID for their implementation
-when queried by fname:vkGetPhysicalDeviceProperties, as described in the
-"`Devices and Queues`" section of the <<vulkan-spec,Vulkan API
-Specification>>.
-If there is no valid PCI vendor ID defined for the physical device,
-implementations must obtain a Khronos vendor ID.
-
-Khronos vendor IDs are reserved in a similar fashion to
-<<extensions-author-ID,author IDs>>.
-While vendor IDs are not directly related to API extensions, the reservation
-process is similar, and so is described in this section.
-
-To reserve an Khronos vendor ID, you must first have a Khronos author ID.
-Propose a merge request against <<extensions-api-registry,`vk.xml`>> in the
-default branch.
-The merge must define a new enumerant by adding an `<enum>` tag to the
-`VkVendorId` `<enums>` tag, following the existing examples.
-The `value` attribute of the `<enum>` must be the next available unused
-value, and is the reserved vendor ID.
-The `name` attribute must be `VK_VENDOR_ID_<author>`, where `<author>` is
-the author tag.
-The vendor ID will be reserved only once this merge request has been
-accepted.
-
-Please do not try to reserve vendor IDs unless you are making a good faith
-effort to develop an implementation of a Khronos API and require one for
-that purpose.
-
-[NOTE]
-.Note
-====
-Other Khronos APIs such as OpenCL also utilize vendor IDs and share the
-Khronos vendor ID space.
-To obtain a vendor ID for these APIs, first reserve it in Vulkan's `vk.xml`
-and once that is done, utilize it in the other API.
-To avoid collisions, we are currently utilizing `vk.xml` as the central
-Khronos vendor ID registry.
-====
-
-
-== Registering Extensions and Layers
-
-Extensions must be registered with Khronos.
-Layers should be registered, but registration is not required.
-Registration means:
-
-  * Receiving an extension number.
-  * Adding the extension or layer name to the list in `vk.xml` and appearing
-    on the Khronos registry website, which will link to associated
-    documentation hosted on Khronos.
-  * For extensions which add to the Vulkan API, including definitions of
-    those additions to `vk.xml`.
-
-Registration for Khronos members is handled by filing a merge request in the
-internal gitlab repository modifying `vk.xml` in the default branch, which
-contains the core specification against which the extension or layer will be
-written.
-Registration is not complete until the registry maintainer has validated and
-accepted the merge.
-
-A similar mechanism is used to register extensions not authored by Khronos
-members.
-Implementors who are not Khronos members and who need to create extensions
-must register with Khronos by creating a GitHub account, and registering
-their author ID and/or FQDNs to that account.
-They can then submit new extension registration requests by proposing merges
-to `vk.xml`.
-On acceptance of the merge, the extension will be registered, though its
-specification need not be checked into the Khronos GitHub repository at that
-point.
-
-The registration process can be split into several steps to accommodate
-extension number assignment prior to extension publication:
-
-  * Acquire an extension number.
-    This is done by proposing a merge request against `vk.xml` similarly to
-    how <<extensions-author-ID,author IDs are reserved>>.
-    The merge should add a new `<extension>` tag at the end of the file with
-    attributes specifying the proposed extension `name`, the next unused
-    sequential extension `number`, the `author` and `contact` information
-    (if different than that already specified for the author ID used in the
-    extension name), and finally, specifying `supported="disabled"`.
-    The extension number will be reserved only once this merge request is
-    accepted into the default branch.
-  * Develop and test the extension using the registered extension number.
-  * Publish the extension to Khronos using the previously registered
-    extension number, by submitting merge requests to the default branch
-    defining the changes specific to the extension.
-    Changes to both the specification source, and to `vk.xml` will be
-    needed.
-  ** Extension changes to the specification source must be protected by
-     asciidoctor conditionals as described in the
-     <<extensions-documenting,Documenting Extensions>> section.
-  ** Changes to `vk.xml` must define the extension interfaces in the
-     `<extension>` block, and must also change the `supported` attribute
-     value of the `<extension>` to `supported="vulkan"`.
-  ** When publishing an extension, mark it as enabled by proposing a merge
-     to the default branch changing the `supported` attribute value of the
-     `<extension>` to `supported="vulkan"`.
-  ** Once the merge request defining an extension has been accepted into the
-     default branch, publication is complete - although it may not be
-     visible on GitHub until the next regular core Specification update is
-     pushed out.
-  ** Publishing on the <<vulkan-docs,Khronos public GitHub repository>> is
-     preferred when possible.
-     Khronos members may instead create branches on Khronos' internal gitlab
-     server, but those branches will eventually be mirrored to GitHub.
-  * It is still possible to publish a separate branch of the repository with
-    appropriate changes relative to the core Vulkan API branch instead, but
-    this approach is deprecated and discouraged.
-    If this is done, all changes to `vk.xml` must still be made in the
-    default branch.
-
-
-[[extensions-documenting]]
-== Documenting API Versions and Extensions
-
-API versions and extensions are documented as modifications to the Vulkan
-specification.
-Changes specific to a version or extension are protected by asciidoctor
-conditionals.
-The changes are only visible in generated documentation when the
-Specification is built with an asciidoctor attribute of that name defined.
-Khronos publishes three forms of the Vulkan Specification: the core API
-(e.g. versions 1.x) only; core API with all registered `KHR` extensions; and
-core API with all registered extensions.
-
-
-[[extensions-documenting-extensions]]
-=== Changes for New Extensions
-
-If an new extension, or a related group of them is of sufficient scope to
-require a new chapter of the specification, localize such changes into a
-small number of asciidoctor include files located under a subdirectory with
-the name of the extension.
-An example can be found in `chapters/VK_KHR_surface/wsi.txt`.
-Most extensions are not entirely self-contained, and also require changes in
-existing parts of the specification to document new interactions.
-Such changes should be inline in existing chapters.
-
-Extensions may also require small additions to `vk.xml`, in addition to
-defining the extension interfaces themselves, for purposes such as
-introducing new return codes or extending structures to existing APIs.
-
-[NOTE]
-.Note
-====
-We do not yet fully document an example of including a new version or
-extension.
-New versions are authored only by Khronos and examples will be available at
-such time that we publish a new version.
-Extension authors should refer to the default branch and search for the
-names of existing extensions, such as `VK_KHR_surface`, for markup examples.
-Some aspects of the changes for this example extension are described below.
-====
-
-Changes for extensions include (but may not be limited to) the following:
-
-  * All extensions must add an appendix to the Vulkan specification.
-    The appendix can be modeled after the `VK_KHR_shader_float_controls`
-    extension in `appendices/VK_KHR_shader_float_controls.txt.txt`, which
-    contains metainformation about the extension (as well as code examples,
-    and revision history).
-    Other useful references are the `VK_KHR_shader_draw_parameters`
-    appendix, which includes a variety of external dependencies and
-    interactions, and the `VK_EXT_debug_marker` appendix, which is a
-    simpler, standalone example.
-  ** The extension appendices are also incorporated in separate
-     per-extension reference pages, and must rigidly follow the structure of
-     the model appendices (although individual subsections can be added or
-     removed as required).
-  ** When creating references to the extension appendix from elsewhere in
-     the Specification, use the custom macro `apiext:`, instead of an
-     explicit asciidoctor link.
-     This allows more easily checking for invalid extensions, and changing
-     the link target for generated reference pages and other alternate
-     output forms.
-+
---
-[source,asciidoc]
-.Example Markup
-----
-A link to the apiext:VK_KHR_shader_float_controls extension.
-
-Do not use this (old) form: `<<VK_KHR_shader_float_controls>>`.
-----
-
-[NOTE]
-.Note
-====
-If you are converting an old branch with extension references in it to use
-the `apiext:` macro, you can use this shell script:
-
-[source,sh,subs=attributes+]
-----
-sed -i -E 's/`?<<(VK_[A-Za-z0-9_]*)>>`?/apiext:\1/g' chapters/{*txt,*/*txt} appendices/*txt
-----
-====
---
-  * In the preamble to the appendix, start with an asciidoctor `include` of
-    the automatically generated meta information.
-    This information includes the extension name string, type, number,
-    revision, and contact information from `vk.xml`.
-  * Following the `include`, add an *Other Extension Metadata* subsection
-    containing as many of the following items as are meaningful:
-  ** *Status* - *Complete*, *Draft*, or other.
-     When an extension is published in the default branch, it is normally
-     assumed to be complete; the *Status* field should be removed at this
-     time, unless it contains additional information.
-  ** *Last Modified Date* - if wanted, although git log queries can provide
-     equivalent information.
-  ** *IP Status* - Such as *No known IP claims*, or more specific
-     information if there are known IP claims and the extension has, or has
-     not been ratified by the Khronos Board of Promoters.
-  ** *Interactions and External Dependencies* - may include requirements or
-     interactions with optional Vulkan features, SPIR-V (`SPV`) and OpenGL
-     extensions, and interactions (other than strictly requiring) with other
-     Vulkan extensions.
-  ** *Contributors* - Names and corporate affiliations of people who have
-     made significant direct contributions to this extension.
-  * Following these items, add whitespace followed by a *Description*
-    section.
-    The first paragraph of this section should be a compact, standalone
-    description of the extension's functionality and purpose, suitable for
-    use in summaries of new functionality such as press releases or the
-    Vulkan change log.
-    Additional paragraphs expanding on the description may be added at the
-    author's discretion.
-  * If the extension has been deprecated or promoted, add *Deprecation*
-    and/or *Promotion* sections describing these actions.
-    There is standard boilerplate *Promotion* language used when promoting
-    to a Vulkan core version.
-    For example, see `appendices/VK_EXT_descriptor_indexing.txt` for
-    language used when promoting to Vulkan core, with some features made
-    optional in the promoted version.
-  * Next, add an asciidoctor `include` of the automatically generated
-    interface information.
-    This information includes API entities defined by the extension in
-    `vk.xml`, such as new commands, structures, enumerants, and so on.
-  * Following the `include`, add subsections describing interface
-    information for SPIR-V shading capabilities not captured in `vk.xml`,
-    such as:
-  ** *New SPIR-V Capabilities* (include xrefs to the appropriate new section
-     of the List of SPIR-V Capabilities in `appendices/spirvenv.txt`).
-  ** *New or Modified Built-In Variables* (include xrefs to the appropriate
-     new section of the Interfaces chapter).
-  ** *New Variable Decorations* (include xrefs to the appropriate new
-     section of the Interfaces chapter).
-  * Finally, add subsections describing other information about the
-    extension, such as:
-  ** *Issues* (in itemized list style, describing each significant issue
-     raised during development of the extension, and its resolution).
-  ** *Version History* (in itemized list style, describing significant
-     functional changes to the extension during its development).
-  * Each extension's appendix file is automatically included from
-    `appendices/extensions.txt` via code generated from `vk.xml`.
-    It is not necessary to explicitly include the appendices.
-  * Extensions usually make significant additions and changes to the Vulkan
-    specification.
-    They often add an entirely new chapter, or a new section of an existing
-    chapter, defining the new commands, structures, and enumerants.
-    For example, in the case of `VK_EXT_debug_marker`, it adds a new section
-    of the "`Debugging`" chapter in `chapters/debugging.txt`, by including
-    in that file:
-+
-[source,asciidoc]
-.Example Markup
-----
-\ifdef::VK_EXT_debug_marker[]
-\include::chapters/VK_EXT_debug_marker/wsi.txt[]
-\endif::VK_EXT_debug_marker[]
-----
-  * In every other place where the extension alters the behavior of the core
-    Specification, make such changes and protect the modifications with the
-    same asciidoctor conditionals.
-    For example, `VK_KHR_surface` adds new error codes to Vulkan.
-    These are added to `chapters/fundamentals.txt` in the "`Return Codes`"
-    section as follows:
-+
-[source,asciidoc]
-.Example Markup
-----
-... list of existing error codes
-\ifdef::VK_KHR_surface[]
-\include::VK_KHR_surface/VkResultErrorDescriptions_surface.txt[]
-\endif::VK_KHR_surface[]
-----
-  * If two extensions interact, the asciidoctor conditionals must be
-    carefully structured so as to properly document the interactions if the
-    specification is built with both extensions.
-    Asciidoc conditionals allow
-    link:{docguide}/directives/ifdef-ifndef/#checking-multiple-attributes[AND
-    and OR constructs].
-+
-[source,asciidoc]
-.Example Markup
-----
-\ifdef::VK_KHR_foo[]
-... discussion of VK_KHR_foo ...
-\ifdef::VK_KHR_fum[]
-... discussion of interactions between VK_KHR_foo and VK_KHR_fum ...
-\endif::VK_KHR_fum[]
-\endif::VK_KHR_foo[]
-
-\ifdef::VK_KHR_fum[]
-... discussion of VK_KHR_fum ...
-\endif::VK_KHR_fum[]
-----
-  * In cases where a new extension (A) modifies both core and an existing
-    extension (B), if the new extension (A) becomes part of the core at a
-    future release (i.e. is no longer an extension), the portion of the new
-    extension that modified the existing extension (B) effectively becomes
-    part of that existing extension.
-    Thus, at the new core release, enabling the pre-existing extension (B)
-    also enables the functionality that was previously enabled by enabling
-    the previously-new extension (A).
-  * For vendor extensions, changes made to existing core Specification
-    source files and to `vk.xml` all fall under the Contributor License
-    Agreement.
-    Vendors may use their own copyright on new files they add to the
-    repository, although that copyright must be compatible with the
-    Specification copyright.
-  * In most cases, there will be at most two new files added to the
-    specification: `extensions/*extension_name*.txt`, and
-    `chapters/*extension_name*.txt`.
-    If you need more than one new file in either the `chapters/` or
-    `extensions/` directories, create a subdirectory named with the
-    extension name and place the new files there.
-    For example, instead of `chapters/VK_KHR_android_surface.txt`, there is
-    `chapters/VK_KHR_android_surface/platformCreateSurface_android.txt` and
-    `chapters/VK_KHR_android_surface/platformQuerySupport_android.txt`, both
-    of which are conditionally included elsewhere in the core specification
-    files.
-  * Valid usage statements referring to interactions between structures in a
-    pname:pNext chain must be described in the parent structure's language,
-    as specified <<extensions-interactions-parent, in more detail below>>.
-  * Valid usage statements must: be kept atomic with regards to extension
-    conditionals.
-    Do not surround part of a single statement with conditionals.
-    Valid usage statements are automatically extracted from the
-    specification for use by ecosystem components like the validation
-    layers, and the extraction scripts need to know which valid usage
-    statements apply to which extensions.
-    The loops required to deal with partial statements are simply not worth
-    the trouble.
-    For example, instead of
-+
-[source,asciidoc]
-.Example Markup
-----
-  * If pname:buffer was created with a sharing mode of
-    ename:VK_SHARING_MODE_EXCLUSIVE, pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex must: either both be
-    ename:VK_QUEUE_FAMILY_IGNORED, or both be a valid queue family (see
-    <<devsandqueues-queueprops>>)
-\ifdef::VK_KHR_external_memory[]
-    unless one of them is ename:VK_QUEUE_FAMILY_EXTERNAL_KHR and the other
-    is ename:VK_QUEUE_FAMILY_IGNORED.
-\endif::VK_KHR_external_memory[]
-----
-+
-Use
-+
-[source,asciidoc]
-.Example Markup
-----
-ifndef::VK_KHR_external_memory[]
-  * If pname:buffer was created with a sharing mode of
-    ename:VK_SHARING_MODE_EXCLUSIVE, pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex must: either both be
-    ename:VK_QUEUE_FAMILY_IGNORED, or both be a valid queue family (see
-    <<devsandqueues-queueprops>>)
-endif::VK_KHR_external_memory[]
-ifdef::VK_KHR_external_memory[]
-  * If pname:buffer was created with a sharing mode of
-    ename:VK_SHARING_MODE_EXCLUSIVE, pname:srcQueueFamilyIndex and
-    pname:dstQueueFamilyIndex must: either both be
-    ename:VK_QUEUE_FAMILY_IGNORED, both be a valid queue family (see
-    <<devsandqueues-queueprops>>), or be
-    ename:VK_QUEUE_FAMILY_EXTERNAL_KHR and ename:VK_QUEUE_FAMILY_IGNORED in
-    either order
-endif::VK_KHR_external_memory[]
-----
-
-When writing language dependent on the interaction of multiple extensions,
-asciidoctor conditional syntax is very restricted and only supports a single
-level of logical AND (`+`) or OR (`,`) operators.
-For example, if a section of text only applies when one extensions is
-enabled and another is not, the following markup will not work:
-
-[source,asciidoc]
-.Example Markup (Does Not Work)
-----
-\ifdef::VK_KHR_shader_float16_int8+!VK_KHR_8bit_storage[]
-This should only appear if VK_KHR_shader_float16_int8 is defined and
-VK_KHR_8bit_storage is not defined.
-\endif::VK_KHR_shader_float16_int8+!VK_KHR_8bit_storage[]
-----
-
-Instead, expand the complex conditional into nested simpler ones:
-
-[source,asciidoc]
-.Example Markup (Does Work)
-----
-\ifdef::VK_KHR_shader_float16_int8[]
-\ifndef::VK_KHR_8bit_storage[]
-This should only appear if VK_KHR_shader_float16_int8 is defined and
-VK_KHR_8bit_storage is not defined.
-\endif::VK_KHR_8bit_storage[]
-\endif::VK_KHR_shader_float16_int8
-----
-
-
-[[extensions-documenting-versions]]
-=== Changes for New API Versions
-
-When creating a new version of the core API, such as Vulkan 1.1, changes are
-done similarly to extensions, with the following differences:
-
-[NOTE]
-.Note
-====
-This list is being developed in conjunction with the Vulkan 1.1
-Specification, is probably incomplete, and is subject to change.
-Items marked *TBD* are still being discussed within the Vulkan Working
-Group.
-====
-
-  * New API versions will be more tightly integrated into the specification
-    sources than extensions, although it is still helpful to partition
-    changes into new files when they are sufficiently self-contained.
-  * New API versions must add an appendix to the Vulkan specification.
-    Unlike the extension appendices, this appendix simply summarizes release
-    information (dates of Ratification by the Khronos Board of Promoters,
-    and of public release), the contributor list, and high-level
-    descriptions of new features in this version (including the names of any
-    extensions promoted to core status in this version).
-  ** TBD - we might choose to include a new API summary with links into the
-     specification body for new features, as well.
-  * TBD - how to name and where to include this appendix file.
-  * Changes to the Specification for new versions will range from small
-    changes to existing language, to new commands and structures, to adding
-    entire new chapters.
-    New chapters must be defined in separate files under the `chapters/`
-    directory, and included at an appropriate point in `vkspec.txt` or other
-    specification source files.
-    Other changes and additions are included inline in existing chapters.
-  * All changes that are specific to the new version must be protected by
-    the asciidoctor conditional (e.g. the version name).
-    For example, in the case of Vulkan 1.1:
-+
-[source,asciidoc]
-.Example Markup
-----
-Add a new chapter:
-
-\ifdef::VK_VERSION_1_1[]
-\include::chapters/newchapter11.txt[]
-\endif::VK_VERSION_1_1[]
-
-Add a new feature:
-
-\ifdef::VK_VERSION_1_1[]
-... language describing the new command, structure, or enumeration
-\endif::VK_VERSION_1_1[]
-----
-  * The specification must continue to be a valid document when the new
-    version is *not* defined, so that (for example) the Vulkan 1.1 branch
-    specification can continue to be updated.
-  * TBD - how to deprecate extensions which have been promoted to core
-    status in the new version, while continuing to have those extensions
-    appear then older versions of the specification are being built.
-  * The same constraints <<extensions-documenting-extensions, described
-    above>> for Valid Usage statements modified by extensions apply for new
-    versions.
-
-
-== Assigning Extension Token Values
-
-Extensions can define their own enumeration types and assign any values to
-their enumerants that they like.
-Each enumeration has a private namespace, so collisions are not a problem.
-However, when extending existing enumeration objects with new values, care
-must be taken to preserve global uniqueness of values.
-Enumerations which define new bits in a bitmask are treated specially as
-described in <<extensions-reserving-bitmask-values,Reserving Bitmask
-Values>> below.
-
-Each extension is assigned a range of values that can be used to create
-globally-unique enum values.
-Most values will be negative numbers, but positive numbers are also
-reserved.
-The ability to create both positive and negative extension values is
-necessary to enable extending enumerations such as etext:VkResult that
-assign special meaning to negative and positive values.
-Therefore, 1000 positive and 1000 negative values are reserved for each
-extension.
-Extensions must not define enum values outside their reserved range without
-explicit permission from the owner of those values (e.g. from the author of
-another extension whose range is infringed on, or from the Khronos Registrar
-if the values do not belong to any extension's range).
-
-[NOTE]
-.Note
-====
-Typically, extensions use a unique offset for each enumeration constant they
-add, yielding 1000 distinct token values per extension.
-Since each enumeration object has its own namespace, if an extension needs
-to add many enumeration constant values, it can reuse offsets on a per-type
-basis.
-====
-
-The information needed to add new values to the XML are as follows:
-
-  * The **extension name** (e.g. `VK_KHR_swapchain`) that is adding the new
-    enumeration constant.
-  * The existing enumeration **type** being extended (e.g.
-    stext:VkStructureType).
-  * The name of the new enumeration **token** being added (e.g.
-    etext:VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR).
-  * The **offset**, which is an integer between 0 and 999 relative to the
-    base being used for the extension.
-  * The **direction** may be specified to indicate a negative value
-    (`dir="-"`) when needed for negative etext:VkResult values indicating
-    errors, like etext:VK_ERROR_SURFACE_LOST_KHR.
-    The default direction is positive, if not specified.
-
-Implicit is the registered number of an extension, which is used to create a
-range of unused values offset against a global extension base value.
-Individual enumerant values are calculated as offsets in that range.
-Values are calculated as follows:
-
-  * [eq]#_base_value_ = 1000000000#
-  * [eq]#_range_size_ = 1000#
-  * [eq]#enum_offset(_extension_number_, _offset_) = _base_value_ {plus}
-    (_extension_number_ - 1) {times} _range_size_ + _offset_#
-  * Positive values: [eq]#enum_offset(_extension_number_, _offset_})#
-  * Negative values: [eq]#enum_offset(_extension_number_, _offset_})#
-
-The exact syntax for specifying extension enumerant values is defined in the
-`readme.pdf` specifying the format of `vk.xml`, and extension authors can
-also refer to existing extensions for examples.
-
-If an extension becomes part of core, the enumerant values should remain the
-same as they were in the original extension, in order to maintain binary
-compatibility with existing applications.
-
-
-[[extensions-reserving-bitmask-values]]
-=== Reserving Bitmask Values
-
-Enumerants which define bitmask values are a special case, since there are
-only a small number of unused bits available for extensions.
-For core Vulkan API and KHR extension bitmask types, reservations must be
-approved by a vote of the Vulkan Working Group.
-For EXT and vendor extension bitmask types, reservations must be approved by
-the listed contact of the extension.
-Bits are reserved in the same fashion as extension numbers, by creating a
-placeholder reservation for each bit in the disabled XML `<extension>` block
-for that extension in the default branch.
-Once the extension is ready to be merged into the default branch, the
-`<extension>` block is updated with the actual name.
-An example reservation for a disabled extension is:
-
-[source,xml]
-----
-<extension name="VK_AMD_extension_24" number="24" author="AMD" supported="disabled">
-  <require>
-    <enum bitpos="6" extends="VkQueueFlagBits" name="VK_QUEUE_RESERVED_6_BIT_KHR"/>
-----
-
-[NOTE]
-.Note
-====
-Because of the way in which extension bitmask values are assigned inside the
-XML `<extension>` tag, it is not always obvious what the next free bit in a
-bitmask type is, or when a collision occurs.
-The most straightforward way to determine the next free bit for a given
-bitmask type is to look at the declaration of that type in the generated
-header files.
-When generating the headers, the script will raise warnings about "`Two
-enums found with the same value`" that will help identify this problem.
-====
-
-When a 32-bit flags type is close to running out of bits, a corresponding
-64-bit flag type may be created for use with new interfaces, such as the
-tlink:VkAccessFlags and tlink:VkAccessFlags2KHR types.
-These flag types have corresponding 32- and 64-bit bitmask types
-(elink:VkAccessFlagBits and elink:VkAccessFlagBits2KHR).
-When reserving remaining bits at bit positions 0 through 31, a similarly
-named bit should be reserved in both bitmask types
-(ename:VK_ACCESS_MEMORY_READ_BIT and ename:VK_ACCESS_2_MEMORY_READ_BIT_KHR),
-to avoid having the same bit used for different purposes in two otherwise
-very similar interfaces.
-If that usage is not actually supported by one or the other bitmask type,
-the bit should still be reserved, but commented out in the XML.
-
-[NOTE]
-.Note
-====
-The existing reservation mechanism used for in-development extensions does
-not work well for non-disabled extensions.
-So we currently do not have a good way of semantically indicating that a bit
-is reserved, but should not appear in the header file, for a non-disabled
-extension, and an XML comment reserving the bit is a workaround.
-This case will come up very rarely.
-====
-
-
-[[extensions-new-flags-types]]
-== New Flags and Bitmask Types
-
-When an extension introduces a new flags (etext:*Flags) type, it should also
-introduce a corresponding new bitmask (etext:*FlagBits) type.
-The flags type contains zero more more bits from the bitmask, and is used to
-specify sets of bits for commands or structures.
-
-In some cases, a new flags type will be defined with no individual bits yet
-specified.
-This usage occurs when the flags are intended for future expansion.
-In this case, even though the corresponding bitmask type is not yet useful,
-the (empty) bitmask type should be defined in `vk.xml`.
-The empty bitmask type and corresponding flags type should be given
-boilerplate definitions in the specification.
-
-
-== Required Extension Tokens
-
-In addition to any tokens specific to the functionality of an extension, all
-extensions must define two additional tokens.
-
-  * `VK_EXTNAME_SPEC_VERSION` is an integer constant which is the revision
-    of the extension named `VK_extname` (`EXTNAME` is all upper-case, while
-    extname is the capitalization of the actual extension name).
-    This value begins at 1 when an extension specification is first
-    published (pre-release versions may use an internal numbering scheme
-    that is reset at release time), and is incremented when changes are
-    made.
-    Note that the revision of an extension defined in the Vulkan header
-    files and the revision supported by the Vulkan implementation (the
-    pname:specVersion field of the sname:VkExtensionProperties structure
-    corresponding to the extension and returned by one of the
-    link:html/vkspec.html#extendingvulkan-extensions[extension queries]) may
-    differ.
-    The revision value indicates a patch version of the extension
-    specification, and differences in this version number maintain full
-    compatibility, as defined in the
-    link:html/vkspec.html#_compatibility_guarantees_informative[Compatibility
-    Guarantees] section of the <<vulkan-spec,Vulkan API Specification>>.
-
-[NOTE]
-.Note
-====
-Any changes requiring the addition or removal of a type or command should be
-done by creating a new extension.
-The resulting extension should take care to include the appropriate
-dependency information on the original extension.
-====
-
-[NOTE]
-.Note
-====
-When the Debug Report extension (VK_EXT_debug_report) was recently updated
-to include the enum values of VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT
-and VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT, we violated this
-policy.
-That change was done prior to this revision policy clarification.
-We intend to follow this policy in the future, although in exceptional
-circumstances an exception may be made.
-====
-
-  * `VK_EXTNAME_EXTENSION_NAME` is a string constant which is the name of
-    the extension.
-
-For example, for the WSI extension `VK_KHR_surface`, at the time of writing
-the following definitions were in effect:
-
-[source,c]
-----
-#define VK_KHR_SURFACE_SPEC_VERSION 24
-#define VK_KHR_SURFACE_EXTENSION_NAME "VK_KHR_surface"
-----
-
-
-== Extension Handles, Objects, Enums, and Typedefs
-
-Expanding on previous discussion, extensions can add values to existing
-enums; and can add their own commands, enums, typedefs, etc.
-This is done by adding to <<extensions-api-registry,`vk.xml`>>.
-All such additions will be included in the Vulkan header files supplied by
-Khronos.
-
-If the extension adds a new handle to Vulkan, a corresponding value must be
-added to ename:VkObjectType (as defined in the "`Debugging`" section of the
-<<vulkan-spec,Vulkan API Specification>>) in order to allow components to
-identify and track objects of the new type.
-
-The new enumeration value must conform to the naming defined in the
-<<naming-extension-enumerant-names,Extension Enumerant Names>> section.
-In this case, the type's etext:Vk prefix is replaced with the enum prefix
-etext:VK_OBJECT_TYPE_, and the rest of the handle name is converted as
-described in that section.
-
-.Conversion of Handle to sname:VkObjectType Examples:
-[width="70%",options="header",cols="50%,50%"]
-|====
-| Handle                        | sname:VkObjectType token
-| VkSurfaceKHR                  | VK_OBJECT_TYPE_SURFACE_KHR
-| VkDescriptorUpdateTemplateKHR | VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR
-|====
-
-
-[[extension-function_prototypes]]
-== Extension Function Prototypes
-
-Function pointer declarations and function prototypes for all core Vulkan
-API commands are included in the Vulkan header files.
-These come from the official XML specification of the Vulkan API hosted by
-Khronos.
-
-Function pointer declarations are also included in the Vulkan header for all
-commands defined by registered extensions.
-Function prototypes for extensions may be included in the headers.
-Extension commands that are part of the Vulkan ABI must be flagged in the
-XML.
-Function prototypes will be included in the headers for all extension
-commands that are part of the Vulkan ABI.
-
-An extension can be considered platform specific, in which case its
-interfaces in the header files are protected by #ifdefs.
-This is orthogonal to whether an extension command is considered to be part
-of the Vulkan ABI.
-
-The initial set of WSI extension commands (i.e. for `VK_KHR_surface`,
-`VK_KHR_swapchain`, and `VK_KHR_*_surface`) are considered to be part of the
-Vulkan ABI.
-Function prototypes for these WSI commands are included in platform-specific
-files such as `vulkan_android.h`.
-See the "`Window System-Specific Header Control (Informative)`" section of
-the Vulkan Specification for more details.
-
-[NOTE]
-.Note
-====
-Based on feedback from implementors, Khronos expects the Android, Linux, and
-Windows Vulkan SDKs to include our header files, and export the supported
-WSI functions for those platforms from their loader libraries.
-Other implementations can make different choices for their headers and
-loader libraries, but are encouraged to be consistent with these
-implementations.
-====
-
-
-== Accessing Extension Functions from Programs
-
-fname:vkGetInstanceProcAddr and fname:vkGetDeviceProcAddr can be used in
-order to obtain function pointer addresses for core and extension commands
-(per the description in the "`Command Function Pointers`" section of the
-<<vulkan-spec,Vulkan API Specification>>).
-Different Vulkan API loaders can choose to statically export functions for
-some or all of the core Vulkan API commands, and can statically export
-functions for some or all extension commands.
-If a loader statically exports a function, an application can link against
-that function without needing to call one of the ftext:vkGet*ProcAddr
-commands.
-
-[NOTE]
-.Note
-====
-The Vulkan API loader for Android, Linux, and Windows exports functions for
-all core Vulkan API commands, and for a set of WSI extension commands that
-are applicable to those operating systems (see Vulkan loader documentation
-for the relevant platform/OS for details).
-The WSI functions are considered special, because they are required for many
-applications.
-====
-
-
-[[extensions-interactions]]
-== Extending Structures
-
-Extending structures modify the behavior of existing commands or structures
-by providing additional parameters, using the pname:pNext field of an
-existing structure to point to a chain of additional structures.
-This mechanism is described in more detail in the "`Valid Usage for
-Structure Pointer Chains`" section of the <<vulkan-spec,Vulkan API
-Specification>>.
-
-Multiple extending structures affecting the same structure, defined by
-multiple core versions or extensions, can be chained together in this
-fashion.
-Any structure which can be chained in this fashion must begin with the
-following two members:
-
-["source","c++",title=""]
-----
-VkStructureType        sType;
-const void*            pNext;
-----
-
-It is in principle possible for extensions to provide additional parameters
-through alternate means, such as passing a handle parameter to a structure
-with a pname:sType value defined by the extension.
-This approach is strongly discouraged.
-
-When chaining multiple extending structures together, the implementation
-will process the chain starting with the base structure and proceeding
-through each successive extending structure in turn.
-Extending structures should behave in the same fashion no matter the order
-of chaining, and must define their interactions with other extensions such
-that the results are deterministic.
-
-If an extending structure must be present in a pname:pNext chain in specific
-ordering relative to other structures in the chain in order to provide
-deterministic results, it must define that ordering and expected behavior as
-part of its specification and valid usage statements.
-
-[NOTE]
-.Note
-====
-Specific ordering requirements in a pname:pNext chain are strongly
-discouraged.
-====
-
-Validation of structure types in pname:pNext chains is automatically
-generated from the registry, based on the description of attr:structextends
-in link:registry.html[the registry document].
-
-
-[[extensions-interactions-parent]]
-== Valid Usage and pname:pNext Chains
-
-When there is a Valid Usage interaction between a parent structure and an
-extending structure appearing in the pname:pNext chain of the parent, that
-interaction must: be described in the explicit Valid Usage section of the
-parent structure, rather than the extending structure, and must: be
-protected by appropriate extension-specific `ifdef` constructs.
-
-For example, a constraint added to the sname:VkImageCreateInfo structure by
-the presence of structures defined by two extensions which cannot interact
-is described as:
-
-[source,asciidoc]
-.Example Markup
-----
-// CORRECT: define interaction with children in parent VkImageCreateInfo
-// structure
-\ifdef::VK_NV_external_memory+VK_KHR_external_memory[]
-  * If the pname:pNext chain includes a
-    slink:VkExternalMemoryImageCreateInfoNV structure, it must: not include
-    a slink:VkExternalMemoryImageCreateInfoKHR structure.
-\endif::VK_NV_external_memory+VK_KHR_external_memory[]
-----
-
-However, a constraint added to sname:VkBufferCreateInfo by an extending
-structure in the `VK_NV_dedicated_allocation` extension must not be
-described as part of the extending structure's valid usage:
-
-[source,asciidoc]
-.Example Markup
-----
-// WRONG! Do not define interaction with parent in child
-// VkDedicatedAllocationBufferCreateInfoNV structure
-  * If pname:dedicatedAllocation is ename:VK_TRUE,
-    sname:VkBufferCreateInfo::pname:flags must: not include
-    ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT,
-    ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT, or
-    ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT
-----
-
-Instead, define the constraint as part of the parent
-sname:VkBufferCreateInfo structure's valid usage:
-
-[source,asciidoc]
-.Example Markup
-----
-// REWRITTEN CORRECTLY: Define interaction with child in
-// parent VkBufferCreateInfo structure
-\ifdef::VK_NV_dedicated_allocation[]
-  * If the pname:pNext chain includes a
-    slink:VkDedicatedAllocationBufferCreateInfoNV structure, and the
-    pname:dedicatedAllocation member of the chained structure is
-    ename:VK_TRUE, then pname:flags must: not include
-    ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT,
-    ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT, or
-    ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT
-\endif::VK_NV_dedicated_allocation[]
-----
-
-[[extensions-feature-structures]]
-== Feature Structures
-
-A feature structure is a structure that extends
-sname:VkPhysicalDeviceFeatures2 and sname:VkDeviceCreateInfo, and which
-provides basetype:VkBool32 members to indicate implementation support for
-individual features.
-
-["source","c++",title=""]
-----
-typedef struct VkPhysicalDeviceImageRobustnessFeaturesEXT {
-    VkStructureType    sType;
-    void*              pNext;
-    VkBool32           robustImageAccess;
-} VkPhysicalDeviceImageRobustnessFeaturesEXT;
-----
-
-Every device or physical-device extension that adds or modifies device-level
-commands, or adds new structures or enum values used in device-level
-commands, must define a feature structure.
-
-If an extension requires a feature structure, then any mandatory features
-must be described in the Feature Requirements section.
-New extensions must mandate that implementions support at least one feature
-of an extension.
-
-[source,asciidoc]
-.Example Markup
-----
-ifdef::VK_EXT_image_robustness[]
-  * <<features-robustImageAccess, pname:robustImageAccess>>, if the
-    apiext:VK_EXT_image_robustness extension is supported.
-endif::VK_EXT_image_robustness[]
-----
diff --git a/registry/vulkan/style/markup.txt b/registry/vulkan/style/markup.txt
deleted file mode 100644
index 741537c..0000000
--- a/registry/vulkan/style/markup.txt
+++ /dev/null
@@ -1,1163 +0,0 @@
-// Copyright 2015-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[markup]]
-= Markup Style
-
-This chapter demonstrates Asciidoc and Specification structure, including
-text layout and markup style.
-
-
-[[markup-copyrights]]
-== Copyrights and Licenses
-
-The asciidoctor source for the Vulkan Specification and related documents is
-under an open source license.
-
-When creating a *new* file, add the following copyright and license
-statement at the top:
-
-[source,asciidoc]
-.Example Markup
-----
-// Copyright YEAR AUTHOR
-// SPDX-License-Identifier: CC-BY-4.0
-
-----
-
-`YEAR` should be replaced by the year in which the file was created.
-
-`AUTHOR` is normally "`The Khronos Group Inc.`".
-If a new file is created by a member company or outside contributor, use
-that entity's legal name as the author.
-
-`SPDX-License-Identifier` gives the license used for the file, following the
-https://spdx.github.io/spdx-spec/appendix-V-using-SPDX-short-identifiers-in-source-files/[SPDX]
-standard for short identifiers in source files.
-`CC-BY-4.0` is the short identifier for the
-https://spdx.org/licenses/CC-BY-4.0.html[Creative Commons Attribution 4.0
-International] license.
-
-No matter who holds the *copyright* on a source file for the Specification,
-it must be placed under the `CC-BY-4.0` *license*.
-When contributing to the Specification, contributors are required to execute
-a Contributor License Agreement to this effect.
-
-When updating an *existing* file, modify the following copyright and license
-statement to include the year(s) of modification.
-For example:
-
-[source,asciidoc]
-.Example Markup
-----
-// Copyright 2018-2021 The Khronos Group Inc.
-// SPDX-License-Identifier: CC-BY-4.0
-
-----
-
-indicates a file which has been been modified in 2018, 2019, and 2020
-inclusive.
-
-
-[[markup-structure]]
-== Document Structure
-
-Chapters and sections follow a rigid template consisting of an optional
-anchor (if other parts of the document cross-reference the section) followed
-by a link:{docguide}/sections/titles-and-levels/[one line title] and a blank
-line.
-The anchor is typically the base name of the file containing the chapter,
-with a lowercased version of the section name following, with spaces
-replaced by dashes.
-
-Always use the one-line title form, with one to four `=` signs preceding the
-chapter/section title.
-The two-line title form cannot be easily searched for, and often looks like
-other types of asciidoctor delimiters.
-Using a mix of one-line and two-line titles causes compatibility issues, and
-using the two-line title form may implicitly set a backwards-compatibility
-syntax mode we do not want.
-
-Always precede the anchor by two blank lines (except at the beginning of a
-file), and follow the title by a blank line, to set off sections visibly.
-
-[source,asciidoc]
-.Example Markup
-----
-[[markup]]
-= Markup Style
-
-
-[[markup-sample-section]]
-== Sample Section
-----
-
-
-[[markup-sample-section]]
-== Sample Section
-
-This is a sample section structurally similar to the <<vulkan-spec,Vulkan
-API Specification>>, nested one level inside a chapter.
-Sections can be nested up to level 5, although not all levels are included
-in the Table of Contents.
-
-
-[[markup-layout]]
-== Asciidoc Markup And Text Layout
-
-Asciidoc source should be text filled to 76 columns with hard line breaks.
-Each sentence in a paragraph ends with a newline to minimize git diff
-conflicts.
-Except when necessary for lists or other markup, text should begin at the
-first column of each line (leading spaces are often semantically meaningful
-in asciidoctor markup).
-
-UTF-8 characters outside the ASCII subset should be used sparingly, only
-when needed for non-English names.
-Instead use asciidoctor markup for special characters, if required.
-For example, two hyphens produces an em-dash:
-
-[NOTE]
-.Example Markup
-====
-
-`+An -- em-dash+` -> An -- em-dash
-====
-
-As an exception, multiplication should be marked with the unicode
-multiplication symbol "`×`" (and *not* an asterisk) when used in plain text.
-You may also use the `\{times}` asciidoctor attribute for this symbol.
-In math sections, the same symbol should be referred to as `\times`.
-In code sections, a conventional asterisk (`*`) should be used instead.
-
-The trailing `+` character causes a hard break in asciidoctor markup, and
-should not be used except for this purpose.
-Markup addition with the \{plus} asciidoctor attribute, except in
-<<writing-math-latexmath, LaTeX math>> and <<markup-blocks, source blocks>>.
-
-See the Asciidoctor docs for
-link:{docguide}/subs/special-characters[supported special characters], as
-well as use of entity references.
-
-Quotation marks should use the 66/99 convention.
-That is, double asymmetric quotation marks, indicated by a quotation mark
-then a backtick as opening marks, and a backtick then quotation mark as
-closing marks (pass:["`like this`"]), which renders "`like this`".
-
-_Never_ use hard tabs or trailing blanks.
-
-* In some cases, limitations of asciidoctor markup may result in lines that
-  are longer than 76 characters and cannot easily be shortened without
-  compromising the output documents.
-
-
-[[markup-minimize-indentation]]
-=== Minimize Indentation
-
-Indentation (leading whitespace) for markup should not be used, except for
-<<markup-sample-section-bullet-lists, bullet lists>> as described below.
-Leading whitespace can affect asciidoctor processing.
-
-When presenting unformatted text, use asciidoctor source blocks as described
-in the next section.
-Source blocks do allow leading whitespace, for example when including sample
-code in C.
-
-
-[[markup-blocks]]
-=== Blocks
-
-There are a variety of asciidoctor _block_ constructs.
-With the exception of <<markup-sample-section-tables,tables>> and of _open
-blocks_ used to group markup together, blocks should be delimited by exactly
-four repeated characters indicating the block type, for consistency.
-The block types and delimiters are shown in the following table.
-
-.Asciidoc Block Delimiters
-[width="70%",options="header",cols="25%,10%,65%"]
-|====
-| Table Type    | Delimiter     | Comments
-| Open          | `--`          | For <<markup-sample-section-bullet-lists,continuation blocks>>
-| Example       | `====`        | For <<markup-informative-notes,Notes>>
-| Passthrough   | `pass:[++++]` | For some kinds of <<writing-math,math markup>>
-| Comment       | `////`        |
-| Listing       | `----`        | For source code listings
-| Listing (alt.)| `pass:[~~~~]` | For source code listings <<markup-blocks-source, imbedded in Open blocks>>
-| Sidebar       | `pass:[****]` | For <<markup-implementors-notes,implementor's notes>>
-| Table         | `\|====`      | For <<markup-sample-section-tables,tables>>
-| Quote         | `pass:[____]` |
-| Literal       | `pass:[....]` |
-|====
-
-
-[[markup-blocks-source]]
-==== Listing Blocks Imbedded in Open Blocks
-
-If you need to include a `source` block that would normally use `----`
-delimiters inside an open block delimiting a reference page, use
-`pass:[~~~~]` delimiters around the inner source block instead.
-This avoids confusing some of the toolchain which makes assumptions about
-block delimiters not being nested, such as the VUID assignment script.
-Tildes are not standard asciidoctor markup, but are supported by a custom
-Ruby extension.
-
-
-[[markup-footnotes]]
-=== Footnotes
-
-Use manually marked-up footnotes (the asciidoctor footnote construct is OK
-for PDF outputs, but does not work well with long HTML documents since it
-places all footnotes at the end of the document).
-
-Refer to footnotes with asciidoctor superscript notation^1^, and mark up the
-footnotes below, but near the references as labelled lists.
-Manually assigned footnote numbers will inevitably be reused, which is OK as
-long as the colliding numbers are not in the same section.
-
-1::
-    Like this example footnote.
-
-[NOTE]
-====
-.Example Markup
-[source,asciidoc]
-----
-See reference^2^
-
-2::
-    Reference 2.
-----
-
-->
-
-See reference^2^
-
-2::
-    Reference 2.
-====
-
-
-[[markup-sample-section-lists]]
-=== Lists
-
-
-[[markup-sample-section-bullet-lists]]
-==== Bullet Lists and Continuation Blocks
-
-  * Bullet lists are the preferred form of list, aside from glossary
-    definitions.
-  * Lists should have text indented by 4 spaces and the list item delimiter
-    (e.g. one or more asterisks, for bullet lists) indented by two spaces.
-+
-Note that continuation blocks for list items longer than one paragraph
-cannot be indented, only the first paragraph.
-+
-In general, successive list items should not be separated by white space.
-However, list continuation blocks should be followed by a `+` on a line by
-itself, or by a blank line, due to limitations of the asciidoctor parser.
-+
-  * Indent bullet lists two spaces (to the bullet), 4 spaces (to the text,
-    if it extends over multiple lines).
-    This lets us visually distinguish lists from other kinds of markup.
-  ** Nested lists should align the leftmost list item delimiter (bullet,
-     etc.) with the parent delimiter.
-
-[source,asciidoc]
-.Example Markup
-----
-  * This is the first item in a bullet list.
-  * The second item is described with two paragraphs.
-    The second paragraph is in a continuation block:
-+
-This is a continuation block containing the second paragraph,
-+
-  ** This is a nested list item for the second item.
-     Since it follows a continuation block, it must be separated by a blank
-     line or `+` from that block.
-----
-
-[example]
-====
-  * This is the first item in a bullet list.
-  * The second item is described with two paragraphs.
-    The second paragraph is in a continuation block:
-+
-This is a continuation block containing the second paragraph,
-+
-  ** This is a nested list item for the second item.
-     Since it follows a continuation block, it must be separated by a blank
-     line or `+` from that block.
-====
-
-  * It is possible to continue a paragraph of the first bullet after a list
-    of sub-bullets if so desired by using continuations in a similar
-    fashion:
-
-[source,asciidoc]
-.Example Markup
-----
-  * This an item in a bullet list.
-+
-  ** This is a nested list item for the second item.
-     Since it follows a continuation block, it must be separated by a blank
-     line or `+` from that block.
-+
-This is a continuation of the first bullet
-----
-
-[example]
-====
-  * This an item in a bullet list.
-+
-  ** This is a nested list item for the second item.
-     Since it follows a continuation block, it must be separated by a blank
-     line or `+` from that block.
-+
-This is a continuation of the first bullet
-====
-
-[[markup-labelled-lists]]
-==== Labelled Lists
-
-Labelled lists may be used in some cases such as
-<<markup-footnotes,footnotes>>; glossary entries; and long lists of
-information about similar names, such as the "`Features, Limits, and
-Formats`" chapter of the Vulkan Specification.
-Whenever labelled lists are used the label and its terminating double colon
-must be alone on a line, followed by the contents of that list entry.
-
-For consistency do not use labels ending in three or four colons, or two
-semicolons, even though these forms are allowed in asciidoctor markup.
-
-[source,asciidoc]
-.Example Markup
-----
-Glossary Entry::
-    This is a glossary entry.
-
-Last Modified Date::
-    2016-02-16
-----
-
-
-[[markup-numbered-lists]]
-==== Numbered Lists
-
-Numbered lists may be used if strictly necessary to place an ordering on
-list items.
-Always use _implicit numbering_, with the bullet point being a single
-period.
-
-  . Explicit numbering with a number preceding the period is prone to
-    accumulating errors as edits are made.
-  . In addition, the markup is harder to recognize for scripts and tools
-    (other than asciidoctor itself) operating on the document source.
-
-[source,asciidoc]
-.Example Markup
-----
-. First list item.
-. Second list item.
-. Etc.
-----
-
-
-[[markup-sample-section-anchors]]
-=== Anchors and Cross-references
-
-In general, chapters and sections should always have anchors, following the
-naming convention <<markup,discussed above>>.
-Anchors to other sections of the document may be inserted as needed.
-In addition, the autogenerated include files defining commands, structures,
-enumerations and flags all define anchors whose name is the name of the
-command or type being defined, so it is easy to link to a (for example) a
-command name such as <<vkCreateCommandPool,vkCreateCommandPool>>.
-However, using the <<markup-macros,markup macros>> described below is
-preferred when linking to anchors corresponding to API names, such as
-flink:vkCreateCommandPool.
-
-If you want a cross-reference to an anchor to appear as something other than
-the raw anchor name, always make sure to include that text as part of the
-cross-reference.
-There are several different toolchains followed for various forms of
-asciidoctor output, and not all of them treat anchors without alt-text the
-same way.
-
-[source,asciidoc]
-.Example Markup
-----
-In general, chapters and sections should always have anchors, following the
-naming convention <<markup,discussed above>>.
-...
-so it is easy to link to a (for example) a command name such as
-<<vkCreateCommandPool,vkCreateCommandPool>>. However, using the
-<<markup-macros,markup macros>> described below is preferred when linking to
-anchors corresponding to API names, such as flink:vkCreateCommandPool.
-----
-
-
-[[markup-sample-section-tables]]
-=== Tables
-
-Asciidoc tables should use the block prefix `|====`.
-Where feasible, align the `|` separating cells across rows.
-This will sometimes result in very wide tables in the source document, but
-makes it easier to see which cells belong to which column.
-Alternatively, long cells can be broken onto a separate line with the `|`
-separator appearing first, except for the first row of the table, which must
-all appear on a single line.
-
-Tables should usually be preceded with a short title.
-
-[source,asciidoc]
-.Example Markup
-----
-.Normative Terminology Macros
-[width="100%",options="header"]
-|====
-| Macro Name     | Output
-| can{cl}        | can:
-| cannot{cl}     | cannot:
-|====
-----
-
-
-[[markup-sample-section-images]]
-=== Figures
-
-All figures (images) must be marked up as follows, to ensure there is an
-anchor and that the figure is given a caption which shows the figure number
-and is added to the list of figures.
-
-[source,asciidoc]
-.Example Markup
-----
-[[fig-anchorname]]
-image::{images}/imagename.svg[align="center",title="Figure caption",opts="{imageopts}"]
-----
-
-There must be SVG versions of each figure checked into the `images/`
-directory, to support generating both HTML and PDF outputs.
-This directory is referred to as `\{images}` so that there's a consistent
-path no matter what directory the file including the images is in.
-The PDF generation pipeline is now able to use SVG images, so PDF versions
-of each image are no longer required.
-The `opts=` attribute defaults to `inline`, which decreases output image
-size in the generated HTML.
-However, the `inline` option interferes with generating HTML diffs between
-two specifications with the script we currently use.
-By using an asciidoctor attribute, this behavior can be controlled.
-
-Asciidoctor restricts captions in figures to be a single line in the source
-document.
-If a longer caption is required, follow the figure directive with a sidebar
-block including the full caption preceded by a link to the figure:
-
-[source,asciidoc]
-.Example Markup
-----
-.Caption
-****
-In the <<fig-anchorname,Figure caption>> diagram, the diagram represents
-... long caption text here.
-****
-----
-
-
-[[markup-indentation-equations]]
-=== Indentation of Equations
-
-Asciidoctor separates structural markup in asciidoctor source from
-formatting, in HTML CSS stylesheets and invoked via asciidoctor "`role`"
-attributes on blocks.
-However, the flexibility of CSS stylesheets is not available in PDF layout
-using the existing PDF toolchain and YML stylesheets.
-
-Explicit indentation should be used sparingly in the specification, but one
-place it is useful is with equations.
-Using <<writing-math, asciidoctor math markup>>, the easiest way to produce
-indentation is with a list where the leading bullet or descriptive text is
-suppressed
-
-[source,asciidoc]
-.Example Markup
-----
-[none]
-  * A {plus} B
-
-or
-
-  {empty}:: A {plus} B
-----
-
-->
-
-[example]
-====
-[none]
-  * A {plus} B
-
-or
-
-  {empty}:: A {plus} B
-====
-
-
-[[markup-italicized-enumerant-names]]
-=== Italicized Enumerant Names
-
-When writing a "`wildcard`" enumerant name containing an italicized term
-within it, it's difficult to directly combine constrained formatting markup
-(double underscores) and the single underscores that separate words in the
-enumerant.
-Instead, use attribute substitution as suggested in the "`Escape
-unconstrained formatting marks`" section of the AsciiDoc Language
-Documentation.
-To help when this is required, an attribute `\{ibit}` expanding to
-`pass:[_i_]` is defined in `config/attribs.txt`, and the same technique can
-be used for similar markup in other cases if `_i_` is not the desired
-italicized term:
-
-[source,asciidoc]
-.Example Markup
-----
-`VK_IMAGE_ASPECT_PLANE__{ibit}__BIT`
-----
-
-->
-
-[example]
-====
-`VK_IMAGE_ASPECT_PLANE__{ibit}__BIT`
-====
-
-[NOTE]
-.Note
-====
-This technique cannot be used with the <<markup-macros, markup macros>> that
-are normally used to semantically tag API names.
-Because there are so few places it's needed, conventional backquote
-formatting markup is used instead.
-====
-
-
-[[markup-macros]]
-== Markup Macros and Normative Terminology
-
-This section discusses Asciidoc macros used in the document.
-In addition to the macros defined by asciidoctor itself, additional macros
-are defined by the <<vulkan-spec,Vulkan API Specification>> and Reference
-Page configuration files.
-
-
-[[markup-macros-api]]
-=== API Markup Macros
-
-These macros must be used to tag command, structure, enumeration, enumerant,
-and other Vulkan-specific names so they can be rendered in a distinctive
-fashion, link to definitions of those names, and be easily searched for in
-the source documents.
-The validation scripts (`make allchecks` output) also rely on these macros
-being used consistently and correctly.
-The API markup macros, with examples of their use, are in the following
-table (note that these examples will not actually successfully link into
-corresponding specification or reference pages, since they are in an
-unrelated document).
-
-.API Markup Macros
-[width="100%",options="header",cols="20%,80%"]
-|====
-| Macro Name    | Usage and Meaning
-| reflink{cl}   | Generates a cross-reference or link to an unknown type of
-                  API entity. This is only used in generated content in the
-                  reference pages which refers to other reference pages
-                  which are not actually part of the API. Example:
-                  reflink{cl}WSIheaders -> reflink:WSIheaders.
-| pass:c[`apiext:`] | Generates a cross-reference or link to the description
-                  of an extension. Example: pass:c[`apiext:VK_KHR_ray_tracing_pipeline`]
-                  -> `apiext:VK_KHR_ray_tracing_pipeline`.
-| flink{cl}     | Generates a cross-reference or link to the definition of
-                  the command name in the macro argument. Example:
-                  flink{cl}vkCreateCommandPool -> flink:vkCreateCommandPool.
-| fname{cl}     | Formats the macro argument like flink{cl}. Does not
-                  generate a cross-reference. Example:
-                  fname{cl}vkCreateCommandPool -> fname:vkCreateCommandPool.
-
-                  Only use this macro <<markup-macros-api-name, when
-                  necessary>>.
-| ftext{cl}     | Formats the macro argument like fname{cl}. May contain
-                  asterisks for wildcards. Not validated. Example:
-                  ftext{cl}vkCmd* -> ftext:vkCmd*.
-
-                  Only use this macro <<markup-macros-api-text, when
-                  necessary>>.
-| slink{cl}     | Generates a cross-reference or link to the definition
-                  of the structure or handle in the macro argument. Example:
-                  slink{cl}VkMemoryHeap -> slink:VkMemoryHeap.
-| sname{cl}     | Formats the macro argument like slink{cl}. Does not
-                  generate a cross-reference. May also be an abstract
-                  structure or handle name. Example:
-                  sname{cl}VkCommandPoolCreateInfo ->
-                  sname:VkCommandPoolCreateInfo.
-
-                  Only use this macro <<markup-macros-api-name, when
-                  necessary>>.
-| stext{cl}     | Formats the macro argument like sname{cl}. May contain
-                  asterisks for wildcards. Not validated. Example:
-                  stext{cl}Vk*CreateInfo -> stext:Vk*CreateInfo.
-
-                  Only use this macro <<markup-macros-api-text, when
-                  necessary>>.
-| elink{cl}     | Formats the macro argument as a Vulkan enumerated
-                  type name and links to the definition of that enumeration
-                  type. Example: elink{cl}VkResult -> elink:VkResult.
-| ename{cl}     | Formats the macro argument as a Vulkan enumerant name.
-                  Example: ename{cl}VK_EVENT_SET -> ename:VK_EVENT_SET.
-                  Note that this is not related to elink{cl}, unlike the
-                  other macro link{cl}/text{cl} pairings.
-| etext{cl}     | Formats the macro argument like ename{cl}. Not validated.
-                  Examples: etext{cl}_RANGE_SIZE -> etext:_RANGE_SIZE,
-                  etext{cl}VK_IMAGE_CREATE_SPARSE_* ->
-                  etext:VK_IMAGE_CREATE_SPARSE_*
-
-                  Only use this macro <<markup-macros-api-text, when
-                  necessary>>.
-| pname{cl}     | Formats the macro argument as a Vulkan parameter or
-                  structure member name. Example: pname{cl}device ->
-                  pname:device.
-| ptext{cl}     | Formats the macro argument like pname{cl}. May contain
-                  asterisks for wildcards. Not validated. Example:
-                  ptext{cl}sparseResidency* -> ptext:sparseResidency*.
-
-                  Only use this macro <<markup-macros-api-text, when
-                  necessary>>.
-| tlink{cl}     | Generates a cross-reference or link to the definition
-                  of the Vulkan type in the macro argument.
-                  Example: tlink{cl}PFN_vkAllocationFunction ->
-                  tlink:PFN_vkAllocationFunction.
-                  This is only used for function pointer and `Vk*Flags`
-                  types at present, although it is a potentially a catch-all
-                  for other types not covered by a more specific macro.
-| tname{cl}     | Formats the macro argument like tlink{cl}. Does not
-                  generate a cross-reference. Example:
-                  tname{cl}PFN_vkAllocationFunction ->
-                  tname:PFN_vkAllocationFunction.
-
-                  Only use this macro <<markup-macros-api-name, when
-                  necessary>>.
-| dlink{cl}     | Generates a cross-reference or link to the definition of
-                  the Vulkan C macro in the macro argument. Example:
-                  dlink{cl}VK_NULL_HANDLE -> dlink:VK_NULL_HANDLE. There are
-                  only a few macros in the Vulkan API, described in the
-                  "`API Boilerplate`" appendix of the <<vulkan-spec,Vulkan
-                  API Specification>>
-| dname{cl}     | Formats the macro argument like dlink{cl}. Does not
-                  generate a cross-reference.
-
-                  Only use this macro <<markup-macros-api-name, when
-                  necessary>>.
-| basetype{cl}  | Formats the macro argument like a basic scalar type,
-                  handle name, of type defined by an external API. Not
-                  validated.
-                  Examples: basetype{cl}VkBool32 -> basetype:VkBool32,
-                  basetype{cl}AHardwareBuffer -> basetype:AHardwareBuffer,
-                  basetype{cl}VkDeviceSize -> basetype:VkDeviceSize.
-| code{cl}      | Formats the macro argument as a code sample.
-                  Used for SPIR-V keywords, builtin C types, and names
-                  belonging to other APIs such as Linux or Windows system
-                  calls.
-                  Examples: code{cl}uint32_t -> code:uint32_t,
-                  code{cl}ClipDistance -> code:ClipDistance.
-                  code{cl}OpImage*Gather -> code:OpImage*Gather.
-
-                  This macro allows imbedded field member (`.`) and wildcard
-                  (`*`) text separating words, ending with an optional
-                  wildcard.
-|====
-
-When referring to a compound name (function-parameter, or structure-member),
-combine the macros separated by two colons, resulting in
-flink:vkCmdBindIndexBuffer::pname:indexType and
-slink:VkMemoryHeap::pname:flags.
-This is often done when referring to a particular parameter or member in a
-part of the document other than the description of the corresponding
-function or structure.
-When a nested member within the compound name is referred to, use normal C
-markup:
-
-[source,asciidoc]
-.Example Markup
-----
-flink:vkCmdBindIndexBuffer::pname:indexType
-sname:VkExternalImageFormatProperties::pname:externalMemoryProperties.externalMemoryFeatures
-pname:pAllocateInfo->memoryTypeIndex
-----
-
-[NOTE]
-.Note
-====
-In the macros, "```\->```" is correct markup for the C arrow operator.
-But in any other context (including a "```````" delimited inline literal) it
-would be subject to link:{docguide}/subs/replacements/[Asciidoctor character
-replacement substitutions], resulting in a unicode arrow: ->.
-====
-
-
-[[markup-macros-api-name]]
-==== When To Use *name: Macros
-
-Only use the fname{cl}, sname{cl}, tname{cl}, and dname{cl} macros if no
-definition of the target type with a corresponding anchor exists in the
-document.
-Anchors are automatically defined when including the generated API interface
-definitions under `\{generated}/api/*/*txt`.
-If an anchor does exist, use the corresponding *link{cl} macro.
-
-[NOTE]
-.Note
-====
-There are many legacy uses of the *name{cl} macros that will be replaced
-over time.
-These uses date from before anchors were added to the generated API
-definitions.
-====
-
-
-[[markup-macros-api-text]]
-==== When To Use *text: Macros
-
-Only use the ftext{cl}, stext{cl}, etext{cl}, and ptext{cl} macros when
-describing something that should be rendered like a command, structure,
-enumerant, or parameter name, respectively, but is not actually one.
-Typically these macros are used for wildcards describing multiple API names
-with common prefixes or suffixes, or common subsets of API names.
-
-
-[[markup-macros-prime-symbols]]
-==== Prime Symbols
-
-Occasionally we want to use mathematical prime symbols as markup in regular
-text, outside of <<latexmath, LaTeX math markup>>.
-While it is easy to write the single quote character for this, since that's
-what LaTeX uses, asciidoctor will turn this into a curved quote character
-whenever it is followed by an alphabetic character.
-For example, when writing the {YCbCr} term widely used to describe a color
-encoding, the obvious markup does not look quite right:
-
-.Prime Attributes (incorrect, with curved prime symbol)
-[width="30%",options="header"]
-|====
-| Markup              | Output
-| `pass:[Y'C~b~C~r~]` | Y'C~b~C~r~
-|====
-
-Using a backslash to escape the apostrophe works in body text, but not
-places such as section titles, captions, and link text.
-When prime symbols are needed, use the Unicode ``prime'' symbol.
-Several predefined asciidoctor variables are available to help with this,
-including symbols for {YCbCr} and {RGBprime} because they are frequently
-used in the specification.
-
-.Prime Attributes (correct)
-[width="30%",options="header"]
-|====
-| Markup              | Output
-| `pass:[{prime}]`    | {prime}
-| `pass:[{YCbCr}]`    | {YCbCr}
-| `pass:[{RGBprime}]` | {RGBprime}
-|====
-
-
-==== Other Markup
-
-Uses of standard Asciidoc markup are less common.
-Occasional asterisk markup is used for *emphasis*.
-Underscores are used for _glossary terms_.
-Backtick markup is used for the C `NULL` macro.
-
-[source,asciidoc]
-.Example Markup
-----
-*emphasis*
-`NULL`
-----
-
-
-==== Glossary Terms
-
-Glossary terms are currently marked up using underscore markup where they
-are defined in the documents, as well as being added to the formal Glossary
-appendix in the <<vulkan-spec,Vulkan API Specification>>.
-However, we will probably change to using custom macros soon, to enable
-linkage between the glossary and definitions in the specification body.
-
-[source,asciidoc]
-.Example Markup
-----
-_Glossary terms_
-----
-
-
-=== Normative Terminology
-
-Normative terminology is precisely defined in section 1.3 of the
-<<vulkan-spec,Vulkan API Specification>>, and is used to visually tag terms
-which express mandatory and optional behavior of Vulkan implementations, and
-of applications using Vulkan.
-
-Whenever one of these terms appears in the <<vulkan-spec,Vulkan API
-Specification>> outside of an <<markup-informative,informative section>>, it
-must be tagged using the macros, to indicate that its use has been carefully
-considered and is consistent with the definitions in section 1.3.
-This is extremely important for determining IP that is in and out of Scope
-during Ratification reviews.
-The normative terminology macros are defined in the following table:
-
-.Normative Terminology Macros
-[width="30%",options="header"]
-|====
-| Macro Name     | Output
-| can{cl}        | can:
-| cannot{cl}     | cannot:
-| may{cl}        | may:
-| may{cl} not    | may: not
-| must{cl}       | must:
-| must{cl} not   | must: not
-| optional{cl}   | optional:
-| optionally{cl} | optionally:
-| required{cl}   | required:
-| should{cl}     | should:
-| should{cl} not | should: not
-|====
-
-Note that the macros are lower-case only, so language should be written such
-that these terms do not appear at the beginning of a sentence (if really
-necessary, additional capitalized macros could be added).
-
-
-==== Optional Behavior
-
-If a described behavior of the implementation is not necessary for
-conformance, use the terms _may{cl}_, _optional{cl}_, or _optionally{cl}_ to
-describe it.
-
-If a described usage pattern by the application is allowed but not
-necessary, use the term _can{cl}_ to describe it.
-
-If language flows more logically using the term "`may not`", use the term
-_may{cl} not_ to describe it.
-
-
-==== Optional Functionality
-
-If functionality (rather than behavior) is optional, it should be described
-as
-
-[source,asciidoc]
-.Example Markup
-----
-not required:
-----
-
-Implementations are not mandated to support functionality which is not
-required, but if they do, they must behave as described by the
-<<vulkan-spec,Vulkan API Specification>>.
-The term _functionality_ includes API features, extensions, and layers.
-
-
-[[markup-informative]]
-== Informative, Editing and Implementor's Notes
-
-There are several possible types of notes.
-Depending on the type of output, they are rendered in different styles, but
-always include a note title, and are usually set off in a box or with an
-icon.
-While asciidoctor supports a wide set of _admonition paragraphs_ such as
-TIP, IMPORTANT, WARNING, and CAUTION, we always use the NOTE form, augmented
-by a note title.
-Each type of note is discussed below.
-
-
-[[markup-informative-notes]]
-=== Informative Sections and Notes
-
-If an entire chapter or section is considered informative, its title should
-be suffixed with "`(Informative)`".
-Additionally, the chapter or section text may begin with the sentence:
-
-[source,asciidoc]
-.Example Markup
-----
-== Explanatory Section (Informative)
-
-This chapter/section is Informative.
-----
-
-Informative notes always appear as part of the document, but are considered
-non-normative.
-They usually describe usage advice for applications, and are always given
-the title _Note_, as in the following example:
-
-[NOTE]
-.Note
-====
-This is an informative note.
-====
-
-[source,asciidoc]
-.Example Markup
-----
-[NOTE]
-.Note
-====
-This is an informative note.
-====
-----
-
-It is not necessary to include the text "`Informative`" in the body of the
-note.
-
-
-[[markup-editing-notes]]
-=== Editing Notes
-
-Editing notes usually only appear in internal (non-published) versions of
-documents, via asciidoctor conditionals.
-If they are not resolved, or are internal issues that should not be visible
-in public, they should be removed from the source before pushing content to
-the canonical GitHub repository.
-They usually tag places where an outstanding Gitlab/GitHub issue is being
-worked, and are always given the title _editing-note_, as in the following
-example:
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-This is an editing note, marked up as follows:
-====
-endif::editing-notes[]
-
-[source,asciidoc]
-.Example Markup
-----
-\ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-Contents of an editing note go here.
-It is good practice to include a Gitlab/GitHub issue number, or link to the
-issue, in the editing note.
-====
-\endif::editing-notes[]
-----
-
-
-[[markup-implementors-notes]]
-=== Implementor's Notes
-
-Implementor's notes may or may not appear in published versions of
-documents, via asciidoctor conditionals.
-They describe suggested approaches or guidelines for people writing Vulkan
-implementations, and are rare because the hardware being targeted varies so
-widely.
-They are always given the title _Implementor's Note_, as in the following
-example:
-
-ifdef::implementation-guide[]
-.Implementor's Note
-====
-This is an implementor's note, marked up as follows:
-====
-endif::implementation-guide[]
-
-[source,asciidoc]
-.Example Markup
-----
-\ifdef::implementation-guide[]
-.Implementor's Note
-====
-Contents of an implementor's note go here.
-====
-\endif::implementation-guide[]
-----
-
-
-[[markup-word-choices]]
-== Word Choices
-
-There are a variety of common terms that have several equivalent word
-choices.
-Always use the words or phrases in the first column instead of the alternate
-terms.
-This list may not be comprehensive; when in doubt, be guided by the existing
-<<vulkan-spec,Vulkan API Specification>>.
-
-.Word Choices
-[width="100%",options="header"]
-|====
-| Use This      | Instead Of     | Comments
-| allocate      | create
-                | When describing objects or memory resulting from
-                  ftext:vkAllocate* commands.
-| application   | client / user  |
-| bitmask       | bit field
-                | Technically correct. Vulkan bitmasks are just integers and
-                  are not logically addressable at the bit level.
-| bound         | currently bound
-                | Appears primarily in valid usage statements, which are
-                  always referring to the current state of the objects
-                  they are validating.
-                  Rare exceptions may be justified in other cases.
-| command       | function
-                | Except when talking about function pointers returned by
-                  ftext:vkGet*ProcAddr commands.
-| create        | allocate
-                | When describing objects resulting from ftext:vkCreate*
-                  commands.
-| depth/stencil | packed (interleaved, combined, _other prefix_)
-                  depth/stencil, depth-stencil, DepthStencil, etc.
-                | Combined format implicit in the name.
-| device        | GPU / processor / accelerator
-                | The Vulkan specification is functional and could be
-                  implemented in many different ways.
-| dispatching command, +
-  drawing command
-                | dispatch command,
-                  draw command   | Glossary usage
-| executable memory +
-  executable state +
-  pipeline executable
-                | executable     | Disambiguation
-| heterogeneous | heterogenous   | More common
-| homogeneous   | homogenous     | More common
-| host          | CPU |
-| host endianness | platform endianness |
-| image subresource | subresource
-                | Except when referring to *host-accessible subresources*
-| implementation| system / hardware / software
-                | For consistency, and avoids implied requirements.
-| implementor   | implementer    | For consistency with historical specification practice
-| indices       | indexes        | More common
-| member        | field          |
-| runtime       | run time / run-time | Arbitrary choice for consistency
-| ename:enumerant specifies
-                | ename:enumerant indicates (denotes)
-                | When giving a brief description of enums in an enumerated
-                  type.
-                  It is often appropriate to use "`enumerant *is*`" when
-                  describing the behavior or meaning of enumerants in other
-                  places.
-| pname:parameter are/is
-                | pname:parameter specifies (denotes, indicates)
-                | In cases when _are_ or _if_ are not grammatically
-                  appropriate, _specifies_ may be used instead.
-| pname:parameter is
-                | the value of pname:parameter is
-                | In rare cases, _the value of_ is appropriate. See the
-                  existing specification language for examples.
-| pname:parameter is a _typename_ containing / controlling / defining /
-  describing / specifying / etc.
-                | pname:parameter is a _typename_ that/which contains
-                  (controls, defines, describes, specifies, etc.)
-                | Commonly used for more nuanced descriptions of parameters
-                  or structure members
-| reference monitor   | mastering display|
-| begins / begun      | starts / started | For ftext:vkBegin* - also see "`finish`"
-| finishes / finished | ends / ended     | For ftext:vkEnd* - also see "`begins`"
-| used          | referenced     | When describing attachments specified in a
-                                   subpass description.
-| statically used | referenced   | When describing resources or push constants
-                                   accessed by shader code
-| a more specific term | referenced | For all other situations.
-| component     | channel        | Specifically this refers to color channels/components
-|====
-
-[NOTE]
-.Note
-====
-The "`begin/start`" and "`end/finish`" distinction is still being sorted
-out.
-See Gitlab issue #61.
-====
-
-
-[[markup-avoid-contractions]]
-=== Avoid Abbreviations and Contractions
-
-Abbreviations and contractions make the specification sound less formal.
-Avoid using them in specification text.
-The following lists provides some guidance, but are not complete.
-
-.Word Choices (Contractions)
-[width="30%",options="header"]
-|====
-| Use This      | Instead Of
-| are not       | aren't
-| cannot{cl}    | can't
-| does not      | doesn't
-| do not        | don't
-| has not       | hasn't
-| is not        | isn't
-| it is         | it's
-| should not    | shouldn't
-| that is       | that's
-| there is      | there's
-| we are        | we're
-| we will       | we'll
-| we would      | we'd
-| what is       | what's
-| will not      | won't
-| would not     | wouldn't
-|====
-
-.Word Choices (Abbreviations)
-[width="30%",options="header"]
-|====
-| Use This      | Instead Of
-| information   | info
-| specification | spec
-|====
-
-[NOTE]
-.Note
-====
-Avoid using abbreviations in specification text describing the API, even
-though there are certain <<naming-abbreviations, approved abbreviations>>
-used in the names of API entities such as commands, structures, and
-enumerants.
-====
-
-
-[[markup-terms-caution]]
-=== Terms to Use With Caution
-
-The term _subset_ is sometimes used to refer to a _strict subset_, and
-sometimes used to refer to a subset which may be equal to the entire set.
-This is particularly likely to come up when describing bitmasks.
-Make sure to use either _subset_ or _strict subset_ as appropriate.
-
-
-[[markup-terms-avoid]]
-=== Terms to Avoid
-
-Do not describe anything in the documentation using vague or wishy-washy
-terms.
-Our goal is to precisely describe behavior of implementations.
-
-The normative terms may{cl}, optional{cl}, and should{cl} are available when
-implementations may make choices of behavior, but when such choices are
-allowed, each choice still must have well-defined behavior.
-
-.Terms to Avoid
-[width="100%",options="header"]
-|====
-| Bad Term | Comments
-| expect   | And variants such as _expected_
-| likely   | And variants such as _will likely_
-| allowed, could, generally, might, probably, perhaps
-           | And all other such terms of choice. Use _may{cl}_ or _can{cl}_
-             depending on the context.
-| may{cl} or may{cl} not   | Just use _may{cl}_.
-|====
diff --git a/registry/vulkan/style/misc.txt b/registry/vulkan/style/misc.txt
deleted file mode 100644
index adf1be5..0000000
--- a/registry/vulkan/style/misc.txt
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2015-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[miscellaneous]]
-= Image Authoring, Formats, and Style
-
-Images used in the Vulkan documents must be kept in the directory `images/`
-in SVG format.
-
-Images should be authored in the open-source
-link:https://inkscape.org/[`Inkscape`] tool, downloadable from its website
-or packaged as an optional install for most Linux distributions.
-This allows other people to easily edit your images in the future.
-Also, while SVG is in principle a portable image format, some proprietary
-image editors have been observed to produce images incompatible with the PDF
-image pipeline used by the Specification.
-
-Images must be authored at their actual image size in the HTML and PDF
-output documents, and must not be scaled with asciidoctor options.
-In most cases, images are included as standalone figures and should occupy
-the full width of the document - do not leave unnecessary whitespace on
-either side of the image.
-
-The PDF output has an available width of just over 660px (at the default
-96dpi), and a height somewhere around 1000px (which diagrams should really
-go nowhere near anyway).
-The html output is wider (800 pixels) and with practically unlimited height.
-As the PDF dimensions are more restrictive, images should not exceed these
-limits.
-
-[NOTE]
-.Note
-====
-According to the documentation available, the PDF output *should* have
-dimensions of roughly 184mm x 271mm - or equivalently 697px x 1026px (A4
-size [asciidoctor default] with a 0.5in margin [prawn-pdf default] on each
-side).
-However for reasons currently unknown, at least the available width before
-images are scaled down lies is about 30-something pixels lower than that;
-the height where this happens has not been measured, but is likely to
-similarly be lower than it should be for reasons currently unknown.
-====
-
-Dimensions of elements in the SVG file should be authored in pixels (`px`)
-such that lines/strokes are not unnecessarily anti-aliased (e.g. usually
-stick to integer pixel widths for lines).
-In many cases it is useful to also set the background grid to px, but it not
-necessary; Inkscape has reliable conversions between px and mm using a
-default dpi of 96 (which matches the PDF output), so the output dimension is
-mostly irrelevant.
-
-Text in images should usually appear at 12 point type so as to match that in
-the body of the specification, though 10 point text can be used sparingly
-where necessary (however this is often indicative of the diagram being too
-cramped, so authors should consider scaling or reworking the diagram
-instead).
-Text should use the built-in generic sans serif font so as to ensure the
-font in the output document matches whatever sans serif font is used for
-that document.
-Note that the character set is currently <<character-sets-in-svg,restricted
-to Windows-1252>>.
-
-The font and color scheme used for existing images (black, red, and 50%
-gray) should be used for changes and new images whenever reasonable to do
-so, to preserve a consistent look and feel.
-Whilst a white background is typically assumed, explicitly adding white as a
-color should be avoided - instead leave elements transparent so the diagrams
-can be used in other documents.
-
-Many other elements are consistent throughout the set of diagrams which
-should be maintained in new diagrams where possible.
-Examples include:
-
-  * Lines are usually either fully solid, or use a consistent, and
-    relatively spacious, dash style.
-  * Lines are capped with a consistent arrow shape where relevant.
-  * Small solid circles representing points are a consistently sized circle.
-
-Whenever reasonable, it is advised to copy an existing similar diagram and
-edit it rather than creating one from scratch in order to re-use elements
-and maintain consistency.
-
-
-[[character-sets-in-svg]]
-== Character sets in SVG files
-
-At the moment, the PDF conversion path only supports the Windows-1252
-character set, as we are currently using the standard fonts built into every
-PDF viewer - such that we do not have to embed a different font.
-Unfortunately these only support Windows-1252, which is a highly limited
-character set.
-
-As such, characters not in that set will not display properly when present
-in an SVG, and will fire a warning when building the PDF.
-Luckily, Inkscape has an "Object to path" function built in, which will
-convert text to a raw path, allowing these characters to be supported.
-
-Please ensure that you build the PDF before submitting any new images,
-particularly with non-standard characters, in order to catch such errors.
-
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-*Other Stuff Which May Be Described In This Chapter Eventually*
-
-  * Something about Image formats
-  * Something about validation scripts
-  * Glossary lists
-  * New param/enum macros
-====
-endif::editing-notes[]
-
diff --git a/registry/vulkan/style/naming.txt b/registry/vulkan/style/naming.txt
deleted file mode 100644
index 9433afc..0000000
--- a/registry/vulkan/style/naming.txt
+++ /dev/null
@@ -1,640 +0,0 @@
-// Copyright 2015-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[naming]]
-= API Naming Conventions
-
-Identifiers in the Vulkan API (e.g. types, parameters, constants, etc.) all
-follow a set of naming rules, providing a consistent scheme for developers.
-
-The Vulkan C API uses prefixes as an implicit namespace control mechanism.
-Bindings to other languages can choose not to use these prefixes if the
-language provides an explicit namespace mechanism.
-
-
-== General Naming Rules
-
-Names of identifiers should generally be written with full words, as a
-concise description of what that identifier is.
-For example, the type of a structure containing information about how to
-create an instance is stext:VkInstanceCreateInfo.
-
-Abbreviations and prefixes are sometimes used in the API when they do not
-impede clarity.
-All abbreviations and prefixes used in the API must be approved by the
-Vulkan working group, and be added to the <<naming-abbreviations,Common
-Abbreviations>> and <<naming-prefixes,Standard Prefixes>> sections,
-respectively.
-Whenever an approved abbreviation exists for a particular word, it should be
-used in place of the full word unless there is good reason not to.
-
-When a number is part of an identifier, it is treated as a word if it is a
-standalone number, such as the extension name token
-ename:VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME for the
-`VK_KHR_get_memory_requirements2` extension.
-For uses where the number is part of a common abbreviation such as etext:2D
-or etext:R8B8`, the entire abbreviation is treated as a word.
-
-ifdef::editing-notes[]
-[NOTE]
-.editing-note
-====
-Unfortunately, there is an internal inconsistency here between extension
-name strings, such as VK_KHR_get_memory_requirements2, and tokens encoding
-those names, such as ename:VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME.
-====
-endif::editing-notes[]
-
-
-[[naming-preprocessor]]
-== Preprocessor Defines
-
-Preprocessor definitions include an underscore `_` as a delimiter between
-words, with every character in upper case.
-
-Each definition is prefixed with `VK_`, followed by the name.
-
-This rule applies to most declarations with the C Preprocessor's `#define`
-token, including macros and constants.
-There are however a few exceptions:
-
-  * The header guard for each header includes an additional underscore `_`
-    at the end of the identifier.
-  ** Example: `VULKAN_H_`
-  * Definitions that denote the presence of an extension follow the
-    <<extensions-naming-conventions-name-strings,extension name string
-    convention>>.
-  ** Example: `VK_KHR_sampler_mirror_clamp_to_edge`
-  * Three `VKAPI_*` definitions are defined by the platform header to alias
-    certain platform-specific identifiers related to calling conventions.
-  ** Examples: `VKAPI_ATTR`, `VKAPI_CALL` and `VKAPI_PTR`
-  * Preprocessor defines are occasionally used to create aliases between
-    other Vulkan identifiers, which usually happens when something was
-    originally misnamed.
-    In these cases, the fixed name is added to the API, and the old name is
-    made into an alias of that.
-    In these cases, the name will be whatever the original misnamed
-    identifier was.
-
-[source, c]
-.Example
-----
-// VK_VERSION_MAJOR (Macro)
-#define VK_VERSION_MAJOR(version) ((uint32_t)(version) >> 22)
-
-// VK_HEADER_VERSION (Base type)
-#define VK_HEADER_VERSION 10
-----
-
-
-== Type Names
-
-Type names are declared with no separator between words.
-Each word starts with a capital letter, and every other character in each
-word is lower case.
-
-Each type name is prefixed with `Vk`.
-
-This rule applies to all type definitions except <<naming-funcpointers,
-function pointer types>>, including struct and union types, handles, base
-typedefs, and enumerant types.
-
-[source, c]
-.Example
-----
-// VkImage (Handle)
-VK_NONDISP_HANDLE(VkImage)
-
-// VkFlags (Base type)
-typedef uint32_t VkFlags;
-
-// VkResult (Enum type)
-typedef enum VkResult {
-    ...
-};
-
-// VkApplicationInfo (Struct)
-typedef struct VkApplicationInfo {
-    ...
-} VkApplicationInfo;
-
-// VkClearColorValue (Union)
-typedef union VkClearColorValue {
-    ...
-} VkClearColorValue;
-----
-
-
-[[naming-extension-structures]]
-=== Extending Structure Names
-
-Structures which extend a base structures through its pname:pNext chain
-should reflect the name of the base structure.
-Currently there are two examples of such naming schemes.
-
-New structures which add extended object creation parameters to a base
-structure should use this naming scheme:
-
-.Extended Object Information Structures
-[width="60%",options="header"]
-|====
-| Base Structure Name | Extending Structure Name
-| `Vk__Object__CreateInfo`
-    | `Vk__ObjectName__CreateInfo__Author__`
-|====
-
-`_Object_` is the name of the object being created.
-`_Name_` is a short name for the extension or the new information added by
-that extension.
-`_Author_` is the author ID of the extension.
-
-New structures which extend API queries, such as the
-`vkGetPhysicalDeviceFeatures2KHR` and `vkGetPhysicalDeviceProperties2KHR`
-commands defined by the `VK_KHR_get_physical_device_properties2` extension,
-should use this naming scheme:
-
-.Extended Query Structures
-[width="60%",options="header"]
-|====
-| Base Structure Name | Extending Structure Name
-| `vkGetPhysicalDeviceFeatures2KHR`
-    | `VkPhysicalDevice__Name__Features__Author__`
-| `vkGetPhysicalDeviceProperties2KHR`
-    | `VkPhysicalDevice__Name__Properties__Author__`
-|====
-
-`_Name_` is a short name for the extension, or for the new feature or
-property being queried, such as `Multiview` or `DiscardRectangle`.
-`_Author_` is the author ID of the extension.
-
-
-== Enumerant Names
-
-Enumerants include an underscore `_` as a delimiter between words, with
-every character in upper case.
-
-Each enumerant name is prefixed with `VK_`.
-
-Enumerants are prefixed with the exact name of the type it belongs to,
-converted to the correct case (e.g. `VkStructureType` ->
-`VK_STRUCTURE_TYPE_*`).
-
-This rule applies to all enumerants, with one exception.
-
-  * The `VkResult` enumerants are split into two sub types: error and
-    success codes.
-  ** Success codes are not prefixed with anything other than `VK_`.
-  ** Error codes are prefixed with `VK_ERROR_`.
-
-[source, c]
-.Example
-----
-// VK_FORMAT_UNDEFINED, VK_FORMAT_R4G4_UNORM_PACK8 (Enumerants)
-typedef enum VkFormat {
-    VK_FORMAT_UNDEFINED = 0,
-    VK_FORMAT_R4G4_UNORM_PACK8 = 1,
-    ...
-};
-
-// VkResult codes (Exception)
-typedef enum VkResult {
-    VK_SUCCESS = 0,
-    ...
-    VK_ERROR_OUT_OF_HOST_MEMORY = -1,
-    ...
-} VkResult;
-----
-
-
-== Command Names
-
-Command names are declared with no separator between words.
-Each word starts with a capital letter, and every other character in each
-word is lower case.
-
-The structure of a command name should be as follows:
-
-`__prefix Verb Object Property__`
-
-`_prefix_`::
-    This is usually "vk", but will be "vkCmd" if it is a command used to
-    record into a command buffer, or "vkQueue" if it directly affects a
-    queue.
-
-`_Verb_`::
-    The verb that describes the action being performed.
-    A list of most verbs used in Vulkan is available <<command-names-verbs,
-    here>>.
-
-`_Object_`::
-    The name of the object being acted upon by the command.
-
-`_Property_`::
-    The property of the object which is being acted upon by the command, and
-    is omitted in cases where the whole object is being acted upon (e.g.
-    creation commands).
-
-These rules apply to all command declarations.
-
-[source, c]
-.Example
-----
-// Creation command
-VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance( ... );
-
-// Command buffer recording command
-VKAPI_ATTR VkResult VKAPI_CALL vkCmdBindPipeline( ... );
-
-// Get command
-VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults( ... );
-----
-
-.Note
-[NOTE]
-====
-There are three exceptions to the above rule in the core Vulkan API:
-
-  * vkDeviceWaitIdle
-  * vkCmdNextSubpass
-  * vkCmdPipelineBarrier
-
-These names are left as-is to maintain compatibility.
-
-There are additionally a number of exceptions in a few existing extensions.
-====
-
-
-=== Query Commands
-
-A number of commands in the API are used to determine the properties of some
-object in the implementation.
-
-The queried properties may either be invariant, or they may: change based on
-application behavior.
-If the results are not invariant, the lifetime of the results should be
-clearly described in the command description.
-See
-link:html/vkspec.html#fundamentals-commandsyntax-results-lifetime[Lifetime
-of Retrieved Results] in the specification for more information.
-
-These commands fall into two categories from a naming perspective:
-
-Capability Queries::
-
-These are commands which query capabilities of objects that an
-implementation can provide.
-Such commands use the verb "Enumerate" to identify themselves.
-+
-e.g. `vkEnumeratePhysicalDeviceProperties`
-+
-Whilst these commands describe properties of the named object, they do not
-accept a parameter of that object type - though they usually have a
-parameter for the parent type.
-
-Object State Queries::
-
-These commands are used to query the current properties of an object that
-has been created.
-Such commands use the verb "Get" to identify themselves.
-+
-e.g. `vkGetPhysicalDeviceQueueFamilyProperties`
-+
-These commands always have a parameter of the object type.
-
-
-[[command-names-verbs]]
-=== Command Verbs
-
-Below is a list of many of the verbs currently in use in core Vulkan and KHR
-extensions, along with their meanings.
-The list is not guaranteed to be up to date, but covers all core and KHR
-verbs at the time of writing.
-
-[%autowidth,options="header"]
-|===
-| Verb       | Meaning
-| Acquire    | Acquire ownership of an object from an external source
-| Allocate   | Allocates memory in a pool or memory heap and creates object - paired with "Free"
-| Begin      | Start of a range of command buffer commands with different behavior than those outside the range - "End" marks the end of the range
-| Bind       | Binds an object to another object
-| Blit       | Performs a filtered and scaled copy of pixels from one image to another
-| Clear      | Sets all pixels in an image to the same value
-| Copy       | A raw copy of data from one object to another with no transformation of the data
-| Create     | Creates an object - paired with "Destroy"
-| Destroy    | Destroys an object - paired with "Create"
-| Dispatch   | Kicks off a set of compute tasks
-| Draw       | Kicks off a set of rasterization tasks
-| End        | End of a range of command buffer commands with different behavior than those outside the range - "Begin" marks the start of the range
-| Enumerate  | Queries the capabilities of objects that could be created, before creating them
-| Execute    | Executes commands recorded in another command buffer
-| Fill       | Sets all data units in a buffer to the same value
-| Flush      | Flushes data from the host to the device
-| Free       | Destroys an object and then frees memory back to a pool or memory heap - paired with "Allocate"
-| Get        | Queries the state of an existing object
-| Import     | Imports the payload from an external object into a Vulkan object
-| Invalidate | Invalidates data on the host, forcing newer data on the device to be read
-| Map        | Maps an allocation into host memory - paired with "Unmap"
-| Merge      | Merges two objects
-| Present    | Presents an image to a surface
-| Push       | Pushes data to the device as part of a command stream
-| Release    | Releases ownership of an object to an external source
-| Reset      | Resets the state of an object to an initial state
-| Resolve    | Resolves multiple samples in a multisampled image to an image with one sample per pixel
-| Set        | Sets the state of an object
-| Submit     | Submits a set of commands to a queue
-| Unmap      | Unmaps an allocation from host memory - paired with "Map"
-| Update     | Updates entries in a descriptor set
-| Wait       | Waits for some signal
-| Write      | Writes values to an object
-|===
-
-
-[[naming-funcpointers]]
-=== Function Pointer Type Names
-
-Function pointer names are declared exactly as the equivalent statically
-declared command would be declared, but prefixed with `PFN_`, standing for
-"Pointer to FunctioN".
-
-[source, c]
-.Example
-----
-// PFN_vkCreateInstance (Function Pointer)
-typedef VkResult (VKAPI_PTR *PFN_vkCreateInstance)( ... );
-----
-
-
-== Function Parameter and Struct/Union Member Names
-
-Function parameter names are declared with no separator between words.
-Each new word, *except* for the first, starts with a capital letter.
-All other characters in the parameter name are in lower case.
-
-Members/parameters of a type that is not a base type should generally be
-named in a similar way to the type itself, with additional context added for
-clarity when necessary.
-
-Pointer members/parameters are prefixed with a number of `p` characters,
-with one `p` for each level of indirection.
-
-Function pointer members/parameters are prefixed with `pfn`.
-
-Any member that describes the size of a memory allocation should be suffixed
-with `Size`.
-If the context is self-evident from the structure name, then it may simply
-be named `size`.
-
-Any member that describes the number of something, such as an array length
-or number of internal allocations, should be suffixed with `Count`.
-The `size` rule overrides this rule, though it is possible to have multiple
-sizes (e.g. `sizeCount`).
-If the member is an array length, then the name of length should correspond
-to the name of the array member, usually `XYZCount` for an array named
-`pXYZs`.
-If a structure in a pname:pNext chain is an array whose length must match
-the length of an array of the base structure, then that extending structure
-should include an array length member with the same name as the length in
-the base structure.
-
-These rules apply to all function parameters and struct/union members, with
-a single exception:
-
-  * The `sType` member of structures is abbreviated as it is used in almost
-    every structure.
-  ** The slightly odd naming prevents it clashing with any future variables.
-  ** The `s` stands for "`structure`", referring to its enumerant type.
-
-[source, c]
-.Example
-----
-// Function parameters, including a twice indirected pointer.
-VKAPI_ATTR VkResult VKAPI_CALL vkMapMemory(
-    VkDevice                                    device,
-    VkDeviceMemory                              memory,
-    VkDeviceSize                                offset,
-    VkDeviceSize                                size,
-    VkMemoryMapFlags                            flags,
-    void**                                      ppData);
-
-// Structure members, including the sType exception and a single indirected
-// pointer.
-typedef struct VkMemoryBarrier {
-    VkStructureType    sType;
-    const void*        pNext;
-    VkAccessFlags      srcAccessMask;
-    VkAccessFlags      dstAccessMask;
-} VkMemoryBarrier;
-
-// Function pointer members
-typedef struct VkAllocationCallbacks {
-    void*                                   pUserData;
-    PFN_vkAllocationFunction                pfnAllocation;
-    PFN_vkReallocationFunction              pfnReallocation;
-    PFN_vkFreeFunction                      pfnFree;
-    PFN_vkInternalAllocationNotification    pfnInternalAllocation;
-    PFN_vkInternalFreeNotification          pfnInternalFree;
-} VkAllocationCallbacks;
-
-// Size member (pCode is not a specific array of anything, it is just a
-// pointer to memory)
-typedef struct VkShaderModuleCreateInfo {
-    VkStructureType              sType;
-    const void*                  pNext;
-    VkShaderModuleCreateFlags    flags;
-    size_t                       codeSize;
-    const uint32_t*              pCode;
-} VkShaderModuleCreateInfo;
-
-// Count member
-typedef struct VkSparseImageMemoryBindInfo {
-    VkImage                           image;
-    uint32_t                          bindCount;
-    const VkSparseImageMemoryBind*    pBinds;
-} VkSparseImageMemoryBindInfo;
-----
-
-
-[[naming-extension-identifiers]]
-== Extension Identifier Naming Conventions
-
-Identifiers defined by an extension are modified by appending the
-extension's author ID to the end of the identifier, as described below.
-Author IDs are obtained as described in the
-<<extensions-naming-conventions,Extension and Layer Naming Conventions>>
-section.
-
-If an extension becomes part of core, a new version of the extension's
-identifiers should be created, that do not contain the author ID at the end
-of the identifier.
-The original identifiers should be kept in order to maintain source-level
-compatibility with existing applications making use of the earlier
-extension's identifiers.
-
-
-=== Extension Type Names
-
-Types defined by extensions have the author ID appended to the end of the
-type name.
-
-[source, c]
-.Example
-----
-// VkSurfaceFormatKHR (structure type with KHR appended)
-typedef struct VkSurfaceFormatKHR {
-    VkFormat           format;
-    VkColorSpaceKHR    colorSpace;
-} VkSurfaceFormatKHR;
-----
-
-[[naming-extension-enumerant-names]]
-=== Extension Enumerant Names
-
-Enumerants defined by extensions have the author ID appended to the end of
-the enumerant name, separated by an underscore.
-This includes the begin, end, range and max values added to enumeranted type
-definitions by the generator scripts.
-
-[NOTE]
-====
-There is one exception to this rule in the
-`VK_KHR_sampler_mirror_clamp_to_edge` extension.
-This functionality was included in the original specification, but quickly
-separated out at release.
-Due to this late change, the single enum exposed has retained its original
-identifier to avoid compatibility issues:
-ename:VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE
-====
-
-[source, c]
-.Example
-----
-// VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR (enumerant with _KHR appended)
-typedef enum VkCompositeAlphaFlagBitsKHR {
-    VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR = 0x00000001,
-    ...
-} VkCompositeAlphaFlagBitsKHR;
-----
-
-
-=== Extension Function Names
-
-Function and function pointer type names defined by extensions have the
-author ID appended to the end of the name.
-
-[source, c]
-.Example
-----
-// vkDestroySurfaceKHR (function with KHR appended)
-VKAPI_ATTR void VKAPI_CALL vkDestroySurfaceKHR(
-    VkInstance                                  instance,
-    VkSurfaceKHR                                surface,
-    const VkAllocationCallbacks*                pAllocator);
-
-typedef void (VKAPI_PTR *PFN_vkDestroySurfaceKHR)(
-    VkInstance                                  instance,
-    VkSurfaceKHR                                surface,
-    const VkAllocationCallbacks*                pAllocator);
-----
-
-
-[[naming-abbreviations]]
-== Common Abbreviations
-
-Abbreviations and acronyms are sometimes used in the <<vulkan-spec,Vulkan
-API Specification>> and the Vulkan API where they are considered clear and
-commonplace.
-All such abbrevations used in the core API are defined here.
-Extensions should also use these abbreviations where appropriate.
-
-Src::
-    Source
-
-Dst::
-    Destination
-
-Min::
-    Minimum
-
-Max::
-    Maximum
-
-Rect::
-    Rectangle
-
-Info::
-    Information
-
-Lod::
-    Level of Detail
-
-Mip::
-    Related to a mipmap.
-    Use "`mipmap`" in full only when it is a standalone term.
-    If referred to some associating with a mipmap, such as levels, sampling
-    mode, size, tail images, etc., use "`mip`" as a standalone prefix word,
-    e.g. pname:maxMipLevels, ename:VK_MIP_MODE, etc.
-    This is analogous to the <<writing-compound-words,spelling conventions
-    for mip-related terms>>
-
-[NOTE]
-====
-The names pname:mipmapMode, pname:mipmapPrecisionBits,
-sname:VkSamplerMipmapMode, and
-ename:VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT are exceptions to this
-general usage guideline, for historical reasons.
-====
-
-ID::
-    Identifier
-
-UUID::
-    Universally Unique Identifier
-
-Op::
-    Operation
-
-R::
-    Red color component
-
-G::
-    Green color component
-
-B::
-    Blue color component
-
-A::
-    Alpha color component
-
-
-[[naming-prefixes]]
-== Standard Prefixes
-
-Prefixes are used in the API to denote specific semantic meaning of Vulkan
-names, or as a label to avoid name clashes, and are explained here:
-
-VK/Vk/vk::
-    Vulkan namespace +
-    All types, commands, enumerants and C macro definitions in the Vulkan
-    specification are prefixed with these two characters, according to the
-    rules defined above.
-
-PFN/pfn::
-    Function Pointer +
-    Denotes that a type is a function pointer, or that a variable is of a
-    pointer type.
-
-p::
-    Pointer +
-    Variable is a pointer.
-
-vkCmd::
-    Commands that record commands in command buffers +
-    These API commands do not result in immediate processing on the device.
-    Instead, they record the requested action in a command buffer for
-    execution when the command buffer is submitted to a queue.
-
-s::
-    Structure +
-    Used to denote the etext:VK_STRUCTURE_TYPE* member of each structure in
-    pname:sType.
diff --git a/registry/vulkan/style/vuid.txt b/registry/vulkan/style/vuid.txt
deleted file mode 100644
index 2dd1b9c..0000000
--- a/registry/vulkan/style/vuid.txt
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright 2015-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[appendix]
-[[appendix-vuid]]
-= Valid Usage ID Tags
-
-Valid usage statements in the published Vulkan Specification must all be
-given _Valid Usage ID_ or _VUID_ tags.
-These tags are asciidoctor anchors, intended for use by the validation layer
-to provide unique names for each validation condition, and a way to link
-from validation layer reports into the corresponding parts of the
-Specification.
-
-
-[[appendix-vuid-format]]
-== Format of VUID Tags
-
-For implicit valid usage statements, the tags are formatted like this:
-
-[source,asciidoc]
-----
-[[VUID-blockname-paramname-category]]
-----
-
-_blockname_ is the name of the function or structure for which a valid usage
-statement is being generated.
-
-_paramname_ is the name of the parameter being validated.
-In some cases, the statement does not validate a single parameter and this
-portion of the tag is absent.
-
-_category_ is the type of statement being generated.
-There are over one dozen types referring to distinct conditions such as
-valid objects, required bitmasks, required array lengths, constraints on
-parent objects, and so on.
-
-For explicit valid usage statements, the tags are formatted like this:
-
-[source,asciidoc]
-----
-[[VUID-blockname-paramname-number]]
-----
-
-_blockname_ is the name of the function or structure for which a valid usage
-statement is being generated.
-
-_paramname_ is the name of the parameter being validated.
-In some cases, the statement does not validate a single parameter and this
-portion of the tag is replaced by `-None-`
-
-_number_ is a unique five digit, zero-filled number used to disambiguate
-similar tag names.
-
-[NOTE]
-.Note
-====
-The _blockname_, _paramname_, and _category_ portions of a VUID tag name
-must each be composed only of the alphanumeric characters A-Z, a-z, and 0-9,
-and the ':' character.
-In general only the alphabetic subset of these characters is used, but there
-are a few exceptions.
-====
-
-
-[[appendix-vuid-creating]]
-== Creating VUID Tags
-
-For implicit valid usage statements generated automatically from `vk.xml`,
-VUID tags are created automatically by the generator scripts.
-
-For explicit valid usage statements, VUID tags are generated by passing
-appropriate options to the script `reflow.py`.
-
-Since these tags are of use only to the published validation layer, they are
-needed only in the published Specification sources and outputs.
-Therefore, authors of extensions, or other branches adding valid usage
-statements, are not themselves responsible for adding tags in their
-branches.
-The specification editors will take care of this as part of the process of
-publishing updates.
-For reference purposes, this process is described below:
-
-First, after integrating all new specification language into the internal
-gitlab default branch (currently `main`) which contains the canonical
-Specification source, invoke the following command:
-
-[source,sh]
-----
-python3 reflow.py -overwrite -noflow -tagvu chapters/*.txt chapters/*/*.txt
-----
-
-This will add VUID tags to all statements in valid usage blocks which do not
-already have them.
-Some diagnostics will be reported, but these are do not in general require
-any action.
-
-After updating all files, the script will update the file
-`scripts/vuidCounts.py`, which contains reserved ranges of VUIDs for the
-default branch and certain other development branches.
-
-Commit the updated source files and `vuidCounts.py` together.
-The next time the script is run, VUID tags will be assigned numbers starting
-from the next free value in the range available to default branch.
-
-In-development Vulkan extensions are kept in their own branches, with the
-branch name the same as the name of the extension being developed.
-VUID tags may be assigned in these branches in the same fashion as in
-default branch.
-To enable this, each development branch must be assigned its own independent
-VUID range in the default branch copy of `vuidCounts.py`, to prevent
-collisions.
-In the event that default branch or any development branch exhausts the
-available VUID range, `reflow.py` will report this and stop assigning VUIDs.
-At that point, a new range must be assigned to the branch in the default
-branch copy of `vuidCounts.py`, as well as in the per-branch copy.
-
-
-== Updating VUID Tags When Valid Usage Statements Change
-
-Valid usage statements have corresponding tests in the Vulkan Validation
-Layer.
-The tests must be changed in response to semantic changes in the VU
-statements, whether for bug-fixing, adding extension interactions, or
-otherwise.
-The rule used when updating explicit VU statements is that the merge request
-or pull request responsible for making the change must remove the existing
-VUID tag, so that a new one can be assigned, _except_ in the following
-cases:
-
-  * The changes are non-semantic, such as using consistent phrasing or
-    markup.
-  * The changes consist of removing or changing extension suffixes when
-    promoting an extension to `EXT`, `KHR`, or core status.
-  * The valid usage statement has not yet been implemented in the validation
-    layers.
-
-[NOTE]
-.Note
-====
-This section may need further modification in response to guidelines agreed
-to by the Vulkan Working Group.
-====
diff --git a/registry/vulkan/style/writing.txt b/registry/vulkan/style/writing.txt
deleted file mode 100644
index a346927..0000000
--- a/registry/vulkan/style/writing.txt
+++ /dev/null
@@ -1,1296 +0,0 @@
-// Copyright 2015-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-[[writing]]
-= Writing Style
-
-
-[[writing-misc]]
-== Miscellaneous Grammar, Spelling, and Punctuation Issues
-
-=== Use the Oxford Comma (Serial Comma)
-
-When writing a sentence listing a series of items, include a comma before
-the "`and`" separating the last item.
-
-*Correct:* The red, green, blue, and alpha components.
-
-*Incorrect:* The red, green, blue and alpha components.
-
-Also see this
-link:https://blog.oxforddictionaries.com/2015/01/21/video-oxford-comma/[video
-discussion of the Oxford comma] provided by the Oxford Dictionary.
-
-
-=== Date Format
-
-Whenever possible, write dates in the <<iso-8601,ISO 8601>> format:
-YYYY-MM-DD.
-
-If needed for consistency with existing dates, e.g. in appendix changelogs,
-you can also write "`Month DD, YYYY`" where "`Month`" is the English name of
-the month.
-
-Never use ambigious formats such as "`09/12/16`".
-
-[source,asciidoc]
-.Example Markup
-----
-  * 2016-09-12
-  * September 12, 2016
-----
-
-
-[[writing-misc-a-an]]
-=== A/An and Markup Macros
-
-Use "`a`" and "`an`"
-link:https://www.grammar.com/a-vs-an-when-to-use/[correctly], based on the
-*sound* of the letter beginning the following word.
-
-It is easy to get this wrong when talking about Vulkan API names tagged with
-the <<markup-macros,markup macros>>.
-For example, if you wanted to say:
-
-A ename:VK_ERROR_DEVICE_LOST error
-
-the correct way to mark this up in asciidoctor would be:
-
-[source,asciidoc]
-----
-A ename:VK_ERROR_DEVICE_LOST error
-----
-
-However, on first glance at this it *appears* wrong, because the "`word`"
-following "`a`" is the macro name, "`ename{cl}`".
-That starts with a vowel, so the temptation is to say
-
-[source,asciidoc]
-----
-An ename:VK_ERROR_DEVICE_LOST error may occur.
-----
-
-What matters here is how the *output* document is formatted.
-
-
-=== Numbers in Text
-
-When describing the need for a small number of objects, smaller than ten,
-spell the number out (e.g. "`one`").
-If you are describing a literal value that is a small number, you may use a
-numeric value (e.g. "`1`").
-
-For example, instead of writing that a bitmask "`contains 1 or more bits`",
-write that it "`contains one or more bits`".
-A counter example is that it is okay to write "`For non-stereoscopic-3D
-applications, this value is 1.`"
-
-
-=== Use American Spelling Conventions
-
-In case of conflict, use American rather than British spelling conventions,
-except for noted exceptions in the table below.
-
-.Spelling
-[width="60%",options="header"]
-|====
-| Use Spelling  | Instead Of     | Comments
-| color         | colour         |
-| signaled      | signalled      |
-| tessellation  | tesselation    | Historical exception
-|====
-
-
-[[writing-inclusivity]]
-=== Use Inclusive Language
-
-The Vulkan Working Group has begun to apply the
-link:https://www.khronos.org/about/inclusive-language[Khronos Inclusive
-Language] list to our specifications and other documents.
-The Khronos Inclusive Language list contains terms to avoid due to their use
-in discriminatory contexts that make people uncomfortable, or cause
-division.
-
-We are working through the Vulkan Specification repository to make
-appropriate changes, and enhancing the repository continuous integration
-scripts to report questionable terminology usage.
-This process will take some time.
-
-Some files in the repository are incorporated unmodified from external
-projects we do not control, and which may not comply with the Inclusive
-Language list.
-We will ask those projects to update their terminology usage, but cannot
-control their choices.
-
-
-[[writing-pointers-instances]]
-=== Describing Pointers, Handles, Structures, and Arrays
-
-When describing pointer parameters or members, use "`is a pointer to`"
-rather than more informal phrasing such as "`points to`".
-
-When describing individual structures, use "`VkStructname structure`" rather
-than longer phrasing such as "`instance of the VkStructname structure`" or
-"`structure of type VkStructname`".
-
-When describing array parameters or members, use "`is a pointer to an array
-of`" rather than "`is an array of`" unless it is a structure member that is
-a fixed-size array.
-Reference the dynamic size of the array that is pointed to (usually another
-structure member), or the static size for fixed-size arrays, in the
-description.
-
-When describing pointers which may be `NULL`, use "`is `NULL` or a pointer
-to`" rather than "`is an optional pointer`".
-The same principle applies when describing a handle which may be
-dname:VK_NULL_HANDLE.
-"`Optional pointer/handle`" are not well-defined terms in the Specification.
-
-[source,asciidoc]
-.Example Markup
-----
-  * pname:pInfo is a pointer to a slink:VkDebugUtilsLabelEXT structure
-    specifying the parameters of the label to insert.
-  * pname:pBindInfos is a pointer to an array of pname:bindInfoCount
-    slink:VkBindBufferMemoryInfo structures describing buffers and memory to
-    bind.
-  * pname:pStrides is `NULL` or a pointer to an array
-    of buffer strides.
-  * pname:image is dlink:VK_NULL_HANDLE or a handle of an image which this
-    memory will be bound to.
-----
-
-
-[[writing-arrays]]
-=== Describing Properties of Array Elements
-
-Many Vulkan parameters are arrays, or pointers to arrays.
-When describing array elements, use the terminology "`each element`" when
-the description applies uniformly and independently to every element of the
-array.
-For example:
-
-[source,asciidoc]
-.Example Markup
-----
-  * Each element of the pname:pCommandBuffers member of each element of
-    pname:pSubmits must: be in the <<commandbuffers-lifecycle, pending or
-    executable state>>.
-----
-
-Use the terminology "`any element`" when the description is of zero or more
-elements of the array sharing a property.
-For example:
-
-[source,asciidoc]
-.Example Markup
-----
-  * If any element of the pname:pCommandBuffers member of any element
-    of pname:pSubmits was not recorded with the
-    ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, it must: not be in
-    the <<commandbuffers-lifecycle, pending state>>.
-----
-
-Never use the redundant terminology "`any *given* element`".
-
-
-[[writing-compound-words]]
-=== Compound Words and Preferred Orthography
-
-Unless there is longstanding precedent in computer science literature, or
-the word is a noted exception in the table below, do not arbitrarily cram
-terms together.
-
-This does not apply to parameter names in the API, where capitalization is
-used to distinguish words.
-For example, it is proper to refer to the use of a pname:colorSpace member
-of a structure as a "`color space`" value.
-
-.Spelling
-[width="70%",options="header",cols="20%,20%,60%"]
-|====
-| Use Spelling  | Instead Of     | Comments
-| bit plane     | bitplane       |
-| compile time  | compile-time   | Per Wikipedia "`compile time`"
-| color space   | colorspace     |
-| cube map      | cubemap        |
-| double-buffer | doublebuffer   |
-| entry point   | entry-point +
-                  entrypoint
-                | Except if needed to disambiguate from surrounding terms
-| flat shading  | flatshading    |
-| GitHub        | Github         | Site's preferred spelling
-| LOD           | lod +
-                  level of detail +
-                  level-of-detail| Acronym for "`Level of Detail`"
-| mip level +
-  mip layer +
-  mip size  +
-  mip tail
-                | miplevel +
-                  miplayer +
-                  mipsize  +
-                  miptail        | "`mipmap *term*`" may be used in time
-| render pass   | renderpass     |
-| reuse         | re-use         |
-| side effect   | side-effect    |
-3+h| Exceptions
-| mipmap        | mip map        | Exception for historical reasons
-| pname:pNext chain
-                | pname:pNext-chain +
-                  pname:pNext extension chain
-                                 |
-| general-purpose
-                | general purpose| When used as an adjective
-| implementation-dependent
-                | implementation dependent
-                                 | When used as an adjective
-| swapchain     | swap chain     | Exception due to heavy use in WSI extensions
-| happen-before +
-  happen-after  | happen before +
-                  happen after   | As used in concurrent languages such as
-                                   C++11, Java and OpenCL C.
-|====
-
-==== Words With "Pre-" Prefixes
-
-// also: premultiply preorder prerotation predefined
-
-When using the prefix "`pre`" to indicate "`prior to`", such as in the words
-"`preinitialized`", "`preprocess`", and "`pretransform`", do not separate
-the prefix from the word with a hyphen.
-This list is not intended to be complete.
-
-
-[[writing-references]]
-=== References
-
-When citing external references, use the appropriate <<acm-references,
-Association for Computing Machinery Citation Style>>.
-Most citations in our specifications should follow the _For an online
-document/WWW resource_ style, using the actual date on the document being
-referenced rather than the document retrieval date.
-See the <<vulkan-spec, Vulkan Specification>> citation in this document for
-an example.
-
-
-[[writing-undefined]]
-== Describing Undefined Behavior
-
-When describing undefined behavior that results only in the values of
-specified variables, or the contents of specified memory, becoming undefined
-or implementation-defined, use the undefined{cl} macro to indicate that each
-use of the term "`undefined`" has been carefully considered and accurately
-represents the degree of undefined behavior allowed.
-
-The word "`undefined`" should not be used without the trailing {cl}.
-This is enforced by internal CI tests.
-
-The undefined{cl} macro does not result in visible markup in the output
-document, and is not itself a normative term.
-The macro is simply markup to help ensure that use of the word has been
-consciously chosen.
-
-When describing more general types of undefined behavior (up to and
-including termination of the application), do *not* use the term
-"`undefined`".
-Instead, specify that the application must{cl} not create circumstances that
-would lead to such behavior.
-Such statements should be written as valid usage statements, if possible.
-
-
-[[writing-describing]]
-== Describing Commands and Parameters
-
-The <<vulkan-spec,Vulkan API Specification>> describes API commands followed
-by descriptions of their parameters, which are usually simple scalar types,
-handles or pointers to Vulkan objects or arrays of objects; enumerated types
-specifying values or bitmasks which affect the operation of a command; or
-structures containing combinations of scalar types and objects.
-The templates and examples shown and annotated here are based on the
-<<vulkan-spec,Vulkan API Specification>>.
-Do not vary from them without compelling need.
-
-Normative parts of the <<vulkan-spec,Vulkan API Specification>> should
-describe _what_ something does, rather than _how_ or _why_ an application
-would want to use it.
-
-When explicitly allowed by the Specification, the reserved value `NULL` may:
-be used for pointer parameters and members and dispatchable object handles,
-and the reserved value dname:VK_NULL_HANDLE may: be used for
-non-dispatchable Vulkan object handle parameters and members.
-Otherwise, pointers and handles must: refer to valid memory and valid Vulkan
-objects, respectively.
-
-
-[NOTE]
-.Guideline
-====
-As a simple example, say
-
-"`To create a command pool, call fname:vkCreateCommandPool`"
-
-rather than
-
-"`You/The application/The user can create a command pool by calling
-fname:vkCreateCommandPool`".
-
-====
-
-Explanations of _why_ and _how_ should largely be confined to reference
-documentation, sample code, tutorials, and other such documents.
-Occasional non-normative explanations can be included in the
-<<vulkan-spec,Vulkan API Specification>> using
-<<markup-informative-notes,informative notes>>.
-
-
-[[writing-describing-errors]]
-=== Commands which Return Error Codes
-
-Commands which return elink:VkResult values must list all possible error
-codes for the command in the `errorcodes` XML attribute for the command.
-Almost all such commands may return the ename:VK_ERROR_OUT_OF_HOST_MEMORY
-error code.
-Any exceptions to this rule should be carefully considered by the
-specification author, and a rationale for this anomalous behavior may be
-provided in a NOTE or in the Issues section of the extension appendix
-corresponding to the new command.
-
-See the "`Return Codes`" section of the <<vulkan-spec,Vulkan API
-Specification>> for additional information.
-
-
-[[writing-describing-layers]]
-== Extensions and Grouping Related Language
-
-Language specifying behavior of a command or structure that does not
-originate in an extension should be placed in a single contiguous region of
-the specification.
-
-When defining a new command or structure from an extension that introduces
-additional behavior or options, do not insert such new language in a way
-that "`orphans`" part of an existing description by splitting up the
-existing language.
-
-This constraint does not apply to enumerated types.
-Language for new enumerants defined by extensions should be added to the
-existing enumerant definition, <<extensions-documenting-extensions,
-protected by asciidoctor conditionals>> for the new extension.
-
-[NOTE]
-.Guideline
-====
-Specification language should be structured, whenever possible, so it fits
-into a single open block defining a <<writing-refpages, reference page>>.
-====
-
-
-[[writing-math]]
-== Math Markup
-
-There is a considerable amount of math in the documentation, ranging from
-simple arithmetic expressions to complicated conditionals.
-There are two ways of marking up math expressions, described below.
-
-=== Asciidoc Math Markup
-
-Where possible, math is marked up using straight asciidoctor features.
-For commonality with LaTeX math (see below), some common LaTeX operators and
-names are defined as asciidoctor attributes using the same names, expanding
-to the corresponding Unicode entities.
-The complete set of these attributes is found in `config/attribs.txt`.
-
-.Spelling
-[width="100%",options="header",cols="20%,20%,60%"]
-|====
-| Feature | Result | Sample Markup
-
-| Subscripts
-| [eq]#a~x~#
-| +++[eq]#a~x~#+++
-
-| Superscripts
-| [eq]#-2^(b-1)^#
-| +++[eq]#-2^(b-1)^#+++
-
-| Struct/parameter names as variables
-| [eq]#2^pname:bits^#
-| +++[eq]#2^pname:bits^#+++
-
-| Greek Letters (selected)
-| [eq]#{alpha}, {beta}, {gamma}, {delta}, {DeltaUpper}, {epsilon}, {lambda},
-  {rho}, {tau}#
-| +++[eq]#{alpha}, {beta}, {gamma}, {delta}, {DeltaUpper}, {epsilon}, {lambda},
-  {rho}, {tau}#+++
-
-| Fractions
-| [eq]#{onequarter} {plus} {onehalf}#
-| +++[eq]#{onequarter} {plus} {onehalf}#+++
-
-| Closed Ranges
-| [eq]#[0,1]#
-| +++[eq]#[0,1]#+++
-
-| Open Ranges
-| [eq]#[0,1)#
-| +++[eq]#[0,1)#+++
-
-| Arithmetic and Relational Operators
-| [eq]#a {times} b#, [eq]#a {leq} b#, [eq]#a {neq} b#, [eq]#a {geq} b#, [eq]#{vert}x{vert}#
-| +++[eq]#a {times} b#+++, +++[eq]#a {leq} b#+++, +++[eq]#a {neq} b#+++, +++[eq]#a {geq} b#+++, +++[eq]#{vert}x{vert}#+++
-
-| Floor
-| [eq]#{lfloor}w - {onehalf}{rfloor}#
-| +++[eq]#{lfloor}w - {onehalf}{rfloor}#+++
-
-| Ceiling
-| [eq]#{lceil}log~2~(max(pname:width, pname:height)){rceil} {plus} 1#
-| +++[eq]#{lceil}log~2~(max(pname:width, pname:height)){rceil} {plus} 1#+++
-
-| Logical and Set Operators
-| [eq]#{land} {lnot} {lor} {oplus} {elem}#
-| +++[eq]#{land} {lnot} {lor} {oplus} {elem}#+++
-
-| Partial Derivatives
-| [eq]#{partial}r~x~ / {partial}x = 0#
-| +++[eq]#{partial}r~x~ / {partial}x = 0#+++
-
-| Matrix/Vector Parameter Names
-| [eq]#**P** = t **P**~1~ {plus} (1-t) **P**~2~#
-| +++[eq]#**P** = t **P**~1~ {plus} (1-t) **P**~2~#+++
-
-|====
-
-
-[[writing-math-latexmath]]
-=== LaTeX Math Markup
-
-Math markup more complex than easily supported in straight asciidoctor
-markup (examples found in the Vulkan Specification include matrices,
-tensors, summation notation, conditional assignments, and division of
-complex expressions) are marked up using LaTeX math notation, which is
-either passed through to the KaTeX in-browser rendering script for HTML
-outputs, or passed through asciidoctor-mathematical for PDF outputs.
-
-[NOTE]
-.Note
-====
-There are font and style differences between LaTeX and asciidoctor math
-markup which lead to minor visual inconsistencies.
-We will try to make this better over time, but it is not significant enough
-to be a big priority.
-====
-
-While LaTeX math macros, including the amsmath package, are supported,
-general LaTeX constructs are not.
-
-_Inline math_ is encoded using the latexmath{cl} macro.
-For example:
-
-  * latexmath:[[0,1\]]
-  * latexmath:[\frac{1 - \frac{x}{2}}{x - 1}]
-  * latexmath:[\mathbf{c} = t \mathbf{c}_1 + (1-t) \mathbf{c}_2.]
-
-[source,asciidoc]
-.Example Markup
-----
-  * latexmath:[[0,1\]]
-  * latexmath:[\frac{1 - \frac{x}{2}}{x - 1}]
-  * latexmath:[\mathbf{c} = t \mathbf{c}_1 + (1-t) \mathbf{c}_2. ]
-----
-
-Note the escaped bracket in markup for the first expression, which is
-necessary to work around asciidoctor macro parsing.
-
-_Block math_ is used for more complex equations.
-This example uses the `aligned` environment to delimit the expression.
-
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-c_{RGB} & =
-  \begin{cases}
-    \frac{c_{sRGB}}{12.92}                              & \text{for}\  c_{sRGB} \leq 0.04045 \\
-    \left ( \frac{c_{sRGB}+0.055}{1.055} \right )^{2.4} & \text{for}\  c_{sRGB} > 0.04045
-  \end{cases}
-\end{aligned}
-+++++++++++++++++++
-
-[source,asciidoc]
-.Example Markup
-----
-[latexmath]
-+++++++++++++++++++
-\begin{aligned}
-c_{RGB} & =
-  \begin{cases}
-    \frac{c_{sRGB}}{12.92}                              & \text{for}\  c_{sRGB} \leq 0.04045 \\
-    \left ( \frac{c_{sRGB}+0.055}{1.055} \right )^{2.4} & \text{for}\  c_{sRGB} > 0.04045
-  \end{cases}
-\end{aligned}
-+++++++++++++++++++
-----
-
-[NOTE]
-.Note
-====
-The KaTeX processor used to render LaTeX math inside HTML documents does not
-support all features of LaTeX math.
-
-Similarly, the asciidoctor-mathematical processor does not support
-everything, though does have some support for AMSMath.
-
-Some workarounds we've had to make are:
-
-.LaTeX math replacements for KaTeX compatibility
-[width="70%",options="header",cols="20%,20%,60%"]
-|====
-| Replace              | With              | Comments
-| `\begin{equation}`   | _nothing_         | Unnecessary in blocks. Should not be used for inline.
-| `\end{equation}`     | _nothing_         | Unnecessary in blocks. Should not be used for inline.
-| `\begin{align*}`     | `\begin{aligned}` |
-| `\end{align*}`       | `\end{aligned}`   |
-| `\operatorname{foo}` | `\mathbin{foo}`   |
-| `{\rm A}`            | `\mathrm{A}`      |
-| `\text{for }`        | `\text{for}\ `    | Text ending in spaces is unpredictable - favour escaped spaces after text
-|====
-
-The KaTeX repository provides a
-link:https://github.com/Khan/KaTeX/wiki/Function-Support-in-KaTeX[list of
-currently supported LaTeX functionality].
-You can also use the link:https://khan.github.io/KaTeX/[live katex preview
-tool] on the KaTeX website to double check support, without building the
-whole specification.
-
-Note that we use a locally-cached copy of KaTeX which may lag the latest
-published version on the website.
-As of April 2021, we are using v0.11.1.
-
-See the mtex2MML repository for a
-link:https://github.com/gjtorikian/mtex2MML/blob/master/SUPPORTED.md[list of
-supported operations in the PDF build].
-In particular, `\mathop` is not supported properly, but most other standard
-functionality is included.
-
-It is necessary to cross reference these two to make sure that support
-exists before using anything, but almost all standard functionality is
-supported for both.
-====
-
-This example is among the most complex expressions in the Vulkan
-specification:
-
-[latexmath]
-+++++++++++++++++++
-V =
-  \begin{cases}
-    (-1)^S \times 0.0,                      & E = 0, M = 0     \\
-    (-1)^S \times 2^{-14} \times { M \over 2^{10} },
-                                            & E = 0,  M \neq 0 \\
-    (-1)^S \times 2^{E-15} \times { \left( 1 + { M \over 2^{10} } \right) },
-                                            & 0 < E < 31       \\
-    (-1)^S \times Inf,             & E = 31, M = 0             \\
-    NaN,                           & E = 31, M \neq 0
-  \end{cases}
-+++++++++++++++++++
-
-[source,asciidoc]
-.Example Markup
-----
-[latexmath]
-+++++++++++++++++++
-V =
-  \begin{cases}
-    (-1)^S \times 0.0,                      & E = 0, M = 0     \\
-    (-1)^S \times 2^{-14} \times { M \over 2^{10} },
-                                            & E = 0,  M \neq 0 \\
-    (-1)^S \times 2^{E-15} \times { \left( 1 + { M \over 2^{10} } \right) },
-                                            & 0 < E < 31       \\
-    (-1)^S \times Inf,             & E = 31, M = 0             \\
-    NaN,                           & E = 31, M \neq 0
-  \end{cases}
-+++++++++++++++++++
-----
-
-
-[[writing-latexmath-in-table-cells]]
-=== LaTeX Math in Table Cells
-
-To use `[latexmath]` or `latexmath{cl}` constructs inside table cells, the
-cell separator must be `a|` instead of just `|`:
-
-[source,asciidoc]
-.Example Markup
-----
-.Advanced Blend Overlap Modes
-[width="80%",options="header"]
-|====
-| Overlap Mode                              | Weighting Equations
-| ename:VK_BLEND_OVERLAP_UNCORRELATED_EXT  a|
-[latexmath]
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-                                              \begin{aligned}
-                                                p_0(A_s,A_d) & = A_sA_d \\
-                                                p_1(A_s,A_d) & = A_s(1-A_d) \\
-                                                p_2(A_s,A_d) & = A_d(1-A_s) \\
-                                              \end{aligned}
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-|====
-----
-
-
-[[writing-pNext-chain]]
-== Describing Extending Structure Chains
-
-When describing an extending structure which is passed to an existing
-command by including it in the pname:pNext chain of a structure parameter of
-that command, introduce the structure description in this fashion:
-
-[source,asciidoc]
-----
-When *performing an operation described by the extending structure*, add
-a slink:VkExtensionStructNameID structure to the pname:pNext chain of the
-slink:VkBaseExtensionStructName structure passed to the
-flink:vkBaseFunctionName command *saying what the extending structure
-does*.
-----
-
-When describing properties of a structure included in a pname:pNext chain,
-refer to that structure as "`included in the pname:pNext chain`" rather than
-`"present in`" or other similar terms, in this fashion:
-
-[source,asciidoc]
-----
-If the pname:pNext chain includes a slink:VkPhysicalDeviceFeatures2
-structure, then pname:pEnabledFeatures must: be `NULL`
-----
-
-
-[[writing-example]]
-== Example Command, Structure, and Enumerant Descriptions
-
-The <<sample-command,next section>> is a sample based on the
-<<vulkan-spec,Vulkan API Specification>>, and describes a command and
-related structures and enumerated types in enough detail to see the
-different usage patterns and layout / markup used.
-Informative notes discussing markup and guidelines are interspersed with the
-example description to explain how and why it looks as it does.
-
-
-[[sample-command]]
-== Sample Command Description: Creating Command Pools
-
-[open,refpage='vkCreateCommandPool',desc='Create a new command pool object',type='protos']
---
-To create a command pool, call:
-
-include::{generated}/api/protos/vkCreateCommandPool.txt[]
-
-[NOTE]
-.Guideline
-====
-Begin the command description with an open block delimiting the contents as
-a reference page.
-The open block contains several required attribute values, as described for
-<<writing-refpages, automatic extraction into a reference page>>.
-
-Use a short, active sentence when describing what commands do, instead of
-more passive phrasing like "`A command pool is created by calling:`" or
-"`The application may create a command pool by calling:`".
-
-After the description, include the autogenerated prototype for the command
-from the `\{generated}/api/protos/` directory:
-
-// The 'subs=attributes+' and '{blank}--' are one way to allow the inner
-// [source] block to show the correct two dashes. See
-// http://discuss.asciidoctor.org/Another-markup-escaping-question-td5665.html
-
-[source,asciidoc,subs=attributes+]
-~~~~
-[open,refpage='vkCreateCommandPool',desc='Create a new command pool object',type='protos']
-{blank}--
-To create a command pool, call:
-
-\include::\{generated}/api/protos/vkCreateCommandPool.txt[]
-~~~~
-
-Note that each autogenerated command, enumeration, flag, or structure
-definition include file also defines a corresponding asciidoctor anchor
-which is the base name of the file.
-In this case, the anchor is named `vkCreateCommandPool`.
-====
-
-  * pname:device is the logical device that the command pool is created on.
-  * pname:pCreateInfo is a pointer to a slink:VkCommandPoolCreateInfo
-    structure specifying the state of the command pool object.
-  * pname:pAllocator controls host memory allocation as described in the
-    <<memory-allocation, Memory Allocation>> chapter.
-  * pname:pCommandPool is a pointer to a slink:VkCommandPool handle in which
-    the created pool is returned.
-
-[NOTE]
-.Guideline
-====
-Describe each command parameter in a separate bullet list item.
-in the same order that parameters appear in the command.
-
-Each description must begin with the parameter name.
-This aids in extracting short descriptions of parameters for inclusion in
-annotated headers and similar documentation.
-Make sure to tag each parameter with the pname{cl} macro.
-
-Strive for compact notation, and in particular always try to use the
-phrasing "`pname{cl}param _is_`" rather than wordier forms such as
-"`pname{cl}param _specifies_`" or "`The pname{cl}param parameter
-specifies`".
-In general there is no need to describe a parameter which is a Vulkan object
-handle *as* a handle; for example, say "`pname{cl}device is the logical
-device`" rather than "`pname{cl}device is a handle to the logical device`".
-An exception is object creation functions, where a pointer to a handle of
-the proper type is used to return the newly created object.
-====
-
-This is a general description of creating a command pool.
-
-.Valid Usage
-****
-  * [[VUID-vkCreateCommandPool-queueFamilyIndex-01937]]
-    pname:pCreateInfo->queueFamilyIndex must: be the index of a queue family
-    available in the logical device pname:device
-****
-
-include::{generated}/validity/protos/vkCreateCommandPool.txt[]
---
-
-[NOTE]
-.Guideline
-====
-If there is a general description of the command, add it following the
-parameter descriptions:
-
-[source,asciidoc,subs=attributes+]
-~~~~
-This is a general description of creating a command pool.
-~~~~
-
-If there are _explicit_ valid usage statements for the command, add them in
-their own valid usage block:
-
-[source,asciidoc,subs=attributes+]
-~~~~
-.Valid Usage
-****
-  * [[VUID-vkCreateCommandPool-queueFamilyIndex-01937]]
-    pname:pCreateInfo->queueFamilyIndex must: be the index of a queue family
-    available in the logical device pname:device
-****
-~~~~
-
-Although a valid usage ID is shown in the rendered example above, do not
-specify the ID when initially writing the statement, as
-<<sample-writing-explicit-vu, described below>>.
-VUIDs are normally assigned immediately prior to publication.
-
-Some parameter and member validation language for commands and structures is
-_implicit_ (autogenerated from `vk.xml`), and included from the
-`\{generated}/validity/` directories.
-All Vulkan command and structure language should include the autogenerated
-file at the end of their descriptions.
-It is harmless to include a nonexistent file, in the rare cases where no
-implicit validity language exists.
-
-[source,asciidoc,subs=attributes+]
-~~~~
-\include::\{generated}/validity/protos/vkCreateCommandPool.txt[]
-{blank}--
-~~~~
-
-Close the open block surrounding the command description after the implicit
-validity include.
-All content within the block will be extracted for the corresponding
-reference page.
-
-Open blocks delimiting reference page content should not themselves contain
-section headers, as asciidoctor cannot render such nested content correctly.
-Reference pages should in general be relatively short, so this limitation is
-not severe.
-
-Structures and enumerations first introduced as parameters of a command are
-described next.
-====
-
-[open,refpage='VkCommandPoolCreateInfo',desc='Structure specifying parameters of a newly created command pool',type='structs']
---
-The sname:VkCommandPoolCreateInfo structure is defined as:
-
-include::{generated}/api/structs/VkCommandPoolCreateInfo.txt[]
-
-[NOTE]
-.Guideline
-====
-Begin the structure description with an open block delimiting the contents
-as a reference page, in the same fashion as described above for commands.
-The open block contains several required attribute values, as described for
-<<writing-refpages, automatic extraction into a reference page>>.
-
-Use a short, active paragraph to introduce the structure, usually just "`The
-sname:VkStructureName structure is defined as:`".
-
-After the description, include the autogenerated definition for the
-structure from the `\{generated}/api/structs/` directory:
-
-[source,asciidoc,subs=attributes+]
-~~~~
-[open,refpage='VkCommandPoolCreateInfo',desc='Structure specifying parameters of a newly created command pool',type='structs']
-{blank}--
-
-The sname:VkCommandPoolCreateInfo structure is defined as:
-
-\include::\{generated}/api/structs/VkCommandPoolCreateInfo.txt[]
-~~~~
-====
-
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-+
---
-This demonstrates how to create a continuation paragraph in a member
-description.
-This paragraph is not present in the actual specification the example is
-based on.
---
-  * pname:flags is a bitmask of elink:VkCommandPoolCreateFlagBits indicating
-    usage behavior for the pool and command buffers allocated from it.
-  * pname:queueFamilyIndex designates a queue family as described in section
-    <<devsandqueues-queueprops,Queue Family Properties>>.
-    All command buffers allocated from this command pool must: be submitted
-    on queues from the same queue family.
-
-[NOTE]
-.Guideline
-====
-Each structure member is described in a separate bullet list item.
-For structures with pname:sType and pname:pNext members, there is standard
-boilerplate for their descriptions.
-Descriptions of other members of the structure follow.
-
-[source,asciidoc,subs=attributes+]
-~~~~
-  * pname:sType is the type of this structure.
-  * pname:pNext is `NULL` or a pointer to a structure extending this
-    structure.
-+
-{blank}--
-This demonstrates how to create a continuation paragraph in a member
-description.
-This paragraph is not present in the actual specification the example is
-based on.
-{blank}--
-  * pname:flags is a bitmask of elink:VkCommandPoolCreateFlagBits indicating
-    usage behavior for the pool and command buffers allocated from it.
-  * pname:queueFamilyIndex designates a queue family as described in section
-    <<devsandqueues-queueprops,Queue Family Properties>>.
-    All command buffers allocated from this command pool must: be submitted
-    on queues from the same queue family.
-~~~~
-
-These entries should be short and functional, without describing details of
-e.g. new enumerant values, function of individual parameter settings, etc.
-They can refer to other types using the appropriate *link: macros or to
-related sections of the specification using asciidoctor xrefs.
-
-In rare cases, a member description will cover multiple paragraphs.
-In these cases the normal list nesting and indentation guidelines cannot be
-applied due to limitations of the asciidoctor parser.
-It is usually best to append a continuation block following the first
-paragraph of such a list item, as shown for pname:pNext above.
-
-Add general descriptions of the structure, if any, following the member
-descriptions.
-No general description is shown in this example.
-====
-
-.Valid Usage
-****
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-VkCommandPoolCreateInfo-flags-02860]]
-    If the protected memory feature is not enabled, the
-    ename:VK_COMMAND_POOL_CREATE_PROTECTED_BIT bit of pname:flags must: not
-    be set
-endif::VK_VERSION_1_1[]
-****
-
-include::{generated}/validity/structs/VkCommandPoolCreateInfo.txt[]
---
-
-[NOTE]
-.Guideline
-====
-Add explicit valid usage statements (if any) and the implicit autovalidity
-include in the same fashion as described for commands above, then close the
-open block.
-
-[source,asciidoc,subs=attributes+]
-~~~~
-.Valid Usage
-****
-ifdef::VK_VERSION_1_1[]
-  * [[VUID-VkCommandPoolCreateInfo-flags-02860]]
-    If the protected memory feature is not enabled, the
-    ename:VK_COMMAND_POOL_CREATE_PROTECTED_BIT bit of pname:flags must: not
-    be set
-endif::VK_VERSION_1_1[]
-****
-
-\include::\{generated}/validity/structs/VkCommandPoolCreateInfo.txt[]
-{blank}--
-~~~~
-====
-
-[open,refpage='VkCommandPoolCreateFlagBits',desc='Bitmask specifying usage behavior for a command pool',type='enums']
---
-Bits which can: be set in slink:VkCommandPoolCreateInfo::pname:flags to
-specify usage behavior for a command pool are:
-
-include::{generated}/api/enums/VkCommandPoolCreateFlagBits.txt[]
-
-[NOTE]
-.Guideline
-====
-Begin an enumerated type description with an open block delimiting the
-contents as a reference page, in the same fashion as described above for
-commands and structures.
-
-Use boilerplate language similar to that above to introduce the type.
-
-[source,asciidoc,subs=attributes+]
-~~~~
-[open,refpage='VkCommandPoolCreateFlagBits',desc='Bitmask specifying usage behavior for a command pool',type='enums']
-{blank}--
-Bits which can: be set in slink:VkCommandPoolCreateInfo::pname:flags to
-specify usage behavior for a command pool are:
-
-\include::\{generated}/api/enums/VkCommandPoolCreateFlagBits.txt[]
-~~~~
-====
-
-  * ename:VK_COMMAND_POOL_CREATE_TRANSIENT_BIT specifies that command
-    buffers allocated from the pool will be short-lived, meaning that they
-    will be reset or freed in a relatively short timeframe.
-    This flag may: be used by the implementation to control memory
-    allocation behavior within the pool.
-ifdef::VK_VERSION_1_1[]
-  * ename:VK_COMMAND_POOL_CREATE_PROTECTED_BIT specifies that command
-    buffers allocated from the pool are protected command buffers.
-endif::VK_VERSION_1_1[]
---
-
-[NOTE]
-.Guideline
-====
-Each enumerant in the enumerated type is described in a separate bullet list
-item.
-Make sure to protect enumerants added to the type by extensions or future
-core versions with asciidoctor conditionals.
-Close the open block after all enumerants are described.
-
-[source,asciidoc,subs=attributes+]
-~~~~
-  * ename:VK_COMMAND_POOL_CREATE_TRANSIENT_BIT specifies that command
-    buffers allocated from the pool will be short-lived, meaning that they
-    will be reset or freed in a relatively short timeframe.
-    This flag may: be used by the implementation to control memory
-    allocation behavior within the pool.
-\ifdef::VK_VERSION_1_1[]
-  * ename:VK_COMMAND_POOL_CREATE_PROTECTED_BIT specifies that command
-    buffers allocated from the pool are protected command buffers.
-\endif::VK_VERSION_1_1[]
-{blank}--
-~~~~
-====
-
-
-[[sample-writing-explicit-vu]]
-== Writing Explicit Valid Usage Statements
-
-Explicit valid usage statements must be written at a point that all
-information needed to evaluate them is known.
-In particular, if validity of structure parameters depends on other
-parameters of a command that structure is passed to, such valid usage
-statements must be written for the command, rather than the structure.
-
-Each explicit valid usage statement should be a single, self-contained
-assertion, possibly involving multiple subexpressions or parameters.
-For example, instead of writing "`width, height, and depth must: all be
-greater than zero`", write each condition as a separate statement.
-In contrast, "`width {times} height must: be less than 1024`" is a single
-assertion involving multiple parameters.
-
-Do not use "`unless`" to call out exceptions - always write valid usage
-statements of the form "`if _A_ then _B_`".
-This may result in harder to read statements in a few cases, but maintains
-consistency.
-In many cases, it may lead to a simpler VU statement, or splitting one large
-VU into multiple new ones.
-
-Do not use nested bullet lists or other writing structure where valid usage
-statements are not self-contained.
-This would make it impossible to extract semantically meaningful
-descriptions for each assigned <<appendix-vuid, Valid Usage ID Tag>>.
-
-Be clear on the distinction between a "`valid pointer`" and a "`pointer to a
-valid object`" when writing valid usage statements.
-See the "`Valid Usage`" section of the Vulkan Specification, and
-particularly the "`Valid Usage for Pointers`" section.
-
-When valid usage statements apply only when specific extensions and/or core
-API versions are enabled at runtime, surround those statements in their
-entirety with appropriate asciidoctor conditionals.
-Never use asciidoctor conditionals _inside_ a valid usage statement.
-
-Explicit valid usage statements must be assigned Valid Usage ID tags before
-publication.
-This process is described in the <<appendix-vuid, Valid Usage ID Tags>>
-appendix, but is normally performed only when preparing to integrate
-functionality into the Vulkan Specification prior to publication.
-It is something authors of new functionality should be aware of, but are not
-themselves responsible for.
-For example, when writing the explicit
-flink:vkCreateCommandPool::pname:queueFamilyIndex valid usage statement
-shown above, the tag
-
-[source,asciidoc,subs=attributes+]
-----
-[[VUID-vkCreateCommandPool-queueFamilyIndex-01937]]
-----
-
-was inserted by a script, not the original author.
-
-[NOTE]
-.Guideline
-====
-If the same set of valid usage statements are going to be common to multiple
-commands or structures, these should be extracted into a separate file under
-`chapters/commonvalidity/`.
-The file name should be short but to the point (e.g. `draw_common.txt`), and
-then the file can be included in the relevant API features using standard
-include syntax:
-
-[source,asciidoc,subs=attributes+]
-~~~~
-.Valid Usage
-****
-\include::\{chapters}/commonvalidity/draw_common.txt[]
-\include::\{chapters}/commonvalidity/draw_vertex_binding.txt[]
-  * [[VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287]]
-    sname:VkPhysicalDeviceTransformFeedbackFeaturesEXT::pname:transformFeedback
-    must: be enabled
-****
-~~~~
-
-Common VU includes should appear before individual VUs for consistency.
-
-The file itself should be structured with the comment `// Common Valid
-Usage` used as a delimiter at the start and end of the file, with a comment
-describing in more detail where these are included, and then the valid usage
-statement bullets outside of a valid usage block.
-For example:
-
-[source,asciidoc]
-~~~~
-// Common Valid Usage
-// Common to drawing commands that consume vertex binding state
-  * All vertex input bindings accessed via vertex input variables declared
-    in the vertex shader entry point's interface must: have valid buffers
-    bound
-  * For a given vertex buffer binding, any attribute data fetched must: be
-    entirely contained within the corresponding vertex buffer binding, as
-    described in <<fxvertex-input>>
-// Common Valid Usage
-~~~~
-
-Finally, the original feature section needs to define the `:refpage:`
-attribute to match the name of the feature, as this is used to correctly
-generate links to expanded common valid usage statements in the built
-specification.
-
-[source,asciidoc]
-~~~~
-[open,refpage='vkCmdDrawIndirectByteCountEXT',desc='Draw primitives where the vertex count is derived from the counter byte value in the counter buffer',type='protos']
---
-:refpage: vkCmdDrawIndirectByteCountEXT
-~~~~
-
-In general, this methodology should be preferred over any other method of
-consolidation - e.g. calling out a block of common valid usage statements,
-or referencing the valid usage statements of another command.
-However, for cases where the boilerplate of setting this up creates more
-text than a simple copy paste (e.g. only two commands consume a single
-valid usage statement), the original VUs can be left intact.
-====
-
-
-[[writing-empty-enumerations]]
-== Markup For Empty Enumerated Types
-
-Sometimes an enumerated type has all values defined by extensions, and each
-enumerated value defined by the type will be surrounded by an asciidoctor
-conditional for the corresponding extension.
-When a specification is built without any of those extensions enabled, the
-type should still be included, even though it is empty.
-In this case, the enumerated value descriptions must be followed by one
-additional conditional section which is only included when *none* of the
-relevant extensions are enabled.
-
-For example, the relevant part of the
-ename:VkDescriptorSetLayoutCreateFlagBits description, whose only value is
-defined by an extension, will look like this:
-
-[source,asciidoc,subs=attributes+]
-----
-\include::\{generated}/api/enums/VkDescriptorSetLayoutCreateFlagBits.txt[]
-
-\ifdef::VK_KHR_push_descriptor[]
-  * ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR specifies
-    that descriptor sets must: not be allocated using this layout, and
-    descriptors are instead pushed by flink:vkCmdPushDescriptorSetKHR.
-\endif::VK_KHR_push_descriptor[]
-
-\ifndef::VK_KHR_push_descriptor[]
-[NOTE]
-.Note
-====
-All bits for this type are defined by extensions, and none of those
-extensions are enabled in this build of the specification.
-====
-\endif::VK_KHR_push_descriptor[]
-----
-
-
-[[writing-refpages]]
-== Markup For Automatic Reference Page Extraction
-
-The Vulkan reference pages are (mostly) extracted from corresponding
-sections of the API Specification.
-This requires that the markup and writing conventions described above be
-adhered to rigidly.
-
-The extraction scripts for a given page rely on the existence of an
-asciidoctor `open` block surrounding markup describing that page, with
-attributes used to specify properties of the reference page.
-Additional heuristics and non-asciidoctor tags, described below, are used to
-identify subsections of a reference page in some cases.
-
-In general the open block introduction will look like:
-
-[source,asciidoc]
-----
-[open,refpage='name',desc='short description',type='pagetype',alias='alias',anchor='anchor',xrefs='xrefs']
---
-----
-
-Attributes which can be set on the block are:
-
-  * *refpage* - the name of the reference page, e.g. the Vulkan interface
-    (command, structure, enumerant, handle, etc.) name. This attribute is
-    required.
-  * *desc* - short description / summary of the page, used in the page
-    title.
-    This attribute is required.
-  * *type* - type of the interface, which must match the directory name
-    following `api/` in the interface `include::` line within the block, and
-    must be one of `basetypes`, `defines`, `enums`, `flags`, `funcpointers`,
-    `handles`, `protos`, or `structs`; or the non-API block types `feature`,
-    `freeform`. or `spirv`.
-    This attribute is required.
-  * *alias* - list of comma-separated names of other API entities which this
-    refpage also describes. This is used when an API is promoted and the
-    refpage block describes both the old and promoted APIs.
-    This attribute is optional.
-  * *anchor* - anchor name at which this reference page is fully described
-    in the API specification document.
-    This attribute is optional except for the non-API block types, which do
-    not correspond to Vulkan APIs.
-  * *xrefs* - list of whitespace-separated names of other reference pages
-    which should be added to the `See Also` section of this page.
-    Most cross-references are automatically generated based on the immediate
-    dependency information in `vk.xml`, but in some cases, such as referring
-    between `*FlagBits` and `*Flags` types, this additional tagging is
-    useful.
-    This attribute is optional.
-
-Attributes of the open block must be written in this format, using single
-quotes as delimiters (even though asciidoctor markup also allows double
-quotes), and escape single quotes in e.g. the *desc* attribute value with
-backquotes.
-
-After the open block is started, the following markup should be provided:
-
-  * A single paragraph of text describing the definition of the interface.
-    This paragraph is optional, but strongly recommended.
-  * The `include` line for the interface, which must be consistent with the
-    page name and type in the open block attributes.
-    This paragraph is required.
-  * A bullet list describing function parameters, structure members,
-    enumerants in an enumerated type, etc.
-    This list should contain no empty lines, as the extraction script
-    classifies the uninterrupted block of text following the `include`
-    directive as the `Parameters` or `Members` section of the ref page.
-    This list is required, unless the interface has nothing to describe,
-    such as an empty structure or enumeration, or a function with no
-    parameters.
-  * Paragraphs of text making up the `Description` section of the ref page.
-    This section is optional.
-    If it is necessary due to constraints of asciidoctor markup to have an
-    empty line in the bullet list section, add a `// refBody` comment
-    immediately following the bullet list and preceding this section:
-+
-[source,asciidoc]
-----
-// refBody
-----
-+
-There are no examples of this usage in the Vulkan 1.2.192 Specification,
-but it has been needed in the past and may again in the future.
-+
-  * An explicit valid usage block.
-    This block is required if the interface has such valid usage
-    constraints.
-  * The `include` line for the implicit valid usage block.
-    This line is required for commands and structures, but not for
-    interfaces such as enumerated types, which do not have implicit valid
-    usage blocks.
-  * Finally, a two-dash asciidoctor delimiter closing the open block:
-+
-[source,asciidoc]
-----
---
-----
-
-All elements specifying an interface name (open block `refpage` attributes,
-interface `include` lines, and validity `include` lines) must use the same
-interface name, if present.
-Otherwise the extraction script is either unable to extract that page, or
-will extract the wrong text - and the language will be structurally
-incorrect, as well.
-The extraction process is somewhat fragile, so care should be taken and the
-results of reference page extraction verified after making changes to that
-portion of the specification source.
-
-Content that should only appear in reference pages, such as
-developer-oriented guidelines for reference pages describing extensions, may
-be conditionally included in the specification as follows:
-
-[source,asciidoc,subs=attributes+]
-----
-\ifdef::isrefpage[]
-
-=== Refpage-Only Section
-
-*This section will appear only when generating an extension refpage,
-but not in the specification extensions appendix.*
-
-\endif::isrefpage[]
-----
diff --git a/registry/vulkan/vkspec.txt b/registry/vulkan/vkspec.txt
deleted file mode 100644
index 3cc3c88..0000000
--- a/registry/vulkan/vkspec.txt
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2014-2021 The Khronos Group Inc.
-//
-// SPDX-License-Identifier: CC-BY-4.0
-
-// :regtitle: is explained in
-// http://discuss.asciidoctor.org/How-to-add-markup-to-author-information-in-document-title-td6488.html
-= Vulkan^®^ {revnumber} - A Specification {apititle}
-:regtitle: pass:q,r[^®^]
-The Khronos{regtitle} Vulkan Working Group
-:data-uri:
-:icons: font
-:toc2:
-:toclevels: 2
-:numbered:
-:source-highlighter: rouge
-:rouge-style: github
-
-// Various special / math symbols. This is easier to edit with than Unicode.
-include::config/attribs.txt[]
-
-// Table of contents is inserted here
-toc::[]
-
-:leveloffset: 1
-
-<<<<
-
-[[preamble]]
-= Preamble
-
-include::copyright-spec.txt[]
-
-:test: 0
-ifeval::["{test}"=="1"]
-
-// Include or insert trivial test markup here, to bypass building full spec
-// include::chapters/textest.txt[]
-
-include::chapters/introduction.txt[]
-
-endif::[]
-
-ifeval::["{test}"!="1"]
-include::chapters/introduction.txt[]
-
-include::chapters/fundamentals.txt[]
-
-include::chapters/initialization.txt[]
-
-include::chapters/devsandqueues.txt[]
-
-include::chapters/cmdbuffers.txt[]
-
-include::chapters/synchronization.txt[]
-
-include::chapters/renderpass.txt[]
-
-include::chapters/shaders.txt[]
-
-include::chapters/pipelines.txt[]
-
-include::chapters/memory.txt[]
-
-include::chapters/resources.txt[]
-
-include::chapters/samplers.txt[]
-
-include::chapters/descriptorsets.txt[]
-
-include::chapters/interfaces.txt[]
-
-include::chapters/textures.txt[]
-
-ifdef::VK_EXT_fragment_density_map[]
-include::chapters/fragmentdensitymapops.txt[]
-endif::VK_EXT_fragment_density_map[]
-
-include::chapters/queries.txt[]
-
-// Transfer operations
-include::chapters/clears.txt[]
-
-include::chapters/copies.txt[]
-
-// Graphics Operations
-include::chapters/drawing.txt[]
-
-include::chapters/fxvertex.txt[]
-
-include::chapters/tessellation.txt[]
-
-include::chapters/geometry.txt[]
-
-ifdef::VK_NV_mesh_shader[]
-include::chapters/VK_NV_mesh_shader/mesh.txt[]
-endif::VK_NV_mesh_shader[]
-
-include::chapters/vertexpostproc.txt[]
-
-include::chapters/primsrast.txt[]
-
-include::chapters/fragops.txt[]
-
-include::chapters/framebuffer.txt[]
-
-// Compute
-include::chapters/dispatch.txt[]
-
-// Device Generated Commands
-ifdef::VK_NV_device_generated_commands[]
-include::chapters/VK_NV_device_generated_commands/generatedcommands.txt[]
-endif::VK_NV_device_generated_commands[]
-
-// Sparse
-include::chapters/sparsemem.txt[]
-
-ifdef::VK_KHR_surface[]
-include::chapters/VK_KHR_surface/wsi.txt[]
-endif::VK_KHR_surface[]
-
-// Deferred host ops
-ifdef::VK_KHR_deferred_host_operations[]
-include::chapters/VK_KHR_deferred_host_operations/deferred_host_operations.txt[]
-endif::VK_KHR_deferred_host_operations[]
-
-// Private data
-ifdef::VK_EXT_private_data[]
-include::chapters/VK_EXT_private_data.txt[]
-endif::VK_EXT_private_data[]
-
-// Acceleration structures
-ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-include::chapters/accelstructures.txt[]
-endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
-
-// Ray traversal
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline,VK_KHR_ray_query[]
-include::chapters/raytraversal.txt[]
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline,VK_KHR_ray_query[]
-
-// Ray tracing
-ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-include::chapters/raytracing.txt[]
-endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
-
-// Vulkan Video extensions
-ifdef::VK_KHR_video_queue[]
-include::chapters/video_extensions.txt[]
-endif::VK_KHR_video_queue[]
-
-ifdef::VK_KHR_video_decode_queue[]
-include::chapters/video_decode_extensions.txt[]
-endif::VK_KHR_video_decode_queue[]
-
-ifdef::VK_EXT_video_decode_h264[]
-include::chapters/video_decode_h264_extensions.txt[]
-endif::VK_EXT_video_decode_h264[]
-
-ifdef::VK_EXT_video_decode_h265[]
-include::chapters/video_decode_h265_extensions.txt[]
-endif::VK_EXT_video_decode_h265[]
-
-ifdef::VK_KHR_video_encode_queue[]
-include::chapters/video_encode_extensions.txt[]
-endif::VK_KHR_video_encode_queue[]
-
-ifdef::VK_EXT_video_encode_h264[]
-include::chapters/video_encode_h264_extensions.txt[]
-endif::VK_EXT_video_encode_h264[]
-
-ifdef::VK_EXT_video_encode_h265[]
-include::chapters/video_encode_h265_extensions.txt[]
-endif::VK_EXT_video_encode_h265[]
-
-// Sort of an appendix
-include::chapters/extensions.txt[]
-
-include::chapters/features.txt[]
-
-include::chapters/limits.txt[]
-
-include::chapters/formats.txt[]
-
-include::chapters/capabilities.txt[]
-
-include::chapters/debugging.txt[]
-
-// Appendices
-:numbered!:
-
-include::appendices/spirvenv.txt[]
-
-ifdef::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-include::appendices/memorymodel.txt[]
-endif::VK_VERSION_1_2,VK_KHR_vulkan_memory_model[]
-
-include::appendices/compressedtex.txt[]
-
-include::appendices/versions.txt[]
-
-// Extension appendices are now included from extensions.txt
-include::appendices/extensions.txt[]
-
-include::appendices/boilerplate.txt[]
-
-include::appendices/invariance.txt[]
-
-include::appendices/glossary.txt[]
-
-include::appendices/credits.txt[]
-
-endif::[]